From 5f9eab3c62ff2a073372efe27a426699994771bb Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Sun, 25 Mar 2007 22:16:48 +0000 Subject: [PATCH 01/32] First buggy commit --- src/common/connection_handlers.py | 12 +++++++++ src/common/pubsub.py | 43 +++++++++++++++++++++++++++++++ src/tooltips.py | 7 +++++ 3 files changed, 62 insertions(+) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 2d853c84e..f6f73a8b8 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -34,6 +34,7 @@ from common import GnuPG from common import helpers from common import gajim from common import atom +from common import pep from common.commands import ConnectionCommands from common.pubsub import ConnectionPubSub @@ -1504,8 +1505,19 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, ''' Called when we receive with pubsub event. ''' # TODO: Logging? (actually services where logging would be useful, should # TODO: allow to access archives remotely...) + jid = msg.getAttr('from') event = msg.getTag('event') + # XEP-0107: User Mood + items = event.getTag('items', {'node': 'http://jabber.org/protocol/mood'}) + if items: pep.user_mood(items, self.name, jid) + # XEP-0118: User Tune + items = event.getTag('items', {'node': 'http://jabber.org/protocol/tune'}) + if items: pep.user_tune(items, self.name, jid) + # XEP-0080: User Geolocation + items = event.getTag('items', {'node': 'http://jabber.org/protocol/geoloc'}) + if items: pep.user_geoloc(items, self.name, jid) + items = event.getTag('items') if items is None: return diff --git a/src/common/pubsub.py b/src/common/pubsub.py index 00eb39aff..c4ee908f7 100644 --- a/src/common/pubsub.py +++ b/src/common/pubsub.py @@ -43,6 +43,49 @@ class ConnectionPubSub: self.connection.send(query) + def send_pb_delete(self, jid, node): + '''Deletes node.''' + query = xmpp.Iq('set', to=jid) + d = query.addChild('pubsub', namespace=xmpp.NS_PUBSUB) + d = d.addChild('delete', {'node': node}) + + self.connection.send(query) + + def send_pb_create(self, jid, node, configure = False, configure_form = None): + '''Creates new node.''' + query = xmpp.Iq('set', to=jid) + c = query.addChild('pubsub', namespace=xmpp.NS_PUBSUB) + c = c.addChild('create', {'node': node}) + if configure: + conf = c.addChild('configure') + if configure_form is not None: + conf.addChild(node=configuration_form) + + self.connection.send(query) + + def send_pb_configure(self, jid, node, cb, *cbargs, **cbkwargs): + query = xmpp.Iq('set', to=jid) + c = query.addChild('pubsub', namespace=xmpp.NS_PUBSUB) + c = c.addChild('configure', {'node': node}) + + id = self.connection.send(query) + + def on_configure(self, connection, query): + try: + filledform = cb(stanza['pubsub']['configure']['x'], *cbargs, **cbkwargs) + #TODO: Build a form + #TODO: Send it + + except CancelConfigure: + cancel = xmpp.Iq('set', to=jid) + ca = query.addChild('pubsub', namespace=xmpp.NS_PUBSUB) + ca = ca.addChild('configure', {'node': node}) + #ca = ca.addChild('x', namespace=xmpp.NS_DATA, {'type': 'cancel'}) + + self.connection.send(cancel) + + self.__callbacks[id] = (on_configure, (), {}) + def _PubSubCB(self, conn, stanza): try: cb, args, kwargs = self.__callbacks.pop(stanza.getID()) diff --git a/src/tooltips.py b/src/tooltips.py index 49194e0f5..75b07dfbf 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -478,6 +478,13 @@ class RosterTooltip(NotificationAreaTooltip): show = '' + show + '' # we append show below + if contact.mood: + mood = contact.mood.strip() + mood_text = contact.mood_text.strip() + if mood: + #print mood + properties.append(('%s: %s' % (mood, mood_text), None)) + if contact.status: status = contact.status.strip() if status: From d7ea3283b95936341c9ff1d86627e1c7cbcf3feb Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Sun, 25 Mar 2007 22:27:43 +0000 Subject: [PATCH 02/32] Second buggy commit --- src/common/pep.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/common/pep.py diff --git a/src/common/pep.py b/src/common/pep.py new file mode 100644 index 000000000..f0aad03cf --- /dev/null +++ b/src/common/pep.py @@ -0,0 +1,20 @@ +from common import gajim + +def user_mood(items, name, jid): + contacts = gajim.contacts.get_contact(name, jid) + for item in items.getTags('item'): + child = item.getTag('mood') + if child is not None: + for ch in child.getChildren(): + if ch.getName() != 'text': + for contact in contacts: + contact.mood = ch.getName() + else: + for contact in contacts: + contact.mood_text = ch.getData() + +def user_tune(items, name, jid): + pass + +def user_geoloc(items, name, jid): + pass From e0c9b6309f6374addef58c5e67f665ef8d9e9df3 Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Sun, 25 Mar 2007 22:47:04 +0000 Subject: [PATCH 03/32] Third buggy commit --- src/common/contacts.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/common/contacts.py b/src/common/contacts.py index 95d3bb17e..e61b6b753 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -18,7 +18,7 @@ import common.gajim class Contact: '''Information concerning each contact''' - def __init__(self, jid='', name='', groups=[], show='', status='', sub='', + def __init__(self, jid='', name='', groups=[], show='', status='', mood='', sub='', ask='', resource='', priority=0, keyID='', our_chatstate=None, chatstate=None, last_status_time=None, msg_id = None, composing_jep = None): self.jid = jid @@ -26,6 +26,7 @@ class Contact: self.groups = groups self.show = show self.status = status + self.mood = mood self.sub = sub self.ask = ask self.resource = resource @@ -139,16 +140,17 @@ class Contacts: del self._gc_contacts[account] del self._metacontacts_tags[account] - def create_contact(self, jid='', name='', groups=[], show='', status='', + def create_contact(self, jid='', name='', groups=[], show='', status='', mood='', sub='', ask='', resource='', priority=0, keyID='', our_chatstate=None, chatstate=None, last_status_time=None, composing_jep=None): - return Contact(jid, name, groups, show, status, sub, ask, resource, + return Contact(jid, name, groups, show, status, mood, sub, ask, resource, priority, keyID, our_chatstate, chatstate, last_status_time, composing_jep) def copy_contact(self, contact): return self.create_contact(jid = contact.jid, name = contact.name, - groups = contact.groups, show = contact.show, status = contact.status, + groups = contact.groups, show = contact.show, status = + contact.status, mood = contact.mood, sub = contact.sub, ask = contact.ask, resource = contact.resource, priority = contact.priority, keyID = contact.keyID, our_chatstate = contact.our_chatstate, chatstate = contact.chatstate, From 512db7618b2118372379582a6ace249bef76747c Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Wed, 28 Mar 2007 21:18:16 +0000 Subject: [PATCH 04/32] Lame Mood and Activity support. Announcing caps. --- src/common/connection_handlers.py | 16 +++++++++++++--- src/common/contacts.py | 12 +++++++----- src/common/pep.py | 13 +++++++++++++ src/common/xmpp/protocol.py | 6 ++++++ src/tooltips.py | 7 ++++++- 5 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index f6f73a8b8..875cbbe04 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -717,6 +717,7 @@ class ConnectionDisco: iq = iq_obj.buildReply('result') q = iq.getTag('query') if node: + print node q.setAttr('node', node) q.addChild('identity', attrs = {'type': 'pc', 'category': 'client', 'name': 'Gajim'}) @@ -732,6 +733,12 @@ class ConnectionDisco: q.addChild('feature', attrs = {'var': common.xmpp.NS_MUC}) q.addChild('feature', attrs = {'var': common.xmpp.NS_COMMANDS}) q.addChild('feature', attrs = {'var': common.xmpp.NS_DISCO_INFO}) + q.addChild('feature', attrs = {'var': common.xmpp.NS_ACTIVITY}) + q.addChild('feature', attrs = {'var': common.xmpp.NS_ACTIVITY + '+notify'}) + q.addChild('feature', attrs = {'var': common.xmpp.NS_TUNE}) + q.addChild('feature', attrs = {'var': common.xmpp.NS_TUNE + '+notify'}) + q.addChild('feature', attrs = {'var': common.xmpp.NS_MOOD}) + q.addChild('feature', attrs = {'var': common.xmpp.NS_MOOD + '+notify'}) if (node is None or extension == 'cstates') and gajim.config.get('outgoing_chat_state_notifactions') != 'disabled': q.addChild('feature', attrs = {'var': common.xmpp.NS_CHATSTATES}) @@ -1509,14 +1516,17 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, event = msg.getTag('event') # XEP-0107: User Mood - items = event.getTag('items', {'node': 'http://jabber.org/protocol/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': 'http://jabber.org/protocol/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': 'http://jabber.org/protocol/geoloc'}) + 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) items = event.getTag('items') if items is None: return diff --git a/src/common/contacts.py b/src/common/contacts.py index e61b6b753..724f8853c 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -18,7 +18,7 @@ import common.gajim class Contact: '''Information concerning each contact''' - def __init__(self, jid='', name='', groups=[], show='', status='', mood='', sub='', + def __init__(self, jid='', name='', groups=[], show='', status='', mood='', activity='', sub='', ask='', resource='', priority=0, keyID='', our_chatstate=None, chatstate=None, last_status_time=None, msg_id = None, composing_jep = None): self.jid = jid @@ -27,6 +27,7 @@ class Contact: self.show = show self.status = status self.mood = mood + self.activity = activity self.sub = sub self.ask = ask self.resource = resource @@ -140,18 +141,19 @@ class Contacts: del self._gc_contacts[account] del self._metacontacts_tags[account] - def create_contact(self, jid='', name='', groups=[], show='', status='', mood='', + def create_contact(self, jid='', name='', groups=[], show='', status='', mood='', activity='', sub='', ask='', resource='', priority=0, keyID='', our_chatstate=None, chatstate=None, last_status_time=None, composing_jep=None): - return Contact(jid, name, groups, show, status, mood, sub, ask, resource, + return Contact(jid, name, groups, show, status, mood, + activity, sub, ask, resource, priority, keyID, our_chatstate, chatstate, last_status_time, composing_jep) def copy_contact(self, contact): return self.create_contact(jid = contact.jid, name = contact.name, groups = contact.groups, show = contact.show, status = - contact.status, mood = contact.mood, - sub = contact.sub, ask = contact.ask, resource = contact.resource, + contact.status, mood = contact.mood, activity = + contact.activity, sub = contact.sub, ask = contact.ask, resource = contact.resource, priority = contact.priority, keyID = contact.keyID, our_chatstate = contact.our_chatstate, chatstate = contact.chatstate, last_status_time = contact.last_status_time) diff --git a/src/common/pep.py b/src/common/pep.py index f0aad03cf..2fab1b44d 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -18,3 +18,16 @@ def user_tune(items, name, jid): def user_geoloc(items, name, jid): pass + +def user_activity(items, name, jid): + contacts = gajim.contacts.get_contact(name, jid) + for item in items.getTags('item'): + child = item.getTag('activity') + if child is not None: + for ch in child.getChildren(): + if ch.getName() != 'text': + for contact in contacts: + contact.activity = ch.getName() + else: + for contact in contacts: + contact.activity_text = ch.getData() diff --git a/src/common/xmpp/protocol.py b/src/common/xmpp/protocol.py index 6267e201a..07bccf3da 100644 --- a/src/common/xmpp/protocol.py +++ b/src/common/xmpp/protocol.py @@ -27,11 +27,14 @@ NS_AGENTS ='jabber:iq:agents' NS_AMP ='http://jabber.org/protocol/amp' NS_AMP_ERRORS =NS_AMP+'#errors' NS_AUTH ='jabber:iq:auth' +NS_AVATAR ='http://www.xmpp.org/extensions/xep-0084.html#ns-metadata' NS_BIND ='urn:ietf:params:xml:ns:xmpp-bind' NS_BROWSE ='jabber:iq:browse' +NS_BROWSING ='http://jabber.org/protocol/browsing' # XEP-0195 NS_BYTESTREAM ='http://jabber.org/protocol/bytestreams' # JEP-0065 NS_CAPS ='http://jabber.org/protocol/caps' # JEP-0115 NS_CHATSTATES ='http://jabber.org/protocol/chatstates' # JEP-0085 +NS_CHATTING ='http://jabber.org/protocol/chatting' # XEP-0194 NS_CLIENT ='jabber:client' NS_COMMANDS ='http://jabber.org/protocol/commands' NS_COMPONENT_ACCEPT='jabber:component:accept' @@ -48,6 +51,7 @@ NS_ENCRYPTED ='jabber:x:encrypted' # JEP-00 NS_EVENT ='jabber:x:event' # JEP-0022 NS_FEATURE ='http://jabber.org/protocol/feature-neg' NS_FILE ='http://jabber.org/protocol/si/profile/file-transfer' # JEP-0096 +NS_GAMING ='http://jabber.org/protocol/gaming' # XEP-0196 NS_GEOLOC ='http://jabber.org/protocol/geoloc' # JEP-0080 NS_GROUPCHAT ='gc-1.0' NS_HTTP_AUTH ='http://jabber.org/protocol/http-auth' # JEP-0070 @@ -87,12 +91,14 @@ NS_STREAMS ='http://etherx.jabber.org/streams' NS_TIME ='jabber:iq:time' # JEP-0900 NS_TIME_REVISED ='http://www.xmpp.org/extensions/xep-0202.html#ns' # JEP-0202 NS_TLS ='urn:ietf:params:xml:ns:xmpp-tls' +NS_TUNE ='http://jabber.org/protocol/tune' # XEP-0118 NS_VACATION ='http://jabber.org/protocol/vacation' NS_VCARD ='vcard-temp' NS_GMAILNOTIFY ='google:mail:notify' NS_GTALKSETTING ='google:setting' NS_VCARD_UPDATE =NS_VCARD+':x:update' NS_VERSION ='jabber:iq:version' +NS_VIEWING ='http://jabber.org/protocol/viewing' # XEP--197 NS_PING ='urn:xmpp:ping' # XEP-0199 NS_WAITINGLIST ='http://jabber.org/protocol/waitinglist' # JEP-0130 NS_XHTML_IM ='http://jabber.org/protocol/xhtml-im' # JEP-0071 diff --git a/src/tooltips.py b/src/tooltips.py index 75b07dfbf..fefa63cdf 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -482,9 +482,14 @@ class RosterTooltip(NotificationAreaTooltip): mood = contact.mood.strip() mood_text = contact.mood_text.strip() if mood: - #print mood properties.append(('%s: %s' % (mood, mood_text), None)) + if contact.activity: + activity = contact.activity.strip() + activity_text = contact.activity_text.strip() + if activity: + properties.append(('%s: %s' % (activity, activity_text), None)) + if contact.status: status = contact.status.strip() if status: From 149b0fcdef484d3a731c8661368842c457350316 Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Thu, 29 Mar 2007 19:04:14 +0000 Subject: [PATCH 05/32] Buggy. Don\'t touch --- src/common/connection_handlers.py | 3 +-- src/common/contacts.py | 4 ++-- src/common/pep.py | 18 ++++++++++++------ src/tooltips.py | 28 +++++++++++++++++++--------- 4 files changed, 34 insertions(+), 19 deletions(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 875cbbe04..34487bc9f 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -717,7 +717,6 @@ class ConnectionDisco: iq = iq_obj.buildReply('result') q = iq.getTag('query') if node: - print node q.setAttr('node', node) q.addChild('identity', attrs = {'type': 'pc', 'category': 'client', 'name': 'Gajim'}) @@ -1512,7 +1511,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, ''' Called when we receive with pubsub event. ''' # TODO: Logging? (actually services where logging would be useful, should # TODO: allow to access archives remotely...) - jid = msg.getAttr('from') + jid = helpers.get_jid_from_iq(msg) event = msg.getTag('event') # XEP-0107: User Mood diff --git a/src/common/contacts.py b/src/common/contacts.py index 724f8853c..26e916a8f 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -18,7 +18,7 @@ import common.gajim class Contact: '''Information concerning each contact''' - def __init__(self, jid='', name='', groups=[], show='', status='', mood='', activity='', sub='', + def __init__(self, jid='', name='', groups=[], show='', status='', mood={}, activity={}, sub='', ask='', resource='', priority=0, keyID='', our_chatstate=None, chatstate=None, last_status_time=None, msg_id = None, composing_jep = None): self.jid = jid @@ -141,7 +141,7 @@ class Contacts: del self._gc_contacts[account] del self._metacontacts_tags[account] - def create_contact(self, jid='', name='', groups=[], show='', status='', mood='', activity='', + def create_contact(self, jid='', name='', groups=[], show='', status='', mood={}, activity={}, sub='', ask='', resource='', priority=0, keyID='', our_chatstate=None, chatstate=None, last_status_time=None, composing_jep=None): return Contact(jid, name, groups, show, status, mood, diff --git a/src/common/pep.py b/src/common/pep.py index 2fab1b44d..3ca936ef9 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -1,17 +1,19 @@ from common import gajim +#from common import helpers def user_mood(items, name, jid): - contacts = gajim.contacts.get_contact(name, jid) + (user, resource) = gajim.get_room_and_nick_from_fjid(jid) + contacts = gajim.contacts.get_contact(name, user, resource=resource) for item in items.getTags('item'): child = item.getTag('mood') if child is not None: for ch in child.getChildren(): if ch.getName() != 'text': for contact in contacts: - contact.mood = ch.getName() + contact.mood['mood'] = ch.getName() else: for contact in contacts: - contact.mood_text = ch.getData() + contact.mood['text'] = ch.getData() def user_tune(items, name, jid): pass @@ -20,14 +22,18 @@ def user_geoloc(items, name, jid): pass def user_activity(items, name, jid): - contacts = gajim.contacts.get_contact(name, jid) + (user, resource) = gajim.get_room_and_nick_from_fjid(jid) + contacts = gajim.contacts.get_contact(name, user, resource=resource) for item in items.getTags('item'): child = item.getTag('activity') if child is not None: for ch in child.getChildren(): if ch.getName() != 'text': for contact in contacts: - contact.activity = ch.getName() + contact.activity['activity'] = ch.getName() + for chi in ch.getChildren(): + for contact in contacts: + contact.activity['subactivity'] = chi.getName() else: for contact in contacts: - contact.activity_text = ch.getData() + contact.activity['text'] = ch.getData() diff --git a/src/tooltips.py b/src/tooltips.py index fefa63cdf..cd44706fb 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -478,17 +478,27 @@ class RosterTooltip(NotificationAreaTooltip): show = '' + show + '' # we append show below - if contact.mood: - mood = contact.mood.strip() - mood_text = contact.mood_text.strip() + if contact.mood.has_key('mood'): + mood = contact.mood['mood'].strip() + if contact.mood.has_key('text'): + mood_text = contact.mood['text'].strip() + else: + mood_text = '' if mood: - properties.append(('%s: %s' % (mood, mood_text), None)) + properties.append(('Mood: %s (%s)' % (mood, mood_text), None)) - if contact.activity: - activity = contact.activity.strip() - activity_text = contact.activity_text.strip() - if activity: - properties.append(('%s: %s' % (activity, activity_text), None)) + if contact.activity.has_key('activity'): + activity = contact.activity['activity'].strip() + activity_string = 'Activity: %s' % activity + if contact.activity.has_key('subactivity'): + activity_sub = contact.activity['subactivity'].strip() + activity_string += ' (%s)' % activity_sub + else: + activity_string += '' + if contact.activity.has_key('text'): + activity_text = contact.activity['text'].strip() + activity_string += ' (%s)' % activity_text + properties.append((activity_string, None)) if contact.status: status = contact.status.strip() From 06f43c1e2afec4518f891639c7f6fd8efd28886f Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Thu, 29 Mar 2007 19:40:50 +0000 Subject: [PATCH 06/32] Mood and Activity shown in tooltips. Caps set properly --- src/common/connection_handlers.py | 2 +- src/common/contacts.py | 14 ++++++-------- src/common/pep.py | 1 + 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 34487bc9f..b2e1a3318 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1511,7 +1511,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, ''' 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_jid_from_iq(msg) + jid = helpers.get_full_jid_from_iq(msg) event = msg.getTag('event') # XEP-0107: User Mood diff --git a/src/common/contacts.py b/src/common/contacts.py index 26e916a8f..08f559ec0 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -18,7 +18,7 @@ import common.gajim class Contact: '''Information concerning each contact''' - def __init__(self, jid='', name='', groups=[], show='', status='', mood={}, activity={}, sub='', + def __init__(self, jid='', name='', groups=[], show='', status='', sub='', ask='', resource='', priority=0, keyID='', our_chatstate=None, chatstate=None, last_status_time=None, msg_id = None, composing_jep = None): self.jid = jid @@ -26,8 +26,8 @@ class Contact: self.groups = groups self.show = show self.status = status - self.mood = mood - self.activity = activity + self.mood = dict() + self.activity = dict() self.sub = sub self.ask = ask self.resource = resource @@ -141,19 +141,17 @@ class Contacts: del self._gc_contacts[account] del self._metacontacts_tags[account] - def create_contact(self, jid='', name='', groups=[], show='', status='', mood={}, activity={}, + def create_contact(self, jid='', name='', groups=[], show='', status='', sub='', ask='', resource='', priority=0, keyID='', our_chatstate=None, chatstate=None, last_status_time=None, composing_jep=None): - return Contact(jid, name, groups, show, status, mood, - activity, sub, ask, resource, + return Contact(jid, name, groups, show, status, sub, ask, resource, priority, keyID, our_chatstate, chatstate, last_status_time, composing_jep) def copy_contact(self, contact): return self.create_contact(jid = contact.jid, name = contact.name, groups = contact.groups, show = contact.show, status = - contact.status, mood = contact.mood, activity = - contact.activity, sub = contact.sub, ask = contact.ask, resource = contact.resource, + contact.status, sub = contact.sub, ask = contact.ask, resource = contact.resource, priority = contact.priority, keyID = contact.keyID, our_chatstate = contact.our_chatstate, chatstate = contact.chatstate, last_status_time = contact.last_status_time) diff --git a/src/common/pep.py b/src/common/pep.py index 3ca936ef9..1cc3bfd74 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -3,6 +3,7 @@ from common import gajim def user_mood(items, name, jid): (user, resource) = gajim.get_room_and_nick_from_fjid(jid) + print 'User: %s, Resource: %s' % (user, resource) contacts = gajim.contacts.get_contact(name, user, resource=resource) for item in items.getTags('item'): child = item.getTag('mood') From 39f161fa6d6342fb57f71faf76e45409787eeb3d Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Thu, 29 Mar 2007 20:24:30 +0000 Subject: [PATCH 07/32] Version changed --- src/common/contacts.py | 1 + src/common/gajim.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/common/contacts.py b/src/common/contacts.py index 08f559ec0..9bad04f83 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -26,6 +26,7 @@ class Contact: self.groups = groups self.show = show self.status = status + # FIXME self.mood = dict() self.activity = dict() self.sub = sub diff --git a/src/common/gajim.py b/src/common/gajim.py index add7911e5..9b23b1887 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -51,7 +51,7 @@ If you start gajim from svn: interface = None # The actual interface (the gtk one for the moment) config = config.Config() -version = config.get('version') +version = config.get('version') + 'dh' connections = {} # 'account name': 'account (connection.Connection) instance' verbose = False From c02eb73bd0df0baaf9434aa9f11313e405c2c474 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Fri, 30 Mar 2007 19:16:44 +0000 Subject: [PATCH 08/32] add pep_supported var to pep branch too --- src/common/connection.py | 1 + src/common/connection_handlers.py | 8 ++++++++ src/common/zeroconf/connection_zeroconf.py | 1 + 3 files changed, 10 insertions(+) diff --git a/src/common/connection.py b/src/common/connection.py index 614227077..4abdd590a 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -81,6 +81,7 @@ class Connection(ConnectionHandlers): else: self.keepalives = 0 self.privacy_rules_supported = False + self.pep_supported = False # Do we continue connection when we get roster (send presence,get vcard...) self.continue_connect_info = None if USE_GPG: diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index b2e1a3318..5e55e8e0a 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -794,6 +794,12 @@ class ConnectionDisco: #FIXME: see http://www.jabber.ru/bugzilla/show_bug.cgi?id=225 identities = [{'category': 'server', 'type': 'im', 'name': node}] if id[0] == 'p': + if jid == gajim.config.get_per('accounts', self.name, 'hostname'): + for identity in identities: + if identity['category'] == 'pubsub' and identity['type'] == \ + 'pep': + self.pep_supported = True + break if features.__contains__(common.xmpp.NS_BYTESTREAM): gajim.proxy65_manager.resolve(jid, self.connection, self.name) if features.__contains__(common.xmpp.NS_MUC) and is_muc: @@ -1860,6 +1866,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, gajim.proxy65_manager.resolve(proxy, self.connection) self.discoverItems(gajim.config.get_per('accounts', self.name, 'hostname'), id_prefix='p') + self.discoverInfo(gajim.config.get_per('accounts', self.name, + 'hostname'), id_prefix='p') def _on_roster_set(self, roster): raw_roster = roster.getRaw() diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index 148893c7f..5bdb7104a 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -74,6 +74,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): self.sync_with_global_status = True self.no_log_for = False + self.pep_supported = False # Do we continue connection when we get roster (send presence,get vcard...) self.continue_connect_info = None if USE_GPG: From ab26867fb2b3217fe651fb63208de8c28658d618 Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Fri, 30 Mar 2007 22:52:11 +0000 Subject: [PATCH 09/32] Setting mood now supported (crappy). --- data/glade/account_context_menu.glade | 20 ++ data/glade/change_mood_dialog.glade | 312 ++++++++++++++++++++++++++ src/common/pep.py | 15 +- src/dialogs.py | 27 +++ src/roster_window.py | 25 ++- 5 files changed, 395 insertions(+), 4 deletions(-) create mode 100644 data/glade/change_mood_dialog.glade diff --git a/data/glade/account_context_menu.glade b/data/glade/account_context_menu.glade index 4e424c5f3..900db4ff8 100644 --- a/data/glade/account_context_menu.glade +++ b/data/glade/account_context_menu.glade @@ -25,6 +25,26 @@ + + + True + _Personal Events + True + + + + True + gtk-home + 1 + 0.5 + 0.5 + 0 + 0 + + + + + True diff --git a/data/glade/change_mood_dialog.glade b/data/glade/change_mood_dialog.glade new file mode 100644 index 000000000..f8e1e6f0f --- /dev/null +++ b/data/glade/change_mood_dialog.glade @@ -0,0 +1,312 @@ + + + + + + + 6 + + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + 270 + 175 + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + True + + + + + True + False + 6 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + True + -6 + + + + + + True + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + -5 + + + + + 0 + False + False + GTK_PACK_END + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + 6 + True + False + 6 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + True + False + True + GTK_JUSTIFY_LEFT + GTK_WRAP_WORD + True + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 0 + True + True + + + + + + False + GTK_BUTTONBOX_END + 0 + + + + True + False + True + True + GTK_RELIEF_NORMAL + True + + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-save-as + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + Save as Preset... + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + + + + + + 0 + False + False + + + + + + False + False + 6 + + + + True + Preset messages: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + True + + + + 0 + True + True + + + + + 0 + False + True + + + + + + + + + + False + <b>Type your new status message</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + True + + + + + + + diff --git a/src/common/pep.py b/src/common/pep.py index 1cc3bfd74..8e965f256 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -1,9 +1,8 @@ -from common import gajim -#from common import helpers +from common import gajim, xmpp def user_mood(items, name, jid): + #FIXME: text deletion (user, resource) = gajim.get_room_and_nick_from_fjid(jid) - print 'User: %s, Resource: %s' % (user, resource) contacts = gajim.contacts.get_contact(name, user, resource=resource) for item in items.getTags('item'): child = item.getTag('mood') @@ -23,6 +22,7 @@ def user_geoloc(items, name, jid): pass def user_activity(items, name, jid): + #FIXME: text deletion (user, resource) = gajim.get_room_and_nick_from_fjid(jid) contacts = gajim.contacts.get_contact(name, user, resource=resource) for item in items.getTags('item'): @@ -38,3 +38,12 @@ def user_activity(items, name, jid): else: for contact in contacts: contact.activity['text'] = ch.getData() + +def user_send_mood(account, mood, message = ''): + item = xmpp.Node('mood', {'xmlns': xmpp.NS_MOOD}) + item.addChild(mood) + if message != '': + i = item.addChild('text') + i.addData(message) + + gajim.connections[account].send_pb_publish('', xmpp.NS_MOOD, item, '0') diff --git a/src/dialogs.py b/src/dialogs.py index 85dad7c10..1eb2f5dd0 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -307,6 +307,33 @@ class ChooseGPGKeyDialog: self.keys_treeview.set_cursor(path) +class ChangeMoodDialog: + def __init__(self): + self.xml = gtkgui_helpers.get_glade('change_mood_dialog.glade') + self.window = self.xml.get_widget('change_mood_dialog') + self.window.set_transient_for(gajim.interface.roster.window) + self.window.set_title('Mood') + + message_textview = self.xml.get_widget('message_textview') + self.message_buffer = message_textview.get_buffer() + #self.message_buffer.connect('changed', + # self.toggle_sensitiviy_of_save_as_preset) + + def run(self): + '''Wait for OK or Cancel button to be pressed and return mood + and messsage (None if users pressed Cancel or x button of WM''' + rep = self.window.run() + mood = None + message = None + if rep == gtk.RESPONSE_OK: + beg, end = self.message_buffer.get_bounds() + message = self.message_buffer.get_text(beg, end).decode('utf-8')\ + .strip() + msg = helpers.to_one_line(message) + self.window.destroy() + return (mood, message) + + class ChangeStatusMessageDialog: def __init__(self, show = None): self.show = show diff --git a/src/roster_window.py b/src/roster_window.py index e995e858d..fe7417dd4 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -39,6 +39,7 @@ from common import helpers from common import passwords from common.exceptions import GajimGeneralException from common import i18n +from common import pep from message_window import MessageWindowMgr from chat_control import ChatControl @@ -2268,6 +2269,14 @@ class RosterWindow: gajim.config.get_per('accounts', account, 'name')) helpers.launch_browser_mailer('url', url) + def on_change_mood_activate(self, widget, account): + dlg = dialogs.ChangeMoodDialog() + (mood, message) = dlg.run() + mood = 'happy' + print account, mood, message + if mood is not None: # None is if user pressed Cancel + self.send_mood(account, mood, message) + def on_change_status_message_activate(self, widget, account): show = gajim.SHOW_LIST[gajim.connections[account].connected] dlg = dialogs.ChangeStatusMessageDialog(show) @@ -2330,6 +2339,17 @@ class RosterWindow: sub_menu.append(item) item.connect('activate', self.change_status, account, 'offline') + pep_menuitem = xml.get_widget('pep_menuitem') + if gajim.connections[account].pep_supported: + pep_submenu = gtk.Menu() + pep_menuitem.set_submenu(pep_submenu) + item = gtk.MenuItem('Mood') + pep_submenu.append(item) + item.connect('activate', self.on_change_mood_activate, account) + else: + pep_menuitem.set_no_show_all(True) + pep_menuitem.hide() + if gajim.config.get_per('accounts', account, 'hostname') not in \ gajim.gmail_domains: open_gmail_inbox_menuitem.set_no_show_all(True) @@ -2359,7 +2379,7 @@ class RosterWindow: if gajim.connections[account].connected < 2: for widget in [add_contact_menuitem, service_discovery_menuitem, join_group_chat_menuitem, new_message_menuitem, - execute_command_menuitem]: + execute_command_menuitem, pep_menuitem]: widget.set_sensitive(False) else: xml = gtkgui_helpers.get_glade('zeroconf_context_menu.glade') @@ -2722,6 +2742,9 @@ class RosterWindow: if gajim.interface.systray_enabled: gajim.interface.systray.change_status('connecting') + def send_mood(self, account, mood, message): + pep.user_send_mood(account, mood, message) + def send_status(self, account, status, txt, auto = False): model = self.tree.get_model() accountIter = self.get_account_iter(account) From 4f68782ec7234d5d4a69e12790f384ff58d1cfa9 Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Fri, 30 Mar 2007 23:24:12 +0000 Subject: [PATCH 10/32] Activity and Mood in tooltips now bug-free (:P) --- src/common/pep.py | 33 +++++++++++++++++++-------------- src/tooltips.py | 11 ++++------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/common/pep.py b/src/common/pep.py index 8e965f256..b820d4478 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -1,18 +1,20 @@ from common import gajim, xmpp def user_mood(items, name, jid): - #FIXME: text deletion (user, resource) = gajim.get_room_and_nick_from_fjid(jid) contacts = gajim.contacts.get_contact(name, user, resource=resource) for item in items.getTags('item'): child = item.getTag('mood') if child is not None: - for ch in child.getChildren(): - if ch.getName() != 'text': - for contact in contacts: + for contact in contacts: + if contact.mood.has_key('mood'): + del contact.mood['mood'] + if contact.mood.has_key('text'): + del contact.mood['text'] + for ch in child.getChildren(): + if ch.getName() != 'text': contact.mood['mood'] = ch.getName() - else: - for contact in contacts: + else: contact.mood['text'] = ch.getData() def user_tune(items, name, jid): @@ -22,21 +24,24 @@ def user_geoloc(items, name, jid): pass def user_activity(items, name, jid): - #FIXME: text deletion (user, resource) = gajim.get_room_and_nick_from_fjid(jid) contacts = gajim.contacts.get_contact(name, user, resource=resource) for item in items.getTags('item'): child = item.getTag('activity') if child is not None: - for ch in child.getChildren(): - if ch.getName() != 'text': - for contact in contacts: + for contact in contacts: + if contact.activity.has_key('activity'): + del contact.activity['activity'] + if contact.activity.has_key('subactivity'): + del contact.activity['subactivity'] + if contact.activity.has_key('text'): + del contact.activity['text'] + for ch in child.getChildren(): + if ch.getName() != 'text': contact.activity['activity'] = ch.getName() - for chi in ch.getChildren(): - for contact in contacts: + for chi in ch.getChildren(): contact.activity['subactivity'] = chi.getName() - else: - for contact in contacts: + else: contact.activity['text'] = ch.getData() def user_send_mood(account, mood, message = ''): diff --git a/src/tooltips.py b/src/tooltips.py index cd44706fb..3bc9ad5db 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -479,13 +479,10 @@ class RosterTooltip(NotificationAreaTooltip): # we append show below if contact.mood.has_key('mood'): - mood = contact.mood['mood'].strip() - if contact.mood.has_key('text'): - mood_text = contact.mood['text'].strip() - else: - mood_text = '' - if mood: - properties.append(('Mood: %s (%s)' % (mood, mood_text), None)) + mood_string = 'Mood: %s' % contact.mood['mood'].strip() + if contact.mood.has_key('text') and contact.mood['text'] != '': + mood_string += ' (%s)' % contact.mood['text'].strip() + properties.append((mood_string, None)) if contact.activity.has_key('activity'): activity = contact.activity['activity'].strip() From 37de10d82ff1616a800f82e093cd073f1b5bc304 Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Sat, 31 Mar 2007 07:43:33 +0000 Subject: [PATCH 11/32] Properish mood dialog --- data/glade/change_mood_dialog.glade | 198 +++------------------------- src/dialogs.py | 26 ++-- src/roster_window.py | 1 - 3 files changed, 33 insertions(+), 192 deletions(-) diff --git a/data/glade/change_mood_dialog.glade b/data/glade/change_mood_dialog.glade index f8e1e6f0f..4294d0197 100644 --- a/data/glade/change_mood_dialog.glade +++ b/data/glade/change_mood_dialog.glade @@ -19,6 +19,7 @@ GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True + False True @@ -95,123 +96,10 @@ 6 - + True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - True - False - True - GTK_JUSTIFY_LEFT - GTK_WRAP_WORD - True - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - 0 - True - True - - - - - - False - GTK_BUTTONBOX_END - 0 - - - - True - False - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-save-as - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - Save as Preset... - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - + False + True 0 @@ -221,83 +109,27 @@ - - False - False - 6 - - - - True - Preset messages: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - False - True - - - - 0 - True - True - - + + True + True + True + True + 0 + + True + + False 0 False - True + False - - - - False - <b>Type your new status message</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - 0 diff --git a/src/dialogs.py b/src/dialogs.py index 1eb2f5dd0..30d7517cf 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -309,15 +309,27 @@ class ChooseGPGKeyDialog: class ChangeMoodDialog: def __init__(self): + self.moods = ['afraid', 'amazed', 'angry', 'annoyed', 'anxious', 'aroused', 'ashamed', 'bored', 'brave', 'calm', 'cold', 'confused', 'contented', 'cranky', 'curious', 'depressed', 'disappointed', 'disgusted', 'distracted', 'embarrassed', 'excited', 'flirtatious', 'frustrated', 'grumpy', 'guilty', 'happy', 'hot', 'humbled', 'humiliated', 'hungry', 'hurt', 'impressed', 'in_awe', 'in_love', 'indignant', 'interested', 'intoxicated', 'invincible', 'jealous', 'lonely', 'mean', 'moody', 'nervous', 'neutral', 'offended', 'playful', 'proud', 'relieved', 'remorseful', 'restless', 'sad', 'sarcastic', 'serious', 'shocked', 'shy', 'sick', 'sleepy', 'stressed', 'surprised', 'thirsty', 'worried', ] self.xml = gtkgui_helpers.get_glade('change_mood_dialog.glade') self.window = self.xml.get_widget('change_mood_dialog') self.window.set_transient_for(gajim.interface.roster.window) self.window.set_title('Mood') - message_textview = self.xml.get_widget('message_textview') - self.message_buffer = message_textview.get_buffer() - #self.message_buffer.connect('changed', - # self.toggle_sensitiviy_of_save_as_preset) + self.entry = self.xml.get_widget('entry') + + self.combo = self.xml.get_widget('combobox') + self.liststore = gtk.ListStore(str) + self.combo.set_model(self.liststore) + + for mood in self.moods: + self.liststore.append((mood,)) + + cellrenderertext = gtk.CellRendererText() + self.combo.pack_start(cellrenderertext, True) + self.combo.add_attribute(cellrenderertext, 'text', 0) + + message_entry = self.xml.get_widget('entry') +# self.message_buffer = message_entry.get_buffer() def run(self): '''Wait for OK or Cancel button to be pressed and return mood @@ -326,10 +338,8 @@ class ChangeMoodDialog: mood = None message = None if rep == gtk.RESPONSE_OK: - beg, end = self.message_buffer.get_bounds() - message = self.message_buffer.get_text(beg, end).decode('utf-8')\ - .strip() - msg = helpers.to_one_line(message) + mood = self.liststore[self.combo.get_active()][0].decode('utf-8') + message = self.entry.get_text().decode('utf-8') self.window.destroy() return (mood, message) diff --git a/src/roster_window.py b/src/roster_window.py index fe7417dd4..a108ca9f3 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -2273,7 +2273,6 @@ class RosterWindow: dlg = dialogs.ChangeMoodDialog() (mood, message) = dlg.run() mood = 'happy' - print account, mood, message if mood is not None: # None is if user pressed Cancel self.send_mood(account, mood, message) From 6ab511eee246cfa3c512d052a999c1f16fc06dfc Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Sat, 31 Mar 2007 07:48:53 +0000 Subject: [PATCH 12/32] One more --- src/roster_window.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/roster_window.py b/src/roster_window.py index a108ca9f3..a682a93c0 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -2272,7 +2272,6 @@ class RosterWindow: def on_change_mood_activate(self, widget, account): dlg = dialogs.ChangeMoodDialog() (mood, message) = dlg.run() - mood = 'happy' if mood is not None: # None is if user pressed Cancel self.send_mood(account, mood, message) From a26d9c028a5a02260a2021f30e2abfe0fbe9d349 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sat, 31 Mar 2007 08:11:25 +0000 Subject: [PATCH 13/32] make mood dialog not use blocking run() function --- data/glade/change_mood_dialog.glade | 2 ++ src/dialogs.py | 28 +++++++++++++++------------- src/roster_window.py | 12 ++++-------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/data/glade/change_mood_dialog.glade b/data/glade/change_mood_dialog.glade index 4294d0197..94f632e02 100644 --- a/data/glade/change_mood_dialog.glade +++ b/data/glade/change_mood_dialog.glade @@ -44,6 +44,7 @@ GTK_RELIEF_NORMAL True -6 + @@ -58,6 +59,7 @@ GTK_RELIEF_NORMAL True -5 + diff --git a/src/dialogs.py b/src/dialogs.py index 30d7517cf..7cf14666d 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -308,8 +308,9 @@ class ChooseGPGKeyDialog: class ChangeMoodDialog: - def __init__(self): - self.moods = ['afraid', 'amazed', 'angry', 'annoyed', 'anxious', 'aroused', 'ashamed', 'bored', 'brave', 'calm', 'cold', 'confused', 'contented', 'cranky', 'curious', 'depressed', 'disappointed', 'disgusted', 'distracted', 'embarrassed', 'excited', 'flirtatious', 'frustrated', 'grumpy', 'guilty', 'happy', 'hot', 'humbled', 'humiliated', 'hungry', 'hurt', 'impressed', 'in_awe', 'in_love', 'indignant', 'interested', 'intoxicated', 'invincible', 'jealous', 'lonely', 'mean', 'moody', 'nervous', 'neutral', 'offended', 'playful', 'proud', 'relieved', 'remorseful', 'restless', 'sad', 'sarcastic', 'serious', 'shocked', 'shy', 'sick', 'sleepy', 'stressed', 'surprised', 'thirsty', 'worried', ] + moods = ['afraid', 'amazed', 'angry', 'annoyed', 'anxious', 'aroused', 'ashamed', 'bored', 'brave', 'calm', 'cold', 'confused', 'contented', 'cranky', 'curious', 'depressed', 'disappointed', 'disgusted', 'distracted', 'embarrassed', 'excited', 'flirtatious', 'frustrated', 'grumpy', 'guilty', 'happy', 'hot', 'humbled', 'humiliated', 'hungry', 'hurt', 'impressed', 'in_awe', 'in_love', 'indignant', 'interested', 'intoxicated', 'invincible', 'jealous', 'lonely', 'mean', 'moody', 'nervous', 'neutral', 'offended', 'playful', 'proud', 'relieved', 'remorseful', 'restless', 'sad', 'sarcastic', 'serious', 'shocked', 'shy', 'sick', 'sleepy', 'stressed', 'surprised', 'thirsty', 'worried', ] + def __init__(self, account): + self.account = account self.xml = gtkgui_helpers.get_glade('change_mood_dialog.glade') self.window = self.xml.get_widget('change_mood_dialog') self.window.set_transient_for(gajim.interface.roster.window) @@ -327,22 +328,23 @@ class ChangeMoodDialog: cellrenderertext = gtk.CellRendererText() self.combo.pack_start(cellrenderertext, True) self.combo.add_attribute(cellrenderertext, 'text', 0) + self.xml.signal_autoconnect(self) + self.window.show_all() - message_entry = self.xml.get_widget('entry') -# self.message_buffer = message_entry.get_buffer() - - def run(self): - '''Wait for OK or Cancel button to be pressed and return mood - and messsage (None if users pressed Cancel or x button of WM''' - rep = self.window.run() + def on_ok_button_clicked(self, widget): + '''Return mood and messsage (None if no mood selected)''' mood = None message = None - if rep == gtk.RESPONSE_OK: - mood = self.liststore[self.combo.get_active()][0].decode('utf-8') + active = self.combo.get_active() + if active > -1: + mood = self.liststore[active][0].decode('utf-8') message = self.entry.get_text().decode('utf-8') - self.window.destroy() - return (mood, message) + from common import pep + pep.user_send_mood(self.account, mood, message) + self.window.destroy() + def on_cancel_button_clicked(self, widget): + self.window.destroy() class ChangeStatusMessageDialog: def __init__(self, show = None): diff --git a/src/roster_window.py b/src/roster_window.py index a682a93c0..8af767a64 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -39,7 +39,6 @@ from common import helpers from common import passwords from common.exceptions import GajimGeneralException from common import i18n -from common import pep from message_window import MessageWindowMgr from chat_control import ChatControl @@ -2270,10 +2269,10 @@ class RosterWindow: helpers.launch_browser_mailer('url', url) def on_change_mood_activate(self, widget, account): - dlg = dialogs.ChangeMoodDialog() - (mood, message) = dlg.run() - if mood is not None: # None is if user pressed Cancel - self.send_mood(account, mood, message) + dlg = dialogs.ChangeMoodDialog(account) +# (mood, message) = dlg.run() +# if mood is not None: # None is if user pressed Cancel +# self.send_mood(account, mood, message) def on_change_status_message_activate(self, widget, account): show = gajim.SHOW_LIST[gajim.connections[account].connected] @@ -2740,9 +2739,6 @@ class RosterWindow: if gajim.interface.systray_enabled: gajim.interface.systray.change_status('connecting') - def send_mood(self, account, mood, message): - pep.user_send_mood(account, mood, message) - def send_status(self, account, status, txt, auto = False): model = self.tree.get_model() accountIter = self.get_account_iter(account) From 8b6320038292a67427f4628d3752b5421f355bfb Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sat, 31 Mar 2007 08:14:18 +0000 Subject: [PATCH 14/32] no need of a default height in mood dialog --- data/glade/change_mood_dialog.glade | 1 - 1 file changed, 1 deletion(-) diff --git a/data/glade/change_mood_dialog.glade b/data/glade/change_mood_dialog.glade index 94f632e02..47122c872 100644 --- a/data/glade/change_mood_dialog.glade +++ b/data/glade/change_mood_dialog.glade @@ -10,7 +10,6 @@ GTK_WIN_POS_NONE False 270 - 175 True False True From af37cf9d688db04e587cdd4a86390e170cf11390 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sat, 31 Mar 2007 08:16:58 +0000 Subject: [PATCH 15/32] make moods translatable --- src/dialogs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dialogs.py b/src/dialogs.py index 7cf14666d..cb3486b91 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -308,13 +308,13 @@ class ChooseGPGKeyDialog: class ChangeMoodDialog: - moods = ['afraid', 'amazed', 'angry', 'annoyed', 'anxious', 'aroused', 'ashamed', 'bored', 'brave', 'calm', 'cold', 'confused', 'contented', 'cranky', 'curious', 'depressed', 'disappointed', 'disgusted', 'distracted', 'embarrassed', 'excited', 'flirtatious', 'frustrated', 'grumpy', 'guilty', 'happy', 'hot', 'humbled', 'humiliated', 'hungry', 'hurt', 'impressed', 'in_awe', 'in_love', 'indignant', 'interested', 'intoxicated', 'invincible', 'jealous', 'lonely', 'mean', 'moody', 'nervous', 'neutral', 'offended', 'playful', 'proud', 'relieved', 'remorseful', 'restless', 'sad', 'sarcastic', 'serious', 'shocked', 'shy', 'sick', 'sleepy', 'stressed', 'surprised', 'thirsty', 'worried', ] + moods = [_('afraid'), _('amazed'), _('angry'), _('annoyed'), _('anxious'), _('aroused'), _('ashamed'), _('bored'), _('brave'), _('calm'), _('cold'), _('confused'), _('contented'), _('cranky'), _('curious'), _('depressed'), _('disappointed'), _('disgusted'), _('distracted'), _('embarrassed'), _('excited'), _('flirtatious'), _('frustrated'), _('grumpy'), _('guilty'), _('happy'), _('hot'), _('humbled'), _('humiliated'), _('hungry'), _('hurt'), _('impressed'), _('in_awe'), _('in_love'), _('indignant'), _('interested'), _('intoxicated'), _('invincible'), _('jealous'), _('lonely'), _('mean'), _('moody'), _('nervous'), _('neutral'), _('offended'), _('playful'), _('proud'), _('relieved'), _('remorseful'), _('restless'), _('sad'), _('sarcastic'), _('serious'), _('shocked'), _('shy'), _('sick'), _('sleepy'), _('stressed'), _('surprised'), _('thirsty'), _('worried')] def __init__(self, account): self.account = account self.xml = gtkgui_helpers.get_glade('change_mood_dialog.glade') self.window = self.xml.get_widget('change_mood_dialog') self.window.set_transient_for(gajim.interface.roster.window) - self.window.set_title('Mood') + self.window.set_title(_('Mood')) self.entry = self.xml.get_widget('entry') From 9f9a662c8400b60158b22a7a5363cd80f39a572c Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sat, 31 Mar 2007 08:22:48 +0000 Subject: [PATCH 16/32] remove useless commented lines --- src/roster_window.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/roster_window.py b/src/roster_window.py index 8af767a64..94e5b9a1d 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -2270,9 +2270,6 @@ class RosterWindow: def on_change_mood_activate(self, widget, account): dlg = dialogs.ChangeMoodDialog(account) -# (mood, message) = dlg.run() -# if mood is not None: # None is if user pressed Cancel -# self.send_mood(account, mood, message) def on_change_status_message_activate(self, widget, account): show = gajim.SHOW_LIST[gajim.connections[account].connected] From 6917ab7ff5cc8f2a2a3d2636ddc9d25fd252c636 Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Sat, 31 Mar 2007 09:09:16 +0000 Subject: [PATCH 17/32] Activity setting from a dialog once again --- data/glade/change_activity_dialog.glade | 158 ++++++++++++++++++++++++ src/common/pep.py | 11 ++ src/dialogs.py | 80 ++++++++++++ src/roster_window.py | 6 + 4 files changed, 255 insertions(+) create mode 100644 data/glade/change_activity_dialog.glade diff --git a/data/glade/change_activity_dialog.glade b/data/glade/change_activity_dialog.glade new file mode 100644 index 000000000..7665916fd --- /dev/null +++ b/data/glade/change_activity_dialog.glade @@ -0,0 +1,158 @@ + + + + + + + 6 + + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + 270 + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + False + True + + + + + True + False + 6 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + True + -6 + + + + + + + True + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + -5 + + + + + + 0 + False + False + GTK_PACK_END + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + 6 + True + False + 6 + + + + True + False + True + + + 0 + False + False + + + + + + True + False + True + + + 0 + False + False + + + + + + True + True + True + True + 0 + + True + + False + + + 0 + False + False + + + + + + + + + 0 + True + True + + + + + + + diff --git a/src/common/pep.py b/src/common/pep.py index b820d4478..8762b8602 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -52,3 +52,14 @@ def user_send_mood(account, mood, message = ''): i.addData(message) gajim.connections[account].send_pb_publish('', xmpp.NS_MOOD, item, '0') + +def user_send_activity(account, activity, subactivity = '', message = ''): + item = xmpp.Node('activity', {'xmlns': xmpp.NS_ACTIVITY}) + i = item.addChild(activity) + if subactivity != '': + i.addChild(subactivity) + if message != '': + i = item.addChild('text') + i.addData(message) + + gajim.connections[account].send_pb_publish('', xmpp.NS_ACTIVITY, item, '0') diff --git a/src/dialogs.py b/src/dialogs.py index cb3486b91..b7503eb15 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -307,6 +307,86 @@ class ChooseGPGKeyDialog: self.keys_treeview.set_cursor(path) +class ChangeActivityDialog: + activities = [_('doing_chores'), _('drinking'), _('eating'), + _('excercising'), _('grooming'), _('having_appointment'), + _('inactive'), _('relaxing'), _('talking'), _('traveling'), + _('working'), ] + subactivities = [_('at_the_spa'), _('brushing_teeth'), + _('buying_groceries'), _('cleaning'), _('coding'), + _('commuting'), _('cooking'), _('cycling'), _('day_off'), + _('doing_maintenance'), _('doing_the_dishes'), + _('doing_the_laundry'), _('driving'), _('gaming'), + _('gardening'), _('getting_a_haircut'), _('going_out'), + _('hanging_out'), _('having_a_beer'), _('having_a_snack'), + _('having_breakfast'), _('having_coffee'), + _('having_dinner'), _('having_lunch'), _('having_tea'), + _('hiking'), _('in_a_car'), _('in_a_meeting'), + _('in_real_life'), _('jogging'), _('on_a_bus'), + _('on_a_plane'), _('on_a_train'), _('on_a_trip'), + _('on_the_phone'), _('on_vacation'), _('other'), + _('partying'), _('playing_sports'), _('reading'), + _('rehearsing'), _('running'), _('running_an_errand'), + _('scheduled_holiday'), _('shaving'), _('shopping'), + _('skiing'), _('sleeping'), _('socializing'), + _('studying'), _('sunbathing'), _('swimming'), + _('taking_a_bath'), _('taking_a_shower'), _('walking'), + _('walking_the_dog'), _('watching_tv'), + _('watching_a_movie'), _('working_out'), _('writing'), ] + def __init__(self, account): + self.account = account + self.xml = gtkgui_helpers.get_glade('change_activity_dialog.glade') + self.window = self.xml.get_widget('change_activity_dialog') + self.window.set_transient_for(gajim.interface.roster.window) + self.window.set_title(_('Activity')) + + self.entry = self.xml.get_widget('entry') + + self.combo1 = self.xml.get_widget('combobox1') + self.liststore1 = gtk.ListStore(str) + self.combo1.set_model(self.liststore1) + + for activity in self.activities: + self.liststore1.append((activity,)) + + cellrenderertext = gtk.CellRendererText() + self.combo1.pack_start(cellrenderertext, True) + self.combo1.add_attribute(cellrenderertext, 'text', 0) + + self.combo2 = self.xml.get_widget('combobox2') + self.liststore2 = gtk.ListStore(str) + self.combo2.set_model(self.liststore2) + + for subactivity in self.subactivities: + self.liststore2.append((subactivity,)) + + cellrenderertext = gtk.CellRendererText() + self.combo2.pack_start(cellrenderertext, True) + self.combo2.add_attribute(cellrenderertext, 'text', 0) + + self.xml.signal_autoconnect(self) + self.window.show_all() + + def on_ok_button_clicked(self, widget): + '''Return activity and messsage (None if no activity selected)''' + activity = None + subactivity = None + message = None + active1 = self.combo1.get_active() + active2 = self.combo2.get_active() + if active1 > -1: + activity = self.liststore1[active1][0].decode('utf-8') + if active2 > -1: + subactivity = self.liststore2[active2][0].decode('utf-8') + message = self.entry.get_text().decode('utf-8') + from common import pep + pep.user_send_activity(self.account, activity, + subactivity, message) + self.window.destroy() + + def on_cancel_button_clicked(self, widget): + self.window.destroy() + class ChangeMoodDialog: moods = [_('afraid'), _('amazed'), _('angry'), _('annoyed'), _('anxious'), _('aroused'), _('ashamed'), _('bored'), _('brave'), _('calm'), _('cold'), _('confused'), _('contented'), _('cranky'), _('curious'), _('depressed'), _('disappointed'), _('disgusted'), _('distracted'), _('embarrassed'), _('excited'), _('flirtatious'), _('frustrated'), _('grumpy'), _('guilty'), _('happy'), _('hot'), _('humbled'), _('humiliated'), _('hungry'), _('hurt'), _('impressed'), _('in_awe'), _('in_love'), _('indignant'), _('interested'), _('intoxicated'), _('invincible'), _('jealous'), _('lonely'), _('mean'), _('moody'), _('nervous'), _('neutral'), _('offended'), _('playful'), _('proud'), _('relieved'), _('remorseful'), _('restless'), _('sad'), _('sarcastic'), _('serious'), _('shocked'), _('shy'), _('sick'), _('sleepy'), _('stressed'), _('surprised'), _('thirsty'), _('worried')] def __init__(self, account): diff --git a/src/roster_window.py b/src/roster_window.py index 94e5b9a1d..f94fb59df 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -2268,6 +2268,9 @@ class RosterWindow: gajim.config.get_per('accounts', account, 'name')) helpers.launch_browser_mailer('url', url) + def on_change_activity_activate(self, widget, account): + dlg = dialogs.ChangeActivityDialog(account) + def on_change_mood_activate(self, widget, account): dlg = dialogs.ChangeMoodDialog(account) @@ -2340,6 +2343,9 @@ class RosterWindow: item = gtk.MenuItem('Mood') pep_submenu.append(item) item.connect('activate', self.on_change_mood_activate, account) + item = gtk.MenuItem('Activity') + pep_submenu.append(item) + item.connect('activate', self.on_change_activity_activate, account) else: pep_menuitem.set_no_show_all(True) pep_menuitem.hide() From 19c5c70f805182c15392979eb8b5e12625c4ddb6 Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Sun, 1 Apr 2007 09:02:04 +0000 Subject: [PATCH 18/32] Initial User Tune support --- src/common/contacts.py | 1 + src/common/pep.py | 50 +++++++++++++++++++++++++++++++++++++++++- src/roster_window.py | 22 ++++++++++++++----- src/tooltips.py | 18 +++++++++++++++ 4 files changed, 85 insertions(+), 6 deletions(-) diff --git a/src/common/contacts.py b/src/common/contacts.py index 9bad04f83..ee0bc9f35 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -29,6 +29,7 @@ class Contact: # FIXME self.mood = dict() self.activity = dict() + self.tune = dict() self.sub = sub self.ask = ask self.resource = resource diff --git a/src/common/pep.py b/src/common/pep.py index 8762b8602..9b65781a1 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -18,7 +18,33 @@ def user_mood(items, name, jid): contact.mood['text'] = ch.getData() def user_tune(items, name, jid): - pass + (user, resource) = gajim.get_room_and_nick_from_fjid(jid) + contacts = gajim.contacts.get_contact(name, user, resource=resource) + for item in items.getTags('item'): + child = item.getTag('tune') + if child is not None: + for contact in contacts: + if contact.tune.has_key('artist'): + del contact.tune['artist'] + if contact.tune.has_key('title'): + del contact.tune['title'] + if contact.tune.has_key('source'): + del contact.tune['source'] + if contact.tune.has_key('track'): + del contact.tune['track'] + if contact.tune.has_key('length'): + del contact.tune['length'] + for ch in child.getChildren(): + if ch.getName() == 'artist': + contact.tune['artist'] = ch.getData() + elif ch.getName() == 'title': + contact.tune['title'] = ch.getData() + elif ch.getName() == 'source': + contact.tune['source'] = ch.getData() + elif ch.getName() == 'track': + contact.tune['track'] = ch.getData() + elif ch.getName() == 'length': + contact.tune['length'] = ch.getData() def user_geoloc(items, name, jid): pass @@ -63,3 +89,25 @@ def user_send_activity(account, activity, subactivity = '', message = ''): i.addData(message) 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): + 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 != 0: + i = item.addChild('track') + i.addData(track) + if length != 0: + i = item.addChild('length') + i.addData(length) + if items is not None: + item.addChild(payload=items) + + gajim.connections[account].send_pb_publish('', xmpp.NS_TUNE, item, '0') diff --git a/src/roster_window.py b/src/roster_window.py index f94fb59df..8771f40fc 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -2984,14 +2984,25 @@ class RosterWindow: self._music_track_changed(None, None) def _music_track_changed(self, unused_listener, music_track_info): + from common import pep accounts = gajim.connections.keys() if music_track_info is None: - status_message = '' + artist = '' + title = '' + source = '' + track = '' + length = '' else: if hasattr(music_track_info, 'paused') and \ music_track_info.paused == 0: - status_message = '' + artist = '' + title = '' + source = '' + track = '' + length = '' else: + artist = music_track_info.artist + title = music_track_info.title status_message = '♪ ' + _('"%(title)s" by %(artist)s') % \ {'title': music_track_info.title, 'artist': music_track_info.artist } + ' ♪' @@ -2999,10 +3010,11 @@ class RosterWindow: if not gajim.config.get_per('accounts', account, 'sync_with_global_status'): continue - if not gajim.connections[account].connected: + #FIXME: updates should arrive, when all accounts are + # connected and we know their abilities + if not gajim.connections[account].pep_supported: continue - current_show = gajim.SHOW_LIST[gajim.connections[account].connected] - self.send_status(account, current_show, status_message) + pep.user_send_tune(account, artist, title, source = '') def update_status_combobox(self): diff --git a/src/tooltips.py b/src/tooltips.py index 3bc9ad5db..b5d992111 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- ## tooltips.py ## ## Copyright (C) 2005-2006 Dimitur Kirov @@ -497,6 +498,23 @@ class RosterTooltip(NotificationAreaTooltip): activity_string += ' (%s)' % activity_text properties.append((activity_string, None)) + if contact.tune.has_key('artist') or contact.tune.has_key('title'): + if contact.tune.has_key('artist'): + artist = contact.tune['artist'].strip() + else: + artist = _('Unknown Artist') + if contact.tune.has_key('title'): + title = contact.tune['title'].strip() + else: + title = _('Unknown Title') + if contact.tune.has_key('source'): + source = contact.tune['source'].strip() + else: + source = _('Unknown Source') + tune_string = '♪ ' + _('"%(title)s" by %(artist)s\nfrom %(source)s' %\ + {'title': title, 'artist': artist, 'source': source}) + ' ♪' + properties.append((tune_string, None)) + if contact.status: status = contact.status.strip() if status: From e3ef0821b341f3e94b1942067e2dd9c083757030 Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Sun, 3 Jun 2007 10:04:20 +0000 Subject: [PATCH 19/32] Merge with trunk --- autopackage/default.apspec | 38 +- data/emoticons/Makefile.am | 20 +- .../account_creation_wizard_window.glade | 2059 ++--- data/glade/account_modification_window.glade | 195 +- data/glade/advanced_menuitem_menu.glade | 27 +- data/glade/blocked_contacts_window.glade | 147 + data/glade/chat_control_popup_menu.glade | 6 +- data/glade/data_form_window.glade | 2 +- data/glade/gc_control_popup_menu.glade | 260 +- data/glade/gc_occupants_menu.glade | 291 +- data/glade/history_window.glade | 19 + data/glade/message_window.glade | 2 +- data/glade/roster_contact_context_menu.glade | 668 +- data/glade/search_window.glade | 191 + data/glade/service_registration_window.glade | 28 +- .../synchronise_select_account_dialog.glade | 131 + .../synchronise_select_contacts_dialog.glade | 131 + data/glade/vcard_information_window.glade | 132 +- data/iconsets/Makefile.am | 20 +- data/iconsets/transports/icq/16x16/away.png | Bin 975 -> 887 bytes data/iconsets/transports/icq/16x16/chat.png | Bin 1010 -> 941 bytes data/iconsets/transports/icq/16x16/dnd.png | Bin 983 -> 936 bytes .../transports/icq/16x16/not_in_roster.png | Bin 964 -> 964 bytes .../iconsets/transports/icq/16x16/offline.png | Bin 1014 -> 941 bytes data/iconsets/transports/icq/16x16/online.png | Bin 1005 -> 945 bytes data/iconsets/transports/icq/16x16/xa.png | Bin 969 -> 896 bytes data/iconsets/transports/icq/32x32/away.png | Bin 2232 -> 2135 bytes data/iconsets/transports/icq/32x32/chat.png | Bin 2303 -> 2399 bytes data/iconsets/transports/icq/32x32/dnd.png | Bin 2252 -> 2343 bytes .../transports/icq/32x32/not_in_roster.png | Bin 2334 -> 2228 bytes .../iconsets/transports/icq/32x32/offline.png | Bin 2220 -> 2173 bytes data/iconsets/transports/icq/32x32/online.png | Bin 2166 -> 2272 bytes data/iconsets/transports/icq/32x32/xa.png | Bin 2218 -> 2120 bytes data/other/servers.xml | 3 + data/pixmaps/agents/icq.png | Bin 2215 -> 2272 bytes po/LINGUAS | 2 +- po/de.po | 2924 +++----- po/fr.po | 41 +- po/gl_ES.po | 6633 +++++++++++++++++ po/hr.po | 3358 +++++---- po/pl.po | 1835 +++-- po/pt_BR.po | 4479 ++++++----- src/chat_control.py | 209 +- src/common/config.py | 3 + src/common/connection.py | 175 +- src/common/connection_handlers.py | 110 +- src/common/contacts.py | 8 + src/common/dataforms.py | 63 +- src/common/events.py | 5 +- src/common/gajim.py | 2 + src/common/helpers.py | 25 +- src/common/logger.py | 2 +- src/common/rst_xhtml_generator.py | 92 +- src/common/xmpp/features_nb.py | 1 - src/common/zeroconf/client_zeroconf.py | 20 +- src/common/zeroconf/connection_zeroconf.py | 57 +- src/common/zeroconf/roster_zeroconf.py | 2 + src/config.py | 390 +- src/conversation_textview.py | 88 + src/dataforms_widget.py | 29 +- src/dialogs.py | 296 +- src/disco.py | 71 +- src/gajim.py | 213 +- src/groupchat_control.py | 246 +- src/gtkgui_helpers.py | 21 +- src/history_window.py | 25 + src/htmltextview.py | 382 +- src/message_window.py | 14 +- src/notify.py | 6 +- src/profile_window.py | 20 +- src/roster_window.py | 542 +- src/search_window.py | 195 + src/tooltips.py | 60 +- src/vcard.py | 182 +- 74 files changed, 18085 insertions(+), 9111 deletions(-) create mode 100644 data/glade/blocked_contacts_window.glade create mode 100644 data/glade/search_window.glade create mode 100644 data/glade/synchronise_select_account_dialog.glade create mode 100644 data/glade/synchronise_select_contacts_dialog.glade create mode 100644 po/gl_ES.po create mode 100644 src/search_window.py diff --git a/autopackage/default.apspec b/autopackage/default.apspec index 020962a68..57bef1f61 100644 --- a/autopackage/default.apspec +++ b/autopackage/default.apspec @@ -9,7 +9,7 @@ Packager: Filippos Papadopoulos Summary: Gajim is a Jabber client written in Python. URL: http://www.gajim.org/ License: GNU General Public License, Version 2 -SoftwareVersion: 0.10 +SoftwareVersion: 0.11.1 AutopackageTarget: 1.0 PackageVersion: 1 @@ -28,13 +28,7 @@ File tranfers, Emoticons, URL grabber, Systray icon, GPG support, Multiple accou [BuildPrepare] -echo "-------==========$USER i am making the package...===============------" -export build_root="/tmp/build-root.$$" -echo "Build root is $build_root" -mkdir "$build_root" -make PREFIX=$build_root CC=apgcc CXX=apg++ || exit 1 -make install PREFIX=$build_root CC=apgcc CXX=apg++ || exit 1 - +prepareBuild [BuildUnprepare] @@ -44,24 +38,28 @@ unprepareBuild [Imports] echo '*' | import import < - - + + + - - - 12 - Gajim: Account Creation Wizard - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - False - False - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - - - - - True - False - 6 - - - - True - False - False - GTK_POS_TOP - False - False - - - - True - False - 12 - - - - True - You need to have an account in order to connect + + 12 + Gajim: Account Creation Wizard + False + + + + True + 6 + + + True + False + False + + + True + 12 + + + True + 0 + You need to have an account in order to connect to the Jabber network. - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - True - 0.5 - 0.5 - 1 - 1 - 5 - 0 - 12 - 0 - - - - 6 - True - False - 6 - - - - True - True - I already have an account I want to use - True - GTK_RELIEF_NORMAL - True - False - False - True - - - 0 - False - False - - - - - - True - True - I want to _register for a new account - True - GTK_RELIEF_NORMAL - True - False - False - True - use_existing_account_radiobutton - - - 0 - False - False - - - - - - - - - - True - <b>Please choose one of the options below:</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - False - False - - - - - False - True - - - - - - True - - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 6 - True - False - 12 - - - - True - <b>Please fill in the data for your new account</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - 6 - 3 - False - 6 - 12 - - - - True - True - True - True - True - 0 - - True - * - False - - - - - 1 - 2 - 0 - 1 - - - - - - - True - _Server: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - False - True - True - - - - 1 - 2 - 1 - 2 - fill - fill - - - - - - True - Click to see features (like MSN, ICQ transports) of jabber servers - True - Servers Features - True - GTK_RELIEF_NORMAL - True - - - - 2 - 3 - 1 - 2 - fill - - - - - - - True - _Password: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - pass1_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 2 - 3 - fill - - - - - - - True - If checked, Gajim will remember the password for this account - True - Save pass_word - True - GTK_RELIEF_NORMAL - False - True - False - True - - - - 2 - 3 - 2 - 3 - fill - - - - - - - True - True - True - False - 0 - - True - * - True - - - 1 - 2 - 2 - 3 - - - - - - - True - _Username: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - username_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - True - True - False - 0 - - True - * - True - - - 1 - 2 - 3 - 4 - - - - - - - True - _Retype Password: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - pass2_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 3 - 4 - fill - - - - - - - True - True - False - 0 - - - - 5 - True - 4 - 2 - False - 5 - 5 - - - - True - _Host: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - proxyhost_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - _Port: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - proxyport_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - _Username: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - proxyuser_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 2 - 3 - fill - - - - - - - True - Pass_word: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - proxypass_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 3 - 4 - fill - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 0 - 1 - - - - - - - True - True - True - True - 0 - 3128 - True - * - False - - - - 1 - 2 - 1 - 2 - - - - - - - True - True - True - True - 0 - - True - * - False - - - - 1 - 2 - 2 - 3 - - - - - - - True - True - True - False - 0 - - True - * - False - - - - 1 - 2 - 3 - 4 - - - - - - - - - True - _Use proxy - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - 3 - 5 - 6 - fill - - - - - - True - Your JID: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 4 - 5 - fill - - - - - - - True - True - - False - True - GTK_JUSTIFY_LEFT - False - True - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 3 - 4 - 5 - fill - - - - - - 0 - True - True - - - - - False - True - - - - - - True - - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - True - False - 0 - - - - True - <b>Account is being created</b> + + + False + False + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 5 + 12 + + + True + 6 + 6 + + + True + True + I already have an account I want to use + True + True + + + False + False + + + + + True + True + I want to _register for a new account + True + True + use_existing_account_radiobutton + + + False + False + 1 + + + + + + + + + True + <b>Please choose one of the options below:</b> + True + + + label_item + + + + + False + False + 1 + + + + + False + + + + + True + + + tab + False + False + + + + + True + 6 + 12 + + + True + 0 + <b>Please fill in the data for your new account</b> + True + + + False + False + + + + + True + 4 + 3 + 12 + 6 + + + + + + + + + True + True + 0 + True + True + + + 1 + 3 + 3 + 4 + GTK_FILL + + + + + + True + 0 + Your JID: + + + 3 + 4 + GTK_FILL + + + + + + True + 0 + _Username: + True + username_entry + + + GTK_FILL + + + + + + True + True + False + * + True + + + 1 + 2 + 2 + 3 + + + + + + True + True + If checked, Gajim will remember the password for this account + Save pass_word + True + False + True + True + + + + 2 + 3 + 2 + 3 + GTK_FILL + + + + + + True + 0 + _Password: + True + password_entry + + + 2 + 3 + GTK_FILL + + + + + + True + + + + + + + + 1 + 2 + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + 0 + _Server: + True + + + 1 + 2 + GTK_FILL + + + + + + True + True + True + * + + + + + 1 + 2 + + + + + + 1 + + + + + 1 + False + + + + + True + + + tab + 1 + False + False + + + + + True + 6 + 12 + + + True + 0 + <b>Please select a server</b> + True + + + False + False + + + + + True + 6 + + + True + 0 + _Server: + True + + + False + False + + + + + True + + + + + + + 1 + + + + + True + True + Click to see features (like MSN, ICQ transports) of jabber servers + Servers Features + True + + + + False + False + 2 + + + + + False + False + 1 + + + + + True + True + + + True + 5 + 3 + 3 + 5 + 5 + + + True + False + 6 + + + True + 0 + _Hostname: + True + custom_host_entry + + + False + False + + + + + True + True + + + 1 + + + + + True + 0 + _Port: + True + custom_port_entry + + + False + False + 2 + + + + + True + True + 6 + 5222 + + + False + 3 + + + + + 3 + 2 + 3 + GTK_FILL + GTK_FILL + + + + + True + True + Use custom hostname/port + True + True + + + + 3 + 1 + 2 + + + + + + True + True + Manage... + True + + + + 2 + 3 + + + + + + + True + None + + + 1 + 2 + GTK_FILL + + + + + True + 0 + Prox_y: + True + + + GTK_FILL + + + + + + + + True + _Advanced + True + + + label_item + + + + + 2 + + + + + 2 + False + + + + + True + + + tab + 2 + False + False + + + + + True + + + + + + 3 + False + + + + + True + + + tab + 3 + False + False + + + + + True + + + True + <b>Connecting to server</b> Please wait... - False - True - GTK_JUSTIFY_CENTER - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - True - False - - - - - - True - GTK_PROGRESS_LEFT_TO_RIGHT - 0 - 0.10000000149 - PANGO_ELLIPSIZE_NONE - - - 0 - False - False - - - - - False - True - - - - - - True - - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - True - False - 0 - - - - True - False - 12 - - - - True - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - - False - True - GTK_JUSTIFY_LEFT - True - False - 0.10000000149 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - True - True - - - - - 0 - True - True - - - - - - True - True - Connect when I press Finish - True - GTK_RELIEF_NORMAL - True - True - False - True - - - 0 - False - False - - - - - - True - True - Set my profile when I connect - True - GTK_RELIEF_NORMAL - True - True - False - True - - - 0 - False - False - - - - - False - True - - - - - - True - - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_END - 12 - - - - True - True - True - gtk-cancel - True - GTK_RELIEF_NORMAL - True - - - - - - - True - False - True - True - gtk-go-back - True - GTK_RELIEF_NORMAL - True - - - - - - - True - True - True - True - gtk-go-forward - True - GTK_RELIEF_NORMAL - True - - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-preferences - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Advanced - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-apply - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Finish - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - - - 0 - False - True - - - - - - + True + GTK_JUSTIFY_CENTER + + + False + + + + + True + 0.10000000149 + + + False + False + 1 + + + + + 4 + False + + + + + True + + + tab + 4 + False + False + + + + + True + + + True + 12 + + + True + gtk-missing-image + + + False + False + + + + + True + 0.10000000149011612 + True + True + + + 1 + + + + + + + True + True + Connect when I press Finish + True + True + True + + + False + False + 1 + + + + + True + True + Set my profile when I connect + True + True + True + + + False + False + 2 + + + + + 5 + False + + + + + True + + + tab + 5 + False + False + + + + + + + True + 12 + GTK_BUTTONBOX_END + + + True + True + True + gtk-cancel + True + + + + + + True + False + True + True + gtk-go-back + True + + + + 1 + + + + + True + True + True + True + gtk-go-forward + True + + + + 2 + + + + + True + True + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-preferences + + + False + False + + + + + True + _Advanced + True + + + False + False + 1 + + + + + + + + + 3 + + + + + True + True + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-apply + + + False + False + + + + + True + _Finish + True + + + False + False + 1 + + + + + + + + + 4 + + + + + False + 1 + + + + + diff --git a/data/glade/account_modification_window.glade b/data/glade/account_modification_window.glade index 6ed71d58c..06898adcd 100644 --- a/data/glade/account_modification_window.glade +++ b/data/glade/account_modification_window.glade @@ -99,7 +99,7 @@ 6 True - 4 + 5 3 False 6 @@ -134,27 +134,6 @@ - - - True - True - True - True - 0 - - True - * - True - - - 1 - 3 - 0 - 1 - - - - True @@ -260,50 +239,6 @@ - - - True - Resource is sent to the Jabber server in order to separate the same JID in two or more parts depending on the number of the clients connected in the same server with the same account. So you might be connected in the same account with resource 'Home' and 'Work' at the same time. The resource which has the highest priority will get the events. (see below) - True - True - True - 0 - Gajim - True - * - False - - - 1 - 2 - 2 - 3 - expand|shrink|fill - - - - - - - True - Click to change account's password - True - Chan_ge Password - True - GTK_RELIEF_NORMAL - True - - - - 2 - 3 - 2 - 3 - fill - - - - True @@ -379,6 +314,134 @@ + + + + True + True + False + 0 + + + + True + True + 11 + + + + True + Click to request authorization to all contacts of another account + True + Synchronise contacts + True + GTK_RELIEF_NORMAL + True + + + + 0 + False + True + + + + + + True + Click to change account's password + True + Chan_ge Password + True + GTK_RELIEF_NORMAL + True + + + + 0 + False + True + + + + + + + + True + Administration operations + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + 3 + 4 + 5 + fill + fill + + + + + + True + True + True + True + 0 + + True + * + True + + + 1 + 3 + 0 + 1 + + + + + + + True + Resource is sent to the Jabber server in order to separate the same JID in two or more parts depending on the number of the clients connected in the same server with the same account. So you might be connected in the same account with resource 'Home' and 'Work' at the same time. The resource which has the highest priority will get the events. (see below) + True + True + True + 0 + Gajim + True + * + False + + + 1 + 3 + 2 + 3 + expand|shrink|fill + + + False diff --git a/data/glade/advanced_menuitem_menu.glade b/data/glade/advanced_menuitem_menu.glade index 93d21d083..b331dbb3e 100644 --- a/data/glade/advanced_menuitem_menu.glade +++ b/data/glade/advanced_menuitem_menu.glade @@ -11,7 +11,7 @@ True - + True gtk-new 1 @@ -31,6 +31,27 @@ + + + True + _Blocked Contacts + True + + + + + True + gtk-stop + 1 + 0.5 + 0.5 + 0 + 0 + + + + + _Privacy Lists @@ -58,7 +79,7 @@ True - + True gtk-new 1 @@ -100,7 +121,7 @@ True - + True gtk-clear 1 diff --git a/data/glade/blocked_contacts_window.glade b/data/glade/blocked_contacts_window.glade new file mode 100644 index 000000000..9b2e870b0 --- /dev/null +++ b/data/glade/blocked_contacts_window.glade @@ -0,0 +1,147 @@ + + + + + + + True + Blocked Contacts + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + + + + + 5 + True + False + 0 + + + + 3 + 250 + 300 + True + True + GTK_POLICY_NEVER + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + False + True + False + True + False + False + False + + + + + + 0 + True + True + + + + + + 3 + True + True + GTK_RELIEF_NORMAL + True + + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-remove + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + _Unblock + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + + + + 0 + False + False + + + + + + + diff --git a/data/glade/chat_control_popup_menu.glade b/data/glade/chat_control_popup_menu.glade index 8219a42b2..b6a696355 100644 --- a/data/glade/chat_control_popup_menu.glade +++ b/data/glade/chat_control_popup_menu.glade @@ -13,7 +13,7 @@ True - + True gtk-justify-fill 1 @@ -42,7 +42,7 @@ - + True gtk-file 1 @@ -83,7 +83,7 @@ - + True gtk-add 1 diff --git a/data/glade/data_form_window.glade b/data/glade/data_form_window.glade index 7cc9d8803..2d73ee5dd 100644 --- a/data/glade/data_form_window.glade +++ b/data/glade/data_form_window.glade @@ -584,7 +584,7 @@ - + True False 0 diff --git a/data/glade/gc_control_popup_menu.glade b/data/glade/gc_control_popup_menu.glade index af8dba982..1f5918e80 100644 --- a/data/glade/gc_control_popup_menu.glade +++ b/data/glade/gc_control_popup_menu.glade @@ -1,133 +1,131 @@ - - - + + + - - - - - - Click to see past conversation in this room - _History - True - - - - True - gtk-justify-fill - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - Configure _Room - True - - - - True - gtk-preferences - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - _Destroy room - True - - - - True - gtk-delete - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - Change _Subject - True - - - - True - gtk-edit - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - Change _Nickname - True - - - - True - gtk-redo - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - _Bookmark This Room - True - - - - True - gtk-add - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - _Compact View Alt+C - True - False - - - - + + + + Change _Nickname + True + + + True + gtk-redo + 1 + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + _Manage room + True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + Change _Subject + True + + + True + gtk-edit + 1 + + + + + + + Configure _Room + True + + + True + gtk-preferences + 1 + + + + + + + True + + + + + True + _Destroy room + True + + + True + gtk-delete + 1 + + + + + + + + + + + _Compact View Alt+C + True + + + + + True + _Minimize + True + + + True + gtk-goto-bottom + 1 + + + + + + + True + + + + + _Bookmark + True + + + True + gtk-add + 1 + + + + + + + Click to see past conversation in this room + _History + True + + + True + gtk-justify-fill + 1 + + + + + diff --git a/data/glade/gc_occupants_menu.glade b/data/glade/gc_occupants_menu.glade index 43e9d0a57..15a90c35b 100644 --- a/data/glade/gc_occupants_menu.glade +++ b/data/glade/gc_occupants_menu.glade @@ -1,163 +1,132 @@ - - - + + + - - - - - - True - _Occupant Actions - True - - - - - - - True - _Voice - True - False - - - - - - True - Mo_derator - True - False - - - - - - True - - - - - - True - _Member - True - False - - - - - - True - _Admin - True - False - - - - - - True - _Owner - True - False - - - - - - True - - - - - - True - _Kick - True - - - - - - True - _Ban - True - - - - - - - - - - True - gtk-info - True - - - - - - True - _History - True - - - - True - gtk-justify-fill - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - _Add to Roster - True - - - - True - gtk-add - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - _Send Private Message - True - - - - True - gtk-jump-to - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - + + + + True + _Send Private Message + True + + + True + gtk-jump-to + 1 + + + + + + + True + _Add to Roster + True + + + True + gtk-add + 1 + + + + + + + True + Occupant Actions + True + + + + + True + _Voice + True + + + + + True + Mo_derator + True + + + + + True + + + + + True + _Member + True + + + + + True + _Admin + True + + + + + True + _Owner + True + + + + + True + + + + + True + _Kick + True + + + + + True + _Ban + True + + + + + + + + + True + + + + + True + gtk-info + True + True + + + + + True + _History + True + + + True + gtk-justify-fill + 1 + + + + + diff --git a/data/glade/history_window.glade b/data/glade/history_window.glade index bdf6bd9c1..b475f03b4 100644 --- a/data/glade/history_window.glade +++ b/data/glade/history_window.glade @@ -87,6 +87,25 @@ + + + True + True + _Log conversation history + True + GTK_RELIEF_NORMAL + True + True + False + True + + + 0 + False + False + + + True diff --git a/data/glade/message_window.glade b/data/glade/message_window.glade index 56a2c3d74..ad23fad7b 100644 --- a/data/glade/message_window.glade +++ b/data/glade/message_window.glade @@ -79,7 +79,7 @@ 0.5 0.5 0 - 0 + 5 5 diff --git a/data/glade/roster_contact_context_menu.glade b/data/glade/roster_contact_context_menu.glade index 2dddcefa6..4352365ef 100644 --- a/data/glade/roster_contact_context_menu.glade +++ b/data/glade/roster_contact_context_menu.glade @@ -1,341 +1,331 @@ - - - + + + - - - - - - True - Start _Chat - True - - - - True - gtk-jump-to - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - Send Single _Message - True - - - - True - gtk-new - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - In_vite to - True - - - - True - gtk-go-back - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - _Rename - True - - - - True - gtk-refresh - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - Edit _Groups - True - - - - - - True - - - - - - True - Send _File - True - - - - True - gtk-file - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - Assign Open_PGP Key - True - - - - - True - gtk-dialog-authentication - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - Add Special _Notification - True - - - - True - gtk-info - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - Execute Command... - True - - - - True - gtk-execute - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - - - - - - _Subscription - True - - - - True - gtk-dialog-question - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - - True - _Allow him/her to see my status - True - - - - True - gtk-go-up - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - A_sk to see his/her status - True - - - - True - gtk-go-down - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - _Forbid him/her to see my status - True - - - - True - gtk-stop - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - - - - - _Add to Roster - True - - - - True - gtk-add - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - _Remove from Roster - True - - - - True - gtk-remove - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - - - - - - gtk-info - True - - - - - - _History - True - - - - True - gtk-justify-fill - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - + + + + True + Start _Chat + True + + + True + gtk-jump-to + 1 + + + + + + + True + Send Single _Message + True + + + True + gtk-new + 1 + + + + + + + True + Send _File + True + + + True + gtk-floppy + 1 + + + + + + + True + In_vite to + True + + + True + gtk-go-back + 1 + + + + + + + True + + + + + True + Send cus_tom status + True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + + + + + True + Execute Command... + True + + + True + gtk-execute + 1 + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + _Manage contact + True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + _Rename + True + + + True + gtk-refresh + 1 + + + + + + + Edit _Groups + True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-edit + + + + + + + Assign Open_PGP Key + True + + + + True + gtk-missing-image + 1 + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Set Custom _Avatar + True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-orientation-portrait + + + + + + + True + Add Special _Notification + True + + + True + gtk-info + 1 + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + + + _Subscription + True + + + + + True + _Allow him/her to see my status + True + + + True + gtk-go-up + 1 + + + + + + + True + A_sk to see his/her status + True + + + True + gtk-go-down + 1 + + + + + + + True + _Forbid him/her to see my status + True + + + True + gtk-stop + 1 + + + + + + + + + True + gtk-dialog-question + 1 + + + + + + + True + _Unblock + True + + + + True + gtk-yes + 1 + + + + + + + True + _Block + True + + + + True + gtk-stop + 1 + + + + + + + _Remove + True + + + True + gtk-remove + 1 + + + + + + + _Add to Roster + True + + + True + gtk-add + 1 + + + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-properties + + + + + + + True + + + + + gtk-dialog-info + True + True + + + + + _History + True + + + True + gtk-justify-fill + 1 + + + + + diff --git a/data/glade/search_window.glade b/data/glade/search_window.glade new file mode 100644 index 000000000..6a3e6133a --- /dev/null +++ b/data/glade/search_window.glade @@ -0,0 +1,191 @@ + + + + + + + 12 + Search + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + + + + + + True + False + 6 + + + + True + False + 0 + + + + True + Please wait while retrieving search form... + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + True + False + + + + + + True + GTK_PROGRESS_LEFT_TO_RIGHT + 0 + 0.10000000149 + PANGO_ELLIPSIZE_NONE + + + 0 + True + False + + + + + + + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_END + 6 + + + + True + True + True + GTK_RELIEF_NORMAL + True + + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-find + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + _Search + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + + + + + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + True + + + + + + 0 + False + True + + + + + + + diff --git a/data/glade/service_registration_window.glade b/data/glade/service_registration_window.glade index b53f6a8f1..b9a79cb43 100644 --- a/data/glade/service_registration_window.glade +++ b/data/glade/service_registration_window.glade @@ -2,6 +2,7 @@ + 6 Register to @@ -18,6 +19,7 @@ GDK_WINDOW_TYPE_HINT_NORMAL GDK_GRAVITY_NORTH_WEST True + False @@ -25,31 +27,6 @@ False 6 - - - True - - False - False - GTK_JUSTIFY_LEFT - True - False - 0.5 - 0.5 - 0 - 4 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 4 - False - True - - - True @@ -232,4 +209,5 @@ + diff --git a/data/glade/synchronise_select_account_dialog.glade b/data/glade/synchronise_select_account_dialog.glade new file mode 100644 index 000000000..e75ed5d7e --- /dev/null +++ b/data/glade/synchronise_select_account_dialog.glade @@ -0,0 +1,131 @@ + + + + + + + 12 + Synchronise contacts + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + 350 + 300 + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + True + + + + True + False + 6 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + True + -6 + + + + + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + -5 + + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + Select the account with which you want to synchronise + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + 150 + True + True + GTK_POLICY_ALWAYS + GTK_POLICY_ALWAYS + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + False + False + False + + + + + 0 + True + True + + + + + + + diff --git a/data/glade/synchronise_select_contacts_dialog.glade b/data/glade/synchronise_select_contacts_dialog.glade new file mode 100644 index 000000000..e5f2a67f7 --- /dev/null +++ b/data/glade/synchronise_select_contacts_dialog.glade @@ -0,0 +1,131 @@ + + + + + + + 12 + Synchronise : select contacts + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + 400 + 300 + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + True + + + + True + False + 6 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + True + -6 + + + + + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + -5 + + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + Select the contacts you want to synchronise + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + 150 + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + False + False + False + + + + + 0 + True + True + + + + + + + diff --git a/data/glade/vcard_information_window.glade b/data/glade/vcard_information_window.glade index ef505d44e..ad55ab284 100644 --- a/data/glade/vcard_information_window.glade +++ b/data/glade/vcard_information_window.glade @@ -9,7 +9,7 @@ GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False - False + True False True False @@ -392,7 +392,57 @@ True False - 0 + 6 + + + + True + User avatar: + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + None + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + @@ -417,6 +467,65 @@ False + + + + True + Configured avatar: + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + True + + True + GTK_RELIEF_NORMAL + True + + + + 0 + False + False + + + + + + True + True + Click to force avatar + True + GTK_RELIEF_NORMAL + True + + + + 0 + False + False + + 0 @@ -432,25 +541,6 @@ - - - True - True - _Log conversation history - True - GTK_RELIEF_NORMAL - True - True - False - True - - - 0 - False - False - - - True diff --git a/data/iconsets/Makefile.am b/data/iconsets/Makefile.am index 6dbd09b71..c609e3df6 100644 --- a/data/iconsets/Makefile.am +++ b/data/iconsets/Makefile.am @@ -9,28 +9,28 @@ ICONSET_FILES = **/{16x16,32x32,48x48}/{*.gif,*.png} \ transports/**/{16x16,32x32,48x48}/{*.gif,*.png} install-data-local: - @for d in $(ICONSET_DIRS);do \ - if test -d $$d;then \ + @for d in $$(cd $(srcdir); echo $(ICONSET_DIRS));do \ + if test -d $(srcdir)/$$d;then \ echo " $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/data/iconsets/$$d"; \ $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)/data/iconsets/$$d || exit 1; \ fi; \ done - for f in $(ICONSET_FILES);do \ - if test -f $$f; then \ - echo " $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/data/iconsets/$$f"; \ - $(INSTALL_DATA) $$f $(DESTDIR)$(pkgdatadir)/data/iconsets/$$f || exit 1; \ + for f in $$(cd $(srcdir); echo $(ICONSET_FILES));do \ + if test -f $(srcdir)/$$f; then \ + echo " $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(pkgdatadir)/data/iconsets/$$f"; \ + $(INSTALL_DATA) $(srcdir)/$$f $(DESTDIR)$(pkgdatadir)/data/iconsets/$$f || exit 1; \ fi; \ done; dist-hook: - @for d in $(ICONSET_DIRS);do \ - if test -d $$d;then \ + @for d in $$(cd $(srcdir); echo $(ICONSET_DIRS));do \ + if test -d $(srcdir)/$$d;then \ echo " $(mkdir_p) $(distdir)/$$d"; \ $(mkdir_p) $(distdir)/$$d || exit 1; \ fi; \ done - for f in $(ICONSET_FILES);do \ - if test -f $$f; then \ + for f in $$(cd $(srcdir); echo $(ICONSET_FILES));do \ + if test -f $(srcdir)/$$f; then \ echo " cp -pR $(srcdir)/$$f $(distdir)/$$f"; \ cp -pR $(srcdir)/$$f $(distdir)/$$f || exit 1; \ fi; \ diff --git a/data/iconsets/transports/icq/16x16/away.png b/data/iconsets/transports/icq/16x16/away.png index ad6782bb6002c1b028f6284fe80f9f2c9aa07d12..7c69352362fc71527e0a78e66a5a852ab144b5ac 100644 GIT binary patch delta 864 zcmV-m1E2iQ2lob$B!32COGiWi{{a60|De66lK=n!2XskIMF-ad4haY+29l3B0009S zNklS|`avQl) z>fkG#lFAaV%yeu{ojC`!{{IXRB~RGAgVoC<_rK7Z|KfNgO?Tn`Jdc+dLj16G?Wn$q zC!?qqq!tbPtA9tyctLnpJ-?IK#-*PxRua4V>Lv6rP3@jq3(lf(jH;C&lYPH&@3YM| z_lIs?{_KQr{P0Zj(Ib1kwl2{)rgHVGs5pP!HTDmgy6#8B7V;PZqTG5_&}8D_=aO#W zYrMN37lGZrB0XM5ujtZ6aF&L?p&(ja(9(AwJ3rnq@qcCxNq16<7EN;CU{dpcp%Or) z2r4-v!bEZE)NR+i2io_c<#mGgUhzuHCLDf^`q#(tb`RpmInV4o0O2+?^^hxke`>`N zz37`_bu?O@O+`0LvOZ@)B#M2X|@cD;MqYBR1GUx^JT=QKb zJl{C*#DBhE=YT;K5VUxU+NG1=43a*8uFfH;PLhK!8?6>V{6w_)(@W*K=@uVMcbMI8 z-0zd%Vl>=N^;TJ>E=}dcsF;o}+|mrTJ{9{>#n->Dp!pjFJtJOuZhFwDx*K-oDv}w3 zj>jlon~P0Dn}&Oyk;ocMOE-ScAf&Qd{C2#m&41mP>>;o*h&tbuYex#xpH5=D1kP%G z?{It2=zQ{v*tn)9l@WXM3U%rGgQ`AQEM7XfKv16+Q6tJ(zx^2V5cNXD+B^PIc+UfM zZhjJT?~`C-Rp$g}(Y0CXx(_F!#UF#3E%k*p+P07J>m5@D*>ty;G1;f7U7so`>QGH$ zEm;~QFb)tJJ3n9*SpC-*h@z3g52sHHw17^br0vSgu(xXjt(7VLa&AK%<9Af@Ke+ie qUB;LT25E4jYf^RZwH{+)tL7grLUi6d%QW}^0000rAOaJ?2&ERW!79PH5Rw`uZde#}>3`OZacN@QxG=twQSs5# zL@S|CBm_celunvh(X^#D)0vhsv@?B7zxg`%{@qAyO#JQ7?<`IZF*6>LO;f#;Vu-=J z+2DO<{!mD|3ZTJgemj-nFYq5|yI|rq@j>MAgXbFdJgw#~4_2IFVW@F`&*^Zo%f5Tz ztBQ832LRXrl79d$rZQX=|1^iQY3gAHi$H_1R)0s!;eNl6qT9DKZrdAwAhQ3c0Pu$L z1#bH5qhAU^L)kQu%BCqUl>F7dGwE@bm+bquN7;A$Rro_5kmYL^M1YWR$|Ye1!)H65 zKjl%@dpt1)UrH4u7$plL#iC;Ogo!2iiKRk{`A^ z`(J^a{}~8(z*`q$r?j+J8N*KnTUrGQqks?yhni(@;7v>qehlfiRQ16Wll?4gkAQM= zgm4_2GRA8QHw1tYMS?~af4P1#y06#c^|(N79Twk*+F>Eu*GzV!pYrENP}g+`#YG1j zOABtLaDOdtYUbrshVRk%8PtRDiL}&lfc&ObBa(_EN871wU^f6@V|oR1A59|A*r6f4 zwYA(7>Gk5g(fp#4O1>9pNxTp}aLnrs)j|0zlyiC7+#36LY-R*wam3;clHE-i>*~eY zIz2Lfb?{pSLU-)Q39q$s3vd7qccFA=0+k0j*nbflo+dx$&ribkC5+k8DNwixto(&Q zypO<03O0PBe0R#_rbDRsp2VNS7qw7|A3gmR7Jr!Gl`C6F9)1aM*Ui*VgQhGV+cJrM zY&i}9tkU=y)JY{SFpGnLnGM8uC6YbQc%WTOe*HOi4ZIGTy9`P^hneATDo(j{g$TXO zkblga7O4!E_kO0kjjkn0*{yBeeI7G^9aYx@W-u{>wFVb%qd9fNFC;m}aFm%tsSJOw zw*8{X@`s>M1vl)$y@|06A+YQ^y4}(>fD~#q!(irAhPNJu#5TblceOZO7$0+svw6KX zlP$90OKY>g8BU%+S;utY)@Vg*e&>JRm@-XMga~IzP?ypCE&y8y8V1lvglk&!xm1Q1 bwhR6S6l{KE$`zaK00000NkvXXu0mjfHQc|( diff --git a/data/iconsets/transports/icq/16x16/chat.png b/data/iconsets/transports/icq/16x16/chat.png index 4895a8cdc732c1fdb29febe61e2114d14b3cccdb..e07261b277cabbe8b9549f624ce5658f5415b1d5 100644 GIT binary patch delta 919 zcmV;I18Ds62dxK?B!32COGiWi{{a60|De66lK=n!2XskIMF-ad4haY-mMxO00009| zNkl4inr$1{;|5nB}z{#L&6AL;Kbp|uHPPd`sC)1dis08AHMvq81 zF~-D0@kEanl?bvxG_bKP%*jR>I>h24$Q*M)V8zO4x6jevuYdi%_kBGh#YFG3J9+La zPx3rBL5X%9EbFF>eoQGKq<9}-aX=lWlu%`2CMU$}r}pY|r5Rpo7^k1^3cprqXUj13 zL+^p5w3h2=*P@$z{+7+PazRKe?9&ZH2KN&bL>1b;#qc%;6`lF;Jnk2A;R?qr@? z%}YqSBtG#(=o6cpT$&LBqgLoe9e`Zq1gdW|+W+#FhGs9bDP%+vwca3Ux-&`K?fZ~X z3bU88SfA7_`iKh!hl1N5RAbp=Ny8AYazo_y#}d~(w-&B2&vC1vUO!M)$$1( zkGj#`@qY?hSJi+q1|bA)&Rr+^&@%60F(yd&VaLSg(9=(@tqf5>ff5FuUP8;r1@t?1 zW8025;Pv`28u|9#t-{Z?L(>+~bM&Jn4v=*ZRd1ocr23#B;bi4V#i^2x9OgBhc)dPI zDbd!_aStGbfZtyZZg@OgN%?2&?o>sCD-6SwIDdC>*bG*0qWQKBR17R)VIhG)U^z~o z87|r2dHi)dj=X)|AYGr^)>$odh%o9DLaN7u%@yt{Y6F0u#;4SynYT!LcpK{LHUI!} zxg4&}{-(yxol=*bJ-vKjZ{Zq%dI0D?R2HwT3EHlt2Jx_~6L}g@f#>3+f9w$U`1fJ_ z`+u{TosSk!bRM|EkMtkgb9?f>S5`nq%g!U@?!xqqXih3ADVHvm^`rOb5%`*8m`wL9 zop@V+4*>Aazq(M=#rDzjgI`lZ%B55jioqLCUu|3Yl0wnc@#FOAy8u4BuRZu5?dY+s trB*V+I4P4-E|>-N!O1s^eWf%10H_9c=MZ)SYe4`2002ovPDHLkV1i++#2Wwr delta 988 zcmV<210(#c2l5AyB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$TZ%IT!R5*=YlU+<(bpXZB z|K5MUZW(Qb)_(9&kWDiAC||*p0Rm+kGdi7SKB&naeApJ_n}0F!(fDX$)J0;9MjtfM z2_y=eg;8dkO)^-9MuZJ$vD@UMP}*+X+m?I(e_tFnp7--R=R6$3ImaV)oio{}4#VI$ z%osjo44;~f2O^J~o^;pR`!;ou$|%)MXS2$;0LI>V``s;42Ml_~1Qk|ZE`Fx`yw&3R648|uf@w@5Yk5NJpjQl$PTyx!NgJ4WRQIp8z?!Y2ZywF97 z(-y>7Fn(;CN3oANatCjjSzf6DL)DblB#k-slZQml##bi z9RdJ+_H{i}6k{3-M$KiR4w(x=s)PBOaa1|{YNew=+}+*7pGzwV(s|Zsp%j-m7ux_e=Jixpc6WFU zs(+TnH$&4nbNU2suMgoV&x^P?7Lilwhm!!h0f>y@bs;>cq(h%59h#?LgCvMN%NR--LveUe8KL-3jv`3{5qD8u(vI0%%ew+$$$U;M z2LLJ>p(+9g2M-S_dyh;)0bn7ONiE;F6;;j0qI=q6Y<`P#GQPCB!VbG$1>`y{bp3{` zs^q-_56J)STtW!m5Cqg{8r}z>7e$N$uoJ?6QB`t2JgBS{0{#I5!g-Jb%{%4haY+29l3B0009@Nkl@m^Lw2 zmh#X~hpY2zKVt3Rf_=1q^sRuMZ@}4~zj}YAm@B`wV_&ev-ic)HFaPw+`5yuF|E~a` zf}Obo_p8@1^8C2(yUVAHjkYj;FHWM@JqioA`o=$#?{ebD09`aBc8a~9HiWDKlib3C z(vaq@*aC?zTEZ+~xF|L(?2VO~$)IRB-v2%H(+Iu;9f zI>0JX%Q9=CL7 zmor^`zL)J@TNovkMcC0vV>f@J##fKR5*>ug*$w~QOXL_hNK%`y)dK3`tsfRE)$$v{ zkmX|!Gxyxd>_59XCkKHjQqr_-(=a2EhF(d42ZqsG_puYxCsf_2Ln>K;(o?pYaaRc5 zaBd*_(tluAAj$v@MjWEJ0ycF65W7GwLVbP(snbh1lGF?}1C_0<&YSNvPh8K=dIdn; zPlaA&@xu4eP;hcD3Mr;lLm4CIJ|<-ep=YW9W&(VB*%08?DO;tLZ?^Yvww%-@du$(DWF(HgFgsnwZR!*+ zRQ=JHvfxrW+|YQu!}=yE2>E`M}LKsQ3AdIw|$_9!k84~ zHwE6i{^`z_cnoE?*c)f>_s5@l;kjdRZRwA6>-J{0t~<8>>Ena(%7x{%L;e=yySlhi zUEiT}g`YH+7Jo&V0YKjwx8DDTc327so7HWu6>i{}!Cr?&#i@qcI`z-uRm57`EsWEL z6*l{gP^j`eIe)bu0FW|pR&C*2&PKx3!-gqiiTQ_Wb12T7o*Y&d%WA;yW{NG1N2yAY z$>zc@zu05j-?CR-T=+|`dcv4g8oMmto<4CT($vDVj@F3UP#dO;SEtG6Za|gCD^lq+ zHPqM8_(VcEeX5ry^WVdi1yIRfURqt7=4F8npHHI)kAJ2?46xh$^x8|$;_C}z@Hp%| zSI9`e=YX`@P2|}fa$0L(F`Dqp-6?}ic3ElYQhLl1uZxEIxW;vmv>;zfA(Ivuc|M4t z-XL9``klObh|+5Yew)pR>6?j?A;iha&kA>_|4sOqsa;@-?2&?z5FpM8?+i8LM0^hb zU^8c64N=Sh`G4vy z&lfR#sf3#41)`F$tZhIpO!|I682IKEE_6 zYra~iCcP1!KoByS1Tq=etAk*w6?$UL;0EJw{Wx#)!S6tyaw#_prTF zq}pXdC@~J^_5N?dj*ShZ1Af6K&t=o&pA_3k@_LJ+QfFJEnn+y%M*xrvR5Ag^9=`yH zF@Go$S^lq4G|G{H?jm9Wd-MaiKfhX(WXfD?m9{cC0No#iNTmQN!Gb|-t*(|qH1Xe= z4u;FAbzXiICUY7km8NgcCW$bCZhv#l=sYot3avH-a=WpWOd9KRb9qCEle9Zl_v@%fnQ6Y=1|eg5p3GLN?cV@vmg!y^-; z01)`k0sz=D3kyAq(FOhDbEn(`UkCqLbJ zDYa2lr!Ng&;T}(g(b3jnNU4DcNTf6Bm2XEU#suRWNb%`^&1k)sBpadB^EG712V008Y>JuAM3#~~CB$@bQEhg6b?NGh#p zd4FYDc0SQnFne!aq*EIKFpToZ)YR|)m@*-4ClZ#sv!lx~_3Ljr(xd?ZG-)ymO+Y{* z4MmYi!~y{8Uth@OvM&r>8@tLF+pCqF1Vq>3QmiZ388kB4ERIiH&k@kTZU*6h)YRHq sXE==S7-NN`bW#$0I6FN#ygTzZ*g~Iu3J(l$ga7~l07*qoM6N<$f~`QaTmS$7 delta 918 zcmV;H18Mxk2gC=EJb%^<91a38zWN^q000AKNkl@SrQbpLxOQ@qXoP@YmP*8;5M? zJAQwQT=;;}C_r_vZnaH%Oc4K>I3*(nZ?Ih^sK%hxkUtdEc++z`Beq^&L^VJ^b zU1#BB8URV%{eMFjFeB=ARng|wCX%TX^7$Oye1G*7tgNlU<#xz{fDfu_XIT=Q z&1O(jQvKb_V)IU4O71+v!Z-b>+xK?6pxF_N-Kx}YefY>X9s3@+-@|~)sj{$ zTABlXOIu4oo&A39t_-Hhu}h=YWO5mT2tL0L+q+Mol{DB@2UMF4(=*dp+4zlpK0l>W zNo2A)48{hCnL{!&&!yA*H=>cKTsCxkdw<4kY=5XHm&;AJ?%d&X=UOS3&0}+G+gM#) zr=h`^u&XvYE))QwKPeK4)UrjHA`%_UD0g+V+k(MPMbk8VJvEKjZ(PUx<3|VuLzsWG z@ci)b=_+9M0w5viO*xTBdb<%P%UX*=T7D28ZP9V!`yj^^eT?C$NA*ffh}(|~RmP;GV;PEHuarT;zC*ywO3 zoyoqzCObexiRENk01pIFXSlDAB-z3bf0!=-d^3|y=TEtRjTIUm_6Xg0Pa;vR8|9CM sB$>px&x|@EJY+WCO)W02oMrw27hP!4kq>J9D*ylh07*qoM6N<$g6BEBGXMYp diff --git a/data/iconsets/transports/icq/16x16/offline.png b/data/iconsets/transports/icq/16x16/offline.png index 713ff1ea574bb487924ed549cdb13ce464f61b10..260dd85927b9d6e2400581b9bdffe71b8214a0e4 100644 GIT binary patch delta 919 zcmV;I18DsA2dxK?B!32COGiWi{{a60|De66lK=n!2XskIMF-ad4haY-mMxO00009| zNkla-ur#?Pr;d?San*gwpA+=lUh@lv5E;Xv?h%rsm7!`m%5N@ zW@3y+H?-C^HgTalO*94*a0+FhVhtT#fr*>aXiXu|7KaYZFn=@O@4feR3kyBFlbq+Q z&S9`c=g)sSzzuN@k%8y?A23F@k@2q?LnKl+eAhlTH1z(`Rz_?y0rB~3gRgfW=X7cO z$FtSyhBY`am^1@HRxX!&uKYAr0D$y=77$ULA=~MDo__vlZ+xsUy2CI7tkI~eL_E$I zV)ERDvu_E(-+v`d^@eZviQ(blUBReXFuB>``@Wi;opm#rj2VtZbR--VN=mJ@CfD;2 zG_h1F^e{lKdhX8^ye_)Pp7;v9KW>6G zei43+z2cE3Wm!$RQQh!Usoe|+4kH1rR4NsUgnuI_gn?JD{(^y!$vR&8#2+(GQg!!$ z{^$6JZM8m5;}ZqYT8oxgiy$H*O(d+kb8>R(@+FQUB9#y6u5_Yv&%?@>l4?3Ey!)R~ z?q*FLeDVp6$W(D^ay1+b#|+Z|04j)FE_V|E9s>ZlaPhO1{reAKtyY!MXiP|@01+gC zCV$Jebh;~TEZ({$)+@C%n2^l9lUvv}Wguv5Zq^d9*bcF9W5FR!9uWwoH6cUB5J>}t z^ZEQ50IcPQ^4q^)dCrMqaq4@{@jk8PZ^W?m-dZ^uk0*rVx~x>XW&y#MTNwubqcdkd t-Yd*dQ3xKCN>!BSe{}kEZggwrU-5^npb*G{O=SQ8002ovPDHLkV1gWSy|DlQ delta 992 zcmV<610VdY2lfY$B!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$Tb4f%&R5*=wlig2SWdO#X z_dV}9J+w+sDQ!na8A|EMNVHKDx4MyiFiO{{nL)0WxQq)k6My~#Z;aj;lg*fTr-=zu z*bDFGJ|`+DOdG4Xf*{GN*^50O&h8SzBSqpIq- zl=6@e;<6CpD^*qR0BEpn`=hC!ZjRtTkiCMp-bs8Bi9{|%qi?c_i5r#W<>m3NuCDhY zk%%@jGE%8ltAAYpGytst(y3(Hr2jM<@kHz>=UfK-0kOMVMsIJgQ&rVyxIL^<3UqhB zK>>W|^?H8`27^}_W8?8ejL>)@*1{N@>*zR`^!a=r+`e;LR(ESK+y)#DN02BKgeoYN zip1~t4-E_q)V+J|oXcZ)dH}r4G)?>FY~rjp)ZRvg5P!&Kb9`!Q3dc_zN85{SvXIZq z=KT?}xVY%J@cso9O9i;y27LZTStu4>Vx05WL+v5Du~7n5C=8EVxj1wYH%Goi!ndN< z=ZYe)55n8f0Mjyw%jJSqv*gm!BMRVWrQ^`SS16&O=3r2%udj!us$jf~!NOoQZt|eO@z4j)!5tENPc9Kl*P`@-bp?-q}Gmmqk-k6OmH3QZD%PAHUx>J%$I|miYd=Q4ZaZEB)7SYhIK2 zod(Rm`YG;j`^D(!n6OOS@-_Og{d60Ikf)^oOrKlRv=kwDO$fQv+1YuZxA&9-gy72M zD}NXs9>$Y=4gudjT)+N9C9{^frR#c6wOUn#5a($snckWh|1oNswN_o%n|peC9Qphc zRCX$0j7csyI2U-Fe~e?tjyf4*)k>w(D1@j_CDS+9o?rNN-68Ah>Hrv+p8mDMIWJXr zt3kmzo_9Tme4!|%lroh}ThBstkKn<^##!dWR4P@QnVIFYv$F*u#4mGmb0QFE!fIxX zCzHvFWmzBp?;GQZn3qyAM5z+8ZTk}d8e=R8z()wVXIa*zR5G30EBG6xuamU0VNR0( O0000Z0F?2GP~^5Xg0_ddN>5!r;cPLZ_;sxx z^`Ulnq_?!|3xD;dBzX+rHAkVtIQ)50h1Wp8^vH7MD0h5v)QZKo`=nr$1hz`86f|on zrJ%KJ`*s~HPGx3!`0C(ShQ~l(`(uZiBb&FA>$aDUVD!Rhr2s1LOf3u-ioD0ctmI-1H3L4UD>hZ^>JQp*YcpUwM#3hn#R&6d|@++tX@LYUrmR8zD~u@ zyai8u4}yVOl-;^S{+3rru?y3V=!@fLl6folqT#6AvANVtXnyI>gHn>8K-7?B+IL^8 zAY%cXo_~Ujw4%OHDvl2y*9E5lrBxo9hfLeKWf-z(pe6qJo|;Hp01QDA##$O;=qg|w z00jwbF>D{9dw;L6^cn;_ftkeQk%^mQVFRGr9TmI9MCLRY8UYzbCLvfC<qt8ZG*xuUiRrQ3g0=o@Zh!R#8UyW!neCXFSa3t;R?c@kO>dVh zV5E|8^0_G1w^Z?&A5Pj~)M4kQ1JJAiW^FjGe);lG7tWCs0i`rQ5^LS&kJ!eFJC7t4 z_-;ixB{SDhR$c26)Q}weQh&y*QhU(PNdUVIo+x5sjtwFWrItl<+u z2ohlCqQTd(2ox4^^j}{nSgP~l=-F=sQCMppVTqFY^v#Z@l1|tK8&@U=Rsno=&wKDc xyzr@6BfK;u4f1QPmt33Q{r-)@>5ZO$02CBDgB|*(Vj%zk002ovPDHLkV1i{{z}El( delta 983 zcmV;|11S8l2ki%tB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$TYDq*vR5*=wlig2SWdO#X z_dRdha}J-~=vhBtl#Sp-pfJjqAgv3sWQz%LnOwLm@q&wW8h`%-6JxwIF>112nP?mr zy1^31j0^=S8A05#5838~6=a*hN=r*$oKQq_G8;x9 z(I^By5d!C!4U+(NaSQKHoioqlKaib*BkyXTcC;Qi+YxAC7e^;^t4|XnuN-O{c(K7} zKYwv7XXcAR0DpD>egHqjqUJODPjh7`qV)&?S)%R|o7N2a!ks#^p}X4cv2T+(yxew} z0(hrX*Js>&Dux)tNGPHa7K&(lnT=fE>vcQUH@57tUuWe>S05^?IP6TX0pS27Qkz*? zURE}E`psU4UF8`1=34k^G8ItjyOiPnzTU>>HisGvG=DOq(nm&roTgPy9~6{ustD@c z<08{De<*LA46(m*-+@wwR8kZY$*miVb8^VzuA~czE1(o8b9t4)Q?KLe3*#u!7)zwM zRBb`1x`jOMlM2-jvAti${~V_P#+15Fb}*ll`x`tVR<0WmoT4bwSbLPkz^ev18Z^k| zsoTWusedI;9+~)UKEr>xac84Yu)?vZ87DnwR3{<$f-!j%pt@yA!WfnP-PPp16Ab`> z`K1g#`05^c{A=V!0oi7+R*UX z@B^rtSG3rh=}Kw>iPXDX(WxTyLZC_rl*gjxCAQ-iMyalYC|T6(?!@(*i&;uUs_;yy0RX0` zuuLi;A!AXq_&h{+2=1r1(u;F97>baz8aa&=+(p=k7+0&-1!VrDL9S>(h2 zePbx1?Ir|+l%k$RCcB1BGE7C9S>nyWhne*=1DYtJUw$}a!_002ovPDHLk FV1j6$&5Zy6 diff --git a/data/iconsets/transports/icq/16x16/xa.png b/data/iconsets/transports/icq/16x16/xa.png index a3d0b2fa59d31172f1d5b99e4c33e2ef8f0f7b9d..d2d589b2d6bc43dbc1301a6f04673e9770d249a9 100644 GIT binary patch delta 873 zcmV-v1D5>B2Y?5VB!32COGiWi{{a60|De66lK=n!2XskIMF-ad4haY-mMxO00009b zNkl;*AmHL_hSmrN4RMx=v1SkR4U28u~1EtOkb&4fp?w_8W9Z;bV*5>9OH23%GV>2@e zCmzSq_BOV1xx3TWzR;Obc&v_&C>(}&=MGYrFGq=J&xpS_^m{b;n{~#V=jzYLv@z zFQ5Ox_>KALxlCp}oJf#oEy}lUxy4F_htHl>(XlZc*X!^(4i0OzrV-0q|@%nIyMR0GJUUA9s!_6)FFDgA`~9)F&gc)5FYR0Du01=vI2Q5IkYio62Z+W<@-QnPO;uGax$LI-PWAN;ej(rZX$ z3Sl!bjLEkj}byZORqaTm5qkm{)NH(rrYsv61{8Lj9&x44tVQb&t z%;#?a2(gGfGdbBGvDSE%3R?TFc+EbtJ1dCB;|`6C)JivRmbA|oArS?ldG#8wHD&GS zl(lgHx;L5hxtp6%u^7Z!VP-HhTE!yzPM!=2k;BdA^Nm*P;zj09%o9^SZdR-CrPJ75 zUSh7Z2m=T+Gbj*%C3IusMT?H4200000NkvXXu0mjf5M7&T delta 947 zcmV;k15EsY2gwJJB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$TMoC0LR5*=wlh13LbsWdv zpYQj{lQc=!q=_!n{Hm*^gwC2`vqEU&p}JWR7NqkK20QdL|9=GCMHD;;>cyLQut6xZ z-JpaSwziJq4r$ANSmK~Q1KTZQNt-sL$ulM22o0u6d$r5=b(E@-N z179oV?gO#f4^RspKr8V zt+xT_0HOeHWq+8D#XrrSEYSorv(4vI;^9NYrly=4QPL9(>e|*8BB_)B@Uh+H`mNjN z%Sxh!ED>p0qOcTVy*C`T*D4j=SXp7u%nVLx8idms5dj%qdG=;@gqOQ-D`GYYv} zs$MRS$V)=}{AM~G8|dqEL=y?k84A&(r6u7Eg}@GnC4T|o>FcA%>+3Rc@uJqr=K(2E zH_cYPTHO$eIpGfkL}z0I*6rH}Jbx}zv$HUkm(f)+Y{$h-wa?5BBGwE8wnzkKFvxq) zo(TZI$QdCn&MsQkE#;-`NxpAIXs+dE~$pjM@_ zYcWr2nh;<027~XPnVfXET`oAJM0I-># zw{(wZ*c*?_dN_Grl|Y;D1nNOau8!}8cPQ7RV8 zGzau(L^&nI7%BC{H#iuHpF3w~)5M+Y*YVDkD>%;O&~@Pg?%lZ2I664ELqsVsO9fmO z8Gq)(kCaL(%Zie&zc!po*_*4YXu91{0D~DyDKrZO42+LEC6TF^{R%jhVP4cu{Nhzd zcQ>SI0wW_RZf+h)=6#bnq$~?U*U@2S1~|jqei;%c1jXjw-uC1B_gg#Vvi0J@gNg$3 zFN#HFPp5Gh4qJb$t~M;@&;Iv~St1_+vn+yWz+(O!fG&xa73lL000O1 zNkl3&2703Vg-8XOM&3iNUcsJO1Vc(aqqaqNoBjUs@?& z`k|Gm)Jm07sjaHE>MEfmO4>wessbsHgqkHyz%0Qw5MyIw8-HVFJf0cP`j&f7Ka8=* zHjq@xhf2ND(VMw<=APd<=YQ_I!2kPTU*t#ayHMhod$MzZmg!o_ z?Rn2`ucnc%{2$B)+&p&TUOGM4xbpYNd=UWUk*hKIRinhmL=vz^fZPx~G>r1c)-`Zj zdC6mjJmjVU07L|`qA+XfH6@3o0MPOrRvZAHDKCHcj@S z7Jj+3A5UmL|8KRT(tvPX#Yx3_MLPRN`0ADKRxO@gjP#v6wG%_IVXm2rCm2b}J0=3- z8m#!R?SIkKXN%`9eyMWNEE9V~&xG;I#4 zNCJ$*5!&>j>o*t0u3bc6T8%V{%M|2>04s{n%-O~LXV2J-agdY%5u_48E<7NNn#O~b z3ul^$bpVuy21gADa<$r zHbnzPb@*z@qU8Z@4~%YBFml82%G=7!r?>Kv+ud@gCkkfPLJ=vbJ|7$l`4Z?A2w%M- zYJVPY(h=_hq{z=p0;B|~ChSBsC#AeS1%NYkg}=1Sgp+!p7)iRoNC#?GEl}KyE$_B= zf|!ZY@*vA~UjsQdEMbBXF~b0Zog9mtNP;{jq)~^V_RE8T5ROa%kmO#-MDC^FE1l|m zw1yxFByXc?PK6Q>VRCL=LeZLy+`s5C2!G3i+@~k0YWXToiJtMOp@0SJ;qWTlI({T# zS=n#S{uQjk{TTodz^)zCn=99ESre)))hIIva?<%UjsfINLVk^{ZnPS)MG@(tXW9H2T%L8q+jSLEsUei|`L_J4-v zFEEYDX}UM4LxBWH0MZ5JGJr0?Ysx^W_VFyG+M(9Yhtm^8B5fkoJ8Wm}wmH&D4?C{- z8@cjd#9%+Dyc3S%QyZa%X7D|V#=pn7GMjsJooil&h!_C)Da9(c?`6C+1Bgj_;U+}X zkJKk0N>*B@C>|AH3?gU2$)vL*gMR}VD;n+>uCs61VYE*HIR65w{2uS=k|nFB71!4p znok9Ul{X>~6v&}FVD(F(gi;R#ki!OK+XrBNKOo)w>8Nmk`v6}E4jJe7L^!16U^wmOko__%25^%G5 zXi0!;1C#;MLr}RFb!*m@_ni6Q7l7Ca6ub)*k8g=D;A6;y3tFh414ts3(-80Jg6JCp zGZzBf1h@%iE`-|~MlKqbta2FuW%P6`GylPCwQJUDJlzLMho^KA2?^rr zc;I77cIN)? ztauibiX|B7@3&l6y!OC0JiiCEUW32Fm}eD8SW?JKTCnKp#-=SLEZUY=HW9#m=(`yg zrE?c^J$rq;#`n`)vVRa=&CNILc=id!P`=MO+v(9wuj@F9u(KCGOVPI7Z$V4}m^@m) zt^T8->8WQtRv&|#8xtf8&Oqmx^SPR}Px`cEdx7)OONkahbi_zT+Ar=}_9~78K+6I6 zZ^dBUcRWRelgCH9psPk`wdN&8sqBOZT^4|w%Z)&i4{}oUqkp9^%Vz{)9=-<<#{uAB zcf^NY$yAOquUW)krN^Qpl7L={cwcWCMCXK<*lKkDS|$k!2vVZ_Q5k+Dz^Zw;lZ_0d zrKc1C%O5I=7gDcAtfRe`YD_q0qW>l~-O#&!f``;S>0bz$)Og!(l=Kufz07*qoM6N<$g4){y AS^xk5 delta 2220 zcmV;d2vhgh5V#SLB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$YHAzH4R9J<@m-};6)CV8`}Bw1WC&Db)K1@-XZFm_obU5F-}n2x zXP1~6|Ia0UD4{pEko+$9(aksz*-5toVjHu{*b;kN_VN$_oPLVRG?s1f1geSMN!LpL zt}Bg~A3wnE4}S)5dOJO$`9rUl)GyW*Bqq+bU$NjWYuU>~(cR+R%2khVEGqM9wlXnt z_Ecu7>*QC%4&8_TW~tP8b<@i{ax(xo%s`gll38TvDh`f!gMY`qM9_@M(xnepxVm_ng=vzT z0!RRYK$G1F);8FV!ZH9jy@OUqcF8v)yTn_kchcIM2Oy$zTPUz>ACJ4KST-k10L=pk z0iNtdsBW<#h4#GAbxptp2>}QJ7y;PU6f22rWS4x&EUkXOdi~Zd)$6uy()}d|J9g5_ z8v=Z>oqyIvpE7#SJX>t3ii%itx7NmXZtuWH2h&uw5)cv)0($Neytg!#lI~@&4F~}u z0rHo^9=iga>A7&jy*n5F_AQTH=w1?!d|(gv^xJdiFV;EM4S!7bprmn`cc|?!L+St#AOw^Mz?vM@ z12uQ7pL_cvFZUec=o4QcP}hQZv~@XvPi8p~-9dgm5IS7*&@X)Y*vFuuHemQO zn6XyOtCnW%&wm|A_I7F$F%wkQ1VF(bnnTXiII$ke+pl|(Nu*hL0{Z-W@AvV=RsfWT zBYy&?t{^aXo);2puG<2|Xqi*{BN&-ZkZa`yg#d&Er>?+Ew9Kci&dc^>H-2hCpv z!3k*oAZINB5P`~?F?_O>D_1@&Xs8_k=bIy66kLGp=wKF%^Ves9up+Qvk%`Rc3~@f$ z0we^87-Fmq3+}m_tVEJ8x1V6!QvnW#d4IUSi*44C&Uu-Y;!uf~kR88DhagJo;S@Ds zqO+Z{7T&!cfH5%D-{qj_)~lKmsIa%wMH8nmuc@9!Gvm~G>OBNkw@7bOHT7f+oIn01 zRjzzUs-e$jo*L4Cs9lS+6F|?wzogupwQ0ox&deIP>4PY;TRT>AAIQRA z309o9j{yqZhQY5bq{d^Ye{45AvCpum+>Z(oLZbakrpPhW=?N?q6MEhkUy0>#JJxM6nt4N-)8;9KL+)AGVaFE!?nK z;L?YHa=~B>jfY{DFMm>@+(`jt=buz5AbcAJd*hiz*YS1;{qD*;?>6RC-!7#y37BDA z?r6)zyCW|y+0TER1poli?X;Ms_!XqF1?)_L)mb66M;AZ&yote&05_X=#SG&@bjU5c z>jCMHx8}1_$P5(2salTQu$?YsiGg4Za`6bHBtYeZ3g(&M>ao)Z-?1Vva`NzxoAXrP3c>87K}CPxb+>3n&*5266~P<AkWTikAOEG@>!z{b>rE*ms>KX_pKng)p zP{TLre=C5}k#wfUTuZ9}gaIfQWCUT^9>jY)Q(*UqlTNwNd^63bAw}_RnD{D^wr&3N zcLrFpm*aLewQ=C^+u2O$9-w9evU8fzclfQea`{ODUVoi9-(iWeru<>W3IKuT--9V@ zjyriFnr1)V_%?uV|6{U^)(DMWAd>enyBA%Df4lS*{yP9fcgxQ5yVfoW*VgLnILO(A z;ZvVxGMB$3lL000RA zNkl_7=6AR;QIO&h3? zT1APX(DY0CrA-tm?UzVFA&)9iNRi{J!8e__9m9 zD_5*mGd-C^l7A!sfN7ct1OuqAKauF^@we(Jwtm;HT^;`xz~gUQx41R;8xNE%c2Tb5 z{FRe^@l@((2cAjZ*z&&po$3YKenk{ULWiegWA#=PBXoEB+1`Kd?H3R)f9|=L zgVJQ;+jm2bS#7UxSpHO2w{aN~QL)MUo4ilz->TWZJAXMhCAq2;he$fk>sY&_68XLY zP)c#)O_;?2fwtmnRQh8Mt zI0pwu*nj9kS?)^Jde#2CA}gR=2Qvf+f(S|toH%)GvXEH1=n)740RR~Q?g0439%-4Z z*x&Rz^BlUV3!zwVdoq#wu(|Exv(t)ax%|oR0005nhH_tpV=y{MH~=9#fX=QC`110x zY{{b#MG1l+fRLdUV~l}P3QA4LvITyB7nelo#D5(C8{bk_Ov@?%blLp18H4acfCQCh zPQB4_{r(Hr>i85-0nc<4k$$5M0pkV=^Om~4Zu(NUkRl{zHQ=-T+4${KJE3V>S_~kl zKV6qjaOLt!#9~o=^4Z7n1l6Af01*I|zYHm7s`t#AMH{nP^*Th%UPR0u1lV? zf`3ZOxu$wH#a=2nG$$fvFQ(dNkf!VBQC{?b5I`%q7DnTt+pt(H$n($NQe9EH+~KF+f^mwWTY`ggj)2jQF!7UR z3s;C&u3ll8x>uN%J0Ec#fM#`om?{8{tbb`5TKf;tbL|oF`0?X-@r9Q_2*I9r-b5%I zglJ`;nYYbGTg~tG?rb|gQWarn5i8uzEPK?v4Gx|bAI5;mbhIWT2T>9~= zaQm&RZF-7tJFr7<89$cNFb3~?H?q3+n-5>{Xj8V$D4eV1d&*SRs(=v_j8jmSf)b12 z!T1fxbF#pr&FLUK+6={4jzJ}VHh)TTJBifk3YKsY$&^ase(_iZK?PaL4pJ0po2jF26N`_HoOvKfLb zD*z|Z%@m@Efn;}IXY5w6tt*+L+YW5kn8`UVo=`CmMp z=o~!)05&K7v2O8`B{9iQT8(3XKHPl3@I-L*yG`8R7=mj`C3x)nJ4>nNBiUYumf0!j z)JTuA$qXcD1Re{UF*bK-2(H1JPz7)!B#dNSNh&s~{3(==*dW4sebn8w8V+#4fuRj_9TV45}Lv zv5XtNp;aIfq~KHpy5l^t?w7cH>mUZt9EBOO!wlIGIdd3Iy|viqvGazD^~MZqB|LJ$ zXbe7@421zv6w|utBY)71yQM@gSNEMJ50+ zB>wzm;}`2!&3mFqv2%el0wd1(xr_BNQ4-XJ6-%X-=n+s*fPZuJQ3gxdOk5{j7^&HS z(SvNC!&<6W=%*TMK62RIYac3q#4|l3LmZ^HVHI3x@42QMruo5yDFA>C?^yFig4aYr zewcwJ88a`r?O9c87H#x=AFBoB6aa@RI??wdqjRS(60h;v2{-0_wpBRx_5PMnD!5D~ z$}T|=Hn}vnnt#$$B%X?0lx)fMA8!Gj05IM*y=Ob{*wQVJb+K=VPGjlL&R6H6;cP>4 z<-CpR560ni1x9X6hvbD6EQp@Ia^#7F+fzpXVEt~`R5wy1!V`{Qyls9RR+pBu02Y(z zvDh6WsgWs&rJ@nei8_@0=%j#iM2ud{$egb!7P1w<5q|(UumkbC=?Hgw2>^PAHOsAe zg#-~gNg3(#k!OJr0K_|4g(n4gup{C32d@u$#6k#=z`>yk z8gixCXuAGYJ7cWQ(34aoGDd&jL-Jlr5xN3xx~a38p8^o?wNYOWUb0U3ArS1ZuJEn3 zW?2i6C4ZKn?!xDR$YA6N5Yh~SZNBUx+knwC^bse>v(AQt7PGIut8EE&BzN4b2b&Dw zUQH;B_^Mas3TL+XH(9jgnN*Jt^cv6C?V@J@kd1rPFIFvhe2L9r5g9ijQx|@0Zys!J zztGZkIMW0Au(5zwBQU6LbtCdpqd>0000R9J<@mw8N8`4z{% zzq`Hr9`8Niv5J5qAXOBXL8~Y(xPS{{)oN^F+ccRr(`hHu#ebUGWE|Ak+WDtVr%fiN zX_}eDeUPD|B03I;D_Uex91$Ko5oD3K@!q}f-uwIY50%Q|k~nEka&wcD-}#=;@0|1d z-CV*L!~fHSZ(4BwNBeR_QGA!cFw6FI!c2o%!aJe(=%h(2mgh?jM--7H2>_sJAv_)! zV3p@8LOnf?nlw!-+_8P^8xvGxZPepH9gTvn1tG<`o@5pE;{oO8!XyQK3Z2eEu^0n$<@!!Qh7sICO1bWF{>#Vfd#D+-cN zpDF(kz|UU_aP&iHKm2pJpwfrv_16OcVyx5oMKcypK7aGV#%Nv^LWT!|Z!R*YPKT~* z;5ZJ;mVe}r(qfE4*LCQ+fywC^e8t(*-+3hfV~lP5gUMs!5~F!efRycuwdRIm`pMlV`0FEQ&8{$$qX~`|FBph5_pIvcd+}C z8pNL}uT<^Mo1Y)q(pLrm@Tj+umXJBY9}F^ss((P33lBOUAaQ&W7S3M`o)^Gz90(x* z07@wg!vLiQL{Wmv)d2t%!vG43Nm{%k?p)E5)p0uM24e=GFI(5@>dL!%r^@Gar6@5m z)8$@&1A6@Rn4Z2VqWb1#g(Cv=_>(wRl8U!~^e${x8z_B}j4`09=KN4a@)oaz*Xuz^ z>3{J-UDx*v1BkRloG)CwGOo>Y1e!58RF%m1RO{BHEn$^cE*jb985n0bqsw~@b{pY5 zfj-GBP6NzW!IF;Qz~6z{v*sXs_FUL(b}&Y^@bNM3Lk*Sin)AKCrz^z+)nQwnECw=0mIo)zBZz5b#BhI8NyGA1qL_^*P@ z+FgsaGjb%xfWF%*>Ut}%ykMp1y!!}XIzF%dErLmBkv47)20U(jcJfeHNM~!=h?{Td zCS1Rllq{cHxH>+LmwNoy;SY6zv47FWX=0;*oLSqDG%pT-^O+YNmmlHQ?K5ajFe5TX zg2S2tJtU#Ju4bU4yR%IXV#CS3tbL^3&=7hIY^}Ij_P)*H_(k@Vnbz@9IhHUB55NEj z1Em_+pbrxS&(q|M&&f0*dHyu?G$x==9LMh6?+R9QRx%~zA22i=rwmmZgMTtsRfl~G zmKGC1){rlm@jHQtSz)rxB#I_3qz9pDK_vM?_*vffxs-(}0RIRnE1Wel%9<`}`lJLF zW|k#cG9wsL;q|*iEiRY$(c{hrRlz%__OQF705<=Un3X7UY2K9isi{d5Y$iDb)$l^6 z3PjEffipvL_8}`G1IhCPV}Am)UzSnTbsFCB1R4!Or$Gpu3|WYT!!j96k3z}$GFPzQ zpIN$}`G&PXap2hc+;!84+%B~H4}96kUb(tl*!cytf0D?I?F z0kA%OrlI38?6+4`mVq;;SS>J$%pm8rnpIwpkOBkmMGG#SXS z#7g##S%FW>4-VvIFScfkn<4fG8qgnT24fV2aNuEsrfb>|(6b>VgpiHDmmAmQ6lU1$ zjAxXCq7YV7e`SzT)wDV{SG?C(0?MBBmw9vGuq7C7u7qdI7=PMfoOL!@TP)sx-@8~U znZ$yenbRF<2^oBd4Zti$WJ_K zJi5V*uS$2aEq|jbFqW;`OAZz0=5MCbJ>m|w4*3%!a`CV8b!y?FRVJ7J$f!7*DG~nu zbnm$vUv4^6%+3Np(GFt!;*ao;yo$L|(a%{#So8`$w7qd{l{Znru+DZ@!cRdthK9~Bo9mW8IaX0N8=lQ#kwR0GS)sw(^9 z_58v1mC_Myf6R& N002ovPDHLkV1iZYP)7g& diff --git a/data/iconsets/transports/icq/32x32/dnd.png b/data/iconsets/transports/icq/32x32/dnd.png index 5fc7acbbbfb2d791b81407c44c15ce4145b1e5f0..ede09e4b261347158624124b592ccfb0e5293213 100644 GIT binary patch delta 2307 zcmV+e3H3lL000QdNkl3&275?s9X5O34p7G!X zuVaJ37zmgUmJnnJBmo5xAkd_ANfU)ctr{gt6;-M#(I1tHTG9MTRT{FjNg6dIDS-w` zTp%<+6AA%SgN=8aaqO|j>@4R~l_)!DP=c^l+?R-phnM{EP9o-#?^PR_EJn)^=Prohz z;dYC=_Ca>4j(@$I8^7zf%}B}aB1zu1=7~~Okq__M2U(T!HrU-F>(kDmE!~95K&i{; zEZMbb9~@s7fONaX2;eAo726Yh5K;3>fC#3P!OHpvs!v|}@cRK*iJY{;AR-Weu-=WT zqB*vK;ods{^X#U5a)Y8u&l5zaWoUaoc)~pUA2IOmQ-6pK$F4^dDgcN;AdDH;QC3{8 zsIv2UyKIL=ItT<10gQpeWK3kV^$o|*XO-6fZPUufzPWkTw>KAh10QXDMOibw#uN=~ z-7l?{?atrM@RYiBQx_u1pXHe}0jh32e~~8t|3dH#W>}bO)_3z{vvTUPK5Rz38UnZ1wWBV&7mF zkADvlDwR8tqA*;l8_ZMy5DIN`(A<8GuUoQN>C#Sv6Q9UIMDR$32qy+KvaH^lh)`_s zdi>6WIXr=wh=A-BOs=C{`vkMsh(n@Do@0kQ52Y~tG^h<@`6o}%L+m1ESpTNM5ccTEzz?$JkLa)Tz`T> zdo7^baN*jSvEIQeU3!Lg9(qb|oj!)rI1CEC7F&PxpKt%d=PKDbw`!5A+*hk8svVq} z;AFw#8Q7CaEKYSpUg!rUS|*ZEq6PM{I@Dfwp=PWa9jRgC($HV@cqTGxS^NW7bdt-0 zKE3!?42)ajZb&6fhK#MDfp3r56= zBP0Ld1GRGnS+)bjpqm*a(ot<7)Snz2?YgdIteuB;=`A+^*!YsO*y$8bEuFWfw7e+b z5Nrg4C!zCnwnt1vb^8F8v)K^6iJJm2BTgL297l7N4V+uxFd;JqcEJO$Tz?7&72?=u zAB3Xmu{#ewp6>su1ppi#yz$`5M`tCaAZs^12K3wvV_eOI5wD2_7bD0kxgV6gI+aSL z99nM^TIXk=TSo4iFu8%W6+^`6hn=~wX32&bhtK};MF88T08k~@LYpeG-c;8l^&|U? zAHPnRKAcW=VSR7}a#{UU5r6g#;xZfK<=*=R?VZD@elG!Mn+8GWNLAXx2u zF{kWZ4x}*!fMMx|#B4W=9)Tb-2`pTQp-_m@4}ObXI{hx@^prxWZU6wJ&mTdXeF#TH zFWr0ZTU2bH$%^JKhi$PR41g96qu|4fsQJ?Xy5EjL6vc^6Z~}mCXn*g;#!^32?H(~@ zj!pD^rmYSGy`zYyVsv-IT6QIQ49yKHE`&X(47E^P>1I6(8Dffz`*-w-6~znTuU`NP zhe5$0h%wkz6%{Mj!gciuY&*~3=uhp;HGs;9uC-@BoJpXQbeDfKbaII zL0R6gN@`8~6&5Uj2!A1q!&W;Fo$NXQpzNb0yjDK^^$WlU20&K!J`jO)9f-x?n_Y{< z$RO_heSiBq)29FcHovNtiwwUM1^F%xu5oT&@H+h)?pv|NcQttw7FhrYis(V;8n+hJ ztPnfsD2RZ@rz2SGT?0D+N~I=>Pj=>TAOqlfQ&Ve$Vbo1w0Dl0+N8^#4K(@W^IJBx^ zo%dS$1S~Qqlk$p8rL+Z2SlT7dj~5a)ntPIb<~d_IJ) zUQKe&U(VGLZw27wNzkkZg|_hM$i{}U2UNdW0lzp4O@HV99FE0f4}-B5FzhTV3^=03 zmx#`mF!TLUC@}^{MFo(_0J@$ntSAtQiZIsGV@12W`-$@>e~0Y3@K%3Jgq*M2BR6;o z#b3*!t<<#iRCLIAzUjx-rvTWN{mQ|0%O1Mh;kJpKOsK;)lz!s?_nJ;Btez{X`T2ll zL61feZhUV~B}1VBk@LnyKrmNmI)GeZaomMT@4~d0ShfUtOP*Brx!j&=MgmKu#(Ltd zeD9C;>J>92>2YRR0Rk*0ifu{GUwfVN*Ixxv$o_h|9RqBV3peq}YZy;PlM)jEYy2~x dw)Vee{|3RvbVeKnZJYoA002ovPDHLkV1mU|PG-aGq@Ju@E1 z&UlOMxOUu34}B&F*u3sOl-%F$M%e8Jj-29AB;^VBq2QWm(I)ooPT@1?|lF7oO2I+-$UHV zpfxQ7ZGufwA}rXkw}m*s%4f;<=7|FZzHsG8dUzz2PX6(o=lSb*A)tQSfDJG3P{5PF zck!IYEfwLS^;fU;|Fmq8_14A149{H4-!?Db*gUn$^CC8XLDKf{z4w=R+}f^rk74sV18Y6rtcVPMKznot)m2_^ zFi`y1h8Em+N63?VG!h8K9TwzTHGhgNR+@sCz-*;HIqvS;1%thf;)$Arx-EOpv!f1eaA z^67@5492f@Wps0Ymc%Zqde!j0a@j(taz|d$raivSFTy(E`^7C#h6!0r$#mg8q z`hW1a++g_tnB;BX_^C5i^WxRcuAu{f%$djMC}AMpn>Gbq*XNZn^Dws{Ki`wc_TK0b z08A^(rJvbIp2HiMTC9JIePl& zRb_}>*Y~LaHB0e?0-;R-ztf)5qcI4JWk#iP`+qjl#%DxH2{_e;47jPC+*-;3Jedl#;s9|&gb{Uawy z>V4lR2SCLa8cSyXgp#I72-yjM6jSK_w4W27@29P*mpo@Vg`OE$hKHl4KO1iEZhya& zG1$7lg|-{#8$XETkZ!EnedO)m7vvXjt*@!|h6@%r-7XbL7AXx3D}yqcq1rY|X;T5n zvtO@5o~5*D8hvMr8OSsc>5J+g_I#90qy`7|3~yP2LpFu%%~Z`f2bQ;>IZYmR*m+W@ zYK_a5ouYzCGX-19-uYA(Sh17sm8Q!dnzP5+5y%N_& z3!z(NN>nbdHMz1Wj+&Pc9)Cx00SxArAggC}O>x~6SXJ!k@mhNN;y)4T z0pZ4Z2qcl?d$?kCa!Q8es*U?(ox4;_nl=mj{15_2N23G|{*Urq5qe)vqH5Yi9VZCr zM&^y-VfibkEvTmTF?Nd3DDusrqr)OLIwJ2`FkiGs|ARR#%heI^oqstYv+5ZUFVCVo zVcp|dwX|dwp&7G~(I~RJ8z}@1my5E+_ux5y4%;uzF#2e69qZ^G>+16*lsZJVp>({dC5_-boB z3_1XtxAD%Zg^L26L%S!y0fO#Yjt!mFRaH)0=iZAFdz~N8Gk?#Z*4N+EOUCKbi0#|K zFe=A$x7^eZK7}ioU-U!GmJ(Sr_t0@^<&0($ae2Lfx*U`Jb|EFwFhB@>Jax-|!kC*- zMP5j`@p1~dYq)T^bJR5X$TGQaJU?0?$n^K4JoOYZkwD(81TGi4-HuSzHZ1G*3M{hG z9qGF?;&;}fDt~qW99lkwu0}rn{CJm?v}UqdQ&k)QTy8eFcJVCu{Yc9K!^mxxg$M?T zoPEHS>gHaOBeZ)&rvz*|Yaqn@1~?29I2sV%y~IR&;>m6p2` znI00A5ZaT%o=|X?S3o8M+3Xmw(}_}4#BgV)8SChXNPo-v*~^UG+28syTGPT@r^;V6 zn_6lZX41&=#O@cy9v+*2N9)FA&CB!hRMnCOwy1~TqkFA@<&~4F>r|KD52i^r7Gtoz zJ(=k5?^P{p`E2MOpZ|`YX19u!&yw%<@}|$_t3#+FksiLF#Mt(mm#7w+_Djn&rviqm qs%@ray&>YXtXJ!~`L+E0jsF80$e*Vx)=xM900003lL000P9NklYfC@r{2RHaeW z&=yl@OK=iW#dhO3zQt>MckSKvUeA4o2RqxfQ=9UJ#7Ljc(SLk1-|si`-3Iu7ALNTH zip65J9+^JtI-H1t_~vV`y_Vma4@t84XMezd&@_#rrCUFL{q;Zo`oAF{{HF!y&J7PM z0p&_(XXlxH_4PyPOzL|_k91y~nwr|^?LYSF;{yYyqtU3^dZ4vN5QL|q(PriL?TNp9 zQ38A3zzZ+DAb%Q;KKIPv)6wik7J?wa>-A!6?5|UPpW5p%bMfTKFE=KWNpQ|lR~Ny} zn>Uk*m1NtcOP9)Dgn(x+Wj32tB8_!k!!)4lIskw%j_$7R)=zHVdTC#ML^KQ&oO5u_ zQ7jfwUtce6WOBy zi28l?K1q~b_D~6~>wqx^#uzv_01!%DKJx9eKaT8ceD}nOfsujZ1JBlK+U4Pq;Zr*? zwz*(!25nQR6CpsFfXR}LPDG+TUMeS|$jg5CoxlIex!q=H4u7HI1o$mF5e1R1`3|_B~*tRK%9uF8}03k3;lM7S`9X;9+N+c2$ zVw^FQN<{>MY7mU}J`@8D4Uw<6A37AsZ){#A0C3L17(=0uM>@Su`}+EXR4U1G`5ZJ& zgMVcj5JhhVBoqi@Zf?$f≀18FBpVl@!=q(q(2l2sfKA(z^lb| zT_h6;wCq1XZQEum%PVN`GdvSnC(YT95JVo5ECHMo5KatT2WJd?i-aW0sM8{tUz|%6 z3gx$}32epyLY}EwLIVh#jYBdl_Fn;~onr@osu3WidRud2aU}9qGUURhZYmrE#QLEJi+p*y| z&Q@vxs3I|7Ud8bzx{1H92UJ`GRV>Jdd(lu6B3QhJJ4PdXiXU~62vo(7g@wiJ?0@XN zPfgbuy70z@TRYS6K^Ab2Ab<77zi$4-uc#v}EiGy|9QMhw7o59bE`!Tl_}m=&ybh%O z8hCNCVuTkbA-8m*dwv2pI7K{Lv=-*)ZOb$>E^{w(urW|#?F0vQ)PcdlK~H^S{aFvC zKO&SImL=Ke@dy+E;RNWVcggq9bbk@4t_Zlr?Un=;c3Q=ScURdxrJs5P4*(9^c3>E~ zzOk`U&gF7(i#gAqfBk%geWeb>VzCBM7Cty~KNK;{CH{pMC6&H{M#>MnIB<-+!GLc)Z=V zEt04Tqz8qBbB+=V;N(=;-W- zd~)m7F9DnZs(OJaN?(#Bk>vCFhcjR+rSe?ChqD%}r8J1z4G1bAs32-L%*A!wT%j!3 zd=!+B%{^5%80Ro83y$Lw*?;F9c*q5g>skb)Qaq|7pAZ5Nf?PJs?{|HdT>sl2(9=la zJ8}#FP@aAd6RQkwWglfm;*N8)qeDusuVdR`@L6%A^fO0R2)M3up;#*ZK=gP7)7)&a zgi?gVVPw)7luISv+1W`Jm*SXnpTIv>T^vj-^Kw}yvrZQ_xC$lU^M5D|r5o3;>xbIg zeJ%SBNQvYsbX~6ykt7Mat`{n?`{1Yj(BW&j{KoM9mIL9MP?)G{0A5+HXp{=Kv$%!E+&(yred*Zq*BT9MmGBqcgagr zQ&YT>IlGOK=VO<8`yTs7I=xP8+pYj+|{`Npj)d?7i6e zKb?OE0EUK!6tCB7j*gDH)fl@z$zrjXPf^qp0EkruzS-GiSeBUw;N2GOTY*+8m!N4{ zz~iB30lWhMyS)*2Eh~ax)hUX9TW8~(BcKMbwzgJcjDN`Z_Lf^&$2K24oFTH;4ev>y zqoZ#*oz0X~HGcp?2sr2P2m-?4FqW3$_X)?lw(YotY^H9t1Oq{2vl$bNy}g_L%0YKi zjE#-)p01ARLMeZ`^+21V27?F&0+^hfOqWglTZGX`5RBA>Yy72hsq&D~YBl)%Dx061 zn@%RzUtCyNV7p-ey9XhCAVWi^`xU?X3o6iNm%HUsPJe&-^5x5a2S8%aoq4OHtLq8L zBMPqTKoljUQpx=4YGQhRcHzwU_;?xs`yAPozyn}mOK8=X?wAvz(P-$z$;W=9c$GE~ z5JT4&vYG79-g|HC0|0Inpj-8Iw*L1_LsBL5bEH~_En~dOFyBF-TKB&-{tbeV&&kNq S#-soM00{s|MNUMnLSTZ7StV)! delta 2298 zcmV+1cHh1@D99 zVHTFfczGENUSNYA$HXSClaRzt?b|vA4HZyH@~rMcv}>d|ok|f6>z1B&wQ928IGJw6wP$4)pi;3m`A|JaWv%p%X>6 z7-#0@pYOYTxqleI5AGEJ{koTpot<_`6n}Q&c#m1ra|W|n62EiexP=PhDWA_*B+JSX z$!H+sZ+RZ7-YR}o!}f&gGl$H4=g_D??j z=TA$VMOreEFj9d69JsM`1G}m{h^$0A09>N))A+>~@<)*L50OTMuix-nX}@@r1i_r!q4; z140POcYl^+IkK9HCsIO9waa*I;TizI?RH~)VkR*&JA1aZwdLq8cZE4PHVOiu&DV~% zPMuD!M_B3DSZ`u8rm%U_>i2)oUFrT^&m%{zcH0hvr>au)`C1)?1r~2$IB4*As;I@H zkYqB6bSjOy+FEgXc9v9Cy69SL6@(CYsyw)OX@5ZXRC}uT)OqFL=m2H2m4vI@ zr7e6uJH51cJ-Ah70BC7xu_{WzZ|~plH~01TVQOXylarGe8XAPzWH3GR^ht3zI0~a= zhNsE{5Dvv6lUOV!SS%J$N+C%S)SS)@l4y8f|9$e9g#>R$AR!Rq5}Zuyvb&>nPRauP)b1Prg0t!V+>cW zjG?}^2D;98C^QF;XBWC3JOo9NVX+iohkw-u0Gv{gL@EhNHdapwY*s63y|uVFFc?Qx z`qRw-1OO;=RhHSTJC53IRxz1OZW-p&M?p5Su@+lHg=;6NZ>U3EtruN~x=2G^18Qoj zv9P!ZS9v)Jg~q`-&!<-uQCC|BtIdwTzWujUI+J~FByb^c8vxVpnyb-p_}TjU#(zS$ z%O$9)3RTU4kS}Yv3CdGdh2xJM$IjB7;GBa}iehI8cGuM4^QA@1hr@6<9PsY;qNu1C z0|Ud!^Z&STL(QpAjtusFcx$U~wP9mtr`@2lm+f|YPg7$9DJgLpWwROCTo#(DLZB2z zqX`clJ_PTsT4XZmZH`PPGbX1eaDV2^$C#R))k2{utS910o%3F%^RoiTkhi+>!W(bA zp?@U+0Py?$g=wAtSP+Eg2t~Op%c5+S2?00+2id20#$S*H1kDXiTl)DxHST zbfQ=a{F~*c05CN*l~r{uXAnei&Np;3Foz%rNM$rczKEjK>BM_y-hV}CYJ4lr6QQek z|AW&w{oY6Xy${anjg8GHb~=HZd~Nz;x(-1QL~P*ODuJf5x7QQN?<%r|rqaoLFB5{w zN;f7#v&iLg=sDJn;o$&ureSPs5)~CLo=UBg8%s+_B~z&Ny6MVFTz%yaue0vMhseHt z`^52y39Q9pTMJVZ1%L7N`08yWRQ2pn&U|>b=kZ4$E))%vP!Q;x^K*YcubRw8vAgRa z9U2bgmqLK0

-O2WDnxx16s=qu5ziYEV^g`lFA}U6d6|XV<~~l6QA4jjhL^$O@*W zW>g0DmoJHXlQj8!b)snaB^3l8B_ye;+N8Cx@W{8He9Sx?41a)g4nhbNS;oxVb$0On z{WLUrHBS@H!5IhR40{@y@aEg6BI!)}K??c;C#1(_wW*m*T1;m$(=3xZ5DW&B+cE$E zBZGtE0G`-HMik-!n z3{9sw=Oawlq3bN)^S3CW1mLjV$^Tse=o!;kIDCycoqtYHLcw$flhK6oau@mrF2^}z z=hEpc6R2YECcHEU!u ze@zLg;B$;8ImnL!eHUH_fYy%A(MOJT*A)~fg03@2k`ZH9##6zO(HmJ6-x|AoVd`%F z@9AiECu#QkU6kXDtSBA=2&q(RT2u93ISQ56zRB_IKbDgxPYOPtPyU|;{BO#?045mz UfF=v~UjP6A07*qoM6N<$f)}k#?f?J) diff --git a/data/iconsets/transports/icq/32x32/offline.png b/data/iconsets/transports/icq/32x32/offline.png index ab8438a496812813a864ec5b05d1bafd9eb512e4..25b8d50c8f0f36f49c4e4d032d1cd7f2016dd1f8 100644 GIT binary patch delta 2160 zcmV-$2#@!y5&aO5B!32COGiWi{{a60|De66lK=n!2XskIMF-ad4haek?;j*=000Od zNkln^rBdu?eq2FxaKw2Y(np)?OR$?%ln6@673k z^)7xv@*y88b)?Z*&CEULx92qj{J#(OZ4Omc`7!{{CSt^bit)Mcb>AQW?A^OJP4_x$ zTrT&sX3PvlqvpY1ZLc`;odQ%<9VmC}o{twVT$Cy$v5Q|d^h6`UlASwuw|sQu(C=5T zTJu_Vb~d*x8-G`?Ukx@lH642W7u$D#Cjdu}9@W6?d*z$A3`WGj@soeLrE%wc zVxnzJ`IcPUwgC_nMaA)x$Gh*hbxiU3e8#r{P@lHh-{0@fFUWOr&LM;V5y9njW6^@* z@7G_vuq`VyOOuj7AbZ>#p?7kuyB+SO~fmX)pF zlsPHu%YErL`-l+ud_L9V^?bH= z?YeYL(;%gQ5CTqT3KlP3;@w#GlBc1efm&Kyz&QsIAu}tBS+=c!#Q}%_zu!-sD{0G@ zuSm0OJ8qid`$9@&XJw|UT$?{82V7o9*{qqfy_%{eH{wbOLJD}jUcTw2mz9>5R(b1o zBYzaGf&uWjTriAyvUARH{rbN|NlB@ThC($wHyC3W91KQnVYiI|P`S1+Gi#C_cV)t* zLz0kGQd(NdL!pqoeB~09a3>aMcUk1CPr-s62!}$DB-x~_iA)Z`(~u6vIfNkGZ2Y>* z<4ip>96$vC%NCbZN46$k`f z^!&Oi#j>oS(*%G)Q&j|mVN_TD#UF}9e*DIcH_S0rKt$}wCx`#Jbm_9CQ>RRINGTyn zjsrnRsox8?*MyQk5fq7glewOO)!vI}*ojba1vq2iii&V3h%48w_IEw(XbG9-tAD#H zb~TMILlpoRW90Ms*3@07-FxlYwXHK|%+Palb6sg^6QFP0d7 zoG+n9XazGN8tTz~=Nj4v>{w@arzI>aU>MO865=1sR$`-#Cq0lDKA%tZc$`~OT+Z#B zvqDYNTn^2_rId__@J#R`E19P;HGd-nh|ow)iVhL*;!gKOX+F1!YYqnh2GfkfFpNlh zd%Mx!A9!Gdg0EIqzTG$mVE_L8IVmpf{Md|#CKoXJ?@dVVS6Y$tKz|$X% z3n2SbF@PdO3pWBpkVIer7~|laA!0;ObM9PEAUv@6tsQUO2Zps`m+t&@Lx0)&X|rd~ z@i?7MSXK;{ZNs)L*tQMJwqRx#!)j{;a~6zsrLzEb+bx(m#ULpm;|&0k2twG1Sr$}H z#mbc{vr-+N4-?-d0aQhqJ0U%TCE98t?nz06hhd;8;DO!I52nuo6dh1>Fnt!R`+evX zlch2t9{?LFLmD9^NqBUfseh`vbPRwHc1%hc?_7xvHcYm(w&GS}Bjs%V7)GB3v$hr@ z;Dzi@g;`e%BVgmQ`$bt(QxlU?K;axT6uuFXBpBy>41jIh$2&S62mm8*H$}nCn>W$X z(Lt+LtzwdKgnsZg{yn_{&0QJPFK41}*?SmVwj0mC@Pe9=o^G8!b${y7gZ2k8P1V2{ z8{thMB`nJfjsYMM{7rrRh1R~_Udg!zfFTeVpfAs!3HA8>R!K<-vxS}P``w0y*z}hX zDck_z$pH;rM)T&+_vGZ}QNzWCKb}5w%J1*;3r%%E(;RR(QgH9yJ<}56voTcw0Pnp2 zPJynu4k(IJEJ>QSuz#vb@CUcDu&JnlX;M|G5*qa_#!&%8JUr0)Wrwa~BmAnSTkx$>e{M@v5pSm)ql6 zqI-2_S+U1P09a-WF)KO<3Fml;MkJ7vJK5{L-Mj@r0$|)X;uD`_1{s;DdMZm)M)Kct zj=T5ng>6gJS+*5-{WxW-C>$V}^)wGZ6~GSK9lgDMVUjX=t%3p4mS}EnYL`-;i$tRW zK=RR%IL8$gU4NaOX3VnAJW2mI0{DDBX~vA7*VI(^S!N8HBLyUZn!nZbMZ%%iEK^qB zZ)*=I%HzulL{L=~!GS^fb>q!Dp~1-Sz6sz-NyroP%{PC&Fe^Lz169)|+g8lz>GJP* z_uYN90N4kI4t}wsbj1%dCuS)GLc}m|>vrQ{duw}hLuvixSB@P!)(1e2GoJ{MFsuws zK1}jaYs#ECbJBkD)2&B6Ue6RFuxKRG+Sbx`;PBxi=K+Xe2E{OG5B;X6d4LU@e4IIa m4@1gmm|_|QFnsTSYy20@QlBSb#b;dr0000^@R9J<@S8Hrk#})qO zKK9P;wOKD~Y>cJUvgww@;I-E4#Rd}`V-ON46crOFloBPC;(v`Gs6rJ@)gMSvD&a{XWqr-QuJ7KN+aHM?8ym2aRz1@ExijB6 z-+brHnYqNWEc`!B_-{GdxpSxZU2tR}3Y3ASmj?fOA+aj}$0B(g7DxNxkmudfQgOA96NSOvUZZ;sRHy#4y?uV--1A&Me~hKAUC z@4YviNF==3+1dX(a^%RONF)LPSh8dZ-g@h;$#6LQ)PI#LSHcS+@Youllro3IVUuMU znx^6Y{rkwz&lk6B*^)~seMyoeI&%ZMuA{WHG%ZO|004YG-}=hR%Erpd%2Pg{uXe!% z2q9$U%9R=2-QD+Nv6yZc1_a^jrJAOptgOtYD9Qmzk|aXNG)|Hv#9}c^6h(dY>eUSe z1qGi4gMY!D!C>&G+1c42`~Ci^#}X(nFW*>IRdu_jre-ofKYx7f+O=J}uD}1m2OlJJ za&l%8gvaB_RuskJoX=DY!^6W61mV?ZpMCZh!C=rX%Q7gXIC$`&!)~{KwsPf4+sv5L zMOao=R*{>VdnOnRIw+-6yREo<`EqGXOG~<=qkkjq_xoi{)1YY@s;jH*r%#`@W-4Hs zCc@#cTwGkdY4hgI_Ivm40RTAXpp?Sz_oKD7wE{rfECsw?uj+I<|5{&P??@(-2#3Q6 zhr=)o1A#z*9y)X=V_;xFx^?Ro+-^5G=g7;;Bbug>DFUJ>Vq|2*QdL#nyLYc69G+c+ z$$w-LD^{$q3xcp=P6})`TX{)I2`tNkX_~Wu@pv4jX_ET-dUEyZRqKl{zQD3&%OD5> zGBYzRP167Xix)4(*|TS@y1F`He0&@apDtBZ5ekKL&iOy*5Fmt9KK=C5G?`3dKI5Dt z5{aO$u8u?^5v#em+0rx(85tQ?Yip|&iGM^eHa2EimSuT79-`~|Ec~KHivR!}9UX*H zdS>Pvu`COLKwwXKdHK7~KmWXae0+Rf5>rMg#fKjrhtp|Cb@dVe7CJk}F*Fp$i!TNt z2m+=GQxF8?<>et13gMl1-bomSv7^7g|NI;R0I+7wn$GRpw+Bi}N~BaOg;XjvM}I~D zIDh^Oo_j76bvr^3#VY^+#=K}eS%9vtG&XG5g3QcJWMpI@8ja%g>C=hZw{J%$CnsOH zbm>yp!~UjE0b^`yb93|23l}cDTvJnH6&4m!m&*mtIS3(86a~Y>!;mBsbvr^3gceNk z6NDDLu(KMSoi5zGdD9vh88NP3zke6BGfMIw+Rn(6pW6JA{-85WMl+)@7@Ka6m4x0Fy@^ToG~vtI_|^mb|aNa!7vPP z&XG>1kw_#kIywqL5U_9GK7YF?ihr6W{jG%LsiLAHalSJ=V+}%~uh7&~2+pfPhzo?c zzyAUyJ376bv;u3f{WOPBE4Ye#VI zToc;bvrtvF9ReX}?}&o)BvjSS-+c2;>%f5n5~UOm9z2-W7XW3B0)M7y{&`?vKvz|D z){b2+7uwp|Ff=rT!-o%pF^1aOA0t1%813!Mx_K)Ht5&VUrcK+hd-rb9kZkxpRA*PN%$V*)owahFC0SH8eD&6-AMP z!JsfYIy#*m!!Y3Y`+qIB+dX}flF1}CZro^NjHQ~In*M&~%$e0&w{EqSmX?Z=B*A90 zp|P6qjYR+42*sK)T5N*)TvW! z^XAQ>B+Y%*WoBmL?YG~)r)gS^qA0%suq7)ii;jsYH)DSn56&!^!E1N z0C4!5fwgPbe!hSIekC4{PX`CS?(N}l7?jdEmlpsq#;|VPx{Oag`NZGV)%9}#C@U*l zJ~=r#Iyg8ut06t|N#^(avsG2CDl9A{@%XnGQ52!;I#Q`r`cc?aDuw0Cmpdd$s+juL z-`{`h;oy%Ykbh36sj8}GIz2m1PEHOkUc9I?#;!d)H)Y?nZX(O_GmrBBL;`{!#G}zD zo1C1)RGt+@!NkM_y1Tm*ob!tl6BA69q`4KaBfMr?Vd(_p{ iiQg5wU>ODeSN0#h_YsyS<&!A@00003&275?s9X5O25GvgUA*o=)mHWTNXM7od^V8Kw1EV^HIicVOhgFpZgz!+?pjPZ<~eBbr!xxq#Ms$BEz z_jj)Q;m#a?=$}u%Ep42RaYqe2`IfL=bh`hT?G1W#Q|BV_{!T+PPCi(+`lZ6+*}fk2 z8UP?mEPqCSYiuMMi?Wgj@_d6@GYEt{XBlo>>lke7`}W;sC2M~kDk*ZeCoh13p;USl z)pZ|sl{EJk9XtqoMhbTQN!nC6tL)?T%eQ7k(E|oa`^({4&7nnnto)8-{ z+7LF{Q50O~yV!6>cd$@e0T0VXPxy>goVWO=p?{J>cT1vfLOGyIug8+m>Ws6A;~N0= z^c^YKa1er5@&D!FiY*y8wUg*kuc1r5jGM+ucnS<<_xkvDgv%|l zs5Z5Dtoi>0lYTQOv#w-ux*s>Wl5GZhNFQ2!;(_?)N zn|~}&>PLjI(TR3C&DO8l#NX;`v!nflLTNb?6ow*uz)T4MA;&Qv4bAoT=8BzCn|dBL z+36TW1h0^TaI9A)%j&#K5%T4JZ)H)X~<1B0Y$0 zmWO3uZGo@BLdgl6+8i0ab*+@+9AT0UHnb;R2p1hBJ$;O2)cqJ zbsr4Hld)%xy$Ee)7ZBLq54?3-mhE}SljU^u>rIH6Lm=2`@D!=_Uk_tdW+lY@9Dh)9 zTumkyLhI^B@P7f?>y@+sW}9F&@Ruy;#NOf%nJmO2CY`aequZjfNrz zY}P?uofuuEth|vWnQ?RjOTXyxuzrF!r zH!$TckOgI_L+06#(Kd0pOn;Q!1ULbRnE{-Scf#ly0#g7qZjK zC(My_-e)_?(AznTXkv`kmTzL;#!sT5T*l?F7li|j6qVXp$5Mt-mxvs}$s4^v{czoT ziM5L!b1lwVD7Ga(N8B7rZ%k$Z#MH>x3<5TizdCc}Naf~=r$SCQabz& zlU9|l6PjWtV8H^2Fn?g#aFi}YE9*u|vr*$Va`HX$JiT16yHfo(kK4a>McE^Pl8g*K zY7Ii>eCWL0q8q09!Hg~dfSvEi1w6xRJSRS6!&YtEyzF;pZF_X}uE6#9aad#lAV|Cy z12=7JS;=a?g^tfSG3UEBw-A!qrOY%Xa&duaSC#U#b{`~&}rLtjiIX+&qPdKz2orNju5)T zZMv!3)%S{@GX7o*wY8wRJGdL+;i2v2`CH{Ic@DDpxqqms|3`Q%I`$M8YXrl-{G5<$ z)VMwV5-|kj#qe0g_JwQ5noSQOo z)BfZ0D^1|5ctNUCJlPPtYiEC>*8#Am09sQVA z_igiLJTuJL;|1e2Ucm+&OagXl1BS%LU>t%2O)FZdRa2p=RexHwO_iz;15K1xs;Y`s z%BMQTMVK(N7iJoFXZ3Vw1=Ml zCIIA7E!ec1tba0_%}oV4DMmsCboO@j1l(GA^Pg#;b}u=wxopc%tZ|w^R5LpJzVvn9 z==e+HZu<7O0zQfSm@~EMZ&Z35fQQb&;kO|h^$R#jyNzjo7k?(amq2wxYDX z)pO69!V&C3Zh9`ST2Kf8oBu!-*X|_;YTqIMsM<}Ie`5ejDfI>A{6$jEQ`>VedKq^NvUmh8|r@c>bh;aY?io|%6gJNJI9P6 ztlCWqVt+*Tp9Z}pnFX(NhbG%2Vf^*e3upIMlvG-W9E|_~kJN{pg$3#UaEPkf*OiVD z5-{cN)Hs44J-=l2>-pIUCcCQ<93x^|MQy^tlSfVf$eb6Ts-9#g#U`GrU0a=~kV#Og z0?PU=!{ZYbm#&}n*~c@(@$pN=X@57S{9Ra@TYqP1yK+9vkgwOkGZx(SIB9O$;veVd z*i1JZ#{dATCSf|%j)G@anyczb_Q^eTXbynYU^!j0=B30D&mqWaAR5$~lx6&G>W-LG z7u(cg{coMWI1ha`Su7E?(^MzjpV)XF&G^!I~jAg~o8U`E(XO!9}-9&Q2ax>e5 z4SxWl01N#69F2qz%GMrK|9k@9W zYPr=)B{|?yWPGGioRKNQvy;!L0Dl0it0$Z;f=W@3-?J>gOs_NPL|(^4ln}yl2r1qO z`T6=Ekj(E$0Q|E;8DT#s;&^YHEN3Ru7=tK?f*zrW1h3y685$q=-no0LTMA>>iG6fn z4#4(b5xo>g+E*&I>SlUVp^diIeay zB9OHZ6fFdf5g~F`#2Ruzl{hr~w{bk=@E06?kNRe`ARLP$wPjlh8F7>w^?v~Bo7;b$ z1LC{=NGsVms|5g%f$82>I5QlOB1%-NY7!*H15elvgOGsg(v8U1I130N z`8KPboAO_sclZE+2)Vd?XMYgm7p4Fd0x;hD3Ndzm5`7-KmYwz*M9w;|e=sryLyW@e zctiAei&lUTq7lN*>&P-XAW(?z;W4_oww82UY`{c!1`-O2KnTTTcN1=tadg{Kl*#5} z+SZC1@ou;S&S3xCMKAy;73Kh_igsZ1ru&@*<_v=;Y`+J^BGFic5q~>{%jc#qudO7* zu0}}t9!!Uq0R2}eXB;B#Oh051$TcJgrm^DSzfSzeRZ+agn742_?+kXs8SDq88VF&) z!US2BH`@Lm~eJE{}-s*<9mvDwLaY=pX?=WRHD^{VgkK+g|P)YFC; z002<^7KtZ%>@;w~P8G5<5}_TUj(dIQrXAKH=SNVq5CFg+Bw%P@fn1!wf}fB+m{aB~ z>kb@lZMyEB_N^7ocoPh2Eyh@jFX&NJs-8Le7TqzY0`tk1{eR?OO?l;ZjUOcL&~Q|r zVkyJ%(^sUL@@n0<|Ii#ilP(25XRh~j=jpoUdfEyAwQmyBu|L5-dn3!YN_o#1n@<#%Qf`Nu)#|&Mnr3@X{+XD(k zyQ0qT#}F1gOMeK%;Nhp+qX67KN6^4zfoBZ>06lL5(Jbg2w%<|}G=(Hd(Q)QEe(^EO z&^z4kl_k9YL;!v%xZ(KOPaR2O4f5i5z@{t5u`?}BSwbCT9O)kH^CX#`i`o;yBHda6 zIhdsMj`ZGa+DBU+1@Jfzlcl_XUo&7|(x489BKSq~USiq_09)T>POW*i{DsVvg*uI@ zP$VAhU7hY5w+9*&6>l`{q24D3c$lpGDdAI6@ppkYzM^O$H`Uaku!7&7*h9M>H^vhI fd>iuAU&sFg2{NH|&0Z~J00000NkvXXu0mjfQYiy- diff --git a/data/iconsets/transports/icq/32x32/xa.png b/data/iconsets/transports/icq/32x32/xa.png index 535d58afab557919b9f83d3f5a18150cbf72f609..0be3ad5151f3c9428eda2eefdd206b0215799037 100644 GIT binary patch delta 2107 zcmV-B2*mfQ5y%jbB!32COGiWi{{a60|De66lK=n!2XskIMF-ad4haek?;j*=000N- zNkl>}38GN7Ql%TF=p4SFL>`eGw1Ka zdfl}RR$AquQjhd&j^>>6f8Tun((bP@J%ArAUX^VO!u9`nO-*ie7}WG0vU{8xdVMClcbu0$EdjpL;!!{~H0{T`_U>I(19)l;L*2P=UyZ40XO04@@cFte zkB7UXqrkub)>l`Tc|)OZ90iQegn$JYnq_&}{rjNVS;)yrXt5a9ZQk4%;QU+OKtQEr z5&%F%koWGPqNc`E25ba?H-U~*s(S2QMfufnpzA*-aDNcEpP8DPc748ucQieXn$@dy z)$4sp@pu5o0TF?S<~ID>P+X_wSqE4V56g` zZEg;vE?wFU;M^hw{sbsqzyGZ*+qPMJU;uJ#41Y2bfjT&d^&U@I*Z%#!p@9LqtEynt z)gar3U)PzFN(rXxg|Fuvv-v!6Ap&jf?SUeA(cGCC_$|w?aNfQw1X17%Yg${&#I0L^ zl#5~{<8c_n!+giKZ6Z1`A#Y_e;EjzyA_2|oMOFw95qMPJewXG(nw0C2rPGVSiy2M?IWvP* z73IumxkGwumWB53;AUqnl!jR(V*j9uP=6=K^?!n-1c(43psZbsY$$|F=g;5EWV6p5 z02V300Du7Yo~HeI{jObGYYf9f6BCfhBv2wFh(G|;j#(IA-w)AP3Ca|FF}(qHB#P|Y z=aBj%fms&B>ea{sxG^|5Gc`UQailzQ7#Lov?m{bm9q{@T<%eF&I$Yn>WQNMib$`?2 z0VgViz;VEoEWFRm!Sl=>Q0m%ZN4{p{&Ynf&eJ`fQXY*6zCVn z!xdEpF$O!ALoSud#N+Yw+~nlA<9|3u4g-V5V+(!Yb)ag>T6{TVO{fF?BI2#kx&^qAWUBG?~djvu(x=W9zaIxVD{_#e*eZP4ndx({;qAr>TuU z#nNy72HMtoh~^G30M6j=kbk{&8zUd-GMByTZ0PLt@S8W`OinKLGoR2*QTQ?fj^mt; zr&8Yz>bjs*s<2rI@ak$rW@eB~Bxqx2Cv&d!A!&OMi{!z>JrtOlV);7^Zc<=fKv%|s zq145*XEW>C+x1nOHhJuk5fmE}h(JCc?8Lu2o+wWCNqKQD7CRVhYkv!RD=Qf)Dv+=& z>KhtLx%oV6+ps~{{r!Mjh;NK}p?Ye-uEm+mvqGcFWMG-5C*${LZx0Ndj>cluW>b^b z*U-SZX+o{9$KAVkb2IVytEY&1fF)&k0;m&0yuyUoLQ>{P%D?M=|K7)U>rL7H@KmK@FX0tmb=ilXw9ngI~&9-fx&u0I|iN1Ic zaF-ESI^GfD{Vlt9?^7ZXCbQWE8AW3wF8B9mTe`ZuqOWgR&TzjUv0yL}xq9{aBftj$ za1<~sAXfw~j)(pcodk3(7<^olashndYW4eJXEJkC0=j5@c7GNj%PP}2KUDPh0+3z` zz9In^Sf%^@OePYG%86H0AUZLTa)>TC4=B}z>lc7aRI!r6D-sw1?#xA_DGG-{^LIWp z4XCZfo#EjzBKk0&&%2mkDmGOwm;xXlU=Jlw z1QzqgOP+kmJJAIMzRB28!!Xt|fMwI^n-QW{UIuzlNHn-2pj+~E=I6AM0<6UN1FUon l^UkQmF)blby7s>{{smZlS)-FIN1p%y002ovPDHLkV1gup_MZR% delta 2206 zcmV;P2x0fg5ULT7B!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$YCrLy>R9J<@mu*Z`XBNl* z=eaL4cV=LQ0Y)n-DwIV5wYUW|7^S+aiN^Y}qE^>6vF?|q`+s56Y|;<=p`Z8Delpu_ z)1pXB7Zxw-e8-#Pzt zp4>~!jQ{5nZ_3dTBIR}7qgScG*FGNp*~Q#bCB(708#k^A=(-wnxzN$lV)isP z9@@sd`&9v6D#1RYfbMi2SiEhUG1KQ$XZ!u?{L0E{P9ZKIBuZ0LQYtdsZZ%q43;XzS zyghfWp{J*B-$xX9BLEE8y4S1gp%4HO# zBaojT7eEOB93om)r6`9F3vu)y(aKi`Afh8go}J7gYhWN63j`o^9YlmgTN|e3=IW}Z zeJnIhrFeW4KnMtr2l1y**#@FjM0?#cW>hcOy0votmMxnc>FNJEL{$D#fc-?jIjrmd zKI->dYJVUw@Qo0c;<4CQ&DGTrM@0ol2oMppd-vckD9BI^gDD;#zpn-Y7zqZU0Uu3Y zvg8lNOP3m2T^+Ow7f`%mgG(`t>LWz@#F*;X#Q~x+&y*?07FAZd90LO&DG^CcE$i;+ zSorAd*?4DncRYLUTrJVs3cIxx*%cK=>zOl5s(%V10szRA6of+|Exn-Nw{xg&q@G)$_%J|efn=R37%(et2?CG^29Y*(s=>gD z7k?xm;N3t$0rYFvfM|4FQxXF5!2=j|b+mZJ3hHfd=gx2#&WZ}CgM-k#UN)1xp%)k9 z&iV74zk0PuT(|&|a=bY~1Z~C)40Uxy8EE|}fW;ZJW;tbVFKDy}$4v+UvTg7WKVaef z`7~mheB;_R#+asbCB z^*b};Akp?|Wo7>?$jmhCmX`6R8ndx7G5}e;5Vws+cnW+76c+=`2wlI9{&OA3P2T|Z zR4t@sfu#g%8jNMjF!=Z}uGZFuZ7F}ZgZbnO003}UhzofeH`U?ssI2SAWD_ME?tN}K~-ld9*?3M1`?); zSU3!IS_~!s*om3TExhQ@gNF@Hbo}k2og%ZP!{yRc!$90LVLo{h4|a4U%3c&iQWI!NH0e>l;zCJ}p zB9M^?bX`Y^*Q>o%TB=1;Q;V)1J$j;wXx>)lhm!y_qLcHtY{|+T98?mgPs3)0e69%{ zx{aP$-I!j!>NyEU`=Gz27QVZ~utx^L%#c!oqfyv{gNSu@f-*8tux_2va_G=L0Ly_1 zM==x4^n1NZ?B-3dZG)MgnSYd!Qew!Rf!?~?=(^Ykpb&s3X@z)nt_MSx90Kby#g}&p?tpjqZ*y|IaF5+xxqN!GEa8${Np_iJ%r1 z;+DgKf#G44Z`%e@e-4=q0^+m>5B9e3$Y*s(+uMWmvy8%wfa0AuPhR-)%UFMEYQk8* z9(rEh=m?Ki8Sr=@Eh{me_!!~mL@u9UbQW#e$l<7D+kVQ4#0}E*_ut#I#~H7w0Y{^wl4N9{`RP+TXW25v zSyM9}9LZg*U5m>{kM_ofhu>3xPeHWC;rBbEgM$i5*{m>^Z+~WvP3i#v*umTe;FF}G zN{G4zYu7pwSFXU0M8=;}XU|5YwiYVUs8q>b83RC56K0l{dhXQL{(39(?~}>pI)I+d z%##j~pZz2|M3kYWr + + + diff --git a/data/pixmaps/agents/icq.png b/data/pixmaps/agents/icq.png index 5dd943cf60c6c6968abcaa2fc5b9ab2fe9be9598..1023343a28070bf30d748f3a9a5d20bcc8842807 100644 GIT binary patch delta 2236 zcmV;t2t)U$5#SM!Jb%{%4haek?;j*=000PrNkl3&275?s9X5O25GvgUA z*o=)mHWTNXM7od^V8Kw1{9FLHxB(M@yqW@fVfYHIR?th3xnE(+8gb||~`MCv>EV^HI zicVOhgFpZgz!+?pjPZ<~eBbr!xxq#Ms$BEz_jj)Q;m#a?=$}u%Ep42RaYqe2`IfL= zbh`hT?G1W#Q|BV_{!T+PPCi(+`lZ6+*}fk28UP?mEJlB8Y$O_svXTe#e1lpu2!uRm z8E#zb7=LW*`}W;sC2M~kDk*ZeCoh13p;USl)pZ|sl{EJk9XtqoMhbTQN!nC6tL)?T z%eQ7k(E|oa`^({4&7nnnto)8-{+7LF{Q50O~yV!6>cd$@e0T0VXPxy>g zoVWO=p^`#(OQLQvDgv%|ls5Z5Dt zoi>0lYTQOv#w-ux*s>Wl5GZhNFQ2!;(_?)Nn=DZ3M})A^iFP{8*00*c-|B0#qy2)H)X~<1B0Y$0mWO3uZGo@BLdgl z6+8i0ab*+@+9AT0UHnb;R2p1hBJ$;O2)cqJbsr4Hld)%xy$Ee)7ZBLq54?3-mhE}S zljU^u>rIH6Lm=2`@D!=_Uk_tdW+lY@98hvxO(qvY>*`12=tWd7G~pBTkmD=`bbkjf z-@Gu=+4pUmuF<}u2lS@tZ7598pn-SCwjBTJ!`}v!ynPFbmMH~+Qc04Xu$c*)ELgS% zXFQGv6YUU}W`Saj=^zwqgfqVkrQHfjMvBpr7&NZ-f2v2d$gpMEhhb5zEpqyF@JR(G zY{Nka8FQqk1)hJ2WBfdq(<3`YnSX-~Mj$L53bW_t?_rKW0@P7f?>y@ z+sW}9F&@Ruy;#NOf%nJmO2CY`aZEdnh9U=S+ky=fB9q|cyzq-bxF`oFzkfJ9Fq#}$ ze&o4i*JKI+xV(6O$C_v6#)Tf%Y@7o0R1agKnh8UG6HBf{;LCdq6u*9_lu`lI&Kfi= z)}UKP>P?uofuuEth|vWnQ?RjOTXyxuzrF!rH!$TckOgI_L+06#(Kd0pOqAUOI01;6 z0i2I_!srx z3<5TizdCc}Naf~=r$SCQabz&lU9|l6PjWtV8H^2FksnmlrBUo>qbhm zQR6mp@;&lAyMcE^Pl8g*KY7Ii>eCWL0q8q09!Hg~dfSvEi1w6xR zJSRS6!&YtEyzF;pZF_X}uE6#9aad#lAV|Cy12=7JS;=a?g^tfSG3UEB&du zaSC#U#b{`~&}rLtjiIX+&qPdKz2orNju5)TZMv!3)%S{@GX7o*wY8wRJGdL+;i2v2 z`CH{Ic@DDpxu~iCM|dnc_7oUv1jD}koRDkOxIO+7F@FT*#qe0g_JwQ5noSQOo)BfZ0E8wemL8?+b-eN`^izP-n!tM5J zXMdyD0X49u09sQsjn! z>@l|S76XPD<0UqW0|X2h3?w)y6shVHty)z|%R?(gil!i>rmfOGbbD(mr4_r|b3f_ojLtdV_y3*met+kjJHY?Dk=L2D-VHlX zu$58}4LE$#jUWK5{WUD+G;$_gbmfQQ{!lC)`Qx#V@we{-z`kli<6eAVGg(e9FRyIM zb2&E;3=jP{XPI{7$tCy~Z^YlXt=iI1RA4eKDK4`KobBzjMIK}O1zdPt0A{wqirwJ# zI{l~b*Kf)Y(tkX>H9f-b*zjJq$;chA*bUw+*fyHXGV%B?qGR+h3Jc6;yDf8fqZ`K8 z1>j~IwAo;ESe^Q?+>2nm4*-xbNLaaKMZtNcYfb^lmWQ9 z-i@UKk39r1sd0RAd>^iUuMC|11c4!+*Jt2d<9+^E7k~0x4neOI_82$;2~8RwBZLKo zN{9y9xEK3N<`$p(U~SV6e^B4FHPe~>&8CmBda_1J5jMC{C-D3~=GdL0qN>bTaJW}e z63vwh%04VC&|AF0>i~cZ(?WRqO#VPXB8wMmmf^^K0Dx0mio0#m;m-c{e^$+}`uY6g zbW^YI9DfL5P-JVu!86A^^CQ7|Za1`~=6DfqbYo4StN6&))$4PdnQB@=u0vc}yevl) z9F?~p-z53YQk~Jjk(e@qxavcmy;k4p=^^>KHZCOf0|2tb8hm%}W~k6rR9jZ+61&Gv zfkFeN3CNlc4&$55w@u)m0VNjK$>^iJ$&o)-_6rduqguo9G^JG0zh#c zOc}O}tv0Kmiz%biLI6Ne>O)pWI>~AqMSq5O6qS{=%sj^&*xCW_gS)g~*$T!JJPrDy z##ly=9BUm+ObHI3JvtJL$G4yOeQE}hyMVmApS!f7c5}7OF6o9scMwqqr@RgT$a}bet`zy4jiC39D4af#WLULzO{EGT49szTKyFi{DGd=zu5(gAw^p1996!3c0~@y#>Ny0M>K*Ko`F1FR#VP_Rc>%X0z33Nd`MWf*er+!L1$p7 z20|&|@(0LI*Y70ROCtcnlR}yC?0=3KCvIQR5+wzUp3{L40$ElNhy~*wuQ%cu=zSWK z=&sZI@L+NV(BMX_CyoH$?qk-xHeKRhV_Jcob1x2B;;!ei1MxPLsY0B;0b zcQj;`uLtOVC#mP4|IS&AWc#2bUUo}r0FoL&Fy0G2mxfI%*Ezm8^W~obYzHRX1qQwN zrooUPqtPjKGH!7?7uN^6(SKtMlq>>Z24Dsyi{QCFg3j28mY?%3I7XP(Us8i$`7kl* z?KR21@eIg{tZ2^8j2=Q_fsBC=AhzA6GTTOixiVw}P^=eOzqeTa{KSFin(EcY5`Sko@9|$mR2d!z z5I6@y(XrqZ09M0qPhC6RxOw^Jd?78y5HN_xboBDI)(FQl!kU^gu4CjYQ2P7@k17mI zC50G~ZjA>IN&T2J*J>z{%jHwwojG7NTQ}5IEVt)6L^i4pK;Z0n+|wn?iu!rdCuJMf ze}o*pfIsjIU#-zZTz{q7ZM$gSxNY@1d&lVEadCmO;Yo)zQN6I5?T;OtlIDEdR(y4~ zxjpEM)$s=WhGEHen`jf_a-2ls(OdevXgqWXi75b+ZQDK^+g`tU({QYX$cdNx-j!B^ zlP&k-jdcw|U-*kDer8=3B>#f&`5Wh(PVB{L0BCf>C_I3a6n{?IjGOxXU&3IwIN##< zSc*6R7`R+SrErkWz#o>qa5)`jUWXmYzGH4gCyUPt5HKRco|eH(zMO2vVs!TPL=y>I z(WZo(5SSsLfMezvuK-xaqu(>w6|xE?U>O|%K+jp=FjV5k!<)U7;;bag36{}M@wFS@ zK(Dt;PN=C@?|*bQZ9SYP(wvggCX6V4~xDOM=zcljRay%3WEm>u&ZEh zt}!e<0{{@hz$unPPv>jRt>@Z<8vRL63#MMF6Ku93WC1X%euauO3;x9E*lblv#Das^ z)ACnb0YJ96ab(*&4a?KgSXQGd7%d%lA3qA+?YPUmWRnGg5|B9_=`mp3n>^9iUxXyd+_PC&v5yL*yKl@@LQV>fJ_j6B>+-uNSm, 2005, 2006. # Benjamin Drung , 2007. # -#: ../src/gajim-remote.py:203 ../src/gajim-remote.py:210 -#: ../src/gajim-remote.py:236 ../src/gajim-remote.py:237 -#: ../src/gajim-remote.py:243 ../src/gajim-remote.py:244 -#: ../src/gajim-remote.py:245 ../src/gajim-remote.py:246 msgid "" msgstr "" "Project-Id-Version: gajim 0.11\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-01-24 23:57+0100\n" -"PO-Revision-Date: 2007-01-25 21:10+0100\n" +"POT-Creation-Date: 2007-03-29 13:38+0200\n" +"PO-Revision-Date: 2007-03-29 13:41+0100\n" "Last-Translator: Benjamin Drung \n" "Language-Team: German \n" "MIME-Version: 1.0\n" @@ -45,7 +41,8 @@ msgstr "Kontakt _hinzufügen..." msgid "_Discover Services..." msgstr "_Durchsuche Dienste..." -#: ../data/glade/account_context_menu.glade.h:4 ../src/disco.py:1145 +#: ../data/glade/account_context_menu.glade.h:4 +#: ../src/disco.py:1145 msgid "_Execute Command..." msgstr "_Befehl ausführen..." @@ -89,9 +86,7 @@ msgstr "Bitte geben Sie die Daten für Ihr neues Konto ein" #: ../data/glade/account_creation_wizard_window.glade.h:6 msgid "Click to see features (like MSN, ICQ transports) of jabber servers" -msgstr "" -"Klicken, um die Fähigkeiten (z.B. MSN-, ICQ-Transporte) auf Jabber-Servern " -"zu sehen." +msgstr "Klicken, um die Fähigkeiten (z.B. MSN-, ICQ-Transporte) auf Jabber-Servern zu sehen." #: ../data/glade/account_creation_wizard_window.glade.h:7 msgid "Connect when I press Finish" @@ -110,7 +105,7 @@ msgid "I want to _register for a new account" msgstr "Ich möchte ein neues Konto _erstellen" #: ../data/glade/account_creation_wizard_window.glade.h:11 -#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/account_modification_window.glade.h:19 msgid "If checked, Gajim will remember the password for this account" msgstr "Falls aktiviert, speichert Gajim das Passwort für dieses Konto" @@ -120,7 +115,7 @@ msgid "Pass_word:" msgstr "Pass_wort:" #: ../data/glade/account_creation_wizard_window.glade.h:13 -#: ../data/glade/account_modification_window.glade.h:38 +#: ../data/glade/account_modification_window.glade.h:39 msgid "Save pass_word" msgstr "Pass_wort speichern" @@ -159,7 +154,7 @@ msgid "_Host:" msgstr "_Server:" #: ../data/glade/account_creation_wizard_window.glade.h:22 -#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/account_modification_window.glade.h:49 msgid "_Password:" msgstr "_Passwort:" @@ -209,226 +204,206 @@ msgid "Account Modification" msgstr "Kontoänderung" #: ../data/glade/account_modification_window.glade.h:6 +#, fuzzy +msgid "Administration operations" +msgstr "Administratorliste" + +#: ../data/glade/account_modification_window.glade.h:7 msgid "Auto-reconnect when connection is lost" msgstr "Automatisch neu verbinden, wenn die Verbindung abbricht" -#: ../data/glade/account_modification_window.glade.h:7 +#: ../data/glade/account_modification_window.glade.h:8 #: ../data/glade/zeroconf_properties_window.glade.h:3 msgid "C_onnect on Gajim startup" msgstr "Beim Pr_ogrammstart verbinden" -#: ../data/glade/account_modification_window.glade.h:8 +#: ../data/glade/account_modification_window.glade.h:9 msgid "Chan_ge Password" msgstr "Pass_wort ändern" -#: ../data/glade/account_modification_window.glade.h:9 -msgid "" -"Check this so Gajim will connect in port 5223 where legacy servers are " -"expected to have SSL capabilities. Note that Gajim uses TLS encryption by " -"default if broadcasted by the server, and with this option enabled TLS will " -"be disabled" -msgstr "" -"Aktivieren Sie diese Option, damit Gajim auf Port 5223 verbindet, auf dem " -"veraltete Server SSL-Fähigkeiten haben. Beachten Sie, dass Gajim " -"standardmäßig TLS-Verschlüsselung benutzt, wenn sie vom Server verwendet " -"wird und sie TLS mit dieser Option deaktivieren" - #: ../data/glade/account_modification_window.glade.h:10 +msgid "Check this so Gajim will connect in port 5223 where legacy servers are expected to have SSL capabilities. Note that Gajim uses TLS encryption by default if broadcasted by the server, and with this option enabled TLS will be disabled" +msgstr "Aktivieren Sie diese Option, damit Gajim auf Port 5223 verbindet, auf dem veraltete Server SSL-Fähigkeiten haben. Beachten Sie, dass Gajim standardmäßig TLS-Verschlüsselung benutzt, wenn sie vom Server verwendet wird und sie TLS mit dieser Option deaktivieren" + +#: ../data/glade/account_modification_window.glade.h:11 #: ../data/glade/zeroconf_properties_window.glade.h:4 msgid "Choose _Key..." msgstr "_Schlüssel wählen..." -#: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/account_modification_window.glade.h:12 msgid "Click to change account's password" msgstr "Klicken, um das Konto-Passwort zu ändern" -#: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/account_modification_window.glade.h:13 msgid "Connection" msgstr "Verbindung" -#: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/account_modification_window.glade.h:14 msgid "Edit Personal Information..." msgstr "Persönliche Details bearbeiten ..." -#: ../data/glade/account_modification_window.glade.h:14 -#: ../data/glade/roster_window.glade.h:5 ../src/notify.py:458 -#: ../src/notify.py:480 ../src/notify.py:492 ../src/common/helpers.py:914 +#: ../data/glade/account_modification_window.glade.h:15 +#: ../data/glade/roster_window.glade.h:5 +#: ../src/notify.py:458 +#: ../src/notify.py:480 +#: ../src/notify.py:492 +#: ../src/common/helpers.py:914 msgid "Gajim" msgstr "Gajim" -#: ../data/glade/account_modification_window.glade.h:15 +#: ../data/glade/account_modification_window.glade.h:16 #: ../data/glade/preferences_window.glade.h:51 #: ../data/glade/zeroconf_properties_window.glade.h:7 -#: ../src/roster_window.py:346 ../src/roster_window.py:1225 -#: ../src/roster_window.py:1436 ../src/roster_window.py:2112 -#: ../src/roster_window.py:2154 ../src/common/contacts.py:284 +#: ../src/roster_window.py:347 +#: ../src/roster_window.py:1225 +#: ../src/roster_window.py:1435 +#: ../src/roster_window.py:2114 +#: ../src/roster_window.py:2156 +#: ../src/common/contacts.py:284 msgid "General" msgstr "Allgemein" -#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/account_modification_window.glade.h:17 msgid "Hostname: " msgstr "Hostname: " -#: ../data/glade/account_modification_window.glade.h:17 -msgid "" -"If checked, Gajim will also broadcast some more IPs except from just your " -"IP, so file transfer has higher chances of working." -msgstr "" -"Wenn aktiviert, wird Gajim von mehr IPs als nur Ihrer eigenen senden, " -"wodurch Datentransfers eine höhere Erfolgswahrscheinlichkeit bekommen." - -#: ../data/glade/account_modification_window.glade.h:19 -msgid "" -"If checked, Gajim will send keep-alive packets to prevent connection timeout " -"which results in disconnection" -msgstr "" -"Wenn aktiviert, sendet Gajim regelmäßig Keepalive-Pakete, um einen " -"Verbindungsabbruch durch eine Zeitüberschreitung zu verhindern" +#: ../data/glade/account_modification_window.glade.h:18 +msgid "If checked, Gajim will also broadcast some more IPs except from just your IP, so file transfer has higher chances of working." +msgstr "Wenn aktiviert, wird Gajim von mehr IPs als nur Ihrer eigenen senden, wodurch Datentransfers eine höhere Erfolgswahrscheinlichkeit bekommen." #: ../data/glade/account_modification_window.glade.h:20 -#: ../data/glade/zeroconf_properties_window.glade.h:8 -msgid "" -"If checked, Gajim will store the password in ~/.gajim/config with 'read' " -"permission only for you" -msgstr "" -"Wenn aktiviert, wird Gajim das Passwort in ~/.gajim/config mit Lese-Rechten " -"nur für Sie speichern" +msgid "If checked, Gajim will send keep-alive packets to prevent connection timeout which results in disconnection" +msgstr "Wenn aktiviert, sendet Gajim regelmäßig Keepalive-Pakete, um einen Verbindungsabbruch durch eine Zeitüberschreitung zu verhindern" #: ../data/glade/account_modification_window.glade.h:21 -#: ../data/glade/zeroconf_properties_window.glade.h:9 -msgid "" -"If checked, Gajim, when launched, will automatically connect to jabber using " -"this account" -msgstr "" -"Wenn aktiviert, wird Gajim während des Startvorgangs automatisch zu diesem " -"Konto verbinden" +#: ../data/glade/zeroconf_properties_window.glade.h:8 +msgid "If checked, Gajim will store the password in ~/.gajim/config with 'read' permission only for you" +msgstr "Wenn aktiviert, wird Gajim das Passwort in ~/.gajim/config mit Lese-Rechten nur für Sie speichern" #: ../data/glade/account_modification_window.glade.h:22 -#: ../data/glade/zeroconf_properties_window.glade.h:10 -msgid "" -"If checked, any change to the global status (handled by the combobox at the " -"bottom of the roster window) will change the status of this account " -"accordingly" -msgstr "" -"Wenn aktiviert, wird jede Änderung des globalen Status (verwaltet von der " -"Combobox am Fuße des Kontaktfensters) auch den Status dieses Kontakts " -"entsprechend ändern" +#: ../data/glade/zeroconf_properties_window.glade.h:9 +msgid "If checked, Gajim, when launched, will automatically connect to jabber using this account" +msgstr "Wenn aktiviert, wird Gajim während des Startvorgangs automatisch zu diesem Konto verbinden" #: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/zeroconf_properties_window.glade.h:10 +msgid "If checked, any change to the global status (handled by the combobox at the bottom of the roster window) will change the status of this account accordingly" +msgstr "Wenn aktiviert, wird jede Änderung des globalen Status (verwaltet von der Combobox am Fuße des Kontaktfensters) auch den Status dieses Kontakts entsprechend ändern" + +#: ../data/glade/account_modification_window.glade.h:24 msgid "Information about you, as stored in the server" msgstr "Informationen über Sie, wie sie auf dem Server gespeichert sind" -#: ../data/glade/account_modification_window.glade.h:24 +#: ../data/glade/account_modification_window.glade.h:25 msgid "Manage..." msgstr "_Verwalten..." -#: ../data/glade/account_modification_window.glade.h:25 -#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1608 -#: ../src/config.py:3405 +#: ../data/glade/account_modification_window.glade.h:26 +#: ../data/glade/zeroconf_properties_window.glade.h:16 +#: ../src/config.py:1623 +#: ../src/config.py:3301 msgid "No key selected" msgstr "Kein Schlüssel gewählt" #. None means no proxy profile selected -#: ../data/glade/account_modification_window.glade.h:27 ../src/config.py:1188 -#: ../src/config.py:1193 ../src/config.py:1377 ../src/config.py:1598 -#: ../src/config.py:1607 ../src/config.py:1667 ../src/config.py:1741 -#: ../src/config.py:3395 ../src/config.py:3404 ../src/dialogs.py:281 +#. GPG Key +#: ../data/glade/account_modification_window.glade.h:28 +#: ../src/config.py:1196 +#: ../src/config.py:1201 +#: ../src/config.py:1385 +#: ../src/config.py:1613 +#: ../src/config.py:1622 +#: ../src/config.py:1682 +#: ../src/config.py:1756 +#: ../src/config.py:3291 +#: ../src/config.py:3300 +#: ../src/dialogs.py:281 #: ../src/dialogs.py:283 +#: ../src/roster_window.py:1539 +#: ../src/roster_window.py:1546 +#: ../src/roster_window.py:1553 msgid "None" msgstr "Kein" -#: ../data/glade/account_modification_window.glade.h:28 +#: ../data/glade/account_modification_window.glade.h:29 #: ../data/glade/profile_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:17 msgid "Personal Information" msgstr "Persönliche Informationen" -#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/account_modification_window.glade.h:30 msgid "Port: " msgstr "Port: " -#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/account_modification_window.glade.h:31 msgid "Priori_ty:" msgstr "Priori_tät:" -#: ../data/glade/account_modification_window.glade.h:31 -msgid "" -"Priority is used in Jabber to determine who gets the events from the jabber " -"server when two or more clients are connected using the same account; The " -"client with the highest priority gets the events" -msgstr "" -"Die Priorität wird von Jabber verwendet, um festzustellen, wer die " -"Ereignisse des Jabber-Servers bekommt, wenn zwei oder mehr Clients mit dem " -"selben Konto verbunden sind. Der Client mit der höchsten Priorität bekommt " -"die Ereignisse" - #: ../data/glade/account_modification_window.glade.h:32 +msgid "Priority is used in Jabber to determine who gets the events from the jabber server when two or more clients are connected using the same account; The client with the highest priority gets the events" +msgstr "Die Priorität wird von Jabber verwendet, um festzustellen, wer die Ereignisse des Jabber-Servers bekommt, wenn zwei oder mehr Clients mit dem selben Konto verbunden sind. Der Client mit der höchsten Priorität bekommt die Ereignisse" + +#: ../data/glade/account_modification_window.glade.h:33 msgid "Priority will change automatically according to your status." msgstr "Die Priorität wird sich automatisch gemäß des Status ändern." -#: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/account_modification_window.glade.h:34 msgid "Proxy:" msgstr "Proxy:" -#: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/account_modification_window.glade.h:35 msgid "Resour_ce:" msgstr "Ressour_ce: " -#: ../data/glade/account_modification_window.glade.h:35 -msgid "" -"Resource is sent to the Jabber server in order to separate the same JID in " -"two or more parts depending on the number of the clients connected in the " -"same server with the same account. So you might be connected in the same " -"account with resource 'Home' and 'Work' at the same time. The resource which " -"has the highest priority will get the events. (see below)" -msgstr "" -"Die Resource wird zum Jabber-Server geschickt, um die selbe JID in zwei oder " -"mehr Teile zu trennen, abhängig von der Anzahl der Clients die mit dem " -"selben Konto auf dem selben Server verbunden sind. Daher kann man " -"gleichzeitig mit den Ressourcen \"Heim\" und \"Arbeit\" auf das selbe Konto " -"verbinden. Die Ressource mit der höchsten Priorität wird die Nachrichten " -"erhalten (siehe unten)." - #: ../data/glade/account_modification_window.glade.h:36 +msgid "Resource is sent to the Jabber server in order to separate the same JID in two or more parts depending on the number of the clients connected in the same server with the same account. So you might be connected in the same account with resource 'Home' and 'Work' at the same time. The resource which has the highest priority will get the events. (see below)" +msgstr "Die Resource wird zum Jabber-Server geschickt, um die selbe JID in zwei oder mehr Teile zu trennen, abhängig von der Anzahl der Clients die mit dem selben Konto auf dem selben Server verbunden sind. Daher kann man gleichzeitig mit den Ressourcen \"Heim\" und \"Arbeit\" auf das selbe Konto verbinden. Die Ressource mit der höchsten Priorität wird die Nachrichten erhalten (siehe unten)." + +#: ../data/glade/account_modification_window.glade.h:37 #: ../data/glade/zeroconf_properties_window.glade.h:18 msgid "Save _passphrase (insecure)" msgstr "_Passphrase speichern (unsicher)" -#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/account_modification_window.glade.h:38 #: ../data/glade/zeroconf_properties_window.glade.h:19 msgid "Save conversation _logs for all contacts" msgstr "Unter_haltungsverlauf für alle Kontakte dieses Kontos speichern" -#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/account_modification_window.glade.h:40 msgid "Send keep-alive packets" msgstr "Sende Keepalive-Pakete" -#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/account_modification_window.glade.h:41 #: ../data/glade/zeroconf_properties_window.glade.h:20 msgid "Synch_ronize account status with global status" msgstr "Konto-Status mit globalem _Status abgleichen" -#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/account_modification_window.glade.h:42 +#, fuzzy +msgid "Synchronise contacts" +msgstr "_Abgemeldete Kontakte anzeigen" + +#: ../data/glade/account_modification_window.glade.h:43 msgid "Use _SSL (legacy)" msgstr "_SSL verwenden (veraltet)" -#: ../data/glade/account_modification_window.glade.h:42 +#: ../data/glade/account_modification_window.glade.h:44 msgid "Use custom hostname/port" msgstr "Verwende benutzerdefinierten Hostnamen und Port" -#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/account_modification_window.glade.h:45 msgid "Use file transfer proxies" msgstr "Verwende Datentransfer-Proxies" -#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/account_modification_window.glade.h:46 msgid "_Adjust to status" msgstr "Mit dem Status _abgleichen" -#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/account_modification_window.glade.h:47 msgid "_Jabber ID:" msgstr "_Jabber ID:" -#: ../data/glade/account_modification_window.glade.h:46 +#: ../data/glade/account_modification_window.glade.h:48 msgid "_Name:" msgstr "_Name: " @@ -438,26 +413,15 @@ msgstr "Konten" #: ../data/glade/accounts_window.glade.h:2 msgid "" -"If checked, all local contacts that use a Bonjour compatible chat client " -"(like iChat, Trillian or Gaim) will be shown in roster. You don't need to be " -"connected to a jabber server for it to work.\n" -"This is only available if python-avahi is installed and avahi-daemon is " -"running." +"If checked, all local contacts that use a Bonjour compatible chat client (like iChat, Trillian or Gaim) will be shown in roster. You don't need to be connected to a jabber server for it to work.\n" +"This is only available if python-avahi is installed and avahi-daemon is running." msgstr "" -"Wenn aktiviert, werden alle lokalen Kontakte, welche einen zu Bonjour " -"kompatiblen Chat-Client (Wie z.B. iChat, Trillian oder Gaim) nutzen, in " -"Ihrer Kontaktliste angezeigt. Dafür müssen Sie nicht mit einem Jabber-Server " -"verbunden sein.\n" -"Dies ist nur möglich, wenn python-avahi verfügbar ist und avahi-daemon läuft " -"(Automatische Diensterkennung)." +"Wenn aktiviert, werden alle lokalen Kontakte, welche einen zu Bonjour kompatiblen Chat-Client (Wie z.B. iChat, Trillian oder Gaim) nutzen, in Ihrer Kontaktliste angezeigt. Dafür müssen Sie nicht mit einem Jabber-Server verbunden sein.\n" +"Dies ist nur möglich, wenn python-avahi verfügbar ist und avahi-daemon läuft (Automatische Diensterkennung)." #: ../data/glade/accounts_window.glade.h:4 -msgid "" -"If you have 2 or more accounts and this is checked, Gajim will list all " -"contacts as if you had one account" -msgstr "" -"Wenn Sie zwei oder mehr Konten haben und diese Option gewählt ist, wird " -"Gajim alle Kontakte auflisten, als hätten Sie nur ein Konto" +msgid "If you have 2 or more accounts and this is checked, Gajim will list all contacts as if you had one account" +msgstr "Wenn Sie zwei oder mehr Konten haben und diese Option gewählt ist, wird Gajim alle Kontakte auflisten, als hätten Sie nur ein Konto" #: ../data/glade/accounts_window.glade.h:5 msgid "Mer_ge accounts" @@ -574,9 +538,7 @@ msgstr "Beschreibung" #: ../data/glade/advanced_configuration_window.glade.h:2 msgid "NOTE: You should restart Gajim for some settings to take effect" -msgstr "" -"HINWEIS: Sie sollten Gajim neu starten, damit alle Änderungen in " -"Kraft treten" +msgstr "HINWEIS: Sie sollten Gajim neu starten, damit alle Änderungen in Kraft treten" #: ../data/glade/advanced_configuration_window.glade.h:3 msgid "Advanced Configuration Editor" @@ -664,7 +626,8 @@ msgid "All statuses" msgstr "Alle Status " #: ../data/glade/advanced_notifications_window.glade.h:8 -#: ../src/common/commands.py:91 ../src/common/helpers.py:243 +#: ../src/common/commands.py:91 +#: ../src/common/helpers.py:243 msgid "Away" msgstr "Abwesend" @@ -731,11 +694,8 @@ msgid "When " msgstr "Wenn " #: ../data/glade/advanced_notifications_window.glade.h:27 -msgid "" -"_Activate window manager's UrgencyHint to make chat window in taskbar flash" -msgstr "" -"_Aktivere den UrgencyHint des Fenstermanagers, um das Chatfenster in der " -"Taskleiste blinken zu lassen" +msgid "_Activate window manager's UrgencyHint to make chat window in taskbar flash" +msgstr "_Aktivere den UrgencyHint des Fenstermanagers, um das Chatfenster in der Taskleiste blinken zu lassen" #: ../data/glade/advanced_notifications_window.glade.h:28 msgid "_Disable auto opening chat window" @@ -893,7 +853,7 @@ msgid "_Compact View Alt+C" msgstr "_Kompakte Ansicht Alt+C" #: ../data/glade/chat_control_popup_menu.glade.h:6 -#: ../data/glade/gc_control_popup_menu.glade.h:7 +#: ../data/glade/gc_control_popup_menu.glade.h:8 #: ../data/glade/gc_occupants_menu.glade.h:5 #: ../data/glade/roster_contact_context_menu.glade.h:13 #: ../data/glade/zeroconf_contact_context_menu.glade.h:6 @@ -926,8 +886,7 @@ msgstr "Bricht den ausgewählten Dateitransfer ab" #: ../data/glade/filetransfers.glade.h:4 msgid "Cancels the selected file transfer and removes incomplete file" -msgstr "" -"Bricht den ausgewählten Dateitransfer ab und löscht unvollständige Daten" +msgstr "Bricht den ausgewählten Dateitransfer ab und löscht unvollständige Daten" #: ../data/glade/filetransfers.glade.h:5 msgid "Clean _up" @@ -947,27 +906,22 @@ msgstr "Entferne Dateitransfer von Liste" #: ../data/glade/filetransfers.glade.h:9 msgid "Removes completed, cancelled and failed file transfers from the list" -msgstr "" -"Entfernt beendete, abgebrochene und fehlgeschlagene Dateitransfers von der " -"Liste" +msgstr "Entfernt beendete, abgebrochene und fehlgeschlagene Dateitransfers von der Liste" #: ../data/glade/filetransfers.glade.h:10 msgid "Shows a list of file transfers between you and others" msgstr "Zeigt eine Liste von Dateiübertragungen an" #: ../data/glade/filetransfers.glade.h:11 -msgid "" -"This action removes single file transfer from the list. If the transfer is " -"active, it is first stopped and then removed" -msgstr "" -"Diese Aktion entfernt einen Dateitransfer von der Liste. Falls der Transfer " -"aktiv ist, wird er erst gestoppt, dann entfernt" +msgid "This action removes single file transfer from the list. If the transfer is active, it is first stopped and then removed" +msgstr "Diese Aktion entfernt einen Dateitransfer von der Liste. Falls der Transfer aktiv ist, wird er erst gestoppt, dann entfernt" #: ../data/glade/filetransfers.glade.h:12 msgid "When a file transfer is complete show a popup notification" msgstr "Zeige eine Benachrichtigung, wenn die Datei komplett übertragen wurde." -#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:769 +#: ../data/glade/filetransfers.glade.h:13 +#: ../src/filetransfers_window.py:761 msgid "_Continue" msgstr "_Fortsetzen" @@ -975,7 +929,8 @@ msgstr "_Fortsetzen" msgid "_Notify me when a file transfer is complete" msgstr "_Benachrichtige mich, wenn der Dateitransfer abgeschlossen ist" -#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:190 +#: ../data/glade/filetransfers.glade.h:15 +#: ../src/filetransfers_window.py:188 msgid "_Open Containing Folder" msgstr "_Öffne Ordner" @@ -1083,6 +1038,11 @@ msgstr "_Raum einrichten" msgid "_Bookmark This Room" msgstr "Raum zu _Lesezeichen hinzufügen" +#: ../data/glade/gc_control_popup_menu.glade.h:7 +#, fuzzy +msgid "_Destroy room" +msgstr "_Neuer Raum" + #: ../data/glade/gc_occupants_menu.glade.h:1 msgid "Mo_derator" msgstr "Mo_derator" @@ -1123,12 +1083,14 @@ msgstr "_Stimme verleihen" msgid "Create new post" msgstr "Neue Nachricht" -#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:268 +#: ../data/glade/groups_post_window.glade.h:2 +#: ../src/common/helpers.py:268 msgid "From" msgstr "Von" #. holds subject -#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:142 +#: ../data/glade/groups_post_window.glade.h:3 +#: ../src/history_manager.py:142 #: ../src/history_manager.py:173 msgid "Subject" msgstr "Betreff" @@ -1140,17 +1102,14 @@ msgid "" "You can select logs from the left and/or search database from below.\n" "\n" "WARNING:\n" -"If you plan to do massive deletions, please make sure Gajim is not running. " -"Generally avoid deletions with contacts you currently chat with." +"If you plan to do massive deletions, please make sure Gajim is not running. Generally avoid deletions with contacts you currently chat with." msgstr "" "Willkommen zum Gajim Verlaufsmanager\n" "\n" "Sie können Logs links auswählen und/oder unten die Datenbank durchsuchen.\n" "\n" "WARNUNG:\n" -"Wenn Sie massiv Daten löschen möchten, stellen Sie sicher, dass Gajim nicht " -"läuft. Vermeiden Sie generell Löschungen von Kontakten, mit denen Sie gerade " -"chatten." +"Wenn Sie massiv Daten löschen möchten, stellen Sie sicher, dass Gajim nicht läuft. Vermeiden Sie generell Löschungen von Kontakten, mit denen Sie gerade chatten." #: ../data/glade/history_manager.glade.h:7 msgid "Delete" @@ -1201,7 +1160,8 @@ msgstr "Ablehnen" msgid "Invitation Received" msgstr "Einladung empfangen" -#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1148 +#: ../data/glade/join_groupchat_window.glade.h:1 +#: ../src/dialogs.py:1208 msgid "Join Group Chat" msgstr "Betrete Gruppenchat" @@ -1230,7 +1190,8 @@ msgstr "Kürzlich:" msgid "Room:" msgstr "Raum:" -#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1163 +#: ../data/glade/join_groupchat_window.glade.h:7 +#: ../src/disco.py:1163 #: ../src/disco.py:1546 msgid "_Join" msgstr "_Betreten" @@ -1301,7 +1262,8 @@ msgstr "Verwende Authentifizierung" msgid "Click to insert an emoticon (Alt+M)" msgstr "Klicken Sie, um ein Emoticon einzufügen (Alt+M)" -#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1109 +#: ../data/glade/message_window.glade.h:2 +#: ../src/chat_control.py:1109 msgid "OpenPGP Encryption" msgstr "OpenPGP-Verschlüsselung" @@ -1315,7 +1277,7 @@ msgstr "_Aktionen" #. 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:6 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:253 +#: ../src/filetransfers_window.py:245 msgid "_Send" msgstr "_Senden" @@ -1376,9 +1338,7 @@ msgstr "Sende _Betriebssystem-Information" #: ../data/glade/preferences_window.glade.h:17 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" -msgstr "" -"Popups/Benachrichtigungen _zulassen, wenn ich abwesend/NA/beschäftigt/" -"unsichtbar bin" +msgstr "Popups/Benachrichtigungen _zulassen, wenn ich abwesend/NA/beschäftigt/unsichtbar bin" #: ../data/glade/preferences_window.glade.h:18 msgid "Also known as iChat style" @@ -1389,15 +1349,8 @@ msgid "Always check to see if Gajim is the _default Jabber client on startup" msgstr "Beim Starten überprüfen, ob Gajim der _Standard-Jabber-Client ist" #: ../data/glade/preferences_window.glade.h:20 -msgid "" -"An example: If you have enabled status message for away, Gajim won't ask you " -"anymore for a status message when you change your status to away; it will " -"use the default one set here" -msgstr "" -"Ein Beispiel: Wenn Sie eine Status-Nachricht für Abwesend aktiviert haben, " -"wird Sie Gajim nicht noch einmal nach einer Status-Nachricht fragen, wenn " -"Sie Ihren Status zu Abwesend ändern; es wird die hier definierte Nachricht " -"verwendet." +msgid "An example: If you have enabled status message for away, Gajim won't ask you anymore for a status message when you change your status to away; it will use the default one set here" +msgstr "Ein Beispiel: Wenn Sie eine Status-Nachricht für Abwesend aktiviert haben, wird Sie Gajim nicht noch einmal nach einer Status-Nachricht fragen, wenn Sie Ihren Status zu Abwesend ändern; es wird die hier definierte Nachricht verwendet." #: ../data/glade/preferences_window.glade.h:21 msgid "Ask status message when I:" @@ -1424,20 +1377,13 @@ msgstr "" "Immer KDE Standard-Anwendungen verwenden\n" "Benutzerdefiniert" -#: ../data/glade/preferences_window.glade.h:29 ../src/chat_control.py:852 +#: ../data/glade/preferences_window.glade.h:29 msgid "Chat" msgstr "Chat" #: ../data/glade/preferences_window.glade.h:30 -msgid "" -"Check this option, only if someone you don't have in the roster spams/annoys " -"you. Use with caution, because it blocks all messages from any contact that " -"is not in the roster" -msgstr "" -"Aktivieren Sie diese Option nur, wenn jemand, der nicht in ihrer Liste ist, " -"Spam an Sie verschickt oder Sie belästigt. Verwenden Sie diese Option mit " -"Vorsicht, da sie alle Nachrichten von allen Kontakten blockiert, die nicht " -"in ihrer Liste sind." +msgid "Check this option, only if someone you don't have in the roster spams/annoys you. Use with caution, because it blocks all messages from any contact that is not in the roster" +msgstr "Aktivieren Sie diese Option nur, wenn jemand, der nicht in ihrer Liste ist, Spam an Sie verschickt oder Sie belästigt. Verwenden Sie diese Option mit Vorsicht, da sie alle Nachrichten von allen Kontakten blockiert, die nicht in ihrer Liste sind." #: ../data/glade/preferences_window.glade.h:31 msgid "Configure color and font of the interface" @@ -1475,7 +1421,7 @@ msgstr "Zeige die Status_nachrichten von Kontakten im Roster" #: ../data/glade/preferences_window.glade.h:40 msgid "Displayed Chat state noti_fications:" -msgstr "Zeige Benachrichtigung über Chatstadien:" +msgstr "Zeige Benachrichtigung über Chatstatus:" #: ../data/glade/preferences_window.glade.h:41 msgid "E_very 5 minutes" @@ -1490,112 +1436,56 @@ msgid "Events" msgstr "Ereignisse" #: ../data/glade/preferences_window.glade.h:44 -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 " -"display in chat windows." -msgstr "" -"Gajim kann Meta-Information, die eine Unterhaltung mit einem Kontakt " -"betrifft, empfangen und versenden. Hier können Sie definieren, welche " -"Chatstatus Sie in Ihrem Chatfenster anzeigen möchten." +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 display in chat windows." +msgstr "Gajim kann Meta-Information, die eine Unterhaltung mit einem Kontakt betrifft, empfangen und versenden. Hier können Sie definieren, welche Chatstatus Sie in Ihrem Chatfenster anzeigen möchten." #: ../data/glade/preferences_window.glade.h:45 -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 " -"send to the other party." -msgstr "" -"Gajim kann Meta-Information, die eine Unterhaltung mit einem Kontakt " -"betrifft, empfangen und versenden. Hier können Sie definieren, welche " -"Chatstates Sie Ihrem Gegenüber senden möchten." +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 send to the other party." +msgstr "Gajim kann Meta-Information, die eine Unterhaltung mit einem Kontakt betrifft, empfangen und versenden. Hier können Sie definieren, welche Chatstates Sie Ihrem Gegenüber senden möchten." #: ../data/glade/preferences_window.glade.h:46 -msgid "" -"Gajim will automatically show new events by popping up the relevant window" -msgstr "" -"Gajim wird neue Ereignisse automatisch anzeigen, indem das betreffende " -"Fenster geöffnet wird" +msgid "Gajim will automatically show new events by popping up the relevant window" +msgstr "Gajim wird neue Ereignisse automatisch anzeigen, indem das betreffende Fenster geöffnet wird" #: ../data/glade/preferences_window.glade.h:47 -msgid "" -"Gajim will notify you for new events via a popup in the bottom right of the " -"screen" -msgstr "" -"Gajim wird Sie über neue Ereignisse mit einem Popup in der rechten unteren " -"Ecke des Bildschirms benachrichtigen" +msgid "Gajim will notify you for new events via a popup in the bottom right of the screen" +msgstr "Gajim wird Sie über neue Ereignisse mit einem Popup in der rechten unteren Ecke des Bildschirms benachrichtigen" #: ../data/glade/preferences_window.glade.h:48 -msgid "" -"Gajim will notify you via a popup window in the bottom right of the screen " -"about contacts that just signed in" -msgstr "" -"Gajim wird Sie über ein Popup-Fenster in der rechten unteren Ecke des " -"Bildschirmes über Kontakte informieren, die sich gerade angemeldet haben" +msgid "Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed in" +msgstr "Gajim wird Sie über ein Popup-Fenster in der rechten unteren Ecke des Bildschirmes über Kontakte informieren, die sich gerade angemeldet haben" #: ../data/glade/preferences_window.glade.h:49 -msgid "" -"Gajim will notify you via a popup window in the bottom right of the screen " -"about contacts that just signed out" -msgstr "" -"Gajim wird Sie über ein Popup-Fenster in der rechten unteren Bildschirmecke " -"über Kontakte informieren, die sich gerade abgemeldet haben" +msgid "Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed out" +msgstr "Gajim wird Sie über ein Popup-Fenster in der rechten unteren Bildschirmecke über Kontakte informieren, die sich gerade abgemeldet haben" #: ../data/glade/preferences_window.glade.h:50 -msgid "" -"Gajim will only change the icon of the contact that triggered the new event" -msgstr "" -"Gajim wird nur das Symbol des Kontaktes ändern, von dem die neue Nachricht " -"kommt" +msgid "Gajim will only change the icon of the contact that triggered the new event" +msgstr "Gajim wird nur das Symbol des Kontaktes ändern, von dem die neue Nachricht kommt" #: ../data/glade/preferences_window.glade.h:52 -msgid "" -"If checked, Gajim will also include information about the sender of the new " -"emails" -msgstr "" -"Wenn aktiviert, wird Gajim auch Informationen über den Absender von neuen E-" -"Mails hinzufügen." +msgid "If checked, Gajim will also include information about the sender of the new emails" +msgstr "Wenn aktiviert, wird Gajim auch Informationen über den Absender von neuen E-Mails hinzufügen." #: ../data/glade/preferences_window.glade.h:53 -msgid "" -"If checked, Gajim will display avatars of contacts in roster window and in " -"group chats" -msgstr "" -"Wenn aktiviert, wird Gajim einen Avatar im Roster-Fenster und in " -"Gruppenchats einblenden" +msgid "If checked, Gajim will display avatars of contacts in roster window and in group chats" +msgstr "Wenn aktiviert, wird Gajim einen Avatar im Roster-Fenster und in Gruppenchats einblenden" #: ../data/glade/preferences_window.glade.h:54 -msgid "" -"If checked, Gajim will display status messages of contacts under the contact " -"name in roster window and in group chats" -msgstr "" -"Wenn aktiviert, wird Gajim für jeden Kontakt unter dem Kontaktnamen im " -"Roster und im Gruppenchat-Fenster die Statusnachricht anzeigen" +msgid "If checked, Gajim will display status messages of contacts under the contact name in roster window and in group chats" +msgstr "Wenn aktiviert, wird Gajim für jeden Kontakt unter dem Kontaktnamen im Roster und im Gruppenchat-Fenster die Statusnachricht anzeigen" #: ../data/glade/preferences_window.glade.h:55 -msgid "" -"If checked, Gajim will remember the roster and chat window positions in the " -"screen and the sizes of them next time you run it" -msgstr "" -"Wenn aktiviert, erinnert sich Gajim an die Position und Größe der " -"Kontaktliste auf dem Bildschirm beim nächsten Start" +msgid "If checked, Gajim will remember the roster and chat window positions in the screen and the sizes of them next time you run it" +msgstr "Wenn aktiviert, erinnert sich Gajim an die Position und Größe der Kontaktliste auf dem Bildschirm beim nächsten Start" #: ../data/glade/preferences_window.glade.h:56 -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, " -"etc...)" -msgstr "" -"Wenn Sie diese Option aktivieren wird Gajim Protokoll-spezifische Symbole " -"verwenden (Ein Kontakt aus MSN wird z.B. das äquivalente MSN-Symbol für den " -"Status \"Anwesend\", \"Abwesend\", \"Beschäftigt\", etc. haben)" +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, etc...)" +msgstr "Wenn Sie diese Option aktivieren wird Gajim Protokoll-spezifische Symbole verwenden (Ein Kontakt aus MSN wird z.B. das äquivalente MSN-Symbol für den Status \"Anwesend\", \"Abwesend\", \"Beschäftigt\", etc. haben)" #: ../data/glade/preferences_window.glade.h:57 -msgid "" -"If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " -"animated or static graphical emoticons" -msgstr "" -"Wenn nicht deaktivert, wird Gajim ASCII-Smilies wie ':)' mit äquivalenten " -"graphischen Emoticons ersetzen" +msgid "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons" +msgstr "Wenn nicht deaktivert, wird Gajim ASCII-Smilies wie ':)' mit äquivalenten graphischen Emoticons ersetzen" #: ../data/glade/preferences_window.glade.h:58 msgid "Ignore rich content in incoming messages" @@ -1635,7 +1525,7 @@ msgstr "Ein _Nachrichtenfenster:" #: ../data/glade/preferences_window.glade.h:68 msgid "Outgoing Chat state noti_fications:" -msgstr "_Sende Chatstadien:" +msgstr "_Sende Chatstatus:" #: ../data/glade/preferences_window.glade.h:69 msgid "Play _sounds" @@ -1670,13 +1560,8 @@ msgid "Sign _out" msgstr "a_bmelden" #: ../data/glade/preferences_window.glade.h:77 -msgid "" -"Some messages may include rich content (formatting, colors etc). If checked, " -"Gajim will just display the raw message text." -msgstr "" -"Einige Nachrichten könnten formatierten Inhalt enthalten (Farben, " -"Schriftarten etc.). Wenn aktiviert, wird Gajim nur den puren Nachrichtentext " -"anzeigen." +msgid "Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text." +msgstr "Einige Nachrichten könnten formatierten Inhalt enthalten (Farben, Schriftarten etc.). Wenn aktiviert, wird Gajim nur den puren Nachrichtentext anzeigen." #: ../data/glade/preferences_window.glade.h:78 msgid "Status" @@ -1711,29 +1596,16 @@ msgid "Use t_rayicon (aka. notification area icon)" msgstr "Verwende _Trayicon (Benachrichtigungs-Icon)" #: ../data/glade/preferences_window.glade.h:86 -msgid "" -"When a new event (message, file transfer request etc..) is received, the " -"following methods may be used to inform you about it. Please note that " -"events about new messages only occur if it is a new message from a contact " -"you are not already chatting with" -msgstr "" -"Wenn ein neues Ereignis (Nachricht, Dateitransferanfrage usw.) empfangen " -"wird, können die folgenden Methoden zur Benachrichtigung verwendet werden. " -"Bitte beachten Sie, dass Ereignisse über neue Nachrichten nur auftreten, " -"wenn Sie eine Nachricht von einem Kontakt erhalten, mit dem Sie nicht " -"bereits chatten" +msgid "When a new event (message, file transfer request etc..) is received, the following methods may be used to inform you about it. Please note that events about new messages only occur if it is a new message from a contact you are not already chatting with" +msgstr "Wenn ein neues Ereignis (Nachricht, Dateitransferanfrage usw.) empfangen wird, können die folgenden Methoden zur Benachrichtigung verwendet werden. Bitte beachten Sie, dass Ereignisse über neue Nachrichten nur auftreten, wenn Sie eine Nachricht von einem Kontakt erhalten, mit dem Sie nicht bereits chatten" #: ../data/glade/preferences_window.glade.h:87 msgid "When new event is received" msgstr "Wenn neue Nachricht empfangen wird" #: ../data/glade/preferences_window.glade.h:88 -msgid "" -"Works for Rhythmbox and Muine players. For more players, please visit http://" -"trac.gajim.org/wiki/GajimAndMusicPlayer" -msgstr "" -"Funktioniert mit Rhythmbox und Muine. Für weitere Wiedergabeprogramme " -"besuchen Sie bitte http://trac.gajim.org/wiki/GajimAndMusicPlayer (Englisch)" +msgid "Works for Rhythmbox and Muine players. For more players, please visit http://trac.gajim.org/wiki/GajimAndMusicPlayer" +msgstr "Funktioniert mit Rhythmbox und Muine. Für weitere Wiedergabeprogramme besuchen Sie bitte http://trac.gajim.org/wiki/GajimAndMusicPlayer (Englisch)" #: ../data/glade/preferences_window.glade.h:89 msgid "_Advanced Notifications Control..." @@ -1855,7 +1727,8 @@ msgstr "Jabber-ID:" msgid "Order:" msgstr "Reihenfolge:" -#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:1862 +#: ../data/glade/privacy_list_window.glade.h:11 +#: ../src/dialogs.py:2052 msgid "Privacy List" msgstr "Privatliste" @@ -2012,7 +1885,8 @@ msgid "Prefix:" msgstr "Präfix" #: ../data/glade/profile_window.glade.h:32 -#: ../data/glade/vcard_information_window.glade.h:38 ../src/vcard.py:273 +#: ../data/glade/vcard_information_window.glade.h:38 +#: ../src/vcard.py:273 msgid "Role:" msgstr "Rolle:" @@ -2065,17 +1939,17 @@ msgstr "Open_PGP-Schlüssel zuweisen" #: ../data/glade/roster_contact_context_menu.glade.h:4 #: ../data/glade/zeroconf_contact_context_menu.glade.h:3 -#: ../src/roster_window.py:2076 +#: ../src/roster_window.py:2078 msgid "Edit _Groups" msgstr "_Gruppen bearbeiten" #: ../data/glade/roster_contact_context_menu.glade.h:5 -#: ../src/roster_window.py:2211 +#: ../src/roster_window.py:2213 msgid "Execute Command..." msgstr "_Befehl ausführen..." #: ../data/glade/roster_contact_context_menu.glade.h:6 -#: ../src/roster_window.py:2034 +#: ../src/roster_window.py:2036 msgid "In_vite to" msgstr "_Einladen zu" @@ -2099,14 +1973,15 @@ msgstr "_Verbiete Kontakt, meinen Status zu sehen" #. Remove group #: ../data/glade/roster_contact_context_menu.glade.h:14 -#: ../src/roster_window.py:2028 ../src/roster_window.py:2125 -#: ../src/roster_window.py:2232 +#: ../src/roster_window.py:2030 +#: ../src/roster_window.py:2127 +#: ../src/roster_window.py:2234 msgid "_Remove from Roster" msgstr "Entfernen von _Kontaktliste" #: ../data/glade/roster_contact_context_menu.glade.h:15 #: ../data/glade/zeroconf_contact_context_menu.glade.h:7 -#: ../src/roster_window.py:2220 +#: ../src/roster_window.py:2222 msgid "_Rename" msgstr "_Umbenennen" @@ -2154,8 +2029,9 @@ msgstr "In_halte" msgid "_Discover Services" msgstr "_Dienste durchsuchen" -#: ../data/glade/roster_window.glade.h:14 ../src/disco.py:1284 -#: ../src/roster_window.py:2203 +#: ../data/glade/roster_window.glade.h:14 +#: ../src/disco.py:1284 +#: ../src/roster_window.py:2205 msgid "_Edit" msgstr "_Ändern" @@ -2252,12 +2128,8 @@ msgid "Authorize contact so he or she can know when you're connected" msgstr "Kontakt autorisieren, so dass er Ihren Status sehen kann" #: ../data/glade/subscription_request_window.glade.h:3 -msgid "" -"Deny authorization from contact so he or she cannot know when you're " -"connected" -msgstr "" -"Autorisierung des Kontakts verweigern, so dass er nicht sehen kann, wann Sie " -"verbunden sind" +msgid "Deny authorization from contact so he or she cannot know when you're connected" +msgstr "Autorisierung des Kontakts verweigern, so dass er nicht sehen kann, wann Sie verbunden sind" #: ../data/glade/subscription_request_window.glade.h:4 msgid "Subscription Request" @@ -2307,7 +2179,8 @@ msgstr "Kontakt-Information" #: ../data/glade/vcard_information_window.glade.h:24 #: ../data/glade/zeroconf_information_window.glade.h:4 -#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:416 +#: ../data/glade/zeroconf_properties_window.glade.h:13 +#: ../src/dialogs.py:416 msgid "Jabber ID:" msgstr "Jabber-ID:" @@ -2386,13 +2259,10 @@ msgstr "Persönlich" #: ../data/glade/zeroconf_properties_window.glade.h:11 msgid "" -"If the default port that is used for incoming messages is unfitting for your " -"setup you can select another one here.\n" +"If the default port that is used for incoming messages is unfitting for your setup you can select another one here.\n" "You might consider to change possible firewall settings." msgstr "" -"Wenn der Standardport, der für eingehende Nachrichten benutzt wird, nicht " -"für Ihre Konfiguration geeignet ist, können sie hier einen anderen Port " -"festlegen.\n" +"Wenn der Standardport, der für eingehende Nachrichten benutzt wird, nicht für Ihre Konfiguration geeignet ist, können sie hier einen anderen Port festlegen.\n" "Möglicherweise ist es von Nöten, Ihre Firewall-Einstellungen zu ändern." #: ../data/glade/zeroconf_properties_window.glade.h:15 @@ -2468,7 +2338,8 @@ msgid "Bulgarian" msgstr "Bulgarisch" #: ../src/chat_control.py:52 -msgid "Briton" +#, fuzzy +msgid "Breton" msgstr "Briton" #: ../src/chat_control.py:52 @@ -2496,7 +2367,8 @@ msgid "Spanish" msgstr "Spanisch" #: ../src/chat_control.py:52 -msgid "Basc" +#, fuzzy +msgid "Basque" msgstr "Baskisch" #: ../src/chat_control.py:52 @@ -2539,6 +2411,10 @@ msgstr "Brasilianisch" msgid "Russian" msgstr "Russsich" +#: ../src/chat_control.py:52 +msgid "Serbian" +msgstr "Serbisch" + #: ../src/chat_control.py:52 msgid "Slovak" msgstr "Slovakisch" @@ -2551,39 +2427,32 @@ msgstr "Schwedisch" msgid "Chinese (Ch)" msgstr "Chinesisch" -#: ../src/chat_control.py:208 ../src/dialogs.py:1516 +#: ../src/chat_control.py:207 +#: ../src/dialogs.py:1706 msgid "" -"If that is not your language for which you want to highlight misspelled " -"words, then please set your $LANG as appropriate. Eg. for French do export " -"LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to make it " -"global in /etc/profile.\n" +"If that is not your language for which you want to highlight misspelled words, then please set your $LANG as appropriate. Eg. for French do export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to make it global in /etc/profile.\n" "\n" "Highlighting misspelled words feature will not be used" msgstr "" -"Wenn das nicht die Sprache ist, für die Sie falschgeschriebene Wörter " -"hervorheben möchten, setzen Sie bitte Ihre $LANG entsprechend. Z.B. für " -"Französisch: export LANG=fr_FR oder export LANG=fr_FR.UTF-8 in ~/." -"bash_profile or global in /etc/profile.\n" +"Wenn das nicht die Sprache ist, für die Sie falschgeschriebene Wörter hervorheben möchten, setzen Sie bitte Ihre $LANG entsprechend. Z.B. für Französisch: export LANG=fr_FR oder export LANG=fr_FR.UTF-8 in ~/.bash_profile or global in /etc/profile.\n" "\n" "Falschgeschriebene Wörter werden nicht hervorgehoben" -#: ../src/chat_control.py:247 +#: ../src/chat_control.py:246 msgid "Spelling language" msgstr "Sprache für die Rechtschreibprüfung" #. we are not connected -#: ../src/chat_control.py:270 ../src/chat_control.py:476 +#: ../src/chat_control.py:269 +#: ../src/chat_control.py:475 msgid "A connection is not available" msgstr "Keine Verbindung verfügbar" -#: ../src/chat_control.py:271 ../src/chat_control.py:477 +#: ../src/chat_control.py:270 +#: ../src/chat_control.py:476 msgid "Your message can not be sent until you are connected." msgstr "Ihre Nachricht kann erst gesendet werden, wenn Sie verbunden sind." -#: ../src/chat_control.py:852 -msgid "Chats" -msgstr "Chats" - #: ../src/chat_control.py:1034 #, python-format msgid "%(nickname)s from group chat %(room_name)s" @@ -2593,8 +2462,7 @@ msgstr "%(nickname)s aus Gruppenchat %(room_name)s" #: ../src/chat_control.py:1123 #, python-format msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" -msgstr "" -"%s hat keinen OpenPGP-Schlüssel verbreitet und es wurde keiner zugewiesen" +msgstr "%s hat keinen OpenPGP-Schlüssel verbreitet und es wurde keiner zugewiesen" #: ../src/chat_control.py:1259 msgid "Encryption enabled" @@ -2605,306 +2473,321 @@ msgid "Encryption disabled" msgstr "Verschlüsselung deaktiviert" #. add_to_roster_menuitem -#: ../src/chat_control.py:1406 ../src/conversation_textview.py:495 -#: ../src/dialogs.py:629 ../src/gajim.py:845 ../src/gajim.py:846 -#: ../src/gajim.py:1190 ../src/roster_window.py:332 -#: ../src/roster_window.py:410 ../src/roster_window.py:1498 -#: ../src/roster_window.py:1508 ../src/roster_window.py:1684 -#: ../src/roster_window.py:1890 ../src/roster_window.py:2475 -#: ../src/roster_window.py:3900 ../src/roster_window.py:3902 -#: ../src/common/contacts.py:73 ../src/common/helpers.py:43 +#: ../src/chat_control.py:1408 +#: ../src/conversation_textview.py:497 +#: ../src/dialogs.py:629 +#: ../src/gajim.py:850 +#: ../src/gajim.py:851 +#: ../src/gajim.py:1196 +#: ../src/roster_window.py:333 +#: ../src/roster_window.py:411 +#: ../src/roster_window.py:1497 +#: ../src/roster_window.py:1507 +#: ../src/roster_window.py:1686 +#: ../src/roster_window.py:1892 +#: ../src/roster_window.py:2477 +#: ../src/roster_window.py:2678 +#: ../src/roster_window.py:3916 +#: ../src/roster_window.py:3918 +#: ../src/common/contacts.py:73 +#: ../src/common/helpers.py:43 #: ../src/common/helpers.py:255 msgid "Not in Roster" msgstr "Nicht in der Liste" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:1550 +#: ../src/chat_control.py:1552 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Sie haben eine neue Nachricht von \"%s\"" -#: ../src/chat_control.py:1551 -msgid "" -"If you close this tab and you have history disabled, this message will be " -"lost." -msgstr "" -"Wenn sie das Fenster schließen und der Verlauf abgeschaltet ist, geht die " -"Nachricht verloren." +#: ../src/chat_control.py:1553 +msgid "If you close this tab and you have history disabled, this message will be lost." +msgstr "Wenn sie das Fenster schließen und der Verlauf abgeschaltet ist, geht die Nachricht verloren." -#: ../src/config.py:137 ../src/config.py:586 +#: ../src/config.py:139 +#: ../src/config.py:588 msgid "Disabled" msgstr "Deaktiviert" -#: ../src/config.py:231 +#: ../src/config.py:233 #, python-format msgid "Every %s _minutes" msgstr "Alle %s _Minuten" -#: ../src/config.py:351 +#: ../src/config.py:353 msgid "Active" msgstr "Aktiv" -#: ../src/config.py:359 +#: ../src/config.py:361 msgid "Event" msgstr "Ereignis" -#: ../src/config.py:682 ../src/gajim.py:2225 +#: ../src/config.py:684 +#: ../src/gajim.py:2237 #, python-format msgid "Dictionary for lang %s not available" msgstr "Wörterburch für Sprache %s nicht verfügbar" -#: ../src/config.py:683 ../src/gajim.py:2226 +#: ../src/config.py:685 +#: ../src/gajim.py:2238 #, python-format -msgid "" -"You have to install %s dictionary to use spellchecking, or choose another " -"language by setting the speller_language option." -msgstr "" -"Sie müssen das Wörterbuch %s installieren oder eine andere Sprache wählen, " -"um die Rechtschreibprüfung zu nutzen." +msgid "You have to install %s dictionary to use spellchecking, or choose another language by setting the speller_language option." +msgstr "Sie müssen das Wörterbuch %s installieren oder eine andere Sprache wählen, um die Rechtschreibprüfung zu nutzen." -#: ../src/config.py:1000 +#: ../src/config.py:1008 msgid "status message title" msgstr "Statusbetreff" -#: ../src/config.py:1000 +#: ../src/config.py:1008 msgid "status message text" msgstr "Statusnachricht" -#: ../src/config.py:1036 +#: ../src/config.py:1044 msgid "First Message Received" msgstr "Erste empfangene Nachricht" -#: ../src/config.py:1037 +#: ../src/config.py:1045 msgid "Next Message Received" msgstr "Nächste empfangene Nachricht" -#: ../src/config.py:1038 +#: ../src/config.py:1046 msgid "Contact Connected" msgstr "Kontakt verbunden" -#: ../src/config.py:1039 +#: ../src/config.py:1047 msgid "Contact Disconnected" msgstr "Kontakt nicht verbunden" -#: ../src/config.py:1040 +#: ../src/config.py:1048 msgid "Message Sent" msgstr "Nachricht gesendet" -#: ../src/config.py:1041 +#: ../src/config.py:1049 msgid "Group Chat Message Highlight" msgstr "Gruppenchat Nachrichten-Hervorhebung" -#: ../src/config.py:1042 +#: ../src/config.py:1050 msgid "Group Chat Message Received" msgstr "Gruppenchat-Nachricht empfangen" -#: ../src/config.py:1049 +#: ../src/config.py:1057 msgid "GMail Email Received" msgstr "E-Mail über Googlemail empfangen" -#: ../src/config.py:1252 +#: ../src/config.py:1260 msgid "OpenPGP is not usable in this computer" msgstr "OpenPGP kann auf diesem Computer nicht genutzt werden" -#: ../src/config.py:1298 +#: ../src/config.py:1306 msgid "You are currently connected to the server" msgstr "Sie sind mit dem Server verbunden" -#: ../src/config.py:1299 +#: ../src/config.py:1307 msgid "To change the account name, you must be disconnected." msgstr "Verbindung muss beendet werden, um Kontonamen zu ändern." -#: ../src/config.py:1302 ../src/config.py:1901 +#: ../src/config.py:1310 +#: ../src/config.py:1916 msgid "Unread events" msgstr "Ungelesene Ereignisse" -#: ../src/config.py:1303 +#: ../src/config.py:1311 msgid "To change the account name, you must read all pending events." msgstr "Um Kontonamen zu ändern, müssen Sie alle neunen Ereignisse lesen." -#: ../src/config.py:1307 +#: ../src/config.py:1315 msgid "Account Name Already Used" msgstr "Kontoname wird bereits verwendet" -#: ../src/config.py:1308 -msgid "" -"This name is already used by another of your accounts. Please choose another " -"name." -msgstr "" -"Dieser Name wird bereits für einen anderen Ihrer Accounts verwendet. Bitte " -"wählenSie einen anderen Namen." +#: ../src/config.py:1316 +msgid "This name is already used by another of your accounts. Please choose another name." +msgstr "Dieser Name wird bereits für einen anderen Ihrer Accounts verwendet. Bitte wählenSie einen anderen Namen." -#: ../src/config.py:1312 ../src/config.py:1316 +#: ../src/config.py:1320 +#: ../src/config.py:1324 msgid "Invalid account name" msgstr "Ungültiger Kontoname" -#: ../src/config.py:1313 +#: ../src/config.py:1321 msgid "Account name cannot be empty." msgstr "Kontoname darf nicht leer sein." -#: ../src/config.py:1317 +#: ../src/config.py:1325 msgid "Account name cannot contain spaces." msgstr "Kontoname darf keine Leerzeichen enthalten." -#: ../src/config.py:1325 ../src/config.py:1331 ../src/config.py:1341 -#: ../src/config.py:3004 +#: ../src/config.py:1333 +#: ../src/config.py:1339 +#: ../src/config.py:1349 +#: ../src/config.py:2900 msgid "Invalid Jabber ID" msgstr "Ungültige Jabber ID" -#: ../src/config.py:1332 +#: ../src/config.py:1340 msgid "A Jabber ID must be in the form \"user@servername\"." msgstr "Jabber ID muss in der Form \"user@servername\" sein." -#: ../src/config.py:1391 +#: ../src/config.py:1399 msgid "Invalid entry" msgstr "Ungültiger Eintrag" -#: ../src/config.py:1392 +#: ../src/config.py:1400 msgid "Custom port must be a port number." msgstr "Proxy Port muss eine Portnummer sein." -#: ../src/config.py:1520 ../src/common/config.py:366 +#: ../src/config.py:1528 +#: ../src/common/config.py:367 msgid "Be right back." msgstr "Bin gleich zurück." -#: ../src/config.py:1530 +#: ../src/config.py:1538 msgid "Relogin now?" msgstr "Jetzt neu einloggen?" -#: ../src/config.py:1531 +#: ../src/config.py:1539 msgid "If you want all the changes to apply instantly, you must relogin." -msgstr "" -"Wenn die Änderungen sofort übernommen werden sollen, müssen Sie sich neu " -"einloggen." +msgstr "Wenn die Änderungen sofort übernommen werden sollen, müssen Sie sich neu einloggen." -#: ../src/config.py:1557 +#: ../src/config.py:1565 msgid "No such account available" msgstr "Account nicht verfügbar" -#: ../src/config.py:1558 +#: ../src/config.py:1566 msgid "You must create your account before editing your personal information." -msgstr "" -"Sie müssen ein Konto erstellen, bevor Sie die persönlichen Informationen " -"ändern können" +msgstr "Sie müssen ein Konto erstellen, bevor Sie die persönlichen Informationen ändern können" -#: ../src/config.py:1565 ../src/dialogs.py:1130 ../src/dialogs.py:1316 -#: ../src/disco.py:419 ../src/profile_window.py:323 +#: ../src/config.py:1573 +#: ../src/dialogs.py:1190 +#: ../src/dialogs.py:1326 +#: ../src/dialogs.py:1506 +#: ../src/disco.py:419 +#: ../src/profile_window.py:323 msgid "You are not connected to the server" msgstr "Sie sind nicht mit dem Server verbunden" -#: ../src/config.py:1566 +#: ../src/config.py:1574 msgid "Without a connection, you can not edit your personal information." -msgstr "" -"Sie müssen angemeldet sein, um Ihre persönlichen Informationen zu bearbeiten" +msgstr "Sie müssen angemeldet sein, um Ihre persönlichen Informationen zu bearbeiten" -#: ../src/config.py:1570 +#: ../src/config.py:1578 msgid "Your server doesn't support Vcard" msgstr "Ihr Server unterstützt vCard nicht" -#: ../src/config.py:1571 +#: ../src/config.py:1579 msgid "Your server can't save your personal information." msgstr "Ihr Server kann keine persönlichen Informationen speichern." -#: ../src/config.py:1595 ../src/config.py:3392 +#: ../src/config.py:1610 +#: ../src/config.py:3288 msgid "Failed to get secret keys" msgstr "Holen der geheimen Schlüssel fehlgeschlagen" -#: ../src/config.py:1596 ../src/config.py:3393 +#: ../src/config.py:1611 +#: ../src/config.py:3289 msgid "There was a problem retrieving your OpenPGP secret keys." msgstr "Es gab ein Problem beim Holen ihres geheimen OpenPGP-Schlüssels." -#: ../src/config.py:1599 ../src/config.py:3396 +#: ../src/config.py:1614 +#: ../src/config.py:3292 msgid "OpenPGP Key Selection" msgstr "OpenPGP Schlüssel-Auswahl" -#: ../src/config.py:1600 ../src/config.py:3397 +#: ../src/config.py:1615 +#: ../src/config.py:3293 msgid "Choose your OpenPGP key" msgstr "Wählen Sie Ihren OpenPGP Schlüssel" #. Name column -#: ../src/config.py:1835 ../src/disco.py:740 ../src/disco.py:1495 -#: ../src/disco.py:1733 ../src/history_window.py:78 +#: ../src/config.py:1850 +#: ../src/dialogs.py:1338 +#: ../src/dialogs.py:1402 +#: ../src/disco.py:740 +#: ../src/disco.py:1495 +#: ../src/disco.py:1733 +#: ../src/history_window.py:78 msgid "Name" msgstr "Name" -#: ../src/config.py:1838 +#: ../src/config.py:1853 +#: ../src/dialogs.py:1341 msgid "Server" msgstr "Server" -#: ../src/config.py:1902 +#: ../src/config.py:1917 msgid "Read all pending events before removing this account." msgstr "Alle ungelesenen Ereignisse lesen, bevor der Account entfernt wird." -#: ../src/config.py:1939 +#: ../src/config.py:1954 #, python-format msgid "You have opened chat in account %s" msgstr "Sie haben mit Account %s einen Chat geöffnet" -#: ../src/config.py:1940 +#: ../src/config.py:1955 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "Alle Chatfenster werden geschlossen. Fortfahren?" -#: ../src/config.py:1999 +#: ../src/config.py:2014 msgid "Account Local already exists." msgstr "Ein Konto mit dem Namen 'Local' ist bereits vorhanden" -#: ../src/config.py:2000 +#: ../src/config.py:2015 msgid "Please rename or remove it before enabling link-local messaging." -msgstr "" -"Bitte benennen Sie es um oder entfernen es, bevor Sie LAN-Kontakte " -"aktivieren." +msgstr "Bitte benennen Sie es um oder entfernen es, bevor Sie LAN-Kontakte aktivieren." -#: ../src/config.py:2234 +#: ../src/config.py:2111 #, python-format msgid "Edit %s" msgstr "%s ändern" -#: ../src/config.py:2236 +#: ../src/config.py:2113 #, python-format msgid "Register to %s" msgstr "Auf %s registrieren" #. list at the beginning -#: ../src/config.py:2302 +#: ../src/config.py:2179 msgid "Ban List" msgstr "Sperrliste" -#: ../src/config.py:2303 +#: ../src/config.py:2180 msgid "Member List" msgstr "Mitgliedsliste" -#: ../src/config.py:2304 +#: ../src/config.py:2181 msgid "Owner List" msgstr "Listenbesitzer" -#: ../src/config.py:2305 +#: ../src/config.py:2182 msgid "Administrator List" msgstr "Administratorliste" #. Address column #. holds JID (who said this) -#: ../src/config.py:2338 ../src/disco.py:747 ../src/history_manager.py:155 +#: ../src/config.py:2231 +#: ../src/disco.py:747 +#: ../src/history_manager.py:155 msgid "JID" msgstr "JID" -#: ../src/config.py:2346 +#: ../src/config.py:2239 msgid "Reason" msgstr "Grund" -#: ../src/config.py:2351 +#: ../src/config.py:2244 msgid "Nick" msgstr "Spitzname" -#: ../src/config.py:2355 +#: ../src/config.py:2248 msgid "Role" msgstr "Rolle" -#: ../src/config.py:2376 +#: ../src/config.py:2273 msgid "Banning..." msgstr "Verbanne ..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2378 +#: ../src/config.py:2275 msgid "" "Whom do you want to ban?\n" "\n" @@ -2912,11 +2795,11 @@ msgstr "" "Wen möchten Sie verbannen?\n" "\n" -#: ../src/config.py:2380 +#: ../src/config.py:2277 msgid "Adding Member..." msgstr "Füge Mitglied hinzu ..." -#: ../src/config.py:2381 +#: ../src/config.py:2278 msgid "" "Whom do you want to make a member?\n" "\n" @@ -2924,11 +2807,11 @@ msgstr "" "Wen möchten Sie zum Mitglied machen?\n" "\n" -#: ../src/config.py:2383 +#: ../src/config.py:2280 msgid "Adding Owner..." msgstr "Füge Besitzer hinzu ..." -#: ../src/config.py:2384 +#: ../src/config.py:2281 msgid "" "Whom do you want to make an owner?\n" "\n" @@ -2936,11 +2819,11 @@ msgstr "" "Wen möchten Sie zum Besitzer machen?\n" "\n" -#: ../src/config.py:2386 +#: ../src/config.py:2283 msgid "Adding Administrator..." msgstr "Füge Administrator hinzu ..." -#: ../src/config.py:2387 +#: ../src/config.py:2284 msgid "" "Whom do you want to make an administrator?\n" "\n" @@ -2948,7 +2831,7 @@ msgstr "" "Wen möchten Sie zum Administrator machen?\n" "\n" -#: ../src/config.py:2388 +#: ../src/config.py:2285 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" @@ -2957,185 +2840,179 @@ msgid "" "4. domain (the domain itself matches, as does any user@domain,\n" "domain/resource, or address containing a subdomain." msgstr "" -"Kann eines der folgenden sein:\"1. benutzer@domain/resource (nur die " -"Resource trifft zu).\n" +"Kann eines der folgenden sein:\"1. benutzer@domain/resource (nur die Resource trifft zu).\n" "2. benutzer@domain (jede Resource trifft zu).\n" "3 domain (die Domain selbst trifft zu, als auch jeder benutzer@domain,\n" "jede domain/resource oder Adresse, die eine Subdomain enthält." -#: ../src/config.py:2493 +#: ../src/config.py:2389 #, python-format msgid "Removing %s account" msgstr "Entferne Konto %s" -#: ../src/config.py:2510 ../src/roster_window.py:2733 +#: ../src/config.py:2406 +#: ../src/roster_window.py:2737 msgid "Password Required" msgstr "Passwort benötigt" -#: ../src/config.py:2511 ../src/roster_window.py:2729 +#: ../src/config.py:2407 +#: ../src/roster_window.py:2733 #, python-format msgid "Enter your password for account %s" msgstr "Geben Sie ihr Passwort für %s ein" -#: ../src/config.py:2512 ../src/roster_window.py:2734 +#: ../src/config.py:2408 +#: ../src/roster_window.py:2738 msgid "Save password" msgstr "Passwort speichern" -#: ../src/config.py:2526 +#: ../src/config.py:2422 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Konto \"%s\" ist mit Server verbunden" -#: ../src/config.py:2527 +#: ../src/config.py:2423 msgid "If you remove it, the connection will be lost." msgstr "Wenn Sie es entfernen, wird die Verbindung beendet." -#: ../src/config.py:2612 +#: ../src/config.py:2508 msgid "Default" msgstr "Standard" -#: ../src/config.py:2612 +#: ../src/config.py:2508 msgid "?print_status:All" msgstr "?print_status:Alle" -#: ../src/config.py:2613 +#: ../src/config.py:2509 msgid "Enter and leave only" msgstr "Nur betreten und verlassen" -#: ../src/config.py:2614 +#: ../src/config.py:2510 msgid "?print_status:None" msgstr "?print_status:Nichts" -#: ../src/config.py:2682 +#: ../src/config.py:2578 msgid "New Group Chat" msgstr "Neuer Gruppenchat" -#: ../src/config.py:2715 +#: ../src/config.py:2611 msgid "This bookmark has invalid data" msgstr "Dieses Lesezeichen hat ungültige Daten" -#: ../src/config.py:2716 -msgid "" -"Please be sure to fill out server and room fields or remove this bookmark." +#: ../src/config.py:2612 +msgid "Please be sure to fill out server and room fields or remove this bookmark." msgstr "Bitte Serverfeld und Raumfeld ausfüllen oder Lesezeichen löschen." -#: ../src/config.py:2979 +#: ../src/config.py:2875 msgid "Invalid username" msgstr "Ungültiger Benutzername" -#: ../src/config.py:2980 +#: ../src/config.py:2876 msgid "You must provide a username to configure this account." -msgstr "" -"Sie müssen einen Benutzernamen angeben, um diesen Account zu konfigurieren." +msgstr "Sie müssen einen Benutzernamen angeben, um diesen Account zu konfigurieren." -#: ../src/config.py:2990 ../src/dialogs.py:1335 +#: ../src/config.py:2886 +#: ../src/dialogs.py:1525 msgid "Invalid password" msgstr "Ungültiges Passwort" -#: ../src/config.py:2991 +#: ../src/config.py:2887 msgid "You must enter a password for the new account." msgstr "Sie müssen ein Passwort für das neue Konto eingeben." -#: ../src/config.py:2995 ../src/dialogs.py:1340 +#: ../src/config.py:2891 +#: ../src/dialogs.py:1530 msgid "Passwords do not match" msgstr "Passwörter stimmen nicht überein" -#: ../src/config.py:2996 ../src/dialogs.py:1341 +#: ../src/config.py:2892 +#: ../src/dialogs.py:1531 msgid "The passwords typed in both fields must be identical." msgstr "Die Passwörter in beiden Feldern müssen identisch sein." -#: ../src/config.py:3015 +#: ../src/config.py:2911 msgid "Duplicate Jabber ID" msgstr "Doppelte Jabber ID" -#: ../src/config.py:3016 +#: ../src/config.py:2912 msgid "This account is already configured in Gajim." msgstr "Dieser Kontakt bwurde in Gajim bereits konfiguriert." -#: ../src/config.py:3033 +#: ../src/config.py:2929 msgid "Account has been added successfully" msgstr "Account wurde erfolgreich hinzugefügt" -#: ../src/config.py:3034 ../src/config.py:3069 -msgid "" -"You can set advanced account options by pressing the Advanced button, or " -"later by choosing the Accounts menuitem under the Edit menu from the main " -"window." -msgstr "" -"Sie können die erweiterten Kontooptionen durch Klicken des Erweitert-Buttons " -"oder durch Klicken des Konto-Menüpunktes im Bearbeiten-Menü des " -"Hauptfensters erreichen." +#: ../src/config.py:2930 +#: ../src/config.py:2965 +msgid "You can set advanced account options by pressing the Advanced button, or later by choosing the Accounts menuitem under the Edit menu from the main window." +msgstr "Sie können die erweiterten Kontooptionen durch Klicken des Erweitert-Buttons oder durch Klicken des Konto-Menüpunktes im Bearbeiten-Menü des Hauptfensters erreichen." -#: ../src/config.py:3068 +#: ../src/config.py:2964 msgid "Your new account has been created successfully" msgstr "Ihr neues Konto wurde erfolgreich erstellt" -#: ../src/config.py:3086 +#: ../src/config.py:2982 msgid "An error occurred during account creation" msgstr "Während der Konto-Erstellung ist ein Fehler aufgetreten" -#: ../src/config.py:3144 +#: ../src/config.py:3040 msgid "Account name is in use" msgstr "Kontoname ist schon vergeben" -#: ../src/config.py:3145 +#: ../src/config.py:3041 msgid "You already have an account using this name." msgstr "Sie haben bereits ein Konto mit diesem Namen." -#: ../src/conversation_textview.py:273 -msgid "" -"Text below this line is what has been said since the last time you paid " -"attention to this group chat" -msgstr "" -"Text unterhalb dieser Linie stellt dar, was seit ihrem letzten Besuch in " -"diesem Gruppenchat gesagt wurde" +#: ../src/conversation_textview.py:275 +msgid "Text below this line is what has been said since the last time you paid attention to this group chat" +msgstr "Text unterhalb dieser Linie stellt dar, was seit ihrem letzten Besuch in diesem Gruppenchat gesagt wurde" -#: ../src/conversation_textview.py:342 +#: ../src/conversation_textview.py:344 #, python-format msgid "_Actions for \"%s\"" msgstr "_Aktionen für \"%s\"" -#: ../src/conversation_textview.py:354 +#: ../src/conversation_textview.py:356 msgid "Read _Wikipedia Article" msgstr "_Wikipedia-Artikel lesen" -#: ../src/conversation_textview.py:359 +#: ../src/conversation_textview.py:361 msgid "Look it up in _Dictionary" msgstr "Im Wörterbuch _suchen" #. we must have %s in the url if not WIKTIONARY -#: ../src/conversation_textview.py:375 +#: ../src/conversation_textview.py:377 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "In Wörterbuch URL fehlt ein \"%s\" und ist nicht Wiktionary" #. we must have %s in the url -#: ../src/conversation_textview.py:388 +#: ../src/conversation_textview.py:390 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "In Websuche URL fehlt ein \"%s\"" -#: ../src/conversation_textview.py:391 +#: ../src/conversation_textview.py:393 msgid "Web _Search for it" msgstr "Im _Internet suchen" -#: ../src/conversation_textview.py:397 +#: ../src/conversation_textview.py:399 msgid "Open as _Link" msgstr "Als _Link öffnen" -#: ../src/conversation_textview.py:754 +#: ../src/conversation_textview.py:760 msgid "Yesterday" msgstr "Gestern" #. the number is >= 2 #. %i is day in year (1-365), %d (1-31) we want %i -#: ../src/conversation_textview.py:758 +#: ../src/conversation_textview.py:764 #, python-format msgid "%i days ago" msgstr "Vor %i Tagen" #. if we have subject, show it too! -#: ../src/conversation_textview.py:792 +#: ../src/conversation_textview.py:798 #, python-format msgid "Subject: %s\n" msgstr "Thema: %s\n" @@ -3206,15 +3083,14 @@ msgstr "Yahoo!-Adresse" #: ../src/dialogs.py:457 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" -msgstr "" -"Bitte füllen Sie die Daten für den Kontakt aus, den Sie dem Konto %s " -"hinzufügen wollen" +msgstr "Bitte füllen Sie die Daten für den Kontakt aus, den Sie dem Konto %s hinzufügen wollen" #: ../src/dialogs.py:459 msgid "Please fill in the data of the contact you want to add" msgstr "Bitte geben sie die Daten des neuen Kontakts ein" -#: ../src/dialogs.py:609 ../src/dialogs.py:615 +#: ../src/dialogs.py:609 +#: ../src/dialogs.py:615 msgid "Invalid User ID" msgstr "Ungültige Benutzer ID" @@ -3277,62 +3153,84 @@ msgid "Unable to bind to port %s." msgstr "Konnte nicht mit Port %s verbinden." #: ../src/dialogs.py:909 -msgid "" -"Maybe you have another running instance of Gajim. File Transfer will be " -"cancelled." +msgid "Maybe you have another running instance of Gajim. File Transfer will be cancelled." msgstr "Möglicherweise läuft Gajim bereits. Dateitransfer wird abgebrochen." -#: ../src/dialogs.py:1060 +#: ../src/dialogs.py:1120 #, python-format msgid "Subscription request for account %s from %s" msgstr "Abonnement-Anforderung für Konto %s von %s" -#: ../src/dialogs.py:1063 +#: ../src/dialogs.py:1123 #, python-format msgid "Subscription request from %s" msgstr "Abonnement-Anforderung von %s" -#: ../src/dialogs.py:1123 ../src/roster_window.py:687 +#: ../src/dialogs.py:1183 +#: ../src/roster_window.py:687 #, python-format msgid "You are already in group chat %s" msgstr "Sie sind bereits im Gruppenchat %s" -#: ../src/dialogs.py:1131 +#: ../src/dialogs.py:1191 msgid "You can not join a group chat unless you are connected." msgstr "Sie können einem Gruppenchat erst beitreten, wenn Sie verbunden sind." -#: ../src/dialogs.py:1146 +#: ../src/dialogs.py:1206 #, python-format msgid "Join Group Chat with account %s" msgstr "Betrete Gruppenchat mit Account %s" -#: ../src/dialogs.py:1214 ../src/dialogs.py:1220 +#: ../src/dialogs.py:1274 +#: ../src/dialogs.py:1280 +#: ../src/groupchat_control.py:1469 msgid "Invalid group chat Jabber ID" msgstr "Ungültige Jabber-ID für den Gruppenchat" -#: ../src/dialogs.py:1215 ../src/dialogs.py:1221 +#: ../src/dialogs.py:1275 +#: ../src/dialogs.py:1281 +#: ../src/groupchat_control.py:1470 msgid "The group chat Jabber ID has not allowed characters." msgstr "Die Jabber-ID für den Gruppenchat enthält nicht erlaubte Zeichen." -#: ../src/dialogs.py:1227 +#: ../src/dialogs.py:1287 msgid "This is not a group chat" msgstr "Das ist kein Gruppenchat" -#: ../src/dialogs.py:1228 +#: ../src/dialogs.py:1288 #, python-format msgid "%s is not the name of a group chat." msgstr "%s ist kein Name eines Gruppenchats." -#: ../src/dialogs.py:1267 +#: ../src/dialogs.py:1327 +#, fuzzy +msgid "Without a connection, you can not synchronise your contacts." +msgstr "Sie müssen verbunden sein, um Ihr Passwort zu ändern" + +#: ../src/dialogs.py:1374 +#, fuzzy +msgid "This account is not connected to the server" +msgstr "Konto \"%s\" ist mit Server verbunden" + +#: ../src/dialogs.py:1375 +#, fuzzy +msgid "You cannot synchronize with an account unless it is connected." +msgstr "Sie können einem Gruppenchat erst beitreten, wenn Sie verbunden sind." + +#: ../src/dialogs.py:1399 +msgid "Synchronise" +msgstr "" + +#: ../src/dialogs.py:1457 #, python-format msgid "Start Chat with account %s" msgstr "Starte Chat mit Account %s" -#: ../src/dialogs.py:1269 +#: ../src/dialogs.py:1459 msgid "Start Chat" msgstr "Chat starten" -#: ../src/dialogs.py:1270 +#: ../src/dialogs.py:1460 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" @@ -3341,231 +3239,261 @@ msgstr "" "an den Sie eine Chat-Nachricht schicken wollen:" #. if offline or connecting -#: ../src/dialogs.py:1295 ../src/dialogs.py:1654 ../src/dialogs.py:1785 +#: ../src/dialogs.py:1485 +#: ../src/dialogs.py:1844 +#: ../src/dialogs.py:1975 msgid "Connection not available" msgstr "Verbindung nicht verfügbar" -#: ../src/dialogs.py:1296 ../src/dialogs.py:1655 ../src/dialogs.py:1786 +#: ../src/dialogs.py:1486 +#: ../src/dialogs.py:1845 +#: ../src/dialogs.py:1976 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Vergewissern Sie sich, dass Sie mit \"%s\" verbunden sind." -#: ../src/dialogs.py:1305 ../src/dialogs.py:1308 +#: ../src/dialogs.py:1495 +#: ../src/dialogs.py:1498 msgid "Invalid JID" msgstr "Ungültige JID" -#: ../src/dialogs.py:1308 +#: ../src/dialogs.py:1498 #, python-format msgid "Unable to parse \"%s\"." msgstr "Kann \"%s\" nicht parsen." -#: ../src/dialogs.py:1317 +#: ../src/dialogs.py:1507 msgid "Without a connection, you can not change your password." msgstr "Sie müssen verbunden sein, um Ihr Passwort zu ändern" -#: ../src/dialogs.py:1336 +#: ../src/dialogs.py:1526 msgid "You must enter a password." msgstr "Sie müssen ein Passwort eingeben." #. img to display #. default value -#: ../src/dialogs.py:1383 ../src/notify.py:212 ../src/notify.py:416 +#: ../src/dialogs.py:1573 +#: ../src/notify.py:212 +#: ../src/notify.py:416 msgid "Contact Signed In" msgstr "Kontakt hat sich angemeldet" -#: ../src/dialogs.py:1385 ../src/notify.py:220 ../src/notify.py:418 +#: ../src/dialogs.py:1575 +#: ../src/notify.py:220 +#: ../src/notify.py:418 msgid "Contact Signed Out" msgstr "Kontakt hat sich abgemeldet" #. chat message -#: ../src/dialogs.py:1387 ../src/notify.py:239 ../src/notify.py:420 +#: ../src/dialogs.py:1577 +#: ../src/notify.py:239 +#: ../src/notify.py:420 msgid "New Message" msgstr "Neue Nachricht" #. single message -#: ../src/dialogs.py:1387 ../src/notify.py:224 ../src/notify.py:420 +#: ../src/dialogs.py:1577 +#: ../src/notify.py:224 +#: ../src/notify.py:420 msgid "New Single Message" msgstr "Neue einzelne Nachricht" #. private message -#: ../src/dialogs.py:1388 ../src/notify.py:231 ../src/notify.py:421 +#: ../src/dialogs.py:1578 +#: ../src/notify.py:231 +#: ../src/notify.py:421 msgid "New Private Message" msgstr "Neue private Nachricht" -#: ../src/dialogs.py:1388 ../src/gajim.py:1285 ../src/notify.py:429 +#: ../src/dialogs.py:1578 +#: ../src/gajim.py:1291 +#: ../src/notify.py:429 msgid "New E-mail" msgstr "Neue E-Mail" -#: ../src/dialogs.py:1390 ../src/gajim.py:1438 ../src/notify.py:423 +#: ../src/dialogs.py:1580 +#: ../src/gajim.py:1444 +#: ../src/notify.py:423 msgid "File Transfer Request" msgstr "Dateitransfer Anfrage" -#: ../src/dialogs.py:1392 ../src/gajim.py:1257 ../src/gajim.py:1414 +#: ../src/dialogs.py:1582 +#: ../src/gajim.py:1263 +#: ../src/gajim.py:1420 #: ../src/notify.py:425 msgid "File Transfer Error" msgstr "Dateitransfer-Fehler" -#: ../src/dialogs.py:1394 ../src/gajim.py:1477 ../src/gajim.py:1499 -#: ../src/gajim.py:1516 ../src/notify.py:427 +#: ../src/dialogs.py:1584 +#: ../src/gajim.py:1483 +#: ../src/gajim.py:1505 +#: ../src/gajim.py:1522 +#: ../src/notify.py:427 msgid "File Transfer Completed" msgstr "Dateitransfer beendet" -#: ../src/dialogs.py:1395 ../src/gajim.py:1480 ../src/notify.py:427 +#: ../src/dialogs.py:1585 +#: ../src/gajim.py:1486 +#: ../src/notify.py:427 msgid "File Transfer Stopped" msgstr "Dateitransfer gestoppt" -#: ../src/dialogs.py:1397 ../src/gajim.py:1154 ../src/notify.py:431 +#: ../src/dialogs.py:1587 +#: ../src/gajim.py:1160 +#: ../src/notify.py:431 msgid "Groupchat Invitation" msgstr "Gruppenchat-Einladung" -#: ../src/dialogs.py:1399 ../src/notify.py:204 ../src/notify.py:433 +#: ../src/dialogs.py:1589 +#: ../src/notify.py:204 +#: ../src/notify.py:433 msgid "Contact Changed Status" msgstr "Kontakt hat Status verändert" -#: ../src/dialogs.py:1584 +#: ../src/dialogs.py:1774 #, python-format msgid "Single Message using account %s" msgstr "Einzelne Nachricht mit Account %s" -#: ../src/dialogs.py:1586 +#: ../src/dialogs.py:1776 #, python-format msgid "Single Message in account %s" msgstr "Einzelne Nachricht in Account %s" -#: ../src/dialogs.py:1588 +#: ../src/dialogs.py:1778 msgid "Single Message" msgstr "Einzelne Nachricht" #. prepare UI for Sending -#: ../src/dialogs.py:1591 +#: ../src/dialogs.py:1781 #, python-format msgid "Send %s" msgstr "Sende %s" #. prepare UI for Receiving -#: ../src/dialogs.py:1614 +#: ../src/dialogs.py:1804 #, python-format msgid "Received %s" msgstr "%s empfangen" #. we create a new blank window to send and we preset RE: and to jid -#: ../src/dialogs.py:1686 +#: ../src/dialogs.py:1876 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:1687 +#: ../src/dialogs.py:1877 #, python-format msgid "%s wrote:\n" msgstr "%s schrieb:\n" -#: ../src/dialogs.py:1731 +#: ../src/dialogs.py:1921 #, python-format msgid "XML Console for %s" msgstr "XML Konsole für %s" -#: ../src/dialogs.py:1733 +#: ../src/dialogs.py:1923 msgid "XML Console" msgstr "XML Konsole" -#: ../src/dialogs.py:1856 +#: ../src/dialogs.py:2046 #, python-format msgid "Privacy List %s" msgstr "Privatliste %s" -#: ../src/dialogs.py:1860 +#: ../src/dialogs.py:2050 #, python-format msgid "Privacy List for %s" msgstr "Privatsphären-Liste für %s" -#: ../src/dialogs.py:1908 +#: ../src/dialogs.py:2098 #, python-format msgid "Order: %s, action: %s, type: %s, value: %s" msgstr "Sortierung: %s, Aktion: %s, Typ: %s, Wert: %s" -#: ../src/dialogs.py:1911 +#: ../src/dialogs.py:2101 #, python-format msgid "Order: %s, action: %s" msgstr "Sortierung: %s, Aktion: %s" -#: ../src/dialogs.py:1953 +#: ../src/dialogs.py:2143 msgid "Edit a rule" msgstr "Eine Regel bearbeiten" -#: ../src/dialogs.py:2040 +#: ../src/dialogs.py:2230 msgid "Add a rule" msgstr "Eine Regel hinzufügen" -#: ../src/dialogs.py:2136 +#: ../src/dialogs.py:2326 #, python-format msgid "Privacy Lists for %s" msgstr "Privatliste für %s" -#: ../src/dialogs.py:2138 +#: ../src/dialogs.py:2328 msgid "Privacy Lists" msgstr "Privatlisten" -#: ../src/dialogs.py:2208 +#: ../src/dialogs.py:2398 msgid "Invalid List Name" msgstr "Ungültiger Listenname" -#: ../src/dialogs.py:2209 +#: ../src/dialogs.py:2399 msgid "You must enter a name to create a privacy list." -msgstr "" -"Sie müssen einen Namen eingeben um eine Privatsphären-Liste zu erstellen." +msgstr "Sie müssen einen Namen eingeben um eine Privatsphären-Liste zu erstellen." #. Don't translate $Contact -#: ../src/dialogs.py:2243 +#: ../src/dialogs.py:2433 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact hat Sie in den Gruppenchat %(room_jid)s eingeladen" #. only if not None and not '' -#: ../src/dialogs.py:2255 +#: ../src/dialogs.py:2445 #, python-format msgid "Comment: %s" msgstr "Kommentar: %s" -#: ../src/dialogs.py:2317 +#: ../src/dialogs.py:2507 msgid "Choose Sound" msgstr "Sound wählen" -#: ../src/dialogs.py:2327 ../src/dialogs.py:2372 +#: ../src/dialogs.py:2517 +#: ../src/dialogs.py:2562 msgid "All files" msgstr "Alle Dateien" -#: ../src/dialogs.py:2332 +#: ../src/dialogs.py:2522 msgid "Wav Sounds" msgstr "Wav Dateien" -#: ../src/dialogs.py:2362 +#: ../src/dialogs.py:2552 msgid "Choose Image" msgstr "Bild auswählen" -#: ../src/dialogs.py:2377 +#: ../src/dialogs.py:2567 msgid "Images" msgstr "Bilder" -#: ../src/dialogs.py:2434 +#: ../src/dialogs.py:2624 #, python-format msgid "When %s becomes:" msgstr "Wenn %s wird:" -#: ../src/dialogs.py:2436 +#: ../src/dialogs.py:2626 #, python-format msgid "Adding Special Notification for %s" msgstr "Füge speziellen Hinweis für %s hinzu" #. # means number -#: ../src/dialogs.py:2507 +#: ../src/dialogs.py:2697 msgid "#" msgstr "Nr." -#: ../src/dialogs.py:2513 +#: ../src/dialogs.py:2703 msgid "Condition" msgstr "Bedingung" -#: ../src/dialogs.py:2634 +#: ../src/dialogs.py:2824 msgid "when I am " msgstr "wenn Ich bin " @@ -3573,12 +3501,20 @@ msgstr "wenn Ich bin " msgid "Others" msgstr "Andere" -#: ../src/disco.py:104 ../src/disco.py:105 ../src/disco.py:1281 -#: ../src/gajim.py:599 ../src/roster_window.py:271 ../src/roster_window.py:329 -#: ../src/roster_window.py:368 ../src/roster_window.py:451 -#: ../src/roster_window.py:483 ../src/roster_window.py:485 -#: ../src/roster_window.py:3896 ../src/roster_window.py:3898 -#: ../src/common/contacts.py:267 ../src/common/contacts.py:282 +#: ../src/disco.py:104 +#: ../src/disco.py:105 +#: ../src/disco.py:1281 +#: ../src/gajim.py:604 +#: ../src/roster_window.py:272 +#: ../src/roster_window.py:330 +#: ../src/roster_window.py:369 +#: ../src/roster_window.py:451 +#: ../src/roster_window.py:483 +#: ../src/roster_window.py:485 +#: ../src/roster_window.py:3912 +#: ../src/roster_window.py:3914 +#: ../src/common/contacts.py:267 +#: ../src/common/contacts.py:282 #: ../src/common/helpers.py:43 msgid "Transports" msgstr "Transports" @@ -3606,21 +3542,17 @@ msgid "The service could not be found" msgstr "Der Dienst konnte nicht gefunden werden" #: ../src/disco.py:642 -msgid "" -"There is no service at the address you entered, or it is not responding. " -"Check the address and try again." -msgstr "" -"Es existiert kein Dienst an der Adresse, die sie angegeben haben oder er " -"antwortet nicht. Überprüfen Sie die Adresse und versuchen Sie es erneut." +msgid "There is no service at the address you entered, or it is not responding. Check the address and try again." +msgstr "Es existiert kein Dienst an der Adresse, die sie angegeben haben oder er antwortet nicht. Überprüfen Sie die Adresse und versuchen Sie es erneut." -#: ../src/disco.py:646 ../src/disco.py:927 +#: ../src/disco.py:646 +#: ../src/disco.py:927 msgid "The service is not browsable" msgstr "Der Dienst ist nicht durchsuchbar" #: ../src/disco.py:647 msgid "This type of service does not contain any items to browse." -msgstr "" -"Dieser Art von Dienst enthält keine Objekte, di edurchsucht werden können." +msgstr "Dieser Art von Dienst enthält keine Objekte, di edurchsucht werden können." #: ../src/disco.py:727 #, python-format @@ -3635,7 +3567,8 @@ msgstr "_Durchsuche" msgid "This service does not contain any items to browse." msgstr "Dieser Dienst enthält keine keine durchsuchbaren Objekte." -#: ../src/disco.py:1155 ../src/disco.py:1286 +#: ../src/disco.py:1155 +#: ../src/disco.py:1286 msgid "Re_gister" msgstr "Re_gistrieren" @@ -3687,136 +3620,142 @@ msgstr "Zeit" msgid "Progress" msgstr "Fortschritt" -#: ../src/filetransfers_window.py:163 ../src/filetransfers_window.py:223 +#: ../src/filetransfers_window.py:161 +#: ../src/filetransfers_window.py:215 #, python-format msgid "Filename: %s" msgstr "Dateiname: %s" -#: ../src/filetransfers_window.py:164 ../src/filetransfers_window.py:298 +#: ../src/filetransfers_window.py:162 +#: ../src/filetransfers_window.py:290 #, python-format msgid "Size: %s" msgstr "Größe: %s" #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:183 +#: ../src/filetransfers_window.py:171 +#: ../src/filetransfers_window.py:181 #: ../src/history_manager.py:463 msgid "You" msgstr "Sie" -#: ../src/filetransfers_window.py:174 +#: ../src/filetransfers_window.py:172 #, python-format msgid "Sender: %s" msgstr "Gespeichert in: %s" -#: ../src/filetransfers_window.py:175 ../src/filetransfers_window.py:572 +#: ../src/filetransfers_window.py:173 +#: ../src/filetransfers_window.py:564 #: ../src/tooltips.py:573 msgid "Recipient: " msgstr "Empfänger: " -#: ../src/filetransfers_window.py:186 +#: ../src/filetransfers_window.py:184 #, python-format msgid "Saved in: %s" msgstr "Absender: %s" -#: ../src/filetransfers_window.py:188 +#: ../src/filetransfers_window.py:186 msgid "File transfer completed" msgstr "Dateitransfer abgeschlossen" -#: ../src/filetransfers_window.py:204 ../src/filetransfers_window.py:212 +#: ../src/filetransfers_window.py:200 +#: ../src/filetransfers_window.py:206 msgid "File transfer cancelled" msgstr "Dateitransfer abgebrochen" -#: ../src/filetransfers_window.py:204 ../src/filetransfers_window.py:213 +#: ../src/filetransfers_window.py:200 +#: ../src/filetransfers_window.py:207 msgid "Connection with peer cannot be established." msgstr "Verbindung zum Teilnehmer kann nicht hergestellt werden" -#: ../src/filetransfers_window.py:224 +#: ../src/filetransfers_window.py:216 #, python-format msgid "Recipient: %s" msgstr "Empfänger: %s" -#: ../src/filetransfers_window.py:226 +#: ../src/filetransfers_window.py:218 #, python-format msgid "Error message: %s" msgstr "Fehlermeldung: %s" -#: ../src/filetransfers_window.py:227 +#: ../src/filetransfers_window.py:219 msgid "File transfer stopped by the contact at the other end" msgstr "Gegenseite hat Dateitransfer gestoppt" -#: ../src/filetransfers_window.py:244 +#: ../src/filetransfers_window.py:236 msgid "Choose File to Send..." msgstr "Datei auswählen ..." -#: ../src/filetransfers_window.py:263 +#: ../src/filetransfers_window.py:255 msgid "Gajim cannot access this file" msgstr "Gajim kann auf diese Datei nicht zugreifen" -#: ../src/filetransfers_window.py:264 +#: ../src/filetransfers_window.py:256 msgid "This file is being used by another process." msgstr "Diese Datei wird von einem anderen Prozess verwendet." -#: ../src/filetransfers_window.py:296 +#: ../src/filetransfers_window.py:288 #, python-format msgid "File: %s" msgstr "Datei: %s" -#: ../src/filetransfers_window.py:301 +#: ../src/filetransfers_window.py:293 #, python-format msgid "Type: %s" msgstr "Typ: %s" -#: ../src/filetransfers_window.py:303 +#: ../src/filetransfers_window.py:295 #, python-format msgid "Description: %s" msgstr "Beschreibung: %s" -#: ../src/filetransfers_window.py:304 +#: ../src/filetransfers_window.py:296 #, python-format msgid "%s wants to send you a file:" msgstr "%s möchte ihnen eine Datei senden:" -#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:748 +#: ../src/filetransfers_window.py:310 +#: ../src/gtkgui_helpers.py:750 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Kann existierende Datei \"%s\" nicht überschreiben" -#: ../src/filetransfers_window.py:319 ../src/gtkgui_helpers.py:750 -msgid "" -"A file with this name already exists and you do not have permission to " -"overwrite it." -msgstr "" -"Eine Datei mit diesem Namen existiert bereits und Sie haben nicht die Rechte " -"sie zu überschreiben." +#: ../src/filetransfers_window.py:311 +#: ../src/gtkgui_helpers.py:752 +msgid "A file with this name already exists and you do not have permission to overwrite it." +msgstr "Eine Datei mit diesem Namen existiert bereits und Sie haben nicht die Rechte sie zu überschreiben." -#: ../src/filetransfers_window.py:326 ../src/gtkgui_helpers.py:754 +#: ../src/filetransfers_window.py:318 +#: ../src/gtkgui_helpers.py:756 msgid "This file already exists" msgstr "Diese Datei existiert bereits" -#: ../src/filetransfers_window.py:326 ../src/gtkgui_helpers.py:754 +#: ../src/filetransfers_window.py:318 +#: ../src/gtkgui_helpers.py:756 msgid "What do you want to do?" msgstr "Was möchten Sie tun?" -#: ../src/filetransfers_window.py:338 ../src/gtkgui_helpers.py:764 +#: ../src/filetransfers_window.py:330 +#: ../src/gtkgui_helpers.py:766 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Verzeichnis \"%s\" ist nicht schreibbar" -#: ../src/filetransfers_window.py:338 ../src/gtkgui_helpers.py:765 +#: ../src/filetransfers_window.py:330 +#: ../src/gtkgui_helpers.py:767 msgid "You do not have permission to create files in this directory." -msgstr "" -"Ihre Benutzerrechte erlauben es Ihnen nicht, in diesem Verzeichnis Dateien " -"anzulegen." +msgstr "Ihre Benutzerrechte erlauben es Ihnen nicht, in diesem Verzeichnis Dateien anzulegen." -#: ../src/filetransfers_window.py:348 +#: ../src/filetransfers_window.py:340 msgid "Save File as..." msgstr "Datei speichern unter ..." #. 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:429 +#: ../src/filetransfers_window.py:421 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -3824,32 +3763,35 @@ 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:505 +#: ../src/filetransfers_window.py:497 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" -#: ../src/filetransfers_window.py:544 ../src/filetransfers_window.py:547 +#: ../src/filetransfers_window.py:536 +#: ../src/filetransfers_window.py:539 msgid "Invalid File" msgstr "Ungültige Datei" -#: ../src/filetransfers_window.py:544 +#: ../src/filetransfers_window.py:536 msgid "File: " msgstr "Datei: " -#: ../src/filetransfers_window.py:548 +#: ../src/filetransfers_window.py:540 msgid "It is not possible to send empty files" msgstr "Es nicht möglich, leere Dateien zu versenden" -#: ../src/filetransfers_window.py:568 ../src/tooltips.py:563 +#: ../src/filetransfers_window.py:560 +#: ../src/tooltips.py:563 msgid "Name: " msgstr "Name: " -#: ../src/filetransfers_window.py:570 ../src/tooltips.py:567 +#: ../src/filetransfers_window.py:562 +#: ../src/tooltips.py:567 msgid "Sender: " msgstr "Absender: " -#: ../src/filetransfers_window.py:758 +#: ../src/filetransfers_window.py:750 msgid "Pause" msgstr "Pause" @@ -3884,19 +3826,12 @@ msgstr "GTK+ runtine fehlt libglade-Unterstützung" #: ../src/gajim.py:137 #, python-format -msgid "" -"Please remove your current GTK+ runtime and install the latest stable " -"version from %s" -msgstr "" -"Bitte entfernen Sie Ihre derzeitige GTK+ Laufzeitumgebung und installieren " -"Sie die aktuelle Version von %s" +msgid "Please remove your current GTK+ runtime and install the latest stable version from %s" +msgstr "Bitte entfernen Sie Ihre derzeitige GTK+ Laufzeitumgebung und installieren Sie die aktuelle Version von %s" #: ../src/gajim.py:139 -msgid "" -"Please make sure that GTK+ and PyGTK have libglade support in your system." -msgstr "" -"Bitte stellen Sie sicher, dass GTK+ und PyGTK auf Ihrem System libglade-" -"Unterstützung besitzen." +msgid "Please make sure that GTK+ and PyGTK have libglade support in your system." +msgstr "Bitte stellen Sie sicher, dass GTK+ und PyGTK auf Ihrem System libglade-Unterstützung besitzen." #: ../src/gajim.py:144 msgid "Gajim needs PySQLite2 to run" @@ -3908,19 +3843,15 @@ msgstr "Gajim benötigt pywin32 zum Laufen" #: ../src/gajim.py:153 #, python-format -msgid "" -"Please make sure that Pywin32 is installed on your system. You can get it at " -"%s" -msgstr "" -"Bitte stellen Sie sicher das Pywin32 auf Ihrem System installiert ist. Sie " -"können es unter folgender URL herunterladen: %s " +msgid "Please make sure that Pywin32 is installed on your system. You can get it at %s" +msgstr "Bitte stellen Sie sicher das Pywin32 auf Ihrem System installiert ist. Sie können es unter folgender URL herunterladen: %s " #. set the icon to all newly opened wind -#: ../src/gajim.py:296 +#: ../src/gajim.py:300 msgid "Gajim is already running" msgstr "Gajim läuft bereits" -#: ../src/gajim.py:297 +#: ../src/gajim.py:301 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -3928,84 +3859,88 @@ msgstr "" "Eine andere Instanz von Gajim schein bereits zu laufen\n" "Trotzdem starten?" -#: ../src/gajim.py:403 +#: ../src/gajim.py:408 #, python-format msgid "HTTP (%s) Authorization for %s (id: %s)" msgstr "HTTP (%s) Autorisierung für %s (id: %s)" -#: ../src/gajim.py:404 +#: ../src/gajim.py:409 msgid "Do you accept this request?" msgstr "Akzeptieren Sie diese Anfrage?" -#: ../src/gajim.py:450 ../src/notify.py:435 +#: ../src/gajim.py:455 +#: ../src/notify.py:435 msgid "Connection Failed" msgstr "Verbindung fehlgeschlagen" -#: ../src/gajim.py:770 +#: ../src/gajim.py:775 #, python-format msgid "Subject: %s" msgstr "Thema: %s" #. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) -#: ../src/gajim.py:815 ../src/gajim.py:828 +#: ../src/gajim.py:820 +#: ../src/gajim.py:833 #, python-format msgid "error while sending %s ( %s )" msgstr "Fehler beim Senden von %s ( %s )" -#: ../src/gajim.py:861 +#: ../src/gajim.py:866 msgid "Authorization accepted" msgstr "Autorisierung akzeptiert" -#: ../src/gajim.py:862 +#: ../src/gajim.py:867 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "Kontakt \"%s\" hat Sie autorisiert seinen oder ihren Staus zu sehen." -#: ../src/gajim.py:870 +#: ../src/gajim.py:875 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Kontakt \"%s\" hat das Abonnement zurückgezogen" -#: ../src/gajim.py:871 +#: ../src/gajim.py:876 msgid "You will always see him or her as offline." msgstr "Sie werden den Kontakt ab sofort als offline sehen." -#: ../src/gajim.py:914 +#: ../src/gajim.py:920 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Kontakt mit \"%s\" konnte nicht hergestellt werden" -#: ../src/gajim.py:915 ../src/common/connection.py:418 +#: ../src/gajim.py:921 +#: ../src/common/connection.py:434 msgid "Check your connection or try again later." -msgstr "" -"Überprüfen Sie die Verbindung oder versuchen Sie es später noch einmal." +msgstr "Überprüfen Sie die Verbindung oder versuchen Sie es später noch einmal." -#: ../src/gajim.py:1064 ../src/roster_window.py:1218 +#: ../src/gajim.py:1070 +#: ../src/roster_window.py:1218 #, python-format msgid "%s is now %s (%s)" msgstr "%s ist jetzt %s (%s)" #. No status message -#: ../src/gajim.py:1067 ../src/groupchat_control.py:944 +#: ../src/gajim.py:1073 +#: ../src/groupchat_control.py:962 #: ../src/roster_window.py:1221 #, python-format msgid "%s is now %s" msgstr "%s ist jetzt %s" -#: ../src/gajim.py:1164 +#: ../src/gajim.py:1170 msgid "Your passphrase is incorrect" msgstr "Ihre Passphrase ist falsch" -#: ../src/gajim.py:1165 +#: ../src/gajim.py:1171 msgid "You are currently connected without your OpenPGP key." msgstr "Sie wurden ohne ihren GPG-Schlüssel verbunden" -#: ../src/gajim.py:1268 +#: ../src/gajim.py:1274 #, python-format msgid "New mail on %(gmail_mail_address)s" msgstr "Neue E-Mail auf %(gmail_mail_address)s" -#: ../src/gajim.py:1270 +#: ../src/gajim.py:1276 #, python-format msgid "You have %d new mail conversation" msgid_plural "You have %d new mail conversations" @@ -4015,7 +3950,7 @@ msgstr[1] "Sie haben %d ungelesene E-Mail-Nachrichten" #. FIXME: emulate Gtalk client popups. find out what they parse and how #. they decide what to show #. each message has a 'From', 'Subject' and 'Snippet' field -#: ../src/gajim.py:1279 +#: ../src/gajim.py:1285 #, python-format msgid "" "\n" @@ -4024,53 +3959,52 @@ msgstr "" "\n" "Von: %(from_address)s" -#: ../src/gajim.py:1435 +#: ../src/gajim.py:1441 #, python-format msgid "%s wants to send you a file." msgstr "%s möchte ihnen eine Datei senden." -#: ../src/gajim.py:1500 +#: ../src/gajim.py:1506 #, python-format msgid "You successfully received %(filename)s from %(name)s." msgstr "Sie haben %(filename)s erfolgreich von %(name)s erhalten." #. ft stopped -#: ../src/gajim.py:1504 +#: ../src/gajim.py:1510 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Dateitransfer %(filename)s von %(name)s wurde gestoppt." -#: ../src/gajim.py:1517 +#: ../src/gajim.py:1523 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Sie haben%(filename)s erfolgreich an %(name)s gesendet." #. ft stopped -#: ../src/gajim.py:1521 +#: ../src/gajim.py:1527 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Dateitransfer von %(filename)s an %(name)s wurde gestoppt." -#: ../src/gajim.py:1634 +#: ../src/gajim.py:1640 msgid "Username Conflict" msgstr "Benutzernamenkonflikt" -#: ../src/gajim.py:1635 +#: ../src/gajim.py:1641 msgid "Please type a new username for your local account" -msgstr "" -"Bitte geben Sie einen neuen Benutzernamen für Ihr lokales Konto ein" +msgstr "Bitte geben Sie einen neuen Benutzernamen für Ihr lokales Konto ein" #. it is good to notify the user #. in case he or she cannot see the output of the console -#: ../src/gajim.py:1975 +#: ../src/gajim.py:1987 msgid "Could not save your settings and preferences" msgstr "Konnte Einstellungen nicht speichern" -#: ../src/gajim.py:2173 +#: ../src/gajim.py:2185 msgid "Network Manager support not available" msgstr "Unterstützung für Network Manager nicht verfügbar" -#: ../src/gajim.py:2252 +#: ../src/gajim.py:2264 msgid "Session Management support not available (missing gnome.ui module)" msgstr "Sitzungsmanagment-Unterstützung nicht verfügbar (Modul gnome.ui fehlt)" @@ -4096,17 +4030,21 @@ msgid "Pops up a window with the next pending event" msgstr "Zeige Popup-Fenster mit dem nächsten ungelesenen Ereignis" #: ../src/gajim-remote.py:81 -msgid "" -"Prints a list of all contacts in the roster. Each contact appears on a " -"separate line" +msgid "Prints a list of all contacts in the roster. Each contact appears on a separate line" msgstr "Gibt eine Liste aller Kontakte im Roster aus. Eine Zeile je Kontakt" -#: ../src/gajim-remote.py:84 ../src/gajim-remote.py:99 -#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:122 -#: ../src/gajim-remote.py:136 ../src/gajim-remote.py:157 -#: ../src/gajim-remote.py:187 ../src/gajim-remote.py:196 -#: ../src/gajim-remote.py:203 ../src/gajim-remote.py:210 -#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:237 +#: ../src/gajim-remote.py:84 +#: ../src/gajim-remote.py:99 +#: ../src/gajim-remote.py:109 +#: ../src/gajim-remote.py:122 +#: ../src/gajim-remote.py:136 +#: ../src/gajim-remote.py:157 +#: ../src/gajim-remote.py:187 +#: ../src/gajim-remote.py:196 +#: ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:221 +#: ../src/gajim-remote.py:237 #: ../src/gajim-remote.py:246 msgid "account" msgstr "Konto" @@ -4132,7 +4070,8 @@ msgstr "Status" msgid "one of: offline, online, chat, away, xa, dnd, invisible " msgstr "Eins von: offline, online, chat, away, xa, dnd, invisible " -#: ../src/gajim-remote.py:98 ../src/gajim-remote.py:119 +#: ../src/gajim-remote.py:98 +#: ../src/gajim-remote.py:119 #: ../src/gajim-remote.py:133 msgid "message" msgstr "Nachricht" @@ -4142,67 +4081,54 @@ msgid "status message" msgstr "Statusnachricht" #: ../src/gajim-remote.py:99 -msgid "" -"change status of account \"account\". If not specified, try to change status " -"of all accounts that have \"sync with global status\" option set" -msgstr "" -"Ändere Status vom Konto \"account\". Falls nicht angegeben, ändere Status " -"aller Konten für die \"Kontostatus mit globalem Status abgleichen\" " -"aktiviert ist" +msgid "change status of account \"account\". If not specified, try to change status of all accounts that have \"sync with global status\" option set" +msgstr "Ändere Status vom Konto \"account\". Falls nicht angegeben, ändere Status aller Konten für die \"Kontostatus mit globalem Status abgleichen\" aktiviert ist" #: ../src/gajim-remote.py:105 msgid "Shows the chat dialog so that you can send messages to a contact" -msgstr "" -"Zeige Chatfenster, so dass eine Nachricht an einen Kontakt gesendet werden " -"kann" +msgstr "Zeige Chatfenster, so dass eine Nachricht an einen Kontakt gesendet werden kann" #: ../src/gajim-remote.py:107 msgid "JID of the contact that you want to chat with" msgstr "JID des Kontakts mit Sie chatten möchten" -#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:187 +#: ../src/gajim-remote.py:109 +#: ../src/gajim-remote.py:187 msgid "if specified, contact is taken from the contact list of this account" msgstr "falls angegeben, wird der Kontakt von der Liste dieses Kontos gewählt" #: ../src/gajim-remote.py:114 -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 " -"key', just set 'OpenPGP key' to ''." -msgstr "" -"Sende neue Chat-Nachricht zu einem Kontakt im Roster. OpenPGP-Schlüssel und " -"Konto sind optional. Falls nur 'Konto' gesetzt werden soll, ohne OpenGPG-" -"Schlüssel, setzen Sie 'OpenGPG-Schlüssel' einfach auf ''." +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 key', just set 'OpenPGP key' to ''." +msgstr "Sende neue Chat-Nachricht zu einem Kontakt im Roster. OpenPGP-Schlüssel und Konto sind optional. Falls nur 'Konto' gesetzt werden soll, ohne OpenGPG-Schlüssel, setzen Sie 'OpenGPG-Schlüssel' einfach auf ''." -#: ../src/gajim-remote.py:118 ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:118 +#: ../src/gajim-remote.py:131 msgid "JID of the contact that will receive the message" msgstr "JID des Kontakts, der die Nachricht empfängt" -#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:119 +#: ../src/gajim-remote.py:133 msgid "message contents" msgstr "Nachrichteninhalt" -#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 +#: ../src/gajim-remote.py:120 +#: ../src/gajim-remote.py:134 msgid "pgp key" msgstr "PGP-Schlüssel" -#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 +#: ../src/gajim-remote.py:120 +#: ../src/gajim-remote.py:134 msgid "if specified, the message will be encrypted using this public key" msgstr "falls angegeben, wird die Nachricht damit verschlüsselt" -#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:136 +#: ../src/gajim-remote.py:122 +#: ../src/gajim-remote.py:136 msgid "if specified, the message will be sent using this account" msgstr "falls angegeben, wird die Nachricht über dieses Konto gesendet" #: ../src/gajim-remote.py:127 -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 " -"key', just set 'OpenPGP key' to ''." -msgstr "" -"Sende neue einzelne Nachricht an einen Kontakt im Roster. OpenPGP-Schlüssel " -"und Konto sind optional. Falls nur 'Konto' gesetzt werden soll, ohne OpenGPG-" -"Schlüssel, lassen Sie 'OpenGPG-Schlüssel' einfach leer." +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 key', just set 'OpenPGP key' to ''." +msgstr "Sende neue einzelne Nachricht an einen Kontakt im Roster. OpenPGP-Schlüssel und Konto sind optional. Falls nur 'Konto' gesetzt werden soll, ohne OpenGPG-Schlüssel, lassen Sie 'OpenGPG-Schlüssel' einfach leer." #: ../src/gajim-remote.py:132 msgid "subject" @@ -4216,8 +4142,10 @@ msgstr "Nachrichten-Betreff" msgid "Gets detailed info on a contact" msgstr "Zeige detaillierte Informationen über Kontakt" -#: ../src/gajim-remote.py:143 ../src/gajim-remote.py:156 -#: ../src/gajim-remote.py:186 ../src/gajim-remote.py:195 +#: ../src/gajim-remote.py:143 +#: ../src/gajim-remote.py:156 +#: ../src/gajim-remote.py:186 +#: ../src/gajim-remote.py:195 msgid "JID of the contact" msgstr "JID des Kontakts" @@ -4295,16 +4223,11 @@ msgstr "Fügt neuen Kontakt zu diesem Konto hinzu" #: ../src/gajim-remote.py:201 msgid "Returns current status (the global one unless account is specified)" -msgstr "" -"Gibt derzeitigen Status zurück (der globale Status, außer, es wird ein " -"Account spezifiziert)" +msgstr "Gibt derzeitigen Status zurück (der globale Status, außer, es wird ein Account spezifiziert)" #: ../src/gajim-remote.py:208 -msgid "" -"Returns current status message(the global one unless account is specified)" -msgstr "" -"Gibt derzeitige Statusnachricht zurück (der globale, außer, es wird ein " -"Account angegeben)" +msgid "Returns current status message(the global one unless account is specified)" +msgstr "Gibt derzeitige Statusnachricht zurück (der globale, außer, es wird ein Account angegeben)" #: ../src/gajim-remote.py:215 msgid "Returns number of unread messages" @@ -4327,12 +4250,8 @@ msgid "XML to send" msgstr "Zu sendender XML-Code" #: ../src/gajim-remote.py:228 -msgid "" -"Account in which the xml will be sent; if not specified, xml will be sent to " -"all accounts" -msgstr "" -"Konto, an welchen XML gesendet wird; wenn nicht spezifiziert, wird XML an " -"alle Konten gesendet" +msgid "Account in which the xml will be sent; if not specified, xml will be sent to all accounts" +msgstr "Konto, an welchen XML gesendet wird; wenn nicht spezifiziert, wird XML an alle Konten gesendet" #: ../src/gajim-remote.py:234 msgid "Handle a xmpp:/ uri" @@ -4441,295 +4360,247 @@ msgstr "Sie können ihr derzeitiges Theme nicht löschen" msgid "Please first choose another for your current theme." msgstr "Bitte wählen Sie zuerst einen anderen Namen für ihr derzeitiges Theme." -#: ../src/groupchat_control.py:106 -msgid "Private Chat" -msgstr "Privater Chat" - -#: ../src/groupchat_control.py:106 -msgid "Private Chats" -msgstr "Private Chats" - -#: ../src/groupchat_control.py:123 +#: ../src/groupchat_control.py:122 msgid "Sending private message failed" msgstr "Senden privater Nachricht fehlgeschlagen" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:125 +#: ../src/groupchat_control.py:124 #, python-format msgid "You are no longer in group chat \"%s\" or \"%s\" has left." -msgstr "" -"Sie sind nicht mehr im Gruppenchat \"%s\" oder \"%s\" hat den Gruppenchat " -"verlassen." +msgstr "Sie sind nicht mehr im Gruppenchat \"%s\" oder \"%s\" hat den Gruppenchat verlassen." -#: ../src/groupchat_control.py:144 -msgid "Group Chat" -msgstr "Gruppenchat" - -#: ../src/groupchat_control.py:144 -msgid "Group Chats" -msgstr "Gruppenchat" - -#: ../src/groupchat_control.py:318 +#: ../src/groupchat_control.py:322 msgid "Insert Nickname" msgstr "Spitzname einfügen" #. do not print 'kicked by None' -#: ../src/groupchat_control.py:829 +#: ../src/groupchat_control.py:844 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s wurde rausgeschmissen: %(reason)s" -#: ../src/groupchat_control.py:833 +#: ../src/groupchat_control.py:848 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s wurde von %(who)s rausgeschmissen: %(reason)s" #. do not print 'banned by None' -#: ../src/groupchat_control.py:840 +#: ../src/groupchat_control.py:855 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s wurde gebannt: %(reason)s" -#: ../src/groupchat_control.py:844 +#: ../src/groupchat_control.py:859 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s wurde von %(who)s gebannt: %(reason)s" -#: ../src/groupchat_control.py:852 +#: ../src/groupchat_control.py:867 #, python-format msgid "You are now known as %s" msgstr "Sie heißen nun %s" -#: ../src/groupchat_control.py:854 +#: ../src/groupchat_control.py:869 #, python-format msgid "%s is now known as %s" msgstr "%s heißt jetzt %s" -#: ../src/groupchat_control.py:937 +#: ../src/groupchat_control.py:955 #, python-format msgid "%s has left" msgstr "%s ist gegangen" -#: ../src/groupchat_control.py:942 +#: ../src/groupchat_control.py:960 #, python-format msgid "%s has joined the group chat" msgstr "%s hat den Gruppenchat betreten" -#: ../src/groupchat_control.py:1063 ../src/groupchat_control.py:1081 -#: ../src/groupchat_control.py:1174 ../src/groupchat_control.py:1191 +#: ../src/groupchat_control.py:1082 +#: ../src/groupchat_control.py:1100 +#: ../src/groupchat_control.py:1193 +#: ../src/groupchat_control.py:1210 #, python-format msgid "Nickname not found: %s" msgstr "Spitzname nicht gefunden: %s" -#: ../src/groupchat_control.py:1097 +#: ../src/groupchat_control.py:1116 msgid "This group chat has no subject" msgstr "Dieser Gruppenchat hat kein Thema" -#: ../src/groupchat_control.py:1110 +#: ../src/groupchat_control.py:1129 #, python-format msgid "Invited %(contact_jid)s to %(room_jid)s." msgstr "%(contact_jid)s in %(room_jid)s eingeladen" #. %s is something the user wrote but it is not a jid so we inform -#: ../src/groupchat_control.py:1117 ../src/groupchat_control.py:1145 +#: ../src/groupchat_control.py:1136 +#: ../src/groupchat_control.py:1164 #, python-format msgid "%s does not appear to be a valid JID" msgstr "%s scheint keine gültige JID zu sein" -#: ../src/groupchat_control.py:1228 +#: ../src/groupchat_control.py:1247 #, python-format msgid "No such command: /%s (if you want to send this, prefix it with /say)" -msgstr "" -"Kein Kommando: /%s (wenn Sie dies senden wollen, setzen Sie /say voran)" +msgstr "Kein Kommando: /%s (wenn Sie dies senden wollen, setzen Sie /say voran)" -#: ../src/groupchat_control.py:1251 +#: ../src/groupchat_control.py:1270 #, python-format msgid "Commands: %s" msgstr "Kommandos: %s" -#: ../src/groupchat_control.py:1253 +#: ../src/groupchat_control.py:1273 #, python-format -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. Does " -"NOT support spaces in nickname." -msgstr "" -"Bedienung: /%s [Grund], bannt die JID aus dem Gruppenchat. " -"Der Spitzname eines Teilnehmers kann hinzugefügt werden, aber nicht, wenn es " -"ein \"@\" enthält. Wenn die JID derzeit im Gruppenchat ist, wird er/sie/es " -"ebenfalls gebannt. Unterstützt KEINE Leerzeichen im Spitznamen." +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. Does NOT support spaces in nickname." +msgstr "Bedienung: /%s [Grund], bannt die JID aus dem Gruppenchat. Der Spitzname eines Teilnehmers kann hinzugefügt werden, aber nicht, wenn es ein \"@\" enthält. Wenn die JID derzeit im Gruppenchat ist, wird er/sie/es ebenfalls gebannt. Unterstützt KEINE Leerzeichen im Spitznamen." -#: ../src/groupchat_control.py:1260 +#: ../src/groupchat_control.py:1280 #, python-format -msgid "" -"Usage: /%s , opens a private chat window with the specified " -"occupant." -msgstr "" -"Verwendung: /%s , öffnet ein privates Nachrichtenfenster mit dem " -"Inhaber des angegebenen Spitznamens." +msgid "Usage: /%s , opens a private chat window with the specified occupant." +msgstr "Verwendung: /%s , öffnet ein privates Nachrichtenfenster mit dem Inhaber des angegebenen Spitznamens." -#: ../src/groupchat_control.py:1264 +#: ../src/groupchat_control.py:1284 #, python-format msgid "Usage: /%s, clears the text window." msgstr "Bedienung: /%s, leert das Textfenster." -#: ../src/groupchat_control.py:1266 +#: ../src/groupchat_control.py:1286 #, python-format -msgid "" -"Usage: /%s [reason], closes the current window or tab, displaying reason if " -"specified." -msgstr "" -"Bedienung: /%s [Grund], schließt das aktuelle Fenster oder Tab, mit Anzeige " -"eines Grundes, falls angegeben." +msgid "Usage: /%s [reason], closes the current window or tab, displaying reason if specified." +msgstr "Bedienung: /%s [Grund], schließt das aktuelle Fenster oder Tab, mit Anzeige eines Grundes, falls angegeben." -#: ../src/groupchat_control.py:1269 +#: ../src/groupchat_control.py:1289 #, python-format msgid "Usage: /%s, hide the chat buttons." msgstr "Verwendung: /%s, versteckt die Chatbuttons." -#: ../src/groupchat_control.py:1272 +#: ../src/groupchat_control.py:1292 #, python-format -msgid "" -"Usage: /%s [reason], invites JID to the current group chat, optionally " -"providing a reason." -msgstr "" -"Bedienung: /%s [Grund], lädt die JID in den aktuellen Gruppenchat ein, " -"optional mit der Angabe eines Grundes." +msgid "Usage: /%s [reason], invites JID to the current group chat, optionally providing a reason." +msgstr "Bedienung: /%s [Grund], lädt die JID in den aktuellen Gruppenchat ein, optional mit der Angabe eines Grundes." -#: ../src/groupchat_control.py:1276 +#: ../src/groupchat_control.py:1296 #, python-format -msgid "" -"Usage: /%s @[/nickname], offers to join room@server optionally " -"using specified nickname." -msgstr "" -"Bedienung: /%s @ [/Spitzname], bietet den Beitritt zu " -"Raum@Server an, optional mit Spitznamen." +msgid "Usage: /%s @[/nickname], offers to join room@server optionally using specified nickname." +msgstr "Bedienung: /%s @ [/Spitzname], bietet den Beitritt zu Raum@Server an, optional mit Spitznamen." -#: ../src/groupchat_control.py:1280 +#: ../src/groupchat_control.py:1300 #, python-format -msgid "" -"Usage: /%s [reason], removes the occupant specified by nickname " -"from the group chat and optionally displays a reason. Does NOT support " -"spaces in nickname." -msgstr "" -"Bedienung: /%s [Grund], verweist den Inhaber des Spitznamen des " -"Gruppenchats und zeigt optional einen Grund. Unterstützt KEINE Leerzeichen " -"im Spitznamen." +msgid "Usage: /%s [reason], removes the occupant specified by nickname from the group chat and optionally displays a reason. Does NOT support spaces in nickname." +msgstr "Bedienung: /%s [Grund], verweist den Inhaber des Spitznamen des Gruppenchats und zeigt optional einen Grund. Unterstützt KEINE Leerzeichen im Spitznamen." -#: ../src/groupchat_control.py:1285 +#: ../src/groupchat_control.py:1305 #, python-format -msgid "" -"Usage: /%s , sends action to the current group chat. Use third " -"person. (e.g. /%s explodes.)" -msgstr "" -"Bedienung: /%s , sendet die Aktion im aktuellen Gruppenchat. " -"Verwende dritte Person, z.B. /%s explodiert)." +msgid "Usage: /%s , sends action to the current group chat. Use third person. (e.g. /%s explodes.)" +msgstr "Bedienung: /%s , sendet die Aktion im aktuellen Gruppenchat. Verwende dritte Person, z.B. /%s explodiert)." -#: ../src/groupchat_control.py:1289 +#: ../src/groupchat_control.py:1309 #, python-format -msgid "" -"Usage: /%s [message], opens a private message window and sends " -"message to the occupant specified by nickname." -msgstr "" -"Verwendung: /%s [Nachricht], öffnet ein privates " -"Nachrichtenfenster und sendet die Nachricht zum Inhaber des angegebenen " -"Spitznamens." +msgid "Usage: /%s [message], opens a private message window and sends message to the occupant specified by nickname." +msgstr "Verwendung: /%s [Nachricht], öffnet ein privates Nachrichtenfenster und sendet die Nachricht zum Inhaber des angegebenen Spitznamens." -#: ../src/groupchat_control.py:1294 +#: ../src/groupchat_control.py:1314 #, python-format msgid "Usage: /%s , changes your nickname in current group chat." -msgstr "" -"Bedienung: /%s , ändert den Spitznamen im aktuellen Gruppenchat." +msgstr "Bedienung: /%s , ändert den Spitznamen im aktuellen Gruppenchat." -#: ../src/groupchat_control.py:1298 +#: ../src/groupchat_control.py:1318 #, python-format msgid "Usage: /%s , display the names of group chat occupants." msgstr "Benutzung: /%s , zeigt die Namen der Gruppenchatbesucher." -#: ../src/groupchat_control.py:1302 +#: ../src/groupchat_control.py:1322 #, python-format msgid "Usage: /%s [topic], displays or updates the current group chat topic." -msgstr "" -"Benutzung: /%s [topic], zeigt oder aktualisiert das derzeitige Gruppenchat-" -"Thema." +msgstr "Benutzung: /%s [topic], zeigt oder aktualisiert das derzeitige Gruppenchat-Thema." -#: ../src/groupchat_control.py:1305 +#: ../src/groupchat_control.py:1325 #, python-format -msgid "" -"Usage: /%s , sends a message without looking for other commands." -msgstr "" -"Benutzung: /%s , sendet eine Nachricht ohne andere Befehle zu " -"beachten." +msgid "Usage: /%s , sends a message without looking for other commands." +msgstr "Benutzung: /%s , sendet eine Nachricht ohne andere Befehle zu beachten." -#: ../src/groupchat_control.py:1308 +#: ../src/groupchat_control.py:1328 #, python-format msgid "No help info for /%s" msgstr "Keine Hilfe vorhanden für /%s" -#: ../src/groupchat_control.py:1359 +#: ../src/groupchat_control.py:1391 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Möchten Sie den Gruppenchat \"%s\" wirklich verlassen?" -#: ../src/groupchat_control.py:1361 -msgid "" -"If you close this window, you will be disconnected from this group chat." -msgstr "" -"Wenn Sie dieses Fenster schließen, wird die Verbindung zu diesem Gruppenchat " -"geschlossen." +#: ../src/groupchat_control.py:1393 +msgid "If you close this window, you will be disconnected from this group chat." +msgstr "Wenn Sie dieses Fenster schließen, wird die Verbindung zu diesem Gruppenchat geschlossen." -#: ../src/groupchat_control.py:1365 ../src/roster_window.py:4036 +#: ../src/groupchat_control.py:1397 +#: ../src/roster_window.py:4058 msgid "Do _not ask me again" msgstr "_Nicht noch einmal fragen" -#: ../src/groupchat_control.py:1399 +#: ../src/groupchat_control.py:1431 msgid "Changing Subject" msgstr "Thema ändern" -#: ../src/groupchat_control.py:1400 +#: ../src/groupchat_control.py:1432 msgid "Please specify the new subject:" msgstr "Bitte bestimmen Sie ein neues Thema" -#: ../src/groupchat_control.py:1409 +#: ../src/groupchat_control.py:1441 msgid "Changing Nickname" msgstr "Spitzname ändern" -#: ../src/groupchat_control.py:1410 +#: ../src/groupchat_control.py:1442 msgid "Please specify the new nickname you want to use:" msgstr "Bitte geben Sie an, welchen Spitznamen Sie verwenden möchten:" -#: ../src/groupchat_control.py:1435 +#. Ask for a reason +#: ../src/groupchat_control.py:1457 +#, fuzzy, python-format +msgid "Destroying %s" +msgstr "Beschreibung: %s" + +#: ../src/groupchat_control.py:1458 +msgid "" +"You are going to definitively destroy this room.\n" +"You may specify a reason below:" +msgstr "" + +#: ../src/groupchat_control.py:1460 +msgid "You may also enter an alternate venue:" +msgstr "" + +#: ../src/groupchat_control.py:1490 msgid "Bookmark already set" msgstr "Lesezeichen existiert schon" -#: ../src/groupchat_control.py:1436 +#: ../src/groupchat_control.py:1491 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Der Gruppenchat \"%s\" ist schon in den Lesezeichen." -#: ../src/groupchat_control.py:1445 +#: ../src/groupchat_control.py:1500 msgid "Bookmark has been added successfully" msgstr "Lesezeichen wurde erfolgreich hinzugefügt" -#: ../src/groupchat_control.py:1446 +#: ../src/groupchat_control.py:1501 msgid "You can manage your bookmarks via Actions menu in your roster." -msgstr "" -"Sie können ihre Lesezeichen über das Aktionen-Menü in der Kontaktliste " -"bearbeiten" +msgstr "Sie können ihre Lesezeichen über das Aktionen-Menü in der Kontaktliste bearbeiten" #. ask for reason -#: ../src/groupchat_control.py:1574 +#: ../src/groupchat_control.py:1629 #, python-format msgid "Kicking %s" msgstr "%s rausschmeißen" -#: ../src/groupchat_control.py:1575 ../src/groupchat_control.py:1858 +#: ../src/groupchat_control.py:1630 +#: ../src/groupchat_control.py:1913 msgid "You may specify a reason below:" msgstr "Sie können eine Begründung angeben:" #. ask for reason -#: ../src/groupchat_control.py:1857 +#: ../src/groupchat_control.py:1912 #, python-format msgid "Banning %s" msgstr "%s verbannen" @@ -4739,12 +4610,8 @@ msgid "A programming error has been detected" msgstr "Es wurde ein Programmfehler entdeckt" #: ../src/gtkexcepthook.py:42 -msgid "" -"It probably is not fatal, but should be reported to the developers " -"nonetheless." -msgstr "" -"Es ist vermutlich nicht fatal, aber der Fehler sollte trotzdem den " -"Entwicklern gemeldet werden" +msgid "It probably is not fatal, but should be reported to the developers nonetheless." +msgstr "Es ist vermutlich nicht fatal, aber der Fehler sollte trotzdem den Entwicklern gemeldet werden" #: ../src/gtkexcepthook.py:48 msgid "_Report Bug" @@ -4755,7 +4622,8 @@ msgid "Details" msgstr "Details" #. we talk about file -#: ../src/gtkgui_helpers.py:156 ../src/gtkgui_helpers.py:171 +#: ../src/gtkgui_helpers.py:156 +#: ../src/gtkgui_helpers.py:171 #, python-format msgid "Error: cannot open %s for reading" msgstr "Fehler: Kann %s kann nicht zum Lesen öffnen" @@ -4773,36 +4641,31 @@ msgstr "Fehler bei der Dateianalyse:" #: ../src/gtkgui_helpers.py:376 #, python-format msgid "Could not write to %s. Session Management support will not work" -msgstr "" -"Konnte nicht an %s schreiben. Sitzungmanagment-Unterstützung wird nicht " -"funktionieren" +msgstr "Konnte nicht an %s schreiben. Sitzungmanagment-Unterstützung wird nicht funktionieren" #. xmpp: is currently handled by another program, so ask the user -#: ../src/gtkgui_helpers.py:692 +#: ../src/gtkgui_helpers.py:694 msgid "Gajim is not the default Jabber client" msgstr "Gajim ist nicht Ihr Standard-Jabber-Client" -#: ../src/gtkgui_helpers.py:693 +#: ../src/gtkgui_helpers.py:695 msgid "Would you like to make Gajim the default Jabber client?" msgstr "Möchten Sie Gajim zu Ihrem Standard-Jabber-Client machen?" -#: ../src/gtkgui_helpers.py:694 +#: ../src/gtkgui_helpers.py:696 msgid "Always check to see if Gajim is the default Jabber client on startup" -msgstr "" -"Immer beim Programmstart prüfen, ob Gajim der Standard-Jabber-Client ist" +msgstr "Immer beim Programmstart prüfen, ob Gajim der Standard-Jabber-Client ist" -#: ../src/gtkgui_helpers.py:793 +#: ../src/gtkgui_helpers.py:795 msgid "Extension not supported" msgstr "Erweiterung wird nicht unterstützt." -#: ../src/gtkgui_helpers.py:794 +#: ../src/gtkgui_helpers.py:796 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" -msgstr "" -"Bild kann nicht im %(type)s-Format gespeichert werden. Als %(new_filename)s " -"speichern?" +msgstr "Bild kann nicht im %(type)s-Format gespeichert werden. Als %(new_filename)s speichern?" -#: ../src/gtkgui_helpers.py:803 +#: ../src/gtkgui_helpers.py:805 msgid "Save Image as..." msgstr "Bild speichern unter ..." @@ -4816,41 +4679,36 @@ msgid "Contacts" msgstr "Kontakte" #. holds time -#: ../src/history_manager.py:121 ../src/history_manager.py:161 +#: ../src/history_manager.py:121 +#: ../src/history_manager.py:161 #: ../src/history_window.py:86 msgid "Date" msgstr "Datum" #. holds nickname -#: ../src/history_manager.py:127 ../src/history_manager.py:179 +#: ../src/history_manager.py:127 +#: ../src/history_manager.py:179 msgid "Nickname" msgstr "Spitzname" #. holds message -#: ../src/history_manager.py:135 ../src/history_manager.py:167 +#: ../src/history_manager.py:135 +#: ../src/history_manager.py:167 #: ../src/history_window.py:94 msgid "Message" msgstr "Nachricht" #: ../src/history_manager.py:187 -msgid "" -"Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " -"RUNNING)" -msgstr "" -"Möchten Sie die Datenbank aufräumen? (NICHT EMPFOHLEN, WENN GAJIM GERADE " -"LÄUFT)" +msgid "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS RUNNING)" +msgstr "Möchten Sie die Datenbank aufräumen? (NICHT EMPFOHLEN, WENN GAJIM GERADE LÄUFT)" #: ../src/history_manager.py:189 msgid "" -"Normally allocated database size will not be freed, it will just become " -"reusable. If you really want to reduce database filesize, click YES, else " -"click NO.\n" +"Normally allocated database size will not be freed, it will just become reusable. If you really want to reduce database filesize, click YES, else click NO.\n" "\n" "In case you click YES, please wait..." msgstr "" -"Der reservierte Datenbankspeicherplatz wird nicht freigegeben, er wird nur " -"wiederverwendbar. Wenn Sie wirklich den Speicherplatz reduzieren möchten, " -"klicken Sie JA, ansonsten NEIN.\n" +"Der reservierte Datenbankspeicherplatz wird nicht freigegeben, er wird nur wiederverwendbar. Wenn Sie wirklich den Speicherplatz reduzieren möchten, klicken Sie JA, ansonsten NEIN.\n" "\n" "Falls Sie JA klicken, warten Sie bitte einen Augenblick ..." @@ -4869,7 +4727,8 @@ msgid_plural "Do you really want to delete logs of the selected contacts?" msgstr[0] "Möchten Sie wirklich alle Logs des ausgewählten Kontakts löschen?" msgstr[1] "Möchten Sie wirklich alle Logs des ausgewählten Kontakte löschen?" -#: ../src/history_manager.py:518 ../src/history_manager.py:554 +#: ../src/history_manager.py:518 +#: ../src/history_manager.py:554 msgid "This is an irreversible operation." msgstr "Dies ist ein unwiderruflicher Vorgang." @@ -4879,7 +4738,8 @@ msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Möchten Sie die ausgewählte Nachricht wirklich löschen?" msgstr[1] "Möchten Sie die ausgewählten Nachrichten wirklich löschen?" -#: ../src/history_window.py:103 ../src/history_window.py:105 +#: ../src/history_window.py:103 +#: ../src/history_window.py:105 #, python-format msgid "Conversation History with %s" msgstr "Unterhaltungs-Verlauf mit %s" @@ -4889,7 +4749,8 @@ msgstr "Unterhaltungs-Verlauf mit %s" msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s ist jezt %(status)s: %(status_msg)s" -#: ../src/history_window.py:262 ../src/notify.py:199 +#: ../src/history_window.py:262 +#: ../src/notify.py:199 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s ist jetzt %(status)s" @@ -4905,10 +4766,22 @@ msgid "Status is now: %(status)s" msgstr "Status ist jetzt: %(status)s" #: ../src/message_window.py:273 +msgid "Chats" +msgstr "Chats" + +#: ../src/message_window.py:275 +msgid "Group Chats" +msgstr "Gruppenchat" + +#: ../src/message_window.py:277 +msgid "Private Chats" +msgstr "Private Chats" + +#: ../src/message_window.py:279 msgid "Messages" msgstr "Nachrichten" -#: ../src/message_window.py:274 +#: ../src/message_window.py:280 #, python-format msgid "%s - Gajim" msgstr "%s - Gajim" @@ -4963,8 +4836,7 @@ msgstr "Informationen empfangen" #: ../src/profile_window.py:324 msgid "Without a connection you can not publish your contact information." -msgstr "" -"Sie müssen angemeldet sein, um Kontakt-Informationen zu veröffentlichen" +msgstr "Sie müssen angemeldet sein, um Kontakt-Informationen zu veröffentlichen" #: ../src/profile_window.py:336 msgid "Sending profile..." @@ -4979,30 +4851,30 @@ msgid "vCard publication failed" msgstr "vCard Veröffentlichung fehlgeschlagen" #: ../src/profile_window.py:359 -msgid "" -"There was an error while publishing your personal information, try again " -"later." -msgstr "" -"Bei der Veröffentlichung Ihrer persönlichen Informationen ist ein Fehler " -"aufgetreten, versuchen Sie es später nochmals." +msgid "There was an error while publishing your personal information, try again later." +msgstr "Bei der Veröffentlichung Ihrer persönlichen Informationen ist ein Fehler aufgetreten, versuchen Sie es später nochmals." -#: ../src/roster_window.py:171 ../src/roster_window.py:226 +#: ../src/roster_window.py:172 +#: ../src/roster_window.py:227 msgid "Merged accounts" msgstr "Alle Konten" -#: ../src/roster_window.py:344 ../src/common/helpers.py:43 +#: ../src/roster_window.py:345 +#: ../src/common/helpers.py:43 msgid "Observers" msgstr "Beobachter" -#: ../src/roster_window.py:692 ../src/roster_window.py:3201 +#: ../src/roster_window.py:692 +#: ../src/roster_window.py:3215 msgid "You cannot join a group chat while you are invisible" -msgstr "" -"Sie können einem Gruppenchat nicht beitreten, wenn Sie unsichtbar sind." +msgstr "Sie können einem Gruppenchat nicht beitreten, wenn Sie unsichtbar sind." #. new chat #. for chat_with #. for single message -#: ../src/roster_window.py:884 ../src/systray.py:187 ../src/systray.py:192 +#: ../src/roster_window.py:884 +#: ../src/systray.py:206 +#: ../src/systray.py:211 #, python-format msgid "using account %s" msgstr "mit Konto %s" @@ -5045,317 +4917,285 @@ msgstr "_Verlaufsmanager" msgid "_Join New Group Chat" msgstr "_Gruppenchat betreten" -#: ../src/roster_window.py:1398 ../src/roster_window.py:3394 -#: ../src/roster_window.py:3401 +#: ../src/roster_window.py:1397 +#: ../src/roster_window.py:3410 +#: ../src/roster_window.py:3417 msgid "You have unread messages" msgstr "Sie haben ungelesene Nachrichten" -#: ../src/roster_window.py:1399 +#: ../src/roster_window.py:1398 msgid "You must read them before removing this transport." msgstr "Sie müssen sie alle lesen, bevor der Account entfernt wird." -#: ../src/roster_window.py:1402 +#: ../src/roster_window.py:1401 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transport \"%s\" wird entfernt" -#: ../src/roster_window.py:1403 -msgid "" -"You will no longer be able to send and receive messages from contacts using " -"this transport." -msgstr "" -"Sie können nun keine Nachrichten mehr mit Kontakten von diesem Transport " -"austauschen." +#: ../src/roster_window.py:1402 +msgid "You will no longer be able to send and receive messages from contacts using this transport." +msgstr "Sie können nun keine Nachrichten mehr mit Kontakten von diesem Transport austauschen." -#: ../src/roster_window.py:1406 +#: ../src/roster_window.py:1405 msgid "Transports will be removed" msgstr "Transporte werden entfernt" -#: ../src/roster_window.py:1411 +#: ../src/roster_window.py:1410 #, python-format -msgid "" -"You will no longer be able to send and receive messages to contacts from " -"these transports:%s" -msgstr "" -"Sie können nun keine Nachrichten mehr mit Kontakten von diesen Transporten " -"austauschen:%s" +msgid "You will no longer be able to send and receive messages to contacts from these transports:%s" +msgstr "Sie können nun keine Nachrichten mehr mit Kontakten von diesen Transporten austauschen:%s" #. it's jid -#: ../src/roster_window.py:1431 +#: ../src/roster_window.py:1430 msgid "Rename Contact" msgstr "Kontakt umbenennen" -#: ../src/roster_window.py:1432 +#: ../src/roster_window.py:1431 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Geben Sie einen Spitznamen für den Kontakt %s ein" -#: ../src/roster_window.py:1439 +#: ../src/roster_window.py:1438 msgid "Rename Group" msgstr "Gruppe umbenennen" -#: ../src/roster_window.py:1440 +#: ../src/roster_window.py:1439 #, python-format msgid "Enter a new name for group %s" msgstr "Geben Sie einen neuen Namen für die Gruppe %s ein" -#: ../src/roster_window.py:1515 +#: ../src/roster_window.py:1514 msgid "Remove Group" msgstr "Gruppe entfernen" -#: ../src/roster_window.py:1516 +#: ../src/roster_window.py:1515 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Möchten Sie wirklich die Gruppe %s von Ihrer Kontaktliste entfernen?" -#: ../src/roster_window.py:1517 +#: ../src/roster_window.py:1516 msgid "Remove also all contacts in this group from your roster" msgstr "Auch alle Kontakte dieser Gruppe von Ihrer Kontaktliste entfernen" -#: ../src/roster_window.py:1546 +#: ../src/roster_window.py:1547 msgid "Assign OpenPGP Key" msgstr "OpenPGP-Schlüssel Zuweisen" -#: ../src/roster_window.py:1547 +#: ../src/roster_window.py:1548 msgid "Select a key to apply to the contact" msgstr "Weisen Sie dem Kontakt einen Schüssel zu" -#: ../src/roster_window.py:1782 ../src/roster_window.py:2043 +#: ../src/roster_window.py:1784 +#: ../src/roster_window.py:2045 msgid "_New group chat" msgstr "_Neuer Gruppenchat" -#: ../src/roster_window.py:1913 +#: ../src/roster_window.py:1915 msgid "I would like to add you to my roster" msgstr "Ich würde dich gerne in meine Liste aufnehmen" -#: ../src/roster_window.py:2088 ../src/roster_window.py:2135 +#: ../src/roster_window.py:2090 +#: ../src/roster_window.py:2137 msgid "Send Group M_essage" msgstr "_Sende Nachricht an Gruppe" -#: ../src/roster_window.py:2114 +#: ../src/roster_window.py:2116 msgid "Re_name" msgstr "_Umbenennen" -#: ../src/roster_window.py:2141 +#: ../src/roster_window.py:2143 msgid "To all users" msgstr "An alle Benutzern" -#: ../src/roster_window.py:2144 +#: ../src/roster_window.py:2146 msgid "To all online users" msgstr "An alle angemeldeten Benutzer" -#: ../src/roster_window.py:2180 +#: ../src/roster_window.py:2182 msgid "_Log on" msgstr "_Anmelden" -#: ../src/roster_window.py:2190 +#: ../src/roster_window.py:2192 msgid "Log _off" msgstr "_Abmelden" -#: ../src/roster_window.py:2312 ../src/roster_window.py:2383 +#: ../src/roster_window.py:2314 +#: ../src/roster_window.py:2385 msgid "_Change Status Message" msgstr "Ändere _Statusnachricht" -#: ../src/roster_window.py:2455 +#: ../src/roster_window.py:2457 msgid "Authorization has been sent" msgstr "Autorisierung wurde erneut gesendet" -#: ../src/roster_window.py:2456 +#: ../src/roster_window.py:2458 #, python-format msgid "Now \"%s\" will know your status." msgstr "\"%s\" kennt jetzt ihren Status." -#: ../src/roster_window.py:2476 +#: ../src/roster_window.py:2478 msgid "Subscription request has been sent" msgstr "Abonnement-Anforderung wurde gesendet" -#: ../src/roster_window.py:2477 +#: ../src/roster_window.py:2479 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Wenn \"%s\" diese Anfrage akzeptiert, erfahren Sie dessen Status." -#: ../src/roster_window.py:2489 +#: ../src/roster_window.py:2491 msgid "Authorization has been removed" msgstr "Autorisierung wurde entfernt" -#: ../src/roster_window.py:2490 +#: ../src/roster_window.py:2492 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "\"%s\" wird Sie nun immer als offline sehen." -#: ../src/roster_window.py:2680 +#: ../src/roster_window.py:2684 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Kontakt \"%s\" wird von ihrer Kontaktliste entfernt" -#: ../src/roster_window.py:2684 -msgid "" -"By removing this contact you also remove authorization resulting in him or " -"her always seeing you as offline." -msgstr "" -"Durch das Entfernen dieses Kontaktes entziehen Sie ihm auch die Berechtigung " -"Ihren Status zu sehen, wodurch der Kontakt Sie nur noch als offline sehen " -"wird." +#: ../src/roster_window.py:2688 +msgid "By removing this contact you also remove authorization resulting in him or her always seeing you as offline." +msgstr "Durch das Entfernen dieses Kontaktes entziehen Sie ihm auch die Berechtigung Ihren Status zu sehen, wodurch der Kontakt Sie nur noch als offline sehen wird." -#: ../src/roster_window.py:2689 -msgid "" -"By removing this contact you also by default remove authorization resulting " -"in him or her always seeing you as offline." -msgstr "" -"Durch das Entfernen dieses Kontaktes entziehen Sie ihm auch standardmäßig " -"die Berechtigung Ihren Status zu sehen, wodurch der Kontakt Sie nur noch als " -"offline sehen wird." +#: ../src/roster_window.py:2693 +msgid "By removing this contact you also by default remove authorization resulting in him or her always seeing you as offline." +msgstr "Durch das Entfernen dieses Kontaktes entziehen Sie ihm auch standardmäßig die Berechtigung Ihren Status zu sehen, wodurch der Kontakt Sie nur noch als offline sehen wird." -#: ../src/roster_window.py:2692 +#: ../src/roster_window.py:2696 msgid "I want this contact to know my status after removal" -msgstr "" -"Ich möchte, dass dieser Kontakt meinen Status auch nach dem Entfernen sieht" +msgstr "Ich möchte, dass dieser Kontakt meinen Status auch nach dem Entfernen sieht" #. several contact to remove at the same time -#: ../src/roster_window.py:2696 +#: ../src/roster_window.py:2700 msgid "Contacts will be removed from your roster" msgstr "Kontakte werden von Ihrer Kontaktliste entfernt" -#: ../src/roster_window.py:2700 +#: ../src/roster_window.py:2704 #, python-format msgid "" "By removing these contacts:%s\n" "you also remove authorization resulting in them always seeing you as offline." msgstr "" "Durch das Entfernen dieser Kontakte:%s\n" -"entziehen Sie ihnen auch die Berechtigung Ihren Status zu sehen, wodurch die " -"Kontakte Sie nur noch als offline sehen werden." +"entziehen Sie ihnen auch die Berechtigung Ihren Status zu sehen, wodurch die Kontakte Sie nur noch als offline sehen werden." -#: ../src/roster_window.py:2732 -msgid "" -"Gnome Keyring is installed but not correctly started (environment variable " -"probably not correctly set)" -msgstr "" -"Gnome Keyring ist installiert, aber nicht korrekt gestartet " -"(Umgebungsvariablen wahrscheinlich falsch gesetzt)" +#: ../src/roster_window.py:2736 +msgid "Gnome Keyring is installed but not correctly started (environment variable probably not correctly set)" +msgstr "Gnome Keyring ist installiert, aber nicht korrekt gestartet (Umgebungsvariablen wahrscheinlich falsch gesetzt)" #. TODO: make this string translatable #. %s is the account name here -#: ../src/roster_window.py:2760 ../src/common/connection.py:672 +#: ../src/roster_window.py:2764 +#: ../src/common/connection.py:687 #: ../src/common/zeroconf/connection_zeroconf.py:158 #, python-format msgid "You will be connected to %s without OpenPGP." msgstr "Sie werden ohne OpenPGP mit %s verbunden." -#: ../src/roster_window.py:2777 +#: ../src/roster_window.py:2781 msgid "Passphrase Required" msgstr "Passphrase benötigt" -#: ../src/roster_window.py:2778 +#: ../src/roster_window.py:2782 #, python-format msgid "Enter GPG key passphrase for account %s." msgstr "Geben Sie die GPG-Passphrase für das Konto %s ein." -#: ../src/roster_window.py:2783 +#: ../src/roster_window.py:2787 msgid "Save passphrase" msgstr "Passphrase speichern" -#: ../src/roster_window.py:2791 +#: ../src/roster_window.py:2795 msgid "Wrong Passphrase" msgstr "Falsche Passphrase" -#: ../src/roster_window.py:2792 +#: ../src/roster_window.py:2796 msgid "Please retype your GPG passphrase or press Cancel." -msgstr "" -"Bitte geben Sie Ihre GPG-Passphrase erneut ein oder klicken Sie auf " -"Abbrechen." +msgstr "Bitte geben Sie Ihre GPG-Passphrase erneut ein oder klicken Sie auf Abbrechen." -#: ../src/roster_window.py:2849 ../src/roster_window.py:2909 +#: ../src/roster_window.py:2853 +#: ../src/roster_window.py:2913 msgid "You are participating in one or more group chats" msgstr "Sie nehmen an einem oder mehreren Gruppenchats teil" -#: ../src/roster_window.py:2850 ../src/roster_window.py:2910 -msgid "" -"Changing your status to invisible will result in disconnection from those " -"group chats. Are you sure you want to go invisible?" -msgstr "" -"Wenn Sie Ihren Status auf unsichtbar setzen, werden sie von diesen " -"Gruppenchats getrennt. Sind Sie sicher, dass sie unsichtbar werden möchten?" +#: ../src/roster_window.py:2854 +#: ../src/roster_window.py:2914 +msgid "Changing your status to invisible will result in disconnection from those group chats. Are you sure you want to go invisible?" +msgstr "Wenn Sie Ihren Status auf unsichtbar setzen, werden sie von diesen Gruppenchats getrennt. Sind Sie sicher, dass sie unsichtbar werden möchten?" -#: ../src/roster_window.py:2867 +#: ../src/roster_window.py:2871 msgid "No account available" msgstr "Kein Konto vorhanden" -#: ../src/roster_window.py:2868 +#: ../src/roster_window.py:2872 msgid "You must create an account before you can chat with other contacts." -msgstr "" -"Sie müssen ein Konto erstellen, bevor Sie sich zum Jabber-Netzwerk verbinden " -"können." +msgstr "Sie müssen ein Konto erstellen, bevor Sie sich zum Jabber-Netzwerk verbinden können." -#: ../src/roster_window.py:2966 +#: ../src/roster_window.py:2974 #, python-format msgid "\"%(title)s\" by %(artist)s" msgstr "\"%(title)s\" von %(artist)s" -#: ../src/roster_window.py:3395 ../src/roster_window.py:3402 -msgid "" -"Messages will only be available for reading them later if you have history " -"enabled." +#: ../src/roster_window.py:3411 +#: ../src/roster_window.py:3418 +msgid "Messages will only be available for reading them later if you have history enabled." msgstr "Um Nachrichten später lesen zu können, muss der Verlauf aktiv sein." -#: ../src/roster_window.py:3986 +#: ../src/roster_window.py:4008 msgid "Metacontacts storage not supported by your server" -msgstr "" -"Das Speichern von Metakontakten wird von Ihrem Server nicht unterstützt" +msgstr "Das Speichern von Metakontakten wird von Ihrem Server nicht unterstützt" -#: ../src/roster_window.py:3988 -msgid "" -"Your server does not support storing metacontacts information. So those " -"information will not be save on next reconnection." -msgstr "" -"Ihr Server unterstützt leider nicht das Speichern von Metakontakt-" -"Informationen. Aus diesem Grund werden diese Informationen bei der nächsten " -"Neuverbindung nicht gespeichert werden." +#: ../src/roster_window.py:4010 +msgid "Your server does not support storing metacontacts information. So those information will not be save on next reconnection." +msgstr "Ihr Server unterstützt leider nicht das Speichern von Metakontakt-Informationen. Aus diesem Grund werden diese Informationen bei der nächsten Neuverbindung nicht gespeichert werden." -#: ../src/roster_window.py:4030 -msgid "" -"You are about to create a metacontact. Are you sure you want to continue?" -msgstr "" -"Sie sind dabei einen Metakontakt zu erstellen. Wollen Sie wirklich " -"fortfahren?" +#: ../src/roster_window.py:4052 +msgid "You are about to create a metacontact. Are you sure you want to continue?" +msgstr "Sie sind dabei einen Metakontakt zu erstellen. Wollen Sie wirklich fortfahren?" -#: ../src/roster_window.py:4032 -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 "" -"Metakontakte sind eine Möglichkeit, mehrere Kontakte in einer Zeile zu " -"gruppieren. Normalerweise benutzt man Sie, wenn eine Person mehrere Jabber- " -"oder Transport-Konten hat." +#: ../src/roster_window.py:4054 +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 "Metakontakte sind eine Möglichkeit, mehrere Kontakte in einer Zeile zu gruppieren. Normalerweise benutzt man Sie, wenn eine Person mehrere Jabber- oder Transport-Konten hat." -#: ../src/roster_window.py:4199 +#: ../src/roster_window.py:4132 +#, fuzzy, python-format +msgid "Do you want to send that file to %s:" +msgid_plural "Do you want to send those files to %s:" +msgstr[0] "%s möchte ihnen eine Datei senden:" +msgstr[1] "%s möchte ihnen eine Datei senden:" + +#: ../src/roster_window.py:4237 #, python-format msgid "Drop %s in group %s" msgstr "Setze %s in Gruppe %s" -#: ../src/roster_window.py:4206 +#: ../src/roster_window.py:4244 #, python-format msgid "Make %s and %s metacontacts" msgstr "Mache %s und %s Metakontakte" -#: ../src/roster_window.py:4393 +#: ../src/roster_window.py:4431 msgid "Change Status Message..." msgstr "Ändere Statusnachricht ..." -#: ../src/systray.py:144 +#: ../src/systray.py:163 msgid "_Change Status Message..." msgstr "Ändere _Statusnachricht..." -#: ../src/systray.py:232 +#: ../src/systray.py:251 msgid "Hide this menu" msgstr "Versteckt dieses Menü" -#: ../src/tooltips.py:309 ../src/tooltips.py:492 +#: ../src/tooltips.py:309 +#: ../src/tooltips.py:492 msgid "Jabber ID: " msgstr "Jabber-ID:" -#: ../src/tooltips.py:312 ../src/tooltips.py:496 +#: ../src/tooltips.py:312 +#: ../src/tooltips.py:496 msgid "Resource: " msgstr "Ressource: " @@ -5364,7 +5204,8 @@ msgstr "Ressource: " msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s dieses Gruppenchats" -#: ../src/tooltips.py:430 ../src/tooltips.py:610 +#: ../src/tooltips.py:430 +#: ../src/tooltips.py:610 msgid "Status: " msgstr "Status: " @@ -5403,7 +5244,8 @@ msgstr "Typ: " msgid "Transferred: " msgstr "Übertragen: " -#: ../src/tooltips.py:588 ../src/tooltips.py:609 +#: ../src/tooltips.py:588 +#: ../src/tooltips.py:609 msgid "Not started" msgstr "Nicht gestartet" @@ -5411,7 +5253,8 @@ msgstr "Nicht gestartet" msgid "Stopped" msgstr "Angehalten" -#: ../src/tooltips.py:594 ../src/tooltips.py:597 +#: ../src/tooltips.py:594 +#: ../src/tooltips.py:597 msgid "Completed" msgstr "Abgeschlossen" @@ -5448,7 +5291,8 @@ msgstr "Unbekannt" msgid "?OS:Unknown" msgstr "Unbekannt" -#: ../src/vcard.py:247 ../src/vcard.py:449 +#: ../src/vcard.py:247 +#: ../src/vcard.py:449 #, python-format msgid "since %s" msgstr "seit %s" @@ -5458,41 +5302,29 @@ msgid "Affiliation:" msgstr "Zugehörigkeit: " #: ../src/vcard.py:285 -msgid "" -"This contact is interested in your presence information, but you are not " -"interested in his/her presence" -msgstr "" -"Dieser Kontakt ist an Ihren Anwesenheitsinformationen interessiert, aber Sie " -"sind nicht an seiner/ihrer Anwesenheit interessiert" +msgid "This contact is interested in your presence information, but you are not interested in his/her presence" +msgstr "Dieser Kontakt ist an Ihren Anwesenheitsinformationen interessiert, aber Sie sind nicht an seiner/ihrer Anwesenheit interessiert" #: ../src/vcard.py:287 -msgid "" -"You are interested in the contact's presence information, but he/she is not " -"interested in yours" -msgstr "" -"Sie sind an den Anwesenheitsinformationen des Kontakts interessiert, aber er/" -"sie ist nicht an ihren interessiert" +msgid "You are interested in the contact's presence information, but he/she is not interested in yours" +msgstr "Sie sind an den Anwesenheitsinformationen des Kontakts interessiert, aber er/sie ist nicht an ihren interessiert" #: ../src/vcard.py:289 msgid "You and the contact are interested in each other's presence information" -msgstr "" -"Sie und der Kontakt sind an den Anwesenheitsinformationen des Anderen " -"interessiert" +msgstr "Sie und der Kontakt sind an den Anwesenheitsinformationen des Anderen interessiert" #. None #: ../src/vcard.py:291 -msgid "" -"You are not interested in the contact's presence, and neither he/she is " -"interested in yours" -msgstr "" -"Sie sind nicht an der Anwesenheit des Kontakts interessiert, und er/sie ist " -"nicht interessiert an ihrer" +msgid "You are not interested in the contact's presence, and neither he/she is interested in yours" +msgstr "Sie sind nicht an der Anwesenheit des Kontakts interessiert, und er/sie ist nicht interessiert an ihrer" #: ../src/vcard.py:299 msgid "You are waiting contact's answer about your subscription request" msgstr "Sie warten auf die Antwort des Kontaktes auf ihre Abonnement-Anfrage" -#: ../src/vcard.py:311 ../src/vcard.py:338 ../src/vcard.py:482 +#: ../src/vcard.py:311 +#: ../src/vcard.py:338 +#: ../src/vcard.py:482 msgid " resource with priority " msgstr " resource mit Priorität " @@ -5500,14 +5332,17 @@ msgstr " resource mit Priorität " msgid "creating logs database" msgstr "Erstelle Log-Datenbank" -#: ../src/common/check_paths.py:89 ../src/common/check_paths.py:100 +#: ../src/common/check_paths.py:89 +#: ../src/common/check_paths.py:100 #: ../src/common/check_paths.py:107 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s ist eine Datei, aber es sollte ein Verzeichnis sein" -#: ../src/common/check_paths.py:90 ../src/common/check_paths.py:101 -#: ../src/common/check_paths.py:108 ../src/common/check_paths.py:116 +#: ../src/common/check_paths.py:90 +#: ../src/common/check_paths.py:101 +#: ../src/common/check_paths.py:108 +#: ../src/common/check_paths.py:116 msgid "Gajim will now exit" msgstr "Gajim wird nun beendet" @@ -5588,8 +5423,7 @@ msgstr "Sie haben folgende Gruppenchats verlassen:" #: ../src/common/config.py:56 msgid "Use D-Bus and Notification-Daemon to show notifications" -msgstr "" -"Verwende D-Bus und Notification-Daemon, um Benachrichtigungen zu zeigen" +msgstr "Verwende D-Bus und Notification-Daemon, um Benachrichtigungen zu zeigen" #: ../src/common/config.py:61 msgid "Time in minutes, after which your status changes to away." @@ -5608,11 +5442,8 @@ msgid "Not available as a result of being idle" msgstr "Nicht verfügbar, da untätig" #: ../src/common/config.py:83 -msgid "" -"List (space separated) of rows (accounts and groups) that are collapsed." -msgstr "" -"Liste (leerzeichengeteilt) von Reihen (Kontos und Gruppen), die eingeklappt " -"sind." +msgid "List (space separated) of rows (accounts and groups) that are collapsed." +msgstr "Liste (leerzeichengeteilt) von Reihen (Kontos und Gruppen), die eingeklappt sind." #: ../src/common/config.py:88 msgid "Enable link-local/zeroconf messaging" @@ -5633,64 +5464,32 @@ msgstr "" "'never' - Zeige nie die Zeit." #: ../src/common/config.py:93 -msgid "" -"Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " -"to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " -"This is used only if print_time is 'sometimes'." -msgstr "" -"Zeige die Zeit in Chats mittels ungenauer Uhr an. Werte für die " -"Ungenauigkeit sind 1 bis 4 oder 0, um die ungenaue Uhr zu deaktivieren. 1 " -"ist am Genauesten, 4 ist am Ungenaueste. Dies wird nur verwendet, wenn " -"print_time auf 'sometimes' gesetzt ist." +msgid "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. This is used only if print_time is 'sometimes'." +msgstr "Zeige die Zeit in Chats mittels ungenauer Uhr an. Werte für die Ungenauigkeit sind 1 bis 4 oder 0, um die ungenaue Uhr zu deaktivieren. 1 ist am Genauesten, 4 ist am Ungenaueste. Dies wird nur verwendet, wenn print_time auf 'sometimes' gesetzt ist." #: ../src/common/config.py:96 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Behandle * / _ Paare als mögliche Formatierungszeichen." #: ../src/common/config.py:97 -msgid "" -"If True, do not remove */_ . So *abc* will be bold but with * * not removed." -msgstr "" -"Wenn aktiviert, wird */_ nicht entfernt. So wird *abc* fett gedruckt, aber * " -"* wird nicht entfernt." +msgid "If True, do not remove */_ . So *abc* will be bold but with * * not removed." +msgstr "Wenn aktiviert, wird */_ nicht entfernt. So wird *abc* fett gedruckt, aber * * wird nicht entfernt." #: ../src/common/config.py:100 -msgid "" -"Uses ReStructured text markup to send HTML, plus ascii formatting if " -"selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" -"restructuredtext.html (If you want to use this, install docutils)" -msgstr "" -"Wenn aktiviert, wird reStructuredText für die HTML und ASCII-Formatierung " -"verwendet (falls dies erwünscht ist, installieren Sie docutils). " -"Informationen zur Syntax finden Sie unter http://docutils.sourceforge.net/" -"docs/ref/rst/restructuredtext.html (Englisch)" +msgid "Uses ReStructured text markup to send HTML, plus ascii formatting if selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html (If you want to use this, install docutils)" +msgstr "Wenn aktiviert, wird reStructuredText für die HTML und ASCII-Formatierung verwendet (falls dies erwünscht ist, installieren Sie docutils). Informationen zur Syntax finden Sie unter http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html (Englisch)" #: ../src/common/config.py:109 -msgid "" -"Character to add after nickname when using nick completion (tab) in group " -"chat." -msgstr "" -"Zeichen, das hinter Spitznamen angezeigt wird, wenn " -"Spitznamenvervollständigung (Tab) im Gruppenchat verwendet wird." +msgid "Character to add after nickname when using nick completion (tab) in group chat." +msgstr "Zeichen, das hinter Spitznamen angezeigt wird, wenn Spitznamenvervollständigung (Tab) im Gruppenchat verwendet wird." #: ../src/common/config.py:110 -msgid "" -"Character to propose to add after desired nickname when desired nickname is " -"used by someone else in group chat." -msgstr "" -"Zeichen, das hinter den gewünschten Spitznamen gehängt wird, falls der " -"gewünschteName im Gruppenchat bereits vergeben ist." +msgid "Character to propose to add after desired nickname when desired nickname is used by someone else in group chat." +msgstr "Zeichen, das hinter den gewünschten Spitznamen gehängt wird, falls der gewünschteName im Gruppenchat bereits vergeben ist." #: ../src/common/config.py:133 -msgid "" -"This option let you customize timestamp that is printed in conversation. For " -"exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " -"strftime for full documentation: http://docs.python.org/lib/module-time.html" -msgstr "" -"Hiermit lässt sich der Zeitstempel anpassen, der in den Unterhaltungen " -"verwendet wird. Zum Beispiel wird \"[%H:%M] \" zu \"[Stunde:Minute] \". " -"Weitere Informationen finden Sie in der Python-Dokumentation zu 'strftime' " -"unter http://docs.python.org/lib/module-time.html (Englisch)." +msgid "This option let you customize timestamp that is printed in conversation. For exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on strftime for full documentation: http://docs.python.org/lib/module-time.html" +msgstr "Hiermit lässt sich der Zeitstempel anpassen, der in den Unterhaltungen verwendet wird. Zum Beispiel wird \"[%H:%M] \" zu \"[Stunde:Minute] \". Weitere Informationen finden Sie in der Python-Dokumentation zu 'strftime' unter http://docs.python.org/lib/module-time.html (Englisch)." #: ../src/common/config.py:134 msgid "Characters that are printed before the nickname in conversations" @@ -5705,25 +5504,16 @@ msgid "Add * and [n] in roster title?" msgstr "Füge * und [n] in die Kontaktleiste?" #: ../src/common/config.py:143 -msgid "" -"How many lines to remember from previous conversation when a chat tab/window " -"is reopened." -msgstr "" -"Wie viele Zeilen von der vorherigen Unterhaltung gespeichert werden, wenn " -"ein Chat Tab/Fenster wieder geöffnet wird." +msgid "How many lines to remember from previous conversation when a chat tab/window is reopened." +msgstr "Wie viele Zeilen von der vorherigen Unterhaltung gespeichert werden, wenn ein Chat Tab/Fenster wieder geöffnet wird." #: ../src/common/config.py:144 msgid "How many minutes should last lines from previous conversation last." -msgstr "" -"Wie viele Minuten die Zeilen vom vorherigen Chat angezeigt werden sollen." +msgstr "Wie viele Minuten die Zeilen vom vorherigen Chat angezeigt werden sollen." #: ../src/common/config.py:145 -msgid "" -"Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " -"Client default behaviour)." -msgstr "" -"Sende Nachricht mit Strg+Enter und mache bei Enter einen Zeilenumbruch " -"(Mirabilis ICQ-Client Standardeinstellung)." +msgid "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ Client default behaviour)." +msgstr "Sende Nachricht mit Strg+Enter und mache bei Enter einen Zeilenumbruch (Mirabilis ICQ-Client Standardeinstellung)." #: ../src/common/config.py:147 msgid "How many lines to store for Ctrl+KeyUP." @@ -5731,81 +5521,45 @@ msgstr "Wie viele Zeilen für Strg+BildAuf gespeichert werden." #: ../src/common/config.py:150 #, python-format -msgid "" -"Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' " -"which means use wiktionary." -msgstr "" -"Entweder eine spezielle URL mit %s, wobei %s das Word/Phrase ist oder " -"'WIKTIONARY', was bedeutet, dass das Wörterbuch Wiktionary verwendet wird." +msgid "Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' which means use wiktionary." +msgstr "Entweder eine spezielle URL mit %s, wobei %s das Word/Phrase ist oder 'WIKTIONARY', was bedeutet, dass das Wörterbuch Wiktionary verwendet wird." #: ../src/common/config.py:153 msgid "If checked, Gajim can be controlled remotely using gajim-remote." -msgstr "" -"Falls aktiviert, kann Gajim von Außerhalb mittels gajim-remote kontrolliert " -"werden." +msgstr "Falls aktiviert, kann Gajim von Außerhalb mittels gajim-remote kontrolliert werden." #: ../src/common/config.py:154 -msgid "" -"If True, listen to D-Bus signals from NetworkManager and change the status " -"of accounts (provided they do not have listen_to_network_manager set to " -"False and they sync with global status) based upon the status of the network " -"connection." -msgstr "" -"Wenn aktiviert, reagiere auf D-Bus-Signale vom NetworkManager und ändere den " -"Status von Konten (vorausgesetzt, sie haben listen_to_network_manager nicht " -"auf False gesetzt und sie synchronisieren sich mit dem globalen Status) " -"basierend auf dem Status der Netzwerkverbindung." +msgid "If True, listen to D-Bus signals from NetworkManager and change the status of accounts (provided they do not have listen_to_network_manager set to False and they sync with global status) based upon the status of the network connection." +msgstr "Wenn aktiviert, reagiere auf D-Bus-Signale vom NetworkManager und ändere den Status von Konten (vorausgesetzt, sie haben listen_to_network_manager nicht auf False gesetzt und sie synchronisieren sich mit dem globalen Status) basierend auf dem Status der Netzwerkverbindung." #: ../src/common/config.py:155 -msgid "" -"Sent chat state notifications. Can be one of all, composing_only, disabled." -msgstr "" -"Chat-Statusbenachrichtigungen gesendet. Kann eine von allen sein, " -"composing_only deaktiviert." +msgid "Sent chat state notifications. Can be one of all, composing_only, disabled." +msgstr "Chat-Statusbenachrichtigungen gesendet. Kann eine von allen sein, composing_only deaktiviert." #: ../src/common/config.py:156 -msgid "" -"Displayed chat state notifications in chat windows. Can be one of all, " -"composing_only, disabled." -msgstr "" -"Angezeigte Chat-Status Benachrichtigungen im Chatfenster. Kann all, " -"composing_only oder disabled sein." +msgid "Displayed chat state notifications in chat windows. Can be one of all, composing_only, disabled." +msgstr "Angezeigte Chat-Status Benachrichtigungen im Chatfenster. Kann all, composing_only oder disabled sein." #: ../src/common/config.py:158 -msgid "" -"When not printing time for every message (print_time==sometimes), print it " -"every x minutes." -msgstr "" -"Wenn die Uhrzeit nicht für jede Nachricht angezeigt werden soll " -"(print_time==sometimes), zeige sie alle x Minuten." +msgid "When not printing time for every message (print_time==sometimes), print it every x minutes." +msgstr "Wenn die Uhrzeit nicht für jede Nachricht angezeigt werden soll (print_time==sometimes), zeige sie alle x Minuten." #: ../src/common/config.py:159 msgid "Ask before closing a group chat tab/window." msgstr "Fragen, bevor ein Gruppenchat Tab/Fenster geschlossen wird." #: ../src/common/config.py:160 -msgid "" -"Always ask before closing group chat tab/window in this space separated list " -"of group chat jids." -msgstr "" -"Immer fragen, bevor ein Gruppenchat-Fenster/Tab aus der Leerzeichen-" -"seperierten Liste von Gruppchatnamen geschlossen wird." +msgid "Always ask before closing group chat tab/window in this space separated list of group chat jids." +msgstr "Immer fragen, bevor ein Gruppenchat-Fenster/Tab aus der Leerzeichen-seperierten Liste von Gruppchatnamen geschlossen wird." #: ../src/common/config.py:161 -msgid "" -"Never ask before closing group chat tab/window in this space separated list " -"of group chat jids." -msgstr "" -"Niemals fragen, bevor ein Gruppenchat-Fenster/Tab aus der Leerzeichen-" -"seperierten Liste von Gruppenchatnamen geschlossen wird." +msgid "Never ask before closing group chat tab/window in this space separated list of group chat jids." +msgstr "Niemals fragen, bevor ein Gruppenchat-Fenster/Tab aus der Leerzeichen-seperierten Liste von Gruppenchatnamen geschlossen wird." #: ../src/common/config.py:164 -msgid "" -"Overrides the host we send for File Transfer in case of address translation/" -"port forwarding." -msgstr "" -"Überschreibt den Host für Datenübertragung für den Fall von NAT/Port-" -"Forwarding" +#, fuzzy +msgid "Comma separated list of hosts that we send, in addition of local interfaces, for File Transfer in case of address translation/port forwarding." +msgstr "Überschreibt den Host für Datenübertragung für den Fall von NAT/Port-Forwarding" #: ../src/common/config.py:166 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." @@ -5828,73 +5582,36 @@ msgid "Show close button in tab?" msgstr "Schließen-Button im Tab anzeigen?" #: ../src/common/config.py:189 -msgid "" -"A semicolon-separated list of words that will be highlighted in group chats." -msgstr "" -"Eine mit Semilkolon seperierte Liste von Worten, die in einem Gruppenchat " -"hervorgehoben werden." +msgid "A semicolon-separated list of words that will be highlighted in group chats." +msgstr "Eine mit Semilkolon seperierte Liste von Worten, die in einem Gruppenchat hervorgehoben werden." #: ../src/common/config.py:190 -msgid "" -"If True, quits Gajim when X button of Window Manager is clicked. This " -"setting is taken into account only if trayicon is used." -msgstr "" -"Falls aktiviert, wird Gajim beendet, wenn der X-Button des Fenstermanagers " -"geklickt wird. Diese Option wird nur beachtet, wenn die Trayicon-" -"Unterstützung aktiv ist." +msgid "If True, quits Gajim when X button of Window Manager is clicked. This setting is taken into account only if trayicon is used." +msgstr "Falls aktiviert, wird Gajim beendet, wenn der X-Button des Fenstermanagers geklickt wird. Diese Option wird nur beachtet, wenn die Trayicon-Unterstützung aktiv ist." #: ../src/common/config.py:191 -msgid "" -"If True, Gajim will check if it's the default jabber client on each startup." -msgstr "" -"Wenn aktiviert, wird Gajim beim Starten überprüfen, ob Gajim der Standard-" -"Jabber-Client ist." +msgid "If True, Gajim will check if it's the default jabber client on each startup." +msgstr "Wenn aktiviert, wird Gajim beim Starten überprüfen, ob Gajim der Standard-Jabber-Client ist." #: ../src/common/config.py:192 -msgid "" -"If True, Gajim will display an icon on each tab containing unread messages. " -"Depending on the theme, this icon may be animated." -msgstr "" -"Falls aktiviert, wird Gajim ein Icon auf jedem Tab mit ungelesenen " -"Nachrichten anzeigen. Abhängig vom Thema kann dieses Icon animiert sein." +msgid "If True, Gajim will display an icon on each tab containing unread messages. Depending on the theme, this icon may be animated." +msgstr "Falls aktiviert, wird Gajim ein Icon auf jedem Tab mit ungelesenen Nachrichten anzeigen. Abhängig vom Thema kann dieses Icon animiert sein." #: ../src/common/config.py:193 -msgid "" -"If True, Gajim will display the status message, if not empty, for every " -"contact under the contact name in roster window." -msgstr "" -"Falls aktiviert, wird Gajim für jeden Kontakt die Statusnachricht, falls " -"nicht leer, unter dem jeweiligen Kontaktnamen im Roster anzeigen." +msgid "If True, Gajim will display the status message, if not empty, for every contact under the contact name in roster window." +msgstr "Falls aktiviert, wird Gajim für jeden Kontakt die Statusnachricht, falls nicht leer, unter dem jeweiligen Kontaktnamen im Roster anzeigen." #: ../src/common/config.py:195 -msgid "" -"If True, Gajim will ask for avatar each contact that did not have an avatar " -"last time or has one cached that is too old." -msgstr "" -"Falls aktiviert fragt Gajim nach einem Avatar für jeden Kontakt, der beim " -"letzten Mal keinen hatte oder einen veralteten hat." +msgid "If True, Gajim will ask for avatar each contact that did not have an avatar last time or has one cached that is too old." +msgstr "Falls aktiviert fragt Gajim nach einem Avatar für jeden Kontakt, der beim letzten Mal keinen hatte oder einen veralteten hat." #: ../src/common/config.py:196 -msgid "" -"If False, Gajim will no longer print status line in chats when a contact " -"changes his or her status and/or his or her status message." -msgstr "" -"Falls deaktiviert, werden Sie keine Statuszeile im Chat sehen, wenn ein " -"Kontakt seinen Status und/oder seine Statusnachricht ändert." +msgid "If False, Gajim will no longer print status line in chats when a contact changes his or her status and/or his or her status message." +msgstr "Falls deaktiviert, werden Sie keine Statuszeile im Chat sehen, wenn ein Kontakt seinen Status und/oder seine Statusnachricht ändert." #: ../src/common/config.py:197 -msgid "" -"can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " -"longer print status line in groupchats when a member changes his or her " -"status and/or his or her status message. If \"all\" Gajim will print all " -"status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " -"group chat." -msgstr "" -"Kann \"none\", \"all\" oder \"in_and_out\" sein. Falls \"none\", wird Gajim " -"keine Status-Zeilen mehr in Gruppenchats anzeigen, wenn ein Mitglied seinen " -"Status oder seine Statusnachricht ändert. Falls \"all\", wird Gajim alle " -"Statusnachrichten anzeigen. Falls \"in_and_out\", wird Gajim nur einen " -"Status anzeigen, wenn jemand den Gruppenchat betritt oder verlässt." +msgid "can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no longer print status line in groupchats when a member changes his or her status and/or his or her status message. If \"all\" Gajim will print all status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves group chat." +msgstr "Kann \"none\", \"all\" oder \"in_and_out\" sein. Falls \"none\", wird Gajim keine Status-Zeilen mehr in Gruppenchats anzeigen, wenn ein Mitglied seinen Status oder seine Statusnachricht ändert. Falls \"all\", wird Gajim alle Statusnachrichten anzeigen. Falls \"in_and_out\", wird Gajim nur einen Status anzeigen, wenn jemand den Gruppenchat betritt oder verlässt." #: ../src/common/config.py:199 msgid "Background color of contacts when they just signed in." @@ -5905,11 +5622,8 @@ msgid "Background color of contacts when they just signed out." msgstr "Hintergrundfarbe von Kontakten wenn sie sich gerade noch abmeldeten." #: ../src/common/config.py:202 -msgid "" -"If True, restored messages will use a smaller font than the default one." -msgstr "" -"Falls aktiv, werden wiederhergestellte Nachrichten mit einer kleineren " -"Schrift als der Standard dargestellt." +msgid "If True, restored messages will use a smaller font than the default one." +msgstr "Falls aktiv, werden wiederhergestellte Nachrichten mit einer kleineren Schrift als der Standard dargestellt." #: ../src/common/config.py:203 msgid "Don't show avatar for the transport itself." @@ -5920,24 +5634,12 @@ msgid "Don't show roster in the system taskbar." msgstr "Kontaktliste nicht in der System-Taskleiste anzeigen." #: ../src/common/config.py:205 -msgid "" -"If True and installed GTK+ and PyGTK versions are at least 2.8, make the " -"window flash (the default behaviour in most Window Managers) when holding " -"pending events." -msgstr "" -"Wenn aktiviert und die installierten GTK+ und PyGTK Versionen wenigstens 2.8 " -"sind, lasse das Fenster bei neuen Ereignissen aufblitzen (Standardverhalten " -"in den meisten Window-Managers) " +msgid "If True and installed GTK+ and PyGTK versions are at least 2.8, make the window flash (the default behaviour in most Window Managers) when holding pending events." +msgstr "Wenn aktiviert und die installierten GTK+ und PyGTK Versionen wenigstens 2.8 sind, lasse das Fenster bei neuen Ereignissen aufblitzen (Standardverhalten in den meisten Window-Managers) " #: ../src/common/config.py:207 -msgid "" -"Jabberd1.4 does not like sha info when one join a password protected group " -"chat. Turn this option to False to stop sending sha info in group chat " -"presences." -msgstr "" -"Jabberd1.4 mag keine SHA-Informationen wenn ein passwortgeschützter " -"Gruppenchat betreten wird. Deaktivieren Sie diese Option um keine SHA-" -"Informationen in Gruppenchats zu senden" +msgid "Jabberd1.4 does not like sha info when one join a password protected group chat. Turn this option to False to stop sending sha info in group chat presences." +msgstr "Jabberd1.4 mag keine SHA-Informationen wenn ein passwortgeschützter Gruppenchat betreten wird. Deaktivieren Sie diese Option um keine SHA-Informationen in Gruppenchats zu senden" #. always, never, peracct, pertype should not be translated #: ../src/common/config.py:210 @@ -5946,23 +5648,17 @@ msgid "" "'always' - All messages are sent to a single window.\n" "'never' - All messages get their own window.\n" "'peracct' - Messages for each account are sent to a specific window.\n" -"'pertype' - Each message type (e.g., chats vs. groupchats) are sent to a " -"specific window. Note, changing this option requires restarting Gajim before " -"the changes will take effect." +"'pertype' - Each message type (e.g., chats vs. groupchats) are sent to a specific window. Note, changing this option requires restarting Gajim before the changes will take effect." msgstr "" "Kontrolliert das Fenster in dem neue Nachrichten platziert werden.\n" "'always' - Alle Nachrichten landen in einem einzelnen Fenster.\n" "'never' - Alle Nachrichten bekommen ihr eigenes Fenster.\n" -"'peracct' - Nachrichten für jeden Account landen in einem speziellen " -"Fenster.\n" -"'pertype' - Jede Nachrichtentyp (z.B. Chat vs. Gruppenchat) landet in in " -"einem speziellen Fenster. Falls Sie diese Option ändern, muss Gajim neu " -"gestartet werden, damit die Änderungen übernommen werden" +"'peracct' - Nachrichten für jeden Account landen in einem speziellen Fenster.\n" +"'pertype' - Jede Nachrichtentyp (z.B. Chat vs. Gruppenchat) landet in in einem speziellen Fenster. Falls Sie diese Option ändern, muss Gajim neu gestartet werden, damit die Änderungen übernommen werden" #: ../src/common/config.py:211 msgid "If False, you will no longer see the avatar in the chat window." -msgstr "" -"Wenn deaktiviert, werden Sie den Avatar nicht mehr im Chatfenster sehen." +msgstr "Wenn deaktiviert, werden Sie den Avatar nicht mehr im Chatfenster sehen." #: ../src/common/config.py:212 msgid "If True, pressing the escape key closes a tab/window." @@ -5989,214 +5685,179 @@ msgid "Hides the group chat occupants list in group chat window." msgstr "Versteckt die Gruppenchat-Benutzerliste im Gruppenchat-Fenster." #: ../src/common/config.py:218 -msgid "" -"In a chat, show the nickname at the beginning of a line only when it's not " -"the same person talking than in previous message." -msgstr "" -"Zeige in einem Chat den Spitznamen nur dann am Beginn einer Linie, wenn es " -"nicht die selbe Person ist die schon die letzte Nachricht geschrieben hat." +msgid "In a chat, show the nickname at the beginning of a line only when it's not the same person talking than in previous message." +msgstr "Zeige in einem Chat den Spitznamen nur dann am Beginn einer Linie, wenn es nicht die selbe Person ist die schon die letzte Nachricht geschrieben hat." #: ../src/common/config.py:219 msgid "Indentation when using merge consecutive nickname." -msgstr "" -"Einrückung, wenn das Zusammenführen nachfolgender Spitznamen verwendet wird." +msgstr "Einrückung, wenn das Zusammenführen nachfolgender Spitznamen verwendet wird." #: ../src/common/config.py:220 msgid "List of colors that will be used to color nicknames in group chats." -msgstr "" -"Farbliste, die für die Einfärbung von Spitzenamen im Gruppenchat verwendet " -"wird." +msgstr "Farbliste, die für die Einfärbung von Spitzenamen im Gruppenchat verwendet wird." #: ../src/common/config.py:221 msgid "Ctrl-Tab go to next composing tab when none is unread." -msgstr "" -"Strg-Tab, um zum nächsten Reiter zu gehen, wenn kein Anderer neue " -"Nachrichten enthält." +msgstr "Strg-Tab, um zum nächsten Reiter zu gehen, wenn kein Anderer neue Nachrichten enthält." #: ../src/common/config.py:222 -msgid "" -"Should we show the confirm metacontacts creation dialog or not? Empty string " -"means we never show the dialog." -msgstr "" -"Soll der Bestätigungsdialog beim Erstellen von Metakontakten angezeigt " -"werden oder nicht? Bei leerer Zeichenfolge wird der Dialog nie gezeigt." +msgid "Should we show the confirm metacontacts creation dialog or not? Empty string means we never show the dialog." +msgstr "Soll der Bestätigungsdialog beim Erstellen von Metakontakten angezeigt werden oder nicht? Bei leerer Zeichenfolge wird der Dialog nie gezeigt." #: ../src/common/config.py:223 -msgid "" -"If True, you will be able to set a negative priority to your account in " -"account modification window. BE CAREFUL, when you are logged in with a " -"negative priority, you will NOT receive any message from your server." -msgstr "" -"Wenn aktiviert, werden Sie in der Lage sein eine negative Priorität für Ihr " -"Konto im Konto-Bearbeiten Fenster zu setzen. SEIEN SIE VORSICHTIG, wenn Sie " -"mit einer negativen Priorität angemeldet sind: Sie werden KEINE Nachrichten " -"mehr von Ihrem Server erhalten." +msgid "If True, you will be able to set a negative priority to your account in account modification window. BE CAREFUL, when you are logged in with a negative priority, you will NOT receive any message from your server." +msgstr "Wenn aktiviert, werden Sie in der Lage sein eine negative Priorität für Ihr Konto im Konto-Bearbeiten Fenster zu setzen. SEIEN SIE VORSICHTIG, wenn Sie mit einer negativen Priorität angemeldet sind: Sie werden KEINE Nachrichten mehr von Ihrem Server erhalten." #: ../src/common/config.py:224 -msgid "" -"If True, Gajim will use Gnome Keyring (if available) to store account " -"passwords." -msgstr "" -"Wenn aktiviert, wird Gnome Keyring (falls verfügbar) verwendet, um die " -"Passwörter der Konten zu speichern." +msgid "If True, Gajim will use Gnome Keyring (if available) to store account passwords." +msgstr "Wenn aktiviert, wird Gnome Keyring (falls verfügbar) verwendet, um die Passwörter der Konten zu speichern." #: ../src/common/config.py:225 -msgid "" -"If True, Gajim will show number of online and total contacts in account and " -"group rows." -msgstr "" -"Wenn aktiviert, wird Gajim die Anzahl der angemeldeten und gesamten Kontakte " -"in den Konto- und Gruppenreihen anzeigen." +msgid "If True, Gajim will show number of online and total contacts in account and group rows." +msgstr "Wenn aktiviert, wird Gajim die Anzahl der angemeldeten und gesamten Kontakte in den Konto- und Gruppenreihen anzeigen." #: ../src/common/config.py:226 -msgid "" -"Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " -"as if they were of this type" -msgstr "" -"Kann leer, 'chat' oder 'normal' sein. Wenn nicht leer, dann werden alle " -"eingehenden Nachrichten so behandelt, als wären sie von diesem Typ." +msgid "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages as if they were of this type" +msgstr "Kann leer, 'chat' oder 'normal' sein. Wenn nicht leer, dann werden alle eingehenden Nachrichten so behandelt, als wären sie von diesem Typ." -#: ../src/common/config.py:237 -msgid "" -"Priority will change automatically according to your status. Priorities are " -"defined in autopriority_* options." +#: ../src/common/config.py:227 +msgid "If True, Gajim will scroll and select the contact who sent you the last message, if chat window is not already opened." msgstr "" -"Die Priorität wird automatisch dem Status entsprechend geändert. Prioritäten " -"sind in den autopriority_* Optionen definiert." + +#: ../src/common/config.py:238 +msgid "Priority will change automatically according to your status. Priorities are defined in autopriority_* options." +msgstr "Die Priorität wird automatisch dem Status entsprechend geändert. Prioritäten sind in den autopriority_* Optionen definiert." #. yes, no, ask -#: ../src/common/config.py:266 +#: ../src/common/config.py:267 msgid "Jabberd2 workaround" msgstr "Jabberd2 Workaround" -#: ../src/common/config.py:270 -msgid "" -"If checked, Gajim will use your IP and proxies defined in " -"file_transfer_proxies option for file transfer." -msgstr "" -"Wenn aktiviert, wird Gajim Ihre IP und die in der file_transfer_proxies " -"Option definierten Proxies für den Datentransfer verwenden." +#: ../src/common/config.py:271 +msgid "If checked, Gajim will use your IP and proxies defined in file_transfer_proxies option for file transfer." +msgstr "Wenn aktiviert, wird Gajim Ihre IP und die in der file_transfer_proxies Option definierten Proxies für den Datentransfer verwenden." -#: ../src/common/config.py:329 +#: ../src/common/config.py:330 msgid "Is OpenPGP enabled for this contact?" msgstr "Ist OpenPGP für diesen Kontakt aktiviert?" -#: ../src/common/config.py:330 ../src/common/config.py:333 +#: ../src/common/config.py:331 +#: ../src/common/config.py:334 msgid "Language for which we want to check misspelled words" msgstr "Sprache für, die nach falsch geschriebenen Wörtern gesucht werden soll" -#: ../src/common/config.py:339 +#: ../src/common/config.py:340 msgid "all or space separated status" msgstr "alle oder Leerzeichen-getrennter Status" -#: ../src/common/config.py:340 +#: ../src/common/config.py:341 msgid "'yes', 'no', or 'both'" msgstr "'ja', 'nein' oder 'beide'" -#: ../src/common/config.py:341 ../src/common/config.py:343 -#: ../src/common/config.py:344 ../src/common/config.py:347 +#: ../src/common/config.py:342 +#: ../src/common/config.py:344 +#: ../src/common/config.py:345 #: ../src/common/config.py:348 +#: ../src/common/config.py:349 msgid "'yes', 'no' or ''" msgstr "'ja, 'nein' oder ''" -#: ../src/common/config.py:354 +#: ../src/common/config.py:355 msgid "Sleeping" msgstr "Schlafen" -#: ../src/common/config.py:355 +#: ../src/common/config.py:356 msgid "Back soon" msgstr "Bin gleich wieder da" -#: ../src/common/config.py:355 +#: ../src/common/config.py:356 msgid "Back in some minutes." msgstr "Bin in ein paar Minuten zurück." -#: ../src/common/config.py:356 +#: ../src/common/config.py:357 msgid "Eating" msgstr "Essen" -#: ../src/common/config.py:356 +#: ../src/common/config.py:357 msgid "I'm eating, so leave me a message." msgstr "Ich esse gerade, also hinterlasst eine Nachricht." -#: ../src/common/config.py:357 +#: ../src/common/config.py:358 msgid "Movie" msgstr "Film" -#: ../src/common/config.py:357 +#: ../src/common/config.py:358 msgid "I'm watching a movie." msgstr "Ich sehe mir einen Film an." -#: ../src/common/config.py:358 +#: ../src/common/config.py:359 msgid "Working" msgstr "Arbeiten" -#: ../src/common/config.py:358 +#: ../src/common/config.py:359 msgid "I'm working." msgstr "Ich arbeite." -#: ../src/common/config.py:359 +#: ../src/common/config.py:360 msgid "Phone" msgstr "Telefon" -#: ../src/common/config.py:359 +#: ../src/common/config.py:360 msgid "I'm on the phone." msgstr "Ich telefoniere." -#: ../src/common/config.py:360 +#: ../src/common/config.py:361 msgid "Out" msgstr "Draußen" -#: ../src/common/config.py:360 +#: ../src/common/config.py:361 msgid "I'm out enjoying life." msgstr "Ich bin draußen und genieße das Leben." -#: ../src/common/config.py:364 +#: ../src/common/config.py:365 msgid "I'm available." msgstr "Ich bin angemeldet." -#: ../src/common/config.py:365 +#: ../src/common/config.py:366 msgid "I'm free for chat." msgstr "Ich bin frei zum Chatten." -#: ../src/common/config.py:367 +#: ../src/common/config.py:368 msgid "I'm not available." msgstr "Ich bin nicht verfügbar." -#: ../src/common/config.py:368 +#: ../src/common/config.py:369 msgid "Do not disturb." msgstr "Bitte nicht stören." -#: ../src/common/config.py:369 ../src/common/config.py:370 +#: ../src/common/config.py:370 +#: ../src/common/config.py:371 msgid "Bye!" msgstr "Auf Wiedersehen!" -#: ../src/common/config.py:379 -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 "" -"Abzuspielender Ton, falls eine Gruppenchat-Nachricht eines der Wörter aus " -"der muc_highlights_works-Liste oder Ihren Spitznamen enthält." - #: ../src/common/config.py:380 -msgid "Sound to play when any MUC message arrives." -msgstr "" -"Ton der beim empfangen einer Gruppenchat-Nachricht abgespielt werden soll" +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 "Abzuspielender Ton, falls eine Gruppenchat-Nachricht eines der Wörter aus der muc_highlights_works-Liste oder Ihren Spitznamen enthält." -#: ../src/common/config.py:389 ../src/common/optparser.py:193 +#: ../src/common/config.py:381 +msgid "Sound to play when any MUC message arrives." +msgstr "Ton der beim empfangen einer Gruppenchat-Nachricht abgespielt werden soll" + +#: ../src/common/config.py:390 +#: ../src/common/optparser.py:195 msgid "green" msgstr "grün" -#: ../src/common/config.py:393 ../src/common/optparser.py:179 +#: ../src/common/config.py:394 +#: ../src/common/optparser.py:181 msgid "grocery" msgstr "gemüse" -#: ../src/common/config.py:397 +#: ../src/common/config.py:398 msgid "human" msgstr "menschlich" -#: ../src/common/config.py:401 +#: ../src/common/config.py:402 msgid "marine" msgstr "Marine" @@ -6205,27 +5866,28 @@ msgstr "Marine" msgid "Unable to load idle module" msgstr "Konnte Idle-Modus nicht laden" -#: ../src/common/connection_handlers.py:177 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 +#: ../src/common/connection_handlers.py:180 +#: ../src/common/connection_handlers.py:215 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 msgid "Wrong host" msgstr "Falscher Host" -#: ../src/common/connection_handlers.py:177 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 -msgid "" -"The host you configured as the ft_override_host_to_send advanced option is " -"not valid, so ignored." -msgstr "" -"Der Host, den Sie für die erweiterte Option ft_override_host_to_send angeben " -"haben ist ungültig und wird ignoriert." +#: ../src/common/connection_handlers.py:180 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 +#, fuzzy, python-format +msgid "The host %s you configured as the ft_add_hosts_to_send advanced option is not valid, so ignored." +msgstr "Der Host, den Sie für die erweiterte Option ft_override_host_to_send angeben haben ist ungültig und wird ignoriert." -#: ../src/common/connection_handlers.py:590 +#: ../src/common/connection_handlers.py:216 +msgid "Invalid local address? :-O" +msgstr "" + +#: ../src/common/connection_handlers.py:607 #, python-format msgid "Registration information for transport %s has not arrived in time" -msgstr "" -"Registrierungsinformation für Transport %s sind nicht rechtzeitig angekommen" +msgstr "Registrierungsinformation für Transport %s sind nicht rechtzeitig angekommen" -#: ../src/common/connection_handlers.py:1543 +#: ../src/common/connection_handlers.py:1544 #, python-format msgid "Nickname not allowed: %s" msgstr "Spitzname nicht erlaubt: %s" @@ -6233,195 +5895,183 @@ msgstr "Spitzname nicht erlaubt: %s" #. password required to join #. we are banned #. group chat does not exist -#: ../src/common/connection_handlers.py:1605 -#: ../src/common/connection_handlers.py:1608 -#: ../src/common/connection_handlers.py:1611 -#: ../src/common/connection_handlers.py:1614 -#: ../src/common/connection_handlers.py:1617 -#: ../src/common/connection_handlers.py:1620 -#: ../src/common/connection_handlers.py:1628 +#: ../src/common/connection_handlers.py:1609 +#: ../src/common/connection_handlers.py:1612 +#: ../src/common/connection_handlers.py:1615 +#: ../src/common/connection_handlers.py:1618 +#: ../src/common/connection_handlers.py:1621 +#: ../src/common/connection_handlers.py:1624 +#: ../src/common/connection_handlers.py:1632 msgid "Unable to join group chat" msgstr "Fehler beim Betreten des Gruppenchats" -#: ../src/common/connection_handlers.py:1606 +#: ../src/common/connection_handlers.py:1610 msgid "A password is required to join this group chat." msgstr "Für das Betreten dieses Gruppenchats ist ein Passwort nötig." -#: ../src/common/connection_handlers.py:1609 +#: ../src/common/connection_handlers.py:1613 msgid "You are banned from this group chat." msgstr "Sie sind von diesem Gruppenchat gebannt." -#: ../src/common/connection_handlers.py:1612 +#: ../src/common/connection_handlers.py:1616 msgid "Such group chat does not exist." msgstr "Dieser Gruppenchat existiert nicht." -#: ../src/common/connection_handlers.py:1615 +#: ../src/common/connection_handlers.py:1619 msgid "Group chat creation is restricted." msgstr "Gruppenchaterstellung ist beschränkt." -#: ../src/common/connection_handlers.py:1618 +#: ../src/common/connection_handlers.py:1622 msgid "Your registered nickname must be used." msgstr "Sie müssen Ihren registrierten Spitznamen verwenden" -#: ../src/common/connection_handlers.py:1621 +#: ../src/common/connection_handlers.py:1625 msgid "You are not in the members list." msgstr "Sie sind nicht in der Mitgliedliste" -#: ../src/common/connection_handlers.py:1629 +#: ../src/common/connection_handlers.py:1633 msgid "" "Your desired nickname is in use or registered by another occupant.\n" "Please specify another nickname below:" msgstr "" -"Der gewünschte Benutzername wird bereits verwendet oder ist von einem " -"anderen Benutzer registriert.\n" +"Der gewünschte Benutzername wird bereits verwendet oder ist von einem anderen Benutzer registriert.\n" "Bitte geben Sie einen anderen Benutzernamen an:" -#: ../src/common/connection_handlers.py:1679 +#. Room has been destroyed. see +#. http://www.xmpp.org/extensions/xep-0045.html#destroyroom +#: ../src/common/connection_handlers.py:1676 +#, fuzzy +msgid "Room has been destroyed" +msgstr "Autorisierung wurde entfernt" + +#: ../src/common/connection_handlers.py:1683 +#, python-format +msgid "You can join this room instead: %s" +msgstr "" + +#: ../src/common/connection_handlers.py:1709 msgid "I would like to add you to my roster." msgstr "Ich würde dich gerne zu meiner Liste hinzufügen." #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:1700 +#: ../src/common/connection_handlers.py:1730 #, python-format msgid "we are now subscribed to %s" msgstr "wir haben jetzt %s abonniert" -#: ../src/common/connection_handlers.py:1702 +#: ../src/common/connection_handlers.py:1732 #, python-format msgid "unsubscribe request from %s" msgstr "Anfrage zur Kündigung des Abonnements von %s" -#: ../src/common/connection_handlers.py:1704 +#: ../src/common/connection_handlers.py:1734 #, python-format msgid "we are now unsubscribed from %s" msgstr "%s hat das Abonnement beendet" -#: ../src/common/connection_handlers.py:1874 +#: ../src/common/connection_handlers.py:1851 #, python-format -msgid "" -"JID %s is not RFC compliant. It will not be added to your roster. Use roster " -"management tools such as http://jru.jabberstudio.org/ to remove it" -msgstr "" -"Jid %s ist nicht RFC-konform. Sie wird nicht zu ihrem Roster hinzugefügt. " -"Verwenden Sie ein Roster-Managment-Tool wie , " -"um ihn zu entfernen" +msgid "JID %s is not RFC compliant. It will not be added to your roster. Use roster management tools such as http://jru.jabberstudio.org/ to remove it" +msgstr "Jid %s ist nicht RFC-konform. Sie wird nicht zu ihrem Roster hinzugefügt. Verwenden Sie ein Roster-Managment-Tool wie , um ihn zu entfernen" -#: ../src/common/connection.py:182 +#: ../src/common/connection.py:193 #: ../src/common/zeroconf/connection_zeroconf.py:196 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Verbindung mit Konto \"%s\" abgebrochen" -#: ../src/common/connection.py:183 +#: ../src/common/connection.py:194 msgid "Reconnect manually." msgstr "Manuelle Neuverbindung." -#: ../src/common/connection.py:194 ../src/common/connection.py:221 +#: ../src/common/connection.py:205 +#: ../src/common/connection.py:232 #, python-format msgid "Transport %s answered wrongly to register request: %s" -msgstr "" -"Transport %s beantwortete unsere Registrierungsanfrage nicht korrekt: %s" +msgstr "Transport %s beantwortete unsere Registrierungsanfrage nicht korrekt: %s" #. wrong answer -#: ../src/common/connection.py:220 +#: ../src/common/connection.py:231 msgid "Invalid answer" msgstr "Ungültige Antwort" -#: ../src/common/connection.py:417 ../src/common/connection.py:516 -#: ../src/common/connection.py:974 +#: ../src/common/connection.py:379 +#, fuzzy +msgid "Connection to proxy failed" +msgstr "Verbindung fehlgeschlagen" + +#: ../src/common/connection.py:433 +#: ../src/common/connection.py:531 +#: ../src/common/connection.py:984 #: ../src/common/zeroconf/connection_zeroconf.py:217 #, python-format msgid "Could not connect to \"%s\"" msgstr "Konnte nicht mit %s verbinden" -#: ../src/common/connection.py:431 +#: ../src/common/connection.py:447 #, python-format msgid "Connected to server %s:%s with %s" msgstr "Verbunden mit Server %s:%s mit %s" -#: ../src/common/connection.py:445 +#: ../src/common/connection.py:460 #, python-format msgid "Security error connecting to \"%s\"" msgstr "Konnte nicht mit %s verbinden" -#: ../src/common/connection.py:446 -msgid "" -"The server's key has changed, or someone is trying to hack your connection." -msgstr "" -"Der Schlüssel des Servers wurde geändert oder jemand versucht ihre " -"Verbindung zu hacken." +#: ../src/common/connection.py:461 +msgid "The server's key has changed, or someone is trying to hack your connection." +msgstr "Der Schlüssel des Servers wurde geändert oder jemand versucht ihre Verbindung zu hacken." -#: ../src/common/connection.py:453 +#: ../src/common/connection.py:468 #, python-format msgid "Unable to check fingerprint for %s. Connection could be insecure." -msgstr "" -"Konnte Fingerabdruck von %s nicht überprüfen. Die Verbindung ist " -"möglicherweise unsicher." +msgstr "Konnte Fingerabdruck von %s nicht überprüfen. Die Verbindung ist möglicherweise unsicher." -#: ../src/common/connection.py:495 +#: ../src/common/connection.py:510 #, python-format msgid "Missing fingerprint in SSL connection to %s" msgstr "Fehlender Fingerabdruck in der SSL-Verbindung zu %s" -#: ../src/common/connection.py:501 +#: ../src/common/connection.py:516 #, python-format msgid "Fingerprint mismatch for %s: Got %s, expected %s" msgstr "Fingerabdruck von %s stimmt nicht überein: Erhalten %s, erwartet %s" -#: ../src/common/connection.py:517 +#: ../src/common/connection.py:532 msgid "Check your connection or try again later" msgstr "Überprüfen Sie die Verbindung oder versuchen Sie es später noch einmal" -#: ../src/common/connection.py:543 +#: ../src/common/connection.py:558 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Authentifizierung mit \"%s\" fehlgeschlagen" -#: ../src/common/connection.py:544 +#: ../src/common/connection.py:559 msgid "Please check your login and password for correctness." msgstr "Bitte überprüfen Sie ihren Benutzernamen und Passwort." -#: ../src/common/connection.py:571 +#: ../src/common/connection.py:586 msgid "Error while removing privacy list" msgstr "Fehler beim Entfernen der Privatliste" -#: ../src/common/connection.py:572 +#: ../src/common/connection.py:587 #, 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 "" -"Privatliste %s wurde nicht entfernt. Möglicherweise ist die Privatliste noch " -"in einer Ihrer Verbindungen aktiv. Deaktivieren Sie diese und versuchen Sie " -"es erneut." +msgid "Privacy list %s has not been removed. It is maybe active in one of your connected resources. Deactivate it and try again." +msgstr "Privatliste %s wurde nicht entfernt. Möglicherweise ist die Privatliste noch in einer Ihrer Verbindungen aktiv. Deaktivieren Sie diese und versuchen Sie es erneut." #. We didn't set a passphrase -#: ../src/common/connection.py:670 +#: ../src/common/connection.py:685 #: ../src/common/zeroconf/connection_zeroconf.py:156 msgid "OpenPGP passphrase was not given" msgstr "Keine OpenPGP-Passphrase gewählt" -#. do not show I'm invisible! -#: ../src/common/connection.py:712 -msgid "invisible" -msgstr "unsichtbar" - -#: ../src/common/connection.py:713 -msgid "offline" -msgstr "abgemeldet" - -#: ../src/common/connection.py:714 -#, python-format -msgid "I'm %s" -msgstr "Ich bin %s" - #. we're not english #. one in locale and one en -#: ../src/common/connection.py:805 +#: ../src/common/connection.py:814 msgid "[This message is *encrypted* (See :JEP:`27`]" msgstr "[Diese Nachricht ist *verschlüsselt* (Siehe: JEP:`27`)]" -#: ../src/common/connection.py:861 +#: ../src/common/connection.py:870 #: ../src/common/zeroconf/connection_zeroconf.py:397 #, python-format msgid "" @@ -6431,7 +6081,7 @@ msgstr "" "Thema: %s\n" "%s" -#: ../src/common/connection.py:1000 +#: ../src/common/connection.py:1010 msgid "Not fetched because of invisible status" msgstr "Nicht abgeholt aufgrund eines Unsichtbar-Status" @@ -6450,14 +6100,11 @@ msgstr "Gajims D-BUS-Möglichkeiten können nicht genutzt werden" #: ../src/common/exceptions.py:22 msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." -msgstr "" -"pysqlite2 (auch python-pysqlite2 genannt) Abhängigkeit fehlt. Beende ..." +msgstr "pysqlite2 (auch python-pysqlite2 genannt) Abhängigkeit fehlt. Beende ..." #: ../src/common/exceptions.py:30 msgid "Service not available: Gajim is not running, or remote_control is False" -msgstr "" -"Dienst nicht verfügbar: Gajim ist nicht aktiv oder remote_control ist " -"deaktiviert" +msgstr "Dienst nicht verfügbar: Gajim ist nicht aktiv oder remote_control ist deaktiviert" #: ../src/common/exceptions.py:38 msgid "D-Bus is not present on this machine or python module is missing" @@ -6467,9 +6114,7 @@ msgstr "D-Bus auf diesem Computer nicht vorhanden oder das Python-Modul fehlt" msgid "" "Session bus is not available.\n" "Try reading http://trac.gajim.org/wiki/GajimDBus" -msgstr "" -"Sitzungsbus ist nicht verfügbar.\"Bitte lesen Sie http://trac.gajim.org/wiki/" -"GajimDBus (Englisch)" +msgstr "Sitzungsbus ist nicht verfügbar.\"Bitte lesen Sie http://trac.gajim.org/wiki/GajimDBus (Englisch)" #: ../src/common/fuzzyclock.py:42 msgid "one" @@ -6521,55 +6166,68 @@ msgstr "Zwölf" #. Strings to use for the output. %0 will be replaced with the preceding hour (e.g. "x PAST %0"), %1 with the coming hour (e.g. "x TO %1). ''' #. A "singular-form". It is used when talking about hour 0 -#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 +#: ../src/common/fuzzyclock.py:47 +#: ../src/common/fuzzyclock.py:55 msgid "$0 o'clock" msgstr "%0 Uhr" -#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 +#: ../src/common/fuzzyclock.py:47 +#: ../src/common/fuzzyclock.py:55 msgid "five past $0" msgstr "fünf nach %0" -#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 +#: ../src/common/fuzzyclock.py:48 +#: ../src/common/fuzzyclock.py:56 msgid "ten past $0" msgstr "zehn nach %0" -#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 +#: ../src/common/fuzzyclock.py:48 +#: ../src/common/fuzzyclock.py:56 msgid "quarter past $0" msgstr "viertel nach %0" -#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 +#: ../src/common/fuzzyclock.py:49 +#: ../src/common/fuzzyclock.py:57 msgid "twenty past $0" msgstr "zwanzig nach %0" -#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 +#: ../src/common/fuzzyclock.py:49 +#: ../src/common/fuzzyclock.py:57 msgid "twenty five past $0" msgstr "fünfundzwanzig nach %0" -#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 +#: ../src/common/fuzzyclock.py:50 +#: ../src/common/fuzzyclock.py:58 msgid "half past $0" msgstr "dreißig nach %0" -#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 +#: ../src/common/fuzzyclock.py:50 +#: ../src/common/fuzzyclock.py:58 msgid "twenty five to $1" msgstr "fünfundzwanzig vor %1" -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 +#: ../src/common/fuzzyclock.py:51 +#: ../src/common/fuzzyclock.py:59 msgid "twenty to $1" msgstr "zwanzig vor %1" -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 +#: ../src/common/fuzzyclock.py:51 +#: ../src/common/fuzzyclock.py:59 msgid "quarter to $1" msgstr "viertel vor %1" -#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +#: ../src/common/fuzzyclock.py:52 +#: ../src/common/fuzzyclock.py:60 msgid "ten to $1" msgstr "zehn vor %1" -#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +#: ../src/common/fuzzyclock.py:52 +#: ../src/common/fuzzyclock.py:60 msgid "five to $1" msgstr "fünf vor %1" -#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:61 +#: ../src/common/fuzzyclock.py:52 +#: ../src/common/fuzzyclock.py:61 msgid "$1 o'clock" msgstr "%1 Uhr" @@ -6848,7 +6506,8 @@ msgid_plural " %d unread private messages" msgstr[0] " %d ungelesene private Nachricht" msgstr[1] " %d ungelesene private Nachrichten" -#: ../src/common/helpers.py:918 ../src/common/helpers.py:920 +#: ../src/common/helpers.py:918 +#: ../src/common/helpers.py:920 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" @@ -6859,15 +6518,16 @@ msgstr "Gajim - %s" msgid "error: cannot open %s for reading" msgstr "Fehler: %s kann nicht zum Lesen geöffnet werden" -#: ../src/common/optparser.py:179 +#: ../src/common/optparser.py:181 msgid "gtk+" msgstr "gtk+" -#: ../src/common/optparser.py:188 ../src/common/optparser.py:189 +#: ../src/common/optparser.py:190 +#: ../src/common/optparser.py:191 msgid "cyan" msgstr "cyan" -#: ../src/common/optparser.py:306 +#: ../src/common/optparser.py:308 msgid "migrating logs database to indices" msgstr "migriere Logdatenbank zu Indices" @@ -6877,32 +6537,24 @@ msgid "Gajim account %s" msgstr "Gajim-Konto %s" #: ../src/common/zeroconf/client_zeroconf.py:189 -msgid "" -"Connection to host could not be established: Incorrect answer from server." -msgstr "" -"Verbindung zum Host konnte nicht aufgebaut werden: Fehlerhafte Antwort vom " -"Server." +msgid "Connection to host could not be established: Incorrect answer from server." +msgstr "Verbindung zum Host konnte nicht aufgebaut werden: Fehlerhafte Antwort vom Server." #: ../src/common/zeroconf/client_zeroconf.py:205 msgid "Connection to host could not be established" msgstr "Verbindung zu Host konnte nicht hergestellt werden" -#: ../src/common/zeroconf/client_zeroconf.py:334 -msgid "" -"Connection to host could not be established: Timeout while sending data." -msgstr "" -"Verbindung zum Host konnte nicht hergestellt werden: Zeitüberschreitung beim " -"Senden von Daten." +#: ../src/common/zeroconf/client_zeroconf.py:339 +msgid "Connection to host could not be established: Timeout while sending data." +msgstr "Verbindung zum Host konnte nicht hergestellt werden: Zeitüberschreitung beim Senden von Daten." -#: ../src/common/zeroconf/client_zeroconf.py:627 +#: ../src/common/zeroconf/client_zeroconf.py:632 msgid "Contact is offline. Your message could not be sent." msgstr "Kontakt ist offline. Ihre Nachricht konnte nicht versendet werden." #: ../src/common/zeroconf/connection_zeroconf.py:197 msgid "To continue sending and receiving messages, you will need to reconnect." -msgstr "" -"Um weiterhin Nachrichten Senden und Empfangen zu können, müssen Sie sich " -"erneut verbinden." +msgstr "Um weiterhin Nachrichten Senden und Empfangen zu können, müssen Sie sich erneut verbinden." #: ../src/common/zeroconf/connection_zeroconf.py:207 msgid "Avahi error" @@ -6942,12 +6594,8 @@ msgid "Could not change status of account \"%s\"" msgstr "Der Status des Kontos \"%s\" konnte nicht geändert werden." #: ../src/common/zeroconf/connection_zeroconf.py:341 -msgid "" -"You are not connected or not visible to others. Your message could not be " -"sent." -msgstr "" -"Sie sind nicht verbunden oder für andere nicht sichtbar. Ihre Nachricht " -"konnte nicht versendet werden." +msgid "You are not connected or not visible to others. Your message could not be sent." +msgstr "Sie sind nicht verbunden oder für andere nicht sichtbar. Ihre Nachricht konnte nicht versendet werden." #. we're not english #: ../src/common/zeroconf/connection_zeroconf.py:353 @@ -6959,271 +6607,195 @@ msgstr "[Diese Nachricht ist verschlüsselt]" msgid "Error while adding service. %s" msgstr "Fehler beim Hinzufügen des Dienstes. %s" +#~ msgid "Private Chat" +#~ msgstr "Privater Chat" +#~ msgid "Group Chat" +#~ msgstr "Gruppenchat" +#~ msgid "invisible" +#~ msgstr "unsichtbar" +#~ msgid "offline" +#~ msgstr "abgemeldet" +#~ msgid "I'm %s" +#~ msgstr "Ich bin %s" #~ msgid "2003-12-13T18:30:02Z" #~ msgstr "2003-12-13T18:30:02Z" - #~ msgid "Romeo and Juliet" #~ msgstr "Romeo und Julia" - #~ msgid "Old stories" #~ msgstr "Alte Geschichten" - #~ msgid "Soliloquy" #~ msgstr "Selbstgespräch" - #~ msgid "A_fter nickname:" #~ msgstr "Nach dem Spit_znamen:" - #~ msgid "B_efore nickname:" #~ msgstr "Vor d_em Spitznamen:" - #~ msgid "_After time:" #~ msgstr "_Nach der Zeit:" - #~ msgid "_Before time:" #~ msgstr "_Vor der Zeit:" - #~ msgid "_Publish" #~ msgstr "_Veröffentlichen" - #~ msgid "_Retrieve" #~ msgstr "Ab_rufen" - #~ msgid "Information published" #~ msgstr "Informationen veröffentlicht" - #~ msgid "Without a connection, you can not get your contact information." #~ msgstr "Sie müssen angemeldet sein, um Kontakt-Informationen abzurufen" - #~ msgid "This is result of query." #~ msgstr "Dies ist das Ergebnis der Anfrage." - #~ msgid "Edit items on the list" #~ msgstr "Bearbeite Punkte auf der Liste" - #~ msgid "Receive a Message" #~ msgstr "Nachricht empfangen" - -#~ msgid "_New room" -#~ msgstr "_Neuer Raum" - #~ msgid "Role: " #~ msgstr "Rolle:" - #~ msgid "Affiliation: " #~ msgstr "Zugehörigkeit: " - #~ msgid "" #~ "Sound to play when any MUC message arrives. (This setting is taken into " #~ "account only if notify_on_all_muc_messages is True)" #~ msgstr "" #~ "Abzuspielender Ton, falls eine MUC-Nachricht ankommt. (Diese Einstellung " #~ "wirdnur beachtet, wenn notify_on_all_muc_messages aktiviert ist)" - #~ msgid "Create your own Privacy Lists" #~ msgstr "Erstelle eigene Privatliste" - #~ msgid "Server-based Privacy Lists" #~ msgstr "Server-basierte Privatliste" - #~ msgid "Contact _Info" #~ msgstr "Kontakt-_Info" - #~ msgid "Jabber ID" #~ msgstr "Jabber-ID" - #~ msgid "User ID" #~ msgstr "Benutzer-ID" - #~ msgid "Invalid room or server name" #~ msgstr "Ungültiger Raum oder Servername" - #~ msgid "Unknown D-Bus version: %s" #~ msgstr "Unbekannte D-BUS-Version: %s" - #~ msgid "vCard publication succeeded" #~ msgstr "vCard erfolgreich veröffentlicht" - #~ msgid "Your personal information has been published successfully." #~ msgstr "Ihre persönlichen Informationen wurden erfolgreich veröffentlicht." - #~ msgid "Gajim - %d unread message" #~ msgid_plural "Gajim - %d unread messages" #~ msgstr[0] "Gajim - %d ungelesene Nachricht" #~ msgstr[1] "Gajim - %d ungelesene Nachrichten" - #~ msgid "Since %s" #~ msgstr "Seit %s" - #~ msgid "Personal details" #~ msgstr "Persönliche Details" - #~ msgid "Be right back" #~ msgstr "Bin gleich zurück" - #~ msgid "Jabber" #~ msgstr "Jabber" - #~ msgid "Migrating Logs..." #~ msgstr "Migriere Logs ..." - #~ msgid "Automatically authorize contact" #~ msgstr "Kontakt automatisch autorisieren" - #~ msgid "Send File" #~ msgstr "Datei Senden" - #~ msgid "Underline" #~ msgstr "Unterstreichen" - #~ msgid "_Join New Room..." #~ msgstr "_Neuen Raum betreten..." - #~ msgid "Usage: /%s, sets the groupchat window to compact mode." #~ msgstr "Bedienung: /%s, stellt das Gruppenchat-Fenster auf Kompaktmodus." - #~ msgid "Please modify your special notification below" #~ msgstr "Bitte wählen Sie eine der Optionen:" - #~ msgid "Delete Message of the Day" #~ msgstr "Lösche Nachricht des Tages" - #~ msgid "I want a notification popup:" #~ msgstr "Sende Statusbenachrichtigungen:" - #~ msgid "I want to listen to:" #~ msgstr "%s möchte ihnen eine Datei senden:" - #~ msgid "Send _New Message..." #~ msgstr "Sende _neue Nachricht..." - #~ msgid "Set Message of the Day" #~ msgstr "Setze Message of the Day" - #~ msgid "Update Message of the Day" #~ msgstr "Aktualisiere Nachricht des Tages (MOTD)" - #~ msgid "_XML Console..." #~ msgstr "_XML Konsole..." - #~ msgid "Choose Avatar" #~ msgstr "Avatar auswählen" - #~ msgid "Use compact view when you open a chat window" #~ msgstr "Kompaktansicht verwenden, wenn Sie ein Chatfenster öffnen" - #~ msgid "Use compact view when you open a group chat window" #~ msgstr "Verwende Kompaktansicht wenn ein Gruppenchat-Fenster geöffnet wird" - #~ msgid "plain" #~ msgstr "plain" - #~ msgid "Send" #~ msgstr "Senden" - #~ msgid "%(nickname)s in room %(room_name)s has sent you a new message." #~ msgstr "" #~ "%(nickname)s im Raum %(room_name)s hat Ihnen eine neue Nachricht gesendet." - #~ msgid "%s has sent you a new message." #~ msgstr "%s hat Ihnen eine neue Nachricht gesendet." - #~ msgid "GUI Migration failed" #~ msgstr "vCard Veröffentlichung fehlgeschlagen" - #~ msgid "Logs have been successfully migrated to the database." #~ msgstr "Logs wurden erfolgreich in die Datenbank migriert." - #~ msgid "If checked, Gajim will also have a trayicon" #~ msgstr "Wenn aktiviert, wird Gajim ein Tray-Symbol verwenden" - #~ msgid "Start Chat with Contact" #~ msgstr "Starte Chat mit Account %s" - #~ msgid "All contacts in this group are offline or have errors" #~ msgstr "Alle Kontakte dieser Gruppe sind abgemeldet oder haben Fehler" - #~ msgid "Size: " #~ msgstr "Größe: " - #~ msgid "Session bus is not available" #~ msgstr "Session-Bus nicht verfügbar" - #~ msgid "Sound" #~ msgstr "Sound" - #~ msgid "Image" #~ msgstr "Bild" - #~ msgid "From %s" #~ msgstr "Von %s" - #~ msgid "To %s" #~ msgstr "An %s" - #~ msgid "You have been invited to the %(room_jid)s room by %(contact_jid)s" #~ msgstr "Sie wurden in den Raum %(room_jid)s von %(contact_jid)s eingeladen" - #~ msgid "Manage Emoticons" #~ msgstr "Emoticons anpassen" - #~ msgid "Or choose a preset message:" #~ msgstr "Oder wählen Sie eine voreingestellte Nachricht:" - #~ msgid "Use _emoticons" #~ msgstr "_Emoticons verwenden" - #~ msgid "_Set Image..." #~ msgstr "_Bild wählen..." - #~ msgid "Switch to %s" #~ msgstr "Wechseln zu %s" - #~ msgid "using account " #~ msgstr "mit Konto" - #~ msgid "The filesize of image \"%s\" is too large" #~ msgstr "Die Dateigröße des Bildes \"%s\" ist zu groß" - #~ msgid "The file must not be more than 32 kilobytes." #~ msgstr "Die Datei darf nicht größer als 32 Kilobytes sein." - #~ msgid "Timeout" #~ msgstr "Timeout" - #~ msgid "account: " #~ msgstr "Konto: " - #~ msgid "Are you sure you want to leave rooms \"%s\"?" #~ msgstr "Möchten Sie die Räume \"%s\" wirklich verlassen?" - #~ msgid "If you close this window, you will be disconnected from these rooms." #~ msgstr "" #~ "Wenn Sie dieses Fenster schließen, wird die Verbindung mit diesen Räumen " #~ "abgebrochen." - #~ msgid "Activate/Disable notification for when a file transfer is complete" #~ msgstr "Benachrichtigung für beendete Dateitransfers ein/ausschalten" - #~ msgid "Removing selected file transfer" #~ msgstr "Ausgewählten Dateitransfer entfernen" - #~ msgid "Stoping selected file transfer" #~ msgstr "Bricht den ausgewählten Dateitransfer ab" - #~ msgid "" #~ "If you close this tab and you have history disabled, the message will be " #~ "lost." #~ msgstr "" #~ "Wenn Sie diesen Reiter schließen und die History abgeschaltet haben, ist " #~ "die Nachricht verloren." - #~ msgid "Cannot remove last group" #~ msgstr "Letzte Gruppe kann nicht entfernt werden" - #~ msgid "At least one contact group must be present." #~ msgstr "Mindestens eine Gruppe wird benötigt." - #~ msgid "" #~ "pysqlite2 (aka python-pysqlite2) dependency is missing. After you install " #~ "pysqlite3, if you want to migrate your logs to the new database, please " @@ -7233,67 +6805,47 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ "Sie pysqlite2installiert haben, wenn Sie Ihre Logs in die neue Datenbank " #~ "migrieren möchte, lesen Siebitte: http://trac.gajim.org/wiki/" #~ "MigrateLogToDot9DB Beende ..." - #~ msgid "Image is too big" #~ msgstr "Das Bild ist zu groß" - #~ msgid "" #~ "Image for emoticon has to be less than or equal to 24 pixels in width and " #~ "24 in height." #~ msgstr "" #~ "Das Bild darf eine Höhe und Breite von je 24 Pixeln nicht überschreiten." - #~ msgid "Changes in latest version" #~ msgstr "Änderungen in der neuesten Version" - #~ msgid "Check for new _version on Gajim startup" #~ msgstr "Beim Start von Gajim auf neue _Versionen prüfen" - #~ msgid "Log history" #~ msgstr "Log-Verlauf" - #~ msgid "New version of Gajim available" #~ msgstr "Es ist eine neue Version von Gajim verfügbar" - #~ msgid "Open Download Page" #~ msgstr "Download-Seite öffnen" - #~ msgid "(%s/s)" #~ msgstr "(%s/s)" - #~ msgid "Session bus is not available." #~ msgstr "Session-Bus nicht verfügbar." - #~ msgid "with account " #~ msgstr "Konto: " - #~ msgid "Chat with" #~ msgstr "Unterhalten mit" - #~ msgid "as %s" #~ msgstr "als %s" - #~ msgid "as " #~ msgstr "als " - #~ msgid "Send _New Message" #~ msgstr "Sende _neue Nachricht" - #~ msgid "Re_quest Authorization from" #~ msgstr "Autorisierung anfordern" - #~ msgid "Send Authorization to" #~ msgstr "Autorisierung senden" - #~ msgid "Log" #~ msgstr "Log" - #~ msgid "Log presences in _contact's log file" #~ msgstr "Anwesenheit in _Kontakt-Logdateien schreiben" - #~ msgid "Log presences in an _external file" #~ msgstr "Anwesenheit in eine _externe Datei speichern" - #~ msgid "" #~ "You can set advanced account options by pressing Advanced button,or later " #~ "by clicking in Accounts menuitem under Edit menu from the main window." @@ -7301,14 +6853,12 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ "Sie können die erweiterten Konten-Optionen durch Klicken des Erweitert-" #~ "Buttons erreichen, oder später durch klicken des Konten Menüitems im " #~ "Bearbeiten-Menü." - #~ msgid "" #~ "Set value of 'key' to 'value'. If there is no such key, new item in the " #~ "preferences is inserted." #~ msgstr "" #~ "Setze den Wert von 'key' auf 'value'. Wenn kein solcher key existiert " #~ "wirdeine neuer Wert in den Einstellungen erstellt." - #~ msgid "" #~ "When a new message is received which is not from a contact already in a " #~ "chat window, the three following actions may happen in order for you to " @@ -7317,28 +6867,20 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ "Wenn eine neue Nachricht von einem neuen Kontakt in einem Chatfenster " #~ "empfangen wird, können die drei folgenden Aktionen ausgeführt werden, um " #~ "Sie darüber zu informieren" - #~ msgid "_Earliest" #~ msgstr "_Erste" - #~ msgid "_Latest" #~ msgstr "_Letzte" - #~ msgid "_Previous" #~ msgstr "_Vorherige" - #~ msgid "Filter query too short" #~ msgstr "Filteranfrage zu kurz" - #~ msgid "Query must be at least 3 characters long." #~ msgstr "Anfrage muss wenigstens 3 Zeichen lang sein." - #~ msgid "%s is now %s: %s" #~ msgstr "%s ist jetzt %s (%s)" - #~ msgid "Allow controlling Gajim via D-Bus service." #~ msgstr "Erlaube die Steuerung von Gajim mit dem D-Bus Dienst." - #~ msgid "" #~ "\n" #~ "\n" @@ -7351,7 +6893,6 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ "\n" #~ "== Originalnachricht ==\n" #~ "%s" - #~ msgid "" #~ "Your new account has been created successfully.\n" #~ "You can set advanced account options by pressing Advanced button,\n" @@ -7360,7 +6901,6 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ msgstr "" #~ "Konto wurde erfolgreich hinzugefügt.\n" #~ "Erweiterte Optionen sind über \"Ändern->Konten\" zu erreichen." - #~ msgid "" #~ "When we remove a contact, remove both his and our subscription, so we do " #~ "not receive his presence anymore and he ours." @@ -7368,23 +6908,18 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ "Wenn wir einen Kontakt entfernen, lösche sowohl sein als auch unser " #~ "Abonnement, damitwir nicht mehr gegenseitig über die Präsenz informiert " #~ "werden" - #~ msgid "" #~ "Should Gajim send inactive (\"is doing something else\") on just focus " #~ "out of window/switch to another tab?" #~ msgstr "" #~ "Soll Gajim Inaktivitätsbenachrichtungen von Tabs im Fokus an andere " #~ "Fenster/Tabs senden?" - #~ msgid "Error:" #~ msgstr "Fehler:" - #~ msgid "Service" #~ msgstr "Dienst" - #~ msgid "Node" #~ msgstr "Node" - #~ msgid "" #~ "Your new account has been created and added to your gajim configuration.\n" #~ "You can set advanced account options using \"Edit->Accounts\" in the main " @@ -7392,69 +6927,49 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ msgstr "" #~ "Ihr neues Konto wurde erstellt und der Gajimkonfiguration hinzugefügt.\n" #~ "Erweiterte Optionen sind über \"Ändern->Konten\" zu erreichen." - #~ msgid "You need to enter a valid server address to add an account." #~ msgstr "" #~ "Sie müssen einen gültigen Server angeben, um ein neues Konto zu erstellen." - #~ msgid "Contact names must be of the form \"user@servername\"." #~ msgstr "Benutzernamen müssen die Form \"benutzer@servername\" haben." - #~ msgid "Invalid contact ID" #~ msgstr "Ungültige Benutzer-ID" - #~ msgid "Contact ID must be of the form \"username@servername\"." #~ msgstr "Benutzer-ID muss in der Form \"username@servername\" sein." - #~ msgid "Account registration successful" #~ msgstr "Kontoregistrierung erfolgreich" - #~ msgid "The account \"%s\" has been registered with the Jabber server." #~ msgstr "Konto \"%s\" wurde auf dem Jabberserver registriert." - #~ msgid "theme_name" #~ msgstr "thema_name" - #~ msgid "Edit" #~ msgstr "_Ändern" - #~ msgid "Please fill in the data for your existing account" #~ msgstr "Bitte tragen Sie die Daten für ihr bestehendes Konto ein" - #~ msgid "Check if you want to register for a new jabber account" #~ msgstr "Prüfen Sie, ob Sie ein neues Konto erstellen möchten" - #~ msgid "Click to get contact's extended information" #~ msgstr "Klicken, um erweiterte Informationen des Kontaktes einzusehen" - #~ msgid "_Compact View" #~ msgstr "_Kompakte Ansicht" - #~ msgid "_Refresh" #~ msgstr "_Aktualisieren" - #~ msgid "_Register new account" #~ msgstr "Neues Konto e_rstellen" - #~ msgid "You just received a new message in room \"%s\"" #~ msgstr "Sie haben eine neue Nachricht im Raum \"%s\" erhalten" - #~ msgid "" #~ "If you close this window and you have history disabled, this message will " #~ "be lost." #~ msgstr "" #~ "Wenn sie das Fenster schließen und die History abgeschaltet haben, geht " #~ "die Nachricht verloren." - #~ msgid "New _Room" #~ msgstr "Neuer _Raum" - #~ msgid "Always use compact _view" #~ msgstr "Benutze immer die kompakte Ansicht" - #~ msgid "Banner:" #~ msgstr "Banner:" - #~ msgid "" #~ "If checked, all chat and group chat windows will have the information " #~ "area in the top and the buttons area in the bottom hidden. You can quick " @@ -7465,37 +6980,28 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ "den Chat- und Chatraumfenstern ausgeblendet. Mit Alt+C können Sie " #~ "schnell zwischen der kompakten und der normalen Ansicht umschalten. " #~ "Achtung: die jeweils letzte Ansicht wird nicht beibehalten" - #~ msgid "Inactivate account" #~ msgstr "Kein aktives Konto" - #~ msgid "Join _Group Chat..." #~ msgstr "_Chatraum beitreten..." - #~ msgid "Po_sition:" #~ msgstr "Position:" - #~ msgid "Show roster window on Gajim startup" #~ msgstr "Kontaktliste beim Start von Gajim anzeigen" - #~ msgid "_Service Discovery" #~ msgstr "_Dienste durchsuchen" - #~ msgid "_Service Discovery..." #~ msgstr "_Dienste durchsuchen..." - #~ msgid "error appeared while processing xmpp:" #~ msgstr "Fehler während der Verarbeitung von xmpp:" - #~ msgid "" #~ "Cancels the selected file transfer. If there is an incomplete file, kept " #~ "in the file system it will be removed. This operation is not reversable" #~ msgstr "" #~ "Stoppt den ausgewählten Dateitransfer. Unvollständige Dateien werden " #~ "gelöscht. Diese Aktion ist nicht rückgangig zu machen." - #~ msgid "Chan_ge" #~ msgstr "_Ändern" - #~ msgid "Unknown type %s " #~ msgstr "Unbekannter Typ %s " + diff --git a/po/fr.po b/po/fr.po index cde2af894..b9f6d8178 100644 --- a/po/fr.po +++ b/po/fr.po @@ -1150,7 +1150,7 @@ msgstr "Rejoindre un salon de discussion" #: ../data/glade/join_groupchat_window.glade.h:2 msgid "Join this room automatically when I connect" -msgstr "Joindre ce groupe de discution quand je me connecte" +msgstr "Joindre ce groupe de discussion quand je me connecte" #: ../data/glade/join_groupchat_window.glade.h:3 #: ../data/glade/manage_bookmarks_window.glade.h:4 @@ -2445,11 +2445,11 @@ msgstr "%s n'a pas envoyé de clé OpenPGP et vous ne lui en avez pas assigné u #: ../src/chat_control.py:1263 msgid "Encryption enabled" -msgstr "Chiffrement activée" +msgstr "Chiffrement activé" #: ../src/chat_control.py:1268 msgid "Encryption disabled" -msgstr "Chiffrement désactivée" +msgstr "Chiffrement désactivé" #. add_to_roster_menuitem #: ../src/chat_control.py:1412 @@ -4218,7 +4218,7 @@ msgstr "Joindre un groupe de discussions" #: ../src/gajim-remote.py:244 msgid "room" -msgstr "groupe de discution" +msgstr "groupe de discussion" #: ../src/gajim-remote.py:245 msgid "nick" @@ -6504,6 +6504,39 @@ msgstr "[Ce message est chiffré]" msgid "Error while adding service. %s" msgstr "Erreur en ajoutant le service. %s" +msgid "_Blocked Contacts" +msgstr "Contacts _Bloqués" + +msgid "Blocked Contacts for %s" +msgstr "Contacts Bloqués avec le compte %s" + +msgid "Blocked Contacts" +msgstr "Contacts Bloqués" + +msgid "_Block" +msgstr "_Bloquer" + +msgid "_Unblock" +msgstr "_Débloquer" + +msgid " [blocked]" +msgstr " [bloqué]" + +msgid "_Maximize" +msgstr "_Maximiser" + +msgid "_Minimize" +msgstr "_Minimiser" + +msgid " [minimized]" +msgstr " [minimisé]" + +msgid "Connected" +msgstr "Connecté" + +msgid "Disconnected" +msgstr "Déconnecté" + #~ msgid "2003-12-13T18:30:02Z" #~ msgstr "2003-12-13T18:30:02Z" #~ msgid "Romeo and Juliet" diff --git a/po/gl_ES.po b/po/gl_ES.po new file mode 100644 index 000000000..dd3d202a6 --- /dev/null +++ b/po/gl_ES.po @@ -0,0 +1,6633 @@ +# translation of gl.po to +# Galician translations for gajim package +# Tradución galega do paquete gajim. +# Copyright (C) 2004 THE gajim'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gajim package. +# Automatically generated, 2004. +# +#: ../src/gajim-remote.py:202 ../src/gajim-remote.py:209 +msgid "" +msgstr "" +"Project-Id-Version: es\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2006-12-18 09:32+0100\n" +"PO-Revision-Date: 2007-03-13 11:38+0100\n" +"Last-Translator: Iván Méndez López\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: KBabel 1.11.2\n" + +#: ../data/gajim.desktop.in.in.h:1 +msgid "A GTK+ Jabber client" +msgstr "Un cliente de Jabber de GTK" + +#: ../data/gajim.desktop.in.in.h:2 +msgid "Gajim Instant Messenger" +msgstr "Mensaxaría Instantánea Gajim" + +#: ../data/gajim.desktop.in.in.h:3 +msgid "Jabber IM Client" +msgstr "Cliente de MI de Jabber" + +#: ../data/glade/account_context_menu.glade.h:1 +msgid "Send Single _Message..." +msgstr "Enviar unha _mensaxe..." + +#: ../data/glade/account_context_menu.glade.h:2 +msgid "_Add Contact..." +msgstr "_Engadir un contacto..." + +#: ../data/glade/account_context_menu.glade.h:3 +msgid "_Discover Services..." +msgstr "_Descubrir os servizos..." + +#: ../data/glade/account_context_menu.glade.h:4 +msgid "_Execute Command..." +msgstr "Executar o _comando..." + +#: ../data/glade/account_context_menu.glade.h:5 +#: ../data/glade/roster_window.glade.h:16 +#: ../data/glade/systray_context_menu.glade.h:6 +msgid "_Group Chat" +msgstr "_Grupos de charla" + +#: ../data/glade/account_context_menu.glade.h:6 +#: ../data/glade/zeroconf_context_menu.glade.h:1 +msgid "_Modify Account..." +msgstr "_Modificar a conta..." + +#: ../data/glade/account_context_menu.glade.h:7 +msgid "_Open Gmail Inbox" +msgstr "_Abrir a caixa de entrada de GMail" + +#: ../data/glade/account_context_menu.glade.h:8 +#: ../data/glade/zeroconf_context_menu.glade.h:2 +msgid "_Status" +msgstr "E_stado" + +#: ../data/glade/account_creation_wizard_window.glade.h:1 +msgid "" +"Account is being created\n" +"\n" +"Please wait..." +msgstr "" +"Estase a crear a conta\n" +"\n" +"Por favor, agarde..." + +#: ../data/glade/account_creation_wizard_window.glade.h:4 +msgid "Please choose one of the options below:" +msgstr "Por favor, elixa unha das opcións seguintes:" + +#: ../data/glade/account_creation_wizard_window.glade.h:5 +msgid "Please fill in the data for your new account" +msgstr "Por favor, introduza os datos para a súa conta nova" + +#: ../data/glade/account_creation_wizard_window.glade.h:6 +msgid "Click to see features (like MSN, ICQ transports) of jabber servers" +msgstr "" +"Prema para ver as características (como transportes de MSN e ICQ) dos " +"servidores de Jabber" + +#: ../data/glade/account_creation_wizard_window.glade.h:7 +msgid "Connect when I press Finish" +msgstr "Conectar cando prema Rematar" + +#: ../data/glade/account_creation_wizard_window.glade.h:8 +msgid "Gajim: Account Creation Wizard" +msgstr "Gajim: asistente para crear unha conta" + +#: ../data/glade/account_creation_wizard_window.glade.h:9 +msgid "I already have an account I want to use" +msgstr "Xa teño unha conta e quero empregala" + +#: ../data/glade/account_creation_wizard_window.glade.h:10 +msgid "I want to _register for a new account" +msgstr "Quero _rexistrar unha conta nova de Jabber" + +#: ../data/glade/account_creation_wizard_window.glade.h:11 +#: ../data/glade/account_modification_window.glade.h:18 +msgid "If checked, Gajim will remember the password for this account" +msgstr "Se isto está marcado, o Gajim lembrará o contrasinal para esta conta" + +#: ../data/glade/account_creation_wizard_window.glade.h:12 +#: ../data/glade/manage_proxies_window.glade.h:6 +msgid "Pass_word:" +msgstr "_Contrasinal: " + +#: ../data/glade/account_creation_wizard_window.glade.h:13 +#: ../data/glade/account_modification_window.glade.h:38 +msgid "Save pass_word" +msgstr "_Gardar o contrasinal" + +#: ../data/glade/account_creation_wizard_window.glade.h:14 +msgid "Servers Features" +msgstr "Características dos servidores" + +#: ../data/glade/account_creation_wizard_window.glade.h:15 +msgid "Set my profile when I connect" +msgstr "Configurar o meu perfil ao me conectar" + +#: ../data/glade/account_creation_wizard_window.glade.h:16 +msgid "" +"You need to have an account in order to connect\n" +"to the Jabber network." +msgstr "Precisa unha conta para se conectar\n" +"á rede Jabber" + +#: ../data/glade/account_creation_wizard_window.glade.h:18 +msgid "Your JID:" +msgstr "O seu identificador JID" + +#: ../data/glade/account_creation_wizard_window.glade.h:19 +#: ../data/glade/roster_window.glade.h:11 +msgid "_Advanced" +msgstr "_Avanzado" + +#: ../data/glade/account_creation_wizard_window.glade.h:20 +msgid "_Finish" +msgstr "_Rematar" + +#: ../data/glade/account_creation_wizard_window.glade.h:21 +#: ../data/glade/manage_proxies_window.glade.h:9 +msgid "_Servidor:" +msgstr "_Host:" + +#: ../data/glade/account_creation_wizard_window.glade.h:22 +#: ../data/glade/account_modification_window.glade.h:47 +msgid "_Password:" +msgstr "C_ontrasinal:" + +#: ../data/glade/account_creation_wizard_window.glade.h:23 +#: ../data/glade/manage_proxies_window.glade.h:10 +msgid "_Port:" +msgstr "_Porto:" + +#: ../data/glade/account_creation_wizard_window.glade.h:24 +msgid "_Retype Password:" +msgstr "_Introduza, mais unha vez, o contrasinal:" + +#: ../data/glade/account_creation_wizard_window.glade.h:25 +msgid "_Server:" +msgstr "_Servidor:" + +#: ../data/glade/account_creation_wizard_window.glade.h:26 +msgid "_Use proxy" +msgstr "_Usar proxy" + +#: ../data/glade/account_creation_wizard_window.glade.h:27 +#: ../data/glade/manage_proxies_window.glade.h:11 +msgid "_Username:" +msgstr "_Nome de usuario:" + +#: ../data/glade/account_modification_window.glade.h:1 +#: ../data/glade/preferences_window.glade.h:8 +msgid "Miscellaneous" +msgstr "Varios" + +#: ../data/glade/account_modification_window.glade.h:2 +#: ../data/glade/zeroconf_properties_window.glade.h:1 +msgid "OpenPGP" +msgstr "OpenPGP" + +#: ../data/glade/account_modification_window.glade.h:3 +#: ../data/glade/zeroconf_properties_window.glade.h:2 +msgid "Personal Information" +msgstr "Información persoal" + +#: ../data/glade/account_modification_window.glade.h:4 +msgid "Account" +msgstr "Conta" + +#: ../data/glade/account_modification_window.glade.h:5 +msgid "Account Modification" +msgstr "Modificar a conta" + +#: ../data/glade/account_modification_window.glade.h:6 +msgid "Autoreconnect when connection is lost" +msgstr "Conectar automaticamente se se perde a conexión" + +#: ../data/glade/account_modification_window.glade.h:7 +#: ../data/glade/zeroconf_properties_window.glade.h:3 +msgid "C_onnect on Gajim startup" +msgstr "C_onectar ao inicio de Gajim" + +#: ../data/glade/account_modification_window.glade.h:8 +msgid "Chan_ge Password" +msgstr "Cam_biar o contrasinal" + +#: ../data/glade/account_modification_window.glade.h:9 +msgid "" +"Check this so Gajim will connect in port 5223 where legacy servers are " +"expected to have SSL capabilities. Note that Gajim uses TLS encryption by " +"default if broadcasted by the server, and with this option enabled TLS will " +"be disabled" +msgstr "" +"Ao marcar esta opción, o Gajim conectará o porto 5223 cando un servidor antigo " +"use SSL. Cómpre ter en conta que o Gajim usa un cifrado TLS por defecto se está dispoñíbel " +"no servidor e que con esta opción se desactiva o TLS" + +#: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/zeroconf_properties_window.glade.h:4 +msgid "Choose _Key..." +msgstr "Elixir a _chave..." + +#: ../data/glade/account_modification_window.glade.h:11 +msgid "Click to change account's password" +msgstr "Prema para cambiar o contrasinal da conta" + +#: ../data/glade/account_modification_window.glade.h:12 +msgid "Connection" +msgstr "Conexión" + +#: ../data/glade/account_modification_window.glade.h:13 +msgid "Edit Personal Information..." +msgstr "_Editar a información persoal..." + +#: ../data/glade/account_modification_window.glade.h:14 +#: ../data/glade/roster_window.glade.h:5 ../src/notify.py:453 +#: ../src/notify.py:475 ../src/notify.py:487 ../src/common/helpers.py:905 +msgid "Gajim" +msgstr "Gajim" + +#. Contact is not in a group, so count it in General group +#: ../data/glade/account_modification_window.glade.h:15 +#: ../data/glade/preferences_window.glade.h:49 +#: ../data/glade/zeroconf_properties_window.glade.h:7 +#: ../src/roster_window.py:342 ../src/roster_window.py:1207 +#: ../src/roster_window.py:1418 ../src/roster_window.py:2029 +#: ../src/roster_window.py:2071 ../src/common/contacts.py:278 +msgid "General" +msgstr "Xeral" + +#: ../data/glade/account_modification_window.glade.h:16 +msgid "Hostname: " +msgstr "Nome do host:" + +#: ../data/glade/account_modification_window.glade.h:17 +msgid "" +"If checked, Gajim will also broadcast some more IPs except from just your " +"IP, so file transfer has higher chances of working." +msgstr "" +"Se isto está marcado, o Gajim tamén emitirá algúns IP máis agás desde o seu IP, " +"para que a súa transferencia teña máis posibilidades de funcionar." + +#: ../data/glade/account_modification_window.glade.h:19 +msgid "" +"If checked, Gajim will send keep-alive packets so it prevents connection " +"timeout which results in disconnection" +msgstr "" +"Se isto está marcado, o Gajim enviará paquetes de mantemento de actividade para " +"previr que expire a conexión" + +#: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/zeroconf_properties_window.glade.h:8 +msgid "" +"If checked, Gajim will store the password in ~/.gajim/config with 'read' " +"permission only for you" +msgstr "" +"Se isto está marcado, o Gajim gardará o contrasinal en ~/.gajim/config para o que unicamente vostede terá acceso de só lectura" + +#: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/zeroconf_properties_window.glade.h:9 +msgid "" +"If checked, Gajim, when launched, will automatically connect to jabber using " +"this account" +msgstr "" +"Se isto está marcado, o Gajim, ao se iniciar, conectarase automaticamente a Jabber " +"con esta conta." + +#: ../data/glade/account_modification_window.glade.h:22 +#: ../data/glade/zeroconf_properties_window.glade.h:10 +msgid "" +"If checked, any change to the global status (handled by the combobox at the " +"bottom of the roster window) will change the status of this account " +"accordingly" +msgstr "" +"Se isto está marcado, calquera mudanza do estado global (manexado polo caixa de combinación da parte inferior da listaxe de contactos) cambiará o " +"estado desta conta en consecuencia" + +#: ../data/glade/account_modification_window.glade.h:23 +msgid "Information about you, as stored in the server" +msgstr "A súa información, para se gardar no servidor" + +#: ../data/glade/account_modification_window.glade.h:24 +msgid "Manage..." +msgstr "Xestionar..." + +#: ../data/glade/account_modification_window.glade.h:25 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1643 +#: ../src/config.py:3436 +msgid "No key selected" +msgstr "Non se seleccionou ningunha chave" + +#. None means no proxy profile selected +#: ../data/glade/account_modification_window.glade.h:27 ../src/config.py:1225 +#: ../src/config.py:1230 ../src/config.py:1414 ../src/config.py:1633 +#: ../src/config.py:1642 ../src/config.py:1701 ../src/config.py:1775 +#: ../src/config.py:2646 ../src/config.py:3426 ../src/config.py:3435 +#: ../src/dialogs.py:281 ../src/dialogs.py:283 +msgid "None" +msgstr "Ningún" + +#: ../data/glade/account_modification_window.glade.h:28 +#: ../data/glade/profile_window.glade.h:25 +#: ../data/glade/zeroconf_properties_window.glade.h:17 +msgid "Personal Information" +msgstr "Información persoal" + +#: ../data/glade/account_modification_window.glade.h:29 +msgid "Port: " +msgstr "Porto: " + +#: ../data/glade/account_modification_window.glade.h:30 +msgid "Priori_ty:" +msgstr "Pr_ioridade:" + +#: ../data/glade/account_modification_window.glade.h:31 +msgid "" +"Priority is used in Jabber to determine who gets the events from the jabber " +"server when two or more clients are connected using the same account; The " +"client with the highest priority gets the events" +msgstr "" +"Jabber emprega a prioridade para determinar quen obtén os acontecementos " +"do servidor cando dous ou máis clientes están conectados e usan a mesma " +"conta. O cliente con maior prioridade recibe os acontecementos." + +#: ../data/glade/account_modification_window.glade.h:32 +msgid "Priority will change automatically according to your status." +msgstr "A prioridade mudará automaticamente segundo o seu estado." + +#: ../data/glade/account_modification_window.glade.h:33 +msgid "Proxy:" +msgstr "Proxy" + +#: ../data/glade/account_modification_window.glade.h:34 +msgid "Resour_ce: " +msgstr "Re_curso: " + +#: ../data/glade/account_modification_window.glade.h:35 +msgid "" +"Resource is sent to the Jabber server in order to separate the same JID in " +"two or more parts depending on the number of the clients connected in the " +"same server with the same account. So you might be connected in the same " +"account with resource 'Home' and 'Work' at the same time. The resource which " +"has the highest priority will get the events. (see below)" +msgstr "" +"O recurso envíaselle ao servidor de Jabber para 'separar' o mesmo " +"identificador en dous ou máis partes a depender do número de clientes " +"que estiveren conectados no servidor coa mesma conta. Así pode estar " +"conectado e empregar a mesma conta co recurso 'Casa' ou 'Traballo' ao mesmo " +"tempo. O recurso que teña a prioridade máis alta será o que reciba os " +"eventos (mire máis abaixo)." + +#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/zeroconf_properties_window.glade.h:18 +msgid "Save _passphrase (insecure)" +msgstr "Gardar o contrasinal (inseguro)" + +#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/zeroconf_properties_window.glade.h:19 +msgid "Save conversation _logs for all contacts" +msgstr "Gravar as conversas para todos os contactos" + +#: ../data/glade/account_modification_window.glade.h:39 +msgid "Send keep-alive packets" +msgstr "Enviar paquetes de mantemento de actividade" + +#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/zeroconf_properties_window.glade.h:20 +msgid "Synch_ronize account status with global status" +msgstr "Sinc_ronizar o estado da conta co estado global" + +#: ../data/glade/account_modification_window.glade.h:41 +msgid "Use _SSL (legacy)" +msgstr "Usar _SSL (o antigo)" + +#: ../data/glade/account_modification_window.glade.h:42 +msgid "Use custom hostname/port" +msgstr "Usa un nome de host e un porto personalizados" + +#: ../data/glade/account_modification_window.glade.h:43 +msgid "Use file transfer proxies" +msgstr "Usar proxies para as transferencias de ficheiros" + +#: ../data/glade/account_modification_window.glade.h:44 +msgid "_Adjust to status" +msgstr "_Adaptar ao estado" + +#: ../data/glade/account_modification_window.glade.h:45 +msgid "_Jabber ID:" +msgstr "ID de _Jabber: " + +#: ../data/glade/account_modification_window.glade.h:46 +msgid "_Name: " +msgstr "_Nome: " + +#: ../data/glade/accounts_window.glade.h:1 +msgid "Accounts" +msgstr "Contas" + +#: ../data/glade/accounts_window.glade.h:2 +msgid "" +"If checked, all local contacts that use a Bonjour compatible chat client " +"(like iChat, Trillian or Gaim) will be shown in roster. You don't need to be " +"connected to a jabber server for it to work.\n" +"This is only available if python-avahi is installed and avahi-daemon is " +"running." +msgstr "" +"Se isto está marcado, todos os contactos locais que empregaren un cliente Bonjour " +"compatíbel (como iChat, Trillian ou Gaim) apareceran na listaxe de contactos. Non " +"precisa estar conectado a un servidor de Jabber para o seu funcionamento.\n" +"Isto só está dispoñíbel se o python-avahi está instalado e o avahi-daemon " +"está en execución." + +#: ../data/glade/accounts_window.glade.h:4 +msgid "" +"If you have 2 or more accounts and it is checked, Gajim will list all " +"contacts as if you had one account" +msgstr "" +"Se ten dúas ou máis contas e isto está marcado, o Gajim relacionará todos os " +"contactos de forma mixta" + +#: ../data/glade/accounts_window.glade.h:5 +msgid "Mer_ge accounts" +msgstr "_Combinar as contas" + +#: ../data/glade/accounts_window.glade.h:6 +msgid "_Enable link-local messaging" +msgstr "Habilitar m_ensaxaría de ligazón local" + +#: ../data/glade/accounts_window.glade.h:7 +msgid "_Modify" +msgstr "_Modificar" + +#: ../data/glade/accounts_window.glade.h:8 +#: ../data/glade/remove_account_window.glade.h:4 +msgid "_Remove" +msgstr "_Eliminar" + +#: ../data/glade/add_new_contact_window.glade.h:1 +msgid "A_ccount:" +msgstr "_Conta:" + +#: ../data/glade/add_new_contact_window.glade.h:2 +msgid "A_llow this contact to view my status" +msgstr "Permitirlle a este contacto que vexa o meu estado" + +#: ../data/glade/add_new_contact_window.glade.h:3 +msgid "Add New Contact" +msgstr "Engadir un contacto novo" + +#: ../data/glade/add_new_contact_window.glade.h:4 +msgid "I would like to add you to my contact list." +msgstr "Gustaríame engadilo á miña listaxe de contactos." + +#: ../data/glade/add_new_contact_window.glade.h:5 +msgid "" +"You have to register to this transport\n" +"to be able to add a contact from this\n" +"protocol. Click on register button to\n" +"proceed." +msgstr "" +"Ten que rexistrar este transporte\n" +"para poder engadir un contacto deste\n" +"protocolo. Prema o botón Rexistrar\n" +"para continuar." + +#: ../data/glade/add_new_contact_window.glade.h:9 +msgid "" +"You must be connected to the transport to be able\n" +"to add a contact from this protocol." +msgstr "" +"Debe estar conectado ao transporte para poder\n" +"engadir un contacto deste protocolo." + +#: ../data/glade/add_new_contact_window.glade.h:11 +msgid "_Group:" +msgstr "_Grupo:" + +#: ../data/glade/add_new_contact_window.glade.h:12 +msgid "_Nickname:" +msgstr "_Alcume:" + +#: ../data/glade/add_new_contact_window.glade.h:13 +msgid "_Protocol:" +msgstr "_Protocolo:" + +#: ../data/glade/add_new_contact_window.glade.h:14 +msgid "_Register" +msgstr "_Rexistrar" + +#: ../data/glade/add_new_contact_window.glade.h:15 +msgid "_User ID:" +msgstr "ID de _usuario:" + +#: ../data/glade/adhoc_commands_window.glade.h:1 +msgid "An error has occured:" +msgstr "Produciuse un erro:" + +#: ../data/glade/adhoc_commands_window.glade.h:2 +msgid "Choose command to execute:" +msgstr "Elixa o comando para executar:" + +#: ../data/glade/adhoc_commands_window.glade.h:3 +msgid "Ad-hoc Commands - Gajim" +msgstr "Comandos ad-hoc - Gajim" + +#: ../data/glade/adhoc_commands_window.glade.h:4 +msgid "Check once more" +msgstr "Comprobar mais unha vez" + +#: ../data/glade/adhoc_commands_window.glade.h:5 +msgid "Error description..." +msgstr "Descrición do erro..." + +#: ../data/glade/adhoc_commands_window.glade.h:6 +msgid "Please wait while retrieving command list..." +msgstr "Por favor, agarde mentres se solicita a listaxe de comandos..." + +#: ../data/glade/adhoc_commands_window.glade.h:7 +msgid "Please wait while the command is sending..." +msgstr "Por favor, agarde mentres se envía o comando..." + +#: ../data/glade/adhoc_commands_window.glade.h:8 +msgid "Please wait..." +msgstr "Por favor, agarde..." + +#: ../data/glade/adhoc_commands_window.glade.h:9 +msgid "This jabber entity does not expose any commands." +msgstr "Esta entidade de jabber non expón comandos." + +#: ../data/glade/advanced_configuration_window.glade.h:1 +msgid "Description" +msgstr "Descrición" + +#: ../data/glade/advanced_configuration_window.glade.h:2 +msgid "NOTE: You should restart gajim for some setting to take effect" +msgstr "NOTA: Debe reiniciar o Gajim para que algúns cambios teñan efecto" + +#: ../data/glade/advanced_configuration_window.glade.h:3 +msgid "Advanced Configuration Editor" +msgstr "Editor avanzado de configuración" + +#: ../data/glade/advanced_configuration_window.glade.h:4 +msgid "Filter:" +msgstr "Filtro:" + +#: ../data/glade/advanced_menuitem_menu.glade.h:1 +msgid "Delete MOTD" +msgstr "Eliminar MDD" + +#: ../data/glade/advanced_menuitem_menu.glade.h:2 +msgid "Deletes Message of the Day" +msgstr "Elimina a mensaxe do día (MDD)" + +#: ../data/glade/advanced_menuitem_menu.glade.h:3 +msgid "Sends a message to currently connected users to this server" +msgstr "Envíalles unha mensaxe aos usuarios conectados neste momento ao servidor" + +#: ../data/glade/advanced_menuitem_menu.glade.h:4 +msgid "Set MOTD" +msgstr "Definir a MDD" + +#: ../data/glade/advanced_menuitem_menu.glade.h:5 +msgid "Sets Message of the Day" +msgstr "Define a mensaxe do día" + +#: ../data/glade/advanced_menuitem_menu.glade.h:6 +msgid "Show _XML Console" +msgstr "Amosar a consola de _XML" + +#: ../data/glade/advanced_menuitem_menu.glade.h:7 +msgid "Update MOTD" +msgstr "Actualizar a MDD" + +#: ../data/glade/advanced_menuitem_menu.glade.h:8 +msgid "Updates Message of the Day" +msgstr "Actualiza a mensaxe do día" + +#: ../data/glade/advanced_menuitem_menu.glade.h:9 +msgid "_Administrator" +msgstr "_Administrador" + +#: ../data/glade/advanced_menuitem_menu.glade.h:10 +msgid "_Privacy Lists" +msgstr "Listaxes de _privacidade" + +#: ../data/glade/advanced_menuitem_menu.glade.h:11 +msgid "_Send Server Message" +msgstr "_Enviar a mensaxe do servidor" + +#: ../data/glade/advanced_menuitem_menu.glade.h:12 +msgid "_Send Single Message" +msgstr "_Enviar mensaxe" + +#: ../data/glade/advanced_notifications_window.glade.h:1 +msgid " a window/tab opened with that contact " +msgstr " hai unha fiestra/separador aberto con este contacto " + +#: ../data/glade/advanced_notifications_window.glade.h:2 +msgid "Actions" +msgstr "Accións" + +#: ../data/glade/advanced_notifications_window.glade.h:3 +msgid "Conditions" +msgstr "Condicións" + +#: ../data/glade/advanced_notifications_window.glade.h:4 +#: ../data/glade/preferences_window.glade.h:10 +msgid "Sounds" +msgstr "Sons" + +#: ../data/glade/advanced_notifications_window.glade.h:5 +msgid "Advanced Actions" +msgstr "Accións A_vanzadas" + +#: ../data/glade/advanced_notifications_window.glade.h:6 +msgid "Advanced Notifications Control" +msgstr "Control de notificacións avanzadas" + +#: ../data/glade/advanced_notifications_window.glade.h:7 +msgid "All statuses" +msgstr "Todos os estados" + +#: ../data/glade/advanced_notifications_window.glade.h:8 +#: ../src/common/helpers.py:234 +msgid "Away" +msgstr "Ausente" + +#: ../data/glade/advanced_notifications_window.glade.h:9 +msgid "Busy " +msgstr "Ocupado " + +#: ../data/glade/advanced_notifications_window.glade.h:10 +msgid "Don't have " +msgstr "Non ten " + +#: ../data/glade/advanced_notifications_window.glade.h:11 +msgid "Have " +msgstr "Ten " + +#: ../data/glade/advanced_notifications_window.glade.h:12 +#: ../src/common/helpers.py:244 +msgid "Invisible" +msgstr "Invisíbel" + +#: ../data/glade/advanced_notifications_window.glade.h:13 +msgid "Launch a command" +msgstr "Enviar un comando" + +#: ../data/glade/advanced_notifications_window.glade.h:14 +#: ../src/common/helpers.py:217 +msgid "Not Available" +msgstr "Non dispoñíbel" + +#: ../data/glade/advanced_notifications_window.glade.h:15 +msgid "One or more special statuses..." +msgstr "Un ou máis estados especiais..." + +#: ../data/glade/advanced_notifications_window.glade.h:16 +msgid "Online / Free For Chat" +msgstr "En liña / Libre para falar" + +#: ../data/glade/advanced_notifications_window.glade.h:17 +msgid "Play a sound" +msgstr "Reproducir un _son" + +#: ../data/glade/advanced_notifications_window.glade.h:18 +msgid "" +"Receive a Message\n" +"Contact Connected \n" +"Contact Disconnected \n" +"Contact Change Status \n" +"Group Chat Message Highlight \n" +"Group Chat Message Received \n" +"File Transfert Resquest \n" +"File Transfert Started \n" +"File Transfert Finished" +msgstr "" +"Recibir unha mensaxe\n" +"O contacto está conectado \n" +"O contacto está desconectado \n" +"O contacto mudou de estado \n" +"Mensaxe de grupo de charla realzado \n" +"Mensaxe de grupo de charla recibida \n" +"Solicitude de transferencia \n" +"Transferencia iniciada \n" +"Transferencia rematada" + +#: ../data/glade/advanced_notifications_window.glade.h:27 +msgid "When " +msgstr "Cando" + +#: ../data/glade/advanced_notifications_window.glade.h:28 +msgid "_Activate window manager's UrgencyHint to make chat window in taskbar flash" +msgstr "" +"_Activar o índice de urxencia do xestor de fiestras na barra de tarefas " +"para realzar a fiestra de charla" + +#: ../data/glade/advanced_notifications_window.glade.h:29 +msgid "_Disable auto opening chat window" +msgstr "_Desactivar a apertura automática de fiestras de charla" + +#: ../data/glade/advanced_notifications_window.glade.h:30 +msgid "_Disable existing popup window" +msgstr "_Desactivar as fiestras emerxentes existentes" + +#: ../data/glade/advanced_notifications_window.glade.h:31 +msgid "_Disable existing sound for this event" +msgstr "_Desactivar os sons existentes para este acontecemento" + +#: ../data/glade/advanced_notifications_window.glade.h:32 +msgid "_Disable showing event in roster" +msgstr "_Desactivar mostrar os eventos no roster" + +#: ../data/glade/advanced_notifications_window.glade.h:33 +msgid "_Disable showing event in systray" +msgstr "_Desactivar mostrar os eventos na área de notificación" + +#: ../data/glade/advanced_notifications_window.glade.h:34 +msgid "_Inform me with a popup window" +msgstr "_Informarme cunha fiestra emerxente" + +#: ../data/glade/advanced_notifications_window.glade.h:35 +msgid "_Open chat window with user" +msgstr "_Abrir unha fiestra de charla con este usuario" + +#: ../data/glade/advanced_notifications_window.glade.h:36 +msgid "_Show event in roster" +msgstr "_Mostrar o evento na listaxe de contactos" + +#: ../data/glade/advanced_notifications_window.glade.h:37 +msgid "_Show event in systray" +msgstr "_Mostrar o evento na área de notificación" + +#: ../data/glade/advanced_notifications_window.glade.h:38 +msgid "and I " +msgstr "e eu " + +#: ../data/glade/advanced_notifications_window.glade.h:39 +msgid "" +"contact(s)\n" +"group(s)\n" +"everybody" +msgstr "" +"contacto(s)\n" +"grupo(s)\n" +"todo o mundo" + +#: ../data/glade/advanced_notifications_window.glade.h:42 +msgid "for " +msgstr "para " + +#: ../data/glade/advanced_notifications_window.glade.h:43 +msgid "when I'm in" +msgstr "cando eu estea en" + +#: ../data/glade/atom_entry_window.glade.h:1 +msgid "2003-12-13T18:30:02Z" +msgstr "" + +#: ../data/glade/atom_entry_window.glade.h:2 +msgid "Romeo and Juliet" +msgstr "Romeo e Xulieta" + +#: ../data/glade/atom_entry_window.glade.h:3 +msgid "Entry:" +msgstr "Entrada:" + +#: ../data/glade/atom_entry_window.glade.h:4 +msgid "Feed name:" +msgstr "Nome do feed:" + +#: ../data/glade/atom_entry_window.glade.h:5 +msgid "Last modified:" +msgstr "Última modificación:" + +#: ../data/glade/atom_entry_window.glade.h:6 +msgid "New entry received" +msgstr "Recibiuse unha entrada nova" + +#: ../data/glade/atom_entry_window.glade.h:7 +msgid "Old stories" +msgstr "Historias antigas" + +#: ../data/glade/atom_entry_window.glade.h:8 +msgid "Soliloquy" +msgstr "Soliloquio" + +#: ../data/glade/atom_entry_window.glade.h:9 +msgid "You have received new entry:" +msgstr "Recibiu unha entrada nova:" + +#: ../data/glade/change_password_dialog.glade.h:1 +msgid "Change Password" +msgstr "Cambiar o contrasinal" + +#: ../data/glade/change_password_dialog.glade.h:2 +msgid "Enter it again for confirmation:" +msgstr "Insírao mais unha vez para confirmar:" + +#: ../data/glade/change_password_dialog.glade.h:3 +msgid "Enter new password:" +msgstr "Insira o contrasinal novo:" + +#: ../data/glade/change_status_message_dialog.glade.h:1 +msgid "Type your new status message" +msgstr "Escriba a súa mensaxe nova de estado" + +#: ../data/glade/change_status_message_dialog.glade.h:2 +msgid "Preset messages:" +msgstr "Mensaxes predefinidas:" + +#: ../data/glade/change_status_message_dialog.glade.h:3 +msgid "Save as Preset..." +msgstr "Gardar como predefinido..." + +#: ../data/glade/chat_context_menu.glade.h:1 +msgid "Join _Group Chat" +msgstr "Entrar nun grupo de charla" + +#: ../data/glade/chat_context_menu.glade.h:2 +#: ../data/glade/chat_control_popup_menu.glade.h:4 +#: ../data/glade/gc_occupants_menu.glade.h:2 +#: ../data/glade/roster_contact_context_menu.glade.h:10 +msgid "_Add to Roster" +msgstr "_Engadir á listaxe de contactos" + +#: ../data/glade/chat_context_menu.glade.h:3 +msgid "_Copy JID/Email Address" +msgstr "_Copiar o enderezo" + +#: ../data/glade/chat_context_menu.glade.h:4 +msgid "_Copy Link Location" +msgstr "_Copiar o enderezo da ligazón" + +#: ../data/glade/chat_context_menu.glade.h:5 +msgid "_Open Email Composer" +msgstr "_Abrir o editor de correo" + +#: ../data/glade/chat_context_menu.glade.h:6 +msgid "_Open Link in Browser" +msgstr "_Abrir a ligazón no navegador" + +#: ../data/glade/chat_context_menu.glade.h:7 +#: ../data/glade/roster_window.glade.h:20 +#: ../data/glade/subscription_request_popup_menu.glade.h:1 +#: ../data/glade/systray_context_menu.glade.h:7 +msgid "_Start Chat" +msgstr "_Iniciar a charla" + +#: ../data/glade/chat_control_popup_menu.glade.h:1 +msgid "Click to see past conversations with this contact" +msgstr "Prema aquí para ver as charlas anteriores con este contacto" + +#: ../data/glade/chat_control_popup_menu.glade.h:2 +#: ../data/glade/roster_contact_context_menu.glade.h:8 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:4 +msgid "Send _File" +msgstr "Enviar ficheiro" + +#: ../data/glade/chat_control_popup_menu.glade.h:3 +msgid "Toggle Open_PGP Encryption" +msgstr "Alternar a codificación OpenPGP" + +#: ../data/glade/chat_control_popup_menu.glade.h:5 +#: ../data/glade/gc_control_popup_menu.glade.h:6 +msgid "_Compact View Alt+C" +msgstr "Vista _compacta Alt+C" + +#: ../data/glade/chat_control_popup_menu.glade.h:6 +#: ../data/glade/gc_control_popup_menu.glade.h:7 +#: ../data/glade/gc_occupants_menu.glade.h:5 +#: ../data/glade/roster_contact_context_menu.glade.h:13 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:6 +msgid "_History" +msgstr "_Historial" + +#: ../data/glade/data_form_window.glade.h:1 +msgid "Fill in the form." +msgstr "Cubrir o formulario." + +#: ../data/glade/data_form_window.glade.h:2 +msgid "Room Configuration" +msgstr "Configuración da sala" + +#: ../data/glade/edit_groups_dialog.glade.h:1 +msgid "Edit Groups" +msgstr "Editar grupos" + +#: ../data/glade/filetransfers.glade.h:1 +msgid "A list of active, completed and stopped file transfers" +msgstr "Listaxe de transferencias activas, rematadas e detidas" + +#: ../data/glade/filetransfers.glade.h:2 +msgid "Cancel file transfer" +msgstr "Cancelar a transferencia" + +#: ../data/glade/filetransfers.glade.h:3 +msgid "Cancels the selected file transfer" +msgstr "Cancela a transferencia seleccionada do ficheiro" + +#: ../data/glade/filetransfers.glade.h:4 +msgid "Cancels the selected file transfer and removes incomplete file" +msgstr "" +"Cancela a transferencia seleccionada do ficheiro e elimina o ficheiro " +"incompleto" + +#: ../data/glade/filetransfers.glade.h:5 +msgid "Clean _up" +msgstr "Limpar" + +#: ../data/glade/filetransfers.glade.h:6 +msgid "File Transfers" +msgstr "Transferencias" + +#: ../data/glade/filetransfers.glade.h:7 +msgid "Hides the window" +msgstr "Oculta a fiestra" + +#: ../data/glade/filetransfers.glade.h:8 +msgid "Remove file transfer from the list." +msgstr "Eliminar transferencias da listaxe" + +#: ../data/glade/filetransfers.glade.h:9 +msgid "Removes completed, canceled and failed file transfers from the list" +msgstr "Elimina da listaxe as transferencias rematadas, canceladas e erradas" + +#: ../data/glade/filetransfers.glade.h:10 +msgid "Shows a list of file transfers between you and other" +msgstr "Amosa unha listaxe de transferencias entre vostede e outra persoa" + +#: ../data/glade/filetransfers.glade.h:11 +msgid "" +"This action removes single file transfer from the list. If the transfer is " +"active, it is first stopped and then removed" +msgstr "" +"Esta acción elimina transferencias da listaxe. Se a transferencia estiver " +"activa, detense primeiro e elimínase despois" + +#: ../data/glade/filetransfers.glade.h:12 +msgid "When a file transfer is complete show a popup notification" +msgstr "Cando unha transferencia se completar, amosa unha notificación emerxente" + +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:769 +msgid "_Continue" +msgstr "_Continuar" + +#: ../data/glade/filetransfers.glade.h:14 +msgid "_Notify me when a file transfer is complete" +msgstr "_Notificarme cando rematar unha transferencia" + +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:190 +msgid "_Open Containing Folder" +msgstr "_Abrir un cartafol de contido" + +#: ../data/glade/filetransfers.glade.h:16 +msgid "_Pause" +msgstr "_Pausa" + +#: ../data/glade/filetransfers.glade.h:17 +msgid "file transfers list" +msgstr "listaxe de transferencias" + +#: ../data/glade/gajim_themes_window.glade.h:1 +msgid "Chatstate Tab Colors" +msgstr "Cores do separador para os estados da charla" + +#: ../data/glade/gajim_themes_window.glade.h:2 +msgid "" +"Account row\n" +"Group row\n" +"Contact row\n" +"Chat Banner" +msgstr "" +"Conta\n" +"Grupo\n" +"Contacto\n" +"Báner" + +#: ../data/glade/gajim_themes_window.glade.h:6 +msgid "Bold" +msgstr "Negra" + +#: ../data/glade/gajim_themes_window.glade.h:7 +msgid "Composing" +msgstr "A compor" + +#: ../data/glade/gajim_themes_window.glade.h:8 +msgid "Font style:" +msgstr "Estilo:" + +#: ../data/glade/gajim_themes_window.glade.h:9 +msgid "Gajim Themes Customization" +msgstr "Personalización de temas do Gajim" + +#: ../data/glade/gajim_themes_window.glade.h:10 +msgid "Gone" +msgstr "Marchei" + +#: ../data/glade/gajim_themes_window.glade.h:11 +msgid "Inactive" +msgstr "Inactivo" + +#: ../data/glade/gajim_themes_window.glade.h:12 +msgid "Italic" +msgstr "Itálica" + +#: ../data/glade/gajim_themes_window.glade.h:13 +msgid "" +"MUC\n" +"Messages" +msgstr "" +"MUC\n" +"Mensaxes" + +#: ../data/glade/gajim_themes_window.glade.h:15 +msgid "" +"MUC Directed\n" +"Messages" +msgstr "" +"Mensaxes dirixidas\n" +"ás salas" + +#: ../data/glade/gajim_themes_window.glade.h:17 +msgid "Paused" +msgstr "Pausado" + +#: ../data/glade/gajim_themes_window.glade.h:18 +msgid "Text _color:" +msgstr "_Cor do texto:" + +#: ../data/glade/gajim_themes_window.glade.h:19 +msgid "Text _font:" +msgstr "_Letra do texto:" + +#: ../data/glade/gajim_themes_window.glade.h:20 +msgid "_Background:" +msgstr "_Fondo" + +#: ../data/glade/gc_control_popup_menu.glade.h:1 +msgid "Change _Nickname" +msgstr "Cambiar o _alcume" + +#: ../data/glade/gc_control_popup_menu.glade.h:2 +msgid "Change _Subject" +msgstr "Cambiar o _tema" + +#: ../data/glade/gc_control_popup_menu.glade.h:3 +msgid "Click to see past conversation in this room" +msgstr "Prema para ver as anteriores conversas nesta sala" + +#: ../data/glade/gc_control_popup_menu.glade.h:4 +msgid "Configure _Room" +msgstr "Configurar a sala" + +#: ../data/glade/gc_control_popup_menu.glade.h:5 +msgid "_Bookmark This Room" +msgstr "Engadir esta sala aos marcadores" + +#: ../data/glade/gc_occupants_menu.glade.h:1 +msgid "Mo_derator" +msgstr "Mo_derador" + +#: ../data/glade/gc_occupants_menu.glade.h:3 +msgid "_Admin" +msgstr "_Administrar" + +#: ../data/glade/gc_occupants_menu.glade.h:4 +msgid "_Ban" +msgstr "_Deshabilitar" + +#: ../data/glade/gc_occupants_menu.glade.h:6 +msgid "_Kick" +msgstr "_Expulsar" + +#: ../data/glade/gc_occupants_menu.glade.h:7 +msgid "_Member" +msgstr "_Membro" + +#: ../data/glade/gc_occupants_menu.glade.h:8 +msgid "_Occupant Actions" +msgstr "_Accións" + +#: ../data/glade/gc_occupants_menu.glade.h:9 +msgid "_Owner" +msgstr "_Propietario" + +#: ../data/glade/gc_occupants_menu.glade.h:10 +msgid "_Send Private Message" +msgstr "_Enviar unha mensaxe privada" + +#: ../data/glade/gc_occupants_menu.glade.h:11 +msgid "_Voice" +msgstr "_Voz" + +#: ../data/glade/groups_post_window.glade.h:1 +msgid "Create new post" +msgstr "Crear unha publicación nova" + +#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:259 +msgid "From" +msgstr "De" + +#. holds subject +#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:141 +#: ../src/history_manager.py:172 +msgid "Subject" +msgstr "Asunto" + +#: ../data/glade/history_manager.glade.h:1 +msgid "" +"Welcome to Gajim History Logs Manager\n" +"\n" +"You can select logs from the left and/or search database from below.\n" +"\n" +"WARNING:\n" +"If you plan to do massive deletions, please make sure Gajim is not running. " +"Generally avoid deletions with contacts you currently chat with." +msgstr "" +"Benvido/a ao xestor do historial do Gajim\n" +"\n" +"Pode seleccionar logs da esquerda e/ou procurar na base de datos de abaixo.\n" +"\n" +"AVISO:\n" +"Se ten previsto facer eliminacións masivas, asegúrese de que o Gajim\n" +"non estea en execución. Xeralmente, evita eliminacións relativas a " +"contactos con que estiver\n" +"a falar neste momento." + +#: ../data/glade/history_manager.glade.h:7 +msgid "Delete" +msgstr "Eliminar" + +#: ../data/glade/history_manager.glade.h:8 +msgid "Export" +msgstr "Exportar" + +#: ../data/glade/history_manager.glade.h:9 +msgid "Gajim History Logs Manager" +msgstr "Xestor do Historial de Gajim" + +#: ../data/glade/history_manager.glade.h:10 +msgid "_Search Database" +msgstr "_Buscar na base de datos" + +#: ../data/glade/history_window.glade.h:1 +msgid "Build custom query" +msgstr "Construír unha consulta personalizada" + +#: ../data/glade/history_window.glade.h:2 +msgid "Conversation History" +msgstr "Historial de conversas" + +#: ../data/glade/history_window.glade.h:3 +msgid "Query Builder..." +msgstr "Construtor de consultas..." + +#: ../data/glade/history_window.glade.h:4 +msgid "Search" +msgstr "Buscar" + +#: ../data/glade/history_window.glade.h:5 +msgid "_Search" +msgstr "_Buscar" + +#: ../data/glade/invitation_received_dialog.glade.h:1 +msgid "Accept" +msgstr "Aceptar" + +#: ../data/glade/invitation_received_dialog.glade.h:2 +#: ../data/glade/privacy_list_window.glade.h:8 +msgid "Deny" +msgstr "Denegar" + +#: ../data/glade/invitation_received_dialog.glade.h:3 +msgid "Invitation Received" +msgstr "Recibiuse un convite" + +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1146 +msgid "Join Group Chat" +msgstr "Entrar nunha sala de charlas" + +#: ../data/glade/join_groupchat_window.glade.h:2 +#: ../data/glade/manage_bookmarks_window.glade.h:4 +#: ../data/glade/profile_window.glade.h:23 +#: ../data/glade/vcard_information_window.glade.h:29 +msgid "Nickname:" +msgstr "Alcume:" + +#: ../data/glade/join_groupchat_window.glade.h:3 +#: ../data/glade/manage_bookmarks_window.glade.h:5 +msgid "Password:" +msgstr "Contrasinal: " + +#: ../data/glade/join_groupchat_window.glade.h:4 +msgid "Recently:" +msgstr "Recentemente:" + +#: ../data/glade/join_groupchat_window.glade.h:5 +#: ../data/glade/manage_bookmarks_window.glade.h:7 +msgid "Room:" +msgstr "Sala:" + +#: ../data/glade/join_groupchat_window.glade.h:6 ../src/disco.py:1151 +#: ../src/disco.py:1518 +msgid "_Join" +msgstr "_Entrar" + +#: ../data/glade/manage_accounts_window.glade.h:1 +msgid "Manage Accounts" +msgstr "Xestionar as contas" +#: ../data/glade/manage_bookmarks_window.glade.h:1 +msgid "Auto join" +msgstr "Autoconectar" + +#: ../data/glade/manage_bookmarks_window.glade.h:2 +msgid "If checked, Gajim will join this group chat on startup" +msgstr "Se isto está marcado, o Gajim entrará a esta sala ao inicio" + +#: ../data/glade/manage_bookmarks_window.glade.h:3 +msgid "Manage Bookmarks" +msgstr "Xestionar os marcadores" + +#: ../data/glade/manage_bookmarks_window.glade.h:6 +msgid "Print status:" +msgstr "Amosar o estado:" + +#: ../data/glade/manage_bookmarks_window.glade.h:8 +msgid "Server:" +msgstr "Servidor:" + +#: ../data/glade/manage_bookmarks_window.glade.h:9 +msgid "Title:" +msgstr "Título:" + +#: ../data/glade/manage_proxies_window.glade.h:1 +msgid "Properties" +msgstr "Propiedades" + +#: ../data/glade/manage_proxies_window.glade.h:2 +msgid "Settings" +msgstr "Configuración" + +#: ../data/glade/manage_proxies_window.glade.h:3 +msgid "HTTP Connect" +msgstr "Conectar con HTTP" + +#: ../data/glade/manage_proxies_window.glade.h:4 +msgid "Manage Proxy Profiles" +msgstr "Xestionar os perfís do proxy" + +#: ../data/glade/manage_proxies_window.glade.h:5 +#: ../data/glade/profile_window.glade.h:22 +#: ../data/glade/vcard_information_window.glade.h:28 +msgid "Name:" +msgstr "Nome:" + +#: ../data/glade/manage_proxies_window.glade.h:7 +msgid "Type:" +msgstr "Tipo:" + +#: ../data/glade/manage_proxies_window.glade.h:8 +msgid "Use authentication" +msgstr "Usar a autenticación" + +#: ../data/glade/message_window.glade.h:1 +msgid "Click to insert an emoticon (Alt+M)" +msgstr "Prema aquí para inserir unha emoticona (Alt+M)" + +#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1104 +msgid "OpenPGP Encryption" +msgstr "Cifrado OpenPGP" + +#. 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:4 +#: ../data/glade/roster_window.glade.h:10 +#: ../data/glade/subscription_request_window.glade.h:6 +msgid "_Actions" +msgstr "_Accións" + +#. 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:6 +#: ../data/glade/xml_console_window.glade.h:11 +#: ../src/filetransfers_window.py:253 +msgid "_Send" +msgstr "_Enviar" + +#: ../data/glade/passphrase_dialog.glade.h:1 +msgid "Passphrase" +msgstr "Contrasinal" + +#: ../data/glade/preferences_window.glade.h:1 +msgid "Advanced Configuration Editor" +msgstr "Editor de configuración avanzada" + +#: ../data/glade/preferences_window.glade.h:2 +msgid "Applications" +msgstr "Programas" + +#. a header for custom browser/client/file manager. so translate sth like: Custom Settings +#: ../data/glade/preferences_window.glade.h:4 +msgid "Custom" +msgstr "Personalizado" + +#: ../data/glade/preferences_window.glade.h:5 +msgid "Format of a line" +msgstr "Formato da liña" + +#: ../data/glade/preferences_window.glade.h:6 +msgid "GMail Options" +msgstr "Opcións de GMail" + +#: ../data/glade/preferences_window.glade.h:7 +msgid "Interface Customization" +msgstr "Personalización da interface" + +#: ../data/glade/preferences_window.glade.h:9 +msgid "Preset Status Messages" +msgstr "Mensaxes de estado predefinidas" + +#: ../data/glade/preferences_window.glade.h:11 +msgid "Visual Notifications" +msgstr "Notificacións visuais" + +#: ../data/glade/preferences_window.glade.h:12 +msgid "A_fter nickname:" +msgstr "Despois do alcume:" + +#: ../data/glade/preferences_window.glade.h:13 +msgid "Advanced" +msgstr "Avanzado" + +#: ../data/glade/preferences_window.glade.h:14 +msgid "" +"All chat states\n" +"Composing only\n" +"Disabled" +msgstr "" +"Todos os estados da charla\n" +"Só escribindo\n" +"Desactivado" + +#: ../data/glade/preferences_window.glade.h:17 +msgid "Allow _OS information to be sent" +msgstr "Permitir o envío de información sobre o sistema operativo" + +#: ../data/glade/preferences_window.glade.h:18 +msgid "Allow popup/notifications when I'm _away/na/busy/invisible" +msgstr "" +"Permitir as notificacións emerxentes cando estou _ausente, non dispoñíbel, " +"ocupado ou invisíbel." + +#: ../data/glade/preferences_window.glade.h:19 +msgid "Also known as iChat style" +msgstr "Tamén coñecido como estilo iChat" + +#: ../data/glade/preferences_window.glade.h:20 +msgid "" +"An example: If you have enabled status message for away, Gajim won't ask you " +"anymore for a status message when you change your status to away; it will " +"use the default one set here" +msgstr "" +"Como exemplo, se ten activado a mensaxe de estado en ausente, o Gajim non " +"lle preguntará máis por unha mensaxe de estado cando mude o seu estado a " +"ausente; simplemente aplicará a mensaxe predefinida para ausente" + +#: ../data/glade/preferences_window.glade.h:21 +msgid "Ask status message when I:" +msgstr "Preguntar a mensaxe de estado cando estea: " + +#: ../data/glade/preferences_window.glade.h:22 +msgid "Auto _away after:" +msgstr "Pór _ausente despois de:" + +#: ../data/glade/preferences_window.glade.h:23 +msgid "Auto _not available after:" +msgstr "Pór _non dispoñíbel despois de:" + +#: ../data/glade/preferences_window.glade.h:24 +msgid "" +"Autodetect on every Gajim startup\n" +"Always use GNOME default applications\n" +"Always use KDE default applications\n" +"Always use XFCE4 default applications\n" +"Custom" +msgstr "" +"Detectar automaticamente en cada inicio do Gajim\n" +"Usar sempre as aplicacións por defecto do GNOME\n" +"Usar sempre as aplicacións por defecto do KDE\n" +"Usar sempre as aplicacións por defecto do XFCE4\n" +"Personalizado" + +#: ../data/glade/preferences_window.glade.h:29 +msgid "B_efore nickname:" +msgstr "Ant_es do alcume:" + +#: ../data/glade/preferences_window.glade.h:30 ../src/chat_control.py:844 +msgid "Chat" +msgstr "Charla" + +#: ../data/glade/preferences_window.glade.h:31 +msgid "" +"Check this option, only if someone you don't have in the roster spams/annoys " +"you. Use with caution, cause it blocks all messages from any contact that is " +"not in the roster" +msgstr "" +"Marque esta opción só se alguén que non ten na listaxe está a molestalo. " +"Emprégueo con precaución xa que bloqueará todas as mensaxes de calquera " +"contacto que non estiver na súa listaxe de contactos." + +#: ../data/glade/preferences_window.glade.h:32 +msgid "Configure color and font of the interface" +msgstr "Configurar as cores e as fontes da interface" + +#: ../data/glade/preferences_window.glade.h:33 +msgid "Default Status Messages" +msgstr "Mensaxes de estado por defecto" + +#: ../data/glade/preferences_window.glade.h:34 +msgid "Default status _iconset:" +msgstr "Conxunto de _iconas de estado por defecto:" + +#: ../data/glade/preferences_window.glade.h:35 +msgid "Display _extra email details" +msgstr "Amosar os detalles _extra nos correos electrónicos" + +#: ../data/glade/preferences_window.glade.h:36 +msgid "Display a_vatars of contacts in roster" +msgstr "Amosar na listaxe os a_vatares dos contactos" + +#: ../data/glade/preferences_window.glade.h:37 +msgid "Display status _messages of contacts in roster" +msgstr "Amosar na listaxe as _mensaxes de estado dos contactos" + +#: ../data/glade/preferences_window.glade.h:38 +msgid "Displayed Chat state noti_fications:" +msgstr "Notificacións de estado nas charlas:" + +#: ../data/glade/preferences_window.glade.h:39 +msgid "E_very 5 minutes" +msgstr "Cada 5 _minutos" + +#: ../data/glade/preferences_window.glade.h:40 +msgid "Emoticons:" +msgstr "Emoticonas:" + +#: ../data/glade/preferences_window.glade.h:41 +msgid "Events" +msgstr "Eventos" + +#: ../data/glade/preferences_window.glade.h:42 +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 " +"display in chat windows." +msgstr "" +"O Gajim pode enviar e recibir metainformación relacionada cunha " +"charla que estiver a manter cun contacto. Pode especificar aquí que " +"estados de charla quere que se amosen nas fiestras." + +#: ../data/glade/preferences_window.glade.h:43 +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 " +"send to the other party." +msgstr "" +"O Gajim pode enviar e recibir metainformación relacionada cunha " +"conversa que estiver a manter cun contacto. Pode especificar aquí que " +"estados de charla quere enviarlle á outra persoa." + +#: ../data/glade/preferences_window.glade.h:44 +msgid "Gajim will automatically show new events by poping up the relative window" +msgstr "O Gajim amosará automaticamente novos acontecementos a emerxeren na fiestra relativa" + +#: ../data/glade/preferences_window.glade.h:45 +msgid "" +"Gajim will notify you for new events via a popup in the bottom right of the " +"screen" +msgstr "" +"O Gajim notificaralle novos acontecementos a través dunha mensaxe emerxente no " +"bordo inferior dereito da pantalla" + +#: ../data/glade/preferences_window.glade.h:46 +msgid "" +"Gajim will notify you via a popup window in the bottom right of the screen " +"about contacts that just signed in" +msgstr "" +"O Gajim notificaralle cunha mensaxe emerxente na parte inferior dereita da " +"pantalla cando un contacto se conectar" + +#: ../data/glade/preferences_window.glade.h:47 +msgid "" +"Gajim will notify you via a popup window in the bottom right of the screen " +"about contacts that just signed out" +msgstr "" +"O Gajim notificaralle cunha mensaxe emerxente na parte inferior dereita da " +"pantalla cando un contacto se desconectar" + +#: ../data/glade/preferences_window.glade.h:48 +msgid "Gajim will only change the icon of the contact that triggered the new event" +msgstr "O Gajim só lle amosará a icona do contacto que provocou o novo acontecemento" + +#: ../data/glade/preferences_window.glade.h:50 +msgid "" +"If checked, Gajim will also include information about the sender of the new " +"emails" +msgstr "" +"Se isto está marcado, o Gajim tamén incluirá información sobre o remitente de " +"correos electrónicos novos" + +#: ../data/glade/preferences_window.glade.h:51 +msgid "" +"If checked, Gajim will display avatars of contacts in roster window and in " +"group chats" +msgstr "" +"Se isto está marcado, o Gajim amosará as circunstancias dos contactos na listaxe e " +"nos grupos de charla" + +#: ../data/glade/preferences_window.glade.h:52 +msgid "" +"If checked, Gajim will display status messages of contacts under the contact " +"name in roster window and in group chats" +msgstr "" +"Se isto está marcado, o Gajim amosará as mensaxes de estado dos contactos debaixo " +"do nome do contacto na listaxe e en grupos de charla" + +#: ../data/glade/preferences_window.glade.h:53 +msgid "" +"If checked, Gajim will remember the roster and chat window positions in the " +"screen and the sizes of them next time you run it" +msgstr "" +"Se isto está marcado, o Gajim lembrará a posición da listaxe e das fiestras de " +"conversa na pantalla e os seus tamaños para a próxima vez que aparezan" + +#: ../data/glade/preferences_window.glade.h:54 +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, " +"etc...)" +msgstr "" +"Se isto está marcado, o Gajim empregará iconas específicas para o protocolo- (por exemplo, " +"un contacto de MSN terá a icona de MSN equivalente para o seu estado en " +"liña, ausente, ocupado etc.)" + +#: ../data/glade/preferences_window.glade.h:55 +msgid "" +"If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " +"animated or static graphical emoticons" +msgstr "" +"Se non está desactivado, o Gajim substituirá emoticonas ASCCI ':)' polo seu " +"equivalente en iconas gráficas estáticas ou animadas" + +#: ../data/glade/preferences_window.glade.h:56 +msgid "Ignore rich content in incoming messages" +msgstr "Ignorar o contido adornado en mensaxes entrantes" + +#: ../data/glade/preferences_window.glade.h:57 +msgid "Ma_nage..." +msgstr "Xestio_nar..." + +#: ../data/glade/preferences_window.glade.h:58 +msgid "" +"Never\n" +"Always\n" +"Per account\n" +"Per type" +msgstr "" +"Nunca\n" +"Sempre\n" +"Por conta\n" +"Por tipo" + +#: ../data/glade/preferences_window.glade.h:62 +msgid "Notify me about contacts that: " +msgstr "Notificar cando un contacto: " + +#: ../data/glade/preferences_window.glade.h:63 +msgid "Notify on new _GMail email" +msgstr "Notificar de novos correos de _GMail" + +#: ../data/glade/preferences_window.glade.h:64 +msgid "On every _message" +msgstr "En cada _mensaxe" + +#: ../data/glade/preferences_window.glade.h:65 +msgid "One message _window:" +msgstr "Unha soa fiestra de conversa" + +#: ../data/glade/preferences_window.glade.h:66 +msgid "Outgoing Chat state noti_fications:" +msgstr "Notificacións saíntes do estado de charla:" + +#: ../data/glade/preferences_window.glade.h:67 +msgid "Play _sounds" +msgstr "Reproducir _sons" + +#: ../data/glade/preferences_window.glade.h:68 +msgid "Preferences" +msgstr "Preferencias" + +#: ../data/glade/preferences_window.glade.h:69 +msgid "Print time:" +msgstr "Inserir a hora:" + +#: ../data/glade/preferences_window.glade.h:70 +msgid "Save _position and size for roster and chat windows" +msgstr "" +"Gardar a _posición e o tamaño para as fiestras de charla e a listaxe de " +"contactos" + +#: ../data/glade/preferences_window.glade.h:71 +msgid "Set status message to reflect currently playing _music track" +msgstr "Cambiar a mensaxe de estado para reflectir a pista_musical en reprodución" + +#: ../data/glade/preferences_window.glade.h:72 +msgid "Show only in _roster" +msgstr "Amosar só na _listaxe de contactos" + +#: ../data/glade/preferences_window.glade.h:73 +msgid "Sign _in" +msgstr "Conectar" + +#: ../data/glade/preferences_window.glade.h:74 +msgid "Sign _out" +msgstr "_Desconectar" + +#: ../data/glade/preferences_window.glade.h:75 +msgid "" +"Some messages may include rich content (formatting, colors etc). If checked, " +"Gajim will just display the raw message text." +msgstr "" +"Algunhas mensaxes poden incluír un contido adornado (formato, cores " +"etc). Se isto está marcado, o Gajim amosará a mensaxe en bruto." + +#: ../data/glade/preferences_window.glade.h:76 +msgid "Status" +msgstr "Estado" + +#: ../data/glade/preferences_window.glade.h:77 +msgid "T_heme:" +msgstr "Te_ma:" + +#: ../data/glade/preferences_window.glade.h:78 +msgid "The auto away status message" +msgstr "A mensaxe de estado de autoausencia" + +#: ../data/glade/preferences_window.glade.h:79 +msgid "The auto not available status message" +msgstr "A mensaxe de estado de non autodispoñíbel" + +#: ../data/glade/preferences_window.glade.h:80 +msgid "Use _transports iconsets" +msgstr "_Usar as iconas do transporte" + +#: ../data/glade/preferences_window.glade.h:81 +msgid "Use system _default" +msgstr "Usar o pre_definido do sistema" + +#: ../data/glade/preferences_window.glade.h:82 +msgid "Use t_rayicon (aka. notification area icon)" +msgstr "Usar a icona na á_rea de notificación" + +#: ../data/glade/preferences_window.glade.h:83 +msgid "" +"When a new event (message, file transfer request etc..) is received, the " +"following methods may be used to inform you about it. Please note that " +"events about new messages only occur if it is a new message from a contact " +"you are not already chatting with" +msgstr "" +"Cando se recibe un novo acontecemento (mensaxe, envío de ficheiros etc.), " +"poden usarse os seguintes métodos para o informar. Cómpre salientar que os " +"acontecementos das mensaxes novas só ocorren se proceden dun contacto con " +"que non estaba xa a conversar" + +#: ../data/glade/preferences_window.glade.h:84 +msgid "When new event is received" +msgstr "Cando se reciba un acontecemento novo" + +#: ../data/glade/preferences_window.glade.h:85 +msgid "" +"Works for Rhythmbox and Muine players. For more players, please visit http://" +"trac.gajim.org/wiki/GajimAndMusicPlayer" +msgstr "" +"Funciona para os reprodutores Rythmbox e Muine. Para máis reprodutores, " +"pode visitar http://trac.gajim.org/wiki/GajimAndMusicPlayer" + +#: ../data/glade/preferences_window.glade.h:86 +msgid "_Advanced Notifications Control..." +msgstr "Control de notificacións _avanzadas..." + +#: ../data/glade/preferences_window.glade.h:87 +msgid "_After time:" +msgstr "_Despois da hora:" + +#: ../data/glade/preferences_window.glade.h:88 +msgid "_Before time:" +msgstr "_Antes da hora:" + +#: ../data/glade/preferences_window.glade.h:89 +msgid "_Browser:" +msgstr "_Navegador:" + +#: ../data/glade/preferences_window.glade.h:90 +msgid "_File manager:" +msgstr "A_dministrador de ficheiros:" + +#: ../data/glade/preferences_window.glade.h:91 +msgid "_Font:" +msgstr "_Letra:" + +#: ../data/glade/preferences_window.glade.h:92 +msgid "_Highlight misspelled words" +msgstr "_Marcar os erros ortográficos" + +#: ../data/glade/preferences_window.glade.h:93 +msgid "_Ignore events from contacts not in the roster" +msgstr "_Ignorar as mensaxes de contactos que non estean na listaxe de contactos" + +#: ../data/glade/preferences_window.glade.h:94 +msgid "_Incoming message:" +msgstr "Mens_axe entrante:" + +#: ../data/glade/preferences_window.glade.h:95 +msgid "_Log status changes of contacts" +msgstr "_Rexistrar os cambios de estado dos contactos" + +#: ../data/glade/preferences_window.glade.h:96 +msgid "_Mail client:" +msgstr "_Cliente de correo:" + +#: ../data/glade/preferences_window.glade.h:97 +msgid "_Never" +msgstr "_Nunca" + +#: ../data/glade/preferences_window.glade.h:98 +msgid "_Notify me about it" +msgstr "_Notificarmo" + +#: ../data/glade/preferences_window.glade.h:99 +msgid "_Open..." +msgstr "_Abrir..." + +#: ../data/glade/preferences_window.glade.h:100 +msgid "_Outgoing message:" +msgstr "Mensaxe saínte:" + +#: ../data/glade/preferences_window.glade.h:101 +msgid "_Player:" +msgstr "_Reprodutor:" + +#: ../data/glade/preferences_window.glade.h:102 +msgid "_Pop it up" +msgstr "_Emerxer" + +#: ../data/glade/preferences_window.glade.h:103 +msgid "_Reset to Default Colors" +msgstr "_Restabelecer as cores predeterminadas" + +#: ../data/glade/preferences_window.glade.h:104 +msgid "_Sort contacts by status" +msgstr "Ordenar os contacto_s polo estado" + +#: ../data/glade/preferences_window.glade.h:105 +msgid "_Status message:" +msgstr "Men_saxe de estado:" + +#: ../data/glade/preferences_window.glade.h:106 +msgid "_URL:" +msgstr "_URL" + +#: ../data/glade/preferences_window.glade.h:107 +msgid "minutes" +msgstr "minutos" + +#: ../data/glade/privacy_lists_window.glade.h:1 +msgid "Privacy Lists:" +msgstr "Listaxes de privacidade:" + +#: ../data/glade/privacy_list_window.glade.h:1 +msgid "Add / Edit a rule" +msgstr "Engadir / Editar unha regra" + +#: ../data/glade/privacy_list_window.glade.h:2 +msgid "List of rules" +msgstr "Listaxe de regras" + +#: ../data/glade/privacy_list_window.glade.h:3 +msgid "Privacy List" +msgstr "Listaxe de privacidade" + +#: ../data/glade/privacy_list_window.glade.h:4 +msgid "Active for this session" +msgstr "Activo para esta sesión" + +#: ../data/glade/privacy_list_window.glade.h:5 +msgid "Active on each startup" +msgstr "Activo en cada inicio" + +#: ../data/glade/privacy_list_window.glade.h:6 +msgid "All" +msgstr "Todos" + +#: ../data/glade/privacy_list_window.glade.h:7 +msgid "Allow" +msgstr "Permitir" + +#: ../data/glade/privacy_list_window.glade.h:9 +msgid "JabberID" +msgstr "ID de Jabber:" + +#: ../data/glade/privacy_list_window.glade.h:10 +msgid "Order:" +msgstr "Orde:" + +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:1841 +msgid "Privacy List" +msgstr "Listaxe de privacidade" + +#: ../data/glade/privacy_list_window.glade.h:12 +msgid "all by subscription" +msgstr "todos por subscrición" + +#: ../data/glade/privacy_list_window.glade.h:13 +msgid "all in the group" +msgstr "todos no grupo" + +#: ../data/glade/privacy_list_window.glade.h:14 +msgid "" +"none\n" +"both\n" +"from\n" +"to" +msgstr "" +"ningún\n" +"ambos\n" +"de\n" +"a" + +#: ../data/glade/privacy_list_window.glade.h:18 +msgid "to send me messages" +msgstr "para me enviar mensaxes" + +#: ../data/glade/privacy_list_window.glade.h:19 +msgid "to send me queries" +msgstr "para me enviar preguntas" + +#: ../data/glade/privacy_list_window.glade.h:20 +msgid "to send me status" +msgstr "para me enviar o estado" + +#: ../data/glade/privacy_list_window.glade.h:21 +msgid "to view my status" +msgstr "para ver o meu estado" + +#. "About" is the text of a tab of vcard window +#: ../data/glade/profile_window.glade.h:2 +#: ../data/glade/vcard_information_window.glade.h:2 +msgid "About" +msgstr "Acerca de" + +#: ../data/glade/profile_window.glade.h:3 +#: ../data/glade/vcard_information_window.glade.h:3 +msgid "Address" +msgstr "Enderezo" + +#: ../data/glade/profile_window.glade.h:4 +msgid "Avatar:" +msgstr "Imaxe:" + +#: ../data/glade/profile_window.glade.h:5 +#: ../data/glade/vcard_information_window.glade.h:6 +msgid "Birthday:" +msgstr "Aniversario:" + +#: ../data/glade/profile_window.glade.h:6 +#: ../data/glade/vcard_information_window.glade.h:7 +msgid "City:" +msgstr "Cidade:" + +#: ../data/glade/profile_window.glade.h:7 +#: ../data/glade/vcard_information_window.glade.h:10 +msgid "Company:" +msgstr "Empresa:" + +#: ../data/glade/profile_window.glade.h:8 +#: ../data/glade/vcard_information_window.glade.h:13 +msgid "Country:" +msgstr "País:" + +#: ../data/glade/profile_window.glade.h:9 +#: ../data/glade/vcard_information_window.glade.h:14 +msgid "Department:" +msgstr "Departamento:" + +#: ../data/glade/profile_window.glade.h:10 +#: ../data/glade/vcard_information_window.glade.h:15 +#: ../data/glade/zeroconf_information_window.glade.h:2 +#: ../data/glade/zeroconf_properties_window.glade.h:5 +msgid "E-Mail:" +msgstr "Correo electrónico:" + +#: ../data/glade/profile_window.glade.h:11 +#: ../data/glade/vcard_information_window.glade.h:16 +msgid "Extra Address:" +msgstr "Segundo enderezo:" + +#. Family Name +#: ../data/glade/profile_window.glade.h:13 +#: ../data/glade/vcard_information_window.glade.h:18 +msgid "Family:" +msgstr "Familia:" + +#. Do NOT change sequence. Just translate YYYY and MM and DD (from Year, Month, Day accordingly) +#: ../data/glade/profile_window.glade.h:15 +#: ../data/glade/vcard_information_window.glade.h:20 +msgid "Format: YYYY-MM-DD" +msgstr "Formato: AAAA-MM-DD" + +#. Given Name +#: ../data/glade/profile_window.glade.h:17 +#: ../data/glade/vcard_information_window.glade.h:22 +msgid "Given:" +msgstr "Nome:" + +#: ../data/glade/profile_window.glade.h:18 +#: ../data/glade/vcard_information_window.glade.h:23 +msgid "Homepage:" +msgstr "Páxina web:" + +#. Middle Name +#: ../data/glade/profile_window.glade.h:20 +#: ../data/glade/vcard_information_window.glade.h:26 +msgid "Middle:" +msgstr "Medio:" + +#: ../data/glade/profile_window.glade.h:21 +#: ../data/glade/vcard_information_window.glade.h:27 +msgid "More" +msgstr "Máis" + +#: ../data/glade/profile_window.glade.h:24 +#: ../data/glade/vcard_information_window.glade.h:31 +msgid "Personal Info" +msgstr "Información persoal" + +#: ../data/glade/profile_window.glade.h:26 +#: ../data/glade/vcard_information_window.glade.h:32 +msgid "Phone No.:" +msgstr "Teléfono:" + +#: ../data/glade/profile_window.glade.h:27 +#: ../data/glade/vcard_information_window.glade.h:33 +msgid "Position:" +msgstr "Posición:" + +#: ../data/glade/profile_window.glade.h:28 +#: ../data/glade/vcard_information_window.glade.h:34 +msgid "Postal Code:" +msgstr "Código postal:" + +#. Prefix in Name +#: ../data/glade/profile_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:36 +msgid "Prefix:" +msgstr "Prefixo" + +#: ../data/glade/profile_window.glade.h:31 +#: ../data/glade/vcard_information_window.glade.h:38 ../src/vcard.py:273 +msgid "Role:" +msgstr "Papel:" + +#: ../data/glade/profile_window.glade.h:32 +#: ../data/glade/vcard_information_window.glade.h:39 +msgid "State:" +msgstr "Estado:" + +#: ../data/glade/profile_window.glade.h:33 +#: ../data/glade/vcard_information_window.glade.h:41 +msgid "Street:" +msgstr "Rúa:" + +#. Suffix in Name +#: ../data/glade/profile_window.glade.h:35 +#: ../data/glade/vcard_information_window.glade.h:45 +msgid "Suffix:" +msgstr "Sufixo:" + +#: ../data/glade/profile_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:46 +msgid "Work" +msgstr "Traballo" + +#: ../data/glade/profile_window.glade.h:37 +msgid "_Publish" +msgstr "_Publicar" + +#: ../data/glade/profile_window.glade.h:38 +msgid "_Retrieve" +msgstr "_Recuperar" + +#: ../data/glade/remove_account_window.glade.h:1 +msgid "What do you want to do?" +msgstr "Que quere facer?" + +#: ../data/glade/remove_account_window.glade.h:2 +msgid "Remove account _only from Gajim" +msgstr "Eliminar a _conta unicamente do Gajim" + +#: ../data/glade/remove_account_window.glade.h:3 +msgid "Remove account from Gajim and from _server" +msgstr "Eliminar a conta do Gajim e do _servidor" + +#: ../data/glade/roster_contact_context_menu.glade.h:1 +msgid "A_sk to see his/her status" +msgstr "Pregunta para ver o _seu estado" + +#: ../data/glade/roster_contact_context_menu.glade.h:2 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:1 +msgid "Add Special _Notification" +msgstr "Engadir unha _notificación especial" + +#: ../data/glade/roster_contact_context_menu.glade.h:3 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:2 +msgid "Assign Open_PGP Key" +msgstr "Asignar chave de OpenPGP" + +#: ../data/glade/roster_contact_context_menu.glade.h:4 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:3 +#: ../src/roster_window.py:1993 +msgid "Edit _Groups" +msgstr "Editar os grupos" + +#: ../data/glade/roster_contact_context_menu.glade.h:5 +#: ../src/roster_window.py:2128 +msgid "Execute Command..." +msgstr "Executar o comando..." + +#: ../data/glade/roster_contact_context_menu.glade.h:6 +#: ../src/roster_window.py:1951 +msgid "In_vite to" +msgstr "Con_vidar" + +#: ../data/glade/roster_contact_context_menu.glade.h:7 +#: ../data/glade/systray_context_menu.glade.h:2 +msgid "Send Single _Message" +msgstr "Enviar mensaxe" + +#: ../data/glade/roster_contact_context_menu.glade.h:9 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:5 +msgid "Start _Chat" +msgstr "Iniciar a charla" + +#: ../data/glade/roster_contact_context_menu.glade.h:11 +msgid "_Allow him/her to see my status" +msgstr "Permitirlle ver o meu estado" + +#: ../data/glade/roster_contact_context_menu.glade.h:12 +msgid "_Forbid him/her to see my status" +msgstr "Prohibirlle ver o meu estado" + +#. Remove group +#: ../data/glade/roster_contact_context_menu.glade.h:14 +#: ../src/roster_window.py:1945 ../src/roster_window.py:2042 +#: ../src/roster_window.py:2149 +msgid "_Remove from Roster" +msgstr "_Eliminar da listaxe" + +#: ../data/glade/roster_contact_context_menu.glade.h:15 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:7 +#: ../src/roster_window.py:2137 +msgid "_Rename" +msgstr "Renomear" + +#: ../data/glade/roster_contact_context_menu.glade.h:16 +msgid "_Subscription" +msgstr "_Subscrición" + +#: ../data/glade/roster_window.glade.h:1 +msgid "A_ccounts" +msgstr "_Contas" + +#: ../data/glade/roster_window.glade.h:2 +msgid "Add _Contact" +msgstr "Engadir un _contacto" + +#: ../data/glade/roster_window.glade.h:3 +msgid "File _Transfers" +msgstr "_Transferencias" + +#: ../data/glade/roster_window.glade.h:4 +msgid "Frequently Asked Questions (online)" +msgstr "Preguntas frecuentes (en liña)" + +#: ../data/glade/roster_window.glade.h:6 +msgid "Help online" +msgstr "Axuda en liña" + +#: ../data/glade/roster_window.glade.h:7 +msgid "Profile, A_vatar" +msgstr "Perfil, Ima_xe" + +#: ../data/glade/roster_window.glade.h:8 +msgid "Show Trans_ports" +msgstr "Amosar os trans_portes" + +#: ../data/glade/roster_window.glade.h:9 +msgid "Show _Offline Contacts" +msgstr "Amosar os contactos desconectados" + +#: ../data/glade/roster_window.glade.h:12 +msgid "_Contents" +msgstr "_Contidos" + +#: ../data/glade/roster_window.glade.h:13 +msgid "_Discover Services" +msgstr "_Descubrir os servizos" + +#: ../data/glade/roster_window.glade.h:14 ../src/disco.py:1256 +#: ../src/roster_window.py:2120 +msgid "_Edit" +msgstr "_Editar" + +#: ../data/glade/roster_window.glade.h:15 +msgid "_FAQ" +msgstr "_FAQ" + +#: ../data/glade/roster_window.glade.h:17 +msgid "_Help" +msgstr "_Axuda" + +#: ../data/glade/roster_window.glade.h:18 +msgid "_Preferences" +msgstr "_Preferencias" + +#: ../data/glade/roster_window.glade.h:19 +msgid "_Quit" +msgstr "_Saír" + +#: ../data/glade/roster_window.glade.h:21 +msgid "_View" +msgstr "_Ver" + +#: ../data/glade/service_discovery_window.glade.h:1 +msgid "G_o" +msgstr "I_r" + +#: ../data/glade/service_discovery_window.glade.h:2 +msgid "_Address:" +msgstr "_Enderezo:" + +#: ../data/glade/service_discovery_window.glade.h:3 +msgid "_Filter:" +msgstr "_Filtro:" + +#: ../data/glade/service_registration_window.glade.h:1 +msgid "Register to" +msgstr "Rexistrar en" + +#: ../data/glade/service_registration_window.glade.h:2 +msgid "_Cancel" +msgstr "_Cancelar" + +#: ../data/glade/service_registration_window.glade.h:3 +msgid "_OK" +msgstr "_Aceptar" + +#: ../data/glade/single_message_window.glade.h:1 +msgid "0" +msgstr "0" + +#: ../data/glade/single_message_window.glade.h:2 +msgid "From:" +msgstr "De:" + +#: ../data/glade/single_message_window.glade.h:3 +msgid "Reply to this message" +msgstr "Responder esta mensaxe:" + +#: ../data/glade/single_message_window.glade.h:4 +msgid "Sen_d" +msgstr "Enviar" + +#: ../data/glade/single_message_window.glade.h:5 +msgid "Send message" +msgstr "Enviar a mensaxe" + +#: ../data/glade/single_message_window.glade.h:6 +msgid "Send message and close window" +msgstr "Enviar a mensaxe e pechar a fiestra" + +#: ../data/glade/single_message_window.glade.h:7 +msgid "Subject:" +msgstr "Tema:" + +#: ../data/glade/single_message_window.glade.h:8 +msgid "To:" +msgstr "A:" + +#: ../data/glade/single_message_window.glade.h:9 +msgid "_Reply" +msgstr "_Responder" + +#: ../data/glade/single_message_window.glade.h:10 +msgid "_Send & Close" +msgstr "_Enviar e pechar" + +#: ../data/glade/subscription_request_window.glade.h:1 +msgid "Au_thorize" +msgstr "Au_torizar" + +#: ../data/glade/subscription_request_window.glade.h:2 +msgid "Authorize contact so he can know when you're connected" +msgstr "Autorizar o contacto para que poida saber cando estou conectado" + +#: ../data/glade/subscription_request_window.glade.h:3 +msgid "Deny authorization from contact so he cannot know when you're connected" +msgstr "" +"Denegar a autorización do contacto para que non poida saber cando estou " +"conectado" + +#: ../data/glade/subscription_request_window.glade.h:4 +msgid "Subscription Request" +msgstr "Solicitude de subscrición" + +#: ../data/glade/subscription_request_window.glade.h:7 +msgid "_Deny" +msgstr "_Denegar" + +#: ../data/glade/systray_context_menu.glade.h:1 +msgid "Mute Sounds" +msgstr "Sen sons" + +#: ../data/glade/systray_context_menu.glade.h:3 +msgid "Show All Pending _Events" +msgstr "Amosar todos os _eventos pendentes" + +#: ../data/glade/systray_context_menu.glade.h:4 +msgid "Show _Roster" +msgstr "Amosar _listaxe" + +#: ../data/glade/systray_context_menu.glade.h:5 +msgid "Sta_tus" +msgstr "Es_tado" + +#. Given Name +#: ../data/glade/vcard_information_window.glade.h:5 +msgid "Ask:" +msgstr "Pregunta:" + +#: ../data/glade/vcard_information_window.glade.h:8 +msgid "Client:" +msgstr "Cliente:" + +#: ../data/glade/vcard_information_window.glade.h:9 +msgid "Comments" +msgstr "Comentarios" + +#: ../data/glade/vcard_information_window.glade.h:11 +#: ../data/glade/zeroconf_information_window.glade.h:1 +msgid "Contact" +msgstr "Contacto" + +#: ../data/glade/vcard_information_window.glade.h:12 +msgid "Contact Information" +msgstr "Información" + +#: ../data/glade/vcard_information_window.glade.h:24 +#: ../data/glade/zeroconf_information_window.glade.h:4 +#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:416 +msgid "Jabber ID:" +msgstr "ID de Jabber:" + +#: ../data/glade/vcard_information_window.glade.h:30 +msgid "OS:" +msgstr "SO:" + +#: ../data/glade/vcard_information_window.glade.h:37 +#: ../data/glade/zeroconf_information_window.glade.h:8 +msgid "Resource:" +msgstr "Recurso:" + +#: ../data/glade/vcard_information_window.glade.h:40 +#: ../data/glade/zeroconf_information_window.glade.h:9 +msgid "Status:" +msgstr "Estado:" + +#. Family Name +#: ../data/glade/vcard_information_window.glade.h:43 +msgid "Subscription:" +msgstr "Subscrición:" + +#: ../data/glade/vcard_information_window.glade.h:47 +#: ../data/glade/zeroconf_information_window.glade.h:10 +msgid "_Log conversation history" +msgstr "Historial de conversas" + +#: ../data/glade/xml_console_window.glade.h:1 +msgid "Jabber Traffic" +msgstr "Tráfico de Jabber" + +#: ../data/glade/xml_console_window.glade.h:2 +msgid "XML Input" +msgstr "Entrada de XML" + +#. XML Console enable checkbutton +#: ../data/glade/xml_console_window.glade.h:4 +msgid "Enable" +msgstr "Activar" + +#. Info/Query make the "IQ" initials. So translate like this 'YourLang/YourLang (Info/Query)'. Thanks (it's a tooltip so width is not a problem) +#: ../data/glade/xml_console_window.glade.h:6 +msgid "Info/Query" +msgstr "Info/Consulta" + +#. Info/Query: all(?) jabber xml start with Whom do you want to ban?\n" +"\n" +msgstr "" +"A quen quere expulsar?\n" +"\n" + +#: ../src/config.py:2414 +msgid "Adding Member..." +msgstr "A engadir o membro..." + +#: ../src/config.py:2415 +msgid "" +"Whom do you want to make a member?\n" +"\n" +msgstr "" +"A quen quere facer membro?\n" +"\n" + +#: ../src/config.py:2417 +msgid "Adding Owner..." +msgstr "A engadir un propietario..." + +#: ../src/config.py:2418 +msgid "" +"Whom do you want to make a owner?\n" +"\n" +msgstr "" +"A quen quere facer como propietario?\n" +"\n" + +#: ../src/config.py:2420 +msgid "Adding Administrator..." +msgstr "A engadir administrador..." + +#: ../src/config.py:2421 +msgid "" +"Whom do you want to make an administrator?\n" +"\n" +msgstr "" +"A quen quere facer como administrador?\n" +"\n" + +#: ../src/config.py:2422 +msgid "" +"Can be one of the following:\n" +"1. user@domain/resource (only that resource matches).\n" +"2. user@domain (any resource matches).\n" +"3. domain/resource (only that resource matches).\n" +"4. domain (the domain itself matches, as does any user@domain,\n" +"domain/resource, or address containing a subdomain." +msgstr "" +"Pode ser un dos seguintes:\n" +"1. usuario@dominio/recurso (só ese recurso coincide)2. usuario@dominio " +"(calquera recurso coincide)3. dominio/recurso (só ese recurso coincide)4. " +"dominio (o dominio coincide, incluíndo calquera\n" +"usuario@dominio, dominio/recurso ou enderezo que contén\n" +"un subdominio." + +#: ../src/config.py:2527 +#, python-format +msgid "Removing %s account" +msgstr "A eliminar a conta %s" + +#: ../src/config.py:2544 ../src/roster_window.py:2665 +msgid "Password Required" +msgstr "É necesario o contrasinal" + +#: ../src/config.py:2545 ../src/roster_window.py:2666 +#, python-format +msgid "Enter your password for account %s" +msgstr "Introduza un contrasinal para a conta %s" + +#: ../src/config.py:2546 ../src/roster_window.py:2667 +msgid "Save password" +msgstr "Gardar o contrasinal" + +#: ../src/config.py:2560 +#, python-format +msgid "Account \"%s\" is connected to the server" +msgstr "A conta \"%s\" está conectada ao servidor" + +#: ../src/config.py:2561 +msgid "If you remove it, the connection will be lost." +msgstr "Se a elimina, perderase a conexión co servidor" + +#: ../src/config.py:2645 +msgid "Default" +msgstr "Por defecto" + +#: ../src/config.py:2645 +msgid "?print_status:All" +msgstr "Todos" + +#: ../src/config.py:2646 +msgid "Enter and leave only" +msgstr "Entrar e saír soamente" + +#: ../src/config.py:2716 +msgid "New Group Chat" +msgstr "Novo grupo de charla" + +#: ../src/config.py:2748 +msgid "This bookmark has invalid data" +msgstr "Este marcador ten información que non é válida" + +#: ../src/config.py:2749 +msgid "Please be sure to fill out server and room fields or remove this bookmark." +msgstr "" +"Por favor, asegúrese de cubrir os campos de servidor e de sala ou elimine " +"este marcador." + +#: ../src/config.py:3011 +msgid "Invalid username" +msgstr "O nome de usuario non é válido" + +#: ../src/config.py:3012 +msgid "You must provide a username to configure this account." +msgstr "Debe pórlle un nome para configurar esta conta." + +#: ../src/config.py:3022 ../src/dialogs.py:1316 +msgid "Invalid password" +msgstr "O contrasinal non é válido" + +#: ../src/config.py:3023 +msgid "You must enter a password for the new account." +msgstr "Debe introducir un contrasinal para a conta nova" + +#: ../src/config.py:3027 ../src/dialogs.py:1321 +msgid "Passwords do not match" +msgstr "Os contrasinais non coinciden" + +#: ../src/config.py:3028 ../src/dialogs.py:1322 +msgid "The passwords typed in both fields must be identical." +msgstr "Os contrasinais escritos nos dous campos deben ser idénticos." + +#: ../src/config.py:3047 +msgid "Duplicate Jabber ID" +msgstr "ID de Jabber duplicada" + +#: ../src/config.py:3048 +msgid "This account is already configured in Gajim." +msgstr "Esta conta xa está configurada no Gajim." + +#: ../src/config.py:3065 +msgid "Account has been added successfully" +msgstr "A conta engadiuse con éxito" + +#: ../src/config.py:3066 ../src/config.py:3101 +msgid "" +"You can set advanced account options by pressing Advanced button, or later " +"by clicking in Accounts menuitem under Edit menu from the main window." +msgstr "" +"Pode configurar opcións avanzadas da conta se preme o botón " +"Avanzado, ou máis tarde mediante o submenú Contas do menú Editar da " +"fiestra principal." + +#: ../src/config.py:3100 +msgid "Your new account has been created successfully" +msgstr "A súa conta nova creouse con éxito" + +#: ../src/config.py:3118 +msgid "An error occured during account creation" +msgstr "Produciuse un erro durante a creación da conta" + +#: ../src/config.py:3176 +msgid "Account name is in use" +msgstr "O nome da conta está en uso" + +#: ../src/config.py:3177 +msgid "You already have an account using this name." +msgstr "Xa ten unha conta en que emprega este nome" + +#: ../src/conversation_textview.py:273 +msgid "" +"Text below this line is what has been said since the last time you paid " +"attention to this group chat" +msgstr "" +"O texto que está debaixo desta liña foi o que se dixo desde a última vez que " +"lle prestou atención a esta sala de charla" + +#: ../src/conversation_textview.py:342 +#, python-format +msgid "_Actions for \"%s\"" +msgstr "_Accións para \"%s\"" + +#: ../src/conversation_textview.py:354 +msgid "Read _Wikipedia Article" +msgstr "Ler artigo da _Wikipedia" + +#: ../src/conversation_textview.py:359 +msgid "Look it up in _Dictionary" +msgstr "Buscalo no _Dicionario" + +#. we must have %s in the url if not WIKTIONARY +#: ../src/conversation_textview.py:375 +#, python-format +msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" +msgstr "Falta un \"%s\" no URL do dicionario e non está no WIKTIONARY" + +#. we must have %s in the url +#: ../src/conversation_textview.py:388 +#, python-format +msgid "Web Search URL is missing an \"%s\"" +msgstr "Falta un \"%s\" no URL da busca web" + +#: ../src/conversation_textview.py:391 +msgid "Web _Search for it" +msgstr "_Buscalo na rede" + +#: ../src/conversation_textview.py:397 +msgid "Open as _Link" +msgstr "_Abrir como ligazón" + +#: ../src/conversation_textview.py:757 +msgid "Yesterday" +msgstr "Onte" + +#. the number is >= 2 +#. %i is day in year (1-365), %d (1-31) we want %i +#: ../src/conversation_textview.py:761 +#, python-format +msgid "%i days ago" +msgstr "hai %i días" + +#. if we have subject, show it too! +#: ../src/conversation_textview.py:793 +#, python-format +msgid "Subject: %s\n" +msgstr "Asunto: %s\n" + +#: ../src/dialogs.py:59 +#, python-format +msgid "Contact name: %s" +msgstr "Nome do contacto : %s" + +#: ../src/dialogs.py:61 +#, python-format +msgid "Jabber ID: %s" +msgstr "ID de Jabber : %s" + +#: ../src/dialogs.py:211 +msgid "Group" +msgstr "Grupo" + +#: ../src/dialogs.py:218 +msgid "In the group" +msgstr "No grupo" + +#: ../src/dialogs.py:269 +msgid "KeyID" +msgstr "Chave ID" + +#: ../src/dialogs.py:272 +msgid "Contact name" +msgstr "Nome de contacto" + +#: ../src/dialogs.py:318 +#, python-format +msgid "%s Status Message" +msgstr "Mensaxe de estado %s" + +#: ../src/dialogs.py:320 +msgid "Status Message" +msgstr "Mensaxe de estado" + +#: ../src/dialogs.py:395 +msgid "Save as Preset Status Message" +msgstr "Gardar como mensaxe de estado predefinido" + +#: ../src/dialogs.py:396 +msgid "Please type a name for this status message" +msgstr "Escriba un nome para esta mensaxe de estado" + +#: ../src/dialogs.py:417 +msgid "AIM Address:" +msgstr "Enderezo de AIM:" + +#: ../src/dialogs.py:418 +msgid "GG Number:" +msgstr "Número de GG:" + +#: ../src/dialogs.py:419 +msgid "ICQ Number:" +msgstr "Número de ICQ:" + +#: ../src/dialogs.py:420 +msgid "MSN Address:" +msgstr "Enderezo de MSN:" + +#: ../src/dialogs.py:421 +msgid "Yahoo! Address:" +msgstr "Enderezo de Yahoo!:" + +#: ../src/dialogs.py:457 +#, python-format +msgid "Please fill in the data of the contact you want to add in account %s" +msgstr "" +"Por favor, introduza a información do contacto que quere engadir á " +"conta %s" + +#: ../src/dialogs.py:459 +msgid "Please fill in the data of the contact you want to add" +msgstr "Por favor, cubra a información do contacto que quere engadir" + +#: ../src/dialogs.py:609 ../src/dialogs.py:615 +msgid "Invalid User ID" +msgstr "A ID de usuario non é válida" + +#: ../src/dialogs.py:616 +msgid "The user ID must not contain a resource." +msgstr "Esta ID de usuario non contén un recurso." + +#: ../src/dialogs.py:630 +msgid "Contact already in roster" +msgstr "O contacto xa está na listaxe" + +#: ../src/dialogs.py:631 +msgid "This contact is already listed in your roster." +msgstr "Xa engadiu este contacto á súa listaxe." + +#: ../src/dialogs.py:665 +msgid "User ID:" +msgstr "ID de usuario:" + +#: ../src/dialogs.py:728 +msgid "A GTK+ jabber client" +msgstr "Un cliente de Jabber en GTK" + +#: ../src/dialogs.py:729 +msgid "GTK+ Version:" +msgstr "Versión de GTK+:" + +#: ../src/dialogs.py:730 +msgid "PyGTK Version:" +msgstr "Versión de PyGTK:" + +#: ../src/dialogs.py:744 +msgid "Current Developers:" +msgstr "Desenvolvedores actuais:" + +#: ../src/dialogs.py:746 +msgid "Past Developers:" +msgstr "Desenvolvedores anteriores:" + +#: ../src/dialogs.py:756 +msgid "THANKS:" +msgstr "AGRADECEMENTOS:" + +#. remove one english sentence +#. and add it manually as translatable +#: ../src/dialogs.py:762 +msgid "Last but not least, we would like to thank all the package maintainers." +msgstr "" +"Por último mais non menos importante, queremos agradecerlles a todos os " +"mantedores de paquetes." + +#. here you write your name in the form Name FamilyName +#: ../src/dialogs.py:776 +msgid "translator-credits" +msgstr "Fran Alburquerque " + +#: ../src/dialogs.py:906 +#, python-format +msgid "Unable to bind to port %s." +msgstr "Non se pode conectar ao porto %s." + +#: ../src/dialogs.py:907 +msgid "" +"Maybe you have another running instance of Gajim. File Transfer will be " +"canceled." +msgstr "" +"É posíbel que outra instancia do Gajim estea a se executar. A transferencia " +"cancelarase." + +#: ../src/dialogs.py:1058 +#, python-format +msgid "Subscription request for account %s from %s" +msgstr "Solicitude de subscrición para a conta %s de %s" + +#: ../src/dialogs.py:1061 +#, python-format +msgid "Subscription request from %s" +msgstr "Solicitude de subscrición de %s" + +#: ../src/dialogs.py:1121 ../src/roster_window.py:681 +#, python-format +msgid "You are already in group chat %s" +msgstr "Xa está na sala %s" + +#: ../src/dialogs.py:1129 +msgid "You can not join a group chat unless you are connected." +msgstr "Non pode entrar nunha sala de charla até que non se conecte." + +#: ../src/dialogs.py:1144 +#, python-format +msgid "Join Group Chat with account %s" +msgstr "Entrar nun grupo de charla coa conta %s" + +#: ../src/dialogs.py:1212 ../src/dialogs.py:1218 +msgid "Invalid group chat Jabber ID" +msgstr "A ID de Jabber non é válida para o grupo de charla" + +#: ../src/dialogs.py:1213 ../src/dialogs.py:1219 +msgid "The group chat Jabber ID has not allowed characters." +msgstr "A ID de Jabber para o grupo de charla contén caracteres que non se permiten." + +#: ../src/dialogs.py:1225 +msgid "This is not a group chat" +msgstr "Isto non é un grupo de charla" + +#: ../src/dialogs.py:1226 +#, python-format +msgid "%s is not the name of a group chat." +msgstr "%s non é o nome dun grupo de charla." + +#: ../src/dialogs.py:1248 +#, python-format +msgid "Start Chat with account %s" +msgstr "Iniciar a charla coa conta %s" + +#: ../src/dialogs.py:1250 +msgid "Start Chat" +msgstr "Iniciar a charla" + +#: ../src/dialogs.py:1251 +msgid "" +"Fill in the nickname or the Jabber ID of the contact you would like\n" +"to send a chat message to:" +msgstr "" +"Introduza o alcume ou a ID de Jabber do contacto a que quere\n" +"enviar unha mensaxe de charla:" + +#. if offline or connecting +#: ../src/dialogs.py:1276 ../src/dialogs.py:1635 ../src/dialogs.py:1764 +msgid "Connection not available" +msgstr "Conexión non dispoñíbel" + +#: ../src/dialogs.py:1277 ../src/dialogs.py:1636 ../src/dialogs.py:1765 +#, python-format +msgid "Please make sure you are connected with \"%s\"." +msgstr "Por favor, asegúrese de estar conectado con \"%s\"." + +#: ../src/dialogs.py:1286 ../src/dialogs.py:1289 +msgid "Invalid JID" +msgstr "A ID de Jabber non é válida" + +#: ../src/dialogs.py:1289 +#, python-format +msgid "Unable to parse \"%s\"." +msgstr "Non se pode analizar \"%s\"." + +#: ../src/dialogs.py:1298 +msgid "Without a connection, you can not change your password." +msgstr "Sen unha conexión, non pode cambiar o seu contrasinal." + +#: ../src/dialogs.py:1317 +msgid "You must enter a password." +msgstr "Debe introducir un contrasinal." + +#. img to display +#. default value +#: ../src/dialogs.py:1364 ../src/notify.py:211 ../src/notify.py:411 +msgid "Contact Signed In" +msgstr "Contacto conectado" + +#: ../src/dialogs.py:1366 ../src/notify.py:219 ../src/notify.py:413 +msgid "Contact Signed Out" +msgstr "Contacto desconectado" + +#. chat message +#: ../src/dialogs.py:1368 ../src/notify.py:238 ../src/notify.py:415 +msgid "New Message" +msgstr "Mensaxe nova" + +#. single message +#: ../src/dialogs.py:1368 ../src/notify.py:223 ../src/notify.py:415 +msgid "New Single Message" +msgstr "Mensaxe nova" + +#. private message +#: ../src/dialogs.py:1369 ../src/notify.py:230 ../src/notify.py:416 +msgid "New Private Message" +msgstr "Mensaxe privada nova" + +#: ../src/dialogs.py:1369 ../src/gajim.py:1216 ../src/notify.py:424 +msgid "New E-mail" +msgstr "Correo electrónico novo" + +#: ../src/dialogs.py:1371 ../src/gajim.py:1369 ../src/notify.py:418 +msgid "File Transfer Request" +msgstr "Solicitude de transferencia de ficheiro" + +#: ../src/dialogs.py:1373 ../src/gajim.py:1188 ../src/gajim.py:1345 +#: ../src/notify.py:420 +msgid "File Transfer Error" +msgstr "Produciuse un erro na transferencia do ficheiro" + +#: ../src/dialogs.py:1375 ../src/gajim.py:1408 ../src/gajim.py:1430 +#: ../src/gajim.py:1447 ../src/notify.py:422 +msgid "File Transfer Completed" +msgstr "Rematou a transferencia do ficheiro" + +#: ../src/dialogs.py:1376 ../src/gajim.py:1411 ../src/notify.py:422 +msgid "File Transfer Stopped" +msgstr "Detívose a transferencia do ficheiro" + +#: ../src/dialogs.py:1378 ../src/gajim.py:1086 ../src/notify.py:426 +msgid "Groupchat Invitation" +msgstr "Convite a grupo de charla" + +#: ../src/dialogs.py:1380 ../src/notify.py:203 ../src/notify.py:428 +msgid "Contact Changed Status" +msgstr "Un contacto cambiou o seu estado" + +#: ../src/dialogs.py:1565 +#, python-format +msgid "Single Message using account %s" +msgstr "Mensaxe nova coa conta %s" + +#: ../src/dialogs.py:1567 +#, python-format +msgid "Single Message in account %s" +msgstr "Entrou unha mensaxe nova na conta %s" + +#: ../src/dialogs.py:1569 +msgid "Single Message" +msgstr "Mensaxe:" + +#. prepare UI for Sending +#: ../src/dialogs.py:1572 +#, python-format +msgid "Send %s" +msgstr "Enviar %s" + +#. prepare UI for Receiving +#: ../src/dialogs.py:1595 +#, python-format +msgid "Received %s" +msgstr "Recibida %s" + +#. we create a new blank window to send and we preset RE: and to jid +#: ../src/dialogs.py:1667 +#, python-format +msgid "RE: %s" +msgstr "RE: %s" + +#: ../src/dialogs.py:1668 +#, python-format +msgid "%s wrote:\n" +msgstr "%s escribiu:\n" + +#: ../src/dialogs.py:1712 +#, python-format +msgid "XML Console for %s" +msgstr "Consola XML para %s" + +#: ../src/dialogs.py:1714 +msgid "XML Console" +msgstr "Consola XML" + +#: ../src/dialogs.py:1835 +#, python-format +msgid "Privacy List %s" +msgstr "Listaxe de privacidade %s" + +#: ../src/dialogs.py:1839 +#, python-format +msgid "Privacy List for %s" +msgstr "Listaxe de privacidade para %s" + +#: ../src/dialogs.py:1887 +#, python-format +msgid "Order: %s, action: %s, type: %s, value: %s" +msgstr "Orde: %s, acción: %s, tipo: %s, valor: %s" + +#: ../src/dialogs.py:1890 +#, python-format +msgid "Order: %s, action: %s" +msgstr "Orde: %s, acción: %s" + +#: ../src/dialogs.py:1932 +msgid "Edit a rule" +msgstr "Editar unha regra" + +#: ../src/dialogs.py:2019 +msgid "Add a rule" +msgstr "Engadir unha regra" + +#: ../src/dialogs.py:2115 +#, python-format +msgid "Privacy Lists for %s" +msgstr "Listaxes de privacidade para %s" + +#: ../src/dialogs.py:2117 +msgid "Privacy Lists" +msgstr "Listaxes de privacidade" + +#: ../src/dialogs.py:2185 +msgid "Invalid List Name" +msgstr "O nome de listaxe non é válido" + +#: ../src/dialogs.py:2186 +msgid "You must enter a name to create a privacy list." +msgstr "Debe introducir un nome para crear unha listaxe de privacidade." + +#. FIXME: use nickname instead of contact_jid +#: ../src/dialogs.py:2220 +#, python-format +msgid "%(contact_jid)s has invited you to group chat %(room_jid)s" +msgstr "%(contact_jid)s convidouno ao grupo de charla %(room_jid)s." + +#. only if not None and not '' +#: ../src/dialogs.py:2226 +#, python-format +msgid "Comment: %s" +msgstr "Comentario: %s" + +#: ../src/dialogs.py:2288 +msgid "Choose Sound" +msgstr "Elixir un son" + +#: ../src/dialogs.py:2298 ../src/dialogs.py:2343 +msgid "All files" +msgstr "Todos os ficheiros" + +#: ../src/dialogs.py:2303 +msgid "Wav Sounds" +msgstr "Sons Wav" + +#: ../src/dialogs.py:2333 +msgid "Choose Image" +msgstr "Elixir unha imaxe" + +#: ../src/dialogs.py:2348 +msgid "Images" +msgstr "Imaxes" + +#: ../src/dialogs.py:2405 +#, python-format +msgid "When %s becomes:" +msgstr "Cando %s estea:" + +#: ../src/dialogs.py:2407 +#, python-format +msgid "Adding Special Notification for %s" +msgstr "Engadir unha notificación especial para %s" + +#. # means number +#: ../src/dialogs.py:2478 +msgid "#" +msgstr "núm." + +#: ../src/dialogs.py:2484 +msgid "Condition" +msgstr "Condición" + +#: ../src/dialogs.py:2605 +msgid "when I am " +msgstr "cando estea " + +#: ../src/disco.py:101 +msgid "Others" +msgstr "Outros" + +#: ../src/disco.py:102 ../src/disco.py:103 ../src/disco.py:1253 +#: ../src/gajim.py:539 ../src/roster_window.py:267 ../src/roster_window.py:325 +#: ../src/roster_window.py:364 ../src/roster_window.py:445 +#: ../src/roster_window.py:477 ../src/roster_window.py:479 +#: ../src/roster_window.py:3828 ../src/roster_window.py:3830 +#: ../src/common/helpers.py:42 +msgid "Transports" +msgstr "Transportes" + +#. conference is a category for listing mostly groupchats in service discovery +#: ../src/disco.py:105 +msgid "Conference" +msgstr "Conferencia" + +#: ../src/disco.py:418 +msgid "Without a connection, you can not browse available services" +msgstr "Sen unha conexión non pode navegar polos servizos dispoñíbeis" + +#: ../src/disco.py:497 +#, python-format +msgid "Service Discovery using account %s" +msgstr "Xestión de servizos coa conta %s" + +#: ../src/disco.py:499 +msgid "Service Discovery" +msgstr "Xestión de servizos" + +#: ../src/disco.py:642 +msgid "The service could not be found" +msgstr "O servizo non se achou" + +#: ../src/disco.py:643 +msgid "" +"There is no service at the address you entered, or it is not responding. " +"Check the address and try again." +msgstr "" +"Non hai servizo neste enderezo ou non está a responder. " +"Comprobe o enderezo e ténteo máis tarde." + +#: ../src/disco.py:647 ../src/disco.py:928 +msgid "The service is not browsable" +msgstr "O servizo non é navegábel" + +#: ../src/disco.py:648 +msgid "This type of service does not contain any items to browse." +msgstr "Este tipo de servizo non contén ningún elemento para navegar." + +#: ../src/disco.py:728 +#, python-format +msgid "Browsing %s using account %s" +msgstr "Navegar %s coa conta %s" + +#: ../src/disco.py:767 +msgid "_Browse" +msgstr "_Navegar" + +#: ../src/disco.py:929 +msgid "This service does not contain any items to browse." +msgstr "Este servizo non contén elementos para navegar." + +#: ../src/disco.py:1143 ../src/disco.py:1258 +msgid "Re_gister" +msgstr "_Subscribir" + +#: ../src/disco.py:1295 +#, python-format +msgid "Scanning %d / %d.." +msgstr "Escaneando %d / %d.." + +#. Users column +#: ../src/disco.py:1476 +msgid "Users" +msgstr "Usuarios" + +#. Description column +#: ../src/disco.py:1483 +msgid "Description" +msgstr "Descrición" + +#. Id column +#: ../src/disco.py:1490 +msgid "Id" +msgstr "Id" + +#: ../src/disco.py:1713 +msgid "Subscribed" +msgstr "Engadiuse" + +#: ../src/disco.py:1739 +msgid "New post" +msgstr "Publicación nova" + +#: ../src/disco.py:1745 +msgid "_Subscribe" +msgstr "_Engadir" + +#: ../src/disco.py:1751 +msgid "_Unsubscribe" +msgstr "_Eliminar" + +#: ../src/filetransfers_window.py:72 +msgid "File" +msgstr "Ficheiro" + +#: ../src/filetransfers_window.py:87 +msgid "Time" +msgstr "Hora" + +#: ../src/filetransfers_window.py:99 +msgid "Progress" +msgstr "Progreso" + +#: ../src/filetransfers_window.py:163 ../src/filetransfers_window.py:223 +#, python-format +msgid "Filename: %s" +msgstr "Nome do ficheiro: %s" + +#: ../src/filetransfers_window.py:164 ../src/filetransfers_window.py:298 +#, python-format +msgid "Size: %s" +msgstr "Tamaño: %s" + +#. You is a reply of who sent a file +#. You is a reply of who received a file +#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:183 +#: ../src/history_manager.py:463 +msgid "You" +msgstr "Vostede" + +#: ../src/filetransfers_window.py:174 +#, python-format +msgid "Sender: %s" +msgstr "Remitente: %s" + +#: ../src/filetransfers_window.py:175 ../src/filetransfers_window.py:572 +#: ../src/tooltips.py:573 +msgid "Recipient: " +msgstr "Destinatario: " + +#: ../src/filetransfers_window.py:186 +#, python-format +msgid "Saved in: %s" +msgstr "Gardouse en: %s" + +#: ../src/filetransfers_window.py:188 +msgid "File transfer completed" +msgstr "Rematou a transferencia do ficheiro" + +#: ../src/filetransfers_window.py:204 ../src/filetransfers_window.py:212 +msgid "File transfer canceled" +msgstr "Cancelouse a transferencia do ficheiro" + +#: ../src/filetransfers_window.py:204 ../src/filetransfers_window.py:213 +msgid "Connection with peer cannot be established." +msgstr "Non se puido estabelecer a conexión co cliente." + +#: ../src/filetransfers_window.py:224 +#, python-format +msgid "Recipient: %s" +msgstr "Destinatario: %s" + +#: ../src/filetransfers_window.py:226 +#, python-format +msgid "Error message: %s" +msgstr "Mensaxe de erro: %s" + +#: ../src/filetransfers_window.py:227 +msgid "File transfer stopped by the contact of the other side" +msgstr "O contacto detivo a transferencia do ficheiro" + +#: ../src/filetransfers_window.py:244 +msgid "Choose File to Send..." +msgstr "Elixa un ficheiro para enviar..." + +#: ../src/filetransfers_window.py:263 +msgid "Gajim cannot access this file" +msgstr "O Gajim non pode acceder a este ficheiro" + +#: ../src/filetransfers_window.py:264 +msgid "This file is being used by another process." +msgstr "Outro proceso está a usar este ficheiro." + +#: ../src/filetransfers_window.py:296 +#, python-format +msgid "File: %s" +msgstr "Ficheiro: %s" + +#: ../src/filetransfers_window.py:301 +#, python-format +msgid "Type: %s" +msgstr "Tipo: %s" + +#: ../src/filetransfers_window.py:303 +#, python-format +msgid "Description: %s" +msgstr "Descrición: %s" + +#: ../src/filetransfers_window.py:304 +#, python-format +msgid "%s wants to send you a file:" +msgstr "%s quere enviarlle un ficheiro:" + +#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:683 +#, python-format +msgid "Cannot overwrite existing file \"%s\"" +msgstr "Non se pode sobrescribir o ficheiro existente \"%s\"" + +#: ../src/filetransfers_window.py:319 ../src/gtkgui_helpers.py:685 +msgid "" +"A file with this name already exists and you do not have permission to " +"overwrite it." +msgstr "" +"Xa existe un ficheiro con este nome e non ten permiso para " +"o sobreescribir" + +#: ../src/filetransfers_window.py:326 ../src/gtkgui_helpers.py:689 +msgid "This file already exists" +msgstr "Este ficheiro xa existe" + +#: ../src/filetransfers_window.py:326 ../src/gtkgui_helpers.py:689 +msgid "What do you want to do?" +msgstr "Que quere facer?" + +#: ../src/filetransfers_window.py:338 ../src/gtkgui_helpers.py:699 +#, python-format +msgid "Directory \"%s\" is not writable" +msgstr "Non se pode escribir no directorio \"%s\"" + +#: ../src/filetransfers_window.py:338 ../src/gtkgui_helpers.py:700 +msgid "You do not have permission to create files in this directory." +msgstr "Non ten autorización para crear ficheiros neste directorio." + +#: ../src/filetransfers_window.py:348 +msgid "Save File as..." +msgstr "Gardar o ficheiro como..." + +#. 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:429 +#, python-format +msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" +msgstr "%(horas)02.d:%(minutos)02.d:%(segundos)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:505 +#, python-format +msgid "(%(filesize_unit)s/s)" +msgstr "(%(filesize_unit)s/s)" + +#: ../src/filetransfers_window.py:544 ../src/filetransfers_window.py:547 +msgid "Invalid File" +msgstr "O ficheiro non é válido" + +#: ../src/filetransfers_window.py:544 +msgid "File: " +msgstr "Ficheiro: " + +#: ../src/filetransfers_window.py:548 +msgid "It is not possible to send empty files" +msgstr "Non se pode enviar ficheiros baleiros" + +#: ../src/filetransfers_window.py:568 ../src/tooltips.py:563 +msgid "Name: " +msgstr "Nome: " + +#: ../src/filetransfers_window.py:570 ../src/tooltips.py:567 +msgid "Sender: " +msgstr "Remitente: " + +#: ../src/filetransfers_window.py:758 +msgid "Pause" +msgstr "Pausa" + +#: ../src/gajim.py:47 +msgid "Gajim needs Xserver to run. Quiting..." +msgstr "O Gajim precisa o Xserver para funcionar. A abortar..." + +#: ../src/gajim.py:51 +msgid "Gajim needs PyGTK 2.6 or above" +msgstr "O Gajim precisa un PyGTK 2.6 ou superior" + +#: ../src/gajim.py:52 +msgid "Gajim needs PyGTK 2.6 or above to run. Quiting..." +msgstr "O Gajim precisa un PyGTK 2.6 ou superior para funcionar. A abortar..." + +#: ../src/gajim.py:54 +msgid "Gajim needs GTK 2.6 or above" +msgstr "O Gajim precisa un GTK 2.6 ou superior" + +#: ../src/gajim.py:55 +msgid "Gajim needs GTK 2.6 or above to run. Quiting..." +msgstr "O Gajim precisa un GTK 2.6 ou superior para funcionar. A abortar..." + +#: ../src/gajim.py:60 +msgid "GTK+ runtime is missing libglade support" +msgstr "A biblioteca GTK+ precisa un soporte de libglade" + +#: ../src/gajim.py:62 +#, python-format +msgid "" +"Please remove your current GTK+ runtime and install the latest stable " +"version from %s" +msgstr "" +"Por favor, elimine a súa biblioteca GTK+ actual e instale a última versión " +"estábel desde %s" + +#: ../src/gajim.py:64 +msgid "Please make sure that GTK+ and PyGTK have libglade support in your system." +msgstr "" +"Por favor, asegúrese de que GTK+ e PyGTK teñen un soporte libglade no seu " +"sistema." + +#: ../src/gajim.py:69 +msgid "Gajim needs PySQLite2 to run" +msgstr "O Gajim precisa un PySQLite2 para funcionar" + +#: ../src/gajim.py:77 +msgid "Gajim needs pywin32 to run" +msgstr "O Gajim precisa un pywin32 para funcionar" + +#: ../src/gajim.py:78 +#, python-format +msgid "" +"Please make sure that Pywin32 is installed on your system. You can get it at " +"%s" +msgstr "" +"Por favor, asegúrese de que Pywin32 está instalado no seu sistema. Pode " +"obtelo en %s" + +#. set the icon to all newly opened wind +#: ../src/gajim.py:238 +msgid "Gajim is already running" +msgstr "O Gajim xa está a se executar" + +#: ../src/gajim.py:239 +msgid "" +"Another instance of Gajim seems to be running\n" +"Run anyway?" +msgstr "" +"Outra instancia dO Gajim semella estar xa en execución\n" +"Quere executar unha outra?" + +#: ../src/gajim.py:346 +#, python-format +msgid "HTTP (%s) Authorization for %s (id: %s)" +msgstr "Autorización HTTP (%s) para %s (id: %s)" + +#: ../src/gajim.py:347 +msgid "Do you accept this request?" +msgstr "Acepta esta solicitude?" + +#: ../src/gajim.py:393 ../src/notify.py:430 +msgid "Connection Failed" +msgstr "Fallou a conexión" + +#: ../src/gajim.py:706 +#, python-format +msgid "Subject: %s" +msgstr "Asunto: %s" + +#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) +#: ../src/gajim.py:751 ../src/gajim.py:764 +#, python-format +msgid "error while sending %s ( %s )" +msgstr "produciuse un erro mentres se enviaba %s ( %s )" + +#: ../src/gajim.py:797 +msgid "Authorization accepted" +msgstr "Autorización aceptada" + +#: ../src/gajim.py:798 +#, python-format +msgid "The contact \"%s\" has authorized you to see his or her status." +msgstr "O contacto \"%s\" autorizouno para ver o seu estado." + +#: ../src/gajim.py:806 +#, python-format +msgid "Contact \"%s\" removed subscription from you" +msgstr "O contacto \"%s\" eliminou a súa subscrición" + +#: ../src/gajim.py:807 +msgid "You will always see him or her as offline." +msgstr "Sempre o verá desconectado." + +#: ../src/gajim.py:850 +#, python-format +msgid "Contact with \"%s\" cannot be established" +msgstr "Non foi posíbel estabelecer o contacto con \"%s\"" + +#: ../src/gajim.py:851 ../src/common/connection.py:406 +msgid "Check your connection or try again later." +msgstr "Comprobe a súa conexión ou probe máis tarde." + +#: ../src/gajim.py:999 ../src/roster_window.py:1197 +#, python-format +msgid "%s is now %s (%s)" +msgstr "%s está agora %s (%s)" + +#: ../src/gajim.py:1096 +msgid "Your passphrase is incorrect" +msgstr "O contrasinal é incorrecto" + +#: ../src/gajim.py:1097 +msgid "You are currently connected without your OpenPGP key." +msgstr "Está actualmente conectado sen a súa chave de GPG" + +#: ../src/gajim.py:1199 +#, python-format +msgid "New mail on %(gmail_mail_address)s" +msgstr "Hai un correo novo en %(gmail_mail_address)s" + +#: ../src/gajim.py:1201 +#, python-format +msgid "You have %d new mail conversation" +msgid_plural "You have %d new mail conversations" +msgstr[0] "Ten %d nova conversa de correo" +msgstr[1] "Ten %d novas conversas de correo" + +#. FIXME: emulate Gtalk client popups. find out what they parse and how +#. they decide what to show +#. each message has a 'From', 'Subject' and 'Snippet' field +#: ../src/gajim.py:1210 +#, python-format +msgid "" +"\n" +"From: %(from_address)s" +msgstr "" +"\n" +"De: %(from_address)s" + +#: ../src/gajim.py:1366 +#, python-format +msgid "%s wants to send you a file." +msgstr "%s quere enviarlle un ficheiro." + +#: ../src/gajim.py:1431 +#, python-format +msgid "You successfully received %(filename)s from %(name)s." +msgstr "Recibiu con éxito o ficheiro %(ficheiro)s de %(nome)s." + +#. ft stopped +#: ../src/gajim.py:1435 +#, python-format +msgid "File transfer of %(filename)s from %(name)s stopped." +msgstr "Detívose a transferencia do ficheiro %(ficheiro)s de %(nome)s." + +#: ../src/gajim.py:1448 +#, python-format +msgid "You successfully sent %(filename)s to %(name)s." +msgstr "Envioulle con éxito o ficheiro %(filename)s a %(name)s." + +#. ft stopped +#: ../src/gajim.py:1452 +#, python-format +msgid "File transfer of %(filename)s to %(name)s stopped." +msgstr "Detívose a transferencia de %(filename)s a %(name)s." + +#: ../src/gajim.py:1558 +msgid "Username Conflict" +msgstr "Conflito co nome de usuario" + +#: ../src/gajim.py:1559 +msgid "Please type a new username for your local account" +msgstr "Por favor, escriba un nome de usuario novo para a súa conta local" + +#. it is good to notify the user +#. in case he or she cannot see the output of the console +#: ../src/gajim.py:1898 +msgid "Could not save your settings and preferences" +msgstr "Non se poden gardar as preferencias" + +#: ../src/gajim.py:2090 +msgid "Network Manager support not available" +msgstr "O soporte para o xestor de rede non está dispoñíbel" + +#: ../src/gajim.py:2165 +msgid "Session Management support not available (missing gnome.ui module)" +msgstr "O soporte de manexo de sesión non está dispoñíbel (falta o módulo gnome.ui)" + +#: ../src/gajim-remote.py:66 +msgid "Shows a help on specific command" +msgstr "Amosa axuda sobre un comando específico" + +#. User gets help for the command, specified by this parameter +#: ../src/gajim-remote.py:69 +msgid "command" +msgstr "comando" + +#: ../src/gajim-remote.py:70 +msgid "show help on command" +msgstr "amosar axuda sobre un comando" + +#: ../src/gajim-remote.py:74 +msgid "Shows or hides the roster window" +msgstr "Amosa ou oculta a fiestra da listaxe de contactos" + +#: ../src/gajim-remote.py:78 +msgid "Popups a window with the next pending event" +msgstr "Amosa unha fiestra emerxente co seguinte acontecemento pendente" + +#: ../src/gajim-remote.py:82 +msgid "" +"Prints a list of all contacts in the roster. Each contact appear on a " +"separate line" +msgstr "" +"Amosa unha listaxe de todos os contactos na listaxe. Cada contacto aparece " +"nunha liña distinta" + +#: ../src/gajim-remote.py:84 ../src/gajim-remote.py:98 +#: ../src/gajim-remote.py:108 ../src/gajim-remote.py:121 +#: ../src/gajim-remote.py:135 ../src/gajim-remote.py:156 +#: ../src/gajim-remote.py:186 ../src/gajim-remote.py:195 +#: ../src/gajim-remote.py:202 ../src/gajim-remote.py:209 +#: ../src/gajim-remote.py:220 +msgid "account" +msgstr "conta" + +#: ../src/gajim-remote.py:84 +msgid "show only contacts of the given account" +msgstr "amosar só contactos da conta especificada" + +#: ../src/gajim-remote.py:89 +msgid "Prints a list of registered accounts" +msgstr "Amosa unha listaxe de contas que están rexistradas" + +#: ../src/gajim-remote.py:93 +msgid "Changes the status of account or accounts" +msgstr "Cambia o estado dunha ou de varias contas" + +#. offline, online, chat, away, xa, dnd, invisible should not be translated +#: ../src/gajim-remote.py:96 +msgid "status" +msgstr "estado" + +#: ../src/gajim-remote.py:96 +msgid "one of: offline, online, chat, away, xa, dnd, invisible " +msgstr "" +"un de: desconectado, en liña, libre para falar, ausente, non dispoñíbel, " +"ocupado, invisíbel" + +#: ../src/gajim-remote.py:97 ../src/gajim-remote.py:118 +#: ../src/gajim-remote.py:132 +msgid "message" +msgstr "mensaxe" + +#: ../src/gajim-remote.py:97 +msgid "status message" +msgstr "mensaxe de estado" + +#: ../src/gajim-remote.py:98 +msgid "" +"change status of account \"account\". If not specified, try to change status " +"of all accounts that have \"sync with global status\" option set" +msgstr "" +"cambia o estado da conta \"account\". Se non se especifica, probe a " +"cambiar o estado de todas as contas que teñen a opción \"sync with " +"global status\" activada" + +#: ../src/gajim-remote.py:104 +msgid "Shows the chat dialog so that you can send messages to a contact" +msgstr "Amosa o diálogo de charla para enviarlle mensaxes a un contacto" + +#: ../src/gajim-remote.py:106 +msgid "JID of the contact that you want to chat with" +msgstr "JID do contacto co que quere conversar" + +#: ../src/gajim-remote.py:108 ../src/gajim-remote.py:186 +msgid "if specified, contact is taken from the contact list of this account" +msgstr "se se especifica, o contacto obtense da listaxe desta conta" + +#: ../src/gajim-remote.py:113 +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 " +"key', just set 'OpenPGP key' to ''." +msgstr "" +"Envía unha mensaxe nova de charla a un contacto na listaxe. Tanto a " +"chave de OpenPGP como a conta son opcionais. Se quere definir só " +"'conta' sen 'chave pgp', só defina 'chave pgp' a ''." + +#: ../src/gajim-remote.py:117 ../src/gajim-remote.py:130 +msgid "JID of the contact that will receive the message" +msgstr "JID do contacto que recibirá a mensaxe" + +#: ../src/gajim-remote.py:118 ../src/gajim-remote.py:132 +msgid "message contents" +msgstr "contido da mensaxe" + +#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 +msgid "pgp key" +msgstr "chave pgp" + +#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 +msgid "if specified, the message will be encrypted using this public key" +msgstr "se se especifica, a mensaxe cifrarase mediante a súa chave pública" + +#: ../src/gajim-remote.py:121 ../src/gajim-remote.py:135 +msgid "if specified, the message will be sent using this account" +msgstr "se se especifica, a mensaxe enviarase a través desta conta" + +#: ../src/gajim-remote.py:126 +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 " +"key', just set 'OpenPGP key' to ''." +msgstr "" +"Envíalle unha mensaxe nova a un contacto na listaxe. Tanto a chave de OpenPGP " +"como a conta son optativas. Se quere definir só 'conta' sen 'chave " +"pgp', só defina 'chave pgp' a ''." + +#: ../src/gajim-remote.py:131 +msgid "subject" +msgstr "tema" + +#: ../src/gajim-remote.py:131 +msgid "message subject" +msgstr "tema da mensaxe" + +#: ../src/gajim-remote.py:140 +msgid "Gets detailed info on a contact" +msgstr "Obter información detallada dun contacto" + +#: ../src/gajim-remote.py:142 ../src/gajim-remote.py:155 +#: ../src/gajim-remote.py:185 ../src/gajim-remote.py:194 +msgid "JID of the contact" +msgstr "JID do contacto" + +#: ../src/gajim-remote.py:146 +msgid "Gets detailed info on a account" +msgstr "Obter información detallada dunha conta" + +#: ../src/gajim-remote.py:148 +msgid "Name of the account" +msgstr "Nome da conta" + +#: ../src/gajim-remote.py:152 +msgid "Sends file to a contact" +msgstr "Enviarlle un ficheiro a un contacto" + +#: ../src/gajim-remote.py:154 +msgid "file" +msgstr "ficheiro" + +#: ../src/gajim-remote.py:154 +msgid "File path" +msgstr "Camiño do ficheiro" + +#: ../src/gajim-remote.py:156 +msgid "if specified, file will be sent using this account" +msgstr "se se especifica, o ficheiro enviarase mediante esta conta" + +#: ../src/gajim-remote.py:161 +msgid "Lists all preferences and their values" +msgstr "Nomea todas as preferencias e os seus valores" + +#: ../src/gajim-remote.py:165 +msgid "Sets value of 'key' to 'value'." +msgstr "Define o valor de 'entrada' a 'valor'." + +#: ../src/gajim-remote.py:167 +msgid "key=value" +msgstr "entrada=valor" + +#: ../src/gajim-remote.py:167 +msgid "'key' is the name of the preference, 'value' is the value to set it to" +msgstr "a 'entrada' é o nome da preferencia, o 'valor' é o do valor para definir" + +#: ../src/gajim-remote.py:172 +msgid "Deletes a preference item" +msgstr "Elimina un elemento de preferencia" + +#: ../src/gajim-remote.py:174 +msgid "key" +msgstr "entrada" + +#: ../src/gajim-remote.py:174 +msgid "name of the preference to be deleted" +msgstr "nome da preferencia para eliminar" + +#: ../src/gajim-remote.py:178 +msgid "Writes the current state of Gajim preferences to the .config file" +msgstr "" +"Escribe o estado actual da preferencias do Gajim para o ficheiro de " +"configuración" + +#: ../src/gajim-remote.py:183 +msgid "Removes contact from roster" +msgstr "Elimina o contacto da listaxe" + +#: ../src/gajim-remote.py:192 +msgid "Adds contact to roster" +msgstr "Engade o contacto á listaxe" + +#: ../src/gajim-remote.py:194 +msgid "jid" +msgstr "jid" + +#: ../src/gajim-remote.py:195 +msgid "Adds new contact to this account" +msgstr "Engade un contacto novo a esta conta." + +#: ../src/gajim-remote.py:200 +msgid "Returns current status (the global one unless account is specified)" +msgstr "Devolve o estado actual (o global se non se especificar unha conta)" + +#: ../src/gajim-remote.py:207 +msgid "Returns current status message(the global one unless account is specified)" +msgstr "" +"Devolve a mensaxe de estado actual (o global se non se especificar unha " +"conta)" + +#: ../src/gajim-remote.py:214 +msgid "Returns number of unreaded messages" +msgstr "Devolve o número de mensaxes sen ler" + +#: ../src/gajim-remote.py:218 +msgid "Opens 'Start Chat' dialog" +msgstr "Abre o diálogo de iniciar charla" + +#: ../src/gajim-remote.py:220 +msgid "Starts chat, using this account" +msgstr "Iniciar unha charla con esta conta" + +#: ../src/gajim-remote.py:224 +msgid "Sends custom XML" +msgstr "Envía XML personalizado" + +#: ../src/gajim-remote.py:226 +msgid "XML to send" +msgstr "XML para enviar" + +#: ../src/gajim-remote.py:227 +msgid "" +"Account in which the xml will be sent; if not specified, xml will be sent to " +"all accounts" +msgstr "" +"Conta a que se lle enviará; se non se especificar nada, o xml enviaráselles " +"a todas as contas" + +#: ../src/gajim-remote.py:249 +msgid "Missing argument \"contact_jid\"" +msgstr "Non se atopa o argumento \"contact_jid\"" + +#: ../src/gajim-remote.py:268 +#, python-format +msgid "" +"'%s' is not in your roster.\n" +"Please specify account for sending the message." +msgstr "" +"'%s' non está na súa listaxe de contactos.\n" +"Por favor, especifique unha conta para enviar a mensaxe." + +#: ../src/gajim-remote.py:271 +msgid "You have no active account" +msgstr "Non ten contas activas" + +#: ../src/gajim-remote.py:335 +#, python-format +msgid "" +"Usage: %s %s %s \n" +"\t %s" +msgstr "" +"Modo de uso: %s %s %s \n" +"\t %s" + +#: ../src/gajim-remote.py:338 +msgid "Arguments:" +msgstr "Argumentos" + +#: ../src/gajim-remote.py:342 +#, python-format +msgid "%s not found" +msgstr "Non se encontrou %s" + +#: ../src/gajim-remote.py:346 +#, python-format +msgid "" +"Usage: %s command [arguments]\n" +"Command is one of:\n" +msgstr "" +"Modo de uso: %s comando [argumentos]\n" +"Comando é un de:\n" + +#: ../src/gajim-remote.py:420 +#, python-format +msgid "" +"Argument \"%s\" is not specified. \n" +"Type \"%s help %s\" for more info" +msgstr "" +"O argumento \"%s\" non se especificou. \n" +"Escriba \"%s help %s\" para máis información" + +#: ../src/gajim_themes_window.py:60 +msgid "Theme" +msgstr "Tema" + +#. don't confuse translators +#: ../src/gajim_themes_window.py:155 +msgid "theme name" +msgstr "nome do tema" + +#: ../src/gajim_themes_window.py:172 +msgid "You cannot delete your current theme" +msgstr "Non pode eliminar o tema actual" + +#: ../src/gajim_themes_window.py:173 +msgid "Please first choose another for your current theme." +msgstr "Por favor, primeiro elixa outro distinto como tema actual." + +#: ../src/groupchat_control.py:106 +msgid "Private Chat" +msgstr "Charla privada" + +#: ../src/groupchat_control.py:106 +msgid "Private Chats" +msgstr "Charlas privadas" + +#: ../src/groupchat_control.py:123 +msgid "Sending private message failed" +msgstr "O envío da mensaxe privada fallou" + +#. in second %s code replaces with nickname +#: ../src/groupchat_control.py:125 +#, python-format +msgid "You are no longer in group chat \"%s\" or \"%s\" has left." +msgstr "Quer xa non está no grupo de charla \"%s\" quer \"%s\" esta xa non existe." + +#: ../src/groupchat_control.py:144 +msgid "Group Chat" +msgstr "Grupos de charla" + +#: ../src/groupchat_control.py:144 +msgid "Group Chats" +msgstr "Grupos de charla" + +#: ../src/groupchat_control.py:318 +msgid "Insert Nickname" +msgstr "Introducir alcume" + +#. do not print 'kicked by None' +#: ../src/groupchat_control.py:831 +#, python-format +msgid "%(nick)s has been kicked: %(reason)s" +msgstr "%(nick)s foi expulsado por %(reason)s" + +#: ../src/groupchat_control.py:835 +#, python-format +msgid "%(nick)s has been kicked by %(who)s: %(reason)s" +msgstr "%(nick)s foi expulsado por %(who)s: %(reason)s" + +#. do not print 'banned by None' +#: ../src/groupchat_control.py:842 +#, python-format +msgid "%(nick)s has been banned: %(reason)s" +msgstr "%(nick)s foi expulsado: %(reason)s" + +#: ../src/groupchat_control.py:846 +#, python-format +msgid "%(nick)s has been banned by %(who)s: %(reason)s" +msgstr "%(nick)s foi expulsado por %(who)s: %(reason)s" + +#: ../src/groupchat_control.py:854 +#, python-format +msgid "You are now known as %s" +msgstr "Coñéceselle como %s" + +#: ../src/groupchat_control.py:856 +#, python-format +msgid "%s is now known as %s" +msgstr "%s coñéceselle como %s" + +#: ../src/groupchat_control.py:936 +#, python-format +msgid "%s has left" +msgstr "%s saíu" + +#: ../src/groupchat_control.py:941 +#, python-format +msgid "%s has joined the group chat" +msgstr "%s entrou no grupo de charla" + +#. No status message +#: ../src/groupchat_control.py:943 ../src/roster_window.py:1200 +#, python-format +msgid "%s is now %s" +msgstr "%s está agora %s" + +#: ../src/groupchat_control.py:1062 ../src/groupchat_control.py:1080 +#: ../src/groupchat_control.py:1173 ../src/groupchat_control.py:1190 +#, python-format +msgid "Nickname not found: %s" +msgstr "Non se achou o alcume: %s" + +#: ../src/groupchat_control.py:1096 +msgid "This group chat has no subject" +msgstr "Este grupo de charla non ten un asunto" + +#: ../src/groupchat_control.py:1109 +#, python-format +msgid "Invited %(contact_jid)s to %(room_jid)s." +msgstr "%(contact_jid)s convidouse a %(room_jid)s." + +#. %s is something the user wrote but it is not a jid so we inform +#: ../src/groupchat_control.py:1116 ../src/groupchat_control.py:1144 +#, python-format +msgid "%s does not appear to be a valid JID" +msgstr "%s non semella ser un JID válido" + +#: ../src/groupchat_control.py:1227 +#, python-format +msgid "No such command: /%s (if you want to send this, prefix it with /say)" +msgstr "Non existe este comando: /%s (se quere enviar isto, use o prefixo /say)" + +#: ../src/groupchat_control.py:1250 +#, python-format +msgid "Commands: %s" +msgstr "Comandos: %s" + +#: ../src/groupchat_control.py:1252 +#, python-format +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. Does " +"NOT support spaces in nickname." +msgstr "" +"Uso: /%s [motivo], expulsa o JID do grupo de charla. O alcume " +"dun ocupante pode ser substituído, mais non se contén \"@\". Se o JID " +"está actualmente no grupo de charla, el/ela será tamén " +"expulsado. NON se admiten espazos no alcume." + +#: ../src/groupchat_control.py:1259 +#, python-format +msgid "Usage: /%s , opens a private chat window to the specified occupant." +msgstr "" +"Uso: /%s , abre unha fiestra de charla co ocupante " +"especificado." + +#: ../src/groupchat_control.py:1263 +#, python-format +msgid "Usage: /%s, clears the text window." +msgstr "Uso: /%s, limpa o texto da fiestra." + +#: ../src/groupchat_control.py:1265 +#, python-format +msgid "" +"Usage: /%s [reason], closes the current window or tab, displaying reason if " +"specified." +msgstr "" +"Uso: /%s [motivo], pecha a fiestra ou o separador actual e amosa o motivo " +"se se especificar." + +#: ../src/groupchat_control.py:1268 +#, python-format +msgid "Usage: /%s, hide the chat buttons." +msgstr "Uso: /%s, oculta os botóns de charla." + +#: ../src/groupchat_control.py:1271 +#, python-format +msgid "" +"Usage: /%s [reason], invites JID to the current group chat, optionally " +"providing a reason." +msgstr "" +"Uso: /%s [reason], convida o JID ao grupo de charla actual, " +"e opcionalmente especifica un motivo." + +#: ../src/groupchat_control.py:1275 +#, python-format +msgid "" +"Usage: /%s @[/nickname], offers to join room@server optionally " +"using specified nickname." +msgstr "" +"Uso: /%s @[/alcume], ofrece a entrada a sala@servidor " +"e usa opcionalmente o alcume especificado" + +#: ../src/groupchat_control.py:1279 +#, python-format +msgid "" +"Usage: /%s [reason], removes the occupant specified by nickname " +"from the group chat and optionally displays a reason. Does NOT support " +"spaces in nickname." +msgstr "" +"Uso: /%s [motivo], elimina da sala o ocupante que especifica" +"o alcume e opcionalmente especifica un motivo. NON se admiten espazos no alcume." + +#: ../src/groupchat_control.py:1284 +#, python-format +msgid "" +"Usage: /%s , sends action to the current group chat. Use third " +"person. (e.g. /%s explodes.)" +msgstr "" +"Uso: /%s , envíalle unha acción ao grupo de charla actual. Usa a " +"terceira persoa. (por exemplo /%s berra.)" + +#: ../src/groupchat_control.py:1288 +#, python-format +msgid "" +"Usage: /%s [message], opens a private message windowand sends " +"message to the occupant specified by nickname." +msgstr "" +"Uso: /%s [message], abre unha fiestra de charla privada e envíalle " +"unha mensaxe ao ocupante que especifica o alcume." + +#: ../src/groupchat_control.py:1293 +#, python-format +msgid "Usage: /%s , changes your nickname in current group chat." +msgstr "Uso: /%s , cambia o seu alcume na sala actual." + +#: ../src/groupchat_control.py:1297 +#, python-format +msgid "Usage: /%s , display the names of group chat occupants." +msgstr "Uso: /%s , amosa os nomes dos ocupantes do grupo de charla." + +#: ../src/groupchat_control.py:1301 +#, python-format +msgid "Usage: /%s [topic], displays or updates the current group chat topic." +msgstr "Uso: /%s [tema], amosa ou actualiza o asunto actual da sala." + +#: ../src/groupchat_control.py:1304 +#, python-format +msgid "Usage: /%s , sends a message without looking for other commands." +msgstr "Uso: /%s , envía unha mensaxe sen buscar outros comandos." + +#: ../src/groupchat_control.py:1307 +#, python-format +msgid "No help info for /%s" +msgstr "Non hai información de axuda para /%s" + +#: ../src/groupchat_control.py:1356 +#, python-format +msgid "Are you sure you want to leave group chat \"%s\"?" +msgstr "Está seguro de que quere abandonar a sala \"%s\"?" + +#: ../src/groupchat_control.py:1358 +msgid "If you close this window, you will be disconnected from this group chat." +msgstr "Se pecha esta fiestra, desconectaráselle deste grupo de charla." + +#: ../src/groupchat_control.py:1362 ../src/roster_window.py:3962 +msgid "Do _not ask me again" +msgstr "_Non me preguntar outra vez" + +#: ../src/groupchat_control.py:1396 +msgid "Changing Subject" +msgstr "Cambiando o asunto" + +#: ../src/groupchat_control.py:1397 +msgid "Please specify the new subject:" +msgstr "Especifique o asunto novo:" + +#: ../src/groupchat_control.py:1406 +msgid "Changing Nickname" +msgstr "Cambiando o alcume" + +#: ../src/groupchat_control.py:1407 +msgid "Please specify the new nickname you want to use:" +msgstr "Especifique o novo alcume que quere usar:" + +#: ../src/groupchat_control.py:1432 +msgid "Bookmark already set" +msgstr "O marcador xa se definiu" + +#: ../src/groupchat_control.py:1433 +#, python-format +msgid "Group Chat \"%s\" is already in your bookmarks." +msgstr "A sala \"%s\" xa está nos seus marcadores." + +#: ../src/groupchat_control.py:1442 +msgid "Bookmark has been added successfully" +msgstr "O marcador engadiuse con éxito" + +#: ../src/groupchat_control.py:1443 +msgid "You can manage your bookmarks via Actions menu in your roster." +msgstr "Pode xestionar os seus marcadores mediante o menú Accións da súa listaxe" + +#. ask for reason +#: ../src/groupchat_control.py:1569 +#, python-format +msgid "Kicking %s" +msgstr "A expulsar %s" + +#: ../src/groupchat_control.py:1570 ../src/groupchat_control.py:1852 +msgid "You may specify a reason below:" +msgstr "Debe especificar un motivo debaixo:" + +#. ask for reason +#: ../src/groupchat_control.py:1851 +#, python-format +msgid "Banning %s" +msgstr "A expulsar %s" + +#: ../src/gtkexcepthook.py:41 +msgid "A programming error has been detected" +msgstr "Detectouse un erro de programación" + +#: ../src/gtkexcepthook.py:42 +msgid "" +"It probably is not fatal, but should be reported to the developers " +"nonetheless." +msgstr "" +"Probabelmente non é crítico mais, porén, debe informarse aos desenvolvedores." + +#: ../src/gtkexcepthook.py:48 +msgid "_Report Bug" +msgstr "_Informar do erro" + +#: ../src/gtkexcepthook.py:71 +msgid "Details" +msgstr "Detalles" + +#. we talk about file +#: ../src/gtkgui_helpers.py:153 ../src/gtkgui_helpers.py:168 +#, python-format +msgid "Error: cannot open %s for reading" +msgstr "Erro: non se pode abrir %s para lectura" + +#: ../src/gtkgui_helpers.py:293 +msgid "Error reading file:" +msgstr "Erro ao ler o ficheiro:" + +#: ../src/gtkgui_helpers.py:296 +msgid "Error parsing file:" +msgstr "Erro ao analizar o ficheiro:" + +#. do not traceback (could be a permission problem) +#. we talk about a file here +#: ../src/gtkgui_helpers.py:334 +#, python-format +msgid "Could not write to %s. Session Management support will not work" +msgstr "Non se pode escribir en %s. O soporte de manexo de sesión non funcionará" + +#: ../src/gtkgui_helpers.py:728 +msgid "Extension not supported" +msgstr "Extensión non admitida" + +#: ../src/gtkgui_helpers.py:729 +#, python-format +msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" +msgstr "" +"A imaxe non se puido gardar no formato %(type)s. Desexa gardar como %" +"(new_filename)s?" + +#: ../src/gtkgui_helpers.py:738 +msgid "Save Image as..." +msgstr "Gardar a imaxe como..." + +#: ../src/history_manager.py:64 +msgid "Cannot find history logs database" +msgstr "Non se pode achar a base de datos do historial" + +#. holds jid +#: ../src/history_manager.py:107 +msgid "Contacts" +msgstr "Contactos" + +#. holds time +#: ../src/history_manager.py:120 ../src/history_manager.py:160 +#: ../src/history_window.py:86 +msgid "Date" +msgstr "Data" + +#. holds nickname +#: ../src/history_manager.py:126 ../src/history_manager.py:178 +msgid "Nickname" +msgstr "Alcume" + +#. holds message +#: ../src/history_manager.py:134 ../src/history_manager.py:166 +#: ../src/history_window.py:94 +msgid "Message" +msgstr "Mensaxe" + +#: ../src/history_manager.py:186 +msgid "" +"Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " +"RUNNING)" +msgstr "" +"Quere limpar a base de datos? (TOTALMENTE DESACONSELLADO SE GAJIM ESTÁ " +"EN EXECUCIÓN)" + +#: ../src/history_manager.py:188 +msgid "" +"Normally allocated database size will not be freed, it will just become " +"reusable. If you really want to reduce database filesize, click YES, else " +"click NO.\n" +"\n" +"In case you click YES, please wait..." +msgstr "" +"Normalmente, o tamaño que se lle asigna á base de datos non se libera; " +"simplemente volve poder usarse. Se o que quere é reducir o tamaño da " +"base de datos, elixa SI; caso contrario, elixa NON.\n" +"\n" +"Caso de elixir SI, por favor, agarde..." + +#: ../src/history_manager.py:400 +msgid "Exporting History Logs..." +msgstr "A exportar o historial..." + +#: ../src/history_manager.py:476 +#, python-format +msgid "%(who)s on %(time)s said: %(message)s\n" +msgstr "%(who)s - %(time)s dixo: %(message)s\n" + +#: ../src/history_manager.py:514 +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] "Está seguro de que quere eliminar o historial do contacto que seleccionou?" +msgstr[1] "Está seguro de que quere eliminar o historial dos contactos que seleccionou?" + +#: ../src/history_manager.py:518 ../src/history_manager.py:554 +msgid "This is an irreversible operation." +msgstr "Esta é unha operación irreversíbel" + +#: ../src/history_manager.py:551 +msgid "Do you really want to delete the selected message?" +msgid_plural "Do you really want to delete the selected messages?" +msgstr[0] "Está seguro de que quere eliminar a mensaxe que seleccionou?" +msgstr[1] "Está seguro de que quere eliminar as mensaxes que seleccionou?" + +#: ../src/history_window.py:103 ../src/history_window.py:105 +#, python-format +msgid "Conversation History with %s" +msgstr "Historial de conversas con %s" + +#: ../src/history_window.py:261 +#, python-format +msgid "%(nick)s is now %(status)s: %(status_msg)s" +msgstr "%(nick)s está agora %(status)s: %(status_msg)s" + +#: ../src/history_window.py:265 ../src/notify.py:198 +#, python-format +msgid "%(nick)s is now %(status)s" +msgstr "%(nick)s está agora %(status)s" + +#: ../src/history_window.py:271 +#, python-format +msgid "Status is now: %(status)s: %(status_msg)s" +msgstr "O estado é agora: %(status)s: %(status_msg)s " + +#: ../src/history_window.py:274 +#, python-format +msgid "Status is now: %(status)s" +msgstr "O estado é agora: %(status)s" + +#: ../src/message_window.py:273 +msgid "Messages" +msgstr "Mensaxes" + +#: ../src/message_window.py:274 +#, python-format +msgid "%s - Gajim" +msgstr "%s - Gajim" + +#: ../src/notify.py:196 +#, python-format +msgid "%(nick)s Changed Status" +msgstr "%(nick)s cambiou o seu estado" + +#: ../src/notify.py:206 +#, python-format +msgid "%(nickname)s Signed In" +msgstr "%(nickname)s conectouse" + +#: ../src/notify.py:214 +#, python-format +msgid "%(nickname)s Signed Out" +msgstr "%(nickname)s desconectouse" + +#: ../src/notify.py:226 +#, python-format +msgid "New Single Message from %(nickname)s" +msgstr "Mensaxe nova de %(nickname)s" + +#: ../src/notify.py:234 +#, python-format +msgid "New Private Message from group chat %s" +msgstr "Nova mensaxe privada desde o grupo de charlas %s" + +#: ../src/notify.py:235 +#, python-format +msgid "%(nickname)s: %(message)s" +msgstr "%(nickname)s: %(message)s" + +#: ../src/notify.py:241 +#, python-format +msgid "New Message from %(nickname)s" +msgstr "Mensaxe nova de %(nickname)s" + +#: ../src/profile_window.py:72 ../src/profile_window.py:376 +msgid "Retrieving profile..." +msgstr "A recuperar o perfil..." + +#: ../src/profile_window.py:107 ../src/profile_window.py:203 +#: ../src/profile_window.py:212 ../src/profile_window.py:370 +msgid "Click to set your avatar" +msgstr "Prema para definir a súa circunstancia" + +#. keep identation +#: ../src/profile_window.py:136 +msgid "Could not load image" +msgstr "Non foi posíbel cargar a imaxe" + +#: ../src/profile_window.py:238 +msgid "Information received" +msgstr "Información recibida" + +#: ../src/profile_window.py:308 +msgid "Without a connection you can not publish your contact information." +msgstr "Sen unha conexión non pode publicar a súa información de contacto." + +#: ../src/profile_window.py:320 +msgid "Sending profile..." +msgstr "A enviar o perfil..." + +#: ../src/profile_window.py:328 +msgid "Information published" +msgstr "Información publicada" + +#: ../src/profile_window.py:340 +msgid "Information NOT published" +msgstr "Información NON publicada" + +#: ../src/profile_window.py:347 +msgid "vCard publication failed" +msgstr "Fallou a publicación da vCard" + +#: ../src/profile_window.py:348 +msgid "" +"There was an error while publishing your personal information, try again " +"later." +msgstr "" +"Produciuse un erro mentres se publicaba a súa información persoal, probe de " +"novo máis tarde." + +#: ../src/profile_window.py:374 +msgid "Without a connection, you can not get your contact information." +msgstr "Sen unha conexión non pode obter a súa información de contacto." + +#: ../src/roster_window.py:168 ../src/roster_window.py:223 +msgid "Merged accounts" +msgstr "Contas combinadas" + +#: ../src/roster_window.py:340 ../src/common/helpers.py:42 +msgid "Observers" +msgstr "Observadores" + +#: ../src/roster_window.py:686 ../src/roster_window.py:3133 +msgid "You cannot join a group chat while you are invisible" +msgstr "Non pode entrar nun grupo de charlas se está invisíbel" + +#. new chat +#. for chat_with +#. for single message +#: ../src/roster_window.py:878 ../src/systray.py:187 ../src/systray.py:192 +#, python-format +msgid "using account %s" +msgstr "a usar a conta %s" + +#. the 'manage gc bookmarks' item is shown +#. below to avoid duplicate code +#. add +#: ../src/roster_window.py:903 +#, python-format +msgid "to %s account" +msgstr "á conta %s" + +#. disco +#: ../src/roster_window.py:908 +#, python-format +msgid "using %s account" +msgstr "a usar a conta %s" + +#. profile, avatar +#: ../src/roster_window.py:983 +#, python-format +msgid "of account %s" +msgstr "da conta %s" + +#: ../src/roster_window.py:1003 +msgid "_Manage Bookmarks..." +msgstr "Xestionar _marcadores..." + +#: ../src/roster_window.py:1032 +#, python-format +msgid "for account %s" +msgstr "para a conta %s" + +#. History manager +#: ../src/roster_window.py:1053 +msgid "History Manager" +msgstr "Historial" + +#: ../src/roster_window.py:1062 +msgid "_Join New Group Chat" +msgstr "_Entrar nun outro grupo de charla" + +#: ../src/roster_window.py:1380 ../src/roster_window.py:3326 +#: ../src/roster_window.py:3333 +msgid "You have unread messages" +msgstr "Ten mensaxes sen ler" + +#: ../src/roster_window.py:1381 +msgid "You must read them before removing this transport." +msgstr "Debe lelas antes de eliminar este transporte." + +#: ../src/roster_window.py:1384 +#, python-format +msgid "Transport \"%s\" will be removed" +msgstr "Eliminarase o transporte \"%s\"" + +#: ../src/roster_window.py:1385 +msgid "" +"You will no longer be able to send and receive messages to contacts from " +"this transport." +msgstr "Xa non poderá enviar e recibir mensaxes a contactos desde este transporte" + +#: ../src/roster_window.py:1388 +msgid "Transports will be removed" +msgstr "Eliminaranse os transportes" + +#: ../src/roster_window.py:1393 +#, python-format +msgid "" +"You will no longer be able to send and receive messages to contacts from " +"these transports:%s" +msgstr "" +"Xa non poderá enviar e recibir mensaxes a contactos desde estes transportes: %" +"s" + +#. it's jid +#: ../src/roster_window.py:1413 +msgid "Rename Contact" +msgstr "Renomear o contacto" + +#: ../src/roster_window.py:1414 +#, python-format +msgid "Enter a new nickname for contact %s" +msgstr "Introduza un alcume novo para o contacto %s" + +#: ../src/roster_window.py:1421 +msgid "Rename Group" +msgstr "Renomear o grupo" + +#: ../src/roster_window.py:1422 +#, python-format +msgid "Enter a new name for group %s" +msgstr "Introduza un nome novo para o grupo %s" + +#: ../src/roster_window.py:1476 +msgid "Remove Group" +msgstr "Eliminar o grupo" + +#: ../src/roster_window.py:1477 +#, python-format +msgid "Do you want to remove group %s from the roster?" +msgstr "Quere eliminar o grupo %s da listaxe?" + +#: ../src/roster_window.py:1478 +msgid "Remove also all contacts in this group from your roster" +msgstr "Eliminar da listaxe tamén todos os contactos dentro do grupo" + +#: ../src/roster_window.py:1502 +msgid "Assign OpenPGP Key" +msgstr "Asignar chave de OpenPGP" + +#: ../src/roster_window.py:1503 +msgid "Select a key to apply to the contact" +msgstr "Seleccione unha chave para lle aplicar ao contacto" + +#: ../src/roster_window.py:1784 ../src/roster_window.py:1960 +msgid "_New group chat" +msgstr "_Grupo de charla novo" + +#: ../src/roster_window.py:1842 +msgid "I would like to add you to my roster" +msgstr "Gustaríame engadilo á miña listaxe de contactos" + +#: ../src/roster_window.py:2005 ../src/roster_window.py:2052 +msgid "Send Group M_essage" +msgstr "Enviar mensaxe ao grupo" + +#: ../src/roster_window.py:2031 +msgid "Re_name" +msgstr "Re_nomear" + +#: ../src/roster_window.py:2058 +msgid "To all users" +msgstr "A todos os usuarios" + +#: ../src/roster_window.py:2061 +msgid "To all online users" +msgstr "A todos os usuarios en liña" + +#: ../src/roster_window.py:2097 +msgid "_Log on" +msgstr "_Conectar" + +#: ../src/roster_window.py:2107 +msgid "Log _off" +msgstr "_Desconectar" + +#: ../src/roster_window.py:2229 ../src/roster_window.py:2300 +msgid "_Change Status Message" +msgstr "_Cambiar a mensaxe de estado" + +#: ../src/roster_window.py:2372 +msgid "Authorization has been sent" +msgstr "Enviouse a autorización" + +#: ../src/roster_window.py:2373 +#, python-format +msgid "Now \"%s\" will know your status." +msgstr "Agora \"%s\" poderá saber o seu estado." + +#: ../src/roster_window.py:2393 +msgid "Subscription request has been sent" +msgstr "Enviouse a solicitude de subscrición" + +#: ../src/roster_window.py:2394 +#, python-format +msgid "If \"%s\" accepts this request you will know his or her status." +msgstr "Se \"%s\" acepta esta solicitude, poderá saber o seu estado." + +#: ../src/roster_window.py:2406 +msgid "Authorization has been removed" +msgstr "Eliminouse a autorización" + +#: ../src/roster_window.py:2407 +#, python-format +msgid "Now \"%s\" will always see you as offline." +msgstr "Agora \"%s\" sempre o/a verá desconectado." + +#: ../src/roster_window.py:2615 +#, python-format +msgid "Contact \"%s\" will be removed from your roster" +msgstr "Eliminarase o contacto \"%s\" da súa listaxe" + +#: ../src/roster_window.py:2619 +msgid "" +"By removing this contact you also remove authorization resulting in him or " +"her always seeing you as offline." +msgstr "" +"Ao eliminar este contacto tamén se eliminará a autorización " +"resultante e el/ela sempre o/a verá desconectado." + +#: ../src/roster_window.py:2624 +msgid "" +"By removing this contact you also by default remove authorization resulting " +"in him or her always seeing you as offline." +msgstr "" +"Ao eliminar este contacto tamén se eliminará a autorización. Este " +"contacto sempre o/a verá desconectado." + +#: ../src/roster_window.py:2627 +msgid "I want this contact to know my status after removal" +msgstr "Quero que este contacto coñeza o meu estado despois da eliminación" + +#. several contact to remove at the same time +#: ../src/roster_window.py:2631 +msgid "Contacts will be removed from your roster" +msgstr "Os contactos eliminaranse da súa listaxe" + +#: ../src/roster_window.py:2635 +#, python-format +msgid "" +"By removing these contacts:%s\n" +"you also remove authorization resulting in them always seeing you as offline." +msgstr "" +"Ao eliminar estes contactos: %s\n" +"tamén eliminará as autorizacións resultantes e eles/elas sempre o/a " +"verán desconectado." + +#. TODO: make this string translatable +#. %s is the account name here +#: ../src/roster_window.py:2693 ../src/common/connection.py:587 +#: ../src/common/zeroconf/connection_zeroconf.py:158 +#, python-format +msgid "You will be connected to %s without OpenPGP." +msgstr "Conectarase a %s sen o OpenPGP" + +#: ../src/roster_window.py:2710 +msgid "Passphrase Required" +msgstr "É necesario o contrasinal" + +#: ../src/roster_window.py:2711 +#, python-format +msgid "Enter GPG key passphrase for account %s." +msgstr "Introduza o contrasinal GPG para a conta %s" + +#: ../src/roster_window.py:2716 +msgid "Save passphrase" +msgstr "Gardar o contrasinal" + +#: ../src/roster_window.py:2724 +msgid "Wrong Passphrase" +msgstr "O contrasinal é incorrecto" + +#: ../src/roster_window.py:2725 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "Por favor, volva escribir o seu contrasinal de GPG ou prema Cancelar." + +#: ../src/roster_window.py:2782 ../src/roster_window.py:2842 +msgid "You are participating in one or more group chats" +msgstr "Está a participar nun ou máis grupos de charlas" + +#: ../src/roster_window.py:2783 ../src/roster_window.py:2843 +msgid "" +"Changing your status to invisible will result in disconnection from those " +"group chats. Are you sure you want to go invisible?" +msgstr "" +"Ao cambiar o seu estado a invisíbel provocará a súa desconexión dos grupos de " +"charla. Está seguro de que quere ser invisíbel?" + +#: ../src/roster_window.py:2800 +msgid "No account available" +msgstr "A conta non está dispoñíbel" + +#: ../src/roster_window.py:2801 +msgid "You must create an account before you can chat with other contacts." +msgstr "Debe crear unha conta antes de poder conversar con outros contactos." + +#: ../src/roster_window.py:2899 +#, python-format +msgid "\"%(title)s\" by %(artist)s" +msgstr "\"%(title)s\" por %(artist)s" + +#: ../src/roster_window.py:3327 ../src/roster_window.py:3334 +msgid "" +"Messages will only be available for reading them later if you have history " +"enabled." +msgstr "" +"As mensaxes só estarán dispoñíbeis para a súa lectura posterior se ten o " +"historial activado" + +#: ../src/roster_window.py:3912 +msgid "Metacontacts storage not supported by your server" +msgstr "O teu servidor non admite o almacenamento de metacontactos" + +#: ../src/roster_window.py:3914 +msgid "" +"Your server does not support storing metacontacts information. So those " +"information will not be save on next reconnection." +msgstr "" +"O seu servidor non admite almacenar información de metacontactos. Por tanto, toda a " +"información referente non se gardará na próxima reconexión." + +#: ../src/roster_window.py:3956 +msgid "You are about to create a metacontact. Are you sure you want to continue?" +msgstr "Vai crear un metacontacto. Está seguro de que quere continuar?" + +#: ../src/roster_window.py:3958 +msgid "" +"Metacontacts are a way to regroup several contacts in one line. Generaly it " +"is used when the same person has several Jabber accounts or transport " +"accounts." +msgstr "" +"Os metacontactos son unha forma de reagrupar varios contactos nunha liña. " +"Xeralmente se usan cando a mesma persoa ten varias contas de Jabber " +"ou contas de transportes." + +#: ../src/roster_window.py:4125 +#, python-format +msgid "Drop %s in group %s" +msgstr "Deixar %s no grupo %s" + +#: ../src/roster_window.py:4132 +#, python-format +msgid "Make %s and %s metacontacts" +msgstr "Facer %s e %s metacontactos" + +#: ../src/roster_window.py:4319 +msgid "Change Status Message..." +msgstr "Cambiar a mensaxe de estado..." + +#: ../src/systray.py:144 +msgid "_Change Status Message..." +msgstr "_Cambiar a mensaxe de estado..." + +#: ../src/systray.py:234 +msgid "Hide this menu" +msgstr "Ocultar este menú" + +#: ../src/tooltips.py:309 ../src/tooltips.py:492 +msgid "Jabber ID: " +msgstr "ID de Jabber:" + +#: ../src/tooltips.py:312 ../src/tooltips.py:496 +msgid "Resource: " +msgstr "Recurso: " + +#: ../src/tooltips.py:317 +#, python-format +msgid "%(owner_or_admin_or_member)s of this group chat" +msgstr "%(owner_or_admin_or_member)s deste grupo de charla" + +#: ../src/tooltips.py:430 ../src/tooltips.py:610 +msgid "Status: " +msgstr "Estado: " + +#: ../src/tooltips.py:461 +#, python-format +msgid "Last status: %s" +msgstr "Último estado: %s" + +#: ../src/tooltips.py:463 +#, python-format +msgid " since %s" +msgstr " desde %s" + +#. ('both' is the normal sub so we don't show it) +#: ../src/tooltips.py:502 +msgid "Subscription: " +msgstr "Subscrición: " + +#: ../src/tooltips.py:512 +msgid "OpenPGP: " +msgstr "OpenPGP: " + +#: ../src/tooltips.py:566 +msgid "Download" +msgstr "Descarga" + +#: ../src/tooltips.py:572 +msgid "Upload" +msgstr "Subida" + +#: ../src/tooltips.py:579 +msgid "Type: " +msgstr "Tipo: " + +#: ../src/tooltips.py:585 +msgid "Transferred: " +msgstr "Transferido: " + +#: ../src/tooltips.py:588 ../src/tooltips.py:609 +msgid "Not started" +msgstr "Non iniciado" + +#: ../src/tooltips.py:592 +msgid "Stopped" +msgstr "Detido" + +#: ../src/tooltips.py:594 ../src/tooltips.py:597 +msgid "Completed" +msgstr "Completado" + +#: ../src/tooltips.py:601 +msgid "?transfer status:Paused" +msgstr "Pausada" + +#. stalled is not paused. it is like 'frozen' it stopped alone +#: ../src/tooltips.py:605 +msgid "Stalled" +msgstr "Atascado" + +#: ../src/tooltips.py:607 +msgid "Transferring" +msgstr "A transferir" + +#: ../src/tooltips.py:639 +msgid "This service has not yet responded with detailed information" +msgstr "Este servizo non respondeu aínda con información detallada" + +#: ../src/tooltips.py:642 +msgid "" +"This service could not respond with detailed information.\n" +"It is most likely legacy or broken" +msgstr "" +"Este servizo podería non responder con información detallada.\n" +"Posibelmente é antigo ou está roto" + +#: ../src/vcard.py:217 +msgid "?Client:Unknown" +msgstr "Descoñecido" + +#: ../src/vcard.py:219 +msgid "?OS:Unknown" +msgstr "Descoñecido" + +#: ../src/vcard.py:247 ../src/vcard.py:449 +#, python-format +msgid "since %s" +msgstr "desde %s" + +#: ../src/vcard.py:277 +msgid "Affiliation:" +msgstr "Afiliación:" + +#: ../src/vcard.py:285 +msgid "" +"This contact is interested in your presence information, but you are not " +"interested in his/her presence" +msgstr "" +"Este contacto está interesado na información da súa presenza, mais vostede non " +"o está na súa" + +#: ../src/vcard.py:287 +msgid "" +"You are interested in the contact's presence information, but he/she is not " +"interested in yours" +msgstr "" +"Está interesado na información da presenza do contacto, mais el/" +"ela non o está en vostede" + +#: ../src/vcard.py:289 +msgid "You and the contact are interested in each other's presence information" +msgstr "" +"Tanto vostede como o contacto están interesados na información da " +"presenza do outro" + +#. None +#: ../src/vcard.py:291 +msgid "" +"You are not interested in the contact's presence, and neither he/she is " +"interested in yours" +msgstr "" +"Non está interesado na presenza do contacto e el/ela tampouco o está " +"en vostede" + +#: ../src/vcard.py:299 +msgid "You are waiting contact's answer about your subscription request" +msgstr "Está a agardar a resposta do contacto sobre a súa solicitude de subscrición" + +#: ../src/vcard.py:311 ../src/vcard.py:338 ../src/vcard.py:482 +msgid " resource with priority " +msgstr " recurso con prioridade " + +#: ../src/common/check_paths.py:33 +msgid "creating logs database" +msgstr "a crear a base de datos de rexistros" + +#: ../src/common/check_paths.py:89 ../src/common/check_paths.py:100 +#: ../src/common/check_paths.py:107 +#, python-format +msgid "%s is file but it should be a directory" +msgstr "%s é un ficheiro mais podería ser un directorio" + +#: ../src/common/check_paths.py:90 ../src/common/check_paths.py:101 +#: ../src/common/check_paths.py:108 ../src/common/check_paths.py:116 +msgid "Gajim will now exit" +msgstr "Gajim pecharase agora" + +#: ../src/common/check_paths.py:115 +#, python-format +msgid "%s is directory but should be file" +msgstr "%s é un directorio mais podería ser un ficheiro" + +#: ../src/common/check_paths.py:131 +#, python-format +msgid "creating %s directory" +msgstr "a crear un directorio %s" + +#: ../src/common/config.py:55 +msgid "Use D-Bus and Notification-Daemon to show notifications" +msgstr "Usar DBus e o notificador Daemon para amosar as notificacións" + +#: ../src/common/config.py:60 +msgid "Time in minutes, after which your status changes to away." +msgstr "Tempo en minutos, despois de cambiar a ausente" + +#: ../src/common/config.py:61 +msgid "Away as a result of being idle" +msgstr "Ausente por inactividade" + +#: ../src/common/config.py:63 +msgid "Time in minutes, after which your status changes to not available." +msgstr "Tempo en minutos, despois de cambiar a non dispoñíbel" + +#: ../src/common/config.py:64 +msgid "Not available as a result of being idle" +msgstr "Non dispoñíbel por inactividade" + +# duda sobre collapsed +#: ../src/common/config.py:82 +msgid "List (space separated) of rows (accounts and groups) that are collapsed." +msgstr "Listaxe (separada por espazos) de filas (contas e grupos) que están caídas." + +#: ../src/common/config.py:87 +msgid "Enable link-local/zeroconf messaging" +msgstr "Activar a mensaxaría de ligazón local / zeroconf" + +#: ../src/common/config.py:90 +msgid "Language used by speller" +msgstr "Idioma que emprega o corrector" + +#: ../src/common/config.py:91 +msgid "" +"'always' - print time for every message.\n" +"'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" +"'never' - never print time." +msgstr "" +"'sempre' - amosar a hora en cada mensaxe.\n" +"'ás veces' - amosar a hora cada print_ichat_every_foo_minutes minutos.\n" +"'nunca' - nunca amosar a hora." + +#: ../src/common/config.py:92 +msgid "" +"Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " +"to disable fuzzyclock. 1 is the most precise clock, 4 the less precise one. " +"This is used only if print_time is 'sometimes'." +msgstr "Amosar a hora nas charlas co Fuzzy Clock. Valor do fuzziness desde 1 a 4 ou 0 " +"para desactivar o fuzzyclock. 1 é o reloxo máis preciso, 4 o menos preciso. " +"So se emprega se está conectado print_time 'ás veces'" + +#: ../src/common/config.py:95 +msgid "Treat * / _ pairs as possible formatting characters." +msgstr "Tratar os pares de * / _ como posíbeis caracteres de formato." + +#: ../src/common/config.py:96 +msgid "If True, do not remove */_ . So *abc* will be bold but with * * not removed." +msgstr "" +"Se é verdadeiro, non elimina */_ . Daquela, *abc* será negra, mais sen eliminar " +"* *" + +#: ../src/common/config.py:99 +msgid "" +"Uses ReStructured text markup for HTML, plus ascii formatting if selected. " +"(If you want to use this, install docutils)" +msgstr "" +"Usa a sintaxe de ReStructured para HTML, mais o formato ascii se está " +"seleccionado (se quere usalo, instale o docutils)" + +#: ../src/common/config.py:108 +msgid "" +"Character to add after nickname when using nick completion (tab) in group " +"chat." +msgstr "" +"Carácter para engadir despois do alcume cando se usa o completado de alcume (tab) nos " +"grupos de charla." + +#: ../src/common/config.py:109 +msgid "" +"Character to propose to add after desired nickname when desired nickname is " +"used by someone else in group chat." +msgstr "" +"Carácter para propor para engadir logo do alcume desexado cando alguén está a " +"empregalo no grupo de conversa." + +#: ../src/common/config.py:142 +msgid "Add * and [n] in roster title?" +msgstr "Engadir * e [n] no título da listaxe?" + +#: ../src/common/config.py:143 +msgid "" +"How many lines to remember from previous conversation when a chat tab/window " +"is reopened." +msgstr "" +"Cantas liñas quere lembrar da última charla cando se volve abrir " +"un separador/fiestra de charla" + +#: ../src/common/config.py:144 +msgid "How many minutes should last lines from previous conversation last." +msgstr "Cantos minutos debe durar a última liña da conversa anterior." + +#: ../src/common/config.py:145 +msgid "" +"Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " +"Client default behaviour)." +msgstr "" +"Envíe un mensaxe con Ctrl+Intro e con Intro faise unha liña nova (como " +"o cliente de Mirabilis ICQ)" + +#: ../src/common/config.py:147 +msgid "How many lines to store for Ctrl+KeyUP." +msgstr "Cantas liñas desexa almacenar para Ctrl+Arriba." + +#: ../src/common/config.py:150 +#, python-format +msgid "" +"Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' " +"which means use wiktionary." +msgstr "" +"URL personalizada con %s onde %s é a palabra/frase ou 'WIKTIONARY' que " +"significa usar o wiktionary" + +#: ../src/common/config.py:153 +msgid "If checked, Gajim can be controlled remotely using gajim-remote." +msgstr "Se está marcado, o Gajim pode controlarse remotamente ao usar o gajim-remote." + +#: ../src/common/config.py:154 +msgid "" +"If True, listen to D-Bus signals from NetworkManager and change the status " +"of accounts (provided they do not have listen_to_network_manager set to " +"False and they sync with global status) based upon the status of the network " +"connection." +msgstr "" +"Se é verdadeiro, escoite os sinais D-Bus de NetworkManager e os cambios do " +"estado das contas (con tal de que non teñan o listen_to_network_manager " +"posto en Falso e sincronicen co estado global) baseados no estado da" +"conexión da rede." + +#: ../src/common/config.py:155 +msgid "Sent chat state notifications. Can be one of all, composing_only, disabled." +msgstr "Enviáronse as notificacións de estado. Pode ser all, composing_only o disabled." + +#: ../src/common/config.py:156 +msgid "" +"Displayed chat state notifications in chat windows. Can be one of all, " +"composing_only, disabled." +msgstr "" +"As notificacións de estado móstranse nas fiestras de conversa. " +"Poden ser todo, só_compor ou desactivado." + +#: ../src/common/config.py:158 +msgid "" +"When not printing time for every message (print_time==sometimes), print it " +"every x minutes." +msgstr "" +"Cando non se amosa a hora en cada mensaxe (print_time==sometimes), móstraa " +"cada x minutos." + +#: ../src/common/config.py:159 +msgid "Ask before closing a group chat tab/window." +msgstr "Preguntar antes de pechar unha fiestra/separador da sala de charla." + +#: ../src/common/config.py:160 +msgid "" +"Always ask before closing group chat tab/window in this space separated list " +"of group chat jids." +msgstr "" +"Preguntar sempre antes de pechar a fiestra/separador dun grupo de charla " +"nesta listaxe (separada por espazos) de ID de Jabber de grupos de charla." + +#: ../src/common/config.py:161 +msgid "" +"Never ask before closing group chat tab/window in this space separated list " +"of group chat jids." +msgstr "" +"Non preguntar nunca antes de pechar a fiestra/separador dun grupo de " +"charla nesta listaxe (separada por espazos) de ID de Jabber de grupos " +"de charla." + +#: ../src/common/config.py:164 +msgid "" +"Overrides the host we send for File Transfer in case of address translation/" +"port forwarding." +msgstr "" +"Elimínase o host que enviamos para a transferencia dun ficheiro caso " +"de tradución do enderezo ou o redirección de portos." + +#: ../src/common/config.py:166 +msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." +msgstr "Segundo o estándar IEC, KiB = 1024 bytes, KB = 1000 bytes." + +#: ../src/common/config.py:168 +msgid "Notify of events in the system trayicon." +msgstr "Notifica acontecementos na área de notificación." + +#: ../src/common/config.py:174 +msgid "Show tab when only one conversation?" +msgstr "Quere amosar o separador cando só hai unha conversa?" + +#: ../src/common/config.py:175 +#, fuzzy +msgid "Show tabbed notebook border in chat windows?" +msgstr "Quere amosar o bordo a pestanexar do caderno de notas nas fiestras charla?" + +#: ../src/common/config.py:176 +msgid "Show close button in tab?" +msgstr "Quere amosar o botón de pechar no tabulador?" + +#: ../src/common/config.py:189 +msgid "A semicolon-separated list of words that will be highlighted in group chats." +msgstr "" +"Separarase por ';'unha listaxe de palabras que serán resaltadas nos grupos " +"de charla." + +#: ../src/common/config.py:190 +msgid "" +"If True, quits Gajim when X button of Window Manager is clicked. This " +"setting is taken into account only if trayicon is used." +msgstr "" +"Se é verdadeiro, peche o Gajim cando se preme o botón X do xestor de fiestras." +" Esta preferencia só se activa se se usa a icona da área de " +"notificación. " + +#: ../src/common/config.py:191 +msgid "If True, Gajim registers for xmpp:// on each startup." +msgstr "Se é verdadeiro, o Gajim rexistra xmpp:// en cada inicio." + +#: ../src/common/config.py:192 +msgid "" +"If True, Gajim will display an icon on each tab containing unread messages. " +"Depending on the theme, this icon may be animated." +msgstr "" +"Se for verdadeiro, o Gajim amosará unha icona en cada separador que conteña mensaxes " +"sen ler. A depender do tema, esta icona pode ser animada." + +#: ../src/common/config.py:193 +msgid "" +"If True, Gajim will display the status message, if not empty, for every " +"contact under the contact name in roster window." +msgstr "" +"Se é verdadeiro, o Gajim amosará a mensaxe de estado, se non está baleiro, para cada " +"contacto baixo o seu nome de contacto na fiestra da listaxe." + +#: ../src/common/config.py:195 +msgid "" +"If True, Gajim will ask for avatar each contact that did not have an avatar " +"last time or has one cached that is too old." +msgstr "" +"Se é verdadeiro, o Gajim pediralle unha circunstancia a cada contacto que non tivo unha circunstancia a última vez ou se ten gardada unha demasiada antiga." + +#: ../src/common/config.py:196 +msgid "" +"If False, Gajim will no longer print status line in chats when a contact " +"changes his or her status and/or his or her status message." +msgstr "" +"Se é falso, o Gajim nunca máis amosará a liña de estado cando un contacto " +"cambie o seu estado ou a súa mensaxe de estado" + +#: ../src/common/config.py:197 +msgid "" +"can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " +"longer print status line in groupchats when a member changes his or her " +"status and/or his or her status message. If \"all\" Gajim will print all " +"status messages. If \"in_and_out\", gajim will only print FOO enters/leaves " +"group chat." +msgstr "" +"pode ser \"none\", \"all\" ou \"in_and_out\". Se é \"none\", Gajim non " +"volverá mostrar a liña de estado nos grupos de conversa cando un " +"membro cambie a súa mensaxe de estado. Se é \"all\" o Gajim amosará todos as " +"mensaxes de estado. Se é \"in_and_out\", o Gajim só amosará as entradas e " +"as saídas no grupo de conversa." + +#: ../src/common/config.py:199 +msgid "Background color of contacts when they just signed in." +msgstr "Cor de fondo para os contactos que acaban de se conectar." + +#: ../src/common/config.py:200 +msgid "Background color of contacts when they just signed out." +msgstr "Cor de fondo para os contactos que acaban de se desconectar." + +#: ../src/common/config.py:202 +msgid "If True, restored messages will use a smaller font than the default one." +msgstr "" +"Se é verdadeiro, as mensaxes restauradas usarán unha fonte máis pequena que a " +"predefinida." + +#: ../src/common/config.py:203 +msgid "Don't show avatar for the transport itself." +msgstr "Non amosar a circunstancia para o transporte en si mesmo" + +#: ../src/common/config.py:204 +msgid "Don't show roster in the system taskbar." +msgstr "Non amosar a listaxe na barra de tarefas." + +#: ../src/common/config.py:205 +msgid "" +"If True and installed GTK+ and PyGTK versions are at least 2.8, make the " +"window flash (the default behaviour in most Window Managers) when holding " +"pending events." +msgstr "" +"Se é verdadeiro e as versións instaladas de GTK+ e PyGTK son, cando menos, 2.8, resalta " +"a fiestra cando hai eventos pendentes." + +#: ../src/common/config.py:207 +msgid "" +"Jabberd1.4 does not like sha info when one join a password protected group " +"chat. Turn this option to False to stop sending sha info in group chat " +"presences." +msgstr "" +"A Jabberd1.4 non lle gusta a información SHA cando se entra nun grupo de " +"charla protexido por contrasinal. Cambie esta opción a Falso para " +"deter o envío de información SHA no grupo de charla." + +#. always, never, peracct, pertype should not be translated +#: ../src/common/config.py:210 +msgid "" +"Controls the window where new messages are placed.\n" +"'always' - All messages are sent to a single window.\n" +"'never' - All messages get their own window.\n" +"'peracct' - Messages for each account are sent to a specific window.\n" +"'pertype' - Each message type (e.g., chats vs. groupchats) are sent to a " +"specific window. Note, changing this option requires restarting Gajim before " +"the changes will take effect." +msgstr "" +"Controla a fiestra onde se colocan as novas mensaxes.\n" +"'sempre' - Todas as mensaxes son enviadas a unha fiestra única.\n" +"'nunca' - Todas as mensaxes obteñen a súa propia fiestra.\n" +"'porconta' - As mensaxes para cada conta envíanse a unha fiestra específica.\n" +"'portipo' - Cada tipo de mensaxe (por exemplo, charlas vs. grupos de " +"charla) envíase a unha fiestra específica. Nota: cambie esta opción " +"require reiniciar o Gajim para que os cambios teñan efecto." + +#: ../src/common/config.py:211 +msgid "If False, you will no longer see the avatar in the chat window." +msgstr "Se é falso, non verá máis a circunstancia na fiestra de charla." + +#: ../src/common/config.py:212 +msgid "If True, pressing the escape key closes a tab/window." +msgstr "Se é verdadeiro, ao premer a tecla escape pecha unha fiestra/separador." + +#: ../src/common/config.py:213 +msgid "Hides the buttons in group chat window." +msgstr "Oculta os botóns nas fiestras de grupo de charla." + +#: ../src/common/config.py:214 +msgid "Hides the buttons in two persons chat window." +msgstr "Oculta os botóns nas fiestras de charla de dúas persoas." + +#: ../src/common/config.py:215 +msgid "Hides the banner in a group chat window" +msgstr "Oculta o báner nunha fiestra de grupo de charla" + +#: ../src/common/config.py:216 +msgid "Hides the banner in two persons chat window" +msgstr "Oculta o báner nunha fiestra de charla de dúas persoas." + +#: ../src/common/config.py:217 +msgid "Hides the group chat occupants list in group chat window." +msgstr "Oculta os ocupantes nas fiestras de grupo de charla." + +#: ../src/common/config.py:218 +msgid "" +"In a chat, show the nickname at the beginning of a line only when it's not " +"the same person talking than in previous message." +msgstr "" +"Nunha charla, amosa o alcume ao comezo nunha soa liña cando " +"non é a mesma persoa a que enviou a última mensaxe." + +#: ../src/common/config.py:219 +msgid "Indentation when using merge consecutive nickame." +msgstr "Sangría cando se use unha combinación de alcumes consecutivos." + +#: ../src/common/config.py:220 +msgid "List of colors that will be used to color nicknames in group chats." +msgstr "" +"Listaxe de cores que se empregarán para colorear o alcume nos grupos de " +"charla." + +#: ../src/common/config.py:221 +msgid "Ctrl-Tab go to next composing tab when none is unread." +msgstr "" +"Ctrl-Tab conduce ao próximo separador de composición cando ningún está sen " +"ler." + +#: ../src/common/config.py:222 +msgid "" +"Should we show the confirm metacontacts creation dialog or not? Empty string " +"means we never show the dialog." +msgstr "" +"Débese amosar a confirmación da creación de metacontactos ou non? Unha " +"secuencia baleira significa que nunca se amosará." + +#: ../src/common/config.py:223 +msgid "" +"If True, you will be able to set a negative priority to your account in " +"account modification window. BE CAREFULL, when you are logged in with a " +"negative priority, you will NOT receive any message from your server." +msgstr "" +"Se é verdadeiro, poderá definir unha prioridade negativa á súa conta na " +"fiestra de modificación de conta. TEÑA COIDADO, cando está conectado cunha " +"prioridade negativa, NON recibirá ningunha mensaxe do seu servidor." + +#: ../src/common/config.py:234 +msgid "" +"Priority will change automatically according to your status. Priorities are " +"defined in autopriority_* options." +msgstr "" +"A prioridade cambiará automaticamente segundo o seu estado. As prioridades " +"están definidas nas opcións de autoprioridade_*" + +#. yes, no, ask +#: ../src/common/config.py:263 +msgid "Jabberd2 workaround" +msgstr "Corrección Jabberd2" + +#: ../src/common/config.py:267 +msgid "" +"If checked, Gajim will use your IP and proxies defined in " +"file_transfer_proxies option for file transfer." +msgstr "" +"Se isto está marcado, o Gajim usará o seu IP e proxies que se definen na opción " +"file_transfer_proxies para a súa transferencia." + +#: ../src/common/config.py:326 +msgid "Is OpenPGP enabled for this contact?" +msgstr "Está o OpenPGP activado para este contacto?" + +#: ../src/common/config.py:327 ../src/common/config.py:330 +msgid "Language for which we want to check misspelled words" +msgstr "Lingua en que se comprobarán os erros ortográficos" + +#: ../src/common/config.py:336 +msgid "all or space separated status" +msgstr "estado separado por espazos ou all" + +#: ../src/common/config.py:337 +msgid "'yes', 'no', or 'both'" +msgstr "'si', 'non' ou 'ambos'" + +#: ../src/common/config.py:338 ../src/common/config.py:340 +#: ../src/common/config.py:341 ../src/common/config.py:344 +#: ../src/common/config.py:345 +msgid "'yes', 'no' or ''" +msgstr "'si', 'non' ou ''" + +#: ../src/common/config.py:351 +msgid "Sleeping" +msgstr "A durmir" + +#: ../src/common/config.py:352 +msgid "Back soon" +msgstr "Volvo axiña" + +#: ../src/common/config.py:352 +msgid "Back in some minutes." +msgstr "Volvo nuns minutos." + +#: ../src/common/config.py:353 +msgid "Eating" +msgstr "A comer" + +#: ../src/common/config.py:353 +msgid "I'm eating, so leave me a message." +msgstr "Estou a comer, déixeme unha mensaxe." + +#: ../src/common/config.py:354 +msgid "Movie" +msgstr "Filme" + +#: ../src/common/config.py:354 +msgid "I'm watching a movie." +msgstr "Estou a ver un filme." + +#: ../src/common/config.py:355 +msgid "Working" +msgstr "A traballar" + +#: ../src/common/config.py:355 +msgid "I'm working." +msgstr "Estou a traballar." + + +#: ../src/common/config.py:356 +msgid "Phone" +msgstr "Teléfono" + +#: ../src/common/config.py:356 +msgid "I'm on the phone." +msgstr "Estou a falar por teléfono." + +#: ../src/common/config.py:357 +msgid "Out" +msgstr "Fóra" + +#: ../src/common/config.py:357 +msgid "I'm out enjoying life." +msgstr "Estou fóra a gozar da vida." + +#: ../src/common/config.py:361 +msgid "I'm available." +msgstr "Estou dispoñíbel." + +#: ../src/common/config.py:362 +msgid "I'm free for chat." +msgstr "Estou libre para falar." + +#: ../src/common/config.py:364 +msgid "I'm not available." +msgstr "Non estou dispoñíbel." + +#: ../src/common/config.py:365 +msgid "Do not disturb." +msgstr "Non molestar." + +#: ../src/common/config.py:366 ../src/common/config.py:367 +msgid "Bye!" +msgstr "Adeus!" + +#: ../src/common/config.py:376 +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 "" +"Son para reproducir cando unha mensaxe de grupo de charla contén unha das " +"palabras de muc_highlight_words, ou cuando unha mensaxe dun grupo de charla " +"contén o teu alcume." + +#: ../src/common/config.py:377 +msgid "Sound to play when any MUC message arrives." +msgstr "Son para reproducir cando chega calquera mensaxe MUC" + +#: ../src/common/config.py:386 ../src/common/optparser.py:197 +msgid "green" +msgstr "verde" + +#: ../src/common/config.py:390 ../src/common/optparser.py:183 +msgid "grocery" +msgstr "ultramariño" + +#: ../src/common/config.py:394 +msgid "human" +msgstr "humano" + +#: ../src/common/config.py:398 +msgid "marine" +msgstr "mariño" + +#: ../src/common/connection_handlers.py:52 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:44 +msgid "Unable to load idle module" +msgstr "Non se pode cargar o módulo inactivo" + +#: ../src/common/connection_handlers.py:177 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 +msgid "Wrong host" +msgstr "Host errado" + +#: ../src/common/connection_handlers.py:177 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 +msgid "" +"The host you configured as the ft_override_host_to_send advanced option is " +"not valid, so ignored." +msgstr "" +"O host que configurou como a opción avanzada ft_override_host_to_send non " +"é valido e ignorarase." + +#: ../src/common/connection_handlers.py:590 +#, python-format +msgid "Registration information for transport %s has not arrived in time" +msgstr "A información de rexistro para o transporte %s non chegou a tempo" + +#: ../src/common/connection_handlers.py:1523 +#, python-format +msgid "Nickname not allowed: %s" +msgstr "Alcume non permitido: %s" + +#. password required to join +#. we are banned +#. group chat does not exist +#: ../src/common/connection_handlers.py:1585 +#: ../src/common/connection_handlers.py:1588 +#: ../src/common/connection_handlers.py:1591 +#: ../src/common/connection_handlers.py:1594 +#: ../src/common/connection_handlers.py:1597 +#: ../src/common/connection_handlers.py:1600 +#: ../src/common/connection_handlers.py:1608 +msgid "Unable to join group chat" +msgstr "Non se puido entrar no grupo de charla" + +#: ../src/common/connection_handlers.py:1586 +msgid "A password is required to join this group chat." +msgstr "É necesario un contrasinal para entrar a este grupo de charla." + +#: ../src/common/connection_handlers.py:1589 +msgid "You are banned from this group chat." +msgstr "Está expulsado deste grupo de charla." + +#: ../src/common/connection_handlers.py:1592 +msgid "Such group chat does not exist." +msgstr "Non existe o grupo de charla." + +#: ../src/common/connection_handlers.py:1595 +msgid "Group chat creation is restricted." +msgstr "A creación de grupos de charla está restrinxida." + +#: ../src/common/connection_handlers.py:1598 +msgid "Your registered nickname must be used." +msgstr "É necesario usar o alcume rexistrado." + +#: ../src/common/connection_handlers.py:1601 +msgid "You are not in the members list." +msgstr "Non está na listaxe de membros" + +#: ../src/common/connection_handlers.py:1609 +msgid "" +"Your desired nickname is in use or registered by another occupant.\n" +"Please specify another nickname below:" +msgstr "" +"O seu alcume da súa preferencia está en uso ou rexistrado por outro ocupante. \n" +"Por favor, especifique outro alcume abaixo:" + +#: ../src/common/connection_handlers.py:1659 +msgid "I would like to add you to my roster." +msgstr "Gustaríame engadilo á miña listaxe de contactos" + +#. BE CAREFUL: no con.updateRosterItem() in a callback +#: ../src/common/connection_handlers.py:1680 +#, python-format +msgid "we are now subscribed to %s" +msgstr "estamos agora subscritos a %s" + +#: ../src/common/connection_handlers.py:1682 +#, python-format +msgid "unsubscribe request from %s" +msgstr "solicitude de eliminación de subscrición de %s" + +#: ../src/common/connection_handlers.py:1684 +#, python-format +msgid "we are now unsubscribed from %s" +msgstr "xa non estamos subscritos a %s" + +#: ../src/common/connection_handlers.py:1854 +#, python-format +msgid "" +"JID %s is not RFC compliant. It will not be added to your roster. Use roster " +"management tools such as http://jru.jabberstudio.org/ to remove it" +msgstr "" +"A ID de Jabber %s non cumpre a norma RFC. Non se engadirá á súa listaxe de contactos. Use " +"as ferramentas de xestión de listaxe de contactos roster como http://jru.jabberstudio.org/ para o eliminar" + +#: ../src/common/connection.py:175 +#: ../src/common/zeroconf/connection_zeroconf.py:196 +#, python-format +msgid "Connection with account \"%s\" has been lost" +msgstr "Perdeuse a conexión da conta \"%s\"" + +#: ../src/common/connection.py:176 +msgid "Reconnect manually." +msgstr "Reconectar manualmente." + +#: ../src/common/connection.py:187 ../src/common/connection.py:214 +#, python-format +msgid "Transport %s answered wrongly to register request: %s" +msgstr "O transporte %s respondeu incorrectamente á solicitude de rexistro: %s" + +#. wrong answer +#: ../src/common/connection.py:213 +msgid "Invalid answer" +msgstr "A resposta non é válida" + +#: ../src/common/connection.py:405 ../src/common/connection.py:440 +#: ../src/common/connection.py:889 +#: ../src/common/zeroconf/connection_zeroconf.py:217 +#, python-format +msgid "Could not connect to \"%s\"" +msgstr "Non se pode conectar a \"%s\"" + +#: ../src/common/connection.py:419 +#, python-format +msgid "Connected to server %s:%s with %s" +msgstr "Conectado ao servidor %s:%s con %s" + +#: ../src/common/connection.py:441 +msgid "Check your connection or try again later" +msgstr "Comprobe a súa conexión ou probe máis tarde" + +#: ../src/common/connection.py:467 +#, python-format +msgid "Authentication failed with \"%s\"" +msgstr "Fallou a autenticación con \"%s\"" + +#: ../src/common/connection.py:468 +msgid "Please check your login and password for correctness." +msgstr "Por favor, comprobe que o seu nome de usuario e o seu contrasinal sexan os correctos." + +#. We didn't set a passphrase +#: ../src/common/connection.py:585 +#: ../src/common/zeroconf/connection_zeroconf.py:156 +msgid "OpenPGP passphrase was not given" +msgstr "Non se facilitou a chave de OpenPGP" + +#. do not show I'm invisible! +#: ../src/common/connection.py:627 +msgid "invisible" +msgstr "invisíbel" + +#: ../src/common/connection.py:628 +msgid "offline" +msgstr "desconectado" + +#: ../src/common/connection.py:629 +#, python-format +msgid "I'm %s" +msgstr "Estou %s" + +#. we're not english +#. one in locale and one en +#: ../src/common/connection.py:720 +msgid "[This message is *encrypted* (See :JEP:`27`]" +msgstr "[Esta mensaxe está *cifrada* (Mira :JEP:`27`]" + +#: ../src/common/connection.py:776 +#: ../src/common/zeroconf/connection_zeroconf.py:397 +#, python-format +msgid "" +"Subject: %s\n" +"%s" +msgstr "" +"Asunto: %s\n" +"%s" + +#: ../src/common/connection.py:915 +msgid "Not fetched because of invisible status" +msgstr "Non se conseguiu debido ao estado invisíbel" + +#. only say that to non Windows users +#: ../src/common/dbus_support.py:33 +msgid "D-Bus python bindings are missing in this computer" +msgstr "As ligazóns D-Bus de python non se achan neste computador" + +#: ../src/common/dbus_support.py:34 +msgid "D-Bus capabilities of Gajim cannot be used" +msgstr "Non se poden empregar as capacidades D-Bus de Gajim" + +#: ../src/common/exceptions.py:22 +msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." +msgstr "falta a dependencia pysqlite2 (tcc python-pysqlite2). A saír..." + +#: ../src/common/exceptions.py:30 +msgid "Service not available: Gajim is not running, or remote_control is False" +msgstr "" +"O servizo non está dispoñíbel: o Gajim non se está a executar, ou remote_control está en " +"Falso" + +#: ../src/common/exceptions.py:38 +msgid "D-Bus is not present on this machine or python module is missing" +msgstr "D-Bus non está presente nesta máquina ou falta o módulo python" + +#: ../src/common/exceptions.py:46 +msgid "" +"Session bus is not available.\n" +"Try reading http://trac.gajim.org/wiki/GajimDBus" +msgstr "" +"O bus da sesión non está dispoñíbel.\n" +"Probe a ler http://trac.gajim.org/wiki/GajimDBus" + +#: ../src/common/fuzzyclock.py:42 +msgid "one" +msgstr "unha" + +#: ../src/common/fuzzyclock.py:42 +msgid "two" +msgstr "dúas" + +#: ../src/common/fuzzyclock.py:42 +msgid "three" +msgstr "tres" + +#: ../src/common/fuzzyclock.py:42 +msgid "four" +msgstr "catro" + +#: ../src/common/fuzzyclock.py:42 +msgid "five" +msgstr "cinco" + +#: ../src/common/fuzzyclock.py:42 +msgid "six" +msgstr "seis" + +#: ../src/common/fuzzyclock.py:43 +msgid "seven" +msgstr "sete" + +#: ../src/common/fuzzyclock.py:43 +msgid "eight" +msgstr "oito" + +#: ../src/common/fuzzyclock.py:43 +msgid "nine" +msgstr "nove" + +#: ../src/common/fuzzyclock.py:43 +msgid "ten" +msgstr "dez" + +#: ../src/common/fuzzyclock.py:43 +msgid "eleven" +msgstr "once" + +#: ../src/common/fuzzyclock.py:44 +msgid "twelve" +msgstr "doce" + +#. Strings to use for the output. %0 will be replaced with the preceding hour (e.g. "x PAST %0"), %1 with the coming hour (e.g. "x TO %1). ''' +#. A "singular-form". It is used when talking about hour 0 +#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 +msgid "%0 o'clock" +msgstr "%0 en punto" + +#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 +msgid "five past %0" +msgstr "%0 e cinco" + +#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:56 +msgid "ten past %0" +msgstr "%0 e dez" + +#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 +msgid "quarter past %0" +msgstr "%0 e cuarto" + +#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:57 +msgid "twenty past %0" +msgstr "%0 e vinte" + +#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 +msgid "twenty five past %0" +msgstr "%0 e vinte e cinco" + +#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:58 +msgid "half past %0" +msgstr "%0 e media" + +#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 +msgid "twenty five to %1" +msgstr "%1 menos vinte e cinco" + +#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:59 +msgid "twenty to %1" +msgstr "%1 menos vinte" + +#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 +msgid "quarter to %1" +msgstr "%1 menos cuarto" + +#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:60 +msgid "ten to %1" +msgstr "%1 menos dez" + +#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:60 +msgid "five to %1" +msgstr "%1 menos cinco" + +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +msgid "%1 o'clock" +msgstr "%1 en punto" + +#: ../src/common/fuzzyclock.py:62 +msgid "Night" +msgstr "Noite" + +#: ../src/common/fuzzyclock.py:62 +msgid "Early morning" +msgstr "Madrugada" + +#: ../src/common/fuzzyclock.py:62 +msgid "Morning" +msgstr "Mañá" + +#: ../src/common/fuzzyclock.py:62 +msgid "Almost noon" +msgstr "Media mañá" + +#: ../src/common/fuzzyclock.py:63 +msgid "Noon" +msgstr "Mediodía" + +#: ../src/common/fuzzyclock.py:63 +msgid "Afternoon" +msgstr "Tarde" + +#: ../src/common/fuzzyclock.py:63 +msgid "Evening" +msgstr "Serán" + +#: ../src/common/fuzzyclock.py:63 +msgid "Late evening" +msgstr "Noite" + +#: ../src/common/fuzzyclock.py:65 +msgid "Start of week" +msgstr "Comezo da semana" + +#: ../src/common/fuzzyclock.py:65 +msgid "Middle of week" +msgstr "Metade de semana" + +#: ../src/common/fuzzyclock.py:65 +msgid "End of week" +msgstr "Final de semana" + +#: ../src/common/fuzzyclock.py:66 +msgid "Weekend!" +msgstr "Fin de semana!" + +#: ../src/common/helpers.py:105 +msgid "Invalid character in username." +msgstr "Hai un caracter non válido no nome de usuario." + +#: ../src/common/helpers.py:110 +msgid "Server address required." +msgstr "É necesario o enderezo do servidor." + +#: ../src/common/helpers.py:115 +msgid "Invalid character in hostname." +msgstr "Carácter non válido no nome do host." + +#: ../src/common/helpers.py:121 +msgid "Invalid character in resource." +msgstr "Carácter non válido no recurso." + +#. GiB means gibibyte +#: ../src/common/helpers.py:161 +#, python-format +msgid "%s GiB" +msgstr "%s GiB" + +#. GB means gigabyte +#: ../src/common/helpers.py:164 +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#. MiB means mibibyte +#: ../src/common/helpers.py:168 +#, python-format +msgid "%s MiB" +msgstr "%s MiB" + +#. MB means megabyte +#: ../src/common/helpers.py:171 +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#. KiB means kibibyte +#: ../src/common/helpers.py:175 +#, python-format +msgid "%s KiB" +msgstr "%s KiB" + +#. KB means kilo bytes +#: ../src/common/helpers.py:178 +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#. B means bytes +#: ../src/common/helpers.py:181 +#, python-format +msgid "%s B" +msgstr "%s B" + +#: ../src/common/helpers.py:210 +msgid "_Busy" +msgstr "_Ocupado" + +#: ../src/common/helpers.py:212 +msgid "Busy" +msgstr "Ocupado" + +#: ../src/common/helpers.py:215 +msgid "_Not Available" +msgstr "_Non dispoñíbel" + +#: ../src/common/helpers.py:220 +msgid "_Free for Chat" +msgstr "_Libre para falar" + +#: ../src/common/helpers.py:222 +msgid "Free for Chat" +msgstr "Libre para falar" + +#: ../src/common/helpers.py:225 +msgid "_Available" +msgstr "En liñ_a" + +#: ../src/common/helpers.py:227 +msgid "Available" +msgstr "En líña" + +#: ../src/common/helpers.py:229 +msgid "Connecting" +msgstr "Conectando" + +#: ../src/common/helpers.py:232 +msgid "A_way" +msgstr "A_usente" + +#: ../src/common/helpers.py:237 +msgid "_Offline" +msgstr "D_esconectado" + +#: ../src/common/helpers.py:239 +msgid "Offline" +msgstr "Desconectado" + +#: ../src/common/helpers.py:242 +msgid "_Invisible" +msgstr "_Invisíbel" + +#: ../src/common/helpers.py:248 +msgid "?contact has status:Unknown" +msgstr "Descoñecido" + +#: ../src/common/helpers.py:250 +msgid "?contact has status:Has errors" +msgstr "Ten erros" + +#: ../src/common/helpers.py:255 +msgid "?Subscription we already have:None" +msgstr "Ningunha" + +#: ../src/common/helpers.py:257 +msgid "To" +msgstr "A" + +#: ../src/common/helpers.py:261 +msgid "Both" +msgstr "Ambos" + +#: ../src/common/helpers.py:269 +msgid "?Ask (for Subscription):None" +msgstr "Ningunha" + +#: ../src/common/helpers.py:271 +msgid "Subscribe" +msgstr "_Engadir" + +#: ../src/common/helpers.py:280 +msgid "?Group Chat Contact Role:None" +msgstr "Ningún" + +#: ../src/common/helpers.py:283 +msgid "Moderators" +msgstr "Moderadores" + +#: ../src/common/helpers.py:285 +msgid "Moderator" +msgstr "Moderador" + +#: ../src/common/helpers.py:288 +msgid "Participants" +msgstr "Participantes" + +#: ../src/common/helpers.py:290 +msgid "Participant" +msgstr "Participante" + +#: ../src/common/helpers.py:293 +msgid "Visitors" +msgstr "Visitantes" + +#: ../src/common/helpers.py:295 +msgid "Visitor" +msgstr "Visitante" + +#: ../src/common/helpers.py:301 +msgid "?Group Chat Contact Affiliation:None" +msgstr "Ningún" + +#: ../src/common/helpers.py:303 +msgid "Owner" +msgstr "Propietario" + +#: ../src/common/helpers.py:305 +msgid "Administrator" +msgstr "Administrador" + +#: ../src/common/helpers.py:307 +msgid "Member" +msgstr "Membro" + +#: ../src/common/helpers.py:346 +msgid "is paying attention to the conversation" +msgstr "está a prestar atención á conversa" + +#: ../src/common/helpers.py:348 +msgid "is doing something else" +msgstr "está a facer algo máis" + +#: ../src/common/helpers.py:350 +msgid "is composing a message..." +msgstr "está a escribir..." + +#. paused means he or she was compoing but has stopped for a while +#: ../src/common/helpers.py:353 +msgid "paused composing a message" +msgstr "Parou de escribir" + +#: ../src/common/helpers.py:355 +msgid "has closed the chat window or tab" +msgstr "pechou a fiestra de charla" + +#: ../src/common/helpers.py:881 +#, python-format +msgid " %d unread message" +msgid_plural " %d unread messages" +msgstr[0] "%d mensaxe sen ler" +msgstr[1] "%d mensaxes sen ler" + +#: ../src/common/helpers.py:887 +#, python-format +msgid " %d unread single message" +msgid_plural " %d unread single messages" +msgstr[0] "%d mensaxe único sen ler" +msgstr[1] "%d mensaxes únicas sen ler" + +#: ../src/common/helpers.py:893 +#, python-format +msgid " %d unread group chat message" +msgid_plural " %d unread group chat messages" +msgstr[0] "%d mensaxe de grupo de charla sen ler" +msgstr[1] "%d mensaxes de grupo de charla sen ler" + +#: ../src/common/helpers.py:899 +#, python-format +msgid " %d unread private message" +msgid_plural " %d unread private messages" +msgstr[0] "%d mensaxe privada sen ler" +msgstr[1] "%d mensaxes privadas sen ler" + +#: ../src/common/helpers.py:909 ../src/common/helpers.py:911 +#, python-format +msgid "Gajim - %s" +msgstr "Gajim - %s" + +#. we talk about a file +#: ../src/common/optparser.py:60 +#, python-format +msgid "error: cannot open %s for reading" +msgstr "erro: non se pode abrir %s para lectura" + +#: ../src/common/optparser.py:183 +msgid "gtk+" +msgstr "gtk+" + +#: ../src/common/optparser.py:192 ../src/common/optparser.py:193 +msgid "cyan" +msgstr "ciano" + +#: ../src/common/optparser.py:302 +msgid "migrating logs database to indeces" +msgstr "migrando os rexistros da base de datos aos índices" + +#: ../src/common/passwords.py:86 +#, python-format +msgid "Gajim account %s" +msgstr "Conta de Gajim %s" + +#: ../src/common/zeroconf/client_zeroconf.py:189 +msgid "Connection to host could not be established: Incorrect answer from server." +msgstr "Non foi posíbel estabelecer a conexión ao host: resposta incorrecta do servidor." + +#: ../src/common/zeroconf/client_zeroconf.py:205 +msgid "Connection to host could not be established" +msgstr "Non foi posíbel estabelecer a conexión ao host" + +#: ../src/common/zeroconf/client_zeroconf.py:334 +msgid "Connection to host could not be established: Timeout while sending data." +msgstr "Non foi posíbel estabelecer a conexión ao host: expirou cando enviaba a información." + +#: ../src/common/zeroconf/client_zeroconf.py:629 +msgid "Contact is offline. Your message could not be sent." +msgstr "O contacto está desconectado. A súa mensaxe non se puido enviar." + +#: ../src/common/zeroconf/connection_zeroconf.py:197 +msgid "To continue sending and receiving messages, you will need to reconnect." +msgstr "Para continuar a enviar e recibir mensaxes, precisa volver conectarse." + +#: ../src/common/zeroconf/connection_zeroconf.py:207 +msgid "Avahi error" +msgstr "Erro de Avahi" + +#: ../src/common/zeroconf/connection_zeroconf.py:207 +#, python-format +msgid "" +"%s\n" +"Link-local messaging might not work properly." +msgstr "" +"%s\n" +"A mensaxaría de ligazón local podería non funcionar correctamente." + +#: ../src/common/zeroconf/connection_zeroconf.py:218 +msgid "Please check if Avahi is installed." +msgstr "Por favor, comprobe se o Avahi está instalado." + +#: ../src/common/zeroconf/connection_zeroconf.py:227 +#: ../src/common/zeroconf/connection_zeroconf.py:231 +msgid "Could not start local service" +msgstr "Non foi posíbel iniciar o servizo local" + +#: ../src/common/zeroconf/connection_zeroconf.py:228 +#, python-format +msgid "Unable to bind to port %d." +msgstr "Non foi posíbel ligar ao porto %d." + +#: ../src/common/zeroconf/connection_zeroconf.py:232 +#: ../src/common/zeroconf/connection_zeroconf.py:325 +msgid "Please check if avahi-daemon is running." +msgstr "Por favor, comprobe se o avahi-daemon está en execución." + +#: ../src/common/zeroconf/connection_zeroconf.py:324 +#, python-format +msgid "Could not change status of account \"%s\"" +msgstr "Non foi posíbel cambiar o estado da conta \"%s\"" + +#: ../src/common/zeroconf/connection_zeroconf.py:341 +msgid "" +"You are not connected or not visible to others. Your message could not be " +"sent." +msgstr "" +"Non está conectado ou está invisíbel aos máis. A súa mensaxe non se puido enviar " + +#. we're not english +#: ../src/common/zeroconf/connection_zeroconf.py:353 +msgid "[This message is encrypted]" +msgstr "[Esta mensaxe está cifrada]" + +#: ../src/common/zeroconf/zeroconf.py:180 +#, python-format +msgid "Error while adding service. %s" +msgstr "Erro ao engadir o servizo. %s" + diff --git a/po/hr.po b/po/hr.po index 69b1e60b3..6cab23036 100644 --- a/po/hr.po +++ b/po/hr.po @@ -1,18 +1,22 @@ -# Croatian translations for gajim. -# Copyright (C) 2006 RiLinux +# Croatian translations for Gajim. +# Copyright (C) 2007 RiLinux # This file is distributed under the same license as the gajim package. -# Adrian C. , 2006. +# Adrian C. , 2007. # Deni B. , 2006. # Armando V. 2006. # Vedran M. 2006. # -#: ../src/gajim-remote.py:202 ../src/gajim-remote.py:209 +#: ../src/chat_control.py:1224 ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:210 ../src/gajim-remote.py:236 +#: ../src/gajim-remote.py:237 ../src/gajim-remote.py:243 +#: ../src/gajim-remote.py:244 ../src/gajim-remote.py:245 +#: ../src/gajim-remote.py:246 msgid "" msgstr "" -"Project-Id-Version: gajim 0.11\n" +"Project-Id-Version: gajim 0.11.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-12-18 09:32+0100\n" -"PO-Revision-Date: 2006-12-07 20:05+0100\n" +"POT-Creation-Date: 2007-05-29 21:17+0200\n" +"PO-Revision-Date: 2007-05-26 22:10+0100\n" "Last-Translator: Adrian C. \n" "Language-Team: Croatian\n" "MIME-Version: 1.0\n" @@ -69,8 +73,9 @@ msgid "_Status" msgstr "_Status" #: ../data/glade/account_creation_wizard_window.glade.h:1 +#, fuzzy msgid "" -"Account is being created\n" +"Connecting to server\n" "\n" "Please wait..." msgstr "" @@ -87,51 +92,65 @@ msgid "Please fill in the data for your new account" msgstr "Molimo popunite podatke za vaš novi korisnički račun" #: ../data/glade/account_creation_wizard_window.glade.h:6 +msgid "Please select a server" +msgstr "" + +#: ../data/glade/account_creation_wizard_window.glade.h:7 msgid "Click to see features (like MSN, ICQ transports) of jabber servers" msgstr "" "Kliknite da vidite mogućnosti (kao što su MSN, ICQ transporti od jabber " "servera" -#: ../data/glade/account_creation_wizard_window.glade.h:7 +#: ../data/glade/account_creation_wizard_window.glade.h:8 msgid "Connect when I press Finish" msgstr "Spoji se kada pritisnem Završi" -#: ../data/glade/account_creation_wizard_window.glade.h:8 +#: ../data/glade/account_creation_wizard_window.glade.h:9 msgid "Gajim: Account Creation Wizard" msgstr "Gajim: Čarobnjak za Stvaranje Računa" -#: ../data/glade/account_creation_wizard_window.glade.h:9 +#: ../data/glade/account_creation_wizard_window.glade.h:10 msgid "I already have an account I want to use" msgstr "Već imam račun koji želim koristiti" -#: ../data/glade/account_creation_wizard_window.glade.h:10 +#: ../data/glade/account_creation_wizard_window.glade.h:11 msgid "I want to _register for a new account" msgstr "Želim se _registrirati novi račun" -#: ../data/glade/account_creation_wizard_window.glade.h:11 -#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/account_creation_wizard_window.glade.h:12 +#: ../data/glade/account_modification_window.glade.h:20 msgid "If checked, Gajim will remember the password for this account" msgstr "Ako je označeno, Gajim će pamtiti lozinku za ovaj račun" -#: ../data/glade/account_creation_wizard_window.glade.h:12 -#: ../data/glade/manage_proxies_window.glade.h:6 -msgid "Pass_word:" -msgstr "Lo_zinka:" - #: ../data/glade/account_creation_wizard_window.glade.h:13 -#: ../data/glade/account_modification_window.glade.h:38 +#: ../data/glade/account_modification_window.glade.h:26 +msgid "Manage..." +msgstr "Podesi..." + +#: ../data/glade/account_creation_wizard_window.glade.h:14 +#, fuzzy +msgid "Prox_y:" +msgstr "Proxy:" + +#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_modification_window.glade.h:40 msgid "Save pass_word" msgstr "Snimi lo_zinku" -#: ../data/glade/account_creation_wizard_window.glade.h:14 +#: ../data/glade/account_creation_wizard_window.glade.h:16 msgid "Servers Features" msgstr "Mogućnosti Poslužitelja" -#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_creation_wizard_window.glade.h:17 msgid "Set my profile when I connect" msgstr "Postavi moj profil pri spajanju" -#: ../data/glade/account_creation_wizard_window.glade.h:16 +#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_modification_window.glade.h:45 +msgid "Use custom hostname/port" +msgstr "Koristi vlastito ime poslužitelja/port" + +#: ../data/glade/account_creation_wizard_window.glade.h:19 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." @@ -139,48 +158,40 @@ msgstr "" "Morate imati račun kako bi se mogli spojiti\n" "na Jabber mrežu." -#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_creation_wizard_window.glade.h:21 msgid "Your JID:" msgstr "Vaš JID:" -#: ../data/glade/account_creation_wizard_window.glade.h:19 +#: ../data/glade/account_creation_wizard_window.glade.h:22 #: ../data/glade/roster_window.glade.h:11 msgid "_Advanced" msgstr "_Napredno" -#: ../data/glade/account_creation_wizard_window.glade.h:20 +#: ../data/glade/account_creation_wizard_window.glade.h:23 msgid "_Finish" msgstr "_Završi" -#: ../data/glade/account_creation_wizard_window.glade.h:21 -#: ../data/glade/manage_proxies_window.glade.h:9 -msgid "_Host:" -msgstr "_Poslužitelj:" +#: ../data/glade/account_creation_wizard_window.glade.h:24 +#, fuzzy +msgid "_Hostname:" +msgstr "Ime poslužitelja:" -#: ../data/glade/account_creation_wizard_window.glade.h:22 -#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_modification_window.glade.h:50 msgid "_Password:" msgstr "_Lozinka:" -#: ../data/glade/account_creation_wizard_window.glade.h:23 -#: ../data/glade/manage_proxies_window.glade.h:10 +#: ../data/glade/account_creation_wizard_window.glade.h:26 +#: ../data/glade/manage_proxies_window.glade.h:11 msgid "_Port:" msgstr "_Port:" -#: ../data/glade/account_creation_wizard_window.glade.h:24 -msgid "_Retype Password:" -msgstr "_Ponovo utipkajte Password:" - -#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_creation_wizard_window.glade.h:27 msgid "_Server:" msgstr "_Poslužitelj:" -#: ../data/glade/account_creation_wizard_window.glade.h:26 -msgid "_Use proxy" -msgstr "_Koristi proxy" - -#: ../data/glade/account_creation_wizard_window.glade.h:27 -#: ../data/glade/manage_proxies_window.glade.h:11 +#: ../data/glade/account_creation_wizard_window.glade.h:28 +#: ../data/glade/manage_proxies_window.glade.h:12 msgid "_Username:" msgstr "_Korisničko ime:" @@ -208,19 +219,23 @@ msgid "Account Modification" msgstr "Modifikacija Korisničkog Računa" #: ../data/glade/account_modification_window.glade.h:6 -msgid "Autoreconnect when connection is lost" -msgstr "Automatsko ponovno spajanje kada je veza izgubljena" +msgid "Administration operations" +msgstr "Administratorski postupci" #: ../data/glade/account_modification_window.glade.h:7 +msgid "Auto-reconnect when connection is lost" +msgstr "Automatsko ponovno spajanje kada je veza izgubljena" + +#: ../data/glade/account_modification_window.glade.h:8 #: ../data/glade/zeroconf_properties_window.glade.h:3 msgid "C_onnect on Gajim startup" msgstr "Sp_oji se prilikom pokretanja Gajima" -#: ../data/glade/account_modification_window.glade.h:8 +#: ../data/glade/account_modification_window.glade.h:9 msgid "Chan_ge Password" msgstr "P_romijeni Lozinku" -#: ../data/glade/account_modification_window.glade.h:9 +#: ../data/glade/account_modification_window.glade.h:10 msgid "" "Check this so Gajim will connect in port 5223 where legacy servers are " "expected to have SSL capabilities. Note that Gajim uses TLS encryption by " @@ -232,44 +247,48 @@ msgstr "" "enkripciju ukoliko to server podržava, te će sa ovom opcijom uključenom TLS " "biti onemogućen" -#: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/account_modification_window.glade.h:11 #: ../data/glade/zeroconf_properties_window.glade.h:4 msgid "Choose _Key..." msgstr "Odaberi _Ključ" -#: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/account_modification_window.glade.h:12 msgid "Click to change account's password" msgstr "Kliknite za promjenu lozinke korisničkog računa" -#: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/account_modification_window.glade.h:13 +msgid "Click to request authorization to all contacts of another account" +msgstr "Kliknite da zatražite autorizaciju svih kontakata drugog računa" + +#: ../data/glade/account_modification_window.glade.h:14 msgid "Connection" msgstr "Veza" -#: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/account_modification_window.glade.h:15 msgid "Edit Personal Information..." msgstr "Izmjeni Osobne Informacije" -#: ../data/glade/account_modification_window.glade.h:14 -#: ../data/glade/roster_window.glade.h:5 ../src/notify.py:453 -#: ../src/notify.py:475 ../src/notify.py:487 ../src/common/helpers.py:905 +#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/roster_window.glade.h:5 ../src/notify.py:460 +#: ../src/notify.py:482 ../src/notify.py:494 ../src/common/helpers.py:918 msgid "Gajim" msgstr "Gajim" -#. Contact is not in a group, so count it in General group -#: ../data/glade/account_modification_window.glade.h:15 -#: ../data/glade/preferences_window.glade.h:49 +#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/preferences_window.glade.h:51 #: ../data/glade/zeroconf_properties_window.glade.h:7 -#: ../src/roster_window.py:342 ../src/roster_window.py:1207 -#: ../src/roster_window.py:1418 ../src/roster_window.py:2029 -#: ../src/roster_window.py:2071 ../src/common/contacts.py:278 +#: ../src/roster_window.py:349 ../src/roster_window.py:604 +#: ../src/roster_window.py:1309 ../src/roster_window.py:1677 +#: ../src/roster_window.py:2453 ../src/roster_window.py:2495 +#: ../src/roster_window.py:2532 ../src/common/contacts.py:292 msgid "General" msgstr "Općenito" -#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/account_modification_window.glade.h:18 msgid "Hostname: " msgstr "Ime poslužitelja:" -#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/account_modification_window.glade.h:19 msgid "" "If checked, Gajim will also broadcast some more IPs except from just your " "IP, so file transfer has higher chances of working." @@ -277,15 +296,15 @@ msgstr "" "Ako je označeno, Gajim će odašiljati još neke IP adrese osim vaše, kako bi " "prijenosi datoteka imali veću šansu uspjeha." -#: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/account_modification_window.glade.h:21 msgid "" -"If checked, Gajim will send keep-alive packets so it prevents connection " -"timeout which results in disconnection" +"If checked, Gajim will send keep-alive packets to prevent connection timeout " +"which results in disconnection" msgstr "" -"Ako je označeno, Gajim će slati keep-alive pakete kako bi spriječio prekid " -"veze zbog preduge neaktivnosti" +"Ako je označeno, Gajim će slati \"keep-alive\" pakete kako bi održao " +"konekciju i spriječio prekid veze." -#: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/account_modification_window.glade.h:22 #: ../data/glade/zeroconf_properties_window.glade.h:8 msgid "" "If checked, Gajim will store the password in ~/.gajim/config with 'read' " @@ -294,7 +313,7 @@ msgstr "" "Ako je označeno, Gajim će spremiti lozinku u ~/.gajim/config sa 'čitaj' " "dozvolom samo za vas" -#: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/account_modification_window.glade.h:23 #: ../data/glade/zeroconf_properties_window.glade.h:9 msgid "" "If checked, Gajim, when launched, will automatically connect to jabber using " @@ -303,7 +322,7 @@ msgstr "" "Ako je označeno, Gajim će se pri pokretanju automatski spojiti na jabber " "koristeći ovaj račun" -#: ../data/glade/account_modification_window.glade.h:22 +#: ../data/glade/account_modification_window.glade.h:24 #: ../data/glade/zeroconf_properties_window.glade.h:10 msgid "" "If checked, any change to the global status (handled by the combobox at the " @@ -313,44 +332,44 @@ msgstr "" "Ako je označeno, svaka promjena globalnog statusa (koji se mjenja padajućim " "izbornikom na dnu prozora kontaktne liste) promjenit će status i ovog računa" -#: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/account_modification_window.glade.h:25 msgid "Information about you, as stored in the server" msgstr "Informacije o vama, kako stoji na poslužitelju" -#: ../data/glade/account_modification_window.glade.h:24 -msgid "Manage..." -msgstr "Podesi..." - -#: ../data/glade/account_modification_window.glade.h:25 -#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1643 -#: ../src/config.py:3436 +#: ../data/glade/account_modification_window.glade.h:27 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1623 +#: ../src/config.py:3413 msgid "No key selected" msgstr "Niti jedan ključ nije odabran" #. None means no proxy profile selected -#: ../data/glade/account_modification_window.glade.h:27 ../src/config.py:1225 -#: ../src/config.py:1230 ../src/config.py:1414 ../src/config.py:1633 -#: ../src/config.py:1642 ../src/config.py:1701 ../src/config.py:1775 -#: ../src/config.py:2646 ../src/config.py:3426 ../src/config.py:3435 -#: ../src/dialogs.py:281 ../src/dialogs.py:283 +#. GPG Key +#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/vcard_information_window.glade.h:32 ../src/config.py:1196 +#: ../src/config.py:1201 ../src/config.py:1385 ../src/config.py:1613 +#: ../src/config.py:1622 ../src/config.py:1682 ../src/config.py:1756 +#: ../src/config.py:2958 ../src/config.py:3003 ../src/config.py:3403 +#: ../src/config.py:3412 ../src/dialogs.py:282 ../src/dialogs.py:284 +#: ../src/roster_window.py:1781 ../src/roster_window.py:1788 +#: ../src/roster_window.py:1795 msgid "None" msgstr "Ništa" -#: ../data/glade/account_modification_window.glade.h:28 -#: ../data/glade/profile_window.glade.h:25 +#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/profile_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:17 msgid "Personal Information" msgstr "Osobne Informacije" -#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/account_modification_window.glade.h:31 msgid "Port: " msgstr "Port:" -#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/account_modification_window.glade.h:32 msgid "Priori_ty:" msgstr "Priori_tet:" -#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/account_modification_window.glade.h:33 msgid "" "Priority is used in Jabber to determine who gets the events from the jabber " "server when two or more clients are connected using the same account; The " @@ -360,19 +379,19 @@ msgstr "" "jabber servera kada su spojena 2 ili više klijenta koristeći isti račun; " "klijent sa najvišim prioritetom dobiva te događaje" -#: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/account_modification_window.glade.h:34 msgid "Priority will change automatically according to your status." msgstr "Prioritet će biti automatski promijenjen prema vašem statusu." -#: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/account_modification_window.glade.h:35 msgid "Proxy:" msgstr "Proxy:" -#: ../data/glade/account_modification_window.glade.h:34 -msgid "Resour_ce: " -msgstr "Resur_s" +#: ../data/glade/account_modification_window.glade.h:36 +msgid "Resour_ce:" +msgstr "Resur_s:" -#: ../data/glade/account_modification_window.glade.h:35 +#: ../data/glade/account_modification_window.glade.h:37 msgid "" "Resource is sent to the Jabber server in order to separate the same JID in " "two or more parts depending on the number of the clients connected in the " @@ -385,47 +404,47 @@ msgstr "" "možete biti spojeni sa resursom 'Posao' ili 'Kuća', klijent sa najvišim " "prioritetom dobivat će obavijesti o događajima" -#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/account_modification_window.glade.h:38 #: ../data/glade/zeroconf_properties_window.glade.h:18 msgid "Save _passphrase (insecure)" msgstr "Snimi _lozinku (nesigurno)" -#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/account_modification_window.glade.h:39 #: ../data/glade/zeroconf_properties_window.glade.h:19 msgid "Save conversation _logs for all contacts" msgstr "Snimi _dnevnik razgovora za sve kontakte" -#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/account_modification_window.glade.h:41 msgid "Send keep-alive packets" msgstr "Šalji keep-alive pakete" -#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/account_modification_window.glade.h:42 #: ../data/glade/zeroconf_properties_window.glade.h:20 msgid "Synch_ronize account status with global status" msgstr "Sink_roniziraj status računa sa globalnim statusom" -#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/account_modification_window.glade.h:43 +msgid "Synchronise contacts" +msgstr "Sinkroniziraj kontakte" + +#: ../data/glade/account_modification_window.glade.h:44 msgid "Use _SSL (legacy)" msgstr "Koristi _SSL (zastarjelo)" -#: ../data/glade/account_modification_window.glade.h:42 -msgid "Use custom hostname/port" -msgstr "Koristi vlastito ime poslužitelja/port" - -#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/account_modification_window.glade.h:46 msgid "Use file transfer proxies" msgstr "Koristi proxy za prijenos datoteka" -#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/account_modification_window.glade.h:47 msgid "_Adjust to status" msgstr "_Podesi prema statusu" -#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/account_modification_window.glade.h:48 msgid "_Jabber ID:" msgstr "_Jabber ID:" -#: ../data/glade/account_modification_window.glade.h:46 -msgid "_Name: " +#: ../data/glade/account_modification_window.glade.h:49 +msgid "_Name:" msgstr "_Ime:" #: ../data/glade/accounts_window.glade.h:1 @@ -449,7 +468,7 @@ msgstr "" #: ../data/glade/accounts_window.glade.h:4 msgid "" -"If you have 2 or more accounts and it is checked, Gajim will list all " +"If you have 2 or more accounts and this is checked, Gajim will list all " "contacts as if you had one account" msgstr "" "Ako imate 2 ili više računa i ovo je označeno, Gajim će prikazivati sve " @@ -490,14 +509,14 @@ msgstr "Želio bih Vas dodati na moju listu kontakata." #: ../data/glade/add_new_contact_window.glade.h:5 msgid "" -"You have to register to this transport\n" +"You have to register with this transport\n" "to be able to add a contact from this\n" "protocol. Click on register button to\n" "proceed." msgstr "" "Morate se registrirati na ovom transportu\n" -"kako biste mogli dodati kontakte sa ovog\n" -"protokola. Kliknite na dugme registracije za\n" +"kako bi ste mogli dodati kontakte sa ovog\n" +"protokola. Kliknite na gumb registracije za\n" "nastavak." #: ../data/glade/add_new_contact_window.glade.h:9 @@ -505,7 +524,7 @@ msgid "" "You must be connected to the transport to be able\n" "to add a contact from this protocol." msgstr "" -"Morate biti spojeni na transport da biste mogli\n" +"Morate biti spojeni na transport da bi ste mogli\n" "dodavati kontakte sa ovog protokola." #: ../data/glade/add_new_contact_window.glade.h:11 @@ -529,52 +548,49 @@ msgid "_User ID:" msgstr "_ID Korisnika:" #: ../data/glade/adhoc_commands_window.glade.h:1 -msgid "An error has occured:" -msgstr "" +msgid "An error has occurred:" +msgstr "Pojavila se greška:" #: ../data/glade/adhoc_commands_window.glade.h:2 msgid "Choose command to execute:" -msgstr "" +msgstr "Izaberite naredbu za izvršiti:" #: ../data/glade/adhoc_commands_window.glade.h:3 msgid "Ad-hoc Commands - Gajim" -msgstr "" +msgstr "Ad-hoc Naredbe - Gajim" #: ../data/glade/adhoc_commands_window.glade.h:4 msgid "Check once more" -msgstr "" +msgstr "Provjeri još jednom" #: ../data/glade/adhoc_commands_window.glade.h:5 -#, fuzzy msgid "Error description..." -msgstr "Opis" +msgstr "Opis greške..." #: ../data/glade/adhoc_commands_window.glade.h:6 -#, fuzzy msgid "Please wait while retrieving command list..." -msgstr "Pričekajte dok se odvija selidba zapisa..." +msgstr "Pričekajte dok se odvija primanje liste naredbi..." #: ../data/glade/adhoc_commands_window.glade.h:7 -#, fuzzy msgid "Please wait while the command is sending..." -msgstr "Pričekajte dok se odvija selidba zapisa..." +msgstr "Pričekajte dok se odvija slanje naredbe..." #: ../data/glade/adhoc_commands_window.glade.h:8 msgid "Please wait..." -msgstr "" +msgstr "Molim pričekajte..." #: ../data/glade/adhoc_commands_window.glade.h:9 msgid "This jabber entity does not expose any commands." -msgstr "" +msgstr "Ovaj jabber entitet ne izlaže nikakve naredbe." #: ../data/glade/advanced_configuration_window.glade.h:1 msgid "Description" msgstr "Opis" #: ../data/glade/advanced_configuration_window.glade.h:2 -msgid "NOTE: You should restart gajim for some setting to take effect" +msgid "NOTE: You should restart Gajim for some settings to take effect" msgstr "" -"NAPOMENA: Trebali biste ponovno pokrenuti gajim da bi neke postavke " +"NAPOMENA: Trebali bi ste ponovno pokrenuti gajim da bi neke postavke " "postale aktivne" #: ../data/glade/advanced_configuration_window.glade.h:3 @@ -594,7 +610,7 @@ msgid "Deletes Message of the Day" msgstr "Briše Poruku Dana" #: ../data/glade/advanced_menuitem_menu.glade.h:3 -msgid "Sends a message to currently connected users to this server" +msgid "Sends a message to users currently connected to this server" msgstr "Šalje poruku trenutno spojenim korisnicima na ovom poslužitelju" #: ../data/glade/advanced_menuitem_menu.glade.h:4 @@ -622,14 +638,18 @@ msgid "_Administrator" msgstr "_Administrator" #: ../data/glade/advanced_menuitem_menu.glade.h:10 +msgid "_Blocked Contacts" +msgstr "_Blokirani Kontakti" + +#: ../data/glade/advanced_menuitem_menu.glade.h:11 msgid "_Privacy Lists" msgstr "Liste _Privatnosti" -#: ../data/glade/advanced_menuitem_menu.glade.h:11 +#: ../data/glade/advanced_menuitem_menu.glade.h:12 msgid "_Send Server Message" msgstr "_Pošalji Poslužiteljsku Poruku" -#: ../data/glade/advanced_menuitem_menu.glade.h:12 +#: ../data/glade/advanced_menuitem_menu.glade.h:13 msgid "_Send Single Message" msgstr "_Pošalji Jednu Poruku" @@ -656,20 +676,20 @@ msgstr "Napredne Akcije" #: ../data/glade/advanced_notifications_window.glade.h:6 msgid "Advanced Notifications Control" -msgstr "Editor Naprednih Obavijesti" +msgstr "Napredno Upravljanje Obavijestima" #: ../data/glade/advanced_notifications_window.glade.h:7 msgid "All statuses" msgstr "Svi statusi" #: ../data/glade/advanced_notifications_window.glade.h:8 -#: ../src/common/helpers.py:234 +#: ../src/common/commands.py:91 ../src/common/helpers.py:243 msgid "Away" msgstr "Odsutan" #: ../data/glade/advanced_notifications_window.glade.h:9 msgid "Busy " -msgstr "Zaposlen" +msgstr "Zauzet " #: ../data/glade/advanced_notifications_window.glade.h:10 msgid "Don't have " @@ -680,7 +700,7 @@ msgid "Have " msgstr "Imam " #: ../data/glade/advanced_notifications_window.glade.h:12 -#: ../src/common/helpers.py:244 +#: ../src/common/helpers.py:253 msgid "Invisible" msgstr "Nevidljiv" @@ -689,7 +709,7 @@ msgid "Launch a command" msgstr "Pokrenite naredbu" #: ../data/glade/advanced_notifications_window.glade.h:14 -#: ../src/common/helpers.py:217 +#: ../src/common/helpers.py:226 msgid "Not Available" msgstr "Nedostupan" @@ -708,17 +728,15 @@ msgstr "Sviraj zvukove" #: ../data/glade/advanced_notifications_window.glade.h:18 msgid "" "Receive a Message\n" -"Contact Connected \n" "Contact Disconnected \n" "Contact Change Status \n" "Group Chat Message Highlight \n" "Group Chat Message Received \n" -"File Transfert Resquest \n" -"File Transfert Started \n" -"File Transfert Finished" +"File Transfer Request \n" +"File Transfer Started \n" +"File Transfer Finished" msgstr "" "Primanje Poruke\n" -"Kontakt Spojen\n" "Kontakt Odspojen\n" "Kontakt Promjeni Status\n" "Osvjetljavanje na Poruku Grupnog Razgovora\n" @@ -727,58 +745,58 @@ msgstr "" "Početak Prijenosa Datoteke\n" "Završen Prijenos Datoteke" -#: ../data/glade/advanced_notifications_window.glade.h:27 +#: ../data/glade/advanced_notifications_window.glade.h:26 msgid "When " msgstr "Kada " -#: ../data/glade/advanced_notifications_window.glade.h:28 +#: ../data/glade/advanced_notifications_window.glade.h:27 msgid "" "_Activate window manager's UrgencyHint to make chat window in taskbar flash" msgstr "" "_Aktivacija opcije upravitelja prozora za bljeskanje prozora razgovora u " "taskbaru" -#: ../data/glade/advanced_notifications_window.glade.h:29 +#: ../data/glade/advanced_notifications_window.glade.h:28 msgid "_Disable auto opening chat window" msgstr "_Onemogući automatsko otvaranje prozora razgovora" -#: ../data/glade/advanced_notifications_window.glade.h:30 +#: ../data/glade/advanced_notifications_window.glade.h:29 msgid "_Disable existing popup window" msgstr "_Onemogući postojeći iskočni prozor" -#: ../data/glade/advanced_notifications_window.glade.h:31 +#: ../data/glade/advanced_notifications_window.glade.h:30 msgid "_Disable existing sound for this event" msgstr "_Onemogući postojeći zvuk za ovaj događaj" -#: ../data/glade/advanced_notifications_window.glade.h:32 +#: ../data/glade/advanced_notifications_window.glade.h:31 msgid "_Disable showing event in roster" msgstr "_Onemogući prikazivanje događaja u listi kontakata" -#: ../data/glade/advanced_notifications_window.glade.h:33 +#: ../data/glade/advanced_notifications_window.glade.h:32 msgid "_Disable showing event in systray" msgstr "_Onemogući prikazivanje događaja u systrayu" -#: ../data/glade/advanced_notifications_window.glade.h:34 +#: ../data/glade/advanced_notifications_window.glade.h:33 msgid "_Inform me with a popup window" msgstr "_Obavijesti me sa iskočnim prozorom" -#: ../data/glade/advanced_notifications_window.glade.h:35 +#: ../data/glade/advanced_notifications_window.glade.h:34 msgid "_Open chat window with user" msgstr "_Otvori prozor za razgovor sa korisnikom" -#: ../data/glade/advanced_notifications_window.glade.h:36 +#: ../data/glade/advanced_notifications_window.glade.h:35 msgid "_Show event in roster" msgstr "Prikaži događaj u _listi kontakata" -#: ../data/glade/advanced_notifications_window.glade.h:37 +#: ../data/glade/advanced_notifications_window.glade.h:36 msgid "_Show event in systray" msgstr "Prikaži samo u _listi kontakata" -#: ../data/glade/advanced_notifications_window.glade.h:38 +#: ../data/glade/advanced_notifications_window.glade.h:37 msgid "and I " msgstr "i ja " -#: ../data/glade/advanced_notifications_window.glade.h:39 +#: ../data/glade/advanced_notifications_window.glade.h:38 msgid "" "contact(s)\n" "group(s)\n" @@ -788,53 +806,33 @@ msgstr "" "grupe\n" "svi" -#: ../data/glade/advanced_notifications_window.glade.h:42 +#: ../data/glade/advanced_notifications_window.glade.h:41 msgid "for " msgstr "za" -#: ../data/glade/advanced_notifications_window.glade.h:43 +#: ../data/glade/advanced_notifications_window.glade.h:42 msgid "when I'm in" msgstr "kada sam u" #: ../data/glade/atom_entry_window.glade.h:1 -msgid "2003-12-13T18:30:02Z" -msgstr "" +msgid "Entry:" +msgstr "Unos:" #: ../data/glade/atom_entry_window.glade.h:2 -msgid "Romeo and Juliet" -msgstr "" +msgid "Feed name:" +msgstr "Ime članaka:" #: ../data/glade/atom_entry_window.glade.h:3 -#, fuzzy -msgid "Entry:" -msgstr "Država:" +msgid "Last modified:" +msgstr "Posljednja izmjena:" #: ../data/glade/atom_entry_window.glade.h:4 -#, fuzzy -msgid "Feed name:" -msgstr "ime teme" +msgid "New entry received" +msgstr "Primljen novi unos" #: ../data/glade/atom_entry_window.glade.h:5 -#, fuzzy -msgid "Last modified:" -msgstr "Prezime:" - -#: ../data/glade/atom_entry_window.glade.h:6 -#, fuzzy -msgid "New entry received" -msgstr "Kada se primi novi događaj" - -#: ../data/glade/atom_entry_window.glade.h:7 -msgid "Old stories" -msgstr "" - -#: ../data/glade/atom_entry_window.glade.h:8 -msgid "Soliloquy" -msgstr "" - -#: ../data/glade/atom_entry_window.glade.h:9 msgid "You have received new entry:" -msgstr "" +msgstr "Primili ste novi unos:" #: ../data/glade/change_password_dialog.glade.h:1 msgid "Change Password" @@ -866,8 +864,8 @@ msgstr "Pridruživanje _Grupnom Razgovoru" #: ../data/glade/chat_context_menu.glade.h:2 #: ../data/glade/chat_control_popup_menu.glade.h:4 -#: ../data/glade/gc_occupants_menu.glade.h:2 -#: ../data/glade/roster_contact_context_menu.glade.h:10 +#: ../data/glade/gc_occupants_menu.glade.h:3 +#: ../data/glade/roster_contact_context_menu.glade.h:12 msgid "_Add to Roster" msgstr "_Dodaj na Listu" @@ -899,7 +897,7 @@ msgid "Click to see past conversations with this contact" msgstr "Pritisnite za pregled prošlih razgovora sa ovim kontaktom" #: ../data/glade/chat_control_popup_menu.glade.h:2 -#: ../data/glade/roster_contact_context_menu.glade.h:8 +#: ../data/glade/roster_contact_context_menu.glade.h:9 #: ../data/glade/zeroconf_contact_context_menu.glade.h:4 msgid "Send _File" msgstr "Pošalji _Datoteku" @@ -914,9 +912,9 @@ msgid "_Compact View Alt+C" msgstr "_Kompaktan Pregled Alt+K" #: ../data/glade/chat_control_popup_menu.glade.h:6 -#: ../data/glade/gc_control_popup_menu.glade.h:7 -#: ../data/glade/gc_occupants_menu.glade.h:5 -#: ../data/glade/roster_contact_context_menu.glade.h:13 +#: ../data/glade/gc_control_popup_menu.glade.h:8 +#: ../data/glade/gc_occupants_menu.glade.h:6 +#: ../data/glade/roster_contact_context_menu.glade.h:16 #: ../data/glade/zeroconf_contact_context_menu.glade.h:6 msgid "_History" msgstr "_Povijest" @@ -966,12 +964,12 @@ msgid "Remove file transfer from the list." msgstr "Ukloni prijenos datoteka sa liste" #: ../data/glade/filetransfers.glade.h:9 -msgid "Removes completed, canceled and failed file transfers from the list" +msgid "Removes completed, cancelled and failed file transfers from the list" msgstr "" "Ukloni završene, zaustavljene ili neuspjele prijenose datoteka sa liste" #: ../data/glade/filetransfers.glade.h:10 -msgid "Shows a list of file transfers between you and other" +msgid "Shows a list of file transfers between you and others" msgstr "Prikazuje listu prijenosa datoteka između vas i ostalih" #: ../data/glade/filetransfers.glade.h:11 @@ -986,7 +984,7 @@ msgstr "" msgid "When a file transfer is complete show a popup notification" msgstr "Pokaži popup obavijest kada se završi prijenos datoteka" -#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:769 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:761 msgid "_Continue" msgstr "_Nastaviti" @@ -994,7 +992,7 @@ msgstr "_Nastaviti" msgid "_Notify me when a file transfer is complete" msgstr "_Obavijesti me kada se završi prijenos datoteka" -#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:190 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:188 msgid "_Open Containing Folder" msgstr "_Otvaranje Mape Sadržaja" @@ -1102,30 +1100,39 @@ msgstr "Podešavanje _Sobe" msgid "_Bookmark This Room" msgstr "_Postavi Knjižnu Oznaku" +#: ../data/glade/gc_control_popup_menu.glade.h:7 +msgid "_Destroy room" +msgstr "_Uništi sobu" + +#: ../data/glade/gc_control_popup_menu.glade.h:9 +msgid "_Minimize" +msgstr "_Minimiziraj" + #: ../data/glade/gc_occupants_menu.glade.h:1 +#, fuzzy +msgid "A_dministrator" +msgstr "Administrator" + +#: ../data/glade/gc_occupants_menu.glade.h:2 msgid "Mo_derator" msgstr "Mo_derator" -#: ../data/glade/gc_occupants_menu.glade.h:3 +#: ../data/glade/gc_occupants_menu.glade.h:4 msgid "_Admin" msgstr "_Admin" -#: ../data/glade/gc_occupants_menu.glade.h:4 +#: ../data/glade/gc_occupants_menu.glade.h:5 msgid "_Ban" msgstr "_Zabrani" -#: ../data/glade/gc_occupants_menu.glade.h:6 +#: ../data/glade/gc_occupants_menu.glade.h:7 msgid "_Kick" msgstr "_Izbaci" -#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/gc_occupants_menu.glade.h:8 msgid "_Member" msgstr "_Član" -#: ../data/glade/gc_occupants_menu.glade.h:8 -msgid "_Occupant Actions" -msgstr "_Akcije Prisutnih" - #: ../data/glade/gc_occupants_menu.glade.h:9 msgid "_Owner" msgstr "_Vlasnik" @@ -1139,17 +1146,16 @@ msgid "_Voice" msgstr "_Glas" #: ../data/glade/groups_post_window.glade.h:1 -#, fuzzy msgid "Create new post" -msgstr "Nova objava" +msgstr "Stvorite novi dopis" -#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:259 +#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:268 msgid "From" msgstr "Od" #. holds subject -#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:141 -#: ../src/history_manager.py:172 +#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:142 +#: ../src/history_manager.py:173 msgid "Subject" msgstr "Tema" @@ -1206,6 +1212,11 @@ msgid "Search" msgstr "Pretraga" #: ../data/glade/history_window.glade.h:5 +#: ../data/glade/zeroconf_information_window.glade.h:10 +msgid "_Log conversation history" +msgstr "_Pamti povijest razgovora" + +#: ../data/glade/history_window.glade.h:6 ../src/disco.py:1177 msgid "_Search" msgstr "_Pretraga" @@ -1222,33 +1233,37 @@ msgstr "Odbij" msgid "Invitation Received" msgstr "Primljen Poziv" -#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1146 +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1243 msgid "Join Group Chat" msgstr "Pridružiti se Grupnom Razgovoru" #: ../data/glade/join_groupchat_window.glade.h:2 +msgid "Join this room automatically when I connect" +msgstr "Pridruži se ovoj sobi automatski kada se povežem" + +#: ../data/glade/join_groupchat_window.glade.h:3 #: ../data/glade/manage_bookmarks_window.glade.h:4 -#: ../data/glade/profile_window.glade.h:23 -#: ../data/glade/vcard_information_window.glade.h:29 +#: ../data/glade/profile_window.glade.h:24 +#: ../data/glade/vcard_information_window.glade.h:31 msgid "Nickname:" msgstr "Nadimak:" -#: ../data/glade/join_groupchat_window.glade.h:3 +#: ../data/glade/join_groupchat_window.glade.h:4 #: ../data/glade/manage_bookmarks_window.glade.h:5 msgid "Password:" msgstr "Lozinka:" -#: ../data/glade/join_groupchat_window.glade.h:4 +#: ../data/glade/join_groupchat_window.glade.h:5 msgid "Recently:" msgstr "Nedavno:" -#: ../data/glade/join_groupchat_window.glade.h:5 +#: ../data/glade/join_groupchat_window.glade.h:6 #: ../data/glade/manage_bookmarks_window.glade.h:7 msgid "Room:" msgstr "Soba:" -#: ../data/glade/join_groupchat_window.glade.h:6 ../src/disco.py:1151 -#: ../src/disco.py:1518 +#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1165 +#: ../src/disco.py:1615 msgid "_Join" msgstr "_Pridruživanje" @@ -1290,32 +1305,44 @@ msgid "Settings" msgstr "Postavke" #: ../data/glade/manage_proxies_window.glade.h:3 -msgid "HTTP Connect" -msgstr "HTTP Spoj" +msgid "" +"HTTP Connect\n" +"SOCKS5" +msgstr "" +"HTTP Spoj\n" +"SOCKS5" -#: ../data/glade/manage_proxies_window.glade.h:4 +#: ../data/glade/manage_proxies_window.glade.h:5 msgid "Manage Proxy Profiles" msgstr "Podešavanje Proxy Profila" -#: ../data/glade/manage_proxies_window.glade.h:5 -#: ../data/glade/profile_window.glade.h:22 -#: ../data/glade/vcard_information_window.glade.h:28 +#: ../data/glade/manage_proxies_window.glade.h:6 +#: ../data/glade/profile_window.glade.h:23 +#: ../data/glade/vcard_information_window.glade.h:30 msgid "Name:" msgstr "Ime:" #: ../data/glade/manage_proxies_window.glade.h:7 +msgid "Pass_word:" +msgstr "Lo_zinka:" + +#: ../data/glade/manage_proxies_window.glade.h:8 msgid "Type:" msgstr "Vrsta:" -#: ../data/glade/manage_proxies_window.glade.h:8 +#: ../data/glade/manage_proxies_window.glade.h:9 msgid "Use authentication" msgstr "Koristi autentifikaciju" +#: ../data/glade/manage_proxies_window.glade.h:10 +msgid "_Host:" +msgstr "_Poslužitelj:" + #: ../data/glade/message_window.glade.h:1 msgid "Click to insert an emoticon (Alt+M)" msgstr "Kliknite da ubacite emoticon (Alt+M)" -#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1104 +#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1167 msgid "OpenPGP Encryption" msgstr "OpenPGP Enkripcija" @@ -1329,7 +1356,7 @@ msgstr "_Akcije" #. 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:6 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:253 +#: ../src/filetransfers_window.py:245 msgid "_Send" msgstr "_Pošalji" @@ -1371,14 +1398,10 @@ msgid "Visual Notifications" msgstr "Vizualne Obavijesti" #: ../data/glade/preferences_window.glade.h:12 -msgid "A_fter nickname:" -msgstr "Poslije nadimka:" - -#: ../data/glade/preferences_window.glade.h:13 msgid "Advanced" msgstr "Napredno" -#: ../data/glade/preferences_window.glade.h:14 +#: ../data/glade/preferences_window.glade.h:13 msgid "" "All chat states\n" "Composing only\n" @@ -1388,19 +1411,22 @@ msgstr "" "Samo pisanje\n" "Onemogućeno" -#: ../data/glade/preferences_window.glade.h:17 +#: ../data/glade/preferences_window.glade.h:16 msgid "Allow _OS information to be sent" msgstr "Dozvoli slanje podataka o _OS-u" -#: ../data/glade/preferences_window.glade.h:18 +#: ../data/glade/preferences_window.glade.h:17 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" -msgstr "" -"Dozvoli popup obavijesti kada sam _odsutan/nedostupan/zaposlen/nevidljiv" +msgstr "Dozvoli popup obavijesti kada sam _odsutan/nedostupan/zauzet/nevidljiv" -#: ../data/glade/preferences_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:18 msgid "Also known as iChat style" msgstr "Poznato i kao iChat stil" +#: ../data/glade/preferences_window.glade.h:19 +msgid "Always check to see if Gajim is the _default Jabber client on startup" +msgstr "Uvijek provjeri ako je Gajim _zadani Jabber klijent, pri pokretanju" + #: ../data/glade/preferences_window.glade.h:20 msgid "" "An example: If you have enabled status message for away, Gajim won't ask you " @@ -1438,64 +1464,70 @@ msgstr "" "Prilagođeno" #: ../data/glade/preferences_window.glade.h:29 -msgid "B_efore nickname:" -msgstr "Prij_e nadimka" - -#: ../data/glade/preferences_window.glade.h:30 ../src/chat_control.py:844 msgid "Chat" msgstr "Razgovor" -#: ../data/glade/preferences_window.glade.h:31 +#: ../data/glade/preferences_window.glade.h:30 msgid "" "Check this option, only if someone you don't have in the roster spams/annoys " -"you. Use with caution, cause it blocks all messages from any contact that is " -"not in the roster" +"you. Use with caution, because it blocks all messages from any contact that " +"is not in the roster" msgstr "" -"Označite ovu opciju samo ako vas netko van vaše liste spama/uznemirava. " -"Koristite sa oprezom, blokira sve poruke koje dolaze od ljudi van vaše liste " -"kontakata" +"Označite ovu opciju samo ako vam netko van vaše liste šalje neželjene poruke " +"ili vas uznemirava. Koristite sa oprezom, blokira sve poruke koje dolaze od " +"ljudi van vaše liste kontakata" -#: ../data/glade/preferences_window.glade.h:32 +#: ../data/glade/preferences_window.glade.h:31 msgid "Configure color and font of the interface" msgstr "Postavi boje i font sučelja" -#: ../data/glade/preferences_window.glade.h:33 +#: ../data/glade/preferences_window.glade.h:32 msgid "Default Status Messages" msgstr "Predefinirana Statusna Poruka" -#: ../data/glade/preferences_window.glade.h:34 +#: ../data/glade/preferences_window.glade.h:33 msgid "Default status _iconset:" msgstr "Predefinirani statusni set _ikona" -#: ../data/glade/preferences_window.glade.h:35 +#: ../data/glade/preferences_window.glade.h:34 +msgid "" +"Determined by sender\n" +"Chat message\n" +"Single message" +msgstr "" +"Utvrđeno po pošiljaocu\n" +"Razgovorna poruka\n" +"Jedna poruka" + +#: ../data/glade/preferences_window.glade.h:37 msgid "Display _extra email details" msgstr "Prikaži dodatne email _detalje" -#: ../data/glade/preferences_window.glade.h:36 +#: ../data/glade/preferences_window.glade.h:38 msgid "Display a_vatars of contacts in roster" msgstr "Prikaži a_vatare kontakata na listi" -#: ../data/glade/preferences_window.glade.h:37 +#: ../data/glade/preferences_window.glade.h:39 msgid "Display status _messages of contacts in roster" msgstr "Prikaži statusne _poruke kontakata na listi" -#: ../data/glade/preferences_window.glade.h:38 +#: ../data/glade/preferences_window.glade.h:40 msgid "Displayed Chat state noti_fications:" msgstr "Prikazane Noti_fikacije o statusu razgovora" -#: ../data/glade/preferences_window.glade.h:39 +#: ../data/glade/preferences_window.glade.h:41 msgid "E_very 5 minutes" msgstr "S_vakih 5 minuta" -#: ../data/glade/preferences_window.glade.h:40 +#: ../data/glade/preferences_window.glade.h:42 msgid "Emoticons:" msgstr "Emotikone:" -#: ../data/glade/preferences_window.glade.h:41 +#: ../data/glade/preferences_window.glade.h:43 msgid "Events" msgstr "Događaji" -#: ../data/glade/preferences_window.glade.h:42 +#: ../data/glade/preferences_window.glade.h:44 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 " @@ -1505,7 +1537,7 @@ msgstr "" "sa kontaktom. Ovdje možete odrediti koji statusi razgovora će se prikazati u " "prozorima razgovora." -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:45 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 " @@ -1515,13 +1547,12 @@ msgstr "" "sa kontaktom. Ovdje možete odrediti koji statusi razgovora će se slati " "drugoj osobi." -#: ../data/glade/preferences_window.glade.h:44 +#: ../data/glade/preferences_window.glade.h:46 msgid "" -"Gajim will automatically show new events by poping up the relative window" -msgstr "" -"Gajim će automatski prikazivati nove događaje iskačući sa bitnim prozorom" +"Gajim will automatically show new events by popping up the relevant window" +msgstr "Gajim će automatski prikazivati nove događaje prikazujući bitan prozor" -#: ../data/glade/preferences_window.glade.h:45 +#: ../data/glade/preferences_window.glade.h:47 msgid "" "Gajim will notify you for new events via a popup in the bottom right of the " "screen" @@ -1529,7 +1560,7 @@ msgstr "" "Gajim će vas obavijestiti o novim događajima sa popup prozorom u donjem " "desnom kutu ekrana" -#: ../data/glade/preferences_window.glade.h:46 +#: ../data/glade/preferences_window.glade.h:48 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed in" @@ -1537,7 +1568,7 @@ msgstr "" "Gajim će vas obavijestiti o kontaktima koji su se upravo prijavili sa popup " "prozorom u donjem desnom kutu ekrana" -#: ../data/glade/preferences_window.glade.h:47 +#: ../data/glade/preferences_window.glade.h:49 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1545,13 +1576,13 @@ msgstr "" "Gajim će vas obavijestiti o kontaktima koji su se upravo odjavili sa popup " "prozorom u donjem desnom kutu ekrana" -#: ../data/glade/preferences_window.glade.h:48 +#: ../data/glade/preferences_window.glade.h:50 msgid "" "Gajim will only change the icon of the contact that triggered the new event" msgstr "" "Gajim će mjenjati ikonu samo onom kontaktu koji je potaknuo novi događaj" -#: ../data/glade/preferences_window.glade.h:50 +#: ../data/glade/preferences_window.glade.h:52 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" @@ -1559,7 +1590,7 @@ msgstr "" "Ako je označeno, Gajim će ujedno uključiti i informacije o pošiljatelju " "novih emailova" -#: ../data/glade/preferences_window.glade.h:51 +#: ../data/glade/preferences_window.glade.h:53 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1567,7 +1598,7 @@ msgstr "" "Ako je označeno, Gajim će prikazivati avatare kontakata u listi kontakata i " "u grupnim razgovorima" -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:54 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -1575,7 +1606,7 @@ msgstr "" "Ako je označeno, Gajim će prikazivati statusne poruke kontakata ispod imena " "kontakta u listi kontakata i u grupnim razgovorima" -#: ../data/glade/preferences_window.glade.h:53 +#: ../data/glade/preferences_window.glade.h:55 msgid "" "If checked, Gajim will remember the roster and chat window positions in the " "screen and the sizes of them next time you run it" @@ -1583,7 +1614,7 @@ msgstr "" "Ako je označeno, Gajim će se prisjetiti pozicije prozora liste kontakata i " "razgovora, kao i njihove veličine kod sljedećeg pokretanja" -#: ../data/glade/preferences_window.glade.h:54 +#: ../data/glade/preferences_window.glade.h:56 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, " @@ -1592,7 +1623,7 @@ msgstr "" "Ako je označeno, Gajim će koristiti statusne ikone specifične za protokol. " "(npr. kontakt sa MSN-a će imati msn ikone za statuse)" -#: ../data/glade/preferences_window.glade.h:55 +#: ../data/glade/preferences_window.glade.h:57 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" @@ -1600,15 +1631,15 @@ msgstr "" "Ako nije onemogućeno, Gajim će zamjeniti ascii smajliće poput ':)' sa " "ekvivalentnim animiranim ili statičnim grafičkim emotikonama" -#: ../data/glade/preferences_window.glade.h:56 +#: ../data/glade/preferences_window.glade.h:58 msgid "Ignore rich content in incoming messages" msgstr "Ignoriraj bogati sadržaj u dolaznim porukama" -#: ../data/glade/preferences_window.glade.h:57 +#: ../data/glade/preferences_window.glade.h:59 msgid "Ma_nage..." msgstr "Po_desi" -#: ../data/glade/preferences_window.glade.h:58 +#: ../data/glade/preferences_window.glade.h:60 msgid "" "Never\n" "Always\n" @@ -1620,59 +1651,59 @@ msgstr "" "Ovisi o računu\n" "Ovisi o tipu" -#: ../data/glade/preferences_window.glade.h:62 +#: ../data/glade/preferences_window.glade.h:64 msgid "Notify me about contacts that: " msgstr "Obavijesti me o kontaktima koji:" -#: ../data/glade/preferences_window.glade.h:63 +#: ../data/glade/preferences_window.glade.h:65 msgid "Notify on new _GMail email" msgstr "Obavijesti o novoj _Gmail e-pošti" -#: ../data/glade/preferences_window.glade.h:64 +#: ../data/glade/preferences_window.glade.h:66 msgid "On every _message" msgstr "Na svaku _poruku" -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:67 msgid "One message _window:" msgstr "Prozor _jedne poruke:" -#: ../data/glade/preferences_window.glade.h:66 +#: ../data/glade/preferences_window.glade.h:68 msgid "Outgoing Chat state noti_fications:" msgstr "Noti_fikacije o statusu odlaznog razgovora" -#: ../data/glade/preferences_window.glade.h:67 +#: ../data/glade/preferences_window.glade.h:69 msgid "Play _sounds" msgstr "Sviraj _zvukove" -#: ../data/glade/preferences_window.glade.h:68 +#: ../data/glade/preferences_window.glade.h:70 msgid "Preferences" msgstr "Postavke" -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:71 msgid "Print time:" msgstr "Prikaz vremena:" -#: ../data/glade/preferences_window.glade.h:70 +#: ../data/glade/preferences_window.glade.h:72 msgid "Save _position and size for roster and chat windows" msgstr "Snimi _poziciju i veličinu za prozore liste kontakata i razgovora" -#: ../data/glade/preferences_window.glade.h:71 +#: ../data/glade/preferences_window.glade.h:73 msgid "Set status message to reflect currently playing _music track" msgstr "Postavi statusnu poruku da odražava trenutno svirajuću _glazbenu traku" -#: ../data/glade/preferences_window.glade.h:72 +#: ../data/glade/preferences_window.glade.h:74 msgid "Show only in _roster" msgstr "Prikaži samo u _listi kontakata" -#: ../data/glade/preferences_window.glade.h:73 +#: ../data/glade/preferences_window.glade.h:75 msgid "Sign _in" msgstr "Se _prijavi" -#: ../data/glade/preferences_window.glade.h:74 +#: ../data/glade/preferences_window.glade.h:76 msgid "Sign _out" msgstr "_Se odjavi" -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:77 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." @@ -1680,35 +1711,39 @@ msgstr "" "Neke poruke mogu uključivati bogati sadržaj (formatiranje, boje itd.) Ako je " "označeno, Gajim će samo prikazivati sirovi tekst poruke." -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:78 msgid "Status" msgstr "Status" -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:79 msgid "T_heme:" msgstr "_Tema:" -#: ../data/glade/preferences_window.glade.h:78 +#: ../data/glade/preferences_window.glade.h:80 msgid "The auto away status message" msgstr "Statusna poruka automatske odsutnosti" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:81 msgid "The auto not available status message" msgstr "Statusna poruka automatske ne dostupnosti" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:82 +msgid "Treat all incoming messages as:" +msgstr "Tretiraj sve dolazne poruke kao:" + +#: ../data/glade/preferences_window.glade.h:83 msgid "Use _transports iconsets" msgstr "Koristi set ikona _transporta" -#: ../data/glade/preferences_window.glade.h:81 +#: ../data/glade/preferences_window.glade.h:84 msgid "Use system _default" msgstr "Koristi pret_postavljeno od sustava" -#: ../data/glade/preferences_window.glade.h:82 +#: ../data/glade/preferences_window.glade.h:85 msgid "Use t_rayicon (aka. notification area icon)" msgstr "Koristi t_ray ikonu" -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:86 msgid "" "When a new event (message, file transfer request etc..) is received, the " "following methods may be used to inform you about it. Please note that " @@ -1720,11 +1755,11 @@ msgstr "" "obavijesti o novim porukama prikazuju samo za kontakte sa kojima trenutno ne " "razgovarate" -#: ../data/glade/preferences_window.glade.h:84 +#: ../data/glade/preferences_window.glade.h:87 msgid "When new event is received" msgstr "Kada se primi novi događaj" -#: ../data/glade/preferences_window.glade.h:85 +#: ../data/glade/preferences_window.glade.h:88 msgid "" "Works for Rhythmbox and Muine players. For more players, please visit http://" "trac.gajim.org/wiki/GajimAndMusicPlayer" @@ -1732,91 +1767,83 @@ msgstr "" "Radi sa Rhytmbox i Muine sviračima. Za više svirača, molimo posjetite http://" "trac.gajim.org/wiki/GajimAndMusicPlayer" -#: ../data/glade/preferences_window.glade.h:86 +#: ../data/glade/preferences_window.glade.h:89 msgid "_Advanced Notifications Control..." msgstr "_Napredno Upravljanje Obavijestima..." -#: ../data/glade/preferences_window.glade.h:87 -msgid "_After time:" -msgstr "_Nakon vremena:" - -#: ../data/glade/preferences_window.glade.h:88 -msgid "_Before time:" -msgstr "_Prije vremena:" - -#: ../data/glade/preferences_window.glade.h:89 +#: ../data/glade/preferences_window.glade.h:90 msgid "_Browser:" msgstr "_Pretražnik:" -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:91 msgid "_File manager:" msgstr "_Upravitelj datotekama:" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:92 msgid "_Font:" msgstr "_Font:" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:93 msgid "_Highlight misspelled words" msgstr "_Osvijetli krivo napisane riječi" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:94 msgid "_Ignore events from contacts not in the roster" msgstr "_Ignoriraj događaje od kontakata koji nisu na listi kontakata" -#: ../data/glade/preferences_window.glade.h:94 +#: ../data/glade/preferences_window.glade.h:95 msgid "_Incoming message:" msgstr "_Dolazna poruka:" -#: ../data/glade/preferences_window.glade.h:95 +#: ../data/glade/preferences_window.glade.h:96 msgid "_Log status changes of contacts" msgstr "_Pamti promjene statusa kontakata" -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:97 msgid "_Mail client:" msgstr "_Mail klijent:" -#: ../data/glade/preferences_window.glade.h:97 +#: ../data/glade/preferences_window.glade.h:98 msgid "_Never" msgstr "_Nikada" -#: ../data/glade/preferences_window.glade.h:98 +#: ../data/glade/preferences_window.glade.h:99 msgid "_Notify me about it" msgstr "_Obavijesti me o tome" -#: ../data/glade/preferences_window.glade.h:99 +#: ../data/glade/preferences_window.glade.h:100 msgid "_Open..." msgstr "_Otvori..." -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:101 msgid "_Outgoing message:" msgstr "_Odlazna poruka:" -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:102 msgid "_Player:" msgstr "_Player:" -#: ../data/glade/preferences_window.glade.h:102 +#: ../data/glade/preferences_window.glade.h:103 msgid "_Pop it up" msgstr "_Iskoči ga" -#: ../data/glade/preferences_window.glade.h:103 +#: ../data/glade/preferences_window.glade.h:104 msgid "_Reset to Default Colors" msgstr "_Ponovo učitavanje Pretpostavljenih Boja" -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:105 msgid "_Sort contacts by status" msgstr "_Sortiranje kontakata po statusu" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:106 msgid "_Status message:" msgstr "_Statusna poruka:" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:107 msgid "_URL:" msgstr "_URL:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:108 msgid "minutes" msgstr "minuta" @@ -1860,7 +1887,7 @@ msgstr "JabberID" msgid "Order:" msgstr "Poredak:" -#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:1841 +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2085 msgid "Privacy List" msgstr "Lista Privatnosti" @@ -1926,126 +1953,122 @@ msgid "City:" msgstr "Mjesto:" #: ../data/glade/profile_window.glade.h:7 -#: ../data/glade/vcard_information_window.glade.h:10 +msgid "Click to set your avatar" +msgstr "Kliknite za postavljanje avatara" + +#: ../data/glade/profile_window.glade.h:8 +#: ../data/glade/vcard_information_window.glade.h:11 msgid "Company:" msgstr "Poduzeće:" -#: ../data/glade/profile_window.glade.h:8 -#: ../data/glade/vcard_information_window.glade.h:13 +#: ../data/glade/profile_window.glade.h:9 +#: ../data/glade/vcard_information_window.glade.h:15 msgid "Country:" msgstr "Država:" -#: ../data/glade/profile_window.glade.h:9 -#: ../data/glade/vcard_information_window.glade.h:14 +#: ../data/glade/profile_window.glade.h:10 +#: ../data/glade/vcard_information_window.glade.h:16 msgid "Department:" msgstr "Odjel:" -#: ../data/glade/profile_window.glade.h:10 -#: ../data/glade/vcard_information_window.glade.h:15 +#: ../data/glade/profile_window.glade.h:11 +#: ../data/glade/vcard_information_window.glade.h:17 #: ../data/glade/zeroconf_information_window.glade.h:2 #: ../data/glade/zeroconf_properties_window.glade.h:5 msgid "E-Mail:" msgstr "E-Mail:" -#: ../data/glade/profile_window.glade.h:11 -#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/profile_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:18 msgid "Extra Address:" msgstr "Dodatna Adresa:" #. Family Name -#: ../data/glade/profile_window.glade.h:13 -#: ../data/glade/vcard_information_window.glade.h:18 +#: ../data/glade/profile_window.glade.h:14 +#: ../data/glade/vcard_information_window.glade.h:20 msgid "Family:" msgstr "Obitelj:" #. Do NOT change sequence. Just translate YYYY and MM and DD (from Year, Month, Day accordingly) -#: ../data/glade/profile_window.glade.h:15 -#: ../data/glade/vcard_information_window.glade.h:20 +#: ../data/glade/profile_window.glade.h:16 +#: ../data/glade/vcard_information_window.glade.h:22 msgid "Format: YYYY-MM-DD" msgstr "Format: GGGG-MM-DD" #. Given Name -#: ../data/glade/profile_window.glade.h:17 -#: ../data/glade/vcard_information_window.glade.h:22 +#: ../data/glade/profile_window.glade.h:18 +#: ../data/glade/vcard_information_window.glade.h:24 msgid "Given:" msgstr "Dano:" -#: ../data/glade/profile_window.glade.h:18 -#: ../data/glade/vcard_information_window.glade.h:23 +#: ../data/glade/profile_window.glade.h:19 +#: ../data/glade/vcard_information_window.glade.h:25 msgid "Homepage:" msgstr "Vlastita stranica:" #. Middle Name -#: ../data/glade/profile_window.glade.h:20 -#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/profile_window.glade.h:21 +#: ../data/glade/vcard_information_window.glade.h:28 msgid "Middle:" msgstr "Srednje" -#: ../data/glade/profile_window.glade.h:21 -#: ../data/glade/vcard_information_window.glade.h:27 +#: ../data/glade/profile_window.glade.h:22 +#: ../data/glade/vcard_information_window.glade.h:29 msgid "More" msgstr "Više" -#: ../data/glade/profile_window.glade.h:24 -#: ../data/glade/vcard_information_window.glade.h:31 +#: ../data/glade/profile_window.glade.h:25 +#: ../data/glade/vcard_information_window.glade.h:34 msgid "Personal Info" msgstr "Osobne Informacije" -#: ../data/glade/profile_window.glade.h:26 -#: ../data/glade/vcard_information_window.glade.h:32 +#: ../data/glade/profile_window.glade.h:27 +#: ../data/glade/vcard_information_window.glade.h:35 msgid "Phone No.:" msgstr "Broj Telefona:" -#: ../data/glade/profile_window.glade.h:27 -#: ../data/glade/vcard_information_window.glade.h:33 +#: ../data/glade/profile_window.glade.h:28 +#: ../data/glade/vcard_information_window.glade.h:36 msgid "Position:" msgstr "Pozicija:" -#: ../data/glade/profile_window.glade.h:28 -#: ../data/glade/vcard_information_window.glade.h:34 +#: ../data/glade/profile_window.glade.h:29 +#: ../data/glade/vcard_information_window.glade.h:37 msgid "Postal Code:" msgstr "Poštanski broj:" #. Prefix in Name -#: ../data/glade/profile_window.glade.h:30 -#: ../data/glade/vcard_information_window.glade.h:36 +#: ../data/glade/profile_window.glade.h:31 +#: ../data/glade/vcard_information_window.glade.h:39 msgid "Prefix:" msgstr "Prefiks:" -#: ../data/glade/profile_window.glade.h:31 -#: ../data/glade/vcard_information_window.glade.h:38 ../src/vcard.py:273 +#: ../data/glade/profile_window.glade.h:32 +#: ../data/glade/vcard_information_window.glade.h:41 ../src/vcard.py:382 msgid "Role:" msgstr "Uloga:" -#: ../data/glade/profile_window.glade.h:32 -#: ../data/glade/vcard_information_window.glade.h:39 +#: ../data/glade/profile_window.glade.h:33 +#: ../data/glade/vcard_information_window.glade.h:42 msgid "State:" msgstr "Država:" -#: ../data/glade/profile_window.glade.h:33 -#: ../data/glade/vcard_information_window.glade.h:41 +#: ../data/glade/profile_window.glade.h:34 +#: ../data/glade/vcard_information_window.glade.h:44 msgid "Street:" msgstr "Ulica:" #. Suffix in Name -#: ../data/glade/profile_window.glade.h:35 -#: ../data/glade/vcard_information_window.glade.h:45 +#: ../data/glade/profile_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:48 msgid "Suffix:" msgstr "Sufiks:" -#: ../data/glade/profile_window.glade.h:36 -#: ../data/glade/vcard_information_window.glade.h:46 +#: ../data/glade/profile_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:50 msgid "Work" msgstr "Posao" -#: ../data/glade/profile_window.glade.h:37 -msgid "_Publish" -msgstr "_Objava" - -#: ../data/glade/profile_window.glade.h:38 -msgid "_Retrieve" -msgstr "_Dohvati" - #: ../data/glade/remove_account_window.glade.h:1 msgid "What do you want to do?" msgstr "Što želite učiniti?" @@ -2068,61 +2091,84 @@ msgid "Add Special _Notification" msgstr "Dodaj Posebnu _Obavijest" #: ../data/glade/roster_contact_context_menu.glade.h:3 +msgid "Assign Custom _Avatar" +msgstr "" + +#: ../data/glade/roster_contact_context_menu.glade.h:4 #: ../data/glade/zeroconf_contact_context_menu.glade.h:2 msgid "Assign Open_PGP Key" msgstr "Pridruži Open_PGP Ključ" -#: ../data/glade/roster_contact_context_menu.glade.h:4 +#: ../data/glade/roster_contact_context_menu.glade.h:5 #: ../data/glade/zeroconf_contact_context_menu.glade.h:3 -#: ../src/roster_window.py:1993 +#: ../src/roster_window.py:2357 msgid "Edit _Groups" msgstr "Izmjeni _Grupe" -#: ../data/glade/roster_contact_context_menu.glade.h:5 -#: ../src/roster_window.py:2128 +#: ../data/glade/roster_contact_context_menu.glade.h:6 +#: ../src/roster_window.py:2593 msgid "Execute Command..." msgstr "Izvršiti Naredbu..." -#: ../data/glade/roster_contact_context_menu.glade.h:6 -#: ../src/roster_window.py:1951 +#: ../data/glade/roster_contact_context_menu.glade.h:7 +#: ../src/roster_window.py:2315 msgid "In_vite to" msgstr "Pozo_vi u" -#: ../data/glade/roster_contact_context_menu.glade.h:7 +#: ../data/glade/roster_contact_context_menu.glade.h:8 #: ../data/glade/systray_context_menu.glade.h:2 msgid "Send Single _Message" msgstr "Pošalji Jednu _Poruku" -#: ../data/glade/roster_contact_context_menu.glade.h:9 +#: ../data/glade/roster_contact_context_menu.glade.h:10 +msgid "Send cus_tom status" +msgstr "Pošalji prilagođeni status" + +#: ../data/glade/roster_contact_context_menu.glade.h:11 #: ../data/glade/zeroconf_contact_context_menu.glade.h:5 msgid "Start _Chat" msgstr "Započni _Razgovor" -#: ../data/glade/roster_contact_context_menu.glade.h:11 +#: ../data/glade/roster_contact_context_menu.glade.h:13 msgid "_Allow him/her to see my status" msgstr "_Dozvoli njemu/njoj da vidi moj status" -#: ../data/glade/roster_contact_context_menu.glade.h:12 +#: ../data/glade/roster_contact_context_menu.glade.h:14 +#: ../src/roster_window.py:2381 ../src/roster_window.py:2540 +msgid "_Block" +msgstr "_Blokiraj" + +#: ../data/glade/roster_contact_context_menu.glade.h:15 msgid "_Forbid him/her to see my status" msgstr "_Zabrani mu/joj da vidi moj status" +#: ../data/glade/roster_contact_context_menu.glade.h:17 +#, fuzzy +msgid "_Manage contact" +msgstr "Podešavanje Računa" + #. Remove group -#: ../data/glade/roster_contact_context_menu.glade.h:14 -#: ../src/roster_window.py:1945 ../src/roster_window.py:2042 -#: ../src/roster_window.py:2149 +#: ../data/glade/roster_contact_context_menu.glade.h:18 +#: ../src/roster_window.py:2309 ../src/roster_window.py:2466 +#: ../src/roster_window.py:2614 msgid "_Remove from Roster" msgstr "_Ukloni sa Liste kontakata" -#: ../data/glade/roster_contact_context_menu.glade.h:15 +#: ../data/glade/roster_contact_context_menu.glade.h:19 #: ../data/glade/zeroconf_contact_context_menu.glade.h:7 -#: ../src/roster_window.py:2137 +#: ../src/roster_window.py:2602 msgid "_Rename" msgstr "_Preimenuj" -#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/roster_contact_context_menu.glade.h:20 msgid "_Subscription" msgstr "_Pretplata" +#: ../data/glade/roster_contact_context_menu.glade.h:21 +#: ../src/roster_window.py:2375 ../src/roster_window.py:2534 +msgid "_Unblock" +msgstr "_Odblokiraj" + #: ../data/glade/roster_window.glade.h:1 msgid "A_ccounts" msgstr "Korisnički računi" @@ -2163,8 +2209,8 @@ msgstr "_Sadržaj" msgid "_Discover Services" msgstr "_Otkrivanje Usluga" -#: ../data/glade/roster_window.glade.h:14 ../src/disco.py:1256 -#: ../src/roster_window.py:2120 +#: ../data/glade/roster_window.glade.h:14 ../src/disco.py:1353 +#: ../src/roster_window.py:2585 msgid "_Edit" msgstr "_Uredi" @@ -2257,11 +2303,13 @@ msgid "Au_thorize" msgstr "_Odobri" #: ../data/glade/subscription_request_window.glade.h:2 -msgid "Authorize contact so he can know when you're connected" +msgid "Authorize contact so he or she can know when you're connected" msgstr "Dozvoli kontaktu da može vidjeti kada sam spojen" #: ../data/glade/subscription_request_window.glade.h:3 -msgid "Deny authorization from contact so he cannot know when you're connected" +msgid "" +"Deny authorization from contact so he or she cannot know when you're " +"connected" msgstr "Odbija autorizaciju kontaktu kako nebi mogao vidjeti kada ste spojeni" #: ../data/glade/subscription_request_window.glade.h:4 @@ -2294,51 +2342,58 @@ msgid "Ask:" msgstr "Pitaj:" #: ../data/glade/vcard_information_window.glade.h:8 +msgid "Click to force avatar" +msgstr "Kliknite za prisilno postavljanje avatara" + +#: ../data/glade/vcard_information_window.glade.h:9 msgid "Client:" msgstr "Klijent:" -#: ../data/glade/vcard_information_window.glade.h:9 +#: ../data/glade/vcard_information_window.glade.h:10 msgid "Comments" msgstr "Komentari" -#: ../data/glade/vcard_information_window.glade.h:11 +#: ../data/glade/vcard_information_window.glade.h:12 +msgid "Configured avatar:" +msgstr "Podešeni avatar:" + +#: ../data/glade/vcard_information_window.glade.h:13 #: ../data/glade/zeroconf_information_window.glade.h:1 msgid "Contact" msgstr "Kontakt" -#: ../data/glade/vcard_information_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:14 msgid "Contact Information" msgstr "Informacije Kontakta" -#: ../data/glade/vcard_information_window.glade.h:24 +#: ../data/glade/vcard_information_window.glade.h:26 #: ../data/glade/zeroconf_information_window.glade.h:4 -#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:416 +#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:442 msgid "Jabber ID:" msgstr "Jabber ID:" -#: ../data/glade/vcard_information_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:33 msgid "OS:" msgstr "OS:" -#: ../data/glade/vcard_information_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:40 #: ../data/glade/zeroconf_information_window.glade.h:8 msgid "Resource:" msgstr "Resurs" -#: ../data/glade/vcard_information_window.glade.h:40 +#: ../data/glade/vcard_information_window.glade.h:43 #: ../data/glade/zeroconf_information_window.glade.h:9 msgid "Status:" msgstr "Status:" #. Family Name -#: ../data/glade/vcard_information_window.glade.h:43 +#: ../data/glade/vcard_information_window.glade.h:46 msgid "Subscription:" msgstr "Pretplata:" -#: ../data/glade/vcard_information_window.glade.h:47 -#: ../data/glade/zeroconf_information_window.glade.h:10 -msgid "_Log conversation history" -msgstr "_Pamti povijest razgovora" +#: ../data/glade/vcard_information_window.glade.h:49 +msgid "User avatar:" +msgstr "Korisnički Avatar:" #: ../data/glade/xml_console_window.glade.h:1 msgid "Jabber Traffic" @@ -2397,7 +2452,7 @@ msgid "" msgstr "" "Ako je pretpostavljeni port koji se koristi za dolazne poruke neprikladan za " "vaše postavke, ovdje možete odabrati neki drugi.\n" -"Mogli biste uzeti u obzir mogućnost izmjene postavki vatrozida." +"Mogli bi ste uzeti u obzir mogućnost izmjene postavki vatrozida." #: ../data/glade/zeroconf_properties_window.glade.h:15 msgid "Modify Account" @@ -2407,25 +2462,50 @@ msgstr "Izmjeni Račun" msgid "Use custom port:" msgstr "Koristi vlastiti port:" -#: ../src/advanced.py:57 +#. For i18n +#: ../src/advanced.py:51 +msgid "Activated" +msgstr "Aktivno" + +#: ../src/advanced.py:51 +msgid "Deactivated" +msgstr "Neaktivno" + +#: ../src/advanced.py:53 +msgid "Boolean" +msgstr "Boolean" + +#: ../src/advanced.py:54 +msgid "Integer" +msgstr "Cijeli broj" + +#: ../src/advanced.py:55 +msgid "Text" +msgstr "Tekst" + +#: ../src/advanced.py:56 +msgid "Color" +msgstr "Boja" + +#: ../src/advanced.py:65 msgid "Preference Name" msgstr "Ime Postavke" -#: ../src/advanced.py:63 +#: ../src/advanced.py:71 msgid "Value" msgstr "Vrijednost" -#: ../src/advanced.py:72 +#: ../src/advanced.py:79 msgid "Type" msgstr "Vrsta" #. we talk about option description in advanced configuration editor -#: ../src/advanced.py:128 +#: ../src/advanced.py:136 msgid "(None)" msgstr "(Nema)" #. we talk about password -#: ../src/advanced.py:227 +#: ../src/advanced.py:239 msgid "Hidden" msgstr "Skrivena" @@ -2438,13 +2518,17 @@ msgstr "Skrivena" msgid "English" msgstr "Engleski" +#: ../src/chat_control.py:52 +msgid "Belarusian" +msgstr "Bjeloruski" + #: ../src/chat_control.py:52 msgid "Bulgarian" msgstr "Bugarski" #: ../src/chat_control.py:52 -msgid "Briton" -msgstr "Britanski" +msgid "Breton" +msgstr "Bretonski" #: ../src/chat_control.py:52 msgid "Czech" @@ -2458,6 +2542,10 @@ msgstr "Njemački" msgid "Greek" msgstr "Grčki" +#: ../src/chat_control.py:52 +msgid "British" +msgstr "Britanski" + #: ../src/chat_control.py:52 msgid "Esperanto" msgstr "Esperanto" @@ -2467,7 +2555,7 @@ msgid "Spanish" msgstr "Španjolski" #: ../src/chat_control.py:52 -msgid "Basc" +msgid "Basque" msgstr "Baskijski" #: ../src/chat_control.py:52 @@ -2483,15 +2571,15 @@ msgid "Italian" msgstr "Talijanski" #: ../src/chat_control.py:52 -msgid "Norvegian b" -msgstr "Norveški b" +msgid "Norwegian (b)" +msgstr "Norveški (b)" #: ../src/chat_control.py:52 msgid "Dutch" msgstr "Nizozemski" #: ../src/chat_control.py:52 -msgid "Norvegian" +msgid "Norwegian" msgstr "Norveški" #: ../src/chat_control.py:52 @@ -2510,6 +2598,10 @@ msgstr "Brazilski Portugalski" msgid "Russian" msgstr "Ruski" +#: ../src/chat_control.py:52 +msgid "Serbian" +msgstr "Srpski" + #: ../src/chat_control.py:52 msgid "Slovak" msgstr "Slovački" @@ -2522,78 +2614,78 @@ msgstr "Švedski" msgid "Chinese (Ch)" msgstr "Kineski (Ch)" -#: ../src/chat_control.py:201 ../src/dialogs.py:1497 -msgid "" -"If that is not your language for which you want to highlight misspelled " -"words, then please set your $LANG as appropriate. Eg. for French do export " -"LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to make it " -"global in /etc/profile.\n" -"\n" -"Highlighting misspelled words feature will not be used" -msgstr "" -"Ako to nije vaš jezik za koji želite osvjetliti krivo napisane riječi, " -"molimo podesite $LANG varijablu na odgovarajuću vrijednost. Npr. za " -"francuski napravite export LANG=fr_FR ili export LANG=fr_FR.UTF-8 u ~/." -"bash_profile ili kako bi bilo globalno u /etc/profile.\n" -"\n" -"Mogućnost osvjetljavanja krivo napisanih riječi neće biti korištena" - -#: ../src/chat_control.py:239 +#: ../src/chat_control.py:244 msgid "Spelling language" msgstr "Jezik pravopisa" #. we are not connected -#: ../src/chat_control.py:262 ../src/chat_control.py:468 +#: ../src/chat_control.py:267 ../src/chat_control.py:473 msgid "A connection is not available" msgstr "Veza nije dostupna" -#: ../src/chat_control.py:263 ../src/chat_control.py:469 +#: ../src/chat_control.py:268 ../src/chat_control.py:474 msgid "Your message can not be sent until you are connected." msgstr "Vaša poruka ne može biti poslana dok niste spojeni." -#: ../src/chat_control.py:844 -msgid "Chats" -msgstr "Razgovori" - -#: ../src/chat_control.py:1030 +#: ../src/chat_control.py:1092 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s iz grupnog razgovora %(room_name)s" #. we talk about a contact here -#: ../src/chat_control.py:1118 +#: ../src/chat_control.py:1181 #, python-format msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" msgstr "%s nije ustupio OpenPGP ključ, niti mu je ikoji dodijeljen" -#: ../src/chat_control.py:1254 +#: ../src/chat_control.py:1215 ../src/groupchat_control.py:1337 +#, python-format +msgid "Commands: %s" +msgstr "Komanda: %s" + +#: ../src/chat_control.py:1218 ../src/groupchat_control.py:1351 +#, python-format +msgid "Usage: /%s, clears the text window." +msgstr "Način korištenja: /%s, prazni tekstualni prozor" + +#: ../src/chat_control.py:1221 ../src/groupchat_control.py:1356 +#, python-format +msgid "Usage: /%s, hide the chat buttons." +msgstr "Način korištenja: /%s, sakriva dugmadi." + +#: ../src/chat_control.py:1226 ../src/groupchat_control.py:1395 +#, python-format +msgid "No help info for /%s" +msgstr "Nema informacija ni pomoći za /%s" + +#: ../src/chat_control.py:1356 msgid "Encryption enabled" msgstr "Enkripcija omogućena" -#: ../src/chat_control.py:1259 +#: ../src/chat_control.py:1361 msgid "Encryption disabled" msgstr "Enkripcija onemogućena" #. add_to_roster_menuitem -#: ../src/chat_control.py:1401 ../src/conversation_textview.py:495 -#: ../src/dialogs.py:629 ../src/gajim.py:781 ../src/gajim.py:782 -#: ../src/gajim.py:1121 ../src/roster_window.py:328 -#: ../src/roster_window.py:404 ../src/roster_window.py:1638 -#: ../src/roster_window.py:1819 ../src/roster_window.py:2392 -#: ../src/roster_window.py:2596 ../src/roster_window.py:2607 -#: ../src/roster_window.py:3832 ../src/roster_window.py:3834 -#: ../src/common/contacts.py:73 ../src/common/helpers.py:42 -#: ../src/common/helpers.py:246 +#: ../src/chat_control.py:1505 ../src/conversation_textview.py:501 +#: ../src/dialogs.py:655 ../src/gajim.py:862 ../src/gajim.py:863 +#: ../src/gajim.py:1254 ../src/roster_window.py:335 +#: ../src/roster_window.py:417 ../src/roster_window.py:1739 +#: ../src/roster_window.py:1749 ../src/roster_window.py:1928 +#: ../src/roster_window.py:2152 ../src/roster_window.py:2857 +#: ../src/roster_window.py:3064 ../src/roster_window.py:4362 +#: ../src/roster_window.py:4364 ../src/common/contacts.py:76 +#: ../src/common/helpers.py:43 ../src/common/helpers.py:255 msgid "Not in Roster" msgstr "Nije na Listi Kontakata" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:1545 +#: ../src/chat_control.py:1649 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Upravo ste primili novu poruku od \"%s\"" -#: ../src/chat_control.py:1546 +#: ../src/chat_control.py:1650 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." @@ -2601,277 +2693,278 @@ msgstr "" "Ako zatvorite ovaj tab, a imate povijest onemogućenu, ova poruka biti će " "izgubljena." -#: ../src/config.py:135 ../src/config.py:594 +#: ../src/config.py:139 ../src/config.py:588 msgid "Disabled" msgstr "Onemogućeno" -#: ../src/config.py:221 +#: ../src/config.py:233 #, python-format msgid "Every %s _minutes" msgstr "Svakih %s _minuta" -#: ../src/config.py:363 +#: ../src/config.py:353 msgid "Active" msgstr "Aktivno" -#: ../src/config.py:371 +#: ../src/config.py:361 msgid "Event" msgstr "Događaj" -#: ../src/config.py:685 ../src/gajim.py:2142 +#: ../src/config.py:684 ../src/dialogs.py:941 #, python-format msgid "Dictionary for lang %s not available" msgstr "Riječnik za jezik %s nije dostupan" -#: ../src/config.py:686 ../src/gajim.py:2143 +#: ../src/config.py:685 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " "language by setting the speller_language option." msgstr "" -"Morate instalirati %s rječnik kako biste mogli koristiti provjeru pravopisa, " -"ili odaberite drugi jezik postavkom odabira speller_language opcije." +"Morate instalirati %s rječnik kako bi ste mogli koristiti provjeru " +"pravopisa, ili odaberite drugi jezik postavkom odabira speller_language " +"opcije." -#: ../src/config.py:1038 +#: ../src/config.py:1008 msgid "status message title" msgstr "naslov statusne poruke" -#: ../src/config.py:1038 +#: ../src/config.py:1008 msgid "status message text" msgstr "tekst statusne poruke" -#: ../src/config.py:1073 +#: ../src/config.py:1044 msgid "First Message Received" msgstr "Prva Poruka Primljena" -#: ../src/config.py:1074 +#: ../src/config.py:1045 msgid "Next Message Received" msgstr "Sljedeća Poruka Primljena" -#: ../src/config.py:1075 +#: ../src/config.py:1046 msgid "Contact Connected" msgstr "Kontakt Spojen" -#: ../src/config.py:1076 +#: ../src/config.py:1047 msgid "Contact Disconnected" msgstr "Kontakt Odspojen" -#: ../src/config.py:1077 +#: ../src/config.py:1048 msgid "Message Sent" msgstr "Poruka Poslana" -#: ../src/config.py:1078 +#: ../src/config.py:1049 msgid "Group Chat Message Highlight" msgstr "Označavanje Poruke Grupnog Razgovora" -#: ../src/config.py:1079 +#: ../src/config.py:1050 msgid "Group Chat Message Received" msgstr "Primljena Poruka Grupnog Razgovora" -#: ../src/config.py:1086 +#: ../src/config.py:1057 msgid "GMail Email Received" msgstr "Primljen Gmail Email" -#: ../src/config.py:1289 +#: ../src/config.py:1260 msgid "OpenPGP is not usable in this computer" msgstr "OpenPGP nije moguće koristiti na ovom računalu" -#: ../src/config.py:1335 +#: ../src/config.py:1306 msgid "You are currently connected to the server" msgstr "Trenutno ste spojeni na poslužitelj" -#: ../src/config.py:1336 +#: ../src/config.py:1307 msgid "To change the account name, you must be disconnected." msgstr "Za promjenu imena računa morate se odspojiti." -#: ../src/config.py:1339 ../src/config.py:1931 +#: ../src/config.py:1310 ../src/config.py:1916 msgid "Unread events" msgstr "Nepročitani događaji" -#: ../src/config.py:1340 +#: ../src/config.py:1311 msgid "To change the account name, you must read all pending events." msgstr "" -"Da biste mogli promjeniti ime računa, morate pročitati sve čekajuće događaje" +"Da bi ste mogli promjeniti ime računa, morate pročitati sve čekajuće događaje" -#: ../src/config.py:1344 +#: ../src/config.py:1315 msgid "Account Name Already Used" msgstr "Ime Računa Već Upotrebljeno" -#: ../src/config.py:1345 +#: ../src/config.py:1316 msgid "" "This name is already used by another of your accounts. Please choose another " "name." msgstr "Ovo ime već koristi vaš drugi račun. Molimo odaberite drugo ime." -#: ../src/config.py:1349 ../src/config.py:1353 +#: ../src/config.py:1320 ../src/config.py:1324 msgid "Invalid account name" msgstr "Neispravno ime računa" -#: ../src/config.py:1350 +#: ../src/config.py:1321 msgid "Account name cannot be empty." msgstr "Ime računa ne može biti prazno." -#: ../src/config.py:1354 +#: ../src/config.py:1325 msgid "Account name cannot contain spaces." msgstr "Ime računa ne može sadržavati razmake." -#: ../src/config.py:1362 ../src/config.py:1368 ../src/config.py:1378 -#: ../src/config.py:3036 +#: ../src/config.py:1333 ../src/config.py:1339 ../src/config.py:1349 +#: ../src/config.py:2897 msgid "Invalid Jabber ID" msgstr "Neispravan Jabber ID" -#: ../src/config.py:1369 +#: ../src/config.py:1340 msgid "A Jabber ID must be in the form \"user@servername\"." msgstr "Jabber ID mora biti forme \"korisnik@poslužitelj\"." -#: ../src/config.py:1428 +#: ../src/config.py:1399 ../src/config.py:2968 msgid "Invalid entry" msgstr "Neispravan unos" -#: ../src/config.py:1429 +#: ../src/config.py:1400 ../src/config.py:2969 msgid "Custom port must be a port number." msgstr "Osobni port mora biti broj porta." -#: ../src/config.py:1555 ../src/common/config.py:363 +#: ../src/config.py:1528 ../src/common/config.py:370 msgid "Be right back." msgstr "Odmah se vraćam." -#: ../src/config.py:1565 +#: ../src/config.py:1538 msgid "Relogin now?" msgstr "Prijaviti se odmah?" -#: ../src/config.py:1566 +#: ../src/config.py:1539 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "" "Ako želite da se sve promjene odmah primjene, morate se ponovo prijaviti." -#: ../src/config.py:1592 +#: ../src/config.py:1565 msgid "No such account available" msgstr "Takav račun nije dostupan" -#: ../src/config.py:1593 +#: ../src/config.py:1566 msgid "You must create your account before editing your personal information." msgstr "Morate napravit svoj račun prije izmjena osobnih informacija." -#: ../src/config.py:1600 ../src/dialogs.py:1128 ../src/dialogs.py:1297 -#: ../src/disco.py:417 ../src/profile_window.py:307 -#: ../src/profile_window.py:373 +#: ../src/config.py:1573 ../src/dialogs.py:1225 ../src/dialogs.py:1361 +#: ../src/dialogs.py:1541 ../src/disco.py:420 ../src/profile_window.py:329 msgid "You are not connected to the server" msgstr "Niste spojeni na poslužitelj." -#: ../src/config.py:1601 +#: ../src/config.py:1574 msgid "Without a connection, you can not edit your personal information." msgstr "Bez veze sa poslužiteljom nije moguća izmjena osobnih informacija." -#: ../src/config.py:1605 +#: ../src/config.py:1578 msgid "Your server doesn't support Vcard" msgstr "Vaš poslužitelj ne podržava Vcard" -#: ../src/config.py:1606 +#: ../src/config.py:1579 msgid "Your server can't save your personal information." msgstr "Vaš poslužitelj nije u mogućnosti spremiti vaše osobne informacije." -#: ../src/config.py:1630 ../src/config.py:3423 +#: ../src/config.py:1610 ../src/config.py:3400 msgid "Failed to get secret keys" msgstr "Neuspješno dohvaćanje tajnih ključeva" -#: ../src/config.py:1631 ../src/config.py:3424 +#: ../src/config.py:1611 ../src/config.py:3401 msgid "There was a problem retrieving your OpenPGP secret keys." msgstr "Došlo je do problema pri dohvaćanju vaših OpenPGP tajnih ključeva." -#: ../src/config.py:1634 ../src/config.py:3427 +#: ../src/config.py:1614 ../src/config.py:3404 msgid "OpenPGP Key Selection" msgstr "Odabir OpenPGP Ključeva" -#: ../src/config.py:1635 ../src/config.py:3428 +#: ../src/config.py:1615 ../src/config.py:3405 msgid "Choose your OpenPGP key" msgstr "Odaberite svoj OpenPGP ključ" #. Name column -#: ../src/config.py:1865 ../src/disco.py:741 ../src/disco.py:1467 -#: ../src/disco.py:1705 ../src/history_window.py:78 +#: ../src/config.py:1850 ../src/dialogs.py:1373 ../src/dialogs.py:1437 +#: ../src/disco.py:741 ../src/disco.py:1564 ../src/disco.py:1802 +#: ../src/history_window.py:78 msgid "Name" msgstr "Ime" -#: ../src/config.py:1868 +#: ../src/config.py:1853 ../src/dialogs.py:1376 msgid "Server" msgstr "Poslužitelj" -#: ../src/config.py:1932 +#: ../src/config.py:1917 msgid "Read all pending events before removing this account." msgstr "Pročitajte sve događaje na čekanju prije uklanjanja ovog računa." -#: ../src/config.py:1969 +#: ../src/config.py:1954 #, python-format msgid "You have opened chat in account %s" msgstr "Otvorili ste razgovor u računu %s" -#: ../src/config.py:1970 +#: ../src/config.py:1955 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "" "Prozori svih razgovora i grupnih razgovora biti će zatvoreni. Želite li " "nastaviti?" -#: ../src/config.py:2029 +#: ../src/config.py:2014 msgid "Account Local already exists." msgstr "Račun Lokalno već postoji." -#: ../src/config.py:2030 +#: ../src/config.py:2015 msgid "Please rename or remove it before enabling link-local messaging." msgstr "" "Molimo uklonite ili preimenujte prije omogućivanja poruka lokalne veze." -#: ../src/config.py:2262 +#: ../src/config.py:2153 #, python-format msgid "Edit %s" msgstr "Izmjena %s" -#: ../src/config.py:2264 +#: ../src/config.py:2155 #, python-format msgid "Register to %s" msgstr "Registrirati se na %s" -#. list at the begining -#: ../src/config.py:2336 +#. list at the beginning +#: ../src/config.py:2191 msgid "Ban List" msgstr "Ban Lista" -#: ../src/config.py:2337 +#: ../src/config.py:2192 msgid "Member List" msgstr "Lista Članova" -#: ../src/config.py:2338 +#: ../src/config.py:2193 msgid "Owner List" msgstr "Lista Vasnika" -#: ../src/config.py:2339 +#: ../src/config.py:2194 msgid "Administrator List" msgstr "Lista Administratora" #. Address column #. holds JID (who said this) -#: ../src/config.py:2372 ../src/disco.py:748 ../src/history_manager.py:154 +#: ../src/config.py:2243 ../src/disco.py:748 ../src/history_manager.py:155 msgid "JID" msgstr "JID" -#: ../src/config.py:2380 +#: ../src/config.py:2251 msgid "Reason" msgstr "Razlog" -#: ../src/config.py:2385 +#: ../src/config.py:2256 msgid "Nick" msgstr "Nadimak" -#: ../src/config.py:2389 +#: ../src/config.py:2260 msgid "Role" msgstr "Uloga" -#: ../src/config.py:2410 +#: ../src/config.py:2285 msgid "Banning..." msgstr "Zabranjivanje..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2412 +#: ../src/config.py:2287 msgid "" "Whom do you want to ban?\n" "\n" @@ -2879,11 +2972,11 @@ msgstr "" "Koga želite zabraniti?\n" "\n" -#: ../src/config.py:2414 +#: ../src/config.py:2289 msgid "Adding Member..." msgstr "Dodaja Člana..." -#: ../src/config.py:2415 +#: ../src/config.py:2290 msgid "" "Whom do you want to make a member?\n" "\n" @@ -2891,23 +2984,23 @@ msgstr "" "Koga želite učiniti članom?\n" "\n" -#: ../src/config.py:2417 +#: ../src/config.py:2292 msgid "Adding Owner..." msgstr "Dodavanje Vlasnika..." -#: ../src/config.py:2418 +#: ../src/config.py:2293 msgid "" -"Whom do you want to make a owner?\n" +"Whom do you want to make an owner?\n" "\n" msgstr "" "Koga želite učiniti vlasnikom?\n" "\n" -#: ../src/config.py:2420 +#: ../src/config.py:2295 msgid "Adding Administrator..." msgstr "Dodajem Administratora..." -#: ../src/config.py:2421 +#: ../src/config.py:2296 msgid "" "Whom do you want to make an administrator?\n" "\n" @@ -2915,7 +3008,7 @@ msgstr "" "Koga želite učiniti administratorom?\n" "\n" -#: ../src/config.py:2422 +#: ../src/config.py:2297 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" @@ -2931,121 +3024,120 @@ msgstr "" "4. domena (sama domena se poklapa, kao i bilo koji korisnik@domena,\n" "domena/resurs, ili adresa koja sadrži poddomenu." -#: ../src/config.py:2527 +#: ../src/config.py:2401 #, python-format msgid "Removing %s account" msgstr "Uklanjanje %s računa" -#: ../src/config.py:2544 ../src/roster_window.py:2665 +#: ../src/config.py:2418 ../src/roster_window.py:3123 msgid "Password Required" msgstr "Potrebna Lozinka" -#: ../src/config.py:2545 ../src/roster_window.py:2666 +#: ../src/config.py:2419 ../src/roster_window.py:3119 #, python-format msgid "Enter your password for account %s" msgstr "Unesite svoju lozinku za račun %s" -#: ../src/config.py:2546 ../src/roster_window.py:2667 +#: ../src/config.py:2420 ../src/roster_window.py:3124 msgid "Save password" msgstr "Spremiti lozinku" -#: ../src/config.py:2560 +#: ../src/config.py:2434 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Račun \"%s\" je spojen na poslužitelj" -#: ../src/config.py:2561 +#: ../src/config.py:2435 msgid "If you remove it, the connection will be lost." msgstr "Ukoliko ga uklonite, veza će biti izgubljena." -#: ../src/config.py:2645 +#: ../src/config.py:2520 msgid "Default" msgstr "Predefinirano" -#: ../src/config.py:2645 +#: ../src/config.py:2520 msgid "?print_status:All" msgstr "?ispis_statusa:Sve" -#: ../src/config.py:2646 +#: ../src/config.py:2521 msgid "Enter and leave only" msgstr "Ući i samo napustiti" -#: ../src/config.py:2716 +#: ../src/config.py:2522 +msgid "?print_status:None" +msgstr "?ispis_statusa:Ništa" + +#: ../src/config.py:2590 msgid "New Group Chat" msgstr "Novi Grupni Razgovor" -#: ../src/config.py:2748 +#: ../src/config.py:2623 msgid "This bookmark has invalid data" msgstr "Ova knjižna oznaka ima neispravne podatke" -#: ../src/config.py:2749 +#: ../src/config.py:2624 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" "Molimo obavezno ispunite polja poslužitelja i sobe ili uklonite ovu kljižnu " "oznaku." -#: ../src/config.py:3011 +#: ../src/config.py:2880 msgid "Invalid username" msgstr "Neispravno korisničko ime" -#: ../src/config.py:3012 +#: ../src/config.py:2882 msgid "You must provide a username to configure this account." msgstr "Morate ponuditi korisničko ime za postavke ovog računa." -#: ../src/config.py:3022 ../src/dialogs.py:1316 -msgid "Invalid password" -msgstr "Neispravna lozinka" - -#: ../src/config.py:3023 -msgid "You must enter a password for the new account." -msgstr "Morate unesti lozinku za novi račun" - -#: ../src/config.py:3027 ../src/dialogs.py:1321 -msgid "Passwords do not match" -msgstr "Lozinke se ne podudaraju" - -#: ../src/config.py:3028 ../src/dialogs.py:1322 -msgid "The passwords typed in both fields must be identical." -msgstr "Lozinke upisane u oba polja moraju biti identične." - -#: ../src/config.py:3047 +#: ../src/config.py:2908 msgid "Duplicate Jabber ID" msgstr "Dvostruki Jabber ID" -#: ../src/config.py:3048 +#: ../src/config.py:2909 msgid "This account is already configured in Gajim." msgstr "Ovaj račun je već konfiguriran u Gajimu." -#: ../src/config.py:3065 +#: ../src/config.py:2926 msgid "Account has been added successfully" msgstr "Račun je uspješno dodan" -#: ../src/config.py:3066 ../src/config.py:3101 +#: ../src/config.py:2927 ../src/config.py:3071 msgid "" -"You can set advanced account options by pressing Advanced button, or later " -"by clicking in Accounts menuitem under Edit menu from the main window." +"You can set advanced account options by pressing the Advanced button, or " +"later by choosing the Accounts menuitem under the Edit menu from the main " +"window." msgstr "" "Napredne opcije računa možete podesiti pritiskom na gumb Napredno, ili " "kasnije klikom na element Računi pod izbornikom Uredi iz glavnog prozora." -#: ../src/config.py:3100 +#: ../src/config.py:2944 +#, fuzzy +msgid "Invalid server" +msgstr "Neispravno korisničko ime" + +#: ../src/config.py:2945 +#, fuzzy +msgid "Please provide a server on which you want to register." +msgstr "Molimo specificirajte novi nadimak ako ga želite koristiti:" + +#: ../src/config.py:3050 ../src/config.py:3088 +msgid "An error occurred during account creation" +msgstr "Pojavila se greška pri stvaranju računa" + +#: ../src/config.py:3070 msgid "Your new account has been created successfully" msgstr "Vaš novi račun je uspješno stvoren" -#: ../src/config.py:3118 -msgid "An error occured during account creation" -msgstr "Pojavila se greška pri stvaranju računa" - -#: ../src/config.py:3176 +#: ../src/config.py:3170 msgid "Account name is in use" msgstr "Ime računa se već koristi" -#: ../src/config.py:3177 +#: ../src/config.py:3171 msgid "You already have an account using this name." msgstr "Već imate račun pod tim imenom." -#: ../src/conversation_textview.py:273 +#: ../src/conversation_textview.py:279 msgid "" "Text below this line is what has been said since the last time you paid " "attention to this group chat" @@ -3053,182 +3145,182 @@ msgstr "" "Tekst niže od ove linije je ono što je rečeno od kad ste zadnji puta " "obraćali pozornost na ovaj grupni razovor" -#: ../src/conversation_textview.py:342 +#: ../src/conversation_textview.py:348 #, python-format msgid "_Actions for \"%s\"" msgstr "_Akcije za \"%s\"" -#: ../src/conversation_textview.py:354 +#: ../src/conversation_textview.py:360 msgid "Read _Wikipedia Article" msgstr "Pročitajte članak na _Wikipedii" -#: ../src/conversation_textview.py:359 +#: ../src/conversation_textview.py:365 msgid "Look it up in _Dictionary" msgstr "Potražiti u _Riječniku" #. we must have %s in the url if not WIKTIONARY -#: ../src/conversation_textview.py:375 +#: ../src/conversation_textview.py:381 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "URL-u riječnika nedostaje \"%s\" i nije WIKTIONARY" #. we must have %s in the url -#: ../src/conversation_textview.py:388 +#: ../src/conversation_textview.py:394 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "URL-u Web Pretrage nedostaje \"%s\"" -#: ../src/conversation_textview.py:391 +#: ../src/conversation_textview.py:397 msgid "Web _Search for it" msgstr "_Pretraži Web" -#: ../src/conversation_textview.py:397 +#: ../src/conversation_textview.py:403 msgid "Open as _Link" msgstr "Otvori kao _Poveznicu" -#: ../src/conversation_textview.py:757 +#: ../src/conversation_textview.py:848 msgid "Yesterday" msgstr "Jučer" #. the number is >= 2 #. %i is day in year (1-365), %d (1-31) we want %i -#: ../src/conversation_textview.py:761 +#: ../src/conversation_textview.py:852 #, python-format msgid "%i days ago" msgstr "Prije %i dana" #. if we have subject, show it too! -#: ../src/conversation_textview.py:793 +#: ../src/conversation_textview.py:886 #, python-format msgid "Subject: %s\n" msgstr "Tema: %s\n" -#: ../src/dialogs.py:59 +#: ../src/dialogs.py:60 #, python-format msgid "Contact name: %s" msgstr "Ime kontakta: %s" -#: ../src/dialogs.py:61 +#: ../src/dialogs.py:62 #, python-format msgid "Jabber ID: %s" msgstr "Jabber ID: %s" -#: ../src/dialogs.py:211 +#: ../src/dialogs.py:212 msgid "Group" msgstr "Grupa" -#: ../src/dialogs.py:218 +#: ../src/dialogs.py:219 msgid "In the group" msgstr "U grupi" -#: ../src/dialogs.py:269 +#: ../src/dialogs.py:270 msgid "KeyID" msgstr "ID ključa" -#: ../src/dialogs.py:272 +#: ../src/dialogs.py:273 msgid "Contact name" msgstr "Ime kontakta" -#: ../src/dialogs.py:318 +#: ../src/dialogs.py:319 #, python-format msgid "%s Status Message" msgstr "%s Statusna Poruka" -#: ../src/dialogs.py:320 +#: ../src/dialogs.py:321 msgid "Status Message" msgstr "Statusna Poruka" -#: ../src/dialogs.py:395 +#: ../src/dialogs.py:421 msgid "Save as Preset Status Message" msgstr "Snimiti kao Unaprijed Postavljenu Statusnu Poruku" -#: ../src/dialogs.py:396 +#: ../src/dialogs.py:422 msgid "Please type a name for this status message" msgstr "Molimo unesite ime za ovu statusnu poruku" -#: ../src/dialogs.py:417 +#: ../src/dialogs.py:443 msgid "AIM Address:" msgstr "AIM Adresa:" -#: ../src/dialogs.py:418 +#: ../src/dialogs.py:444 msgid "GG Number:" msgstr "GG Broj:" -#: ../src/dialogs.py:419 +#: ../src/dialogs.py:445 msgid "ICQ Number:" msgstr "ICQ Broj:" -#: ../src/dialogs.py:420 +#: ../src/dialogs.py:446 msgid "MSN Address:" msgstr "MSN Adresa:" -#: ../src/dialogs.py:421 +#: ../src/dialogs.py:447 msgid "Yahoo! Address:" msgstr "Yahoo! Adresa:" -#: ../src/dialogs.py:457 +#: ../src/dialogs.py:483 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" msgstr "Molimo ispunite podatke kontakta kojeg želite dodati u račun %s" -#: ../src/dialogs.py:459 +#: ../src/dialogs.py:485 msgid "Please fill in the data of the contact you want to add" msgstr "Molimo ispunite podatke kontakta kojeg želite dodati" -#: ../src/dialogs.py:609 ../src/dialogs.py:615 +#: ../src/dialogs.py:635 ../src/dialogs.py:641 msgid "Invalid User ID" msgstr "Neispravan Korisnički ID" -#: ../src/dialogs.py:616 +#: ../src/dialogs.py:642 msgid "The user ID must not contain a resource." msgstr "ID korisnika ne smije sadržavati resurs." -#: ../src/dialogs.py:630 +#: ../src/dialogs.py:656 msgid "Contact already in roster" msgstr "Kontakt je već na listi" -#: ../src/dialogs.py:631 +#: ../src/dialogs.py:657 msgid "This contact is already listed in your roster." msgstr "Ovaj kontakt je već na vašoj listi kontakata." -#: ../src/dialogs.py:665 +#: ../src/dialogs.py:694 msgid "User ID:" msgstr "ID Korisnika:" -#: ../src/dialogs.py:728 +#: ../src/dialogs.py:757 msgid "A GTK+ jabber client" msgstr "GTK+ jabber klijent" -#: ../src/dialogs.py:729 +#: ../src/dialogs.py:758 msgid "GTK+ Version:" msgstr "GTK+ Verzija:" -#: ../src/dialogs.py:730 +#: ../src/dialogs.py:759 msgid "PyGTK Version:" msgstr "PyGTK Verzija:" -#: ../src/dialogs.py:744 +#: ../src/dialogs.py:773 msgid "Current Developers:" msgstr "Trenutni Razvojni Programeri:" -#: ../src/dialogs.py:746 +#: ../src/dialogs.py:775 msgid "Past Developers:" msgstr "Prošli Razvojni Programeri:" -#: ../src/dialogs.py:756 +#: ../src/dialogs.py:785 msgid "THANKS:" msgstr "ZAHVALE:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:762 +#: ../src/dialogs.py:791 msgid "Last but not least, we would like to thank all the package maintainers." msgstr "" "Zadnje, ali ne najmanje, željeli bismo se zahvaliti svim održavateljima " "paketa" #. here you write your name in the form Name FamilyName -#: ../src/dialogs.py:776 +#: ../src/dialogs.py:804 msgid "translator-credits" msgstr "" "Adrian C. \n" @@ -3236,70 +3328,100 @@ msgstr "" "Armando V. \n" "Vedran M. " -#: ../src/dialogs.py:906 +#: ../src/dialogs.py:934 #, python-format msgid "Unable to bind to port %s." msgstr "Nemoguće vezanje na port %s." -#: ../src/dialogs.py:907 +#: ../src/dialogs.py:935 msgid "" "Maybe you have another running instance of Gajim. File Transfer will be " -"canceled." +"cancelled." msgstr "" "Možda već imate pokrenutu jednu instancu Gajima. Prijenos Datoteka će biti " -"prekinut." +"otkazan." -#: ../src/dialogs.py:1058 +#: ../src/dialogs.py:942 +#, python-format +msgid "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option.\n" +"\n" +"Highlighting misspelled words feature will not be used" +msgstr "" +"Morate instalirati %s rječnik kako bi ste mogli koristiti provjeru " +"pravopisa, ili odaberite drugi jezik postavkom odabira speller_language " +"opcije." + +#: ../src/dialogs.py:1155 #, python-format msgid "Subscription request for account %s from %s" msgstr "Zahtjev pretplate za račun %s od %s" -#: ../src/dialogs.py:1061 +#: ../src/dialogs.py:1158 #, python-format msgid "Subscription request from %s" msgstr "Zahtjev za pretplatom od %s" -#: ../src/dialogs.py:1121 ../src/roster_window.py:681 +#: ../src/dialogs.py:1218 ../src/roster_window.py:743 #, python-format msgid "You are already in group chat %s" msgstr "Već ste u grupnom razgovoru %s" -#: ../src/dialogs.py:1129 +#: ../src/dialogs.py:1226 msgid "You can not join a group chat unless you are connected." msgstr "Ne možete se pridružiti grupnom razgovoru ukoliko niste spojeni." -#: ../src/dialogs.py:1144 +#: ../src/dialogs.py:1241 #, python-format msgid "Join Group Chat with account %s" msgstr "Pridružiti se Grupnom Razgovoru sa računom %s" -#: ../src/dialogs.py:1212 ../src/dialogs.py:1218 +#: ../src/dialogs.py:1309 ../src/dialogs.py:1315 +#: ../src/groupchat_control.py:1536 msgid "Invalid group chat Jabber ID" msgstr "Neispravan Jabber ID grupnog razgovora" -#: ../src/dialogs.py:1213 ../src/dialogs.py:1219 +#: ../src/dialogs.py:1310 ../src/dialogs.py:1316 +#: ../src/groupchat_control.py:1537 msgid "The group chat Jabber ID has not allowed characters." msgstr "Jabber ID grupnog razgovora ima nedozvoljene znakove." -#: ../src/dialogs.py:1225 +#: ../src/dialogs.py:1322 msgid "This is not a group chat" msgstr "Ovo nije grupni razgovor" -#: ../src/dialogs.py:1226 +#: ../src/dialogs.py:1323 #, python-format msgid "%s is not the name of a group chat." msgstr "%s nije ime grupnog razgovora." -#: ../src/dialogs.py:1248 +#: ../src/dialogs.py:1362 +msgid "Without a connection, you can not synchronise your contacts." +msgstr "Bez veze nije moguća sinkronizirati vaše kontakte." + +#: ../src/dialogs.py:1409 +msgid "This account is not connected to the server" +msgstr "Ovaj račun nije spojen sa poslužiteljem" + +#: ../src/dialogs.py:1410 +msgid "You cannot synchronize with an account unless it is connected." +msgstr "Ne možete sinkronizirati sa računom ukoliko nije spojen." + +#: ../src/dialogs.py:1434 +msgid "Synchronise" +msgstr "Sinkroniziraj" + +#: ../src/dialogs.py:1492 #, python-format msgid "Start Chat with account %s" msgstr "Započeti Razgovor sa računom %s" -#: ../src/dialogs.py:1250 +#: ../src/dialogs.py:1494 msgid "Start Chat" msgstr "Započeti Razgovor" -#: ../src/dialogs.py:1251 +#: ../src/dialogs.py:1495 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" @@ -3308,261 +3430,288 @@ msgstr "" "poslati razgovornu poruku:" #. if offline or connecting -#: ../src/dialogs.py:1276 ../src/dialogs.py:1635 ../src/dialogs.py:1764 +#: ../src/dialogs.py:1520 ../src/dialogs.py:1877 ../src/dialogs.py:2008 msgid "Connection not available" msgstr "Veza nije dostupna" -#: ../src/dialogs.py:1277 ../src/dialogs.py:1636 ../src/dialogs.py:1765 +#: ../src/dialogs.py:1521 ../src/dialogs.py:1878 ../src/dialogs.py:2009 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Molimo potvrdite da ste spojeni na \"%s\"." -#: ../src/dialogs.py:1286 ../src/dialogs.py:1289 +#: ../src/dialogs.py:1530 ../src/dialogs.py:1533 msgid "Invalid JID" msgstr "Neispravan JID" -#: ../src/dialogs.py:1289 +#: ../src/dialogs.py:1533 #, python-format msgid "Unable to parse \"%s\"." msgstr "Nije moguće učitati \"%s\"." -#: ../src/dialogs.py:1298 +#: ../src/dialogs.py:1542 msgid "Without a connection, you can not change your password." msgstr "Bez veze nije moguća promjena lozinke." -#: ../src/dialogs.py:1317 +#: ../src/dialogs.py:1560 +msgid "Invalid password" +msgstr "Neispravna lozinka" + +#: ../src/dialogs.py:1561 msgid "You must enter a password." msgstr "Morate unesti lozinku." +#: ../src/dialogs.py:1565 +msgid "Passwords do not match" +msgstr "Lozinke se ne podudaraju" + +#: ../src/dialogs.py:1566 +msgid "The passwords typed in both fields must be identical." +msgstr "Lozinke upisane u oba polja moraju biti identične." + #. img to display #. default value -#: ../src/dialogs.py:1364 ../src/notify.py:211 ../src/notify.py:411 +#: ../src/dialogs.py:1608 ../src/notify.py:214 ../src/notify.py:418 msgid "Contact Signed In" msgstr "Kontakt Se Prijavio" -#: ../src/dialogs.py:1366 ../src/notify.py:219 ../src/notify.py:413 +#: ../src/dialogs.py:1610 ../src/notify.py:222 ../src/notify.py:420 msgid "Contact Signed Out" msgstr "Kontakt Se Odjavio" #. chat message -#: ../src/dialogs.py:1368 ../src/notify.py:238 ../src/notify.py:415 +#: ../src/dialogs.py:1612 ../src/notify.py:241 ../src/notify.py:422 msgid "New Message" msgstr "Nova Poruka" #. single message -#: ../src/dialogs.py:1368 ../src/notify.py:223 ../src/notify.py:415 +#: ../src/dialogs.py:1612 ../src/notify.py:226 ../src/notify.py:422 msgid "New Single Message" msgstr "Nova Jedna Poruka" #. private message -#: ../src/dialogs.py:1369 ../src/notify.py:230 ../src/notify.py:416 +#: ../src/dialogs.py:1613 ../src/notify.py:233 ../src/notify.py:423 msgid "New Private Message" msgstr "Nova Privatna Poruka" -#: ../src/dialogs.py:1369 ../src/gajim.py:1216 ../src/notify.py:424 +#: ../src/dialogs.py:1613 ../src/gajim.py:1350 ../src/notify.py:431 msgid "New E-mail" msgstr "Novi E-mail" -#: ../src/dialogs.py:1371 ../src/gajim.py:1369 ../src/notify.py:418 +#: ../src/dialogs.py:1615 ../src/gajim.py:1503 ../src/notify.py:425 msgid "File Transfer Request" msgstr "Zahtjev Razmjene Datoteka" -#: ../src/dialogs.py:1373 ../src/gajim.py:1188 ../src/gajim.py:1345 -#: ../src/notify.py:420 +#: ../src/dialogs.py:1617 ../src/gajim.py:1322 ../src/gajim.py:1479 +#: ../src/notify.py:427 msgid "File Transfer Error" msgstr "Greška u Razmjeni Datoteka" -#: ../src/dialogs.py:1375 ../src/gajim.py:1408 ../src/gajim.py:1430 -#: ../src/gajim.py:1447 ../src/notify.py:422 +#: ../src/dialogs.py:1619 ../src/gajim.py:1542 ../src/gajim.py:1564 +#: ../src/gajim.py:1581 ../src/notify.py:429 msgid "File Transfer Completed" msgstr "Razmjena Datoteka Završena" -#: ../src/dialogs.py:1376 ../src/gajim.py:1411 ../src/notify.py:422 +#: ../src/dialogs.py:1620 ../src/gajim.py:1545 ../src/notify.py:429 msgid "File Transfer Stopped" msgstr "Razmjena Datoteka Zaustavljena" -#: ../src/dialogs.py:1378 ../src/gajim.py:1086 ../src/notify.py:426 +#: ../src/dialogs.py:1622 ../src/gajim.py:1218 ../src/notify.py:433 msgid "Groupchat Invitation" msgstr "Poziv na Grupni Razgovor" -#: ../src/dialogs.py:1380 ../src/notify.py:203 ../src/notify.py:428 +#: ../src/dialogs.py:1624 ../src/notify.py:206 ../src/notify.py:435 msgid "Contact Changed Status" msgstr "Kontakt Promjenio Status" -#: ../src/dialogs.py:1565 +#: ../src/dialogs.py:1807 #, python-format msgid "Single Message using account %s" msgstr "Jedna Poruka koristeći račun %s" -#: ../src/dialogs.py:1567 +#: ../src/dialogs.py:1809 #, python-format msgid "Single Message in account %s" msgstr "Jedna Poruka u računu %s" -#: ../src/dialogs.py:1569 +#: ../src/dialogs.py:1811 msgid "Single Message" msgstr "Jedna Poruka" #. prepare UI for Sending -#: ../src/dialogs.py:1572 +#: ../src/dialogs.py:1814 #, python-format msgid "Send %s" msgstr "Poslati %s" #. prepare UI for Receiving -#: ../src/dialogs.py:1595 +#: ../src/dialogs.py:1837 #, python-format msgid "Received %s" msgstr "Primljene %s" #. we create a new blank window to send and we preset RE: and to jid -#: ../src/dialogs.py:1667 +#: ../src/dialogs.py:1909 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:1668 +#: ../src/dialogs.py:1910 #, python-format msgid "%s wrote:\n" msgstr "%s piše:\n" -#: ../src/dialogs.py:1712 +#: ../src/dialogs.py:1954 #, python-format msgid "XML Console for %s" msgstr "XML Konzola za %s" -#: ../src/dialogs.py:1714 +#: ../src/dialogs.py:1956 msgid "XML Console" msgstr "XML Konzola" -#: ../src/dialogs.py:1835 +#: ../src/dialogs.py:2079 #, python-format msgid "Privacy List %s" msgstr "Lista Privatnosti %s" -#: ../src/dialogs.py:1839 +#: ../src/dialogs.py:2083 #, python-format msgid "Privacy List for %s" msgstr "Lista Privatnosti za %s" -#: ../src/dialogs.py:1887 +#: ../src/dialogs.py:2141 #, python-format msgid "Order: %s, action: %s, type: %s, value: %s" msgstr "Redoslijed: %s, akcija: %s, tip: %s, vrijednost: %s" -#: ../src/dialogs.py:1890 +#: ../src/dialogs.py:2144 #, python-format msgid "Order: %s, action: %s" msgstr "Redosljed: %s, akcija: %s" -#: ../src/dialogs.py:1932 +#: ../src/dialogs.py:2186 msgid "Edit a rule" msgstr "Izmjena pravila" -#: ../src/dialogs.py:2019 +#: ../src/dialogs.py:2273 msgid "Add a rule" msgstr "Dodaj pravilo" -#: ../src/dialogs.py:2115 +#: ../src/dialogs.py:2362 +#, python-format +msgid "Blocked Contacts for %s" +msgstr "Blokirani Kontakti za %s" + +#: ../src/dialogs.py:2364 +msgid "Blocked Contacts" +msgstr "Blokirani Kontakti" + +#: ../src/dialogs.py:2433 +#, python-format +msgid "Group %s" +msgstr "Grupa %s" + +#: ../src/dialogs.py:2464 #, python-format msgid "Privacy Lists for %s" msgstr "Liste Privatnosti za %s" -#: ../src/dialogs.py:2117 +#: ../src/dialogs.py:2466 msgid "Privacy Lists" msgstr "Liste Privatnosti" -#: ../src/dialogs.py:2185 +#: ../src/dialogs.py:2536 msgid "Invalid List Name" msgstr "Neispravno Ime Liste" -#: ../src/dialogs.py:2186 +#: ../src/dialogs.py:2537 msgid "You must enter a name to create a privacy list." msgstr "Morate unesti ime za stvaranje liste privatnosti." -#. FIXME: use nickname instead of contact_jid -#: ../src/dialogs.py:2220 +#. Don't translate $Contact +#: ../src/dialogs.py:2571 #, python-format -msgid "%(contact_jid)s has invited you to group chat %(room_jid)s" -msgstr "%(contact_jid)s vas je pozvao na grupni razgovor %(room_jid)s" +msgid "$Contact has invited you to group chat %(room_jid)s" +msgstr "$Contact vas je pozvao na grupni razgovor %(room_jid)s" #. only if not None and not '' -#: ../src/dialogs.py:2226 +#: ../src/dialogs.py:2583 #, python-format msgid "Comment: %s" msgstr "Komentar: %s" -#: ../src/dialogs.py:2288 +#: ../src/dialogs.py:2645 msgid "Choose Sound" msgstr "Odabir Zvuka" -#: ../src/dialogs.py:2298 ../src/dialogs.py:2343 +#: ../src/dialogs.py:2655 ../src/dialogs.py:2700 msgid "All files" msgstr "Sve datoteke" -#: ../src/dialogs.py:2303 +#: ../src/dialogs.py:2660 msgid "Wav Sounds" msgstr "Wav Zvukovi" -#: ../src/dialogs.py:2333 +#: ../src/dialogs.py:2690 msgid "Choose Image" msgstr "Odabir Slike" -#: ../src/dialogs.py:2348 +#: ../src/dialogs.py:2705 msgid "Images" msgstr "Slike" -#: ../src/dialogs.py:2405 +#: ../src/dialogs.py:2762 #, python-format msgid "When %s becomes:" msgstr "Kad %s postane:" -#: ../src/dialogs.py:2407 +#: ../src/dialogs.py:2764 #, python-format msgid "Adding Special Notification for %s" msgstr "Dodavanje Posebne Obavijesti za %s" #. # means number -#: ../src/dialogs.py:2478 +#: ../src/dialogs.py:2835 msgid "#" msgstr "#" -#: ../src/dialogs.py:2484 +#: ../src/dialogs.py:2841 msgid "Condition" msgstr "Uvjet" -#: ../src/dialogs.py:2605 +#: ../src/dialogs.py:2962 msgid "when I am " msgstr "kada sam " -#: ../src/disco.py:101 +#: ../src/disco.py:104 msgid "Others" msgstr "Ostali" -#: ../src/disco.py:102 ../src/disco.py:103 ../src/disco.py:1253 -#: ../src/gajim.py:539 ../src/roster_window.py:267 ../src/roster_window.py:325 -#: ../src/roster_window.py:364 ../src/roster_window.py:445 -#: ../src/roster_window.py:477 ../src/roster_window.py:479 -#: ../src/roster_window.py:3828 ../src/roster_window.py:3830 -#: ../src/common/helpers.py:42 +#: ../src/disco.py:105 ../src/disco.py:106 ../src/disco.py:1350 +#: ../src/gajim.py:613 ../src/roster_window.py:273 ../src/roster_window.py:332 +#: ../src/roster_window.py:371 ../src/roster_window.py:471 +#: ../src/roster_window.py:503 ../src/roster_window.py:505 +#: ../src/roster_window.py:4358 ../src/roster_window.py:4360 +#: ../src/common/contacts.py:275 ../src/common/contacts.py:290 +#: ../src/common/helpers.py:43 msgid "Transports" msgstr "Prijenosi" #. conference is a category for listing mostly groupchats in service discovery -#: ../src/disco.py:105 +#: ../src/disco.py:108 msgid "Conference" msgstr "Konferencija" -#: ../src/disco.py:418 +#: ../src/disco.py:421 msgid "Without a connection, you can not browse available services" msgstr "Ukoliko niste spojeni nećete moći pregledati dostupne usluge" -#: ../src/disco.py:497 +#: ../src/disco.py:500 #, python-format msgid "Service Discovery using account %s" msgstr "Otkrivanje Usluga koristeći račun %s" -#: ../src/disco.py:499 +#: ../src/disco.py:502 msgid "Service Discovery" msgstr "Otkrivanje Usluga" @@ -3599,43 +3748,47 @@ msgstr "_Pregled" msgid "This service does not contain any items to browse." msgstr "Ova usluga ne sadrži stvari za pretraživanje" -#: ../src/disco.py:1143 ../src/disco.py:1258 +#: ../src/disco.py:1147 +msgid "_Execute Command" +msgstr "_Izvrši Naredbu..." + +#: ../src/disco.py:1157 ../src/disco.py:1355 msgid "Re_gister" msgstr "Re_gistracija" -#: ../src/disco.py:1295 +#: ../src/disco.py:1392 #, python-format msgid "Scanning %d / %d.." msgstr "Skeniranje %d / %d.." #. Users column -#: ../src/disco.py:1476 +#: ../src/disco.py:1573 msgid "Users" msgstr "Korisnici" #. Description column -#: ../src/disco.py:1483 +#: ../src/disco.py:1580 msgid "Description" msgstr "Opis" #. Id column -#: ../src/disco.py:1490 +#: ../src/disco.py:1587 msgid "Id" msgstr "Identifikacija" -#: ../src/disco.py:1713 +#: ../src/disco.py:1810 msgid "Subscribed" msgstr "Pretplaćeno" -#: ../src/disco.py:1739 +#: ../src/disco.py:1836 msgid "New post" msgstr "Nova objava" -#: ../src/disco.py:1745 +#: ../src/disco.py:1842 msgid "_Subscribe" msgstr "_Pretplatiti se" -#: ../src/disco.py:1751 +#: ../src/disco.py:1848 msgid "_Unsubscribe" msgstr "_Ukinuti pretplatu" @@ -3651,132 +3804,132 @@ msgstr "Vrijeme" msgid "Progress" msgstr "Napredak" -#: ../src/filetransfers_window.py:163 ../src/filetransfers_window.py:223 +#: ../src/filetransfers_window.py:161 ../src/filetransfers_window.py:215 #, python-format msgid "Filename: %s" msgstr "Ime datoteke: %s" -#: ../src/filetransfers_window.py:164 ../src/filetransfers_window.py:298 +#: ../src/filetransfers_window.py:162 ../src/filetransfers_window.py:290 #, python-format msgid "Size: %s" msgstr "veličina: %s" #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:183 +#: ../src/filetransfers_window.py:171 ../src/filetransfers_window.py:181 #: ../src/history_manager.py:463 msgid "You" msgstr "Vi" -#: ../src/filetransfers_window.py:174 +#: ../src/filetransfers_window.py:172 #, python-format msgid "Sender: %s" msgstr "Pošiljatelj: %s" -#: ../src/filetransfers_window.py:175 ../src/filetransfers_window.py:572 -#: ../src/tooltips.py:573 +#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:564 +#: ../src/tooltips.py:585 msgid "Recipient: " msgstr "Primatelj: " -#: ../src/filetransfers_window.py:186 +#: ../src/filetransfers_window.py:184 #, python-format msgid "Saved in: %s" msgstr "Spremljeno u: %s" -#: ../src/filetransfers_window.py:188 +#: ../src/filetransfers_window.py:186 msgid "File transfer completed" msgstr "Prijenos datoteka završen" -#: ../src/filetransfers_window.py:204 ../src/filetransfers_window.py:212 -msgid "File transfer canceled" -msgstr "Prijenos datoteka prekinut" +#: ../src/filetransfers_window.py:200 ../src/filetransfers_window.py:206 +msgid "File transfer cancelled" +msgstr "Prijenos datoteka otkazan" -#: ../src/filetransfers_window.py:204 ../src/filetransfers_window.py:213 +#: ../src/filetransfers_window.py:200 ../src/filetransfers_window.py:207 msgid "Connection with peer cannot be established." msgstr "Vezu nije moguće ostvariti." -#: ../src/filetransfers_window.py:224 +#: ../src/filetransfers_window.py:216 #, python-format msgid "Recipient: %s" msgstr "Primatelj: %s" -#: ../src/filetransfers_window.py:226 +#: ../src/filetransfers_window.py:218 #, python-format msgid "Error message: %s" msgstr "Poruka Greške: %s" -#: ../src/filetransfers_window.py:227 -msgid "File transfer stopped by the contact of the other side" -msgstr "Prijenos datoteka je zaustavio kontakt na drugoj strani" +#: ../src/filetransfers_window.py:219 +msgid "File transfer stopped by the contact at the other end" +msgstr "Prijenos datoteka je otkazao kontakt na drugoj strani" -#: ../src/filetransfers_window.py:244 +#: ../src/filetransfers_window.py:236 msgid "Choose File to Send..." msgstr "Odabir Datoteke za Slanje..." -#: ../src/filetransfers_window.py:263 +#: ../src/filetransfers_window.py:255 msgid "Gajim cannot access this file" msgstr "Gajim ne može pristupiti ovoj datoteci" -#: ../src/filetransfers_window.py:264 +#: ../src/filetransfers_window.py:256 msgid "This file is being used by another process." msgstr "Ovu datoteku koristi neki drugi proces." -#: ../src/filetransfers_window.py:296 +#: ../src/filetransfers_window.py:288 #, python-format msgid "File: %s" msgstr "Datoteka: %s" -#: ../src/filetransfers_window.py:301 +#: ../src/filetransfers_window.py:293 #, python-format msgid "Type: %s" msgstr "Tip: %s" -#: ../src/filetransfers_window.py:303 +#: ../src/filetransfers_window.py:295 #, python-format msgid "Description: %s" msgstr "Opis: %s" -#: ../src/filetransfers_window.py:304 +#: ../src/filetransfers_window.py:296 #, python-format msgid "%s wants to send you a file:" msgstr "%s vam želi poslati datoteku:" -#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:683 +#: ../src/filetransfers_window.py:310 ../src/gtkgui_helpers.py:767 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Nije moguće prepisati postojeću datoteku \"%s\"" -#: ../src/filetransfers_window.py:319 ../src/gtkgui_helpers.py:685 +#: ../src/filetransfers_window.py:311 ../src/gtkgui_helpers.py:769 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "Datoteka sa ovim imenom već postoji i nemate ovlasti prepisati ju." -#: ../src/filetransfers_window.py:326 ../src/gtkgui_helpers.py:689 +#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:773 msgid "This file already exists" msgstr "Ova datoteka već postoji" -#: ../src/filetransfers_window.py:326 ../src/gtkgui_helpers.py:689 +#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:773 msgid "What do you want to do?" msgstr "Å to želite učiniti?" -#: ../src/filetransfers_window.py:338 ../src/gtkgui_helpers.py:699 +#: ../src/filetransfers_window.py:330 ../src/gtkgui_helpers.py:783 #, python-format msgid "Directory \"%s\" is not writable" msgstr "U direktorij \"%s\" nije moguće zapisivati" -#: ../src/filetransfers_window.py:338 ../src/gtkgui_helpers.py:700 +#: ../src/filetransfers_window.py:330 ../src/gtkgui_helpers.py:784 msgid "You do not have permission to create files in this directory." msgstr "Nemate ovlasti stvarati datoteke u ovom direktoriju" -#: ../src/filetransfers_window.py:348 +#: ../src/filetransfers_window.py:340 msgid "Save File as..." msgstr "Snimiti Datoteku kao..." #. 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:429 +#: ../src/filetransfers_window.py:421 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -3784,60 +3937,65 @@ 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:505 +#: ../src/filetransfers_window.py:497 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" -#: ../src/filetransfers_window.py:544 ../src/filetransfers_window.py:547 +#: ../src/filetransfers_window.py:536 ../src/filetransfers_window.py:539 msgid "Invalid File" msgstr "Neispravna Datoteka" -#: ../src/filetransfers_window.py:544 +#: ../src/filetransfers_window.py:536 msgid "File: " msgstr "Datoteka: " -#: ../src/filetransfers_window.py:548 +#: ../src/filetransfers_window.py:540 msgid "It is not possible to send empty files" msgstr "Nije moguće poslati prazne datoteke" -#: ../src/filetransfers_window.py:568 ../src/tooltips.py:563 +#: ../src/filetransfers_window.py:560 ../src/tooltips.py:575 msgid "Name: " msgstr "Ime: " -#: ../src/filetransfers_window.py:570 ../src/tooltips.py:567 +#: ../src/filetransfers_window.py:562 ../src/tooltips.py:579 msgid "Sender: " msgstr "Pošiljatelj: " -#: ../src/filetransfers_window.py:758 +#: ../src/filetransfers_window.py:750 msgid "Pause" msgstr "Pauza" #: ../src/gajim.py:47 -msgid "Gajim needs Xserver to run. Quiting..." -msgstr "Gajim treba Xserver za pokretanje. Izlaz..." +#, python-format +msgid "%s is not a valid loglevel" +msgstr "%s nije valjana razina zapisnika (loglevel)" -#: ../src/gajim.py:51 -msgid "Gajim needs PyGTK 2.6 or above" -msgstr "Gajim treba pyGTK 2.6 ili viši" +#: ../src/gajim.py:122 +msgid "Gajim needs X server to run. Quiting..." +msgstr "Gajim treba X server za pokretanje. Izlaz..." -#: ../src/gajim.py:52 -msgid "Gajim needs PyGTK 2.6 or above to run. Quiting..." -msgstr "Gajim needs PyGTK 2.6 ili viši za pokretanje. Izlaz..." +#: ../src/gajim.py:126 +msgid "Gajim needs PyGTK 2.8 or above" +msgstr "Gajim treba pyGTK 2.8 ili viši" -#: ../src/gajim.py:54 -msgid "Gajim needs GTK 2.6 or above" -msgstr "Gajim treba GTK 2.6 ili viši" +#: ../src/gajim.py:127 +msgid "Gajim needs PyGTK 2.8 or above to run. Quiting..." +msgstr "Gajim needs PyGTK 2.8 ili viši za pokretanje. Izlaz..." -#: ../src/gajim.py:55 -msgid "Gajim needs GTK 2.6 or above to run. Quiting..." -msgstr "Gajim treba GTK 2.6 ili viši za pokretanje. Izlaz..." +#: ../src/gajim.py:129 +msgid "Gajim needs GTK 2.8 or above" +msgstr "Gajim treba GTK 2.8 ili viši" -#: ../src/gajim.py:60 +#: ../src/gajim.py:130 +msgid "Gajim needs GTK 2.8 or above to run. Quiting..." +msgstr "Gajim treba GTK 2.8 ili viši za pokretanje. Izlaz..." + +#: ../src/gajim.py:135 msgid "GTK+ runtime is missing libglade support" msgstr "GTK+ nema podršku za libglade" -#: ../src/gajim.py:62 +#: ../src/gajim.py:137 #, python-format msgid "" "Please remove your current GTK+ runtime and install the latest stable " @@ -3846,21 +4004,21 @@ msgstr "" "Molimo uklonite svoj trenutni GTK+ i instalirajte posljednju stabilnu " "verziju sa %s" -#: ../src/gajim.py:64 +#: ../src/gajim.py:139 msgid "" "Please make sure that GTK+ and PyGTK have libglade support in your system." msgstr "" "Molimo provjerite da GTK+ i PyGTK imaju podršku za libglade na vašem sustavu" -#: ../src/gajim.py:69 +#: ../src/gajim.py:144 msgid "Gajim needs PySQLite2 to run" msgstr "Gajim treba PySQLite2 za pokretanje" -#: ../src/gajim.py:77 +#: ../src/gajim.py:152 msgid "Gajim needs pywin32 to run" msgstr "Gajim treba pywin32 za pokretanje" -#: ../src/gajim.py:78 +#: ../src/gajim.py:153 #, python-format msgid "" "Please make sure that Pywin32 is installed on your system. You can get it at " @@ -3870,11 +4028,11 @@ msgstr "" "na %s" #. set the icon to all newly opened wind -#: ../src/gajim.py:238 +#: ../src/gajim.py:300 msgid "Gajim is already running" msgstr "Gajim je već pokrenut" -#: ../src/gajim.py:239 +#: ../src/gajim.py:301 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -3882,76 +4040,83 @@ msgstr "" "Trenutno je već pokrenuta jedna instanca Gajima\n" "Svejedno pokrenuti?" -#: ../src/gajim.py:346 +#: ../src/gajim.py:408 +msgid "Do you accept this request?" +msgstr "Prihvaćate li ovaj zahtjev?" + +#: ../src/gajim.py:411 #, python-format msgid "HTTP (%s) Authorization for %s (id: %s)" msgstr "HTTP (%s) Autorizacija za %s (id: %s)" -#: ../src/gajim.py:347 -msgid "Do you accept this request?" -msgstr "Prihvaćate li ovaj zahtjev?" - -#: ../src/gajim.py:393 ../src/notify.py:430 +#: ../src/gajim.py:458 ../src/notify.py:437 msgid "Connection Failed" msgstr "Veza Prekinuta" -#: ../src/gajim.py:706 +#: ../src/gajim.py:788 #, python-format msgid "Subject: %s" msgstr "Tema: %s" #. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) -#: ../src/gajim.py:751 ../src/gajim.py:764 +#: ../src/gajim.py:832 ../src/gajim.py:845 #, python-format msgid "error while sending %s ( %s )" msgstr "greška prilikom slanja %s ( %s )" -#: ../src/gajim.py:797 +#: ../src/gajim.py:878 msgid "Authorization accepted" msgstr "Autorizacija prihvaćena" -#: ../src/gajim.py:798 +#: ../src/gajim.py:879 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "Kontakt \"%s\" vam je dozvolio da vidite njegov ili njezin status." -#: ../src/gajim.py:806 +#: ../src/gajim.py:887 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Kontankt \"%s\" je uklonio pretplatu od vas" -#: ../src/gajim.py:807 +#: ../src/gajim.py:888 msgid "You will always see him or her as offline." msgstr "Uvijek ćete vidjeti njega ili nju kao nepriključenog." -#: ../src/gajim.py:850 +#: ../src/gajim.py:932 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Kontakt sa \"%s\" ne može biti uspostavljen" -#: ../src/gajim.py:851 ../src/common/connection.py:406 +#: ../src/gajim.py:933 ../src/common/connection.py:423 msgid "Check your connection or try again later." msgstr "Provjerite svoju vezu ili pokušajte kasnije." -#: ../src/gajim.py:999 ../src/roster_window.py:1197 +#: ../src/gajim.py:1100 ../src/roster_window.py:1302 #, python-format msgid "%s is now %s (%s)" msgstr "%s je sada %s (%s)" -#: ../src/gajim.py:1096 +#. No status message +#: ../src/gajim.py:1103 ../src/groupchat_control.py:1023 +#: ../src/roster_window.py:1305 +#, python-format +msgid "%s is now %s" +msgstr "%s je sada %s" + +#: ../src/gajim.py:1228 msgid "Your passphrase is incorrect" msgstr "Vaša lozinka nije točna" -#: ../src/gajim.py:1097 +#: ../src/gajim.py:1229 msgid "You are currently connected without your OpenPGP key." msgstr "Trenutno ste spojeni bez OpenPGP ključa." -#: ../src/gajim.py:1199 +#: ../src/gajim.py:1333 #, python-format msgid "New mail on %(gmail_mail_address)s" msgstr "Novi E-mail na %(gmail_mail_address)s" -#: ../src/gajim.py:1201 +#: ../src/gajim.py:1335 #, python-format msgid "You have %d new mail conversation" msgid_plural "You have %d new mail conversations" @@ -3962,7 +4127,7 @@ msgstr[2] "Imate %d novih E-mail razgovora" #. FIXME: emulate Gtalk client popups. find out what they parse and how #. they decide what to show #. each message has a 'From', 'Subject' and 'Snippet' field -#: ../src/gajim.py:1210 +#: ../src/gajim.py:1344 #, python-format msgid "" "\n" @@ -3971,91 +4136,115 @@ msgstr "" "\n" "Od: %(from_address)s" -#: ../src/gajim.py:1366 +#: ../src/gajim.py:1500 #, python-format msgid "%s wants to send you a file." msgstr "%s vam želi poslati datoteku." -#: ../src/gajim.py:1431 +#: ../src/gajim.py:1565 #, python-format msgid "You successfully received %(filename)s from %(name)s." msgstr "Uspješno ste primili %(filename)s od %(name)s." #. ft stopped -#: ../src/gajim.py:1435 +#: ../src/gajim.py:1569 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Prijenos %(filename)s od %(name)s je zaustavljen." -#: ../src/gajim.py:1448 +#: ../src/gajim.py:1582 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Uspješno ste poslali %(filename)s %(name)s" #. ft stopped -#: ../src/gajim.py:1452 +#: ../src/gajim.py:1586 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Prijenos %(filename)s %(name)s je zaustavljen. " -#: ../src/gajim.py:1558 +#: ../src/gajim.py:1718 msgid "Username Conflict" msgstr "Konflikt korisničkog imena" -#: ../src/gajim.py:1559 +#: ../src/gajim.py:1719 msgid "Please type a new username for your local account" msgstr "Molimo unesite novo korisničko ime za vaš lokalni račun" +#: ../src/gajim.py:1736 +msgid "Ping?" +msgstr "Ping?" + +#: ../src/gajim.py:1744 +#, python-format +msgid "Pong! (%s s.)" +msgstr "Pong! (%s s.)" + +#: ../src/gajim.py:1750 +msgid "Error." +msgstr "Greška." + +#: ../src/gajim.py:1775 +msgid "Resource Conflict" +msgstr "Konflikt Resursa" + +#: ../src/gajim.py:1776 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" +msgstr "Već ste spojeni na ovaj račun sa istim resursom. Molim unesite novi." + #. it is good to notify the user #. in case he or she cannot see the output of the console -#: ../src/gajim.py:1898 +#: ../src/gajim.py:2120 msgid "Could not save your settings and preferences" msgstr "Nije moguće spremanje vaših postavki" -#: ../src/gajim.py:2090 +#: ../src/gajim.py:2330 msgid "Network Manager support not available" msgstr "Podrška za Upravitelja Mrežom nije dostupna" -#: ../src/gajim.py:2165 +#: ../src/gajim.py:2403 msgid "Session Management support not available (missing gnome.ui module)" msgstr "" "Podrška za Upravljanje Seansama nije dostupna (nedostaje gnome.ui modul)" -#: ../src/gajim-remote.py:66 +#: ../src/gajim-remote.py:65 msgid "Shows a help on specific command" msgstr "Prikazuje pomoć za određenu naredbu" #. User gets help for the command, specified by this parameter -#: ../src/gajim-remote.py:69 +#: ../src/gajim-remote.py:68 msgid "command" msgstr "naredba" -#: ../src/gajim-remote.py:70 +#: ../src/gajim-remote.py:69 msgid "show help on command" msgstr "prikaži pomoć za komandu" -#: ../src/gajim-remote.py:74 +#: ../src/gajim-remote.py:73 msgid "Shows or hides the roster window" msgstr "Prikazuje ili skriva prozor liste" -#: ../src/gajim-remote.py:78 -msgid "Popups a window with the next pending event" -msgstr "Iskače prozor sa sljedećim događajem na čekanju" +#: ../src/gajim-remote.py:77 +msgid "Pops up a window with the next pending event" +msgstr "Prikazuje prozor sa sljedećim događajem na čekanju" -#: ../src/gajim-remote.py:82 +#: ../src/gajim-remote.py:81 msgid "" -"Prints a list of all contacts in the roster. Each contact appear on a " +"Prints a list of all contacts in the roster. Each contact appears on a " "separate line" msgstr "" "Ispisuje listu svih kontakata na listi. Svaki kontakt pojavljuje se u " "odvojenoj liniji" -#: ../src/gajim-remote.py:84 ../src/gajim-remote.py:98 -#: ../src/gajim-remote.py:108 ../src/gajim-remote.py:121 -#: ../src/gajim-remote.py:135 ../src/gajim-remote.py:156 -#: ../src/gajim-remote.py:186 ../src/gajim-remote.py:195 -#: ../src/gajim-remote.py:202 ../src/gajim-remote.py:209 -#: ../src/gajim-remote.py:220 +#: ../src/gajim-remote.py:84 ../src/gajim-remote.py:99 +#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:122 +#: ../src/gajim-remote.py:136 ../src/gajim-remote.py:157 +#: ../src/gajim-remote.py:187 ../src/gajim-remote.py:196 +#: ../src/gajim-remote.py:203 ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:237 +#: ../src/gajim-remote.py:246 msgid "account" msgstr "račun" @@ -4063,33 +4252,35 @@ msgstr "račun" msgid "show only contacts of the given account" msgstr "prikaži samo kontakte ovog računa" -#: ../src/gajim-remote.py:89 +#: ../src/gajim-remote.py:90 msgid "Prints a list of registered accounts" msgstr "Ispisuje listu registriranih računa" -#: ../src/gajim-remote.py:93 +#: ../src/gajim-remote.py:94 msgid "Changes the status of account or accounts" msgstr "Mjenja status jednog računa ili više njih" #. offline, online, chat, away, xa, dnd, invisible should not be translated -#: ../src/gajim-remote.py:96 +#: ../src/gajim-remote.py:97 msgid "status" msgstr "status" -#: ../src/gajim-remote.py:96 +#: ../src/gajim-remote.py:97 msgid "one of: offline, online, chat, away, xa, dnd, invisible " -msgstr "jedno od: " +msgstr "" +"jedno od: odspojen, povezan, razgovor, odsutan, produženo nedostupan, " +"nevidljiv" -#: ../src/gajim-remote.py:97 ../src/gajim-remote.py:118 -#: ../src/gajim-remote.py:132 +#: ../src/gajim-remote.py:98 ../src/gajim-remote.py:119 +#: ../src/gajim-remote.py:133 msgid "message" msgstr "poruka" -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:98 msgid "status message" msgstr "statusna poruka" -#: ../src/gajim-remote.py:98 +#: ../src/gajim-remote.py:99 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" @@ -4098,19 +4289,19 @@ msgstr "" "statusa svih računa koji imaju podešenu opciju \"sinkronizacija sa globalnim " "statusom\"" -#: ../src/gajim-remote.py:104 +#: ../src/gajim-remote.py:105 msgid "Shows the chat dialog so that you can send messages to a contact" msgstr "Prikazuje dialog razgovora kako bi mogli slati poruke kontaktu" -#: ../src/gajim-remote.py:106 +#: ../src/gajim-remote.py:107 msgid "JID of the contact that you want to chat with" msgstr "JID kontakta sa kojim želite razgovarati" -#: ../src/gajim-remote.py:108 ../src/gajim-remote.py:186 +#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:187 msgid "if specified, contact is taken from the contact list of this account" msgstr "ako je označeno, kontak se uzima sa kontakt liste ovog računa" -#: ../src/gajim-remote.py:113 +#: ../src/gajim-remote.py:114 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 " @@ -4120,27 +4311,27 @@ msgstr "" "Ako želite postaviti samo 'račun', bez 'OpenPGP ključa', samo podesite " "'OpenPGP ključ' na ''." -#: ../src/gajim-remote.py:117 ../src/gajim-remote.py:130 +#: ../src/gajim-remote.py:118 ../src/gajim-remote.py:131 msgid "JID of the contact that will receive the message" msgstr "JID kontakta koji će primiti poruku" -#: ../src/gajim-remote.py:118 ../src/gajim-remote.py:132 +#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 msgid "message contents" msgstr "sadržaj poruke" -#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 msgid "pgp key" msgstr "pgp ključ" -#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 msgid "if specified, the message will be encrypted using this public key" msgstr "ako je označeno, poruka će biti kriptirana koristeći ovaj javni ključ" -#: ../src/gajim-remote.py:121 ../src/gajim-remote.py:135 +#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:136 msgid "if specified, the message will be sent using this account" msgstr "ako je označeno, poruka će biti poslana koristeći ovaj račun" -#: ../src/gajim-remote.py:126 +#: ../src/gajim-remote.py:127 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 " @@ -4150,126 +4341,126 @@ msgstr "" "želite postaviti samo 'račun', bez 'OpenPGP ključa', samo podesite 'OpenPGP " "ključ' na ''." -#: ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:132 msgid "subject" msgstr "tema" -#: ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:132 msgid "message subject" msgstr "tema poruke" -#: ../src/gajim-remote.py:140 +#: ../src/gajim-remote.py:141 msgid "Gets detailed info on a contact" msgstr "Daje detaljne informacije o kontaktu" -#: ../src/gajim-remote.py:142 ../src/gajim-remote.py:155 -#: ../src/gajim-remote.py:185 ../src/gajim-remote.py:194 +#: ../src/gajim-remote.py:143 ../src/gajim-remote.py:156 +#: ../src/gajim-remote.py:186 ../src/gajim-remote.py:195 msgid "JID of the contact" msgstr "JID kontakta" -#: ../src/gajim-remote.py:146 +#: ../src/gajim-remote.py:147 msgid "Gets detailed info on a account" msgstr "Daje detaljne informacije o računu" -#: ../src/gajim-remote.py:148 +#: ../src/gajim-remote.py:149 msgid "Name of the account" msgstr "Ime računa" -#: ../src/gajim-remote.py:152 +#: ../src/gajim-remote.py:153 msgid "Sends file to a contact" msgstr "Å alje datoteku kontaktu" -#: ../src/gajim-remote.py:154 +#: ../src/gajim-remote.py:155 msgid "file" msgstr "datoteka" -#: ../src/gajim-remote.py:154 +#: ../src/gajim-remote.py:155 msgid "File path" msgstr "Putanja datoteke" -#: ../src/gajim-remote.py:156 +#: ../src/gajim-remote.py:157 msgid "if specified, file will be sent using this account" msgstr "ako je označeno, datoteka će biti poslana koriteći ovaj račun" -#: ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:162 msgid "Lists all preferences and their values" msgstr "Prikatuje sve postavke i njihove vrijednosti" -#: ../src/gajim-remote.py:165 +#: ../src/gajim-remote.py:166 msgid "Sets value of 'key' to 'value'." msgstr "Postavlja vrijednost 'ključa' na 'vrijednost'." -#: ../src/gajim-remote.py:167 +#: ../src/gajim-remote.py:168 msgid "key=value" msgstr "ključ=vrijednost" -#: ../src/gajim-remote.py:167 +#: ../src/gajim-remote.py:168 msgid "'key' is the name of the preference, 'value' is the value to set it to" msgstr "" "'ključ' je ime postavke, 'vrijednost' je vrijednost na koju će se postaviti" -#: ../src/gajim-remote.py:172 +#: ../src/gajim-remote.py:173 msgid "Deletes a preference item" msgstr "Briše element postavke" -#: ../src/gajim-remote.py:174 +#: ../src/gajim-remote.py:175 msgid "key" msgstr "ključ" -#: ../src/gajim-remote.py:174 +#: ../src/gajim-remote.py:175 msgid "name of the preference to be deleted" msgstr "ime postavke koja će se brisati" -#: ../src/gajim-remote.py:178 +#: ../src/gajim-remote.py:179 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Zapisuje trenutno stanje Gajim postavku u .config datoteku" -#: ../src/gajim-remote.py:183 +#: ../src/gajim-remote.py:184 msgid "Removes contact from roster" msgstr "Uklanja kontakt sa liste" -#: ../src/gajim-remote.py:192 +#: ../src/gajim-remote.py:193 msgid "Adds contact to roster" msgstr "Dodaje kontakt na listu" -#: ../src/gajim-remote.py:194 +#: ../src/gajim-remote.py:195 msgid "jid" msgstr "jid" -#: ../src/gajim-remote.py:195 +#: ../src/gajim-remote.py:196 msgid "Adds new contact to this account" msgstr "Dodaje novi kontakt ovom računu" -#: ../src/gajim-remote.py:200 +#: ../src/gajim-remote.py:201 msgid "Returns current status (the global one unless account is specified)" msgstr "Vraća trenutni status (globalni ukoliko nije određen račun)" -#: ../src/gajim-remote.py:207 +#: ../src/gajim-remote.py:208 msgid "" "Returns current status message(the global one unless account is specified)" msgstr "Vraća trenutnu statusnu poruku (globalnu ukoliko nije određen račun)" -#: ../src/gajim-remote.py:214 -msgid "Returns number of unreaded messages" +#: ../src/gajim-remote.py:215 +msgid "Returns number of unread messages" msgstr "Vraća broj nepročitanih poruka" -#: ../src/gajim-remote.py:218 +#: ../src/gajim-remote.py:219 msgid "Opens 'Start Chat' dialog" msgstr "Otvaranje dialoga 'Započeti Razgovor'" -#: ../src/gajim-remote.py:220 +#: ../src/gajim-remote.py:221 msgid "Starts chat, using this account" msgstr "Započinje razgovor, koristeći ovaj račun" -#: ../src/gajim-remote.py:224 +#: ../src/gajim-remote.py:225 msgid "Sends custom XML" msgstr "Šalje korisnički XML" -#: ../src/gajim-remote.py:226 +#: ../src/gajim-remote.py:227 msgid "XML to send" msgstr "XML za slanje" -#: ../src/gajim-remote.py:227 +#: ../src/gajim-remote.py:228 msgid "" "Account in which the xml will be sent; if not specified, xml will be sent to " "all accounts" @@ -4277,11 +4468,35 @@ msgstr "" "Račun u kojem će xml biti poslan; ako nije specificirano, xml će biti poslan " "na sve račune" -#: ../src/gajim-remote.py:249 +#: ../src/gajim-remote.py:234 +msgid "Handle a xmpp:/ uri" +msgstr "Rukuj xmpp:/ adresama" + +#: ../src/gajim-remote.py:236 +msgid "uri" +msgstr "uri" + +#: ../src/gajim-remote.py:241 +msgid "Join a MUC room" +msgstr "Pridruživanje Novoj Sobi" + +#: ../src/gajim-remote.py:243 +msgid "room" +msgstr "soba" + +#: ../src/gajim-remote.py:244 +msgid "nick" +msgstr "nadimak" + +#: ../src/gajim-remote.py:245 +msgid "password" +msgstr "lozinka" + +#: ../src/gajim-remote.py:268 msgid "Missing argument \"contact_jid\"" msgstr "Nedostaje argument \"contact_jid\"" -#: ../src/gajim-remote.py:268 +#: ../src/gajim-remote.py:287 #, python-format msgid "" "'%s' is not in your roster.\n" @@ -4290,11 +4505,11 @@ msgstr "" "'%s' nije na vašoj listi.\n" "Molimo odredite račun za slanje poruke." -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:290 msgid "You have no active account" msgstr "nemate aktivnih računa" -#: ../src/gajim-remote.py:335 +#: ../src/gajim-remote.py:354 #, python-format msgid "" "Usage: %s %s %s \n" @@ -4303,16 +4518,16 @@ msgstr "" "Korištenje: %s %s %s \n" "\t %s" -#: ../src/gajim-remote.py:338 +#: ../src/gajim-remote.py:357 msgid "Arguments:" msgstr "Argumenti:" -#: ../src/gajim-remote.py:342 +#: ../src/gajim-remote.py:361 #, python-format msgid "%s not found" msgstr "%s nije pronađen" -#: ../src/gajim-remote.py:346 +#: ../src/gajim-remote.py:365 #, python-format msgid "" "Usage: %s command [arguments]\n" @@ -4321,7 +4536,16 @@ msgstr "" "Korištenje: %s naredba [argumenti]\n" "Naredba je jedna od:\n" -#: ../src/gajim-remote.py:420 +#: ../src/gajim-remote.py:438 +#, python-format +msgid "" +"Too many arguments. \n" +"Type \"%s help %s\" for more info" +msgstr "" +"Previše argumenata. \n" +"Unesite \"%s help %s\" za više informacija" + +#: ../src/gajim-remote.py:442 #, python-format msgid "" "Argument \"%s\" is not specified. \n" @@ -4330,6 +4554,10 @@ msgstr "" "Argument \"%s\" nije određen. \n" "Unesite \"%s help %s\" za više informacija" +#: ../src/gajim-remote.py:460 +msgid "Wrong uri" +msgstr "Krivi uri" + #: ../src/gajim_themes_window.py:60 msgid "Theme" msgstr "Tema" @@ -4347,14 +4575,6 @@ msgstr "Ne možete izbrisati svoju trenutnu temu" msgid "Please first choose another for your current theme." msgstr "Molimo vas da prvo odaberete neku drugu temu za trenutnu." -#: ../src/groupchat_control.py:106 -msgid "Private Chat" -msgstr "Privatni Razgovor" - -#: ../src/groupchat_control.py:106 -msgid "Private Chats" -msgstr "Privanti Razgovori" - #: ../src/groupchat_control.py:123 msgid "Sending private message failed" msgstr "Slanje privatne poruke neuspješno" @@ -4365,100 +4585,81 @@ msgstr "Slanje privatne poruke neuspješno" msgid "You are no longer in group chat \"%s\" or \"%s\" has left." msgstr "Više niste u grupnom razgovoru \"%s\" ili je \"%s\" otišao." -#: ../src/groupchat_control.py:144 -msgid "Group Chat" -msgstr "Grupni Razgovor" - -#: ../src/groupchat_control.py:144 -msgid "Group Chats" -msgstr "Grupni Razgovori" - -#: ../src/groupchat_control.py:318 +#: ../src/groupchat_control.py:330 msgid "Insert Nickname" msgstr "Umetni _Nadimak" #. do not print 'kicked by None' -#: ../src/groupchat_control.py:831 +#: ../src/groupchat_control.py:873 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s je izbačen: %(reason)s" -#: ../src/groupchat_control.py:835 +#: ../src/groupchat_control.py:877 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s je izbačen od strane %(who)s: %(reason)s" #. do not print 'banned by None' -#: ../src/groupchat_control.py:842 +#: ../src/groupchat_control.py:884 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s ima zabranjen pristup: %(reason)s" -#: ../src/groupchat_control.py:846 +#: ../src/groupchat_control.py:888 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s ima zabranjen pristup od strane %(who)s: %(reason)s" -#: ../src/groupchat_control.py:854 +#: ../src/groupchat_control.py:896 #, python-format msgid "You are now known as %s" msgstr "Od sada ste poznati kao %s" -#: ../src/groupchat_control.py:856 +#: ../src/groupchat_control.py:898 #, python-format msgid "%s is now known as %s" msgstr "%s je od sada poznat kao %s" -#: ../src/groupchat_control.py:936 +#: ../src/groupchat_control.py:1016 #, python-format msgid "%s has left" msgstr "%s je napustio" -#: ../src/groupchat_control.py:941 +#: ../src/groupchat_control.py:1021 #, python-format msgid "%s has joined the group chat" msgstr "%s se pridružio grupnom razgovoru" -#. No status message -#: ../src/groupchat_control.py:943 ../src/roster_window.py:1200 -#, python-format -msgid "%s is now %s" -msgstr "%s je sada %s" - -#: ../src/groupchat_control.py:1062 ../src/groupchat_control.py:1080 -#: ../src/groupchat_control.py:1173 ../src/groupchat_control.py:1190 +#: ../src/groupchat_control.py:1149 ../src/groupchat_control.py:1167 +#: ../src/groupchat_control.py:1260 ../src/groupchat_control.py:1277 #, python-format msgid "Nickname not found: %s" msgstr "Nadimak nije pronađen: %s " -#: ../src/groupchat_control.py:1096 +#: ../src/groupchat_control.py:1183 msgid "This group chat has no subject" msgstr "Ovaj grupni razgovor nema temu" -#: ../src/groupchat_control.py:1109 +#: ../src/groupchat_control.py:1196 #, python-format msgid "Invited %(contact_jid)s to %(room_jid)s." msgstr "Pozvali ste %(contact_jid)s na %(room_jid)s" #. %s is something the user wrote but it is not a jid so we inform -#: ../src/groupchat_control.py:1116 ../src/groupchat_control.py:1144 +#: ../src/groupchat_control.py:1203 ../src/groupchat_control.py:1231 #, python-format msgid "%s does not appear to be a valid JID" msgstr "%s ne izgleda kao valjani JID" -#: ../src/groupchat_control.py:1227 +#: ../src/groupchat_control.py:1314 #, python-format msgid "No such command: /%s (if you want to send this, prefix it with /say)" msgstr "" "Ne postoji komanda: /%s (ako želite poslati to kao poruku, prefiksirajte je " "sa /say)" -#: ../src/groupchat_control.py:1250 -#, python-format -msgid "Commands: %s" -msgstr "Komanda: %s" - -#: ../src/groupchat_control.py:1252 +#: ../src/groupchat_control.py:1340 #, python-format msgid "" "Usage: /%s [reason], bans the JID from the group chat. The " @@ -4471,19 +4672,16 @@ msgstr "" "trenutno u sobi, on/ona/ono će biti izbačen(a/o). Razmaci u imenima NISU " "podržani." -#: ../src/groupchat_control.py:1259 +#: ../src/groupchat_control.py:1347 #, python-format msgid "" -"Usage: /%s , opens a private chat window to the specified occupant." +"Usage: /%s , opens a private chat window with the specified " +"occupant." msgstr "" -"Način korištenja: /%s , otvara privatni razgovor sa učesnikom" +"Način korištenja: /%s , otvara privatni razgovor sa navedenim " +"učesnikom." -#: ../src/groupchat_control.py:1263 -#, python-format -msgid "Usage: /%s, clears the text window." -msgstr "Način korištenja: /%s, prazni tekstualni prozor" - -#: ../src/groupchat_control.py:1265 +#: ../src/groupchat_control.py:1353 #, python-format msgid "" "Usage: /%s [reason], closes the current window or tab, displaying reason if " @@ -4492,12 +4690,7 @@ msgstr "" "Način korištenja: /%s [razlog], zatvara trenutni prozor ili tab, i prikazuje " "razlog ako je specificiran." -#: ../src/groupchat_control.py:1268 -#, python-format -msgid "Usage: /%s, hide the chat buttons." -msgstr "Način korištenja: /%s, sakriva dugmadi." - -#: ../src/groupchat_control.py:1271 +#: ../src/groupchat_control.py:1359 #, python-format msgid "" "Usage: /%s [reason], invites JID to the current group chat, optionally " @@ -4506,7 +4699,7 @@ msgstr "" "Način korištenja: /%s [razlog], poziva JID u trenutni grupni razgovor, " "opcionalno dajući razlog." -#: ../src/groupchat_control.py:1275 +#: ../src/groupchat_control.py:1363 #, python-format msgid "" "Usage: /%s @[/nickname], offers to join room@server optionally " @@ -4515,7 +4708,7 @@ msgstr "" "Način korištenja: /%s @[/nadimak], nudi mogućnost " "spajanja na sobu@poslužitelj koristeći navedeni nadimak." -#: ../src/groupchat_control.py:1279 +#: ../src/groupchat_control.py:1367 #, python-format msgid "" "Usage: /%s [reason], removes the occupant specified by nickname " @@ -4526,7 +4719,7 @@ msgstr "" "nadimkom iz grupnog razgovora i opcionalno prikazuje razlog. NE podržava " "razmake u nadimku." -#: ../src/groupchat_control.py:1284 +#: ../src/groupchat_control.py:1372 #, python-format msgid "" "Usage: /%s , sends action to the current group chat. Use third " @@ -4535,107 +4728,120 @@ msgstr "" "Način korištenja: /%s , šalje akciju trenutnom grupnom razgovoru. " "Koristite treću osobu. (npr. /%s eksplodira.)" -#: ../src/groupchat_control.py:1288 +#: ../src/groupchat_control.py:1376 #, python-format msgid "" -"Usage: /%s [message], opens a private message windowand sends " +"Usage: /%s [message], opens a private message window and sends " "message to the occupant specified by nickname." msgstr "" "Način korištenja: /%s [poruka], otvara prozor privatne poruke i " -"šalje poruku učesniku specificiranom pomoću nadimka." +"šalje poruku učesniku navedenom nadimkom." -#: ../src/groupchat_control.py:1293 +#: ../src/groupchat_control.py:1381 #, python-format msgid "Usage: /%s , changes your nickname in current group chat." msgstr "" "Način korištenja: /%s , mjenja vaš nadimak u trenutnom grupnom " "razgovoru." -#: ../src/groupchat_control.py:1297 +#: ../src/groupchat_control.py:1385 #, python-format msgid "Usage: /%s , display the names of group chat occupants." msgstr "Način korištenja: /%s , prikazuje imena učesnika u grupnom razgovoru." -#: ../src/groupchat_control.py:1301 +#: ../src/groupchat_control.py:1389 #, python-format msgid "Usage: /%s [topic], displays or updates the current group chat topic." msgstr "" "Način korištenja: /%s [tema], prikazuje ili ažurira temu grupnog razgovora." -#: ../src/groupchat_control.py:1304 +#: ../src/groupchat_control.py:1392 #, python-format msgid "" "Usage: /%s , sends a message without looking for other commands." msgstr "" "Način korištenja: /%s , šalje poruku bez gledanja za ostale komande." -#: ../src/groupchat_control.py:1307 -#, python-format -msgid "No help info for /%s" -msgstr "Nema informacija ni pomoći za /%s" - -#: ../src/groupchat_control.py:1356 +#: ../src/groupchat_control.py:1458 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Jeste li sigurni da želite napustiti grupni razgovor \"%s\"?" -#: ../src/groupchat_control.py:1358 +#: ../src/groupchat_control.py:1460 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "" "Ako zatvorite ovaj prozor, biti ćete odspojeni iz ovog grupnog razgovora." -#: ../src/groupchat_control.py:1362 ../src/roster_window.py:3962 +#: ../src/groupchat_control.py:1464 ../src/roster_window.py:4504 msgid "Do _not ask me again" msgstr "_Ne pitaj me više" -#: ../src/groupchat_control.py:1396 +#: ../src/groupchat_control.py:1498 msgid "Changing Subject" msgstr "Mijenjanje Teme" -#: ../src/groupchat_control.py:1397 +#: ../src/groupchat_control.py:1499 msgid "Please specify the new subject:" msgstr "Molimo specificirajte novu temu:" -#: ../src/groupchat_control.py:1406 +#: ../src/groupchat_control.py:1508 msgid "Changing Nickname" msgstr "Mijenjam Nadimak" -#: ../src/groupchat_control.py:1407 +#: ../src/groupchat_control.py:1509 msgid "Please specify the new nickname you want to use:" msgstr "Molimo specificirajte novi nadimak ako ga želite koristiti:" -#: ../src/groupchat_control.py:1432 +#. Ask for a reason +#: ../src/groupchat_control.py:1524 +#, python-format +msgid "Destroying %s" +msgstr "Uništavam %s" + +#: ../src/groupchat_control.py:1525 +msgid "" +"You are going to definitively destroy this room.\n" +"You may specify a reason below:" +msgstr "" +"Definitivno će te uništiti ovu sobu.\n" +"Ispod možete navesti razlog:" + +#: ../src/groupchat_control.py:1527 +msgid "You may also enter an alternate venue:" +msgstr "Također možete unjeti alternativno mjesto sastanka:" + +#: ../src/groupchat_control.py:1557 msgid "Bookmark already set" msgstr "Knjižna oznaka je već postavljena" -#: ../src/groupchat_control.py:1433 +#: ../src/groupchat_control.py:1558 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Grupni Razgovor \"%s\" je već u vašim knjižnim oznakama." -#: ../src/groupchat_control.py:1442 +#: ../src/groupchat_control.py:1567 msgid "Bookmark has been added successfully" msgstr "Knjižna oznaka je bez uspješno dodana" -#: ../src/groupchat_control.py:1443 +#: ../src/groupchat_control.py:1568 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "" "Možete upravljati vašim knjižnim oznakama pomoću izbornika Akcije u vašem " "spisku." #. ask for reason -#: ../src/groupchat_control.py:1569 +#: ../src/groupchat_control.py:1703 #, python-format msgid "Kicking %s" msgstr "Izbacujem %s" -#: ../src/groupchat_control.py:1570 ../src/groupchat_control.py:1852 +#: ../src/groupchat_control.py:1704 ../src/groupchat_control.py:1996 msgid "You may specify a reason below:" msgstr "Možete specificirati razlog ispod:" #. ask for reason -#: ../src/groupchat_control.py:1851 +#: ../src/groupchat_control.py:1995 #, python-format msgid "Banning %s" msgstr "Zabranjujem pristup %s" @@ -4660,67 +4866,80 @@ msgid "Details" msgstr "Detalji" #. we talk about file -#: ../src/gtkgui_helpers.py:153 ../src/gtkgui_helpers.py:168 +#: ../src/gtkgui_helpers.py:156 ../src/gtkgui_helpers.py:171 #, python-format msgid "Error: cannot open %s for reading" msgstr "Greška: nije moguće otvoriti %s za čitanje" -#: ../src/gtkgui_helpers.py:293 +#: ../src/gtkgui_helpers.py:336 msgid "Error reading file:" msgstr "Greška pri čitanju datoteke:" -#: ../src/gtkgui_helpers.py:296 +#: ../src/gtkgui_helpers.py:339 msgid "Error parsing file:" msgstr "Greška pri učitavanju datoteke:" #. do not traceback (could be a permission problem) #. we talk about a file here -#: ../src/gtkgui_helpers.py:334 +#: ../src/gtkgui_helpers.py:376 #, python-format msgid "Could not write to %s. Session Management support will not work" msgstr "Nije moguće pisati u %s. Rukovanje sesijama neće biti moguće" -#: ../src/gtkgui_helpers.py:728 +#. xmpp: is currently handled by another program, so ask the user +#: ../src/gtkgui_helpers.py:711 +msgid "Gajim is not the default Jabber client" +msgstr "Gajim nije zadani Jabber klijent" + +#: ../src/gtkgui_helpers.py:712 +msgid "Would you like to make Gajim the default Jabber client?" +msgstr "Želite li postaviti Gajim za zadani Jabber klijent?" + +#: ../src/gtkgui_helpers.py:713 +msgid "Always check to see if Gajim is the default Jabber client on startup" +msgstr "Uvijek provjeri ako je Gajim zadani Jabber klijent, pri pokretanju" + +#: ../src/gtkgui_helpers.py:812 msgid "Extension not supported" msgstr "Produžetak nije podržan" -#: ../src/gtkgui_helpers.py:729 +#: ../src/gtkgui_helpers.py:813 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" "Sliku nije moguće spremiti u %(type)s formatu. Spremiti kao %(new_filename)s?" -#: ../src/gtkgui_helpers.py:738 +#: ../src/gtkgui_helpers.py:822 msgid "Save Image as..." msgstr "Snimiti Sliku kao..." -#: ../src/history_manager.py:64 +#: ../src/history_manager.py:65 msgid "Cannot find history logs database" msgstr "Nije moguće pronaći bazu podataka zabilješki povijesti" #. holds jid -#: ../src/history_manager.py:107 +#: ../src/history_manager.py:108 msgid "Contacts" msgstr "Kontakti" #. holds time -#: ../src/history_manager.py:120 ../src/history_manager.py:160 +#: ../src/history_manager.py:121 ../src/history_manager.py:161 #: ../src/history_window.py:86 msgid "Date" msgstr "Datum" #. holds nickname -#: ../src/history_manager.py:126 ../src/history_manager.py:178 +#: ../src/history_manager.py:127 ../src/history_manager.py:179 msgid "Nickname" msgstr "Nadimak" #. holds message -#: ../src/history_manager.py:134 ../src/history_manager.py:166 +#: ../src/history_manager.py:135 ../src/history_manager.py:167 #: ../src/history_window.py:94 msgid "Message" msgstr "Poruka" -#: ../src/history_manager.py:186 +#: ../src/history_manager.py:187 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" @@ -4728,7 +4947,7 @@ msgstr "" "Želite li očistiti bazu podataka? (NE PREPORUČUJEMO UKOLIKO JE GAJIM " "POKRENUT)" -#: ../src/history_manager.py:188 +#: ../src/history_manager.py:189 msgid "" "Normally allocated database size will not be freed, it will just become " "reusable. If you really want to reduce database filesize, click YES, else " @@ -4742,7 +4961,7 @@ msgstr "" "\n" "Ukoliko pritisnite Da, pričekajte..." -#: ../src/history_manager.py:400 +#: ../src/history_manager.py:401 msgid "Exporting History Logs..." msgstr "Izvozim Zabilješke Povijesti..." @@ -4774,109 +4993,130 @@ msgstr[2] "" msgid "Conversation History with %s" msgstr "Povijest Razgovora sa %s" -#: ../src/history_window.py:261 +#: ../src/history_window.py:266 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s je trenutno %(status)s: %(status_msg)s" -#: ../src/history_window.py:265 ../src/notify.py:198 +#: ../src/history_window.py:270 ../src/notify.py:201 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s je trenutno %(status)s" -#: ../src/history_window.py:271 +#: ../src/history_window.py:276 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Stauts je trenutno: %(status)s: %(status_msg)s" -#: ../src/history_window.py:274 +#: ../src/history_window.py:279 #, python-format msgid "Status is now: %(status)s" msgstr "Status je trenutno: %(status)s" -#: ../src/message_window.py:273 +#: ../src/htmltextview.py:583 ../src/htmltextview.py:594 +msgid "Timeout loading image" +msgstr "Vrijeme isteklo kod učitavanja slike" + +#: ../src/htmltextview.py:604 +msgid "Image is too big" +msgstr "Slika je prevelika" + +#: ../src/message_window.py:276 +msgid "Chats" +msgstr "Razgovori" + +#: ../src/message_window.py:278 +msgid "Group Chats" +msgstr "Grupni Razgovori" + +#: ../src/message_window.py:280 +msgid "Private Chats" +msgstr "Privanti Razgovori" + +#: ../src/message_window.py:282 msgid "Messages" msgstr "Poruke" -#: ../src/message_window.py:274 +#: ../src/message_window.py:283 #, python-format msgid "%s - Gajim" msgstr "%s - Gajim" -#: ../src/notify.py:196 +#: ../src/notify.py:199 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s je Promjenio Status" -#: ../src/notify.py:206 +#: ../src/notify.py:209 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s Se Prijavio" -#: ../src/notify.py:214 +#: ../src/notify.py:217 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s Se Odjavio" -#: ../src/notify.py:226 +#: ../src/notify.py:229 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Nova Jedna Poruka od %(nickname)s" -#: ../src/notify.py:234 +#: ../src/notify.py:237 #, python-format msgid "New Private Message from group chat %s" msgstr "Nova Privatna Poruka iz privatnog razgovora %s" -#: ../src/notify.py:235 +#: ../src/notify.py:238 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:241 +#: ../src/notify.py:244 #, python-format msgid "New Message from %(nickname)s" msgstr "Nova poruka od %(nickname)s" -#: ../src/profile_window.py:72 ../src/profile_window.py:376 +#: ../src/profile_window.py:72 msgid "Retrieving profile..." msgstr "Dohvaćam profil..." -#: ../src/profile_window.py:107 ../src/profile_window.py:203 -#: ../src/profile_window.py:212 ../src/profile_window.py:370 -msgid "Click to set your avatar" -msgstr "Kliknite za postavljanje avatara" +#: ../src/profile_window.py:127 ../src/vcard.py:135 +msgid "File is empty" +msgstr "Datoteka je prazna" + +#: ../src/profile_window.py:130 ../src/vcard.py:138 +msgid "File does not exist" +msgstr "Datoteka ne postoji" #. keep identation -#: ../src/profile_window.py:136 +#. unknown format +#: ../src/profile_window.py:144 ../src/profile_window.py:160 +#: ../src/vcard.py:140 ../src/vcard.py:151 msgid "Could not load image" msgstr "Nemogu učitati sliku" -#: ../src/profile_window.py:238 +#: ../src/profile_window.py:261 msgid "Information received" msgstr "Primljene informacije" -#: ../src/profile_window.py:308 +#: ../src/profile_window.py:330 msgid "Without a connection you can not publish your contact information." msgstr "Bez veze ne možete objaviti informacije o sebi" -#: ../src/profile_window.py:320 +#: ../src/profile_window.py:342 msgid "Sending profile..." msgstr "Šaljem profil..." -#: ../src/profile_window.py:328 -msgid "Information published" -msgstr "Informacije objavljene" - -#: ../src/profile_window.py:340 +#: ../src/profile_window.py:357 msgid "Information NOT published" msgstr "Informacije NISU objavljene" -#: ../src/profile_window.py:347 +#: ../src/profile_window.py:364 msgid "vCard publication failed" msgstr "Objava vCard neuspješna" -#: ../src/profile_window.py:348 +#: ../src/profile_window.py:365 msgid "" "There was an error while publishing your personal information, try again " "later." @@ -4884,26 +5124,30 @@ msgstr "" "Nastala je greška prilikom objavljivanja vaših osobnih podataka, pokušajte " "ponovno kasnije." -#: ../src/profile_window.py:374 -msgid "Without a connection, you can not get your contact information." -msgstr "Bez veze ne možete dobiti informacije o kontaktu." - -#: ../src/roster_window.py:168 ../src/roster_window.py:223 +#: ../src/roster_window.py:173 ../src/roster_window.py:228 msgid "Merged accounts" msgstr "Spojeni računi" -#: ../src/roster_window.py:340 ../src/common/helpers.py:42 +#: ../src/roster_window.py:347 ../src/roster_window.py:602 +#: ../src/common/helpers.py:43 msgid "Observers" msgstr "Posmatrači" -#: ../src/roster_window.py:686 ../src/roster_window.py:3133 +#: ../src/roster_window.py:373 ../src/roster_window.py:429 +#: ../src/roster_window.py:434 ../src/roster_window.py:2442 +#: ../src/common/commands.py:194 ../src/common/contacts.py:89 +#: ../src/common/helpers.py:43 +msgid "Groupchats" +msgstr "Grupni Razgovori" + +#: ../src/roster_window.py:752 ../src/roster_window.py:3651 msgid "You cannot join a group chat while you are invisible" msgstr "Nije moguće pridruživanje grupnom razgovoru dok ste nevidljivi" #. new chat #. for chat_with #. for single message -#: ../src/roster_window.py:878 ../src/systray.py:187 ../src/systray.py:192 +#: ../src/roster_window.py:968 ../src/systray.py:206 ../src/systray.py:211 #, python-format msgid "using account %s" msgstr "koristeći račun %s" @@ -4911,68 +5155,68 @@ msgstr "koristeći račun %s" #. the 'manage gc bookmarks' item is shown #. below to avoid duplicate code #. add -#: ../src/roster_window.py:903 +#: ../src/roster_window.py:993 #, python-format msgid "to %s account" msgstr "na %s račun" #. disco -#: ../src/roster_window.py:908 +#: ../src/roster_window.py:998 #, python-format msgid "using %s account" msgstr "koristeći %s račun" #. profile, avatar -#: ../src/roster_window.py:983 +#: ../src/roster_window.py:1073 #, python-format msgid "of account %s" msgstr "računa %s" -#: ../src/roster_window.py:1003 +#: ../src/roster_window.py:1093 msgid "_Manage Bookmarks..." msgstr "Upravljanje Knjižni_m Oznakama..." -#: ../src/roster_window.py:1032 +#: ../src/roster_window.py:1122 #, python-format msgid "for account %s" msgstr "za račun %s" #. History manager -#: ../src/roster_window.py:1053 +#: ../src/roster_window.py:1143 msgid "History Manager" msgstr "Upravitelj Povijesti" -#: ../src/roster_window.py:1062 +#: ../src/roster_window.py:1152 msgid "_Join New Group Chat" msgstr "Pridružit_i se Novom Grupnom Razgovoru" -#: ../src/roster_window.py:1380 ../src/roster_window.py:3326 -#: ../src/roster_window.py:3333 +#: ../src/roster_window.py:1493 ../src/roster_window.py:3847 +#: ../src/roster_window.py:3854 msgid "You have unread messages" msgstr "Imte nepročitane poruke" -#: ../src/roster_window.py:1381 +#: ../src/roster_window.py:1494 msgid "You must read them before removing this transport." msgstr "Morate ih pročitati prije uklanjanja ovog prijenosa." -#: ../src/roster_window.py:1384 +#: ../src/roster_window.py:1497 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Prijenos \"%s\" biti će uklonjen" -#: ../src/roster_window.py:1385 +#: ../src/roster_window.py:1498 msgid "" -"You will no longer be able to send and receive messages to contacts from " +"You will no longer be able to send and receive messages from contacts using " "this transport." msgstr "" -"Više nećete biti u mogućnosti razmjenjivati poruka sa kontaktima ovog " -"prijenosa." +"Više nećete biti u mogućnosti razmjenjivati poruka sa kontaktima koji " +"koriste ovaj prijenos." -#: ../src/roster_window.py:1388 +#: ../src/roster_window.py:1501 msgid "Transports will be removed" msgstr "Prijenos će biti uklonjen" -#: ../src/roster_window.py:1393 +#: ../src/roster_window.py:1506 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " @@ -4982,114 +5226,122 @@ msgstr "" "prijenosa:%s" #. it's jid -#: ../src/roster_window.py:1413 +#: ../src/roster_window.py:1672 msgid "Rename Contact" msgstr "Preimenuj Kontakt" -#: ../src/roster_window.py:1414 +#: ../src/roster_window.py:1673 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Unesite novi nadimak za kontakt %s" -#: ../src/roster_window.py:1421 +#: ../src/roster_window.py:1680 msgid "Rename Group" msgstr "Preimenuj Grupu" -#: ../src/roster_window.py:1422 +#: ../src/roster_window.py:1681 #, python-format msgid "Enter a new name for group %s" msgstr "Unesite novo ime za grupu %s" -#: ../src/roster_window.py:1476 +#: ../src/roster_window.py:1756 msgid "Remove Group" msgstr "Ukloni Grupu" -#: ../src/roster_window.py:1477 +#: ../src/roster_window.py:1757 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Želite li ukloniti grupu %s sa liste kontakata?" -#: ../src/roster_window.py:1478 +#: ../src/roster_window.py:1758 msgid "Remove also all contacts in this group from your roster" msgstr "Ujedno ukloni i sve kontakte sa ove grupe sa liste kontakata" -#: ../src/roster_window.py:1502 +#: ../src/roster_window.py:1789 msgid "Assign OpenPGP Key" msgstr "Dodjeli OpenPGP Ključ" -#: ../src/roster_window.py:1503 +#: ../src/roster_window.py:1790 msgid "Select a key to apply to the contact" msgstr "Odaberite ključ za dodavanje kontaktu" -#: ../src/roster_window.py:1784 ../src/roster_window.py:1960 +#: ../src/roster_window.py:2030 ../src/roster_window.py:2324 msgid "_New group chat" msgstr "_Novi grupni razgovor" -#: ../src/roster_window.py:1842 +#: ../src/roster_window.py:2175 msgid "I would like to add you to my roster" msgstr "Želio bih vas dodati na svoju listu kontakata" -#: ../src/roster_window.py:2005 ../src/roster_window.py:2052 +#: ../src/roster_window.py:2369 ../src/roster_window.py:2476 msgid "Send Group M_essage" msgstr "Pošalji _Grupnu Poruku" -#: ../src/roster_window.py:2031 +#: ../src/roster_window.py:2406 +msgid "_Maximize" +msgstr "_Maksimiziraj" + +#: ../src/roster_window.py:2455 msgid "Re_name" msgstr "Pre_imenuj" -#: ../src/roster_window.py:2058 +#: ../src/roster_window.py:2482 msgid "To all users" msgstr "Svim korisnicima" -#: ../src/roster_window.py:2061 +#: ../src/roster_window.py:2485 msgid "To all online users" msgstr "Svim spojenim korisnicima" -#: ../src/roster_window.py:2097 +#: ../src/roster_window.py:2505 +msgid "Send Cus_tom Status" +msgstr "Šalje Prila_gođeni Status" + +#: ../src/roster_window.py:2562 msgid "_Log on" msgstr "_Prijava" -#: ../src/roster_window.py:2107 +#: ../src/roster_window.py:2572 msgid "Log _off" msgstr "_Odjava" -#: ../src/roster_window.py:2229 ../src/roster_window.py:2300 +#: ../src/roster_window.py:2694 ../src/roster_window.py:2765 msgid "_Change Status Message" msgstr "_Izmjena Statusne Poruke" -#: ../src/roster_window.py:2372 +#: ../src/roster_window.py:2837 msgid "Authorization has been sent" msgstr "Odobrenje je poslano" -#: ../src/roster_window.py:2373 +#: ../src/roster_window.py:2838 #, python-format msgid "Now \"%s\" will know your status." msgstr "Sada će \"%s\" znati vaš status." -#: ../src/roster_window.py:2393 +#: ../src/roster_window.py:2858 msgid "Subscription request has been sent" msgstr "Zahtjev za pretplatom je poslan" -#: ../src/roster_window.py:2394 +#: ../src/roster_window.py:2859 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Ako \"%s\" prihvati ovaj zahtjev znati će te njegov/njezin status." -#: ../src/roster_window.py:2406 +#: ../src/roster_window.py:2871 msgid "Authorization has been removed" msgstr "Odobrenje je uklonjeno" -#: ../src/roster_window.py:2407 +#: ../src/roster_window.py:2872 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Sada će vas \"%s\" uvijek vidjeti kao odspojenog." -#: ../src/roster_window.py:2615 +#: ../src/roster_window.py:3070 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Kontakt \"%s\" biti će uklonjen sa vaše liste kontakata" -#: ../src/roster_window.py:2619 +#: ../src/roster_window.py:3074 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." @@ -5097,7 +5349,7 @@ msgstr "" "Uklanjanjem ovog kontakta ujedno i uklanjate odobrenje što konačno znači da " "će vas ta osoba uvijek vidjeti kao da ste odspojeni." -#: ../src/roster_window.py:2624 +#: ../src/roster_window.py:3079 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." @@ -5105,16 +5357,16 @@ msgstr "" "Uklanjanjem ovog kontakta ujedno po pretpostavljenom uklanjate i odobrenje " "što konačno znači da će vas ta osoba uvijek vidjeti kao da ste odspojeni." -#: ../src/roster_window.py:2627 +#: ../src/roster_window.py:3082 msgid "I want this contact to know my status after removal" msgstr "Želim da ovaj kontakt zna moj status nakon uklanjanja" #. several contact to remove at the same time -#: ../src/roster_window.py:2631 +#: ../src/roster_window.py:3086 msgid "Contacts will be removed from your roster" msgstr "Kontakti će biti uklonjeni sa vaše liste kontakata" -#: ../src/roster_window.py:2635 +#: ../src/roster_window.py:3090 #, python-format msgid "" "By removing these contacts:%s\n" @@ -5124,40 +5376,48 @@ msgstr "" "ujedno uklanjate i odobrenje što konačno znači da će vas ta osoba uvijek " "vidjeti kao da ste odspojeni." +#: ../src/roster_window.py:3122 +msgid "" +"Gnome Keyring is installed but not correctly started (environment variable " +"probably not correctly set)" +msgstr "" +"Gnome Keyring je instaliran, ali nije ispravno pokrenut (vjerovatno " +"varijabla okruženja nije ispravno postavljena)" + #. TODO: make this string translatable #. %s is the account name here -#: ../src/roster_window.py:2693 ../src/common/connection.py:587 -#: ../src/common/zeroconf/connection_zeroconf.py:158 +#: ../src/roster_window.py:3150 ../src/common/connection.py:692 +#: ../src/common/zeroconf/connection_zeroconf.py:164 #, python-format msgid "You will be connected to %s without OpenPGP." msgstr "Biti će te spojeni na %s bez OpenPGP-a." -#: ../src/roster_window.py:2710 +#: ../src/roster_window.py:3167 msgid "Passphrase Required" msgstr "Potrebna Lozinka" -#: ../src/roster_window.py:2711 +#: ../src/roster_window.py:3168 #, python-format msgid "Enter GPG key passphrase for account %s." msgstr "Unesite lozinku GPG ključa za račun %s." -#: ../src/roster_window.py:2716 +#: ../src/roster_window.py:3173 msgid "Save passphrase" msgstr "Sačuvati lozinku" -#: ../src/roster_window.py:2724 +#: ../src/roster_window.py:3181 msgid "Wrong Passphrase" msgstr "Kriva Lozinka" -#: ../src/roster_window.py:2725 +#: ../src/roster_window.py:3182 msgid "Please retype your GPG passphrase or press Cancel." msgstr "Molimo ponovo utipkajte svoju GPG lozinku ili pritisnite Odustani" -#: ../src/roster_window.py:2782 ../src/roster_window.py:2842 +#: ../src/roster_window.py:3252 ../src/roster_window.py:3320 msgid "You are participating in one or more group chats" msgstr "Sudjelujete u jednom ili više grupnih razovora" -#: ../src/roster_window.py:2783 ../src/roster_window.py:2843 +#: ../src/roster_window.py:3253 ../src/roster_window.py:3321 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" @@ -5165,21 +5425,21 @@ msgstr "" "Promjena vašeg statusa u nevidljivo rezultirati će odspajanjem sa tih " "grupnih razgovora. Jeste li sigurni da želite ići na nevidljivo?" -#: ../src/roster_window.py:2800 +#: ../src/roster_window.py:3278 msgid "No account available" msgstr "Nema dostupnih računa" -#: ../src/roster_window.py:2801 +#: ../src/roster_window.py:3279 msgid "You must create an account before you can chat with other contacts." msgstr "" "Morate stvoriti račun prije nego što možete razgovarati sa drugim kontaktima." -#: ../src/roster_window.py:2899 +#: ../src/roster_window.py:3401 #, python-format msgid "\"%(title)s\" by %(artist)s" msgstr "\"%(title)s\" od %(artist)s" -#: ../src/roster_window.py:3327 ../src/roster_window.py:3334 +#: ../src/roster_window.py:3848 ../src/roster_window.py:3855 msgid "" "Messages will only be available for reading them later if you have history " "enabled." @@ -5187,11 +5447,11 @@ msgstr "" "Poruke će biti dostupne za čitanje i kasnije ukoliko imate omogućenu " "povijest." -#: ../src/roster_window.py:3912 +#: ../src/roster_window.py:4454 msgid "Metacontacts storage not supported by your server" msgstr "Spremanje metakontakata nije podržano na vašem poslužitelju" -#: ../src/roster_window.py:3914 +#: ../src/roster_window.py:4456 msgid "" "Your server does not support storing metacontacts information. So those " "information will not be save on next reconnection." @@ -5199,15 +5459,15 @@ msgstr "" "Vaš poslužitelj ne podržava spremanje informacija metakontakata. Te " "informacije neće biti spremljene na sljedećem spajanju." -#: ../src/roster_window.py:3956 +#: ../src/roster_window.py:4498 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "" "Upravo ćete stvoriti metakontakt. Jeste li sigurni da želite nastaviti?" -#: ../src/roster_window.py:3958 +#: ../src/roster_window.py:4500 msgid "" -"Metacontacts are a way to regroup several contacts in one line. Generaly it " +"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 "" @@ -5215,33 +5475,40 @@ msgstr "" "oni se koriste kada ista osoba ima nekoliko Jabber računa ili računa " "prijenosa." -#: ../src/roster_window.py:4125 +#: ../src/roster_window.py:4578 +#, python-format +msgid "Do you want to send that file to %s:" +msgid_plural "Do you want to send those files to %s:" +msgstr[0] "Želite li poslati tu datoteku kontaktu %s:" +msgstr[1] "Želite li poslati te datoteke kontaktu %s:" + +#: ../src/roster_window.py:4683 #, python-format msgid "Drop %s in group %s" msgstr "Spusti %s u grupu %s" -#: ../src/roster_window.py:4132 +#: ../src/roster_window.py:4690 #, python-format msgid "Make %s and %s metacontacts" msgstr "Učini %s i %s pseudokontaktima" -#: ../src/roster_window.py:4319 +#: ../src/roster_window.py:4877 msgid "Change Status Message..." msgstr "Promijeni Statusnu Poruku..." -#: ../src/systray.py:144 +#: ../src/systray.py:163 msgid "_Change Status Message..." msgstr "_Promijeni Statusnu Poruku..." -#: ../src/systray.py:234 +#: ../src/systray.py:251 msgid "Hide this menu" msgstr "Sakrij ovaj izbornik" -#: ../src/tooltips.py:309 ../src/tooltips.py:492 +#: ../src/tooltips.py:309 ../src/tooltips.py:502 msgid "Jabber ID: " msgstr "Jabber ID: " -#: ../src/tooltips.py:312 ../src/tooltips.py:496 +#: ../src/tooltips.py:312 ../src/tooltips.py:506 msgid "Resource: " msgstr "Resurs: " @@ -5250,75 +5517,91 @@ msgstr "Resurs: " msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s ovog grupnog razgovora" -#: ../src/tooltips.py:430 ../src/tooltips.py:610 +#: ../src/tooltips.py:414 +msgid " [blocked]" +msgstr "[blokirano]" + +#: ../src/tooltips.py:418 +msgid " [minimized]" +msgstr "[minimizirano]" + +#: ../src/tooltips.py:433 ../src/tooltips.py:622 msgid "Status: " msgstr "Status: " -#: ../src/tooltips.py:461 +#: ../src/tooltips.py:464 #, python-format msgid "Last status: %s" msgstr "Zadnji status: %s" -#: ../src/tooltips.py:463 +#: ../src/tooltips.py:466 #, python-format msgid " since %s" msgstr " od %s" +#: ../src/tooltips.py:484 +msgid "Connected" +msgstr "Spojen" + +#: ../src/tooltips.py:486 +msgid "Disconnected" +msgstr "Odspojen" + #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:502 +#: ../src/tooltips.py:513 msgid "Subscription: " msgstr "Pretplata: " -#: ../src/tooltips.py:512 +#: ../src/tooltips.py:523 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:566 +#: ../src/tooltips.py:578 msgid "Download" msgstr "Skidanje" -#: ../src/tooltips.py:572 +#: ../src/tooltips.py:584 msgid "Upload" msgstr "Podizanje" -#: ../src/tooltips.py:579 +#: ../src/tooltips.py:591 msgid "Type: " msgstr "Tip: " -#: ../src/tooltips.py:585 +#: ../src/tooltips.py:597 msgid "Transferred: " msgstr "Prenešeno: " -#: ../src/tooltips.py:588 ../src/tooltips.py:609 +#: ../src/tooltips.py:600 ../src/tooltips.py:621 msgid "Not started" msgstr "Nije početo" -#: ../src/tooltips.py:592 +#: ../src/tooltips.py:604 msgid "Stopped" msgstr "Zaustavljeno" -#: ../src/tooltips.py:594 ../src/tooltips.py:597 +#: ../src/tooltips.py:606 ../src/tooltips.py:609 msgid "Completed" msgstr "Završeno" -#: ../src/tooltips.py:601 +#: ../src/tooltips.py:613 msgid "?transfer status:Paused" msgstr "?status prijenosa:Stanka" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:605 +#: ../src/tooltips.py:617 msgid "Stalled" msgstr "Zaustavljeno" -#: ../src/tooltips.py:607 +#: ../src/tooltips.py:619 msgid "Transferring" msgstr "Prenosim" -#: ../src/tooltips.py:639 +#: ../src/tooltips.py:651 msgid "This service has not yet responded with detailed information" msgstr "Ovaj servis nije još pružio detaljnije informacije" -#: ../src/tooltips.py:642 +#: ../src/tooltips.py:654 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -5326,24 +5609,24 @@ msgstr "" "Ova usluga nije mogla odgovoriti sa detaljnim informacijama.\n" "Najvjerojatnije je zastarjela ili neispravna" -#: ../src/vcard.py:217 +#: ../src/vcard.py:326 msgid "?Client:Unknown" msgstr "?Klijent:Nepoznat" -#: ../src/vcard.py:219 +#: ../src/vcard.py:328 msgid "?OS:Unknown" msgstr "?OS:Nepoznat" -#: ../src/vcard.py:247 ../src/vcard.py:449 +#: ../src/vcard.py:356 ../src/vcard.py:537 #, python-format msgid "since %s" msgstr "od %s" -#: ../src/vcard.py:277 +#: ../src/vcard.py:386 msgid "Affiliation:" msgstr "Pripadnost:" -#: ../src/vcard.py:285 +#: ../src/vcard.py:394 msgid "" "This contact is interested in your presence information, but you are not " "interested in his/her presence" @@ -5351,7 +5634,7 @@ msgstr "" "Ovaj kontakt je zainteresiran za informacije o vašem prisutstvu, ali vas ne " "zanimaju informacije o njegovom/njenom prisustvu" -#: ../src/vcard.py:287 +#: ../src/vcard.py:396 msgid "" "You are interested in the contact's presence information, but he/she is not " "interested in yours" @@ -5359,24 +5642,24 @@ msgstr "" "Vi ste zainteresirani za informacije o prisustvu nekog kontakta, ali nju/" "njega ne interesira vaše prisutstvo" -#: ../src/vcard.py:289 +#: ../src/vcard.py:398 msgid "You and the contact are interested in each other's presence information" msgstr "" "Vi i vaš kontakt ste zainteresirani za informacije o prisustvu jedno drugog" #. None -#: ../src/vcard.py:291 +#: ../src/vcard.py:400 msgid "" "You are not interested in the contact's presence, and neither he/she is " "interested in yours" msgstr "" "Ne interesira vas prisutnost kontakta, niti vaša prisutnost zanima njega/nju" -#: ../src/vcard.py:299 +#: ../src/vcard.py:408 msgid "You are waiting contact's answer about your subscription request" msgstr "Čekate odgovor kontakta o vašem zahtjevu za pretplatom" -#: ../src/vcard.py:311 ../src/vcard.py:338 ../src/vcard.py:482 +#: ../src/vcard.py:412 ../src/vcard.py:439 ../src/vcard.py:562 msgid " resource with priority " msgstr " resurs s prioritetom " @@ -5387,7 +5670,7 @@ msgstr "kreiram bazu zabilješki" #: ../src/common/check_paths.py:89 ../src/common/check_paths.py:100 #: ../src/common/check_paths.py:107 #, python-format -msgid "%s is file but it should be a directory" +msgid "%s is a file but it should be a directory" msgstr "%s je datoteka ali bi trebao biti direktorij" #: ../src/common/check_paths.py:90 ../src/common/check_paths.py:101 @@ -5397,7 +5680,7 @@ msgstr "Gajim će se sad isključiti" #: ../src/common/check_paths.py:115 #, python-format -msgid "%s is directory but should be file" +msgid "%s is a directory but should be a file" msgstr "%s je direktorij ali bi trebao biti datoteka" #: ../src/common/check_paths.py:131 @@ -5405,42 +5688,103 @@ msgstr "%s je direktorij ali bi trebao biti datoteka" msgid "creating %s directory" msgstr "kreiram %s direktorij" -#: ../src/common/config.py:55 +#: ../src/common/commands.py:69 +msgid "Change status information" +msgstr "Izmjeni informacije o statusu" + +#: ../src/common/commands.py:82 +msgid "Change status" +msgstr "Promjeni status" + +#: ../src/common/commands.py:83 +msgid "Set the presence type and description" +msgstr "Postavi tip i opis prisustva" + +#: ../src/common/commands.py:89 +msgid "Free for chat" +msgstr "Slobodan za razgovor" + +#: ../src/common/commands.py:90 +msgid "Online" +msgstr "Spojen" + +#: ../src/common/commands.py:92 +msgid "Extended away" +msgstr "Produženo odsustvo" + +#: ../src/common/commands.py:93 +msgid "Do not disturb" +msgstr "Ne uznemiravaj" + +#: ../src/common/commands.py:94 +msgid "Offline - disconnect" +msgstr "Neumreženo - prekid veze" + +#: ../src/common/commands.py:99 +msgid "Presence description:" +msgstr "Opis prisustva:" + +#: ../src/common/commands.py:134 +msgid "The status has been changed." +msgstr "Status je promjenjen." + +#: ../src/common/commands.py:179 +#, python-format +msgid "%(nickname)s on %(room_jid)s" +msgstr "%(nickname)s u %(room_name)s" + +#: ../src/common/commands.py:183 +msgid "You have not joined a groupchat." +msgstr "Niste se pridružili grupnom razgovoru" + +#: ../src/common/commands.py:189 +msgid "Leave Groupchats" +msgstr "Novi Grupni Razgovor" + +#: ../src/common/commands.py:190 +msgid "Choose the groupchats you want to leave" +msgstr "Izaberite grupne razgovore koje želite napustiti" + +#: ../src/common/commands.py:230 +msgid "You left the following groupchats:" +msgstr "Napustili ste sljedeći grupni razgovor:" + +#: ../src/common/config.py:56 msgid "Use D-Bus and Notification-Daemon to show notifications" msgstr "Koristi DBus i Obavještajni-Demon za prikazivanje obavijesti" -#: ../src/common/config.py:60 +#: ../src/common/config.py:61 msgid "Time in minutes, after which your status changes to away." msgstr "" "Vrijeme u minutama, nako kojega će se vaš status promijeniti u odsutan." -#: ../src/common/config.py:61 +#: ../src/common/config.py:62 msgid "Away as a result of being idle" msgstr "Odsutan, kao posljedica mirovanja" -#: ../src/common/config.py:63 +#: ../src/common/config.py:64 msgid "Time in minutes, after which your status changes to not available." msgstr "" "Vrijeme u minutama, nakon kojega će se vaš status promijenti u nije dostupan." -#: ../src/common/config.py:64 +#: ../src/common/config.py:65 msgid "Not available as a result of being idle" msgstr "Nije dostupan, kao posljedica mirovanja." -#: ../src/common/config.py:82 +#: ../src/common/config.py:83 msgid "" "List (space separated) of rows (accounts and groups) that are collapsed." msgstr "Lista (odvojena razmacima) redova (računa i grupa) koji su otvoreni." -#: ../src/common/config.py:87 +#: ../src/common/config.py:88 msgid "Enable link-local/zeroconf messaging" msgstr "Omogući lokalnu vezu/zeroconf poruke" -#: ../src/common/config.py:90 +#: ../src/common/config.py:91 msgid "Language used by speller" msgstr "Jezik koji koristi pravopis" -#: ../src/common/config.py:91 +#: ../src/common/config.py:92 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" @@ -5450,10 +5794,10 @@ msgstr "" "'ponekad' - ispisuj vrijeme svakih print_ichat_every_foo_minutes minuta.\n" "'nikada' - nikada ne ispisuj vrijeme." -#: ../src/common/config.py:92 +#: ../src/common/config.py:93 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " -"to disable fuzzyclock. 1 is the most precise clock, 4 the less precise one. " +"to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " "This is used only if print_time is 'sometimes'." msgstr "" "Ispisuj vrijeme u razgovorima koristeći Nejasni Sat. Vrijednost nejasnoće od " @@ -5461,26 +5805,28 @@ msgstr "" "najneprecizniji. Ovo se koristi samo ukoliko je prikazivanje _vremena na " "'ponekad'." -#: ../src/common/config.py:95 +#: ../src/common/config.py:96 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Koristi * / _ parove kao znakove za formatiranje." -#: ../src/common/config.py:96 +#: ../src/common/config.py:97 msgid "" "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" "Ako je Istinito, nemoj odstraniti */_ . Tako će *abc* biti podebljano, ali " "omeđeno sa * *." -#: ../src/common/config.py:99 +#: ../src/common/config.py:100 msgid "" -"Uses ReStructured text markup for HTML, plus ascii formatting if selected. " -"(If you want to use this, install docutils)" +"Uses ReStructured text markup to send HTML, plus ascii formatting if " +"selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" +"restructuredtext.html (If you want to use this, install docutils)" msgstr "" -"Koristi ReStructured text markup za HTML i ascii formatiranje ako je " -"odabrano. (Ako ovo želite koristiti, instalirajte docutils)" +"Koristi ReStructured tekst markup za HTML i ascii formatiranje ako je " +"odabrano. Za sintaksu, pogledajte http://docutils.sourceforge.net/docs/ref/" +"rst/restructuredtext.html (Ako ovo želite koristiti, instalirajte docutils)" -#: ../src/common/config.py:108 +#: ../src/common/config.py:109 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." @@ -5488,7 +5834,7 @@ msgstr "" "Znak za dodavanje nakon nadimka pri korištenju završavanja nadimka (tipka " "tab) u grupnom razgovoru" -#: ../src/common/config.py:109 +#: ../src/common/config.py:110 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." @@ -5496,6 +5842,25 @@ msgstr "" "Znak koji treba pokušati dodati željenom nadimku ukoliko netko u grupnom " "razgovoru već koristi željeni nadimak" +#: ../src/common/config.py:133 +msgid "" +"This option let you customize timestamp that is printed in conversation. For " +"exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " +"strftime for full documentation: http://docs.python.org/lib/module-time.html" +msgstr "" +"Ova postavka omogućava prilagođavanje vremenske oznake koja se ispisuje u " +"razgovorima. Na primjer \"[%H:%M] \" će prikazati \"[hour:minute] \". " +"Pogledati python dokumentaciju za strftime za kompletan opis: http://docs." +"python.org/lib/module-time.html" + +#: ../src/common/config.py:134 +msgid "Characters that are printed before the nickname in conversations" +msgstr "Znakovi koji se ispisuju ispred nadimka u razgovorima" + +#: ../src/common/config.py:135 +msgid "Characters that are printed after the nickname in conversations" +msgstr "Znakovi koji se ispisuju nakon nadimka u razgovorima" + #: ../src/common/config.py:142 msgid "Add * and [n] in roster title?" msgstr "Dodaj * i [n] u naslov liste?" @@ -5593,11 +5958,11 @@ msgstr "" #: ../src/common/config.py:164 msgid "" -"Overrides the host we send for File Transfer in case of address translation/" -"port forwarding." +"Comma separated list of hosts that we send, in addition of local interfaces, " +"for File Transfer in case of address translation/port forwarding." msgstr "" -"Prepisuje poslužitelja kojega koristimo za prijenos datoteka u slučaju " -"prosljeđivanja" +"Lista računala odvojenih zarezom koje šaljemo, kao dodatak lokalnim " +"sučeljima, za prijenos datoteka u slučaju prosljeđivanja." #: ../src/common/config.py:166 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." @@ -5617,7 +5982,7 @@ msgstr "Prikaži granicu notesa sa tabovima u prozorima razgovora?" #: ../src/common/config.py:176 msgid "Show close button in tab?" -msgstr "Prikaži dugme za zatvaranje u tabu?" +msgstr "Prikaži gumb za zatvaranje u tabu?" #: ../src/common/config.py:189 msgid "" @@ -5627,26 +5992,35 @@ msgstr "" "razgovorima." #: ../src/common/config.py:190 +msgid "If True, autojoined bookmarked rooms will be minimized on startup." +msgstr "" +"Ako je Istinito, označene sobe kojima se automatski pristupa će biti " +"minimizirane pri pokretanju." + +#: ../src/common/config.py:191 msgid "" "If True, quits Gajim when X button of Window Manager is clicked. This " "setting is taken into account only if trayicon is used." msgstr "" -"Ako je Istinito, Gajim se završava kad je pritisnuto X dugme. Ova postavka " -"je upotrebljena samo ako je trayicon u upotrebi." - -#: ../src/common/config.py:191 -msgid "If True, Gajim registers for xmpp:// on each startup." -msgstr "Ako je Istinito, Gajim registrira za xmpp:// pri svakom pokretanju." +"Ako je Istinito, Gajim se završava kad je pritisnut X gumb. Ova postavka je " +"upotrebljena samo ako je \"trayicon\" u upotrebi." #: ../src/common/config.py:192 msgid "" +"If True, Gajim will check if it's the default jabber client on each startup." +msgstr "" +"Ako je Istinito, Gajim će provjeriti da li je zadani jabber klijent pri " +"svakom pokretanju." + +#: ../src/common/config.py:193 +msgid "" "If True, Gajim will display an icon on each tab containing unread messages. " "Depending on the theme, this icon may be animated." msgstr "" "Ako je Istinito, Gajim će prikazvati ikonu na svakom tabu koji sadrži " "nepročitane poruke. Ovisno o temi, ikona može biti i animirana." -#: ../src/common/config.py:193 +#: ../src/common/config.py:194 msgid "" "If True, Gajim will display the status message, if not empty, for every " "contact under the contact name in roster window." @@ -5654,7 +6028,7 @@ msgstr "" "Ako je Istinito, Gajim će prikazivati statusnu poruku, ako nije prazna, za " "svaki kontakt pod imenom kontakta na listi." -#: ../src/common/config.py:195 +#: ../src/common/config.py:196 msgid "" "If True, Gajim will ask for avatar each contact that did not have an avatar " "last time or has one cached that is too old." @@ -5662,7 +6036,7 @@ msgstr "" "Ako je Istinito, će Gajim poslati upit za avatar svaki kontakt, koji nije " "imao avatar ili je onaj u memoriji prestar" -#: ../src/common/config.py:196 +#: ../src/common/config.py:197 msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." @@ -5670,12 +6044,12 @@ msgstr "" "Ako je Neistinito, više nećete vidjeti statusnu poruku u razgovorima, kada " "kontakt promjeni svoj status i/ili statusnu poruku." -#: ../src/common/config.py:197 +#: ../src/common/config.py:198 msgid "" "can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " "longer print status line in groupchats when a member changes his or her " "status and/or his or her status message. If \"all\" Gajim will print all " -"status messages. If \"in_and_out\", gajim will only print FOO enters/leaves " +"status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " "group chat." msgstr "" "može biti \"ništa\", \"sve\" ili \"ulaz_i_izlaz\". Ako je \"ništa\", Gajim " @@ -5684,29 +6058,29 @@ msgstr "" "prikazivati sve statusne poruke. Ako je \"ulaz_i_izlaz\" Gajim će " "prikazivati samo poruke tipa FOO je ušao/izašao u/iz sobe" -#: ../src/common/config.py:199 +#: ../src/common/config.py:200 msgid "Background color of contacts when they just signed in." msgstr "Boja pozadine kontakata kada su se upravo prijavili." -#: ../src/common/config.py:200 +#: ../src/common/config.py:201 msgid "Background color of contacts when they just signed out." msgstr "Boja pozadine kontakata kada su se upravo odjavili." -#: ../src/common/config.py:202 +#: ../src/common/config.py:203 msgid "" "If True, restored messages will use a smaller font than the default one." msgstr "" "Ako je Istinito, vraćene poruke će koristiti manji font od pretpostavljenog." -#: ../src/common/config.py:203 +#: ../src/common/config.py:204 msgid "Don't show avatar for the transport itself." msgstr "Ne prikazuj avatar za sam transport." -#: ../src/common/config.py:204 +#: ../src/common/config.py:205 msgid "Don't show roster in the system taskbar." msgstr "Ne prikazuj listu kontakata u programskoj traci." -#: ../src/common/config.py:205 +#: ../src/common/config.py:206 msgid "" "If True and installed GTK+ and PyGTK versions are at least 2.8, make the " "window flash (the default behaviour in most Window Managers) when holding " @@ -5716,7 +6090,7 @@ msgstr "" "prozor bljeska (pretpostavljeno ponašanje u većini Upravitelja Prozorima) " "pri novim događajima." -#: ../src/common/config.py:207 +#: ../src/common/config.py:208 msgid "" "Jabberd1.4 does not like sha info when one join a password protected group " "chat. Turn this option to False to stop sending sha info in group chat " @@ -5727,7 +6101,7 @@ msgstr "" "grupnim razgovorima" #. always, never, peracct, pertype should not be translated -#: ../src/common/config.py:210 +#: ../src/common/config.py:211 msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" @@ -5745,35 +6119,35 @@ msgstr "" "svoj prozor. Promjena ove opcije zahtijeva ponovno pokretanje Gajima kako bi " "se promjene primjenile." -#: ../src/common/config.py:211 +#: ../src/common/config.py:212 msgid "If False, you will no longer see the avatar in the chat window." msgstr "Ako je Neistinito, nećete više vidjeti avatar u prozoru razgovora." -#: ../src/common/config.py:212 +#: ../src/common/config.py:213 msgid "If True, pressing the escape key closes a tab/window." msgstr "Ako je Istinito, pritisak na 'esc' tipku zatvara tab/prozor." -#: ../src/common/config.py:213 +#: ../src/common/config.py:214 msgid "Hides the buttons in group chat window." msgstr "Skriva dugmad u prozoru grupnog razgovora." -#: ../src/common/config.py:214 -msgid "Hides the buttons in two persons chat window." -msgstr "Skriva dugme u prozoru razgovora dviju osoba." - #: ../src/common/config.py:215 +msgid "Hides the buttons in two persons chat window." +msgstr "Skriva gumbe u prozoru razgovora dviju osoba." + +#: ../src/common/config.py:216 msgid "Hides the banner in a group chat window" msgstr "Sakrije baner u prozoru grupnog razgovora" -#: ../src/common/config.py:216 +#: ../src/common/config.py:217 msgid "Hides the banner in two persons chat window" msgstr "Sakrije baner u prozoru razgovora dviju osoba" -#: ../src/common/config.py:217 +#: ../src/common/config.py:218 msgid "Hides the group chat occupants list in group chat window." msgstr "Skriva listu učesnika u prozoru grupnog razgovora." -#: ../src/common/config.py:218 +#: ../src/common/config.py:219 msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." @@ -5781,20 +6155,20 @@ msgstr "" "U razgovoru, prikaži nadimak na početku reda samo kada se ne radi o istoj " "osobi koja je pričala i u prošloj poruci." -#: ../src/common/config.py:219 -msgid "Indentation when using merge consecutive nickame." -msgstr "Uvlačenje pri korištenju spajanja toka po nadimcima." - #: ../src/common/config.py:220 +msgid "Indentation when using merge consecutive nickname." +msgstr "Indentacija kod korištenja nadimaka koji se uzastopno pojavljuju." + +#: ../src/common/config.py:221 msgid "List of colors that will be used to color nicknames in group chats." msgstr "" "Lista boja koje će biti korištene za bojanje nadimaka u grupnim razgovorima." -#: ../src/common/config.py:221 +#: ../src/common/config.py:222 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "Ctrl-Tab idi na sljedeći tab kada nema nepročitanih." -#: ../src/common/config.py:222 +#: ../src/common/config.py:223 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." @@ -5802,18 +6176,63 @@ msgstr "" "Trebamo li prikazati upit za potvrdu stvaranja metakontakata ili ne? Prazan " "niz znači da nikada ne prikazujemo upit." -#: ../src/common/config.py:223 +#: ../src/common/config.py:224 msgid "" "If True, you will be able to set a negative priority to your account in " -"account modification window. BE CAREFULL, when you are logged in with a " +"account modification window. BE CAREFUL, when you are logged in with a " "negative priority, you will NOT receive any message from your server." msgstr "" "Ako je Istinito, biti ćete u mogućnosti postaviti negativni prioritet na vaš " "račun u prozoru za izmjenu postavki računa. BUDITE OPREZNI, kada ste " -"prijavljeni sa negativnim prioritetom NEĆETE primati nikakve poruke od " +"prijavljeni sa negativnim prioritetom NEĆETE primati nikakve poruke sa vašeg " "poslužitelja." -#: ../src/common/config.py:234 +#: ../src/common/config.py:225 +msgid "" +"If True, Gajim will use Gnome Keyring (if available) to store account " +"passwords." +msgstr "" +"Ako je Istinito, Gajim će koristiti Gnome Keyring (ako je dostupan) da bi " +"pohranio lozinke računa." + +#: ../src/common/config.py:226 +msgid "" +"If True, Gajim will show number of online and total contacts in account and " +"group rows." +msgstr "" +"Ako je Istinito, Gajim će prikazivati broj prisutnih i ukupnih kontakata u " +"redovima za račune i grupe." + +#: ../src/common/config.py:227 +msgid "" +"Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " +"as if they were of this type" +msgstr "" +"Može biti prazno, 'chat' ili 'normal'. Ako nije prazno, tretiraj sve dolazne " +"poruke kao da su izabrane vrste" + +#: ../src/common/config.py:228 +msgid "" +"If True, Gajim will scroll and select the contact who sent you the last " +"message, if chat window is not already opened." +msgstr "" +"Ako je Istinito, Gajim će otklizati i izabrati izabrati kontakt koji vam je " +"poslao posljednju poruku, ako prozor s razgovorom već nije otvoren." + +#: ../src/common/config.py:229 +msgid "" +"If True, Gajim will convert string between $$ and $$ to an image using dvips " +"and convert before insterting it in chat window." +msgstr "" +"Ako je Istinito, Gajim će pretvoriti frazu između $$ i $$ u sliku koristeći " +"dvips i pretvoriti prije ubacivanja u prozor s razgovorom." + +#: ../src/common/config.py:230 +msgid "Time of inactivity needed before the change status window closes down." +msgstr "" +"Vrijeme neaktivnosti potrebno da bi se prozor za promjenu statusa zatvorio." + +#: ../src/common/config.py:241 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." @@ -5822,11 +6241,11 @@ msgstr "" "definirani u autopriority_* opcijama." #. yes, no, ask -#: ../src/common/config.py:263 +#: ../src/common/config.py:270 msgid "Jabberd2 workaround" msgstr "Jabberd2 workaround" -#: ../src/common/config.py:267 +#: ../src/common/config.py:274 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." @@ -5834,101 +6253,101 @@ msgstr "" "Ako je označeno, Gajim če koristiti vašu IP adresu i proxy koji je definiran " "u file_transfer_proxies opcijama za prijenos." -#: ../src/common/config.py:326 +#: ../src/common/config.py:333 msgid "Is OpenPGP enabled for this contact?" msgstr "Je li OpenPGP omogućen za ovog kontakta?" -#: ../src/common/config.py:327 ../src/common/config.py:330 +#: ../src/common/config.py:334 ../src/common/config.py:337 msgid "Language for which we want to check misspelled words" msgstr "Jezik u kojem želimo provjeriti krivo napisane riječi" -#: ../src/common/config.py:336 +#: ../src/common/config.py:343 msgid "all or space separated status" msgstr "sve ili razmakom odvojen status" -#: ../src/common/config.py:337 +#: ../src/common/config.py:344 msgid "'yes', 'no', or 'both'" msgstr "'da', 'ne', ili 'oboje'" -#: ../src/common/config.py:338 ../src/common/config.py:340 -#: ../src/common/config.py:341 ../src/common/config.py:344 -#: ../src/common/config.py:345 +#: ../src/common/config.py:345 ../src/common/config.py:347 +#: ../src/common/config.py:348 ../src/common/config.py:351 +#: ../src/common/config.py:352 msgid "'yes', 'no' or ''" msgstr "'da', 'ne' ili ''" -#: ../src/common/config.py:351 +#: ../src/common/config.py:358 msgid "Sleeping" msgstr "Spavam" -#: ../src/common/config.py:352 +#: ../src/common/config.py:359 msgid "Back soon" msgstr "Vraćam se ubrzo" -#: ../src/common/config.py:352 +#: ../src/common/config.py:359 msgid "Back in some minutes." msgstr "Vraćam se za nekoliko minuta." -#: ../src/common/config.py:353 +#: ../src/common/config.py:360 msgid "Eating" msgstr "Jedem" -#: ../src/common/config.py:353 +#: ../src/common/config.py:360 msgid "I'm eating, so leave me a message." msgstr "Jedem, ostavite mi poruku." -#: ../src/common/config.py:354 +#: ../src/common/config.py:361 msgid "Movie" msgstr "Film" -#: ../src/common/config.py:354 +#: ../src/common/config.py:361 msgid "I'm watching a movie." msgstr "Gledam film." -#: ../src/common/config.py:355 +#: ../src/common/config.py:362 msgid "Working" msgstr "Radim." -#: ../src/common/config.py:355 +#: ../src/common/config.py:362 msgid "I'm working." msgstr "Radim." -#: ../src/common/config.py:356 +#: ../src/common/config.py:363 msgid "Phone" msgstr "Telefon" -#: ../src/common/config.py:356 +#: ../src/common/config.py:363 msgid "I'm on the phone." msgstr "Telefoniram." -#: ../src/common/config.py:357 +#: ../src/common/config.py:364 msgid "Out" msgstr "Vani" -#: ../src/common/config.py:357 +#: ../src/common/config.py:364 msgid "I'm out enjoying life." msgstr "Vani uživam život." -#: ../src/common/config.py:361 +#: ../src/common/config.py:368 msgid "I'm available." msgstr "Dostupan sam." -#: ../src/common/config.py:362 +#: ../src/common/config.py:369 msgid "I'm free for chat." msgstr "Slobodan sam za razgovor." -#: ../src/common/config.py:364 +#: ../src/common/config.py:371 msgid "I'm not available." msgstr "Nedostupan sam." -#: ../src/common/config.py:365 +#: ../src/common/config.py:372 msgid "Do not disturb." -msgstr "Ne smetaj." +msgstr "Ne uznemiravaj." -#: ../src/common/config.py:366 ../src/common/config.py:367 +#: ../src/common/config.py:373 ../src/common/config.py:374 msgid "Bye!" msgstr "Pozdrav!" -#: ../src/common/config.py:376 +#: ../src/common/config.py:383 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." @@ -5937,23 +6356,23 @@ msgstr "" "muc_highlight_words, ili kada neka poruka grupnog razgovora sadrži vaš " "nadimak." -#: ../src/common/config.py:377 +#: ../src/common/config.py:384 msgid "Sound to play when any MUC message arrives." msgstr "Zvuk koji će svirati kada stigne neka MUC poruka." -#: ../src/common/config.py:386 ../src/common/optparser.py:197 +#: ../src/common/config.py:393 ../src/common/optparser.py:195 msgid "green" msgstr "zelena" -#: ../src/common/config.py:390 ../src/common/optparser.py:183 +#: ../src/common/config.py:397 ../src/common/optparser.py:181 msgid "grocery" msgstr "namirnice" -#: ../src/common/config.py:394 +#: ../src/common/config.py:401 msgid "human" msgstr "ljudska" -#: ../src/common/config.py:398 +#: ../src/common/config.py:405 msgid "marine" msgstr "morska" @@ -5962,26 +6381,32 @@ msgstr "morska" msgid "Unable to load idle module" msgstr "Nije moguće učitati modul idle" -#: ../src/common/connection_handlers.py:177 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 +#: ../src/common/connection_handlers.py:180 +#: ../src/common/connection_handlers.py:215 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 msgid "Wrong host" msgstr "Krivi domaćin" -#: ../src/common/connection_handlers.py:177 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 +#: ../src/common/connection_handlers.py:180 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 +#, python-format msgid "" -"The host you configured as the ft_override_host_to_send advanced option is " +"The host %s you configured as the ft_add_hosts_to_send advanced option is " "not valid, so ignored." msgstr "" -"Domaćin koji ste postavili kao ft_override_host_to_send naprednu opciju nije " -"ispravan, time ignoriran." +"Domaćin %s koji ste postavili kao ft_add_hosts_to_send naprednu opciju nije " +"ispravan, biti će ignoriran." -#: ../src/common/connection_handlers.py:590 +#: ../src/common/connection_handlers.py:216 +msgid "Invalid local address? :-O" +msgstr "Neispravna lokalna adresa? :-O" + +#: ../src/common/connection_handlers.py:607 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Registracijske informacije za transport %s nisu došle na vrijeme" -#: ../src/common/connection_handlers.py:1523 +#: ../src/common/connection_handlers.py:1573 #, python-format msgid "Nickname not allowed: %s" msgstr "Nedozvoljeni nadimak: %s " @@ -5989,41 +6414,41 @@ msgstr "Nedozvoljeni nadimak: %s " #. password required to join #. we are banned #. group chat does not exist -#: ../src/common/connection_handlers.py:1585 -#: ../src/common/connection_handlers.py:1588 -#: ../src/common/connection_handlers.py:1591 -#: ../src/common/connection_handlers.py:1594 -#: ../src/common/connection_handlers.py:1597 -#: ../src/common/connection_handlers.py:1600 -#: ../src/common/connection_handlers.py:1608 +#: ../src/common/connection_handlers.py:1640 +#: ../src/common/connection_handlers.py:1643 +#: ../src/common/connection_handlers.py:1646 +#: ../src/common/connection_handlers.py:1649 +#: ../src/common/connection_handlers.py:1652 +#: ../src/common/connection_handlers.py:1655 +#: ../src/common/connection_handlers.py:1663 msgid "Unable to join group chat" msgstr "Nije moguće pridružiti se grupnom razgovoru" -#: ../src/common/connection_handlers.py:1586 +#: ../src/common/connection_handlers.py:1641 msgid "A password is required to join this group chat." msgstr "Potrebna je lozinka za pridruživanje ovom grupnom razgovoru." -#: ../src/common/connection_handlers.py:1589 +#: ../src/common/connection_handlers.py:1644 msgid "You are banned from this group chat." msgstr "Zabranjen vam je pristup ovom grupnom razgovoru." -#: ../src/common/connection_handlers.py:1592 +#: ../src/common/connection_handlers.py:1647 msgid "Such group chat does not exist." msgstr "Takav grupni razgovor ne postoji." -#: ../src/common/connection_handlers.py:1595 +#: ../src/common/connection_handlers.py:1650 msgid "Group chat creation is restricted." msgstr "Stvaranje grupnih razgovora je ograničeno." -#: ../src/common/connection_handlers.py:1598 +#: ../src/common/connection_handlers.py:1653 msgid "Your registered nickname must be used." msgstr "Morate koristiti vaš registrirani nadimak." -#: ../src/common/connection_handlers.py:1601 +#: ../src/common/connection_handlers.py:1656 msgid "You are not in the members list." msgstr "Niste u listi članova." -#: ../src/common/connection_handlers.py:1609 +#: ../src/common/connection_handlers.py:1664 msgid "" "Your desired nickname is in use or registered by another occupant.\n" "Please specify another nickname below:" @@ -6032,27 +6457,38 @@ msgstr "" "od učesnika.\n" "Molimo niže odredite drugi nadimak:" -#: ../src/common/connection_handlers.py:1659 +#. Room has been destroyed. see +#. http://www.xmpp.org/extensions/xep-0045.html#destroyroom +#: ../src/common/connection_handlers.py:1692 +msgid "Room has been destroyed" +msgstr "Soba je uništena" + +#: ../src/common/connection_handlers.py:1699 +#, python-format +msgid "You can join this room instead: %s" +msgstr "Možete se pridružiti ovoj sobi umjesto: %s" + +#: ../src/common/connection_handlers.py:1726 msgid "I would like to add you to my roster." msgstr "Želio bih te dodati na moju listu kontakata." #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:1680 +#: ../src/common/connection_handlers.py:1747 #, python-format msgid "we are now subscribed to %s" msgstr "sada smo pretplaćeni na %s" -#: ../src/common/connection_handlers.py:1682 +#: ../src/common/connection_handlers.py:1749 #, python-format msgid "unsubscribe request from %s" msgstr "Zahtjev za ukidanjem pretplate od %s" -#: ../src/common/connection_handlers.py:1684 +#: ../src/common/connection_handlers.py:1751 #, python-format msgid "we are now unsubscribed from %s" msgstr "sada smo ukinuli pretplatu za %s" -#: ../src/common/connection_handlers.py:1854 +#: ../src/common/connection_handlers.py:1870 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " @@ -6062,79 +6498,112 @@ msgstr "" "Upotrijebite alate za upravljanje listom kontakata kao što je http://jru." "jabberstudio.org/ za uklanjanje" -#: ../src/common/connection.py:175 -#: ../src/common/zeroconf/connection_zeroconf.py:196 +#: ../src/common/connection.py:197 +#: ../src/common/zeroconf/connection_zeroconf.py:202 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Veza sa računom \"%s\" je izgubljena" -#: ../src/common/connection.py:176 +#: ../src/common/connection.py:198 msgid "Reconnect manually." msgstr "Ponovo se spojite ručno." -#: ../src/common/connection.py:187 ../src/common/connection.py:214 +#: ../src/common/connection.py:209 +#, fuzzy, python-format +msgid "Server %s answered wrongly to register request: %s" +msgstr "Prijenos %s je krivo odgovorio na poziv za registraciju: %s" + +#. wrong answer +#: ../src/common/connection.py:220 +msgid "Invalid answer" +msgstr "Nepravilan odgovor" + +#: ../src/common/connection.py:221 #, python-format msgid "Transport %s answered wrongly to register request: %s" msgstr "Prijenos %s je krivo odgovorio na poziv za registraciju: %s" -#. wrong answer -#: ../src/common/connection.py:213 -msgid "Invalid answer" -msgstr "Nepravilan odgovor" +#: ../src/common/connection.py:368 +msgid "Connection to proxy failed" +msgstr "Veza na proxy nije uspjela" -#: ../src/common/connection.py:405 ../src/common/connection.py:440 -#: ../src/common/connection.py:889 -#: ../src/common/zeroconf/connection_zeroconf.py:217 +#: ../src/common/connection.py:422 ../src/common/connection.py:520 +#: ../src/common/connection.py:1051 +#: ../src/common/zeroconf/connection_zeroconf.py:236 #, python-format msgid "Could not connect to \"%s\"" msgstr "Nije moguća veza sa \"%s\"" -#: ../src/common/connection.py:419 +#: ../src/common/connection.py:436 #, python-format msgid "Connected to server %s:%s with %s" msgstr "Povezan na poslužitelj %s:%s sa %s" -#: ../src/common/connection.py:441 +#: ../src/common/connection.py:449 +#, python-format +msgid "Security error connecting to \"%s\"" +msgstr "Sigurnosna greška prilikom spajanja na \"%s\"" + +#: ../src/common/connection.py:450 +msgid "" +"The server's key has changed, or someone is trying to hack your connection." +msgstr "Ključ servera se promjenio, ili netko pokušava prtljati po vašoj vezi." + +#: ../src/common/connection.py:457 +#, python-format +msgid "Unable to check fingerprint for %s. Connection could be insecure." +msgstr "Nemoguće provjeriti potpis za %s. Veza može biti nesigurna." + +#: ../src/common/connection.py:499 +#, python-format +msgid "Missing fingerprint in SSL connection to %s" +msgstr "Nedostaje potpis u SSL vezi do %s" + +#: ../src/common/connection.py:505 +#, python-format +msgid "Fingerprint mismatch for %s: Got %s, expected %s" +msgstr "Potpis se ne slaže za %s: Dobiveno %s, očekivano %s" + +#: ../src/common/connection.py:521 msgid "Check your connection or try again later" msgstr "Provjerite vašu vezu ili pokušajte ponovno kasnije" -#: ../src/common/connection.py:467 +#: ../src/common/connection.py:547 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Autentifikacija sa \"%s\" nije uspjela" -#: ../src/common/connection.py:468 +#: ../src/common/connection.py:548 msgid "Please check your login and password for correctness." msgstr "Molimo vas da provjerite korisničko ime i lozinku za greške." +#: ../src/common/connection.py:591 +msgid "Error while removing privacy list" +msgstr "Greška prilikom brisanja liste privatnosti" + +#: ../src/common/connection.py:592 +#, 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 "" +"Lista privatnosti %s nije uklonjena. Možda je aktivna u nekom od vaših " +"spojenih resursa. Obustavite ju i pokušajte ponovno." + #. We didn't set a passphrase -#: ../src/common/connection.py:585 -#: ../src/common/zeroconf/connection_zeroconf.py:156 +#: ../src/common/connection.py:690 +#: ../src/common/zeroconf/connection_zeroconf.py:162 msgid "OpenPGP passphrase was not given" msgstr "Lozinka za OpenPGP nije unešena" -#. do not show I'm invisible! -#: ../src/common/connection.py:627 -msgid "invisible" -msgstr "nevidljiv" - -#: ../src/common/connection.py:628 -msgid "offline" -msgstr "odspojen" - -#: ../src/common/connection.py:629 -#, python-format -msgid "I'm %s" -msgstr "Ja sam %s" - #. we're not english #. one in locale and one en -#: ../src/common/connection.py:720 +#: ../src/common/connection.py:847 msgid "[This message is *encrypted* (See :JEP:`27`]" msgstr "[Ova poruka je *kriptirana* (Vidi :JEP:`27`]" -#: ../src/common/connection.py:776 -#: ../src/common/zeroconf/connection_zeroconf.py:397 +#: ../src/common/connection.py:903 +#: ../src/common/zeroconf/connection_zeroconf.py:421 #, python-format msgid "" "Subject: %s\n" @@ -6143,10 +6612,14 @@ msgstr "" "Tema: %s\n" "%s" -#: ../src/common/connection.py:915 +#: ../src/common/connection.py:1075 msgid "Not fetched because of invisible status" msgstr "Nije dohvaćeno zbog statusa nevidljivosti" +#: ../src/common/contacts.py:279 +msgid "Not in roster" +msgstr "Nije na Listi Kontakata" + #. only say that to non Windows users #: ../src/common/dbus_support.py:33 msgid "D-Bus python bindings are missing in this computer" @@ -6228,391 +6701,391 @@ msgstr "dvanaest" #. Strings to use for the output. %0 will be replaced with the preceding hour (e.g. "x PAST %0"), %1 with the coming hour (e.g. "x TO %1). ''' #. A "singular-form". It is used when talking about hour 0 #: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 -msgid "%0 o'clock" -msgstr "%0 sati" +msgid "$0 o'clock" +msgstr "$0 sati" #: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 -msgid "five past %0" -msgstr "pet poslije %0" - -#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:56 -msgid "ten past %0" -msgstr "deset poslije %0" +msgid "five past $0" +msgstr "pet poslije $0" #: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 -msgid "quarter past %0" -msgstr "četvrt poslije %0" +msgid "ten past $0" +msgstr "deset poslije $0" -#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:57 -msgid "twenty past %0" -msgstr "dvadeset poslije %0" +#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 +msgid "quarter past $0" +msgstr "četvrt poslije $0" #: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 -msgid "twenty five past %0" -msgstr "dvadeset pet poslije %0" +msgid "twenty past $0" +msgstr "dvadeset poslije $0" -#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:58 -msgid "half past %0" -msgstr "%0 i pola" +#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 +msgid "twenty five past $0" +msgstr "dvadeset pet poslije $0" #: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 -msgid "twenty five to %1" -msgstr "dvadeset i pet do %1" +msgid "half past $0" +msgstr "$0 i pola" -#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:59 -msgid "twenty to %1" -msgstr "dvadeset do %1" +#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 +msgid "twenty five to $1" +msgstr "dvadeset i pet do $1" #: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 -msgid "quarter to %1" -msgstr "četvrt do %1" +msgid "twenty to $1" +msgstr "dvadeset do $1" -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:60 -msgid "ten to %1" -msgstr "deset do %1" - -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:60 -msgid "five to %1" -msgstr "pet do %1" +#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 +msgid "quarter to $1" +msgstr "četvrt do $1" #: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 -msgid "%1 o'clock" -msgstr "%1 sati" +msgid "ten to $1" +msgstr "deset do $1" -#: ../src/common/fuzzyclock.py:62 +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +msgid "five to $1" +msgstr "pet do $1" + +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:61 +msgid "$1 o'clock" +msgstr "$1 sati" + +#: ../src/common/fuzzyclock.py:64 msgid "Night" msgstr "Noć" -#: ../src/common/fuzzyclock.py:62 +#: ../src/common/fuzzyclock.py:64 msgid "Early morning" msgstr "Rano jutro" -#: ../src/common/fuzzyclock.py:62 +#: ../src/common/fuzzyclock.py:64 msgid "Morning" msgstr "Jutro" -#: ../src/common/fuzzyclock.py:62 +#: ../src/common/fuzzyclock.py:64 msgid "Almost noon" msgstr "Skoro podne" -#: ../src/common/fuzzyclock.py:63 +#: ../src/common/fuzzyclock.py:65 msgid "Noon" msgstr "Podne" -#: ../src/common/fuzzyclock.py:63 +#: ../src/common/fuzzyclock.py:65 msgid "Afternoon" msgstr "Poslijepodne" -#: ../src/common/fuzzyclock.py:63 +#: ../src/common/fuzzyclock.py:65 msgid "Evening" msgstr "Večer" -#: ../src/common/fuzzyclock.py:63 +#: ../src/common/fuzzyclock.py:65 msgid "Late evening" msgstr "Kasna večer" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:67 msgid "Start of week" msgstr "Početak tjedna" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:67 msgid "Middle of week" msgstr "Sredina tjedna" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:67 msgid "End of week" msgstr "Kraj tjedna" -#: ../src/common/fuzzyclock.py:66 +#: ../src/common/fuzzyclock.py:68 msgid "Weekend!" msgstr "Vikend!" -#: ../src/common/helpers.py:105 +#: ../src/common/helpers.py:114 msgid "Invalid character in username." msgstr "Neispravan znak u korisničkom imenu." -#: ../src/common/helpers.py:110 +#: ../src/common/helpers.py:119 msgid "Server address required." msgstr "Potrebna je adresa poslužitelja." -#: ../src/common/helpers.py:115 +#: ../src/common/helpers.py:124 msgid "Invalid character in hostname." msgstr "Neispravan znak u imenu računala." -#: ../src/common/helpers.py:121 +#: ../src/common/helpers.py:130 msgid "Invalid character in resource." msgstr "Neispravan znak u resursu." #. GiB means gibibyte -#: ../src/common/helpers.py:161 +#: ../src/common/helpers.py:170 #, python-format msgid "%s GiB" msgstr "%s GiB" #. GB means gigabyte -#: ../src/common/helpers.py:164 +#: ../src/common/helpers.py:173 #, python-format msgid "%s GB" msgstr "%s GB" #. MiB means mibibyte -#: ../src/common/helpers.py:168 +#: ../src/common/helpers.py:177 #, python-format msgid "%s MiB" msgstr "%s MiB" #. MB means megabyte -#: ../src/common/helpers.py:171 +#: ../src/common/helpers.py:180 #, python-format msgid "%s MB" msgstr "%s MB" #. KiB means kibibyte -#: ../src/common/helpers.py:175 +#: ../src/common/helpers.py:184 #, python-format msgid "%s KiB" msgstr "%s KiB" #. KB means kilo bytes -#: ../src/common/helpers.py:178 +#: ../src/common/helpers.py:187 #, python-format msgid "%s KB" msgstr "%s KB" #. B means bytes -#: ../src/common/helpers.py:181 +#: ../src/common/helpers.py:190 #, python-format msgid "%s B" msgstr "%s B" -#: ../src/common/helpers.py:210 +#: ../src/common/helpers.py:219 msgid "_Busy" -msgstr "_Zaposlen" +msgstr "_Zauzet" -#: ../src/common/helpers.py:212 +#: ../src/common/helpers.py:221 msgid "Busy" -msgstr "Zaposlen" +msgstr "Zauzet" -#: ../src/common/helpers.py:215 +#: ../src/common/helpers.py:224 msgid "_Not Available" msgstr "_Nedostupan" -#: ../src/common/helpers.py:220 +#: ../src/common/helpers.py:229 msgid "_Free for Chat" msgstr "_Slobodan za razgovor" -#: ../src/common/helpers.py:222 +#: ../src/common/helpers.py:231 msgid "Free for Chat" msgstr "Slobodan za razgovor" -#: ../src/common/helpers.py:225 +#: ../src/common/helpers.py:234 msgid "_Available" msgstr "_Dostupan" -#: ../src/common/helpers.py:227 +#: ../src/common/helpers.py:236 msgid "Available" msgstr "Dostupan" -#: ../src/common/helpers.py:229 +#: ../src/common/helpers.py:238 msgid "Connecting" msgstr "Povezujem" -#: ../src/common/helpers.py:232 +#: ../src/common/helpers.py:241 msgid "A_way" msgstr "O_dsutan" -#: ../src/common/helpers.py:237 +#: ../src/common/helpers.py:246 msgid "_Offline" msgstr "_Odspojen" -#: ../src/common/helpers.py:239 +#: ../src/common/helpers.py:248 msgid "Offline" msgstr "Odspojen" -#: ../src/common/helpers.py:242 +#: ../src/common/helpers.py:251 msgid "_Invisible" msgstr "_Nevidljiv" -#: ../src/common/helpers.py:248 +#: ../src/common/helpers.py:257 msgid "?contact has status:Unknown" msgstr "?kontakt ima status:Nepoznat" -#: ../src/common/helpers.py:250 +#: ../src/common/helpers.py:259 msgid "?contact has status:Has errors" msgstr "?kontakt ima status:Ima greške" -#: ../src/common/helpers.py:255 +#: ../src/common/helpers.py:264 msgid "?Subscription we already have:None" msgstr "?Pretplata koju već imamo:Ništa" -#: ../src/common/helpers.py:257 +#: ../src/common/helpers.py:266 msgid "To" msgstr "Za" -#: ../src/common/helpers.py:261 +#: ../src/common/helpers.py:270 msgid "Both" msgstr "Oboje" -#: ../src/common/helpers.py:269 +#: ../src/common/helpers.py:278 msgid "?Ask (for Subscription):None" msgstr "?Pitaj (za Pretplatu):Ništa" -#: ../src/common/helpers.py:271 +#: ../src/common/helpers.py:280 msgid "Subscribe" msgstr "Pretplatite se" -#: ../src/common/helpers.py:280 +#: ../src/common/helpers.py:289 msgid "?Group Chat Contact Role:None" msgstr "?Uloga Kontakta u Grupnom Razgvoru:Nikakva" -#: ../src/common/helpers.py:283 +#: ../src/common/helpers.py:292 msgid "Moderators" msgstr "Moderatori" -#: ../src/common/helpers.py:285 +#: ../src/common/helpers.py:294 msgid "Moderator" msgstr "Moderator" -#: ../src/common/helpers.py:288 +#: ../src/common/helpers.py:297 msgid "Participants" msgstr "Sudionici" -#: ../src/common/helpers.py:290 +#: ../src/common/helpers.py:299 msgid "Participant" msgstr "Sudionik" -#: ../src/common/helpers.py:293 +#: ../src/common/helpers.py:302 msgid "Visitors" msgstr "Posjetitelji" -#: ../src/common/helpers.py:295 +#: ../src/common/helpers.py:304 msgid "Visitor" msgstr "Posjetitelj" -#: ../src/common/helpers.py:301 +#: ../src/common/helpers.py:310 msgid "?Group Chat Contact Affiliation:None" msgstr "?Vezanost Kontakta u Grupnom Razgvoru:Nikakva" -#: ../src/common/helpers.py:303 +#: ../src/common/helpers.py:312 msgid "Owner" msgstr "Vlasnik" -#: ../src/common/helpers.py:305 +#: ../src/common/helpers.py:314 msgid "Administrator" msgstr "Administrator" -#: ../src/common/helpers.py:307 +#: ../src/common/helpers.py:316 msgid "Member" msgstr "Član" -#: ../src/common/helpers.py:346 +#: ../src/common/helpers.py:355 msgid "is paying attention to the conversation" msgstr "obraća pažnju na razgovor" -#: ../src/common/helpers.py:348 +#: ../src/common/helpers.py:357 msgid "is doing something else" msgstr "radi nešto drugo" -#: ../src/common/helpers.py:350 +#: ../src/common/helpers.py:359 msgid "is composing a message..." msgstr "piše poruku..." -#. paused means he or she was compoing but has stopped for a while -#: ../src/common/helpers.py:353 +#. paused means he or she was composing but has stopped for a while +#: ../src/common/helpers.py:362 msgid "paused composing a message" msgstr "stanka pri pisanju poruke" -#: ../src/common/helpers.py:355 +#: ../src/common/helpers.py:364 msgid "has closed the chat window or tab" msgstr "je zatvorio/zatvorila prozor za razgovor" -#: ../src/common/helpers.py:881 +#: ../src/common/helpers.py:894 #, python-format msgid " %d unread message" msgid_plural " %d unread messages" msgstr[0] "%d nepročitana poruka" msgstr[1] "%d nepročitanih poruka" -#: ../src/common/helpers.py:887 +#: ../src/common/helpers.py:900 #, python-format msgid " %d unread single message" msgid_plural " %d unread single messages" msgstr[0] "%d nepročitana jedna poruka" msgstr[1] "%d nepročitanih jednih poruka" -#: ../src/common/helpers.py:893 +#: ../src/common/helpers.py:906 #, python-format msgid " %d unread group chat message" msgid_plural " %d unread group chat messages" msgstr[0] "%d nepročitana poruka grupnih razgovora" msgstr[1] "%d nepročitanih poruka grupnih razgovora" -#: ../src/common/helpers.py:899 +#: ../src/common/helpers.py:912 #, python-format msgid " %d unread private message" msgid_plural " %d unread private messages" msgstr[0] "Gajim - %d nepročitana privatna poruka" msgstr[1] "%d nepročitanih privatnih poruka" -#: ../src/common/helpers.py:909 ../src/common/helpers.py:911 +#: ../src/common/helpers.py:922 ../src/common/helpers.py:924 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" #. we talk about a file -#: ../src/common/optparser.py:60 +#: ../src/common/optparser.py:59 #, python-format msgid "error: cannot open %s for reading" msgstr "greška: nemogu otvoriti %s za čitanje" -#: ../src/common/optparser.py:183 +#: ../src/common/optparser.py:181 msgid "gtk+" msgstr "gtk+" -#: ../src/common/optparser.py:192 ../src/common/optparser.py:193 +#: ../src/common/optparser.py:190 ../src/common/optparser.py:191 msgid "cyan" msgstr "cijan" -#: ../src/common/optparser.py:302 -msgid "migrating logs database to indeces" +#: ../src/common/optparser.py:308 +msgid "migrating logs database to indices" msgstr "migriram bazu zabilješki u indekse" -#: ../src/common/passwords.py:86 +#: ../src/common/passwords.py:82 #, python-format msgid "Gajim account %s" msgstr "Gajim račun %s" -#: ../src/common/zeroconf/client_zeroconf.py:189 +#: ../src/common/zeroconf/client_zeroconf.py:187 msgid "" "Connection to host could not be established: Incorrect answer from server." msgstr "" "Vezu sa domaćinom nije moguće ostvariti: Neispravan odgovor od poslužitelja." -#: ../src/common/zeroconf/client_zeroconf.py:205 +#: ../src/common/zeroconf/client_zeroconf.py:213 msgid "Connection to host could not be established" msgstr "Vezu na domaćina nije moguće ostvariti" -#: ../src/common/zeroconf/client_zeroconf.py:334 +#: ../src/common/zeroconf/client_zeroconf.py:347 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" "Vezu sa domaćinom nije moguće ostvariti: Isteklo vrijeme za slanja podataka." -#: ../src/common/zeroconf/client_zeroconf.py:629 +#: ../src/common/zeroconf/client_zeroconf.py:640 msgid "Contact is offline. Your message could not be sent." msgstr "Kontakt je odspojen. Vašu poruku nije moguće poslati." -#: ../src/common/zeroconf/connection_zeroconf.py:197 +#: ../src/common/zeroconf/connection_zeroconf.py:203 msgid "To continue sending and receiving messages, you will need to reconnect." msgstr "" "Ako želite nastaviti sa slanjem i primanjem poruka, morati će te se ponovno " "spojiti." -#: ../src/common/zeroconf/connection_zeroconf.py:207 +#: ../src/common/zeroconf/connection_zeroconf.py:226 msgid "Avahi error" msgstr "Avahi greška" -#: ../src/common/zeroconf/connection_zeroconf.py:207 +#: ../src/common/zeroconf/connection_zeroconf.py:226 #, python-format msgid "" "%s\n" @@ -6621,31 +7094,31 @@ msgstr "" "%s\n" "Poruke lokalne veze možda ne rade kako treba." -#: ../src/common/zeroconf/connection_zeroconf.py:218 +#: ../src/common/zeroconf/connection_zeroconf.py:237 msgid "Please check if Avahi is installed." msgstr "Molimo provjerite da je Avahi instaliran." -#: ../src/common/zeroconf/connection_zeroconf.py:227 -#: ../src/common/zeroconf/connection_zeroconf.py:231 +#: ../src/common/zeroconf/connection_zeroconf.py:246 +#: ../src/common/zeroconf/connection_zeroconf.py:250 msgid "Could not start local service" msgstr "Nije moguće pokrenuti lokalnu uslugu" -#: ../src/common/zeroconf/connection_zeroconf.py:228 +#: ../src/common/zeroconf/connection_zeroconf.py:247 #, python-format msgid "Unable to bind to port %d." msgstr "Nemoguće vezanje na port %d." -#: ../src/common/zeroconf/connection_zeroconf.py:232 -#: ../src/common/zeroconf/connection_zeroconf.py:325 +#: ../src/common/zeroconf/connection_zeroconf.py:251 +#: ../src/common/zeroconf/connection_zeroconf.py:345 msgid "Please check if avahi-daemon is running." msgstr "Molimo provjerite da li je avahi-daemon pokrenut." -#: ../src/common/zeroconf/connection_zeroconf.py:324 +#: ../src/common/zeroconf/connection_zeroconf.py:344 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Nije moguće promjeniti status računa \"%s\"" -#: ../src/common/zeroconf/connection_zeroconf.py:341 +#: ../src/common/zeroconf/connection_zeroconf.py:361 msgid "" "You are not connected or not visible to others. Your message could not be " "sent." @@ -6653,7 +7126,7 @@ msgstr "" "Niste spojeni ili ste nevidljivi za druge. Vašu poruku nije moguće poslati." #. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:353 +#: ../src/common/zeroconf/connection_zeroconf.py:373 msgid "[This message is encrypted]" msgstr "[Ova poruka je kriptirana]" @@ -6662,81 +7135,14 @@ msgstr "[Ova poruka je kriptirana]" msgid "Error while adding service. %s" msgstr "Greška prilikom dodavanja usluge. %s" -#~ msgid "Add" -#~ msgstr "Dodaj" +#~ msgid "_Retype Password:" +#~ msgstr "_Ponovo utipkajte Password:" -#~ msgid "Away " -#~ msgstr "Odsutan" +#~ msgid "_Use proxy" +#~ msgstr "_Koristi proxy" -#~ msgid "Down" -#~ msgstr "Skidanje" +#~ msgid "_Occupant Actions" +#~ msgstr "_Akcije Prisutnih" -#~ msgid "List of special notifications settings" -#~ msgstr "Lista podešenja posebnih obavijesti" - -#~ msgid "Not Available " -#~ msgstr "Nedostupan" - -#~ msgid "Up" -#~ msgstr "Gore" - -#~ msgid "Create your own Privacy Lists" -#~ msgstr "Sami stvorite svoju vlasitu Listu Privatnosti" - -#~ msgid "Server-based Privacy Lists" -#~ msgstr "Liste Privatnosti ovisne o poslužitelju" - -#~ msgid "Contact _Info" -#~ msgstr "Kontakt _Info" - -#~ msgid "Jabber" -#~ msgstr "Jabber" - -#~ msgid "Invalid room or server name" -#~ msgstr "Neispravno ime sobe ili poslužitelja" - -#~ msgid "Unknown D-Bus version: %s" -#~ msgstr "Nepoznata verzija D-Busa: %s" - -#~ msgid "vCard publication succeeded" -#~ msgstr "Objava vCard uspješna" - -#~ msgid "Your personal information has been published successfully." -#~ msgstr "Vaši osobni podaci su uspješno objavljeni." - -#~ msgid "Migrating Logs..." -#~ msgstr "Selim Zapise..." - -#~ msgid "_Join New Room" -#~ msgstr "_Pridruživanje Novoj Sobi" - -#~ msgid "Gajim - %d unread message" -#~ msgid_plural "Gajim - %d unread messages" -#~ msgstr[0] "Gajim - %d nepročitana poruka" -#~ msgstr[1] "Gajim - %d nepročitanih poruka" -#~ msgstr[2] "" - -#~ msgid "Role: " -#~ msgstr "Uloga: " - -#~ msgid "Since %s" -#~ msgstr "Od %s" - -#~ msgid "Merge consecutive nickname in chat window" -#~ msgstr "Spajanje toka po nadimcima u prozoru razgovora" - -#~ msgid "" -#~ "Sound to play when any MUC message arrives. (This setting is taken into " -#~ "account only if notify_on_all_muc_messages is True)" -#~ msgstr "" -#~ "Zvuk koji će biti pušten kad je primljena neka MUC poruka. (Ova postavka " -#~ "je postavljena samo ako je notify_on_all_muc_messages Istinito)" - -#~ msgid "Automatically authorize contact" -#~ msgstr "Automatski autoriziraj kontakt" - -#~ msgid "Send File" -#~ msgstr "Pošalji Datoteku" - -#~ msgid "Underline" -#~ msgstr "Podcrtano" +#~ msgid "You must enter a password for the new account." +#~ msgstr "Morate unesti lozinku za novi račun" diff --git a/po/pl.po b/po/pl.po index b4b56ebda..39fab72d4 100644 --- a/po/pl.po +++ b/po/pl.po @@ -5,15 +5,16 @@ # Automatically generated, 2005. # # -#: ../src/gajim-remote.py:203 ../src/gajim-remote.py:210 -#: ../src/gajim-remote.py:236 ../src/gajim-remote.py:237 -#: ../src/gajim-remote.py:243 ../src/gajim-remote.py:244 -#: ../src/gajim-remote.py:245 ../src/gajim-remote.py:246 +#: ../src/chat_control.py:1182 ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:210 ../src/gajim-remote.py:236 +#: ../src/gajim-remote.py:237 ../src/gajim-remote.py:243 +#: ../src/gajim-remote.py:244 ../src/gajim-remote.py:245 +#: ../src/gajim-remote.py:246 msgid "" msgstr "" "Project-Id-Version: gajim 2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-01-17 22:32+0100\n" +"POT-Creation-Date: 2007-05-02 20:42+0200\n" "PO-Revision-Date: 2006-11-08 09:01+0100\n" "Last-Translator: Maciej Chojnacki \n" "Language-Team: Polish \n" @@ -111,17 +112,17 @@ msgid "I want to _register for a new account" msgstr "Chcę za_rejestrować nowe konto Jabbera" #: ../data/glade/account_creation_wizard_window.glade.h:11 -#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/account_modification_window.glade.h:20 msgid "If checked, Gajim will remember the password for this account" msgstr "Włączenie tej opcji spowoduje zapamiętanie hasła dla tego konta" #: ../data/glade/account_creation_wizard_window.glade.h:12 -#: ../data/glade/manage_proxies_window.glade.h:6 +#: ../data/glade/manage_proxies_window.glade.h:7 msgid "Pass_word:" msgstr "_Hasło:" #: ../data/glade/account_creation_wizard_window.glade.h:13 -#: ../data/glade/account_modification_window.glade.h:38 +#: ../data/glade/account_modification_window.glade.h:40 msgid "Save pass_word" msgstr "Zapisz _hasło" @@ -155,17 +156,17 @@ msgid "_Finish" msgstr "_Zakończ" #: ../data/glade/account_creation_wizard_window.glade.h:21 -#: ../data/glade/manage_proxies_window.glade.h:9 +#: ../data/glade/manage_proxies_window.glade.h:10 msgid "_Host:" msgstr "_Host:" #: ../data/glade/account_creation_wizard_window.glade.h:22 -#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/account_modification_window.glade.h:50 msgid "_Password:" msgstr "_Hasło:" #: ../data/glade/account_creation_wizard_window.glade.h:23 -#: ../data/glade/manage_proxies_window.glade.h:10 +#: ../data/glade/manage_proxies_window.glade.h:11 msgid "_Port:" msgstr "_Port:" @@ -182,7 +183,7 @@ msgid "_Use proxy" msgstr "_Korzystaj z pośrednika" #: ../data/glade/account_creation_wizard_window.glade.h:27 -#: ../data/glade/manage_proxies_window.glade.h:11 +#: ../data/glade/manage_proxies_window.glade.h:12 msgid "_Username:" msgstr "_Nazwa użytkownika:" @@ -210,19 +211,23 @@ msgid "Account Modification" msgstr "Modyfikacja konta" #: ../data/glade/account_modification_window.glade.h:6 +msgid "Administration operations" +msgstr "Operacje administracyjne" + +#: ../data/glade/account_modification_window.glade.h:7 msgid "Auto-reconnect when connection is lost" msgstr "Automatyczne połącz po zerwaniu połączenia" -#: ../data/glade/account_modification_window.glade.h:7 +#: ../data/glade/account_modification_window.glade.h:8 #: ../data/glade/zeroconf_properties_window.glade.h:3 msgid "C_onnect on Gajim startup" msgstr "P_ołącz przy starcie programu" -#: ../data/glade/account_modification_window.glade.h:8 +#: ../data/glade/account_modification_window.glade.h:9 msgid "Chan_ge Password" msgstr "Z_mień hasło" -#: ../data/glade/account_modification_window.glade.h:9 +#: ../data/glade/account_modification_window.glade.h:10 msgid "" "Check this so Gajim will connect in port 5223 where legacy servers are " "expected to have SSL capabilities. Note that Gajim uses TLS encryption by " @@ -233,44 +238,48 @@ msgstr "" "serwerów udostępnia usługę SSL. Gajim używa szyfrowania TLS domyślnie, jeśli " "tylko serwer daje taką możliwość. Ta opcja wyłącza TLS" -#: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/account_modification_window.glade.h:11 #: ../data/glade/zeroconf_properties_window.glade.h:4 msgid "Choose _Key..." msgstr "Wybierz _klucz..." -#: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/account_modification_window.glade.h:12 msgid "Click to change account's password" msgstr "Kliknij, aby zmienić hasło dla konta" -#: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/account_modification_window.glade.h:13 +msgid "Click to request authorization to all contacts of another account" +msgstr "Kliknij aby poprosić o autoryzację od wszystkich kontaktów z innego konta" + +#: ../data/glade/account_modification_window.glade.h:14 msgid "Connection" msgstr "Połączenie" -#: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/account_modification_window.glade.h:15 msgid "Edit Personal Information..." msgstr "Zmień informacje o sobie..." -#: ../data/glade/account_modification_window.glade.h:14 +#: ../data/glade/account_modification_window.glade.h:16 #: ../data/glade/roster_window.glade.h:5 ../src/notify.py:458 #: ../src/notify.py:480 ../src/notify.py:492 ../src/common/helpers.py:914 msgid "Gajim" msgstr "Gajim" -#. Contact is not in a group, so count it in General group -#: ../data/glade/account_modification_window.glade.h:15 +#: ../data/glade/account_modification_window.glade.h:17 #: ../data/glade/preferences_window.glade.h:51 #: ../data/glade/zeroconf_properties_window.glade.h:7 -#: ../src/roster_window.py:346 ../src/roster_window.py:1225 -#: ../src/roster_window.py:1436 ../src/roster_window.py:2112 -#: ../src/roster_window.py:2154 ../src/common/contacts.py:280 +#: ../src/roster_window.py:348 ../src/roster_window.py:573 +#: ../src/roster_window.py:1254 ../src/roster_window.py:1613 +#: ../src/roster_window.py:2341 ../src/roster_window.py:2383 +#: ../src/roster_window.py:2420 ../src/common/contacts.py:284 msgid "General" msgstr "Ogólne" -#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/account_modification_window.glade.h:18 msgid "Hostname: " msgstr "Nazwa hosta: " -#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/account_modification_window.glade.h:19 msgid "" "If checked, Gajim will also broadcast some more IPs except from just your " "IP, so file transfer has higher chances of working." @@ -278,7 +287,7 @@ msgstr "" "Jeżeli opcja jest aktywna, Gajim roześle kilka dodatkowych adresów IP poza " "Twoim, tak aby przesyłanie plików przebiegało sprawniej." -#: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/account_modification_window.glade.h:21 msgid "" "If checked, Gajim will send keep-alive packets to prevent connection timeout " "which results in disconnection" @@ -286,7 +295,7 @@ msgstr "" "Zaznaczenie tej opcji spowoduje wysyłanie pakietów podtrzymujących " "połączenie, co zapobiega rozłączaniu" -#: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/account_modification_window.glade.h:22 #: ../data/glade/zeroconf_properties_window.glade.h:8 msgid "" "If checked, Gajim will store the password in ~/.gajim/config with 'read' " @@ -295,7 +304,7 @@ msgstr "" "Zaznaczanie tej opcji spowoduje przechowywanie hasła w pliku ~/.gajim/config " "z prawem do odczytu tylko dla ciebie" -#: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/account_modification_window.glade.h:23 #: ../data/glade/zeroconf_properties_window.glade.h:9 msgid "" "If checked, Gajim, when launched, will automatically connect to jabber using " @@ -304,7 +313,7 @@ msgstr "" "Zaznaczanie tej opcji spowoduje automatyczne łączenie z siecią Jabber z " "wykorzystaniem tego konta" -#: ../data/glade/account_modification_window.glade.h:22 +#: ../data/glade/account_modification_window.glade.h:24 #: ../data/glade/zeroconf_properties_window.glade.h:10 msgid "" "If checked, any change to the global status (handled by the combobox at the " @@ -314,44 +323,47 @@ msgstr "" "Jeśli jest zaznaczone, to każda zmiana statusu globalnego (ustawianego z " "menu na dole okna listy kontaktów) wpłynie odpowiednio na status tego konta" -#: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/account_modification_window.glade.h:25 msgid "Information about you, as stored in the server" msgstr "Informacje o Tobie, takie jakie są przechowywane na serwerze" -#: ../data/glade/account_modification_window.glade.h:24 +#: ../data/glade/account_modification_window.glade.h:26 msgid "Manage..." msgstr "Zarządzaj..." -#: ../data/glade/account_modification_window.glade.h:25 -#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1617 -#: ../src/config.py:3409 +#: ../data/glade/account_modification_window.glade.h:27 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1623 +#: ../src/config.py:3301 msgid "No key selected" msgstr "Nie wybrano żadnego klucza" #. None means no proxy profile selected -#: ../data/glade/account_modification_window.glade.h:27 ../src/config.py:1197 -#: ../src/config.py:1202 ../src/config.py:1386 ../src/config.py:1607 -#: ../src/config.py:1616 ../src/config.py:1675 ../src/config.py:1749 -#: ../src/config.py:3399 ../src/config.py:3408 ../src/dialogs.py:281 -#: ../src/dialogs.py:283 +#. GPG Key +#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/vcard_information_window.glade.h:32 ../src/config.py:1196 +#: ../src/config.py:1201 ../src/config.py:1385 ../src/config.py:1613 +#: ../src/config.py:1622 ../src/config.py:1682 ../src/config.py:1756 +#: ../src/config.py:3291 ../src/config.py:3300 ../src/dialogs.py:281 +#: ../src/dialogs.py:283 ../src/roster_window.py:1717 +#: ../src/roster_window.py:1724 ../src/roster_window.py:1731 msgid "None" msgstr "Żaden" -#: ../data/glade/account_modification_window.glade.h:28 -#: ../data/glade/profile_window.glade.h:25 +#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/profile_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:17 msgid "Personal Information" msgstr "Informacje osobiste" -#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/account_modification_window.glade.h:31 msgid "Port: " msgstr "Port: " -#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/account_modification_window.glade.h:32 msgid "Priori_ty:" msgstr "Priory_tet:" -#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/account_modification_window.glade.h:33 msgid "" "Priority is used in Jabber to determine who gets the events from the jabber " "server when two or more clients are connected using the same account; The " @@ -361,19 +373,19 @@ msgstr "" "serwera gdy dwa klienty (lub więcej) są połączone z tym samym kontem. Ten " "który ma wyższy priorytet, będzie odbierał wiadomości" -#: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/account_modification_window.glade.h:34 msgid "Priority will change automatically according to your status." msgstr "Priorytet ulegnie zmianie automatycznie, stosownie do twojego statusu." -#: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/account_modification_window.glade.h:35 msgid "Proxy:" msgstr "Pośrednik:" -#: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/account_modification_window.glade.h:36 msgid "Resour_ce:" msgstr "Za_sób: " -#: ../data/glade/account_modification_window.glade.h:35 +#: ../data/glade/account_modification_window.glade.h:37 msgid "" "Resource is sent to the Jabber server in order to separate the same JID in " "two or more parts depending on the number of the clients connected in the " @@ -387,46 +399,51 @@ msgstr "" "'Dom' i 'Praca' w tym samym czasie. Klient o najwyższym będzie odbierał " "wiadomości (patrz niżej)" -#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/account_modification_window.glade.h:38 #: ../data/glade/zeroconf_properties_window.glade.h:18 msgid "Save _passphrase (insecure)" msgstr "Zapisz _hasło (nie jest to bezpieczne)" -#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/account_modification_window.glade.h:39 #: ../data/glade/zeroconf_properties_window.glade.h:19 msgid "Save conversation _logs for all contacts" msgstr "Zapisz _logi rozmów dla wszystkich kontaktów" -#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/account_modification_window.glade.h:41 msgid "Send keep-alive packets" msgstr "Wysyłaj pakiety podtrzymujące" -#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/account_modification_window.glade.h:42 #: ../data/glade/zeroconf_properties_window.glade.h:20 msgid "Synch_ronize account status with global status" msgstr "Synch_ronizuj status konta z globalnym statusem" -#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/synchronise_select_account_dialog.glade.h:2 +msgid "Synchronise contacts" +msgstr "Synchronizuj kontakty" + +#: ../data/glade/account_modification_window.glade.h:44 msgid "Use _SSL (legacy)" msgstr "Korzystaj z _SSL" -#: ../data/glade/account_modification_window.glade.h:42 +#: ../data/glade/account_modification_window.glade.h:45 msgid "Use custom hostname/port" msgstr "Użyj własnej nazwy hosta/portu" -#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/account_modification_window.glade.h:46 msgid "Use file transfer proxies" msgstr "Używaj serwerów proxy do przesyłania plików" -#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/account_modification_window.glade.h:47 msgid "_Adjust to status" msgstr "_Dostosuj do statusu" -#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/account_modification_window.glade.h:48 msgid "_Jabber ID:" msgstr "_Jabber ID:" -#: ../data/glade/account_modification_window.glade.h:46 +#: ../data/glade/account_modification_window.glade.h:49 msgid "_Name:" msgstr "_Nazwa: " @@ -619,14 +636,18 @@ msgid "_Administrator" msgstr "_Administrator" #: ../data/glade/advanced_menuitem_menu.glade.h:10 +msgid "_Blocked Contacts" +msgstr "_Kontakty zablokowane" + +#: ../data/glade/advanced_menuitem_menu.glade.h:11 msgid "_Privacy Lists" msgstr "_Listy prywatności" -#: ../data/glade/advanced_menuitem_menu.glade.h:11 +#: ../data/glade/advanced_menuitem_menu.glade.h:12 msgid "_Send Server Message" msgstr "_Wyślij wiadomość do serwera" -#: ../data/glade/advanced_menuitem_menu.glade.h:12 +#: ../data/glade/advanced_menuitem_menu.glade.h:13 msgid "_Send Single Message" msgstr "_Wyślij wiadomość" @@ -790,38 +811,22 @@ msgid "when I'm in" msgstr "kiedy mam " #: ../data/glade/atom_entry_window.glade.h:1 -msgid "2003-12-13T18:30:02Z" -msgstr "2003-12-13T18:30:02Z" - -#: ../data/glade/atom_entry_window.glade.h:2 -msgid "Romeo and Juliet" -msgstr "Romeo i Julia" - -#: ../data/glade/atom_entry_window.glade.h:3 msgid "Entry:" msgstr "Wpis:" -#: ../data/glade/atom_entry_window.glade.h:4 +#: ../data/glade/atom_entry_window.glade.h:2 msgid "Feed name:" msgstr "Nazwa kanału:" -#: ../data/glade/atom_entry_window.glade.h:5 +#: ../data/glade/atom_entry_window.glade.h:3 msgid "Last modified:" msgstr "Ostatnio zmodyfikowany:" -#: ../data/glade/atom_entry_window.glade.h:6 +#: ../data/glade/atom_entry_window.glade.h:4 msgid "New entry received" msgstr "Odebrano nowy wpis" -#: ../data/glade/atom_entry_window.glade.h:7 -msgid "Old stories" -msgstr "Stare historie" - -#: ../data/glade/atom_entry_window.glade.h:8 -msgid "Soliloquy" -msgstr "Monolog" - -#: ../data/glade/atom_entry_window.glade.h:9 +#: ../data/glade/atom_entry_window.glade.h:5 msgid "You have received new entry:" msgstr "Otrzymałeś nowy artykuł:" @@ -856,7 +861,7 @@ msgstr "Dołącz do _pokoju" #: ../data/glade/chat_context_menu.glade.h:2 #: ../data/glade/chat_control_popup_menu.glade.h:4 #: ../data/glade/gc_occupants_menu.glade.h:2 -#: ../data/glade/roster_contact_context_menu.glade.h:10 +#: ../data/glade/roster_contact_context_menu.glade.h:11 msgid "_Add to Roster" msgstr "Dod_aj do listy kontaktów" @@ -903,9 +908,9 @@ msgid "_Compact View Alt+C" msgstr "Widok _zwarty Alt+C" #: ../data/glade/chat_control_popup_menu.glade.h:6 -#: ../data/glade/gc_control_popup_menu.glade.h:7 +#: ../data/glade/gc_control_popup_menu.glade.h:8 #: ../data/glade/gc_occupants_menu.glade.h:5 -#: ../data/glade/roster_contact_context_menu.glade.h:13 +#: ../data/glade/roster_contact_context_menu.glade.h:15 #: ../data/glade/zeroconf_contact_context_menu.glade.h:6 msgid "_History" msgstr "_Historia" @@ -974,7 +979,7 @@ msgstr "" msgid "When a file transfer is complete show a popup notification" msgstr "Gdy plik w całości zostanie przesłany, wyświetl okno powiadomienia" -#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:769 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:761 msgid "_Continue" msgstr "_Kontynuuj" @@ -982,7 +987,7 @@ msgstr "_Kontynuuj" msgid "_Notify me when a file transfer is complete" msgstr "_Powiadom mnie gdy przesyłanie pliku dobiegnie końca" -#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:190 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:188 msgid "_Open Containing Folder" msgstr "_Otwórz katalog zawierający ten plik" @@ -1090,6 +1095,10 @@ msgstr "Konfiguruj _pokój" msgid "_Bookmark This Room" msgstr "Dodaj _zakładkę dla tego pokoju" +#: ../data/glade/gc_control_popup_menu.glade.h:7 +msgid "_Destroy room" +msgstr "_Zlikwiduj pokój" + #: ../data/glade/gc_occupants_menu.glade.h:1 msgid "Mo_derator" msgstr "Mo_derator" @@ -1189,10 +1198,17 @@ msgid "Query Builder..." msgstr "Kreator zapytań..." #: ../data/glade/history_window.glade.h:4 +#: ../data/glade/search_window.glade.h:2 msgid "Search" msgstr "Szukaj" #: ../data/glade/history_window.glade.h:5 +#: ../data/glade/zeroconf_information_window.glade.h:10 +msgid "_Log conversation history" +msgstr "_Zapisuj historię rozmowy" + +#: ../data/glade/history_window.glade.h:6 +#: ../data/glade/search_window.glade.h:3 ../src/disco.py:1177 msgid "_Search" msgstr "_Szukaj" @@ -1209,7 +1225,7 @@ msgstr "Odmów" msgid "Invitation Received" msgstr "Zaproszenie Odebrane" -#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1148 +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1208 msgid "Join Group Chat" msgstr "Dołącz do pokoju" @@ -1219,8 +1235,8 @@ msgstr "Automatycznie dołącz do tego pokoju po uzyskaniu połączenia" #: ../data/glade/join_groupchat_window.glade.h:3 #: ../data/glade/manage_bookmarks_window.glade.h:4 -#: ../data/glade/profile_window.glade.h:23 -#: ../data/glade/vcard_information_window.glade.h:29 +#: ../data/glade/profile_window.glade.h:24 +#: ../data/glade/vcard_information_window.glade.h:31 msgid "Nickname:" msgstr "Pseudonim:" @@ -1238,8 +1254,8 @@ msgstr "Ostatnio:" msgid "Room:" msgstr "Pokój:" -#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1149 -#: ../src/disco.py:1516 +#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1165 +#: ../src/disco.py:1615 msgid "_Join" msgstr "_Dołącz" @@ -1280,24 +1296,27 @@ msgid "Settings" msgstr "Ustawienia" #: ../data/glade/manage_proxies_window.glade.h:3 -msgid "HTTP Connect" -msgstr "Połączenie HTTP" +msgid "" +"HTTP Connect\n" +"SOCKS5" +msgstr "Połączenie HTTP\n" +"SOCKS5" -#: ../data/glade/manage_proxies_window.glade.h:4 +#: ../data/glade/manage_proxies_window.glade.h:5 msgid "Manage Proxy Profiles" msgstr "Zarządzaj profilami pośrednika" -#: ../data/glade/manage_proxies_window.glade.h:5 -#: ../data/glade/profile_window.glade.h:22 -#: ../data/glade/vcard_information_window.glade.h:28 +#: ../data/glade/manage_proxies_window.glade.h:6 +#: ../data/glade/profile_window.glade.h:23 +#: ../data/glade/vcard_information_window.glade.h:30 msgid "Name:" msgstr "Nazwa:" -#: ../data/glade/manage_proxies_window.glade.h:7 +#: ../data/glade/manage_proxies_window.glade.h:8 msgid "Type:" msgstr "Typ:" -#: ../data/glade/manage_proxies_window.glade.h:8 +#: ../data/glade/manage_proxies_window.glade.h:9 msgid "Use authentication" msgstr "Używaj autoryzacji" @@ -1305,7 +1324,7 @@ msgstr "Używaj autoryzacji" msgid "Click to insert an emoticon (Alt+M)" msgstr "Kliknij by wstawić emotikon (Alt+E)" -#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1109 +#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1125 msgid "OpenPGP Encryption" msgstr "Szyfrowanie OpenPGP" @@ -1319,7 +1338,7 @@ msgstr "_Działania" #. 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:6 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:253 +#: ../src/filetransfers_window.py:245 msgid "_Send" msgstr "_Wyślij" @@ -1390,7 +1409,8 @@ msgstr "Znany także jako styl iChat" #: ../data/glade/preferences_window.glade.h:19 msgid "Always check to see if Gajim is the _default Jabber client on startup" -msgstr "Przy starcie zawsze sprawdzaj czy Gajim jest _domyślnym_ klientem Jabbera" +msgstr "" +"Przy starcie zawsze sprawdzaj czy Gajim jest _domyślnym_ klientem Jabbera" #: ../data/glade/preferences_window.glade.h:20 msgid "" @@ -1428,7 +1448,7 @@ msgstr "" "Zawsze używaj domyślnych aplikacji XFCE4\n" "Własne" -#: ../data/glade/preferences_window.glade.h:29 ../src/chat_control.py:852 +#: ../data/glade/preferences_window.glade.h:29 msgid "Chat" msgstr "Rozmowa" @@ -1459,7 +1479,8 @@ msgid "" "Determined by sender\n" "Chat message\n" "Single message" -msgstr "Określa nadawca\n" +msgstr "" +"Określa nadawca\n" "Rozmowę\n" "Pojedynczą wiadomość" @@ -1849,7 +1870,7 @@ msgstr "JID" msgid "Order:" msgstr "Kolejność:" -#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:1862 +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2052 msgid "Privacy List" msgstr "Lista prywatności" @@ -1919,115 +1940,119 @@ msgid "City:" msgstr "Miasto:" #: ../data/glade/profile_window.glade.h:7 -#: ../data/glade/vcard_information_window.glade.h:10 +msgid "Click to set your avatar" +msgstr "Kliknij aby ustawić avatar" + +#: ../data/glade/profile_window.glade.h:8 +#: ../data/glade/vcard_information_window.glade.h:11 msgid "Company:" msgstr "Firma:" -#: ../data/glade/profile_window.glade.h:8 -#: ../data/glade/vcard_information_window.glade.h:13 +#: ../data/glade/profile_window.glade.h:9 +#: ../data/glade/vcard_information_window.glade.h:15 msgid "Country:" msgstr "Kraj:" -#: ../data/glade/profile_window.glade.h:9 -#: ../data/glade/vcard_information_window.glade.h:14 +#: ../data/glade/profile_window.glade.h:10 +#: ../data/glade/vcard_information_window.glade.h:16 msgid "Department:" msgstr "Dział:" -#: ../data/glade/profile_window.glade.h:10 -#: ../data/glade/vcard_information_window.glade.h:15 +#: ../data/glade/profile_window.glade.h:11 +#: ../data/glade/vcard_information_window.glade.h:17 #: ../data/glade/zeroconf_information_window.glade.h:2 #: ../data/glade/zeroconf_properties_window.glade.h:5 msgid "E-Mail:" msgstr "Adres e-mail:" -#: ../data/glade/profile_window.glade.h:11 -#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/profile_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:18 msgid "Extra Address:" msgstr "Dodatkowy adres:" #. Family Name -#: ../data/glade/profile_window.glade.h:13 -#: ../data/glade/vcard_information_window.glade.h:18 +#: ../data/glade/profile_window.glade.h:14 +#: ../data/glade/vcard_information_window.glade.h:20 msgid "Family:" msgstr "Nazwisko:" #. Do NOT change sequence. Just translate YYYY and MM and DD (from Year, Month, Day accordingly) -#: ../data/glade/profile_window.glade.h:15 -#: ../data/glade/vcard_information_window.glade.h:20 +#: ../data/glade/profile_window.glade.h:16 +#: ../data/glade/vcard_information_window.glade.h:22 msgid "Format: YYYY-MM-DD" msgstr "Format: RRRR-MM-DD" #. Given Name -#: ../data/glade/profile_window.glade.h:17 -#: ../data/glade/vcard_information_window.glade.h:22 +#: ../data/glade/profile_window.glade.h:18 +#: ../data/glade/vcard_information_window.glade.h:24 msgid "Given:" msgstr "Imię:" -#: ../data/glade/profile_window.glade.h:18 -#: ../data/glade/vcard_information_window.glade.h:23 +#: ../data/glade/profile_window.glade.h:19 +#: ../data/glade/vcard_information_window.glade.h:25 msgid "Homepage:" msgstr "Strona domowa:" #. Middle Name -#: ../data/glade/profile_window.glade.h:20 -#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/profile_window.glade.h:21 +#: ../data/glade/vcard_information_window.glade.h:28 msgid "Middle:" msgstr "Drugie imię:" -#: ../data/glade/profile_window.glade.h:21 -#: ../data/glade/vcard_information_window.glade.h:27 +#: ../data/glade/profile_window.glade.h:22 +#: ../data/glade/vcard_information_window.glade.h:29 msgid "More" msgstr "Więcej" -#: ../data/glade/profile_window.glade.h:24 -#: ../data/glade/vcard_information_window.glade.h:31 +#: ../data/glade/profile_window.glade.h:25 +#: ../data/glade/vcard_information_window.glade.h:34 msgid "Personal Info" msgstr "Informacje osobiste" -#: ../data/glade/profile_window.glade.h:26 -#: ../data/glade/vcard_information_window.glade.h:32 +#: ../data/glade/profile_window.glade.h:27 +#: ../data/glade/vcard_information_window.glade.h:35 msgid "Phone No.:" msgstr "Telefon:" -#: ../data/glade/profile_window.glade.h:27 -#: ../data/glade/vcard_information_window.glade.h:33 +#: ../data/glade/profile_window.glade.h:28 +#: ../data/glade/vcard_information_window.glade.h:36 msgid "Position:" msgstr "Stanowisko:" -#: ../data/glade/profile_window.glade.h:28 -#: ../data/glade/vcard_information_window.glade.h:34 +#: ../data/glade/profile_window.glade.h:29 +#: ../data/glade/vcard_information_window.glade.h:37 msgid "Postal Code:" msgstr "Kod pocztowy:" #. Prefix in Name -#: ../data/glade/profile_window.glade.h:30 -#: ../data/glade/vcard_information_window.glade.h:36 +#: ../data/glade/profile_window.glade.h:31 +#: ../data/glade/vcard_information_window.glade.h:39 msgid "Prefix:" msgstr "Prefiks:" -#: ../data/glade/profile_window.glade.h:31 -#: ../data/glade/vcard_information_window.glade.h:38 ../src/vcard.py:273 +#: ../data/glade/profile_window.glade.h:32 +#: ../data/glade/vcard_information_window.glade.h:41 ../src/vcard.py:381 msgid "Role:" msgstr "Funkcja:" -#: ../data/glade/profile_window.glade.h:32 -#: ../data/glade/vcard_information_window.glade.h:39 +#: ../data/glade/profile_window.glade.h:33 +#: ../data/glade/vcard_information_window.glade.h:42 msgid "State:" msgstr "Stan/Województwo:" -#: ../data/glade/profile_window.glade.h:33 -#: ../data/glade/vcard_information_window.glade.h:41 +#: ../data/glade/profile_window.glade.h:34 +#: ../data/glade/vcard_information_window.glade.h:44 msgid "Street:" msgstr "Ulica:" #. Suffix in Name -#: ../data/glade/profile_window.glade.h:35 -#: ../data/glade/vcard_information_window.glade.h:45 +#: ../data/glade/profile_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:48 msgid "Suffix:" msgstr "Sufiks:" -#: ../data/glade/profile_window.glade.h:36 -#: ../data/glade/vcard_information_window.glade.h:46 +#: ../data/glade/profile_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:50 msgid "Work" msgstr "Praca" @@ -2059,17 +2084,17 @@ msgstr "Przypisz klucz Open_PGP" #: ../data/glade/roster_contact_context_menu.glade.h:4 #: ../data/glade/zeroconf_contact_context_menu.glade.h:3 -#: ../src/roster_window.py:2076 +#: ../src/roster_window.py:2293 msgid "Edit _Groups" msgstr "Modyfikuj _grupy" #: ../data/glade/roster_contact_context_menu.glade.h:5 -#: ../src/roster_window.py:2211 +#: ../src/roster_window.py:2481 msgid "Execute Command..." msgstr "Wykonaj komendę..." #: ../data/glade/roster_contact_context_menu.glade.h:6 -#: ../src/roster_window.py:2034 +#: ../src/roster_window.py:2251 msgid "In_vite to" msgstr "_Zaproś do" @@ -2079,35 +2104,49 @@ msgid "Send Single _Message" msgstr "Wyślij _wiadomość" #: ../data/glade/roster_contact_context_menu.glade.h:9 +msgid "Send cus_tom status" +msgstr "Wyślij _odrębny status" + +#: ../data/glade/roster_contact_context_menu.glade.h:10 #: ../data/glade/zeroconf_contact_context_menu.glade.h:5 msgid "Start _Chat" msgstr "Rozpocznij _rozmowę" -#: ../data/glade/roster_contact_context_menu.glade.h:11 +#: ../data/glade/roster_contact_context_menu.glade.h:12 msgid "_Allow him/her to see my status" msgstr "_Pozwól mu/jej widzieć swój status" -#: ../data/glade/roster_contact_context_menu.glade.h:12 +#: ../data/glade/roster_contact_context_menu.glade.h:13 +#: ../src/roster_window.py:2317 ../src/roster_window.py:2428 +msgid "_Block" +msgstr "_Zablokuj" + +#: ../data/glade/roster_contact_context_menu.glade.h:14 msgid "_Forbid him/her to see my status" msgstr "_Zabroń mu/jej widzieć twój status" #. Remove group -#: ../data/glade/roster_contact_context_menu.glade.h:14 -#: ../src/roster_window.py:2028 ../src/roster_window.py:2125 -#: ../src/roster_window.py:2232 +#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../src/roster_window.py:2245 ../src/roster_window.py:2354 +#: ../src/roster_window.py:2502 msgid "_Remove from Roster" msgstr "_Usuń z listy kontaktów" -#: ../data/glade/roster_contact_context_menu.glade.h:15 +#: ../data/glade/roster_contact_context_menu.glade.h:17 #: ../data/glade/zeroconf_contact_context_menu.glade.h:7 -#: ../src/roster_window.py:2220 +#: ../src/roster_window.py:2490 msgid "_Rename" msgstr "_Zmień nazwę" -#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/roster_contact_context_menu.glade.h:18 msgid "_Subscription" msgstr "_Autoryzacja" +#: ../data/glade/roster_contact_context_menu.glade.h:19 +#: ../src/roster_window.py:2311 ../src/roster_window.py:2422 +msgid "_Unblock" +msgstr "_Cofnij blokadę" + #: ../data/glade/roster_window.glade.h:1 msgid "A_ccounts" msgstr "_Konta" @@ -2148,8 +2187,8 @@ msgstr "_Zawartość" msgid "_Discover Services" msgstr "_Wyszukuj usługi" -#: ../data/glade/roster_window.glade.h:14 ../src/disco.py:1254 -#: ../src/roster_window.py:2203 +#: ../data/glade/roster_window.glade.h:14 ../src/disco.py:1353 +#: ../src/roster_window.py:2473 msgid "_Edit" msgstr "_Edycja" @@ -2173,6 +2212,10 @@ msgstr "_Zakończ" msgid "_View" msgstr "_Widok" +#: ../data/glade/search_window.glade.h:1 +msgid "Please wait while retrieving search form..." +msgstr "Proszę czekać, trwa pobieranie formularza wyszukiwania..." + #: ../data/glade/service_discovery_window.glade.h:1 msgid "G_o" msgstr "I_dź" @@ -2261,6 +2304,18 @@ msgstr "Prośba o autoryzację" msgid "_Deny" msgstr "O_dmów" +#: ../data/glade/synchronise_select_account_dialog.glade.h:1 +msgid "Select the account with which you want to synchronise" +msgstr "Wskaż konto, z którym chcesz zsynchronizować kontakty" + +#: ../data/glade/synchronise_select_contacts_dialog.glade.h:1 +msgid "Select the contacts you want to synchronise" +msgstr "Wybierz kontakty, które chcesz zsynchronizować" + +#: ../data/glade/synchronise_select_contacts_dialog.glade.h:2 +msgid "Synchronise : select contacts" +msgstr "Synchronizacja: wybierz kontakty" + #: ../data/glade/systray_context_menu.glade.h:1 msgid "Mute Sounds" msgstr "Wyłącz dźwięki" @@ -2283,51 +2338,58 @@ msgid "Ask:" msgstr "Pytaj:" #: ../data/glade/vcard_information_window.glade.h:8 +msgid "Click to force avatar" +msgstr "Kliknij aby ustawić avatar" + +#: ../data/glade/vcard_information_window.glade.h:9 msgid "Client:" msgstr "Klient:" -#: ../data/glade/vcard_information_window.glade.h:9 +#: ../data/glade/vcard_information_window.glade.h:10 msgid "Comments" msgstr "Komentarze" -#: ../data/glade/vcard_information_window.glade.h:11 +#: ../data/glade/vcard_information_window.glade.h:12 +msgid "Configured avatar:" +msgstr "Ustawiony avatar:" + +#: ../data/glade/vcard_information_window.glade.h:13 #: ../data/glade/zeroconf_information_window.glade.h:1 msgid "Contact" msgstr "Kontakt" -#: ../data/glade/vcard_information_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:14 msgid "Contact Information" msgstr "Informacje o kontakcie" -#: ../data/glade/vcard_information_window.glade.h:24 +#: ../data/glade/vcard_information_window.glade.h:26 #: ../data/glade/zeroconf_information_window.glade.h:4 #: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:416 msgid "Jabber ID:" msgstr "Jabber ID:" -#: ../data/glade/vcard_information_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:33 msgid "OS:" msgstr "System operacyjny:" -#: ../data/glade/vcard_information_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:40 #: ../data/glade/zeroconf_information_window.glade.h:8 msgid "Resource:" msgstr "Zasoby:" -#: ../data/glade/vcard_information_window.glade.h:40 +#: ../data/glade/vcard_information_window.glade.h:43 #: ../data/glade/zeroconf_information_window.glade.h:9 msgid "Status:" msgstr "Status:" #. Family Name -#: ../data/glade/vcard_information_window.glade.h:43 +#: ../data/glade/vcard_information_window.glade.h:46 msgid "Subscription:" msgstr "Autoryzacja:" -#: ../data/glade/vcard_information_window.glade.h:47 -#: ../data/glade/zeroconf_information_window.glade.h:10 -msgid "_Log conversation history" -msgstr "_Zapisuj historię rozmowy" +#: ../data/glade/vcard_information_window.glade.h:49 +msgid "User avatar:" +msgstr "Używany avatar" #: ../data/glade/xml_console_window.glade.h:1 msgid "Jabber Traffic" @@ -2461,8 +2523,8 @@ msgid "Bulgarian" msgstr "bułgarski" #: ../src/chat_control.py:52 -msgid "Briton" -msgstr "brytyjski" +msgid "Breton" +msgstr "bretoński" #: ../src/chat_control.py:52 msgid "Czech" @@ -2489,7 +2551,7 @@ msgid "Spanish" msgstr "hiszpański" #: ../src/chat_control.py:52 -msgid "Basc" +msgid "Basque" msgstr "baskijski" #: ../src/chat_control.py:52 @@ -2532,6 +2594,10 @@ msgstr "portugalski (Brazylia)" msgid "Russian" msgstr "rosyjski" +#: ../src/chat_control.py:52 +msgid "Serbian" +msgstr "serbski" + #: ../src/chat_control.py:52 msgid "Slovak" msgstr "słowacki" @@ -2544,7 +2610,7 @@ msgstr "szwedzki" msgid "Chinese (Ch)" msgstr "chiński (Ch)" -#: ../src/chat_control.py:208 ../src/dialogs.py:1516 +#: ../src/chat_control.py:212 ../src/dialogs.py:1706 msgid "" "If that is not your language for which you want to highlight misspelled " "words, then please set your $LANG as appropriate. Eg. for French do export " @@ -2560,64 +2626,80 @@ msgstr "" "\n" "Podświedlanie błędów w pisowni nie będzie używane" -#: ../src/chat_control.py:247 +#: ../src/chat_control.py:251 msgid "Spelling language" msgstr "Wybierz słownik" #. we are not connected -#: ../src/chat_control.py:270 ../src/chat_control.py:476 +#: ../src/chat_control.py:274 ../src/chat_control.py:480 msgid "A connection is not available" msgstr "Połączenie jest niemożliwe" -#: ../src/chat_control.py:271 ../src/chat_control.py:477 +#: ../src/chat_control.py:275 ../src/chat_control.py:481 msgid "Your message can not be sent until you are connected." msgstr "Nie możesz wysłać wiadomości dopóki nie będziesz połączony." -#: ../src/chat_control.py:852 -msgid "Chats" -msgstr "Rozmowy" - -#: ../src/chat_control.py:1034 +#: ../src/chat_control.py:1050 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s z pokoju %(room_name)s" #. we talk about a contact here -#: ../src/chat_control.py:1123 +#: ../src/chat_control.py:1139 #, python-format msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" msgstr "" "Ani %s nie przesyła swojego klucza OpenPGP, ani Ty nie przypisałeś mu " "żadnego klucza" -#: ../src/chat_control.py:1259 +#: ../src/chat_control.py:1173 ../src/groupchat_control.py:1276 +#, python-format +msgid "Commands: %s" +msgstr "Polecenia: %s" + +#: ../src/chat_control.py:1176 ../src/groupchat_control.py:1290 +#, python-format +msgid "Usage: /%s, clears the text window." +msgstr "Użycie: /%s czyście okno tekstowe." + +#: ../src/chat_control.py:1179 ../src/groupchat_control.py:1295 +#, python-format +msgid "Usage: /%s, hide the chat buttons." +msgstr "Użycie: /%s ukrywa przyciski czatu." + +#: ../src/chat_control.py:1184 ../src/groupchat_control.py:1334 +#, python-format +msgid "No help info for /%s" +msgstr "Brak informacji o pomocy dla /%s" + +#: ../src/chat_control.py:1314 msgid "Encryption enabled" msgstr "Szyfrowanie włączone" -#: ../src/chat_control.py:1264 +#: ../src/chat_control.py:1319 msgid "Encryption disabled" msgstr "Szyfrowanie wyłączone" #. add_to_roster_menuitem -#: ../src/chat_control.py:1406 ../src/conversation_textview.py:493 -#: ../src/dialogs.py:629 ../src/gajim.py:842 ../src/gajim.py:843 -#: ../src/gajim.py:1187 ../src/roster_window.py:332 -#: ../src/roster_window.py:410 ../src/roster_window.py:1498 -#: ../src/roster_window.py:1508 ../src/roster_window.py:1684 -#: ../src/roster_window.py:1890 ../src/roster_window.py:2475 -#: ../src/roster_window.py:3900 ../src/roster_window.py:3902 -#: ../src/common/contacts.py:73 ../src/common/helpers.py:43 -#: ../src/common/helpers.py:255 +#: ../src/chat_control.py:1463 ../src/conversation_textview.py:501 +#: ../src/dialogs.py:629 ../src/gajim.py:853 ../src/gajim.py:854 +#: ../src/gajim.py:1199 ../src/roster_window.py:334 +#: ../src/roster_window.py:414 ../src/roster_window.py:1675 +#: ../src/roster_window.py:1685 ../src/roster_window.py:1864 +#: ../src/roster_window.py:2088 ../src/roster_window.py:2745 +#: ../src/roster_window.py:2949 ../src/roster_window.py:4234 +#: ../src/roster_window.py:4236 ../src/common/contacts.py:73 +#: ../src/common/helpers.py:43 ../src/common/helpers.py:255 msgid "Not in Roster" msgstr "spoza listy kontaktów" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:1550 +#: ../src/chat_control.py:1607 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Właśnie otrzymałeś nową wiadomość od \"%s\"" -#: ../src/chat_control.py:1551 +#: ../src/chat_control.py:1608 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." @@ -2625,11 +2707,11 @@ msgstr "" "Jeśli zamkniesz tę kartę, a nie masz uaktywnionej opcji historii, to " "utracisz tę wiadomość." -#: ../src/config.py:137 ../src/config.py:588 +#: ../src/config.py:139 ../src/config.py:588 msgid "Disabled" msgstr "Wyłączone" -#: ../src/config.py:231 +#: ../src/config.py:233 #, python-format msgid "Every %s _minutes" msgstr "Co %s _minut" @@ -2642,12 +2724,12 @@ msgstr "Aktywny" msgid "Event" msgstr "Zdarzenie" -#: ../src/config.py:684 ../src/gajim.py:2222 +#: ../src/config.py:684 ../src/gajim.py:2309 #, python-format msgid "Dictionary for lang %s not available" msgstr "Brak słownika dla tego języka (%s)" -#: ../src/config.py:685 ../src/gajim.py:2223 +#: ../src/config.py:685 ../src/gajim.py:2310 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -2656,247 +2738,248 @@ msgstr "" "Musisz zainstalować słownik %s aby aktywować sprawdzanie pisowni lub wybrać " "inny język korzystać z opcji speller_langugage." -#: ../src/config.py:1009 +#: ../src/config.py:1008 msgid "status message title" msgstr "nagłówek informacji o statusie" -#: ../src/config.py:1009 +#: ../src/config.py:1008 msgid "status message text" msgstr "treść informacji o statusie" -#: ../src/config.py:1045 +#: ../src/config.py:1044 msgid "First Message Received" msgstr "Otrzymano pierwszą wiadomość" -#: ../src/config.py:1046 +#: ../src/config.py:1045 msgid "Next Message Received" msgstr "Otrzymałeś nową wiadomość" -#: ../src/config.py:1047 +#: ../src/config.py:1046 msgid "Contact Connected" msgstr "Kontakt połączył się" -#: ../src/config.py:1048 +#: ../src/config.py:1047 msgid "Contact Disconnected" msgstr "Kontakt rozłączył się" -#: ../src/config.py:1049 +#: ../src/config.py:1048 msgid "Message Sent" msgstr "Wiadomość została wysłana" -#: ../src/config.py:1050 +#: ../src/config.py:1049 msgid "Group Chat Message Highlight" msgstr "Podświetlenie wiadomości z czatu" -#: ../src/config.py:1051 +#: ../src/config.py:1050 msgid "Group Chat Message Received" msgstr "Otrzymano wiadomość na czacie" -#: ../src/config.py:1058 +#: ../src/config.py:1057 msgid "GMail Email Received" msgstr "Nowa poczta na koncie Gmail" -#: ../src/config.py:1261 +#: ../src/config.py:1260 msgid "OpenPGP is not usable in this computer" msgstr "Nie można używać OpenPGP na tym komputerze" -#: ../src/config.py:1307 +#: ../src/config.py:1306 msgid "You are currently connected to the server" msgstr "Jesteś połączony z serwerem" -#: ../src/config.py:1308 +#: ../src/config.py:1307 msgid "To change the account name, you must be disconnected." msgstr "Aby zmienić nazwę konta, musisz być rozłączony." -#: ../src/config.py:1311 ../src/config.py:1905 +#: ../src/config.py:1310 ../src/config.py:1916 msgid "Unread events" msgstr "Nieprzeczytane wiadomości" -#: ../src/config.py:1312 +#: ../src/config.py:1311 msgid "To change the account name, you must read all pending events." msgstr "" "Aby zmienić nazwę konta, musisz przeczytać wszystkie zaległe wiadomości." -#: ../src/config.py:1316 +#: ../src/config.py:1315 msgid "Account Name Already Used" msgstr "Konto o takiej nazwie już istnieje" -#: ../src/config.py:1317 +#: ../src/config.py:1316 msgid "" "This name is already used by another of your accounts. Please choose another " "name." msgstr "Posiadasz już konto o tej nazwie. Zmień nazwę konta na unikalną." -#: ../src/config.py:1321 ../src/config.py:1325 +#: ../src/config.py:1320 ../src/config.py:1324 msgid "Invalid account name" msgstr "Niepoprawna nazwa konta" -#: ../src/config.py:1322 +#: ../src/config.py:1321 msgid "Account name cannot be empty." msgstr "Nazwa konta nie może być pusta." -#: ../src/config.py:1326 +#: ../src/config.py:1325 msgid "Account name cannot contain spaces." msgstr "Nazwa konta nie może zawierać spacji." -#: ../src/config.py:1334 ../src/config.py:1340 ../src/config.py:1350 -#: ../src/config.py:3008 +#: ../src/config.py:1333 ../src/config.py:1339 ../src/config.py:1349 +#: ../src/config.py:2900 msgid "Invalid Jabber ID" msgstr "Niepoprawny Jabber ID" -#: ../src/config.py:1341 +#: ../src/config.py:1340 msgid "A Jabber ID must be in the form \"user@servername\"." msgstr "Jabber ID musi być postaci \"użytkownik@nazwaserwera\"." -#: ../src/config.py:1400 +#: ../src/config.py:1399 msgid "Invalid entry" msgstr "Niepoprawny wpis" -#: ../src/config.py:1401 +#: ../src/config.py:1400 msgid "Custom port must be a port number." msgstr "Wybrany port musi być numerem portu." -#: ../src/config.py:1529 ../src/common/config.py:366 +#: ../src/config.py:1528 ../src/common/config.py:368 msgid "Be right back." msgstr "Zaraz wracam." -#: ../src/config.py:1539 +#: ../src/config.py:1538 msgid "Relogin now?" msgstr "Czy zalogować się ponownie?" -#: ../src/config.py:1540 +#: ../src/config.py:1539 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "" "Jeżeli chcesz by wszelkie zmiany odniosły natychmiastowy skutek, musisz " "zalogować się ponownie." -#: ../src/config.py:1566 +#: ../src/config.py:1565 msgid "No such account available" msgstr "Takie konto nie jest dostępne" -#: ../src/config.py:1567 +#: ../src/config.py:1566 msgid "You must create your account before editing your personal information." msgstr "Musisz najpierw stworzyć konto by móc edytować informacje o sobie." -#: ../src/config.py:1574 ../src/dialogs.py:1130 ../src/dialogs.py:1316 -#: ../src/disco.py:418 ../src/profile_window.py:313 +#: ../src/config.py:1573 ../src/dialogs.py:1190 ../src/dialogs.py:1326 +#: ../src/dialogs.py:1506 ../src/disco.py:420 ../src/profile_window.py:325 msgid "You are not connected to the server" msgstr "Nie jesteś połączony z serwerem" -#: ../src/config.py:1575 +#: ../src/config.py:1574 msgid "Without a connection, you can not edit your personal information." msgstr "Musisz być połączony, aby móc zmieniać informacje o sobie." -#: ../src/config.py:1579 +#: ../src/config.py:1578 msgid "Your server doesn't support Vcard" msgstr "Twój serwer nie akceptuje Vcard" -#: ../src/config.py:1580 +#: ../src/config.py:1579 msgid "Your server can't save your personal information." msgstr "Twój serwer nie potrafi zapisać informacji osobistych." -#: ../src/config.py:1604 ../src/config.py:3396 +#: ../src/config.py:1610 ../src/config.py:3288 msgid "Failed to get secret keys" msgstr "Pobieranie kluczy prywatnych nie powiodło się" -#: ../src/config.py:1605 ../src/config.py:3397 +#: ../src/config.py:1611 ../src/config.py:3289 msgid "There was a problem retrieving your OpenPGP secret keys." msgstr "" "Wystąpił problem w trakcie odzyskiwania Twoich kluczy prywatnych OpenPGP." -#: ../src/config.py:1608 ../src/config.py:3400 +#: ../src/config.py:1614 ../src/config.py:3292 msgid "OpenPGP Key Selection" msgstr "Wybór klucza OpenPGP" -#: ../src/config.py:1609 ../src/config.py:3401 +#: ../src/config.py:1615 ../src/config.py:3293 msgid "Choose your OpenPGP key" msgstr "Wybierz klucz OpenPGP" #. Name column -#: ../src/config.py:1839 ../src/disco.py:739 ../src/disco.py:1465 -#: ../src/disco.py:1703 ../src/history_window.py:78 +#: ../src/config.py:1850 ../src/dialogs.py:1338 ../src/dialogs.py:1402 +#: ../src/disco.py:741 ../src/disco.py:1564 ../src/disco.py:1802 +#: ../src/history_window.py:78 msgid "Name" msgstr "Nazwa" -#: ../src/config.py:1842 +#: ../src/config.py:1853 ../src/dialogs.py:1341 msgid "Server" msgstr "Serwer" -#: ../src/config.py:1906 +#: ../src/config.py:1917 msgid "Read all pending events before removing this account." msgstr "" "Przejrzyj wszystkie niepotwierdzone zdarzenia przed usunięciem tego konta." -#: ../src/config.py:1943 +#: ../src/config.py:1954 #, python-format msgid "You have opened chat in account %s" msgstr "Masz otwarte okno rozmowy na koncie %s" -#: ../src/config.py:1944 +#: ../src/config.py:1955 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "" "Wszystkie otwarte zakładki rozmów i czatów zostaną zamknięte. Kontynuować?" -#: ../src/config.py:2003 +#: ../src/config.py:2014 msgid "Account Local already exists." msgstr "Konto o takiej nazwie już istnieje." -#: ../src/config.py:2004 +#: ../src/config.py:2015 msgid "Please rename or remove it before enabling link-local messaging." msgstr "" "Proszę go zmienić lub usunąć przed uaktywnieniem komunikacji link-local." -#: ../src/config.py:2238 +#: ../src/config.py:2111 #, python-format msgid "Edit %s" msgstr "Modyfikuj %s" -#: ../src/config.py:2240 +#: ../src/config.py:2113 #, python-format msgid "Register to %s" msgstr "Zarejestruj na %s" #. list at the beginning -#: ../src/config.py:2306 +#: ../src/config.py:2179 msgid "Ban List" msgstr "Lista kontaktów zablokowanych" -#: ../src/config.py:2307 +#: ../src/config.py:2180 msgid "Member List" msgstr "_Lista uczestników" -#: ../src/config.py:2308 +#: ../src/config.py:2181 msgid "Owner List" msgstr "_Lista właścicieli" -#: ../src/config.py:2309 +#: ../src/config.py:2182 msgid "Administrator List" msgstr "_Administratorzy" #. Address column #. holds JID (who said this) -#: ../src/config.py:2342 ../src/disco.py:746 ../src/history_manager.py:155 +#: ../src/config.py:2231 ../src/disco.py:748 ../src/history_manager.py:155 msgid "JID" msgstr "JID" -#: ../src/config.py:2350 +#: ../src/config.py:2239 msgid "Reason" msgstr "Powód" -#: ../src/config.py:2355 +#: ../src/config.py:2244 msgid "Nick" msgstr "Nick" -#: ../src/config.py:2359 +#: ../src/config.py:2248 msgid "Role" msgstr "Funkcja:" -#: ../src/config.py:2380 +#: ../src/config.py:2273 msgid "Banning..." msgstr "Blokuję użytkownika..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2382 +#: ../src/config.py:2275 msgid "" "Whom do you want to ban?\n" "\n" @@ -2904,11 +2987,11 @@ msgstr "" "Którego użytkownika chcesz zablokować?\n" "\n" -#: ../src/config.py:2384 +#: ../src/config.py:2277 msgid "Adding Member..." msgstr "Dodaję członka..." -#: ../src/config.py:2385 +#: ../src/config.py:2278 msgid "" "Whom do you want to make a member?\n" "\n" @@ -2916,11 +2999,11 @@ msgstr "" "Status którego użytkownika chcesz zmienić?\n" "\n" -#: ../src/config.py:2387 +#: ../src/config.py:2280 msgid "Adding Owner..." msgstr "Dodaję właściciela..." -#: ../src/config.py:2388 +#: ../src/config.py:2281 msgid "" "Whom do you want to make an owner?\n" "\n" @@ -2928,11 +3011,11 @@ msgstr "" "Którego użytkownika chcesz uczynić właścicielem pokoju?\n" "\n" -#: ../src/config.py:2390 +#: ../src/config.py:2283 msgid "Adding Administrator..." msgstr "Dodaję administratora..." -#: ../src/config.py:2391 +#: ../src/config.py:2284 msgid "" "Whom do you want to make an administrator?\n" "\n" @@ -2940,7 +3023,7 @@ msgstr "" "Którego użytkownika chcesz uczynić administratorem?\n" "\n" -#: ../src/config.py:2392 +#: ../src/config.py:2285 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" @@ -2956,99 +3039,99 @@ msgstr "" "4. domena (dotyczy domeny a także dowolnego adresu typu użytkownik@domena,\n" "domena/zasób lub adresu zawierającego subdomenę)." -#: ../src/config.py:2497 +#: ../src/config.py:2389 #, python-format msgid "Removing %s account" msgstr "Usuwanie konta %s" -#: ../src/config.py:2514 ../src/roster_window.py:2733 +#: ../src/config.py:2406 ../src/roster_window.py:3008 msgid "Password Required" msgstr "Wymagane hasło" -#: ../src/config.py:2515 ../src/roster_window.py:2729 +#: ../src/config.py:2407 ../src/roster_window.py:3004 #, python-format msgid "Enter your password for account %s" msgstr "Wpisz hasło dla konta %s" -#: ../src/config.py:2516 ../src/roster_window.py:2734 +#: ../src/config.py:2408 ../src/roster_window.py:3009 msgid "Save password" msgstr "Zapisz hasło" -#: ../src/config.py:2530 +#: ../src/config.py:2422 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Konto \"%s\" jest połączone z serwerem." -#: ../src/config.py:2531 +#: ../src/config.py:2423 msgid "If you remove it, the connection will be lost." msgstr "Jeśli to usuniesz, połączenie zostanie zerwane." -#: ../src/config.py:2616 +#: ../src/config.py:2508 msgid "Default" msgstr "Domyślny" -#: ../src/config.py:2616 +#: ../src/config.py:2508 msgid "?print_status:All" msgstr "?print_status:Wszystkie" -#: ../src/config.py:2617 +#: ../src/config.py:2509 msgid "Enter and leave only" msgstr "Jedynie wejdź i wyjdź" -#: ../src/config.py:2618 +#: ../src/config.py:2510 msgid "?print_status:None" msgstr "?print_status:Żaden" -#: ../src/config.py:2686 +#: ../src/config.py:2578 msgid "New Group Chat" msgstr "Nowa rozmowa grupowa" -#: ../src/config.py:2719 +#: ../src/config.py:2611 msgid "This bookmark has invalid data" msgstr "Ta zakładka zawiera niepoprawne dane" -#: ../src/config.py:2720 +#: ../src/config.py:2612 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "Upewnij się, że wypełniłeś pola serwer i pokój lub usuń tę zakładkę." -#: ../src/config.py:2983 +#: ../src/config.py:2875 msgid "Invalid username" msgstr "Niepoprawna nazwa użytkownika" -#: ../src/config.py:2984 +#: ../src/config.py:2876 msgid "You must provide a username to configure this account." msgstr "Musisz wpisać nazwę użytkownika aby skonfigurować to konto." -#: ../src/config.py:2994 ../src/dialogs.py:1335 +#: ../src/config.py:2886 ../src/dialogs.py:1525 msgid "Invalid password" msgstr "Niepoprawne hasło" -#: ../src/config.py:2995 +#: ../src/config.py:2887 msgid "You must enter a password for the new account." msgstr "Musisz wpisać hasło dla nowego konta." -#: ../src/config.py:2999 ../src/dialogs.py:1340 +#: ../src/config.py:2891 ../src/dialogs.py:1530 msgid "Passwords do not match" msgstr "Hasła nie zgadzają się" -#: ../src/config.py:3000 ../src/dialogs.py:1341 +#: ../src/config.py:2892 ../src/dialogs.py:1531 msgid "The passwords typed in both fields must be identical." msgstr "Hasła wpisane w obydwu polach muszą być identyczne." -#: ../src/config.py:3019 +#: ../src/config.py:2911 msgid "Duplicate Jabber ID" msgstr "Taki Jabber ID już istnieje!" -#: ../src/config.py:3020 +#: ../src/config.py:2912 msgid "This account is already configured in Gajim." msgstr "Konto o takiej nazwie jest już skonfigurowane." -#: ../src/config.py:3037 +#: ../src/config.py:2929 msgid "Account has been added successfully" msgstr "Konto zostało pomyślnie dodane" -#: ../src/config.py:3038 ../src/config.py:3073 +#: ../src/config.py:2930 ../src/config.py:2965 msgid "" "You can set advanced account options by pressing the Advanced button, or " "later by choosing the Accounts menuitem under the Edit menu from the main " @@ -3057,23 +3140,23 @@ msgstr "" "Możesz ustawić opcje zaawansowane wciskając przycisk Zaawansowane lub " "później wybierając pozycję Konta z menu Edycja w głównym oknie programu." -#: ../src/config.py:3072 +#: ../src/config.py:2964 msgid "Your new account has been created successfully" msgstr "Twoje konto zostało założone" -#: ../src/config.py:3090 +#: ../src/config.py:2982 msgid "An error occurred during account creation" msgstr "Wystąpił błąd w trakcie tworzenia konta" -#: ../src/config.py:3148 +#: ../src/config.py:3040 msgid "Account name is in use" msgstr "Nazwa konta jest już zajęta" -#: ../src/config.py:3149 +#: ../src/config.py:3041 msgid "You already have an account using this name." msgstr "Masz już konto o takiej nazwie." -#: ../src/conversation_textview.py:271 +#: ../src/conversation_textview.py:279 msgid "" "Text below this line is what has been said since the last time you paid " "attention to this group chat" @@ -3081,52 +3164,52 @@ msgstr "" "Tekst poniżej tej linii zawiera to, co zostało napisane w tym pokoju od " "momentu gdy ostatni raz zwracałeś/zwracałaś na niego uwagę" -#: ../src/conversation_textview.py:340 +#: ../src/conversation_textview.py:348 #, python-format msgid "_Actions for \"%s\"" msgstr "_Działania dla wyrażenia \"%s\"" -#: ../src/conversation_textview.py:352 +#: ../src/conversation_textview.py:360 msgid "Read _Wikipedia Article" msgstr "Przeczytaj artykuł w _Wikipedii" -#: ../src/conversation_textview.py:357 +#: ../src/conversation_textview.py:365 msgid "Look it up in _Dictionary" msgstr "Szukaj w _słowniku" #. we must have %s in the url if not WIKTIONARY -#: ../src/conversation_textview.py:373 +#: ../src/conversation_textview.py:381 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "W URL-u słownika brakuje \"%s\" i nie jest to WIKTIONARY" #. we must have %s in the url -#: ../src/conversation_textview.py:386 +#: ../src/conversation_textview.py:394 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "W URL-u Przeszukiwania Sieci brakuje \"%s\"" -#: ../src/conversation_textview.py:389 +#: ../src/conversation_textview.py:397 msgid "Web _Search for it" msgstr "Szukaj w _Internecie" -#: ../src/conversation_textview.py:395 +#: ../src/conversation_textview.py:403 msgid "Open as _Link" msgstr "Otwórz jako _odnośnik" -#: ../src/conversation_textview.py:752 +#: ../src/conversation_textview.py:848 msgid "Yesterday" msgstr "Wczoraj" #. the number is >= 2 #. %i is day in year (1-365), %d (1-31) we want %i -#: ../src/conversation_textview.py:756 +#: ../src/conversation_textview.py:852 #, python-format msgid "%i days ago" msgstr "%i dni temu" #. if we have subject, show it too! -#: ../src/conversation_textview.py:790 +#: ../src/conversation_textview.py:886 #, python-format msgid "Subject: %s\n" msgstr "Temat: %s\n" @@ -3273,57 +3356,75 @@ msgstr "" "Być może masz już uruchomioną inną kopię Gajima. Przesyłanie plików zostanie " "anulowane." -#: ../src/dialogs.py:1060 +#: ../src/dialogs.py:1120 #, python-format msgid "Subscription request for account %s from %s" msgstr "Prośba o autoryzację dla konta %s od %s" -#: ../src/dialogs.py:1063 +#: ../src/dialogs.py:1123 #, python-format msgid "Subscription request from %s" msgstr "Prośba o autoryzację od %s" -#: ../src/dialogs.py:1123 ../src/roster_window.py:687 +#: ../src/dialogs.py:1183 ../src/roster_window.py:705 #, python-format msgid "You are already in group chat %s" msgstr "Już jesteś w pokoju %s" -#: ../src/dialogs.py:1131 +#: ../src/dialogs.py:1191 msgid "You can not join a group chat unless you are connected." msgstr "Nie możesz dołączyć do pokoju gdy nie jesteś połączony." -#: ../src/dialogs.py:1146 +#: ../src/dialogs.py:1206 #, python-format msgid "Join Group Chat with account %s" msgstr "Dołącz do pokoju z konta %s" -#: ../src/dialogs.py:1214 ../src/dialogs.py:1220 +#: ../src/dialogs.py:1274 ../src/dialogs.py:1280 +#: ../src/groupchat_control.py:1475 msgid "Invalid group chat Jabber ID" msgstr "Niepoprawny Jabber ID" -#: ../src/dialogs.py:1215 ../src/dialogs.py:1221 +#: ../src/dialogs.py:1275 ../src/dialogs.py:1281 +#: ../src/groupchat_control.py:1476 msgid "The group chat Jabber ID has not allowed characters." msgstr "Używane przez ciebie Jabber ID zawiera niedozwolone znaki." -#: ../src/dialogs.py:1227 +#: ../src/dialogs.py:1287 msgid "This is not a group chat" msgstr "To nie jest czat" -#: ../src/dialogs.py:1228 +#: ../src/dialogs.py:1288 #, python-format msgid "%s is not the name of a group chat." msgstr "%s nie jest nazwą czatu." -#: ../src/dialogs.py:1267 +#: ../src/dialogs.py:1327 +msgid "Without a connection, you can not synchronise your contacts." +msgstr "Nie możesz zsynchronizować kontaktów przy niektywnym połączeniu." + +#: ../src/dialogs.py:1374 +msgid "This account is not connected to the server" +msgstr "To konto nie jest połączone z serwerem" + +#: ../src/dialogs.py:1375 +msgid "You cannot synchronize with an account unless it is connected." +msgstr "Nie możesz synchronizować kontaktów z kontem, które nie jest połączone." + +#: ../src/dialogs.py:1399 +msgid "Synchronise" +msgstr "Synchronizuj" + +#: ../src/dialogs.py:1457 #, python-format msgid "Start Chat with account %s" msgstr "Rozpocznij rozmowę z konta %s" -#: ../src/dialogs.py:1269 +#: ../src/dialogs.py:1459 msgid "Start Chat" msgstr "Rozpocznij rozmowę" -#: ../src/dialogs.py:1270 +#: ../src/dialogs.py:1460 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" @@ -3332,268 +3433,283 @@ msgstr "" "wysłać wiadomość:" #. if offline or connecting -#: ../src/dialogs.py:1295 ../src/dialogs.py:1654 ../src/dialogs.py:1785 +#: ../src/dialogs.py:1485 ../src/dialogs.py:1844 ../src/dialogs.py:1975 msgid "Connection not available" msgstr "Połączenie jest niedostępne" -#: ../src/dialogs.py:1296 ../src/dialogs.py:1655 ../src/dialogs.py:1786 +#: ../src/dialogs.py:1486 ../src/dialogs.py:1845 ../src/dialogs.py:1976 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Sprawdź, czy jesteś połączony z \"%s\"." -#: ../src/dialogs.py:1305 ../src/dialogs.py:1308 +#: ../src/dialogs.py:1495 ../src/dialogs.py:1498 msgid "Invalid JID" msgstr "Niepoprawny JID" -#: ../src/dialogs.py:1308 +#: ../src/dialogs.py:1498 #, python-format msgid "Unable to parse \"%s\"." msgstr "Nie można sparsować \"%s\"." -#: ../src/dialogs.py:1317 +#: ../src/dialogs.py:1507 msgid "Without a connection, you can not change your password." msgstr "Nie możesz zmienić hasła, jeśli nie jesteś połączony." -#: ../src/dialogs.py:1336 +#: ../src/dialogs.py:1526 msgid "You must enter a password." msgstr "Musisz wpisać hasło." #. img to display #. default value -#: ../src/dialogs.py:1383 ../src/notify.py:212 ../src/notify.py:416 +#: ../src/dialogs.py:1573 ../src/notify.py:212 ../src/notify.py:416 msgid "Contact Signed In" msgstr "Kontakt połączył się" -#: ../src/dialogs.py:1385 ../src/notify.py:220 ../src/notify.py:418 +#: ../src/dialogs.py:1575 ../src/notify.py:220 ../src/notify.py:418 msgid "Contact Signed Out" msgstr "Kontakt rozłączył się" #. chat message -#: ../src/dialogs.py:1387 ../src/notify.py:239 ../src/notify.py:420 +#: ../src/dialogs.py:1577 ../src/notify.py:239 ../src/notify.py:420 msgid "New Message" msgstr "Nowa wiadomość" #. single message -#: ../src/dialogs.py:1387 ../src/notify.py:224 ../src/notify.py:420 +#: ../src/dialogs.py:1577 ../src/notify.py:224 ../src/notify.py:420 msgid "New Single Message" msgstr "Nowa wiadomość" #. private message -#: ../src/dialogs.py:1388 ../src/notify.py:231 ../src/notify.py:421 +#: ../src/dialogs.py:1578 ../src/notify.py:231 ../src/notify.py:421 msgid "New Private Message" msgstr "Wyślij prywatną wiadomość" -#: ../src/dialogs.py:1388 ../src/gajim.py:1282 ../src/notify.py:429 +#: ../src/dialogs.py:1578 ../src/gajim.py:1294 ../src/notify.py:429 msgid "New E-mail" msgstr "Nowy adres e-mail" -#: ../src/dialogs.py:1390 ../src/gajim.py:1435 ../src/notify.py:423 +#: ../src/dialogs.py:1580 ../src/gajim.py:1447 ../src/notify.py:423 msgid "File Transfer Request" msgstr "Pytanie o przysłanie pliku" -#: ../src/dialogs.py:1392 ../src/gajim.py:1254 ../src/gajim.py:1411 +#: ../src/dialogs.py:1582 ../src/gajim.py:1266 ../src/gajim.py:1423 #: ../src/notify.py:425 msgid "File Transfer Error" msgstr "Błąd przesyłania pliku" -#: ../src/dialogs.py:1394 ../src/gajim.py:1474 ../src/gajim.py:1496 -#: ../src/gajim.py:1513 ../src/notify.py:427 +#: ../src/dialogs.py:1584 ../src/gajim.py:1486 ../src/gajim.py:1508 +#: ../src/gajim.py:1525 ../src/notify.py:427 msgid "File Transfer Completed" msgstr "Zakończono przesyłanie pliku" -#: ../src/dialogs.py:1395 ../src/gajim.py:1477 ../src/notify.py:427 +#: ../src/dialogs.py:1585 ../src/gajim.py:1489 ../src/notify.py:427 msgid "File Transfer Stopped" msgstr "Przesyłanie pliku zatrzymane" -#: ../src/dialogs.py:1397 ../src/gajim.py:1151 ../src/notify.py:431 +#: ../src/dialogs.py:1587 ../src/gajim.py:1163 ../src/notify.py:431 msgid "Groupchat Invitation" msgstr "Zaproszenie na czat" -#: ../src/dialogs.py:1399 ../src/notify.py:204 ../src/notify.py:433 +#: ../src/dialogs.py:1589 ../src/notify.py:204 ../src/notify.py:433 msgid "Contact Changed Status" msgstr "Kontakt zmienił status" -#: ../src/dialogs.py:1584 +#: ../src/dialogs.py:1774 #, python-format msgid "Single Message using account %s" msgstr "Wiadomość z konta %s" -#: ../src/dialogs.py:1586 +#: ../src/dialogs.py:1776 #, python-format msgid "Single Message in account %s" msgstr "Wiadomość z konta %s" -#: ../src/dialogs.py:1588 +#: ../src/dialogs.py:1778 msgid "Single Message" msgstr "Pojedyncza wiadomość" #. prepare UI for Sending -#: ../src/dialogs.py:1591 +#: ../src/dialogs.py:1781 #, python-format msgid "Send %s" msgstr "Wyślij %s" #. prepare UI for Receiving -#: ../src/dialogs.py:1614 +#: ../src/dialogs.py:1804 #, python-format msgid "Received %s" msgstr "Odebrane %s" #. we create a new blank window to send and we preset RE: and to jid -#: ../src/dialogs.py:1686 +#: ../src/dialogs.py:1876 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:1687 +#: ../src/dialogs.py:1877 #, python-format msgid "%s wrote:\n" msgstr "%s napisał:\n" -#: ../src/dialogs.py:1731 +#: ../src/dialogs.py:1921 #, python-format msgid "XML Console for %s" msgstr "Kosola XML dla %s" -#: ../src/dialogs.py:1733 +#: ../src/dialogs.py:1923 msgid "XML Console" msgstr "Konsola XML" -#: ../src/dialogs.py:1856 +#: ../src/dialogs.py:2046 #, python-format msgid "Privacy List %s" msgstr "Lista prywatności %s" -#: ../src/dialogs.py:1860 +#: ../src/dialogs.py:2050 #, python-format msgid "Privacy List for %s" msgstr "Lista prywatności dla %s" -#: ../src/dialogs.py:1908 +#: ../src/dialogs.py:2098 #, python-format msgid "Order: %s, action: %s, type: %s, value: %s" msgstr "Kolejność: %s, akcja: %s, typ: %s, wartość: %s" -#: ../src/dialogs.py:1911 +#: ../src/dialogs.py:2101 #, python-format msgid "Order: %s, action: %s" msgstr "Kolejność: %s, akcja: %s" -#: ../src/dialogs.py:1953 +#: ../src/dialogs.py:2143 msgid "Edit a rule" msgstr "Edytuj regułę" -#: ../src/dialogs.py:2040 +#: ../src/dialogs.py:2230 msgid "Add a rule" msgstr "Dodaj regułę" -#: ../src/dialogs.py:2136 +#: ../src/dialogs.py:2319 +#, python-format +msgid "Blocked Contacts for %s" +msgstr "Kontakty zablokowane (dla %s)" + +#: ../src/dialogs.py:2321 +msgid "Blocked Contacts" +msgstr "Kontakty zablokowane" + +#: ../src/dialogs.py:2390 +msgid "Group %s" +msgstr "Grupa %" + +#: ../src/dialogs.py:2421 #, python-format msgid "Privacy Lists for %s" msgstr "Listy prywatności dla %s" -#: ../src/dialogs.py:2138 +#: ../src/dialogs.py:2423 msgid "Privacy Lists" msgstr "Listy prywatności" -#: ../src/dialogs.py:2208 +#: ../src/dialogs.py:2493 msgid "Invalid List Name" msgstr "Niepoprawna nazwa listy" -#: ../src/dialogs.py:2209 +#: ../src/dialogs.py:2494 msgid "You must enter a name to create a privacy list." msgstr "Musisz podać nazwę nowej listy prywatności." #. Don't translate $Contact -#: ../src/dialogs.py:2243 +#: ../src/dialogs.py:2528 +#, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact zaprasza cię do pokoju %(room_jid)s" #. only if not None and not '' -#: ../src/dialogs.py:2255 +#: ../src/dialogs.py:2540 #, python-format msgid "Comment: %s" msgstr "Komentarz: %s" -#: ../src/dialogs.py:2317 +#: ../src/dialogs.py:2602 msgid "Choose Sound" msgstr "Wybierz dźwięk" -#: ../src/dialogs.py:2327 ../src/dialogs.py:2372 +#: ../src/dialogs.py:2612 ../src/dialogs.py:2657 msgid "All files" msgstr "Wszystkie pliki" -#: ../src/dialogs.py:2332 +#: ../src/dialogs.py:2617 msgid "Wav Sounds" msgstr "Dźwięki w Wav" -#: ../src/dialogs.py:2362 +#: ../src/dialogs.py:2647 msgid "Choose Image" msgstr "Wybierz obrazek" -#: ../src/dialogs.py:2377 +#: ../src/dialogs.py:2662 msgid "Images" msgstr "Obrazki" -#: ../src/dialogs.py:2434 +#: ../src/dialogs.py:2719 #, python-format msgid "When %s becomes:" msgstr "Gdy %s ma status:" -#: ../src/dialogs.py:2436 +#: ../src/dialogs.py:2721 #, python-format msgid "Adding Special Notification for %s" msgstr "Dodaję specjalne powiadomienia dla %s" #. # means number -#: ../src/dialogs.py:2507 +#: ../src/dialogs.py:2792 msgid "#" msgstr "Nr" -#: ../src/dialogs.py:2513 +#: ../src/dialogs.py:2798 msgid "Condition" msgstr "Warunek" -#: ../src/dialogs.py:2634 +#: ../src/dialogs.py:2919 msgid "when I am " msgstr "kiedy mam " -#: ../src/disco.py:102 +#: ../src/disco.py:104 msgid "Others" msgstr "Inni" -#: ../src/disco.py:103 ../src/disco.py:104 ../src/disco.py:1251 -#: ../src/gajim.py:596 ../src/roster_window.py:271 ../src/roster_window.py:329 -#: ../src/roster_window.py:368 ../src/roster_window.py:451 -#: ../src/roster_window.py:483 ../src/roster_window.py:485 -#: ../src/roster_window.py:3896 ../src/roster_window.py:3898 -#: ../src/common/contacts.py:267 ../src/common/helpers.py:43 +#: ../src/disco.py:105 ../src/disco.py:106 ../src/disco.py:1350 +#: ../src/gajim.py:607 ../src/roster_window.py:273 ../src/roster_window.py:331 +#: ../src/roster_window.py:370 ../src/roster_window.py:454 +#: ../src/roster_window.py:486 ../src/roster_window.py:488 +#: ../src/roster_window.py:4230 ../src/roster_window.py:4232 +#: ../src/common/contacts.py:267 ../src/common/contacts.py:282 +#: ../src/common/helpers.py:43 msgid "Transports" msgstr "Transporty" #. conference is a category for listing mostly groupchats in service discovery -#: ../src/disco.py:106 +#: ../src/disco.py:108 msgid "Conference" msgstr "Konferencja" -#: ../src/disco.py:419 +#: ../src/disco.py:421 msgid "Without a connection, you can not browse available services" msgstr "Nie możesz przeglądać usług, jeśli nie jesteś połączony" -#: ../src/disco.py:498 +#: ../src/disco.py:500 #, python-format msgid "Service Discovery using account %s" msgstr "Przeglądanie usług przy użyciu konta %s" -#: ../src/disco.py:500 +#: ../src/disco.py:502 msgid "Service Discovery" msgstr "Przeglądanie usług" -#: ../src/disco.py:640 +#: ../src/disco.py:642 msgid "The service could not be found" msgstr "Nie można odnaleźć usługi" -#: ../src/disco.py:641 +#: ../src/disco.py:643 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." @@ -3601,64 +3717,68 @@ msgstr "" "Pod wpisanym adresem nie ma żadnych usług lub one nie odpowiadają. Sprawdź " "adres i spróbuj ponownie." -#: ../src/disco.py:645 ../src/disco.py:926 +#: ../src/disco.py:647 ../src/disco.py:928 msgid "The service is not browsable" msgstr "Tej usługi nie można przeglądać" -#: ../src/disco.py:646 +#: ../src/disco.py:648 msgid "This type of service does not contain any items to browse." msgstr "Tego typu usługa nie zawiera elementów, które można przeglądać." -#: ../src/disco.py:726 +#: ../src/disco.py:728 #, python-format msgid "Browsing %s using account %s" msgstr "Przeglądanie %s przy użyciu konta %s" -#: ../src/disco.py:765 +#: ../src/disco.py:767 msgid "_Browse" msgstr "Prze_glądaj" -#: ../src/disco.py:927 +#: ../src/disco.py:929 msgid "This service does not contain any items to browse." msgstr "Usługa nie zawiera elementów, które można przeglądać." -#: ../src/disco.py:1141 ../src/disco.py:1256 +#: ../src/disco.py:1147 +msgid "_Execute Command" +msgstr "_Wykonaj komendę" + +#: ../src/disco.py:1157 ../src/disco.py:1355 msgid "Re_gister" msgstr "Za_rejestruj" -#: ../src/disco.py:1293 +#: ../src/disco.py:1392 #, python-format msgid "Scanning %d / %d.." msgstr "Skanowanie %d / %d.." #. Users column -#: ../src/disco.py:1474 +#: ../src/disco.py:1573 msgid "Users" msgstr "Użytkownicy" #. Description column -#: ../src/disco.py:1481 +#: ../src/disco.py:1580 msgid "Description" msgstr "Opis" #. Id column -#: ../src/disco.py:1488 +#: ../src/disco.py:1587 msgid "Id" msgstr "Id" -#: ../src/disco.py:1711 +#: ../src/disco.py:1810 msgid "Subscribed" msgstr "Zasubskrybowano" -#: ../src/disco.py:1737 +#: ../src/disco.py:1836 msgid "New post" msgstr "Nowy wpis" -#: ../src/disco.py:1743 +#: ../src/disco.py:1842 msgid "_Subscribe" msgstr "_Autoryzuj" -#: ../src/disco.py:1749 +#: ../src/disco.py:1848 msgid "_Unsubscribe" msgstr "_Cofnij autoryzację" @@ -3674,133 +3794,133 @@ msgstr "Czas" msgid "Progress" msgstr "Postęp" -#: ../src/filetransfers_window.py:163 ../src/filetransfers_window.py:223 +#: ../src/filetransfers_window.py:161 ../src/filetransfers_window.py:215 #, python-format msgid "Filename: %s" msgstr "Nazwa pliku: %s" -#: ../src/filetransfers_window.py:164 ../src/filetransfers_window.py:298 +#: ../src/filetransfers_window.py:162 ../src/filetransfers_window.py:290 #, python-format msgid "Size: %s" msgstr "Rozmiar: %s" #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:183 +#: ../src/filetransfers_window.py:171 ../src/filetransfers_window.py:181 #: ../src/history_manager.py:463 msgid "You" msgstr "Ty" -#: ../src/filetransfers_window.py:174 +#: ../src/filetransfers_window.py:172 #, python-format msgid "Sender: %s" msgstr "Nadawca: %s" -#: ../src/filetransfers_window.py:175 ../src/filetransfers_window.py:572 -#: ../src/tooltips.py:573 +#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:564 +#: ../src/tooltips.py:574 msgid "Recipient: " msgstr "Odbiorca: " -#: ../src/filetransfers_window.py:186 +#: ../src/filetransfers_window.py:184 #, python-format msgid "Saved in: %s" msgstr "Zapisane w: %s" -#: ../src/filetransfers_window.py:188 +#: ../src/filetransfers_window.py:186 msgid "File transfer completed" msgstr "Zakończono przesyłanie pliku" -#: ../src/filetransfers_window.py:204 ../src/filetransfers_window.py:212 +#: ../src/filetransfers_window.py:200 ../src/filetransfers_window.py:206 msgid "File transfer cancelled" msgstr "Przesyłanie pliku anulowane" -#: ../src/filetransfers_window.py:204 ../src/filetransfers_window.py:213 +#: ../src/filetransfers_window.py:200 ../src/filetransfers_window.py:207 msgid "Connection with peer cannot be established." msgstr "Nie można ustanowić połączenia z drugą stroną." -#: ../src/filetransfers_window.py:224 +#: ../src/filetransfers_window.py:216 #, python-format msgid "Recipient: %s" msgstr "Odbiorca: %s" -#: ../src/filetransfers_window.py:226 +#: ../src/filetransfers_window.py:218 #, python-format msgid "Error message: %s" msgstr "Komunikat błędu: %s" -#: ../src/filetransfers_window.py:227 +#: ../src/filetransfers_window.py:219 msgid "File transfer stopped by the contact at the other end" msgstr "Przesyłanie pliku zostało zatrzymane przez drugą osobę" -#: ../src/filetransfers_window.py:244 +#: ../src/filetransfers_window.py:236 msgid "Choose File to Send..." msgstr "Wybierz plik do wysłania..." -#: ../src/filetransfers_window.py:263 +#: ../src/filetransfers_window.py:255 msgid "Gajim cannot access this file" msgstr "Gajim nie może uzyskać dostępu do tego pliku" -#: ../src/filetransfers_window.py:264 +#: ../src/filetransfers_window.py:256 msgid "This file is being used by another process." msgstr "Ten plik jest używany przez inny proces." -#: ../src/filetransfers_window.py:296 +#: ../src/filetransfers_window.py:288 #, python-format msgid "File: %s" msgstr "Plik: %s" -#: ../src/filetransfers_window.py:301 +#: ../src/filetransfers_window.py:293 #, python-format msgid "Type: %s" msgstr "Typ: %s" -#: ../src/filetransfers_window.py:303 +#: ../src/filetransfers_window.py:295 #, python-format msgid "Description: %s" msgstr "Opis: %s" -#: ../src/filetransfers_window.py:304 +#: ../src/filetransfers_window.py:296 #, python-format msgid "%s wants to send you a file:" msgstr "%s chce przesłać Ci plik:" -#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:747 +#: ../src/filetransfers_window.py:310 ../src/gtkgui_helpers.py:767 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Nie można nadpisać pliku \"%s\"" -#: ../src/filetransfers_window.py:319 ../src/gtkgui_helpers.py:749 +#: ../src/filetransfers_window.py:311 ../src/gtkgui_helpers.py:769 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "" "Istnieje już plik o tej nazwie a Ty nie masz uprawnień do jego nadpisania." -#: ../src/filetransfers_window.py:326 ../src/gtkgui_helpers.py:753 +#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:773 msgid "This file already exists" msgstr "Ten plik już istnieje" -#: ../src/filetransfers_window.py:326 ../src/gtkgui_helpers.py:753 +#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:773 msgid "What do you want to do?" msgstr "Co chcesz zrobić?" -#: ../src/filetransfers_window.py:338 ../src/gtkgui_helpers.py:763 +#: ../src/filetransfers_window.py:330 ../src/gtkgui_helpers.py:783 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Nie masz uprawnień do zapisu w folderze \"%s\"" -#: ../src/filetransfers_window.py:338 ../src/gtkgui_helpers.py:764 +#: ../src/filetransfers_window.py:330 ../src/gtkgui_helpers.py:784 msgid "You do not have permission to create files in this directory." msgstr "Nie masz uprawnień do tworzenia plików w tym folderze." -#: ../src/filetransfers_window.py:348 +#: ../src/filetransfers_window.py:340 msgid "Save File as..." msgstr "Zapisz obraz 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:429 +#: ../src/filetransfers_window.py:421 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -3808,32 +3928,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:505 +#: ../src/filetransfers_window.py:497 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/ów)" -#: ../src/filetransfers_window.py:544 ../src/filetransfers_window.py:547 +#: ../src/filetransfers_window.py:536 ../src/filetransfers_window.py:539 msgid "Invalid File" msgstr "Niepoprawny plik" -#: ../src/filetransfers_window.py:544 +#: ../src/filetransfers_window.py:536 msgid "File: " msgstr "Plik: " -#: ../src/filetransfers_window.py:548 +#: ../src/filetransfers_window.py:540 msgid "It is not possible to send empty files" msgstr "Nie można wysłać pustego pliku" -#: ../src/filetransfers_window.py:568 ../src/tooltips.py:563 +#: ../src/filetransfers_window.py:560 ../src/tooltips.py:564 msgid "Name: " msgstr "Nazwa: " -#: ../src/filetransfers_window.py:570 ../src/tooltips.py:567 +#: ../src/filetransfers_window.py:562 ../src/tooltips.py:568 msgid "Sender: " msgstr "Nadawca: " -#: ../src/filetransfers_window.py:758 +#: ../src/filetransfers_window.py:750 msgid "Pause" msgstr "Zatrzymaj" @@ -4166,6 +4286,7 @@ msgstr "" "Gdzie polecenie to jedna z następujący fraz:\n" #: ../src/gajim-remote.py:438 +#, python-format msgid "" "Too many arguments. \n" "Type \"%s help %s\" for more info" @@ -4202,7 +4323,8 @@ msgstr "Gajim wymaga PyGTK w wersji 2.8 lub wyższej" #: ../src/gajim.py:127 msgid "Gajim needs PyGTK 2.8 or above to run. Quiting..." msgstr "" -"Gajim wymaga do działania PyGTK w wersji 2.8 lub wyższej. Zamykanie programu..." +"Gajim wymaga do działania PyGTK w wersji 2.8 lub wyższej. Zamykanie " +"programu..." #: ../src/gajim.py:129 msgid "Gajim needs GTK 2.8 or above" @@ -4210,7 +4332,8 @@ msgstr "Gajim wymaga GTK w wersji 2.8 lub wyższej" #: ../src/gajim.py:130 msgid "Gajim needs GTK 2.8 or above to run. Quiting..." -msgstr "Gajim wymaga do działania GTK w wersji 2.8 lub wyższej. Zamykanie programu..." +msgstr "" +"Gajim wymaga do działania GTK w wersji 2.8 lub wyższej. Zamykanie programu..." #: ../src/gajim.py:135 msgid "GTK+ runtime is missing libglade support" @@ -4249,11 +4372,11 @@ msgstr "" "spod adresu %s" #. set the icon to all newly opened wind -#: ../src/gajim.py:296 +#: ../src/gajim.py:300 msgid "Gajim is already running" msgstr "Gajim jest już uruchomiony" -#: ../src/gajim.py:297 +#: ../src/gajim.py:301 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -4261,83 +4384,83 @@ msgstr "" "Wydaje się, że w tle działa już inna kopia Gajima.\n" "Czy mimo to chcesz uruchomić program?" -#: ../src/gajim.py:403 +#: ../src/gajim.py:408 +msgid "Do you accept this request?" +msgstr "Czy akceptujesz tę prośbę?" + +#: ../src/gajim.py:411 #, python-format msgid "HTTP (%s) Authorization for %s (id: %s)" msgstr "Autoryzacja HTTP (%s) dla %s (id: %s)" -#: ../src/gajim.py:404 -msgid "Do you accept this request?" -msgstr "Czy akceptujesz tę prośbę?" - -#: ../src/gajim.py:450 ../src/notify.py:435 +#: ../src/gajim.py:458 ../src/notify.py:435 msgid "Connection Failed" msgstr "Połączenie nie powiodło się" -#: ../src/gajim.py:767 +#: ../src/gajim.py:778 #, python-format msgid "Subject: %s" msgstr "Temat: %s" #. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) -#: ../src/gajim.py:812 ../src/gajim.py:825 +#: ../src/gajim.py:823 ../src/gajim.py:836 #, python-format msgid "error while sending %s ( %s )" msgstr "błąd przy wysyłaniu %s ( %s )" -#: ../src/gajim.py:858 +#: ../src/gajim.py:869 msgid "Authorization accepted" msgstr "Autoryzacja przyjęta" -#: ../src/gajim.py:859 +#: ../src/gajim.py:870 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "Kontakt \"%s\" udzielił Ci autoryzacji byś mógł widzieć jego status." -#: ../src/gajim.py:867 +#: ../src/gajim.py:878 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Kontakt \"%s\" cofnął Ci autoryzację" -#: ../src/gajim.py:868 +#: ../src/gajim.py:879 msgid "You will always see him or her as offline." msgstr "Zawsze będziesz widział ten kontakt jako niepołączony." -#: ../src/gajim.py:911 +#: ../src/gajim.py:923 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Nie można ustanowić połączenia z \"%s\"" -#: ../src/gajim.py:912 ../src/common/connection.py:417 +#: ../src/gajim.py:924 ../src/common/connection.py:438 msgid "Check your connection or try again later." msgstr "Sprawdź swoje połączenie lub spróbuj później." -#: ../src/gajim.py:1061 ../src/roster_window.py:1218 +#: ../src/gajim.py:1073 ../src/roster_window.py:1247 #, python-format msgid "%s is now %s (%s)" msgstr "%s ma teraz status %s (%s)" #. No status message -#: ../src/gajim.py:1064 ../src/groupchat_control.py:944 -#: ../src/roster_window.py:1221 +#: ../src/gajim.py:1076 ../src/groupchat_control.py:968 +#: ../src/roster_window.py:1250 #, python-format msgid "%s is now %s" msgstr "%s ma teraz status %s" -#: ../src/gajim.py:1161 +#: ../src/gajim.py:1173 msgid "Your passphrase is incorrect" msgstr "Twoje hasło jest niepoprawne" -#: ../src/gajim.py:1162 +#: ../src/gajim.py:1174 msgid "You are currently connected without your OpenPGP key." msgstr "Jesteś aktualnie połączony bez obsługi OpenPGP." -#: ../src/gajim.py:1265 +#: ../src/gajim.py:1277 #, python-format msgid "New mail on %(gmail_mail_address)s" msgstr "Nowa poczta w skrzynce %(gmail_mail_address)s" -#: ../src/gajim.py:1267 +#: ../src/gajim.py:1279 #, python-format msgid "You have %d new mail conversation" msgid_plural "You have %d new mail conversations" @@ -4348,7 +4471,7 @@ msgstr[2] "Masz %d nieprzeczytane wiadomości pocztowe" #. FIXME: emulate Gtalk client popups. find out what they parse and how #. they decide what to show #. each message has a 'From', 'Subject' and 'Snippet' field -#: ../src/gajim.py:1276 +#: ../src/gajim.py:1288 #, python-format msgid "" "\n" @@ -4357,52 +4480,65 @@ msgstr "" "\n" "Od: %(from_address)s" -#: ../src/gajim.py:1432 +#: ../src/gajim.py:1444 #, python-format msgid "%s wants to send you a file." msgstr "%s chce przesłać ci plik." -#: ../src/gajim.py:1497 +#: ../src/gajim.py:1509 #, python-format msgid "You successfully received %(filename)s from %(name)s." msgstr "Otrzymałeś plik %(filename)s od %(name)s." #. ft stopped -#: ../src/gajim.py:1501 +#: ../src/gajim.py:1513 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Przesyłanie pliku %(filename)s·od·%(name)s·zostało zatrzymane." -#: ../src/gajim.py:1514 +#: ../src/gajim.py:1526 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Przesłałeś plik %(filename)s do %(name)s." #. ft stopped -#: ../src/gajim.py:1518 +#: ../src/gajim.py:1530 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Przesyłanie pliku·%(filename)s·do·%(name)s·zostało zatrzymane." -#: ../src/gajim.py:1631 +#: ../src/gajim.py:1662 msgid "Username Conflict" msgstr "Konflikt nazw użytkownika" -#: ../src/gajim.py:1632 +#: ../src/gajim.py:1663 msgid "Please type a new username for your local account" msgstr "Podaj nazwę użytkownika dla nowego konta lokalnego" +#: ../src/gajim.py:1680 +msgid "Ping?" +msgstr "Ping?" + +#: ../src/gajim.py:1688 +#, python-format +msgid "Pong! (%s s.)" +msgstr "Pong! (%s s.)" + +#: ../src/gajim.py:1694 +msgid "Error." +msgstr "Błąd." + #. it is good to notify the user #. in case he or she cannot see the output of the console -#: ../src/gajim.py:1972 +#: ../src/gajim.py:2048 msgid "Could not save your settings and preferences" msgstr "Nie można zapisać twoich ustawień i opcji" -#: ../src/gajim.py:2170 +#: ../src/gajim.py:2257 msgid "Network Manager support not available" msgstr "Brak wsparcia dla Network Managera" -#: ../src/gajim.py:2249 +#: ../src/gajim.py:2336 msgid "Session Management support not available (missing gnome.ui module)" msgstr "Wsparcie dla Menadżera Sesji jest niedostępne (brak modułu gnome.ui" @@ -4423,112 +4559,91 @@ msgstr "Nie możesz skasować obecnie używanego motywu" msgid "Please first choose another for your current theme." msgstr "Ustaw najpierw inny motyw." -#: ../src/groupchat_control.py:106 -msgid "Private Chat" -msgstr "Rozmowa prywatna" - -#: ../src/groupchat_control.py:106 -msgid "Private Chats" -msgstr "Rozmowy prywatne" - -#: ../src/groupchat_control.py:123 +#: ../src/groupchat_control.py:122 msgid "Sending private message failed" msgstr "Wysyłanie prywatnej wiadomości nie powiodło się" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:125 +#: ../src/groupchat_control.py:124 #, python-format msgid "You are no longer in group chat \"%s\" or \"%s\" has left." msgstr "Nie jesteś już w pokoju \"%s\" lub \"%s\" opuścił go." -#: ../src/groupchat_control.py:144 -msgid "Group Chat" -msgstr "Pokój" - -#: ../src/groupchat_control.py:144 -msgid "Group Chats" -msgstr "Czaty" - -#: ../src/groupchat_control.py:318 +#: ../src/groupchat_control.py:322 msgid "Insert Nickname" msgstr "Wstaw pseudonim" #. do not print 'kicked by None' -#: ../src/groupchat_control.py:829 +#: ../src/groupchat_control.py:850 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s został wyrzucony: %(reason)s" -#: ../src/groupchat_control.py:833 +#: ../src/groupchat_control.py:854 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s został wyrzucony przez %(who)s: %(reason)s" #. do not print 'banned by None' -#: ../src/groupchat_control.py:840 +#: ../src/groupchat_control.py:861 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s został zabanowany: %(reason)s" -#: ../src/groupchat_control.py:844 +#: ../src/groupchat_control.py:865 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s został zabanowany przez %(who)s: %(reason)s" -#: ../src/groupchat_control.py:852 +#: ../src/groupchat_control.py:873 #, python-format msgid "You are now known as %s" msgstr "Występujesz teraz jako %s" -#: ../src/groupchat_control.py:854 +#: ../src/groupchat_control.py:875 #, python-format msgid "%s is now known as %s" msgstr "%s występuje teraz jako %s" -#: ../src/groupchat_control.py:937 +#: ../src/groupchat_control.py:961 #, python-format msgid "%s has left" msgstr "%s wychodzi" -#: ../src/groupchat_control.py:942 +#: ../src/groupchat_control.py:966 #, python-format msgid "%s has joined the group chat" msgstr "%s dołączył do pokoju" -#: ../src/groupchat_control.py:1063 ../src/groupchat_control.py:1081 -#: ../src/groupchat_control.py:1174 ../src/groupchat_control.py:1191 +#: ../src/groupchat_control.py:1088 ../src/groupchat_control.py:1106 +#: ../src/groupchat_control.py:1199 ../src/groupchat_control.py:1216 #, python-format msgid "Nickname not found: %s" msgstr "Pseudonim nie został odnaleziony: %s" -#: ../src/groupchat_control.py:1097 +#: ../src/groupchat_control.py:1122 msgid "This group chat has no subject" msgstr "Ten pokój nie ma tematu" -#: ../src/groupchat_control.py:1110 +#: ../src/groupchat_control.py:1135 #, python-format msgid "Invited %(contact_jid)s to %(room_jid)s." msgstr "%(contact_jid)s zaproszony do %(room_jid)s." #. %s is something the user wrote but it is not a jid so we inform -#: ../src/groupchat_control.py:1117 ../src/groupchat_control.py:1145 +#: ../src/groupchat_control.py:1142 ../src/groupchat_control.py:1170 #, python-format msgid "%s does not appear to be a valid JID" msgstr "%s nie wygląda na poprawny JID" -#: ../src/groupchat_control.py:1228 +#: ../src/groupchat_control.py:1253 #, python-format msgid "No such command: /%s (if you want to send this, prefix it with /say)" msgstr "" "Nie ma takiego polecenia: /%s (jeśli chcesz je wysłać, poprzedź je znakami: /" "say)" -#: ../src/groupchat_control.py:1251 -#, python-format -msgid "Commands: %s" -msgstr "Polecenia: %s" - -#: ../src/groupchat_control.py:1253 +#: ../src/groupchat_control.py:1279 #, python-format msgid "" "Usage: /%s [reason], bans the JID from the group chat. The " @@ -4540,18 +4655,14 @@ msgstr "" "może zostać zmieniony o ile nie zawiera \"@\". Jeśli JID jest obecnie w " "pokoju, to zostanie z niego wyrzucony. NIE toleruje spacji w pseudonimie." -#: ../src/groupchat_control.py:1260 +#: ../src/groupchat_control.py:1286 +#, python-format msgid "" "Usage: /%s , opens a private chat window with the specified " "occupant." msgstr "Użycie: /%s , otwiera okno prywatnej rozmowy z tą osobą." -#: ../src/groupchat_control.py:1264 -#, python-format -msgid "Usage: /%s, clears the text window." -msgstr "Użycie: /%s czyście okno tekstowe." - -#: ../src/groupchat_control.py:1266 +#: ../src/groupchat_control.py:1292 #, python-format msgid "" "Usage: /%s [reason], closes the current window or tab, displaying reason if " @@ -4560,12 +4671,7 @@ msgstr "" "Użycie: /%s [powód] zamyka aktualne okno lub kartę i wyświetla powóc, jeśli " "został podany." -#: ../src/groupchat_control.py:1269 -#, python-format -msgid "Usage: /%s, hide the chat buttons." -msgstr "Użycie: /%s ukrywa przyciski czatu." - -#: ../src/groupchat_control.py:1272 +#: ../src/groupchat_control.py:1298 #, python-format msgid "" "Usage: /%s [reason], invites JID to the current group chat, optionally " @@ -4574,7 +4680,7 @@ msgstr "" "Użycie: /%s [powód] zaprasza JID do aktualnego pokoju, opcjonalnie " "wyświetlając powód." -#: ../src/groupchat_control.py:1276 +#: ../src/groupchat_control.py:1302 #, python-format msgid "" "Usage: /%s @[/nickname], offers to join room@server optionally " @@ -4583,7 +4689,7 @@ msgstr "" "Użycie: /%s @[/pseudonim] oferuje przyłączenie się do " "pokój@serwer opcjonalnie z wykorzystaniem podanego psedonimu." -#: ../src/groupchat_control.py:1280 +#: ../src/groupchat_control.py:1306 #, python-format msgid "" "Usage: /%s [reason], removes the occupant specified by nickname " @@ -4593,7 +4699,7 @@ msgstr "" "Użycie: /%s [powód] usuwa podaną poprzez pseudonim osobę z " "pokoju i opcjonalnie wyświetla powód. NIE wspiera spacji w pseudonimie." -#: ../src/groupchat_control.py:1285 +#: ../src/groupchat_control.py:1311 #, python-format msgid "" "Usage: /%s , sends action to the current group chat. Use third " @@ -4602,7 +4708,8 @@ msgstr "" "Użycie: /%s wysyła działanie do aktualnego pokoju. Używaj w " "trzeciej osobie (np. /%s eksploduje.)" -#: ../src/groupchat_control.py:1289 +#: ../src/groupchat_control.py:1315 +#, python-format msgid "" "Usage: /%s [message], opens a private message window and sends " "message to the occupant specified by nickname." @@ -4610,92 +4717,103 @@ msgstr "" "Użycie: /%s [wiadomość] otwiera okno prywatnej wiadomości i " "wysyła ją do osoby o takim pseudonimie." -#: ../src/groupchat_control.py:1294 +#: ../src/groupchat_control.py:1320 #, python-format msgid "Usage: /%s , changes your nickname in current group chat." msgstr "Użycie: /%s zmienia twój pseudonim w aktualnym pokoju." -#: ../src/groupchat_control.py:1298 +#: ../src/groupchat_control.py:1324 #, python-format msgid "Usage: /%s , display the names of group chat occupants." msgstr "Użycie: /%s , wyświetla osoby obecne w danym pokoju." -#: ../src/groupchat_control.py:1302 +#: ../src/groupchat_control.py:1328 #, python-format msgid "Usage: /%s [topic], displays or updates the current group chat topic." msgstr "Użycie: /%s [temat] wyświetla lub aktualizuje temat aktualnego pokoju." -#: ../src/groupchat_control.py:1305 +#: ../src/groupchat_control.py:1331 #, python-format msgid "" "Usage: /%s , sends a message without looking for other commands." msgstr "" "Użycie: /%s wysyła wiadomość bez sprawdzania innych poleceń." -#: ../src/groupchat_control.py:1308 -#, python-format -msgid "No help info for /%s" -msgstr "Brak informacji o pomocy dla /%s" - -#: ../src/groupchat_control.py:1359 +#: ../src/groupchat_control.py:1397 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Czy jesteś pewien, że chcesz opuścić pokój \"%s\"?" -#: ../src/groupchat_control.py:1361 +#: ../src/groupchat_control.py:1399 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Jeśli zamkniesz to okno, połączenie z tym pokojem zostanie zerwane." -#: ../src/groupchat_control.py:1365 ../src/roster_window.py:4036 +#: ../src/groupchat_control.py:1403 ../src/roster_window.py:4376 msgid "Do _not ask me again" msgstr "_Nie pytaj mnie o to ponownie" -#: ../src/groupchat_control.py:1399 +#: ../src/groupchat_control.py:1437 msgid "Changing Subject" msgstr "Zmiana tematu" -#: ../src/groupchat_control.py:1400 +#: ../src/groupchat_control.py:1438 msgid "Please specify the new subject:" msgstr "Wpisz nowy temat:" -#: ../src/groupchat_control.py:1409 +#: ../src/groupchat_control.py:1447 msgid "Changing Nickname" msgstr "Zmiana pseudonimu" -#: ../src/groupchat_control.py:1410 +#: ../src/groupchat_control.py:1448 msgid "Please specify the new nickname you want to use:" msgstr "Wpisz nowy pseudonim, którego chcesz używać:" -#: ../src/groupchat_control.py:1435 +#. Ask for a reason +#: ../src/groupchat_control.py:1463 +msgid "Destroying %s" +msgstr "Usuwam pokój %s" + +#: ../src/groupchat_control.py:1464 +msgid "" +"You are going to definitively destroy this room.\n" +"You may specify a reason below:" +msgstr "Zamierzasz całkowicie usunąć ten pokój. \n" +"Poniżej możesz podać powód swojej decyzji:" + +#: ../src/groupchat_control.py:1466 +msgid "You may also enter an alternate venue:" +msgstr "Możesz również podać alternatywne miejsce spotkań:" + +#: ../src/groupchat_control.py:1496 msgid "Bookmark already set" msgstr "Zakładka została już dodana" -#: ../src/groupchat_control.py:1436 +#: ../src/groupchat_control.py:1497 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Pokój \"%s\" jest już w Twoich zakładkach." -#: ../src/groupchat_control.py:1445 +#: ../src/groupchat_control.py:1506 msgid "Bookmark has been added successfully" msgstr "Zakładka została dodana" -#: ../src/groupchat_control.py:1446 +#: ../src/groupchat_control.py:1507 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "Możesz zarządzać zakładkami poprzez menu Działania w oknie kontaktów." #. ask for reason -#: ../src/groupchat_control.py:1574 +#: ../src/groupchat_control.py:1635 #, python-format msgid "Kicking %s" msgstr "Wyrzuć %s" -#: ../src/groupchat_control.py:1575 ../src/groupchat_control.py:1858 +#: ../src/groupchat_control.py:1636 ../src/groupchat_control.py:1929 msgid "You may specify a reason below:" msgstr "Podaj przyczynę:" #. ask for reason -#: ../src/groupchat_control.py:1857 +#: ../src/groupchat_control.py:1928 #, python-format msgid "Banning %s" msgstr "Zabanuj %s" @@ -4743,30 +4861,30 @@ msgstr "" "Nie można zapisywać do %s. Wsparcie dla Menadżera Sesji nie będzie działać" #. xmpp: is currently handled by another program, so ask the user -#: ../src/gtkgui_helpers.py:691 +#: ../src/gtkgui_helpers.py:711 msgid "Gajim is not the default Jabber client" msgstr "Gajim nie jest domyślnym klinetem Jabbera" -#: ../src/gtkgui_helpers.py:692 +#: ../src/gtkgui_helpers.py:712 msgid "Would you like to make Gajim the default Jabber client?" msgstr "Czy chciałbyś by Gajim stał się klientem domyślnym?" -#: ../src/gtkgui_helpers.py:693 +#: ../src/gtkgui_helpers.py:713 msgid "Always check to see if Gajim is the default Jabber client on startup" msgstr "Przy starcie sprawdzaj czy Gajim jest domyślnym klinetem Jabbera" -#: ../src/gtkgui_helpers.py:792 +#: ../src/gtkgui_helpers.py:812 msgid "Extension not supported" msgstr "Rozszerzenie nie jest obsługiwane" -#: ../src/gtkgui_helpers.py:793 +#: ../src/gtkgui_helpers.py:813 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" "Obraz nie może zostać zapisany w formacie %(type)s. Zapisać jako %" "(new_filename)s?" -#: ../src/gtkgui_helpers.py:802 +#: ../src/gtkgui_helpers.py:822 msgid "Save Image as..." msgstr "Zapisz plik jako..." @@ -4851,31 +4969,51 @@ msgstr[2] "Czy na pewno chcesz usunąć wybrane wiadomości?" msgid "Conversation History with %s" msgstr "Historia rozmowy z %s" -#: ../src/history_window.py:258 +#: ../src/history_window.py:266 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s jes teraz %(status)s: %(status_msg)s" -#: ../src/history_window.py:262 ../src/notify.py:199 +#: ../src/history_window.py:270 ../src/notify.py:199 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s ma teraz status %(status)s" -#: ../src/history_window.py:268 +#: ../src/history_window.py:276 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Obecny status: %(status)s: %(status_msg)s" -#: ../src/history_window.py:271 +#: ../src/history_window.py:279 #, python-format msgid "Status is now: %(status)s" msgstr "Obecny status: %(status)s" +#: ../src/htmltextview.py:710 ../src/htmltextview.py:721 +msgid "Timeout loading image" +msgstr "Przekroczono czas ładowania obrazu" + +#: ../src/htmltextview.py:731 +msgid "Image is too big" +msgstr "Obraz jest za duży" + #: ../src/message_window.py:273 +msgid "Chats" +msgstr "Rozmowy" + +#: ../src/message_window.py:275 +msgid "Group Chats" +msgstr "Czaty" + +#: ../src/message_window.py:277 +msgid "Private Chats" +msgstr "Rozmowy prywatne" + +#: ../src/message_window.py:279 msgid "Messages" msgstr "Wiadomości" -#: ../src/message_window.py:274 +#: ../src/message_window.py:280 #, python-format msgid "%s - Gajim" msgstr "%s - Gajim" @@ -4919,37 +5057,40 @@ msgstr "Nowa wiadomość od %(nickname)s" msgid "Retrieving profile..." msgstr "Pobieranie profilu..." -#: ../src/profile_window.py:107 ../src/profile_window.py:210 -#: ../src/profile_window.py:219 -msgid "Click to set your avatar" -msgstr "Kliknij aby ustawić avatar" +#: ../src/profile_window.py:127 ../src/vcard.py:135 +msgid "File is emty" +msgstr "Plik jest pusty" + +#: ../src/profile_window.py:130 ../src/vcard.py:138 +msgid "File does not exist" +msgstr "Plik nie istnieje." #. keep identation -#: ../src/profile_window.py:137 +#: ../src/profile_window.py:144 ../src/vcard.py:140 msgid "Could not load image" msgstr "Nie można załadować obrazka." -#: ../src/profile_window.py:245 +#: ../src/profile_window.py:257 msgid "Information received" msgstr "Informacja została odebrana" -#: ../src/profile_window.py:314 +#: ../src/profile_window.py:326 msgid "Without a connection you can not publish your contact information." msgstr "Nie możesz wysłać informacji o sobie jeśli nie jesteś połączony." -#: ../src/profile_window.py:326 +#: ../src/profile_window.py:338 msgid "Sending profile..." msgstr "Wysyłanie profilu..." -#: ../src/profile_window.py:341 +#: ../src/profile_window.py:353 msgid "Information NOT published" msgstr "Informacja NIE ZOSTAŁA opublikowana" -#: ../src/profile_window.py:348 +#: ../src/profile_window.py:360 msgid "vCard publication failed" msgstr "Publikacja vCard nie powiodła się" -#: ../src/profile_window.py:349 +#: ../src/profile_window.py:361 msgid "" "There was an error while publishing your personal information, try again " "later." @@ -4957,22 +5098,23 @@ msgstr "" "W czasie publikowanie informacji o tobie wystąpił błąd, spróbuj ponownie " "później." -#: ../src/roster_window.py:171 ../src/roster_window.py:226 +#: ../src/roster_window.py:173 ../src/roster_window.py:228 msgid "Merged accounts" msgstr "Połączone konta" -#: ../src/roster_window.py:344 ../src/common/helpers.py:43 +#: ../src/roster_window.py:346 ../src/roster_window.py:571 +#: ../src/common/helpers.py:43 msgid "Observers" msgstr "Obserwatorzy" -#: ../src/roster_window.py:692 ../src/roster_window.py:3201 +#: ../src/roster_window.py:710 ../src/roster_window.py:3526 msgid "You cannot join a group chat while you are invisible" msgstr "Nie możesz dołączyć do pokoju gdy jesteś niewidoczny" #. new chat #. for chat_with #. for single message -#: ../src/roster_window.py:884 ../src/systray.py:187 ../src/systray.py:192 +#: ../src/roster_window.py:913 ../src/systray.py:206 ../src/systray.py:211 #, python-format msgid "using account %s" msgstr "używając konta %s" @@ -4980,56 +5122,56 @@ msgstr "używając konta %s" #. the 'manage gc bookmarks' item is shown #. below to avoid duplicate code #. add -#: ../src/roster_window.py:909 +#: ../src/roster_window.py:938 #, python-format msgid "to %s account" msgstr "do konta %s" #. disco -#: ../src/roster_window.py:914 +#: ../src/roster_window.py:943 #, python-format msgid "using %s account" msgstr "używając konta %s" #. profile, avatar -#: ../src/roster_window.py:989 +#: ../src/roster_window.py:1018 #, python-format msgid "of account %s" msgstr "dla konta %s" -#: ../src/roster_window.py:1009 +#: ../src/roster_window.py:1038 msgid "_Manage Bookmarks..." msgstr "_Zarządzaj zakładkami..." -#: ../src/roster_window.py:1038 +#: ../src/roster_window.py:1067 #, python-format msgid "for account %s" msgstr "dla konta %s" #. History manager -#: ../src/roster_window.py:1059 +#: ../src/roster_window.py:1088 msgid "History Manager" msgstr "Historia rozmów" -#: ../src/roster_window.py:1068 +#: ../src/roster_window.py:1097 msgid "_Join New Group Chat" msgstr "_Dołącz do pokoju" -#: ../src/roster_window.py:1398 ../src/roster_window.py:3394 -#: ../src/roster_window.py:3401 +#: ../src/roster_window.py:1429 ../src/roster_window.py:3722 +#: ../src/roster_window.py:3729 msgid "You have unread messages" msgstr "Masz nieprzeczytane wiadomości" -#: ../src/roster_window.py:1399 +#: ../src/roster_window.py:1430 msgid "You must read them before removing this transport." msgstr "Przejrzyj je wszystkie przed usunięciem tego transportu." -#: ../src/roster_window.py:1402 +#: ../src/roster_window.py:1433 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transport \"%s\" zostanie usunięty" -#: ../src/roster_window.py:1403 +#: ../src/roster_window.py:1434 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." @@ -5037,11 +5179,11 @@ msgstr "" "Nie będziesz już mógł wysyłać i odbierać wiadomości od kontaktów za pomocą " "tego transportu." -#: ../src/roster_window.py:1406 +#: ../src/roster_window.py:1437 msgid "Transports will be removed" msgstr "Transporty zostaną usunięte" -#: ../src/roster_window.py:1411 +#: ../src/roster_window.py:1442 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " @@ -5051,116 +5193,120 @@ msgstr "" "następujących transportów: %s" #. it's jid -#: ../src/roster_window.py:1431 +#: ../src/roster_window.py:1608 msgid "Rename Contact" msgstr "Zmień nazwę dla kontaktu" -#: ../src/roster_window.py:1432 +#: ../src/roster_window.py:1609 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Wpisz nazwę dla kontaktu %s." -#: ../src/roster_window.py:1439 +#: ../src/roster_window.py:1616 msgid "Rename Group" msgstr "Zmień nazwę grupy" -#: ../src/roster_window.py:1440 +#: ../src/roster_window.py:1617 #, python-format msgid "Enter a new name for group %s" msgstr "Wpisz nową nazwę dla grupy %s." -#: ../src/roster_window.py:1515 +#: ../src/roster_window.py:1692 msgid "Remove Group" msgstr "Usuń grupę" -#: ../src/roster_window.py:1516 +#: ../src/roster_window.py:1693 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Czy chcesz usunąć z rostera grupę %s?" -#: ../src/roster_window.py:1517 +#: ../src/roster_window.py:1694 msgid "Remove also all contacts in this group from your roster" msgstr "Usuń z rostera wszystkie kontakty należące do tej grupy" -#: ../src/roster_window.py:1546 +#: ../src/roster_window.py:1725 msgid "Assign OpenPGP Key" msgstr "Przypisz klucz OpenPGP" -#: ../src/roster_window.py:1547 +#: ../src/roster_window.py:1726 msgid "Select a key to apply to the contact" msgstr "Wybierz klucz, który chcesz przypisać kontaktowi" -#: ../src/roster_window.py:1782 ../src/roster_window.py:2043 +#: ../src/roster_window.py:1966 ../src/roster_window.py:2260 msgid "_New group chat" msgstr "_Nowa rozmowa grupowa" -#: ../src/roster_window.py:1913 +#: ../src/roster_window.py:2111 msgid "I would like to add you to my roster" msgstr "Chciałbym dodać Cię do listy kontaktów" -#: ../src/roster_window.py:2088 ../src/roster_window.py:2135 +#: ../src/roster_window.py:2305 ../src/roster_window.py:2364 msgid "Send Group M_essage" msgstr "_Wyślij wiadomość grupową" -#: ../src/roster_window.py:2114 +#: ../src/roster_window.py:2343 msgid "Re_name" msgstr "_Zmień nazwę" -#: ../src/roster_window.py:2141 +#: ../src/roster_window.py:2370 msgid "To all users" msgstr "Do wszystkich użytkowników" -#: ../src/roster_window.py:2144 +#: ../src/roster_window.py:2373 msgid "To all online users" msgstr "Do wszystkich połączonych użytkowników" -#: ../src/roster_window.py:2180 +#: ../src/roster_window.py:2393 +msgid "Send Cus_tom Status" +msgstr "Wyślij odrębny status" + +#: ../src/roster_window.py:2450 msgid "_Log on" msgstr "_Połącz" -#: ../src/roster_window.py:2190 +#: ../src/roster_window.py:2460 msgid "Log _off" msgstr "R_ozłącz" -#: ../src/roster_window.py:2312 ../src/roster_window.py:2383 +#: ../src/roster_window.py:2582 ../src/roster_window.py:2653 msgid "_Change Status Message" msgstr "_Zmień opis statusu" -#: ../src/roster_window.py:2455 +#: ../src/roster_window.py:2725 msgid "Authorization has been sent" msgstr "Autoryzacja została wysłana" -#: ../src/roster_window.py:2456 +#: ../src/roster_window.py:2726 #, python-format msgid "Now \"%s\" will know your status." msgstr "Teraz \"%s\" będzie znał Twój status." -#: ../src/roster_window.py:2476 +#: ../src/roster_window.py:2746 msgid "Subscription request has been sent" msgstr "Prośba o autoryzację została wysłana" -#: ../src/roster_window.py:2477 +#: ../src/roster_window.py:2747 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "" "Jeśli \"%s\" zaakceptuje tę prośbę, to będziesz mógł widzieć jego lub jej " "status." -#: ../src/roster_window.py:2489 +#: ../src/roster_window.py:2759 msgid "Authorization has been removed" msgstr "Autoryzacja została cofnięta" -#: ../src/roster_window.py:2490 +#: ../src/roster_window.py:2760 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Teraz \"%s\" zawsze będzie cię widział jako rozłączonego." -#: ../src/roster_window.py:2680 +#: ../src/roster_window.py:2955 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Kontakt \"%s\" zostanie usunięty z Twojej listy kontaktów" -#: ../src/roster_window.py:2684 +#: ../src/roster_window.py:2959 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." @@ -5168,7 +5314,7 @@ msgstr "" "Usuwając kontakt cofniesz mu również autoryzację, co spowoduje, że kontakt " "będzie zawsze widział Cię jako rozłączonego." -#: ../src/roster_window.py:2689 +#: ../src/roster_window.py:2964 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." @@ -5176,16 +5322,16 @@ msgstr "" "Usuwając kontakt usuniesz również autoryzację, co spowoduje, że kontakt " "będzie zawsze widział Cię jako rozłączonego." -#: ../src/roster_window.py:2692 +#: ../src/roster_window.py:2967 msgid "I want this contact to know my status after removal" msgstr "Chcę żeby po usunięciu ten kontakt znał mój status" #. several contact to remove at the same time -#: ../src/roster_window.py:2696 +#: ../src/roster_window.py:2971 msgid "Contacts will be removed from your roster" msgstr "Kontakty zostaną usunięte z twojej listy kontaktów" -#: ../src/roster_window.py:2700 +#: ../src/roster_window.py:2975 #, python-format msgid "" "By removing these contacts:%s\n" @@ -5195,48 +5341,49 @@ msgstr "" "cofniesz im również autoryzację, co spowoduje, że będziesz dla nich widoczny " "jako rozłączony." -#: ../src/roster_window.py:2732 +#: ../src/roster_window.py:3007 msgid "" -"Gnomekeyring is installed but not correctly started (environment variable " +"Gnome Keyring is installed but not correctly started (environment variable " "probably not correctly set)" -msgstr "Menedżer bazy kluczy GNOME jest zainstalowany, ale ma błędną konfigurację" +msgstr "" +"Menedżer bazy kluczy GNOME jest zainstalowany, ale ma błędną konfigurację" "(prawodpodobnie niepoprawna zmienna środowiskowa" #. TODO: make this string translatable #. %s is the account name here -#: ../src/roster_window.py:2760 ../src/common/connection.py:671 -#: ../src/common/zeroconf/connection_zeroconf.py:158 +#: ../src/roster_window.py:3035 ../src/common/connection.py:707 +#: ../src/common/zeroconf/connection_zeroconf.py:164 #, python-format msgid "You will be connected to %s without OpenPGP." msgstr "Zostanie połączony z %s bez obsługi OpenPGP." -#: ../src/roster_window.py:2777 +#: ../src/roster_window.py:3052 msgid "Passphrase Required" msgstr "Wymagane hasło" -#: ../src/roster_window.py:2778 +#: ../src/roster_window.py:3053 #, python-format msgid "Enter GPG key passphrase for account %s." msgstr "Wpisz hasło GPG dla konta %s." -#: ../src/roster_window.py:2783 +#: ../src/roster_window.py:3058 msgid "Save passphrase" msgstr "Zapisz hasło" -#: ../src/roster_window.py:2791 +#: ../src/roster_window.py:3066 msgid "Wrong Passphrase" msgstr "Błędne hasło" -#: ../src/roster_window.py:2792 +#: ../src/roster_window.py:3067 msgid "Please retype your GPG passphrase or press Cancel." msgstr "" "Proszę ponownie wprowadzić swoje hasło GPG lub kliknąć przycisk Anuluj." -#: ../src/roster_window.py:2849 ../src/roster_window.py:2909 +#: ../src/roster_window.py:3134 ../src/roster_window.py:3202 msgid "You are participating in one or more group chats" msgstr "Znajdujesz się w jednym lub kilku pokojach" -#: ../src/roster_window.py:2850 ../src/roster_window.py:2910 +#: ../src/roster_window.py:3135 ../src/roster_window.py:3203 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" @@ -5244,20 +5391,20 @@ msgstr "" "Zmiana statusu na Niewidoczny spowoduje rozłaczeniem z tym pokojami. Czy na " "pewno chcesz stać się niewidoczny?" -#: ../src/roster_window.py:2867 +#: ../src/roster_window.py:3160 msgid "No account available" msgstr "Żadne konto nie jest dostępne" -#: ../src/roster_window.py:2868 +#: ../src/roster_window.py:3161 msgid "You must create an account before you can chat with other contacts." msgstr "Aby rozmawiać z innymi osobami musisz założyć konto Jabbera." -#: ../src/roster_window.py:2966 +#: ../src/roster_window.py:3284 #, python-format msgid "\"%(title)s\" by %(artist)s" msgstr "\"%(title)s\" w wykonaniu %(artist)s" -#: ../src/roster_window.py:3395 ../src/roster_window.py:3402 +#: ../src/roster_window.py:3723 ../src/roster_window.py:3730 msgid "" "Messages will only be available for reading them later if you have history " "enabled." @@ -5265,11 +5412,11 @@ msgstr "" "Wiadomości będą dostępne tylko do czytania, o ile masz włączoną obsługę " "historii." -#: ../src/roster_window.py:3986 +#: ../src/roster_window.py:4326 msgid "Metacontacts storage not supported by your server" msgstr "Twój serwer uniemożliwia przechowywanie metakontaktów" -#: ../src/roster_window.py:3988 +#: ../src/roster_window.py:4328 msgid "" "Your server does not support storing metacontacts information. So those " "information will not be save on next reconnection." @@ -5277,12 +5424,12 @@ msgstr "" "Twój serwer uniemożliwia przechowywanie metakontaktów. Informacja ta nie " "zostanie przywrócona podczas następnego połączenia." -#: ../src/roster_window.py:4030 +#: ../src/roster_window.py:4370 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Chcesz utworzyć metakontakt. Kontynuować?" -#: ../src/roster_window.py:4032 +#: ../src/roster_window.py:4372 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 " @@ -5292,25 +5439,44 @@ msgstr "" "rostera. Używa się ich przede wszystkim wtedy, gdy jedna osoba ma kilka kont " "Jabbera lub zarejestrowana jest w kilku transportach." -#: ../src/roster_window.py:4199 +#: ../src/roster_window.py:4450 +msgid "Do you want to send that file to %s:" +msgid_plural "Do you want to send those files to %s:" +msgstr[0] "Czy chcesz wysłać ten plik do %s:" +msgstr[1] "Czy chcesz wysłać te pliki do %s:" +msgstr[2] "Czy chcesz wysłać te pliki do %s:" + +#: ../src/roster_window.py:4555 #, python-format msgid "Drop %s in group %s" msgstr "Usuń %s z grupy %s" -#: ../src/roster_window.py:4206 +#: ../src/roster_window.py:4562 #, python-format msgid "Make %s and %s metacontacts" msgstr "Przekształć %s oraz %s w metakontakty" -#: ../src/roster_window.py:4393 +#: ../src/roster_window.py:4749 msgid "Change Status Message..." msgstr "Zmień opis statusu..." -#: ../src/systray.py:144 +#: ../src/search_window.py:88 +msgid "Waiting for results" +msgstr "Oczekiwanie na wyniki" + +#: ../src/search_window.py:135 ../src/search_window.py:186 +msgid "Error in received dataform" +msgstr "Błąd w odebranych danych" + +#: ../src/search_window.py:154 +msgid "No result" +msgstr "Brak wyników" + +#: ../src/systray.py:163 msgid "_Change Status Message..." msgstr "_Zmień opis statusu..." -#: ../src/systray.py:232 +#: ../src/systray.py:251 msgid "Hide this menu" msgstr "Ukryj to menu" @@ -5327,16 +5493,16 @@ msgstr "Zasoby: " msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s tego pokoju" -#: ../src/tooltips.py:430 ../src/tooltips.py:610 +#: ../src/tooltips.py:429 ../src/tooltips.py:611 msgid "Status: " msgstr "Status: " -#: ../src/tooltips.py:461 +#: ../src/tooltips.py:460 #, python-format msgid "Last status: %s" msgstr "Ostatni status %s" -#: ../src/tooltips.py:463 +#: ../src/tooltips.py:462 #, python-format msgid " since %s" msgstr " od %s" @@ -5350,52 +5516,52 @@ msgstr "Autoryzacja: " msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:566 +#: ../src/tooltips.py:567 msgid "Download" msgstr "Pobieranie" -#: ../src/tooltips.py:572 +#: ../src/tooltips.py:573 msgid "Upload" msgstr "Prześlij" -#: ../src/tooltips.py:579 +#: ../src/tooltips.py:580 msgid "Type: " msgstr "Typ: " -#: ../src/tooltips.py:585 +#: ../src/tooltips.py:586 msgid "Transferred: " msgstr "Przesłane: " -#: ../src/tooltips.py:588 ../src/tooltips.py:609 +#: ../src/tooltips.py:589 ../src/tooltips.py:610 msgid "Not started" msgstr "Nie włączony" -#: ../src/tooltips.py:592 +#: ../src/tooltips.py:593 msgid "Stopped" msgstr "Zatrzymany" -#: ../src/tooltips.py:594 ../src/tooltips.py:597 +#: ../src/tooltips.py:595 ../src/tooltips.py:598 msgid "Completed" msgstr "Ukończony" -#: ../src/tooltips.py:601 +#: ../src/tooltips.py:602 msgid "?transfer status:Paused" msgstr "?status transferu:wstrzymany" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:605 +#: ../src/tooltips.py:606 msgid "Stalled" msgstr "Wygaszony" -#: ../src/tooltips.py:607 +#: ../src/tooltips.py:608 msgid "Transferring" msgstr "Przesyłanie" -#: ../src/tooltips.py:639 +#: ../src/tooltips.py:640 msgid "This service has not yet responded with detailed information" msgstr "Ta usługa nie odesłała jeszcze szczegółowych informacji" -#: ../src/tooltips.py:642 +#: ../src/tooltips.py:643 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -5403,24 +5569,24 @@ msgstr "" "Ta usługa nie była w stanie odesłać szczegółowych informacji.\n" "Prawdopodobnie została zamknięta lub jest zepsuta" -#: ../src/vcard.py:217 +#: ../src/vcard.py:325 msgid "?Client:Unknown" msgstr "?Klient: Nieznany" -#: ../src/vcard.py:219 +#: ../src/vcard.py:327 msgid "?OS:Unknown" msgstr "?System operacyjny: Nieznany" -#: ../src/vcard.py:247 ../src/vcard.py:449 +#: ../src/vcard.py:355 ../src/vcard.py:533 #, python-format msgid "since %s" msgstr "od %s" -#: ../src/vcard.py:277 +#: ../src/vcard.py:385 msgid "Affiliation:" msgstr "Afiliacja: " -#: ../src/vcard.py:285 +#: ../src/vcard.py:393 msgid "" "This contact is interested in your presence information, but you are not " "interested in his/her presence" @@ -5428,7 +5594,7 @@ msgstr "" "Ten kontakt jest zaintersowany informacjami o twoim statusie, ale ty nie " "interesujesz się jego/jej statusem." -#: ../src/vcard.py:287 +#: ../src/vcard.py:395 msgid "" "You are interested in the contact's presence information, but he/she is not " "interested in yours" @@ -5436,12 +5602,12 @@ msgstr "" "Jesteś zainteresowany informacjami o statusie tego kontaktu, ale on/ona nie " "jest zainteresowana twoim." -#: ../src/vcard.py:289 +#: ../src/vcard.py:397 msgid "You and the contact are interested in each other's presence information" msgstr "Oboje jesteście zaintersowani nawzajem swoimi informacjami o statusie" #. None -#: ../src/vcard.py:291 +#: ../src/vcard.py:399 msgid "" "You are not interested in the contact's presence, and neither he/she is " "interested in yours" @@ -5449,11 +5615,11 @@ msgstr "" "Nie jesteś zainteresowany informacjami o statusie kontaktu i on również nie " "jest zainteresowany twoim" -#: ../src/vcard.py:299 +#: ../src/vcard.py:407 msgid "You are waiting contact's answer about your subscription request" msgstr "Oczekujesz na odpowiedź kontaktu dotyczącą prośby o autoryzację" -#: ../src/vcard.py:311 ../src/vcard.py:338 ../src/vcard.py:482 +#: ../src/vcard.py:411 ../src/vcard.py:438 ../src/vcard.py:558 msgid " resource with priority " msgstr " zasób o wysokim priorytecie " @@ -5463,6 +5629,7 @@ msgstr "tworzenie bazy danych z logami" #: ../src/common/check_paths.py:89 ../src/common/check_paths.py:100 #: ../src/common/check_paths.py:107 +#, python-format msgid "%s is a file but it should be a directory" msgstr "%s jest plikiem choć powinien być katalogiem" @@ -5472,6 +5639,7 @@ msgid "Gajim will now exit" msgstr "Gajim zakończy teraz działanie" #: ../src/common/check_paths.py:115 +#, python-format msgid "%s is a directory but should be a file" msgstr "%s jest katalogiem choć powinien być plikiem" @@ -5521,6 +5689,7 @@ msgid "The status has been changed." msgstr "Status został zmieniony." #: ../src/common/commands.py:179 +#, python-format msgid "%(nickname)s on %(room_jid)s" msgstr "%(nickname)s z pokoju %(room_jid)s" @@ -5541,7 +5710,7 @@ msgid "Groupchats" msgstr "Pokoje" #: ../src/common/commands.py:230 -msgid "You leaved the following groupchats:" +msgid "You left the following groupchats:" msgstr "Opuściłeś pokoje:" #: ../src/common/config.py:56 @@ -5643,9 +5812,11 @@ msgid "" "This option let you customize timestamp that is printed in conversation. For " "exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " "strftime for full documentation: http://docs.python.org/lib/module-time.html" -msgstr "Ta opcja pozwala na zdefiniowanie formatu czasu wyświetlanego w oknie rozmowy. " -"Na przykład \"[%H:%M] \" spowoduje wyświetlenie szablonu \"[godzina:minuta] \". " -"Więcej informacji w dokumentacjy Pythona dotyczącą strftime: http://docs.python.org/lib/module-time.html" +msgstr "" +"Ta opcja pozwala na zdefiniowanie formatu czasu wyświetlanego w oknie " +"rozmowy. Na przykład \"[%H:%M] \" spowoduje wyświetlenie szablonu \"[godzina:" +"minuta] \". Więcej informacji w dokumentacjy Pythona dotyczącą strftime: " +"http://docs.python.org/lib/module-time.html" #: ../src/common/config.py:134 msgid "Characters that are printed before the nickname in conversations" @@ -5759,10 +5930,10 @@ msgstr "" #: ../src/common/config.py:164 msgid "" -"Overrides the host we send for File Transfer in case of address translation/" -"port forwarding." +"Comma separated list of hosts that we send, in addition of local interfaces, " +"for File Transfer in case of address translation/port forwarding." msgstr "" -"Nadpisuje host, który wysyłamy w celu przesyłania plików, w przypadku " +"Oddzielona przecinkami lista hostów, którą wysyłamy w celu przesyłania plików, w przypadku " "tłumaczenia adresu/przekierowania portu." #: ../src/common/config.py:166 @@ -5996,25 +6167,44 @@ msgstr "" msgid "" "If True, Gajim will use Gnome Keyring (if available) to store account " "passwords." -msgstr "Jeśli opcja ta ustawiona jest na True, do przechowywania haseł Gajim " -"będzie używał Menedżera bazy kluczy GNOME." +msgstr "" +"Jeśli opcja ta ustawiona jest na True, do przechowywania haseł Gajim będzie " +"używał Menedżera bazy kluczy GNOME." #: ../src/common/config.py:225 msgid "" "If True, Gajim will show number of online and total contacts in account and " "group rows." -msgstr "Jeśli opcja ustawiona jest na True, Gajim będzie wyświetlał liczbę połączonych " -"kontaktów oraz ogólną liczbę kontaktów dla każdego konta oraz grupy" +msgstr "" +"Jeśli opcja ustawiona jest na True, Gajim będzie wyświetlał liczbę " +"połączonych kontaktów oraz ogólną liczbę kontaktów dla każdego konta oraz " +"grupy" #: ../src/common/config.py:226 msgid "" "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " "as if they were of this type" -msgstr "Przyjmuje wartość pustą, 'chat' lub 'normal'. Dwie ostatnie określają " -"czy Gajim będzie traktował każdą przychodzącą wiadomość jako czat lub pojedynczą " +msgstr "" +"Przyjmuje wartość pustą, 'chat' lub 'normal'. Dwie ostatnie określają czy " +"Gajim będzie traktował każdą przychodzącą wiadomość jako czat lub pojedynczą " "wiadomość" -#: ../src/common/config.py:237 +#: ../src/common/config.py:227 +msgid "" +"If True, Gajim will scroll and select the contact who sent you the last " +"message, if chat window is not already opened." +msgstr "Jeżeli ustawiono na 'True', Gajim przewinie listę kontaktów i wybierze ten " +"kontakt, który wysłał ci ostatnią wiadomość, ale tylko wtedy gdy okno czatu nie jest " +"już otwarte." + +#: ../src/common/config.py:228 +msgid "" +"If True, Gajim will convert string between $$ and $$ to an image using dvips " +"and convert before insterting it in chat window." +msgstr "Jeżeli ustawiono na 'True', Gajim dokona konwersji ciągów zawartych pomiędzy " +"$$ i $$ do postaci obrazu (z wykorzystaniem dvips) przed wstawieniem ich do okna rozmowy." + +#: ../src/common/config.py:239 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." @@ -6023,11 +6213,11 @@ msgstr "" "zdefiniowane są opcjach rozpoczynających się od autopriority_*." #. yes, no, ask -#: ../src/common/config.py:266 +#: ../src/common/config.py:268 msgid "Jabberd2 workaround" msgstr "Obejście dla Jabberd2" -#: ../src/common/config.py:270 +#: ../src/common/config.py:272 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." @@ -6035,101 +6225,101 @@ msgstr "" "Jeżeli ta opcja jest aktywna, Gajim pobierze adresy serwerów proxy z klucza " "file_transfers_proxies i użyje ich podczas przesyłania plików." -#: ../src/common/config.py:329 +#: ../src/common/config.py:331 msgid "Is OpenPGP enabled for this contact?" msgstr "Czy OpenPGP jest włączone dla tego kontaktu?" -#: ../src/common/config.py:330 ../src/common/config.py:333 +#: ../src/common/config.py:332 ../src/common/config.py:335 msgid "Language for which we want to check misspelled words" msgstr "Język, którego używa słownik przy sprawdzaniu pisowni" -#: ../src/common/config.py:339 +#: ../src/common/config.py:341 msgid "all or space separated status" msgstr "all lub komunikaty stanu rozdzielone spacjami" -#: ../src/common/config.py:340 +#: ../src/common/config.py:342 msgid "'yes', 'no', or 'both'" msgstr "'yes', 'no' lub 'both'" -#: ../src/common/config.py:341 ../src/common/config.py:343 -#: ../src/common/config.py:344 ../src/common/config.py:347 -#: ../src/common/config.py:348 +#: ../src/common/config.py:343 ../src/common/config.py:345 +#: ../src/common/config.py:346 ../src/common/config.py:349 +#: ../src/common/config.py:350 msgid "'yes', 'no' or ''" msgstr "'yes', 'no' lub \"" -#: ../src/common/config.py:354 +#: ../src/common/config.py:356 msgid "Sleeping" msgstr "Śpię" -#: ../src/common/config.py:355 +#: ../src/common/config.py:357 msgid "Back soon" msgstr "Niedługo wrócę" -#: ../src/common/config.py:355 +#: ../src/common/config.py:357 msgid "Back in some minutes." msgstr "Wrócę za jakiś czas." -#: ../src/common/config.py:356 +#: ../src/common/config.py:358 msgid "Eating" msgstr "Jem" -#: ../src/common/config.py:356 +#: ../src/common/config.py:358 msgid "I'm eating, so leave me a message." msgstr "Jem. Zostaw wiadomość." -#: ../src/common/config.py:357 +#: ../src/common/config.py:359 msgid "Movie" msgstr "Film" -#: ../src/common/config.py:357 +#: ../src/common/config.py:359 msgid "I'm watching a movie." msgstr "Oglądam film." -#: ../src/common/config.py:358 +#: ../src/common/config.py:360 msgid "Working" msgstr "Praca" -#: ../src/common/config.py:358 +#: ../src/common/config.py:360 msgid "I'm working." msgstr "Pracuję." -#: ../src/common/config.py:359 +#: ../src/common/config.py:361 msgid "Phone" msgstr "Telefon" -#: ../src/common/config.py:359 +#: ../src/common/config.py:361 msgid "I'm on the phone." msgstr "Rozmawiam przez telefon." -#: ../src/common/config.py:360 +#: ../src/common/config.py:362 msgid "Out" msgstr "Wyszedłem" -#: ../src/common/config.py:360 +#: ../src/common/config.py:362 msgid "I'm out enjoying life." msgstr "Wyszedłem cieszyć się życiem." -#: ../src/common/config.py:364 +#: ../src/common/config.py:366 msgid "I'm available." msgstr "Dostępny." -#: ../src/common/config.py:365 +#: ../src/common/config.py:367 msgid "I'm free for chat." msgstr "Chętny do rozmowy." -#: ../src/common/config.py:367 +#: ../src/common/config.py:369 msgid "I'm not available." msgstr "Nieobecny." -#: ../src/common/config.py:368 +#: ../src/common/config.py:370 msgid "Do not disturb." msgstr "Nie przeszkadzać." -#: ../src/common/config.py:369 ../src/common/config.py:370 +#: ../src/common/config.py:371 ../src/common/config.py:372 msgid "Bye!" msgstr "Żegnaj!" -#: ../src/common/config.py:379 +#: ../src/common/config.py:381 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." @@ -6138,136 +6328,129 @@ msgstr "" "wyrazów ze zmiennej muc_highlight_words lub gdy wiadomość MUC zawierać " "będzie twój pseudonim." -#: ../src/common/config.py:380 +#: ../src/common/config.py:382 msgid "Sound to play when any MUC message arrives." msgstr "Dźwięk, jaki będzie odtwarzany, gdy nadejdzie wiadomość MUC." -#: ../src/common/config.py:389 ../src/common/optparser.py:193 +#: ../src/common/config.py:391 ../src/common/optparser.py:195 msgid "green" msgstr "zielony" -#: ../src/common/config.py:393 ../src/common/optparser.py:179 +#: ../src/common/config.py:395 ../src/common/optparser.py:181 msgid "grocery" msgstr "grocery" -#: ../src/common/config.py:397 +#: ../src/common/config.py:399 msgid "human" msgstr "human" -#: ../src/common/config.py:401 +#: ../src/common/config.py:403 msgid "marine" msgstr "morski" -#: ../src/common/connection.py:182 -#: ../src/common/zeroconf/connection_zeroconf.py:196 +#: ../src/common/connection.py:197 +#: ../src/common/zeroconf/connection_zeroconf.py:202 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Połączenie z kontem \"%s\"zostało zerwane." -#: ../src/common/connection.py:183 +#: ../src/common/connection.py:198 msgid "Reconnect manually." msgstr "Połącz ponownie ręcznie." -#: ../src/common/connection.py:194 ../src/common/connection.py:221 +#: ../src/common/connection.py:209 ../src/common/connection.py:236 #, python-format msgid "Transport %s answered wrongly to register request: %s" msgstr "" "Transport %s udzielił nieprawidłowej odpowiedzi na żądnie rejestracji: %s" #. wrong answer -#: ../src/common/connection.py:220 +#: ../src/common/connection.py:235 msgid "Invalid answer" msgstr "Niepoprawna odpowiedź" -#: ../src/common/connection.py:416 ../src/common/connection.py:515 -#: ../src/common/connection.py:973 -#: ../src/common/zeroconf/connection_zeroconf.py:217 +#: ../src/common/connection.py:383 +msgid "Connection to proxy failed" +msgstr "Połączenie z proxy nie powiodło się" + +#: ../src/common/connection.py:437 ../src/common/connection.py:535 +#: ../src/common/connection.py:1032 +#: ../src/common/zeroconf/connection_zeroconf.py:236 #, python-format msgid "Could not connect to \"%s\"" msgstr "Nie można połączyć się z \"%s\"" -#: ../src/common/connection.py:430 +#: ../src/common/connection.py:451 #, python-format msgid "Connected to server %s:%s with %s" msgstr "Połączony z serwerem %s: %s z %s" -#: ../src/common/connection.py:444 +#: ../src/common/connection.py:464 +#, python-format msgid "Security error connecting to \"%s\"" msgstr "Błąd zabezpieczeń przy połączeniu z \"%s\"" -#: ../src/common/connection.py:445 +#: ../src/common/connection.py:465 msgid "" "The server's key has changed, or someone is trying to hack your connection." -msgstr "Zmienił się klucz twojego serwera lub ktoś próbuje podsłuchać połączenie." +msgstr "" +"Zmienił się klucz twojego serwera lub ktoś próbuje podsłuchać połączenie." -#: ../src/common/connection.py:452 +#: ../src/common/connection.py:472 #, python-format msgid "Unable to check fingerprint for %s. Connection could be insecure." -msgstr "Nie można sprawdzić odcisku klucza %s. Połączenie może nie być bezpieczne" +msgstr "" +"Nie można sprawdzić odcisku klucza %s. Połączenie może nie być bezpieczne" -#: ../src/common/connection.py:494 +#: ../src/common/connection.py:514 #, python-format msgid "Missing fingerprint in SSL connection to %s" msgstr "Brak odcisku klucza w połączeniu SSL z %s" -#: ../src/common/connection.py:500 +#: ../src/common/connection.py:520 #, python-format msgid "Fingerprint mismatch for %s: Got %s, expected %s" msgstr "Niezgodność odcisku klucza %s. Oczekiwano %s, otrzymano %s" -#: ../src/common/connection.py:516 +#: ../src/common/connection.py:536 msgid "Check your connection or try again later" msgstr "Sprawdź swoje połączenie lub spróbuj później" -#: ../src/common/connection.py:542 +#: ../src/common/connection.py:562 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Autoryzacja z \"%s\" nie powiodła się" -#: ../src/common/connection.py:543 +#: ../src/common/connection.py:563 msgid "Please check your login and password for correctness." msgstr "Spawdź czy twój login i hasło są poprawne." -#: ../src/common/connection.py:570 +#: ../src/common/connection.py:606 msgid "Error while removing privacy list" msgstr "Błąd usuwaniu listy prywatności" -#: ../src/common/connection.py:571 -#, python-format +#: ../src/common/connection.py:607 msgid "" "Privacy list %s has not been removed. It is maybe active in one of your " -"connected resources. Desactivate it and try again." -msgstr "Lista prywatności %s nie została usunięta. Prawdopodobnie " -"jest aktywna w jednym z połączonych zasobów. Wyłącz ją i spróbuj ponownie." +"connected resources. Deactivate it and try again." +msgstr "" +"Lista prywatności %s nie została usunięta. Prawdopodobnie jest aktywna w " +"jednym z połączonych zasobów. Wyłącz ją i spróbuj ponownie." #. We didn't set a passphrase -#: ../src/common/connection.py:669 -#: ../src/common/zeroconf/connection_zeroconf.py:156 +#: ../src/common/connection.py:705 +#: ../src/common/zeroconf/connection_zeroconf.py:162 msgid "OpenPGP passphrase was not given" msgstr "Nie podano klucza OpenPGP" -#. do not show I'm invisible! -#: ../src/common/connection.py:711 -msgid "invisible" -msgstr "niewidoczny" - -#: ../src/common/connection.py:712 -msgid "offline" -msgstr "rozłączony" - -#: ../src/common/connection.py:713 -#, python-format -msgid "I'm %s" -msgstr "Jestem %s" - #. we're not english #. one in locale and one en -#: ../src/common/connection.py:804 +#: ../src/common/connection.py:862 msgid "[This message is *encrypted* (See :JEP:`27`]" msgstr "[Ta wiadomość jest zaszyfrowana (zobacz JEP '27']" -#: ../src/common/connection.py:860 -#: ../src/common/zeroconf/connection_zeroconf.py:397 +#: ../src/common/connection.py:918 +#: ../src/common/zeroconf/connection_zeroconf.py:421 #, python-format msgid "" "Subject: %s\n" @@ -6276,7 +6459,7 @@ msgstr "" "Temat: %s\n" "%s" -#: ../src/common/connection.py:999 +#: ../src/common/connection.py:1058 msgid "Not fetched because of invisible status" msgstr "Nie wysłano z powodu statusu 'niewidoczny'" @@ -6285,26 +6468,31 @@ msgstr "Nie wysłano z powodu statusu 'niewidoczny'" msgid "Unable to load idle module" msgstr "Nie można załadować modułu idle" -#: ../src/common/connection_handlers.py:177 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 +#: ../src/common/connection_handlers.py:180 +#: ../src/common/connection_handlers.py:215 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 msgid "Wrong host" msgstr "Błędna nazwa hosta" -#: ../src/common/connection_handlers.py:177 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 +#: ../src/common/connection_handlers.py:180 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 msgid "" -"The host you configured as the ft_override_host_to_send advanced option is " +"The host %s you configured as the ft_add_hosts_to_send advanced option is " "not valid, so ignored." msgstr "" -"Nazwa hosta, którą określiłeś w opcji ft_overhide_host_to_send jest " +"Nazwa hosta, którą określiłeś w opcji ft_add_hosts_to_send jest " "niepoprawna, będzie więc ignorowana." -#: ../src/common/connection_handlers.py:590 +#: ../src/common/connection_handlers.py:216 +msgid "Invalid local address? :-O" +msgstr "Niepoprawny adres lokalny? :-O" + +#: ../src/common/connection_handlers.py:607 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Informacje rejestracyjne transportu %s nie dotarły na czas" -#: ../src/common/connection_handlers.py:1543 +#: ../src/common/connection_handlers.py:1557 #, python-format msgid "Nickname not allowed: %s" msgstr "Pseudonim jest niedozwolony: %s" @@ -6312,41 +6500,41 @@ msgstr "Pseudonim jest niedozwolony: %s" #. password required to join #. we are banned #. group chat does not exist -#: ../src/common/connection_handlers.py:1605 -#: ../src/common/connection_handlers.py:1608 -#: ../src/common/connection_handlers.py:1611 -#: ../src/common/connection_handlers.py:1614 -#: ../src/common/connection_handlers.py:1617 -#: ../src/common/connection_handlers.py:1620 +#: ../src/common/connection_handlers.py:1622 +#: ../src/common/connection_handlers.py:1625 #: ../src/common/connection_handlers.py:1628 +#: ../src/common/connection_handlers.py:1631 +#: ../src/common/connection_handlers.py:1634 +#: ../src/common/connection_handlers.py:1637 +#: ../src/common/connection_handlers.py:1645 msgid "Unable to join group chat" msgstr "Nie można dołączyć do pokoju" -#: ../src/common/connection_handlers.py:1606 +#: ../src/common/connection_handlers.py:1623 msgid "A password is required to join this group chat." msgstr "Aby dołączyć do tego pokoju, wymagane jest hasło." -#: ../src/common/connection_handlers.py:1609 +#: ../src/common/connection_handlers.py:1626 msgid "You are banned from this group chat." msgstr "Zostałeś zabanowany w tym pokoju." -#: ../src/common/connection_handlers.py:1612 +#: ../src/common/connection_handlers.py:1629 msgid "Such group chat does not exist." msgstr "Taki pokój nie istnieje." -#: ../src/common/connection_handlers.py:1615 +#: ../src/common/connection_handlers.py:1632 msgid "Group chat creation is restricted." msgstr "Tworzenie pokoi jest ograniczone." -#: ../src/common/connection_handlers.py:1618 +#: ../src/common/connection_handlers.py:1635 msgid "Your registered nickname must be used." msgstr "Twój zarejestrowany pseudonim musi być w użyciu." -#: ../src/common/connection_handlers.py:1621 +#: ../src/common/connection_handlers.py:1638 msgid "You are not in the members list." msgstr "Nie jesteś na liście członków." -#: ../src/common/connection_handlers.py:1629 +#: ../src/common/connection_handlers.py:1646 msgid "" "Your desired nickname is in use or registered by another occupant.\n" "Please specify another nickname below:" @@ -6355,27 +6543,38 @@ msgstr "" "innego.\n" "Podaj inny pseudonim:" -#: ../src/common/connection_handlers.py:1679 +#. Room has been destroyed. see +#. http://www.xmpp.org/extensions/xep-0045.html#destroyroom +#: ../src/common/connection_handlers.py:1689 +msgid "Room has been destroyed" +msgstr "Pokój został usunięty" + +#: ../src/common/connection_handlers.py:1696 +#, python-format +msgid "You can join this room instead: %s" +msgstr "W zamian możesz dołączyć do pokoju %s" + +#: ../src/common/connection_handlers.py:1722 msgid "I would like to add you to my roster." msgstr "Chciałbym dodać Cię do listy kontaktów." #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:1700 +#: ../src/common/connection_handlers.py:1743 #, python-format msgid "we are now subscribed to %s" msgstr "Zapisaliśmy się do %s" -#: ../src/common/connection_handlers.py:1702 +#: ../src/common/connection_handlers.py:1745 #, python-format msgid "unsubscribe request from %s" msgstr "Prośba o cofnięcie autoryzacji od %s" -#: ../src/common/connection_handlers.py:1704 +#: ../src/common/connection_handlers.py:1747 #, python-format msgid "we are now unsubscribed from %s" msgstr "Wypisaliśmy się z %s" -#: ../src/common/connection_handlers.py:1874 +#: ../src/common/connection_handlers.py:1866 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " @@ -6814,51 +7013,51 @@ msgstr "Gajim - %s" msgid "error: cannot open %s for reading" msgstr "błąd: nie można otworzyć %s do odczytu" -#: ../src/common/optparser.py:179 +#: ../src/common/optparser.py:181 msgid "gtk+" msgstr "gtk+" -#: ../src/common/optparser.py:188 ../src/common/optparser.py:189 +#: ../src/common/optparser.py:190 ../src/common/optparser.py:191 msgid "cyan" msgstr "cyjan" -#: ../src/common/optparser.py:306 +#: ../src/common/optparser.py:308 msgid "migrating logs database to indices" msgstr "indeksowanie archiwum rozmów" -#: ../src/common/passwords.py:92 +#: ../src/common/passwords.py:82 #, python-format msgid "Gajim account %s" msgstr "Konto Gajim'a %s" -#: ../src/common/zeroconf/client_zeroconf.py:189 +#: ../src/common/zeroconf/client_zeroconf.py:187 msgid "" "Connection to host could not be established: Incorrect answer from server." msgstr "Nie można ustanowić połączenia z hostem. Nieprawidłowa odpowiedź." -#: ../src/common/zeroconf/client_zeroconf.py:205 +#: ../src/common/zeroconf/client_zeroconf.py:215 msgid "Connection to host could not be established" msgstr "Nie można ustanowić połączenia z hostem" -#: ../src/common/zeroconf/client_zeroconf.py:334 +#: ../src/common/zeroconf/client_zeroconf.py:349 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" "Nie można ustanowić połączenia z hostem. Timeout podczas wysyłania danych." -#: ../src/common/zeroconf/client_zeroconf.py:627 +#: ../src/common/zeroconf/client_zeroconf.py:642 msgid "Contact is offline. Your message could not be sent." msgstr "Kontakt jest rozłączony. Twoja wiadomość nie mogła zostać wysłana." -#: ../src/common/zeroconf/connection_zeroconf.py:197 +#: ../src/common/zeroconf/connection_zeroconf.py:203 msgid "To continue sending and receiving messages, you will need to reconnect." msgstr "Aby dalej wysyłać i odbierać wiadomości musisz się ponownie połączyć." -#: ../src/common/zeroconf/connection_zeroconf.py:207 +#: ../src/common/zeroconf/connection_zeroconf.py:226 msgid "Avahi error" msgstr "Błąd Avahi" -#: ../src/common/zeroconf/connection_zeroconf.py:207 +#: ../src/common/zeroconf/connection_zeroconf.py:226 #, python-format msgid "" "%s\n" @@ -6867,31 +7066,31 @@ msgstr "" "%s\n" "Przesyłanie wiadomości między adresami link-local może nie działać poprawnie." -#: ../src/common/zeroconf/connection_zeroconf.py:218 +#: ../src/common/zeroconf/connection_zeroconf.py:237 msgid "Please check if Avahi is installed." msgstr "Proszę sprawdzić czy zainstalowano Avahi." -#: ../src/common/zeroconf/connection_zeroconf.py:227 -#: ../src/common/zeroconf/connection_zeroconf.py:231 +#: ../src/common/zeroconf/connection_zeroconf.py:246 +#: ../src/common/zeroconf/connection_zeroconf.py:250 msgid "Could not start local service" msgstr "Nie można uruchomić usługi lokalnej" -#: ../src/common/zeroconf/connection_zeroconf.py:228 +#: ../src/common/zeroconf/connection_zeroconf.py:247 #, python-format msgid "Unable to bind to port %d." msgstr "Nie można podłączyć się do portu %d." -#: ../src/common/zeroconf/connection_zeroconf.py:232 -#: ../src/common/zeroconf/connection_zeroconf.py:325 +#: ../src/common/zeroconf/connection_zeroconf.py:251 +#: ../src/common/zeroconf/connection_zeroconf.py:345 msgid "Please check if avahi-daemon is running." msgstr "Proszę sprawdzić czy uruchomiony jest demon Avahi." -#: ../src/common/zeroconf/connection_zeroconf.py:324 +#: ../src/common/zeroconf/connection_zeroconf.py:344 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Nie można zmienić statusu konta \"%s\"" -#: ../src/common/zeroconf/connection_zeroconf.py:341 +#: ../src/common/zeroconf/connection_zeroconf.py:361 msgid "" "You are not connected or not visible to others. Your message could not be " "sent." @@ -6900,7 +7099,7 @@ msgstr "" "mogła zostać wysłana." #. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:353 +#: ../src/common/zeroconf/connection_zeroconf.py:373 msgid "[This message is encrypted]" msgstr "[Ta wiadomość jest zaszyfrowana]" @@ -6909,6 +7108,33 @@ msgstr "[Ta wiadomość jest zaszyfrowana]" msgid "Error while adding service. %s" msgstr "Błąd przy dodawaniu usługi %s" +#~ msgid "2003-12-13T18:30:02Z" +#~ msgstr "2003-12-13T18:30:02Z" + +#~ msgid "Romeo and Juliet" +#~ msgstr "Romeo i Julia" + +#~ msgid "Old stories" +#~ msgstr "Stare historie" + +#~ msgid "Soliloquy" +#~ msgstr "Monolog" + +#~ msgid "Private Chat" +#~ msgstr "Rozmowa prywatna" + +#~ msgid "Group Chat" +#~ msgstr "Pokój" + +#~ msgid "invisible" +#~ msgstr "niewidoczny" + +#~ msgid "offline" +#~ msgstr "rozłączony" + +#~ msgid "I'm %s" +#~ msgstr "Jestem %s" + #~ msgid "A_fter nickname:" #~ msgstr "_Za pseudonimem:" @@ -6948,9 +7174,6 @@ msgstr "Błąd przy dodawaniu usługi %s" #~ msgid "Merge consecutive nickname in chat window." #~ msgstr "Łącz następujące po sobie te same nicki w oknie czata." -#~ msgid "_New room" -#~ msgstr "_Nowy pokój" - #~ msgid "Role: " #~ msgstr "Funkcja: " diff --git a/po/pt_BR.po b/po/pt_BR.po index d3b67ee80..6be0cf0d5 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -1,23 +1,29 @@ +# translation of pt_BR.po to Português Brasileiro # Portuguese translations for Gajim package. # Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the Gajim package. -# junix , 2005. # -#: ../src/gajim-remote.py:202 ../src/gajim-remote.py:209 +# junix , 2005. +# Gajim , 2007. +#: ../src/gajim-remote.py:203 ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:236 ../src/gajim-remote.py:237 +#: ../src/gajim-remote.py:243 ../src/gajim-remote.py:244 +#: ../src/gajim-remote.py:245 ../src/gajim-remote.py:246 msgid "" msgstr "" -"Project-Id-Version: Gajim 0.81\n" +"Project-Id-Version: pt_BR\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-12-18 09:32+0100\n" -"PO-Revision-Date: 2006-04-14 23:41-0300\n" -"Last-Translator: Alfredo Saldanha Jr. \n" -"Language-Team: none\n" +"POT-Creation-Date: 2007-04-19 18:15+0200\n" +"PO-Revision-Date: 2007-04-19 12:44-0300\n" +"Last-Translator: Gajim \n" +"Language-Team: Português Brasileiro \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Poedit-Language: Portuguese\n" "X-Poedit-Country: BRAZIL\n" +"X-Generator: KBabel 1.11.4\n" #: ../data/gajim.desktop.in.in.h:1 msgid "A GTK+ Jabber client" @@ -41,11 +47,11 @@ msgstr "_Adicionar Contato..." #: ../data/glade/account_context_menu.glade.h:3 msgid "_Discover Services..." -msgstr "_Descubra Serviços..." +msgstr "_Procurar Serviços..." #: ../data/glade/account_context_menu.glade.h:4 msgid "_Execute Command..." -msgstr "" +msgstr "_Executar Comando" #: ../data/glade/account_context_menu.glade.h:5 #: ../data/glade/roster_window.glade.h:16 @@ -56,12 +62,11 @@ msgstr "_Conferência" #: ../data/glade/account_context_menu.glade.h:6 #: ../data/glade/zeroconf_context_menu.glade.h:1 msgid "_Modify Account..." -msgstr "_Editar Conta..." +msgstr "_Alterar Conta..." #: ../data/glade/account_context_menu.glade.h:7 -#, fuzzy msgid "_Open Gmail Inbox" -msgstr "_Abrir Cliente de E-mail" +msgstr "_Abrir Caixa de Entrada do Gmail" #: ../data/glade/account_context_menu.glade.h:8 #: ../data/glade/zeroconf_context_menu.glade.h:2 @@ -74,9 +79,9 @@ msgid "" "\n" "Please wait..." msgstr "" -"Conta está sendo criada\n" +"Sua conta está sendo criada\n" "\n" -"Por favor espere..." +"Por favor aguarde..." #: ../data/glade/account_creation_wizard_window.glade.h:4 msgid "Please choose one of the options below:" @@ -84,7 +89,7 @@ msgstr "Por favor escolha uma das opções abaixo:" #: ../data/glade/account_creation_wizard_window.glade.h:5 msgid "Please fill in the data for your new account" -msgstr "Por favor preencha os dados para sua nova conta" +msgstr "Por favor preencha os dados da sua nova conta" #: ../data/glade/account_creation_wizard_window.glade.h:6 msgid "Click to see features (like MSN, ICQ transports) of jabber servers" @@ -94,32 +99,32 @@ msgstr "" #: ../data/glade/account_creation_wizard_window.glade.h:7 msgid "Connect when I press Finish" -msgstr "Conectar quando eu pressiono Fim" +msgstr "Conectar quando eu clicar em Fim" #: ../data/glade/account_creation_wizard_window.glade.h:8 msgid "Gajim: Account Creation Wizard" -msgstr "Gajim: Auxíliar de Configuração de Conta" +msgstr "Gajim: Assistente de Configuração de Conta" #: ../data/glade/account_creation_wizard_window.glade.h:9 msgid "I already have an account I want to use" -msgstr "Eu já tenho uma conta e quero usa-la" +msgstr "Eu já tenho uma conta e quero usá-la" #: ../data/glade/account_creation_wizard_window.glade.h:10 msgid "I want to _register for a new account" msgstr "Eu quero _registrar uma nova conta" #: ../data/glade/account_creation_wizard_window.glade.h:11 -#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/account_modification_window.glade.h:19 msgid "If checked, Gajim will remember the password for this account" msgstr "Se marcado, o Gajim lembrará a senha para esta conta" #: ../data/glade/account_creation_wizard_window.glade.h:12 -#: ../data/glade/manage_proxies_window.glade.h:6 +#: ../data/glade/manage_proxies_window.glade.h:7 msgid "Pass_word:" msgstr "_Senha:" #: ../data/glade/account_creation_wizard_window.glade.h:13 -#: ../data/glade/account_modification_window.glade.h:38 +#: ../data/glade/account_modification_window.glade.h:39 msgid "Save pass_word" msgstr "Salvar senha" @@ -150,20 +155,20 @@ msgstr "_Avançado" #: ../data/glade/account_creation_wizard_window.glade.h:20 msgid "_Finish" -msgstr "_Encerrar" +msgstr "_Concluir" #: ../data/glade/account_creation_wizard_window.glade.h:21 -#: ../data/glade/manage_proxies_window.glade.h:9 +#: ../data/glade/manage_proxies_window.glade.h:10 msgid "_Host:" -msgstr "_Host:" +msgstr "_Computador:" #: ../data/glade/account_creation_wizard_window.glade.h:22 -#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/account_modification_window.glade.h:49 msgid "_Password:" msgstr "_Senha:" #: ../data/glade/account_creation_wizard_window.glade.h:23 -#: ../data/glade/manage_proxies_window.glade.h:10 +#: ../data/glade/manage_proxies_window.glade.h:11 msgid "_Port:" msgstr "_Porta:" @@ -180,9 +185,9 @@ msgid "_Use proxy" msgstr "_Usar proxy" #: ../data/glade/account_creation_wizard_window.glade.h:27 -#: ../data/glade/manage_proxies_window.glade.h:11 +#: ../data/glade/manage_proxies_window.glade.h:12 msgid "_Username:" -msgstr "Nome do _usuário" +msgstr "Nome de _usuário" #: ../data/glade/account_modification_window.glade.h:1 #: ../data/glade/preferences_window.glade.h:8 @@ -205,22 +210,26 @@ msgstr "Conta" #: ../data/glade/account_modification_window.glade.h:5 msgid "Account Modification" -msgstr "Modificação da Conta" +msgstr "Alteração da Conta" #: ../data/glade/account_modification_window.glade.h:6 -msgid "Autoreconnect when connection is lost" -msgstr "Reconectar automaticamente quando a conexão cair" +msgid "Administration operations" +msgstr "Operações de administração" #: ../data/glade/account_modification_window.glade.h:7 +msgid "Auto-reconnect when connection is lost" +msgstr "Reconectar automaticamente quando a conexão cair" + +#: ../data/glade/account_modification_window.glade.h:8 #: ../data/glade/zeroconf_properties_window.glade.h:3 msgid "C_onnect on Gajim startup" msgstr "C_onectar na inicialização do Gajim" -#: ../data/glade/account_modification_window.glade.h:8 -msgid "Chan_ge Password" -msgstr "Mudar Senha" - #: ../data/glade/account_modification_window.glade.h:9 +msgid "Chan_ge Password" +msgstr "Alterar Senha" + +#: ../data/glade/account_modification_window.glade.h:10 msgid "" "Check this so Gajim will connect in port 5223 where legacy servers are " "expected to have SSL capabilities. Note that Gajim uses TLS encryption by " @@ -232,61 +241,60 @@ msgstr "" "por padrão se disponibilizada pelo servidor e com esta opção habilitada o " "TLS será desabilitado" -#: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/account_modification_window.glade.h:11 #: ../data/glade/zeroconf_properties_window.glade.h:4 msgid "Choose _Key..." msgstr "_Escolha a chave..." -#: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/account_modification_window.glade.h:12 msgid "Click to change account's password" msgstr "Clique para mudar a senha da conta" -#: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/account_modification_window.glade.h:13 msgid "Connection" msgstr "Conexão" -#: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/account_modification_window.glade.h:14 msgid "Edit Personal Information..." msgstr "Editar detalhes pessoais..." -#: ../data/glade/account_modification_window.glade.h:14 -#: ../data/glade/roster_window.glade.h:5 ../src/notify.py:453 -#: ../src/notify.py:475 ../src/notify.py:487 ../src/common/helpers.py:905 +#: ../data/glade/account_modification_window.glade.h:15 +#: ../data/glade/roster_window.glade.h:5 ../src/notify.py:458 +#: ../src/notify.py:480 ../src/notify.py:492 ../src/common/helpers.py:914 msgid "Gajim" msgstr "Gajim" -#. Contact is not in a group, so count it in General group -#: ../data/glade/account_modification_window.glade.h:15 -#: ../data/glade/preferences_window.glade.h:49 +#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/preferences_window.glade.h:51 #: ../data/glade/zeroconf_properties_window.glade.h:7 -#: ../src/roster_window.py:342 ../src/roster_window.py:1207 -#: ../src/roster_window.py:1418 ../src/roster_window.py:2029 -#: ../src/roster_window.py:2071 ../src/common/contacts.py:278 +#: ../src/roster_window.py:347 ../src/roster_window.py:1225 +#: ../src/roster_window.py:1435 ../src/roster_window.py:2114 +#: ../src/roster_window.py:2156 ../src/common/contacts.py:284 msgid "General" msgstr "Geral" -#: ../data/glade/account_modification_window.glade.h:16 -msgid "Hostname: " -msgstr "Nome do Host:" - #: ../data/glade/account_modification_window.glade.h:17 -#, fuzzy +msgid "Hostname: " +msgstr "Nome do Computador:" + +#: ../data/glade/account_modification_window.glade.h:18 msgid "" "If checked, Gajim will also broadcast some more IPs except from just your " "IP, so file transfer has higher chances of working." msgstr "" -"Se marcado, o Gajim transmitirá também alguns outros IPs exceto o seu, então " -"a transferência de arquivo tem grandes possibilidades de executar " +"Se marcado, o Gajim transmitirá também alguns outros IP's exceto o seu, " +"então a transferência de arquivo tem grandes possibilidades de executar " "corretamente." -#: ../data/glade/account_modification_window.glade.h:19 -msgid "" -"If checked, Gajim will send keep-alive packets so it prevents connection " -"timeout which results in disconnection" -msgstr "" -"Se marcado, o Gajim enviará pacotes keep-alive que evitam queda de conexão" - #: ../data/glade/account_modification_window.glade.h:20 +msgid "" +"If checked, Gajim will send keep-alive packets to prevent connection timeout " +"which results in disconnection" +msgstr "" +"Se marcado, o Gajim enviará pacotes keep-alive para prevenir timeout na " +"conexão, fazendo-a cair" + +#: ../data/glade/account_modification_window.glade.h:21 #: ../data/glade/zeroconf_properties_window.glade.h:8 msgid "" "If checked, Gajim will store the password in ~/.gajim/config with 'read' " @@ -295,7 +303,7 @@ msgstr "" "Se checado, o Gajim gravará sua senha em ~/.gajim/config com permissão de " "'leitura' somente para você" -#: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/account_modification_window.glade.h:22 #: ../data/glade/zeroconf_properties_window.glade.h:9 msgid "" "If checked, Gajim, when launched, will automatically connect to jabber using " @@ -304,76 +312,78 @@ msgstr "" "Se marcado, o Gajim, quando carregado, conectará automaticamente ao jabber " "usando esta conta" -#: ../data/glade/account_modification_window.glade.h:22 +#: ../data/glade/account_modification_window.glade.h:23 #: ../data/glade/zeroconf_properties_window.glade.h:10 msgid "" "If checked, any change to the global status (handled by the combobox at the " "bottom of the roster window) will change the status of this account " "accordingly" msgstr "" -"Se verificada, qualquer mudança ao status global (segurado pelo combobox no " -"fundo da janela da lista) mudará o status deste cliente conformemente" +"Se marcada, o status deste cliente será alterado de acordo com qualquer " +"mudança no status global (definido pela caixa no fundo da janela da lista)" -#: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/account_modification_window.glade.h:24 msgid "Information about you, as stored in the server" msgstr "Informações sobre você são gravadas no servidor" -#: ../data/glade/account_modification_window.glade.h:24 +#: ../data/glade/account_modification_window.glade.h:25 msgid "Manage..." msgstr "Gerenciar..." -#: ../data/glade/account_modification_window.glade.h:25 -#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1643 -#: ../src/config.py:3436 +#: ../data/glade/account_modification_window.glade.h:26 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1623 +#: ../src/config.py:3301 msgid "No key selected" msgstr "Nenhuma chave selecionada" #. None means no proxy profile selected -#: ../data/glade/account_modification_window.glade.h:27 ../src/config.py:1225 -#: ../src/config.py:1230 ../src/config.py:1414 ../src/config.py:1633 -#: ../src/config.py:1642 ../src/config.py:1701 ../src/config.py:1775 -#: ../src/config.py:2646 ../src/config.py:3426 ../src/config.py:3435 -#: ../src/dialogs.py:281 ../src/dialogs.py:283 +#. GPG Key +#: ../data/glade/account_modification_window.glade.h:28 ../src/config.py:1196 +#: ../src/config.py:1201 ../src/config.py:1385 ../src/config.py:1613 +#: ../src/config.py:1622 ../src/config.py:1682 ../src/config.py:1756 +#: ../src/config.py:3291 ../src/config.py:3300 ../src/dialogs.py:281 +#: ../src/dialogs.py:283 ../src/roster_window.py:1539 +#: ../src/roster_window.py:1546 ../src/roster_window.py:1553 msgid "None" msgstr "Nenhum" -#: ../data/glade/account_modification_window.glade.h:28 -#: ../data/glade/profile_window.glade.h:25 +#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/profile_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:17 msgid "Personal Information" msgstr "Informações Pessoais" -#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/account_modification_window.glade.h:30 msgid "Port: " msgstr "Porta:" -#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/account_modification_window.glade.h:31 msgid "Priori_ty:" msgstr "_Prioridade" -#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/account_modification_window.glade.h:32 msgid "" "Priority is used in Jabber to determine who gets the events from the jabber " "server when two or more clients are connected using the same account; The " "client with the highest priority gets the events" msgstr "" -"Prioridade é usada no Jabber para determinar quem recebe os eventos do " +"A prioridade é usada no Jabber para determinar quem recebe os eventos do " "servidor jabber quando dois ou mais clientes estão conectados usando a mesma " "conta; O cliente com a maior prioridade receberá os eventos" -#: ../data/glade/account_modification_window.glade.h:32 -msgid "Priority will change automatically according to your status." -msgstr "" - #: ../data/glade/account_modification_window.glade.h:33 +msgid "Priority will change automatically according to your status." +msgstr "A prioridade será alterada automaticamente de acordo com o seu status" + +#: ../data/glade/account_modification_window.glade.h:34 msgid "Proxy:" msgstr "Proxy:" -#: ../data/glade/account_modification_window.glade.h:34 -msgid "Resour_ce: " -msgstr "_Recurso: " - #: ../data/glade/account_modification_window.glade.h:35 +msgid "Resour_ce:" +msgstr "Recur_so:" + +#: ../data/glade/account_modification_window.glade.h:36 msgid "" "Resource is sent to the Jabber server in order to separate the same JID in " "two or more parts depending on the number of the clients connected in the " @@ -381,54 +391,58 @@ msgid "" "account with resource 'Home' and 'Work' at the same time. The resource which " "has the highest priority will get the events. (see below)" msgstr "" -"Recurso é enviado ao servidor jabber com objetivo de 'separar' o mesmo JID " -"em duas ou mais partes dependendo do número de clientes conectados no mesmo " -"servidor com a mesma conta. Então você pode estar conectado na mesma conta " -"com o recurso 'Casa' e 'Trabalho' ao mesmo tempo. O recurso que possuir a " -"maior prioridade receberá os eventos. (veja abaixo)" +"Um recurso é enviado ao servidor jabber com o objetivo de 'separar' o mesmo " +"JID em duas ou mais partes dependendo do número de clientes conectados no " +"mesmo servidor com a mesma conta. Então você pode estar conectado na mesma " +"conta com o recurso 'Casa' e 'Trabalho' ao mesmo tempo. O recurso que " +"possuir a maior prioridade receberá os eventos. (veja abaixo)" -#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/account_modification_window.glade.h:37 #: ../data/glade/zeroconf_properties_window.glade.h:18 msgid "Save _passphrase (insecure)" msgstr "Salvar _frase de acesso (inseguro)" -#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/account_modification_window.glade.h:38 #: ../data/glade/zeroconf_properties_window.glade.h:19 msgid "Save conversation _logs for all contacts" msgstr "Salvar histórico para todos os contatos desta conta" -#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/account_modification_window.glade.h:40 msgid "Send keep-alive packets" msgstr "Enviar pacotes para manter a conexão (keep-alive)" -#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/account_modification_window.glade.h:41 #: ../data/glade/zeroconf_properties_window.glade.h:20 msgid "Synch_ronize account status with global status" msgstr "_Sincronizar status da conta com status global" -#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/account_modification_window.glade.h:42 +msgid "Synchronise contacts" +msgstr "Sincronizar contatos" + +#: ../data/glade/account_modification_window.glade.h:43 msgid "Use _SSL (legacy)" msgstr "Usar _SSL (obsoleto, apenas para servidores antigos)" -#: ../data/glade/account_modification_window.glade.h:42 +#: ../data/glade/account_modification_window.glade.h:44 msgid "Use custom hostname/port" -msgstr "Usa nomedohost/porta customizada" +msgstr "Usa nome de máquina/porta customizados" -#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/account_modification_window.glade.h:45 msgid "Use file transfer proxies" msgstr "Usa proxies de transferência de arquivos" -#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/account_modification_window.glade.h:46 msgid "_Adjust to status" -msgstr "" +msgstr "Ajustar para status" -#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/account_modification_window.glade.h:47 msgid "_Jabber ID:" msgstr "_Jabber ID:" -#: ../data/glade/account_modification_window.glade.h:46 -msgid "_Name: " -msgstr "_Nome: " +#: ../data/glade/account_modification_window.glade.h:48 +msgid "_Name:" +msgstr "_Nome:" #: ../data/glade/accounts_window.glade.h:1 msgid "Accounts" @@ -442,23 +456,27 @@ msgid "" "This is only available if python-avahi is installed and avahi-daemon is " "running." msgstr "" +"Se marcado, todos os contatos locais que usam um cliente de chat compatível " +"com o Bonjour (como iChat, Trillian ou Gaim) serão mostrados na lista. Você " +"não precisa estar conectado a um servidor jabber para que ele funcione.\n" +" Isto só está disponível se o python-avahi estiver instalado e o serviço " +"avahi-daemon estiver rodando." #: ../data/glade/accounts_window.glade.h:4 msgid "" -"If you have 2 or more accounts and it is checked, Gajim will list all " +"If you have 2 or more accounts and this is checked, Gajim will list all " "contacts as if you had one account" msgstr "" -"Se você tem duas ou mais contas e isto é marcado, Gajim listará todos os " -"contatos como se você tivesse somente uma conta" +"Se você tiver duas ou mais contas e isto estiver marcado, o Gajim listará " +"todos os contatos como se você tivesse somente uma única conta" #: ../data/glade/accounts_window.glade.h:5 -#, fuzzy msgid "Mer_ge accounts" -msgstr "_Juntar contato das contas" +msgstr "Mes_clar contas" #: ../data/glade/accounts_window.glade.h:6 msgid "_Enable link-local messaging" -msgstr "" +msgstr "_Ativar mensagens \"link-local\"" #: ../data/glade/accounts_window.glade.h:7 msgid "_Modify" @@ -470,14 +488,12 @@ msgid "_Remove" msgstr "_Remover" #: ../data/glade/add_new_contact_window.glade.h:1 -#, fuzzy msgid "A_ccount:" -msgstr "Conta:" +msgstr "C_onta:" #: ../data/glade/add_new_contact_window.glade.h:2 -#, fuzzy msgid "A_llow this contact to view my status" -msgstr "Permita que ele/ela ver meu status" +msgstr "D_eixar este contato ver meu status" #: ../data/glade/add_new_contact_window.glade.h:3 msgid "Add New Contact" @@ -485,99 +501,97 @@ msgstr "Adicionar Novo Contato" #: ../data/glade/add_new_contact_window.glade.h:4 msgid "I would like to add you to my contact list." -msgstr "Por favor, eu gostaria de adiciona-lo à minha lista." +msgstr "Por favor, eu gostaria de adicioná-lo à minha lista." #: ../data/glade/add_new_contact_window.glade.h:5 msgid "" -"You have to register to this transport\n" +"You have to register with this transport\n" "to be able to add a contact from this\n" "protocol. Click on register button to\n" "proceed." msgstr "" +"Você deve estar registrado a este \n" +"transporte para poder adicionar \n" +"contatos deste protocolo. Clique no \n" +"botão Registrar para aceitar." #: ../data/glade/add_new_contact_window.glade.h:9 msgid "" "You must be connected to the transport to be able\n" "to add a contact from this protocol." msgstr "" +"Você deve estar conectado para que o transporte \n" +"possa adicionar um contato desse protocolo." #: ../data/glade/add_new_contact_window.glade.h:11 -#, fuzzy msgid "_Group:" -msgstr "Grupo:" +msgstr "_Grupo:" #: ../data/glade/add_new_contact_window.glade.h:12 msgid "_Nickname:" msgstr "_Apelido:" #: ../data/glade/add_new_contact_window.glade.h:13 -#, fuzzy msgid "_Protocol:" -msgstr "Protocolo:" +msgstr "_Protocolo:" #: ../data/glade/add_new_contact_window.glade.h:14 -#, fuzzy msgid "_Register" -msgstr "Re_gistrar" +msgstr "_Registrar" #: ../data/glade/add_new_contact_window.glade.h:15 -#, fuzzy msgid "_User ID:" -msgstr "ID do Usuário:" +msgstr "_ID do Usuário:" #: ../data/glade/adhoc_commands_window.glade.h:1 -#, fuzzy -msgid "An error has occured:" -msgstr "Um erro de protocolo ocorreu:" +msgid "An error has occurred:" +msgstr "Ocorreu um erro:" #: ../data/glade/adhoc_commands_window.glade.h:2 msgid "Choose command to execute:" -msgstr "" +msgstr "Escolha um comando para executar" #: ../data/glade/adhoc_commands_window.glade.h:3 msgid "Ad-hoc Commands - Gajim" -msgstr "" +msgstr "Comandos ad-hoc - Gajim" #: ../data/glade/adhoc_commands_window.glade.h:4 msgid "Check once more" -msgstr "" +msgstr "Verificar novamente" #: ../data/glade/adhoc_commands_window.glade.h:5 -#, fuzzy msgid "Error description..." -msgstr "Descrição" +msgstr "Descrição do erro..." #: ../data/glade/adhoc_commands_window.glade.h:6 -#, fuzzy msgid "Please wait while retrieving command list..." -msgstr "Espere por favor, enquanto os registros estão sendo migrados..." +msgstr "Por favor aguarde enquanto a lista de comandos é recuperada..." #: ../data/glade/adhoc_commands_window.glade.h:7 -#, fuzzy msgid "Please wait while the command is sending..." -msgstr "Espere por favor, enquanto os registros estão sendo migrados..." +msgstr "Por favor aguarde enquanto a lista de comandos é enviada..." #: ../data/glade/adhoc_commands_window.glade.h:8 msgid "Please wait..." -msgstr "" +msgstr "Por favor aguarde..." #: ../data/glade/adhoc_commands_window.glade.h:9 msgid "This jabber entity does not expose any commands." -msgstr "" +msgstr "Esta entidade jabber não expõe quaisquer comandos." #: ../data/glade/advanced_configuration_window.glade.h:1 msgid "Description" msgstr "Descrição" #: ../data/glade/advanced_configuration_window.glade.h:2 -msgid "NOTE: You should restart gajim for some setting to take effect" +msgid "NOTE: You should restart Gajim for some settings to take effect" msgstr "" -"NOTA Você deve reiniciar o gajim para algumas configurações tenham " -"efeito" +"NOTA: Você deve reiniciar o Gajim para que algumas configurações " +"tenham efeito" #: ../data/glade/advanced_configuration_window.glade.h:3 msgid "Advanced Configuration Editor" -msgstr "Editor de Configurações Avançadas" +msgstr "Editor de Configurações Avançado" #: ../data/glade/advanced_configuration_window.glade.h:4 msgid "Filter:" @@ -585,15 +599,16 @@ msgstr "Filtro:" #: ../data/glade/advanced_menuitem_menu.glade.h:1 msgid "Delete MOTD" -msgstr "Deletar MOTD" +msgstr "Excluir MOTD" #: ../data/glade/advanced_menuitem_menu.glade.h:2 msgid "Deletes Message of the Day" -msgstr "Deletar Mensagem do Dia" +msgstr "Excluir Mensagem do Dia" #: ../data/glade/advanced_menuitem_menu.glade.h:3 -msgid "Sends a message to currently connected users to this server" -msgstr "Enviar uma mensagem para os usuários conectados neste servidor" +msgid "Sends a message to users currently connected to this server" +msgstr "" +"Envia uma mensagem para os usuários atualmente conectados a este servidor" #: ../data/glade/advanced_menuitem_menu.glade.h:4 msgid "Set MOTD" @@ -621,7 +636,7 @@ msgstr "_Administrador" #: ../data/glade/advanced_menuitem_menu.glade.h:10 msgid "_Privacy Lists" -msgstr "" +msgstr "_Listas de Privacidade" #: ../data/glade/advanced_menuitem_menu.glade.h:11 msgid "_Send Server Message" @@ -633,17 +648,15 @@ msgstr "_Enviar uma Mensagem Simples" #: ../data/glade/advanced_notifications_window.glade.h:1 msgid " a window/tab opened with that contact " -msgstr "" +msgstr "uma janela/aba aberta com o contato" #: ../data/glade/advanced_notifications_window.glade.h:2 -#, fuzzy msgid "Actions" -msgstr "Aplicações" +msgstr "Ações" #: ../data/glade/advanced_notifications_window.glade.h:3 -#, fuzzy msgid "Conditions" -msgstr "Sons" +msgstr "Condições" #: ../data/glade/advanced_notifications_window.glade.h:4 #: ../data/glade/preferences_window.glade.h:10 @@ -651,219 +664,200 @@ msgid "Sounds" msgstr "Sons" #: ../data/glade/advanced_notifications_window.glade.h:5 -#, fuzzy msgid "Advanced Actions" -msgstr "_Ações Avançadas" +msgstr "Ações Avançadas" #: ../data/glade/advanced_notifications_window.glade.h:6 -#, fuzzy msgid "Advanced Notifications Control" -msgstr "Editor de Configurações Avançadas" +msgstr "Controle Avançado de Notificações" #: ../data/glade/advanced_notifications_window.glade.h:7 -#, fuzzy msgid "All statuses" -msgstr "Status: " +msgstr "Totos os status" #: ../data/glade/advanced_notifications_window.glade.h:8 -#: ../src/common/helpers.py:234 +#: ../src/common/commands.py:91 ../src/common/helpers.py:243 msgid "Away" msgstr "Afastado" #: ../data/glade/advanced_notifications_window.glade.h:9 -#, fuzzy msgid "Busy " -msgstr "Ocupado" +msgstr "Ocupado " #: ../data/glade/advanced_notifications_window.glade.h:10 msgid "Don't have " -msgstr "" +msgstr "Não possui" #: ../data/glade/advanced_notifications_window.glade.h:11 msgid "Have " -msgstr "" +msgstr "Possui" #: ../data/glade/advanced_notifications_window.glade.h:12 -#: ../src/common/helpers.py:244 +#: ../src/common/helpers.py:253 msgid "Invisible" msgstr "Invisível" #: ../data/glade/advanced_notifications_window.glade.h:13 -#, fuzzy msgid "Launch a command" -msgstr "comando" +msgstr "Executar um comando" #: ../data/glade/advanced_notifications_window.glade.h:14 -#: ../src/common/helpers.py:217 +#: ../src/common/helpers.py:226 msgid "Not Available" msgstr "Não Disponível" #: ../data/glade/advanced_notifications_window.glade.h:15 msgid "One or more special statuses..." -msgstr "" +msgstr "Um ou mais status especiais" #: ../data/glade/advanced_notifications_window.glade.h:16 -#, fuzzy msgid "Online / Free For Chat" -msgstr "Livre para Conversa" +msgstr "Online / Livre para Conversa" #: ../data/glade/advanced_notifications_window.glade.h:17 -#, fuzzy msgid "Play a sound" -msgstr "Tocar _Sons" +msgstr "Tocar um som" #: ../data/glade/advanced_notifications_window.glade.h:18 msgid "" "Receive a Message\n" -"Contact Connected \n" "Contact Disconnected \n" "Contact Change Status \n" "Group Chat Message Highlight \n" "Group Chat Message Received \n" -"File Transfert Resquest \n" -"File Transfert Started \n" -"File Transfert Finished" +"File Transfer Request \n" +"File Transfer Started \n" +"File Transfer Finished" msgstr "" +"Mensagem Recebida\n" +"Contato Conectado\n" +"Contato Desconectado\n" +"Status do Contato Alterado\n" +"Destacar Mensagens em Conferências\n" +"Mensagem de Conferência Recebida\n" +"Transferência de Arquivo Solicitada\n" +"Transferência de Arquivo Iniciada\n" +"Transferência de Arquivo Concluída" + +#: ../data/glade/advanced_notifications_window.glade.h:26 +msgid "When " +msgstr "Quando" #: ../data/glade/advanced_notifications_window.glade.h:27 -msgid "When " -msgstr "" - -#: ../data/glade/advanced_notifications_window.glade.h:28 msgid "" "_Activate window manager's UrgencyHint to make chat window in taskbar flash" msgstr "" +"_Ativar o recurso \"UrgencyHist\" do gerenciador de janelas faz a janela de " +"conversa piscar na barra de tarefas" + +#: ../data/glade/advanced_notifications_window.glade.h:28 +msgid "_Disable auto opening chat window" +msgstr "_Desativar a abertura automática da janela de conversa" #: ../data/glade/advanced_notifications_window.glade.h:29 -#, fuzzy -msgid "_Disable auto opening chat window" -msgstr "Esconder os botões na janela de conferência" +msgid "_Disable existing popup window" +msgstr "_Desativar janelas popup existentes" #: ../data/glade/advanced_notifications_window.glade.h:30 -msgid "_Disable existing popup window" -msgstr "" +msgid "_Disable existing sound for this event" +msgstr "_Desativar sons existentes para este evento" #: ../data/glade/advanced_notifications_window.glade.h:31 -msgid "_Disable existing sound for this event" -msgstr "" +msgid "_Disable showing event in roster" +msgstr "_Desativar exibição de eventos na lista" #: ../data/glade/advanced_notifications_window.glade.h:32 -msgid "_Disable showing event in roster" -msgstr "" +msgid "_Disable showing event in systray" +msgstr "_Desativar a exibição de eventos na bandeja do sistema" #: ../data/glade/advanced_notifications_window.glade.h:33 -msgid "_Disable showing event in systray" -msgstr "" +msgid "_Inform me with a popup window" +msgstr "_Notificar-me com uma janela popup" #: ../data/glade/advanced_notifications_window.glade.h:34 -msgid "_Inform me with a popup window" -msgstr "" +msgid "_Open chat window with user" +msgstr "_Abrir janela de conversa com o contato" #: ../data/glade/advanced_notifications_window.glade.h:35 -#, fuzzy -msgid "_Open chat window with user" -msgstr "_Usar uma única janela de conversa com abas" +msgid "_Show event in roster" +msgstr "_Mostrar somente na _lista" #: ../data/glade/advanced_notifications_window.glade.h:36 -#, fuzzy -msgid "_Show event in roster" -msgstr "Mostre somente na _lista" +msgid "_Show event in systray" +msgstr "_Mostrar evento na bandeja do sistema" #: ../data/glade/advanced_notifications_window.glade.h:37 -#, fuzzy -msgid "_Show event in systray" -msgstr "Mostre somente na _lista" +msgid "and I " +msgstr "e eu" #: ../data/glade/advanced_notifications_window.glade.h:38 -msgid "and I " -msgstr "" - -#: ../data/glade/advanced_notifications_window.glade.h:39 msgid "" "contact(s)\n" "group(s)\n" "everybody" msgstr "" +"contato(s)\n" +"grupo(s)\n" +"todo mundo" + +#: ../data/glade/advanced_notifications_window.glade.h:41 +msgid "for " +msgstr "para" #: ../data/glade/advanced_notifications_window.glade.h:42 -#, fuzzy -msgid "for " -msgstr "Porta:" - -#: ../data/glade/advanced_notifications_window.glade.h:43 msgid "when I'm in" -msgstr "" +msgstr "quando eu estiver em" #: ../data/glade/atom_entry_window.glade.h:1 -msgid "2003-12-13T18:30:02Z" -msgstr "" +msgid "Entry:" +msgstr "Entrada:" #: ../data/glade/atom_entry_window.glade.h:2 -msgid "Romeo and Juliet" -msgstr "" +msgid "Feed name:" +msgstr "Nome do feed:" #: ../data/glade/atom_entry_window.glade.h:3 -#, fuzzy -msgid "Entry:" -msgstr "País:" +msgid "Last modified:" +msgstr "Modificado:" #: ../data/glade/atom_entry_window.glade.h:4 -#, fuzzy -msgid "Feed name:" -msgstr "nome do tema" +msgid "New entry received" +msgstr "Novo evento recebido" #: ../data/glade/atom_entry_window.glade.h:5 -#, fuzzy -msgid "Last modified:" -msgstr "Nome:" - -#: ../data/glade/atom_entry_window.glade.h:6 -#, fuzzy -msgid "New entry received" -msgstr "Quando novo evento é recebido" - -#: ../data/glade/atom_entry_window.glade.h:7 -msgid "Old stories" -msgstr "" - -#: ../data/glade/atom_entry_window.glade.h:8 -msgid "Soliloquy" -msgstr "" - -#: ../data/glade/atom_entry_window.glade.h:9 msgid "You have received new entry:" -msgstr "" +msgstr "Você recebeu uma nova entrada:" #: ../data/glade/change_password_dialog.glade.h:1 msgid "Change Password" -msgstr "Mudar Senha" +msgstr "Alterar Senha" #: ../data/glade/change_password_dialog.glade.h:2 msgid "Enter it again for confirmation:" -msgstr "Entre novamente para confirmação:" +msgstr "Digite novamente para confirmar:" #: ../data/glade/change_password_dialog.glade.h:3 msgid "Enter new password:" -msgstr "Entre com a nova senha:" +msgstr "Digite sua nova senha:" #: ../data/glade/change_status_message_dialog.glade.h:1 msgid "Type your new status message" -msgstr "Escreva sua nova mensagem de status:" +msgstr "Digite sua nova mensagem de status:" #: ../data/glade/change_status_message_dialog.glade.h:2 msgid "Preset messages:" -msgstr "Mensagens pre-configuradas" +msgstr "Modelos de mensagens" #: ../data/glade/change_status_message_dialog.glade.h:3 msgid "Save as Preset..." -msgstr "Salvar como Pre-configuradas..." +msgstr "Salvar como Modelos..." #: ../data/glade/chat_context_menu.glade.h:1 msgid "Join _Group Chat" -msgstr "_Ingressar numa Conferência" +msgstr "_Entrar em uma Conferência" #: ../data/glade/chat_context_menu.glade.h:2 -#: ../data/glade/chat_control_popup_menu.glade.h:4 +#: ../data/glade/chat_control_popup_menu.glade.h:5 #: ../data/glade/gc_occupants_menu.glade.h:2 #: ../data/glade/roster_contact_context_menu.glade.h:10 msgid "_Add to Roster" @@ -871,11 +865,11 @@ msgstr "_Adicionar à Lista" #: ../data/glade/chat_context_menu.glade.h:3 msgid "_Copy JID/Email Address" -msgstr "_Copiar Endereço de Email/JID" +msgstr "_Copiar Email/JID" #: ../data/glade/chat_context_menu.glade.h:4 msgid "_Copy Link Location" -msgstr "_Copia Localização do Link" +msgstr "_Copiar URL" #: ../data/glade/chat_context_menu.glade.h:5 msgid "_Open Email Composer" @@ -883,7 +877,7 @@ msgstr "_Abrir Cliente de E-mail" #: ../data/glade/chat_context_menu.glade.h:6 msgid "_Open Link in Browser" -msgstr "_Abrir link no Navegador" +msgstr "_Visualizar no Navegador" #: ../data/glade/chat_context_menu.glade.h:7 #: ../data/glade/roster_window.glade.h:20 @@ -897,22 +891,27 @@ msgid "Click to see past conversations with this contact" msgstr "Clique para ver o histórico de conversas com este contato" #: ../data/glade/chat_control_popup_menu.glade.h:2 +#, fuzzy +msgid "Ping" +msgstr "Comendo" + +#: ../data/glade/chat_control_popup_menu.glade.h:3 #: ../data/glade/roster_contact_context_menu.glade.h:8 #: ../data/glade/zeroconf_contact_context_menu.glade.h:4 msgid "Send _File" msgstr "Enviar _Arquivo" -#: ../data/glade/chat_control_popup_menu.glade.h:3 +#: ../data/glade/chat_control_popup_menu.glade.h:4 msgid "Toggle Open_PGP Encryption" -msgstr "Alternar criptografia Open_PGP" +msgstr "Ativar criptografia Open_PGP" -#: ../data/glade/chat_control_popup_menu.glade.h:5 +#: ../data/glade/chat_control_popup_menu.glade.h:6 #: ../data/glade/gc_control_popup_menu.glade.h:6 msgid "_Compact View Alt+C" msgstr "Visão _Compacta Alt+C" -#: ../data/glade/chat_control_popup_menu.glade.h:6 -#: ../data/glade/gc_control_popup_menu.glade.h:7 +#: ../data/glade/chat_control_popup_menu.glade.h:7 +#: ../data/glade/gc_control_popup_menu.glade.h:8 #: ../data/glade/gc_occupants_menu.glade.h:5 #: ../data/glade/roster_contact_context_menu.glade.h:13 #: ../data/glade/zeroconf_contact_context_menu.glade.h:6 @@ -920,9 +919,8 @@ msgid "_History" msgstr "_Histórico" #: ../data/glade/data_form_window.glade.h:1 -#, fuzzy msgid "Fill in the form." -msgstr "Neste grupo" +msgstr "Preencha o formulário." #: ../data/glade/data_form_window.glade.h:2 msgid "Room Configuration" @@ -934,7 +932,7 @@ msgstr "Editar Grupos" #: ../data/glade/filetransfers.glade.h:1 msgid "A list of active, completed and stopped file transfers" -msgstr "Uma lista de transferência de arquivos ativas, completadas e paradas" +msgstr "Uma lista de transferências de arquivo ativas, completadas e paradas" #: ../data/glade/filetransfers.glade.h:2 msgid "Cancel file transfer" @@ -942,12 +940,12 @@ msgstr "Cancelar transferência de arquivo" #: ../data/glade/filetransfers.glade.h:3 msgid "Cancels the selected file transfer" -msgstr "Cancelar a transferência de arquivo selecionada" +msgstr "Cancela a transferência de arquivo selecionada" #: ../data/glade/filetransfers.glade.h:4 msgid "Cancels the selected file transfer and removes incomplete file" msgstr "" -"Cancelar a transferência de arquivo selecionada e remove o arquivo incompleto" +"Cancela a transferência de arquivo selecionada e remove o arquivo incompleto" #: ../data/glade/filetransfers.glade.h:5 msgid "Clean _up" @@ -966,14 +964,14 @@ msgid "Remove file transfer from the list." msgstr "Remover a transferência de arquivo da lista." #: ../data/glade/filetransfers.glade.h:9 -msgid "Removes completed, canceled and failed file transfers from the list" +msgid "Removes completed, cancelled and failed file transfers from the list" msgstr "" -"Remover transferências de arquivos completas, canceladas ou interrompidas da " -"lista" +"Remover da lista as transferências de arquivos completas, canceladas ou " +"interrompidas" #: ../data/glade/filetransfers.glade.h:10 -msgid "Shows a list of file transfers between you and other" -msgstr "Mostrar uma lista de transferências de arquivos entre você e o outro" +msgid "Shows a list of file transfers between you and others" +msgstr "Mostrar uma lista de transferências de arquivos entre você e os outros" #: ../data/glade/filetransfers.glade.h:11 msgid "" @@ -987,7 +985,7 @@ msgstr "" msgid "When a file transfer is complete show a popup notification" msgstr "Mostrar um alerta visual quanto uma transferência de arquivo terminar" -#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:769 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:761 msgid "_Continue" msgstr "_Continuar" @@ -995,7 +993,7 @@ msgstr "_Continuar" msgid "_Notify me when a file transfer is complete" msgstr "_Notificar-me quando a transmissão do arquivo terminar" -#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:190 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:188 msgid "_Open Containing Folder" msgstr "_Abrir pasta do arquivo" @@ -1012,17 +1010,16 @@ msgid "Chatstate Tab Colors" msgstr "Aba Cores do Bate-papo" #: ../data/glade/gajim_themes_window.glade.h:2 -#, fuzzy msgid "" "Account row\n" "Group row\n" "Contact row\n" "Chat Banner" msgstr "" -"Conta\n" -"Grupo\n" -"Contato\n" -"Faixa" +"Linha Conta\n" +"Linha Grupo\n" +"Linha Contato\n" +"Banner de Conversa" #: ../data/glade/gajim_themes_window.glade.h:6 msgid "Bold" @@ -1104,6 +1101,10 @@ msgstr "Configurar _Sala" msgid "_Bookmark This Room" msgstr "Adicionar esta Sala ao _Bookmark" +#: ../data/glade/gc_control_popup_menu.glade.h:7 +msgid "_Destroy room" +msgstr "_Excluir sala" + #: ../data/glade/gc_occupants_menu.glade.h:1 msgid "Mo_derator" msgstr "Mo_derador" @@ -1142,15 +1143,15 @@ msgstr "_Voz" #: ../data/glade/groups_post_window.glade.h:1 msgid "Create new post" -msgstr "" +msgstr "Criar nova postagem" -#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:259 +#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:268 msgid "From" msgstr "De" #. holds subject -#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:141 -#: ../src/history_manager.py:172 +#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:142 +#: ../src/history_manager.py:173 msgid "Subject" msgstr "Assunto" @@ -1206,6 +1207,11 @@ msgid "Search" msgstr "Buscar" #: ../data/glade/history_window.glade.h:5 +#: ../data/glade/zeroconf_information_window.glade.h:10 +msgid "_Log conversation history" +msgstr "_Histórico de Conversação" + +#: ../data/glade/history_window.glade.h:6 ../src/disco.py:1177 msgid "_Search" msgstr "_Buscar" @@ -1222,33 +1228,37 @@ msgstr "Negar" msgid "Invitation Received" msgstr "Convite Recebido" -#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1146 +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1208 msgid "Join Group Chat" msgstr "Ingressar numa conferência" #: ../data/glade/join_groupchat_window.glade.h:2 +msgid "Join this room automatically when I connect" +msgstr "Entra nesta sala automaticamente quando eu conectar" + +#: ../data/glade/join_groupchat_window.glade.h:3 #: ../data/glade/manage_bookmarks_window.glade.h:4 -#: ../data/glade/profile_window.glade.h:23 +#: ../data/glade/profile_window.glade.h:24 #: ../data/glade/vcard_information_window.glade.h:29 msgid "Nickname:" msgstr "Apelido:" -#: ../data/glade/join_groupchat_window.glade.h:3 +#: ../data/glade/join_groupchat_window.glade.h:4 #: ../data/glade/manage_bookmarks_window.glade.h:5 msgid "Password:" msgstr "Senha:" -#: ../data/glade/join_groupchat_window.glade.h:4 +#: ../data/glade/join_groupchat_window.glade.h:5 msgid "Recently:" msgstr "Recentemente:" -#: ../data/glade/join_groupchat_window.glade.h:5 +#: ../data/glade/join_groupchat_window.glade.h:6 #: ../data/glade/manage_bookmarks_window.glade.h:7 msgid "Room:" msgstr "Sala:" -#: ../data/glade/join_groupchat_window.glade.h:6 ../src/disco.py:1151 -#: ../src/disco.py:1518 +#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1165 +#: ../src/disco.py:1615 msgid "_Join" msgstr "_Ingressar" @@ -1270,9 +1280,8 @@ msgid "Manage Bookmarks" msgstr "Gerenciar Bookmarks" #: ../data/glade/manage_bookmarks_window.glade.h:6 -#, fuzzy msgid "Print status:" -msgstr "Imprimir tempo:" +msgstr "Imprimir status:" #: ../data/glade/manage_bookmarks_window.glade.h:8 msgid "Server:" @@ -1291,24 +1300,28 @@ msgid "Settings" msgstr "Configurações" #: ../data/glade/manage_proxies_window.glade.h:3 -msgid "HTTP Connect" -msgstr "Conexão HTTP" +msgid "" +"HTTP Connect\n" +"SOCKS5" +msgstr "" +"Conexão HTTP\n" +"SOCKS5" -#: ../data/glade/manage_proxies_window.glade.h:4 +#: ../data/glade/manage_proxies_window.glade.h:5 msgid "Manage Proxy Profiles" msgstr "Gerenciar Perfis de Proxy" -#: ../data/glade/manage_proxies_window.glade.h:5 -#: ../data/glade/profile_window.glade.h:22 +#: ../data/glade/manage_proxies_window.glade.h:6 +#: ../data/glade/profile_window.glade.h:23 #: ../data/glade/vcard_information_window.glade.h:28 msgid "Name:" msgstr "Nome:" -#: ../data/glade/manage_proxies_window.glade.h:7 +#: ../data/glade/manage_proxies_window.glade.h:8 msgid "Type:" msgstr "Tipo:" -#: ../data/glade/manage_proxies_window.glade.h:8 +#: ../data/glade/manage_proxies_window.glade.h:9 msgid "Use authentication" msgstr "Usar autenticação" @@ -1316,7 +1329,7 @@ msgstr "Usar autenticação" msgid "Click to insert an emoticon (Alt+M)" msgstr "Clique para inserir um emoticon (Alt+M)" -#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1104 +#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1129 msgid "OpenPGP Encryption" msgstr "Criptografia OpenPGP" @@ -1330,7 +1343,7 @@ msgstr "_Ações" #. 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:6 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:253 +#: ../src/filetransfers_window.py:245 msgid "_Send" msgstr "_Enviar" @@ -1356,9 +1369,8 @@ msgid "Format of a line" msgstr "Formato da linha" #: ../data/glade/preferences_window.glade.h:6 -#, fuzzy msgid "GMail Options" -msgstr "Aplicações" +msgstr "Opções do Gmail" #: ../data/glade/preferences_window.glade.h:7 msgid "Interface Customization" @@ -1373,14 +1385,10 @@ msgid "Visual Notifications" msgstr "Notificações Visuais" #: ../data/glade/preferences_window.glade.h:12 -msgid "A_fter nickname:" -msgstr "_Depois do apelido:" - -#: ../data/glade/preferences_window.glade.h:13 msgid "Advanced" msgstr "Avançado" -#: ../data/glade/preferences_window.glade.h:14 +#: ../data/glade/preferences_window.glade.h:13 msgid "" "All chat states\n" "Composing only\n" @@ -1390,25 +1398,32 @@ msgstr "" "Escrevendo somente\n" "Desabilitado" -#: ../data/glade/preferences_window.glade.h:17 +#: ../data/glade/preferences_window.glade.h:16 msgid "Allow _OS information to be sent" msgstr "Permitir o envio de informações do _SO " -#: ../data/glade/preferences_window.glade.h:18 +#: ../data/glade/preferences_window.glade.h:17 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "" "Permite janela/notificação quando eu estou _afastado/NA/ocupado/invisível" -#: ../data/glade/preferences_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:18 msgid "Also known as iChat style" msgstr "Conhecido também como estilo iChat" +#: ../data/glade/preferences_window.glade.h:19 +msgid "Always check to see if Gajim is the _default Jabber client on startup" +msgstr "Sempre verificar ao iniciar se o Gajim é o cliente Jabber padrão" + #: ../data/glade/preferences_window.glade.h:20 msgid "" "An example: If you have enabled status message for away, Gajim won't ask you " "anymore for a status message when you change your status to away; it will " "use the default one set here" msgstr "" +"Um exemplo: se você tiver habilitado a mensagem de status para afastado, o " +"Gajim não perguntará mais por uma mensagem de status quando você mudá-lo " +"para afastado, ele usará o padrão definido aqui" #: ../data/glade/preferences_window.glade.h:21 msgid "Ask status message when I:" @@ -1423,7 +1438,6 @@ msgid "Auto _not available after:" msgstr "Marcar como _afastado depois:" #: ../data/glade/preferences_window.glade.h:24 -#, fuzzy msgid "" "Autodetect on every Gajim startup\n" "Always use GNOME default applications\n" @@ -1431,84 +1445,87 @@ msgid "" "Always use XFCE4 default applications\n" "Custom" msgstr "" -"Auto-detectar no início do Gajim\n" -"Sempre usar aplicações padrão GNOME\n" -"Sempre usar aplicações padrão KDE\n" -"Customizar" +"Auto-detectar ao abrir o Gajim\n" +"Sempre usar aplicações no padrão GNOME\n" +"Sempre usar aplicações no padrão KDE\n" +"Personalizar" #: ../data/glade/preferences_window.glade.h:29 -msgid "B_efore nickname:" -msgstr "_Antes do apelido:" - -#: ../data/glade/preferences_window.glade.h:30 ../src/chat_control.py:844 msgid "Chat" msgstr "Conversa" -#: ../data/glade/preferences_window.glade.h:31 +#: ../data/glade/preferences_window.glade.h:30 msgid "" "Check this option, only if someone you don't have in the roster spams/annoys " -"you. Use with caution, cause it blocks all messages from any contact that is " -"not in the roster" +"you. Use with caution, because it blocks all messages from any contact that " +"is not in the roster" msgstr "" "Marque esta opção somente se alguém que não está na sua lista estiver " -"mandando spams. Utilize com cuidado, porque isto bloqueia todas as mensagens " -"de qualquer contato que você não possuir na sua lista e queria lhe enviar " -"uma mensagem" +"mandando SPAM's. Utilize com cuidado, porque isto bloqueia todas as " +"mensagens de qualquer contato que você não possuir na sua lista e queria lhe " +"enviar uma mensagem" + +#: ../data/glade/preferences_window.glade.h:31 +msgid "Configure color and font of the interface" +msgstr "Configurar cores e fontes da interface" #: ../data/glade/preferences_window.glade.h:32 -msgid "Configure color and font of the interface" -msgstr "" +msgid "Default Status Messages" +msgstr "Mensagens de Status Padrão" #: ../data/glade/preferences_window.glade.h:33 -#, fuzzy -msgid "Default Status Messages" -msgstr "Mensagem de status" - -#: ../data/glade/preferences_window.glade.h:34 msgid "Default status _iconset:" msgstr "_Conjunto de Ícones de status padrão:" -#: ../data/glade/preferences_window.glade.h:35 -msgid "Display _extra email details" +#: ../data/glade/preferences_window.glade.h:34 +msgid "" +"Determined by sender\n" +"Chat message\n" +"Single message" msgstr "" +"Determinado pelo remetente\n" +"Mensagem de chat\n" +"Mensagem simples" -#: ../data/glade/preferences_window.glade.h:36 +#: ../data/glade/preferences_window.glade.h:37 +msgid "Display _extra email details" +msgstr "Mostrar detalhes _extras dos emails" + +#: ../data/glade/preferences_window.glade.h:38 msgid "Display a_vatars of contacts in roster" msgstr "Mostrar a_vatar dos contatos na lista" -#: ../data/glade/preferences_window.glade.h:37 +#: ../data/glade/preferences_window.glade.h:39 msgid "Display status _messages of contacts in roster" msgstr "Mostrar _mensagem de status da lista de contato" -#: ../data/glade/preferences_window.glade.h:38 -#, fuzzy +#: ../data/glade/preferences_window.glade.h:40 msgid "Displayed Chat state noti_fications:" -msgstr "Noti_ficações do status da conversa:" +msgstr "Noti_ficações do status da conversa exibidas:" -#: ../data/glade/preferences_window.glade.h:39 +#: ../data/glade/preferences_window.glade.h:41 msgid "E_very 5 minutes" msgstr "De 5 _em 5 minutos" -#: ../data/glade/preferences_window.glade.h:40 +#: ../data/glade/preferences_window.glade.h:42 msgid "Emoticons:" msgstr "Emoticons:" -#: ../data/glade/preferences_window.glade.h:41 +#: ../data/glade/preferences_window.glade.h:43 msgid "Events" msgstr "Eventos" -#: ../data/glade/preferences_window.glade.h:42 -#, fuzzy +#: ../data/glade/preferences_window.glade.h:44 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 " "display in chat windows." msgstr "" -"Gajim pode enviar e receber meta-informações relacionadas a conversação que " -"você pode ter com um contato. Aqui você pode especificar quais caracteres " -"você quer para enviar a outra parte." +"O Gajim pode enviar e receber meta-informações relacionadas a conversação " +"que você pode ter com um contato. Aqui você pode especificar quais " +"caracteres você quer para enviar a outra parte." -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:45 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 " @@ -1518,13 +1535,14 @@ msgstr "" "você pode ter com um contato. Aqui você pode especificar quais caracteres " "você quer para enviar a outra parte." -#: ../data/glade/preferences_window.glade.h:44 +#: ../data/glade/preferences_window.glade.h:46 msgid "" -"Gajim will automatically show new events by poping up the relative window" +"Gajim will automatically show new events by popping up the relevant window" msgstr "" -"Gajim automaticamente mostrará novos eventos em uma janela pop-up relativa" +"O Gajim automaticamente mostrará novos eventos em uma janela saltando sobre " +"a janela relevante" -#: ../data/glade/preferences_window.glade.h:45 +#: ../data/glade/preferences_window.glade.h:47 msgid "" "Gajim will notify you for new events via a popup in the bottom right of the " "screen" @@ -1532,7 +1550,7 @@ msgstr "" "Gajim notificará você de uma novo evento via uma alerta visual na lateral " "inferior direita da tela" -#: ../data/glade/preferences_window.glade.h:46 +#: ../data/glade/preferences_window.glade.h:48 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed in" @@ -1540,7 +1558,7 @@ msgstr "" "Gajim notificará você através de um alerta visual na parte inferior direita " "da tela sobre os contatos que se conectaram" -#: ../data/glade/preferences_window.glade.h:47 +#: ../data/glade/preferences_window.glade.h:49 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1548,18 +1566,20 @@ msgstr "" "Gajim notificará você através de um alerta visual na parte inferior direita " "da tela sobre os contatos que se desconectaram" -#: ../data/glade/preferences_window.glade.h:48 +#: ../data/glade/preferences_window.glade.h:50 msgid "" "Gajim will only change the icon of the contact that triggered the new event" msgstr "Gajim mudará somente o ícone do contato que provocou o evento novo" -#: ../data/glade/preferences_window.glade.h:50 +#: ../data/glade/preferences_window.glade.h:52 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" msgstr "" +"Se marcado, o Gajim também incluirá informação sobre o remetente de novos " +"emails" -#: ../data/glade/preferences_window.glade.h:51 +#: ../data/glade/preferences_window.glade.h:53 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1567,7 +1587,7 @@ msgstr "" "Se marcado, Gajim mostrará avatars dos contatos na janela da lista e na " "conferência" -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:54 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -1575,7 +1595,7 @@ msgstr "" "Se marcado, Gajim indicará mensagens de status dos contatos sob o nome do " "contato na janela da lista e na conferência" -#: ../data/glade/preferences_window.glade.h:53 +#: ../data/glade/preferences_window.glade.h:55 msgid "" "If checked, Gajim will remember the roster and chat window positions in the " "screen and the sizes of them next time you run it" @@ -1583,7 +1603,7 @@ msgstr "" "Se marcado, o Gajim lembrará a posição e tamanho da janela principal na " "próxima vez que você executa-lo" -#: ../data/glade/preferences_window.glade.h:54 +#: ../data/glade/preferences_window.glade.h:56 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, " @@ -1593,7 +1613,7 @@ msgstr "" "exemplo, um contato do MSN terá o ícone equivalente do MSN para o status " "conectado, ausente, ocupado, etc....)" -#: ../data/glade/preferences_window.glade.h:55 +#: ../data/glade/preferences_window.glade.h:57 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" @@ -1601,15 +1621,15 @@ msgstr "" "Se habilitado, Gajim substituirá o ascii para smilies, como ':)' com a " "animação equivalente ou estático emoticons gráfico" -#: ../data/glade/preferences_window.glade.h:56 +#: ../data/glade/preferences_window.glade.h:58 msgid "Ignore rich content in incoming messages" -msgstr "" +msgstr "Ignorar conteúdo formatado nas mensagens recebidas." -#: ../data/glade/preferences_window.glade.h:57 +#: ../data/glade/preferences_window.glade.h:59 msgid "Ma_nage..." msgstr "Gere_nciar..." -#: ../data/glade/preferences_window.glade.h:58 +#: ../data/glade/preferences_window.glade.h:60 msgid "" "Never\n" "Always\n" @@ -1621,95 +1641,100 @@ msgstr "" "Por conta\n" "Por tipo" -#: ../data/glade/preferences_window.glade.h:62 +#: ../data/glade/preferences_window.glade.h:64 msgid "Notify me about contacts that: " msgstr "Notifique-me sobre contatos ao: " -#: ../data/glade/preferences_window.glade.h:63 -#, fuzzy +#: ../data/glade/preferences_window.glade.h:65 msgid "Notify on new _GMail email" -msgstr "Notificar nova mensagem do _Gmail" +msgstr "Notificar cada nova mensagem do _Gmail" -#: ../data/glade/preferences_window.glade.h:64 +#: ../data/glade/preferences_window.glade.h:66 msgid "On every _message" msgstr "Em todas as _mensagens" -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:67 msgid "One message _window:" msgstr "Uma _janela de mensagem" -#: ../data/glade/preferences_window.glade.h:66 -#, fuzzy +#: ../data/glade/preferences_window.glade.h:68 msgid "Outgoing Chat state noti_fications:" -msgstr "Noti_ficações do status da conversa:" +msgstr "Enviar noti_ficações do status da conversa:" -#: ../data/glade/preferences_window.glade.h:67 +#: ../data/glade/preferences_window.glade.h:69 msgid "Play _sounds" msgstr "Tocar _Sons" -#: ../data/glade/preferences_window.glade.h:68 +#: ../data/glade/preferences_window.glade.h:70 msgid "Preferences" msgstr "Preferências" -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:71 msgid "Print time:" msgstr "Imprimir tempo:" -#: ../data/glade/preferences_window.glade.h:70 +#: ../data/glade/preferences_window.glade.h:72 msgid "Save _position and size for roster and chat windows" msgstr "Salvar _posição e tamanho das janelas de conversa e lista de contatos" -#: ../data/glade/preferences_window.glade.h:71 +#: ../data/glade/preferences_window.glade.h:73 msgid "Set status message to reflect currently playing _music track" msgstr "" +"Definir a mensagem de status de acordo com a música que estiver sendo tocada." -#: ../data/glade/preferences_window.glade.h:72 +#: ../data/glade/preferences_window.glade.h:74 msgid "Show only in _roster" msgstr "Mostre somente na _lista" -#: ../data/glade/preferences_window.glade.h:73 +#: ../data/glade/preferences_window.glade.h:75 msgid "Sign _in" msgstr "_Conectar" -#: ../data/glade/preferences_window.glade.h:74 +#: ../data/glade/preferences_window.glade.h:76 msgid "Sign _out" msgstr "_Desconectar" -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:77 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." msgstr "" +"Algumas mensagens podem incluir conteúdo rico (formatação, cores etc). Se " +"marcado, o Gajim apenas mostrará as mensagens em texto puro." -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:78 msgid "Status" msgstr "Status" -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:79 msgid "T_heme:" msgstr "_Tema:" -#: ../data/glade/preferences_window.glade.h:78 +#: ../data/glade/preferences_window.glade.h:80 msgid "The auto away status message" msgstr "A mensagem de status para o ausente automático" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:81 msgid "The auto not available status message" msgstr "A mensagem de status para o afastado automático" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:82 +msgid "Treat all incoming messages as:" +msgstr "Tratar todas as mensagens recebidas como:" + +#: ../data/glade/preferences_window.glade.h:83 msgid "Use _transports iconsets" msgstr "Usar conjunto de ícones de _transportes" -#: ../data/glade/preferences_window.glade.h:81 +#: ../data/glade/preferences_window.glade.h:84 msgid "Use system _default" -msgstr "" +msgstr "Usar o _padrão do sistema" -#: ../data/glade/preferences_window.glade.h:82 +#: ../data/glade/preferences_window.glade.h:85 msgid "Use t_rayicon (aka. notification area icon)" msgstr "Usar ícone na bandeja (também conhecido por área de notificação)" -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:86 msgid "" "When a new event (message, file transfer request etc..) is received, the " "following methods may be used to inform you about it. Please note that " @@ -1721,164 +1746,149 @@ msgstr "" "sobre ele. Por favor, note que os eventos sobre mensagens novas ocorrem " "somente se for uma mensagem nova de um contato que você não está conversando" -#: ../data/glade/preferences_window.glade.h:84 +#: ../data/glade/preferences_window.glade.h:87 msgid "When new event is received" msgstr "Quando novo evento é recebido" -#: ../data/glade/preferences_window.glade.h:85 +#: ../data/glade/preferences_window.glade.h:88 msgid "" "Works for Rhythmbox and Muine players. For more players, please visit http://" "trac.gajim.org/wiki/GajimAndMusicPlayer" msgstr "" - -#: ../data/glade/preferences_window.glade.h:86 -#, fuzzy -msgid "_Advanced Notifications Control..." -msgstr "Editor de Configurações Avançadas" - -#: ../data/glade/preferences_window.glade.h:87 -msgid "_After time:" -msgstr "_Depois da hora:" - -#: ../data/glade/preferences_window.glade.h:88 -msgid "_Before time:" -msgstr "A_ntes da hora:" +"Funciona para os reprodutores Rhythmbox e Muine. Para mais reprodutores, por " +"favor visite a página http://trac.gajim.org/wiki/GajimAndMusicPlayer" #: ../data/glade/preferences_window.glade.h:89 +msgid "_Advanced Notifications Control..." +msgstr "Controle _Avançado de Notificações..." + +#: ../data/glade/preferences_window.glade.h:90 msgid "_Browser:" msgstr "_Navegar:" -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:91 msgid "_File manager:" msgstr "_Gerenciamento de arquivos:" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:92 msgid "_Font:" msgstr "_Fonte:" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:93 msgid "_Highlight misspelled words" msgstr "_Destacar palavras mal escritas" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:94 msgid "_Ignore events from contacts not in the roster" msgstr "_Ignore eventos de contatos que não estejam na minha lista" -#: ../data/glade/preferences_window.glade.h:94 +#: ../data/glade/preferences_window.glade.h:95 msgid "_Incoming message:" msgstr "Mensagem _recebida:" -#: ../data/glade/preferences_window.glade.h:95 +#: ../data/glade/preferences_window.glade.h:96 msgid "_Log status changes of contacts" msgstr "_Log mudanças de status dos contatos" -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:97 msgid "_Mail client:" msgstr "_Cliente de email:" -#: ../data/glade/preferences_window.glade.h:97 +#: ../data/glade/preferences_window.glade.h:98 msgid "_Never" msgstr "_Nunca" -#: ../data/glade/preferences_window.glade.h:98 +#: ../data/glade/preferences_window.glade.h:99 msgid "_Notify me about it" msgstr "_Notifique-me sobre isto" -#: ../data/glade/preferences_window.glade.h:99 +#: ../data/glade/preferences_window.glade.h:100 msgid "_Open..." msgstr "_Abrir..." -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:101 msgid "_Outgoing message:" msgstr "Mensagem _enviada:" -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:102 msgid "_Player:" msgstr "_Tocador de som:" -#: ../data/glade/preferences_window.glade.h:102 +#: ../data/glade/preferences_window.glade.h:103 msgid "_Pop it up" msgstr "_Alerta visual" -#: ../data/glade/preferences_window.glade.h:103 +#: ../data/glade/preferences_window.glade.h:104 msgid "_Reset to Default Colors" msgstr "Voltar para as Cores _Padrões" -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:105 msgid "_Sort contacts by status" msgstr "_Ordena contatos pelo status" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:106 msgid "_Status message:" msgstr "_Mensagem de status:" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:107 msgid "_URL:" msgstr "_URL:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:108 msgid "minutes" msgstr "minutos" #: ../data/glade/privacy_lists_window.glade.h:1 -#, fuzzy msgid "Privacy Lists:" -msgstr "ConversasPrivada" +msgstr "Listas de Privacidade:" #: ../data/glade/privacy_list_window.glade.h:1 msgid "Add / Edit a rule" -msgstr "" +msgstr "Adicionar/Editar regra" #: ../data/glade/privacy_list_window.glade.h:2 -#, fuzzy msgid "List of rules" -msgstr "Formato da linha" +msgstr "Lista de regras" #: ../data/glade/privacy_list_window.glade.h:3 msgid "Privacy List" -msgstr "" +msgstr "Lista de Privacidade" #: ../data/glade/privacy_list_window.glade.h:4 msgid "Active for this session" -msgstr "" +msgstr "Ativo para esta sessão" #: ../data/glade/privacy_list_window.glade.h:5 -#, fuzzy msgid "Active on each startup" -msgstr "C_onectar na inicialização do Gajim" +msgstr "Ativar ao iniciar o programa" #: ../data/glade/privacy_list_window.glade.h:6 msgid "All" -msgstr "" +msgstr "Todos" #: ../data/glade/privacy_list_window.glade.h:7 msgid "Allow" -msgstr "" +msgstr "Permitir" #: ../data/glade/privacy_list_window.glade.h:9 -#, fuzzy msgid "JabberID" -msgstr "Jabber ID:" +msgstr "Jabber ID" #: ../data/glade/privacy_list_window.glade.h:10 -#, fuzzy msgid "Order:" -msgstr "Servidor:" +msgstr "Ordem:" -#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:1841 -#, fuzzy +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2052 msgid "Privacy List" -msgstr "Lista de Banidos" +msgstr "Lista de Privacidade" #: ../data/glade/privacy_list_window.glade.h:12 -#, fuzzy msgid "all by subscription" -msgstr "_Inscrição" +msgstr "todos por inscrição" #: ../data/glade/privacy_list_window.glade.h:13 -#, fuzzy msgid "all in the group" -msgstr "Neste grupo" +msgstr "todos no grupo" #: ../data/glade/privacy_list_window.glade.h:14 msgid "" @@ -1887,25 +1897,26 @@ msgid "" "from\n" "to" msgstr "" +"nenhum\n" +"ambos\n" +"de\n" +"para" #: ../data/glade/privacy_list_window.glade.h:18 -#, fuzzy msgid "to send me messages" -msgstr "Enviar mensagem" +msgstr "para me enviar mensagens" #: ../data/glade/privacy_list_window.glade.h:19 msgid "to send me queries" -msgstr "" +msgstr "para enviar minhas requisições" #: ../data/glade/privacy_list_window.glade.h:20 -#, fuzzy msgid "to send me status" -msgstr "Peça para ver o status dele/dela" +msgstr "para seu status para mim" #: ../data/glade/privacy_list_window.glade.h:21 -#, fuzzy msgid "to view my status" -msgstr "Permita que ele/ela ver meu status" +msgstr "para ver meu status" #. "About" is the text of a tab of vcard window #: ../data/glade/profile_window.glade.h:2 @@ -1919,9 +1930,8 @@ msgid "Address" msgstr "Endereço" #: ../data/glade/profile_window.glade.h:4 -#, fuzzy msgid "Avatar:" -msgstr "Configurar _Avatar" +msgstr "Avatar:" #: ../data/glade/profile_window.glade.h:5 #: ../data/glade/vcard_information_window.glade.h:6 @@ -1934,127 +1944,122 @@ msgid "City:" msgstr "Cidade:" #: ../data/glade/profile_window.glade.h:7 +msgid "Click to set your avatar" +msgstr "Clique para definir seu avatar" + +#: ../data/glade/profile_window.glade.h:8 #: ../data/glade/vcard_information_window.glade.h:10 msgid "Company:" msgstr "Empresa:" -#: ../data/glade/profile_window.glade.h:8 +#: ../data/glade/profile_window.glade.h:9 #: ../data/glade/vcard_information_window.glade.h:13 msgid "Country:" msgstr "País:" -#: ../data/glade/profile_window.glade.h:9 +#: ../data/glade/profile_window.glade.h:10 #: ../data/glade/vcard_information_window.glade.h:14 msgid "Department:" msgstr "Departamento:" -#: ../data/glade/profile_window.glade.h:10 +#: ../data/glade/profile_window.glade.h:11 #: ../data/glade/vcard_information_window.glade.h:15 #: ../data/glade/zeroconf_information_window.glade.h:2 #: ../data/glade/zeroconf_properties_window.glade.h:5 msgid "E-Mail:" msgstr "E-Mail:" -#: ../data/glade/profile_window.glade.h:11 +#: ../data/glade/profile_window.glade.h:12 #: ../data/glade/vcard_information_window.glade.h:16 msgid "Extra Address:" msgstr "Complemento:" #. Family Name -#: ../data/glade/profile_window.glade.h:13 +#: ../data/glade/profile_window.glade.h:14 #: ../data/glade/vcard_information_window.glade.h:18 msgid "Family:" msgstr "Família:" #. Do NOT change sequence. Just translate YYYY and MM and DD (from Year, Month, Day accordingly) -#: ../data/glade/profile_window.glade.h:15 +#: ../data/glade/profile_window.glade.h:16 #: ../data/glade/vcard_information_window.glade.h:20 msgid "Format: YYYY-MM-DD" msgstr "Formato: YYYY-MM-DD" #. Given Name -#: ../data/glade/profile_window.glade.h:17 +#: ../data/glade/profile_window.glade.h:18 #: ../data/glade/vcard_information_window.glade.h:22 msgid "Given:" msgstr "Nome:" -#: ../data/glade/profile_window.glade.h:18 +#: ../data/glade/profile_window.glade.h:19 #: ../data/glade/vcard_information_window.glade.h:23 msgid "Homepage:" msgstr "Homepage:" #. Middle Name -#: ../data/glade/profile_window.glade.h:20 +#: ../data/glade/profile_window.glade.h:21 #: ../data/glade/vcard_information_window.glade.h:26 msgid "Middle:" msgstr "Nome do meio:" -#: ../data/glade/profile_window.glade.h:21 +#: ../data/glade/profile_window.glade.h:22 #: ../data/glade/vcard_information_window.glade.h:27 msgid "More" msgstr "Mais" -#: ../data/glade/profile_window.glade.h:24 +#: ../data/glade/profile_window.glade.h:25 #: ../data/glade/vcard_information_window.glade.h:31 -#, fuzzy msgid "Personal Info" msgstr "Informações Pessoais" -#: ../data/glade/profile_window.glade.h:26 +#: ../data/glade/profile_window.glade.h:27 #: ../data/glade/vcard_information_window.glade.h:32 msgid "Phone No.:" msgstr "Telefone:" -#: ../data/glade/profile_window.glade.h:27 +#: ../data/glade/profile_window.glade.h:28 #: ../data/glade/vcard_information_window.glade.h:33 msgid "Position:" msgstr "Cargo:" -#: ../data/glade/profile_window.glade.h:28 +#: ../data/glade/profile_window.glade.h:29 #: ../data/glade/vcard_information_window.glade.h:34 msgid "Postal Code:" msgstr "Código Postal:" #. Prefix in Name -#: ../data/glade/profile_window.glade.h:30 +#: ../data/glade/profile_window.glade.h:31 #: ../data/glade/vcard_information_window.glade.h:36 msgid "Prefix:" msgstr "Prefixo:" -#: ../data/glade/profile_window.glade.h:31 -#: ../data/glade/vcard_information_window.glade.h:38 ../src/vcard.py:273 +#: ../data/glade/profile_window.glade.h:32 +#: ../data/glade/vcard_information_window.glade.h:38 ../src/vcard.py:257 msgid "Role:" msgstr "Função:" -#: ../data/glade/profile_window.glade.h:32 +#: ../data/glade/profile_window.glade.h:33 #: ../data/glade/vcard_information_window.glade.h:39 msgid "State:" msgstr "Estado:" -#: ../data/glade/profile_window.glade.h:33 +#: ../data/glade/profile_window.glade.h:34 #: ../data/glade/vcard_information_window.glade.h:41 msgid "Street:" msgstr "Rua:" #. Suffix in Name -#: ../data/glade/profile_window.glade.h:35 +#: ../data/glade/profile_window.glade.h:36 #: ../data/glade/vcard_information_window.glade.h:45 msgid "Suffix:" msgstr "Sobrenome:" -#: ../data/glade/profile_window.glade.h:36 +#: ../data/glade/profile_window.glade.h:37 #: ../data/glade/vcard_information_window.glade.h:46 msgid "Work" msgstr "Trabalho" -#: ../data/glade/profile_window.glade.h:37 -msgid "_Publish" -msgstr "_Publicar" - -#: ../data/glade/profile_window.glade.h:38 -msgid "_Retrieve" -msgstr "_Recuperar" - #: ../data/glade/remove_account_window.glade.h:1 msgid "What do you want to do?" msgstr "O que você quer fazer?" @@ -2068,9 +2073,8 @@ msgid "Remove account from Gajim and from _server" msgstr "Remover conta do Gajim e do _servidor" #: ../data/glade/roster_contact_context_menu.glade.h:1 -#, fuzzy msgid "A_sk to see his/her status" -msgstr "Peça para ver o status dele/dela" +msgstr "Pe_ça para ver o status dele/dela" #: ../data/glade/roster_contact_context_menu.glade.h:2 #: ../data/glade/zeroconf_contact_context_menu.glade.h:1 @@ -2084,19 +2088,19 @@ msgstr "Atribuir chave OpenPGP" #: ../data/glade/roster_contact_context_menu.glade.h:4 #: ../data/glade/zeroconf_contact_context_menu.glade.h:3 -#: ../src/roster_window.py:1993 +#: ../src/roster_window.py:2078 msgid "Edit _Groups" msgstr "Editar _Grupos" #: ../data/glade/roster_contact_context_menu.glade.h:5 -#: ../src/roster_window.py:2128 +#: ../src/roster_window.py:2213 msgid "Execute Command..." -msgstr "" +msgstr "Executar Comando..." #: ../data/glade/roster_contact_context_menu.glade.h:6 -#: ../src/roster_window.py:1951 +#: ../src/roster_window.py:2036 msgid "In_vite to" -msgstr "" +msgstr "Con_vidar para" #: ../data/glade/roster_contact_context_menu.glade.h:7 #: ../data/glade/systray_context_menu.glade.h:2 @@ -2109,25 +2113,23 @@ msgid "Start _Chat" msgstr "Iniciar conversa" #: ../data/glade/roster_contact_context_menu.glade.h:11 -#, fuzzy msgid "_Allow him/her to see my status" -msgstr "Permita que ele/ela ver meu status" +msgstr "_Permitir que ele/ela veja meu status" #: ../data/glade/roster_contact_context_menu.glade.h:12 -#, fuzzy msgid "_Forbid him/her to see my status" -msgstr "Proibir ele/ela a ver meu status" +msgstr "_Proibir ele/ela de ver meu status" #. Remove group #: ../data/glade/roster_contact_context_menu.glade.h:14 -#: ../src/roster_window.py:1945 ../src/roster_window.py:2042 -#: ../src/roster_window.py:2149 +#: ../src/roster_window.py:2030 ../src/roster_window.py:2127 +#: ../src/roster_window.py:2234 msgid "_Remove from Roster" msgstr "_Remover da Lista" #: ../data/glade/roster_contact_context_menu.glade.h:15 #: ../data/glade/zeroconf_contact_context_menu.glade.h:7 -#: ../src/roster_window.py:2137 +#: ../src/roster_window.py:2222 msgid "_Rename" msgstr "_Renomear" @@ -2156,14 +2158,12 @@ msgid "Help online" msgstr "Ajuda online" #: ../data/glade/roster_window.glade.h:7 -#, fuzzy msgid "Profile, A_vatar" -msgstr "Perfil, Avatar" +msgstr "Perfil, A_vatar" #: ../data/glade/roster_window.glade.h:8 -#, fuzzy msgid "Show Trans_ports" -msgstr "Transportes" +msgstr "Mostrar Trans_portes" #: ../data/glade/roster_window.glade.h:9 msgid "Show _Offline Contacts" @@ -2177,8 +2177,8 @@ msgstr "_Índices" msgid "_Discover Services" msgstr "_Descubra Serviços" -#: ../data/glade/roster_window.glade.h:14 ../src/disco.py:1256 -#: ../src/roster_window.py:2120 +#: ../data/glade/roster_window.glade.h:14 ../src/disco.py:1353 +#: ../src/roster_window.py:2205 msgid "_Edit" msgstr "_Editar" @@ -2199,9 +2199,8 @@ msgid "_Quit" msgstr "_Sair" #: ../data/glade/roster_window.glade.h:21 -#, fuzzy msgid "_View" -msgstr "_Voz" +msgstr "_Ver" #: ../data/glade/service_discovery_window.glade.h:1 msgid "G_o" @@ -2268,18 +2267,20 @@ msgid "_Send & Close" msgstr "_Enviar & Fechar" #: ../data/glade/subscription_request_window.glade.h:1 -#, fuzzy msgid "Au_thorize" -msgstr "_Autorizar" +msgstr "Au_torizar" #: ../data/glade/subscription_request_window.glade.h:2 -msgid "Authorize contact so he can know when you're connected" -msgstr "Autorize o contato para que ele saiba quando você estiver conectado" +msgid "Authorize contact so he or she can know when you're connected" +msgstr "" +"Autorize o contato para que ele ou ela saiba quando você estiver conectado" #: ../data/glade/subscription_request_window.glade.h:3 -msgid "Deny authorization from contact so he cannot know when you're connected" +msgid "" +"Deny authorization from contact so he or she cannot know when you're " +"connected" msgstr "" -"Negando a autorização do contato, ele não poderá saber quando você está " +"Negar a autorização do contato, assim ele não poderá saber quando você está " "conectado" #: ../data/glade/subscription_request_window.glade.h:4 @@ -2291,9 +2292,8 @@ msgid "_Deny" msgstr "_Negar" #: ../data/glade/systray_context_menu.glade.h:1 -#, fuzzy msgid "Mute Sounds" -msgstr "Sons Wav" +msgstr "Sons Mudos" #: ../data/glade/systray_context_menu.glade.h:3 msgid "Show All Pending _Events" @@ -2317,15 +2317,13 @@ msgid "Client:" msgstr "Cliente:" #: ../data/glade/vcard_information_window.glade.h:9 -#, fuzzy msgid "Comments" -msgstr "Comentário: %s" +msgstr "Comentários" #: ../data/glade/vcard_information_window.glade.h:11 #: ../data/glade/zeroconf_information_window.glade.h:1 -#, fuzzy msgid "Contact" -msgstr "Contatos" +msgstr "Contato" #: ../data/glade/vcard_information_window.glade.h:12 msgid "Contact Information" @@ -2356,11 +2354,6 @@ msgstr "Status:" msgid "Subscription:" msgstr "Inscrição:" -#: ../data/glade/vcard_information_window.glade.h:47 -#: ../data/glade/zeroconf_information_window.glade.h:10 -msgid "_Log conversation history" -msgstr "_Histórico de Conversação" - #: ../data/glade/xml_console_window.glade.h:1 msgid "Jabber Traffic" msgstr "Trafégo do Jabber" @@ -2394,24 +2387,21 @@ msgstr "_Presença" #: ../data/glade/zeroconf_information_window.glade.h:3 #: ../data/glade/zeroconf_properties_window.glade.h:6 -#, fuzzy msgid "First Name:" -msgstr "Nome:" +msgstr "Primeiro nome:" #: ../data/glade/zeroconf_information_window.glade.h:5 #: ../data/glade/zeroconf_properties_window.glade.h:14 -#, fuzzy msgid "Last Name:" -msgstr "Nome:" +msgstr "Último nome:" #: ../data/glade/zeroconf_information_window.glade.h:6 msgid "Local jid:" -msgstr "" +msgstr "JID local:" #: ../data/glade/zeroconf_information_window.glade.h:7 -#, fuzzy msgid "Personal" -msgstr "Detalhes Pessoais" +msgstr "Pessoal" #: ../data/glade/zeroconf_properties_window.glade.h:11 msgid "" @@ -2419,36 +2409,62 @@ msgid "" "setup you can select another one here.\n" "You might consider to change possible firewall settings." msgstr "" +"Se a porta padrão usada para recebimento de mensagens não for adequada você " +"pode selecionar outra aqui.\n" +"Considere a possível modificação das regras do seu firewall. " #: ../data/glade/zeroconf_properties_window.glade.h:15 -#, fuzzy msgid "Modify Account" -msgstr "_Editar Conta..." +msgstr "Alterar Conta" #: ../data/glade/zeroconf_properties_window.glade.h:21 -#, fuzzy msgid "Use custom port:" -msgstr "Usa nomedohost/porta customizada" +msgstr "Usar servidor/porta personalizado" -#: ../src/advanced.py:57 +#. For i18n +#: ../src/advanced.py:51 +msgid "Activated" +msgstr "Ativado" + +#: ../src/advanced.py:51 +msgid "Deactivated" +msgstr "Desativado" + +#: ../src/advanced.py:53 +msgid "Boolean" +msgstr "Booleano" + +#: ../src/advanced.py:54 +msgid "Integer" +msgstr "Inteiro" + +#: ../src/advanced.py:55 +msgid "Text" +msgstr "Texto" + +#: ../src/advanced.py:56 +msgid "Color" +msgstr "Cor" + +#: ../src/advanced.py:65 msgid "Preference Name" msgstr "Nome da preferência" -#: ../src/advanced.py:63 +#: ../src/advanced.py:71 msgid "Value" msgstr "Valor" -#: ../src/advanced.py:72 +#: ../src/advanced.py:79 msgid "Type" msgstr "Tipo" #. we talk about option description in advanced configuration editor -#: ../src/advanced.py:128 +#: ../src/advanced.py:136 msgid "(None)" msgstr "(Nada)" #. we talk about password -#: ../src/advanced.py:227 +#: ../src/advanced.py:239 msgid "Hidden" msgstr "Escondido" @@ -2459,98 +2475,105 @@ msgstr "Escondido" #. echo "{_('en'):'en'",$LANG"}" #: ../src/chat_control.py:52 msgid "English" -msgstr "" +msgstr "Inglês" + +#: ../src/chat_control.py:52 +msgid "Belarusian" +msgstr "Bielorusso" #: ../src/chat_control.py:52 msgid "Bulgarian" -msgstr "" +msgstr "Búlgaro" #: ../src/chat_control.py:52 -msgid "Briton" -msgstr "" +msgid "Breton" +msgstr "Bretão" #: ../src/chat_control.py:52 msgid "Czech" -msgstr "" +msgstr "Tcheco" #: ../src/chat_control.py:52 -#, fuzzy msgid "German" -msgstr "Geral" +msgstr "Alemão" #: ../src/chat_control.py:52 -#, fuzzy msgid "Greek" -msgstr "verde" +msgstr "Grego" + +#: ../src/chat_control.py:52 +msgid "British" +msgstr "Inglês Britânico" #: ../src/chat_control.py:52 msgid "Esperanto" -msgstr "" +msgstr "Esperanto" #: ../src/chat_control.py:52 msgid "Spanish" -msgstr "" +msgstr "Espanhol" #: ../src/chat_control.py:52 -msgid "Basc" -msgstr "" +msgid "Basque" +msgstr "Basco" #: ../src/chat_control.py:52 msgid "French" -msgstr "" +msgstr "Francês" #: ../src/chat_control.py:52 -#, fuzzy msgid "Croatian" -msgstr "Endereço" +msgstr "Croata" #: ../src/chat_control.py:52 -#, fuzzy msgid "Italian" -msgstr "Itálico" +msgstr "Italiano" #: ../src/chat_control.py:52 -msgid "Norvegian b" -msgstr "" +msgid "Norwegian (b)" +msgstr "Norueguês (b)" #: ../src/chat_control.py:52 msgid "Dutch" -msgstr "" +msgstr "Holandês" #: ../src/chat_control.py:52 -msgid "Norvegian" -msgstr "" +msgid "Norwegian" +msgstr "Norueguês" #: ../src/chat_control.py:52 -#, fuzzy msgid "Polish" -msgstr "_Publicar" +msgstr "Polonês" #: ../src/chat_control.py:52 msgid "Portuguese" -msgstr "" +msgstr "Português" #: ../src/chat_control.py:52 msgid "Brazilian Portuguese" -msgstr "" +msgstr "Português Brasileiro" #: ../src/chat_control.py:52 msgid "Russian" -msgstr "" +msgstr "Russo" + +#: ../src/chat_control.py:52 +msgid "Serbian" +msgstr "Sérvio" #: ../src/chat_control.py:52 msgid "Slovak" -msgstr "" +msgstr "Eslovaco" #: ../src/chat_control.py:52 msgid "Swedish" -msgstr "" +msgstr "Sueco" #: ../src/chat_control.py:52 msgid "Chinese (Ch)" -msgstr "" +msgstr "Chinês (Ch)" -#: ../src/chat_control.py:201 ../src/dialogs.py:1497 +#: ../src/chat_control.py:212 ../src/dialogs.py:1706 msgid "" "If that is not your language for which you want to highlight misspelled " "words, then please set your $LANG as appropriate. Eg. for French do export " @@ -2566,62 +2589,58 @@ msgstr "" " globalmente em/etc/profile.\n" "Caracteristica de destacar palavras erradas não será usada" -#: ../src/chat_control.py:239 +#: ../src/chat_control.py:251 msgid "Spelling language" -msgstr "" +msgstr "Idioma do corretor ortográfico" #. we are not connected -#: ../src/chat_control.py:262 ../src/chat_control.py:468 +#: ../src/chat_control.py:274 ../src/chat_control.py:480 msgid "A connection is not available" msgstr "Uma conexão não está disponível" -#: ../src/chat_control.py:263 ../src/chat_control.py:469 +#: ../src/chat_control.py:275 ../src/chat_control.py:481 msgid "Your message can not be sent until you are connected." msgstr "Sua mensagem não pode ser enviada até que esteja conectado." -#: ../src/chat_control.py:844 -msgid "Chats" -msgstr "Conversas" - -#: ../src/chat_control.py:1030 -#, fuzzy, python-format +#: ../src/chat_control.py:1054 +#, python-format msgid "%(nickname)s from group chat %(room_name)s" -msgstr "%(nickname)s: %(message)s" +msgstr "%(nickname)s da conferência %(room_name)s" #. we talk about a contact here -#: ../src/chat_control.py:1118 +#: ../src/chat_control.py:1143 #, python-format msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" msgstr "%s não tem a transmissão uma chave de OpenPGP, nem uma foi atribuída" -#: ../src/chat_control.py:1254 +#: ../src/chat_control.py:1275 msgid "Encryption enabled" msgstr "Criptografia habilitada" -#: ../src/chat_control.py:1259 +#: ../src/chat_control.py:1280 msgid "Encryption disabled" msgstr "Criptografia desabilitada" #. add_to_roster_menuitem -#: ../src/chat_control.py:1401 ../src/conversation_textview.py:495 -#: ../src/dialogs.py:629 ../src/gajim.py:781 ../src/gajim.py:782 -#: ../src/gajim.py:1121 ../src/roster_window.py:328 -#: ../src/roster_window.py:404 ../src/roster_window.py:1638 -#: ../src/roster_window.py:1819 ../src/roster_window.py:2392 -#: ../src/roster_window.py:2596 ../src/roster_window.py:2607 -#: ../src/roster_window.py:3832 ../src/roster_window.py:3834 -#: ../src/common/contacts.py:73 ../src/common/helpers.py:42 -#: ../src/common/helpers.py:246 +#: ../src/chat_control.py:1425 ../src/conversation_textview.py:502 +#: ../src/dialogs.py:629 ../src/gajim.py:850 ../src/gajim.py:851 +#: ../src/gajim.py:1196 ../src/roster_window.py:333 +#: ../src/roster_window.py:411 ../src/roster_window.py:1497 +#: ../src/roster_window.py:1507 ../src/roster_window.py:1686 +#: ../src/roster_window.py:1892 ../src/roster_window.py:2477 +#: ../src/roster_window.py:2678 ../src/roster_window.py:3924 +#: ../src/roster_window.py:3926 ../src/common/contacts.py:73 +#: ../src/common/helpers.py:43 ../src/common/helpers.py:255 msgid "Not in Roster" msgstr "Fora da lista" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:1545 +#: ../src/chat_control.py:1571 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Você acabou de receber uma nova mensagem de \"%s\"" -#: ../src/chat_control.py:1546 +#: ../src/chat_control.py:1572 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." @@ -2629,101 +2648,102 @@ msgstr "" "Se você fechar esta aba e o histórico estiver desabilitado, esta mensagem " "será perdida." -#: ../src/config.py:135 ../src/config.py:594 +#: ../src/config.py:139 ../src/config.py:588 msgid "Disabled" msgstr "Desabilitado" -#: ../src/config.py:221 +#: ../src/config.py:233 #, python-format msgid "Every %s _minutes" msgstr "A cada %s _minutos" -#: ../src/config.py:363 +#: ../src/config.py:353 msgid "Active" msgstr "Ativo" -#: ../src/config.py:371 +#: ../src/config.py:361 msgid "Event" msgstr "Evento" -#: ../src/config.py:685 ../src/gajim.py:2142 -#, fuzzy, python-format +#: ../src/config.py:684 ../src/gajim.py:2263 +#, python-format msgid "Dictionary for lang %s not available" -msgstr "Uma conexão não está disponível" +msgstr "O dicionário para o idioma %s não está disponível" -#: ../src/config.py:686 ../src/gajim.py:2143 +#: ../src/config.py:685 ../src/gajim.py:2264 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " "language by setting the speller_language option." msgstr "" +"Você precisa instalar o dicionário %s para usar a correção ortográfica ou " +"selecionar outro idioma ajustando a opção 'speller_language'." -#: ../src/config.py:1038 +#: ../src/config.py:1008 msgid "status message title" msgstr "título da mensagem de status" -#: ../src/config.py:1038 +#: ../src/config.py:1008 msgid "status message text" msgstr "texto da mensagem de status" -#: ../src/config.py:1073 +#: ../src/config.py:1044 msgid "First Message Received" msgstr "Primeira Mensagem Recebida" -#: ../src/config.py:1074 +#: ../src/config.py:1045 msgid "Next Message Received" msgstr "Nova Mensagem Recebida" -#: ../src/config.py:1075 +#: ../src/config.py:1046 msgid "Contact Connected" msgstr "Contato Conectado" -#: ../src/config.py:1076 +#: ../src/config.py:1047 msgid "Contact Disconnected" msgstr "Contato Desconectou" -#: ../src/config.py:1077 +#: ../src/config.py:1048 msgid "Message Sent" msgstr "Mensagem Enviada" -#: ../src/config.py:1078 +#: ../src/config.py:1049 msgid "Group Chat Message Highlight" msgstr "Mensagem Destacada de Conferência" -#: ../src/config.py:1079 +#: ../src/config.py:1050 msgid "Group Chat Message Received" msgstr "Mensagem de Conferência Recebida" -#: ../src/config.py:1086 -#, fuzzy +#: ../src/config.py:1057 msgid "GMail Email Received" -msgstr "Convite Recebido" +msgstr "Email do Gmail Recebido" -#: ../src/config.py:1289 +#: ../src/config.py:1260 msgid "OpenPGP is not usable in this computer" msgstr "OpenPGP não disponível neste computador" -#: ../src/config.py:1335 +#: ../src/config.py:1306 msgid "You are currently connected to the server" msgstr "Você está atualmente conectado ao servidor" -#: ../src/config.py:1336 +#: ../src/config.py:1307 msgid "To change the account name, you must be disconnected." msgstr "Para mudar o nome da conta, você deve estar disconectado." -#: ../src/config.py:1339 ../src/config.py:1931 +#: ../src/config.py:1310 ../src/config.py:1916 msgid "Unread events" msgstr "Eventos não lidos" -#: ../src/config.py:1340 +#: ../src/config.py:1311 msgid "To change the account name, you must read all pending events." msgstr "Para mudar o nome da conta, você deve ler todas os eventos pendentes." -#: ../src/config.py:1344 +#: ../src/config.py:1315 msgid "Account Name Already Used" msgstr "Nome de conta já está em uso" -#: ../src/config.py:1345 +#: ../src/config.py:1316 msgid "" "This name is already used by another of your accounts. Please choose another " "name." @@ -2731,175 +2751,174 @@ msgstr "" "Este nome já está sendo usado por outra de suas contas. Por favor, escolha " "outro nome." -#: ../src/config.py:1349 ../src/config.py:1353 +#: ../src/config.py:1320 ../src/config.py:1324 msgid "Invalid account name" msgstr "Nome de conta inválido" -#: ../src/config.py:1350 +#: ../src/config.py:1321 msgid "Account name cannot be empty." msgstr "Nome da conta não pode ser vazio." -#: ../src/config.py:1354 +#: ../src/config.py:1325 msgid "Account name cannot contain spaces." msgstr "Nome da conta não pode conter espaços." -#: ../src/config.py:1362 ../src/config.py:1368 ../src/config.py:1378 -#: ../src/config.py:3036 +#: ../src/config.py:1333 ../src/config.py:1339 ../src/config.py:1349 +#: ../src/config.py:2900 msgid "Invalid Jabber ID" msgstr "Jabber ID Inválido:" -#: ../src/config.py:1369 +#: ../src/config.py:1340 msgid "A Jabber ID must be in the form \"user@servername\"." msgstr "Um Jabber ID deve ter o seguinte formato \"usuário@nomedoservidor\"." -#: ../src/config.py:1428 +#: ../src/config.py:1399 msgid "Invalid entry" msgstr "Entrada inválida" -#: ../src/config.py:1429 +#: ../src/config.py:1400 msgid "Custom port must be a port number." msgstr "A porta do proxy deve ser um número de porta." -#: ../src/config.py:1555 ../src/common/config.py:363 +#: ../src/config.py:1528 ../src/common/config.py:367 msgid "Be right back." msgstr "Estou de volta." -#: ../src/config.py:1565 +#: ../src/config.py:1538 msgid "Relogin now?" msgstr "Re-autenticar agora?" -#: ../src/config.py:1566 +#: ../src/config.py:1539 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "Se você quer aplicar todas as mudanças, deve se re-autenticar." -#: ../src/config.py:1592 +#: ../src/config.py:1565 msgid "No such account available" msgstr "Conta não disponível" -#: ../src/config.py:1593 +#: ../src/config.py:1566 msgid "You must create your account before editing your personal information." msgstr "" "Você deve primeiro criar sua conta antes de editar suas informações pessoais." -#: ../src/config.py:1600 ../src/dialogs.py:1128 ../src/dialogs.py:1297 -#: ../src/disco.py:417 ../src/profile_window.py:307 -#: ../src/profile_window.py:373 +#: ../src/config.py:1573 ../src/dialogs.py:1190 ../src/dialogs.py:1326 +#: ../src/dialogs.py:1506 ../src/disco.py:420 ../src/profile_window.py:323 msgid "You are not connected to the server" msgstr "Você não está conectado ao servidor" -#: ../src/config.py:1601 +#: ../src/config.py:1574 msgid "Without a connection, you can not edit your personal information." msgstr "Você deve estar conectado para editar suas informações pessoais." -#: ../src/config.py:1605 +#: ../src/config.py:1578 msgid "Your server doesn't support Vcard" -msgstr "" +msgstr "Seu servidor não suporta Vcard" -#: ../src/config.py:1606 -#, fuzzy +#: ../src/config.py:1579 msgid "Your server can't save your personal information." -msgstr "" -"Você deve primeiro criar sua conta antes de editar suas informações pessoais." +msgstr "Seu servidor não pode salvar suas informações pessoais." -#: ../src/config.py:1630 ../src/config.py:3423 +#: ../src/config.py:1610 ../src/config.py:3288 msgid "Failed to get secret keys" msgstr "Falha enquanto recebia as chaves secretas" -#: ../src/config.py:1631 ../src/config.py:3424 +#: ../src/config.py:1611 ../src/config.py:3289 msgid "There was a problem retrieving your OpenPGP secret keys." msgstr "Houve um problema no recebimento de suas chaves secretas OpenPGP." -#: ../src/config.py:1634 ../src/config.py:3427 +#: ../src/config.py:1614 ../src/config.py:3292 msgid "OpenPGP Key Selection" msgstr "Seleção de Chave OpenPGP" -#: ../src/config.py:1635 ../src/config.py:3428 +#: ../src/config.py:1615 ../src/config.py:3293 msgid "Choose your OpenPGP key" msgstr "Escolha sua chave OpenPGP" #. Name column -#: ../src/config.py:1865 ../src/disco.py:741 ../src/disco.py:1467 -#: ../src/disco.py:1705 ../src/history_window.py:78 +#: ../src/config.py:1850 ../src/dialogs.py:1338 ../src/dialogs.py:1402 +#: ../src/disco.py:741 ../src/disco.py:1564 ../src/disco.py:1802 +#: ../src/history_window.py:78 msgid "Name" msgstr "Nome" -#: ../src/config.py:1868 +#: ../src/config.py:1853 ../src/dialogs.py:1341 msgid "Server" msgstr "Servidor" -#: ../src/config.py:1932 +#: ../src/config.py:1917 msgid "Read all pending events before removing this account." msgstr "Ler todos os eventos pendentes antes de remover esta conta." -#: ../src/config.py:1969 -#, fuzzy, python-format +#: ../src/config.py:1954 +#, python-format msgid "You have opened chat in account %s" -msgstr "Você não tem uma conta ativa" +msgstr "Você iniciou uma conversa usando a conta %s" -#: ../src/config.py:1970 +#: ../src/config.py:1955 msgid "All chat and groupchat windows will be closed. Do you want to continue?" -msgstr "" +msgstr "Todas as janelas de conversa e conferência serão fechadas. Confirma?" -#: ../src/config.py:2029 -#, fuzzy +#: ../src/config.py:2014 msgid "Account Local already exists." -msgstr "Nome de conta já está em uso" +msgstr "Conta local já existe." -#: ../src/config.py:2030 +#: ../src/config.py:2015 msgid "Please rename or remove it before enabling link-local messaging." msgstr "" +"Por favor renomeie ou remova-o antes de ativar troca de mensagens \"link-" +"local\"." -#: ../src/config.py:2262 +#: ../src/config.py:2111 #, python-format msgid "Edit %s" msgstr "_Editar %s" -#: ../src/config.py:2264 +#: ../src/config.py:2113 #, python-format msgid "Register to %s" msgstr "Registro para %s" -#. list at the begining -#: ../src/config.py:2336 +#. list at the beginning +#: ../src/config.py:2179 msgid "Ban List" msgstr "Lista de Banidos" -#: ../src/config.py:2337 +#: ../src/config.py:2180 msgid "Member List" msgstr "Lista de Membros" -#: ../src/config.py:2338 +#: ../src/config.py:2181 msgid "Owner List" msgstr "Lista de Donos" -#: ../src/config.py:2339 +#: ../src/config.py:2182 msgid "Administrator List" msgstr "Lista de Administradores" #. Address column #. holds JID (who said this) -#: ../src/config.py:2372 ../src/disco.py:748 ../src/history_manager.py:154 +#: ../src/config.py:2231 ../src/disco.py:748 ../src/history_manager.py:155 msgid "JID" msgstr "JID" -#: ../src/config.py:2380 +#: ../src/config.py:2239 msgid "Reason" msgstr "Razão" -#: ../src/config.py:2385 +#: ../src/config.py:2244 msgid "Nick" msgstr "Apelido" -#: ../src/config.py:2389 +#: ../src/config.py:2248 msgid "Role" msgstr "Lista" -#: ../src/config.py:2410 +#: ../src/config.py:2273 msgid "Banning..." msgstr "Banindo..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2412 +#: ../src/config.py:2275 msgid "" "Whom do you want to ban?\n" "\n" @@ -2907,11 +2926,11 @@ msgstr "" "Quem você quer banir?\n" "\n" -#: ../src/config.py:2414 +#: ../src/config.py:2277 msgid "Adding Member..." msgstr "Adicionando Membro..." -#: ../src/config.py:2415 +#: ../src/config.py:2278 msgid "" "Whom do you want to make a member?\n" "\n" @@ -2919,23 +2938,23 @@ msgstr "" "Quem você quer fazer como membro?\n" "\n" -#: ../src/config.py:2417 +#: ../src/config.py:2280 msgid "Adding Owner..." msgstr "Adicionando Proprietário..." -#: ../src/config.py:2418 +#: ../src/config.py:2281 msgid "" -"Whom do you want to make a owner?\n" +"Whom do you want to make an owner?\n" "\n" msgstr "" "Quem você quer tornar um dono?\n" "\n" -#: ../src/config.py:2420 +#: ../src/config.py:2283 msgid "Adding Administrator..." msgstr "Adicionando Administrador..." -#: ../src/config.py:2421 +#: ../src/config.py:2284 msgid "" "Whom do you want to make an administrator?\n" "\n" @@ -2943,7 +2962,7 @@ msgstr "" "Quem você quer tornar um administrador?\n" "\n" -#: ../src/config.py:2422 +#: ../src/config.py:2285 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" @@ -2959,125 +2978,127 @@ msgstr "" "4. domínio (o domínio combina por si com qualquer usuario@domínio,\n" "domínio/recurso, ou endereço contendo um subdomínio." -#: ../src/config.py:2527 +#: ../src/config.py:2389 #, python-format msgid "Removing %s account" msgstr "Removendo %s conta" -#: ../src/config.py:2544 ../src/roster_window.py:2665 +#: ../src/config.py:2406 ../src/roster_window.py:2737 msgid "Password Required" msgstr "Senha é obrigatória" -#: ../src/config.py:2545 ../src/roster_window.py:2666 +#: ../src/config.py:2407 ../src/roster_window.py:2733 #, python-format msgid "Enter your password for account %s" msgstr "Entre com a senha para conta %s" -#: ../src/config.py:2546 ../src/roster_window.py:2667 +#: ../src/config.py:2408 ../src/roster_window.py:2738 msgid "Save password" msgstr "Salvar senha" -#: ../src/config.py:2560 +#: ../src/config.py:2422 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Conta \"%s\" está conectada ao servidor" -#: ../src/config.py:2561 +#: ../src/config.py:2423 msgid "If you remove it, the connection will be lost." msgstr "Se você remover-lo, a conexão será perdida." -#: ../src/config.py:2645 -#, fuzzy +#: ../src/config.py:2508 msgid "Default" -msgstr "Deletar" +msgstr "Padrão" -#: ../src/config.py:2645 -#, fuzzy +#: ../src/config.py:2508 msgid "?print_status:All" -msgstr "Imprimir tempo:" +msgstr "?exibir_status:Todos" -#: ../src/config.py:2646 +#: ../src/config.py:2509 msgid "Enter and leave only" -msgstr "" +msgstr "Apenas entre e saia" -#: ../src/config.py:2716 -#, fuzzy +#: ../src/config.py:2510 +msgid "?print_status:None" +msgstr "?exibir_status:Nenhum" + +#: ../src/config.py:2578 msgid "New Group Chat" -msgstr "Conferência" +msgstr "Nova Conferência" -#: ../src/config.py:2748 +#: ../src/config.py:2611 msgid "This bookmark has invalid data" msgstr "Bookmark tem dados inválidos" -#: ../src/config.py:2749 +#: ../src/config.py:2612 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" "Por favor, tenha certeza que preencheu os campos servidor e sala ou remova " "este bookmark" -#: ../src/config.py:3011 +#: ../src/config.py:2875 msgid "Invalid username" msgstr "Nome de usuário inválido" -#: ../src/config.py:3012 +#: ../src/config.py:2876 msgid "You must provide a username to configure this account." msgstr "Você deve entrar com um nome para configurar esta conta." -#: ../src/config.py:3022 ../src/dialogs.py:1316 +#: ../src/config.py:2886 ../src/dialogs.py:1525 msgid "Invalid password" msgstr "Senha Inválida" -#: ../src/config.py:3023 +#: ../src/config.py:2887 msgid "You must enter a password for the new account." msgstr "Você deve entrar com uma senha para registrar uma nova conta." -#: ../src/config.py:3027 ../src/dialogs.py:1321 +#: ../src/config.py:2891 ../src/dialogs.py:1530 msgid "Passwords do not match" msgstr "Senhas não conferem" -#: ../src/config.py:3028 ../src/dialogs.py:1322 +#: ../src/config.py:2892 ../src/dialogs.py:1531 msgid "The passwords typed in both fields must be identical." msgstr "As senhas digitadas em ambos os campos devem ser idênticas." -#: ../src/config.py:3047 +#: ../src/config.py:2911 msgid "Duplicate Jabber ID" msgstr "Jabber ID Duplicado" -#: ../src/config.py:3048 +#: ../src/config.py:2912 msgid "This account is already configured in Gajim." msgstr "Esta conta já está configurada no Gajim." -#: ../src/config.py:3065 +#: ../src/config.py:2929 msgid "Account has been added successfully" msgstr "Conta foi adicionada com sucesso" -#: ../src/config.py:3066 ../src/config.py:3101 +#: ../src/config.py:2930 ../src/config.py:2965 msgid "" -"You can set advanced account options by pressing Advanced button, or later " -"by clicking in Accounts menuitem under Edit menu from the main window." +"You can set advanced account options by pressing the Advanced button, or " +"later by choosing the Accounts menuitem under the Edit menu from the main " +"window." msgstr "" -"Você pode configurar as opções avançadas da conta pressionando o Botão " -"Avançado, ou mais tarde clicando em Contas no item de menu da janela " +"Você pode configurar as opções avançadas da conta pressionando o botão " +"Avançado, ou mais tarde clicando em Contas no menu Editar da janela " "principal." -#: ../src/config.py:3100 +#: ../src/config.py:2964 msgid "Your new account has been created successfully" msgstr "Sua nova conta foi criada com sucesso" -#: ../src/config.py:3118 -msgid "An error occured during account creation" +#: ../src/config.py:2982 +msgid "An error occurred during account creation" msgstr "Um erro ocorreu durante a criação da conta" -#: ../src/config.py:3176 +#: ../src/config.py:3040 msgid "Account name is in use" msgstr "Nome de conta em uso" -#: ../src/config.py:3177 +#: ../src/config.py:3041 msgid "You already have an account using this name." msgstr "Você já tem uma conta usando este nome." -#: ../src/conversation_textview.py:273 +#: ../src/conversation_textview.py:280 msgid "" "Text below this line is what has been said since the last time you paid " "attention to this group chat" @@ -3085,65 +3106,65 @@ msgstr "" "O texto abaixo desta linha é o que foi dito desde a última vez onde você " "prestou a atenção a conferência" -#: ../src/conversation_textview.py:342 -#, fuzzy, python-format +#: ../src/conversation_textview.py:349 +#, python-format msgid "_Actions for \"%s\"" -msgstr "Ações para \"%s\"" +msgstr "_Ações para \"%s\"" -#: ../src/conversation_textview.py:354 +#: ../src/conversation_textview.py:361 msgid "Read _Wikipedia Article" msgstr "Ler Artigo da _Wikipedia" -#: ../src/conversation_textview.py:359 +#: ../src/conversation_textview.py:366 msgid "Look it up in _Dictionary" msgstr "Procurar no _Dicionário" #. we must have %s in the url if not WIKTIONARY -#: ../src/conversation_textview.py:375 +#: ../src/conversation_textview.py:382 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "URL do Dicionário não existe \"%s\" e isto não é WIKTIONARY" #. we must have %s in the url -#: ../src/conversation_textview.py:388 +#: ../src/conversation_textview.py:395 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "URL de Procura na Web não existe \"%s\"" -#: ../src/conversation_textview.py:391 +#: ../src/conversation_textview.py:398 msgid "Web _Search for it" msgstr "_Procura na Web por isto" -#: ../src/conversation_textview.py:397 +#: ../src/conversation_textview.py:404 msgid "Open as _Link" -msgstr "" +msgstr "Abrir como _Link" -#: ../src/conversation_textview.py:757 +#: ../src/conversation_textview.py:765 msgid "Yesterday" msgstr "Ontem" #. the number is >= 2 #. %i is day in year (1-365), %d (1-31) we want %i -#: ../src/conversation_textview.py:761 +#: ../src/conversation_textview.py:769 #, python-format msgid "%i days ago" msgstr "%i dias atrás" #. if we have subject, show it too! -#: ../src/conversation_textview.py:793 +#: ../src/conversation_textview.py:803 #, python-format msgid "Subject: %s\n" msgstr "Assunto: %s\n" #: ../src/dialogs.py:59 -#, fuzzy, python-format +#, python-format msgid "Contact name: %s" -msgstr "Nome do Contato %s" +msgstr "Nome do Contato: %s" #: ../src/dialogs.py:61 -#, fuzzy, python-format +#, python-format msgid "Jabber ID: %s" -msgstr "JID: %s" +msgstr "Jabber ID: %s" #: ../src/dialogs.py:211 msgid "Group" @@ -3179,27 +3200,24 @@ msgid "Please type a name for this status message" msgstr "Por favor, escreva um nome para esta mensagem de status" #: ../src/dialogs.py:417 -#, fuzzy msgid "AIM Address:" -msgstr "_Endereço:" +msgstr "Endereço AIM:" #: ../src/dialogs.py:418 msgid "GG Number:" -msgstr "" +msgstr "Número de GG:" #: ../src/dialogs.py:419 msgid "ICQ Number:" -msgstr "" +msgstr "Número de ICQ:" #: ../src/dialogs.py:420 -#, fuzzy msgid "MSN Address:" -msgstr "_Endereço:" +msgstr "Endereço MSN:" #: ../src/dialogs.py:421 -#, fuzzy msgid "Yahoo! Address:" -msgstr "Complemento:" +msgstr "Endereço Yahoo!:" #: ../src/dialogs.py:457 #, python-format @@ -3227,385 +3245,393 @@ msgstr "Contato já foi adicionado à lista" msgid "This contact is already listed in your roster." msgstr "Este contato já encontra-se em sua lista." -#: ../src/dialogs.py:665 -#, fuzzy +#: ../src/dialogs.py:668 msgid "User ID:" msgstr "ID do Usuário:" -#: ../src/dialogs.py:728 +#: ../src/dialogs.py:731 msgid "A GTK+ jabber client" msgstr "Um cliente jabber GTK+" -#: ../src/dialogs.py:729 +#: ../src/dialogs.py:732 msgid "GTK+ Version:" -msgstr "" +msgstr "Versão do GTK+:" -#: ../src/dialogs.py:730 +#: ../src/dialogs.py:733 msgid "PyGTK Version:" -msgstr "" +msgstr "Versão do PyGTK:" -#: ../src/dialogs.py:744 -#, fuzzy +#: ../src/dialogs.py:747 msgid "Current Developers:" -msgstr "Desenvolvedores Passados:" +msgstr "Desenvolvedores Atuais:" -#: ../src/dialogs.py:746 +#: ../src/dialogs.py:749 msgid "Past Developers:" msgstr "Desenvolvedores Passados:" -#: ../src/dialogs.py:756 +#: ../src/dialogs.py:759 msgid "THANKS:" msgstr "AGRADECIMENTOS:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:762 +#: ../src/dialogs.py:765 msgid "Last but not least, we would like to thank all the package maintainers." msgstr "Nós gostaríamos de agradecer todos os mantedores do pacote." #. here you write your name in the form Name FamilyName -#: ../src/dialogs.py:776 +#: ../src/dialogs.py:778 msgid "translator-credits" msgstr "" "Alfredo Jr. - Junix e Juracy Filho " -#: ../src/dialogs.py:906 -#, fuzzy, python-format +#: ../src/dialogs.py:908 +#, python-format msgid "Unable to bind to port %s." -msgstr "Impossível ingressar na sala" +msgstr "Impossível conectar à porta %s." -#: ../src/dialogs.py:907 +#: ../src/dialogs.py:909 msgid "" "Maybe you have another running instance of Gajim. File Transfer will be " -"canceled." +"cancelled." msgstr "" +"Talvez haja uma outra instância do Gajim em execução. A Transferência de " +"Arquivos será cancelada." -#: ../src/dialogs.py:1058 +#: ../src/dialogs.py:1120 #, python-format msgid "Subscription request for account %s from %s" msgstr "Solicitação de inscrição para conta %s de %s" -#: ../src/dialogs.py:1061 +#: ../src/dialogs.py:1123 #, python-format msgid "Subscription request from %s" msgstr "Solicitação de inscrição de %s" -#: ../src/dialogs.py:1121 ../src/roster_window.py:681 -#, fuzzy, python-format +#: ../src/dialogs.py:1183 ../src/roster_window.py:687 +#, python-format msgid "You are already in group chat %s" -msgstr "Você já está na sala %s" +msgstr "Você já está na conferência %s" -#: ../src/dialogs.py:1129 +#: ../src/dialogs.py:1191 msgid "You can not join a group chat unless you are connected." msgstr "" "Você não pode ingressar em uma sala de conferência até que esteja conectado." -#: ../src/dialogs.py:1144 +#: ../src/dialogs.py:1206 #, python-format msgid "Join Group Chat with account %s" msgstr "Ingressar numa conferência com a conta %s" -#: ../src/dialogs.py:1212 ../src/dialogs.py:1218 -#, fuzzy +#: ../src/dialogs.py:1274 ../src/dialogs.py:1280 +#: ../src/groupchat_control.py:1475 msgid "Invalid group chat Jabber ID" -msgstr "Jabber ID Inválido:" +msgstr "Jabber ID da conferência inválido:" -#: ../src/dialogs.py:1213 ../src/dialogs.py:1219 -#, fuzzy +#: ../src/dialogs.py:1275 ../src/dialogs.py:1281 +#: ../src/groupchat_control.py:1476 msgid "The group chat Jabber ID has not allowed characters." -msgstr "O nome da sala ou nome do servidor não é permitido alguns caracteres." +msgstr "O Jabber ID da conferência possui caracteres não permitidos." -#: ../src/dialogs.py:1225 +#: ../src/dialogs.py:1287 msgid "This is not a group chat" -msgstr "" +msgstr "Isto não é uma conferência" -#: ../src/dialogs.py:1226 -#, fuzzy, python-format +#: ../src/dialogs.py:1288 +#, python-format msgid "%s is not the name of a group chat." -msgstr "Esconder o banner na janela de conferência" +msgstr "%s não é o nome da conferência." -#: ../src/dialogs.py:1248 +#: ../src/dialogs.py:1327 +msgid "Without a connection, you can not synchronise your contacts." +msgstr "Sem uma conexão, você pode não sincronizar seus contatos." + +#: ../src/dialogs.py:1374 +msgid "This account is not connected to the server" +msgstr "Esta conta não está conectada ao servidor" + +#: ../src/dialogs.py:1375 +msgid "You cannot synchronize with an account unless it is connected." +msgstr "Você não pode sincronizar com uma conta a menos que esteja conectado." + +#: ../src/dialogs.py:1399 +msgid "Synchronise" +msgstr "Sincronizar" + +#: ../src/dialogs.py:1457 #, python-format msgid "Start Chat with account %s" msgstr "Iniciar uma conferência com a conta %s" -#: ../src/dialogs.py:1250 +#: ../src/dialogs.py:1459 msgid "Start Chat" msgstr "Iniciar conversa" -#: ../src/dialogs.py:1251 -#, fuzzy +#: ../src/dialogs.py:1460 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" msgstr "" -"Entre com o ID do do contato que você gostaria de\n" -"enviar uma mensagem:" +"Digite o apelido ou o Jabber ID do contato para o qual\n" +"você quer enviar uma messagem:" #. if offline or connecting -#: ../src/dialogs.py:1276 ../src/dialogs.py:1635 ../src/dialogs.py:1764 +#: ../src/dialogs.py:1485 ../src/dialogs.py:1844 ../src/dialogs.py:1975 msgid "Connection not available" msgstr "Conexão não disponível" -#: ../src/dialogs.py:1277 ../src/dialogs.py:1636 ../src/dialogs.py:1765 +#: ../src/dialogs.py:1486 ../src/dialogs.py:1845 ../src/dialogs.py:1976 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Por favor, tenha certeza que você está conectado com \"%s\"." -#: ../src/dialogs.py:1286 ../src/dialogs.py:1289 -#, fuzzy +#: ../src/dialogs.py:1495 ../src/dialogs.py:1498 msgid "Invalid JID" -msgstr "Jabber ID Inválido:" +msgstr "JID inválido:" -#: ../src/dialogs.py:1289 -#, fuzzy, python-format +#: ../src/dialogs.py:1498 +#, python-format msgid "Unable to parse \"%s\"." -msgstr "Impossível gravar o arquivo em %s" +msgstr "Impossível gravar o arquivo em \"%s\"." -#: ../src/dialogs.py:1298 +#: ../src/dialogs.py:1507 msgid "Without a connection, you can not change your password." msgstr "Você deve estar contectado para mudar sua senha" -#: ../src/dialogs.py:1317 +#: ../src/dialogs.py:1526 msgid "You must enter a password." msgstr "Você deve entrar com uma senha." #. img to display #. default value -#: ../src/dialogs.py:1364 ../src/notify.py:211 ../src/notify.py:411 +#: ../src/dialogs.py:1573 ../src/notify.py:212 ../src/notify.py:416 msgid "Contact Signed In" msgstr "Contato conectou" -#: ../src/dialogs.py:1366 ../src/notify.py:219 ../src/notify.py:413 +#: ../src/dialogs.py:1575 ../src/notify.py:220 ../src/notify.py:418 msgid "Contact Signed Out" msgstr "Contato desconectou" #. chat message -#: ../src/dialogs.py:1368 ../src/notify.py:238 ../src/notify.py:415 +#: ../src/dialogs.py:1577 ../src/notify.py:239 ../src/notify.py:420 msgid "New Message" msgstr "Nova Mensagem" #. single message -#: ../src/dialogs.py:1368 ../src/notify.py:223 ../src/notify.py:415 +#: ../src/dialogs.py:1577 ../src/notify.py:224 ../src/notify.py:420 msgid "New Single Message" msgstr "Nova Mensagem" #. private message -#: ../src/dialogs.py:1369 ../src/notify.py:230 ../src/notify.py:416 +#: ../src/dialogs.py:1578 ../src/notify.py:231 ../src/notify.py:421 msgid "New Private Message" msgstr "Enviar Mensagem Privada" -#: ../src/dialogs.py:1369 ../src/gajim.py:1216 ../src/notify.py:424 +#: ../src/dialogs.py:1578 ../src/gajim.py:1291 ../src/notify.py:429 msgid "New E-mail" msgstr "Novo E-Mail" -#: ../src/dialogs.py:1371 ../src/gajim.py:1369 ../src/notify.py:418 +#: ../src/dialogs.py:1580 ../src/gajim.py:1444 ../src/notify.py:423 msgid "File Transfer Request" msgstr "Solicitação de Transferência de Arquivos" -#: ../src/dialogs.py:1373 ../src/gajim.py:1188 ../src/gajim.py:1345 -#: ../src/notify.py:420 +#: ../src/dialogs.py:1582 ../src/gajim.py:1263 ../src/gajim.py:1420 +#: ../src/notify.py:425 msgid "File Transfer Error" msgstr "Erro na Transferência de Arquivos" -#: ../src/dialogs.py:1375 ../src/gajim.py:1408 ../src/gajim.py:1430 -#: ../src/gajim.py:1447 ../src/notify.py:422 +#: ../src/dialogs.py:1584 ../src/gajim.py:1483 ../src/gajim.py:1505 +#: ../src/gajim.py:1522 ../src/notify.py:427 msgid "File Transfer Completed" msgstr "Transferência do Arquivo Completa" -#: ../src/dialogs.py:1376 ../src/gajim.py:1411 ../src/notify.py:422 +#: ../src/dialogs.py:1585 ../src/gajim.py:1486 ../src/notify.py:427 msgid "File Transfer Stopped" msgstr "Transferência do Arquivo Parada" -#: ../src/dialogs.py:1378 ../src/gajim.py:1086 ../src/notify.py:426 +#: ../src/dialogs.py:1587 ../src/gajim.py:1160 ../src/notify.py:431 msgid "Groupchat Invitation" msgstr "Convite para Conferência" -#: ../src/dialogs.py:1380 ../src/notify.py:203 ../src/notify.py:428 -#, fuzzy +#: ../src/dialogs.py:1589 ../src/notify.py:204 ../src/notify.py:433 msgid "Contact Changed Status" -msgstr "Contato desconectou" +msgstr "O Contato Alterou seu Status" -#: ../src/dialogs.py:1565 -#, fuzzy, python-format +#: ../src/dialogs.py:1774 +#, python-format msgid "Single Message using account %s" -msgstr "Mensagem simples com conta %s" +msgstr "Mensagem Simples usando conta %s" -#: ../src/dialogs.py:1567 -#, fuzzy, python-format +#: ../src/dialogs.py:1776 +#, python-format msgid "Single Message in account %s" -msgstr "Mensagem simples com conta %s" +msgstr "Mensagem Simples na conta %s" -#: ../src/dialogs.py:1569 +#: ../src/dialogs.py:1778 msgid "Single Message" msgstr "Mensagem simples" #. prepare UI for Sending -#: ../src/dialogs.py:1572 +#: ../src/dialogs.py:1781 #, python-format msgid "Send %s" msgstr "Enviar %s" #. prepare UI for Receiving -#: ../src/dialogs.py:1595 +#: ../src/dialogs.py:1804 #, python-format msgid "Received %s" msgstr "Recebido %s" #. we create a new blank window to send and we preset RE: and to jid -#: ../src/dialogs.py:1667 +#: ../src/dialogs.py:1876 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:1668 +#: ../src/dialogs.py:1877 #, python-format msgid "%s wrote:\n" msgstr "%s escreveu:\n" -#: ../src/dialogs.py:1712 +#: ../src/dialogs.py:1921 #, python-format msgid "XML Console for %s" msgstr "Console XML para %s" -#: ../src/dialogs.py:1714 +#: ../src/dialogs.py:1923 msgid "XML Console" msgstr "Console XML" -#: ../src/dialogs.py:1835 +#: ../src/dialogs.py:2046 #, python-format msgid "Privacy List %s" -msgstr "" +msgstr "Lista de Privacidade %s" -#: ../src/dialogs.py:1839 +#: ../src/dialogs.py:2050 #, python-format msgid "Privacy List for %s" -msgstr "" +msgstr "Lista de Privacidade para %s" -#: ../src/dialogs.py:1887 +#: ../src/dialogs.py:2098 #, python-format msgid "Order: %s, action: %s, type: %s, value: %s" -msgstr "" +msgstr "Ordem: %s, ação: %s tipo: %s, valor: %s" -#: ../src/dialogs.py:1890 -#, fuzzy, python-format +#: ../src/dialogs.py:2101 +#, python-format msgid "Order: %s, action: %s" -msgstr "Descrição: %s" +msgstr "Ordem: %s, ação: %s" -#: ../src/dialogs.py:1932 -#, fuzzy +#: ../src/dialogs.py:2143 msgid "Edit a rule" -msgstr "Formato da linha" +msgstr "Editar uma regra" -#: ../src/dialogs.py:2019 -#, fuzzy +#: ../src/dialogs.py:2230 msgid "Add a rule" -msgstr "Formato da linha" +msgstr "Adicionar uma regra" -#: ../src/dialogs.py:2115 +#: ../src/dialogs.py:2326 #, python-format msgid "Privacy Lists for %s" -msgstr "" +msgstr "Lista de Privacidade para %s" -#: ../src/dialogs.py:2117 -#, fuzzy +#: ../src/dialogs.py:2328 msgid "Privacy Lists" -msgstr "ConversasPrivada" +msgstr "Listas de Privacidade" -#: ../src/dialogs.py:2185 -#, fuzzy +#: ../src/dialogs.py:2398 msgid "Invalid List Name" -msgstr "Nome de usuário inválido" +msgstr "Nome de Lista Inválido" -#: ../src/dialogs.py:2186 -#, fuzzy +#: ../src/dialogs.py:2399 msgid "You must enter a name to create a privacy list." -msgstr "Você deve entrar com uma senha para registrar uma nova conta." +msgstr "Você deve digitar um nome para criar uma lista de privacidade." -#. FIXME: use nickname instead of contact_jid -#: ../src/dialogs.py:2220 -#, fuzzy, python-format -msgid "%(contact_jid)s has invited you to group chat %(room_jid)s" -msgstr "%(contact_jid)s lhe convidou para sala %(room_jid)s" +#. Don't translate $Contact +#: ../src/dialogs.py:2433 +#, python-format +msgid "$Contact has invited you to group chat %(room_jid)s" +msgstr "$Contact convidou você para entrar na conferência %(room_jid)s" #. only if not None and not '' -#: ../src/dialogs.py:2226 +#: ../src/dialogs.py:2445 #, python-format msgid "Comment: %s" msgstr "Comentário: %s" -#: ../src/dialogs.py:2288 +#: ../src/dialogs.py:2507 msgid "Choose Sound" msgstr "Escolher Som" -#: ../src/dialogs.py:2298 ../src/dialogs.py:2343 +#: ../src/dialogs.py:2517 ../src/dialogs.py:2562 msgid "All files" msgstr "Todos os arquivos" -#: ../src/dialogs.py:2303 +#: ../src/dialogs.py:2522 msgid "Wav Sounds" msgstr "Sons Wav" -#: ../src/dialogs.py:2333 +#: ../src/dialogs.py:2552 msgid "Choose Image" msgstr "Escolha imagem" -#: ../src/dialogs.py:2348 +#: ../src/dialogs.py:2567 msgid "Images" msgstr "Imagens" -#: ../src/dialogs.py:2405 +#: ../src/dialogs.py:2624 #, python-format msgid "When %s becomes:" msgstr "Quando %s chega:" -#: ../src/dialogs.py:2407 +#: ../src/dialogs.py:2626 #, python-format msgid "Adding Special Notification for %s" msgstr "Adicionando Notificação Especial para %s" #. # means number -#: ../src/dialogs.py:2478 +#: ../src/dialogs.py:2697 msgid "#" -msgstr "" +msgstr "#" -#: ../src/dialogs.py:2484 -#, fuzzy +#: ../src/dialogs.py:2703 msgid "Condition" -msgstr "Conexão" +msgstr "Condição" -#: ../src/dialogs.py:2605 +#: ../src/dialogs.py:2824 msgid "when I am " -msgstr "" +msgstr "quando eu estiver" -#: ../src/disco.py:101 +#: ../src/disco.py:104 msgid "Others" msgstr "Outros" -#: ../src/disco.py:102 ../src/disco.py:103 ../src/disco.py:1253 -#: ../src/gajim.py:539 ../src/roster_window.py:267 ../src/roster_window.py:325 -#: ../src/roster_window.py:364 ../src/roster_window.py:445 -#: ../src/roster_window.py:477 ../src/roster_window.py:479 -#: ../src/roster_window.py:3828 ../src/roster_window.py:3830 -#: ../src/common/helpers.py:42 +#: ../src/disco.py:105 ../src/disco.py:106 ../src/disco.py:1350 +#: ../src/gajim.py:604 ../src/roster_window.py:272 ../src/roster_window.py:330 +#: ../src/roster_window.py:369 ../src/roster_window.py:451 +#: ../src/roster_window.py:483 ../src/roster_window.py:485 +#: ../src/roster_window.py:3920 ../src/roster_window.py:3922 +#: ../src/common/contacts.py:267 ../src/common/contacts.py:282 +#: ../src/common/helpers.py:43 msgid "Transports" msgstr "Transportes" #. conference is a category for listing mostly groupchats in service discovery -#: ../src/disco.py:105 +#: ../src/disco.py:108 msgid "Conference" msgstr "Conferência" -#: ../src/disco.py:418 +#: ../src/disco.py:421 msgid "Without a connection, you can not browse available services" msgstr "Você deve estar conectado para visualizar os serviços disponíveis" -#: ../src/disco.py:497 +#: ../src/disco.py:500 #, python-format msgid "Service Discovery using account %s" msgstr "Buscar Serviços usando conta %s" -#: ../src/disco.py:499 +#: ../src/disco.py:502 msgid "Service Discovery" msgstr "Buscar Serviços" @@ -3642,47 +3668,50 @@ msgstr "_Navegar" msgid "This service does not contain any items to browse." msgstr "Este serviço não contém nenhum item para navegar." -#: ../src/disco.py:1143 ../src/disco.py:1258 +#: ../src/disco.py:1147 +#, fuzzy +msgid "_Execute Command" +msgstr "_Executar Comando" + +#: ../src/disco.py:1157 ../src/disco.py:1355 msgid "Re_gister" msgstr "Re_gistrar" -#: ../src/disco.py:1295 +#: ../src/disco.py:1392 #, python-format msgid "Scanning %d / %d.." msgstr "Buscando %d / %d" #. Users column -#: ../src/disco.py:1476 +#: ../src/disco.py:1573 msgid "Users" msgstr "Usuários" #. Description column -#: ../src/disco.py:1483 +#: ../src/disco.py:1580 msgid "Description" msgstr "Descrição" #. Id column -#: ../src/disco.py:1490 +#: ../src/disco.py:1587 msgid "Id" -msgstr "" +msgstr "Id" -#: ../src/disco.py:1713 -#, fuzzy +#: ../src/disco.py:1810 msgid "Subscribed" -msgstr "Inscrever" +msgstr "Inscrito" -#: ../src/disco.py:1739 +#: ../src/disco.py:1836 msgid "New post" -msgstr "" +msgstr "Nova postagem" -#: ../src/disco.py:1745 +#: ../src/disco.py:1842 msgid "_Subscribe" msgstr "_Inscrever" -#: ../src/disco.py:1751 -#, fuzzy +#: ../src/disco.py:1848 msgid "_Unsubscribe" -msgstr "_Inscrever" +msgstr "_Desinscrever" #: ../src/filetransfers_window.py:72 msgid "File" @@ -3696,132 +3725,134 @@ msgstr "Tempo" msgid "Progress" msgstr "Progresso" -#: ../src/filetransfers_window.py:163 ../src/filetransfers_window.py:223 +#: ../src/filetransfers_window.py:161 ../src/filetransfers_window.py:215 #, python-format msgid "Filename: %s" msgstr "Nome do arquivo: %s" -#: ../src/filetransfers_window.py:164 ../src/filetransfers_window.py:298 +#: ../src/filetransfers_window.py:162 ../src/filetransfers_window.py:290 #, python-format msgid "Size: %s" msgstr "Tamanho: %s" #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:183 +#: ../src/filetransfers_window.py:171 ../src/filetransfers_window.py:181 #: ../src/history_manager.py:463 msgid "You" msgstr "Você" -#: ../src/filetransfers_window.py:174 +#: ../src/filetransfers_window.py:172 #, python-format msgid "Sender: %s" msgstr "Remetente: %s" -#: ../src/filetransfers_window.py:175 ../src/filetransfers_window.py:572 -#: ../src/tooltips.py:573 +#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:564 +#: ../src/tooltips.py:575 msgid "Recipient: " msgstr "Destinatário: " -#: ../src/filetransfers_window.py:186 +#: ../src/filetransfers_window.py:184 #, python-format msgid "Saved in: %s" msgstr "Salvo em: %s" -#: ../src/filetransfers_window.py:188 +#: ../src/filetransfers_window.py:186 msgid "File transfer completed" msgstr "Transferência de arquivos completa" -#: ../src/filetransfers_window.py:204 ../src/filetransfers_window.py:212 -msgid "File transfer canceled" +#: ../src/filetransfers_window.py:200 ../src/filetransfers_window.py:206 +msgid "File transfer cancelled" msgstr "Transferência de arquivos cancelada" -#: ../src/filetransfers_window.py:204 ../src/filetransfers_window.py:213 +#: ../src/filetransfers_window.py:200 ../src/filetransfers_window.py:207 msgid "Connection with peer cannot be established." msgstr "Conexão ponto a ponto não pode ser estabelecida." -#: ../src/filetransfers_window.py:224 -#, fuzzy, python-format +#: ../src/filetransfers_window.py:216 +#, python-format msgid "Recipient: %s" -msgstr "Destinatário: " +msgstr "Conteúdo: %s" -#: ../src/filetransfers_window.py:226 -#, fuzzy, python-format +#: ../src/filetransfers_window.py:218 +#, python-format msgid "Error message: %s" -msgstr "Entre com sua mensagem:" +msgstr "Mensagem de erro: %s" -#: ../src/filetransfers_window.py:227 -msgid "File transfer stopped by the contact of the other side" +#: ../src/filetransfers_window.py:219 +msgid "File transfer stopped by the contact at the other end" msgstr "Transferência de arquivo parada pelo contato do outro lado" -#: ../src/filetransfers_window.py:244 +#: ../src/filetransfers_window.py:236 msgid "Choose File to Send..." msgstr "Escolha o Arquivo para Enviar..." -#: ../src/filetransfers_window.py:263 +#: ../src/filetransfers_window.py:255 msgid "Gajim cannot access this file" msgstr "Gajim não pode acessar este arquivo" -#: ../src/filetransfers_window.py:264 +#: ../src/filetransfers_window.py:256 msgid "This file is being used by another process." msgstr "Este arquivo está sendo usado por outro processo." -#: ../src/filetransfers_window.py:296 +#: ../src/filetransfers_window.py:288 #, python-format msgid "File: %s" msgstr "Arquivo: %s" -#: ../src/filetransfers_window.py:301 +#: ../src/filetransfers_window.py:293 #, python-format msgid "Type: %s" msgstr "Tipo: %s" -#: ../src/filetransfers_window.py:303 +#: ../src/filetransfers_window.py:295 #, python-format msgid "Description: %s" msgstr "Descrição: %s" -#: ../src/filetransfers_window.py:304 +#: ../src/filetransfers_window.py:296 #, python-format msgid "%s wants to send you a file:" msgstr "%s quer te enviar um arquivo:" -#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:683 +#: ../src/filetransfers_window.py:310 ../src/gtkgui_helpers.py:750 #, python-format msgid "Cannot overwrite existing file \"%s\"" -msgstr "" +msgstr "Não é possível sobrescrever o arquivo \"%s\"" -#: ../src/filetransfers_window.py:319 ../src/gtkgui_helpers.py:685 +#: ../src/filetransfers_window.py:311 ../src/gtkgui_helpers.py:752 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "" +"Um arquivo com este nome já existe e você não tem permissão para sobrescrevê-" +"lo." -#: ../src/filetransfers_window.py:326 ../src/gtkgui_helpers.py:689 +#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:756 msgid "This file already exists" msgstr "Este arquivo já existe" -#: ../src/filetransfers_window.py:326 ../src/gtkgui_helpers.py:689 +#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:756 msgid "What do you want to do?" msgstr "O que você quer fazer?" -#: ../src/filetransfers_window.py:338 ../src/gtkgui_helpers.py:699 +#: ../src/filetransfers_window.py:330 ../src/gtkgui_helpers.py:766 #, python-format msgid "Directory \"%s\" is not writable" -msgstr "" +msgstr "O diretório \"%s\" não é gravável" -#: ../src/filetransfers_window.py:338 ../src/gtkgui_helpers.py:700 +#: ../src/filetransfers_window.py:330 ../src/gtkgui_helpers.py:767 msgid "You do not have permission to create files in this directory." -msgstr "" +msgstr "Você não tem permissão para criar este diretório" -#: ../src/filetransfers_window.py:348 +#: ../src/filetransfers_window.py:340 msgid "Save File as..." msgstr "Salvar Arquivo como..." #. 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:429 +#: ../src/filetransfers_window.py:421 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -3829,60 +3860,65 @@ 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:505 +#: ../src/filetransfers_window.py:497 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" -#: ../src/filetransfers_window.py:544 ../src/filetransfers_window.py:547 +#: ../src/filetransfers_window.py:536 ../src/filetransfers_window.py:539 msgid "Invalid File" msgstr "Arquivo inválido" -#: ../src/filetransfers_window.py:544 +#: ../src/filetransfers_window.py:536 msgid "File: " msgstr "Arquivo:" -#: ../src/filetransfers_window.py:548 +#: ../src/filetransfers_window.py:540 msgid "It is not possible to send empty files" msgstr "não é possível enviar arquivos vazios" -#: ../src/filetransfers_window.py:568 ../src/tooltips.py:563 +#: ../src/filetransfers_window.py:560 ../src/tooltips.py:565 msgid "Name: " msgstr "Nome: " -#: ../src/filetransfers_window.py:570 ../src/tooltips.py:567 +#: ../src/filetransfers_window.py:562 ../src/tooltips.py:569 msgid "Sender: " msgstr "Remetente: " -#: ../src/filetransfers_window.py:758 +#: ../src/filetransfers_window.py:750 msgid "Pause" msgstr "Pausa" #: ../src/gajim.py:47 -msgid "Gajim needs Xserver to run. Quiting..." -msgstr "Gajim necessita do Xserver para rodar. Encerrando..." +#, python-format +msgid "%s is not a valid loglevel" +msgstr "%s não é um nível de registro (loglevel) válido" -#: ../src/gajim.py:51 -msgid "Gajim needs PyGTK 2.6 or above" -msgstr "Gajim necessita PyGTK 2.6 ou acima" +#: ../src/gajim.py:122 +msgid "Gajim needs X server to run. Quiting..." +msgstr "O Gajim necessita do servidor X para rodar. Encerrando..." -#: ../src/gajim.py:52 -msgid "Gajim needs PyGTK 2.6 or above to run. Quiting..." -msgstr "Gajim necessita PyGTK 2.6 ou acima para rodar. Encerrando..." +#: ../src/gajim.py:126 +msgid "Gajim needs PyGTK 2.8 or above" +msgstr "O Gajim necessita do PyGTK 2.8 ou superior" -#: ../src/gajim.py:54 -msgid "Gajim needs GTK 2.6 or above" -msgstr "Gajim necessita GTK 2.6 ou acima" +#: ../src/gajim.py:127 +msgid "Gajim needs PyGTK 2.8 or above to run. Quiting..." +msgstr "O Gajim necessita do PyGTK 2.8 ou superior para rodar. Encerrando..." -#: ../src/gajim.py:55 -msgid "Gajim needs GTK 2.6 or above to run. Quiting..." -msgstr "Gajim necessita GTK 2.6 ou acima para rodar. Encerrando..." +#: ../src/gajim.py:129 +msgid "Gajim needs GTK 2.8 or above" +msgstr "O Gajim necessita do GTK 2.8 ou superior" -#: ../src/gajim.py:60 +#: ../src/gajim.py:130 +msgid "Gajim needs GTK 2.8 or above to run. Quiting..." +msgstr "O Gajim necessita do GTK 2.8 ou superior para rodar. Encerrando..." + +#: ../src/gajim.py:135 msgid "GTK+ runtime is missing libglade support" msgstr "Não existe suporte para libglade no GTK+ runtime" -#: ../src/gajim.py:62 +#: ../src/gajim.py:137 #, python-format msgid "" "Please remove your current GTK+ runtime and install the latest stable " @@ -3891,217 +3927,238 @@ msgstr "" "Por favor remova seu GTK+ runtime atual e instale a última versão estável de " "%s" -#: ../src/gajim.py:64 +#: ../src/gajim.py:139 msgid "" "Please make sure that GTK+ and PyGTK have libglade support in your system." msgstr "" "Por favor certifique-se de que o GTK e o PyGTK tem suporte ao libglade em " "seu sistema." -#: ../src/gajim.py:69 +#: ../src/gajim.py:144 msgid "Gajim needs PySQLite2 to run" msgstr "Gajim necessita de PySQLite2 para rodar" -#: ../src/gajim.py:77 -#, fuzzy +#: ../src/gajim.py:152 msgid "Gajim needs pywin32 to run" -msgstr "Gajim necessita de PySQLite2 para rodar" +msgstr "O Gajim precisa do pywin32 para rodar" -#: ../src/gajim.py:78 +#: ../src/gajim.py:153 #, python-format msgid "" "Please make sure that Pywin32 is installed on your system. You can get it at " "%s" msgstr "" +"Por favor certifique-se de que o PyWin32 está instalado em seu sistema. Você " +"pode obtê-lo em %s" #. set the icon to all newly opened wind -#: ../src/gajim.py:238 +#: ../src/gajim.py:300 msgid "Gajim is already running" -msgstr "" +msgstr "O Gajim já está em execução" -#: ../src/gajim.py:239 +#: ../src/gajim.py:301 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" msgstr "" +"Outra instância do Gajim parece estar rodando\n" +"Executar de qualquer forma?" -#: ../src/gajim.py:346 +#: ../src/gajim.py:408 #, python-format msgid "HTTP (%s) Authorization for %s (id: %s)" msgstr "Autorização HTTP (%s) para %s (id: %s)" -#: ../src/gajim.py:347 +#: ../src/gajim.py:409 msgid "Do you accept this request?" msgstr "Você aceita a solicitação?" -#: ../src/gajim.py:393 ../src/notify.py:430 -#, fuzzy +#: ../src/gajim.py:455 ../src/notify.py:435 msgid "Connection Failed" -msgstr "Conexão" +msgstr "Falha na Conexão" -#: ../src/gajim.py:706 -#, fuzzy, python-format +#: ../src/gajim.py:775 +#, python-format msgid "Subject: %s" -msgstr "Assunto: %s\n" +msgstr "Assunto: %s" #. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) -#: ../src/gajim.py:751 ../src/gajim.py:764 +#: ../src/gajim.py:820 ../src/gajim.py:833 #, python-format msgid "error while sending %s ( %s )" msgstr "erro no envio %s ( %s )" -#: ../src/gajim.py:797 +#: ../src/gajim.py:866 msgid "Authorization accepted" msgstr "Autorização aceita" -#: ../src/gajim.py:798 +#: ../src/gajim.py:867 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "O contato \"%s\" autorizou você para ver seu status." -#: ../src/gajim.py:806 +#: ../src/gajim.py:875 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Contato \"%s\" removeu sua inscrição" -#: ../src/gajim.py:807 +#: ../src/gajim.py:876 msgid "You will always see him or her as offline." msgstr "Você sempre o verá como offline." -#: ../src/gajim.py:850 +#: ../src/gajim.py:920 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Contato com \"%s\" não pode ser estabelecido" -#: ../src/gajim.py:851 ../src/common/connection.py:406 +#: ../src/gajim.py:921 ../src/common/connection.py:435 msgid "Check your connection or try again later." msgstr "Verifique sua conexão ou tente novamente mais tarde." -#: ../src/gajim.py:999 ../src/roster_window.py:1197 +#: ../src/gajim.py:1070 ../src/roster_window.py:1218 #, python-format msgid "%s is now %s (%s)" msgstr "%s agora está %s (%s)" -#: ../src/gajim.py:1096 +#. No status message +#: ../src/gajim.py:1073 ../src/groupchat_control.py:968 +#: ../src/roster_window.py:1221 +#, python-format +msgid "%s is now %s" +msgstr "%s agora está %s" + +#: ../src/gajim.py:1170 msgid "Your passphrase is incorrect" msgstr "Sua frase de acesso está incorreta" -#: ../src/gajim.py:1097 +#: ../src/gajim.py:1171 msgid "You are currently connected without your OpenPGP key." msgstr "Você está atualmente conectado sem sua chave OpenPGP." -#: ../src/gajim.py:1199 -#, fuzzy, python-format +#: ../src/gajim.py:1274 +#, python-format msgid "New mail on %(gmail_mail_address)s" -msgstr "Novo E-mail em %(gmail_mail_address)s" +msgstr "Novo email em %(gmail_mail_address)s" -#: ../src/gajim.py:1201 -#, fuzzy, python-format +#: ../src/gajim.py:1276 +#, python-format msgid "You have %d new mail conversation" msgid_plural "You have %d new mail conversations" -msgstr[0] "Você tem %d nova mensagem de E-mail" -msgstr[1] "Você tem %d novas mensagens de E-mail" +msgstr[0] "Você tem %d nova mensagem de email" +msgstr[1] "Você tem %d novas mensagens de email" #. FIXME: emulate Gtalk client popups. find out what they parse and how #. they decide what to show #. each message has a 'From', 'Subject' and 'Snippet' field -#: ../src/gajim.py:1210 +#: ../src/gajim.py:1285 #, python-format msgid "" "\n" "From: %(from_address)s" msgstr "" +"\n" +"De: %(from_address)s" -#: ../src/gajim.py:1366 +#: ../src/gajim.py:1441 #, python-format msgid "%s wants to send you a file." msgstr "%s quer te enviar um arquivo:" -#: ../src/gajim.py:1431 +#: ../src/gajim.py:1506 #, python-format msgid "You successfully received %(filename)s from %(name)s." msgstr "Você recebeu com sucesso %(filename)s de %(name)s." #. ft stopped -#: ../src/gajim.py:1435 +#: ../src/gajim.py:1510 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Transferência de arquivo de %(filename)s de %(name)s parou." -#: ../src/gajim.py:1448 +#: ../src/gajim.py:1523 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Você enviou com sucesso o %(filename)s a %(name)s." #. ft stopped -#: ../src/gajim.py:1452 +#: ../src/gajim.py:1527 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Transferência de arquivo de %(filename)s to %(name)s parado." -#: ../src/gajim.py:1558 +#: ../src/gajim.py:1640 msgid "Username Conflict" +msgstr "Conflito de nome de usuário" + +#: ../src/gajim.py:1641 +msgid "Please type a new username for your local account" +msgstr "Por favor digite um novo nome de usuário para sua conta local" + +#: ../src/gajim.py:1658 +msgid "Ping?" msgstr "" -#: ../src/gajim.py:1559 -#, fuzzy -msgid "Please type a new username for your local account" -msgstr "Por favor preencha os dados para sua nova conta" +#: ../src/gajim.py:1666 +#, python-format +msgid "Pong! (%s s.)" +msgstr "" + +#: ../src/gajim.py:1672 +msgid "Error." +msgstr "" #. it is good to notify the user #. in case he or she cannot see the output of the console -#: ../src/gajim.py:1898 +#: ../src/gajim.py:2012 msgid "Could not save your settings and preferences" msgstr "Impossível salvar suas preferências" -#: ../src/gajim.py:2090 -#, fuzzy +#: ../src/gajim.py:2211 msgid "Network Manager support not available" -msgstr "Uma conexão não está disponível" +msgstr "Não há suporte disponível para o Network Manager" -#: ../src/gajim.py:2165 +#: ../src/gajim.py:2290 msgid "Session Management support not available (missing gnome.ui module)" msgstr "" "Suporte de gerenciamento da sessão não disponível (faltando o módulo gnome." "ui)" -#: ../src/gajim-remote.py:66 -#, fuzzy +#: ../src/gajim-remote.py:65 msgid "Shows a help on specific command" -msgstr "mostrar ajuda para um comando específico" +msgstr "Mostra uma ajuda para um comando específico" #. User gets help for the command, specified by this parameter -#: ../src/gajim-remote.py:69 +#: ../src/gajim-remote.py:68 msgid "command" msgstr "comando" -#: ../src/gajim-remote.py:70 +#: ../src/gajim-remote.py:69 msgid "show help on command" msgstr "mostrar ajuda no comando" -#: ../src/gajim-remote.py:74 +#: ../src/gajim-remote.py:73 msgid "Shows or hides the roster window" msgstr "Mostrar ou esconder a janela principal" -#: ../src/gajim-remote.py:78 -#, fuzzy -msgid "Popups a window with the next pending event" -msgstr "Mostrar uma janela com a próxima mensagem não lida" +#: ../src/gajim-remote.py:77 +msgid "Pops up a window with the next pending event" +msgstr "Exibir uma janela popup com o próximo evento pendente" -#: ../src/gajim-remote.py:82 +#: ../src/gajim-remote.py:81 msgid "" -"Prints a list of all contacts in the roster. Each contact appear on a " +"Prints a list of all contacts in the roster. Each contact appears on a " "separate line" msgstr "" -"Imprimir uma lista de todos os contatos na lista. Cada contato aparecerá em " +"Exibir uma lista de todos os contatos na lista. Cada contato aparecerá em " "uma linha separada" -#: ../src/gajim-remote.py:84 ../src/gajim-remote.py:98 -#: ../src/gajim-remote.py:108 ../src/gajim-remote.py:121 -#: ../src/gajim-remote.py:135 ../src/gajim-remote.py:156 -#: ../src/gajim-remote.py:186 ../src/gajim-remote.py:195 -#: ../src/gajim-remote.py:202 ../src/gajim-remote.py:209 -#: ../src/gajim-remote.py:220 +#: ../src/gajim-remote.py:84 ../src/gajim-remote.py:99 +#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:122 +#: ../src/gajim-remote.py:136 ../src/gajim-remote.py:157 +#: ../src/gajim-remote.py:187 ../src/gajim-remote.py:196 +#: ../src/gajim-remote.py:203 ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:237 +#: ../src/gajim-remote.py:246 msgid "account" msgstr "conta" @@ -4109,34 +4166,34 @@ msgstr "conta" msgid "show only contacts of the given account" msgstr "mostrar somente os contatos desta conta" -#: ../src/gajim-remote.py:89 +#: ../src/gajim-remote.py:90 msgid "Prints a list of registered accounts" msgstr "Imprimir uma lista das contas registradas" -#: ../src/gajim-remote.py:93 +#: ../src/gajim-remote.py:94 msgid "Changes the status of account or accounts" msgstr "Mudar o status da conta ou contas" #. offline, online, chat, away, xa, dnd, invisible should not be translated -#: ../src/gajim-remote.py:96 +#: ../src/gajim-remote.py:97 msgid "status" msgstr "status" -#: ../src/gajim-remote.py:96 +#: ../src/gajim-remote.py:97 msgid "one of: offline, online, chat, away, xa, dnd, invisible " msgstr "" "um desses: desconectado, conectado, bate-papo, inativo, fora, np, invisível" -#: ../src/gajim-remote.py:97 ../src/gajim-remote.py:118 -#: ../src/gajim-remote.py:132 +#: ../src/gajim-remote.py:98 ../src/gajim-remote.py:119 +#: ../src/gajim-remote.py:133 msgid "message" msgstr "mensagem" -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:98 msgid "status message" msgstr "mensagem de status" -#: ../src/gajim-remote.py:98 +#: ../src/gajim-remote.py:99 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" @@ -4145,199 +4202,218 @@ msgstr "" "status de todas as contas existentes com a opção \"sincronizar com status " "global\" marcada" -#: ../src/gajim-remote.py:104 +#: ../src/gajim-remote.py:105 msgid "Shows the chat dialog so that you can send messages to a contact" msgstr "" "Mostrar o diálogo do bate-papo onde você pode enviar mensagens para um " "contato" -#: ../src/gajim-remote.py:106 +#: ../src/gajim-remote.py:107 msgid "JID of the contact that you want to chat with" msgstr "JID do contato que você quer conversar" -#: ../src/gajim-remote.py:108 ../src/gajim-remote.py:186 +#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:187 msgid "if specified, contact is taken from the contact list of this account" msgstr "se especificado, o contato é feito da lista de contatos desta conta" -#: ../src/gajim-remote.py:113 -#, fuzzy +#: ../src/gajim-remote.py:114 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 " "key', just set 'OpenPGP key' to ''." msgstr "" -"Envia nova mensagem para um contato na lista. Tanto a chave OpenPGP e a " -"conta são opcionais. Se vc quer configurar somente a 'conta', sem a 'chave " -"pgp', apenas configure a 'chave pgp' para ''." +"Envia nova mensagem para um contato na lista. Ambas chave OpenPGP e conta " +"são opcionais. Se você quer configurar somente a 'conta', sem a 'chave " +"OpenPGP', apenas configure a 'chave para ''." -#: ../src/gajim-remote.py:117 ../src/gajim-remote.py:130 +#: ../src/gajim-remote.py:118 ../src/gajim-remote.py:131 msgid "JID of the contact that will receive the message" msgstr "JID do contato que irá receber a mensagem" -#: ../src/gajim-remote.py:118 ../src/gajim-remote.py:132 +#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 msgid "message contents" msgstr "conteúdos da mensagem" -#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 msgid "pgp key" msgstr "chave pgp" -#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 msgid "if specified, the message will be encrypted using this public key" msgstr "" "se especificada, a mensagem será criptografada usando esta chave pública" -#: ../src/gajim-remote.py:121 ../src/gajim-remote.py:135 +#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:136 msgid "if specified, the message will be sent using this account" msgstr "se especificada, a mensagem será enviada usando esta conta" -#: ../src/gajim-remote.py:126 -#, fuzzy +#: ../src/gajim-remote.py:127 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 " "key', just set 'OpenPGP key' to ''." msgstr "" -"Envia nova mensagem para um contato na lista. Tanto a chave OpenPGP e a " -"conta são opcionais. Se vc quer configurar somente a 'conta', sem a 'chave " -"pgp', apenas configure a 'chave pgp' para ''." +"Envia uma nova mensagem para um contato na lista. Ambas chave OpenPGP e " +"conta são opcionais. Se você quer configurar somente a 'conta', sem a 'chave " +"OpenPGP, apenas configure a 'chave OpenPGP' para ''." -#: ../src/gajim-remote.py:131 -#, fuzzy +#: ../src/gajim-remote.py:132 msgid "subject" -msgstr "Assunto" +msgstr "assunto" -#: ../src/gajim-remote.py:131 -#, fuzzy +#: ../src/gajim-remote.py:132 msgid "message subject" -msgstr "Mensagem Enviada" +msgstr "assunto da mensagem" -#: ../src/gajim-remote.py:140 +#: ../src/gajim-remote.py:141 msgid "Gets detailed info on a contact" msgstr "Informações detalhadas do contato" -#: ../src/gajim-remote.py:142 ../src/gajim-remote.py:155 -#: ../src/gajim-remote.py:185 ../src/gajim-remote.py:194 +#: ../src/gajim-remote.py:143 ../src/gajim-remote.py:156 +#: ../src/gajim-remote.py:186 ../src/gajim-remote.py:195 msgid "JID of the contact" msgstr "JID do contato" -#: ../src/gajim-remote.py:146 +#: ../src/gajim-remote.py:147 msgid "Gets detailed info on a account" msgstr "Informações detalhadas do contato" -#: ../src/gajim-remote.py:148 +#: ../src/gajim-remote.py:149 msgid "Name of the account" msgstr "Nome da conta" -#: ../src/gajim-remote.py:152 +#: ../src/gajim-remote.py:153 msgid "Sends file to a contact" msgstr "Enviar arquivo para um contato" -#: ../src/gajim-remote.py:154 +#: ../src/gajim-remote.py:155 msgid "file" msgstr "arquivo" -#: ../src/gajim-remote.py:154 +#: ../src/gajim-remote.py:155 msgid "File path" msgstr "Caminho do arquivo" -#: ../src/gajim-remote.py:156 +#: ../src/gajim-remote.py:157 msgid "if specified, file will be sent using this account" msgstr "se especificada, arquivo irá ser enviado usando esta conta" -#: ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:162 msgid "Lists all preferences and their values" msgstr "Lista todas as preferências e seus valores" -#: ../src/gajim-remote.py:165 +#: ../src/gajim-remote.py:166 msgid "Sets value of 'key' to 'value'." msgstr "Ajusta o valor da 'chave' ao 'valor '." -#: ../src/gajim-remote.py:167 +#: ../src/gajim-remote.py:168 msgid "key=value" msgstr "chave=valor" -#: ../src/gajim-remote.py:167 +#: ../src/gajim-remote.py:168 msgid "'key' is the name of the preference, 'value' is the value to set it to" msgstr "'chave' é o nome de preferência, 'valor' é o valor para ajustá-la" -#: ../src/gajim-remote.py:172 +#: ../src/gajim-remote.py:173 msgid "Deletes a preference item" msgstr "Deleta um item de preferência" -#: ../src/gajim-remote.py:174 +#: ../src/gajim-remote.py:175 msgid "key" msgstr "chave" -#: ../src/gajim-remote.py:174 +#: ../src/gajim-remote.py:175 msgid "name of the preference to be deleted" msgstr "nome da preferência a ser deletado" -#: ../src/gajim-remote.py:178 +#: ../src/gajim-remote.py:179 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Escreve o estado atual das preferências do Gajim em um arquivo .config" -#: ../src/gajim-remote.py:183 +#: ../src/gajim-remote.py:184 msgid "Removes contact from roster" msgstr "Remover contato da lista" -#: ../src/gajim-remote.py:192 +#: ../src/gajim-remote.py:193 msgid "Adds contact to roster" msgstr "Adicionar contato para a lista" -#: ../src/gajim-remote.py:194 -msgid "jid" -msgstr "" - #: ../src/gajim-remote.py:195 -#, fuzzy +msgid "jid" +msgstr "JID" + +#: ../src/gajim-remote.py:196 msgid "Adds new contact to this account" msgstr "Adicionar novo contato para esta conta" -#: ../src/gajim-remote.py:200 +#: ../src/gajim-remote.py:201 msgid "Returns current status (the global one unless account is specified)" msgstr "Retorna o status atual (global a menos que o cliente for especificado)" -#: ../src/gajim-remote.py:207 +#: ../src/gajim-remote.py:208 msgid "" "Returns current status message(the global one unless account is specified)" msgstr "" "Retorna a mensagem de status atual (global a menos que a conta for " "especificada)" -#: ../src/gajim-remote.py:214 -msgid "Returns number of unreaded messages" +#: ../src/gajim-remote.py:215 +msgid "Returns number of unread messages" msgstr "Retorna o número das mensagens não lidas" -#: ../src/gajim-remote.py:218 +#: ../src/gajim-remote.py:219 msgid "Opens 'Start Chat' dialog" -msgstr "" +msgstr "Abrir o diálogo 'Iniciar Conversa'" -#: ../src/gajim-remote.py:220 -#, fuzzy +#: ../src/gajim-remote.py:221 msgid "Starts chat, using this account" -msgstr "Iniciar uma conferência com a conta %s" +msgstr "Iniciar conversa, usando esta conta" -#: ../src/gajim-remote.py:224 +#: ../src/gajim-remote.py:225 msgid "Sends custom XML" -msgstr "" - -#: ../src/gajim-remote.py:226 -#, fuzzy -msgid "XML to send" -msgstr "Console XML" +msgstr "Envia XML personalizado" #: ../src/gajim-remote.py:227 +msgid "XML to send" +msgstr "XML a enviar" + +#: ../src/gajim-remote.py:228 msgid "" "Account in which the xml will be sent; if not specified, xml will be sent to " "all accounts" msgstr "" +"A conta em que o XML será enviado; se não estiver especificado, será enviado " +"para todas as contas" -#: ../src/gajim-remote.py:249 +#: ../src/gajim-remote.py:234 +msgid "Handle a xmpp:/ uri" +msgstr "Manipular uma URI xmpp:/" + +#: ../src/gajim-remote.py:236 +msgid "uri" +msgstr "URI" + +#: ../src/gajim-remote.py:241 +msgid "Join a MUC room" +msgstr "Entrar em uma sala MUC" + +#: ../src/gajim-remote.py:243 +msgid "room" +msgstr "sala" + +#: ../src/gajim-remote.py:244 +msgid "nick" +msgstr "apelido" + +#: ../src/gajim-remote.py:245 +msgid "password" +msgstr "senha" + +#: ../src/gajim-remote.py:268 msgid "Missing argument \"contact_jid\"" msgstr "Argumento não informado \"contact_jid\"" -#: ../src/gajim-remote.py:268 +#: ../src/gajim-remote.py:287 #, python-format msgid "" "'%s' is not in your roster.\n" @@ -4346,11 +4422,11 @@ msgstr "" "'%s' não está em sua lista.\n" "Por favor, especifique a conta para enviar a mensagem." -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:290 msgid "You have no active account" msgstr "Você não tem uma conta ativa" -#: ../src/gajim-remote.py:335 +#: ../src/gajim-remote.py:354 #, python-format msgid "" "Usage: %s %s %s \n" @@ -4359,16 +4435,16 @@ msgstr "" "Uso: %s %s %s \n" "\t %s" -#: ../src/gajim-remote.py:338 +#: ../src/gajim-remote.py:357 msgid "Arguments:" msgstr "Argumentos:" -#: ../src/gajim-remote.py:342 +#: ../src/gajim-remote.py:361 #, python-format msgid "%s not found" msgstr "%s não encontrado" -#: ../src/gajim-remote.py:346 +#: ../src/gajim-remote.py:365 #, python-format msgid "" "Usage: %s command [arguments]\n" @@ -4377,7 +4453,16 @@ msgstr "" "Uso: %s comando [argumentos]\n" "Comando é um desses:\n" -#: ../src/gajim-remote.py:420 +#: ../src/gajim-remote.py:438 +#, python-format +msgid "" +"Too many arguments. \n" +"Type \"%s help %s\" for more info" +msgstr "" +"Muitos argumentos.\n" +"Digite \"%s help %s\" para mais informações" + +#: ../src/gajim-remote.py:442 #, python-format msgid "" "Argument \"%s\" is not specified. \n" @@ -4386,6 +4471,10 @@ msgstr "" "Argumento \"%s\" não está especificado. \n" "Tipo \"%s ajuda %s\" para maiores informações" +#: ../src/gajim-remote.py:460 +msgid "Wrong uri" +msgstr "URI incorreta" + #: ../src/gajim_themes_window.py:60 msgid "Theme" msgstr "Tema" @@ -4403,145 +4492,122 @@ msgstr "Você não pode apagar o seu tema corrente" msgid "Please first choose another for your current theme." msgstr "Por favor escolha outro para seu tema corrente." -#: ../src/groupchat_control.py:106 -msgid "Private Chat" -msgstr "Conversa Privada" - -#: ../src/groupchat_control.py:106 -msgid "Private Chats" -msgstr "ConversasPrivada" - -#: ../src/groupchat_control.py:123 +#: ../src/groupchat_control.py:122 msgid "Sending private message failed" msgstr "Falha ao Enviar uma mensagem privada" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:125 -#, fuzzy, python-format +#: ../src/groupchat_control.py:124 +#, python-format msgid "You are no longer in group chat \"%s\" or \"%s\" has left." -msgstr "Você não esta mais na sala \"%s\" ou \"%s\" saiu." +msgstr "Você não está mais na sala \"%s\" ou \"%s\" saiu." -#: ../src/groupchat_control.py:144 -msgid "Group Chat" -msgstr "Conferência" - -#: ../src/groupchat_control.py:144 -msgid "Group Chats" -msgstr "Conferências" - -#: ../src/groupchat_control.py:318 -#, fuzzy +#: ../src/groupchat_control.py:322 msgid "Insert Nickname" -msgstr "Mudar _Apelido" +msgstr "Inserir Apelido" #. do not print 'kicked by None' -#: ../src/groupchat_control.py:831 +#: ../src/groupchat_control.py:850 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s foi chutado: %(reason)s" -#: ../src/groupchat_control.py:835 +#: ../src/groupchat_control.py:854 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s foi chutado por %(who)s: %(reason)s" #. do not print 'banned by None' -#: ../src/groupchat_control.py:842 +#: ../src/groupchat_control.py:861 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s foi banido: %(reason)s" -#: ../src/groupchat_control.py:846 +#: ../src/groupchat_control.py:865 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s foi banido por %(who)s: %(reason)s" -#: ../src/groupchat_control.py:854 +#: ../src/groupchat_control.py:873 #, python-format msgid "You are now known as %s" msgstr "Você agora é conhecido como %s" -#: ../src/groupchat_control.py:856 +#: ../src/groupchat_control.py:875 #, python-format msgid "%s is now known as %s" msgstr "%s agora é conhecido como %s" -#: ../src/groupchat_control.py:936 +#: ../src/groupchat_control.py:961 #, python-format msgid "%s has left" msgstr "%s saiu da sala" -#: ../src/groupchat_control.py:941 -#, fuzzy, python-format -msgid "%s has joined the group chat" -msgstr "Neste grupo" - -#. No status message -#: ../src/groupchat_control.py:943 ../src/roster_window.py:1200 +#: ../src/groupchat_control.py:966 #, python-format -msgid "%s is now %s" -msgstr "%s agora está %s" +msgid "%s has joined the group chat" +msgstr "%s entrou na conferência" -#: ../src/groupchat_control.py:1062 ../src/groupchat_control.py:1080 -#: ../src/groupchat_control.py:1173 ../src/groupchat_control.py:1190 +#: ../src/groupchat_control.py:1088 ../src/groupchat_control.py:1106 +#: ../src/groupchat_control.py:1199 ../src/groupchat_control.py:1216 #, python-format msgid "Nickname not found: %s" msgstr "Apelido não encontrado: %s" -#: ../src/groupchat_control.py:1096 -#, fuzzy +#: ../src/groupchat_control.py:1122 msgid "This group chat has no subject" -msgstr "Esta sala não tem assunto" +msgstr "Esta conferência não tem assunto" -#: ../src/groupchat_control.py:1109 +#: ../src/groupchat_control.py:1135 #, python-format msgid "Invited %(contact_jid)s to %(room_jid)s." msgstr "Convidado %(contact_jid)s para %(room_jid)s." #. %s is something the user wrote but it is not a jid so we inform -#: ../src/groupchat_control.py:1116 ../src/groupchat_control.py:1144 +#: ../src/groupchat_control.py:1142 ../src/groupchat_control.py:1170 #, python-format msgid "%s does not appear to be a valid JID" msgstr "%s não parece ser um JID válido" -#: ../src/groupchat_control.py:1227 +#: ../src/groupchat_control.py:1253 #, python-format msgid "No such command: /%s (if you want to send this, prefix it with /say)" msgstr "" "Comando não encontrado: /%s (se você quer enviar isto, use este prefixo /say)" -#: ../src/groupchat_control.py:1250 +#: ../src/groupchat_control.py:1276 #, python-format msgid "Commands: %s" msgstr "Comandos: %s" -#: ../src/groupchat_control.py:1252 -#, fuzzy, python-format +#: ../src/groupchat_control.py:1279 +#, python-format 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. Does " "NOT support spaces in nickname." msgstr "" -"Uso: /%s [ razão ], JID banido da sala. O apelido de um " -"ocupante pode ser substituído, mas se não conter \"@\". Se o JID estiver " -"atualmente na sala, ele/ela será chutado também. Não suporta espaços no " -"apelido." +"Uso: /%s [ razão ], expulsa o JID da conferência. O apelido de " +"um ocupante pode ser substituído, mas não se contiver \"@\". Se o JID " +"estiver atualmente na sala, ele/ela será chutado também. NÃO suporta " +"espaços no apelido." -#: ../src/groupchat_control.py:1259 +#: ../src/groupchat_control.py:1286 #, python-format msgid "" -"Usage: /%s , opens a private chat window to the specified occupant." +"Usage: /%s , opens a private chat window with the specified " +"occupant." msgstr "" -"Uso: /%s , abre uma janela de conferência privada para um ocupante " +"Uso: /%s , abre uma janela de conferência privada com um ocupante " "específico." -#: ../src/groupchat_control.py:1263 +#: ../src/groupchat_control.py:1290 #, python-format msgid "Usage: /%s, clears the text window." msgstr "Uso: /%s, apaga o texto da janela." -#: ../src/groupchat_control.py:1265 +#: ../src/groupchat_control.py:1292 #, python-format msgid "" "Usage: /%s [reason], closes the current window or tab, displaying reason if " @@ -4550,13 +4616,13 @@ msgstr "" "Uso: /%s [rasão], fecha a janela corrente ou a aba, mostrando a razão se " "especificada." -#: ../src/groupchat_control.py:1268 +#: ../src/groupchat_control.py:1295 #, python-format msgid "Usage: /%s, hide the chat buttons." msgstr "Uso: /%s, esconde os botões do bate-papo." -#: ../src/groupchat_control.py:1271 -#, fuzzy, python-format +#: ../src/groupchat_control.py:1298 +#, python-format msgid "" "Usage: /%s [reason], invites JID to the current group chat, optionally " "providing a reason." @@ -4564,7 +4630,7 @@ msgstr "" "Uso: /%s [ razão ], convida JID à sala atual, fornecendo " "opcionalmente uma razão." -#: ../src/groupchat_control.py:1275 +#: ../src/groupchat_control.py:1302 #, python-format msgid "" "Usage: /%s @[/nickname], offers to join room@server optionally " @@ -4573,18 +4639,18 @@ msgstr "" "Uso: /%s @[/apelido], oferece para entrar na sala@servidor " "opcionalmente usando um apelido específico." -#: ../src/groupchat_control.py:1279 -#, fuzzy, python-format +#: ../src/groupchat_control.py:1306 +#, python-format msgid "" "Usage: /%s [reason], removes the occupant specified by nickname " "from the group chat and optionally displays a reason. Does NOT support " "spaces in nickname." msgstr "" -"Uso: /%s [razão], remove o ocupante especificado pelo apelido da " -"sala e indica opcionalmente uma razão. Não suporta espaços no apelido." +"Uso: /%s [razão], remove da sala o ocupante especificado pelo " +"apelido e indica opcionalmente uma razão. Não suporta espaços no apelido." -#: ../src/groupchat_control.py:1284 -#, fuzzy, python-format +#: ../src/groupchat_control.py:1311 +#, python-format msgid "" "Usage: /%s , sends action to the current group chat. Use third " "person. (e.g. /%s explodes.)" @@ -4592,103 +4658,120 @@ msgstr "" "Uso: /%s , emite a ação à sala atual. Use a terceira pessoa (por " "exemplo: /%s explodes.)" -#: ../src/groupchat_control.py:1288 +#: ../src/groupchat_control.py:1315 #, python-format msgid "" -"Usage: /%s [message], opens a private message windowand sends " +"Usage: /%s [message], opens a private message window and sends " "message to the occupant specified by nickname." msgstr "" "Uso: /%s [mensagem], abre uma janela de mensagem privada e envia " "uma mensagem ao ocupante especificado pelo apelido." -#: ../src/groupchat_control.py:1293 -#, fuzzy, python-format +#: ../src/groupchat_control.py:1320 +#, python-format msgid "Usage: /%s , changes your nickname in current group chat." msgstr "Uso: /%s , muda seu apelido na sala corrente." -#: ../src/groupchat_control.py:1297 -#, fuzzy, python-format +#: ../src/groupchat_control.py:1324 +#, python-format msgid "Usage: /%s , display the names of group chat occupants." msgstr "Uso: /%s [tópico], mostra ou atualiza o tópico da sala atual." -#: ../src/groupchat_control.py:1301 -#, fuzzy, python-format +#: ../src/groupchat_control.py:1328 +#, python-format msgid "Usage: /%s [topic], displays or updates the current group chat topic." msgstr "Uso: /%s [tópico], mostra ou atualiza o tópico da sala atual." -#: ../src/groupchat_control.py:1304 +#: ../src/groupchat_control.py:1331 #, python-format msgid "" "Usage: /%s , sends a message without looking for other commands." msgstr "" "Uso: /%s , envia uma mensagem sem procurar por outros comandos." -#: ../src/groupchat_control.py:1307 +#: ../src/groupchat_control.py:1334 #, python-format msgid "No help info for /%s" msgstr "Sem ajuda para /%s" -#: ../src/groupchat_control.py:1356 -#, fuzzy, python-format +#: ../src/groupchat_control.py:1397 +#, python-format msgid "Are you sure you want to leave group chat \"%s\"?" -msgstr "Você tem certeza que quer deixar a sala \"%s\"?" +msgstr "Você tem certeza que quer deixar a conferência \"%s\"?" -#: ../src/groupchat_control.py:1358 -#, fuzzy +#: ../src/groupchat_control.py:1399 msgid "" "If you close this window, you will be disconnected from this group chat." -msgstr "Se você fechar esta janela, você será desconectado desta sala." +msgstr "Se você fechar esta janela, será desconectado desta conferência." -#: ../src/groupchat_control.py:1362 ../src/roster_window.py:3962 +#: ../src/groupchat_control.py:1403 ../src/roster_window.py:4066 msgid "Do _not ask me again" msgstr "_Não me pergunte novamente" -#: ../src/groupchat_control.py:1396 +#: ../src/groupchat_control.py:1437 msgid "Changing Subject" msgstr "Mudando Assunto" -#: ../src/groupchat_control.py:1397 +#: ../src/groupchat_control.py:1438 msgid "Please specify the new subject:" msgstr "Por favor, especifique o novo assunto:" -#: ../src/groupchat_control.py:1406 +#: ../src/groupchat_control.py:1447 msgid "Changing Nickname" msgstr "Mudando Apelido" -#: ../src/groupchat_control.py:1407 +#: ../src/groupchat_control.py:1448 msgid "Please specify the new nickname you want to use:" msgstr "Por favor, especifique o novo apelido que você quer usar:" -#: ../src/groupchat_control.py:1432 +#. Ask for a reason +#: ../src/groupchat_control.py:1463 +#, python-format +msgid "Destroying %s" +msgstr "Excluindo %s" + +#: ../src/groupchat_control.py:1464 +msgid "" +"You are going to definitively destroy this room.\n" +"You may specify a reason below:" +msgstr "" +"Você está prestes a excluir definitivamente esta sala.\n" +"Você deve especificar uma justificativa abaixo:" + +#: ../src/groupchat_control.py:1466 +msgid "You may also enter an alternate venue:" +msgstr "Você também pode entrar um ponto de encontro alternativo:" + +#: ../src/groupchat_control.py:1496 msgid "Bookmark already set" msgstr "Bookmark já configurado" -#: ../src/groupchat_control.py:1433 -#, fuzzy, python-format +#: ../src/groupchat_control.py:1497 +#, python-format msgid "Group Chat \"%s\" is already in your bookmarks." -msgstr "Sala \"%s\" já existe nos bookmarks." +msgstr "A sala \"%s\" já existe nos favoritos." -#: ../src/groupchat_control.py:1442 +#: ../src/groupchat_control.py:1506 msgid "Bookmark has been added successfully" msgstr "Bookmark foi adicionado com sucesso" -#: ../src/groupchat_control.py:1443 +#: ../src/groupchat_control.py:1507 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "" "Você pode gerenciar seus bookmarks pelo menu de Ações na janela principal." #. ask for reason -#: ../src/groupchat_control.py:1569 +#: ../src/groupchat_control.py:1635 #, python-format msgid "Kicking %s" msgstr "Chutando %s" -#: ../src/groupchat_control.py:1570 ../src/groupchat_control.py:1852 +#: ../src/groupchat_control.py:1636 ../src/groupchat_control.py:1919 msgid "You may specify a reason below:" msgstr "Você deve especificar uma razão abaixo:" #. ask for reason -#: ../src/groupchat_control.py:1851 +#: ../src/groupchat_control.py:1918 #, python-format msgid "Banning %s" msgstr "Banindo %s" @@ -4712,68 +4795,82 @@ msgid "Details" msgstr "Detalhes" #. we talk about file -#: ../src/gtkgui_helpers.py:153 ../src/gtkgui_helpers.py:168 +#: ../src/gtkgui_helpers.py:156 ../src/gtkgui_helpers.py:171 #, python-format msgid "Error: cannot open %s for reading" msgstr "Erro: impossível abrir %s para leitura" -#: ../src/gtkgui_helpers.py:293 +#: ../src/gtkgui_helpers.py:336 msgid "Error reading file:" msgstr "Erro lendo arquivo:" -#: ../src/gtkgui_helpers.py:296 +#: ../src/gtkgui_helpers.py:339 msgid "Error parsing file:" msgstr "Erro ao analisar gramaticalmente o arquivo:" #. do not traceback (could be a permission problem) #. we talk about a file here -#: ../src/gtkgui_helpers.py:334 +#: ../src/gtkgui_helpers.py:376 #, python-format msgid "Could not write to %s. Session Management support will not work" msgstr "" "Não foi possível escrever à %s. O suporte de gerência da sessão não funciona" -#: ../src/gtkgui_helpers.py:728 -msgid "Extension not supported" -msgstr "" +#. xmpp: is currently handled by another program, so ask the user +#: ../src/gtkgui_helpers.py:694 +msgid "Gajim is not the default Jabber client" +msgstr "O Gajim não é o cliente Jabber padrão" -#: ../src/gtkgui_helpers.py:729 +#: ../src/gtkgui_helpers.py:695 +msgid "Would you like to make Gajim the default Jabber client?" +msgstr "Você gostaria de tornar o Gajim o cliente Jabber padrão?" + +#: ../src/gtkgui_helpers.py:696 +msgid "Always check to see if Gajim is the default Jabber client on startup" +msgstr "Sempre verificar ao iniciar se o Gajim é o cliente Jabber padrão" + +#: ../src/gtkgui_helpers.py:795 +msgid "Extension not supported" +msgstr "Extensão não suportada" + +#: ../src/gtkgui_helpers.py:796 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" +"A imagem não pode ser salva no formato %(type)s. Salvar como %(new_filename)" +"s?" -#: ../src/gtkgui_helpers.py:738 -#, fuzzy +#: ../src/gtkgui_helpers.py:805 msgid "Save Image as..." -msgstr "Salvar Arquivo como..." +msgstr "Salvar Imagem como..." -#: ../src/history_manager.py:64 +#: ../src/history_manager.py:65 msgid "Cannot find history logs database" msgstr "Não foi encontrado banco de dados do histórico de logs" #. holds jid -#: ../src/history_manager.py:107 +#: ../src/history_manager.py:108 msgid "Contacts" msgstr "Contatos" #. holds time -#: ../src/history_manager.py:120 ../src/history_manager.py:160 +#: ../src/history_manager.py:121 ../src/history_manager.py:161 #: ../src/history_window.py:86 msgid "Date" msgstr "Data:" #. holds nickname -#: ../src/history_manager.py:126 ../src/history_manager.py:178 +#: ../src/history_manager.py:127 ../src/history_manager.py:179 msgid "Nickname" msgstr "Apelido" #. holds message -#: ../src/history_manager.py:134 ../src/history_manager.py:166 +#: ../src/history_manager.py:135 ../src/history_manager.py:167 #: ../src/history_window.py:94 msgid "Message" msgstr "Mensagem" -#: ../src/history_manager.py:186 +#: ../src/history_manager.py:187 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" @@ -4781,7 +4878,7 @@ msgstr "" "Você quer limpar o banco de dados? (ALTAMENTE NÃO RECOMENDADO COM O GAJIM EM " "EXECUÇÃO)" -#: ../src/history_manager.py:188 +#: ../src/history_manager.py:189 msgid "" "Normally allocated database size will not be freed, it will just become " "reusable. If you really want to reduce database filesize, click YES, else " @@ -4795,7 +4892,7 @@ msgstr "" "\n" "Se caso você clicou SIM, por favor espere... " -#: ../src/history_manager.py:400 +#: ../src/history_manager.py:401 msgid "Exporting History Logs..." msgstr "Exportando Histórico de Logs..." @@ -4825,137 +4922,134 @@ msgstr[1] "Você realmente quer deletar as mensagens selecionadas?" msgid "Conversation History with %s" msgstr "Histórico de Conversação com %s" -#: ../src/history_window.py:261 +#: ../src/history_window.py:266 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s é agora %(status)s: %(status_msg)s" -#: ../src/history_window.py:265 ../src/notify.py:198 +#: ../src/history_window.py:270 ../src/notify.py:199 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s agora está %(status)s" -#: ../src/history_window.py:271 +#: ../src/history_window.py:276 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Status agora é: %(status)s: %(status_msg)s" -#: ../src/history_window.py:274 +#: ../src/history_window.py:279 #, python-format msgid "Status is now: %(status)s" msgstr "Status agora é: %(status)s" -#: ../src/message_window.py:273 +#: ../src/message_window.py:278 +msgid "Chats" +msgstr "Conversas" + +#: ../src/message_window.py:280 +msgid "Group Chats" +msgstr "Conferências" + +#: ../src/message_window.py:282 +msgid "Private Chats" +msgstr "ConversasPrivada" + +#: ../src/message_window.py:284 msgid "Messages" msgstr "Mensagens" -#: ../src/message_window.py:274 +#: ../src/message_window.py:285 #, python-format msgid "%s - Gajim" msgstr "%s - Gajim" -#: ../src/notify.py:196 -#, fuzzy, python-format +#: ../src/notify.py:197 +#, python-format msgid "%(nick)s Changed Status" -msgstr "%(nick)s agora está %(status)s" +msgstr "%(nick)s Alterou seu Status" -#: ../src/notify.py:206 +#: ../src/notify.py:207 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s Conectou" -#: ../src/notify.py:214 +#: ../src/notify.py:215 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s Desconectou" -#: ../src/notify.py:226 +#: ../src/notify.py:227 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Nova Mensagem Simples de %(nickname)s" -#: ../src/notify.py:234 -#, fuzzy, python-format -msgid "New Private Message from group chat %s" -msgstr "Nova Mensagem Privada da sala %s" - #: ../src/notify.py:235 #, python-format +msgid "New Private Message from group chat %s" +msgstr "Nova Mensagem Privada da conferência %s" + +#: ../src/notify.py:236 +#, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:241 +#: ../src/notify.py:242 #, python-format msgid "New Message from %(nickname)s" msgstr "Nova Mensagem de %(nickname)s" -#: ../src/profile_window.py:72 ../src/profile_window.py:376 +#: ../src/profile_window.py:72 msgid "Retrieving profile..." -msgstr "" - -#: ../src/profile_window.py:107 ../src/profile_window.py:203 -#: ../src/profile_window.py:212 ../src/profile_window.py:370 -msgid "Click to set your avatar" -msgstr "" +msgstr "Recuperando perfil..." #. keep identation -#: ../src/profile_window.py:136 +#: ../src/profile_window.py:143 msgid "Could not load image" msgstr "A imagem não pode ser carregada" -#: ../src/profile_window.py:238 -#, fuzzy +#: ../src/profile_window.py:255 msgid "Information received" -msgstr "Convite Recebido" +msgstr "Informação recebida" -#: ../src/profile_window.py:308 +#: ../src/profile_window.py:324 msgid "Without a connection you can not publish your contact information." msgstr "Você deve estar conectado para publicar suas informações de contato." -#: ../src/profile_window.py:320 +#: ../src/profile_window.py:336 msgid "Sending profile..." -msgstr "" +msgstr "Enviando perfil..." -#: ../src/profile_window.py:328 -msgid "Information published" -msgstr "" - -#: ../src/profile_window.py:340 +#: ../src/profile_window.py:351 msgid "Information NOT published" -msgstr "" +msgstr "Informação NÃO publicada" -#: ../src/profile_window.py:347 +#: ../src/profile_window.py:358 msgid "vCard publication failed" msgstr "Publicação do vCard falhou" -#: ../src/profile_window.py:348 +#: ../src/profile_window.py:359 msgid "" "There was an error while publishing your personal information, try again " "later." msgstr "" "Houve um erro ao publicar sua informação pessoal, tente outra vez mais tarde." -#: ../src/profile_window.py:374 -msgid "Without a connection, you can not get your contact information." -msgstr "Você deve estar conectado para receber suas informações de contato." - -#: ../src/roster_window.py:168 ../src/roster_window.py:223 +#: ../src/roster_window.py:172 ../src/roster_window.py:227 msgid "Merged accounts" msgstr "Juntar contas" -#: ../src/roster_window.py:340 ../src/common/helpers.py:42 +#: ../src/roster_window.py:345 ../src/common/helpers.py:43 msgid "Observers" msgstr "Observadores" -#: ../src/roster_window.py:686 ../src/roster_window.py:3133 -#, fuzzy +#: ../src/roster_window.py:692 ../src/roster_window.py:3222 msgid "You cannot join a group chat while you are invisible" -msgstr "Você não pode ingressar em uma sala enquanto está invisível" +msgstr "Você não pode ingressar em uma sala enquanto estiver invisível" #. new chat #. for chat_with #. for single message -#: ../src/roster_window.py:878 ../src/systray.py:187 ../src/systray.py:192 +#: ../src/roster_window.py:884 ../src/systray.py:206 ../src/systray.py:211 #, python-format msgid "using account %s" msgstr "usando conta %s" @@ -4963,194 +5057,185 @@ msgstr "usando conta %s" #. the 'manage gc bookmarks' item is shown #. below to avoid duplicate code #. add -#: ../src/roster_window.py:903 +#: ../src/roster_window.py:909 #, python-format msgid "to %s account" msgstr "para %s conta" #. disco -#: ../src/roster_window.py:908 +#: ../src/roster_window.py:914 #, python-format msgid "using %s account" msgstr "usando %s conta" #. profile, avatar -#: ../src/roster_window.py:983 +#: ../src/roster_window.py:989 #, python-format msgid "of account %s" msgstr "da conta %s" -#: ../src/roster_window.py:1003 -#, fuzzy +#: ../src/roster_window.py:1009 msgid "_Manage Bookmarks..." -msgstr "Gerenciar Bookmarks..." +msgstr "_Gerenciar Favoritos..." -#: ../src/roster_window.py:1032 +#: ../src/roster_window.py:1038 #, python-format msgid "for account %s" msgstr "para conta %s" #. History manager -#: ../src/roster_window.py:1053 +#: ../src/roster_window.py:1059 msgid "History Manager" msgstr "Gerenciador de Histórico" -#: ../src/roster_window.py:1062 -#, fuzzy +#: ../src/roster_window.py:1068 msgid "_Join New Group Chat" -msgstr "_Ingressar na Conferência" +msgstr "_Ingressar em uma nova Conferência" -#: ../src/roster_window.py:1380 ../src/roster_window.py:3326 -#: ../src/roster_window.py:3333 +#: ../src/roster_window.py:1397 ../src/roster_window.py:3418 +#: ../src/roster_window.py:3425 msgid "You have unread messages" msgstr "Você tem mensagens não lidas" -#: ../src/roster_window.py:1381 -#, fuzzy +#: ../src/roster_window.py:1398 msgid "You must read them before removing this transport." -msgstr "Ler todos os eventos pendentes antes de remover esta conta." +msgstr "Você precisa lê-los antes de remover este transporte." -#: ../src/roster_window.py:1384 +#: ../src/roster_window.py:1401 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transporte \"%s\" será removido" -#: ../src/roster_window.py:1385 +#: ../src/roster_window.py:1402 msgid "" -"You will no longer be able to send and receive messages to contacts from " +"You will no longer be able to send and receive messages from contacts using " "this transport." msgstr "" -"Você não poderá enviar e receber mensagens para contatos deste transporte" +"Você não poderá mais enviar e receber mensagens dos contatos usando este " +"transporte." -#: ../src/roster_window.py:1388 -#, fuzzy +#: ../src/roster_window.py:1405 msgid "Transports will be removed" -msgstr "Transporte \"%s\" será removido" +msgstr "Os transportes serão removidos" -#: ../src/roster_window.py:1393 -#, fuzzy, python-format +#: ../src/roster_window.py:1410 +#, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " "these transports:%s" msgstr "" -"Você não poderá enviar e receber mensagens para contatos deste transporte" +"Você não poderá enviar e receber mensagens para contatos destes transportes: " +"%s" #. it's jid -#: ../src/roster_window.py:1413 -#, fuzzy +#: ../src/roster_window.py:1430 msgid "Rename Contact" -msgstr "Contatos" +msgstr "Renomear Contato" -#: ../src/roster_window.py:1414 -#, fuzzy, python-format +#: ../src/roster_window.py:1431 +#, python-format msgid "Enter a new nickname for contact %s" -msgstr "Entre com a frase de acesso da chave GPG para conta %s" +msgstr "Entre com um novo apelido para o contato %s" -#: ../src/roster_window.py:1421 -#, fuzzy +#: ../src/roster_window.py:1438 msgid "Rename Group" -msgstr "_Renomear" +msgstr "Renomear Grupo" -#: ../src/roster_window.py:1422 -#, fuzzy, python-format +#: ../src/roster_window.py:1439 +#, python-format msgid "Enter a new name for group %s" -msgstr "Entre com a frase de acesso da chave GPG para conta %s" +msgstr "Entre com um novo nome para o grupo %s" -#: ../src/roster_window.py:1476 -#, fuzzy +#: ../src/roster_window.py:1514 msgid "Remove Group" -msgstr "_Remover" +msgstr "Remover Grupo" -#: ../src/roster_window.py:1477 +#: ../src/roster_window.py:1515 #, python-format msgid "Do you want to remove group %s from the roster?" -msgstr "" +msgstr "Você quer remover o grupo %s da lista?" -#: ../src/roster_window.py:1478 -#, fuzzy +#: ../src/roster_window.py:1516 msgid "Remove also all contacts in this group from your roster" -msgstr "Remover contato da lista" +msgstr "Remover também todos os contatos neste grupo da sua lista" -#: ../src/roster_window.py:1502 +#: ../src/roster_window.py:1547 msgid "Assign OpenPGP Key" msgstr "Atribuir chave OpenPGP" -#: ../src/roster_window.py:1503 +#: ../src/roster_window.py:1548 msgid "Select a key to apply to the contact" msgstr "Selecione uma chave para atribuir ao contato" -#: ../src/roster_window.py:1784 ../src/roster_window.py:1960 -#, fuzzy +#: ../src/roster_window.py:1784 ../src/roster_window.py:2045 msgid "_New group chat" -msgstr "Conferência" +msgstr "_Nova conferência" -#: ../src/roster_window.py:1842 +#: ../src/roster_window.py:1915 msgid "I would like to add you to my roster" msgstr "Eu gostaria de adiciona-lo à minha lista" -#: ../src/roster_window.py:2005 ../src/roster_window.py:2052 -#, fuzzy +#: ../src/roster_window.py:2090 ../src/roster_window.py:2137 msgid "Send Group M_essage" -msgstr "Nova Mensagem" +msgstr "Enviar M_ensagem de Grupo" -#: ../src/roster_window.py:2031 +#: ../src/roster_window.py:2116 msgid "Re_name" msgstr "Re_nomear" -#: ../src/roster_window.py:2058 +#: ../src/roster_window.py:2143 msgid "To all users" -msgstr "" +msgstr "Para todos os usuários" -#: ../src/roster_window.py:2061 -#, fuzzy +#: ../src/roster_window.py:2146 msgid "To all online users" -msgstr "Usuários C_onectados" +msgstr "Para todos os usuários conectados" -#: ../src/roster_window.py:2097 +#: ../src/roster_window.py:2182 msgid "_Log on" msgstr "_Conectar" -#: ../src/roster_window.py:2107 +#: ../src/roster_window.py:2192 msgid "Log _off" msgstr "_Desconectar" -#: ../src/roster_window.py:2229 ../src/roster_window.py:2300 +#: ../src/roster_window.py:2314 ../src/roster_window.py:2385 msgid "_Change Status Message" msgstr "_Mudar Mensagem de Status" -#: ../src/roster_window.py:2372 +#: ../src/roster_window.py:2457 msgid "Authorization has been sent" msgstr "Autorização foi enviada" -#: ../src/roster_window.py:2373 +#: ../src/roster_window.py:2458 #, python-format msgid "Now \"%s\" will know your status." msgstr "Agora \"%s\" saberá seu status." -#: ../src/roster_window.py:2393 +#: ../src/roster_window.py:2478 msgid "Subscription request has been sent" msgstr "Solicitação de inscrição foi enviada" -#: ../src/roster_window.py:2394 +#: ../src/roster_window.py:2479 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Se \"%s\" aceitar esta solicitação, você saberá o status dele ou dela." -#: ../src/roster_window.py:2406 +#: ../src/roster_window.py:2491 msgid "Authorization has been removed" msgstr "Autorização foi removida" -#: ../src/roster_window.py:2407 +#: ../src/roster_window.py:2492 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Agora \"%s\" você sempre o verá como offline." -#: ../src/roster_window.py:2615 +#: ../src/roster_window.py:2684 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Contato \"%s\" será removido de sua lista" -#: ../src/roster_window.py:2619 +#: ../src/roster_window.py:2688 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." @@ -5158,7 +5243,7 @@ msgstr "" "Removendo este contato, você também removerá a autorização, resultando em " "ele ou ela sempre o verá offiline." -#: ../src/roster_window.py:2624 +#: ../src/roster_window.py:2693 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." @@ -5166,59 +5251,67 @@ msgstr "" "Removendo este contato, você também, por padrão, removerá a autorização, " "resultando em ele ou ela sempre o verá offiline." -#: ../src/roster_window.py:2627 +#: ../src/roster_window.py:2696 msgid "I want this contact to know my status after removal" msgstr "Eu quero que este contato saiba meu status após a remoção" #. several contact to remove at the same time -#: ../src/roster_window.py:2631 -#, fuzzy +#: ../src/roster_window.py:2700 msgid "Contacts will be removed from your roster" -msgstr "Contato \"%s\" será removido de sua lista" +msgstr "Os contatos serão removidos da sua lista" -#: ../src/roster_window.py:2635 -#, fuzzy, python-format +#: ../src/roster_window.py:2704 +#, python-format msgid "" "By removing these contacts:%s\n" "you also remove authorization resulting in them always seeing you as offline." msgstr "" -"Removendo este contato, você também removerá a autorização, resultando em " -"ele ou ela sempre o verá offiline." +"Removendo estes contatos: %s\n" +"você também remove a autorização fazendo com que eles sempre vejam você " +"offline." + +#: ../src/roster_window.py:2736 +msgid "" +"Gnome Keyring is installed but not correctly started (environment variable " +"probably not correctly set)" +msgstr "" +"O Gnome Keyring está instalado mas não corretamente iniciado (provavelmente " +"a variável de ambiente não está definida corretamente)" #. TODO: make this string translatable #. %s is the account name here -#: ../src/roster_window.py:2693 ../src/common/connection.py:587 -#: ../src/common/zeroconf/connection_zeroconf.py:158 +#: ../src/roster_window.py:2764 ../src/common/connection.py:704 +#: ../src/common/zeroconf/connection_zeroconf.py:160 #, python-format msgid "You will be connected to %s without OpenPGP." msgstr "Você será conectado ao %s sem OpenPGP." -#: ../src/roster_window.py:2710 +#: ../src/roster_window.py:2781 msgid "Passphrase Required" msgstr "Frase de acesso é obrigatória" -#: ../src/roster_window.py:2711 +#: ../src/roster_window.py:2782 #, python-format msgid "Enter GPG key passphrase for account %s." msgstr "Entre com a frase de acesso da chave GPG para conta %s" -#: ../src/roster_window.py:2716 +#: ../src/roster_window.py:2787 msgid "Save passphrase" msgstr "Salvar Frase de acesso" -#: ../src/roster_window.py:2724 +#: ../src/roster_window.py:2795 msgid "Wrong Passphrase" msgstr "Frase de acesso Errada" -#: ../src/roster_window.py:2725 +#: ../src/roster_window.py:2796 msgid "Please retype your GPG passphrase or press Cancel." msgstr "Por favor, reescreva sua frase de segurança GPG ou pressione Cancelar." -#: ../src/roster_window.py:2782 ../src/roster_window.py:2842 +#: ../src/roster_window.py:2860 ../src/roster_window.py:2920 msgid "You are participating in one or more group chats" msgstr "Você está participando em uma ou mais conferências" -#: ../src/roster_window.py:2783 ../src/roster_window.py:2843 +#: ../src/roster_window.py:2861 ../src/roster_window.py:2921 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" @@ -5226,21 +5319,21 @@ msgstr "" "Mudando seu status para invisível resulta na desconexão daquelas " "conferências. Você tem certeza que quer ir invisível?" -#: ../src/roster_window.py:2800 +#: ../src/roster_window.py:2878 msgid "No account available" msgstr "Conta não disponível" -#: ../src/roster_window.py:2801 +#: ../src/roster_window.py:2879 msgid "You must create an account before you can chat with other contacts." msgstr "" "Você deve configurar uma conta antes de poder conversar com outros contatos." -#: ../src/roster_window.py:2899 +#: ../src/roster_window.py:2981 #, python-format msgid "\"%(title)s\" by %(artist)s" -msgstr "" +msgstr "\"%(title)s\" by %(artist)s" -#: ../src/roster_window.py:3327 ../src/roster_window.py:3334 +#: ../src/roster_window.py:3419 ../src/roster_window.py:3426 msgid "" "Messages will only be available for reading them later if you have history " "enabled." @@ -5248,135 +5341,146 @@ msgstr "" "Mensagem somente estará disponível para leitura mais tarde se você tiver o " "histórico habilitado." -#: ../src/roster_window.py:3912 +#: ../src/roster_window.py:4016 msgid "Metacontacts storage not supported by your server" -msgstr "" +msgstr "O armazenamento de metacontatos não é suportado pelo seu servidor." -#: ../src/roster_window.py:3914 +#: ../src/roster_window.py:4018 msgid "" "Your server does not support storing metacontacts information. So those " "information will not be save on next reconnection." msgstr "" +"O seu servidor não suporta a gravação de informação de metacontatos, " +"portanto essas informações não serão estarão disponíveis na próxima vez que " +"você se conectar." -#: ../src/roster_window.py:3956 -#, fuzzy +#: ../src/roster_window.py:4060 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "" -"Você deve configurar uma conta antes de poder conversar com outros contatos." +"Você está prestes a criar um metacontato. Tem certeza que quer continuar?" -#: ../src/roster_window.py:3958 +#: ../src/roster_window.py:4062 msgid "" -"Metacontacts are a way to regroup several contacts in one line. Generaly it " +"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 "" +"Os metacontatos são uma forma de reagrupar muitos contatos em uma linha. " +"Geralmente isso é usado quando a mesma pessoa possui muitas contas de Jabber " +"ou transportes." -#: ../src/roster_window.py:4125 +#: ../src/roster_window.py:4140 +#, python-format +msgid "Do you want to send that file to %s:" +msgid_plural "Do you want to send those files to %s:" +msgstr[0] "Você quer enviar esse arquivo para %s:" +msgstr[1] "%s quer te enviar um arquivo:" + +#: ../src/roster_window.py:4245 #, python-format msgid "Drop %s in group %s" msgstr "Derrubar %s no grupo %s" -#: ../src/roster_window.py:4132 +#: ../src/roster_window.py:4252 #, python-format msgid "Make %s and %s metacontacts" msgstr "Fazer %s e %s metacontatos" -#: ../src/roster_window.py:4319 +#: ../src/roster_window.py:4439 msgid "Change Status Message..." msgstr "Mudar Mensagem de Status..." -#: ../src/systray.py:144 +#: ../src/systray.py:163 msgid "_Change Status Message..." msgstr "_Mudar Mensagem de Status..." -#: ../src/systray.py:234 +#: ../src/systray.py:251 msgid "Hide this menu" msgstr "Esconder este menu" -#: ../src/tooltips.py:309 ../src/tooltips.py:492 -#, fuzzy +#: ../src/tooltips.py:309 ../src/tooltips.py:493 msgid "Jabber ID: " msgstr "Jabber ID:" -#: ../src/tooltips.py:312 ../src/tooltips.py:496 +#: ../src/tooltips.py:312 ../src/tooltips.py:497 msgid "Resource: " msgstr "Recurso: " #: ../src/tooltips.py:317 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" -msgstr "" +msgstr "%(owner_or_admin_or_member)s dessa sala" -#: ../src/tooltips.py:430 ../src/tooltips.py:610 +#: ../src/tooltips.py:430 ../src/tooltips.py:612 msgid "Status: " msgstr "Status: " #: ../src/tooltips.py:461 -#, fuzzy, python-format +#, python-format msgid "Last status: %s" -msgstr "Último status conectado %s" +msgstr "Último status: %s" #: ../src/tooltips.py:463 -#, fuzzy, python-format +#, python-format msgid " since %s" msgstr "desde %s" #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:502 +#: ../src/tooltips.py:503 msgid "Subscription: " msgstr "Inscrição: " -#: ../src/tooltips.py:512 +#: ../src/tooltips.py:513 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:566 +#: ../src/tooltips.py:568 msgid "Download" msgstr "Download" -#: ../src/tooltips.py:572 +#: ../src/tooltips.py:574 msgid "Upload" msgstr "Upload" -#: ../src/tooltips.py:579 +#: ../src/tooltips.py:581 msgid "Type: " msgstr "Tipo: " -#: ../src/tooltips.py:585 +#: ../src/tooltips.py:587 msgid "Transferred: " msgstr "Transferido: " -#: ../src/tooltips.py:588 ../src/tooltips.py:609 +#: ../src/tooltips.py:590 ../src/tooltips.py:611 msgid "Not started" msgstr "Não iniciado" -#: ../src/tooltips.py:592 +#: ../src/tooltips.py:594 msgid "Stopped" msgstr "Parado" -#: ../src/tooltips.py:594 ../src/tooltips.py:597 +#: ../src/tooltips.py:596 ../src/tooltips.py:599 msgid "Completed" msgstr "Completo" -#: ../src/tooltips.py:601 +#: ../src/tooltips.py:603 msgid "?transfer status:Paused" -msgstr "" +msgstr "?status da transferência: Parado" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:605 +#: ../src/tooltips.py:607 msgid "Stalled" msgstr "Parado" -#: ../src/tooltips.py:607 +#: ../src/tooltips.py:609 msgid "Transferring" msgstr "Transferindo" -#: ../src/tooltips.py:639 +#: ../src/tooltips.py:641 msgid "This service has not yet responded with detailed information" msgstr "Este serviço não respondeu ainda com informação detalhada" -#: ../src/tooltips.py:642 +#: ../src/tooltips.py:644 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -5384,25 +5488,24 @@ msgstr "" "Este serviço não poderia responder com informações detalhadas.\n" "É mais provável quebrado" -#: ../src/vcard.py:217 +#: ../src/vcard.py:201 msgid "?Client:Unknown" msgstr "?Cliente:Desconhecido" -#: ../src/vcard.py:219 +#: ../src/vcard.py:203 msgid "?OS:Unknown" msgstr "?SO:Desconhecido" -#: ../src/vcard.py:247 ../src/vcard.py:449 +#: ../src/vcard.py:231 ../src/vcard.py:409 #, python-format msgid "since %s" msgstr "desde %s" -#: ../src/vcard.py:277 -#, fuzzy +#: ../src/vcard.py:261 msgid "Affiliation:" -msgstr "Filiação: " +msgstr "Filiação:" -#: ../src/vcard.py:285 +#: ../src/vcard.py:269 msgid "" "This contact is interested in your presence information, but you are not " "interested in his/her presence" @@ -5410,7 +5513,7 @@ msgstr "" "Este contato está interessado em sua informação de presença, mas você não " "está interessado napresença dele/dela" -#: ../src/vcard.py:287 +#: ../src/vcard.py:271 msgid "" "You are interested in the contact's presence information, but he/she is not " "interested in yours" @@ -5418,13 +5521,13 @@ msgstr "" "Você está interessado na informação da presença do contato, mas ele/ela não " "está interessado em seu" -#: ../src/vcard.py:289 +#: ../src/vcard.py:273 msgid "You and the contact are interested in each other's presence information" msgstr "" "Você e o contato estão interessados em cada outra informação da presença" #. None -#: ../src/vcard.py:291 +#: ../src/vcard.py:275 msgid "" "You are not interested in the contact's presence, and neither he/she is " "interested in yours" @@ -5432,12 +5535,12 @@ msgstr "" "Você não está interessado na presença do contato, e nenhum está interessado " "no seu" -#: ../src/vcard.py:299 +#: ../src/vcard.py:283 msgid "You are waiting contact's answer about your subscription request" msgstr "" "Você está esperando a resposta do contato sobre seu pedido da subscrição" -#: ../src/vcard.py:311 ../src/vcard.py:338 ../src/vcard.py:482 +#: ../src/vcard.py:287 ../src/vcard.py:314 ../src/vcard.py:434 msgid " resource with priority " msgstr " recurso com prioridade " @@ -5448,7 +5551,7 @@ msgstr "criando banco de dados de logs" #: ../src/common/check_paths.py:89 ../src/common/check_paths.py:100 #: ../src/common/check_paths.py:107 #, python-format -msgid "%s is file but it should be a directory" +msgid "%s is a file but it should be a directory" msgstr "%s é um arquivo, mas deveria ser um diretório" #: ../src/common/check_paths.py:90 ../src/common/check_paths.py:101 @@ -5458,7 +5561,7 @@ msgstr "Gajim sairá agora" #: ../src/common/check_paths.py:115 #, python-format -msgid "%s is directory but should be file" +msgid "%s is a directory but should be a file" msgstr "%s é um diretório, mas deveria ser um arquivo" #: ../src/common/check_paths.py:131 @@ -5466,111 +5569,210 @@ msgstr "%s é um diretório, mas deveria ser um arquivo" msgid "creating %s directory" msgstr "criando diretório %s" -#: ../src/common/config.py:55 -#, fuzzy -msgid "Use D-Bus and Notification-Daemon to show notifications" -msgstr "Use DBus e Notification-Daemon para mostrar notificações" +#: ../src/common/commands.py:69 +msgid "Change status information" +msgstr "Alterar informação de status" -#: ../src/common/config.py:60 +#: ../src/common/commands.py:82 +msgid "Change status" +msgstr "Alterar status" + +#: ../src/common/commands.py:83 +msgid "Set the presence type and description" +msgstr "Definir o tipo e a descrição da presença" + +#: ../src/common/commands.py:89 +msgid "Free for chat" +msgstr "Livre para conversa" + +#: ../src/common/commands.py:90 +msgid "Online" +msgstr "Conectado" + +#: ../src/common/commands.py:92 +msgid "Extended away" +msgstr "Muito afastado" + +#: ../src/common/commands.py:93 +msgid "Do not disturb" +msgstr "Não perturbe" + +#: ../src/common/commands.py:94 +msgid "Offline - disconnect" +msgstr "Desconectado" + +#: ../src/common/commands.py:99 +msgid "Presence description:" +msgstr "Descrição da presença:" + +#: ../src/common/commands.py:134 +msgid "The status has been changed." +msgstr "O status foi alterado." + +#: ../src/common/commands.py:179 +#, python-format +msgid "%(nickname)s on %(room_jid)s" +msgstr "%(nickname)s da sala %(room_jid)s" + +#: ../src/common/commands.py:183 +msgid "You have not joined a groupchat." +msgstr "Você não entrou em uma sala." + +#: ../src/common/commands.py:189 +msgid "Leave Groupchats" +msgstr "Sair das salas" + +#: ../src/common/commands.py:190 +msgid "Choose the groupchats you want to leave" +msgstr "Selecione as salas das quais você quer sair" + +#: ../src/common/commands.py:194 +msgid "Groupchats" +msgstr "Salas" + +#: ../src/common/commands.py:230 +msgid "You left the following groupchats:" +msgstr "Você saiu das seguintes salas:" + +#: ../src/common/config.py:56 +msgid "Use D-Bus and Notification-Daemon to show notifications" +msgstr "Usar DBus e Notification-Daemon para mostrar notificações" + +#: ../src/common/config.py:61 msgid "Time in minutes, after which your status changes to away." msgstr "Minutos, depois do qual seu status mudam a afastado." -#: ../src/common/config.py:61 +#: ../src/common/config.py:62 msgid "Away as a result of being idle" msgstr "Afastado em conseqüência de estar inativo" -#: ../src/common/config.py:63 +#: ../src/common/config.py:64 msgid "Time in minutes, after which your status changes to not available." msgstr "Minutos, depois do qual seu status mudam a nao disponível." -#: ../src/common/config.py:64 +#: ../src/common/config.py:65 msgid "Not available as a result of being idle" msgstr "Não disponível em conseqüência de estar inativo" -#: ../src/common/config.py:82 +#: ../src/common/config.py:83 msgid "" "List (space separated) of rows (accounts and groups) that are collapsed." msgstr "" +"Lista (separada por espaços) de linhas (contas e grupos) que estão agrupados." -#: ../src/common/config.py:87 +#: ../src/common/config.py:88 msgid "Enable link-local/zeroconf messaging" -msgstr "" - -#: ../src/common/config.py:90 -msgid "Language used by speller" -msgstr "" +msgstr "Ativar mensagens \"link-local\"/\"zeroconf\"" #: ../src/common/config.py:91 +msgid "Language used by speller" +msgstr "Idioma usado pelo corretor ortográfico" + +#: ../src/common/config.py:92 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" "'never' - never print time." msgstr "" +"'sempre' - mostrar hora para cada mensagem.\n" +"'às vezes' - mostrar hora a cada print_ichat_every_foo_minutes minutos.\n" +"'nunca' - nunca mostrar a hora." -#: ../src/common/config.py:92 +#: ../src/common/config.py:93 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " -"to disable fuzzyclock. 1 is the most precise clock, 4 the less precise one. " +"to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " "This is used only if print_time is 'sometimes'." msgstr "" - -#: ../src/common/config.py:95 -msgid "Treat * / _ pairs as possible formatting characters." -msgstr "Aproveite * /_ pares como caráteres possíveis do formato. " +"Mostrar a hora nas conversas usando relógio impreciso. O valor de imprecisão " +"varia de 1 a 4, 0 desabilita a função. 1 é relógio mais preciso, 4 é o " +"menos. Isto é usado apenas se o valor de print_time for 'às vezes'." #: ../src/common/config.py:96 +msgid "Treat * / _ pairs as possible formatting characters." +msgstr "Aproveite os pare * /_ como caracteres de formatação. " + +#: ../src/common/config.py:97 msgid "" "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" "Se verdadeiro, não remova */_. Assim * ABC * seja negrito(realce) mas com * " "* não removido." -#: ../src/common/config.py:99 +#: ../src/common/config.py:100 msgid "" -"Uses ReStructured text markup for HTML, plus ascii formatting if selected. " -"(If you want to use this, install docutils)" +"Uses ReStructured text markup to send HTML, plus ascii formatting if " +"selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" +"restructuredtext.html (If you want to use this, install docutils)" msgstr "" +"Usar marcação de texto ReStructured para HTML, mais formatação ASCII, se " +"selecionada. Para informações sobre sintaxe, veja http://docutils." +"sourceforge.net/docs/ref/rst/restructuredtext.html (Se você quiser usar " +"isso, instale o docutils)" -#: ../src/common/config.py:108 +#: ../src/common/config.py:109 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." msgstr "" +"Caracter a adicionar ao apelido quando se estiver usando o recurso de " +"completar apelido (tecla Tab) na conferência." -#: ../src/common/config.py:109 +#: ../src/common/config.py:110 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." msgstr "" +"O caracter a ser proposto para adicionar ao final do apelido desejado quando " +"ele já estiver sendo usado por outra pessoa na conferência." + +#: ../src/common/config.py:133 +msgid "" +"This option let you customize timestamp that is printed in conversation. For " +"exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " +"strftime for full documentation: http://docs.python.org/lib/module-time.html" +msgstr "" +"Esta opção lhe permite personalizar o carimbo de tempo que é exibido na " +"conversação. Por exemplo: \"[%H:%M]\" mostrará \"[hora:minuto]\". Procure " +"por strftime na documentação do Python: http://docs.python.org/lib/module-" +"time.html" + +#: ../src/common/config.py:134 +msgid "Characters that are printed before the nickname in conversations" +msgstr "Os caracteres que são exibidos antes do apelido nas conversas" + +#: ../src/common/config.py:135 +msgid "Characters that are printed after the nickname in conversations" +msgstr "Os caracteres que são exibidos após o apelidos nas conversas" #: ../src/common/config.py:142 msgid "Add * and [n] in roster title?" -msgstr "Adicionar * e [n] no arquivo de lista?" +msgstr "Adicionar * e [n] no título da lista?" #: ../src/common/config.py:143 msgid "" "How many lines to remember from previous conversation when a chat tab/window " "is reopened." msgstr "" -"Quantas linhas para lembrar da conversação precedente quando uma aba/janela " -"de bate-papo for reaberto." +"Quantas linhas lembrar da conversação anterior quando uma aba/janela de bate-" +"papo for reaberta." #: ../src/common/config.py:144 msgid "How many minutes should last lines from previous conversation last." msgstr "" -"Quantos minutos devem durar linhas do último precedente da conversação." +"Quantos minutos mostrar ao exibir as últimas linhas da conversação anterior." #: ../src/common/config.py:145 msgid "" "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " "Client default behaviour)." msgstr "" -"Enviar a mensagem com Ctrl+Enter e com entram fazem a linha nova " +"Enviar a mensagem com Ctrl+Enter e criar uma nova linha com Enter " "(comportamento padrão do cliente ICQ da Mirabilis)." #: ../src/common/config.py:147 msgid "How many lines to store for Ctrl+KeyUP." -msgstr "Quantas linhas à armazenar para Ctrl+KeyUP." +msgstr "Quantas linhas armazenar com Ctrl+Acima." #: ../src/common/config.py:150 #, python-format @@ -5578,7 +5780,7 @@ msgid "" "Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' " "which means use wiktionary." msgstr "" -"Um ou outro URL costuma vir com o %s nele onde %s é a palvra/frase ou ' em " +"Uma ou outra URL costuma vir com %s onde %s é a palvra/frase ou ' em " "WIKTIONARY ' que significam o uso wiktionary." #: ../src/common/config.py:153 @@ -5593,53 +5795,62 @@ msgid "" "False and they sync with global status) based upon the status of the network " "connection." msgstr "" +"Se Verdadeiro, ouve aos sinais do D-Bus do NetworkManager e altera os status " +"das contas (fornecido se eles não tiverem a opção listen_to_network_manager " +"configurado para Falso e se estiverem sincronizadas com o status global) " +"baseado no status da conexão de rede." #: ../src/common/config.py:155 msgid "" "Sent chat state notifications. Can be one of all, composing_only, disabled." msgstr "" +"Notificações de estado de conversa enviados. Pode ser one of all, " +"composing_only, disabled." #: ../src/common/config.py:156 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." msgstr "" +"Notificações de estado de conversa exibidos nas janelas de conversa. Pode " +"ser one of all, composing_only, disabled." #: ../src/common/config.py:158 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." msgstr "" +"Quando não estiver exibindo a hora para cada mensagem (print_time == " +"simetimes), exibi-lo a cada x minutos." #: ../src/common/config.py:159 msgid "Ask before closing a group chat tab/window." msgstr "Perguntar antes de fechar um aba ou janela de conferência." #: ../src/common/config.py:160 -#, fuzzy msgid "" "Always ask before closing group chat tab/window in this space separated list " "of group chat jids." msgstr "" -"Sempre perguntar antes de fechar um aba/janela neste espaço listas de salas " -"separadas por jids." +"Sempre perguntar antes de fechar um aba/janela nesta lista separada por " +"espaço de JID's de conferências." #: ../src/common/config.py:161 -#, fuzzy msgid "" "Never ask before closing group chat tab/window in this space separated list " "of group chat jids." msgstr "" -"Nunca perguntar antes de fechar uma aba/janela de conferência neste espaço " -"listas de salas separadas por jids." +"Nunca perguntar antes de fechar uma aba/janela de conferência nesta lista " +"separada por espaço de salas separadas por jids." #: ../src/common/config.py:164 msgid "" -"Overrides the host we send for File Transfer in case of address translation/" -"port forwarding." +"Comma separated list of hosts that we send, in addition of local interfaces, " +"for File Transfer in case of address translation/port forwarding." msgstr "" -"Cancela o host que nos enviou um transferência de arquivo caso que foi " -"direcionado do endereço tradução/porta." +"Lista separada por vírgula dos servidores que nós enviaremos, em adição às " +"interfaces locais, para Transferência de Arquivo no caso de tradução de " +"endereço/encaminhamento de porta." #: ../src/common/config.py:166 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." @@ -5647,28 +5858,26 @@ msgstr "Padrão da IEC diz que KiB = 1024 bytes e KB = 1000 bytes." #: ../src/common/config.py:168 msgid "Notify of events in the system trayicon." -msgstr "" +msgstr "Notificar os eventos no ícone da bandeja do sistema." #: ../src/common/config.py:174 msgid "Show tab when only one conversation?" msgstr "Mostrar aba quando tiver apenas uma bate papo?" #: ../src/common/config.py:175 -#, fuzzy msgid "Show tabbed notebook border in chat windows?" -msgstr "Mostrar borda da aba com apenas um bate papo?" +msgstr "Mostrar borda de caderno tabulada nas janelas de conversa?" #: ../src/common/config.py:176 msgid "Show close button in tab?" msgstr "Mostrar botão de fechar na aba?" #: ../src/common/config.py:189 -#, fuzzy msgid "" "A semicolon-separated list of words that will be highlighted in group chats." msgstr "" -"Uma lista semicolon-separada das palavras que serão destacadas no bate-papo " -"multi-user." +"Uma lista separada por ponto-e-vírgula das palavras que serão destacadas nas " +"conferências." #: ../src/common/config.py:190 msgid "" @@ -5679,8 +5888,10 @@ msgstr "" "opção só faz sentido quando a opção trayicon está sendo usada." #: ../src/common/config.py:191 -msgid "If True, Gajim registers for xmpp:// on each startup." -msgstr "Se verdadeiro, Gajim registra-se para xmpp:// a cada inicialização." +msgid "" +"If True, Gajim will check if it's the default jabber client on each startup." +msgstr "" +"Se Verdadeiro, o Gajim verifica ao iniciar se é o cliente Jabber padrão." #: ../src/common/config.py:192 msgid "" @@ -5691,13 +5902,12 @@ msgstr "" "lidas. Dependendo do tema, este ícone pode ser animado." #: ../src/common/config.py:193 -#, fuzzy msgid "" "If True, Gajim will display the status message, if not empty, for every " "contact under the contact name in roster window." msgstr "" -"Se verdadeiro, Gajim indicará a mensagem de status, se não, esvazía-a, para " -"cada contato sob o nome do contato na janela da lista" +"Se Verdadeiro, o Gajim indicará a mensagem de status, se não estiver vazia, " +"para cada contato sob o nome do contato na janela da lista." #: ../src/common/config.py:195 msgid "" @@ -5708,43 +5918,48 @@ msgstr "" "ou tem um cache que é velho demais." #: ../src/common/config.py:196 -#, fuzzy msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." msgstr "" -"Se falso, você verá não mais por muito tempo a linha de status nos bate-" -"papos quando um contato muda seu ou seu status e/ou sua mensagem do status." +"Se Falso, você não verá por mais muito tempo a linha de status nas conversas " +"quando um contato alterar seu status e/ou sua mensagem de status." #: ../src/common/config.py:197 msgid "" "can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " "longer print status line in groupchats when a member changes his or her " "status and/or his or her status message. If \"all\" Gajim will print all " -"status messages. If \"in_and_out\", gajim will only print FOO enters/leaves " +"status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " "group chat." msgstr "" +"pode ser \"none\" (nenhum), \"all\" (todos) ou \"in_and_out\" (dentro e " +"fora). Se for \"none\", o Gajim não mostrará mais o status nas conferências " +"quando um membro alterar seu status e/ou sua mensagem de status. Se for \"all" +"\" o Gajim exibirá todas as mensagens de status. Se for \"in_and_out\" o " +"Gajim só mostrará FOO entradas/saídas em conferências." #: ../src/common/config.py:199 msgid "Background color of contacts when they just signed in." -msgstr "" +msgstr "Cor de fundo dos contatos quando eles simplesmente conectarem." #: ../src/common/config.py:200 msgid "Background color of contacts when they just signed out." -msgstr "" +msgstr "Cor de fundo dos contatos quando eles simplesmente desconectarem." #: ../src/common/config.py:202 msgid "" "If True, restored messages will use a smaller font than the default one." msgstr "" +"Se Verdadeiro, as mensagens restauradas usarão uma fonte menor que o padrão." #: ../src/common/config.py:203 msgid "Don't show avatar for the transport itself." -msgstr "" +msgstr "Não mostrar o avatar para o próprio transporte." #: ../src/common/config.py:204 msgid "Don't show roster in the system taskbar." -msgstr "" +msgstr "Não mostrar a lista na bandeja do sistema." #: ../src/common/config.py:205 msgid "" @@ -5757,19 +5972,17 @@ msgstr "" "Janela) quando esperam eventos pendentes." #: ../src/common/config.py:207 -#, fuzzy msgid "" "Jabberd1.4 does not like sha info when one join a password protected group " "chat. Turn this option to False to stop sending sha info in group chat " "presences." msgstr "" -"Jabberd1.4 não trata informações do sha quando entra numa sala protegida por " -"senha. Mude esta opção para Falso para parar de emitir as informações sha em " -"presenças de conferências" +"O Jabberd1.4 não trata informações sha quando alguém entra numa sala " +"protegida por senha. Mude esta opção para Falso para parar de emitir as " +"informações sha na presenças de conferências." #. always, never, peracct, pertype should not be translated #: ../src/common/config.py:210 -#, fuzzy msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" @@ -5788,25 +6001,21 @@ msgstr "" "requer o reinício do Gajim antes que tenham efeito." #: ../src/common/config.py:211 -#, fuzzy msgid "If False, you will no longer see the avatar in the chat window." msgstr "" -"Se Falso, você não verá por muito tempo o avatar na janela do bate-papo" +"Se Falso, você não verá por muito tempo o avatar na janela do bate-papo." #: ../src/common/config.py:212 -#, fuzzy msgid "If True, pressing the escape key closes a tab/window." -msgstr "Se Verdadeiro, pressionando a tecla escape fecha a aba/janela" +msgstr "Se Verdadeiro, pressionando a tecla Esc fecha a aba/janela" #: ../src/common/config.py:213 -#, fuzzy msgid "Hides the buttons in group chat window." -msgstr "Esconder os botões na janela de conferência" +msgstr "Esconder os botões na janela de conferência." #: ../src/common/config.py:214 -#, fuzzy msgid "Hides the buttons in two persons chat window." -msgstr "Esconder os botões na janela de conversa para duas pessoas " +msgstr "Esconder os botões na janela de conversa para duas pessoas." #: ../src/common/config.py:215 msgid "Hides the banner in a group chat window" @@ -5817,53 +6026,97 @@ msgid "Hides the banner in two persons chat window" msgstr "Esconder o banner na janela de conversa para duas pessoas " #: ../src/common/config.py:217 -#, fuzzy msgid "Hides the group chat occupants list in group chat window." -msgstr "Esconder a lista dos ocupantes da sala na janela da conferência" +msgstr "Esconder a lista dos ocupantes da sala na janela da conferência." #: ../src/common/config.py:218 msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." msgstr "" +"Em uma conferência, mostrar o apelido no começo da linha apenas quando a " +"mensagem atual não for da mesma pessoa que mandou a última." #: ../src/common/config.py:219 -msgid "Indentation when using merge consecutive nickame." -msgstr "" +msgid "Indentation when using merge consecutive nickname." +msgstr "Usar identação ao mesclar apelidos consecutivos." #: ../src/common/config.py:220 msgid "List of colors that will be used to color nicknames in group chats." msgstr "" +"A lista de cores que serão usadas para os apelidos nas salas de conferência." #: ../src/common/config.py:221 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "" +"Quando nenhum aba tiver uma mensagem não lida, Ctrl + Tab vai para a próxima " +"aba." #: ../src/common/config.py:222 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." msgstr "" +"Devemos mostrar o diálogo de confirmação de metacontatos ou não? Uma string " +"vazia significa que nós nunca devemos mostrar o diálogo." #: ../src/common/config.py:223 msgid "" "If True, you will be able to set a negative priority to your account in " -"account modification window. BE CAREFULL, when you are logged in with a " +"account modification window. BE CAREFUL, when you are logged in with a " "negative priority, you will NOT receive any message from your server." msgstr "" +"Se Verdadeiro, você poderá especificar uma prioridade negativa para a sua " +"conta na janela de modificação da conta. CUIDADO, quando você estiver " +"autenticado com uma prioridade negativa, você NÃO poderá receber nenhuma " +"mensagem do seu servidor." -#: ../src/common/config.py:234 +#: ../src/common/config.py:224 +msgid "" +"If True, Gajim will use Gnome Keyring (if available) to store account " +"passwords." +msgstr "" +"Se Verdadeiro, o Gajim usará o Gnome Keyring (se disponível) para armazenar " +"as senhas das contas." + +#: ../src/common/config.py:225 +msgid "" +"If True, Gajim will show number of online and total contacts in account and " +"group rows." +msgstr "" +"Se Verdadeiro, o Gajim mostrará o número de contatos online e do total de " +"contatos nas linha de conta e grupo." + +#: ../src/common/config.py:226 +msgid "" +"Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " +"as if they were of this type" +msgstr "" +"Pode ser vazio, 'chat' ou 'normal'. Se for vazio, trata todas as mensagens " +"recebidas como se elas fossem do tipo especificado" + +#: ../src/common/config.py:227 +msgid "" +"If True, Gajim will scroll and select the contact who sent you the last " +"message, if chat window is not already opened." +msgstr "" +"Se Verdadeiro, o Gajim irá rolar e selecionar o contato que lhe enviou a " +"última mensagem, se a janela de conversa ainda não estiver aberta." + +#: ../src/common/config.py:238 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." msgstr "" +"A prioridade será alterada automaticamente de acordo com o o seu status. As " +"prioridades são definidas nas opções autopriority_." #. yes, no, ask -#: ../src/common/config.py:263 +#: ../src/common/config.py:267 msgid "Jabberd2 workaround" msgstr "Jabberd2 rodando" -#: ../src/common/config.py:267 +#: ../src/common/config.py:271 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." @@ -5871,206 +6124,201 @@ msgstr "" "Se checado, o Gaijm usará seu IP e proxies definidos no " "file_transfer_proxies, em opções para transferência de arquivos." -#: ../src/common/config.py:326 -#, fuzzy +#: ../src/common/config.py:330 msgid "Is OpenPGP enabled for this contact?" -msgstr "OpenPGP não disponível neste computador" +msgstr "O OpenPGP está ativado para este contato?" -#: ../src/common/config.py:327 ../src/common/config.py:330 +#: ../src/common/config.py:331 ../src/common/config.py:334 msgid "Language for which we want to check misspelled words" -msgstr "" +msgstr "Idioma a usar na verificação ortográficas das palavras" -#: ../src/common/config.py:336 +#: ../src/common/config.py:340 msgid "all or space separated status" -msgstr "" +msgstr "todos ou lista de status separados por espaço" -#: ../src/common/config.py:337 +#: ../src/common/config.py:341 msgid "'yes', 'no', or 'both'" -msgstr "" +msgstr "'sim', 'não' ou 'ambos'" -#: ../src/common/config.py:338 ../src/common/config.py:340 -#: ../src/common/config.py:341 ../src/common/config.py:344 -#: ../src/common/config.py:345 +#: ../src/common/config.py:342 ../src/common/config.py:344 +#: ../src/common/config.py:345 ../src/common/config.py:348 +#: ../src/common/config.py:349 msgid "'yes', 'no' or ''" -msgstr "" +msgstr "'sim', 'não', ou ''" -#: ../src/common/config.py:351 +#: ../src/common/config.py:355 msgid "Sleeping" msgstr "Dormindo" -#: ../src/common/config.py:352 +#: ../src/common/config.py:356 msgid "Back soon" msgstr "Volto logo" -#: ../src/common/config.py:352 +#: ../src/common/config.py:356 msgid "Back in some minutes." msgstr "Volto em alguns minutos." -#: ../src/common/config.py:353 +#: ../src/common/config.py:357 msgid "Eating" msgstr "Comendo" -#: ../src/common/config.py:353 +#: ../src/common/config.py:357 msgid "I'm eating, so leave me a message." msgstr "Eu estou comendo, então deixe-me uma mensagem." -#: ../src/common/config.py:354 +#: ../src/common/config.py:358 msgid "Movie" msgstr "Filme" -#: ../src/common/config.py:354 +#: ../src/common/config.py:358 msgid "I'm watching a movie." msgstr "Estou assistindo um filme." -#: ../src/common/config.py:355 +#: ../src/common/config.py:359 msgid "Working" msgstr "Trabalhando" -#: ../src/common/config.py:355 +#: ../src/common/config.py:359 msgid "I'm working." msgstr "Estou trabalhando." -#: ../src/common/config.py:356 +#: ../src/common/config.py:360 msgid "Phone" msgstr "Telefone" -#: ../src/common/config.py:356 +#: ../src/common/config.py:360 msgid "I'm on the phone." msgstr "Estou no telefone." -#: ../src/common/config.py:357 +#: ../src/common/config.py:361 msgid "Out" msgstr "Estou fora" -#: ../src/common/config.py:357 -#, fuzzy -msgid "I'm out enjoying life." -msgstr "Estou fora curtindo a vida" - #: ../src/common/config.py:361 -#, fuzzy -msgid "I'm available." -msgstr "Disponível" - -#: ../src/common/config.py:362 -#, fuzzy -msgid "I'm free for chat." -msgstr "Livre para Conversa" - -#: ../src/common/config.py:364 -#, fuzzy -msgid "I'm not available." -msgstr "Serviço não disponível" +msgid "I'm out enjoying life." +msgstr "Estou fora curtindo a vida." #: ../src/common/config.py:365 +msgid "I'm available." +msgstr "Estou disponível." + +#: ../src/common/config.py:366 +msgid "I'm free for chat." +msgstr "Estou livre para conversar." + +#: ../src/common/config.py:368 +msgid "I'm not available." +msgstr "Não estou disponível." + +#: ../src/common/config.py:369 msgid "Do not disturb." -msgstr "" +msgstr "Não perturbe." -#: ../src/common/config.py:366 ../src/common/config.py:367 +#: ../src/common/config.py:370 ../src/common/config.py:371 msgid "Bye!" -msgstr "" +msgstr "Tchau!" -#: ../src/common/config.py:376 -#, fuzzy +#: ../src/common/config.py:380 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 "" "Som para tocar quando uma mensagem MUC conter uma das palavras no " -"muc_hightlight_words, ou quando uma mensagem MUC conter seu apelido." +"muc_hightlight_words, ou quando uma mensagem MUC contiver seu apelido." -#: ../src/common/config.py:377 +#: ../src/common/config.py:381 msgid "Sound to play when any MUC message arrives." -msgstr "" +msgstr "Som a ser tocado quando qualquer mensagem MUC chegar." -#: ../src/common/config.py:386 ../src/common/optparser.py:197 +#: ../src/common/config.py:390 ../src/common/optparser.py:195 msgid "green" msgstr "verde" -#: ../src/common/config.py:390 ../src/common/optparser.py:183 +#: ../src/common/config.py:394 ../src/common/optparser.py:181 msgid "grocery" msgstr "mantimento" -#: ../src/common/config.py:394 +#: ../src/common/config.py:398 msgid "human" msgstr "humano" -#: ../src/common/config.py:398 +#: ../src/common/config.py:402 msgid "marine" msgstr "marinho" #: ../src/common/connection_handlers.py:52 #: ../src/common/zeroconf/connection_handlers_zeroconf.py:44 -#, fuzzy msgid "Unable to load idle module" -msgstr "Impossível ingressar na sala" +msgstr "Incapaz de carregar o módulo inativo" -#: ../src/common/connection_handlers.py:177 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 -#, fuzzy +#: ../src/common/connection_handlers.py:180 +#: ../src/common/connection_handlers.py:215 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 msgid "Wrong host" -msgstr "Frase de acesso Errada" +msgstr "Servidor errado" -#: ../src/common/connection_handlers.py:177 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 +#: ../src/common/connection_handlers.py:180 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 +#, python-format msgid "" -"The host you configured as the ft_override_host_to_send advanced option is " +"The host %s you configured as the ft_add_hosts_to_send advanced option is " "not valid, so ignored." msgstr "" +"O computador %s que você especificou na configuração avançada " +"ft_override_host_to_send não é válido e será ignorado." -#: ../src/common/connection_handlers.py:590 +#: ../src/common/connection_handlers.py:216 +msgid "Invalid local address? :-O" +msgstr "Endereço local inválido? :-O" + +#: ../src/common/connection_handlers.py:607 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "A informação do registo para o transporte %s não chegou a tempo" -#: ../src/common/connection_handlers.py:1523 -#, fuzzy, python-format +#: ../src/common/connection_handlers.py:1550 +#, python-format msgid "Nickname not allowed: %s" -msgstr "Apelido não encontrado: %s" +msgstr "Apelido não permitido: %s" #. password required to join #. we are banned #. group chat does not exist -#: ../src/common/connection_handlers.py:1585 -#: ../src/common/connection_handlers.py:1588 -#: ../src/common/connection_handlers.py:1591 -#: ../src/common/connection_handlers.py:1594 -#: ../src/common/connection_handlers.py:1597 -#: ../src/common/connection_handlers.py:1600 -#: ../src/common/connection_handlers.py:1608 -#, fuzzy +#: ../src/common/connection_handlers.py:1615 +#: ../src/common/connection_handlers.py:1618 +#: ../src/common/connection_handlers.py:1621 +#: ../src/common/connection_handlers.py:1624 +#: ../src/common/connection_handlers.py:1627 +#: ../src/common/connection_handlers.py:1630 +#: ../src/common/connection_handlers.py:1638 msgid "Unable to join group chat" msgstr "Impossível ingressar na sala" -#: ../src/common/connection_handlers.py:1586 -#, fuzzy +#: ../src/common/connection_handlers.py:1616 msgid "A password is required to join this group chat." msgstr "Uma senha é requerida para entrar nesta sala." -#: ../src/common/connection_handlers.py:1589 -#, fuzzy +#: ../src/common/connection_handlers.py:1619 msgid "You are banned from this group chat." msgstr "Você está banido desta sala." -#: ../src/common/connection_handlers.py:1592 -#, fuzzy +#: ../src/common/connection_handlers.py:1622 msgid "Such group chat does not exist." msgstr "Tal sala não existe." -#: ../src/common/connection_handlers.py:1595 -#, fuzzy +#: ../src/common/connection_handlers.py:1625 msgid "Group chat creation is restricted." msgstr "A criação de sala é restrita." -#: ../src/common/connection_handlers.py:1598 +#: ../src/common/connection_handlers.py:1628 msgid "Your registered nickname must be used." msgstr "Seu nickname registado deve ser usado." -#: ../src/common/connection_handlers.py:1601 +#: ../src/common/connection_handlers.py:1631 msgid "You are not in the members list." msgstr "Você não está na lista de membros." -#: ../src/common/connection_handlers.py:1609 +#: ../src/common/connection_handlers.py:1639 msgid "" "Your desired nickname is in use or registered by another occupant.\n" "Please specify another nickname below:" @@ -6078,110 +6326,151 @@ msgstr "" "Seu nickname desejado está em uso ou registado por um outro usuário.\n" " Por favor, especifique um outro nickname abaixo:" -#: ../src/common/connection_handlers.py:1659 +#. Room has been destroyed. see +#. http://www.xmpp.org/extensions/xep-0045.html#destroyroom +#: ../src/common/connection_handlers.py:1682 +msgid "Room has been destroyed" +msgstr "A sala foi excluída" + +#: ../src/common/connection_handlers.py:1689 +#, python-format +msgid "You can join this room instead: %s" +msgstr "Você pode entrar nessa sala ao invés: %s" + +#: ../src/common/connection_handlers.py:1715 msgid "I would like to add you to my roster." msgstr "Eu gostaria de adiciona-lo à minha lista." #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:1680 +#: ../src/common/connection_handlers.py:1736 #, python-format msgid "we are now subscribed to %s" msgstr "nós estamos agora inscritos para %s" -#: ../src/common/connection_handlers.py:1682 +#: ../src/common/connection_handlers.py:1738 #, python-format msgid "unsubscribe request from %s" msgstr "Remoção de Inscrição solicitada por %s" -#: ../src/common/connection_handlers.py:1684 +#: ../src/common/connection_handlers.py:1740 #, python-format msgid "we are now unsubscribed from %s" msgstr "nós estamos agora sem inscrição para %s" -#: ../src/common/connection_handlers.py:1854 -#, fuzzy, python-format +#: ../src/common/connection_handlers.py:1859 +#, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " "management tools such as http://jru.jabberstudio.org/ to remove it" msgstr "" -"O Jid %s não é uma compilação da RFC. Não se adicionará a sua lista. Use " +"O JID %s não é uma compilação da RFC. Não se adicionará a sua lista. Use " "ferramentas de gerência da lista como http://jru.jabberstudio.org/ para " "removê-lo" -#: ../src/common/connection.py:175 -#: ../src/common/zeroconf/connection_zeroconf.py:196 +#: ../src/common/connection.py:194 +#: ../src/common/zeroconf/connection_zeroconf.py:198 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Conexão com a conta \"%s\" foi perdida" -#: ../src/common/connection.py:176 +#: ../src/common/connection.py:195 msgid "Reconnect manually." -msgstr "" +msgstr "Reconecte manualmente." -#: ../src/common/connection.py:187 ../src/common/connection.py:214 -#, fuzzy, python-format +#: ../src/common/connection.py:206 ../src/common/connection.py:233 +#, python-format msgid "Transport %s answered wrongly to register request: %s" -msgstr "Transporte %s respondido errado para registar o pedido." +msgstr "Transporte %s respondeu errado para registar o pedido: %s" #. wrong answer -#: ../src/common/connection.py:213 +#: ../src/common/connection.py:232 msgid "Invalid answer" msgstr "Resposta inválida" -#: ../src/common/connection.py:405 ../src/common/connection.py:440 -#: ../src/common/connection.py:889 -#: ../src/common/zeroconf/connection_zeroconf.py:217 +#: ../src/common/connection.py:380 +msgid "Connection to proxy failed" +msgstr "Falha na conexão com o proxy" + +#: ../src/common/connection.py:434 ../src/common/connection.py:532 +#: ../src/common/connection.py:1003 +#: ../src/common/zeroconf/connection_zeroconf.py:219 #, python-format msgid "Could not connect to \"%s\"" msgstr "Impossível conectar a \"%s\"" -#: ../src/common/connection.py:419 +#: ../src/common/connection.py:448 #, python-format msgid "Connected to server %s:%s with %s" msgstr "Conectado ao servidor %s:%s com %s" -#: ../src/common/connection.py:441 +#: ../src/common/connection.py:461 +#, python-format +msgid "Security error connecting to \"%s\"" +msgstr "Erro de segurança ao conectar a \"%s\"" + +#: ../src/common/connection.py:462 +msgid "" +"The server's key has changed, or someone is trying to hack your connection." +msgstr "" +"A chave do servidor foi alterada ou alguém está tentando hackear a sua " +"conexão." + +#: ../src/common/connection.py:469 +#, python-format +msgid "Unable to check fingerprint for %s. Connection could be insecure." +msgstr "" +"Incapaz de verifica a impressão digital de %s. A conexão pode ser insegura." + +#: ../src/common/connection.py:511 +#, python-format +msgid "Missing fingerprint in SSL connection to %s" +msgstr "Faltando impressão digital na conexão SSL para %s" + +#: ../src/common/connection.py:517 +#, python-format +msgid "Fingerprint mismatch for %s: Got %s, expected %s" +msgstr "Conflito de impressões digitais para %s: obtido %s, esperado %s" + +#: ../src/common/connection.py:533 msgid "Check your connection or try again later" msgstr "Verifique sua conexão ou tente novamente mais tarde" -#: ../src/common/connection.py:467 +#: ../src/common/connection.py:559 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Falha na autenticação com \"%s\"" -#: ../src/common/connection.py:468 +#: ../src/common/connection.py:560 msgid "Please check your login and password for correctness." msgstr "Por favor, verifique seu login e senha para exatidão." +#: ../src/common/connection.py:603 +msgid "Error while removing privacy list" +msgstr "Erro ao remover lista de privacidade" + +#: ../src/common/connection.py:604 +#, 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 "" +"A lista de privacidade %s não foi removida. Ela pode estar ativa em um ou " +"mais recursos conectados. Desative-os e tente novamente." + #. We didn't set a passphrase -#: ../src/common/connection.py:585 -#: ../src/common/zeroconf/connection_zeroconf.py:156 +#: ../src/common/connection.py:702 +#: ../src/common/zeroconf/connection_zeroconf.py:158 msgid "OpenPGP passphrase was not given" msgstr "Palavra-chave do OpenPGP não foi recebida" -#. do not show I'm invisible! -#: ../src/common/connection.py:627 -msgid "invisible" -msgstr "invisível" - -#: ../src/common/connection.py:628 -msgid "offline" -msgstr "desconectado" - -#: ../src/common/connection.py:629 -#, python-format -msgid "I'm %s" -msgstr "Eu estou %s" - #. we're not english #. one in locale and one en -#: ../src/common/connection.py:720 -#, fuzzy +#: ../src/common/connection.py:833 msgid "[This message is *encrypted* (See :JEP:`27`]" -msgstr "[Esta mensagem está criptografada]" +msgstr "[Esta mensagem está *criptografada* (Veja:JEP:'27')]" -#: ../src/common/connection.py:776 -#: ../src/common/zeroconf/connection_zeroconf.py:397 +#: ../src/common/connection.py:889 +#: ../src/common/zeroconf/connection_zeroconf.py:399 #, python-format msgid "" "Subject: %s\n" @@ -6190,9 +6479,13 @@ msgstr "" "Assunto: %s\n" "%s" -#: ../src/common/connection.py:915 +#: ../src/common/connection.py:1029 msgid "Not fetched because of invisible status" -msgstr "" +msgstr "Não baixado por causa do status invisível" + +#: ../src/common/contacts.py:271 +msgid "Not in roster" +msgstr "Fora da lista" #. only say that to non Windows users #: ../src/common/dbus_support.py:33 @@ -6205,1025 +6498,519 @@ msgstr "As potencialidades do D-Bus no Gajim não podem ser usadas" #: ../src/common/exceptions.py:22 msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." -msgstr "pysqlite2 (aka python-pysqlite2) está faltando. Encerrando..." +msgstr "O pysqlite2 (ou python-pysqlite2) está faltando. Encerrando..." #: ../src/common/exceptions.py:30 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "" -"Serviço nao disponível: Gajim não está funcionando, ou o remote_control é " +"Serviço não disponível: o Gajim não está funcionando ou o controle remoto é " "falso" #: ../src/common/exceptions.py:38 msgid "D-Bus is not present on this machine or python module is missing" -msgstr "D-Bus não está presente nesta máquina o módulo python está faltando" +msgstr "" +"O D-Bus não está presente nesta máquina ou o módulo do Python está faltando" #: ../src/common/exceptions.py:46 msgid "" "Session bus is not available.\n" "Try reading http://trac.gajim.org/wiki/GajimDBus" msgstr "" -"Sessão não está disponível.\n" -"Tente lendo http://trac.gajim.org/wiki/GajimDBus" +"O bus de sessão não está disponível.\n" +"Veja http://trac.gajim.org/wiki/GajimDBus" #: ../src/common/fuzzyclock.py:42 -#, fuzzy msgid "one" -msgstr "Nenhum" +msgstr "um" #: ../src/common/fuzzyclock.py:42 -#, fuzzy msgid "two" -msgstr "quem" +msgstr "dois" #: ../src/common/fuzzyclock.py:42 -#, fuzzy msgid "three" -msgstr "Rua:" +msgstr "três" #: ../src/common/fuzzyclock.py:42 -#, fuzzy msgid "four" -msgstr "Porta:" +msgstr "quatro" #: ../src/common/fuzzyclock.py:42 -#, fuzzy msgid "five" -msgstr "arquivo" +msgstr "cinco" #: ../src/common/fuzzyclock.py:42 msgid "six" -msgstr "" +msgstr "seis" #: ../src/common/fuzzyclock.py:43 -#, fuzzy msgid "seven" -msgstr "Evento" +msgstr "sete" #: ../src/common/fuzzyclock.py:43 msgid "eight" -msgstr "" +msgstr "oito" #: ../src/common/fuzzyclock.py:43 -#, fuzzy msgid "nine" -msgstr "_Continuar" +msgstr "nove" #: ../src/common/fuzzyclock.py:43 msgid "ten" -msgstr "" +msgstr "dez" #: ../src/common/fuzzyclock.py:43 -#, fuzzy msgid "eleven" -msgstr "Deletar" +msgstr "onze" #: ../src/common/fuzzyclock.py:44 msgid "twelve" -msgstr "" +msgstr "doze" #. Strings to use for the output. %0 will be replaced with the preceding hour (e.g. "x PAST %0"), %1 with the coming hour (e.g. "x TO %1). ''' #. A "singular-form". It is used when talking about hour 0 #: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 -msgid "%0 o'clock" -msgstr "" +msgid "$0 o'clock" +msgstr "$0 horas" #: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 -msgid "five past %0" -msgstr "" - -#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:56 -msgid "ten past %0" -msgstr "" +msgid "five past $0" +msgstr "$0 e cinco" #: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 -msgid "quarter past %0" -msgstr "" +msgid "ten past $0" +msgstr "$0 e dez" -#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:57 -msgid "twenty past %0" -msgstr "" +#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 +msgid "quarter past $0" +msgstr "$0 e quinze" #: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 -msgid "twenty five past %0" -msgstr "" +msgid "twenty past $0" +msgstr "$0 e vinte" -#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:58 -msgid "half past %0" -msgstr "" +#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 +msgid "twenty five past $0" +msgstr "$0 e vinte e cinco" #: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 -msgid "twenty five to %1" -msgstr "" +msgid "half past $0" +msgstr "$0 e meia" -#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:59 -msgid "twenty to %1" -msgstr "" +#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 +msgid "twenty five to $1" +msgstr "vinte e cinco para as $1" #: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 -msgid "quarter to %1" -msgstr "" +msgid "twenty to $1" +msgstr "vinte para as $1" -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:60 -#, fuzzy -msgid "ten to %1" -msgstr "Registro para %s" - -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:60 -msgid "five to %1" -msgstr "" +#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 +msgid "quarter to $1" +msgstr "quinze para as $1" #: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 -msgid "%1 o'clock" -msgstr "" +msgid "ten to $1" +msgstr "dez para as $1" -#: ../src/common/fuzzyclock.py:62 +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +msgid "five to $1" +msgstr "cinco para as $1" + +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:61 +msgid "$1 o'clock" +msgstr "$1 horas" + +#: ../src/common/fuzzyclock.py:64 msgid "Night" -msgstr "" +msgstr "Noite" -#: ../src/common/fuzzyclock.py:62 +#: ../src/common/fuzzyclock.py:64 msgid "Early morning" -msgstr "" +msgstr "Madrugada" -#: ../src/common/fuzzyclock.py:62 -#, fuzzy +#: ../src/common/fuzzyclock.py:64 msgid "Morning" -msgstr "Trabalhando" +msgstr "Manhã" -#: ../src/common/fuzzyclock.py:62 +#: ../src/common/fuzzyclock.py:64 msgid "Almost noon" -msgstr "" +msgstr "Quase meio-dia" -#: ../src/common/fuzzyclock.py:63 -#, fuzzy +#: ../src/common/fuzzyclock.py:65 msgid "Noon" -msgstr "Nenhum" +msgstr "Meio-dia" -#: ../src/common/fuzzyclock.py:63 +#: ../src/common/fuzzyclock.py:65 msgid "Afternoon" -msgstr "" +msgstr "Tarde" -#: ../src/common/fuzzyclock.py:63 -#, fuzzy +#: ../src/common/fuzzyclock.py:65 msgid "Evening" -msgstr "Evento" +msgstr "Noite" -#: ../src/common/fuzzyclock.py:63 +#: ../src/common/fuzzyclock.py:65 msgid "Late evening" -msgstr "" +msgstr "Tarde da noite" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:67 msgid "Start of week" -msgstr "" +msgstr "Começo da semana" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:67 msgid "Middle of week" -msgstr "" +msgstr "Meio da semana" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:67 msgid "End of week" -msgstr "" +msgstr "Fim da semana" -#: ../src/common/fuzzyclock.py:66 +#: ../src/common/fuzzyclock.py:68 msgid "Weekend!" -msgstr "" +msgstr "Final de semana!" -#: ../src/common/helpers.py:105 +#: ../src/common/helpers.py:114 msgid "Invalid character in username." msgstr "Caracter inválido no nome do usuário" -#: ../src/common/helpers.py:110 +#: ../src/common/helpers.py:119 msgid "Server address required." msgstr "Endereço do servidor é requerido." -#: ../src/common/helpers.py:115 +#: ../src/common/helpers.py:124 msgid "Invalid character in hostname." msgstr "Caracter inválido no nome do host" -#: ../src/common/helpers.py:121 +#: ../src/common/helpers.py:130 msgid "Invalid character in resource." msgstr "Caracter inválido no recurso." #. GiB means gibibyte -#: ../src/common/helpers.py:161 +#: ../src/common/helpers.py:170 #, python-format msgid "%s GiB" msgstr "%s GiB" #. GB means gigabyte -#: ../src/common/helpers.py:164 +#: ../src/common/helpers.py:173 #, python-format msgid "%s GB" msgstr "%s GB" #. MiB means mibibyte -#: ../src/common/helpers.py:168 +#: ../src/common/helpers.py:177 #, python-format msgid "%s MiB" msgstr "%s MiB" #. MB means megabyte -#: ../src/common/helpers.py:171 +#: ../src/common/helpers.py:180 #, python-format msgid "%s MB" msgstr "%s MB" #. KiB means kibibyte -#: ../src/common/helpers.py:175 +#: ../src/common/helpers.py:184 #, python-format msgid "%s KiB" msgstr "%s KiB" #. KB means kilo bytes -#: ../src/common/helpers.py:178 +#: ../src/common/helpers.py:187 #, python-format msgid "%s KB" msgstr "%s KB" #. B means bytes -#: ../src/common/helpers.py:181 +#: ../src/common/helpers.py:190 #, python-format msgid "%s B" msgstr "%s B" -#: ../src/common/helpers.py:210 +#: ../src/common/helpers.py:219 msgid "_Busy" msgstr "_Ocupado" -#: ../src/common/helpers.py:212 +#: ../src/common/helpers.py:221 msgid "Busy" msgstr "Ocupado" -#: ../src/common/helpers.py:215 +#: ../src/common/helpers.py:224 msgid "_Not Available" msgstr "_Não Disponível" -#: ../src/common/helpers.py:220 +#: ../src/common/helpers.py:229 msgid "_Free for Chat" msgstr "Livre para _Conversa" -#: ../src/common/helpers.py:222 +#: ../src/common/helpers.py:231 msgid "Free for Chat" msgstr "Livre para Conversa" -#: ../src/common/helpers.py:225 +#: ../src/common/helpers.py:234 msgid "_Available" msgstr "Dis_ponível" -#: ../src/common/helpers.py:227 +#: ../src/common/helpers.py:236 msgid "Available" msgstr "Disponível" -#: ../src/common/helpers.py:229 +#: ../src/common/helpers.py:238 msgid "Connecting" msgstr "Conectando" -#: ../src/common/helpers.py:232 +#: ../src/common/helpers.py:241 msgid "A_way" msgstr "_Afastado" -#: ../src/common/helpers.py:237 +#: ../src/common/helpers.py:246 msgid "_Offline" msgstr "_Desconectado" -#: ../src/common/helpers.py:239 +#: ../src/common/helpers.py:248 msgid "Offline" msgstr "Desconectado" -#: ../src/common/helpers.py:242 +#: ../src/common/helpers.py:251 msgid "_Invisible" msgstr "_Invisível" -#: ../src/common/helpers.py:248 +#: ../src/common/helpers.py:257 msgid "?contact has status:Unknown" msgstr "?contato tem status:Desconhecido" -#: ../src/common/helpers.py:250 +#: ../src/common/helpers.py:259 msgid "?contact has status:Has errors" msgstr "?contato tem status:Com erros" -#: ../src/common/helpers.py:255 +#: ../src/common/helpers.py:264 msgid "?Subscription we already have:None" msgstr "?Inscrição existente:Nenhuma" -#: ../src/common/helpers.py:257 +#: ../src/common/helpers.py:266 msgid "To" msgstr "Para" -#: ../src/common/helpers.py:261 +#: ../src/common/helpers.py:270 msgid "Both" msgstr "Ambos" -#: ../src/common/helpers.py:269 +#: ../src/common/helpers.py:278 msgid "?Ask (for Subscription):None" msgstr "?Pergunta (para Inscrição):Nenhuma" -#: ../src/common/helpers.py:271 +#: ../src/common/helpers.py:280 msgid "Subscribe" msgstr "Inscrever" -#: ../src/common/helpers.py:280 +#: ../src/common/helpers.py:289 msgid "?Group Chat Contact Role:None" msgstr "?Regra do Contato para Conversa em Grupo:Nenhuma" -#: ../src/common/helpers.py:283 +#: ../src/common/helpers.py:292 msgid "Moderators" msgstr "Moderadores" -#: ../src/common/helpers.py:285 +#: ../src/common/helpers.py:294 msgid "Moderator" msgstr "Moderador" -#: ../src/common/helpers.py:288 +#: ../src/common/helpers.py:297 msgid "Participants" msgstr "Participantes" -#: ../src/common/helpers.py:290 +#: ../src/common/helpers.py:299 msgid "Participant" msgstr "Participante" -#: ../src/common/helpers.py:293 +#: ../src/common/helpers.py:302 msgid "Visitors" msgstr "Visitantes" -#: ../src/common/helpers.py:295 +#: ../src/common/helpers.py:304 msgid "Visitor" msgstr "Visitante" -#: ../src/common/helpers.py:301 -#, fuzzy +#: ../src/common/helpers.py:310 msgid "?Group Chat Contact Affiliation:None" -msgstr "?Regra do Contato para Conversa em Grupo:Nenhuma" +msgstr "?Filiação do Contato de Conferência:Nenhuma" -#: ../src/common/helpers.py:303 -#, fuzzy +#: ../src/common/helpers.py:312 msgid "Owner" -msgstr "D_ono" +msgstr "Dono" -#: ../src/common/helpers.py:305 -#, fuzzy +#: ../src/common/helpers.py:314 msgid "Administrator" -msgstr "_Administrador" +msgstr "Administrador" -#: ../src/common/helpers.py:307 -#, fuzzy +#: ../src/common/helpers.py:316 msgid "Member" -msgstr "_Membro" +msgstr "Membro" -#: ../src/common/helpers.py:346 +#: ../src/common/helpers.py:355 msgid "is paying attention to the conversation" msgstr "está prestando a atenção na conversa" -#: ../src/common/helpers.py:348 +#: ../src/common/helpers.py:357 msgid "is doing something else" msgstr "está fazendo outra coisa" -#: ../src/common/helpers.py:350 +#: ../src/common/helpers.py:359 msgid "is composing a message..." -msgstr "está escrevendo uma mensagem..." +msgstr "está digitando..." -#. paused means he or she was compoing but has stopped for a while -#: ../src/common/helpers.py:353 +#. paused means he or she was composing but has stopped for a while +#: ../src/common/helpers.py:362 msgid "paused composing a message" -msgstr "pausa na digitação da mensagem" +msgstr "parou de digitar" -#: ../src/common/helpers.py:355 +#: ../src/common/helpers.py:364 msgid "has closed the chat window or tab" msgstr "fechou a janela de conversa ou aba" -#: ../src/common/helpers.py:881 -#, fuzzy, python-format +#: ../src/common/helpers.py:890 +#, python-format msgid " %d unread message" msgid_plural " %d unread messages" -msgstr[0] "Gajim - uma mensagem não lida" -msgstr[1] "Gajim - %d mensagens não lidas" +msgstr[0] "%d mensagem não lida" +msgstr[1] "%d mensagens não lidas" -#: ../src/common/helpers.py:887 -#, fuzzy, python-format +#: ../src/common/helpers.py:896 +#, python-format msgid " %d unread single message" msgid_plural " %d unread single messages" -msgstr[0] "Gajim - %d mensagem simples não lida" -msgstr[1] "Gajim - %d mensagens simples não lidas" +msgstr[0] "%d mensagem individual não lida" +msgstr[1] "%d mensagens individuais não lidas" -#: ../src/common/helpers.py:893 -#, fuzzy, python-format +#: ../src/common/helpers.py:902 +#, python-format msgid " %d unread group chat message" msgid_plural " %d unread group chat messages" -msgstr[0] "Gajim - %d mensagem de conferência não lida" -msgstr[1] "Gajim - %d mensagens de conferência não lidas" +msgstr[0] "%d mensagem de conferência não lida" +msgstr[1] "%d mensagens de conferência não lidas" -#: ../src/common/helpers.py:899 -#, fuzzy, python-format +#: ../src/common/helpers.py:908 +#, python-format msgid " %d unread private message" msgid_plural " %d unread private messages" -msgstr[0] "Gajim - %d mensagem privada não lida" -msgstr[1] "Gajim - %d mensagens privadas não lidas" +msgstr[0] "%d mensagem privada não lida" +msgstr[1] "%d mensagens privadas não lidas" -#: ../src/common/helpers.py:909 ../src/common/helpers.py:911 +#: ../src/common/helpers.py:918 ../src/common/helpers.py:920 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" #. we talk about a file -#: ../src/common/optparser.py:60 +#: ../src/common/optparser.py:59 #, python-format msgid "error: cannot open %s for reading" msgstr "erro: impossível abrir %s para leitura" -#: ../src/common/optparser.py:183 +#: ../src/common/optparser.py:181 msgid "gtk+" msgstr "gtk+" -#: ../src/common/optparser.py:192 ../src/common/optparser.py:193 +#: ../src/common/optparser.py:190 ../src/common/optparser.py:191 msgid "cyan" -msgstr "ciano" +msgstr "azul celeste" -#: ../src/common/optparser.py:302 -#, fuzzy -msgid "migrating logs database to indeces" -msgstr "criando banco de dados de logs" +#: ../src/common/optparser.py:308 +msgid "migrating logs database to indices" +msgstr "migrando base de dados de registros para índices" -#: ../src/common/passwords.py:86 -#, fuzzy, python-format +#: ../src/common/passwords.py:82 +#, python-format msgid "Gajim account %s" -msgstr "para conta %s" +msgstr "Conta %s do Gajim" -#: ../src/common/zeroconf/client_zeroconf.py:189 +#: ../src/common/zeroconf/client_zeroconf.py:191 msgid "" "Connection to host could not be established: Incorrect answer from server." msgstr "" +"A conexão ao computador não pôde ser estabelecida: resposta incorreta do " +"servidor." -#: ../src/common/zeroconf/client_zeroconf.py:205 -#, fuzzy +#: ../src/common/zeroconf/client_zeroconf.py:207 msgid "Connection to host could not be established" -msgstr "Conexão ponto a ponto não pode ser estabelecida." +msgstr "A conexão ao computador não pôde ser estabelecida." -#: ../src/common/zeroconf/client_zeroconf.py:334 +#: ../src/common/zeroconf/client_zeroconf.py:341 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" +"A conexão ao computador não pode ser estabelecida: tempo excedido ao " +"transmitir os dados." -#: ../src/common/zeroconf/client_zeroconf.py:629 +#: ../src/common/zeroconf/client_zeroconf.py:634 msgid "Contact is offline. Your message could not be sent." -msgstr "" +msgstr "O contato está offline. Sua mensagem não pode ser enviada." -#: ../src/common/zeroconf/connection_zeroconf.py:197 +#: ../src/common/zeroconf/connection_zeroconf.py:199 msgid "To continue sending and receiving messages, you will need to reconnect." msgstr "" "Para continuar enviando e recebendo mensagens, você precisará reconectar." -#: ../src/common/zeroconf/connection_zeroconf.py:207 +#: ../src/common/zeroconf/connection_zeroconf.py:209 msgid "Avahi error" -msgstr "" +msgstr "Erro do Avahi" -#: ../src/common/zeroconf/connection_zeroconf.py:207 +#: ../src/common/zeroconf/connection_zeroconf.py:209 #, python-format msgid "" "%s\n" "Link-local messaging might not work properly." msgstr "" +"%s\n" +"Mensagens link-local podem não funcionar adequadamente." -#: ../src/common/zeroconf/connection_zeroconf.py:218 +#: ../src/common/zeroconf/connection_zeroconf.py:220 msgid "Please check if Avahi is installed." -msgstr "" +msgstr "Por favor verifique se o Avahi está instalado." -#: ../src/common/zeroconf/connection_zeroconf.py:227 -#: ../src/common/zeroconf/connection_zeroconf.py:231 -#, fuzzy +#: ../src/common/zeroconf/connection_zeroconf.py:229 +#: ../src/common/zeroconf/connection_zeroconf.py:233 msgid "Could not start local service" -msgstr "A imagem não pode ser carregada" +msgstr "Impossível iniciar o serviço local" -#: ../src/common/zeroconf/connection_zeroconf.py:228 -#, fuzzy, python-format +#: ../src/common/zeroconf/connection_zeroconf.py:230 +#, python-format msgid "Unable to bind to port %d." -msgstr "Impossível ingressar na sala" +msgstr "Impossível conectar-se à porta %d." -#: ../src/common/zeroconf/connection_zeroconf.py:232 -#: ../src/common/zeroconf/connection_zeroconf.py:325 +#: ../src/common/zeroconf/connection_zeroconf.py:234 +#: ../src/common/zeroconf/connection_zeroconf.py:327 msgid "Please check if avahi-daemon is running." -msgstr "" +msgstr "Por favor verifique se o serviço avahi-daemon está rodando." -#: ../src/common/zeroconf/connection_zeroconf.py:324 -#, fuzzy, python-format +#: ../src/common/zeroconf/connection_zeroconf.py:326 +#, python-format msgid "Could not change status of account \"%s\"" -msgstr "Impossível conectar a \"%s\"" +msgstr "Impossível alterar status da conta \"%s\"" -#: ../src/common/zeroconf/connection_zeroconf.py:341 +#: ../src/common/zeroconf/connection_zeroconf.py:343 msgid "" "You are not connected or not visible to others. Your message could not be " "sent." msgstr "" +"Você não está conectado ou não está visível aos outros. Sua mensagem não " +"pode ser enviada." #. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:353 +#: ../src/common/zeroconf/connection_zeroconf.py:355 msgid "[This message is encrypted]" msgstr "[Esta mensagem está criptografada]" #: ../src/common/zeroconf/zeroconf.py:180 -#, fuzzy, python-format +#, python-format msgid "Error while adding service. %s" -msgstr "erro no envio %s ( %s )" +msgstr "Erro ao adicionar serviço. %s" -#, fuzzy -#~ msgid "_New room" -#~ msgstr "Nova Sala" +#~ msgid "Select the account with which you want to synchronise" +#~ msgstr "Selecione a conta que você quer sincronizar" -#~ msgid "Role: " -#~ msgstr "Regra: " +#~ msgid "Select the contacts you want to synchronise" +#~ msgstr "Selecione os contatos que você quer sincronizar" -#~ msgid "Affiliation: " -#~ msgstr "Filiação: " - -#~ msgid "" -#~ "Sound to play when any MUC message arrives. (This setting is taken into " -#~ "account only if notify_on_all_muc_messages is True)" -#~ msgstr "" -#~ "Som para tocar quando qualquer mensagem MUC chegar. (este ajuste é feito " -#~ "exame no cliente somente se os notify_on_all_muc_messages for verdadeiro)" - -#, fuzzy -#~ msgid "Add" -#~ msgstr "Endereço" - -#, fuzzy -#~ msgid "Away " -#~ msgstr "Afastado" - -#, fuzzy -#~ msgid "Down" -#~ msgstr "Download" - -#, fuzzy -#~ msgid "List of special notifications settings" -#~ msgstr "Adicionando Notificação Especial para %s" - -#, fuzzy -#~ msgid "Not Available " -#~ msgstr "Não Disponível" - -#~ msgid "Contact _Info" -#~ msgstr "_Informações de Contato" - -#~ msgid "Jabber" -#~ msgstr "Jabber" - -#~ msgid "Invalid room or server name" -#~ msgstr "Sala inválida ou nome do servidor" - -#~ msgid "Unknown D-Bus version: %s" -#~ msgstr "Versão dbus desconhecida: %s" - -#~ msgid "vCard publication succeeded" -#~ msgstr "Publicação do vCard bem sucedida" - -#~ msgid "Your personal information has been published successfully." -#~ msgstr "Suas informações pessoais foram publicadas com sucesso." - -#~ msgid "Migrating Logs..." -#~ msgstr "Migrando Logs..." - -#~ msgid "_Join New Room" -#~ msgstr "_Ingressar na Nova Sala" - -#~ msgid "Gajim - %d unread message" -#~ msgid_plural "Gajim - %d unread messages" -#~ msgstr[0] "Gajim - uma mensagem não lida" -#~ msgstr[1] "Gajim - %d mensagens não lidas" - -#~ msgid "Since %s" -#~ msgstr "Desde %s" - -#~ msgid "Automatically authorize contact" -#~ msgstr "Autorizar automaticamente os contatos" - -#~ msgid "Send File" -#~ msgstr "Enviar arquivo" - -#~ msgid "Underline" -#~ msgstr "Sublinhar" - -#~ msgid "Would you like to overwrite it?" -#~ msgstr "Você gostaria de sobreescrevê-lo?" - -#~ msgid "_Join New Room..." -#~ msgstr "_Ingressar Nova Sala..." - -#~ msgid "Usage: /%s, sets the groupchat window to compact mode." -#~ msgstr "Uso: /%s, configura a janela de conferência para modo compacto." - -#, fuzzy -#~ msgid "Please modify your special notification below" -#~ msgstr "Por favor escolha uma das opções abaixo:" - -#~ msgid "Delete Message of the Day" -#~ msgstr "Deletar Mensagem do Dia" - -#, fuzzy -#~ msgid "I want a notification popup:" -#~ msgstr "Noti_ficações do status da conversa:" - -#, fuzzy -#~ msgid "I want to listen to:" -#~ msgstr "%s quer te enviar um arquivo:" - -#~ msgid "Send _New Message..." -#~ msgstr "Enviar _nova Mensagem..." - -#~ msgid "Set Message of the Day" -#~ msgstr "Configurar Mensagem do Dia" - -#~ msgid "Update Message of the Day" -#~ msgstr "Atualiza Mensagem do Dia" - -#~ msgid "_XML Console..." -#~ msgstr "Console _XML..." - -#~ msgid "Choose Avatar" -#~ msgstr "_Escolha o Avatar" - -#~ msgid "Use compact view when you open a chat window" -#~ msgstr "Usar visão compacta quando você abre a janela de bate-papo" - -#~ msgid "Use compact view when you open a group chat window" -#~ msgstr "Use a vista compacta quando você abre uma janela de conferência" - -#~ msgid "plain" -#~ msgstr "plano" - -#~ msgid "Send" -#~ msgstr "Enviar" - -#~ msgid "%(nickname)s in room %(room_name)s has sent you a new message." -#~ msgstr "%(nickname)s na sala %(room_name)s lhe enviou uma nova mensagem." - -#~ msgid "%s has sent you a new message." -#~ msgstr "%s lhe enviou uma nova mensagem." - -#, fuzzy -#~ msgid "GUI Migration failed" -#~ msgstr "Publicação do vCard falhou" - -#~ msgid "Logs have been successfully migrated to the database." -#~ msgstr "Os logs foram migrados com sucesso à base de dados." - -#~ msgid "If checked, Gajim will also have a trayicon" -#~ msgstr "Se marcado, o Gajim também terá um ícone de bandeja" - -#, fuzzy -#~ msgid "Start Chat with Contact" -#~ msgstr "Iniciar uma conferência com a conta %s" - -#~ msgid "All contacts in this group are offline or have errors" -#~ msgstr "Todos os contatos deste grupo estão desconectados ou existem erros" - -#~ msgid "Size: " -#~ msgstr "Tamanho: " - -#~ msgid "Session bus is not available" -#~ msgstr "Sessão bus não está disponível" - -#~ msgid "Sound" -#~ msgstr "Som" - -#~ msgid "Text" -#~ msgstr "Texto" - -#~ msgid "Image" -#~ msgstr "Imagem" - -#~ msgid "From %s" -#~ msgstr "De %s" - -#~ msgid "To %s" -#~ msgstr "Para %s" - -#~ msgid "You have been invited to the %(room_jid)s room by %(contact_jid)s" -#~ msgstr "Você foi convidado para a sala %(room_jid)s por %(contact_jid)s" - -#~ msgid "Manage Emoticons" -#~ msgstr "Gerenciar Emoticons" - -#~ msgid "Or choose a preset message:" -#~ msgstr "Ou escolha uma mensagem padrão:" - -#~ msgid "Use _emoticons" -#~ msgstr "Usar _emoticons" - -#~ msgid "_Set Image..." -#~ msgstr "_Configurar Imagem" - -#~ msgid "Switch to %s" -#~ msgstr "Alternar para %s" - -#~ msgid "using account " -#~ msgstr "usando conta" - -#~ msgid "The filesize of image \"%s\" is too large" -#~ msgstr "O arquivo de imagem \"%s\" é muito grande" - -#~ msgid "The file must not be more than 32 kilobytes." -#~ msgstr "O arquivo não deve ter mais do que 32 kilobytes." - -#~ msgid "Timeout" -#~ msgstr "Tempo excedido" - -#~ msgid "account: " -#~ msgstr "conta: " - -#~ msgid "Are you sure you want to leave rooms \"%s\"?" -#~ msgstr "Você tem certeza que quer deixar estas salas \"%s\"?" - -#~ msgid "If you close this window, you will be disconnected from these rooms." -#~ msgstr "Se você fechar esta janela, você será desconectado destas salas." - -#~ msgid "Activate/Disable notification for when a file transfer is complete" -#~ msgstr "" -#~ "Ativar/Desativar notificação quando um transferência de arquivo estiver " -#~ "completa" - -#~ msgid "Removing selected file transfer" -#~ msgstr "Removendo transferência de arquivo selecionada" - -#~ msgid "Stoping selected file transfer" -#~ msgstr "Parando a transferência de arquivo selecionada" - -#~ msgid "" -#~ "If you close this tab and you have history disabled, the message will be " -#~ "lost." -#~ msgstr "" -#~ "Se você fechar esta aba e o histórico estiver desabilitado, a mensagem " -#~ "será perdida." - -#~ msgid "Cannot remove last group" -#~ msgstr "Não é possível remover o último grupo" - -#~ msgid "At least one contact group must be present." -#~ msgstr "Ao menos um grupo do contato deve estar presente." - -#~ msgid "" -#~ "pysqlite2 (aka python-pysqlite2) dependency is missing. After you install " -#~ "pysqlite3, if you want to migrate your logs to the new database, please " -#~ "read: http://trac.gajim.org/wiki/MigrateLogToDot9DB Exiting..." -#~ msgstr "" -#~ "(aka python-pysqlite2) falta a dependência pysqlite2. Depois que você " -#~ "instala pysqlite3, se você quiser migrar seus registros à base de dados " -#~ "nova, leia por favor: http://trac.gajim.org/wiki/MigrateLogToDot9DB que " -#~ "retira..." - -#~ msgid "Image is too big" -#~ msgstr "Imagem é muito grande" - -#~ msgid "" -#~ "Image for emoticon has to be less than or equal to 24 pixels in width and " -#~ "24 in height." -#~ msgstr "" -#~ "Imagem para emoticon tem que ser menor ou igual a 24 pixels em largura e " -#~ "24 em altura." - -#~ msgid "Changes in latest version" -#~ msgstr "Mudanças na última versão" - -#~ msgid "Check for new _version on Gajim startup" -#~ msgstr "Verificar por uma nova versão ao iniciar" - -#~ msgid "Log history" -#~ msgstr "Histórico dos registros" - -#~ msgid "New version of Gajim available" -#~ msgstr "Nova versão do Gajim está disponível" - -#~ msgid "Open Download Page" -#~ msgstr "Abrir Página para Download" - -#~ msgid "Session bus is not available." -#~ msgstr "Sessão bus não está disponível." - -#, fuzzy -#~ msgid "with account " -#~ msgstr "conta: " - -#~ msgid "Chat with" -#~ msgstr "Conversa com" - -#~ msgid "as %s" -#~ msgstr "como %s" - -#~ msgid "as " -#~ msgstr "como " - -#, fuzzy -#~ msgid "Send _New Message" -#~ msgstr "_Nova Mensagem" - -#~ msgid "Re_quest Authorization from" -#~ msgstr "Solicitar Autorização de" - -#~ msgid "Send Authorization to" -#~ msgstr "Enviar Autorização para" - -#~ msgid "Log" -#~ msgstr "Registros" - -#~ msgid "Log presences in _contact's log file" -#~ msgstr "Registrar presenças no arquivo de log do contato" - -#~ msgid "Log presences in an _external file" -#~ msgstr "Registrar presenças em um arquivo _externo" - -#, fuzzy -#~ msgid "" -#~ "You can set advanced account options by pressing Advanced button,or later " -#~ "by clicking in Accounts menuitem under Edit menu from the main window." -#~ msgstr "" -#~ "Conta foi adicionada com sucesso.\n" -#~ " Você pode configurar opções avançadas em \"Edit->Accounts\" na janela " -#~ "principal. " - -#~ msgid "" -#~ "When a new message is received which is not from a contact already in a " -#~ "chat window, the three following actions may happen in order for you to " -#~ "be informed about it" -#~ msgstr "" -#~ "Quando uma mensagem nova é recebida que não seja de um contato que já " -#~ "esteja numa janela de bate-papo, as três ações seguintes podem acontecer " -#~ "para que você seja informado sobre ela" - -#~ msgid "_Earliest" -#~ msgstr "_Primeiro" - -#~ msgid "_Latest" -#~ msgstr "Ú_ltimo" - -#~ msgid "_Previous" -#~ msgstr "_Anterior" - -#~ msgid "%s is now %s: %s" -#~ msgstr "%s agora está %s: %s" - -#~ msgid "Allow controlling Gajim via D-Bus service." -#~ msgstr "Permitir controlar o Gajim via serviço D-Bus." - -#~ msgid "" -#~ "\n" -#~ "\n" -#~ "\n" -#~ "== Original Message ==\n" -#~ "%s" -#~ msgstr "" -#~ "\n" -#~ "\n" -#~ "\n" -#~ "== Mensagem Original ==\n" -#~ "%s" - -#, fuzzy -#~ msgid "" -#~ "Your new account has been created successfully.\n" -#~ "You can set advanced account options by pressing Advanced button,\n" -#~ "or later by clicking in Accounts menuitem under Edit menu from the main " -#~ "window." -#~ msgstr "" -#~ "Conta foi adicionada com sucesso.\n" -#~ " Você pode configurar opções avançadas em \"Edit->Accounts\" na janela " -#~ "principal. " - -#~ msgid "Error:" -#~ msgstr "Erro:" - -#~ msgid "Service" -#~ msgstr "Serviço" - -#~ msgid "Node" -#~ msgstr "Nó" - -#~ msgid "" -#~ "Your new account has been created and added to your gajim configuration.\n" -#~ "You can set advanced account options using \"Edit->Accounts\" in the main " -#~ "window menu." -#~ msgstr "" -#~ "Sua nova conta foi criada e adicionada as suas configurações do gajim.\n" -#~ "Você pode configurar opções avançadas em \"Edit->Accounts\" na janela " -#~ "principal. " - -#~ msgid "You need to enter a valid server address to add an account." -#~ msgstr "" -#~ "Você deve entrar com um endereço de servidor válido para registrar uma " -#~ "nova conta." - -#~ msgid "Contact names must be of the form \"user@servername\"." -#~ msgstr "" -#~ "Nomes de contatos devem estar no formato \"usuário@nomedoservidor\"." - -#~ msgid "Invalid contact ID" -#~ msgstr "ID de contato inválido" - -#~ msgid "Contact ID must be of the form \"username@servername\"." -#~ msgstr "ID de contato deve estar no formato \"usuário@nomedoservidor\"." - -#~ msgid "Account registration successful" -#~ msgstr "Registro da conta efetuado com sucesso" - -#~ msgid "The account \"%s\" has been registered with the Jabber server." -#~ msgstr "A conta \"%s\" foi registrada no servidor Jabber" - -#~ msgid "theme_name" -#~ msgstr "nome_do_tema" - -#~ msgid "Edit" -#~ msgstr "Editar" - -#~ msgid "Please fill in the data for your existing account" -#~ msgstr "Por favor preencha os dados para sua conta existente" - -#~ msgid "Check if you want to register for a new jabber account" -#~ msgstr "Marque esta opção se você quer registrar uma nova conta jabber" - -#~ msgid "Click to get contact's extended information" -#~ msgstr "Clique para informações completas do contato" - -#~ msgid "_Compact View" -#~ msgstr "Visão _Compacta" - -#~ msgid "_Refresh" -#~ msgstr "_Atualizar" - -#~ msgid "_Register new account" -#~ msgstr "_Registrar nova conta" - -#~ msgid "Gajim - a GTK+ Jabber client" -#~ msgstr "Gajim - Um cliente jabber GTK" - -#~ msgid "You just received a new message in room \"%s\"" -#~ msgstr "Você acabou de receber uma nova mensagem na sala \"%s\"" - -#~ msgid "" -#~ "If you close this window and you have history disabled, this message will " -#~ "be lost." -#~ msgstr "" -#~ "Se você fechar esta janela e o histórico estiver desabilitado, esta " -#~ "mensagem será perdida." - -#~ msgid "New _Room" -#~ msgstr "Nova _Sala" - -#~ msgid "Always use compact _view" -#~ msgstr "Sempre usar visão _compacta" - -#~ msgid "Banner:" -#~ msgstr "Faixa:" - -#~ msgid "" -#~ "If checked, all chat and group chat windows will have the information " -#~ "area in the top and the buttons area in the bottom hidden. You can quick " -#~ "toggle compact view with Alt+C. NOTE: The last state you leave a window/" -#~ "tab is not a permanent one" -#~ msgstr "" -#~ "Se marcado, todas as janelas de bate-papo e conferências terão a área da " -#~ "informação no alto e a área dos botões embaixo escondidas. Você pode " -#~ "rapidamente alternar para a vista compacta com Alt+C. NOTA: O último " -#~ "estado que você deixa uma janela/aba não é permanente" - -#~ msgid "Inactivate account" -#~ msgstr "Conta inativa" - -#~ msgid "Join _Group Chat..." -#~ msgstr "_Ingressar numa Conferência..." - -#~ msgid "Po_sition:" -#~ msgstr "Cargo:" - -#~ msgid "Show roster window on Gajim startup" -#~ msgstr "Mostrar a janela da lista de contatos na inicialização da aplicação" - -#~ msgid "_Service Discovery" -#~ msgstr "_Busca de Serviços" - -#~ msgid "_Service Discovery..." -#~ msgstr "_Busca de Serviços..." - -#~ msgid "error appeared while processing xmpp:" -#~ msgstr "ocorreu um erro enquanto processava xmpp:" - -#~ msgid "" -#~ "Cancels the selected file transfer. If there is an incomplete file, kept " -#~ "in the file system it will be removed. This operation is not reversable" -#~ msgstr "" -#~ "Cancelar a transferência de arquivo selecionada. Se existir um arquivo " -#~ "incompleto, ele será removido. Esta operação não é reversível." - -#~ msgid "Chan_ge" -#~ msgstr "_Mudar" - -#~ msgid "Unknown type %s " -#~ msgstr "Tipo desconhecido %s" - -#~ msgid "Gajim disconnected you from %s" -#~ msgstr "Gajim desconectou você de %s" - -#~ msgid "" -#~ "%s seconds have passed and server did not reply to our keep-alive. If you " -#~ "believe such disconnection should not have happened, you can disable " -#~ "sending keep-alive packets by modifying this account." -#~ msgstr "" -#~ "%s segundos se passaram e o servidor não respondeu ao nosso keep-alive. " -#~ "Se você acredita em tal desconexão não deve ter acontecido, você pode " -#~ "desabilitar o envio de pacotes keep-alive modificando esta conta." +#~ msgid "Synchronise : select contacts" +#~ msgstr "Sincronizar: selecionar contatos" diff --git a/src/chat_control.py b/src/chat_control.py index ff09e3c06..baa9beec8 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -144,6 +144,11 @@ class ChatControlBase(MessageControl): id = widget.connect('value-changed', self.on_conversation_vadjustment_value_changed) self.handlers[id] = widget + id = widget.connect('changed', + self.on_conversation_vadjustment_changed) + self.handlers[id] = widget + self.scroll_to_end_id = None + self.was_at_the_end = True # add MessageTextView to UI and connect signals self.msg_scrolledwindow = self.xml.get_widget('message_scrolledwindow') self.msg_textview = MessageTextView() @@ -204,14 +209,7 @@ class ChatControlBase(MessageControl): self.msg_textview.lang = lang spell.set_language(lang) except (gobject.GError, RuntimeError), msg: - dialogs.ErrorDialog(unicode(msg), _('If that is not your language ' - 'for which you want to highlight misspelled words, then please ' - 'set your $LANG as appropriate. Eg. for French do export ' - 'LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to ' - 'make it global in /etc/profile.\n\nHighlighting misspelled ' - 'words feature will not be used')) - gajim.config.set('use_speller', False) - + dialogs.AspellDictError(lang) self.style_event_id = 0 self.conv_textview.tv.show() self._paint_banner() @@ -551,7 +549,7 @@ class ChatControlBase(MessageControl): full_jid = self.get_full_jid() textview = self.conv_textview end = False - if textview.at_the_end() or kind == 'outgoing': + if self.was_at_the_end or kind == 'outgoing': end = True textview.print_conversation_line(text, jid, kind, name, tim, other_tags_for_name, other_tags_for_time, other_tags_for_text, @@ -561,25 +559,36 @@ class ChatControlBase(MessageControl): return if kind == 'incoming': gajim.last_message_time[self.account][full_jid] = time.time() - if (not self.parent_win.get_active_jid() or \ - full_jid != self.parent_win.get_active_jid() or \ - not self.parent_win.is_active() or not end) and \ - kind in ('incoming', 'incoming_queue'): + + if kind in ('incoming', 'incoming_queue'): gc_message = False if self.type_id == message_control.TYPE_GC: gc_message = True - if not gc_message or \ - (gc_message and (other_tags_for_text == ['marked'] or \ - gajim.config.get('notify_on_all_muc_messages'))): - # we want to have save this message in events list - # other_tags_for_text == ['marked'] --> highlighted gc message + + if ((self.parent_win and (not self.parent_win.get_active_jid() or \ + full_jid != self.parent_win.get_active_jid() or \ + not self.parent_win.is_active() or not end)) or \ + (gc_message and \ + gajim.interface.minimized_controls.has_key(self.account) and \ + jid in gajim.interface.minimized_controls[self.account])) and \ + kind in ('incoming', 'incoming_queue'): + # we want to have save this message in events list + # other_tags_for_text == ['marked'] --> highlighted gc message type_ = 'printed_' + self.type_id + event = 'message_received' + show_in_roster = notify.get_show_in_roster(event, + self.account, self.contact) + show_in_systray = notify.get_show_in_systray(event, + self.account, self.contact) if gc_message: type_ = 'printed_gc_msg' - show_in_roster = notify.get_show_in_roster('message_received', - self.account, self.contact) - show_in_systray = notify.get_show_in_systray('message_received', - self.account, self.contact) + event = 'gc_message_received' + show_in_roster = True + show_in_systray = False + if gajim.config.get('notify_on_all_muc_messages'): + show_in_systray = True + if other_tags_for_text == ['marked']: + type_ = 'printed_marked_gc_msg' event = gajim.events.create_event(type_, None, show_in_roster = show_in_roster, show_in_systray = show_in_systray) @@ -588,6 +597,14 @@ class ChatControlBase(MessageControl): if show_in_roster: gajim.interface.roster.draw_contact(self.contact.jid, self.account) + + if not self.parent_win: + return + + if (not self.parent_win.get_active_jid() or \ + full_jid != self.parent_win.get_active_jid() or \ + not self.parent_win.is_active() or not end) and \ + kind in ('incoming', 'incoming_queue'): self.parent_win.redraw_tab(self) ctrl = gajim.interface.msg_win_mgr.get_control(full_jid, self.account) if not self.parent_win.is_active(): @@ -654,16 +671,38 @@ class ChatControlBase(MessageControl): isactive = widget.get_active() self.chat_buttons_set_visible(isactive) + def _on_minimize_menuitem_activate(self, widget): + '''When a grouchat is minimized, unparent the tab, put it in roster etc''' + win = gajim.interface.msg_win_mgr.get_window(self.contact.jid, self.account) + ctrl = win.get_control(self.contact.jid, self.account) + + ctrl_page = win.notebook.page_num(ctrl.widget) + control = win.notebook.get_nth_page(ctrl_page) + + win.notebook.remove_page(ctrl_page) + control.unparent() + ctrl.parent_win = None + + if not gajim.interface.minimized_controls.has_key(self.account): + gajim.interface.minimized_controls[self.account] = {} + gajim.interface.minimized_controls[self.account][self.contact.jid] = ctrl + + del win._controls[self.account][self.contact.jid] + + win.check_tabs() + gajim.interface.roster.add_groupchat_to_roster(self.account, + self.contact.jid, status = self.subject) + def set_control_active(self, state): if state: jid = self.contact.jid - if self.conv_textview.at_the_end(): + if self.was_at_the_end: # we are at the end - type_ = 'printed_' + self.type_id + type_ = ['printed_' + self.type_id] if self.type_id == message_control.TYPE_GC: - type_ = 'printed_gc_msg' + type_ = ['printed_gc_msg', 'printed_marked_gc_msg'] if not gajim.events.remove_events(self.account, self.get_full_jid(), - types = [type_]): + types = type_): # There were events to remove self.redraw_after_event_removed(jid) self.msg_textview.grab_focus() @@ -672,18 +711,23 @@ class ChatControlBase(MessageControl): def bring_scroll_to_end(self, textview, diff_y = 0): ''' scrolls to the end of textview if end is not visible ''' + if self.scroll_to_end_id: + # a scroll is already planned + return buffer = textview.get_buffer() end_iter = buffer.get_end_iter() end_rect = textview.get_iter_location(end_iter) visible_rect = textview.get_visible_rect() # scroll only if expected end is not visible if end_rect.y >= (visible_rect.y + visible_rect.height + diff_y): - gobject.idle_add(self.scroll_to_end_iter, textview) + self.scroll_to_end_id = gobject.idle_add(self.scroll_to_end_iter, + textview) def scroll_to_end_iter(self, textview): buffer = textview.get_buffer() end_iter = buffer.get_end_iter() textview.scroll_to_iter(end_iter, 0, False, 1, 1) + self.scroll_to_end_id = None return False def size_request(self, msg_textview , requisition): @@ -741,7 +785,15 @@ class ChatControlBase(MessageControl): return True - def on_conversation_vadjustment_value_changed(self, widget): + def on_conversation_vadjustment_changed(self, adjustment): + # used to stay at the end of the textview when we shrink conversation + # textview. + if self.was_at_the_end: + self.conv_textview.bring_scroll_to_end(-18) + self.was_at_the_end = (adjustment.upper - adjustment.value - adjustment.page_size) < 18 + + def on_conversation_vadjustment_value_changed(self, adjustment): + self.was_at_the_end = (adjustment.upper - adjustment.value - adjustment.page_size) < 18 if self.resource: jid = self.contact.get_full_jid() else: @@ -752,13 +804,12 @@ class ChatControlBase(MessageControl): if not len(gajim.events.get_events(self.account, jid, ['printed_' + type_, type_])): return + if not self.parent_win: + return if self.conv_textview.at_the_end() and \ - self.parent_win.get_active_control() == self and \ - self.parent_win.window.is_active(): + self.parent_win.get_active_control() == self and \ + self.parent_win.window.is_active(): # we are at the end - type_ = self.type_id - if type_ == message_control.TYPE_GC: - type_ = 'gc_msg' if not gajim.events.remove_events(self.account, self.get_full_jid(), types = ['printed_' + type_, type_]): # There were events to remove @@ -774,9 +825,15 @@ class ChatControlBase(MessageControl): room_jid, nick = gajim.get_room_and_nick_from_fjid(jid) groupchat_control = gajim.interface.msg_win_mgr.get_control( room_jid, self.account) + if not groupchat_control and \ + gajim.interface.minimized_controls.has_key(self.account) and \ + room_jid in gajim.interface.minimized_controls[self.account]: + groupchat_control = \ + gajim.interface.minimized_controls[self.account][room_jid] groupchat_control.draw_contact(nick) mw = gajim.interface.msg_win_mgr.get_window(room_jid, self.account) - mw.redraw_tab(groupchat_control) + if mw: + mw.redraw_tab(groupchat_control) else: gajim.interface.roster.draw_contact(jid, self.account) gajim.interface.roster.show_title() @@ -846,6 +903,7 @@ class ChatControl(ChatControlBase): '''A control for standard 1-1 chat''' TYPE_ID = message_control.TYPE_CHAT old_msg_kind = None # last kind of the printed message + CHAT_CMDS = ['clear', 'compact', 'help', 'ping'] def __init__(self, parent_win, contact, acct, resource = None): ChatControlBase.__init__(self, self.TYPE_ID, parent_win, @@ -1124,6 +1182,49 @@ class ChatControl(ChatControlBase): self.contact.get_shown_name() gtk.Tooltips().set_tip(self.xml.get_widget('gpg_eventbox'), tt) + def _process_command(self, message): + if message[0] != '/': + return False + + # Handle common commands + if ChatControlBase._process_command(self, message): + return True + + message = message[1:] + message_array = message.split(' ', 1) + command = message_array.pop(0).lower() + if message_array == ['']: + message_array = [] + + if command == 'help': + if len(message_array): + subcommand = message_array.pop(0) + self.get_command_help(subcommand) + else: + self.get_command_help(command) + self.clear(self.msg_textview) + return True + elif command == 'ping' and not len(message_array): + gajim.connections[self.account].sendPing(self.contact) + self.clear(self.msg_textview) + return True + return False + + def get_command_help(self, command): + if command == 'help': + self.print_conversation(_('Commands: %s') % ChatControl.CHAT_CMDS, + 'info') + elif command == 'clear': + self.print_conversation(_('Usage: /%s, clears the text window.'), + 'info') + elif command == 'compact': + self.print_conversation(_('Usage: /%s, hide the chat buttons.'), + 'info') + elif command == 'ping': + self.print_conversation(_(''), 'info') + else: + self.print_conversation(_('No help info for /%s') % command, 'info') + def send_message(self, message, keyID = '', chatstate = None): '''Send a message to contact''' if message in ('', None, '\n') or self._process_command(message): @@ -1153,13 +1254,9 @@ class ChatControl(ChatControlBase): # because we want it sent with REAL message # (not standlone) eg. one that has body - #FIXME: - # Enable 3 next lines after 0.11 release. - # Having this disabled violate xep85 5.1.2 but then we don't break - # notifications between 0.10.1 and 0.11 See #2637 - # if contact.our_chatstate: - # # We already ask for xep 85, don't ask it twice - # composing_jep = 'asked_once' + if contact.our_chatstate: + # We already asked for xep 85, don't ask it twice + composing_jep = 'asked_once' chatstate_to_send = 'active' contact.our_chatstate = 'ask' # pseudo state @@ -1575,24 +1672,34 @@ class ChatControl(ChatControlBase): if not gajim.config.get('show_avatar_in_chat'): return - jid = self.contact.jid - jid_with_resource = jid - if resource: - jid_with_resource += '/' + resource + is_fake = False + if self.TYPE_ID == message_control.TYPE_PM: + is_fake = True + jid_with_resource = self.contact.jid # fake jid + else: + jid_with_resource = self.contact.jid + if resource: + jid_with_resource += '/' + resource # we assume contact has no avatar scaled_pixbuf = None - pixbuf = None - is_fake = False - if gajim.contacts.is_pm_from_jid(self.account, jid): - is_fake = True pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(jid_with_resource, is_fake) if pixbuf == 'ask': # we don't have the vcard - gajim.connections[self.account].request_vcard(jid_with_resource, - is_fake) + if self.TYPE_ID == message_control.TYPE_PM: + if self.gc_contact.jid: + # We know the real jid of this contact + real_jid = self.gc_contact.jid + if self.gc_contact.resource: + real_jid += '/' + self.gc_contact.resource + else: + real_jid = jid_with_resource + gajim.connections[self.account].request_vcard(real_jid, + jid_with_resource) + else: + gajim.connections[self.account].request_vcard(jid_with_resource) return if pixbuf is not None: scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'chat') diff --git a/src/common/config.py b/src/common/config.py index b19288bec..028d8f031 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -187,6 +187,7 @@ class Config: 'notification_avatar_width': [opt_int, 48], 'notification_avatar_height': [opt_int, 48], 'muc_highlight_words': [opt_str, '', _('A semicolon-separated list of words that will be highlighted in group chats.')], + 'minimize_autojoined_rooms': [opt_bool, False, _('If True, autojoined bookmarked rooms will be minimized on startup.')], 'quit_on_roster_x_button': [opt_bool, False, _('If True, quits Gajim when X button of Window Manager is clicked. This setting is taken into account only if trayicon is used.')], 'check_if_gajim_is_default': [opt_bool, True, _('If True, Gajim will check if it\'s the default jabber client on each startup.')], 'show_unread_tab_icon': [opt_bool, False, _('If True, Gajim will display an icon on each tab containing unread messages. Depending on the theme, this icon may be animated.')], @@ -225,6 +226,8 @@ class Config: 'show_contacts_number': [opt_bool, True, _('If True, Gajim will show number of online and total contacts in account and group rows.')], 'treat_incoming_messages': [ opt_str, '', _('Can be empty, \'chat\' or \'normal\'. If not empty, treat all incoming messages as if they were of this type')], 'scroll_roster_to_last_message': [opt_bool, True, _('If True, Gajim will scroll and select the contact who sent you the last message, if chat window is not already opened.')], + 'use_latex': [opt_bool, False, _('If True, Gajim will convert string between $$ and $$ to an image using dvips and convert before insterting it in chat window.')], + 'change_status_window_timeout': [opt_int, 15, _('Time of inactivity needed before the change status window closes down.')], } __options_per_key = { diff --git a/src/common/connection.py b/src/common/connection.py index 4abdd590a..00a17a54e 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -17,9 +17,9 @@ ## GNU General Public License for more details. ## - import os import random +import socket try: randomsource = random.SystemRandom() @@ -42,6 +42,7 @@ USE_GPG = GnuPG.USE_GPG from common.rst_xhtml_generator import create_xhtml +from string import Template import logging log = logging.getLogger('gajim.c.connection') @@ -76,11 +77,19 @@ class Connection(ConnectionHandlers): self.last_history_line = {} 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() + }) 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') else: self.keepalives = 0 self.privacy_rules_supported = False + self.blocked_list = [] + self.blocked_contacts = [] + self.blocked_groups = [] self.pep_supported = False # Do we continue connection when we get roster (send presence,get vcard...) self.continue_connect_info = None @@ -197,30 +206,15 @@ class Connection(ConnectionHandlers): # it's a new account if not data[1]: # wrong answer self.dispatch('ACC_NOT_OK', ( - _('Transport %s answered wrongly to register request: %s')\ + _('Server %s answered wrongly to register request: %s')\ % (data[0], data[3]))) return - req = data[1].asDict() - req['username'] = self.new_account_info['name'] - req['password'] = self.new_account_info['password'] - def _on_register_result(result): - if not common.xmpp.isResultNode(result): - self.dispatch('ACC_NOT_OK', (result.getError())) - return - self.password = self.new_account_info['password'] - if USE_GPG: - self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) - gajim.config.set('usegpg', True) - else: - gajim.config.set('usegpg', False) - gajim.connections[self.name] = self - self.dispatch('ACC_OK', (self.new_account_info)) - self.new_account_info = None - if self.connection: - self.connection.UnregisterDisconnectHandler(self._on_new_account) - self.disconnect(on_purpose=True) - common.xmpp.features_nb.register(self.connection, data[0], - req, _on_register_result) + is_form = data[2] + if is_form: + conf = data[1] + else: + conf = data[1].asDict() + self.dispatch('NEW_ACC_CONNECTED', (conf, is_form)) return if not data[1]: # wrong answer self.dispatch('ERROR', (_('Invalid answer'), @@ -293,16 +287,13 @@ class Connection(ConnectionHandlers): def connect(self, data = None): ''' Start a connection to the Jabber server. Returns connection, and connection type ('tls', 'ssl', 'tcp', '') - data MUST contain name, hostname, resource, usessl, proxy, - use_custom_host, custom_host (if use_custom_host), custom_port (if - use_custom_host), ''' + data MUST contain hostname, usessl, proxy, use_custom_host, + custom_host (if use_custom_host), custom_port (if use_custom_host)''' if self.connection: return self.connection, '' if data: - name = data['name'] hostname = data['hostname'] - resource = data['resource'] usessl = data['usessl'] self.try_connecting_for_foo_secs = 45 p = data['proxy'] @@ -312,9 +303,7 @@ class Connection(ConnectionHandlers): custom_h = data['custom_host'] custom_p = data['custom_port'] else: - name = gajim.config.get_per('accounts', self.name, 'name') hostname = gajim.config.get_per('accounts', self.name, 'hostname') - resource = gajim.config.get_per('accounts', self.name, 'resource') usessl = gajim.config.get_per('accounts', self.name, 'usessl') self.try_connecting_for_foo_secs = gajim.config.get_per('accounts', self.name, 'try_connecting_for_foo_secs') @@ -325,7 +314,7 @@ class Connection(ConnectionHandlers): custom_h = gajim.config.get_per('accounts', self.name, 'custom_host') custom_p = gajim.config.get_per('accounts', self.name, 'custom_port') - #create connection if it doesn't already exist + # create connection if it doesn't already exist self.connected = 1 if p and p in gajim.config.get_per('proxies'): proxy = {'host': gajim.config.get_per('proxies', p, 'host')} @@ -450,7 +439,6 @@ class Connection(ConnectionHandlers): name = gajim.config.get_per('accounts', self.name, 'name') hostname = gajim.config.get_per('accounts', self.name, 'hostname') - resource = gajim.config.get_per('accounts', self.name, 'resource') self.connection = con fpr_good = self._check_fingerprint(con, con_type) @@ -471,7 +459,7 @@ class Connection(ConnectionHandlers): if fpr_good == True: log.info("Fingerprint found and matched for %s.", hostname) - con.auth(name, self.password, resource, 1, self.__on_auth) + con.auth(name, self.password, self.server_resource, 1, self.__on_auth) return True @@ -572,6 +560,22 @@ class Connection(ConnectionHandlers): return common.xmpp.features_nb.getPrivacyLists(self.connection) + def sendPing(self, pingTo): + if not self.connection: + return + iq = common.xmpp.Iq('get', to = pingTo.get_full_jid()) + iq.addChild(name = 'ping', namespace = common.xmpp.NS_PING) + def _on_response(resp): + timePong = time.time() + if not common.xmpp.isResultNode(resp): + self.dispatch('PING_ERROR', (pingTo)) + return + timeDiff = round(timePong - timePing,2) + self.dispatch('PING_REPLY', (pingTo, timeDiff)) + self.dispatch('PING_SENT', (pingTo)) + timePing = time.time() + self.connection.SendAndCallForResponse(iq, _on_response) + def get_active_default_lists(self): if not self.connection: return @@ -628,6 +632,8 @@ class Connection(ConnectionHandlers): self.connection.send(iq) def send_invisible_presence(self, msg, signed, initial = False): + if not self.connection: + return # try to set the privacy rule iq = self.build_privacy_rule('invisible', 'deny') self.connection.SendAndCallForResponse(iq, self._continue_invisible, @@ -715,6 +721,32 @@ class Connection(ConnectionHandlers): self.awaiting_answers[id] = (PRIVACY_ARRIVED, ) self.connection.send(iq) + def send_custom_status(self, show, msg, jid): + if not show in STATUS_LIST: + return -1 + if not self.connection: + return + sshow = helpers.get_xmpp_show(show) + if not msg: + msg = '' + keyID = gajim.config.get_per('accounts', self.name, 'keyid') + if show == 'offline': + p = common.xmpp.Presence(typ = 'unavailable', to = jid) + p = self.add_sha(p, False) + if msg: + p.setStatus(msg) + else: + signed = self.get_signed_msg(msg) + priority = unicode(gajim.get_priority(self.name, sshow)) + p = common.xmpp.Presence(typ = None, priority = priority, show = sshow, + to = jid) + p = self.add_sha(p) + if msg: + p.setStatus(msg) + if signed: + 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 STATUS_LIST: return -1 @@ -731,9 +763,11 @@ class Connection(ConnectionHandlers): # 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') self.connect_and_init(show, msg, signed) - elif show == 'offline' and self.connected: + elif show == 'offline': self.connected = 0 if self.connection: self.on_purpose = True @@ -967,6 +1001,41 @@ class Connection(ConnectionHandlers): self.connection.getRoster().setItem(jid = jid, name = name, groups = groups) + def send_new_account_infos(self, form, is_form): + def _on_register_result(result): + if not common.xmpp.isResultNode(result): + self.dispatch('ACC_NOT_OK', (result.getError())) + return + if USE_GPG: + self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) + gajim.config.set('usegpg', True) + else: + gajim.config.set('usegpg', False) + gajim.connections[self.name] = self + self.dispatch('ACC_OK', (self.new_account_info)) + self.new_account_info = None + if self.connection: + self.connection.UnregisterDisconnectHandler(self._on_new_account) + self.disconnect(on_purpose=True) + if is_form: + # Get username and password and put them in new_account_info + for field in self._data_form.iter_fields(): + if field.var == 'username': + self.new_account_info['name'] = field.value + if field.var == 'password': + self.new_account_info['password'] = field.value + iq=Iq('set', NS_REGISTER, to = self._hostname) + iq.setTag('query').addChild(node = form) + self.connection.SendAndCallForResponse(iq, _on_register_result) + else: + # Get username and password and put them in new_account_info + if form.has_key('username'): + self.new_account_info['name'] = form['username'] + if form.has_key('password'): + self.new_account_info['password'] = form['password'] + common.xmpp.features_nb.register(self.connection, self._hostname, + form, _on_register_result) + def new_account(self, name, config, sync = False): # If a connection already exist we cannot create a new account if self.connection: @@ -980,13 +1049,11 @@ class Connection(ConnectionHandlers): def _on_new_account(self, con = None, con_type = None): if not con_type: - self.dispatch('ACC_NOT_OK', + self.dispatch('NEW_ACC_NOT_CONNECTED', (_('Could not connect to "%s"') % self._hostname)) return self.on_connect_failure = None self.connection = con - #if con: - # con.RegisterDisconnectHandler(self._on_new_account) common.xmpp.features_nb.getRegInfo(con, self._hostname) def account_changed(self, new_name): @@ -1326,4 +1393,38 @@ class Connection(ConnectionHandlers): else: self.time_to_reconnect = None + def request_search_fields(self, jid): + iq = common.xmpp.Iq(typ = 'get', to = jid, queryNS = \ + common.xmpp.NS_SEARCH) + self.connection.send(iq) + + def send_search_form(self, jid, form, is_form): + iq = common.xmpp.Iq(typ = 'set', to = jid, queryNS = \ + common.xmpp.NS_SEARCH) + item = iq.getTag('query') + if is_form: + item.addChild(node = form) + else: + for i in form.keys(): + item.setTagData(i,form[i]) + def _on_response(resp): + jid = jid = helpers.get_jid_from_iq(resp) + tag = resp.getTag('query', namespace = common.xmpp.NS_SEARCH) + if not tag: + self.dispatch('SEARCH_RESULT', (jid, None, False)) + return + df = tag.getTag('x', namespace = common.xmpp.NS_DATA) + if df: + self.dispatch('SEARCH_RESULT', (jid, df, True)) + return + df = [] + for item in tag.getTags('item'): + f = {} + for i in item.getPayload(): + f[i.getName()] = i.getData() + df.append(f) + self.dispatch('SEARCH_RESULT', (jid, df, False)) + + self.connection.SendAndCallForResponse(iq, _on_response) + # END Connection diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 5e55e8e0a..eaa6293c6 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -818,6 +818,7 @@ class ConnectionVcard: self.vcard_sha = None self.vcard_shas = {} # sha of contacts self.room_jids = [] # list of gc jids so that vcard are saved in a folder + self.groupchat_jids = {} # {ID : groupchat_jid} def add_sha(self, p, send_caps = True): c = p.setTag('x', namespace = common.xmpp.NS_VCARD_UPDATE) @@ -913,9 +914,10 @@ class ConnectionVcard: vcard['resource'] = gajim.get_resource_from_jid(fjid) return vcard - def request_vcard(self, jid = None, is_fake_jid = False): - '''request the VCARD. If is_fake_jid is True, it means we request a vcard - to a fake jid, like in private messages in groupchat''' + def request_vcard(self, jid = None, groupchat_jid = None): + '''request the VCARD. If groupchat_jid is not nul, it means we request a vcard + to a fake jid, like in private messages in groupchat. jid can be the + real jid of the contact, but we want to consider it comes from a fake jid''' if not self.connection: return iq = common.xmpp.Iq(typ = 'get') @@ -928,13 +930,13 @@ class ConnectionVcard: j = jid if not j: j = gajim.get_jid_from_account(self.name) - self.awaiting_answers[id] = (VCARD_ARRIVED, j) - if is_fake_jid: - room_jid, nick = gajim.get_room_and_nick_from_fjid(jid) + self.awaiting_answers[id] = (VCARD_ARRIVED, j, groupchat_jid) + if groupchat_jid: + room_jid, nick = gajim.get_room_and_nick_from_fjid(groupchat_jid) if not room_jid in self.room_jids: self.room_jids.append(room_jid) + self.groupchat_jids[id] = groupchat_jid self.connection.send(iq) - #('VCARD', {entry1: data, entry2: {entry21: data, ...}, ...}) def send_vcard(self, vcard): if not self.connection: @@ -1017,17 +1019,22 @@ class ConnectionVcard: # If vcard is empty, we send to the interface an empty vcard so that # it knows it arrived jid = self.awaiting_answers[id][1] + groupchat_jid = self.awaiting_answers[id][2] + frm = jid + if groupchat_jid: + # We do as if it comes from the fake_jid + frm = groupchat_jid our_jid = gajim.get_jid_from_account(self.name) if iq_obj.getType() == 'error' and jid == our_jid: # our server doesn't support vcard self.vcard_supported = False if not iq_obj.getTag('vCard') or iq_obj.getType() == 'error': - if jid and jid != our_jid: + if frm and frm != our_jid: # Write an empty file - self.save_vcard_to_hd(jid, '') - self.dispatch('VCARD', {'jid': jid}) - elif jid == our_jid: - self.dispatch('MYVCARD', {'jid': jid}) + self.save_vcard_to_hd(frm, '') + self.dispatch('VCARD', {'jid': frm}) + elif frm == our_jid: + self.dispatch('MYVCARD', {'jid': frm}) elif self.awaiting_answers[id][0] == AGENT_REMOVED: jid = self.awaiting_answers[id][1] self.dispatch('AGENT_REMOVED', jid) @@ -1058,6 +1065,7 @@ class ConnectionVcard: elif self.awaiting_answers[id][0] == PRIVACY_ARRIVED: if iq_obj.getType() != 'error': self.privacy_rules_supported = True + self.get_privacy_list('block') # Ask metacontacts before roster self.get_metacontacts() @@ -1070,10 +1078,15 @@ class ConnectionVcard: return if not vc.getTag('vCard').getNamespace() == common.xmpp.NS_VCARD: return + id = vc.getID() frm_iq = vc.getFrom() our_jid = gajim.get_jid_from_account(self.name) resource = '' - if frm_iq: + if id in self.groupchat_jids: + who = self.groupchat_jids[id] + frm, resource = gajim.get_room_and_nick_from_fjid(who) + del self.groupchat_jids[id] + elif frm_iq: who = helpers.get_full_jid_from_iq(vc) frm, resource = gajim.get_room_and_nick_from_fjid(who) else: @@ -1145,6 +1158,7 @@ class ConnectionVcard: p = self.add_sha(p) self.connection.send(p) else: + #('VCARD', {entry1: data, entry2: {entry21: data, ...}, ...}) self.dispatch('VCARD', vcard) class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, ConnectionCommands, ConnectionPubSub): @@ -1186,7 +1200,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, id = iq_obj.getTagAttr('confirm', 'id') method = iq_obj.getTagAttr('confirm', 'method') url = iq_obj.getTagAttr('confirm', 'url') - self.dispatch('HTTP_AUTH', (method, url, id, iq_obj)); + msg = iq_obj.getTagData('body') # In case it's a message with a body + self.dispatch('HTTP_AUTH', (method, url, id, iq_obj, msg)); raise common.xmpp.NodeProcessed def _ErrorCB(self, con, iq_obj): @@ -1390,6 +1405,11 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if msg.getTag('event') is not None: self._pubsubEventCB(con, msg) return + # check if the message is a xep70-confirmation-request + if msg.getTag('confirm') and msg.getTag('confirm').namespace == \ + common.xmpp.NS_HTTP_AUTH: + self._HttpAuthCB(con, msg) + return msgtxt = msg.getBody() msghtml = msg.getXHTML() mtype = msg.getType() @@ -1558,6 +1578,9 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, ptype = prs.getType() if ptype == 'available': ptype = None + rfc_types = ('unavailable', 'error', 'subscribe', 'subscribed', 'unsubscribe', 'unsubscribed') + if ptype and not ptype in rfc_types: + ptype = None gajim.log.debug('PresenceCB: %s' % ptype) try: who = helpers.get_full_jid_from_iq(prs) @@ -1580,6 +1603,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, user_nick = prs.getTagData('nick') if not user_nick: user_nick = '' + contact_nickname = None transport_auto_auth = False xtags = prs.getTags('x') for x in xtags: @@ -1592,6 +1616,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, sigTag = x elif namespace == common.xmpp.NS_VCARD_UPDATE: avatar_sha = x.getTagData('photo') + contact_nickname = x.getTagData('nickname') elif namespace == common.xmpp.NS_DELAY: # JEP-0091 tim = prs.getTimestamp() @@ -1631,7 +1656,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, errcode = prs.getErrorCode() if errcode == '502': # Internal Timeout: self.dispatch('NOTIFY', (jid_stripped, 'error', errmsg, resource, - prio, keyID, timestamp)) + prio, keyID, timestamp, None)) elif errcode == '401': # password required to join self.dispatch('ERROR', (_('Unable to join group chat'), _('A password is required to join this group chat.'))) @@ -1664,7 +1689,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if not ptype or ptype == 'unavailable': if gajim.config.get('log_contact_status_changes') and self.name\ not in no_log_for and jid_stripped not in no_log_for: - gc_c = gajim.contacts.get_gc_contact(self.name, jid_stripped, resource) + gc_c = gajim.contacts.get_gc_contact(self.name, jid_stripped, + resource) st = status or '' if gc_c: jid = gc_c.jid @@ -1679,24 +1705,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, # contact has no avatar puny_nick = helpers.sanitize_filename(resource) gajim.interface.remove_avatar_files(jid_stripped, puny_nick) - if self.vcard_shas.has_key(who): # Verify sha cached in mem - if avatar_sha != self.vcard_shas[who]: - # avatar has been updated - self.request_vcard(who, True) - else: # Verify sha cached in hdd - cached_vcard = self.get_cached_vcard(who, True) - if cached_vcard and cached_vcard.has_key('PHOTO') and \ - cached_vcard['PHOTO'].has_key('SHA'): - cached_sha = cached_vcard['PHOTO']['SHA'] - else: - cached_sha = '' - if cached_sha != avatar_sha: - # avatar has been updated - # sha in mem will be updated later - self.request_vcard(who, True) - else: - # save sha in mem NOW - self.vcard_shas[who] = avatar_sha + # if it's a gc presence, don't ask vcard here. We may ask it to + # real jid in gui part. if ns_muc_user_x: # Room has been destroyed. see # http://www.xmpp.org/extensions/xep-0045.html#destroyroom @@ -1714,7 +1724,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, statusCode = prs.getStatusCode() self.dispatch('GC_NOTIFY', (jid_stripped, show, status, resource, prs.getRole(), prs.getAffiliation(), prs.getJid(), - reason, prs.getActor(), statusCode, prs.getNewNick())) + reason, prs.getActor(), statusCode, prs.getNewNick(), + avatar_sha)) return if ptype == 'subscribe': @@ -1727,7 +1738,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, self.connection.send(p) if who.find("@") <= 0 or transport_auto_auth: self.dispatch('NOTIFY', (jid_stripped, 'offline', 'offline', - resource, prio, keyID, timestamp)) + resource, prio, keyID, timestamp, None)) if transport_auto_auth: self.automatically_added.append(jid_stripped) self.request_subscription(jid_stripped, name = user_nick) @@ -1778,7 +1789,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, errcode = prs.getErrorCode() if errcode == '502': # Internal Timeout: self.dispatch('NOTIFY', (jid_stripped, 'error', errmsg, resource, - prio, keyID, timestamp)) + prio, keyID, timestamp, None)) else: # print in the window the error self.dispatch('ERROR_ANSWER', ('', jid_stripped, errmsg, errcode)) @@ -1799,7 +1810,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, not in no_log_for and jid_stripped not in no_log_for: gajim.logger.write('status', jid_stripped, status, show) self.dispatch('NOTIFY', (jid_stripped, show, status, resource, prio, - keyID, timestamp)) + keyID, timestamp, contact_nickname)) # END presenceCB def _StanzaArrivedCB(self, con, obj): @@ -1953,6 +1964,26 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, self.dispatch('SIGNED_IN', ()) self.continue_connect_info = None + def _search_fields_received(self, con, iq_obj): + jid = jid = helpers.get_jid_from_iq(iq_obj) + tag = iq_obj.getTag('query', namespace = common.xmpp.NS_SEARCH) + if not tag: + self.dispatch('SEARCH_FORM', (jid, None, False)) + return + df = tag.getTag('x', namespace = common.xmpp.NS_DATA) + if df: + self.dispatch('SEARCH_FORM', (jid, df, True)) + return + df = {} + for i in iq_obj.getQueryPayload(): + df[i.getName()] = i.getData() + self.dispatch('SEARCH_FORM', (jid, df, False)) + + def _StreamCB(self, con, obj): + if obj.getTag('conflict'): + # disconnected because of a resource conflict + self.dispatch('RESOURCE_CONFLICT', ()) + def _register_handlers(self, con, con_type): # try to find another way to register handlers in each class # that defines handlers @@ -2018,6 +2049,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, common.xmpp.NS_DISCO_ITEMS) con.RegisterHandler('iq', self._IqPingCB, 'get', common.xmpp.NS_PING) + con.RegisterHandler('iq', self._search_fields_received, 'result', + common.xmpp.NS_SEARCH) con.RegisterHandler('iq', self._PubSubCB, 'result') con.RegisterHandler('iq', self._ErrorCB, 'error') con.RegisterHandler('iq', self._IqCB) @@ -2025,3 +2058,4 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, con.RegisterHandler('iq', self._ResultCB, 'result') con.RegisterHandler('presence', self._StanzaArrivedCB) con.RegisterHandler('message', self._StanzaArrivedCB) + con.RegisterHandler('unknown', self._StreamCB, 'urn:ietf:params:xml:ns:xmpp-streams', xmlns='http://etherx.jabber.org/streams') diff --git a/src/common/contacts.py b/src/common/contacts.py index ee0bc9f35..0147a9fd3 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -23,6 +23,7 @@ class Contact: chatstate=None, last_status_time=None, msg_id = None, composing_jep = None): self.jid = jid self.name = name + self.contact_name = '' # nick choosen by contact self.groups = groups self.show = show self.status = status @@ -61,6 +62,8 @@ class Contact: def get_shown_name(self): if self.name: return self.name + if self.contact_name: + return self.contact_name return self.jid.split('@')[0] def is_hidden_from_roster(self): @@ -86,6 +89,11 @@ class Contact: is_observer = True return is_observer + def is_groupchat(self): + if _('Groupchats') in self.groups: + return True + return False + def is_transport(self): # if not '@' or '@' starts the jid then contact is transport if self.jid.find('@') <= 0: diff --git a/src/common/dataforms.py b/src/common/dataforms.py index 470ef6ae2..6c6817d6a 100644 --- a/src/common/dataforms.py +++ b/src/common/dataforms.py @@ -34,7 +34,7 @@ def Field(typ, **attrs): ''' Helper function to create a field of given type. ''' f = { 'boolean': BooleanField, - 'fixed': StringField, + 'fixed': TextMultiField, # not editable, still can have multiple lines of text 'hidden': StringField, 'text-private': StringField, 'text-single': StringField, @@ -54,7 +54,7 @@ def ExtendField(node): typ=node.getAttr('type') f = { 'boolean': BooleanField, - 'fixed': StringField, + 'fixed': TextMultiField, 'hidden': StringField, 'text-private': StringField, 'text-single': StringField, @@ -63,12 +63,14 @@ def ExtendField(node): 'list-multi': ListMultiField, 'list-single': ListSingleField, 'text-multi': TextMultiField, - }[typ](extend=node) - return f + } + if typ not in f: + typ = 'text-single' + return f[typ](extend=node) def ExtendForm(node): ''' Helper function to extend a node to form of appropriate type. ''' - if node.getTag('recorded') is not None: + if node.getTag('reported') is not None: return MultipleDataForm(extend=node) else: return SimpleDataForm(extend=node) @@ -195,7 +197,6 @@ class StringField(DataField): pass return locals() - class ListField(DataField): ''' Covers fields of types: jid-multi, jid-single, list-multi, list-single. ''' @nested_property @@ -385,9 +386,25 @@ class SimpleDataForm(DataForm, DataRecord): DataRecord.__init__(self, fields=fields, extend=self, associated=self) class MultipleDataForm(DataForm): - def __init__(self): + def __init__(self, type=None, title=None, instructions=None, items=None, extend=None): + DataForm.__init__(self, type=type, title=title, instructions=instructions, extend=extend) # all records, recorded into DataRecords - pass + if extend is None: + # we have to build this object from scratch + xmpp.Node.__init__(self) + + if items is not None: self.items = items + else: + # we already have xmpp.Node inside - try to convert all + # fields into DataField objects + if items is None: + self.items = list(self.iterTags('item')) + else: + for item in self.getTags('item'): + self.delChild(item) + self.items = items + reported_tag = self.getTag('reported') + self.reported = DataRecord(extend = reported_tag) @nested_property def items(): @@ -401,7 +418,7 @@ class MultipleDataForm(DataForm): DataRecord(extend=record) self.addChild(node=record) def fdel(self): - for record in self.getTags('record'): + for record in self.getTags('item'): self.delChild(record) return locals() @@ -409,18 +426,18 @@ class MultipleDataForm(DataForm): for record in self.getTags('item'): yield record - @nested_property - def recorded(): - ''' DataRecord that contains descriptions of fields in records.''' - def fget(self): - return self.getTag('recorded') - def fset(self, record): - try: - self.delChild('recorded') - except: - pass - - record.setName('recorded') - self.addChild(node=record) - return locals() +# @nested_property +# def reported(): +# ''' DataRecord that contains descriptions of fields in records.''' +# def fget(self): +# return self.getTag('reported') +# def fset(self, record): +# try: +# self.delChild('reported') +# except: +# pass +# +# record.setName('reported') +# self.addChild(node=record) +# return locals() diff --git a/src/common/events.py b/src/common/events.py index b7dd852a1..d796cfefb 100644 --- a/src/common/events.py +++ b/src/common/events.py @@ -28,7 +28,7 @@ class Event: show_in_systray = True): ''' type_ in chat, normal, file-request, file-error, file-completed, file-request-error, file-send-error, file-stopped, gc_msg, pm, - printed_chat, printed_gc_msg, printed_pm + printed_chat, printed_gc_msg, printed_marked_gc_msg, printed_pm parameters is (per type_): chat, normal: [message, subject, kind, time, encrypted, resource, msg_id] @@ -185,7 +185,8 @@ class Events: first_event = event return first_event - def _get_nb_events(self, account = None, jid = None, attribute = None, types = []): + def _get_nb_events(self, account = None, jid = None, attribute = None, + types = []): '''return the number of pending events''' nb = 0 if account: diff --git a/src/common/gajim.py b/src/common/gajim.py index 9b23b1887..1b2225284 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -124,6 +124,8 @@ status_before_autoaway = {} # be online transport_avatar = {} # {transport_jid: [jid_list]} +# Is Gnome configured to activate on single click ? +single_click = False SHOW_LIST = ['offline', 'connecting', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible', 'error'] diff --git a/src/common/helpers.py b/src/common/helpers.py index eb054ec00..12388bf81 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -40,7 +40,7 @@ try: except: pass -special_groups = (_('Transports'), _('Not in Roster'), _('Observers')) +special_groups = (_('Transports'), _('Not in Roster'), _('Observers'), _('Groupchats')) class InvalidFormat(Exception): pass @@ -548,6 +548,10 @@ def get_icon_name_to_show(contact, account = None): if account and gajim.events.get_nb_roster_events(account, contact.get_full_jid()): return 'message' + if account and gajim.interface.minimized_controls.has_key(account) and \ + contact.jid in gajim.interface.minimized_controls[account] and gajim.interface.\ + minimized_controls[account][contact.jid].get_nb_unread_pm() > 0: + return 'message' if contact.jid.find('@') <= 0: # if not '@' or '@' starts the jid ==> agent return contact.show if contact.sub in ('both', 'to'): @@ -869,7 +873,7 @@ def get_notification_icon_tooltip_text(): 'chat']) unread_single_chat = gajim.events.get_nb_events(types = ['normal']) unread_gc = gajim.events.get_nb_events(types = ['printed_gc_msg', - 'gc_msg']) + 'printed_marked_gc_msg', 'gc_msg']) unread_pm = gajim.events.get_nb_events(types = ['printed_pm', 'pm']) accounts = get_accounts_info() @@ -942,3 +946,20 @@ def get_accounts_info(): accounts.append({'name': account, 'status_line': single_line, 'show': status, 'message': message}) return accounts + +def get_avatar_path(prefix): + '''Returns the filename of the avatar, distinguishes between user- and + contact-provided one. Returns None if no avatar was found at all. + prefix is the path to the requested avatar just before the ".png" or + ".jpeg".''' + # First, scan for a local, user-set avatar + for type_ in ('jpeg', 'png'): + file_ = prefix + '_local.' + type_ + if os.path.exists(file_): + return file_ + # If none available, scan for a contact-provided avatar + for type_ in ('jpeg', 'png'): + file_ = prefix + '.' + type_ + if os.path.exists(file_): + return file_ + return None diff --git a/src/common/logger.py b/src/common/logger.py index 5e91538ba..19c816f64 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -484,7 +484,7 @@ class Logger: else: # user just typed something, we search in message column where_sql = self._build_contact_where(account, jid) - like_sql = '%' + query + '%' + like_sql = '%' + query.replace("'", "''") + '%' self.cur.execute(''' SELECT contact_name, time, kind, show, message, subject FROM logs WHERE (%s) AND message LIKE '%s' diff --git a/src/common/rst_xhtml_generator.py b/src/common/rst_xhtml_generator.py index 16b38fe71..6b78828ef 100644 --- a/src/common/rst_xhtml_generator.py +++ b/src/common/rst_xhtml_generator.py @@ -21,39 +21,70 @@ try: from docutils import nodes,utils from docutils.parsers.rst.roles import set_classes except: + print "Requires docutils 0.4 for set_classes to be available" def create_xhtml(text): return None else: - def jep_reference_role(role, rawtext, text, lineno, inliner, - options={}, content=[]): - '''Role to make handy references to Jabber Enhancement Proposals (JEP). + def pos_int_validator(text): + """Validates that text can be evaluated as a positive integer.""" + result = int(text) + if result < 0: + raise ValueError("Error: value '%(text)s' " + "must be a positive integer") + return result - Use as :JEP:`71` (or jep, or jep-reference). - Modeled after the sample in docutils documentation. + def generate_uri_role( role_name, aliases, + anchor_text, base_url, + interpret_url, validator): + '''Creates and register a uri based "interpreted role". + + Those are similar to the RFC, and PEP ones, and take + role_name: + name that will be registered + aliases: + list of alternate names + anchor_text: + text that will be used, together with the role + base_url: + base url for the link + interpret_url: + this, modulo the validated text, will be added to it + validator: + should return the validated text, or raise ValueError ''' + def uri_reference_role(role, rawtext, text, lineno, inliner, + options={}, content=[]): + try: + valid_text = validator(text) + except ValueError, e: + msg = inliner.reporter.error( e.message % dict(text=text), line=lineno) + prb = inliner.problematic(rawtext, rawtext, msg) + return [prb], [msg] + ref = base_url + interpret_url % valid_text + set_classes(options) + node = nodes.reference(rawtext, anchor_text + utils.unescape(text), refuri=ref, + **options) + return [node], [] - jep_base_url = 'http://www.jabber.org/jeps/' - jep_url = 'jep-%04d.html' - try: - jepnum = int(text) - if jepnum <= 0: - raise ValueError - except ValueError: - msg = inliner.reporter.error( - 'JEP number must be a number greater than or equal to 1; ' - '"%s" is invalid.' % text, line=lineno) - prb = inliner.problematic(rawtext, rawtext, msg) - return [prb], [msg] - ref = jep_base_url + jep_url % jepnum - set_classes(options) - node = nodes.reference(rawtext, 'JEP ' + utils.unescape(text), refuri=ref, - **options) - return [node], [] + uri_reference_role.__doc__ = """Role to make handy references to URIs. - roles.register_canonical_role('jep-reference', jep_reference_role) - from docutils.parsers.rst.languages.en import roles - roles['jep-reference'] = 'jep-reference' - roles['jep'] = 'jep-reference' + Use as :%(role_name)s:`71` (or any of %(aliases)s). + It will use %(base_url)s+%(interpret_url)s + validator should throw a ValueError, containing optionally + a %%(text)s format, if the interpreted text is not valid. + """ % locals() + roles.register_canonical_role(role_name, uri_reference_role) + from docutils.parsers.rst.languages import en + en.roles[role_name] = role_name + for alias in aliases: + en.roles[alias] = role_name + + generate_uri_role('xep-reference', ('jep', 'xep'), + 'XEP #', 'http://www.xmpp.org/extensions/', 'xep-%04d.html', + pos_int_validator) + generate_uri_role('gajim-ticket-reference', ('ticket','gtrack'), + 'Gajim Ticket #', 'http://trac.gajim.org/ticket/', '%d', + pos_int_validator) class HTMLGenerator: '''Really simple HTMLGenerator starting from publish_parts. @@ -108,7 +139,7 @@ else: if __name__ == '__main__': - print Generator.create_xhtml(''' + print "test 1\n", Generator.create_xhtml(""" test:: >>> print 1 @@ -118,9 +149,10 @@ test:: this `` should trigger`` should trigger the   problem. -''') - print Generator.create_xhtml(''' +""") + print "test 2\n", Generator.create_xhtml(""" *test1 test2_ -''') +""") + print "test 3\n", Generator.create_xhtml(""":ticket:`316` implements :xep:`71`""") diff --git a/src/common/xmpp/features_nb.py b/src/common/xmpp/features_nb.py index 61e54ce7d..5785a3034 100644 --- a/src/common/xmpp/features_nb.py +++ b/src/common/xmpp/features_nb.py @@ -143,7 +143,6 @@ def _ReceivedRegInfo(con, resp, agent): def register(disp, host, info, cb): """ Perform registration on remote server with provided info. disp must be connected dispatcher instance. - Returns true or false depending on registration result. If registration fails you can get additional info from the dispatcher's owner attributes lastErrNode, lastErr and lastErrCode. """ diff --git a/src/common/zeroconf/client_zeroconf.py b/src/common/zeroconf/client_zeroconf.py index e11dda12b..e9d9f452d 100644 --- a/src/common/zeroconf/client_zeroconf.py +++ b/src/common/zeroconf/client_zeroconf.py @@ -158,10 +158,6 @@ class P2PClient(IdleObject): self.Connection.PlugIn(self) dispatcher_nb.Dispatcher().PlugIn(self) self._register_handlers() - if self.sock_type == TYPE_CLIENT: - while self.stanzaqueue: - stanza, is_message = self.stanzaqueue.pop(0) - self.send(stanza, is_message) def StreamInit(self): ''' Send an initial stream header. ''' @@ -178,9 +174,11 @@ class P2PClient(IdleObject): def send_stream_header(self): self.Dispatcher._metastream = Node('stream:stream') self.Dispatcher._metastream.setNamespace(self.Namespace) - # XXX TLS support - #~ self._metastream.setAttr('version', '1.0') + self.Dispatcher._metastream.setAttr('version', '1.0') self.Dispatcher._metastream.setAttr('xmlns:stream', NS_STREAMS) + self.Dispatcher._metastream.setAttr('from', self.conn_holder.zeroconf.name) + if self.to: + self.Dispatcher._metastream.setAttr('to', self.to) self.Dispatcher.send("%s>" % str(self.Dispatcher._metastream)[:-2]) def _check_stream_start(self, ns, tag, attrs): @@ -191,7 +189,17 @@ class P2PClient(IdleObject): self.Connection.disconnect() return if self.sock_type == TYPE_SERVER: + if attrs.has_key('from'): + self.to = attrs['from'] self.send_stream_header() + if attrs.has_key('version') and attrs['version'] == '1.0': + # other part supports stream features + features = Node('stream:features') + self.Dispatcher.send(features) + while self.stanzaqueue: + stanza, is_message = self.stanzaqueue.pop(0) + self.send(stanza, is_message) + elif self.sock_type == TYPE_CLIENT: while self.stanzaqueue: stanza, is_message = self.stanzaqueue.pop(0) self.send(stanza, is_message) diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index 5bdb7104a..29d40226c 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -52,18 +52,21 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): # 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.is_zeroconf = True self.privacy_rules_supported = False + self.blocked_contacts = [] + self.blocked_groups = [] self.status = '' self.old_show = '' self.priority = 0 self.call_resolve_timeout = False - #self.time_to_reconnect = None + self.time_to_reconnect = None #self.new_account_info = None self.bookmarks = [] @@ -127,10 +130,12 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): gajim.handlers[event](self.name, data) 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.reconnect() +# signed = self.get_signed_msg(self.status) + self.connect(self.old_show, self.status) def quit(self, kill_core): if kill_core and self.connected > 1: @@ -174,7 +179,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): self.dispatch('ROSTER_INFO', (key, self.roster.getName(key), 'both', 'no', self.roster.getGroups(key))) self.dispatch('NOTIFY', (key, self.roster.getStatus(key), - self.roster.getMessage(key), 'local', 0, None, 0)) + self.roster.getMessage(key), 'local', 0, None, 0, None)) #XXX open chat windows don't get refreshed (full name), add that return self.call_resolve_timeout @@ -182,13 +187,13 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): 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)) + 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) # 'NOTIFY' (account, (jid, status, status message, resource, priority, - # keyID, timestamp)) - self.dispatch('NOTIFY', (jid, 'offline', '', 'local', 0, None, 0)) + # keyID, timestamp, contact_nickname)) + self.dispatch('NOTIFY', (jid, 'offline', '', 'local', 0, None, 0, None)) def _on_disconnected(self): self.disconnect() @@ -199,6 +204,19 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): 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''' + if gajim.account_is_connected(self.name): + # we cannot change our status to offline or connecting + # after we auth to server + self.old_show = STATUS_LIST[self.connected] + self.connected = 0 + self.dispatch('STATUS', 'offline') + # random number to show we wait network manager to send us a reconenct + self.time_to_reconnect = 5 + self.on_purpose = False + def _on_name_conflictCB(self, alt_name): self.disconnect() self.dispatch('STATUS', 'offline') @@ -241,7 +259,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): #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)) + self.dispatch('NOTIFY', (jid, self.roster.getStatus(jid), self.roster.getMessage(jid), 'local', 0, None, 0, None)) self.connected = STATUS_LIST.index(show) @@ -300,6 +318,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): # 'disconnect' elif show == 'offline' and self.connected: self.disconnect() + self.time_to_reconnect = None # update status elif show != 'offline' and self.connected: @@ -332,12 +351,12 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): chatstate = None, msg_id = None, composing_jep = None, resource = None, user_nick = None): fjid = jid - + 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]) return @@ -345,19 +364,23 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): msgtxt = msg msgenc = '' if keyID and USE_GPG: - #encrypt - msgenc = self.gpg.encrypt(msg, [keyID]) - if msgenc: + # 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)) + return 3 - if type == 'chat': msg_iq = common.xmpp.Message(to = fjid, body = msgtxt, typ = type) - + else: if subject: msg_iq = common.xmpp.Message(to = fjid, body = msgtxt, @@ -368,7 +391,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): 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 @@ -386,7 +409,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): # when msgtxt, requests JEP-0022 composing notification if chatstate is 'composing' or msgtxt: chatstate_node.addChild(name = 'composing') - + if not self.connection.send(msg_iq, msg != None): return diff --git a/src/common/zeroconf/roster_zeroconf.py b/src/common/zeroconf/roster_zeroconf.py index ea676ac23..1de058af7 100644 --- a/src/common/zeroconf/roster_zeroconf.py +++ b/src/common/zeroconf/roster_zeroconf.py @@ -67,6 +67,8 @@ class Roster: status = txt_dict['status'] else: status = '' + if not status: + status = 'avail' nm = '' if txt_dict.has_key('1st'): nm = txt_dict['1st'] diff --git a/src/config.py b/src/config.py index dd2654412..e1bcfa062 100644 --- a/src/config.py +++ b/src/config.py @@ -1214,7 +1214,7 @@ class AccountModificationWindow: self.xml.get_widget('save_password_checkbutton').set_active( gajim.config.get_per('accounts', self.account, 'savepass')) if gajim.config.get_per('accounts', self.account, 'savepass'): - passstr = passwords.get_password(self.account) + passstr = passwords.get_password(self.account) or '' password_entry = self.xml.get_widget('password_entry') password_entry.set_sensitive(True) password_entry.set_text(passstr) @@ -1408,7 +1408,7 @@ class AccountModificationWindow: config['keyname'] = self.xml.get_widget('gpg_name_label').get_text().\ decode('utf-8') - if config['keyname'] == '': #no key selected + if config['keyname'] == '': # no key selected config['keyid'] = '' config['savegpgpass'] = False config['gpgpassword'] = '' @@ -1419,9 +1419,9 @@ class AccountModificationWindow: 'gpg_save_password_checkbutton').get_active() config['gpgpassword'] = self.xml.get_widget('gpg_password_entry' ).get_text().decode('utf-8') - #if we modify the name of the account + # if we modify the name of the account if name != self.account: - #update variables + # update variables gajim.interface.instances[name] = gajim.interface.instances[ self.account] gajim.nicks[name] = gajim.nicks[self.account] @@ -1446,7 +1446,7 @@ class AccountModificationWindow: # change account variable for chat / gc controls gajim.interface.msg_win_mgr.change_account_name(self.account, name) # upgrade account variable in opened windows - for kind in ('infos', 'disco', 'gc_config'): + for kind in ('infos', 'disco', 'gc_config', 'search'): for j in gajim.interface.instances[name][kind]: gajim.interface.instances[name][kind][j].account = name @@ -1588,6 +1588,13 @@ class AccountModificationWindow: gajim.interface.instances['manage_proxies'] = \ ManageProxiesWindow() + def on_synchronise_contacts_button_clicked(self, widget): + try: + dialog = dialogs.SynchroniseSelectAccountDialog(self.account) + except GajimGeneralException: + # If we showed ErrorDialog, there will not be dialog instance + return + def on_gpg_choose_button_clicked(self, widget, data = None): if gajim.connections.has_key(self.account): secret_keys = gajim.connections[self.account].ask_gpg_secrete_keys() @@ -2049,7 +2056,7 @@ class AccountsWindow: connection_zeroconf.ConnectionZeroconf(gajim.ZEROCONF_ACC_NAME) # update variables gajim.interface.instances[gajim.ZEROCONF_ACC_NAME] = {'infos': {}, - 'disco': {}, 'gc_config': {}} + 'disco': {}, 'gc_config': {}, 'search': {}} gajim.connections[gajim.ZEROCONF_ACC_NAME].connected = 0 gajim.groups[gajim.ZEROCONF_ACC_NAME] = {} gajim.contacts.add_account(gajim.ZEROCONF_ACC_NAME) @@ -2080,44 +2087,23 @@ class AccountsWindow: self.on_checkbutton_toggled(widget, 'enable_zeroconf') -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''' - def __init__(self, service, infos, account, is_form): - self.service = service +class FakeDataForm(gtk.Table, object): + '''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 - self.account = account - self.is_form = is_form - self.xml = gtkgui_helpers.get_glade('service_registration_window.glade') - self.window = self.xml.get_widget('service_registration_window') - self.window.set_transient_for(gajim.interface.roster.window) - if self.is_form: - dataform = dataforms.ExtendForm(node = self.infos) - self.data_form_widget = dataforms_widget.DataFormWidget(dataform) - if self.data_form_widget.title: - self.window.set_title("%s - Gajim" % self.data_form_widget.title) - table = self.xml.get_widget('table') - table.attach(self.data_form_widget, 0, 2, 0, 1) - else: - if infos.has_key('registered'): - self.window.set_title(_('Edit %s') % service) - else: - self.window.set_title(_('Register to %s') % service) - self.xml.get_widget('label').set_text(infos['instructions']) - self.entries = {} - self.draw_table() + self.entries = {} + self._draw_table() - self.xml.signal_autoconnect(self) - self.window.show_all() - - def on_cancel_button_clicked(self, widget): - self.window.destroy() - - def draw_table(self): - '''Draw the table in the window''' + def _draw_table(self): + '''Draw the table''' nbrow = 0 - table = self.xml.get_widget('table') + if self.infos.has_key('instructions'): + nbrow = 1 + self.resize(rows = nbrow, columns = 2) + label = gtk.Label(self.infos['instructions']) + self.attach(label, 0, 2, 0, 1, 0, 0, 0, 0) for name in self.infos.keys(): if name in ('key', 'instructions', 'x', 'registered'): continue @@ -2125,40 +2111,73 @@ class ServiceRegistrationWindow: continue nbrow = nbrow + 1 - table.resize(rows = nbrow, columns = 2) + self.resize(rows = nbrow, columns = 2) label = gtk.Label(name.capitalize() + ':') - table.attach(label, 0, 1, nbrow - 1, nbrow, 0, 0, 0, 0) + self.attach(label, 0, 1, nbrow - 1, nbrow, 0, 0, 0, 0) entry = gtk.Entry() entry.set_activates_default(True) if self.infos[name]: entry.set_text(self.infos[name]) if name == 'password': entry.set_visibility(False) - table.attach(entry, 1, 2, nbrow - 1, nbrow, 0, 0, 0, 0) + self.attach(entry, 1, 2, nbrow - 1, nbrow, 0, 0, 0, 0) self.entries[name] = entry if nbrow == 1: entry.grab_focus() - table.show_all() + + def get_infos(self): + for name in self.entries.keys(): + self.infos[name] = self.entries[name].get_text().decode('utf-8') + 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''' + def __init__(self, service, infos, account, is_form): + self.service = service + self.account = account + self.is_form = is_form + self.xml = gtkgui_helpers.get_glade('service_registration_window.glade') + self.window = self.xml.get_widget('service_registration_window') + self.window.set_transient_for(gajim.interface.roster.window) + if self.is_form: + dataform = dataforms.ExtendForm(node = infos) + self.data_form_widget = dataforms_widget.DataFormWidget(dataform) + if self.data_form_widget.title: + self.window.set_title('%s - Gajim' % self.data_form_widget.title) + table = self.xml.get_widget('table') + table.attach(self.data_form_widget, 0, 2, 0, 1) + else: + if infos.has_key('registered'): + self.window.set_title(_('Edit %s') % service) + else: + self.window.set_title(_('Register to %s') % service) + self.data_form_widget = FakeDataForm(infos) + table = self.xml.get_widget('table') + table.attach(self.data_form_widget, 0, 2, 0, 1) + + self.xml.signal_autoconnect(self) + self.window.show_all() + + def on_cancel_button_clicked(self, widget): + self.window.destroy() def on_ok_button_clicked(self, widget): + # send registration info to the core if self.is_form: form = self.data_form_widget.data_form gajim.connections[self.account].register_agent(self.service, form, True) # True is for is_form else: - # we pressed OK of service_registration_window - # send registration info to the core - for name in self.entries.keys(): - self.infos[name] = self.entries[name].get_text().decode('utf-8') - if self.infos.has_key('instructions'): - del self.infos['instructions'] - if self.infos.has_key('registered'): - del self.infos['registered'] - gajim.connections[self.account].register_agent(self.service, - self.infos) - - self.window.destroy() + infos = self.data_form_widget.get_infos() + if infos.has_key('instructions'): + del infos['instructions'] + if infos.has_key('registered'): + del infos['registered'] + gajim.connections[self.account].register_agent(self.service, infos) + self.window.destroy() class GroupchatConfigWindow: '''GroupchatConfigWindow class''' @@ -2759,13 +2778,21 @@ class AccountCreationWizardWindow: 'account_creation_wizard_window.glade') self.window = self.xml.get_widget('account_creation_wizard_window') + completion = gtk.EntryCompletion() # Connect events from comboboxentry.child server_comboboxentry = self.xml.get_widget('server_comboboxentry') entry = server_comboboxentry.child entry.connect('key_press_event', - self.on_server_comboboxentry_key_press_event) - completion = gtk.EntryCompletion() + self.on_server_comboboxentry_key_press_event, server_comboboxentry) entry.set_completion(completion) + # Do the same for the other server comboboxentry + server_comboboxentry1 = self.xml.get_widget('server_comboboxentry1') + entry = server_comboboxentry1.child + entry.connect('key_press_event', + self.on_server_comboboxentry_key_press_event, server_comboboxentry1) + entry.set_completion(completion) + + self.update_proxy_list() # parse servers.xml servers_xml = os.path.join(gajim.DATA_DIR, 'other', 'servers.xml') @@ -2781,6 +2808,8 @@ class AccountCreationWizardWindow: # Put servers into comboboxentries server_comboboxentry.set_model(servers_model) server_comboboxentry.set_text_column(0) + server_comboboxentry1.set_model(servers_model) + server_comboboxentry1.set_text_column(0) # Generic widgets self.notebook = self.xml.get_widget('notebook') @@ -2819,28 +2848,18 @@ class AccountCreationWizardWindow: self.window.destroy() def on_back_button_clicked(self, widget): - if self.notebook.get_current_page() == 1: + if self.notebook.get_current_page() in (1, 2): self.notebook.set_current_page(0) self.back_button.set_sensitive(False) - elif self.notebook.get_current_page() == 3: # finish page + elif self.notebook.get_current_page() == 3: + self.notebook.set_current_page(2) + self.xml.get_widget('form_vbox').remove(self.data_form_widget) + elif self.notebook.get_current_page() == 5: # finish page self.forward_button.show() - self.notebook.set_current_page(1) # Goto parameters page - - def get_widgets(self): - widgets = {} - for widget in ( - 'username_entry', - 'server_comboboxentry', - 'pass1_entry', - 'pass2_entry', - 'save_password_checkbutton', - 'proxyhost_entry', - 'proxyport_entry', - 'proxyuser_entry', - 'proxypass_entry', - 'jid_label'): - widgets[widget] = self.xml.get_widget(widget) - return widgets + if self.modify: + self.notebook.set_current_page(1) # Go to parameters page + else: + self.notebook.set_current_page(2) # Go to server page def on_forward_button_clicked(self, widget): cur_page = self.notebook.get_current_page() @@ -2849,41 +2868,29 @@ class AccountCreationWizardWindow: widget = self.xml.get_widget('use_existing_account_radiobutton') if widget.get_active(): self.modify = True - self.xml.get_widget('server_features_button').hide() - self.xml.get_widget('pass2_entry').hide() - self.xml.get_widget('pass2_label').hide() + self.notebook.set_current_page(1) else: self.modify = False - self.xml.get_widget('server_features_button').show() - self.xml.get_widget('pass2_entry').show() - self.xml.get_widget('pass2_label').show() - self.notebook.set_current_page(1) + self.notebook.set_current_page(2) self.back_button.set_sensitive(True) return - else: - widgets = self.get_widgets() - username = widgets['username_entry'].get_text().decode('utf-8') + elif cur_page == 1: + # We are adding an existing account + username = self.xml.get_widget('username_entry').get_text().decode( + 'utf-8') if not username: pritext = _('Invalid username') - sectext = _('You must provide a username to configure this account' - '.') + sectext = _( + 'You must provide a username to configure this account.') dialogs.ErrorDialog(pritext, sectext) return - server = widgets['server_comboboxentry'].child.get_text().decode('utf-8') - savepass = widgets['save_password_checkbutton'].get_active() - password = widgets['pass1_entry'].get_text().decode('utf-8') - - if not self.modify: - if password == '': - dialogs.ErrorDialog(_('Invalid password'), - _('You must enter a password for the new account.')) - return - - if widgets['pass2_entry'].get_text() != password: - dialogs.ErrorDialog(_('Passwords do not match'), - _('The passwords typed in both fields must be identical.')) - return + server = self.xml.get_widget('server_comboboxentry').child.get_text().\ + decode('utf-8') + savepass = self.xml.get_widget('save_password_checkbutton').\ + get_active() + password = self.xml.get_widget('password_entry').get_text().decode( + 'utf-8') jid = username + '@' + server # check if jid is conform to RFC and stringprep it @@ -2919,31 +2926,141 @@ class AccountCreationWizardWindow: self.forward_button.hide() if self.modify: finish_text = '%s\n\n%s' % ( - _('Account has been added successfully'), - _('You can set advanced account options by pressing the ' - 'Advanced button, or later by choosing the Accounts menuitem ' + _('Account has been added successfully'), + _('You can set advanced account options by pressing the ' + 'Advanced button, or later by choosing the Accounts menuitem ' 'under the Edit menu from the main window.')) - self.finish_label.set_markup(finish_text) - self.finish_button.show() - self.finish_button.set_property('has-default', True) - self.advanced_button.show() - self.go_online_checkbutton.show() - img = self.xml.get_widget('finish_image') - img.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_DIALOG) - self.notebook.set_current_page(3) # show finish page - self.show_vcard_checkbutton.set_active(False) + self.finish_label.set_markup(finish_text) + self.finish_button.show() + self.finish_button.set_property('has-default', True) + self.advanced_button.show() + self.go_online_checkbutton.show() + img = self.xml.get_widget('finish_image') + img.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_DIALOG) + self.notebook.set_current_page(5) # show finish page + self.show_vcard_checkbutton.set_active(False) + elif cur_page == 2: + server = self.xml.get_widget('server_comboboxentry1').child.get_text()\ + .decode('utf-8') + + if not server: + dialogs.ErrorDialog(_('Invalid server'), + _('Please provide a server on which you want to register.')) + return + self.account = server + i = 1 + while self.account in gajim.connections: + self.account = server + str(i) + i += 1 + + config = self.get_config('', server, '', '') + # Get advanced options + proxies_combobox = self.xml.get_widget('proxies_combobox') + active = proxies_combobox.get_active() + proxy = proxies_combobox.get_model()[active][0].decode('utf-8') + if proxy == _('None'): + proxy = '' + config['proxy'] = proxy + + config['use_custom_host'] = self.xml.get_widget( + 'custom_host_port_checkbutton').get_active() + custom_port = self.xml.get_widget('custom_port_entry').get_text() + try: + custom_port = int(custom_port) + except: + dialogs.ErrorDialog(_('Invalid entry'), + _('Custom port must be a port number.')) + return + config['custom_port'] = custom_port + config['custom_host'] = self.xml.get_widget( + 'custom_host_entry').get_text().decode('utf-8') + + self.notebook.set_current_page(4) # show creating page + self.back_button.hide() + self.forward_button.hide() + self.update_progressbar_timeout_id = gobject.timeout_add(100, + self.update_progressbar) + # Get form from serveur + con = connection.Connection(self.account) + con.new_account(self.account, config) + gajim.connections[self.account] = con + elif cur_page == 3: + if self.is_form: + form = self.data_form_widget.data_form else: - self.notebook.set_current_page(2) # show creating page - self.update_progressbar_timeout_id = gobject.timeout_add(100, - self.update_progressbar) + form = self.data_form_widget.get_infos() + gajim.connections[self.account].send_new_account_infos(form, + self.is_form) + self.xml.get_widget('form_vbox').remove(self.data_form_widget) + self.xml.get_widget('progressbar_label').set_markup('Account is being created\n\nPlease wait...') + self.notebook.set_current_page(4) # show creating page + self.back_button.hide() + self.forward_button.hide() + self.update_progressbar_timeout_id = gobject.timeout_add(100, + self.update_progressbar) + + def update_proxy_list(self): + proxies_combobox = self.xml.get_widget('proxies_combobox') + model = gtk.ListStore(str) + proxies_combobox.set_model(model) + l = gajim.config.get_per('proxies') + l.insert(0, _('None')) + for i in xrange(len(l)): + model.append([l[i]]) + proxies_combobox.set_active(0) + + def on_manage_proxies_button_clicked(self, widget): + if gajim.interface.instances.has_key('manage_proxies'): + gajim.interface.instances['manage_proxies'].window.present() + else: + gajim.interface.instances['manage_proxies'] = \ + ManageProxiesWindow() + + def on_custom_host_port_checkbutton_toggled(self, widget): + self.xml.get_widget('custom_host_hbox').set_sensitive(widget.get_active()) def update_progressbar(self): self.progressbar.pulse() return True # loop forever + def new_acc_connected(self, form, is_form): + '''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() + self.forward_button.show() + self.notebook.set_current_page(3) # show form page + self.is_form = is_form + if is_form: + dataform = dataforms.ExtendForm(node = form) + self.data_form_widget = dataforms_widget.DataFormWidget(dataform) + else: + self.data_form_widget = FakeDataForm(form) + self.data_form_widget.show_all() + self.xml.get_widget('form_vbox').pack_start(self.data_form_widget) + + def new_acc_not_connected(self, reason): + '''Account creation failed: connection to server failed''' + if self.update_progressbar_timeout_id is not None: + gobject.source_remove(self.update_progressbar_timeout_id) + del gajim.connections[self.account] + self.back_button.show() + self.cancel_button.show() + self.go_online_checkbutton.hide() + self.show_vcard_checkbutton.hide() + img = self.xml.get_widget('finish_image') + img.set_from_stock(gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_DIALOG) + finish_text = '%s\n\n%s' % ( + _('An error occurred during account creation') , reason) + self.finish_label.set_markup(finish_text) + self.notebook.set_current_page(5) # show finish page + def acc_is_ok(self, config): '''Account creation succeeded''' self.create_vars(config) + self.cancel_button.hide() + self.back_button.hide() + self.forward_button.hide() self.finish_button.show() self.finish_button.set_property('has-default', True) self.advanced_button.show() @@ -2959,7 +3076,7 @@ class AccountCreationWizardWindow: 'button, or later by choosing the Accounts menuitem under the Edit ' 'menu from the main window.')) self.finish_label.set_markup(finish_text) - self.notebook.set_current_page(3) # show finish page + self.notebook.set_current_page(5) # show finish page if self.update_progressbar_timeout_id is not None: gobject.source_remove(self.update_progressbar_timeout_id) @@ -2970,12 +3087,16 @@ class AccountCreationWizardWindow: self.cancel_button.show() self.go_online_checkbutton.hide() self.show_vcard_checkbutton.hide() + del gajim.connections[self.account] img = self.xml.get_widget('finish_image') img.set_from_stock(gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_DIALOG) finish_text = '%s\n\n%s' % (_('An error occurred during ' 'account creation') , reason) self.finish_label.set_markup(finish_text) - self.notebook.set_current_page(3) # show finish page + self.notebook.set_current_page(5) # show finish page + + if self.update_progressbar_timeout_id is not None: + gobject.source_remove(self.update_progressbar_timeout_id) def on_advanced_button_clicked(self, widget): gajim.interface.instances[self.account]['account_modification'] = \ @@ -3005,12 +3126,11 @@ class AccountCreationWizardWindow: combobox.child.set_position(-1) return True - def on_server_comboboxentry_key_press_event(self, widget, event): + def on_server_comboboxentry_key_press_event(self, widget, event, combobox): # If backspace is pressed in empty field, return to the nick entry field backspace = event.keyval == gtk.keysyms.BackSpace - combobox = self.xml.get_widget('server_comboboxentry') empty = len(combobox.get_active_text()) == 0 - if backspace and empty: + if backspace and empty and self.modify: username_entry = self.xml.get_widget('username_entry') username_entry.grab_focus() username_entry.set_position(-1) @@ -3028,14 +3148,7 @@ class AccountCreationWizardWindow: string = '%s@%s' % (name, server) jid_label.set_label(string) - def save_account(self, login, server, savepass, password): - if self.account in gajim.connections: - dialogs.ErrorDialog(_('Account name is in use'), - _('You already have an account using this name.')) - return - con = connection.Connection(self.account) - con.password = password - + def get_config(self, login, server, savepass, password): config = {} config['name'] = login config['hostname'] = server @@ -3055,6 +3168,17 @@ class AccountCreationWizardWindow: config['keyid'] = '' config['savegpgpass'] = False config['gpgpassword'] = '' + return config + + def save_account(self, login, server, savepass, password): + if self.account in gajim.connections: + dialogs.ErrorDialog(_('Account name is in use'), + _('You already have an account using this name.')) + return + con = connection.Connection(self.account) + con.password = password + + config = self.get_config(login, server, savepass, password) if not self.modify: con.new_account(self.account, config) @@ -3073,7 +3197,7 @@ class AccountCreationWizardWindow: # update variables gajim.interface.instances[self.account] = {'infos': {}, 'disco': {}, - 'gc_config': {}} + 'gc_config': {}, 'search': {}} gajim.connections[self.account].connected = 0 gajim.groups[self.account] = {} gajim.contacts.add_account(self.account) diff --git a/src/conversation_textview.py b/src/conversation_textview.py index 3e1d29cff..d3ac1e875 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -14,6 +14,10 @@ ## GNU General Public License for more details. ## +import random +from tempfile import gettempdir +from subprocess import Popen + import gtk import pango import gobject @@ -572,6 +576,72 @@ class ConversationTextview: return index # the position after *last* special text + def latex_to_image(self, str): + result = None + exitcode = 0 + + # some latex commands are really bad + blacklist = ["\\def", "\\let", "\\futurelet", + "\\newcommand", "\\renewcomment", "\\else", "\\fi", "\\write", + "\\input", "\\include", "\\chardef", "\\catcode", "\\makeatletter", + "\\noexpand", "\\toksdef", "\\every", "\\errhelp", "\\errorstopmode", + "\\scrollmode", "\\nonstopmode", "\\batchmode", "\\read", "\\csname", + "\\newhelp", "\\relax", "\\afterground", "\\afterassignment", + "\\expandafter", "\\noexpand", "\\special", "\\command", "\\loop", + "\\repeat", "\\toks", "\\output", "\\line", "\\mathcode", "\\name", + "\\item", "\\section", "\\mbox", "\\DeclareRobustCommand", "\\[", + "\\]"] + + str = str[2:len(str)-2] + + # filter latex code with bad commands + for word in blacklist: + if word in str: + exitcode = 1 + break + + if exitcode == 0: + random.seed() + tmpfile = os.path.join(gettempdir(), "gajimtex_" + random.randint(0, + 100).__str__()) + + # build latex string + texstr = "\\documentclass[12pt]{article}\\usepackage[dvips]{graphicx}\\usepackage{amsmath}\\usepackage{amssymb}\\pagestyle{empty}" + texstr += "\\begin{document}\\begin{large}\\begin{gather*}" + texstr += str + texstr += "\\end{gather*}\\end{large}\\end{document}" + + file = open(os.path.join(tmpfile + ".tex"), "w+") + file.write(texstr) + file.flush() + file.close() + + p = Popen(['latex', '--interaction=nonstopmode', tmpfile + '.tex'], + cwd=gettempdir()) + exitcode = p.wait() + + if exitcode == 0: + p = Popen(['dvips', '-E', '-o', tmpfile + '.ps', tmpfile + '.dvi'], + cwd=gettempdir()) + exitcode = p.wait() + + if exitcode == 0: + p = Popen(['convert', tmpfile + '.ps', tmpfile + '.png'], + cwd=gettempdir()) + exitcode = p.wait() + + extensions = [".tex", ".log", ".aux", ".dvi", ".ps"] + for ext in extensions: + try: + os.remove(tmpfile + ext) + except Exception: + pass + + if exitcode == 0: + result = tmpfile + '.png' + + return result + def print_special_text(self, special_text, other_tags): '''is called by detect_and_print_special_text and prints special text (emots, links, formatting)''' @@ -656,6 +726,24 @@ class ConversationTextview: else: if not show_ascii_formatting_chars: special_text = special_text[1:-1] # remove _ _ + elif special_text.startswith('$$') and special_text.endswith('$$'): + imagepath = self.latex_to_image(special_text) + end_iter = buffer.get_end_iter() + anchor = buffer.create_child_anchor(end_iter) + if imagepath != None: + img = gtk.Image() + img.set_from_file(imagepath) + img.show() + # add + self.tv.add_child_at_anchor(img, anchor) + # delete old file + try: + os.remove(imagepath) + except Exception: + pass + else: + buffer.insert(end_iter, special_text) + use_other_tags = False else: #it's a url tags.append('url') diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index ddd44b889..19fb91c18 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -16,8 +16,8 @@ ## """ This module contains widget that can display data form (JEP-0004). Words single and multiple refers here to types of data forms: -single means these with one record of data (without element), -multiple - these which may contain more data (with element).""" +single means these with one record of data (without element), +multiple - these which may contain more data (with element).""" import gtk @@ -41,7 +41,7 @@ class DataFormWidget(gtk.Alignment, object): for name in ('instructions_label', 'instructions_hseparator', 'single_form_viewport', 'data_form_types_notebook', 'single_form_scrolledwindow', 'multiple_form_hbox', - 'records_treeview', 'add_button', 'remove_button', + 'records_treeview', 'buttons_vbox', 'add_button', 'remove_button', 'edit_button', 'up_button', 'down_button', 'clear_button'): self.__dict__[name] = self.xml.get_widget(name) @@ -141,7 +141,7 @@ class DataFormWidget(gtk.Alignment, object): # creating model for form... fieldtypes = [] - for field in self._data_form.recorded.iter_fields(): + for field in self._data_form.reported.iter_fields(): # note: we store also text-private and hidden fields, # we just do not display them. # TODO: boolean fields @@ -157,8 +157,7 @@ class DataFormWidget(gtk.Alignment, object): self.multiplemodel.append([field.value for field in item.iter_fields()]) # constructing columns... - for field, counter in zip(self._data_form.iter_fields(), itertools.count()): - print repr(field), repr(counter) + for field, counter in zip(self._data_form.reported.iter_fields(), itertools.count()): self.records_treeview.append_column( gtk.TreeViewColumn(field.label, gtk.CellRendererText(), text=counter)) @@ -172,8 +171,14 @@ class DataFormWidget(gtk.Alignment, object): self.clean_data_form = self.clean_multiple_data_form - # refresh list look - self.refresh_multiple_buttons() + readwrite = self._data_form.type != 'result' + if not readwrite: + self.buttons_vbox.set_no_show_all(True) + self.buttons_vbox.hide() + else: + self.buttons_vbox.set_no_show_all(False) + # refresh list look + self.refresh_multiple_buttons() def clean_multiple_data_form(self): '''(Called as clean_data_form, read the docs of clean_data_form()). @@ -186,12 +191,12 @@ class DataFormWidget(gtk.Alignment, object): selection = self.records_treeview.get_selection() model = self.records_treeview.get_model() count = selection.count_selected_rows() - if count==0: + if count == 0: self.remove_button.set_sensitive(False) self.edit_button.set_sensitive(False) self.up_button.set_sensitive(False) self.down_button.set_sensitive(False) - elif count==1: + elif count == 1: self.remove_button.set_sensitive(True) self.edit_button.set_sensitive(True) _, (path,) = selection.get_selected_rows() @@ -199,7 +204,7 @@ class DataFormWidget(gtk.Alignment, object): if model.iter_next(iter) is None: self.up_button.set_sensitive(True) self.down_button.set_sensitive(False) - elif path==(0,): + elif path == (0, ): self.up_button.set_sensitive(False) self.down_button.set_sensitive(True) else: @@ -211,7 +216,7 @@ class DataFormWidget(gtk.Alignment, object): self.up_button.set_sensitive(False) self.down_button.set_sensitive(False) - if len(model)==0: + if len(model) == 0: self.clear_button.set_sensitive(False) else: self.clear_button.set_sensitive(True) diff --git a/src/dialogs.py b/src/dialogs.py index b7503eb15..4d7cc0a3c 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -7,6 +7,7 @@ ## Copyright (C) 2005 Dimitur Kirov ## Copyright (C) 2005-2006 Travis Shirk ## Copyright (C) 2005 Norman Rasmussen +## Copyright (C) 2007 Lukas Petrovicky ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published @@ -56,7 +57,7 @@ class EditGroupsDialog: if len(list_) == 1: contact = list_[0][0] self.xml.get_widget('nickname_label').set_markup( - _("Contact name: %s") % contact.get_shown_name()) + _('Contact name: %s') % contact.get_shown_name()) self.xml.get_widget('jid_label').set_markup( _('Jabber ID: %s') % contact.jid) else: @@ -434,10 +435,10 @@ class ChangeStatusMessageDialog: self.window.set_transient_for(gajim.interface.roster.window) if show: uf_show = helpers.get_uf_show(show) - title_text = _('%s Status Message') % uf_show + self.title_text = _('%s Status Message') % uf_show else: - title_text = _('Status Message') - self.window.set_title(title_text) + self.title_text = _('Status Message') + self.window.set_title(self.title_text) message_textview = self.xml.get_widget('message_textview') self.message_buffer = message_textview.get_buffer() @@ -459,6 +460,10 @@ class ChangeStatusMessageDialog: self.preset_messages_dict[msg_name] = msg_text sorted_keys_list = helpers.get_sorted_keys(self.preset_messages_dict) + self.countdown_time = gajim.config.get('change_status_window_timeout') + self.countdown_left = self.countdown_time + self.countdown_enabled = True + self.message_liststore = gtk.ListStore(str) # msg_name self.message_combobox = self.xml.get_widget('message_combobox') self.message_combobox.set_model(self.message_liststore) @@ -470,9 +475,25 @@ class ChangeStatusMessageDialog: self.xml.signal_autoconnect(self) self.window.show_all() + def countdown(self): + if self.countdown_enabled: + if self.countdown_left <= 0: + self.window.response(gtk.RESPONSE_OK) + return False + self.window.set_title('%s [%s]' % (self.title_text, + str(self.countdown_left))) + self.countdown_left -= 1 + return True + else: + self.window.set_title(self.title_text) + return False + def run(self): '''Wait for OK or Cancel button to be pressed and return status messsage (None if users pressed Cancel or x button of WM''' + if self.countdown_time > 0: + self.countdown() + gobject.timeout_add(1000, self.countdown) rep = self.window.run() if rep == gtk.RESPONSE_OK: beg, end = self.message_buffer.get_bounds() @@ -487,6 +508,7 @@ class ChangeStatusMessageDialog: return message def on_message_combobox_changed(self, widget): + self.countdown_enabled = False model = widget.get_model() active = widget.get_active() if active < 0: @@ -495,10 +517,13 @@ class ChangeStatusMessageDialog: self.message_buffer.set_text(self.preset_messages_dict[name]) def on_change_status_message_dialog_key_press_event(self, widget, event): + self.countdown_enabled = False if event.keyval == gtk.keysyms.Return or \ event.keyval == gtk.keysyms.KP_Enter: # catch CTRL+ENTER if (event.state & gtk.gdk.CONTROL_MASK): self.window.response(gtk.RESPONSE_OK) + # Stop the event + return True def toggle_sensitiviy_of_save_as_preset(self, widget): btn = self.xml.get_widget('save_as_preset_button') @@ -508,6 +533,7 @@ class ChangeStatusMessageDialog: btn.set_sensitive(True) def on_save_as_preset_button_clicked(self, widget): + self.countdown_enabled = False start_iter, finish_iter = self.message_buffer.get_bounds() status_message_to_save_as_preset = self.message_buffer.get_text( start_iter, finish_iter) @@ -582,21 +608,21 @@ _('Please fill in the data of the contact you want to add in account %s') %accou self.available_types = [] for acct in accounts: for j in gajim.contacts.get_jid_list(acct): - contact = gajim.contacts.get_first_contact_from_jid(acct, j) if gajim.jid_is_transport(j): - type_ = gajim.get_transport_name_from_jid(j) + type_ = gajim.get_transport_name_from_jid(j, False) if self.agents.has_key(type_): self.agents[type_].append(j) else: self.agents[type_] = [j] # Now add the one to which we can register for acct in accounts: - for type_ in gajim.connections[account].available_transports: + for type_ in gajim.connections[acct].available_transports: if type_ in self.agents: continue self.agents[type_] = [] - for jid_ in gajim.connections[account].available_transports[type_]: - self.agents[type_].append(jid_) + for jid_ in gajim.connections[acct].available_transports[type_]: + if not jid_ in self.agents[type_]: + self.agents[type_].append(jid_) self.available_types.append(type_) liststore = gtk.ListStore(str) self.group_comboboxentry.set_model(liststore) @@ -835,7 +861,7 @@ class AboutDialog: dlg.set_transient_for(gajim.interface.roster.window) dlg.set_name('Gajim') dlg.set_version(gajim.version) - s = u'Copyright © 2003-2006 Gajim Team' + s = u'Copyright © 2003-2007 Gajim Team' dlg.set_copyright(s) copying_file_path = None if os.path.isfile(os.path.join(gajim.defs.docdir, 'COPYING')): @@ -1028,6 +1054,15 @@ class BindPortError(HigDialog): _('Maybe you have another running instance of Gajim. ' 'File Transfer will be cancelled.')) +class AspellDictError(HigDialog): + def __init__(self, lang): + ErrorDialog( + _('Dictionary for lang %s not available') % lang, + _('You have to install %s dictionary to use spellchecking, or ' + 'choose another language by setting the speller_language option.' + '\n\nHighlighting misspelled words feature will not be used') % lang) + gajim.config.set('use_speller', False) + class ConfirmationDialog(HigDialog): '''HIG compliant confirmation dialog.''' def __init__(self, pritext, sectext='', on_response_ok = None, @@ -1438,6 +1473,136 @@ class JoinGroupchatWindow: self.window.destroy() +class SynchroniseSelectAccountDialog: + def __init__(self, account): + # 'account' can be None if we are about to create our first one + if not account or gajim.connections[account].connected < 2: + ErrorDialog(_('You are not connected to the server'), + _('Without a connection, you can not synchronise your contacts.')) + raise GajimGeneralException, 'You are not connected to the server' + self.account = account + self.xml = gtkgui_helpers.get_glade('synchronise_select_account_dialog.glade') + self.dialog = self.xml.get_widget('synchronise_select_account_dialog') + self.accounts_treeview = self.xml.get_widget('accounts_treeview') + model = gtk.ListStore(str, str, bool) + self.accounts_treeview.set_model(model) + # columns + renderer = gtk.CellRendererText() + self.accounts_treeview.insert_column_with_attributes(-1, + _('Name'), renderer, text = 0) + renderer = gtk.CellRendererText() + self.accounts_treeview.insert_column_with_attributes(-1, + _('Server'), renderer, text = 1) + + self.xml.signal_autoconnect(self) + self.init_accounts() + self.dialog.show_all() + + def on_accounts_window_key_press_event(self, widget, event): + if event.keyval == gtk.keysyms.Escape: + self.window.destroy() + + def init_accounts(self): + '''initialize listStore with existing accounts''' + model = self.accounts_treeview.get_model() + model.clear() + for remote_account in gajim.connections: + if remote_account == self.account: + # Do not show the account we're sync'ing + continue + iter = model.append() + model.set(iter, 0, remote_account, 1, gajim.get_hostname_from_account( + remote_account)) + + def on_cancel_button_clicked(self, widget): + self.dialog.destroy() + + def on_ok_button_clicked(self, widget): + sel = self.accounts_treeview.get_selection() + (model, iter) = sel.get_selected() + if not iter: + return + remote_account = model.get_value(iter, 0).decode('utf-8') + + if gajim.connections[remote_account].connected < 2: + ErrorDialog(_('This account is not connected to the server'), + _('You cannot synchronize with an account unless it is connected.')) + return + else: + try: + dialog = SynchroniseSelectContactsDialog(self.account, remote_account) + except GajimGeneralException: + # if we showed ErrorDialog, there will not be dialog instance + return + self.dialog.destroy() + +class SynchroniseSelectContactsDialog: + def __init__(self, account, remote_account): + self.local_account = account + self.remote_account = remote_account + self.xml = gtkgui_helpers.get_glade('synchronise_select_contacts_dialog.glade') + self.dialog = self.xml.get_widget('synchronise_select_contacts_dialog') + self.contacts_treeview = self.xml.get_widget('contacts_treeview') + model = gtk.ListStore(bool, str) + self.contacts_treeview.set_model(model) + # columns + renderer1 = gtk.CellRendererToggle() + renderer1.set_property('activatable', True) + renderer1.connect('toggled', self.toggled_callback) + self.contacts_treeview.insert_column_with_attributes(-1, + _('Synchronise'), renderer1, active = 0) + renderer2 = gtk.CellRendererText() + self.contacts_treeview.insert_column_with_attributes(-1, + _('Name'), renderer2, text = 1) + + self.xml.signal_autoconnect(self) + self.init_contacts() + self.dialog.show_all() + + def toggled_callback(self, cell, path): + model = self.contacts_treeview.get_model() + iter = model.get_iter(path) + model[iter][0] = not cell.get_active() + + def on_contacts_window_key_press_event(self, widget, event): + if event.keyval == gtk.keysyms.Escape: + self.window.destroy() + + def init_contacts(self): + '''initialize listStore with existing accounts''' + model = self.contacts_treeview.get_model() + model.clear() + + # recover local contacts + local_jid_list = gajim.contacts.get_jid_list(self.local_account) + + remote_jid_list = gajim.contacts.get_jid_list(self.remote_account) + for remote_jid in remote_jid_list: + if remote_jid not in local_jid_list: + iter = model.append() + model.set(iter, 0, True, 1, remote_jid) + + def on_cancel_button_clicked(self, widget): + self.dialog.destroy() + + def on_ok_button_clicked(self, widget): + model = self.contacts_treeview.get_model() + iter = model.get_iter_root() + while iter: + if model[iter][0]: + # it is selected + remote_jid = model[iter][1].decode('utf-8') + message = 'I\'m synchronizing my contacts from my %s account, could you please add this address to your contact list?' % \ + gajim.get_hostname_from_account(self.remote_account) + remote_contact = gajim.contacts.get_first_contact_from_jid( + self.remote_account, remote_jid) + # keep same groups and same nickname + gajim.interface.roster.req_sub(self, remote_jid, message, + self.local_account, groups = remote_contact.groups, + nickname = remote_contact.name, auto_auth = True) + iter = model.iter_next(iter) + self.dialog.destroy() + class NewChatDialog(InputDialog): def __init__(self, account): self.account = account @@ -1692,9 +1857,7 @@ class SingleMessageWindow: spell1.set_language(lang) spell2.set_language(lang) except gobject.GError, msg: - ErrorDialog(unicode(msg), _('If that is not your language for which you want to highlight misspelled words, then please set your $LANG as appropriate. Eg. for French do export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to make it global in /etc/profile.\n\nHighlighting misspelled words feature will not be used')) - gajim.config.set('use_speller', False) - + dialogs.AspellDictError(lang) self.send_button.set_no_show_all(True) self.reply_button.set_no_show_all(True) self.send_and_close_button.set_no_show_all(True) @@ -2046,6 +2209,16 @@ class PrivacyListWindow: self.privacy_list_default_checkbutton.set_sensitive(False) self.list_of_rules_combobox.set_sensitive(False) + # set jabber id completion + jids_list_store = gtk.ListStore(gobject.TYPE_STRING) + for jid in gajim.contacts.get_jid_list(self.account): + jids_list_store.append([jid]) + jid_entry_completion = gtk.EntryCompletion() + jid_entry_completion.set_text_column(0) + jid_entry_completion.set_model(jids_list_store) + jid_entry_completion.set_popup_completion(True) + self.edit_type_jabberid_entry.set_completion(jid_entry_completion) + if action == 'EDIT': self.refresh_rules() @@ -2265,7 +2438,7 @@ class PrivacyListWindow: gajim.connections[self.account].set_privacy_list( self.privacy_list_name, tags) - self.privacy_list_received(tags) + self.refresh_rules() self.add_edit_vbox.hide() if 'privacy_lists' in gajim.interface.instances[self.account]: win = gajim.interface.instances[self.account]['privacy_lists'] @@ -2288,6 +2461,101 @@ class PrivacyListWindow: def on_close_button_clicked(self, widget): self.window.destroy() +class BlockedContactsWindow: + '''Window that is the main window for ContactWindows;''' + def __init__(self, account): + self.account = account + self.xml = gtkgui_helpers.get_glade('blocked_contacts_window.glade') + self.window = self.xml.get_widget('blocked_contacts_window') + self.remove_button = self.xml.get_widget('remove_button') + self.contacts_treeview = self.xml.get_widget('contacts_treeview') + renderer = gtk.CellRendererText() + + self.store = gtk.ListStore(str) + self.contacts_treeview.set_model(self.store) + + column = gtk.TreeViewColumn('Contact', renderer, text=0) + self.contacts_treeview.append_column(column) + + if len(gajim.connections) > 1: + title = _('Blocked Contacts for %s') % self.account + else: + title = _('Blocked Contacts') + self.window.set_title(title) + self.window.show_all() + self.xml.signal_autoconnect(self) + gajim.connections[self.account].get_privacy_list('block') + + def on_blocked_contacts_window_destroy(self, widget): + key_name = 'blocked_contacts' + if key_name in gajim.interface.instances[self.account]: + del gajim.interface.instances[self.account][key_name] + + def on_remove_button_clicked(self, widget): + if self.contacts_treeview.get_selection().get_selected()[1] == None: + return + tags = [] + rule_selected = self.store.get_path( + self.contacts_treeview.get_selection().get_selected()[1])[0] + for i in range(0, len(self.global_rules)): + if i != rule_selected: + tags.append(self.global_rules[i]) + else: + deleted_rule = self.global_rules[i] + for rule in self.global_rules_to_append: + tags.append(rule) + gajim.connections[self.account].set_privacy_list( + 'block', tags) + gajim.connections[self.account].get_privacy_list('block') + if len(tags) == 0: + self.privacy_list_received([]) + gajim.connections[self.account].blocked_contacts = [] + gajim.connections[self.account].blocked_groups = [] + gajim.connections[self.account].blocked_list = [] + gajim.connections[self.account].set_default_list('') + gajim.connections[self.account].set_active_list('') + gajim.connections[self.account].del_privacy_list('block') + status = gajim.connections[self.account].connected + msg = gajim.connections[self.account].status + show = gajim.SHOW_LIST[gajim.connections[self.account].connected] + if deleted_rule['type'] == 'jid': + jid = deleted_rule['value'] + gajim.connections[self.account].send_custom_status(show, msg, jid) + # needed for draw_contact: + if jid in gajim.connections[self.account].blocked_contacts: + gajim.connections[self.account].blocked_contacts.remove(jid) + gajim.interface.roster.draw_contact(jid, self.account) + else: + group = deleted_rule['value'] + # needed for draw_group: + if group in gajim.connections[self.account].blocked_groups: + gajim.connections[self.account].blocked_groups.remove(group) + gajim.interface.roster.draw_group(group, self.account) + for jid in gajim.contacts.get_jid_list(self.account): + contact = gajim.contacts.get_contact_with_highest_priority( + self.account, jid) + if group in contact.groups: + gajim.connections[self.account].send_custom_status(show, msg, + contact.jid) + gajim.interface.roster.draw_contact(contact.jid, self.account) + + def privacy_list_received(self, rules): + self.store.clear() + self.global_rules = [] + self.global_rules_to_append = [] + for rule in rules: + if rule['type'] == 'jid' and rule['action'] == 'deny': + #self.global_rules[text_item] = rule + self.store.append([rule['value']]) + self.global_rules.append(rule) + elif rule['type'] == 'group' and rule['action'] == 'deny': + text_item = _('Group %s') % rule['value'] + self.store.append([text_item]) + self.global_rules.append(rule) + else: + self.global_rules_to_append.append(rule) + + 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 diff --git a/src/disco.py b/src/disco.py index bbed4c142..33b217efd 100644 --- a/src/disco.py +++ b/src/disco.py @@ -49,6 +49,7 @@ import tooltips import gtkgui_helpers import groups import adhoc_commands +import search_window from common import gajim from common import xmpp @@ -986,6 +987,7 @@ class ToplevelAgentBrowser(AgentBrowser): self.register_button = None self.join_button = None self.execute_button = None + self.search_button = None # Keep track of our treeview signals self._view_signals = [] self._scroll_signal = None @@ -1142,7 +1144,7 @@ class ToplevelAgentBrowser(AgentBrowser): AgentBrowser._add_actions(self) self.execute_button = gtk.Button() image = gtk.image_new_from_stock(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_BUTTON) - label = gtk.Label(_('_Execute Command...')) + label = gtk.Label(_('_Execute Command')) label.set_use_underline(True) hbox = gtk.HBox() hbox.pack_start(image, False, True, 6) @@ -1170,6 +1172,18 @@ class ToplevelAgentBrowser(AgentBrowser): self.window.action_buttonbox.add(self.join_button) self.join_button.show_all() + self.search_button = gtk.Button() + image = gtk.image_new_from_stock(gtk.STOCK_FIND, gtk.ICON_SIZE_BUTTON) + label = gtk.Label(_('_Search')) + label.set_use_underline(True) + hbox = gtk.HBox() + hbox.pack_start(image, False, True, 6) + hbox.pack_end(label, True, True) + self.search_button.add(hbox) + self.search_button.connect('clicked', self.on_search_button_clicked) + self.window.action_buttonbox.add(self.search_button) + self.search_button.show_all() + def _clean_actions(self): if self.execute_button: self.execute_button.destroy() @@ -1180,6 +1194,56 @@ class ToplevelAgentBrowser(AgentBrowser): if self.join_button: self.join_button.destroy() self.join_button = None + if self.search_button: + self.search_button.destroy() + self.search_button = None + AgentBrowser._clean_actions(self) + + def cleanup(self): + self.tooltip.hide_tooltip() + AgentBrowser.cleanup(self) + + def update_theme(self): + theme = gajim.config.get('roster_theme') + bgcolor = gajim.config.get_per('themes', theme, 'groupbgcolor') + if bgcolor: + self._renderer.set_property('cell-background', bgcolor) + 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''' + model, iter = self.window.services_treeview.get_selection().get_selected() + if not iter: + return + service = model[iter][0].decode('utf-8') + adhoc_commands.CommandWindow(self.account, service) + + def on_search_button_clicked(self, widget = None): + '''When we want to search something: + open search window''' + model, iter = self.window.services_treeview.get_selection().get_selected() + if not iter: + return + service = model[iter][0].decode('utf-8') + if gajim.interface.instances[self.account]['search'].has_key(service): + gajim.interface.instances[self.account]['search'][service].present() + else: + gajim.interface.instances[self.account]['search'][service] = \ + search_window.SearchWindow(self.account, service) + + 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.''' + model, iter = self.window.services_treeview.get_selection().get_selected() + if not iter: + return + jid = model[iter][0].decode('utf-8') + if jid: + gajim.connections[self.account].request_register_agent_info(jid) + self.window.destroy(chain = True) + AgentBrowser._clean_actions(self) def cleanup(self): @@ -1239,6 +1303,9 @@ class ToplevelAgentBrowser(AgentBrowser): self.browse_button.set_sensitive(False) if self.join_button: self.join_button.set_sensitive(False) + if self.search_button: + self.search_button.set_sensitive(False) + model, iter = self.window.services_treeview.get_selection().get_selected() model, iter = self.window.services_treeview.get_selection().get_selected() if not iter: return @@ -1271,6 +1338,8 @@ class ToplevelAgentBrowser(AgentBrowser): AgentBrowser._update_actions(self, jid, node, identities, features, data) if self.execute_button and xmpp.NS_COMMANDS in features: self.execute_button.set_sensitive(True) + if self.search_button and xmpp.NS_SEARCH in features: + self.search_button.set_sensitive(True) if self.register_button and xmpp.NS_REGISTER in features: # We can register this agent registered_transports = [] diff --git a/src/gajim.py b/src/gajim.py index 5fbefeaf4..15cb1b726 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -400,13 +400,16 @@ class Interface: gc_control.show_change_nick_input_dialog(title, prompt, proposed_nick) def handle_event_http_auth(self, account, data): - #('HTTP_AUTH', account, (method, url, transaction_id, iq_obj)) + #('HTTP_AUTH', account, (method, url, transaction_id, iq_obj, msg)) def response(widget, account, iq_obj, answer): self.dialog.destroy() gajim.connections[account].build_http_auth_answer(iq_obj, answer) + sec_msg = _('Do you accept this request?') + if data[4]: + sec_msg = data[4] + '\n' + sec_msg self.dialog = dialogs.YesNoDialog(_('HTTP (%s) Authorization for %s (id: %s)') \ - % (data[0], data[1], data[2]), _('Do you accept this request?'), + % (data[0], data[1], data[2]), sec_msg, on_response_yes = (response, account, data[3], 'yes'), on_response_no = (response, account, data[3], 'no')) @@ -502,7 +505,7 @@ class Interface: def handle_event_notify(self, account, array): # 'NOTIFY' (account, (jid, status, status message, resource, priority, - # keyID, timestamp)) + # keyID, timestamp, contact_nickname)) # if we're here it means contact changed show statuss = ['offline', 'error', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible'] @@ -514,6 +517,7 @@ class Interface: status_message = array[2] jid = array[0].split('/')[0] keyID = array[5] + contact_nickname = array[7] attached_keys = gajim.config.get_per('accounts', account, 'attached_gpg_keys').split() if jid in attached_keys: @@ -542,8 +546,12 @@ class Interface: if contact1: if contact1.show in statuss: old_show = statuss.index(contact1.show) + if contact_nickname is not None and \ + contact1.contact_name != contact_nickname: + contact1.contact_name = contact_nickname + self.roster.draw_contact(jid, account) if old_show == new_show and contact1.status == status_message and \ - contact1.priority == priority: # no change + contact1.priority == priority: # no change return else: contact1 = gajim.contacts.get_first_contact_from_jid(account, ji) @@ -596,6 +604,7 @@ class Interface: elif not gajim.block_signed_in_notifications[account]: # We're connected since more that 30 seconds contact1.last_status_time = time.localtime() + contact1.contact_nickname = contact_nickname if gajim.jid_is_transport(jid): # It must be an agent if ji in jid_list: @@ -651,7 +660,7 @@ class Interface: # remove in 2007 # It's maybe a GC_NOTIFY (specialy for MSN gc) self.handle_event_gc_notify(account, (jid, array[1], status_message, - array[3], None, None, None, None, None, None, None)) + array[3], None, None, None, None, None, None, None, None)) def handle_event_msg(self, account, array): @@ -677,6 +686,10 @@ class Interface: jid = jid.replace('@', '') groupchat_control = self.msg_win_mgr.get_control(jid, account) + if not groupchat_control and \ + gajim.interface.minimized_controls.has_key(account) and \ + jid in gajim.interface.minimized_controls[account]: + groupchat_control = gajim.interface.minimized_controls[account][jid] pm = False if groupchat_control and groupchat_control.type_id == \ message_control.TYPE_GC: @@ -801,8 +814,7 @@ class Interface: show = 'offline' gc_c = gajim.contacts.create_gc_contact(room_jid = jid, name = nick, show = show) - c = gajim.contacts.contact_from_gc_contact(gc_c) - self.roster.new_chat(c, account, private_chat = True) + self.roster.new_private_chat(gc_c, account) ctrl = self.msg_win_mgr.get_control(full_jid_with_resource, account) ctrl.print_conversation('Error %s: %s' % (array[1], array[2]), 'status') @@ -936,6 +948,17 @@ class Interface: except AttributeError: return + def handle_event_new_acc_connected(self, account, array): + #('NEW_ACC_CONNECTED', account, (infos, is_form)) + if self.instances.has_key('account_creation_wizard'): + self.instances['account_creation_wizard'].new_acc_connected(array[0], + array[1]) + + def handle_event_new_acc_not_connected(self, account, array): + #('NEW_ACC_NOT_CONNECTED', account, (reason)) + if self.instances.has_key('account_creation_wizard'): + self.instances['account_creation_wizard'].new_acc_not_connected(array) + def handle_event_acc_ok(self, account, array): #('ACC_OK', account, (config)) if self.instances.has_key('account_creation_wizard'): @@ -954,10 +977,10 @@ class Interface: def handle_event_myvcard(self, account, array): nick = '' - if array.has_key('NICKNAME'): - nick = array['NICKNAME'] - if nick: - gajim.nicks[account] = nick + if array.has_key('NICKNAME') and array['NICKNAME']: + gajim.nicks[account] = array['NICKNAME'] + elif array.has_key('FN') and array['FN']: + gajim.nicks[account] = array['FN'] if self.instances[account].has_key('profile'): win = self.instances[account]['profile'] win.set_values(array) @@ -1040,7 +1063,7 @@ class Interface: def handle_event_gc_notify(self, account, array): #'GC_NOTIFY' (account, (room_jid, show, status, nick, - # role, affiliation, jid, reason, actor, statusCode, newNick)) + # role, affiliation, jid, reason, actor, statusCode, newNick, avatar_sha)) nick = array[3] if not nick: return @@ -1052,19 +1075,26 @@ class Interface: # Get the window and control for the updated status, this may be a # PrivateChatControl control = self.msg_win_mgr.get_control(room_jid, account) + if not control and \ + self.minimized_controls.has_key(account) and \ + room_jid in self.minimized_controls[account]: + control = self.minimized_controls[account][room_jid] + if control and control.type_id != message_control.TYPE_GC: return if control: control.chg_contact_status(nick, show, status, array[4], array[5], - array[6], array[7], array[8], array[9], array[10]) + array[6], array[7], array[8], array[9], array[10], array[11]) + if control and not control.parent_win: + gajim.interface.roster.draw_contact(room_jid, account) + + ctrl = self.msg_win_mgr.get_control(fjid, account) # print status in chat window and update status/GPG image - if self.msg_win_mgr.has_window(fjid, account): - ctrl = self.msg_win_mgr.get_control(fjid, account) + if ctrl: contact = ctrl.contact contact.show = show contact.status = status - ctrl.update_ui() uf_show = helpers.get_uf_show(show) if status: ctrl.print_conversation(_('%s is now %s (%s)') % (nick, uf_show, @@ -1073,6 +1103,7 @@ class Interface: ctrl.print_conversation(_('%s is now %s') % (nick, uf_show), 'status') ctrl.parent_win.redraw_tab(ctrl) + ctrl.update_ui() if self.remote_ctrl: self.remote_ctrl.raise_signal('GCPresence', (account, array)) @@ -1080,10 +1111,17 @@ class Interface: # ('GC_MSG', account, (jid, msg, time, has_timestamp, htmlmsg)) jids = array[0].split('/', 1) room_jid = jids[0] + gc_control = self.msg_win_mgr.get_control(room_jid, account) + if not gc_control and \ + self.minimized_controls.has_key(account) and \ + room_jid in self.minimized_controls[account]: + gc_control = self.minimized_controls[account][room_jid] + if not gc_control: return xhtml = array[4] + if gajim.config.get('ignore_incoming_xhtml'): xhtml = None if len(jids) == 1: @@ -1092,7 +1130,14 @@ class Interface: else: # message from someone nick = jids[1] + gc_control.on_message(nick, array[1], array[2], array[3], xhtml) + + contact = gajim.contacts.\ + get_contact_with_highest_priority(account, room_jid) + if contact: + gajim.interface.roster.draw_contact(room_jid, account) + if self.remote_ctrl: self.remote_ctrl.raise_signal('GCMessage', (account, array)) @@ -1100,7 +1145,20 @@ class Interface: #('GC_SUBJECT', account, (jid, subject, body, has_timestamp)) jids = array[0].split('/', 1) jid = jids[0] + gc_control = self.msg_win_mgr.get_control(jid, account) + + if not gc_control and \ + self.minimized_controls.has_key(account) and \ + jid in self.minimized_controls[account]: + gc_control = self.minimized_controls[account][jid] + + contact = gajim.contacts.\ + get_contact_with_highest_priority(account, jid) + if contact: + contact.status = array[1] + gajim.interface.roster.draw_contact(jid, account) + if not gc_control: return gc_control.set_subject(array[1]) @@ -1243,7 +1301,8 @@ class Interface: for bm in bms: if bm['autojoin'] in ('1', 'true'): self.roster.join_gc_room(account, bm['jid'], bm['nick'], - bm['password']) + bm['password'], + minimize = gajim.config.get('minimize_autojoined_rooms')) def handle_event_file_send_error(self, account, array): jid = array[0] @@ -1620,6 +1679,25 @@ class Interface: if self.instances[account].has_key('privacy_list_%s' % name): self.instances[account]['privacy_list_%s' % name].\ privacy_list_received(rules) + if name == 'block': + gajim.connections[account].blocked_contacts = [] + gajim.connections[account].blocked_groups = [] + gajim.connections[account].blocked_list = [] + for rule in rules: + if rule['type'] == 'jid' and rule['action'] == 'deny': + gajim.connections[account].blocked_contacts.append(rule['value']) + if rule['type'] == 'group' and rule['action'] == 'deny': + gajim.connections[account].blocked_groups.append(rule['value']) + gajim.connections[account].blocked_list.append(rule) + #elif rule['type'] == "group" and action == "deny": + # text_item = _('%s group "%s"') % _(rule['action']), rule['value'] + # self.store.append([text_item]) + # self.global_rules.append(rule) + #else: + # self.global_rules_to_append.append(rule) + if self.instances[account].has_key('blocked_contacts'): + self.instances[account]['blocked_contacts'].\ + privacy_list_received(rules) def handle_event_privacy_lists_active_default(self, account, data): if not data: @@ -1651,6 +1729,53 @@ class Interface: else: gajim.connections[account].change_status('offline','') + def handle_event_ping_sent(self, account, contact): + ctrl = self.msg_win_mgr.get_control(contact.get_full_jid(), account) + if ctrl == None: + ctrl = self.msg_win_mgr.get_control(contact.jid, account) + ctrl.print_conversation(_('Ping?'), 'status') + + def handle_event_ping_reply(self, account, data): + contact = data[0] + seconds = data[1] + ctrl = self.msg_win_mgr.get_control(contact.get_full_jid(), account) + if ctrl == None: + ctrl = self.msg_win_mgr.get_control(contact.jid, account) + ctrl.print_conversation(_('Pong! (%s s.)') % seconds, 'status') + + def handle_event_ping_error(self, account, contact): + ctrl = self.msg_win_mgr.get_control(contact.get_full_jid(), account) + if ctrl == None: + ctrl = self.msg_win_mgr.get_control(contact.jid, account) + ctrl.print_conversation(_('Error.'), 'status') + + def handle_event_search_form(self, account, data): + # ('SEARCH_FORM', account, (jid, dataform, is_dataform)) + if not self.instances[account]['search'].has_key(data[0]): + return + self.instances[account]['search'][data[0]].on_form_arrived(data[1], + data[2]) + + def handle_event_search_result(self, account, data): + # ('SEARCH_RESULT', account, (jid, dataform, is_dataform)) + if not self.instances[account]['search'].has_key(data[0]): + return + self.instances[account]['search'][data[0]].on_result_arrived(data[1], + data[2]) + + def handle_event_resource_conflict(self, account, data): + # ('RESOURCE_CONFLICT', account, ()) + # First we go offline, but we don't overwrite status message + self.roster.send_status(account, 'offline', + gajim.connections[account].status) + def on_ok(new_resource): + gajim.config.set_per('accounts', account, 'resource', new_resource) + self.roster.send_status(account, gajim.connections[account].old_show, + gajim.connections[account].status) + dlg = dialogs.InputDialog(_('Resource Conflict'), + _('You are already connected to this account with the same resource. Please type a new one'), input_str = gajim.connections[account].server_resource, + is_modal = False, ok_handler = on_ok) + def read_sleepy(self): '''Check idle status and change that status if needed''' if not self.sleeper.poll(): @@ -1753,20 +1878,14 @@ class Interface: # \S*[^\s\W] --> in the matching string don't match ? or ) etc.. if at the end # so http://be) will match http://be and http://be)be) will match http://be)be - prefixes = (r'http://', r'https://', r'gopher://', r'news://', r'ftp://', - r'ed2k://', r'irc://', r'magnet:', r'sip:', r'www\.', r'ftp\.') + prefixes = '|'.join((r'http://', r'https://', r'gopher://', r'news://', + r'ftp://', r'ed2k://', r'irc://', r'magnet:', r'sip:', r'www\.', + r'ftp\.')) # NOTE: it's ok to catch www.gr such stuff exist! #FIXME: recognize xmpp: and treat it specially - prefix_pattern = '' - for prefix in prefixes: - prefix_pattern += prefix + '|' - - prefix_pattern = prefix_pattern[:-1] # remove last | - prefix_pattern = '(' + prefix_pattern + ')' - - links = r'\b' + prefix_pattern + r'\S*[\w\/\=]|' + links = r'\b(%s)\S*[\w\/\=]|' % prefixes #2nd one: at_least_one_char@at_least_one_char.at_least_one_char mail = r'\bmailto:\S*[^\s\W]|' r'\b\S+@\S+\.\S*[^\s\W]' @@ -1776,7 +1895,13 @@ class Interface: r'(? 6: + self.attention_list.pop(0) # remove older + self.attention_list.append(contact) + if sound == 'received': helpers.play_sound('muc_message_received') elif sound == 'highlight': @@ -637,14 +662,18 @@ class GroupchatControl(ChatControlBase): other_tags_for_text.append('gc_nickname_color_' + \ str(self.gc_custom_colors[contact])) - self.check_and_possibly_add_focus_out_line() + if self.parent_win: + self.check_and_possibly_add_focus_out_line() ChatControlBase.print_conversation_line(self, text, kind, contact, tim, other_tags_for_name, [], other_tags_for_text, xhtml = xhtml) def get_nb_unread(self): + type_events = ['printed_marked_gc_msg'] + if gajim.config.get('notify_on_all_muc_messages'): + type_events.append('printed_gc_msg') nb = len(gajim.events.get_events(self.account, self.room_jid, - ['printed_gc_msg'])) + type_events)) nb += self.get_nb_unread_pm() return nb @@ -827,7 +856,7 @@ class GroupchatControl(ChatControlBase): model[iter][C_AVATAR] = scaled_pixbuf def chg_contact_status(self, nick, show, status, role, affiliation, jid, - reason, actor, statusCode, new_nick): + reason, actor, statusCode, new_nick, avatar_sha, tim = None): '''When an occupant changes his or her status''' if show == 'invisible': return @@ -836,7 +865,7 @@ class GroupchatControl(ChatControlBase): role = 'visitor' if not affiliation: affiliation = 'none' - + fake_jid = self.room_jid + '/' + nick newly_created = False if show in ('offline', 'error'): if statusCode == '307': @@ -849,7 +878,7 @@ class GroupchatControl(ChatControlBase): 'nick': nick, 'who': actor, 'reason': reason } - self.print_conversation(s, 'info') + self.print_conversation(s, 'info', tim = tim) elif statusCode == '301': if actor is None: # do not print 'banned by None' s = _('%(nick)s has been banned: %(reason)s') % { @@ -860,7 +889,7 @@ class GroupchatControl(ChatControlBase): 'nick': nick, 'who': actor, 'reason': reason } - self.print_conversation(s, 'info') + self.print_conversation(s, 'info', tim = tim) elif statusCode == '303': # Someone changed his or her nick if nick == self.nick: # We changed our nick self.nick = new_nick @@ -895,12 +924,11 @@ class GroupchatControl(ChatControlBase): # Windows require this os.remove(files[old_file]) os.rename(old_file, files[old_file]) - self.print_conversation(s, 'info') + self.print_conversation(s, 'info', tim) elif statusCode == 'destroyed': # Room has been destroyed - self.print_conversation(reason, 'info') + self.print_conversation(reason, 'info', tim) - if len(gajim.events.get_events(self.account, - self.room_jid + '/' + nick)) == 0: + if len(gajim.events.get_events(self.account, fake_jid)) == 0: self.remove_contact(nick) else: c = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick) @@ -908,7 +936,12 @@ class GroupchatControl(ChatControlBase): c.status = status if nick == self.nick and statusCode != '303': # We became offline self.got_disconnected() - self.parent_win.redraw_tab(self) + contact = gajim.contacts.\ + get_contact_with_highest_priority(self.account, self.room_jid) + if contact: + gajim.interface.roster.draw_contact(self.room_jid, self.account) + if self.parent_win: + self.parent_win.redraw_tab(self) else: iter = self.get_contact_iter(nick) if not iter: @@ -918,23 +951,51 @@ class GroupchatControl(ChatControlBase): if statusCode == '201': # We just created the room gajim.connections[self.account].request_gc_config(self.room_jid) else: + gc_c = gajim.contacts.get_gc_contact(self.account, self.room_jid, + nick) + # Re-get vcard if avatar has changed + # We do that here because we may request it to the real JID if we + # knows it. connections.py doesn't know it. + con = gajim.connections[self.account] + if gc_c.jid: + real_jid = gc_c.jid + if gc_c.resource: + real_jid += '/' + gc_c.resource + else: + real_jid = fake_jid + if con.vcard_shas.has_key(fake_jid): + if avatar_sha != con.vcard_shas[fake_jid]: + con.request_vcard(real_jid, fake_jid) + else: + cached_vcard = con.get_cached_vcard(fake_jid, True) + if cached_vcard and cached_vcard.has_key('PHOTO') and \ + cached_vcard['PHOTO'].has_key('SHA'): + cached_sha = cached_vcard['PHOTO']['SHA'] + else: + cached_sha = '' + if cached_sha != avatar_sha: + # avatar has been updated + # sha in mem will be updated later + con.request_vcard(real_jid, fake_jid) + else: + # save sha in mem NOW + con.vcard_shas[fake_jid] = avatar_sha + actual_role = self.get_role(nick) if role != actual_role: self.remove_contact(nick) self.add_contact_to_roster(nick, show, role, affiliation, status, jid) else: - c = gajim.contacts.get_gc_contact(self.account, self.room_jid, - nick) - if c.show == show and c.status == status and \ - c.affiliation == affiliation: #no change + if gc_c.show == show and gc_c.status == status and \ + gc_c.affiliation == affiliation: # no change return - c.show = show - c.affiliation = affiliation - c.status = status + gc_c.show = show + gc_c.affiliation = affiliation + gc_c.status = status self.draw_contact(nick) - - self.parent_win.redraw_tab(self) + if self.parent_win: + self.parent_win.redraw_tab(self) if (time.time() - self.room_creation) > 30 and \ nick != self.nick and statusCode != '303': st = '' @@ -963,7 +1024,7 @@ class GroupchatControl(ChatControlBase): if st: if status: st += ' (' + status + ')' - self.print_conversation(st) + self.print_conversation(st, tim = tim) def add_contact_to_roster(self, nick, show, role, affiliation, status, jid = ''): @@ -998,10 +1059,16 @@ class GroupchatControl(ChatControlBase): server = gajim.get_server_from_jid(self.room_jid) if gajim.config.get('ask_avatars_on_startup') and \ not server.startswith('irc'): - fjid = self.room_jid + '/' + nick - pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(fjid, True) + fake_jid = self.room_jid + '/' + nick + pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(fake_jid, True) if pixbuf == 'ask': - gajim.connections[self.account].request_vcard(fjid, True) + if j: + fjid = j + if resource: + fjid += '/' + resource + gajim.connections[self.account].request_vcard(fjid, fake_jid) + else: + gajim.connections[self.account].request_vcard(fake_jid, fake_jid) if nick == self.nick: # we became online self.got_connected() self.list_treeview.expand_row((model.get_path(role_iter)), False) @@ -1341,7 +1408,6 @@ class GroupchatControl(ChatControlBase): nick = instance.input_entry.get_text().decode('utf-8') nick = helpers.parse_resource(nick) gajim.connections[self.account].join_gc(nick, self.room_jid, None) - self.nick = nick instance = dialogs.InputDialog(title, prompt, proposed_nick, is_modal = False, ok_handler = on_ok) @@ -1466,7 +1532,7 @@ class GroupchatControl(ChatControlBase): try: jid = helpers.parse_jid(jid) except: - ErrorDialog(_('Invalid group chat Jabber ID'), + dialogs.ErrorDialog(_('Invalid group chat Jabber ID'), _('The group chat Jabber ID has not allowed characters.')) return else: @@ -1575,6 +1641,13 @@ class GroupchatControl(ChatControlBase): self.nick_hits = [] # clear the hit list list_nick = gajim.contacts.get_nick_list(self.account, self.room_jid) + if begin == '': + # empty message, show lasts nicks that highlighted us first + for nick in self.attention_list: + if nick in list_nick: + list_nick.remove(nick) + list_nick.insert(0, nick) + list_nick.remove(self.nick) # Skip self for nick in list_nick: if nick.lower().startswith(begin.lower()): @@ -1741,18 +1814,18 @@ class GroupchatControl(ChatControlBase): def _start_private_message(self, nick): gc_c = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick) - c = gajim.contacts.contact_from_gc_contact(gc_c) - nick_jid = c.jid + nick_jid = gc_c.get_full_jid() win = gajim.interface.msg_win_mgr.get_window(nick_jid, self.account) if not win: - gajim.interface.roster.new_chat(c, self.account, private_chat = True) + gajim.interface.roster.new_private_chat(gc_c, self.account) win = gajim.interface.msg_win_mgr.get_window(nick_jid, self.account) win.set_active_tab(nick_jid, self.account) win.window.present() - def on_list_treeview_row_activated(self, widget, path, col = 0): - '''When an iter is double clicked: open the chat window''' + def on_row_activated(self, widget, path): + '''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)): @@ -1762,6 +1835,11 @@ class GroupchatControl(ChatControlBase): else: # We want to send a private message nick = model[path][C_NICK].decode('utf-8') 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''' + 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''' @@ -1802,26 +1880,30 @@ class GroupchatControl(ChatControlBase): widget.get_selection().unselect_all() return - model = widget.get_model() - iter = model.get_iter(path) - nick = model[iter][C_NICK].decode('utf-8') - if not nick in gajim.contacts.get_nick_list(self.account, - self.room_jid): - #it's a group - col = widget.get_column(0) - avatar_cell = col.get_cell_renderers()[0] - (pos, avatar_size) = col.cell_get_position(avatar_cell) - status_cell = col.get_cell_renderers()[1] - (pos, status_size) = col.cell_get_position(status_cell) - if x > avatar_size and x < avatar_size + status_size: - if (widget.row_expanded(path)): - widget.collapse_row(path) - else: - widget.expand_row(path, False) - elif event.state & gtk.gdk.SHIFT_MASK: - self.append_nick_in_msg_textview(self.msg_textview, nick) - self.msg_textview.grab_focus() + if gajim.single_click and not event.state & gtk.gdk.SHIFT_MASK: + self.on_row_activated(widget, path) return True + else: + model = widget.get_model() + iter = model.get_iter(path) + nick = model[iter][C_NICK].decode('utf-8') + if not nick in gajim.contacts.get_nick_list(self.account, + self.room_jid): + # it's a group + col = widget.get_column(0) + avatar_cell = col.get_cell_renderers()[0] + (pos, avatar_size) = col.cell_get_position(avatar_cell) + status_cell = col.get_cell_renderers()[1] + (pos, status_size) = col.cell_get_position(status_cell) + if x > avatar_size and x < avatar_size + status_size: + if (widget.row_expanded(path)): + widget.collapse_row(path) + else: + widget.expand_row(path, False) + elif event.state & gtk.gdk.SHIFT_MASK: + self.append_nick_in_msg_textview(self.msg_textview, nick) + self.msg_textview.grab_focus() + return True def append_nick_in_msg_textview(self, widget, nick): message_buffer = self.msg_textview.get_buffer() diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index e19a90e0a..a833ee4bd 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -528,7 +528,7 @@ def get_scaled_pixbuf(pixbuf, kind): scaled_buf = pixbuf.scale_simple(w, h, gtk.gdk.INTERP_HYPER) return scaled_buf -def get_avatar_pixbuf_from_cache(fjid, is_fake_jid = False): +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 @@ -545,8 +545,21 @@ def get_avatar_pixbuf_from_cache(fjid, is_fake_jid = False): if is_fake_jid: puny_nick = helpers.sanitize_filename(nick) path = os.path.join(gajim.VCARD_PATH, puny_jid, puny_nick) + local_avatar_basepath = os.path.join(gajim.AVATAR_PATH, puny_jid, + puny_nick) + '_local' else: path = os.path.join(gajim.VCARD_PATH, puny_jid) + local_avatar_basepath = os.path.join(gajim.AVATAR_PATH, puny_jid) + \ + '_local' + if use_local: + for extension in ('.png', '.jpeg'): + local_avatar_path = local_avatar_basepath + extension + if os.path.isfile(local_avatar_path): + avatar_file = open(local_avatar_path, 'rb') + avatar_data = avatar_file.read() + avatar_file.close() + return get_pixbuf_from_data(avatar_data) + if not os.path.isfile(path): return 'ask' @@ -591,6 +604,10 @@ def get_path_to_generic_or_avatar(generic, jid = None, suffix = None): if jid: puny_jid = helpers.sanitize_filename(jid) path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + suffix + filepath, extension = os.path.splitext(path_to_file) + path_to_local_file = filepath + '_local' + extension + if os.path.exists(path_to_local_file): + return path_to_local_file if os.path.exists(path_to_file): return path_to_file return os.path.abspath(generic) @@ -773,7 +790,7 @@ default_name = ''): is_fake = False if account and gajim.contacts.is_pm_from_jid(account, jid): is_fake = True - pixbuf = get_avatar_pixbuf_from_cache(jid, is_fake) + pixbuf = get_avatar_pixbuf_from_cache(jid, is_fake, False) ext = file_path.split('.')[-1] type_ = '' if not ext: diff --git a/src/history_window.py b/src/history_window.py index 3ceb10594..19af94b73 100644 --- a/src/history_window.py +++ b/src/history_window.py @@ -126,6 +126,14 @@ class HistoryWindow: self.calendar.select_month(gtk_month, y) self.calendar.select_day(d) self.add_lines_for_date(y, m, d) + + log = True + if self.jid in gajim.config.get_per('accounts', self.account, + 'no_log_for').split(' '): + log = False + checkbutton = xml.get_widget('log_history_checkbutton') + checkbutton.set_active(log) + checkbutton.connect('toggled', self.on_log_history_checkbutton_toggled) self.window.show_all() @@ -391,3 +399,20 @@ class HistoryWindow: match_start_mark = self.history_buffer.create_mark('match_start', match_start_iter, True) self.history_textview.tv.scroll_to_mark(match_start_mark, 0, True) + + def on_log_history_checkbutton_toggled(self, widget): + # log conversation history? + oldlog = True + no_log_for = gajim.config.get_per('accounts', self.account, + 'no_log_for').split() + if self.jid in no_log_for: + oldlog = False + log = widget.get_active() + if not log and not self.jid in no_log_for: + no_log_for.append(self.jid) + if log and self.jid in no_log_for: + no_log_for.remove(self.jid) + if oldlog != log: + gajim.config.set_per('accounts', self.account, 'no_log_for', + ' '.join(no_log_for)) + diff --git a/src/htmltextview.py b/src/htmltextview.py index 51066b6f2..75fbccf0a 100644 --- a/src/htmltextview.py +++ b/src/htmltextview.py @@ -40,9 +40,9 @@ import time import urllib2 import operator +if __name__ == '__main__': + from common import i18n from common import gajim -#from common import i18n - import tooltips @@ -56,13 +56,13 @@ allwhitespace_rx = re.compile('^\\s*$') display_resolution = 0.3514598*(gtk.gdk.screen_height() / float(gtk.gdk.screen_height_mm())) -#embryo of CSS classes +# embryo of CSS classes classes = { #'system-message':';display: none', 'problematic':';color: red', } -#styles for elemens +# styles for elements element_styles = { 'u' : ';text-decoration: underline', 'em' : ';font-style: oblique', @@ -83,9 +83,6 @@ element_styles['tt'] = element_styles['kbd'] element_styles['i'] = element_styles['em'] element_styles['b'] = element_styles['strong'] -class_styles = { -} - ''' ========== JEP-0071 @@ -182,40 +179,43 @@ for name in BLOCK_HEAD: def build_patterns(view, config, interface): - #extra, rst does not mark _underline_ or /it/ up - #actually , or are not in the JEP-0071, but are seen in the wild + # extra, rst does not mark _underline_ or /it/ up + # actually , or are not in the JEP-0071, but are seen in the wild basic_pattern = r'(? deadline: + gajim.log.debug(str('Timeout loading image %s ' % \ + attrs['src'] + ex)) + mem = '' + alt = attrs.get('alt', '') + if alt: + alt += '\n' + alt += _('Timeout loading image') + break + try: + temp = f.read(100) + except socket.timeout, ex: + gajim.log.debug('Timeout loading image %s ' % attrs['src'] + \ + str(ex)) + mem = '' + alt = attrs.get('alt', '') + if alt: + alt += '\n' + alt += _('Timeout loading image') + break + if temp: + mem += temp + else: + break + if len(mem) > 2*1024*1024: + alt = attrs.get('alt', '') + if alt: + alt += '\n' + alt += _('Image is too big') + break + pixbuf = None + if mem: + # Caveat: GdkPixbuf is known not to be safe to load + # images from network... this program is now potentially + # hackable ;) + loader = gtk.gdk.PixbufLoader() + dims = [0,0] + def height_cb(length): + dims[1] = length + def width_cb(length): + dims[0] = length + # process width and height attributes + w = attrs.get('width') + h = attrs.get('height') + # override with width and height styles + for attr, val in style_iter(attrs.get('style', '')): + if attr == 'width': + w = val + elif attr == 'height': + h = val + if w: + self._parse_length(w, False, False, 1, 1000, width_cb) + 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. + ''' + if type(dims[0]) == float: + dims[0] = int(dims[0]*w) + elif not dims[0]: + dims[0] = w + if type(dims[1]) == float: + dims[1] = int(dims[1]*h) + if not dims[1]: + dims[1] = h + loader.set_size(*dims) + if w or h: + loader.connect('size-prepared', set_size, dims) + loader.write(mem) + loader.close() + pixbuf = loader.get_pixbuf() + alt = attrs.get('alt', '') + if pixbuf is not None: + tags = self._get_style_tags() + if tags: + tmpmark = self.textbuf.create_mark(None, self.iter, True) + self.textbuf.insert_pixbuf(self.iter, pixbuf) + self.starting = False + if tags: + start = self.textbuf.get_iter_at_mark(tmpmark) + for tag in tags: + self.textbuf.apply_tag(tag, start, self.iter) + self.textbuf.delete_mark(tmpmark) + else: + self._insert_text('[IMG: %s]' % alt) + except Exception, ex: + gajim.log.error('Error loading image ' + str(ex)) + pixbuf = None + alt = attrs.get('alt', 'Broken image') + try: + loader.close() + except: + pass + return pixbuf def _begin_span(self, style, tag=None, id_=None): if style is None: @@ -511,9 +680,9 @@ class HtmlHandler(xml.sax.handler.ContentHandler): tag = self.textbuf.create_tag(id_) else: tag = self.textbuf.create_tag() # we create anonymous tag - for attr, val in [item.split(':', 1) for item in style.split(';') if len(item.strip())]: - attr = attr.strip().lower() - val = val.strip() + for attr, val in style_iter(style): + attr = attr.lower() + val = val try: method = self.__style_methods[attr] except KeyError: @@ -603,6 +772,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): self.text += content return if allwhitespace_rx.match(content) is not None and self._starts_line(): + self.text += ' ' return self.text += content self.starting = False @@ -611,9 +781,8 @@ class HtmlHandler(xml.sax.handler.ContentHandler): def startElement(self, name, attrs): self._flush_text() klass = [i for i in attrs.get('class',' ').split(' ') if i] - style = attrs.get('style','') + style = '' #Add styles defined for classes - #TODO: priority between class and style elements? for k in klass: if k in classes: style += classes[k] @@ -641,9 +810,13 @@ class HtmlHandler(xml.sax.handler.ContentHandler): tag.is_anchor = True elif name in LIST_ELEMS: style += ';margin-left: 2em' + elif name == 'img': + tag = self._process_img(attrs) if name in element_styles: style += element_styles[name] - + # so that explicit styles override implicit ones, + # we add the attribute last + style += ";"+attrs.get('style','') if style == '': style = None self._begin_span(style, tag, id_) @@ -681,64 +854,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): elif name == 'dt': if not self.starting: self._jump_line() - elif name == 'img': - # Wait maximum 1s for connection - socket.setdefaulttimeout(1) - try: - f = urllib2.urlopen(attrs['src']) - except Exception, ex: - gajim.log.debug(str('Error loading image %s ' % attrs['src'] + ex)) - pixbuf = None - alt = attrs.get('alt', 'Broken image') - else: - # Wait 10ms between each byte - try: - f.fp._sock.fp._sock.settimeout(0.01) - except: - pass - # Max image size = 2 MB (to try to prevent DoS) in Max 3s - mem = '' - deadline = time.time() + 3 - while True: - if time.time() > deadline: - gajim.log.debug(str('Timeout loading image %s ' % \ - attrs['src'] + ex)) - pixbuf = None - alt = attrs.get('alt', 'Timeout loading image') - break - temp = f.read(100) - if temp: - mem += temp - else: - break - if len(mem) > 2*1024*1024: - alt = attrs.get('alt', 'Image is too big') - break - - # Caveat: GdkPixbuf is known not to be safe to load - # images from network... this program is now potentially - # hackable ;) - loader = gtk.gdk.PixbufLoader() - loader.write(mem) - loader.close() - pixbuf = loader.get_pixbuf() - if pixbuf is not None: - tags = self._get_style_tags() - if tags: - tmpmark = self.textbuf.create_mark(None, self.iter, True) - - self.textbuf.insert_pixbuf(self.iter, pixbuf) - - if tags: - start = self.textbuf.get_iter_at_mark(tmpmark) - for tag in tags: - self.textbuf.apply_tag(tag, start, self.iter) - self.textbuf.delete_mark(tmpmark) - else: - self._insert_text('[IMG: %s]' % alt) - elif name == 'body' or name == 'html': - pass - elif name == 'a': + elif name in ('a', 'img', 'body', 'html'): pass elif name in INLINE: pass @@ -788,10 +904,6 @@ class HtmlHandler(xml.sax.handler.ContentHandler): # self.text = ' ' class HtmlTextView(gtk.TextView): - __gtype_name__ = 'HtmlTextView' - __gsignals__ = { - 'url-clicked': (gobject.SIGNAL_RUN_LAST, None, (str, str)), # href, type - } def __init__(self): gobject.GObject.__init__(self) @@ -867,16 +979,39 @@ class HtmlTextView(gtk.TextView): parser.setContentHandler(HtmlHandler(self, eob)) parser.parse(StringIO(html)) + # too much space after :) #if not eob.starts_line(): # buffer.insert(eob, '\n') + change_cursor = None if __name__ == '__main__': + import os + from common import gajim + + class log(object): + + def debug(self, text): + print "debug:", text + def warn(self, text): + print "warn;", text + def error(self,text): + print "error;", text + + gajim.log=log() + + if gajim.config.get('emoticons_theme'): + print "emoticons" htmlview = HtmlTextView() + path_to_file = os.path.join(gajim.DATA_DIR, 'pixmaps', 'muc_separator.png') + # use this for hr + htmlview.focus_out_line_pixbuf = gtk.gdk.pixbuf_new_from_file(path_to_file) + + 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''' @@ -946,9 +1081,9 @@ if __name__ == '__main__':

Hey, are you licensed to Jabber?

A License to Jabber

+ alt='A License to Jabber' + width='50%' height='50%' + />

''') htmlview.display_html('
') @@ -973,8 +1108,9 @@ if __name__ == '__main__':
  • One
  • Two is nested:
    • One
    • -
    • Two
    • -
    • Three
    • +
    • Two
    • +
    • Three
    • +
    • Four
  • Three
  • diff --git a/src/message_window.py b/src/message_window.py index ed1ec93ab..6445495be 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -235,6 +235,11 @@ class MessageWindow: def show_title(self, urgent = True, control = None): '''redraw the window's title''' + if not control: + control = self.get_active_control() + if not control: + # No more control in this window + return unread = 0 for ctrl in self.controls(): if ctrl.type_id == message_control.TYPE_GC and not \ @@ -253,8 +258,6 @@ class MessageWindow: else: urgent = False - if not control: - control = self.get_active_control() if control.type_id == message_control.TYPE_GC: name = control.room_jid.split('@')[0] urgent = control.attention_flag @@ -318,6 +321,10 @@ class MessageWindow: if len(self._controls[ctrl.account]) == 0: del self._controls[ctrl.account] + self.check_tabs() + self.show_title() + + def check_tabs(self): if self.get_num_controls() == 0: # These are not called when the window is destroyed like this, fake it gajim.interface.msg_win_mgr._on_window_delete(self.window, None) @@ -332,9 +339,8 @@ class MessageWindow: self.notebook.set_show_tabs(show_tabs_if_one_tab) if not show_tabs_if_one_tab: self.alignment.set_property('top-padding', 0) - self.show_title() - + def redraw_tab(self, ctrl, chatstate = None): hbox = self.notebook.get_tab_label(ctrl.widget).get_children()[0] status_img = hbox.get_children()[0] diff --git a/src/notify.py b/src/notify.py index 104dc7733..66b130791 100644 --- a/src/notify.py +++ b/src/notify.py @@ -42,6 +42,8 @@ except ImportError: def get_show_in_roster(event, account, contact): '''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) if num != None: if gajim.config.get_per('notifications', str(num), 'roster') == 'yes': @@ -316,8 +318,8 @@ def popup(event_type, jid, account, msg_type = '', path_to_image = None, notification.set_data('event_type', event_type) notification.set_data('jid', jid) notification.set_data('account', account) - notification.set_data('msg_type', event_type) - notification.set_data('path_to_image', path_to_image) + notification.set_data('msg_type', msg_type) + notification.set_property('icon-name', path_to_image) notification.add_action('default', 'Default Action', on_pynotify_notification_clicked) diff --git a/src/profile_window.py b/src/profile_window.py index 2015d5df9..b56329aa4 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -118,20 +118,21 @@ class ProfileWindow: def on_ok(widget, path_to_file): must_delete = False filesize = os.path.getsize(path_to_file) # in bytes - #FIXME: use messages for invalid file for 0.11 invalid_file = False msg = '' if os.path.isfile(path_to_file): stat = os.stat(path_to_file) if stat[6] == 0: invalid_file = True + msg = _('File is empty') else: invalid_file = True + msg = _('File does not exist') if not invalid_file and filesize > 16384: # 16 kb try: pixbuf = gtk.gdk.pixbuf_new_from_file(path_to_file) # get the image at 'notification size' - # and use that user did not specify in ACE crazy size + # and hope that user did not specify in ACE crazy size scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'tooltip') except gobject.GError, msg: # unknown format @@ -148,13 +149,17 @@ class ProfileWindow: 'avatar_scaled.png') scaled_pixbuf.save(path_to_file, 'png') must_delete = True - self.dialog.destroy() - + fd = open(path_to_file, 'rb') data = fd.read() pixbuf = gtkgui_helpers.get_pixbuf_from_data(data) - # rescale it - pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'vcard') + try: + # rescale it + pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'vcard') + except AttributeError: # unknown format + dialogs.ErrorDialog(_('Could not load image')) + return + self.dialog.destroy() button = self.xml.get_widget('PHOTO_button') image = button.get_image() image.set_from_pixbuf(pixbuf) @@ -183,7 +188,8 @@ class ProfileWindow: menu = gtk.Menu() # Try to get pixbuf - pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(self.jid) + pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(self.jid, + use_local = False) if pixbuf: nick = gajim.config.get_per('accounts', self.account, 'name') diff --git a/src/roster_window.py b/src/roster_window.py index 8771f40fc..fd62d3ef5 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -48,6 +48,7 @@ from groupchat_control import PrivateChatControl from common import dbus_support if dbus_support.supported: from music_track_listener import MusicTrackListener + import dbus #(icon, name, type, jid, account, editable, second pixbuf) ( @@ -279,6 +280,7 @@ class RosterWindow: if hide and contact.sub != 'from': return observer = contact.is_observer() + groupchat = contact.is_groupchat() if observer: # if he has a tag, remove it @@ -368,6 +370,8 @@ class RosterWindow: typestr = 'contact' if group == _('Transports'): typestr = 'agent' + if group == _('Groupchats'): + typestr = 'groupchat' name = contact.get_shown_name() # we add some values here. see draw_contact for more @@ -391,13 +395,15 @@ class RosterWindow: accounts = [] else: accounts = [account] - text = group + text = gobject.markup_escape_text(group) + if group in gajim.connections[account].blocked_groups: + text = '%s' % text if gajim.config.get('show_contacts_number'): nbr_on, nbr_total = gajim.contacts.get_nb_online_total_contacts( accounts = accounts, groups = [group]) text += ' (%s/%s)' % (repr(nbr_on), repr(nbr_total)) model = self.tree.get_model() - model.set_value(iter, 1 , gobject.markup_escape_text(text)) + model.set_value(iter, 1 , text) def add_to_not_in_the_roster(self, account, jid, nick = '', resource = ''): ''' add jid to group "not in the roster", he MUST not be in roster yet, @@ -414,6 +420,20 @@ class RosterWindow: self.add_contact_to_roster(contact.jid, account) return contact + def add_groupchat_to_roster(self, account, jid, nick = '', resource = '', + status = ''): + ''' add groupchat to roster ''' + contact = gajim.contacts.get_contact_with_highest_priority(account, jid) + if contact == None: + contact = gajim.contacts.create_contact(jid = jid, name = jid, + groups = [_('Groupchats')], show = 'muc_active', + status = status, sub = 'none', + resource = resource) + gajim.contacts.add_contact(account, contact) + self.add_contact_to_roster(jid, account) + self.draw_group(_('Groupchats'), account) + return contact + def get_self_contact_iter(self, account): model = self.tree.get_model() iterAcct = self.get_account_iter(account) @@ -560,6 +580,35 @@ class RosterWindow: return name = gobject.markup_escape_text(contact.get_shown_name()) + # gets number of unread gc marked messages + if gajim.interface.minimized_controls.has_key(account) and \ + jid in gajim.interface.minimized_controls[account]: + nb_unread = len(gajim.events.get_events(account, jid, + ['printed_marked_gc_msg'])) + nb_unread += \ + gajim.interface.minimized_controls[account][jid].get_nb_unread_pm() + + if nb_unread == 1: + name = '%s *' % name + elif nb_unread > 1: + name = '%s [%s]' % (name, str(nb_unread)) + + strike = False + if jid in gajim.connections[account].blocked_contacts: + strike = True + else: + groups = contact.groups + if contact.is_observer(): + groups = [_('Observers')] + elif not groups: + groups = [_('General')] + for group in groups: + if group in gajim.connections[account].blocked_groups: + strike = True + break + if strike: + name = '%s' % name + nb_connected_contact = 0 for c in contact_instances: if c.show not in ('error', 'offline'): @@ -643,6 +692,13 @@ class RosterWindow: state_images = self.get_appropriate_state_images(jid, icon_name = icon_name) + if icon_name != 'message' and gajim.gc_connected[account].\ + has_key(jid): + if gajim.gc_connected[account][jid]: + icon_name = 'muc_active' + else: + icon_name = 'muc_inactive' + img = state_images[icon_name] for iter in iters: @@ -677,7 +733,7 @@ class RosterWindow: for iter in iters: model[iter][C_SECPIXBUF] = scaled_pixbuf - def join_gc_room(self, account, room_jid, nick, password): + def join_gc_room(self, account, room_jid, nick, password, minimize = False): '''joins the room immediatelly''' if gajim.interface.msg_win_mgr.has_window(room_jid, account) and \ gajim.gc_connected[account][room_jid]: @@ -686,11 +742,28 @@ class RosterWindow: win.set_active_tab(room_jid, account) dialogs.ErrorDialog(_('You are already in group chat %s') % room_jid) return + if gajim.interface.minimized_controls.has_key(account) and \ + room_jid in gajim.interface.minimized_controls[account]: + self.on_groupchat_maximized(None, room_jid, account) + return 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 invisible')) return + if minimize: + contact = gajim.contacts.create_contact(jid = room_jid, name = nick) + gc_control = GroupchatControl(None, contact, account) + + if not gajim.interface.minimized_controls.has_key(account): + gajim.interface.minimized_controls[account] = {} + gajim.interface.minimized_controls[account][room_jid] = gc_control + + self.add_groupchat_to_roster(account, room_jid) + gajim.connections[account].join_gc(nick, room_jid, password) + if password: + gajim.gc_passwords[room_jid] = password + return if not gajim.interface.msg_win_mgr.has_window(room_jid, account): self.new_room(room_jid, nick, account) gc_win = gajim.interface.msg_win_mgr.get_window(room_jid, account) @@ -729,6 +802,13 @@ class RosterWindow: else: gajim.interface.instances[account]['privacy_lists'] = \ dialogs.PrivacyListsWindow(account) + + def on_blocked_contacts_menuitem_activate(self, widget, account): + if gajim.interface.instances[account].has_key('blocked_contacts'): + gajim.interface.instances[account]['blocked_contacts'].window.present() + else: + gajim.interface.instances[account]['blocked_contacts'] = \ + dialogs.BlockedContactsWindow(account) def on_set_motd_menuitem_activate(self, widget, account): server = gajim.config.get_per('accounts', account, 'hostname') @@ -762,6 +842,7 @@ class RosterWindow: send_single_message_menuitem = xml.get_widget( 'send_single_message_menuitem') xml_console_menuitem = xml.get_widget('xml_console_menuitem') + blocked_contacts_menuitem = xml.get_widget('blocked_contacts_menuitem') privacy_lists_menuitem = xml.get_widget('privacy_lists_menuitem') administrator_menuitem = xml.get_widget('administrator_menuitem') send_server_message_menuitem = xml.get_widget( @@ -775,9 +856,12 @@ class RosterWindow: if gajim.connections[account] and gajim.connections[account].\ privacy_rules_supported: + blocked_contacts_menuitem.connect('activate', + self.on_blocked_contacts_menuitem_activate, account) privacy_lists_menuitem.connect('activate', self.on_privacy_lists_menuitem_activate, account) else: + blocked_contacts_menuitem.set_sensitive(False) privacy_lists_menuitem.set_sensitive(False) if gajim.connections[account].is_zeroconf: @@ -1303,14 +1387,25 @@ class RosterWindow: if not connected_contacts: # no connected contacts, show the ofline one connected_contacts = contacts + self.tooltip.account = account self.tooltip.timeout = gobject.timeout_add(500, self.show_tooltip, connected_contacts) + elif model[iter][C_TYPE] == 'groupchat': + account = model[iter][C_ACCOUNT].decode('utf-8') + jid = model[iter][C_JID].decode('utf-8') + if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: + self.tooltip.id = row + contact = gajim.contacts.get_contact(account, jid) + self.tooltip.account = account + self.tooltip.timeout = gobject.timeout_add(500, + self.show_tooltip, contact) elif model[iter][C_TYPE] == 'account': # we're on an account entry in the roster account = model[iter][C_ACCOUNT].decode('utf-8') if account == 'all': if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: self.tooltip.id = row + self.tooltip.account = None self.tooltip.timeout = gobject.timeout_add(500, self.show_tooltip, []) return @@ -1327,8 +1422,7 @@ class RosterWindow: contact = gajim.contacts.create_contact(jid = jid, name = account_name, show = connection.get_status(), sub = '', status = connection.status, - resource = gajim.config.get_per('accounts', connection.name, - 'resource'), + resource = connection.server_resource, priority = connection.priority, keyID = gajim.config.get_per('accounts', connection.name, 'keyid')) @@ -1353,6 +1447,7 @@ class RosterWindow: contacts.append(contact) if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: self.tooltip.id = row + self.tooltip.account = None self.tooltip.timeout = gobject.timeout_add(500, self.show_tooltip, contacts) @@ -1413,6 +1508,152 @@ class RosterWindow: self.dialog = dialogs.ConfirmationDialog(pritext, sectext, on_response_ok = (remove, list_)) + def on_block(self, widget, iter, group_list): + ''' When clicked on the 'block' button in context menu. ''' + model = self.tree.get_model() + accounts = [] + msg = self.get_status_message('offline') + if group_list == None: + jid = model[iter][C_JID].decode('utf-8') + account = model[iter][C_ACCOUNT].decode('utf-8') + accounts.append(account) + self.send_status(account, 'offline', msg, to = jid) + new_rule = {'order': u'1', 'type': u'jid', 'action': u'deny', + 'value' : jid, 'child': [u'message', u'iq', u'presence-out']} + gajim.connections[account].blocked_list.append(new_rule) + # needed for draw_contact: + gajim.connections[account].blocked_contacts.append(jid) + self.draw_contact(jid, account) + else: + if iter == None: + for (contact, account) in group_list: + if account not in accounts: + if not gajim.connections[account].privacy_rules_supported: + continue + accounts.append(account) + self.send_status(account, 'offline', msg, to=contact.jid) + new_rule = {'order': u'1', 'type': u'jid', + 'action': u'deny', 'value' : contact.jid, + 'child': [u'message', u'iq', u'presence-out']} + gajim.connections[account].blocked_list.append(new_rule) + # needed for draw_contact: + gajim.connections[account].blocked_contacts.append(contact.jid) + self.draw_contact(contact.jid, account) + else: + group = model[iter][C_JID].decode('utf-8') + for (contact, account) in group_list: + if account not in accounts: + if not gajim.connections[account].privacy_rules_supported: + continue + accounts.append(account) + # needed for draw_group: + gajim.connections[account].blocked_groups.append(group) + self.draw_group(group, account) + self.send_status(account, 'offline', msg, to=contact.jid) + self.draw_contact(contact.jid, account) + new_rule = {'order': u'1', 'type': u'group', 'action': u'deny', + 'value' : group, 'child': [u'message', u'iq', u'presence-out']} + gajim.connections[account].blocked_list.append(new_rule) + for account in accounts: + gajim.connections[account].set_privacy_list( + 'block', gajim.connections[account].blocked_list) + if len(gajim.connections[account].blocked_list) == 1: + gajim.connections[account].set_active_list('block') + gajim.connections[account].set_default_list('block') + gajim.connections[account].get_privacy_list('block') + + def on_unblock(self, widget, iter, group_list): + ''' When clicked on the 'unblock' button in context menu. ''' + model = self.tree.get_model() + accounts = [] + if group_list == None: + jid = model[iter][C_JID].decode('utf-8') + jid_account = model[iter][C_ACCOUNT].decode('utf-8') + accounts.append(jid_account) + gajim.connections[jid_account].new_blocked_list = [] + for rule in gajim.connections[jid_account].blocked_list: + if rule['action'] != 'deny' or rule['type'] != 'jid' \ + or rule['value'] != jid: + gajim.connections[jid_account].new_blocked_list.append(rule) + # needed for draw_contact: + if jid in gajim.connections[jid_account].blocked_contacts: + gajim.connections[jid_account].blocked_contacts.remove(jid) + self.draw_contact(jid, jid_account) + else: + if iter == None: + for (contact, account) in group_list: + if account not in accounts: + if gajim.connections[account].privacy_rules_supported: + accounts.append(account) + gajim.connections[account].new_blocked_list = [] + gajim.connections[account].to_unblock = [] + gajim.connections[account].to_unblock.append(contact.jid) + else: + gajim.connections[account].to_unblock.append(contact.jid) + # needed for draw_contact: + if contact.jid in gajim.connections[account].blocked_contacts: + gajim.connections[account].blocked_contacts.remove( + contact.jid) + self.draw_contact(contact.jid, account) + for account in accounts: + for rule in gajim.connections[account].blocked_list: + if rule['action'] != 'deny' or rule['type'] != 'jid' \ + or rule['value'] not in gajim.connections[account].to_unblock: + gajim.connections[account].new_blocked_list.append(rule) + else: + group = model[iter][C_JID].decode('utf-8') + for (contact, account) in group_list: + if account not in accounts: + if gajim.connections[account].privacy_rules_supported: + accounts.append(account) + # needed for draw_group: + if group in gajim.connections[account].blocked_groups: + gajim.connections[account].blocked_groups.remove(group) + self.draw_group(group, account) + gajim.connections[account].new_blocked_list = [] + for rule in gajim.connections[account].blocked_list: + if rule['action'] != 'deny' or rule['type'] != 'group' \ + or rule['value'] != group: + gajim.connections[account].new_blocked_list.append( + rule) + self.draw_contact(contact.jid, account) + for account in accounts: + gajim.connections[account].set_privacy_list( + 'block', gajim.connections[account].new_blocked_list) + gajim.connections[account].get_privacy_list('block') + if len(gajim.connections[account].new_blocked_list) == 0: + gajim.connections[account].blocked_list = [] + gajim.connections[account].blocked_contacts = [] + gajim.connections[account].blocked_groups = [] + gajim.connections[account].set_default_list('') + gajim.connections[account].set_active_list('') + gajim.connections[account].del_privacy_list('block') + if gajim.interface.instances[account].has_key('blocked_contacts'): + gajim.interface.instances[account]['blocked_contacts'].\ + privacy_list_received([]) + if group_list == None: + status = gajim.connections[jid_account].connected + msg = gajim.connections[jid_account].status + if not self.regroup: + show = gajim.SHOW_LIST[status] + else: # accounts merged + show = helpers.get_global_show() + self.send_status(jid_account, show, msg, to=jid) + else: + for (contact, account) in group_list: + if not self.regroup: + show = gajim.SHOW_LIST[gajim.connections[account].connected] + else: # accounts merged + show = helpers.get_global_show() + if account not in accounts: + if gajim.connections[account].privacy_rules_supported: + accounts.append(account) + self.send_status(account, show, + gajim.connections[account].status, to=contact.jid) + else: + self.send_status(account, show, + gajim.connections[account].status, to=contact.jid) + def on_rename(self, widget, iter, path): # this function is called either by F2 or by Rename menuitem if gajim.interface.instances.has_key('rename'): @@ -1734,9 +1975,13 @@ class RosterWindow: 'roster_contact_context_menu') start_chat_menuitem = xml.get_widget('start_chat_menuitem') + send_custom_status_menuitem = xml.get_widget( + 'send_custom_status_menuitem') send_single_message_menuitem = xml.get_widget( 'send_single_message_menuitem') invite_menuitem = xml.get_widget('invite_menuitem') + block_menuitem = xml.get_widget('block_menuitem') + unblock_menuitem = xml.get_widget('unblock_menuitem') rename_menuitem = xml.get_widget('rename_menuitem') edit_groups_menuitem = xml.get_widget('edit_groups_menuitem') # separator has with send file, assign_openpgp_key_menuitem, etc.. @@ -1803,6 +2048,20 @@ class RosterWindow: item = gtk.SeparatorMenuItem() # separator invite_to_submenu.append(item) + # One or several resource, we do the same for send_custom_status + status_menuitems = gtk.Menu() + send_custom_status_menuitem.set_submenu(status_menuitems) + iconset = gajim.config.get('iconset') + path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16') + for s in ['online', 'chat', 'away', 'xa', 'dnd', 'offline']: + # icon MUST be different instance for every item + state_images = self.load_iconset(path) + status_menuitem = gtk.ImageMenuItem(helpers.get_uf_show(s)) + status_menuitem.connect('activate', self.on_send_custom_status, + [(contact, account)], s) + icon = state_images[s] + status_menuitem.set_image(icon) + status_menuitems.append(status_menuitem) if len(contacts) > 1: # several resources def resources_submenu(action, room_jid = None, room_account = None): ''' Build a submenu with contact's resources. @@ -1952,6 +2211,22 @@ class RosterWindow: remove_from_roster_menuitem, execute_command_menuitem]: widget.set_sensitive(False) + if gajim.connections[account] and gajim.connections[account].\ + privacy_rules_supported: + if jid in gajim.connections[account].blocked_contacts: + block_menuitem.set_no_show_all(True) + unblock_menuitem.connect('activate', self.on_unblock, iter, None) + block_menuitem.hide() + else: + unblock_menuitem.set_no_show_all(True) + block_menuitem.connect('activate', self.on_block, iter, None) + unblock_menuitem.hide() + else: + block_menuitem.set_no_show_all(True) + unblock_menuitem.set_no_show_all(True) + block_menuitem.hide() + unblock_menuitem.hide() + event_button = gtkgui_helpers.get_possible_button_event(event) roster_contact_context_menu.attach_to_widget(self.tree, None) @@ -2010,6 +2285,7 @@ class RosterWindow: connected_accounts = [] contacts_transport = -1 # -1 is at start, False when not from the same, None when jabber + is_blocked = True for iter in iters: jid = model[iter][C_JID].decode('utf-8') account = model[iter][C_ACCOUNT].decode('utf-8') @@ -2024,6 +2300,8 @@ class RosterWindow: contacts_transport = transport if contacts_transport != transport: contacts_transport = False + if jid not in gajim.connections[account].blocked_contacts: + is_blocked = False list_.append((contact, account)) menu = gtk.Menu() @@ -2093,6 +2371,18 @@ class RosterWindow: send_group_message_item.connect('activate', self.on_send_single_message_menuitem_activate, account, list_) + if is_blocked: + unblock_menuitem = gtk.ImageMenuItem(_('_Unblock')) + icon = gtk.image_new_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_MENU) + unblock_menuitem.set_image(icon) + unblock_menuitem.connect('activate', self.on_unblock, None, list_) + menu.append(unblock_menuitem) + else: + block_menuitem = gtk.ImageMenuItem(_('_Block')) + icon = gtk.image_new_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU) + block_menuitem.set_image(icon) + block_menuitem.connect('activate', self.on_block, None, list_) + menu.append(block_menuitem) # unsensitive if one account is not connected if one_account_offline: remove_item.set_sensitive(False) @@ -2104,6 +2394,54 @@ class RosterWindow: menu.show_all() menu.popup(None, None, None, event_button, event.time) + def make_groupchat_menu(self, event, iter): + model = self.tree.get_model() + + path = model.get_path(iter) + jid = model[iter][C_JID].decode('utf-8') + account = model[iter][C_ACCOUNT].decode('utf-8') + + menu = gtk.Menu() + + maximize_menuitem = gtk.ImageMenuItem(_('_Maximize')) + icon = gtk.image_new_from_stock(gtk.STOCK_GOTO_TOP, gtk.ICON_SIZE_MENU) + maximize_menuitem.set_image(icon) + maximize_menuitem.connect('activate', self.on_groupchat_maximized, \ + jid, account) + + menu.append(maximize_menuitem) + + event_button = gtkgui_helpers.get_possible_button_event(event) + + menu.attach_to_widget(self.tree, None) + menu.connect('selection-done', gtkgui_helpers.destroy_widget) + menu.show_all() + menu.popup(None, None, None, event_button, event.time) + + def on_groupchat_maximized(self, widget, jid, account): + '''When a groupshat is maximised''' + if not gajim.interface.minimized_controls.has_key(account): + return + if not gajim.interface.minimized_controls[account].has_key(jid): + return + + + ctrl = gajim.interface.minimized_controls[account][jid] + mw = gajim.interface.msg_win_mgr.get_window(ctrl.contact.jid, ctrl.account) + if not mw: + mw = gajim.interface.msg_win_mgr.create_window(ctrl.contact, \ + ctrl.account, ctrl.type_id) + ctrl.parent_win = mw + mw.new_tab(ctrl) + mw.set_active_tab(jid, account) + mw.window.present() + + contact = gajim.contacts.get_contact_with_highest_priority(account, jid) + self.remove_contact(contact, account) + gajim.contacts.remove_contact(account, contact) + self.draw_group(_('Groupchats'), account) + del gajim.interface.minimized_controls[account][jid] + def make_group_menu(self, event, iter): '''Make group's popup menu''' model = self.tree.get_model() @@ -2164,6 +2502,47 @@ class RosterWindow: group_message_to_all_item.connect('activate', self.on_send_single_message_menuitem_activate, account, list_) + send_custom_status_menuitem = gtk.ImageMenuItem(_('Send Cus_tom Status')) + # add a special img for this menuitem + icon = gtk.image_new_from_stock(gtk.STOCK_GO_UP, gtk.ICON_SIZE_MENU) + send_custom_status_menuitem.set_image(icon) + status_menuitems = gtk.Menu() + send_custom_status_menuitem.set_submenu(status_menuitems) + iconset = gajim.config.get('iconset') + path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16') + for s in ['online', 'chat', 'away', 'xa', 'dnd', 'offline']: + # icon MUST be different instance for every item + state_images = self.load_iconset(path) + status_menuitem = gtk.ImageMenuItem(helpers.get_uf_show(s)) + status_menuitem.connect('activate', self.on_send_custom_status, list_, + s) + icon = state_images[s] + status_menuitem.set_image(icon) + status_menuitems.append(status_menuitem) + menu.append(send_custom_status_menuitem) + is_blocked = False + if self.regroup: + for g_account in gajim.connections: + if group in gajim.connections[g_account].blocked_groups: + is_blocked = True + else: + if group in gajim.connections[account].blocked_groups: + is_blocked = True + + if group not in helpers.special_groups + (_('General'),): + if is_blocked: + unblock_menuitem = gtk.ImageMenuItem(_('_Unblock')) + icon = gtk.image_new_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_MENU) + unblock_menuitem.set_image(icon) + unblock_menuitem.connect('activate', self.on_unblock, iter, list_) + menu.append(unblock_menuitem) + else: + block_menuitem = gtk.ImageMenuItem(_('_Block')) + icon = gtk.image_new_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU) + block_menuitem.set_image(icon) + block_menuitem.connect('activate', self.on_block, iter, list_) + menu.append(block_menuitem) + event_button = gtkgui_helpers.get_possible_button_event(event) menu.attach_to_widget(self.tree, None) @@ -2564,6 +2943,8 @@ class RosterWindow: return if type_ == 'group' and len(iters) == 1: self.make_group_menu(event, iters[0]) + if type_ == 'groupchat' and len(iters) == 1: + self.make_groupchat_menu(event, iters[0]) elif type_ == 'agent' and len(iters) == 1: self.make_transport_menu(event, iters[0]) elif type_ in ('contact', 'self_contact') and len(iters) == 1: @@ -2624,8 +3005,8 @@ class RosterWindow: self.tree.get_selection().unselect_all() self.tree.get_selection().select_path(path) type_ = model[path][C_TYPE] - if type_ in ('agent', 'contact', 'self_contact'): - self.on_roster_treeview_row_activated(widget, path) + if type_ in ('agent', 'contact', 'self_contact', 'groupchat'): + self.on_row_activated(widget, path) elif type_ == 'account': account = model[path][C_ACCOUNT].decode('utf-8') if account != 'all': @@ -2651,24 +3032,28 @@ class RosterWindow: elif event.button == 1: # Left click model = self.tree.get_model() type_ = model[path][C_TYPE] - if type_ == 'group' and x < 27: - # first cell in 1st column (the arrow SINGLE clicked) - if (self.tree.row_expanded(path)): - self.tree.collapse_row(path) - else: - self.tree.expand_row(path, False) - - elif type_ == 'contact' and x < 27: - account = model[path][C_ACCOUNT].decode('utf-8') - jid = model[path][C_JID].decode('utf-8') - # first cell in 1st column (the arrow SINGLE clicked) - iters = self.get_contact_iter(jid, account) - for iter in iters: - path = model.get_path(iter) + if gajim.single_click and not event.state & gtk.gdk.SHIFT_MASK and \ + not event.state & gtk.gdk.CONTROL_MASK: + self.on_row_activated(widget, path) + else: + if type_ == 'group' and x < 27: + # first cell in 1st column (the arrow SINGLE clicked) if (self.tree.row_expanded(path)): self.tree.collapse_row(path) else: self.tree.expand_row(path, False) + + elif type_ == 'contact' and x < 27: + account = model[path][C_ACCOUNT].decode('utf-8') + jid = model[path][C_JID].decode('utf-8') + # first cell in 1st column (the arrow SINGLE clicked) + iters = self.get_contact_iter(jid, account) + for iter in iters: + path = model.get_path(iter) + if (self.tree.row_expanded(path)): + self.tree.collapse_row(path) + else: + self.tree.expand_row(path, False) def on_req_usub(self, widget, list_): '''Remove a contact. list_ is a list of (contact, account) tuples''' @@ -2683,7 +3068,7 @@ class RosterWindow: gajim.connections[account].unsubscribe(contact.jid, remove_auth) for c in gajim.contacts.get_contact(account, contact.jid): self.remove_contact(c, account) - gajim.contacts.remove_jid(account, c.jid) + gajim.contacts.remove_jid(account, contact.jid) # redraw group rows for contact numbers for group in c.groups: self.draw_group(group, account) @@ -2742,7 +3127,7 @@ class RosterWindow: if gajim.interface.systray_enabled: gajim.interface.systray.change_status('connecting') - def send_status(self, account, status, txt, auto = False): + def send_status(self, account, status, txt, auto = False, to = None): model = self.tree.get_model() accountIter = self.get_account_iter(account) if status != 'offline': @@ -2827,18 +3212,42 @@ class RosterWindow: passphrase) gajim.connections[account].gpg_passphrase(passphrase) - for gc_control in gajim.interface.msg_win_mgr.get_controls( - message_control.TYPE_GC): - if gc_control.account == account: - gajim.connections[account].send_gc_status(gc_control.nick, - gc_control.room_jid, status, txt) if gajim.account_is_connected(account): if status == 'online' and gajim.interface.sleeper.getState() != \ common.sleepy.STATE_UNKNOWN: gajim.sleeper_state[account] = 'online' elif gajim.sleeper_state[account] not in ('autoaway', 'autoxa'): gajim.sleeper_state[account] = 'off' - gajim.connections[account].change_status(status, txt, auto) + if to: + gajim.connections[account].send_custom_status(status, txt, to) + else: + was_invisible = gajim.connections[account].connected == \ + gajim.SHOW_LIST.index('invisible') + gajim.connections[account].change_status(status, txt, auto) + + if not gajim.interface.minimized_controls.has_key(account): + gajim.interface.minimized_controls[account] = {} + for gc_control in gajim.interface.msg_win_mgr.get_controls( + message_control.TYPE_GC) + \ + gajim.interface.minimized_controls[account].values(): + if gc_control.account == account: + if gajim.gc_connected[account][gc_control.room_jid]: + gajim.connections[account].send_gc_status(gc_control.nick, + gc_control.room_jid, status, txt) + else: + # for some reason, we are not connected to the room even if + # tab is opened, send initial join_gc() + gajim.connections[account].join_gc(gc_control.nick, + gc_control.room_jid, None) + if was_invisible: + # We come back from invisible, join bookmarks + for bm in gajim.connections[account].bookmarks: + room_jid = bm['jid'] + if room_jid in gajim.gc_connected[account] and \ + gajim.gc_connected[account][room_jid]: + continue + self.join_gc_room(account, room_jid, bm['nick'], bm['password'], + minimize = gajim.config.get('minimize_autojoined_rooms')) def get_status_message(self, show): if show in gajim.config.get_per('defaultstatusmsg'): @@ -2878,6 +3287,14 @@ class RosterWindow: else: change(None, account, status) + def on_send_custom_status(self, widget, contact_list, show): + '''send custom status''' + dlg = dialogs.ChangeStatusMessageDialog(show) + message = dlg.run() + if message is not None: # None if user pressed Cancel + for (contact, account) in contact_list: + self.send_status(account, show, message, to = contact.jid) + def on_status_combobox_changed(self, widget): '''When we change our status via the combobox''' model = self.status_combobox.get_model() @@ -2957,7 +3374,7 @@ class RosterWindow: # status if not global_sync_connected_accounts > 0 or \ - gajim.account_is_connected(account): + gajim.connections[account].connected > 0: self.send_status(account, status, message) self.update_status_combobox() @@ -2983,6 +3400,26 @@ class RosterWindow: self._music_track_changed_signal = None self._music_track_changed(None, None) + def _change_awn_icon_status(self, status): + if not dbus_support.supported: + # do nothing if user doesn't have D-Bus bindings + return + iconset = gajim.config.get('iconset') + prefix = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '32x32') + if status in ('chat', 'away', 'xa', 'dnd', 'invisible', 'offline'): + status = status + '.png' + elif status == 'online': + prefix = os.path.join(gajim.DATA_DIR, 'pixmaps') + status = 'gajim.png' + path = os.path.join(prefix, status) + try: + bus = dbus.SessionBus() + obj = bus.get_object('com.google.code.Awn', '/com/google/code/Awn') + awn = dbus.Interface(obj, 'com.google.code.Awn') + awn.SetTaskIconByName('Gajim', os.path.abspath(path)) + except Exception, e: + pass + def _music_track_changed(self, unused_listener, music_track_info): from common import pep accounts = gajim.connections.keys() @@ -3026,6 +3463,7 @@ class RosterWindow: # in the combobox self.combobox_callback_active = False self.status_combobox.set_active(table[show]) + self._change_awn_icon_status(show) self.combobox_callback_active = True if gajim.interface.systray_enabled: gajim.interface.systray.change_status(show) @@ -3068,12 +3506,23 @@ class RosterWindow: self.actions_menu_needs_rebuild = True self.update_status_combobox() - def new_chat(self, contact, account, private_chat = False, resource = None): + def new_private_chat(self, gc_contact, account): + contact = gajim.contacts.contact_from_gc_contact(gc_contact) + type_ = message_control.TYPE_PM + fjid = gc_contact.room_jid + '/' + gc_contact.name + mw = gajim.interface.msg_win_mgr.get_window(fjid, account) + if not mw: + mw = gajim.interface.msg_win_mgr.create_window(contact, account, type_) + + chat_control = PrivateChatControl(mw, gc_contact, contact, account) + mw.new_tab(chat_control) + if len(gajim.events.get_events(account, fjid)): + # We call this here to avoid race conditions with widget validation + chat_control.read_queue() + + def new_chat(self, contact, account, resource = None): # Get target window, create a control, and associate it with the window - if not private_chat: - type_ = message_control.TYPE_CHAT - else: - type_ = message_control.TYPE_PM + type_ = message_control.TYPE_CHAT fjid = contact.jid if resource: @@ -3082,10 +3531,7 @@ class RosterWindow: if not mw: mw = gajim.interface.msg_win_mgr.create_window(contact, account, type_) - if not private_chat: - chat_control = ChatControl(mw, contact, account, resource) - else: - chat_control = PrivateChatControl(mw, contact, account) + chat_control = ChatControl(mw, contact, account, resource) mw.new_tab(chat_control) @@ -3311,7 +3757,8 @@ class RosterWindow: ''' self.close_all_from_dict(gajim.interface.instances[account]) for ctrl in gajim.interface.msg_win_mgr.get_controls(acct = account): - ctrl.parent_win.remove_tab(ctrl, force = force) + ctrl.parent_win.remove_tab(ctrl, ctrl.parent_win.CLOSE_CLOSE_BUTTON, + force = force) def on_roster_window_delete_event(self, widget, event): '''When we want to close the window''' @@ -3525,8 +3972,9 @@ class RosterWindow: win.window.present() - def on_roster_treeview_row_activated(self, widget, path, col = 0): - '''When an iter is double clicked: open the first event window''' + def on_row_activated(self, widget, path): + '''When an iter is activated (dubblick or single click if gnome is set + this way''' model = self.tree.get_model() account = model[path][C_ACCOUNT].decode('utf-8') type_ = model[path][C_TYPE] @@ -3538,6 +3986,9 @@ class RosterWindow: self.tree.collapse_row(path) else: self.tree.expand_row(path, False) + elif gajim.interface.minimized_controls.has_key(account) and \ + gajim.interface.minimized_controls[account].has_key(jid): + self.on_groupchat_maximized(None, jid, account) else: first_ev = gajim.events.get_first_event(account, jid) if not first_ev: @@ -3570,6 +4021,11 @@ class RosterWindow: resource = c.resource self.on_open_chat_window(widget, c, account, resource = resource) + def on_roster_treeview_row_activated(self, widget, path, col = 0): + '''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, iter, path): '''When a row is expanded change the icon of the arrow''' model = self.tree.get_model() @@ -3685,7 +4141,7 @@ class RosterWindow: pixbuf2.composite(pixbuf1, 0, 0, pixbuf2.get_property('width'), pixbuf2.get_property('height'), 0, 0, 1.0, 1.0, - gtk.gdk.INTERP_HYPER, 255) + gtk.gdk.INTERP_NEAREST, 255) image.set_from_pixbuf(pixbuf1) break return imgs diff --git a/src/search_window.py b/src/search_window.py new file mode 100644 index 000000000..4c95eef8f --- /dev/null +++ b/src/search_window.py @@ -0,0 +1,195 @@ +# -*- coding: utf-8 -*- +## search_window.py +## +## Copyright (C) 2007 Yann Le Boulanger +## +## 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. + +import gobject +import gtk + +from common import xmpp, gajim, dataforms + +import gtkgui_helpers +import dialogs +import dataforms_widget + +class SearchWindow: + def __init__(self, account, jid): + '''Create new window.''' + + # an account object + self.account = account + self.jid = jid + + # retrieving widgets from xml + self.xml = gtkgui_helpers.get_glade('search_window.glade') + self.window = self.xml.get_widget('search_window') + for name in ('label', 'progressbar', 'search_vbox', 'search_button'): + self.__dict__[name] = self.xml.get_widget(name) + + self.data_form_widget = dataforms_widget.DataFormWidget() + self.table = None + + # displaying the window + self.xml.signal_autoconnect(self) + self.window.show_all() + self.request_form() + self.pulse_id = gobject.timeout_add(80, self.pulse_callback) + + self.is_form = None + + # for non-dataform forms + self.entries = {} + self.info = {} + + def request_form(self): + gajim.connections[self.account].request_search_fields(self.jid) + + def pulse_callback(self): + self.progressbar.pulse() + return True + + def on_search_window_key_press_event(self, widget, event): + if event.keyval == gtk.keysyms.Escape: + self.window.destroy() + + def on_search_window_destroy(self, widget): + if self.pulse_id: + gobject.source_remove(self.pulse_id) + del gajim.interface.instances[self.account]['search'][self.jid] + + def on_close_button_clicked(self, button): + self.window.destroy() + + def on_search_button_clicked(self, button): + if self.is_form: + self.data_form_widget.data_form.type = 'submit' + gajim.connections[self.account].send_search_form(self.jid, + self.data_form_widget.data_form, True) + self.search_vbox.remove(self.data_form_widget) + else: + for name in self.entries.keys(): + self.infos[name] = self.entries[name].get_text().decode('utf-8') + if self.infos.has_key('instructions'): + del self.infos['instructions'] + gajim.connections[self.account].send_search_form(self.jid, self.infos, + False) + self.search_vbox.remove(self.table) + + self.progressbar.show() + self.label.set_text(_('Waiting for results')) + self.label.show() + self.pulse_id = gobject.timeout_add(80, self.pulse_callback) + self.search_button.hide() + + def on_form_arrived(self, form, is_form): + if self.pulse_id: + gobject.source_remove(self.pulse_id) + self.progressbar.hide() + self.label.hide() + + if not is_form: + self.is_form = False + self.infos = form + nbrow = 0 + if self.infos.has_key('instructions'): + self.label.set_text(self.infos['instructions']) + self.label.show() + self.table = gtk.Table() + for name in self.infos.keys(): + if not name: + continue + if name == 'instructions': + continue + + nbrow = nbrow + 1 + self.table.resize(rows = nbrow, columns = 2) + label = gtk.Label(name.capitalize() + ':') + self.table.attach(label, 0, 1, nbrow - 1, nbrow, 0, 0, 0, 0) + entry = gtk.Entry() + entry.set_activates_default(True) + if self.infos[name]: + entry.set_text(self.infos[name]) + if name == 'password': + entry.set_visibility(False) + self.table.attach(entry, 1, 2, nbrow - 1, nbrow, 0, 0, 0, 0) + self.entries[name] = entry + self.table.show_all() + self.search_vbox.pack_start(self.table) + return + + self.dataform = dataforms.ExtendForm(node = form) + + self.data_form_widget.set_sensitive(True) + try: + self.data_form_widget.data_form = self.dataform + except dataforms.Error: + self.label.set_text(_('Error in received dataform')) + self.label.show() + return + self.is_form = True + + self.search_vbox.pack_start(self.data_form_widget) + self.data_form_widget.show() + if self.data_form_widget.title: + self.window.set_title('%s - Search - Gajim' % \ + self.data_form_widget.title) + + def on_result_arrived(self, form, is_form): + if self.pulse_id: + gobject.source_remove(self.pulse_id) + self.progressbar.hide() + self.label.hide() + + if not is_form: + if not form: + self.label.set_text(_('No result')) + self.label.show() + return + # We suppose all items have the same fields + sw = gtk.ScrolledWindow() + sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + treeview = gtk.TreeView() + sw.add(treeview) + # Create model + fieldtypes = [str]*len(form[0]) + model = gtk.ListStore(*fieldtypes) + # Copy data to model + for item in form: + model.append(item.values()) + # Create columns + counter = 0 + for field in form[0].keys(): + treeview.append_column( + gtk.TreeViewColumn(field, gtk.CellRendererText(), + text = counter)) + counter += 1 + treeview.set_model(model) + sw.show_all() + self.search_vbox.pack_start(sw) + return + + self.dataform = dataforms.ExtendForm(node = form) + + self.data_form_widget.set_sensitive(True) + try: + self.data_form_widget.data_form = self.dataform + except dataforms.Error: + self.label.set_text(_('Error in received dataform')) + self.label.show() + return + + self.search_vbox.pack_start(self.data_form_widget) + self.data_form_widget.show() + if self.data_form_widget.title: + self.window.set_title('%s - Search - Gajim' % \ + self.data_form_widget.title) + diff --git a/src/tooltips.py b/src/tooltips.py index b5d992111..8e68ddfbb 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -322,15 +322,13 @@ class GCTooltip(BaseTooltip): # Add avatar puny_name = helpers.sanitize_filename(contact.name) puny_room = helpers.sanitize_filename(contact.room_jid) - for type_ in ('jpeg', 'png'): - file = os.path.join(gajim.AVATAR_PATH, puny_room, - puny_name + '.' + type_) - if os.path.exists(file): - self.avatar_image.set_from_file(file) - pix = self.avatar_image.get_pixbuf() - pix = gtkgui_helpers.get_scaled_pixbuf(pix, 'tooltip') - self.avatar_image.set_from_pixbuf(pix) - break + file = helpers.get_avatar_path(os.path.join(gajim.AVATAR_PATH, puny_room, + puny_name)) + if file: + self.avatar_image.set_from_file(file) + pix = self.avatar_image.get_pixbuf() + pix = gtkgui_helpers.get_scaled_pixbuf(pix, 'tooltip') + self.avatar_image.set_from_pixbuf(pix) else: self.avatar_image.set_from_pixbuf(None) while properties: @@ -375,7 +373,7 @@ class RosterTooltip(NotificationAreaTooltip): def populate(self, contacts): self.create_window() - + self.create_table() if not contacts or len(contacts) == 0: # Tooltip for merged accounts row @@ -393,16 +391,14 @@ class RosterTooltip(NotificationAreaTooltip): puny_jid = helpers.sanitize_filename(prim_contact.jid) table_size = 3 - - for type_ in ('jpeg', 'png'): - file = os.path.join(gajim.AVATAR_PATH, puny_jid + '.' + type_) - if os.path.exists(file): - self.avatar_image.set_from_file(file) - pix = self.avatar_image.get_pixbuf() - pix = gtkgui_helpers.get_scaled_pixbuf(pix, 'tooltip') - self.avatar_image.set_from_pixbuf(pix) - table_size = 4 - break + + file = helpers.get_avatar_path(os.path.join(gajim.AVATAR_PATH, puny_jid)) + if file: + self.avatar_image.set_from_file(file) + pix = self.avatar_image.get_pixbuf() + pix = gtkgui_helpers.get_scaled_pixbuf(pix, 'tooltip') + self.avatar_image.set_from_pixbuf(pix) + table_size = 4 else: self.avatar_image.set_from_pixbuf(None) vcard_table = gtk.Table(table_size, 1) @@ -414,8 +410,15 @@ class RosterTooltip(NotificationAreaTooltip): name_markup = u'' + \ gobject.markup_escape_text(prim_contact.get_shown_name())\ + '' + if self.account and prim_contact.jid in gajim.connections[ + self.account].blocked_contacts: + name_markup += _(' [blocked]') + if self.account and \ + gajim.interface.minimized_controls.has_key(self.account) and \ + prim_contact.jid in gajim.interface.minimized_controls[self.account]: + name_markup += _(' [minimized]') properties.append((name_markup, None)) - + num_resources = 0 # put contacts in dict, where key is priority contacts_dict = {} @@ -476,6 +479,12 @@ class RosterTooltip(NotificationAreaTooltip): locale.getpreferredencoding()) text = text % local_time show += text + if self.account and \ + gajim.gc_connected[self.account].has_key(prim_contact.jid): + if gajim.gc_connected[self.account][prim_contact.jid]: + show = _('Connected') + else: + show = _('Disconnected') show = '' + show + '' # we append show below @@ -519,8 +528,9 @@ class RosterTooltip(NotificationAreaTooltip): status = contact.status.strip() if status: # reduce long status - # (no more than 100 chars on line and no more than 5 lines) - status = helpers.reduce_chars_newlines(status, 100, 5) + # (no more than 300 chars on line and no more than 5 lines) + # status is wrapped + status = helpers.reduce_chars_newlines(status, 300, 5) # escape markup entities. status = gobject.markup_escape_text(status) properties.append(('%s' % status, None)) @@ -534,7 +544,8 @@ class RosterTooltip(NotificationAreaTooltip): gobject.markup_escape_text(contact.resource) +\ ' (' + unicode(contact.priority) + ')')) - if prim_contact.sub and prim_contact.sub != 'both': + if self.account and prim_contact.sub and prim_contact.sub != 'both' and\ + not gajim.gc_connected[self.account].has_key(prim_contact.jid): # ('both' is the normal sub so we don't show it) properties.append(( _('Subscription: '), gobject.markup_escape_text(helpers.get_uf_sub(prim_contact.sub)))) @@ -571,6 +582,7 @@ class RosterTooltip(NotificationAreaTooltip): else: if isinstance(property[0], (unicode, str)): #FIXME: rm unicode? label.set_markup(property[0]) + label.set_line_wrap(True) else: label = property[0] vcard_table.attach(label, 1, 3, vcard_current_row, diff --git a/src/vcard.py b/src/vcard.py index a479d382b..3c94dd4b6 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -21,8 +21,11 @@ import gobject import base64 import time import locale +import os import gtkgui_helpers +import dialogs +import message_control from common import helpers from common import gajim @@ -67,6 +70,27 @@ class VcardWindow: self.account = account self.gc_contact = gc_contact + self.xml.get_widget('no_user_avatar_label').set_no_show_all(True) + self.xml.get_widget('no_user_avatar_label').hide() + self.xml.get_widget('PHOTO_image').set_no_show_all(True) + self.xml.get_widget('PHOTO_image').hide() + image = gtk.Image() + self.photo_button = self.xml.get_widget('PHOTO_button') + self.photo_button.set_image(image) + self.nophoto_button = self.xml.get_widget('NOPHOTO_button') + puny_jid = helpers.sanitize_filename(contact.jid) + local_avatar_basepath = os.path.join(gajim.AVATAR_PATH, puny_jid) + \ + '_local' + for extension in ('.png', '.jpeg'): + local_avatar_path = local_avatar_basepath + extension + if os.path.isfile(local_avatar_path): + image.set_from_file(local_avatar_path) + self.nophoto_button.set_no_show_all(True) + self.nophoto_button.hide() + break + else: + self.photo_button.set_no_show_all(True) + self.photo_button.hide() self.avatar_mime_type = None self.avatar_encoded = None self.vcard_arrived = False @@ -88,6 +112,105 @@ class VcardWindow: self.progressbar.pulse() return True # loop forever + def update_avatar_in_gui(self): + jid = self.contact.jid + # Update roster + gajim.interface.roster.draw_avatar(jid, self.account) + # Update chat window + if gajim.interface.msg_win_mgr.has_window(jid, self.account): + win = gajim.interface.msg_win_mgr.get_window(jid, self.account) + ctrl = win.get_control(jid, self.account) + if win and ctrl.type_id != message_control.TYPE_GC: + ctrl.show_avatar() + + def on_NOPHOTO_button_clicked(self, button): + def on_ok(widget, path_to_file): + filesize = os.path.getsize(path_to_file) # in bytes + invalid_file = False + msg = '' + if os.path.isfile(path_to_file): + stat = os.stat(path_to_file) + if stat[6] == 0: + invalid_file = True + msg = _('File is empty') + else: + invalid_file = True + msg = _('File does not exist') + if invalid_file: + dialogs.ErrorDialog(_('Could not load image'), msg) + return + try: + pixbuf = gtk.gdk.pixbuf_new_from_file(path_to_file) + if filesize > 16384: # 16 kb + # get the image at 'notification size' + # and hope that user did not specify in ACE crazy size + pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'tooltip') + except gobject.GError, msg: # unknown format + # msg should be string, not object instance + msg = str(msg) + dialogs.ErrorDialog(_('Could not load image'), msg) + return + puny_jid = helpers.sanitize_filename(self.contact.jid) + path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + '_local.png' + pixbuf.save(path_to_file, 'png') + self.dialog.destroy() + self.update_avatar_in_gui() + + # rescale it + pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'vcard') + image = self.photo_button.get_image() + image.set_from_pixbuf(pixbuf) + self.photo_button.show() + self.nophoto_button.hide() + + def on_clear(widget): + self.dialog.destroy() + self.on_clear_button_clicked(widget) + + self.dialog = dialogs.AvatarChooserDialog(on_response_ok = on_ok, + on_response_clear = on_clear) + + def on_clear_button_clicked(self, widget): + # empty the image + image = self.photo_button.get_image() + image.set_from_pixbuf(None) + self.photo_button.hide() + self.nophoto_button.show() + # Delete file: + puny_jid = helpers.sanitize_filename(self.contact.jid) + path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + '_local.png' + try: + os.remove(path_to_file) + except OSError: + gajim.log.debug('Cannot remove %s' % path_to_file) + self.update_avatar_in_gui() + + def on_PHOTO_button_press_event(self, widget, event): + '''If right-clicked, show popup''' + if event.button == 3 and self.avatar_encoded: # right click + menu = gtk.Menu() + + # Try to get pixbuf +# pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(self.jid) + +# if pixbuf: +# nick = self.contact.get_shown_name() +# menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) +# menuitem.connect('activate', +# gtkgui_helpers.on_avatar_save_as_menuitem_activate, self.jid, +# None, nick + '.jpeg') +# menu.append(menuitem) + # show clear + menuitem = gtk.ImageMenuItem(gtk.STOCK_CLEAR) + menuitem.connect('activate', self.on_clear_button_clicked) + menu.append(menuitem) + menu.connect('selection-done', lambda w:w.destroy()) + # show the menu + menu.show_all() + menu.popup(None, None, None, event.button, event.time) + elif event.button == 1: # left click + self.on_NOPHOTO_button_clicked(widget) + def on_vcard_information_window_destroy(self, widget): if self.update_progressbar_timeout_id is not None: gobject.source_remove(self.update_progressbar_timeout_id) @@ -100,27 +223,10 @@ class VcardWindow: connection.annotations[self.contact.jid] = annotation connection.store_annotations() - def on_vcard_information_window_key_press_event(self, widget, event): if event.keyval == gtk.keysyms.Escape: self.window.destroy() - def on_log_history_checkbutton_toggled(self, widget): - #log conversation history? - oldlog = True - no_log_for = gajim.config.get_per('accounts', self.account, - 'no_log_for').split() - if self.contact.jid in no_log_for: - oldlog = False - log = widget.get_active() - if not log and not self.contact.jid in no_log_for: - no_log_for.append(self.contact.jid) - if log and self.contact.jid in no_log_for: - no_log_for.remove(self.contact.jid) - if oldlog != log: - gajim.config.set_per('accounts', self.account, 'no_log_for', - ' '.join(no_log_for)) - def on_PHOTO_eventbox_button_press_event(self, widget, event): '''If right-clicked, show popup''' if event.button == 3: # right click @@ -153,12 +259,15 @@ class VcardWindow: pass def set_values(self, vcard): + if not 'PHOTO' in vcard: + self.xml.get_widget('no_user_avatar_label').show() for i in vcard.keys(): if i == 'PHOTO' and self.xml.get_widget('information_notebook').\ get_n_pages() > 4: pixbuf, self.avatar_encoded, self.avatar_mime_type = \ get_avatar_pixbuf_encoded_mime(vcard[i]) image = self.xml.get_widget('PHOTO_image') + image.show() if not pixbuf: image.set_from_icon_name('stock_person', gtk.ICON_SIZE_DIALOG) @@ -298,14 +407,6 @@ class VcardWindow: tooltips.set_tip(eb, _("You are waiting contact's answer about your subscription request")) - log = True - if self.contact.jid in gajim.config.get_per('accounts', self.account, - 'no_log_for').split(' '): - log = False - checkbutton = self.xml.get_widget('log_history_checkbutton') - checkbutton.set_active(log) - checkbutton.connect('toggled', self.on_log_history_checkbutton_toggled) - resources = '%s (%s)' % (self.contact.resource, unicode( self.contact.priority)) uf_resources = self.contact.resource + _(' resource with priority ')\ @@ -352,8 +453,11 @@ class VcardWindow: self.fill_status_label() - gajim.connections[self.account].request_vcard(self.contact.jid, - self.gc_contact is not None) + if self.gc_contact: + gajim.connections[self.account].request_vcard(self.contact.jid, + self.gc_contact.get_full_jid()) + else: + gajim.connections[self.account].request_vcard(self.contact.jid) def on_close_button_clicked(self, widget): self.window.destroy() @@ -385,22 +489,6 @@ class ZeroconfVcardWindow: if event.keyval == gtk.keysyms.Escape: self.window.destroy() - def on_log_history_checkbutton_toggled(self, widget): - #log conversation history? - oldlog = True - no_log_for = gajim.config.get_per('accounts', self.account, - 'no_log_for').split() - if self.contact.jid in no_log_for: - oldlog = False - log = widget.get_active() - if not log and not self.contact.jid in no_log_for: - no_log_for.append(self.contact.jid) - if log and self.contact.jid in no_log_for: - no_log_for.remove(self.contact.jid) - if oldlog != log: - gajim.config.set_per('accounts', self.account, 'no_log_for', - ' '.join(no_log_for)) - def on_PHOTO_eventbox_button_press_event(self, widget, event): '''If right-clicked, show popup''' if event.button == 3: # right click @@ -469,14 +557,6 @@ class ZeroconfVcardWindow: '
    ') self.xml.get_widget('local_jid_label').set_text(self.contact.jid) - log = True - if self.contact.jid in gajim.config.get_per('accounts', self.account, - 'no_log_for').split(' '): - log = False - checkbutton = self.xml.get_widget('log_history_checkbutton') - checkbutton.set_active(log) - checkbutton.connect('toggled', self.on_log_history_checkbutton_toggled) - resources = '%s (%s)' % (self.contact.resource, unicode( self.contact.priority)) uf_resources = self.contact.resource + _(' resource with priority ')\ From 07b324ced469175223dafd75a1048df7ddaddcd1 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sun, 3 Jun 2007 10:30:34 +0000 Subject: [PATCH 20/32] ability to see pep nodes and their access model. TODO: ability to change it --- data/glade/roster_window.glade | 778 +++++++++++++----------------- src/common/connection_handlers.py | 10 + src/common/pubsub.py | 11 + src/common/xmpp/protocol.py | 1 + src/config.py | 64 ++- src/gajim.py | 11 + src/roster_window.py | 44 +- 7 files changed, 467 insertions(+), 452 deletions(-) diff --git a/data/glade/roster_window.glade b/data/glade/roster_window.glade index 5e393ae45..16fb5bbb4 100644 --- a/data/glade/roster_window.glade +++ b/data/glade/roster_window.glade @@ -1,444 +1,338 @@ - - - + + + - - - 85 - 200 - Gajim - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - 200 - 400 - True - False - roster - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - False - - - - - - - - - True - False - 0 - - - - True - GTK_PACK_DIRECTION_LTR - GTK_PACK_DIRECTION_LTR - - - - True - _Actions - True - - - - - - - - True - _Start Chat - True - - - - True - gtk-jump-to - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - _Group Chat - True - - - - True - gtk-connect - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - - - - - - True - Add _Contact - True - - - - True - gtk-add - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - _Discover Services - True - - - - True - gtk-find - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - _Advanced - True - - - - - - True - - - - - - True - _Quit - True - - - - - - True - gtk-quit - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - - - - - True - _Edit - True - - - - - - - - True - A_ccounts - True - - - - - - True - gtk-network - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - Profile, A_vatar - True - - - - True - gtk-properties - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - - - - - - True - _Preferences - True - - - - - - True - gtk-preferences - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - - - - - True - _View - True - - - - - - - - True - Show _Offline Contacts - True - False - - - - - - - - True - Show Trans_ports - True - False - - - - - - - True - - - - - - True - File _Transfers - True - - - - - - True - gtk-file - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - - - - - True - _Help - True - - - - - - - True - Help online - _Contents - True - - - - - True - gtk-help - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - Frequently Asked Questions (online) - _FAQ - True - - - - - - - True - gtk-about - True - - - - - - - - - - 0 - False - False - - - - - - 2 - True - True - GTK_POLICY_NEVER - GTK_POLICY_AUTOMATIC - GTK_SHADOW_NONE - GTK_CORNER_TOP_LEFT - - - - True - True - False - False - True - True - False - False - False - - - - - - - - - - - - - - 0 - True - True - - - - - - True - False - True - - - - 0 - False - True - - - - - - + + 85 + 200 + Gajim + roster + 200 + 400 + + + + + + + + True + + + True + + + True + _Actions + True + + + + + + True + _Start Chat + True + + + True + gtk-jump-to + 1 + + + + + + + True + _Group Chat + True + + + True + gtk-connect + 1 + + + + + + + True + + + + + True + Add _Contact + True + + + True + gtk-add + 1 + + + + + + + True + _Discover Services + True + + + True + gtk-find + 1 + + + + + + + True + _Advanced + True + + + + + True + + + + + True + _Quit + True + + + + + True + gtk-quit + 1 + + + + + + + + + + + True + _Edit + True + + + + + + True + A_ccounts + True + + + + + True + gtk-network + 1 + + + + + + + True + Profile, A_vatar + True + + + True + gtk-properties + 1 + + + + + + + True + + + + + True + _Preferences + True + + + + + True + gtk-preferences + 1 + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + _Services + True + + + + + + + + + True + _View + True + + + + + + True + Show _Offline Contacts + True + + + + + + + True + Show Trans_ports + True + + + + + + True + + + + + True + File _Transfers + True + + + + + True + gtk-missing-image + 1 + + + + + + + + + + + True + _Help + True + + + + + True + Help online + _Contents + True + + + + True + gtk-help + 1 + + + + + + + True + Frequently Asked Questions (online) + _FAQ + True + + + + + + True + gtk-about + True + True + + + + + + + + + + False + False + + + + + True + True + 2 + GTK_POLICY_NEVER + GTK_POLICY_AUTOMATIC + + + True + True + False + True + + + + + + + + + + + + + + 1 + + + + + True + + + + False + 2 + + + + + diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index eaa6293c6..d1de9bdbc 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -46,6 +46,7 @@ VCARD_ARRIVED = 'vcard_arrived' AGENT_REMOVED = 'agent_removed' METACONTACTS_ARRIVED = 'metacontacts_arrived' PRIVACY_ARRIVED = 'privacy_arrived' +PEP_ACCESS_MODEL = 'pep_access_model' HAS_IDLE = True try: import idle @@ -1068,6 +1069,15 @@ class ConnectionVcard: self.get_privacy_list('block') # Ask metacontacts before roster self.get_metacontacts() + elif self.awaiting_answers[id][0] == PEP_ACCESS_MODEL: + conf = iq_obj.getTag('pubsub').getTag('configure') + node = conf.getAttr('node') + form_tag = conf.getTag('x', namespace=common.xmpp.NS_DATA) + form = common.dataforms.ExtendForm(node=form_tag) + for field in form.iter_fields(): + if field.var == 'pubsub#access_model': + self.dispatch('PEP_ACCESS_MODEL', (node, field.value)) + break del self.awaiting_answers[id] diff --git a/src/common/pubsub.py b/src/common/pubsub.py index c4ee908f7..acf3345dc 100644 --- a/src/common/pubsub.py +++ b/src/common/pubsub.py @@ -1,5 +1,7 @@ import xmpp import gajim +import dataforms +import connection_handlers class ConnectionPubSub: def __init__(self): @@ -92,3 +94,12 @@ class ConnectionPubSub: cb(conn, stanza, *args, **kwargs) except KeyError: pass + + def request_pb_configuration(self, jid, node): + query = xmpp.Iq('get', to=jid) + e = query.addChild('pubsub', namespace=xmpp.NS_PUBSUB_OWNER) + e = e.addChild('configure', {'node': node}) + id = self.connection.getAnID() + query.setID(id) + self.awaiting_answers[id] = (connection_handlers.PEP_ACCESS_MODEL,) + self.connection.send(query) diff --git a/src/common/xmpp/protocol.py b/src/common/xmpp/protocol.py index 07bccf3da..ead233682 100644 --- a/src/common/xmpp/protocol.py +++ b/src/common/xmpp/protocol.py @@ -74,6 +74,7 @@ NS_PRIVACY ='jabber:iq:privacy' NS_PRIVATE ='jabber:iq:private' NS_PROFILE ='http://jabber.org/protocol/profile' # JEP-0154 NS_PUBSUB ='http://jabber.org/protocol/pubsub' # JEP-0060 +NS_PUBSUB_OWNER ='http://jabber.org/protocol/pubsub#owner' # JEP-0060 NS_REGISTER ='jabber:iq:register' NS_ROSTER ='jabber:iq:roster' NS_ROSTERX ='http://jabber.org/protocol/rosterx' # JEP-0144 diff --git a/src/config.py b/src/config.py index e1bcfa062..1765e2ab7 100644 --- a/src/config.py +++ b/src/config.py @@ -3360,7 +3360,7 @@ class ZeroconfPropertiesWindow: config['keyname'] = self.xml.get_widget('gpg_name_label').get_text().\ decode('utf-8') - if config['keyname'] == '': #no key selected + if config['keyname'] == '': # no key selected config['keyid'] = '' config['savegpgpass'] = False config['gpgpassword'] = '' @@ -3430,3 +3430,65 @@ class ZeroconfPropertiesWindow: st = widget.get_active() w = self.xml.get_widget('gpg_password_entry') w.set_sensitive(bool(st)) + +class ManagePEPServicesWindow: + def __init__(self, account): + self.xml = gtkgui_helpers.get_glade('manage_pep_services_window.glade') + self.window = self.xml.get_widget('manage_pep_services_window') + self.window.set_transient_for(gajim.interface.roster.window) + self.xml.signal_autoconnect(self) + self.account = account + + self.init_services() + self.window.show_all() + + def on_manage_pep_services_window_destroy(self, widget): + '''close window''' + del gajim.interface.instances[self.account]['pep_services'] + + def cellrenderer_combo_edited(self, cellrenderer, path, new_text): + self.treestore[path][1] = new_text + + def init_services(self): + treeview = self.xml.get_widget('services_treeview') + # service, access_model, group + self.treestore = gtk.ListStore(str, str, str) + treeview.set_model(self.treestore) + + col = gtk.TreeViewColumn('Service') + treeview.append_column(col) + + cellrenderer_text = gtk.CellRendererText() + col.pack_start(cellrenderer_text) + col.add_attribute(cellrenderer_text, 'text', 0) + + col = gtk.TreeViewColumn('access model') + treeview.append_column(col) + + model = gtk.ListStore(str) + model.append(['open']) + model.append(['presence']) + model.append(['roster']) + model.append(['whitelist']) + cellrenderer_combo = gtk.CellRendererCombo() + cellrenderer_combo.set_property('text-column', 0) + cellrenderer_combo.set_property('model', model) + cellrenderer_combo.set_property('has-entry', False) + cellrenderer_combo.set_property('editable', True) + cellrenderer_combo.connect('edited', self.cellrenderer_combo_edited) + col.pack_start(cellrenderer_combo) + col.add_attribute(cellrenderer_combo, 'text', 1) + + our_jid = gajim.get_jid_from_account(self.account) + gajim.connections[self.account].discoverItems(our_jid) + + def items_received(self, items): + our_jid = gajim.get_jid_from_account(self.account) + for item in items: + if 'jid' in item and item['jid'] == our_jid and 'node' in item: + # ask to have access model + gajim.connections[self.account].request_pb_configuration( + item['jid'], item['node']) + + def new_service(self, node, model): + self.treestore.append([node, model, '']) diff --git a/src/gajim.py b/src/gajim.py index 15cb1b726..37970697d 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -934,6 +934,11 @@ class Interface: def handle_event_agent_info_items(self, account, array): #('AGENT_INFO_ITEMS', account, (agent, node, items)) + our_jid = gajim.get_jid_from_account(account) + if gajim.interface.instances[account].has_key('pep_services') and \ + array[0] == our_jid: + gajim.interface.instances[account]['pep_services'].items_received( + array[2]) try: gajim.connections[account].services_cache.agent_items(array[0], array[1], array[2]) @@ -1776,6 +1781,11 @@ class Interface: _('You are already connected to this account with the same resource. Please type a new one'), input_str = gajim.connections[account].server_resource, is_modal = False, ok_handler = on_ok) + def handle_event_pep_access_model(self, account, data): + # ('PEP_ACCESS_MODEL', account, (node, model)) + if self.instances[account].has_key('pep_services'): + self.instances[account]['pep_services'].new_service(data[0], data[1]) + def read_sleepy(self): '''Check idle status and change that status if needed''' if not self.sleeper.poll(): @@ -2102,6 +2112,7 @@ class Interface: 'SEARCH_FORM': self.handle_event_search_form, 'SEARCH_RESULT': self.handle_event_search_result, 'RESOURCE_CONFLICT': self.handle_event_resource_conflict, + 'PEP_ACCESS_MODEL': self.handle_event_pep_access_model, } gajim.handlers = self.handlers diff --git a/src/roster_window.py b/src/roster_window.py index fd62d3ef5..180315856 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -903,7 +903,8 @@ class RosterWindow: add_new_contact_menuitem = self.xml.get_widget('add_new_contact_menuitem') service_disco_menuitem = self.xml.get_widget('service_disco_menuitem') advanced_menuitem = self.xml.get_widget('advanced_menuitem') - profile_avatar_menuitem = self.xml.get_widget('profile_avatar_menuitem') + profile_avatar_menuitem = self.xml.get_widget('profile_avatar_menuitem') + pep_services_menuitem = self.xml.get_widget('pep_services_menuitem') # destroy old advanced menus for m in self.advanced_menus: @@ -927,10 +928,10 @@ class RosterWindow: self.new_chat_menuitem_handler_id) self.new_chat_menuitem_handler_id = None - if self.profile_avatar_menuitem_handler_id: - profile_avatar_menuitem.handler_disconnect( - self.profile_avatar_menuitem_handler_id) - self.profile_avatar_menuitem_handler_id = None + if self.pep_services_menuitem_handler_id: + pep_services_menuitem.handler_disconnect( + self.pep_services_menuitem_handler_id) + self.pep_services_menuitem_handler_id = None # remove the existing submenus @@ -940,6 +941,7 @@ class RosterWindow: new_chat_menuitem.remove_submenu() advanced_menuitem.remove_submenu() profile_avatar_menuitem.remove_submenu() + pep_services_menuitem.remove_submenu() # remove the existing accelerator if self.have_new_chat_accel: @@ -1068,27 +1070,43 @@ class RosterWindow: if len(connected_accounts_with_vcard) > 1: # 2 or more accounts? make submenus profile_avatar_sub_menu = gtk.Menu() + pep_services_sub_menu = gtk.Menu() for account in connected_accounts_with_vcard: # profile, avatar - profile_avatar_item = gtk.MenuItem(_('of account %s') % account, + profile_avatar_item = gtk.MenuItem(_('of account %s') % account, False) profile_avatar_sub_menu.append(profile_avatar_item) - profile_avatar_item.connect('activate', + profile_avatar_item.connect('activate', self.on_profile_avatar_menuitem_activate, account) + # PEP services + pep_services_item = gtk.MenuItem(_('of account %s') % account, + False) + pep_services_sub_menu.append(pep_services_item) + pep_services_item.connect('activate', + self.on_pep_services_menuitem_activate, account) profile_avatar_menuitem.set_submenu(profile_avatar_sub_menu) profile_avatar_sub_menu.show_all() + pep_services_menuitem.set_submenu(pep_services_sub_menu) + pep_services_sub_menu.show_all() elif len(connected_accounts_with_vcard) == 1: # user has only one account account = connected_accounts_with_vcard[0] # profile, avatar if not self.profile_avatar_menuitem_handler_id: self.profile_avatar_menuitem_handler_id = \ - profile_avatar_menuitem.connect('activate', self.\ - on_profile_avatar_menuitem_activate, account) + profile_avatar_menuitem.connect('activate', + self.on_profile_avatar_menuitem_activate, account) + # PEP services + if not self.pep_services_menuitem_handler_id: + self.pep_services_menuitem_handler_id = \ + pep_services_menuitem.connect('activate', + self.on_pep_services_menuitem_activate, account) if len(connected_accounts_with_vcard) == 0: profile_avatar_menuitem.set_sensitive(False) + pep_services_menuitem.set_sensitive(False) else: profile_avatar_menuitem.set_sensitive(True) + pep_services_menuitem.set_sensitive(True) newitem = gtk.ImageMenuItem(_('_Manage Bookmarks...')) img = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, @@ -3684,6 +3702,13 @@ class RosterWindow: else: gajim.interface.instances['preferences'] = config.PreferencesWindow() + def on_pep_services_menuitem_activate(self, widget, account): + if gajim.interface.instances[account].has_key('pep_services'): + gajim.interface.instances[account]['pep_services'].window.present() + else: + gajim.interface.instances[account]['pep_services'] = \ + config.ManagePEPServicesWindow(account) + def on_add_new_contact(self, widget, account): dialogs.AddNewContactWindow(account) @@ -4840,6 +4865,7 @@ class RosterWindow: self.service_disco_handler_id = False self.new_chat_menuitem_handler_id = False self.profile_avatar_menuitem_handler_id = False + self.pep_services_menuitem_handler_id = False self.actions_menu_needs_rebuild = True self.regroup = gajim.config.get('mergeaccounts') if len(gajim.connections) < 2: # Do not merge accounts if only one exists From 8eb1df2c60eb87e630f113f7ae0c7daca0403ef5 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Sun, 3 Jun 2007 10:46:52 +0000 Subject: [PATCH 21/32] missing glade file --- data/glade/manage_pep_services_window.glade | 28 +++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 data/glade/manage_pep_services_window.glade diff --git a/data/glade/manage_pep_services_window.glade b/data/glade/manage_pep_services_window.glade new file mode 100644 index 000000000..c3995a2a1 --- /dev/null +++ b/data/glade/manage_pep_services_window.glade @@ -0,0 +1,28 @@ + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 350 + 150 + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + + + + + + From 64566299acc8458bb7c066c000005f538e615b57 Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Sun, 3 Jun 2007 17:23:25 +0000 Subject: [PATCH 22/32] Slight modifications of PEP Services dialog --- data/glade/manage_pep_services_window.glade | 131 ++++++++++++++++---- src/config.py | 7 ++ src/roster_window.py | 25 ++-- 3 files changed, 125 insertions(+), 38 deletions(-) diff --git a/data/glade/manage_pep_services_window.glade b/data/glade/manage_pep_services_window.glade index c3995a2a1..d9812ff07 100644 --- a/data/glade/manage_pep_services_window.glade +++ b/data/glade/manage_pep_services_window.glade @@ -1,28 +1,107 @@ - - - + + + - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 350 - 150 - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - True - - - - - + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + 350 + 150 + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + + + + + True + False + 0 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + False + False + True + False + False + False + + + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_DEFAULT_STYLE + 0 + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + True + -6 + + + + + + + True + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + -5 + + + + + + 0 + True + True + + + + + + diff --git a/src/config.py b/src/config.py index 1765e2ab7..c54fedf14 100644 --- a/src/config.py +++ b/src/config.py @@ -3446,6 +3446,12 @@ class ManagePEPServicesWindow: '''close window''' del gajim.interface.instances[self.account]['pep_services'] + def on_ok_button_clicked(self, widget): + pass + + def on_cancel_button_clicked(self, widget): + self.window.destroy() + def cellrenderer_combo_edited(self, cellrenderer, path, new_text): self.treestore[path][1] = new_text @@ -3470,6 +3476,7 @@ class ManagePEPServicesWindow: model.append(['presence']) model.append(['roster']) model.append(['whitelist']) + model.append(['delete']) cellrenderer_combo = gtk.CellRendererCombo() cellrenderer_combo.set_property('text-column', 0) cellrenderer_combo.set_property('model', model) diff --git a/src/roster_window.py b/src/roster_window.py index 180315856..59f65d620 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1072,18 +1072,19 @@ class RosterWindow: profile_avatar_sub_menu = gtk.Menu() pep_services_sub_menu = gtk.Menu() for account in connected_accounts_with_vcard: - # profile, avatar - profile_avatar_item = gtk.MenuItem(_('of account %s') % account, - False) - profile_avatar_sub_menu.append(profile_avatar_item) - profile_avatar_item.connect('activate', - self.on_profile_avatar_menuitem_activate, account) - # PEP services - pep_services_item = gtk.MenuItem(_('of account %s') % account, - False) - pep_services_sub_menu.append(pep_services_item) - pep_services_item.connect('activate', - self.on_pep_services_menuitem_activate, account) + if gajim.connections[account].pep_supported: + # profile, avatar + profile_avatar_item = gtk.MenuItem(_('of account %s') % account, + False) + profile_avatar_sub_menu.append(profile_avatar_item) + profile_avatar_item.connect('activate', + self.on_profile_avatar_menuitem_activate, account) + # PEP services + pep_services_item = gtk.MenuItem(_('of account %s') % account, + False) + pep_services_sub_menu.append(pep_services_item) + pep_services_item.connect('activate', + self.on_pep_services_menuitem_activate, account) profile_avatar_menuitem.set_submenu(profile_avatar_sub_menu) profile_avatar_sub_menu.show_all() pep_services_menuitem.set_submenu(pep_services_sub_menu) From 90b055136b4687227c24beca2bf92913e3ff4ad4 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Tue, 19 Jun 2007 15:03:00 +0000 Subject: [PATCH 23/32] [Fluo and I] French PEP Translation --- po/fr.po | 400 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 400 insertions(+) diff --git a/po/fr.po b/po/fr.po index b9f6d8178..7c2f28549 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6537,6 +6537,406 @@ msgstr "Connecté" msgid "Disconnected" msgstr "Déconnecté" +#pep +msgid "afraid" +msgstr "appeuré" + +msgid "amazed" +msgstr "surpris, amusé" + +msgid "angry" +msgstr "en colère" + +msgid "annoyed" +msgstr "dérangé" + +msgid "anxious" +msgstr "anxieux" + +msgid "aroused" +msgstr "excité" + +msgid "ashamed" +msgstr "honteux/éhonté" + +msgid "bored" +msgstr "ennuyé" + +msgid "brave" +msgstr "courageux" + +msgid "calm" +msgstr "calme" + +msgid "cold" +msgstr "froid" + +msgid "confused" +msgstr "confus" + +msgid "contented" +msgstr "contenté" + +msgid "cranky" +msgstr "excentrique" + +msgid "curious" +msgstr "curieux" + +msgid "depressed" +msgstr "déprimé" + +msgid "disappointed" +msgstr "décu" + +msgid "disgusted" +msgstr "dégouté" + +msgid "distracted" +msgstr "distrait" + +msgid "embarrassed" +msgstr "embarssé" + +msgid "excited" +msgstr "excité" + +msgid "flirtatious" +msgstr "coquet" + +msgid "frustrated" +msgstr "frustré" + +msgid "grumpy" +msgstr "grognon" + +msgid "guilty" +msgstr "coupable" + +msgid "happy" +msgstr "joyeux" + +msgid "hot" +msgstr "chaud" + +msgid "humbled" +msgstr "humilié" + +msgid "humiliated" +msgstr "humilié" + +msgid "hungry" +msgstr "affamé" + +msgid "hurt" +msgstr "blessé" + +msgid "impressed" +msgstr "impressionné" + +msgid "in_awe" +msgstr "dans la crainte" + +msgid "in_love" +msgstr "amoureux" + +msgid "indignant" +msgstr "indigné" + +msgid "interested" +msgstr "interessé" + +msgid "intoxicated" +msgstr "intoxiqué" + +msgid "invincible" +msgstr "invincible" + +msgid "jealous" +msgstr "jaloux" + +msgid "lonely" +msgstr "seul/esseulé" + +msgid "mean" +msgstr "méchant" + +msgid "moody" +msgstr "déprimé" + +msgid "nervous" +msgstr "nerveux" + +msgid "neutral" +msgstr "neutre" + +msgid "offended" +msgstr "offensé" + +msgid "playful" +msgstr "joueur" + +msgid "proud" +msgstr "fier" + +msgid "relieved" +msgstr "soulagé" + +msgid "remorseful" +msgstr "plein de remord" + +msgid "restless" +msgstr "infatiguable" + +msgid "sad" +msgstr "triste" + +msgid "sarcastic" +msgstr "sarcastique" + +msgid "serious" +msgstr "serieux" + +msgid "shocked" +msgstr "choqué" + +msgid "shy" +msgstr "timide" + +msgid "sick" +msgstr "malade" + +msgid "sleepy" +msgstr "endormi" + +msgid "stressed" +msgstr "stressé" + +msgid "surprised" +msgstr "surpris" + +msgid "thirsty" +msgstr "assoiffé" + +msgid "worried" +msgstr "inquiet" + +msgid "_Personnal Events" +msgstr "Évènements _Personnels" + +msgid "Activity" +msgstr "Activité" + +msgid "doing_chores" +msgstr "fait des corvées" + +msgid "buying_groceries" +msgstr "achète des épiceries" + +msgid "cleaning" +msgstr "nettoie" + +msgid "cooking" +msgstr "cuisine" + +msgid "doing_maintenance" +msgstr "fait de la maintenance" + +msgid "doing_the_dishes" +msgstr "fait la vaiselle" + +msgid "doing_the_laundry" +msgstr "fait la blanchisserie" + +msgid "gardening" +msgstr "jardine" + +msgid "running_an_errand" +msgstr "fait une course" + +msgid "walking_the_dog" +msgstr "promène le chien" + +msgid "drinking" +msgstr "boit" + +msgid "having_a_beer" +msgstr "prend une bière" + +msgid "having_coffee" +msgstr "prend un café" + +msgid "having_tea" +msgstr "prend un thé" + +msgid "eating" +msgstr "mange" + +msgid "having_a_snack" +msgstr "prend un snack" + +msgid "having_breakfast" +msgstr "prend le petit-déjeuner" + +msgid "having_dinner" +msgstr "soupe" + +msgid "having_lunch" +msgstr "dîne" + +msgid "exercising" +msgstr "fait de l'exercice" + +msgid "cycling" +msgstr "fait du vélo" + +msgid "hiking" +msgstr "fait de la randonnée" + +msgid "jogging" +msgstr "fait un jogging" + +msgid "playing_sports" +msgstr "fait du sport" + +msgid "running" +msgstr "court" + +msgid "skiing" +msgstr "skie" + +msgid "swimming" +msgstr "nage" + +msgid "working_out" +msgstr "élabore" + +msgid "grooming" +msgstr "se toilette" + +msgid "at_the_spa" +msgstr "à la station thermale" + +msgid "brushing_teeth" +msgstr "se brosse les dents" + +msgid "getting_a_haircut" +msgstr "se fait couper les cheveux" + +msgid "shaving" +msgstr "se rase" + +msgid "taking_a_bath" +msgstr "prend un bain" + +msgid "taking_a_shower" +msgstr "prend une douche" + +msgid "having_appointment" +msgstr "à un rendez-vous" + +msgid "inactive" +msgstr "inactif" + +msgid "day_off" +msgstr "en congé" + +msgid "hanging_out" +msgstr "traîne" + +msgid "on_vacation" +msgstr "en vacances" + +msgid "scheduled_holiday" +msgstr "en vacances organisées" + +msgid "sleeping" +msgstr "dort" + +msgid "relaxing" +msgstr "se relaxe" + +msgid "gaming" +msgstr "joue" + +msgid "going_out" +msgstr "sort" + +msgid "partying" +msgstr "fait la fête" + +msgid "reading" +msgstr "lit" + +msgid "rehearsing" +msgstr "se prépare" + +msgid "shopping" +msgstr "fait les magasins" + +msgid "socializing" +msgstr "se socialise" + +msgid "sunbathing" +msgstr "prend un bain de soleil" + +msgid "watching_tv" +msgstr "regarde la TV" + +msgid "watching_a_movie" +msgstr "regarde un film" + +msgid "talking" +msgstr "discute" + +msgid "in_real_life" +msgstr "dans la vraie vie" + +msgid "on_the_phone" +msgstr "au téléphone" + +msgid "traveling" +msgstr "voyage" + +msgid "commuting" +msgstr "permute" + +msgid "driving" +msgstr "conduit" + +msgid "in_a_car" +msgstr "en voiture" + +msgid "on_a_bus" +msgstr "en bus" + +msgid "on_a_plane" +msgstr "en avion" + +msgid "on_a_train" +msgstr "en train" + +msgid "on_a_trip" +msgstr "en séjour" + +msgid "walking" +msgstr "marche" + +msgid "working" +msgstr "travaille" + +msgid "coding" +msgstr "programme" + +msgid "in_a_meeting" +msgstr "en réunion" + +msgid "studying" +msgstr "étudie" + +msgid "writing" +msgstr "écrit" + #~ msgid "2003-12-13T18:30:02Z" #~ msgstr "2003-12-13T18:30:02Z" #~ msgid "Romeo and Juliet" From fca81d8795ddae61d0ee60545b3bd5e266eb6f42 Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Sun, 8 Jul 2007 11:35:52 +0000 Subject: [PATCH 24/32] A TODO. Good to know, what we're going to do --- TODO.pep | 5 ++++ data/glade/manage_pep_services_window.glade | 28 +++++++++++++++++++++ src/config.py | 1 - 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 TODO.pep diff --git a/TODO.pep b/TODO.pep new file mode 100644 index 000000000..5ff51f706 --- /dev/null +++ b/TODO.pep @@ -0,0 +1,5 @@ +• configure access model when changing it in the combobox +• tab in preferences for PEP +• PEP in status change +• possible transport of Mood in message +• Tune not set to none on connection diff --git a/data/glade/manage_pep_services_window.glade b/data/glade/manage_pep_services_window.glade index d9812ff07..a3e5e6155 100644 --- a/data/glade/manage_pep_services_window.glade +++ b/data/glade/manage_pep_services_window.glade @@ -65,6 +65,34 @@ GTK_BUTTONBOX_DEFAULT_STYLE 0 + + + True + True + True + True + gtk-add + True + GTK_RELIEF_NORMAL + True + -5 + + + + + + True + True + True + True + gtk-delete + True + GTK_RELIEF_NORMAL + True + -5 + + + True diff --git a/src/config.py b/src/config.py index c54fedf14..f3f329c41 100644 --- a/src/config.py +++ b/src/config.py @@ -3476,7 +3476,6 @@ class ManagePEPServicesWindow: model.append(['presence']) model.append(['roster']) model.append(['whitelist']) - model.append(['delete']) cellrenderer_combo = gtk.CellRendererCombo() cellrenderer_combo.set_property('text-column', 0) cellrenderer_combo.set_property('model', model) From ea24ee82e56936fa2d31fb3afb3e09901224db75 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Thu, 9 Aug 2007 15:39:18 +0000 Subject: [PATCH 25/32] merge diff from trunk to pep branch --- AUTHORS | 2 +- ChangeLog | 12 +- configure.ac | 2 +- data/glade/account_context_menu.glade | 294 +- .../account_creation_wizard_window.glade | 287 +- data/glade/accounts_window.glade | 1654 ++++- data/glade/add_new_contact_window.glade | 850 +-- .../glade/advanced_notifications_window.glade | 2124 +++---- data/glade/chat_control_popup_menu.glade | 10 - data/glade/features_window.glade | 116 + data/glade/filetransfers.glade | 669 +- data/glade/gajim_themes_window.glade | 2 +- data/glade/gc_control_popup_menu.glade | 40 +- data/glade/gc_occupants_menu.glade | 47 +- data/glade/history_manager.glade | 627 +- data/glade/manage_bookmarks_window.glade | 818 +-- data/glade/message_window.glade | 2 +- data/glade/preferences_window.glade | 5520 +++++++---------- data/glade/privacy_list_window.glade | 1273 ++-- data/glade/profile_window.glade | 3095 ++++----- data/glade/roster_contact_context_menu.glade | 16 +- data/glade/roster_window.glade | 30 +- data/glade/search_window.glade | 402 +- data/glade/service_discovery_window.glade | 684 +- data/glade/single_message_window.glade | 890 +-- data/glade/vcard_information_window.glade | 4361 +++++-------- data/glade/xml_console_window.glade | 4 +- .../glade/zeroconf_contact_context_menu.glade | 262 +- .../crystal/16x16/{message.gif => event.gif} | Bin .../dcraven/16x16/{message.png => event.png} | Bin .../dcraven/32x32/{message.png => event.png} | Bin .../gnome/16x16/{message.gif => event.gif} | Bin .../goojim/16x16/{message.png => event.png} | Bin .../goojim/32x32/{message.png => event.png} | Bin .../gossip/16x16/{message.png => event.png} | Bin .../gota/16x16/{message.gif => event.gif} | Bin .../gota/32x32/{message.gif => event.gif} | Bin .../16x16/{message.gif => event.gif} | Bin .../nuvola/16x16/{message.gif => event.gif} | Bin .../16x16/{message.png => event.png} | Bin .../stellar/16x16/{message.gif => event.gif} | Bin .../sun/16x16/{message.gif => event.gif} | Bin data/other/cacerts.pem | 2474 ++++++++ po/de.po | 60 +- po/ru.po | 461 +- src/adhoc_commands.py | 56 +- src/chat_control.py | 244 +- src/common/atom.py | 12 +- src/common/caps.py | 259 + src/common/check_paths.py | 7 + src/common/commands.py | 32 +- src/common/config.py | 14 +- src/common/configpaths.py | 77 +- src/common/connection.py | 229 +- src/common/connection_handlers.py | 274 +- src/common/contacts.py | 58 +- src/common/dataforms.py | 8 +- src/common/dbus_support.py | 2 + src/common/defs.py | 2 +- src/common/events.py | 2 +- src/common/exceptions.py | 9 + src/common/gajim.py | 1 + src/common/helpers.py | 199 +- src/common/logger.py | 111 +- src/common/optparser.py | 96 +- src/common/passwords.py | 16 +- src/common/pubsub.py | 2 +- src/common/socks5.py | 47 +- src/common/xmpp/commands.py | 2 +- src/common/xmpp/dispatcher_nb.py | 5 +- src/common/xmpp/features_nb.py | 13 +- src/common/xmpp/protocol.py | 70 +- src/common/xmpp/transports_nb.py | 70 +- src/common/zeroconf/client_zeroconf.py | 24 +- .../zeroconf/connection_handlers_zeroconf.py | 14 +- src/common/zeroconf/connection_zeroconf.py | 16 +- src/common/zeroconf/zeroconf.py | 415 +- src/common/zeroconf/zeroconf_avahi.py | 415 ++ src/common/zeroconf/zeroconf_bonjour.py | 329 + src/config.py | 1529 +++-- src/conversation_textview.py | 48 +- src/dialogs.py | 112 +- src/disco.py | 88 +- src/features_window.py | 276 + src/filetransfers_window.py | 27 +- src/gajim-remote.py | 9 + src/gajim.py | 252 +- src/gajim_themes_window.py | 39 +- src/groupchat_control.py | 330 +- src/gtkgui_helpers.py | 5 +- src/history_manager.py | 5 +- src/message_control.py | 12 +- src/message_window.py | 43 +- src/music_track_listener.py | 9 +- src/network_manager_listener.py | 34 +- src/notify.py | 22 +- src/profile_window.py | 4 - src/remote_control.py | 48 +- src/roster_window.py | 1127 ++-- src/search_window.py | 152 +- src/statusicon.py | 3 +- src/systray.py | 18 +- src/tooltips.py | 31 +- src/vcard.py | 142 +- 104 files changed, 17800 insertions(+), 16783 deletions(-) create mode 100644 data/glade/features_window.glade rename data/iconsets/crystal/16x16/{message.gif => event.gif} (100%) rename data/iconsets/dcraven/16x16/{message.png => event.png} (100%) rename data/iconsets/dcraven/32x32/{message.png => event.png} (100%) rename data/iconsets/gnome/16x16/{message.gif => event.gif} (100%) rename data/iconsets/goojim/16x16/{message.png => event.png} (100%) rename data/iconsets/goojim/32x32/{message.png => event.png} (100%) rename data/iconsets/gossip/16x16/{message.png => event.png} (100%) rename data/iconsets/gota/16x16/{message.gif => event.gif} (100%) rename data/iconsets/gota/32x32/{message.gif => event.gif} (100%) rename data/iconsets/jabberbulb/16x16/{message.gif => event.gif} (100%) rename data/iconsets/nuvola/16x16/{message.gif => event.gif} (100%) rename data/iconsets/simplebulb/16x16/{message.png => event.png} (100%) rename data/iconsets/stellar/16x16/{message.gif => event.gif} (100%) rename data/iconsets/sun/16x16/{message.gif => event.gif} (100%) create mode 100644 data/other/cacerts.pem create mode 100644 src/common/caps.py mode change 100755 => 100644 src/common/zeroconf/zeroconf.py create mode 100644 src/common/zeroconf/zeroconf_avahi.py create mode 100644 src/common/zeroconf/zeroconf_bonjour.py create mode 100644 src/features_window.py diff --git a/AUTHORS b/AUTHORS index 3688a1c43..9c646612b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -3,10 +3,10 @@ CURRENT DEVELOPERS: Yann Le Boulanger (asterix AT lagaule.org) Nikos Kouremenos (kourem AT gmail.com) Travis Shirk (travis AT pobox.com) -Jean-Marie Traissard (jim AT lapin.org) PAST DEVELOPERS: +Jean-Marie Traissard (jim AT lapin.org) Stefan Bethge (stefan AT lanpartei.de) Dimitur Kirov (dkirov AT gmail.com) Vincent Hanquez (tab AT snarc.org) diff --git a/ChangeLog b/ChangeLog index de8783118..a4fba5334 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ -Gajim 0.11.1 (XX February 2007) +Gajim 0.11.1 (18 February 2007) + * Fixes in gajim-remote and the way XMPP URI are handled + * Fix Idle under Windows + * Fix Gajim under non-ascii languages Windows + * Fix International Domain Name usage + * Fix when removing active privacy list + * Fix problem with adhoc command and multi-step forms * Fixed avatars cache problems in group chats + * KDE integration for XMPP URI + * Support of Banshee Music player + * Support of XEP-0202 (Entity Time) + * Support of XEP-0199 (XMPP Ping) Gajim 0.11 (19 December 2006) * New build system, using GNU autotools. See README.html diff --git a/configure.ac b/configure.ac index abd261585..c4bdb142e 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_INIT([Gajim - A Jabber Instant Messager], - [0.11.1.0],[http://trac.gajim.org/],[gajim]) + [0.11.1.5],[http://trac.gajim.org/],[gajim]) AC_PREREQ([2.59]) AM_INIT_AUTOMAKE([1.8]) AC_CONFIG_HEADER(config.h) diff --git a/data/glade/account_context_menu.glade b/data/glade/account_context_menu.glade index 900db4ff8..ef05651e6 100644 --- a/data/glade/account_context_menu.glade +++ b/data/glade/account_context_menu.glade @@ -1,177 +1,121 @@ - - - + + + - - - - - - True - _Status - True - - - - True - gtk-network - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - _Personal Events - True - - - - True - gtk-home - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - _Group Chat - True - - - - True - gtk-connect - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - _Open Gmail Inbox - True - - - - - - True - Send Single _Message... - True - - - - True - gtk-new - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - _Add Contact... - True - - - - True - gtk-add - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - _Discover Services... - True - - - - True - gtk-find - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - _Execute Command... - True - - - - True - gtk-execute - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - _Modify Account... - True - - - - True - gtk-preferences - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - + + + + True + _Status + True + + + True + gtk-network + 1 + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + _Personal Events + True + + + gtk-home + + + + + + + True + + + + + True + _Open Gmail Inbox + True + + + + + True + _Group Chat + True + + + True + gtk-connect + 1 + + + + + + + True + _Discover Services + True + + + True + gtk-find + 1 + + + + + + + True + _Execute Command + True + + + True + gtk-execute + 1 + + + + + + + True + + + + + True + _Add Contact + True + + + True + gtk-add + 1 + + + + + + + True + _Modify Account... + True + + + True + gtk-preferences + 1 + + + + + diff --git a/data/glade/account_creation_wizard_window.glade b/data/glade/account_creation_wizard_window.glade index 50d61e400..93ba1cb8b 100644 --- a/data/glade/account_creation_wizard_window.glade +++ b/data/glade/account_creation_wizard_window.glade @@ -53,6 +53,7 @@ to the Jabber network. True I already have an account I want to use True + 0 True @@ -66,6 +67,7 @@ to the Jabber network. True I want to _register for a new account True + 0 True use_existing_account_radiobutton
    @@ -142,96 +144,30 @@ to the Jabber network.
    - + True True - 0 - True - True - - - 1 - 3 - 3 - 4 - GTK_FILL - - - - - - True - 0 - Your JID: - - - 3 - 4 - GTK_FILL - - - - - - True - 0 - _Username: - True - username_entry - - - GTK_FILL - - - - - - True - True - False + True * - True + + 1 2 - 2 - 3 - - True - True - If checked, Gajim will remember the password for this account - Save pass_word - True - False - True - True - - - - 2 - 3 - 2 - 3 - GTK_FILL - - - - - + True 0 - _Password: + _Server: True - password_entry - 2 - 3 + 1 + 2 GTK_FILL @@ -255,31 +191,98 @@ to the Jabber network. - + True 0 - _Server: + _Password: True + password_entry - 1 - 2 + 2 + 3 GTK_FILL - + True True - True + If checked, Gajim will remember the password for this account + Save pass_word + True + False + 0 + True + True + + + + 2 + 3 + 2 + 3 + GTK_FILL + + + + + + True + True + False * - - + True 1 2 + 2 + 3 + + + + + + True + 0 + _Username: + True + username_entry + + + GTK_FILL + + + + + + True + 0 + Your JID: + + + 3 + 4 + GTK_FILL + + + + + + True + True + 0 + True + True + + + 1 + 3 + 3 + 4 + GTK_FILL @@ -357,6 +360,7 @@ to the Jabber network. Click to see features (like MSN, ICQ transports) of jabber servers Servers Features True + 0 @@ -384,6 +388,62 @@ to the Jabber network. 3 5 5 + + + True + 0 + Prox_y: + True + + + GTK_FILL + + + + + + True + None + + + 1 + 2 + GTK_FILL + + + + + True + True + Manage... + True + 0 + + + + 2 + 3 + + + + + + + True + True + Use custom hostname/port + True + 0 + True + + + + 3 + 1 + 2 + + + True @@ -446,60 +506,6 @@ to the Jabber network. GTK_FILL - - - True - True - Use custom hostname/port - True - True - - - - 3 - 1 - 2 - - - - - - True - True - Manage... - True - - - - 2 - 3 - - - - - - - True - None - - - 1 - 2 - GTK_FILL - - - - - True - 0 - Prox_y: - True - - - GTK_FILL - - - @@ -637,6 +643,7 @@ Please wait... True Connect when I press Finish True + 0 True True @@ -652,6 +659,7 @@ Please wait... True Set my profile when I connect True + 0 True True @@ -692,6 +700,7 @@ Please wait... True gtk-cancel True + 0 @@ -703,6 +712,7 @@ Please wait... True gtk-go-back True + 0 @@ -717,6 +727,7 @@ Please wait... True gtk-go-forward True + 0 @@ -727,6 +738,8 @@ Please wait... True True + True + 0 @@ -772,6 +785,8 @@ Please wait... True True + True + 0 diff --git a/data/glade/accounts_window.glade b/data/glade/accounts_window.glade index bd3b2314e..ecd00cea6 100644 --- a/data/glade/accounts_window.glade +++ b/data/glade/accounts_window.glade @@ -1,305 +1,1353 @@ - - - + + + - - - 12 - Accounts - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - 150 - True - False - accounts - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - False - - - - - - True - False - 6 - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_NEVER - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - False - True - False - False - False - - - - - - - 0 - True - True - - - - - - True - If you have 2 or more accounts and this is checked, Gajim will list all contacts as if you had one account - True - Mer_ge accounts - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - - - 0 - False - True - - - - - - True - If checked, all local contacts that use a Bonjour compatible chat client (like iChat, Trillian or Gaim) will be shown in roster. You don't need to be connected to a jabber server for it to work. -This is only available if python-avahi is installed and avahi-daemon is running. - True - _Enable link-local messaging - True - GTK_RELIEF_NORMAL - True - False - False - True - - - 0 - False - False - - - - - - True - GTK_BUTTONBOX_END - 6 - - - - True - gtk-new - True - GTK_RELIEF_NORMAL - True - - - - - - - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-preferences - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Modify - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - - - - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-delete - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Remove - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - - - - True - True - True - True - True - gtk-close - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - False - True - - - - - - + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 12 + 600 + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 175 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + True + + + + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-add + True + + + + False + 1 + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-remove + True + + + + False + 2 + + + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-missing-image + + + False + False + 1 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Re_name + True + + + False + 2 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + 3 + + + + + + + False + 3 + + + + + False + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + False + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + False + + + + + + tab + + + + + True + True + + + True + 6 + 5 + 3 + 6 + 6 + + + True + True + Resource is sent to the Jabber server in order to separate the same JID in two or more parts depending on the number of the clients connected in the same server with the same account. So you might be connected in the same account with resource 'Home' and 'Work' at the same time. The resource which has the highest priority will get the events. (see below) + * + Gajim + + + + 1 + 3 + 2 + 3 + GTK_EXPAND | GTK_SHRINK | GTK_FILL + + + + + + True + True + * + True + + + + 1 + 3 + + + + + + True + True + + + True + 11 + True + + + True + True + Click to request authorization to all contacts of another account + Synchronise contacts + True + + + + False + + + + + True + True + Click to change account's password + Chan_ge Password + True + + + + False + 1 + + + + + + + True + Administration operations + + + label_item + + + + + 3 + 4 + 5 + GTK_FILL + GTK_FILL + + + + + True + True + Priority is used in Jabber to determine who gets the events from the jabber server when two or more clients are connected using the same account; The client with the highest priority gets the events + 5 0 127 1 5 5 + 1 + True + + + + 2 + 3 + 3 + 4 + GTK_FILL + + + + + + True + True + Priority will change automatically according to your status. + _Adjust to status + True + True + + + + 1 + 2 + 3 + 4 + GTK_FILL + + + + + + True + 0 + Priori_ty: + True + + + 3 + 4 + GTK_FILL + + + + + + True + 0 + Resour_ce: + True + + + 2 + 3 + GTK_FILL + + + + + + True + True + If checked, Gajim will remember the password for this account + Save pass_word + True + False + True + + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + + True + False + True + False + * + True + + + + 1 + 2 + 1 + 2 + GTK_EXPAND | GTK_SHRINK | GTK_FILL + + + + + + True + 0 + _Password: + True + + + 1 + 2 + GTK_FILL + + + + + + True + 0 + _Jabber ID: + True + + + GTK_FILL + + + + + + False + + + + + True + Account + + + tab + False + False + + + + + True + 6 + 6 + + + True + True + If checked, Gajim, when launched, will automatically connect to jabber using this account + C_onnect on Gajim startup + True + True + + + + False + False + + + + + True + True + Auto-reconnect when connection is lost + True + True + + + + False + False + 1 + + + + + True + True + Save conversation _logs for all contacts + True + True + True + + + + False + False + 2 + + + + + True + True + If checked, any change to the global status (handled by the combobox at the bottom of the roster window) will change the status of this account accordingly + Synch_ronize account status with global status + True + True + + + + False + False + 3 + + + + + True + True + If checked, Gajim will also broadcast some more IPs except from just your IP, so file transfer has higher chances of working. + Use file transfer proxies + True + True + + + + False + False + 4 + + + + + 1 + False + + + + + True + General + True + + + tab + 1 + False + False + + + + + True + 6 + 12 + + + True + 6 + 6 + + + True + Proxy: + + + False + False + + + + + True + None + + + + 1 + + + + + True + True + Manage... + True + + + + False + False + 2 + + + + + False + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 12 + + + True + 6 + 6 + + + True + True + Check this so Gajim will connect in port 5223 where legacy servers are expected to have SSL capabilities. Note that Gajim uses TLS encryption by default if broadcasted by the server, and with this option enabled TLS will be disabled + Use _SSL (legacy) + True + True + + + + False + False + + + + + True + True + If checked, Gajim will send keep-alive packets to prevent connection timeout which results in disconnection + Send keep-alive packets + True + True + True + + + + False + False + 1 + + + + + True + True + Use custom hostname/port + True + True + + + + False + False + 2 + + + + + True + False + 6 + + + True + Hostname: + + + False + False + + + + + True + True + * + + + + 1 + + + + + True + Port: + + + False + False + 2 + + + + + True + True + * + 6 + 5222 + + + + False + 3 + + + + + 3 + + + + + + + + + True + <b>Miscellaneous</b> + True + + + label_item + + + + + False + 1 + + + + + 2 + False + + + + + True + Connection + + + tab + 2 + False + False + + + + + True + 5 + 6 + + + True + 0 + GTK_SHADOW_NONE + + + True + 12 + + + True + 6 + 6 + + + True + 6 + + + True + True + No key selected + True + + + False + False + + + + + True + True + True + + + 1 + + + + + True + True + Choose _Key... + True + + + + False + False + 2 + + + + + False + + + + + True + 6 + + + True + False + True + If checked, Gajim will store the password in ~/.gajim/config with 'read' permission only for you + Save _passphrase (insecure) + True + True + + + + False + False + + + + + True + False + True + False + * + + + + 1 + + + + + False + 1 + + + + + + + + + True + <b>OpenPGP</b> + True + + + label_item + + + + + False + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + True + Information about you, as stored in the server + Edit Personal Information... + True + + + + + + + + True + <b>Personal Information</b> + True + + + label_item + + + + + False + 1 + + + + + 3 + False + + + + + True + Personal Information + + + tab + 3 + False + False + + + + + 1 + False + + + + + + tab + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Enable + True + + + + False + + + + + True + True + + + True + 6 + 6 + + + True + True + If checked, Gajim, when launched, will automatically connect to jabber using this account + C_onnect on Gajim startup + True + True + + + + False + False + + + + + True + True + Save conversation _logs for all contacts + True + True + + + + False + False + 1 + + + + + True + True + If checked, any change to the global status (handled by the combobox at the bottom of the roster window) will change the status of this account accordingly + Synch_ronize account status with global status + True + True + + + + False + False + 2 + + + + + True + + + True + True + If the default port that is used for incoming messages is unfitting for your setup you can select another one here. +You might consider to change possible firewall settings. + Use custom port: + True + True + + + + False + False + + + + + True + True + 6 + + + + False + False + 1 + + + + + False + 10 + 3 + + + + + False + + + + + True + General + True + + + tab + False + False + + + + + True + 6 + 6 + 2 + 2 + 5 + + + True + True + + + + 1 + 2 + 4 + 5 + + + + + + True + Jabber ID: + + + 4 + 5 + GTK_FILL + + + + + + True + E-Mail: + + + 5 + 6 + GTK_FILL + + + + + + True + True + + + + 1 + 2 + 5 + 6 + + + + + + True + Last Name: + + + 3 + 4 + GTK_FILL + + + + + + True + True + + + + 1 + 2 + 3 + 4 + + + + + + True + First Name: + + + 2 + 3 + GTK_FILL + + + + + + True + True + + + + 1 + 2 + 2 + 3 + + + + + + True + 0 + <b>Personal Information</b> + True + + + 2 + 1 + 2 + GTK_FILL + + + + + + True + 5 + + + True + 0 + <b>OpenPGP</b> + True + + + False + False + + + + + True + 6 + + + True + No key selected + + + False + False + + + + + True + + + 1 + + + + + True + True + Choose _Key... + True + + + + False + False + 2 + + + + + 1 + + + + + True + 6 + + + True + True + If checked, Gajim will store the password in ~/.gajim/config with 'read' permission only for you + Save _passphrase (insecure) + True + True + + + + False + False + + + + + True + False + True + False + * + + + + 1 + + + + + 2 + + + + + 2 + GTK_FILL + + + + + 1 + False + + + + + True + Personal Information + + + tab + 1 + False + False + + + + + 1 + + + + + 2 + False + + + + + + tab + + + + + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Mer_ge accounts + True + True + + + + False + 1 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + False + 2 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + GTK_BUTTONBOX_END + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-close + True + + + + + + False + 3 + + + + + diff --git a/data/glade/add_new_contact_window.glade b/data/glade/add_new_contact_window.glade index 3e9bdc8ae..cd10d283e 100644 --- a/data/glade/add_new_contact_window.glade +++ b/data/glade/add_new_contact_window.glade @@ -1,527 +1,335 @@ - - - + + + - - - 6 - Add New Contact - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - False - False - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - False - - - - - - True - False - 6 - - - - True - - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - False - 6 - - - - True - A_ccount: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - - False - True - - - 0 - False - False - - - - - - - - - 0 - True - True - - - - - - True - False - 6 - - - - True - _Protocol: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - uid_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - - False - True - - - - 0 - False - False - - - - - - True - - False - True - - - 0 - True - True - - - - - 0 - True - True - - - - - - 6 - True - 3 - 2 - False - 6 - 6 - - - - True - _User ID: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - uid_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - True - True - True - 0 - - True - * - True - - - - 1 - 2 - 0 - 1 - - - - - - - True - _Nickname: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - nickname_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - True - True - True - 0 - - True - * - True - - - 1 - 2 - 1 - 2 - - - - - - - True - _Group: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 2 - 3 - fill - - - - - - - True - - False - True - True - - - 1 - 2 - 2 - 3 - fill - - - - - 0 - False - True - - - - - - True - True - A_llow this contact to view my status - True - GTK_RELIEF_NORMAL - True - True - False - True - - - 0 - False - False - - - - - - 6 - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_ETCHED_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - True - GTK_JUSTIFY_LEFT - GTK_WRAP_WORD - True - 0 - 0 - 0 - 0 - 0 - 0 - I would like to add you to my contact list. - - - - - 0 - True - True - - - - - - True - False - 6 - - - - True - You have to register with this transport + + 6 + Add New Contact + False + + + + + True + 6 + + + True + + + False + False + + + + + True + 6 + + + True + 0 + A_ccount: + True + + + False + False + + + + + True + + + + False + False + 1 + + + + + + + + 1 + + + + + True + 6 + + + True + 0 + _Protocol: + True + uid_entry + + + False + False + + + + + True + + + + False + False + 1 + + + + + True + True + + + + 2 + + + + + 2 + + + + + True + True + 6 + 3 + 2 + 6 + 6 + + + True + 0 + _User ID: + True + uid_entry + + + GTK_FILL + + + + + + True + True + * + True + + + + 1 + 2 + + + + + + True + 0 + _Nickname: + True + nickname_entry + + + 1 + 2 + GTK_FILL + + + + + + True + True + * + True + + + 1 + 2 + 1 + 2 + + + + + + True + 0 + _Group: + True + + + 2 + 3 + GTK_FILL + + + + + + True + + + + + + + + 1 + 2 + 2 + 3 + GTK_FILL + + + + + False + 3 + + + + + True + True + A_llow this contact to view my status + True + 0 + True + True + + + False + False + 4 + + + + + True + True + True + 6 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_ETCHED_IN + + + True + True + GTK_WRAP_WORD + I would like to add you to my contact list. + + + + + 5 + + + + + True + True + 6 + + + True + 0 + You have to register with this transport to be able to add a contact from this protocol. Click on register button to proceed. - False - False - GTK_JUSTIFY_LEFT - True - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - True - True - - - - - - True - True - True - _Register - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - 0 - True - True - - - - - - True - You must be connected to the transport to be able + True + + + + + True + True + True + _Register + True + 0 + + + + False + False + 1 + + + + + 6 + + + + + True + True + You must be connected to the transport to be able to add a contact from this protocol. - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - 5 - True - GTK_BUTTONBOX_END - 12 - - - - True - True - True - gtk-cancel - True - GTK_RELIEF_NORMAL - True - - - - - - - True - True - True - True - gtk-add - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - False - False - - - - - - + + + False + False + 7 + + + + + True + 5 + 12 + GTK_BUTTONBOX_END + + + True + True + True + gtk-cancel + True + 0 + + + + + + True + True + True + True + gtk-add + True + 0 + + + + 1 + + + + + False + False + 8 + + + + + diff --git a/data/glade/advanced_notifications_window.glade b/data/glade/advanced_notifications_window.glade index 46c78b20c..eed865ceb 100644 --- a/data/glade/advanced_notifications_window.glade +++ b/data/glade/advanced_notifications_window.glade @@ -1,283 +1,188 @@ - - - + + + - - - 6 - Advanced Notifications Control - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - False - True - Advanced Notifications Control - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - False - - - - 12 - True - False - 12 - - - - True - False - 0 - - - - True - Hi SVN users ! This window does nothing for the moment. Discussions about this take place in ticket #1005. - False - False - GTK_JUSTIFY_LEFT - True - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - 0 - False - False - - - - - - True - False - 5 - - - - 90 - True - True - GTK_POLICY_NEVER - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - False - True - False - False - False - - - - - - 0 - False - False - - - - - - True - 1 - 0.5 - 1 - 1 - 0 - 0 - 212 - 0 - - - - True - False - 0 - - - - True - GTK_BUTTONBOX_DEFAULT_STYLE - 10 - - - - True - True - True - gtk-new - True - GTK_RELIEF_NORMAL - True - - - - - - - True - True - True - gtk-go-up - True - GTK_RELIEF_NORMAL - True - - - - - - - True - True - True - gtk-go-down - True - GTK_RELIEF_NORMAL - True - - - - - - - True - True - True - gtk-delete - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - True - False - - - - - - - 0 - False - False - - - - - 0 - True - True - - - - - - True - False - 5 - - - - True - <b>Conditions</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - False - 5 - - - - True - False - 5 - - - - True - When - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - Receive a Message + + 6 + Advanced Notifications Control + Advanced Notifications Control + False + True + + + True + 12 + 12 + + + True + + + True + Hi SVN users ! This window does nothing for the moment. Discussions about this take place in ticket #1005. + True + + + False + False + + + + + + + + False + False + + + + + True + 5 + + + 90 + True + True + GTK_POLICY_NEVER + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + + + + + + False + False + + + + + True + 1 + 212 + + + True + + + True + 10 + + + True + True + True + gtk-new + True + 0 + + + + + + True + True + True + gtk-go-up + True + 0 + + + + 1 + + + + + True + True + True + gtk-go-down + True + 0 + + + + 2 + + + + + True + True + True + gtk-delete + True + 0 + + + + 3 + + + + + False + + + + + + + False + False + 1 + + + + + 1 + + + + + True + 5 + + + True + <b>Conditions</b> + True + + + False + False + + + + + True + 5 + + + True + 5 + + + True + When + True + + + False + False + + + + + True + Receive a Message Contact Disconnected Contact Change Status Group Chat Message Highlight @@ -285,994 +190,679 @@ Group Chat Message Received File Transfer Request File Transfer Started File Transfer Finished - False - True - - - - 0 - False - False - - - - - 0 - True - True - - - - - - True - False - 5 - - - - True - for - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - contact(s) + + + + False + False + 1 + + + + + + + True + 5 + + + True + for + True + + + False + False + + + + + True + contact(s) group(s) everybody - False - True - - - - 0 - False - True - - - - - - True - True - True - True - 0 - - True - * - False - - - - 0 - True - True - - - - - 0 - True - True - - - - - - True - False - 0 - - - - True - when I'm in - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - False - 3 - - - - True - True - All statuses - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - One or more special statuses... - True - GTK_RELIEF_NORMAL - True - False - False - True - all_status_rb - - - 0 - False - False - - - - - - True - True - Online / Free For Chat - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - Away - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - Not Available - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - Busy - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - Invisible - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - 0 - True - True - - - - - 0 - True - True - - - - - - True - False - 0 - - - - True - and I - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - True - Have - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - Don't have - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - a window/tab opened with that contact - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - 0 - True - True - - - - - 0 - True - True - - - - - - True - <b>Actions</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - True - False - 6 - - - - True - True - _Inform me with a popup window - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - _Disable existing popup window - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 6 - - - - True - True - 6 - - - - True - True - Play a sound - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - True - True - - - - - - True - False - False - 6 - - - - True - True - True - True - 0 - - True - * - False - - - - 0 - True - True - - - - - - True - True - ... - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - gtk-media-play - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - 0 - True - True - - - - - 0 - False - False - - - - - - True - True - _Disable existing sound for this event - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - - - - - True - <b>Sounds</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - label_item - - - - - 0 - True - True - - - - - - True - False - 6 - - - - True - True - _Open chat window with user - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - _Disable auto opening chat window - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - 0 - True - True - - - - - - True - True - True - 0 - - - - True - False - 5 - - - - True - False - 6 - - - - True - True - Launch a command - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - True - - - - - - True - False - True - True - True - 0 - - True - * - False - - - - 0 - True - True - - - - - 0 - False - False - - - - - - True - False - 6 - - - - True - True - _Show event in systray - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - _Disable showing event in systray - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - 0 - True - True - - - - - - True - False - 6 - - - - True - True - _Show event in roster - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - _Disable showing event in roster - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - 0 - True - True - - - - - - True - True - _Activate window manager's UrgencyHint to make chat window in taskbar flash - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - - - True - Advanced Actions - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - True - True - - - - - 0 - True - True - - - - - - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 413 - 0 - - - - True - True - True - gtk-close - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - False - True - - - - - - + + + + False + 1 + + + + + True + True + True + * + + + + 2 + + + + + 1 + + + + + True + + + True + when I'm in + True + + + False + False + + + + + True + 3 + + + True + True + All statuses + True + 0 + True + + + + False + False + + + + + True + True + One or more special statuses... + True + 0 + True + all_status_rb + + + False + False + 1 + + + + + True + True + True + Online / Free For Chat + True + 0 + True + + + + False + False + 2 + + + + + True + True + True + Away + True + 0 + True + + + + False + False + 3 + + + + + True + True + True + Not Available + True + 0 + True + + + + False + False + 4 + + + + + True + True + True + Busy + True + 0 + True + + + + False + False + 5 + + + + + True + True + True + Invisible + True + 0 + True + + + + False + False + 6 + + + + + 1 + + + + + 2 + + + + + True + + + True + and I + True + + + False + False + + + + + True + True + Have + True + 0 + True + + + + False + False + 1 + + + + + True + True + Don't have + True + 0 + True + + + + False + False + 2 + + + + + True + a window/tab opened with that contact + True + + + False + False + 3 + + + + + 3 + + + + + 1 + + + + + True + <b>Actions</b> + True + + + False + False + 2 + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + + + True + True + _Inform me with a popup window + True + 0 + True + + + + False + False + + + + + True + True + _Disable existing popup window + True + 0 + True + + + + False + False + 1 + + + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 6 + + + True + 6 + True + + + True + True + Play a sound + True + 0 + True + + + + + + True + False + 6 + + + True + True + * + + + + + + True + True + ... + True + 0 + + + + False + False + 1 + + + + + True + True + 0 + + + + True + gtk-media-play + + + + + False + False + 2 + + + + + 1 + + + + + False + False + + + + + True + True + _Disable existing sound for this event + True + 0 + True + + + + False + False + 1 + + + + + + + + + True + <b>Sounds</b> + True + + + label_item + + + + + label_item + + + + + 3 + + + + + True + 6 + + + True + True + _Open chat window with user + True + 0 + True + + + + False + False + + + + + True + True + _Disable auto opening chat window + True + 0 + True + + + + False + False + 1 + + + + + 4 + + + + + True + True + True + + + True + 5 + + + True + 6 + + + True + True + Launch a command + True + 0 + True + + + + False + + + + + True + False + True + * + + + + 1 + + + + + False + False + + + + + True + 6 + + + True + True + _Show event in systray + True + 0 + True + + + + False + False + + + + + True + True + _Disable showing event in systray + True + 0 + True + + + + False + False + 1 + + + + + 1 + + + + + True + 6 + + + True + True + _Show event in roster + True + 0 + True + + + + False + False + + + + + True + True + _Disable showing event in roster + True + 0 + True + + + + False + False + 1 + + + + + 2 + + + + + True + True + _Activate window manager's UrgencyHint to make chat window in taskbar flash + True + 0 + True + + + + False + False + 3 + + + + + + + True + Advanced Actions + + + label_item + + + + + 5 + + + + + 2 + + + + + True + 413 + + + True + True + True + gtk-close + True + 0 + + + + + + False + 3 + + + + + diff --git a/data/glade/chat_control_popup_menu.glade b/data/glade/chat_control_popup_menu.glade index b6a696355..c3ebb1e24 100644 --- a/data/glade/chat_control_popup_menu.glade +++ b/data/glade/chat_control_popup_menu.glade @@ -65,16 +65,6 @@ - - - True - _Compact View Alt+C - True - False - - - - True diff --git a/data/glade/features_window.glade b/data/glade/features_window.glade new file mode 100644 index 000000000..7f8db0b9d --- /dev/null +++ b/data/glade/features_window.glade @@ -0,0 +1,116 @@ + + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 12 + Features + 300 + 530 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + <b>List of possible features in Gajim:</b> + True + + + False + False + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_OUT + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + + + + + + 1 + + + + + True + 3 + 0 + GTK_SHADOW_NONE + + + True + 6 + 0 + 0.5 + 12 + + + True + 0 + True + + + + + + + True + <b>Description</b> + True + + + label_item + + + + + False + 3 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + GTK_BUTTONBOX_END + + + True + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-close + True + 0 + + + + + + False + GTK_PACK_END + 2 + + + + + + diff --git a/data/glade/filetransfers.glade b/data/glade/filetransfers.glade index cc629da4e..3106b3663 100644 --- a/data/glade/filetransfers.glade +++ b/data/glade/filetransfers.glade @@ -1,392 +1,281 @@ - - - + + + - - - 12 - File Transfers - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - True - False - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - False - - File Transfers - Shows a list of file transfers between you and others - - - - - - - True - False - 6 - - - - 460 - 150 - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - True - False - False - False - False - False - - file transfers list - A list of active, completed and stopped file transfers - - - - - - - - - - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_END - 6 - - - - True - False - Removes completed, cancelled and failed file transfers from the list - True - True - GTK_RELIEF_NORMAL - True - - Remove file transfer from the list. - This action removes single file transfer from the list. If the transfer is active, it is first stopped and then removed - - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-clear - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - Clean _up - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - - - - True - False - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-media-pause - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Pause - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - - - - True - False - Cancels the selected file transfer and removes incomplete file - True - True - gtk-cancel - True - GTK_RELIEF_NORMAL - True - - Cancel file transfer - Cancels the selected file transfer - - - - - - - - True - Hides the window - True - True - True - gtk-close - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - False - True - GTK_PACK_END - - - - - - True - True - _Notify me when a file transfer is complete - True - GTK_RELIEF_NORMAL - True - False - False - True - - When a file transfer is complete show a popup notification - - - - - 0 - False - False - - - - - - - - - - - gtk-remove - True - - - - - - - _Continue - True - - - - - True - gtk-media-play - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - _Pause - True - - - - - True - gtk-media-pause - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - gtk-cancel - True - - - - - - - True - - - - - - _Open Containing Folder - True - - - - - True - gtk-directory - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - + + 12 + File Transfers + + File Transfers + Shows a list of file transfers between you and others + + + + + + True + 6 + + + 460 + 150 + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + True + False + + file transfers list + A list of active, completed and stopped file transfers + + + + + + + + + + + + + + True + True + _Notify me when a file transfer is complete + True + 0 + True + + When a file transfer is complete show a popup notification + + + + + False + False + 2 + + + + + True + 6 + GTK_BUTTONBOX_END + + + True + False + True + True + Removes completed, cancelled and failed file transfers from the list + 0 + + Remove file transfer from the list. + This action removes single file transfer from the list. If the transfer is active, it is first stopped and then removed + + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-clear + + + False + False + + + + + True + Clean _up + True + + + False + False + 1 + + + + + + + + + + + True + False + True + True + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-media-pause + + + False + False + + + + + True + _Pause + True + + + False + False + 1 + + + + + + + + + 1 + + + + + True + False + True + True + Cancels the selected file transfer and removes incomplete file + gtk-cancel + True + 0 + + Cancel file transfer + Cancels the selected file transfer + + + + + 2 + + + + + True + True + True + True + Hides the window + gtk-close + True + 0 + + + + 3 + + + + + False + GTK_PACK_END + 1 + + + + + + + + + gtk-remove + True + True + + + + + + True + _Continue + True + + + + True + gtk-media-play + 1 + + + + + + + _Pause + True + + + + True + gtk-media-pause + 1 + + + + + + + gtk-cancel + True + True + + + + + + True + + + + + _Open Containing Folder + True + + + + True + gtk-missing-image + 1 + + + + + diff --git a/data/glade/gajim_themes_window.glade b/data/glade/gajim_themes_window.glade index e64f4402c..db8d7d13e 100644 --- a/data/glade/gajim_themes_window.glade +++ b/data/glade/gajim_themes_window.glade @@ -408,7 +408,7 @@ Chat Banner - + True 9 2 diff --git a/data/glade/gc_control_popup_menu.glade b/data/glade/gc_control_popup_menu.glade index 1f5918e80..2c2e665e7 100644 --- a/data/glade/gc_control_popup_menu.glade +++ b/data/glade/gc_control_popup_menu.glade @@ -10,17 +10,17 @@ True - gtk-redo + gtk-edit 1 - + True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - _Manage room + _Manage Room True @@ -60,7 +60,7 @@ True - _Destroy room + _Destroy Room True @@ -73,30 +73,25 @@ - - - - - _Compact View Alt+C - True - - - - - True - _Minimize - True - + True - gtk-goto-bottom + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-properties 1 - + + True + _Minimize on close + True + + + + True @@ -113,6 +108,11 @@ + + + True + + Click to see past conversation in this room diff --git a/data/glade/gc_occupants_menu.glade b/data/glade/gc_occupants_menu.glade index 15a90c35b..044a6bb4f 100644 --- a/data/glade/gc_occupants_menu.glade +++ b/data/glade/gc_occupants_menu.glade @@ -17,20 +17,6 @@ - - - True - _Add to Roster - True - - - True - gtk-add - 1 - - - - True @@ -101,6 +87,39 @@ + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Send _File + True + + + gtk-save + 1 + + + + + + + True + + + + + True + _Add to Roster + True + + + True + gtk-add + 1 + + + + True diff --git a/data/glade/history_manager.glade b/data/glade/history_manager.glade index 49225bf27..2d7802f95 100644 --- a/data/glade/history_manager.glade +++ b/data/glade/history_manager.glade @@ -1,392 +1,249 @@ - - - + + + - - - 6 - Gajim History Logs Manager - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - 650 - 500 - True - False - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - - - - - True - False - 6 - - - - True - True - 200 - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - True - False - True - False - False - False - - - - - - - True - False - - - - - - True - False - 0 - - - - True - <big><b>Welcome to Gajim History Logs Manager</b></big> + + 6 + Gajim History Logs Manager + 650 + 500 + + + + True + 6 + + + True + True + 200 + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + True + + + + + + + False + True + + + + + True + + + True + 0 + <big><b>Welcome to Gajim History Logs Manager</b></big> You can select logs from the left and/or search database from below. <b>WARNING:</b> If you plan to do massive deletions, please make sure Gajim is not running. Generally avoid deletions with contacts you currently chat with. - False - True - GTK_JUSTIFY_LEFT - True - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - True - True - - - - - - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - True - False - False - False - False - False - - - - - - - 0 - True - True - - - - - - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - True - False - True - False - False - False - - - - - - - 0 - True - True - - - - - True - True - - - - - 0 - True - True - - - - - - True - False - 6 - - - - True - True - True - True - 0 - - True - * - True - - - 0 - True - True - - - - - - True - True - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-find - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Search Database - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - 0 - False - False - - - - - 0 - False - True - - - - - - - - - - - True - Export - True - - - - - - - True - Delete - True - - - - True - gtk-remove - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - GTK_FILE_CHOOSER_ACTION_SAVE - True - False - False - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - True - False - True - False - False - GDK_WINDOW_TYPE_HINT_DIALOG - GDK_GRAVITY_NORTH_WEST - True - - - - True - False - 24 - - - - True - GTK_BUTTONBOX_END - - - - True - True - True - gtk-cancel - True - GTK_RELIEF_NORMAL - True - -6 - - - - - - True - True - True - True - gtk-save - True - GTK_RELIEF_NORMAL - True - -5 - - - - - 0 - False - True - GTK_PACK_END - - - - - - + True + True + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + True + False + + + + + + + 1 + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + True + + + + + + + 2 + + + + + True + True + + + + + + + True + 6 + + + True + True + * + True + + + + + True + True + True + True + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-find + + + False + False + + + + + True + _Search Database + True + + + False + False + 1 + + + + + + + + + False + False + 1 + + + + + False + 1 + + + + + + + + + True + Export + True + + + + + + True + Delete + True + + + True + gtk-remove + 1 + + + + + + + GDK_WINDOW_TYPE_HINT_DIALOG + GTK_FILE_CHOOSER_ACTION_SAVE + + + True + 24 + + + True + GTK_BUTTONBOX_END + + + True + True + True + gtk-cancel + True + -6 + + + + + True + True + True + True + gtk-save + True + -5 + + + 1 + + + + + False + GTK_PACK_END + + + + + diff --git a/data/glade/manage_bookmarks_window.glade b/data/glade/manage_bookmarks_window.glade index 4dab0c5a6..26e168033 100644 --- a/data/glade/manage_bookmarks_window.glade +++ b/data/glade/manage_bookmarks_window.glade @@ -1,499 +1,323 @@ - - - + + + - - - 12 - Manage Bookmarks - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - 550 - 300 - True - False - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - False - - - - - True - False - 12 - - - - True - False - 12 - - - - True - False - 6 - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - False - False - False - True - False - False - False - - - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_END - 6 - - - - True - True - True - gtk-add - True - GTK_RELIEF_NORMAL - True - - - - - - - True - True - True - gtk-remove - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - False - True - - - - - 0 - True - True - - - - - - True - 7 - 2 - False - 6 - 12 - - - - True - If checked, Gajim will join this group chat on startup - True - Auto join - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - 2 - 5 - 6 - fill - - - - - - - True - Password: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 4 - 5 - fill - - - - - - - True - True - True - False - 0 - - True - * - False - - - 1 - 2 - 4 - 5 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 3 - 4 - - - - - - - True - Server: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 3 - 4 - fill - - - - - - - True - Room: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 2 - 3 - fill - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 2 - 3 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 1 - 2 - - - - - - - True - Nickname: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - Title: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 0 - 1 - - - - - - - True - Print status: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 6 - 7 - fill - - - - - - - True - - False - True - - - - 1 - 2 - 6 - 7 - fill - fill - - - - - 0 - False - True - - - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_END - 12 - - - - True - True - True - gtk-cancel - True - GTK_RELIEF_NORMAL - True - - - - - - - True - True - True - gtk-ok - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - False - True - - - - - - + + 12 + Manage Bookmarks + 550 + 300 + + + + True + 12 + + + True + 12 + + + True + 6 + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + False + + + + + + + True + 6 + GTK_BUTTONBOX_END + + + True + True + True + gtk-add + True + + + + + + True + True + True + gtk-remove + True + + + + 1 + + + + + False + 1 + + + + + + + True + 7 + 2 + 12 + 6 + + + True + 0 + Password: + + + 4 + 5 + GTK_FILL + + + + + + True + True + False + * + + + 1 + 2 + 4 + 5 + + + + + + True + True + * + + + 1 + 2 + 3 + 4 + + + + + + True + 0 + Server: + + + 3 + 4 + GTK_FILL + + + + + + True + 0 + Room: + + + 2 + 3 + GTK_FILL + + + + + + True + True + * + + + 1 + 2 + 2 + 3 + + + + + + True + True + * + + + 1 + 2 + 1 + 2 + + + + + + True + 0 + Nickname: + + + 1 + 2 + GTK_FILL + + + + + + True + 0 + Title: + + + GTK_FILL + + + + + + True + True + * + + + 1 + 2 + + + + + + True + 0 + Print status: + + + 6 + 7 + GTK_FILL + + + + + + True + + + + + 1 + 2 + 6 + 7 + GTK_FILL + GTK_FILL + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + If checked, Gajim will join this group chat on startup + Auto join + True + True + + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Minimize on Auto Join + True + True + + + + 1 + + + + + 2 + 5 + 6 + + + + + False + 1 + + + + + + + True + 12 + GTK_BUTTONBOX_END + + + True + True + True + gtk-cancel + True + + + + + + True + True + True + gtk-ok + True + + + + 1 + + + + + False + 1 + + + + + diff --git a/data/glade/message_window.glade b/data/glade/message_window.glade index ad23fad7b..77d9028b1 100644 --- a/data/glade/message_window.glade +++ b/data/glade/message_window.glade @@ -591,7 +591,7 @@ Status message 0.5 0 0 - PANGO_ELLIPSIZE_NONE + PANGO_ELLIPSIZE_END -1 False 0 diff --git a/data/glade/preferences_window.glade b/data/glade/preferences_window.glade index 82165ef7c..f82682c62 100644 --- a/data/glade/preferences_window.glade +++ b/data/glade/preferences_window.glade @@ -1,3384 +1,2166 @@ - - - + + + - - - 6 - Preferences - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - True - False - preferences - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - False - - - - - - True - False - 6 - - - - True - True - True - False - GTK_POS_TOP - False - False - - - - 12 - True - False - 6 - - - - True - Use t_rayicon (aka. notification area icon) - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - If checked, Gajim will remember the roster and chat window positions in the screen and the sizes of them next time you run it - True - Save _position and size for roster and chat windows - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - If checked, Gajim will display avatars of contacts in roster window and in group chats - True - Display a_vatars of contacts in roster - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - If checked, Gajim will display status messages of contacts under the contact name in roster window and in group chats - True - Display status _messages of contacts in roster - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - _Sort contacts by status - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 4 - 0 - 12 - 0 - - - - True - False - 12 - - - - True - False - 12 - - - - True - Default status _iconset: - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - iconset_combobox - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - False - True - - - - 0 - False - True - - - - - - True - 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, etc...) - True - Use _transports iconsets - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - True - - - - - 0 - True - True - - - - - - True - False - 12 - - - - True - T_heme: - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - theme_combobox - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - False - True - - - - 0 - False - True - - - - - - True - Configure color and font of the interface - True - Ma_nage... - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - 0 - True - True - - - - - - - - - - True - <b>Interface Customization</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 12 - False - True - - - - - False - True - - - - - - True - General - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 12 - True - False - 6 - - - - True - False - 5 - - - - True - One message _window: - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 1 - 0 - one_window_type_combobox - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - Never + + 6 + Preferences + preferences + + + + + True + 6 + + + True + True + False + + + True + 12 + 6 + + + True + Use t_rayicon (aka. notification area icon) + True + 0 + True + + + + False + False + + + + + True + True + If checked, Gajim will remember the roster and chat window positions in the screen and the sizes of them next time you run it + Save _position and size for roster and chat windows + True + 0 + True + + + + False + False + 1 + + + + + True + True + If checked, Gajim will display avatars of contacts in roster window and in group chats + Display a_vatars of contacts in roster + True + 0 + True + + + + False + False + 2 + + + + + True + True + If checked, Gajim will display status messages of contacts under the contact name in roster window and in group chats + Display status _messages of contacts in roster + True + 0 + True + + + + False + False + 3 + + + + + True + True + _Sort contacts by status + True + 0 + True + + + + False + False + 4 + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 4 + 12 + + + True + 12 + + + True + 12 + + + True + Default status _iconset: + True + iconset_combobox + + + False + False + + + + + True + + + + False + 1 + + + + + True + True + 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, etc...) + Use _transports iconsets + True + 0 + True + + + + False + 2 + + + + + + + True + 12 + + + True + T_heme: + True + theme_combobox + + + False + False + + + + + True + + + + False + 1 + + + + + True + True + Configure color and font of the interface + Ma_nage... + True + 0 + + + + False + False + 2 + + + + + 1 + + + + + + + + + True + <b>Interface Customization</b> + True + + + label_item + + + + + False + 12 + 5 + + + + + False + + + + + True + General + + + tab + False + False + + + + + True + 12 + 6 + + + True + 5 + + + True + 1 + One message _window: + True + one_window_type_combobox + + + False + False + + + + + True + Never Always Per account Per type - False - True - - - - 0 - False - False - - - - - 0 - False - True - - - - - - True - _Highlight misspelled words - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text. - True - Ignore rich content in incoming messages - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - False - 5 - - - - True - Treat all incoming messages as: - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 1 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - Determined by sender + + + + False + False + 1 + + + + + False + + + + + True + Hides buttons in chatwindows to + _Make message windows compact + True + 0 + True + + + + False + False + 1 + + + + + True + True + Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text. + Ignore rich content in incoming messages + True + 0 + True + + + + False + False + 2 + + + + + True + _Highlight misspelled words + True + 0 + True + + + + False + False + 3 + + + + + True + 4 + + + True + 1 + Treat all incoming messages as: + + + False + False + + + + + True + Determined by sender Chat message Single message - False - True - - - - 0 - False - False - - - - - 0 - False - True - - - - - - True - False - 5 - - - - True - If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons - True - False - - - - True - Emoticons: - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 1 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - 0 - False - False - - - - - - True - False - True - - - - 0 - False - True - - - - - 0 - False - True - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 12 - - - - True - False - 6 - - - - True - Print time: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - True - On every _message - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - Also known as iChat style - True - E_very 5 minutes - True - GTK_RELIEF_NORMAL - True - False - False - True - time_always_radiobutton - - - - 0 - False - False - - - - - - True - True - _Never - True - GTK_RELIEF_NORMAL - True - False - False - True - time_always_radiobutton - - - - 0 - False - False - - - - - 0 - False - True - - - - - - True - 4 - 4 - False - 6 - 12 - - - - True - _Incoming message: - True - False - GTK_JUSTIFY_CENTER - True - False - 0 - 0.5 - 0 - 0 - incoming_msg_colorbutton - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - True - True - True - True - False - True - - - - 1 - 2 - 0 - 1 - - - - - - - - True - _Outgoing message: - True - False - GTK_JUSTIFY_CENTER - True - False - 0 - 0.5 - 0 - 0 - outgoing_msg_colorbutton - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - fill - - - - - - - True - True - False - True - - - - 3 - 4 - 0 - 1 - fill - - - - - - - True - _Status message: - True - False - GTK_JUSTIFY_CENTER - True - False - 0 - 0.5 - 0 - 0 - status_msg_colorbutton - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - True - False - True - - - - 1 - 2 - 1 - 2 - - - - - - - - True - _URL: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - url_msg_colorbutton - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 1 - 2 - fill - - - - - - - True - True - False - True - - - - 3 - 4 - 1 - 2 - fill - - - - - - - True - False - 0 - - - - True - - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - True - False - - - - - - True - True - GTK_RELIEF_NORMAL - False - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-revert-to-saved - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Reset to Default Colors - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - 0 - False - False - - - - - 0 - 4 - 2 - 3 - fill - - - - - - True - False - 6 - - - - True - _Font: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - conversation_fontbutton - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - True - True - - - - - - True - True - True - True - False - False - True - - - - 0 - False - True - - - - - 0 - 2 - 3 - 4 - fill - - - - - - True - True - Use system _default - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 2 - 4 - 3 - 4 - fill - - - - - - 0 - False - True - - - - - - - - - - True - <b>Format of a line</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - False - False - - - - - False - True - - - - - - True - Chat - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 12 - True - False - 12 - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 6 - - - - 2 - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - 3 - True - False - 6 - - - - True - Gajim will notify you for new events via a popup in the bottom right of the screen - True - _Notify me about it - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - Gajim will automatically show new events by popping up the relevant window - True - _Pop it up - True - GTK_RELIEF_NORMAL - True - False - False - True - notify_on_new_message_radiobutton - - - - 0 - False - False - - - - - - True - Gajim will only change the icon of the contact that triggered the new event - True - Show only in _roster - True - GTK_RELIEF_NORMAL - True - False - False - True - notify_on_new_message_radiobutton - - - - 0 - False - False - - - - - - - - - - True - When a new event (message, file transfer request etc..) is received, the following methods may be used to inform you about it. Please note that events about new messages only occur if it is a new message from a contact you are not already chatting with - True - False - - - - True - When new event is received - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - label_item - - - - - 0 - False - False - - - - - - True - False - 6 - - - - True - Notify me about contacts that: - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed in - True - Sign _in - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed out - True - Sign _out - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - 0 - False - True - - - - - - True - True - Allow popup/notifications when I'm _away/na/busy/invisible - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - False - 0 - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-open - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Advanced Notifications Control... - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - 0 - False - False - - - - - - - - - - - - - 0 - True - True - - - - - - - - - - True - <b>Visual Notifications</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - False - False - - - - - - True - Check this option, only if someone you don't have in the roster spams/annoys you. Use with caution, because it blocks all messages from any contact that is not in the roster - True - _Ignore events from contacts not in the roster - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - False - 12 - - - - True - 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 send to the other party. - True - False - - - - True - Outgoing Chat state noti_fications: - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - 0 - False - False - - - - - - True - All chat states + + + + False + False + 1 + + + + + False + 4 + + + + + True + 5 + + + True + If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons + + + True + 1 + Emoticons: + + + + + False + False + + + + + True + + + + False + 1 + + + + + False + 5 + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 12 + + + True + 6 + + + True + 0 + Print time: + + + False + False + + + + + True + True + On every _message + True + 0 + True + + + + False + False + 1 + + + + + True + True + Also known as iChat style + E_very 5 minutes + True + 0 + True + time_always_radiobutton + + + + False + False + 2 + + + + + True + True + _Never + True + 0 + True + time_always_radiobutton + + + + False + False + 3 + + + + + False + + + + + True + 4 + 4 + 12 + 6 + + + True + True + Use system _default + True + 0 + True + + + + 2 + 4 + 3 + 4 + GTK_FILL + + + + + + True + 6 + + + True + 0 + _Font: + True + conversation_fontbutton + + + + + True + True + 0 + + + + False + 1 + + + + + 2 + 3 + 4 + GTK_FILL + + + + + True + + + True + + + False + + + + + True + True + False + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-revert-to-saved + + + False + False + + + + + True + _Reset to Default Colors + True + + + False + False + 1 + + + + + + + + + False + False + 1 + + + + + 4 + 2 + 3 + GTK_FILL + + + + + True + True + 0 + + + + 3 + 4 + 1 + 2 + GTK_FILL + + + + + + True + 0 + _URL: + True + url_msg_colorbutton + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + + True + True + 0 + + + + 1 + 2 + 1 + 2 + + + + + + + True + 0 + _Status message: + True + GTK_JUSTIFY_CENTER + True + status_msg_colorbutton + + + 1 + 2 + GTK_FILL + + + + + + True + True + 0 + + + + 3 + 4 + GTK_FILL + + + + + + True + 0 + _Outgoing message: + True + GTK_JUSTIFY_CENTER + True + outgoing_msg_colorbutton + + + 2 + 3 + GTK_FILL + + + + + + True + True + True + True + True + 0 + + + + 1 + 2 + + + + + + + True + 0 + _Incoming message: + True + GTK_JUSTIFY_CENTER + True + incoming_msg_colorbutton + + + GTK_FILL + + + + + + False + 1 + + + + + + + + + True + <b>Format of a line</b> + True + + + label_item + + + + + False + False + 6 + + + + + 1 + False + + + + + True + Chat + + + tab + 1 + False + False + + + + + True + 12 + 12 + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 6 + + + True + 2 + 0 + GTK_SHADOW_NONE + + + True + 12 + + + True + 3 + 6 + + + True + True + Gajim will notify you for new events via a popup in the bottom right of the screen + _Notify me about it + True + 0 + True + + + + False + False + + + + + True + True + Gajim will automatically show new events by popping up the relevant window + _Pop it up + True + 0 + True + notify_on_new_message_radiobutton + + + + False + False + 1 + + + + + True + True + Gajim will only change the icon of the contact that triggered the new event + Show only in _roster + True + 0 + True + notify_on_new_message_radiobutton + + + + False + False + 2 + + + + + + + + + True + When a new event (message, file transfer request etc..) is received, the following methods may be used to inform you about it. Please note that events about new messages only occur if it is a new message from a contact you are not already chatting with + + + True + When new event is received + + + + + label_item + + + + + False + False + + + + + True + 6 + + + True + Notify me about contacts that: + + + False + False + + + + + True + True + Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed in + Sign _in + True + 0 + True + + + + False + False + 1 + + + + + True + True + Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed out + Sign _out + True + 0 + True + + + + False + False + 2 + + + + + False + 1 + + + + + True + True + Allow popup/notifications when I'm _away/na/busy/invisible + True + 0 + True + + + + False + False + 2 + + + + + True + True + + + True + True + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-open + + + False + False + + + + + True + _Advanced Notifications Control... + True + + + False + False + 1 + + + + + + + + + False + False + + + + + + + + + + + 3 + + + + + + + + + True + <b>Visual Notifications</b> + True + + + label_item + + + + + False + False + + + + + True + True + Check this option, only if someone you don't have in the roster spams/annoys you. Use with caution, because it blocks all messages from any contact that is not in the roster + _Ignore events from contacts not in the roster + True + 0 + True + + + + False + False + 1 + + + + + True + 12 + + + True + 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 send to the other party. + + + True + Outgoing Chat state noti_fications: + True + + + + + False + False + + + + + True + All chat states Composing only Disabled - False - True - - - - 0 - False - True - - - - - 0 - False - False - - - - - - True - False - 12 - - - - True - 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 display in chat windows. - True - False - - - - True - Displayed Chat state noti_fications: - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - 0 - False - False - - - - - - True - All chat states + + + + False + 1 + + + + + False + False + 2 + + + + + True + 12 + + + True + 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 display in chat windows. + + + True + Displayed Chat state noti_fications: + True + + + + + False + False + + + + + True + All chat states Composing only Disabled - False - True - - - - 0 - False - True - - - - - 0 - False - False - - - - - - True - True - False - 0 - - - - True - False - 6 - - - - True - True - 6 - - - - True - True - Play _sounds - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - True - True - - - - - - False - 5 - - - - True - _Player: - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - soundplayer_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - True - True - - - - - - True - True - True - True - 0 - - True - * - False - - - - 0 - True - True - - - - - 0 - True - True - - - - - 0 - False - False - - - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - False - True - False - False - False - - - - - - 0 - True - True - - - - - - True - False - 6 - - - - True - True - True - True - 0 - - True - * - False - - - - 0 - True - True - - - - - - True - True - ... - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - gtk-media-play - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - 0 - False - True - - - - - - - - True - <b>Sounds</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - True - True - - - - - False - True - - - - - - True - Events - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 12 - True - False - 12 - - - - True - 2 - 4 - False - 6 - 12 - - - - True - True - Auto _away after: - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - True - Auto _not available after: - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - minutes - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - fill - - - - - - - True - minutes - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 1 - 2 - fill - - - - - - - True - 1 - 0.5 - 0 - 1 - 0 - 0 - 0 - 0 - - - - 50 - True - True - 1 - 0 - False - GTK_UPDATE_ALWAYS - False - False - 12 1 720 1 10 10 - - - - - - 1 - 2 - 0 - 1 - fill - fill - - - - - - True - 1 - 0.5 - 0 - 1 - 0 - 0 - 0 - 0 - - - - 50 - True - True - 1 - 0 - False - GTK_UPDATE_ALWAYS - False - False - 20 1 1440 1 10 10 - - - - - - 1 - 2 - 1 - 2 - fill - fill - - - - - - True - The auto away status message - True - True - True - 0 - - True - * - False - - - - 3 - 4 - 0 - 1 - - - - - - - True - The auto not available status message - True - True - True - 0 - - True - * - False - - - - 3 - 4 - 1 - 2 - - - - - - 0 - False - True - - - - - - True - False - 6 - - - - True - Ask status message when I: - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - False - 14 - - - - True - True - Sign _in - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - Sign _out - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - 0 - False - False - - - - - 0 - False - False - - - - - - True - Works for Rhythmbox and Muine players. For more players, please visit http://trac.gajim.org/wiki/GajimAndMusicPlayer - True - Set status message to reflect currently playing _music track - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - An example: If you have enabled status message for away, Gajim won't ask you anymore for a status message when you change your status to away; it will use the default one set here - True - False - - - - True - True - False - 0 - - - - - 6 - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - False - True - False - False - False - - - - - - - - True - Default Status Messages - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - - - 0 - False - True - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 6 - - - - True - False - 6 - - - - 5 - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - False - False - False - True - False - False - False - - - - - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_START - 0 - - - - 5 - True - True - True - gtk-new - True - GTK_RELIEF_NORMAL - True - - - - - - - 5 - True - True - True - gtk-delete - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - False - True - - - - - 0 - True - True - - - - - - 5 - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - True - GTK_JUSTIFY_LEFT - GTK_WRAP_NONE - True - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - 0 - False - False - - - - - - - - - - True - <b>Preset Status Messages</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - True - True - - - - - False - True - - - - - - True - Status - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 12 - True - False - 6 - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 6 - - - - True - Autodetect on every Gajim startup + + + + False + 1 + + + + + False + False + 3 + + + + + True + True + + + True + 6 + + + True + 6 + True + + + True + True + Play _sounds + True + 0 + True + + + + + + 5 + + + True + _Player: + True + soundplayer_entry + + + + + True + True + + + + 1 + + + + + 1 + + + + + False + False + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + + + + + + 1 + + + + + True + 6 + + + True + True + + + + + + True + True + ... + True + 0 + + + + False + False + 1 + + + + + True + True + 0 + + + + True + gtk-media-play + + + + + False + False + 2 + + + + + False + 2 + + + + + + + True + <b>Sounds</b> + True + + + label_item + + + + + 4 + + + + + 2 + False + + + + + True + Events + + + tab + 2 + False + False + + + + + True + 12 + 12 + + + True + 2 + 4 + 12 + 6 + + + True + True + The auto not available status message + + + + 3 + 4 + 1 + 2 + + + + + + True + True + The auto away status message + + + + 3 + 4 + + + + + + True + 1 + 0 + + + 50 + True + True + 20 1 1440 1 10 10 + 1 + + + + + + 1 + 2 + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + 1 + 0 + + + 50 + True + True + 12 1 720 1 10 10 + 1 + + + + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + 0 + minutes + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + + True + 0 + minutes + + + 2 + 3 + GTK_FILL + + + + + + True + True + Auto _not available after: + True + 0 + True + + + + 1 + 2 + GTK_FILL + + + + + + True + True + Auto _away after: + True + 0 + True + + + + GTK_FILL + + + + + + False + + + + + True + 6 + + + True + Ask status message when I: + + + False + False + + + + + True + 14 + + + True + True + Sign _in + True + 0 + True + + + + False + False + + + + + True + True + Sign _out + True + 0 + True + + + + False + False + 1 + + + + + False + False + 1 + + + + + False + False + 1 + + + + + True + True + Works for Rhythmbox and Muine players. For more players, please visit http://trac.gajim.org/wiki/GajimAndMusicPlayer + Set status message to reflect currently playing _music track + True + 0 + True + + + + False + False + 2 + + + + + True + An example: If you have enabled status message for away, Gajim won't ask you anymore for a status message when you change your status to away; it will use the default one set here + + + True + True + + + + True + True + 6 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + + + + + + + True + Default Status Messages + + + label_item + + + + + + + False + 3 + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 6 + + + True + 6 + + + True + True + 5 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + False + + + + + + + + + True + GTK_BUTTONBOX_START + + + True + True + True + 5 + gtk-new + True + 0 + + + + + + True + True + True + 5 + gtk-delete + True + 0 + + + + 1 + + + + + False + 1 + + + + + + + True + True + 5 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + + + + + False + False + 1 + + + + + + + + + True + <b>Preset Status Messages</b> + True + + + label_item + + + + + 4 + + + + + 3 + False + + + + + True + Status + + + tab + 3 + False + False + + + + + True + 12 + 6 + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 6 + + + True + Autodetect on every Gajim startup Always use GNOME default applications Always use KDE default applications Always use XFCE4 default applications Custom - False - True - - - - 0 - True - True - - - - - - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - 3 - 2 - False - 6 - 12 - - - - True - _Browser: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - custom_browser_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - _Mail client: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - custom_mail_client_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - True - True - True - 0 - - True - * - False - - - - 1 - 2 - 1 - 2 - - - - - - - True - True - True - True - 0 - - True - * - False - - - - 1 - 2 - 0 - 1 - - - - - - - True - _File manager: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - custom_file_manager_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 2 - 3 - fill - - - - - - - True - True - True - True - 0 - - True - * - False - - - - 1 - 2 - 2 - 3 - - - - - - - - - - - True - <b>Custom</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - True - True - - - - - - - - - - True - <b>Applications</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - False - False - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 6 - - - - True - True - Notify on new _GMail email - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - If checked, Gajim will also include information about the sender of the new emails - True - Display _extra email details - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - - - - - True - <b>GMail Options</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - False - False - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 6 - - - - True - True - _Log status changes of contacts - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - Allow _OS information to be sent - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - Always check to see if Gajim is the _default Jabber client on startup - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - - - - - True - <b>Miscellaneous</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - False - False - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 0 - 0 - 0 - 12 - 335 - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-open - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Open... - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - - - - - - True - <b>Advanced Configuration Editor</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - False - False - - - - - False - True - - - - - - True - Advanced - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_END - 15 - - - - True - True - True - gtk-close - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - False - True - - - - - - + + + + + + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 3 + 2 + 12 + 6 + + + True + True + + + + 1 + 2 + 2 + 3 + + + + + + True + 0 + _File manager: + True + custom_file_manager_entry + + + 2 + 3 + GTK_FILL + + + + + + True + True + + + + 1 + 2 + + + + + + True + True + + + + 1 + 2 + 1 + 2 + + + + + + True + 0 + _Mail client: + True + custom_mail_client_entry + + + 1 + 2 + GTK_FILL + + + + + + True + 0 + _Browser: + True + custom_browser_entry + + + GTK_FILL + + + + + + + + + + True + <b>Custom</b> + True + + + label_item + + + + + 1 + + + + + + + + + True + <b>Applications</b> + True + + + label_item + + + + + False + False + + + + + True + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 6 + + + True + True + Notify on new _GMail email + True + 0 + True + + + + False + False + + + + + True + True + If checked, Gajim will also include information about the sender of the new emails + Display _extra email details + True + 0 + True + + + + False + False + 1 + + + + + + + + + True + <b>GMail Options</b> + True + + + label_item + + + + + False + False + 1 + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 6 + + + True + True + _Log status changes of contacts + True + 0 + True + + + + False + False + + + + + True + True + Allow _OS information to be sent + True + 0 + True + + + + False + False + 1 + + + + + True + True + Always check to see if Gajim is the _default Jabber client on startup + True + 0 + True + + + + False + False + 2 + + + + + + + + + True + <b>Miscellaneous</b> + True + + + label_item + + + + + False + False + 2 + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 0 + 12 + 335 + + + True + True + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-open + + + False + False + + + + + True + _Open... + True + + + False + False + 1 + + + + + + + + + + + + + True + <b>Advanced Configuration Editor</b> + True + + + label_item + + + + + False + False + 3 + + + + + 4 + False + + + + + True + Advanced + + + tab + 4 + False + False + + + + + + + True + 15 + GTK_BUTTONBOX_END + + + True + True + True + gtk-close + True + 0 + + + + + + False + 1 + + + + + diff --git a/data/glade/privacy_list_window.glade b/data/glade/privacy_list_window.glade index 5e857a72c..d2d527c76 100644 --- a/data/glade/privacy_list_window.glade +++ b/data/glade/privacy_list_window.glade @@ -1,757 +1,526 @@ - - - + + + - - - 6 - True - Privacy List - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - True - False - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - False - - - - - 600 - True - False - 0 - - - - True - True - 0 - - - - True - <i>Privacy List</i> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - True - Active for this session - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - Active on each startup - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - 0 - False - True - - - - - - True - - - 5 - False - False - - - - - - True - <b>List of rules</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 5 - False - False - - - - - - True - - False - True - - - - 5 - False - True - - - - - - True - True - 0 - - - - 5 - True - True - gtk-add - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - - 5 - True - True - gtk-remove - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - - 6 - True - True - gtk-edit - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - 0 - False - True - - - - - - 5 - False - 0 - - - - True - - - 5 - True - True - - - - - - True - <b>Add / Edit a rule</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 5 - False - False - - - - - - True - False - 0 - - - - True - True - 0 - - - - True - True - Allow - True - GTK_RELIEF_NORMAL - True - False - False - True - - - 0 - False - False - - - - - - True - True - Deny - True - GTK_RELIEF_NORMAL - True - False - False - True - edit_allow_radiobutton - - - 0 - False - False - - - - - 0 - True - True - - - - - - True - True - 0 - - - - 5 - True - False - 0 - - - - True - True - JabberID - True - GTK_RELIEF_NORMAL - True - False - False - True - - - 5 - False - False - - - - - - True - True - True - True - 0 - - True - - False - - - 5 - True - True - - - - - 0 - True - True - - - - - - 5 - True - False - 0 - - - - True - True - all in the group - True - GTK_RELIEF_NORMAL - True - False - False - True - edit_type_jabberid_radiobutton - - - 5 - False - False - - - - - - True - - False - True - - - 5 - True - True - - - - - 0 - True - True - - - - - - 5 - True - False - 0 - - - - True - True - all by subscription - True - GTK_RELIEF_NORMAL - True - False - False - True - edit_type_jabberid_radiobutton - - - 5 - False - False - - - - - - True - none + + True + 6 + Privacy List + + + + 600 + True + + + True + True + + + True + <i>Privacy List</i> + True + + + False + False + + + + + True + True + Active for this session + True + 0 + True + + + + False + False + 1 + + + + + True + True + Active on each startup + True + 0 + True + + + + False + False + 2 + + + + + False + + + + + True + + + False + False + 5 + 1 + + + + + True + <b>List of rules</b> + True + + + False + False + 5 + 2 + + + + + True + + + + + False + 5 + 3 + + + + + True + True + + + True + True + 5 + gtk-add + True + 0 + + + + False + False + + + + + True + True + 5 + gtk-remove + True + 0 + + + + False + False + 1 + + + + + True + True + 6 + gtk-edit + True + 0 + + + + False + False + 2 + + + + + False + 4 + + + + + True + 5 + + + True + + + 5 + + + + + True + <b>Add / Edit a rule</b> + True + + + False + False + 5 + 1 + + + + + True + + + True + True + + + True + True + Allow + True + 0 + True + + + False + False + + + + + True + True + Deny + True + 0 + True + edit_allow_radiobutton + + + False + False + 1 + + + + + + + True + True + + + True + 5 + + + True + True + JabberID + True + 0 + True + + + False + False + 5 + + + + + True + True + + + 5 + 1 + + + + + + + True + 5 + + + True + True + all in the group + True + 0 + True + edit_type_jabberid_radiobutton + + + False + False + 5 + + + + + True + + + + 5 + 1 + + + + + 1 + + + + + True + 5 + + + True + True + all by subscription + True + 0 + True + edit_type_jabberid_radiobutton + + + False + False + 5 + + + + + True + none both from to - False - True - - - 5 - True - True - - - - - 0 - True - True - - - - - - 10 - True - False - 0 - - - - True - True - All - True - GTK_RELIEF_NORMAL - True - False - False - True - edit_type_jabberid_radiobutton - - - 0 - False - False - - - - - 0 - False - False - - - - - 0 - True - True - - - - - - True - True - 0 - - - - True - True - to send me messages - True - GTK_RELIEF_NORMAL - True - False - False - True - - - 0 - False - False - - - - - - True - True - to send me queries - True - GTK_RELIEF_NORMAL - True - False - False - True - - - 0 - False - False - - - - - - True - True - to view my status - True - GTK_RELIEF_NORMAL - True - False - False - True - - - 0 - False - False - - - - - - True - True - to send me status - True - GTK_RELIEF_NORMAL - True - False - False - True - - - 0 - False - False - - - - - 0 - True - True - - - - - 0 - True - True - - - - - - True - True - 0 - - - - True - False - 0 - - - - True - Order: - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 5 - False - False - - - - - - True - True - 1 - 0 - False - GTK_UPDATE_ALWAYS - False - False - 1 0 100 1 10 10 - - - 0 - False - True - - - - - 0 - True - True - - - - - - 5 - True - True - gtk-save - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - 0 - True - True - - - - - 0 - True - True - - - - - - True - - - 0 - False - True - - - - - - 6 - True - GTK_BUTTONBOX_END - 0 - - - - True - True - True - gtk-close - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - True - True - - - - - - + + + 5 + 1 + + + + + 2 + + + + + True + 10 + + + True + True + All + True + 0 + True + edit_type_jabberid_radiobutton + + + False + False + + + + + False + False + 3 + + + + + 1 + + + + + True + True + + + True + True + to send me messages + True + 0 + True + + + False + False + + + + + True + True + to send me queries + True + 0 + True + + + False + False + 1 + + + + + True + True + to view my status + True + 0 + True + + + False + False + 2 + + + + + True + True + to send me status + True + 0 + True + + + False + False + 3 + + + + + 2 + + + + + 2 + + + + + True + True + + + True + + + True + Order: + + + False + False + 5 + + + + + True + True + 1 0 100 1 10 10 + 1 + + + False + 1 + + + + + + + True + True + 5 + gtk-save + True + 0 + + + + False + False + 1 + + + + + 3 + + + + + 5 + + + + + True + + + False + 6 + + + + + True + 6 + GTK_BUTTONBOX_END + + + True + True + True + gtk-close + True + 0 + + + + + + 7 + + + + + diff --git a/data/glade/profile_window.glade b/data/glade/profile_window.glade index b9c4394ab..6f033ba58 100644 --- a/data/glade/profile_window.glade +++ b/data/glade/profile_window.glade @@ -1,1943 +1,1156 @@ - - - + + + - - - Personal Information - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - True - False - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - False - - - - - - True - False - 12 - - - - 6 - True - True - True - GTK_POS_TOP - False - False - - - - 12 - True - 7 - 4 - False - 6 - 12 - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 0 - 1 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 4 - 4 - 5 - - - - - - - True - True - False - 0 - - - - 6 - True - 3 - 4 - False - 6 - 12 - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 0 - 1 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 3 - 4 - 0 - 1 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 1 - 2 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 2 - 3 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 3 - 4 - 2 - 3 - - - - - - - True - Family: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - Middle: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - Prefix: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 2 - 3 - fill - - - - - - - True - Given: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - fill - - - - - - - True - Suffix: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 2 - 3 - fill - - - - - - - - - True - More - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - 4 - 1 - 2 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 3 - 4 - 0 - 1 - - - - - - - True - True - False - 0 - - - - 6 - True - 3 - 4 - False - 5 - 5 - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 0 - 1 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 3 - 4 - 0 - 1 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 1 - 2 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 3 - 4 - 1 - 2 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 2 - 3 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 3 - 4 - 2 - 3 - - - - - - - True - Street: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - City: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - State: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 2 - 3 - fill - - - - - - - True - Extra Address: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - fill - - - - - - - True - Postal Code: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 1 - 2 - fill - - - - - - - True - Country: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 2 - 3 - fill - - - - - - - - - True - Address - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - 4 - 2 - 3 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 3 - 4 - 5 - 6 - - - - - - - True - Homepage: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 3 - 4 - - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 4 - 3 - 4 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 5 - 6 - - - - - - - True - Name: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - Nickname: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - fill - - - - - - - True - Phone No.: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 5 - 6 - fill - - - - - - - True - Format: YYYY-MM-DD - True - False - - - - True - Birthday: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - 2 - 3 - 5 - 6 - fill - - - - - - - True - E-Mail: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 4 - 5 - fill - - - - - - - True - Avatar: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 6 - 7 - fill - - - - - - - True - False - 0 - - - - True - GTK_RELIEF_NORMAL - True - - - - - True - False - False - - - - True - 0.5 - 0 - 0 - 0 - - - - - - - 0 - False - False - - - - - - True - True - Click to set your avatar - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - 1 - 4 - 6 - 7 - - expand - - - - - False - True - - - - - - True - Personal Info - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 12 - True - 5 - 4 - False - 6 - 12 - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 0 - 1 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 3 - 4 - 0 - 1 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 1 - 2 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 3 - 4 - 1 - 2 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 4 - 3 - 4 - - - - - - - True - True - False - 0 - - - - 6 - True - 3 - 4 - False - 5 - 5 - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 0 - 1 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 3 - 4 - 0 - 1 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 1 - 2 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 3 - 4 - 1 - 2 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 2 - 3 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 3 - 4 - 2 - 3 - - - - - - - True - Street: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - City: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - State: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 2 - 3 - fill - - - - - - - True - Extra Address: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - fill - - - - - - - True - Postal Code: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 1 - 2 - fill - - - - - - - True - Country: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 2 - 3 - fill - - - - - - - - - True - Address - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - 4 - 2 - 3 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 4 - 5 - - - - - - - True - Company: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - Position: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - Department: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - fill - - - - - - - True - Role: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 1 - 2 - fill - - - - - - - True - E-Mail: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 3 - 4 - fill - - - - - - - True - Phone No.: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 4 - 5 - fill - - - - - - False - True - - - - - - True - Work - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 6 - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - 70 - True - True - True - False - True - GTK_JUSTIFY_LEFT - GTK_WRAP_WORD - True - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - False - True - - - - - - True - About - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - 0 - True - True - - - - - - 6 - True - False - 0 - - - - True - GTK_PROGRESS_LEFT_TO_RIGHT - 0 - 0.10000000149 - PANGO_ELLIPSIZE_NONE - - - 0 - False - False - - - - - - True - GTK_BUTTONBOX_END - 12 - - - - True - True - True - gtk-cancel - True - GTK_RELIEF_NORMAL - True - - - - - - - True - True - True - gtk-ok - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - True - True - - - - - 0 - False - True - - - - - - True - False - - - 0 - False - False - - - - - - + + Personal Information + + + + + True + 12 + + + True + 6 + + + True + 12 + 7 + 4 + 12 + 6 + + + True + + + True + 0 + + + + True + False + + + True + 0 + gtk-missing-image + + + + + + + False + False + + + + + True + True + True + Click to set your avatar + True + 0 + + + + False + False + 1 + + + + + 1 + 4 + 6 + 7 + + GTK_EXPAND + + + + + True + 0 + Avatar: + + + 6 + 7 + GTK_FILL + + + + + + True + 0 + E-Mail: + + + 4 + 5 + GTK_FILL + + + + + + True + Format: YYYY-MM-DD + + + True + 0 + 0 + Birthday: + + + + + 2 + 3 + 5 + 6 + GTK_FILL + + + + + + True + 0 + 0 + Phone No.: + + + 5 + 6 + GTK_FILL + + + + + + True + 0 + 0 + Nickname: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Name: + + + GTK_FILL + + + + + + True + True + * + + + 1 + 2 + 5 + 6 + + + + + + True + True + * + + + 1 + 4 + 3 + 4 + + + + + + True + 0 + 0 + Homepage: + + + 3 + 4 + + + + + + + True + True + * + + + 3 + 4 + 5 + 6 + + + + + + True + True + + + True + 6 + 3 + 4 + 5 + 5 + + + True + 0 + 0 + Country: + + + 2 + 3 + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Postal Code: + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + + True + 0 + 0 + Extra Address: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + State: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + City: + + + 1 + 2 + GTK_FILL + + + + + + True + 0 + 0 + Street: + + + GTK_FILL + + + + + + True + True + * + + + 3 + 4 + 2 + 3 + + + + + + True + True + * + + + 1 + 2 + 2 + 3 + + + + + + True + True + * + + + 3 + 4 + 1 + 2 + + + + + + True + True + * + + + 1 + 2 + 1 + 2 + + + + + + True + True + * + + + 3 + 4 + + + + + + True + True + * + + + 1 + 2 + + + + + + + + True + 0 + 0 + Address + + + label_item + + + + + 4 + 2 + 3 + + + + + + True + True + * + + + 3 + 4 + + + + + + True + True + + + True + 6 + 3 + 4 + 12 + 6 + + + + + + + + + True + 0 + 0 + Suffix: + + + 2 + 3 + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Given: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Prefix: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Middle: + + + 1 + 2 + GTK_FILL + + + + + + True + 0 + 0 + Family: + + + GTK_FILL + + + + + + True + True + * + + + 3 + 4 + 2 + 3 + + + + + + True + True + * + + + 1 + 2 + 2 + 3 + + + + + + True + True + * + + + 1 + 2 + 1 + 2 + + + + + + True + True + * + + + 3 + 4 + + + + + + True + True + * + + + 1 + 2 + + + + + + + + True + 0 + 0 + Full Name + + + label_item + + + + + 4 + 1 + 2 + + + + + + True + True + * + + + 1 + 4 + 4 + 5 + + + + + + True + True + * + + + 1 + 2 + + + + + + False + + + + + True + 0 + 0 + Personal Info + + + tab + False + False + + + + + True + 12 + 5 + 4 + 12 + 6 + + + + + + + + + True + 0 + 0 + Phone No.: + + + 4 + 5 + GTK_FILL + + + + + + True + 0 + 0 + E-Mail: + + + 3 + 4 + GTK_FILL + + + + + + True + 0 + 0 + Role: + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + + True + 0 + 0 + Department: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Position: + + + 1 + 2 + GTK_FILL + + + + + + True + 0 + 0 + Company: + + + GTK_FILL + + + + + + True + True + * + + + 1 + 2 + 4 + 5 + + + + + + True + True + + + True + 6 + 3 + 4 + 5 + 5 + + + True + 0 + 0 + Country: + + + 2 + 3 + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Postal Code: + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + + True + 0 + 0 + Extra Address: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + State: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + City: + + + 1 + 2 + GTK_FILL + + + + + + True + 0 + 0 + Street: + + + GTK_FILL + + + + + + True + True + * + + + 3 + 4 + 2 + 3 + + + + + + True + True + * + + + 1 + 2 + 2 + 3 + + + + + + True + True + * + + + 3 + 4 + 1 + 2 + + + + + + True + True + * + + + 1 + 2 + 1 + 2 + + + + + + True + True + * + + + 3 + 4 + + + + + + True + True + * + + + 1 + 2 + + + + + + + + True + 0 + 0 + Address + + + label_item + + + + + 4 + 2 + 3 + + + + + + True + True + * + + + 1 + 4 + 3 + 4 + + + + + + True + True + * + + + 3 + 4 + 1 + 2 + + + + + + True + True + * + + + 1 + 2 + 1 + 2 + + + + + + True + True + * + + + 3 + 4 + + + + + + True + True + * + + + 1 + 2 + + + + + + 1 + False + + + + + True + 0 + 0 + Work + + + tab + 1 + False + False + + + + + True + True + 6 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + 70 + True + True + GTK_WRAP_WORD + + + + + 2 + False + + + + + True + 0 + 0 + About + + + tab + 2 + False + False + + + + + + + True + 6 + + + True + 0.10000000149 + + + False + False + + + + + True + 12 + GTK_BUTTONBOX_END + + + True + True + True + gtk-cancel + True + 0 + + + + + + True + True + True + gtk-ok + True + 0 + + + + 1 + + + + + 1 + + + + + False + 1 + + + + + True + False + + + False + False + 2 + + + + + diff --git a/data/glade/roster_contact_context_menu.glade b/data/glade/roster_contact_context_menu.glade index 4352365ef..0d35d74a6 100644 --- a/data/glade/roster_contact_context_menu.glade +++ b/data/glade/roster_contact_context_menu.glade @@ -65,9 +65,9 @@ - + True - Send cus_tom status + Send Cus_tom Status True @@ -95,7 +95,7 @@ True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - _Manage contact + _Manage Contact True @@ -123,6 +123,7 @@ True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-edit + 1 @@ -142,7 +143,7 @@ - + True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Set Custom _Avatar @@ -152,6 +153,7 @@ True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-orientation-portrait + 1 @@ -159,6 +161,7 @@ True + True Add Special _Notification True @@ -244,7 +247,7 @@ True - gtk-yes + gtk-stop 1 @@ -298,6 +301,7 @@ True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-properties + 1 @@ -309,7 +313,7 @@ - gtk-dialog-info + gtk-info True True diff --git a/data/glade/roster_window.glade b/data/glade/roster_window.glade index 16fb5bbb4..1f1f10fb5 100644 --- a/data/glade/roster_window.glade +++ b/data/glade/roster_window.glade @@ -266,12 +266,40 @@ - + True Frequently Asked Questions (online) _FAQ True + + + True + gtk-dialog-question + 1 + + + + + + + True + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Fea_tures + True + + + + True + gtk-properties + 1 + + diff --git a/data/glade/search_window.glade b/data/glade/search_window.glade index 6a3e6133a..efa3dd993 100644 --- a/data/glade/search_window.glade +++ b/data/glade/search_window.glade @@ -1,191 +1,215 @@ - - - + + + - - - 12 - Search - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - True - False - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - False - - - - - - True - False - 6 - - - - True - False - 0 - - - - True - Please wait while retrieving search form... - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - True - False - - - - - - True - GTK_PROGRESS_LEFT_TO_RIGHT - 0 - 0.10000000149 - PANGO_ELLIPSIZE_NONE - - - 0 - True - False - - - - - - - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_END - 6 - - - - True - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-find - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Search - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - - - - True - True - True - gtk-close - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - False - True - - - - - - + + 12 + Search + + + + + True + 6 + + + True + + + True + Please wait while retrieving search form... + + + False + + + + + True + 0.10000000149 + + + False + 1 + + + + + + + + + + True + 6 + GTK_BUTTONBOX_END + + + False + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + 0 + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-add + + + False + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + _Add contact + True + + + False + False + 1 + + + + + + + + + + + False + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + 0 + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-info + + + False + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + _Information + True + + + False + False + 1 + + + + + + + + + 1 + + + + + True + True + True + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-find + + + False + False + + + + + True + _Search + True + + + False + False + 1 + + + + + + + + + 2 + + + + + True + True + True + gtk-close + True + 0 + + + + 3 + + + + + False + 1 + + + + + diff --git a/data/glade/service_discovery_window.glade b/data/glade/service_discovery_window.glade index e5b471c7e..197b18a9a 100644 --- a/data/glade/service_discovery_window.glade +++ b/data/glade/service_discovery_window.glade @@ -1,421 +1,269 @@ - - - + + + - - - 6 - - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - 450 - 420 - True - False - Service Discovery - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - False - - - - - True - False - 6 - - - + + False + False + + + + + True + 3 + 3 + 6 + + + + + + + + + True + _Address: + True + address_comboboxentry + + + 3 + GTK_FILL + + + + + + True + True + True + True + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-jump-to + + + False + False + + + + + True + G_o + True + + + False + False + 1 + + + + + + + + + 2 + 3 + 3 + GTK_FILL + + + + + + True + + + + + + + + + + 1 + 2 + 1 + 2 + GTK_FILL + + + + + False + 1 + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_ETCHED_IN + + + True + True + False + + + + + + 2 + + + + + True + True + 6 + + + True + _Filter: + True + filter_entry + + + False + False + + + + + True + True + * + + + + 1 + + + + + False + False + 3 + + + + + True + 12 + + + True + True + 0.10000000149 + + + False + False + + + + + True + + + 1 + + + + + True + 6 + + + True + True + True + True + gtk-close + True + 0 + + + + False + False + GTK_PACK_END + + + + + False + 2 + + + + + False + 2 + 4 + + + + + diff --git a/data/glade/single_message_window.glade b/data/glade/single_message_window.glade index 955bc9bc1..6c3f06641 100644 --- a/data/glade/single_message_window.glade +++ b/data/glade/single_message_window.glade @@ -1,548 +1,346 @@ - - - + + + - - - 6 - - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - 550 - 280 - True - False - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - - - - - - True - False - 6 - - - - True - 3 - 3 - False - 6 - 12 - - - - True - Subject: - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 2 - 3 - fill - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 3 - 0 - 1 - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 2 - 2 - 3 - - - - - - - True - 0 - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 2 - 3 - fill - - - - - - - True - True - True - True - 0 - - True - * - False - - - 1 - 3 - 1 - 2 - - - - - - - True - From: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - To: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - 0 - False - True - - - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - - - - 0 - True - True - - - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - True - GTK_JUSTIFY_LEFT - GTK_WRAP_WORD - True - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_END - 12 - - - - True - True - True - gtk-close - True - GTK_RELIEF_NORMAL - True - - - - - - - True - True - True - gtk-cancel - True - GTK_RELIEF_NORMAL - True - - - - - - - True - Send message - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-jump-to - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - Sen_d - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - - - - True - Reply to this message - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-ok - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Reply - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - - - - True - Send message and close window - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-ok - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Send & Close - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - - - 6 - False - True - - - - - - + + 6 + 550 + 280 + + + + + True + 6 + + + True + 3 + 3 + 12 + 6 + + + True + True + 0 + To: + + + 1 + 2 + GTK_FILL + + + + + + True + True + 0 + From: + + + GTK_FILL + + + + + + True + True + True + * + + + 1 + 3 + 1 + 2 + + + + + + True + 0 + + + 2 + 3 + 2 + 3 + GTK_FILL + + + + + + True + True + * + + + 1 + 2 + 2 + 3 + + + + + + True + True + True + * + + + 1 + 3 + + + + + + True + Subject: + + + 2 + 3 + GTK_FILL + + + + + + False + + + + + True + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + + + + 1 + + + + + True + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + GTK_WRAP_WORD + + + + + 2 + + + + + True + 12 + GTK_BUTTONBOX_END + + + True + True + True + True + gtk-close + True + 0 + + + + + + True + True + True + True + gtk-cancel + True + 0 + + + + 1 + + + + + True + True + True + True + Send message + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-jump-to + + + False + False + + + + + True + Sen_d + True + + + False + False + 1 + + + + + + + + + 2 + + + + + True + True + True + True + Reply to this message + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-ok + + + False + False + + + + + True + _Reply + True + + + False + False + 1 + + + + + + + + + 3 + + + + + True + True + True + True + Send message and close window + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-ok + + + False + False + + + + + True + _Send & Close + True + + + False + False + 1 + + + + + + + + + 4 + + + + + False + 6 + 3 + + + + + diff --git a/data/glade/vcard_information_window.glade b/data/glade/vcard_information_window.glade index ad55ab284..17685e322 100644 --- a/data/glade/vcard_information_window.glade +++ b/data/glade/vcard_information_window.glade @@ -1,2768 +1,1597 @@ - - - + + + - - - 12 - Contact Information - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - True - False - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - False - - - - - - True - False - 12 - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - True - True - GTK_POS_TOP - False - False - - - - 12 - True - False - 6 - - - - True - False - 12 - - - - True - 5 - 2 - False - 6 - 12 - - - - True - Jabber ID: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - Resource: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - Status: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 2 - 3 - fill - - - - - - - True - Client: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 3 - 4 - fill - - - - - - - True - OS: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 4 - 5 - fill - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 0 - 1 - - - - - - - True - False - False - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - 1 - 2 - 1 - 2 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 3 - 4 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - True - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 4 - 5 - - - - - - - True - True - False - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - 1 - 2 - 2 - 3 - fill - fill - - - - - 0 - True - True - - - - - - True - False - 6 - - - - True - User avatar: - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - None - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - False - False - - - - - True - 0.5 - 0 - 0 - 0 - - - - - 0 - False - False - - - - - - True - Configured avatar: - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - True - - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - - True - True - Click to force avatar - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - 0 - True - True - - - - - 0 - True - True - - - - - - True - True - False - 0 - - - - 6 - True - 1 - 4 - False - 6 - 12 - - - - True - False - False - - - - True - - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - 1 - 2 - 0 - 1 - - - - - - - True - False - False - - - - True - - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - 3 - 4 - 0 - 1 - - - - - - - True - Subscription: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - Ask: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - fill - - - - - - - - - True - More - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - True - True - - - - - False - True - - - - - - True - Contact - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 12 - True - 6 - 4 - False - 6 - 12 - - - - True - True - False - 0 - - - - 6 - True - 3 - 4 - False - 6 - 12 - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 0 - 1 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 3 - 4 - 0 - 1 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 1 - 2 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 2 - 3 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 3 - 4 - 2 - 3 - - - - - - - True - Family: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - Middle: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - Prefix: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 2 - 3 - fill - - - - - - - True - Given: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - fill - - - - - - - True - Suffix: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 2 - 3 - fill - - - - - - - - - True - More - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - 4 - 1 - 2 - - - - - - - True - True - False - 0 - - - - 6 - True - 3 - 4 - False - 5 - 5 - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 0 - 1 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 3 - 4 - 0 - 1 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 1 - 2 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 3 - 4 - 1 - 2 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 2 - 3 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 3 - 4 - 2 - 3 - - - - - - - True - Street: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - City: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - State: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 2 - 3 - fill - - - - - - - True - Extra Address: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - fill - - - - - - - True - Postal Code: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 1 - 2 - fill - - - - - - - True - Country: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 2 - 3 - fill - - - - - - - - - True - Address - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - 4 - 2 - 3 - - - - - - - True - Homepage: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 3 - 4 - - - - - - - - True - Name: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - Nickname: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - fill - - - - - - - True - Phone No.: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 5 - 6 - fill - - - - - - - True - Format: YYYY-MM-DD - True - False - - - - True - Birthday: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - 2 - 3 - 5 - 6 - fill - - - - - - - True - E-Mail: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 4 - 5 - fill - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 3 - 4 - 0 - 1 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 0 - 1 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 4 - 4 - 5 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 5 - 6 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 3 - 4 - 5 - 6 - - - - - - False - True - - - - - - True - Personal Info - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 12 - True - 5 - 4 - False - 6 - 12 - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 0 - 1 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 3 - 4 - 0 - 1 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 1 - 2 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 3 - 4 - 1 - 2 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 4 - 3 - 4 - - - - - - - True - True - False - 0 - - - - 6 - True - 3 - 4 - False - 5 - 5 - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 0 - 1 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 3 - 4 - 0 - 1 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 1 - 2 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 3 - 4 - 1 - 2 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 2 - 3 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 3 - 4 - 2 - 3 - - - - - - - True - Street: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - City: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - State: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 2 - 3 - fill - - - - - - - True - Extra Address: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - fill - - - - - - - True - Postal Code: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 1 - 2 - fill - - - - - - - True - Country: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 2 - 3 - fill - - - - - - - - - True - Address - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - 4 - 2 - 3 - - - - - - - True - True - - False - False - GTK_JUSTIFY_LEFT - False - True - 0 - 0 - 5 - 5 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 1 - 2 - 4 - 5 - - - - - - - True - Company: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - fill - - - - - - - True - Position: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - fill - - - - - - - True - Department: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - fill - - - - - - - True - Role: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 1 - 2 - fill - - - - - - - True - E-Mail: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 3 - 4 - fill - - - - - - - True - Phone No.: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 4 - 5 - fill - - - - - - False - True - - - - - - True - Work - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 6 - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - 70 - True - True - False - False - True - GTK_JUSTIFY_LEFT - GTK_WRAP_WORD - False - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - False - True - - - - - - True - About - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 6 - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - 70 - True - True - True - False - True - GTK_JUSTIFY_LEFT - GTK_WRAP_NONE - True - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - False - True - - - - - - True - Comments - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - 0 - True - True - - - - - - True - False - 0 - - - - True - GTK_PROGRESS_LEFT_TO_RIGHT - 0 - 0.10000000149 - PANGO_ELLIPSIZE_NONE - - - 0 - False - False - - - - - - True - GTK_BUTTONBOX_END - 0 - - - - True - True - True - gtk-close - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - True - True - - - - - 0 - True - True - - - - - - + + 12 + Contact Information + + + + + True + 12 + + + True + True + 0 + True + + + False + False + + + + + True + + + True + 12 + 6 + + + True + 12 + + + True + 5 + 2 + 12 + 6 + + + True + + + True + True + 0 + 0 + 5 + 5 + True + + + + + 1 + 2 + 2 + 3 + GTK_FILL + GTK_FILL + + + + + True + True + 0 + 0 + 5 + 5 + True + True + + + 1 + 2 + 4 + 5 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + 3 + 4 + + + + + + True + False + + + True + True + 0 + 0 + 5 + 5 + True + + + + + 1 + 2 + 1 + 2 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + + + + + + True + 0 + 0 + OS: + + + 4 + 5 + GTK_FILL + + + + + + True + 0 + 0 + Client: + + + 3 + 4 + GTK_FILL + + + + + + True + 0 + 0 + Status: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Resource: + + + 1 + 2 + GTK_FILL + + + + + + True + 0 + 0 + Jabber ID: + + + GTK_FILL + + + + + + + + True + 6 + + + True + User avatar: + + + False + False + + + + + True + None + + + False + False + 1 + + + + + True + False + + + + True + 0 + gtk-missing-image + + + + + False + False + 2 + + + + + True + Configured avatar: + + + False + False + 3 + + + + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + gtk-missing-image + + + False + False + 4 + + + + + 1 + + + + + + + True + True + + + True + 6 + 1 + 4 + 12 + 6 + + + True + 0 + 0 + Ask: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Subscription: + + + GTK_FILL + + + + + + True + False + + + True + 0 + 0 + 5 + 5 + + + + + 3 + 4 + + + + + + True + False + + + True + 0 + 0 + 5 + 5 + + + + + 1 + 2 + + + + + + + + True + 0 + 0 + More + + + label_item + + + + + 1 + + + + + False + + + + + True + 0 + 0 + Contact + + + tab + False + False + + + + + True + 12 + 6 + 4 + 12 + 6 + + + + + + + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 3 + 4 + 5 + 6 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + 5 + 6 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 4 + 4 + 5 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 3 + 4 + + + + + + True + 0 + E-Mail: + + + 4 + 5 + GTK_FILL + + + + + + True + Format: YYYY-MM-DD + + + True + 0 + 0 + Birthday: + + + + + 2 + 3 + 5 + 6 + GTK_FILL + + + + + + True + 0 + 0 + Phone No.: + + + 5 + 6 + GTK_FILL + + + + + + True + 0 + 0 + Nickname: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Name: + + + GTK_FILL + + + + + + True + 0 + 0 + Homepage: + + + 3 + 4 + + + + + + + True + True + + + True + 6 + 3 + 4 + 5 + 5 + + + True + 0 + 0 + Country: + + + 2 + 3 + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Postal Code: + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + + True + 0 + 0 + Extra Address: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + State: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + City: + + + 1 + 2 + GTK_FILL + + + + + + True + 0 + 0 + Street: + + + GTK_FILL + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 3 + 4 + 2 + 3 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + 2 + 3 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 3 + 4 + 1 + 2 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + 1 + 2 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 3 + 4 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + + + + + + + + True + 0 + 0 + Address + + + label_item + + + + + 4 + 2 + 3 + + + + + + True + True + + + True + 6 + 3 + 4 + 12 + 6 + + + + + + + + + True + 0 + 0 + Suffix: + + + 2 + 3 + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Given: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Prefix: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Middle: + + + 1 + 2 + GTK_FILL + + + + + + True + 0 + 0 + Family: + + + GTK_FILL + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 3 + 4 + 2 + 3 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + 2 + 3 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + 1 + 2 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 3 + 4 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + + + + + + + + True + 0 + 0 + Full Name + + + label_item + + + + + 4 + 1 + 2 + + + + + + 1 + False + + + + + True + 0 + 0 + Personal Info + + + tab + 1 + False + False + + + + + True + 12 + 5 + 4 + 12 + 6 + + + + + + + + + True + 0 + 0 + Phone No.: + + + 4 + 5 + GTK_FILL + + + + + + True + 0 + 0 + E-Mail: + + + 3 + 4 + GTK_FILL + + + + + + True + 0 + 0 + Role: + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + + True + 0 + 0 + Department: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Position: + + + 1 + 2 + GTK_FILL + + + + + + True + 0 + 0 + Company: + + + GTK_FILL + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + 4 + 5 + + + + + + True + True + + + True + 6 + 3 + 4 + 5 + 5 + + + True + 0 + 0 + Country: + + + 2 + 3 + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + Postal Code: + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + + True + 0 + 0 + Extra Address: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + State: + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + 0 + City: + + + 1 + 2 + GTK_FILL + + + + + + True + 0 + 0 + Street: + + + GTK_FILL + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 3 + 4 + 2 + 3 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + 2 + 3 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 3 + 4 + 1 + 2 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + 1 + 2 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 3 + 4 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + + + + + + + + True + 0 + 0 + Address + + + label_item + + + + + 4 + 2 + 3 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 4 + 3 + 4 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 3 + 4 + 1 + 2 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + 1 + 2 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 3 + 4 + + + + + + True + True + 0 + 0 + 5 + 5 + True + + + 1 + 2 + + + + + + 2 + False + + + + + True + 0 + 0 + Work + + + tab + 2 + False + False + + + + + True + True + 6 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + 70 + True + True + False + GTK_WRAP_WORD + False + + + + + 3 + False + + + + + True + 0 + 0 + About + + + tab + 3 + False + False + + + + + True + True + 6 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + 70 + True + True + GTK_WRAP_WORD + + + + + 4 + False + + + + + True + Comments + + + tab + 4 + False + False + + + + + 1 + + + + + True + + + True + 0.10000000149 + + + False + False + + + + + True + GTK_BUTTONBOX_END + + + True + True + True + gtk-close + True + 0 + + + + + + 1 + + + + + 2 + + + + + diff --git a/data/glade/xml_console_window.glade b/data/glade/xml_console_window.glade index 9491b9586..548275c61 100644 --- a/data/glade/xml_console_window.glade +++ b/data/glade/xml_console_window.glade @@ -181,8 +181,8 @@ True True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC + GTK_POLICY_NEVER + GTK_POLICY_NEVER GTK_SHADOW_IN GTK_CORNER_TOP_LEFT diff --git a/data/glade/zeroconf_contact_context_menu.glade b/data/glade/zeroconf_contact_context_menu.glade index edbb0f064..4ad215baa 100644 --- a/data/glade/zeroconf_contact_context_menu.glade +++ b/data/glade/zeroconf_contact_context_menu.glade @@ -1,153 +1,113 @@ - - - + + + - - - - - - True - Start _Chat - True - - - - True - gtk-jump-to - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - _Rename - True - - - - True - gtk-refresh - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - Edit _Groups - True - - - - - - True - - - - - - True - Send _File - True - - - - True - gtk-file - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - Assign Open_PGP Key - True - - - - - True - gtk-dialog-authentication - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - Add Special _Notification - True - - - - True - gtk-info - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - - - - - - gtk-info - True - - - - - - _History - True - - - - True - gtk-justify-fill - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - + + + + True + Start _Chat + True + + + True + gtk-jump-to + 1 + + + + + + + _Rename + True + + + True + gtk-refresh + 1 + + + + + + + Edit _Groups + True + + + + + True + + + + + True + Send _File + True + + + True + gtk-missing-image + 1 + + + + + + + Assign Open_PGP Key + True + + + + True + gtk-missing-image + 1 + + + + + + + True + True + Add Special _Notification + True + + + True + gtk-info + 1 + + + + + + + True + + + + + gtk-info + True + True + + + + + _History + True + + + True + gtk-justify-fill + 1 + + + + + diff --git a/data/iconsets/crystal/16x16/message.gif b/data/iconsets/crystal/16x16/event.gif similarity index 100% rename from data/iconsets/crystal/16x16/message.gif rename to data/iconsets/crystal/16x16/event.gif diff --git a/data/iconsets/dcraven/16x16/message.png b/data/iconsets/dcraven/16x16/event.png similarity index 100% rename from data/iconsets/dcraven/16x16/message.png rename to data/iconsets/dcraven/16x16/event.png diff --git a/data/iconsets/dcraven/32x32/message.png b/data/iconsets/dcraven/32x32/event.png similarity index 100% rename from data/iconsets/dcraven/32x32/message.png rename to data/iconsets/dcraven/32x32/event.png diff --git a/data/iconsets/gnome/16x16/message.gif b/data/iconsets/gnome/16x16/event.gif similarity index 100% rename from data/iconsets/gnome/16x16/message.gif rename to data/iconsets/gnome/16x16/event.gif diff --git a/data/iconsets/goojim/16x16/message.png b/data/iconsets/goojim/16x16/event.png similarity index 100% rename from data/iconsets/goojim/16x16/message.png rename to data/iconsets/goojim/16x16/event.png diff --git a/data/iconsets/goojim/32x32/message.png b/data/iconsets/goojim/32x32/event.png similarity index 100% rename from data/iconsets/goojim/32x32/message.png rename to data/iconsets/goojim/32x32/event.png diff --git a/data/iconsets/gossip/16x16/message.png b/data/iconsets/gossip/16x16/event.png similarity index 100% rename from data/iconsets/gossip/16x16/message.png rename to data/iconsets/gossip/16x16/event.png diff --git a/data/iconsets/gota/16x16/message.gif b/data/iconsets/gota/16x16/event.gif similarity index 100% rename from data/iconsets/gota/16x16/message.gif rename to data/iconsets/gota/16x16/event.gif diff --git a/data/iconsets/gota/32x32/message.gif b/data/iconsets/gota/32x32/event.gif similarity index 100% rename from data/iconsets/gota/32x32/message.gif rename to data/iconsets/gota/32x32/event.gif diff --git a/data/iconsets/jabberbulb/16x16/message.gif b/data/iconsets/jabberbulb/16x16/event.gif similarity index 100% rename from data/iconsets/jabberbulb/16x16/message.gif rename to data/iconsets/jabberbulb/16x16/event.gif diff --git a/data/iconsets/nuvola/16x16/message.gif b/data/iconsets/nuvola/16x16/event.gif similarity index 100% rename from data/iconsets/nuvola/16x16/message.gif rename to data/iconsets/nuvola/16x16/event.gif diff --git a/data/iconsets/simplebulb/16x16/message.png b/data/iconsets/simplebulb/16x16/event.png similarity index 100% rename from data/iconsets/simplebulb/16x16/message.png rename to data/iconsets/simplebulb/16x16/event.png diff --git a/data/iconsets/stellar/16x16/message.gif b/data/iconsets/stellar/16x16/event.gif similarity index 100% rename from data/iconsets/stellar/16x16/message.gif rename to data/iconsets/stellar/16x16/event.gif diff --git a/data/iconsets/sun/16x16/message.gif b/data/iconsets/sun/16x16/event.gif similarity index 100% rename from data/iconsets/sun/16x16/message.gif rename to data/iconsets/sun/16x16/event.gif diff --git a/data/other/cacerts.pem b/data/other/cacerts.pem new file mode 100644 index 000000000..26a90f150 --- /dev/null +++ b/data/other/cacerts.pem @@ -0,0 +1,2474 @@ +ABAecom_=sub.__Am._Bankers_Assn.=_Root_CA +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEF +BQAwgYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2Fz +aGluZ3RvbjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFC +QS5FQ09NIFJvb3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3Ry +dXN0LmNvbTAeFw05OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQsw +CQYDVQQGEwJVUzELMAkGA1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24x +FzAVBgNVBAoTDkFCQS5FQ09NLCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBS +b290IENBMSQwIgYJKoZIhvcNAQkBFhVhZG1pbkBkaWdzaWd0cnVzdC5jb20w +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx0xHgeVVDBwhMywVC +AOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM0KLMsFWWU4RmBQDaREmA2FQK +pSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFGPR7wuSw0X4x8TAgpnUBV +6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGULOR4SCQaJRk665Wc +OQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZsiSrK2jMTecJV +jO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU+/94Qby9 +cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8C +AQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k +qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvT +ZOirvRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHeg +TYjHInYZw8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm +/lowdiT/QHI8eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgx +fexgeqMiKL0ZJGA/O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJ +TzFxiNmIf1Q= +-----END CERTIFICATE----- + +AddTrust_External_Root +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4 +dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5h +bCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1B +ZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1 +c3QgRXh0ZXJuYWwgQ0EgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALf3GjPm8gAELTngTlvtH7xsD821+iO2zt6bETOXpClMfZOfvUq8 +k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfwTz/oMp50 +ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504 +B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDez +eWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5 +aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0WicCAwEAAaOB +3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0PBAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6 +xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdv +cmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJ +KoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5R +xNKWt9x+Tu5w/Rw56wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjT +K3rMUUKhemPR5ruhxSvCNr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1 +n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHx +REzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49O +hgQ= +-----END CERTIFICATE----- + +AddTrust_Low-Value_Services_Root +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU +UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw +HhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU +UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwze +xODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY654eyNAbFvAWlA3yCyykQruGI +gb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWroulpOj0O +M3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1Lc +sRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5 +mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG +9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0OBBYEFJWxtPCU +tr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAx +IENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0 +MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9 +tTEv2dB8Xfjea4MYeDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL +/bscVjby/rK25Xa71SJlpz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlV +g3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6 +tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust_Public_Services_Root +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU +UCBOZXR3b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAe +Fw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNF +MRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+ +A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c ++OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1id9NEHif2 +P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKX +C1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8R +s3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9 +BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQWBBSBPjfYkrAf +d59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zCB +jgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkG +A1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmu +G7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbj +PGsye/Kf8Lb93/AoGEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bY +GozH7ZxOmuASu7VqTITh4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6 +NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9HEufOX1362Kqx +My3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust_Qualified_Certificates_Root +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU +UCBOZXR3b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9v +dDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYT +AlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3Qg +VFRQIE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoek +n0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKk +IhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3KP0q6p6z +sLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1t +UvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R ++Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvES +a0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0GA1UdDgQWBBQ5 +lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkw +ZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVh +bGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2Vh +lRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx9 +5dr6h+sNNVJn0J6XdgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKF +Yqa0p9m9N5xotS1WfbC3P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVA +wRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQw +dOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +America_Online_Root_Certification_Authority_1 +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV +UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l +cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4X +DTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp +Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCa +xlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CGv2BlnEtUiMJIxUo5vxTjWVXl +GbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44zDyL9Hy7n +BzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145Lcx +VR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiE +mf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCu +JKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Zo/Z5 +9m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUA +A4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOM +IOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTI +dGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g +Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j +8uB9Gr784N/Xx6dssPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- + +America_Online_Root_Certification_Authority_2 +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV +UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l +cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4X +DTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMx +HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp +Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssN +t79Hc9PwVU3dxgz6sWYFas14tNwC206B89enfHG8dWOgXeMHDEjsJcQDIPT/ +DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8f3SkWq7x +uhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE +18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxr +kJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMD +bi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8BPeraunzgWGcX +uVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn6KVu +Y8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9 +W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48 +ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124Hhn +AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op +aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNee +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypL +M7PmG2tZTiLMubekJcmnxPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qf +tIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjR +Ywu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R ++FXgJXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr ++CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVM +nNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMADjMSW7yV5TKQqLPGbIOt +d+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh1NolNscI +WC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZ +ZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y +3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz +2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +RY8mkaKO/qk= +-----END CERTIFICATE----- + +AOL_Time_Warner_Root_Certification_Authority_1 +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC +VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB +bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAw +MFoXDTM3MTEyMDE1MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB +T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg +SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U0pPlLYnKhHw/EEMbjIt8hFj4JHxI +zyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItITuLCxFlpMGK2MKKMCxGZYTVt +fu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAfRC+iYkGzuxgh28pxPIzs +trkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqFzQ6axOAAsNUl6twr +5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqhBC4aMqiaILGc +LCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEAAaNjMGEw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jYPXy+ +XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ +BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNM +eUWn9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7 +CegCgTXTCt8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77Bf +WgDrvq2g+EQFZ7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oT +LW4jYYehY0KswsuXn2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCz +vhGbRWeDhhmH05i9CBoWH1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmw +X7A5KGgOc90lmt4S +-----END CERTIFICATE----- + +AOL_Time_Warner_Root_Certification_Authority_2 +-----BEGIN CERTIFICATE----- +MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC +VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB +bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAw +MFoXDTM3MDkyODIzNDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB +T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg +SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ7ouZzU9AhqS2TcnZsdw8TQ2FTBVs +RotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilbm2BPJoPRYxJWSXakFsKlnUWs +i4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOYxFSMFkpBd4aVdQxHAWZg +/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZYYCLqJV+FNwSbKTQ +2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbqJS5Gr42whTg0 +ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fxI2rSAG2X ++Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETzkxml +J85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh +EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNo +Kk/SBtc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJ +Kg71ZDIMgtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1Ex +MVCgyhwn2RAurda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaA +FE9pbQN+nZ8HGEO8txBO1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAO/Ouyuguh4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0 +cnAxa8cZmIDJgt43d15Ui47y6mdPyXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRF +ASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q7C+qPBR7V8F+GBRn7iTGvboVsNIY +vbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKTRuidDV29rs4prWPVVRaAMCf/ +drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ClTluUI8JPu3B5wwn3la +5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyBM5kYJRF3p+v9WAks +mWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQmy8YJPamTQr5 +O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xOAU++CrYD +062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT9Y41 +xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H +hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOL +Z8/5fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= +-----END CERTIFICATE----- + +Baltimore_CyberTrust_Root +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG +EwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0 +MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUx +MjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNV +BAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZ +QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKMEuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+h +Xe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gR +QKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/CG9VwcPCP +wBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1 +pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNT +Px8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkC +AwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1BE3wMBIGA1Ud +EwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUA +A4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkT +I7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/ +oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67 +G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +beTRUSTed_Root_CA-Baltimore_Implementation +-----BEGIN CERTIFICATE----- +MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK +EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG +A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0 +aW9uMB4XDTAyMDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UE +ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx +BgNVBAMTKmJlVFJVU1RlZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRh +dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALx+xDmcjOPW +HIb/ymKt4H8wRXqOGrO4x/nRNv8i805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R +9U+jK7wYFuK13XneIviCfsuBH/0nLI/6l2Qijvj/YaOcGx6Sj8CoCd8JEey3 +fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92BFODEPM2dMPgwqZfT7syj0B9f +HBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+YmpkbIq2eszh+6l/ePazIjm +iSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7eHgZFLL8kFKJOGJg +B7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIaMA8GA1UdEwEB +/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4AAAEJKIOR +MTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3IgdXNl +IG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu +dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5k +YXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmlj +YXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0 +eSBBZ3JlZW1lbnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVT +VGVkIHdlYiBzaXRlLCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVj +dHNfc2VydmljZXMvaW5kZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3 +dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWww +HQYDVR0OBBYEFEU9w6nR3D8kVpgccxiIav+DR+22MB8GA1UdIwQYMBaAFEU9 +w6nR3D8kVpgccxiIav+DR+22MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0B +AQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCAWXf82n+0S9/DZEtqTg6t8n1Z +dwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu67RMdmgduyzFiEuhjA6p9 +beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AYgkHNZTfqjjJ+vWuZ +XTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb4cV97yHgjQ5d +UX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9CReJf8Py +05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== +-----END CERTIFICATE----- + +beTRUSTed_Root_CA +-----BEGIN CERTIFICATE----- +MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG +EwJXVzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQg +Um9vdCBDQXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYy +MDE0MjEwNFoXDTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNV +BAoTCWJlVFJVU1RlZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRow +GAYDVQQDExFiZVRSVVNUZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBANS0c3oTCjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4 +SP+00PpeQY1hRIfo7clY+vyTmt9P6j41ffgzeubx181vSUs9Ty1uDoM6GHh3 +o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwMjmVZxXH/YgmPqsWPzGCgc0rXOD8V +cr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX2P8ZDoMbjNx4RWc0PfSvHI3k +bWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2NR47rtMNE5qdMf1ZD6Li8 +tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5jrEq2I8QBoa2k5MUC +AwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNVHSAEggFQMIIB +TDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQagfFSZWxp +YW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVz +IGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0 +ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9u +IHByYWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJl +VFJVU1RlZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29t +L3ZhdWx0L3Rlcm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNU +ZWQuY29tL3ZhdWx0L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYD +VQQKEwliZVRSVVNUZWQxCzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub +2M3eKjEENGvKBxirZzAfBgNVHSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxir +ZzAOBgNVHQ8BAf8EBAMCAf4wDQYJKoZIhvcNAQEFBQADggEBAHlh26Nebhax +6nZR+csVm8tpvuaBa58oH2U+3RGFktToQb9+M70j5/Egv6S0phkBxoyNNXxl +pE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2jCBHOElQBp1yZzrwmAOtlmdE +/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe1lMBzW1MaFVA4e5rxyoA +AEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5mlWXKWWuGVUlBXJH +0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYctmBjRYoQtLpG +EK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4= +-----END CERTIFICATE----- + +beTRUSTed_Root_CA_-_Entrust_Implementation +-----BEGIN CERTIFICATE----- +MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK +EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG +A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0 +aW9uMB4XDTAyMDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UE +ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx +BgNVBAMTKmJlVFJVU1RlZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRh +dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1 +Q+xVkrYwfTVXDNvzDSduTPdQqJtOK2/b9a0cS12zqcH+e0TrW6MFDR/FNCsw +ACnxeECypP869AGIF37m1CbTukzqMvtDd5eHI8XbQ6P1KqNRXuE70mVpflUV +m3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdjDheT389Lrm5zdeDzqrmkwAkb +hepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCeyv78IZTuEyhL11xeDGbu +6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCktVjMFu5dZfsZJT4nX +LySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMBMIIBtwYDVR0g +BIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYIKwYBBQUH +AgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug +b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29u +ZGl0aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0 +YXRlbWVudCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGlj +aCBjYW4gYmUgZm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0 +cHM6Ly93d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRl +eC5odG1sMEIGCCsGAQUFBwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29t +L3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQD +AgAHMIGJBgNVHR8EgYEwfzB9oHugeaR3MHUxEjAQBgNVBAoTCWJlVFJVU1Rl +ZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYDVQQDEypiZVRS +VVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1wbGVtZW50YXRpb24xDTALBgNV +BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEwODI0MjdagQ8yMDIyMDQx +MTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFH1w5a44iwY/qhwa +j/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQwqoSEFjAMBgNV +HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkq +hkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ5V04 +ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB +evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220 +Y/ozADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2 +KjiS2d2kXgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFi +aDrmLzfzgYYhxKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep +9w== +-----END CERTIFICATE----- + +beTRUSTed_Root_CA_-_RSA_Implementation +-----BEGIN CERTIFICATE----- +MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUF +ADBiMRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBS +b290IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1w +bGVtZW50YXRpb24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBi +MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290 +IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVt +ZW50YXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQw +CY5X0LkGLG9uJIAiv11DpvpPrILnHGhwhRujbrWqeNluB0s/6d/16uhUoWGK +Di9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I1DpAa5LxmZZk3tv/ePTulh1HiXzU +vrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPktPDgaTuID0GQ+NRxQyTBjyZL +O1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnUGxlkVgoZ98zh/4avflhe +rHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8ercmsl9fNTGwxMLvF1 +S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIYMIICFDAMBgNV +HRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+AAADCSiD +kTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20v +cHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB +OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBj +cmVhdGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRo +ZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlv +bnMgb2YgdXNlLCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1l +bnQgYW5kIHRoZSBSZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2Fu +IGJlIGZvdW5kIGF0IHRoZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93 +d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1s +MAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAWgBSp7BR++dlDzFMrFK3P9/BZiUHN +GTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxStz/fwWYlBzRkwDQYJKoZIhvcNAQEF +BQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g6IHHtt9DwSwddUvUQo3neqh0 +3GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuKmET7m9cqg5c0Lcd9NUwt +NLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbdLrML3kqNWz2rDcI1 +UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28BbJ1zTcwfBwvNM +m2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3SK41ty8y +mmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= +-----END CERTIFICATE----- + +CAcert_org_-_root_CA +-----BEGIN CERTIFICATE----- +MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO +BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi +MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ +ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ +8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 +zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y +fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 +w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc +G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k +epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q +laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ +QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU +fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 +YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w +ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY +gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe +MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 +IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy +dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw +czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 +dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl +aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC +AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg +b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB +ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc +nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg +18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c +gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl +Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY +sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T +SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF +CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum +GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk +zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW +omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD +-----END CERTIFICATE----- + + + + +Certum_Root_CA +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYT +AlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNl +cnR1bSBDQTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJ +BgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNV +BAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AM6xwS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYV +M42sLQnFdvkrOYCJ5JdLkKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/Ox +LjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE +7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/KUz/iDsaW +VhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu +/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESS +bLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQaTOs9qmdvLdTN +/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvgGrZg +FCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqT +E5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYV +IZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo_AAA_Services_root +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJH +QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm +b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFB +IENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIz +MTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENB +IExpbWl0ZWQxITAfBgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL5AnfRu4ep2hxxNRUSO +vkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhGC1Pqy0wk +wLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfH +dr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf04 +9vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULi +mAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cmez6KJcfA3Z3m +NWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEKIz6W +8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwu +Y29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG +9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHC +v8S5dIa2LX1rzNLzRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdV +CYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAV +GI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C12yxow+ev+to +51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo_Secure_Services_root +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJH +QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm +b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2Vj +dXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4 +MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIg +TWFuY2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2Rv +IENBIExpbWl0ZWQxJDAiBgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2 +aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMBxM4KK0HDr +c4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP9nQ95IDC ++DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8 +j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWC +iIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtG +Cd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz6YiO/O1R65Nx +Tq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4EFgQU +PNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNo +dHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiF +Gv45jN5bBAS0VPmjZ55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXG +De+X3EyrEeFryzHRbPtIgKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsF +Vy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfU +a7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6s +Cx1HRR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo_Trusted_Services_root +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJH +QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm +b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1 +c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0y +ODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVy +IE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9k +byBDQSBMaW1pdGVkMSUwIwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNl +cnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhT +WvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh73TkVvFVI +xO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9 +C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/ +oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW1O24zG71++IsWL1/ +T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7kUlcsutT6vif +R4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1UdDgQW +BBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2 +hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2Vy +dmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdT +mw7pSqBYaWcOrp32pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+C +l5EfKNsYEYwq5GWDVxISjBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/g +hhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVF +wL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOj +GM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +Digital_Signature_Trust_Co._Global_CA_1 +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG +EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw +DwYDVQQLEwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQw +MjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy +ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEB +AQUAA4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlR +EmlvMVW5SXIACH7TpWJENySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+Lth +zfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2io74CTADKAqjuAQIxZA9SLRN0 +dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E +YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg +U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNV +BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIx +MDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5fpFpRhgTCgJ3 +pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAMBgNV +HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 +DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN +QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomA +sH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6 +w4pl +-----END CERTIFICATE----- + +Digital_Signature_Trust_Co._Global_CA_2 +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGp +MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM +YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv +LjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx +ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDEx +ODE4NTVaFw0wODExMjgxODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE +CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp +Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDEx +FjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0BCQEWEmNhQGRp +Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdfWvnTLnUv2Chi0ZMv/E3U +q4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uKxBmd9LIO/BZsubEF +koPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBEzUNKcI5YhZXh +TizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F5X5yP4Wd +lGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMvOnNn +7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG +9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+ +LegzZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvV +WlHG4VMElo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX +8ngvYzZAOONGDx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn8 +6Oawde3uPclwx12qgUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsT +F7ANUkz+/m9c4pFuHf2kYtdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A== +-----END CERTIFICATE----- + +Digital_Signature_Trust_Co._Global_CA_3 +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG +EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw +DwYDVQQLEwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3 +MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy +ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEB +AQUAA4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fB +w18DW9Fvrn5C6mYjuGODVvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87e +ZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd +55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E +YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg +U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNV +BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIw +OTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6CTShlgDzJQW6s +NS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAMBgNV +HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 +DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR +xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLb +dHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlih +w6ID +-----END CERTIFICATE----- + +Digital_Signature_Trust_Co._Global_CA_4 +-----BEGIN CERTIFICATE----- +MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGp +MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM +YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv +LjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx +ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAy +MjQ2MTZaFw0wODExMjcyMjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE +CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp +Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDIx +FjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0BCQEWEmNhQGRp +Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbVp9oaBBg5kkp4o4HC9Xd6 +ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWwBZoPFflrWXJW8vo5 +/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl5WJp3OXuAFK9 +MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi3sOP17ih +YqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+QVCv +bK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG +9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWog +WxyQ2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6 +HE3K1GjNI3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV +6YyDfFk/xPEL553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8 +PzGn0EdzMzkbzE5q10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30 +sPDst2yC7S8xmUJMqbINuBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg== +-----END CERTIFICATE----- + +Entrust.net_Global_Secure_Personal_CA +-----BEGIN CERTIFICATE----- +MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NB +X0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT +HChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 +c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAy +MDcxNjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0 +Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29y +cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg +RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xp +ZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTU +rcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB +3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn5JVn1j+SgF7y +NH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNVHR8E +gdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAw +PgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy +ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0 +Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw +IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQD +AgEGMB8GA1UdIwQYMBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQW +BBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 +fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWA +O9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+L +a3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7l +TRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKdzmVml64mXg== +-----END CERTIFICATE----- + +Entrust.net_Global_Secure_Server_CA +-----BEGIN CERTIFICATE----- +MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xf +Q1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVz +dC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wMDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtF +bnRydXN0Lm5ldDE/MD0GA1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMg +aW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykg +MjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5l +dCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0G +CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUw +tZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxK +wz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2dWcTC5/oVzbI +XQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEBBAQD +AgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0Vu +dHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAy +MDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0 +IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV +BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIw +NDE3NTAwMFowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc +/vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNV +HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkq +hkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvv +yQbvH9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVp +bbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/ +bIkz8OwVDw== +-----END CERTIFICATE----- + +Entrust.net_Premium_2048_Secure_Server_CA +-----BEGIN CERTIFICATE----- +MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNf +MjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT +HChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 +c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEy +MjQxNzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0 +Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29y +cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkg +RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4 +QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/EC +DNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuXMlBvPci6Zgzj +/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzWnLLP +KQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZd +enoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB +0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJ +FrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B +AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFh +fGPjK50xA3B20qMooPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVU +KcgF7bISKo30Axv/55IQh7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaoho +wXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2 ++z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof888 +6ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== +-----END CERTIFICATE----- + +Entrust.net_Secure_Personal_CA +-----BEGIN CERTIFICATE----- +MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UE +BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50 +cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBs +aW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExp +bWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBa +MIHJMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNV +BAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3Jw +LiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50 +cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GL +ADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSv +x1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux5zDeg7K6PvHV +iTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTmT173 +iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkw +ggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 +cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0Ff +SW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UE +CxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50 +cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYD +VQQDEwRDUkwxMCygKqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9D +bGllbnQxLmNybDArBgNVHRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkx +MDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW +/O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwG +A1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQ +OokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzzwy5E97BnRqqS5TvaHBkU +ODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYGJqibGapE +PHayXOw= +-----END CERTIFICATE----- + +Entrust.net_Secure_Server_CA +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UE +BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50 +cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE +AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQsw +CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3 +dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh +Yi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkMTow +OAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0 +VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHIN +iC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3wkrYKZImZNHk +mGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcwggHT +MBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHY +pIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChs +aW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBM +aW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNo +dHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAi +gA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMC +AQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYE +FPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9 +B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKn +CqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2Zcgx +xufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd2cNgQ4xYDiKWL2KjLB+6 +rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +Equifax_Secure_CA +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG +EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1 +cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4 +MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgx +LTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0 +eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2R +FGiYCh7+2gRvE4RiIcPRfM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO +/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuv +K9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAGA1UdHwRp +MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEt +MCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 +MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjAL +BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gjIBBPM5iQn9Qw +HQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMBAf8w +GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB +AFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y +7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2u +FHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 +-----END CERTIFICATE----- + +Equifax_Secure_eBusiness_CA_1 +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJV +UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1 +aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcN +MjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZh +eCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2lu +ZXNzIENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fe +k6lfWg0XTzQaDJj0ItlZ1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5 +/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4aIZX5UkxVWsUPOE9G+m34LjXW +HXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBkMBEGCWCG +SAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4 +MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBq +R3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnm +JXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+WB5Hh1Q+WKG1 +tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+KpYr +tWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +Equifax_Secure_eBusiness_CA_2 +-----BEGIN CERTIFICATE----- +MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlm +YXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5 +MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXgg +U2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0Et +MjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF +7Y6yEb3+6+e0dMKP/wXn2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKD +pkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HM +HMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAGA1UdHwRp +MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBT +ZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y +MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjAL +BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBqy/3YIHqngnYw +HQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMBAf8w +GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB +AAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy +0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkt +y3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN +-----END CERTIFICATE----- + +Equifax_Secure_Global_eBusiness_CA +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJV +UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1 +aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0 +MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoT +E0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJl +IEdsb2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEAuucXkAJlsTRVPEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQy +td4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORR +OhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxnhcXIw2EC +AwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8w +HwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6o +oHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf +2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkAZ70Br83gcfxa +z2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIYNMR1 +pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +GeoTrust_Global_CA +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYT +AlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVz +dCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBC +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE +AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEH +CIjaWC9mOSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlC +GDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7 +csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAj +Nvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdRe +JivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQAB +o1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9 +qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1luMrMTjANBgkq +hkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Qzxpe +R+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWV +Yrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot +2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeX +xx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GlobalSign_Root_CA +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzEL +MAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV +BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05 +ODA5MDExMjAwMDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkw +FwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRsw +GQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQDaDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR +4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc +71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4 +bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgK +OOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMW +ea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DP +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQUYHtmGkUNl8qJ +UC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOC +AQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq75bCd +PTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q +gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT +2iHRrH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlD +NPYPhyk7ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBg +Hcl5JLL2bP2oZg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w== +-----END CERTIFICATE----- + +GTE_CyberTrust_Global_Root +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgw +FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRy +dXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3Qg +R2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1 +MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYD +VQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMT +GkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4usJTQGz0O9pTAipTHBsiQl8i4 +ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcqlHHK6XALn +ZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8F +LztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh3 +46B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq +81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0PlZPvy5TYnh+d +XIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- + +GTE_CyberTrust_Root_CA +-----BEGIN CERTIFICATE----- +MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgw +FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRy +dXN0IFJvb3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQsw +CQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQD +ExNHVEUgQ3liZXJUcnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQC45k+625h8cXyvRLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8K +DPufpz+iCWaEVh43KRuH6X4MypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPw +KfWVWgkWYXcKIiXUT0Wqx73llt/51KiOQswkwB6RJ0q1bQaAYznEol44AwID +AQABMA0GCSqGSIb3DQEBBAUAA4GBABKzdcZfHeFhVYAA1IFLezEPI2PnPfMD ++fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWlIjeaY8JIILTbcuPI9tl8vrGv +U9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9ApybW1EDp3zdHSo1TRJ6V6e +6bR64eVaH4QwnNOfpSXY +-----END CERTIFICATE----- + +IPS_Chained_CAs_root +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjEzMDEGA1UECxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MTMwMQYDVQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlw +cy5lczAeFw0wMTEyMjkwMDUzNThaFw0yNTEyMjcwMDUzNThaMIIBHDELMAkG +A1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vs +b25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNl +cyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYw +OTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFpbmVkIENBcyBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1h +aWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJspQg +vJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB +hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQT +y2nBBt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8w +HQYDVR0OBBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCC +AUGAFKGtMbH5PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQG +EwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx +LjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMu +bC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0 +NTIxMzAxBgNVBAsTKklQUyBDQSBDaGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTEzMDEGA1UEAxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p +cHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRk +MGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggr +BgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYK +KwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBz +QG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglg +hkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg +aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3 +Lmlwcy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5p +cHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYt +aHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/ +MDkGCWCGSAGG+EIBBwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl +bmV3YWxDQUMuaHRtbD8wNwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBz +LmVzL2lwczIwMDIvcG9saWN5Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYo +aHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCg +LoYsaHR0cDovL3d3d2JhY2suaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNBQy5j +cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p +cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1WWKJBGyi3leGmGpVfp3hA +K+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfNHnNDJGD1HWHc3Jag +vPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvNb2ar7QMiRDjM +Wb2f2/YHogF/JsRj9SVCXmK9 +-----END CERTIFICATE----- + +IPS_CLASE1_root +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAx +MTIyOTAwNTkzOFoXDTI1MTIyNzAwNTkzOFowggESMQswCQYDVQQGEwJFUzES +MBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNV +BAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzAp +BgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAs +BgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +LjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywSzHb5 +BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS +YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJ +ZHMQKD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzc +uh9morKbadB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKb +adB4CKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl +bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu +ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFp +bC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0Eg +Q0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMg +Q0EgQ0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcN +AQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E +BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUH +AwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB +FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw +GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0Bt +YWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRpZmlj +YXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQt +FitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3Js +MD8GCWCGSAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl +dm9jYXRpb25DTEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93 +d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgB +hvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT +RTEuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9p +cHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFj +ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0UxLmNybDAvBggrBgEFBQcB +AQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI +hvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuKYn4VLenZMdMu9Ccj/1ur +xUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpjV4F1Wo7ojPsCwJTG +Kbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+hjM+5i9Ibq9U +kE6tsSU= +-----END CERTIFICATE----- + +IPS_CLASE3_root +-----BEGIN CERTIFICATE----- +MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAx +MTIyOTAxMDE0NFoXDTI1MTIyNzAxMDE0NFowggESMQswCQYDVQQGEwJFUzES +MBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNV +BAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzAp +BgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAs +BgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +LjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZH49N +zjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY +8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBx +RiVrSXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLn +ev42USGjmFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGj +mFsMNKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl +bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu +ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFp +bC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0Eg +Q0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMg +Q0EgQ0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcN +AQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E +BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUH +AwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB +FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw +GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0Bt +YWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRpZmlj +YXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC +BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQt +FitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3Js +MD8GCWCGSAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl +dm9jYXRpb25DTEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93 +d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgB +hvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT +RTMuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9p +cHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFj +ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0UzLmNybDAvBggrBgEFBQcB +AQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI +hvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dDqsfwfewPxqmurpYPdikc +4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9D6eSb9ijBmgpjnn1 +/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGyr33I6unUVtkO +E7LFRVA= +-----END CERTIFICATE----- + +IPS_CLASEA1_root +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcN +MDExMjI5MDEwNTMyWhcNMjUxMjI3MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwG +A1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjEr +MCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEv +MC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8m2md +d81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd +ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1 +e+J8eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/ +2LUDnf473P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf47 +3P7yiuYV3TChggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlC +YXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIElu +dGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBz +QG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBT +IENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ +KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM +BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYI +KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB +BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEE +BAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBDQSBD +ZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgB +hvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xB +U0VBMS5jcmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmV2b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAW +Lmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRt +bD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv +cG9saWN5Q0xBU0VBMS5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93 +d3cuaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNMQVNFQTEuY3JsMDagNKAyhjBo +dHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j +cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p +cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyAAIQVCtWYUQxkxZwCWINm +yq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeFaQoO42Hu6r4okzPV +7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aLH2betgPAK7N4 +1lUH5Y85UN4HI3LmvSAUS7SG +-----END CERTIFICATE----- + +IPS_CLASEA3_root +-----BEGIN CERTIFICATE----- +MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcN +MDExMjI5MDEwNzUwWhcNMjUxMjI3MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVT +MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwG +A1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjEr +MCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEv +MC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvNG7uG +BiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU +VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4 +Ninn6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2 +YZM50yz82l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz8 +2l09BXW3mQKhggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlC +YXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIElu +dGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBz +QG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBT +IENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT +JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ +KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM +BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYI +KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB +BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEE +BAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB +D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBDQSBD +ZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG +SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgB +hvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xB +U0VBMy5jcmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lw +czIwMDIvcmV2b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAW +Lmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRt +bD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv +cG9saWN5Q0xBU0VBMy5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93 +d3cuaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNMQVNFQTMuY3JsMDagNKAyhjBo +dHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j +cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p +cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca2on0eisxeewBwMwB9dbB +/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI3y2s6Q73nMify5NF +8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYSAfWRMS1Jjbs/ +RU4s4OjNtckUFQzjB4ObJnXv +-----END CERTIFICATE----- + +IPS_Servidores_root +-----BEGIN CERTIFICATE----- +MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIw +EAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UE +ChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVz +MRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBz +QG1haWwuaXBzLmVzMB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1ow +gaMxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcT +CUJBUkNFTE9OQTEZMBcGA1UEChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UE +CxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEe +MBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyYXZhkJAk8IbPMGbWOlI6H0fg3 +PqHILVikgDVboXVsHUUMH2Fjal5vmwpMwci4YSM1gf/+rHhwLWjhOgeYlQJU +3c0jt4BT18g3RXIGJBK6E2Ehim51KODFDzT9NthFf+G4Nu+z4cYgjui0OLzh +PvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACzzw3lYJN7GO9HgQmm4 +7mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsUdx+2/iU9 +4aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14cJ58 +GNCr+Lh3B0Zx8coLY1xq+XKU1QFPoNtC +-----END CERTIFICATE----- + +IPS_Timestamping_root +-----BEGIN CERTIFICATE----- +MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYT +AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu +MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s +LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 +MjE0MDIGA1UECxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTE0MDIGA1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwu +aXBzLmVzMB4XDTAxMTIyOTAxMTAxOFoXDTI1MTIyNzAxMTAxOFowggEeMQsw +CQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJj +ZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZp +Y2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEIt +NjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3RhbXBpbmcgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBUaW1lc3RhbXBp +bmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lw +c0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLju +VqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4 +Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6 +KaFYq6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAw +ggR8MB0GA1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSC +AUcwggFDgBSL0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkG +A1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vs +b25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNl +cyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYw +OTI5NDUyMTQwMgYDVQQLEytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MTQwMgYDVQQDEytJUFMgQ0EgVGltZXN0YW1waW5n +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNA +bWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsG +A1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUF +BwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGC +NwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw +EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5l +czBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl +IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwW +Gmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFo +dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcu +Y3JsMEUGCWCGSAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAy +L3Jldm9jYXRpb25UaW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUW +M2h0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGlu +Zy5odG1sPzBABglghkgBhvhCAQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBz +MjAwMi9wb2xpY3lUaW1lc3RhbXBpbmcuaHRtbDB/BgNVHR8EeDB2MDegNaAz +hjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBp +bmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9p +cHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYB +BQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEA +ZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk36MNbsMRnLWha +sl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I3pGW7hdb +rqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU= +-----END CERTIFICATE----- + +QuoVadis_Root_CA +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQG +EwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNa +Fw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9W +YWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1 +lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMukJ0KX0J+D +isPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj18 +2d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Sp +x2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZ +yH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospUxbF6lR1xHkop +igPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4wPQYI +KwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFk +aXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlh +bmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBw +YXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRp +ZmljYXRpb24gcHJhY3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmlj +YXRlIFBvbGljeS4wIgYIKwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMu +Ym0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYw +gaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCLMA4GA1UdDwEB/wQEAwIB +BjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lofFIk3Wdv +OXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10 +buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe +/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6 +isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQ +NiOKSnQ2+Q== +-----END CERTIFICATE----- + +RSA_Root_Certificate_1 +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD +ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu +Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRp +b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv +bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy +NjAwMjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x +NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24g +QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x +IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2f +NUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChM +MFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqYJJgpp0lZpd34 +t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs3x/b +e0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0Wu +PIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- + +RSA_Security_1024_v3 +-----BEGIN CERTIFICATE----- +MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUF +ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg +U2VjdXJpdHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAx +NDlaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT +QSBTZWN1cml0eSAxMDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB +gQDV3f5mCc8kPD6ugU5OisRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dY +rIMKo1W1exeQFYRMiu4mmdxY78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYt +bzZUaMjShFbuklNhCbM/OZuoyZu9zp9+1BlqFikYvtc6adwlWzMaUQIDAQAB +o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSME +GDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAdBgNVHQ4EFgQUxMAcpAeU/c1N +AdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEAPy1q4yZDlX2Jl2X7deRy +HUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdNT1+nr6JGFLkM88y9 +am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgDmMrzVcydro7B +qkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= +-----END CERTIFICATE----- + +RSA_Security_2048_v3 +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUF +ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg +U2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5 +MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT +QSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37 +RqtBaB4Y6lXIL5F4iSj7Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E +0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J +6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iHKrtjEAMq +s6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzD +uvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2Mw +YTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAW +gBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NRMKSq6UWuNST6 +/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmYv/3V +EhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5g +EydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJq +aHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEk +llgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +Security_Communication_Root_CA +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJK +UDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0 +eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMw +OTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1 +c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RD +QTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8 +V6UMbXaKL0u/ZPtM7orw8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpx +xpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uMDPpVmDvY6CKhS3E4eayXkmmz +iX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX5HA49LY6 +tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819 +uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/L +TX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZ +aNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g0dNq +/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94 +nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNn +PaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfci +oU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera_Class_1_Root_CA +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJG +STEPMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENB +MB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMC +RkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue ++H887dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mX +y47vPxVnqIJyY1MPQYx9EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNY +wBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JF +hfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF6452F/NM8Ec +yonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW +1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB +/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuXZfsSZ9gqXLar +5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxVyhbM +p6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2 +nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv +kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2y +Ix4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa +-----END CERTIFICATE----- + +Sonera_Class_2_Root_CA +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJG +STEPMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENB +MB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMC +RkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE ++hY3/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gX +GM2RX/uJ4+q/Tl18GybTdXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQ +TiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMGf+dJQMjFAbJUWmYdPfz56TwK +noG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8PtOFCx4j1 +P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURr +BGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB +/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zilzqsWuasvfDXL +rNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEIcbCd +jdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr4 +50kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkeja +nZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +Staat_der_Nederlanden_Root_CA +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG +EwJOTDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQD +Ex1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIz +NDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVT +dGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRl +cmxhbmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAmNK1URF6gaYUmHFtvsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rF +DBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02PjLwYdjeFnejKScfST5gTCaI+ +Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGcaC1Hoi6Ce +UJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7l +r7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4Zl +kuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGO +MAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDwwOgYIKwYBBQUH +AgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9vdC1w +b2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg +0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k +/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVF +IGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0 +C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBp +IzlWYGeQiy52OfsRiJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYV +wSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +StartCom_Ltd__Free_SSL_Certification_Authority +-----BEGIN CERTIFICATE----- +MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx +DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0 +Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS +YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoXDTM1MDMxMDE3Mzc0 +OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVp +bGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3Jp +dHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkxITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG +9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x +18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5 +yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYI +LzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0G +A1UdDgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOW +zL3+MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT +BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4x +GjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3Rh +cnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV +HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8G +CWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAy +BglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5j +cmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJ +YIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/ +YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1 +ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p +00UOpO6wNnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLb +cCOxgN8aIDjnfg== +-----END CERTIFICATE----- + +TC_TrustCenter__Germany__Class_2_CA +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT +AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD +VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 +b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENB +MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe +Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE +RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE +ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y +a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTEp +MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmk +qYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJO +gtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8/vhYnvgpjbB7 +zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w +DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G +CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+W +LDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xR +T3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac +ASZ4smZHcFFk +-----END CERTIFICATE----- + +TC_TrustCenter__Germany__Class_3_CA +-----BEGIN CERTIFICATE----- +MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT +AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD +VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 +b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENB +MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe +Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE +RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE +ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y +a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTEp +MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w +DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQ +GwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYn +v68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDWw1Krj10nnGvA +o+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w +DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G +CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4 +iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yC +GdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS +CdS7kjXvD9s0 +-----END CERTIFICATE----- + +TDC_Internet_Root_CA +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQG +EwJESzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50 +ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTda +MEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNV +BAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4Nr +XceO+YQwzho7+vvOi20jxsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaq +HF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5 +Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc5IogCSEW +Vmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8n +mHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwID +AQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBY +oFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIEludGVybmV0MR0w +GwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JMMTAr +BgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjAL +BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw +HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8w +HQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m +gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKs +LtB9KOy282A4aW8+2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7T +mHnaCB4Mb7j4Fifvwm899qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE +64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQ +V0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- + +TDC_OCES_Root_CA +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQG +EwJESzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0w +MzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQww +CgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSj +hFuHnEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8 +z3sM8W9Hpg1DTeLpHTk0zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJH +hNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvViGjaXbXqzRowwYCDdlCqT9HU +3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBdedObaE+3p +Hx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTw +tyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYB +BQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBvc2l0b3J5MIGd +BggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBmcmEg +ZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x +LiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg +T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEG +A1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERD +MRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm +aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0Q +BCQwIoAPMjAwMzAyMTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0j +BBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4S +GSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDAN +BgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBu +o7E4A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjND +fZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8Aqt +FxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoBmbgGglGBTvH1tJFUuSN6 +AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1AoLbrIyi +gfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2Lq +L19iUw== +-----END CERTIFICATE----- + +Thawte_Personal_Basic_CA +-----BEGIN CERTIFICATE----- +MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBl +cnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNp +Y0B0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVow +gcsxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNV +BAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAm +BgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNV +BAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZ +cGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB +jQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTK +P1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdKwPQIcOk8RHtQ +fmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7G1sY0b8j +kyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOB +gQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 +c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95 +B21P9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== +-----END CERTIFICATE----- + +Thawte_Personal_Freemail_CA +-----BEGIN CERTIFICATE----- +MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBl +cnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1m +cmVlbWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIz +NTk1OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUx +EjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRp +bmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x +JDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqG +SIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkq +hkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0N +j3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5ErHzmj+hND3Ef +QDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgkCGqY +x7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP +MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgC +neSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr +5PjRzneigQ== +-----END CERTIFICATE----- + +Thawte_Personal_Premium_CA +-----BEGIN CERTIFICATE----- +MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBl +cnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXBy +ZW1pdW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5 +NTlaMIHPMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIw +EAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5n +MSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSMw +IQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3 +DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw7 +7f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWIEt12TfIa/G8j +Hnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYDZicRFTuq +W/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH +b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVx +eTBhKXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1 +KzGJ +-----END CERTIFICATE----- + +Thawte_Premium_Server_CA +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy +dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3Rl +IFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl +cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1 +OVowgc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQ +BgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcg +Y2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x +ITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3 +DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0B +AQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhI +NTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPL +lyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/qgeN +9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B +AQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZ +a4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcU +Qg== +-----END CERTIFICATE----- + +Thawte_Server_CA +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du +MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy +dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3Rl +IFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 +ZS5jb20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkG +A1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2Fw +ZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE +CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQ +VGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRz +QHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I +/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC +6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCXL+eQbcAoQpnX +TEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzARMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWD +TSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdni +TCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +Thawte_Time_Stamping_CA +-----BEGIN CERTIFICATE----- +MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMC +WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmls +bGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmlj +YXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcw +MTAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTAT +BgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN +BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24x +HzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcN +AQEBBQADgY0AMIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+oJ9O0yeB8 +WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR +5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7 +X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN +AQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC9RAIDb/LogWK +0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQpgCed/r8 +zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZCayJ +SdM= +-----END CERTIFICATE----- + +UTN_DATACorp_SGC_Root_CA +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUF +ADCBkzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw +HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVU +TiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2 +MzBaMIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNh +bHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx +ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEbMBkGA1UEAxMS +VVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+O +GQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrr +U0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrL +Z9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykqlXvY8qdOD1R8 +oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv33i+ +Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4Gr +MIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8v +Y3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUE +IzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 +DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHc +rpY6CiM+iVnJowftGzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuM +FrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1 ++XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdO +jtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jF +VkwPDPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- + +UTN_USERFirst_Email_Root_CA +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUF +ADCBrjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw +HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVU +Ti1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAe +Fw05OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJV +UzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93 +d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJzdC1DbGll +bnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxq +mNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqk +kqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6lL8/K2m2qL+us +obNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHGTPNp +saguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZU +Ot4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws +6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0G +A1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJ +hkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll +bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEF +BQcDAgYIKwYBBQUHAwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rk +MPxTbyUkxsrt4jFcKw7u7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK +2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/ +bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJR +warVNZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf +6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQ +jvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- + +UTN_USERFirst_Hardware_Root_CA +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUF +ADCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw +HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVU +Ti1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5 +MTgxOTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQH +Ew5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3 +b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNV +BAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZ +FvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6N +q9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEH +OG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNdoI6yqqr2jmmI +BsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjfPe58 +BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhb +AgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWG +M2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3 +YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0o +XnWO6y1n7k57K9cM//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjA +bPLPSbtNk28GpgoiskliCE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59 +Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4f +Fm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchq +J/kniCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0q +UZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- + +UTN-USER_First-Network_Applications +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUF +ADCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw +HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVU +Ti1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0 +ODM5WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgT +AlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT +RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVz +dC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNh +dGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZV +hawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAb +GHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZ +NaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hAReYFmnjDRy7rh4 +xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwiP8vv +/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7i +gEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD +AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf +8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0 +LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G +CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXh +i6r/fWRRzwr/vH3YIWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUq +f9FuVSTiuwL7MT++6LzsQCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAf +hZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvP +NximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+ +FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjis +H8SE +-----END CERTIFICATE----- + +UTN_USERFirst_Object_Root_CA +-----BEGIN CERTIFICATE----- +MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUF +ADCBlTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 +IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw +HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVU +Ti1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4 +NDAzNlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMO +U2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29y +azEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMR0wGwYDVQQD +ExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r55 +96Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc +/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2 +yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+pKvEHDHd17bR +5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7RwvC +bNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEA +AaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0 +cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNy +bDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw +DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXF +wfNfLEzIR1pp6ujwNTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T +7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85 +dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U ++CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCA +GKCGhU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2o +Ps0AH8g= +-----END CERTIFICATE----- + +ValiCert_Class_1_VA +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD +ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu +Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRp +b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv +bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy +NTIyMjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x +NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24g +QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x +IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw +8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m ++FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8YTfwggtFzVXSN +dnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwGlN+V +YH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8so +gTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- + +ValiCert_Class_2_VA +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD +ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu +Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRp +b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv +bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy +NjAwMTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x +NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g +QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x +IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 +DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc +65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQ +b7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QSv4dk+NoS/zcn +wbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZSWI4 +OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZ +oDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- + +Verisign_Class_1_Public_Primary_Certification_Authority +-----BEGIN CERTIFICATE----- +MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8x +CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UE +CxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eTAeFw05NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh +c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCB +nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3 +noaACpEO+jglr0aIguVzqKCbJF0NH8xlbgyw0FaEGIeaBpsQoXPftFg5a27B +9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR4k5FVmkfeAKA2txHkSm7NsljXMXg +1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATANBgkqhkiG9w0BAQIFAAOBgQBM +P7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZoEWx8QszznC7EBz8UsA9P +/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5FvjqBUuUfx3CHMjj +t/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89FxlA== +-----END CERTIFICATE----- + +Verisign_Class_1_Public_Primary_Certification_Authority_-_G2 +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcEx +CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE +CxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt +IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG +A1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j +LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq +0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9 +Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSmFc/IReumXY6c +PvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9Zr +bWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul +uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4i +P/68DzFc6PLZ +-----END CERTIFICATE----- + +Verisign_Class_1_Public_Primary_Certification_Authority_-_G3 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHK +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV +BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 +IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD +BgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 +MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s +IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV +BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFBy +aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRR +ZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO8ESlV8dAWB6j +Rx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJrKsh +JlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7P +oBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHh +v2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQ +BfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N +y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUf +xJM8/XmPBNQ+T+r3ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFM +DSZl4kSAHsef493oCtrspSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5 +SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXV +OBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- + +Verisign_Class_1_Public_Primary_OCSP_Responder +-----BEGIN CERTIFICATE----- +MIIDnjCCAwegAwIBAgIQK2jUo0aexTsoCas4XX8nIDANBgkqhkiG9w0BAQUF +ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 +BgNVBAsTLkNsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov +L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAx +IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQC57V56Ondfzl86UvzNZPdxtW9qlsZZklWUXS9bLsER +6iaKy6eBPPZaRN56Ey/9WlHZezcmSsAnPwQDalbBgyzhb1upVFAkSsYuekyh +WzdUJCExH6F4GHansXDaItBq/gdiQMb39pt9DAa4S8co5GYjhFHvRreT2IEz +y+U2rMboBQIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT +CE9DU1AgMS0xMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwudmVyaXNp +Z24uY29tL3BjYTEuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIGCCsGAQUF +BwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j +b20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG +CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1Ud +EwQCMAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAHCQ3bjkvlMX +fH8C6dX3i5mTMWCNfuZgayTvYKzSzpHegG0JpNO4OOVEynJeDS3Bd5y9LAN4 +KY2kpXeH9fErJq3MB2w6VFoo4AnzTQoEytRYaQuns/XdAaXn3PAfusFdkI2z +6k/BEVmXarIrE7HarZehs7GgIFvKMquNzxPwHynD +-----END CERTIFICATE----- + +Verisign_Class_2_Public_Primary_Certification_Authority +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL +Ey5DbGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf +MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZM +JaLtVRKXxaeAufqDwSCg+i8VDXyhYGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvE +erf4Zh+AVPy3wo5ZShRXRtGak75BkQO7FYCTXOvnzAhsPz6zSvz/S2wj1VCC +JkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBAIob +K/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxgJ8pFUs4W7z8GZOeUaHxg +MxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Ncr6Pc5iaAIzy4RHT3 +Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY +-----END CERTIFICATE----- + +Verisign_Class_2_Public_Primary_Certification_Authority_-_G2 +-----BEGIN CERTIFICATE----- +MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHB +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNV +BAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4g +LSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24g +VHJ1c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTla +MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6 +BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA +p4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkf +rbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjwDqL7MWzJ5m+Z +Jwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEAATAN +BgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/ +7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX +rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6x +RnInjBJ7xUS0rg== +-----END CERTIFICATE----- + +Verisign_Class_2_Public_Primary_Certification_Authority_-_G3 +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcox +CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UE +CxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkg +VmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMG +A1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcx +NjIzNTk1OVowgcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwg +SW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UE +CxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1 +c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJp +bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY8 +1nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDOJxOeBUebMXoT +2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7C9UT +AJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQ +HgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVC +YQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekh +ktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf +0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydE +p85EXdQbkJgNHkKUsQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377B +MnMiIYtYgXsVkXq642RIsH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab +5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//jGHyJizNdrDPX +p/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- + +Verisign_Class_2_Public_Primary_OCSP_Responder +-----BEGIN CERTIFICATE----- +MIIDnjCCAwegAwIBAgIQCUYX5h3Y1BygDKBi6HmKpzANBgkqhkiG9w0BAQUF +ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 +BgNVBAsTLkNsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDAwODAxMDAwMDAwWhcNMDQwNzMxMjM1OTU5WjCBpzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov +L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAy +IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDQymMxYX9ENHwFfQs9apDLeUt3Cj9LxyPlwGItfpx+ +PoiHkdCs6E1Jh6KWkIrdBKUCP4yb6Yn+YqDiWr3I3bR45qVCkwhnAcAgTddc +9F3as+M3plIaLExlTYqH2aij8UlUuzxcgFFoxvtJ/wtVqxXd+5rBuR10DbKM +RF2J/J/5gwIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT +CE9DU1AgMS0yMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwudmVyaXNp +Z24uY29tL3BjYTIuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIGCCsGAQUF +BwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j +b20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG +CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1Ud +EwQCMAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAB99CW4kRnUE +nPMmm+M5bhfvvL2iG9IChIar0ECXLMRDiDcZayKoA3FQnSDcNmAgmnMtc1Vs +WJsswrQ0LHozQsqR2elDr88e4PXEeqs/cmMeqTfhWzuIsxOGgpBXy1f/9Fa+ +It3jl6jhvCJDwt1N2/aBnpIUnjkPE1TegtjAXjSN +-----END CERTIFICATE----- + +Verisign_Class_3_Public_Primary_Certification_Authority +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL +Ey5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf +MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69q +RUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94f56TuZoAqiN91qyFomNFx3In +zPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Olhec9vn2a +/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtM +EivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPw +TtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzk +uxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- + +Verisign_Class_3_Public_Primary_Certification_Authority_-_G2 +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcEx +CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE +CxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt +IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG +A1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j +LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM +XtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXX +wc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg013gfqLptQ5GV +j0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01U +bSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo +1KpYoJ2daZH9 +-----END CERTIFICATE----- + +Verisign_Class_3_Public_Primary_Certification_Authority_-_G3 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHK +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV +BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 +IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD +BgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 +MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s +IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV +BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFBy +aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2 +R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2tKmFZpGcmTNDo +vFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUccLwg +TS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+V +k7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJ +OxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my +/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoA +Wii/gt/4uhMdUIaC/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8S +GhJouPtmmRQURVyu565pF4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbb +o27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh +/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Verisign_Class_3_Public_Primary_OCSP_Responder +-----BEGIN CERTIFICATE----- +MIIDojCCAwugAwIBAgIQLpaev7ZibOx76XPM42zBhDANBgkqhkiG9w0BAQUF +ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 +BgNVBAsTLkNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov +L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAz +IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDx5AgOg7t140jluNum8Lmr6Txix141W9ACVBHYydFW +uXZLuat65s269gwE1n7WsAplrE454/H3LaMlOe+wi8++2wxdbnD0B81w9zrA +PjUW7XiMQ8/CJi5H1oZ9nPG+1mcMIiWkymXmH3p4KC8/BdsEIb/hRWb+PLeC +7Vq4FhW5VQIDAQABo4IBFDCCARAwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT +CE9DU1AgMS0zMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9jcmwudmVyaXNp +Z24uY29tL3BjYTMuMS4xLmNybDATBgNVHSUEDDAKBggrBgEFBQcDCTBCBggr +BgEFBQcBAQQ2MDQwMgYIKwYBBQUHMAGmJhYkaHR0cDovL29jc3AudmVyaXNp +Z24uY29tL29jc3Avc3RhdHVzMEQGA1UdIAQ9MDswOQYLYIZIAYb4RQEHAQEw +KjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL1JQQTAJ +BgNVHRMEAjAAMAsGA1UdDwQEAwIHgDANBgkqhkiG9w0BAQUFAAOBgQAC9lNj +wKke8tCLMzCPSJtMsFa0g3FKvtxQ2PW24AvbvXhP6c8JNNopSZ0Bc1qRkYJU +LBMK03cjzzf8Y96n4/a3tWlFKEnDkdyqRxypiJksBSqNjYr6YuJatwAgXTnE +KMLL/J6oia5bPY4S6jKy/OsU1wkVGsDNG9W1FU5B1ZbjTg== +-----END CERTIFICATE----- + +Verisign_Class_4_Public_Primary_Certification_Authority_-_G2 +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcEx +CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE +CxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt +IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow +gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG +A1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j +LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6 +8OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTK +QWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtKqsGgtG7rL+VX +xbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGI +L4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y +cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckzt +ImRPT8qAkbYp +-----END CERTIFICATE----- + +Verisign_Class_4_Public_Primary_Certification_Authority_-_G3 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHK +MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV +BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 +IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD +BgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 +MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s +IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV +BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFBy +aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYl +S+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ+mGuqPKljYXC +KtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM8BDc +VHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdL +MEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDD +Zq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1Wr +IhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt +mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csK +vE+MW8VLADsfKoKmfjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluP +QSjA1egtTaRezarZ7c7c2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kP +mF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr +9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- + +Verisign_RSA_Secure_Server_CA +-----BEGIN CERTIFICATE----- +MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzEL +MAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMu +MS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MB4XDTk0MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UE +BhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD +VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGb +MA0GCSqGSIb3DQEBAQUAA4GJADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6O +LDfO6zV4ZFQD5YRAUcm/jwjiioII0haGN1XpsSECrXZogZoFokvJSyVmIlZs +iAeP94FZbYQHZXATcXY+m3dM41CJVphIuR2nKRoTLkoRWZweFdVJVCxzOmmC +sZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZIhvcNAQECBQADfgBl3X7hsuyw +4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3YQO2WxZpO8ZECAyIUwxr +l0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc1/p3yjkWWW8O6tO1 +g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== +-----END CERTIFICATE----- + +Verisign_Secure_Server_OCSP_Responder +-----BEGIN CERTIFICATE----- +MIIDnzCCAwygAwIBAgIRAP9F1SddJPuzwjkkU1fhT94wDQYJKoZIhvcNAQEF +BQAwXzELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5 +LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5MB4XDTAwMDgwNDAwMDAwMFoXDTA0MDgwMzIzNTk1OVowgZ4x +FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6 +Ly93d3cudmVyaXNpZ24uY29tL1JQQSAoYykwMDElMCMGA1UEAxMcU2VjdXJl +IFNlcnZlciBPQ1NQIFJlc3BvbmRlcjCBnzANBgkqhkiG9w0BAQEFAAOBjQAw +gYkCgYEAuFGZZIUO7rMKaPC/Y3YdU/X8oXiMM+6f9L452psPTUepjyDoS0S9 +zs17kNEw6JDEJXuJKN699pMd/7n/krWpjeSuzOLDB4Nqo3IQASdiIqY1Jjkt +ns9gDPxHpNfQQninHWzQy08VpykKtJVFxLHnWgnXOZXYHTWewr2zXcEMSx8C +AwEAAaOCAR0wggEZMCAGA1UdEQQZMBekFTATMREwDwYDVQQDEwhPQ1NQIDEt +NDA+BgNVHR8ENzA1MDOgMaAvhi1odHRwOi8vY3JsLnZlcmlzaWduLmNvbS9S +U0FTZWN1cmVTZXJ2ZXItcC5jcmwwEwYDVR0lBAwwCgYIKwYBBQUHAwkwQgYI +KwYBBQUHAQEENjA0MDIGCCsGAQUFBzABpiYWJGh0dHA6Ly9vY3NwLnZlcmlz +aWduLmNvbS9vY3NwL3N0YXR1czBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBwEB +MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9SUEEw +CQYDVR0TBAIwADALBgNVHQ8EBAMCB4AwDQYJKoZIhvcNAQEFBQADfgAAsxBT +ZpxJky4xoAJC0lhXfmah/huKYRhQQCweK0Gl1tv/rAgcWgVtAlwqtpZPR9u+ +TtvOzLqGuBjOsRKRX2P380g+zPFNE+RtCZR4AJLLoyCdBgtqoEMHztEZbI8Y +dZqfFzP9qSa44+LewqjEWop/mNYHBmvMVp6GcM7U7w== +-----END CERTIFICATE----- + +Verisign_Time_Stamping_Authority_CA +-----BEGIN CERTIFICATE----- +MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUF +ADCBwTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTww +OgYDVQQLEzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24g +QXV0aG9yaXR5IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1 +OTU5WjCBpTEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBh +dCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTAwMSwwKgYDVQQD +EyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1dGhvcml0eSBDQTCBnzANBgkq +hkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVlizrQJIkRpivglWtvtDbc2 +fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU/OB4naCTuQk9I1F/ +RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11S7zi6ESHzeZB +CiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/AgEAMEUG +A1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0dHBz +Oi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0 +cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIG +CCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJp +c2lnbi5jb20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2 +DcIBcBlK0lRWHqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQn +Keg3S/LvRJdrF1Eaw1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937n +tag+RaypJXUie28/sJyU58dzq6wf7iWbwBbtt8pb8BQ= +-----END CERTIFICATE----- + +Visa_eCommerce_Root +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUF +ADBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlz +YSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMT +E1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0 +MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UE +CxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAa +BgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh +28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8bRaVK7362 +rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81 +q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtF +Wsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0 +lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaLdXe6YJ2E5/4t +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOC +AQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKht +cbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGI +xHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/ +hC3euiInlhBx6yLt398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Visa_International_Global_Root_2 +-----BEGIN CERTIFICATE----- +MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMC +VVMxDTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25h +bCBTZXJ2aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcN +MDAwODE2MjI1MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzEN +MAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNl +cnZpY2UgQXNzb2NpYXRpb24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZ +DK9vZBv42pWUJGkzEXDK41Z0ohdXZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJ +XLB1LRckaeNCYOTudNargFbYiCjh+20i/SN8RnNPflRzHqgsVVh1t0zzWkWl +Ahr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU58fy+pmjIlC++QU3o63tmsPm +7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/ghalMCXI5Etuz9c9OYmTa +xhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E1w0cslSsMoW0ZA3e +QbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ca3CBfYDdYDO +qU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqG +SIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHbmQdp +NSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ +kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoL +axhNdBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/Rt +Ldh6yumJivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8 +ofyrEK9ca3CnB+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G +-----END CERTIFICATE----- + +ICA XSF +-----BEGIN CERTIFICATE----- +MIIHADCCBmmgAwIBAgIBFDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCSUwx +DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0 +Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS +YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA2MTIwMjIzNTUyMVoXDTExMTIwMjIzNTUy +MVowgdgxCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhDb2xvcmFkbzEjMCEGA1UECgwa +SmFiYmVyIFNvZnR3YXJlIEZvdW5kYXRpb24xIzAhBgNVBAsMGlNlY3VyZSBDZXJ0 +aWZpY2F0ZSBTaWduaW5nMUYwRAYDVQQDDD1TdGFydENvbSBDbGFzcyAxIEludGVy +bWVkaWF0ZSBDQSAtIEphYmJlciBTb2Z0d2FyZSBGb3VuZGF0aW9uMSQwIgYJKoZI +hvcNAQkBFhVjZXJ0bWFzdGVyQGphYmJlci5vcmcwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCeju/E54r6cwRmEzkGwBIq5anE2IHM10iYIeqOjTnN2WMM +XERxgmuSpwJays/BaMATh1/QFnMHjXiTICmeyXbJ2fKrxTHPCJ+DUeLbFvVX3bOO +SxAffkCLwZuUw9RyZ9zDLBNpR1FsdiSD9mV9DEH4T3sNU79Mjy+o83jFojTg39R7 +nH8B6z7VLmlC+ENxsMqjdwRv7HtY595VBLwK/gejblT8kCVFFA/WjmiOVoZ4aMGd +OOvsSgEZ9LaejB4xZdq+PP40DjxqhMQw89uzhWnCxxh0h+4PNfxhbPqJxZ9UMUWg +uPLYPAoj9U5p3YgmRvEaKdrijOkhODeNVkV/a57jAgMBAAGjggN6MIIDdjAMBgNV +HRMEBTADAQH/MAsGA1UdDwQEAwIBJjAdBgNVHQ4EFgQUe47EZ9BGIRcR/6F6QnWf +6sSrcuQwgd0GA1UdIwSB1TCB0oAUHInDlsy9/jLVDYyBMbaYnY0oZI2hgbakgbMw +gbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVpbGF0 +MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3JpdHkg +RGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +ITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZ4IBADAgBgNVHREEGTAX +gRVjZXJ0bWFzdGVyQGphYmJlci5vcmcwHQYDVR0SBBYwFIESYWRtaW5Ac3RhcnRj +b20ub3JnMBEGCWCGSAGG+EIBAQQEAwIABzBUBglghkgBhvhCAQ0ERxZFU3RhcnRD +b20gQ2xhc3MgMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEphYmJlciBTb2Z0 +d2FyZSBGb3VuZGF0aW9uMGIGA1UdHwRbMFkwKaAnoCWGI2h0dHA6Ly9jZXJ0LnN0 +YXJ0Y29tLm9yZy9jYS1jcmwuY3JsMCygKqAohiZodHRwOi8vY3JsLnN0YXJ0Y29t +Lm9yZy9jcmwvY2EtY3JsLmNybDCCAUoGA1UdIASCAUEwggE9MIIBOQYLKwYBBAGB +tTcBAQEwggEoMC8GCCsGAQUFBwIBFiNodHRwOi8vY2VydC5zdGFydGNvbS5vcmcv +cG9saWN5LnBkZjA1BggrBgEFBQcCARYpaHR0cDovL2NlcnQuc3RhcnRjb20ub3Jn +L2ludGVybWVkaWF0ZS5wZGYwgb0GCCsGAQUFBwICMIGwMBQWDVN0YXJ0Q29tIEx0 +ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpM +ZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRj +b20ub3JnL3BvbGljeS5wZGYwDQYJKoZIhvcNAQEFBQADgYEAtOq85Q1lf8PjsJCg +uQ6TL3TJ1rSadfOwEyHJqIjR5LYpxdcJ5WxSEM3DxdrFnTaPBC6RQ7v836i9DdW3 +FS5/y1Et5gKksLNPQqaYEVFuvB4AGTp2HkdUGo8Oz9Dd4zTcvTSTeo/9mVxqdxKa +lhMZMHD/ivqg8faZSQNYMg6xq7I= +-----END CERTIFICATE----- + diff --git a/po/de.po b/po/de.po index a4a641ec6..ec658b229 100644 --- a/po/de.po +++ b/po/de.po @@ -9,8 +9,8 @@ msgstr "" "Project-Id-Version: gajim 0.11\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-03-29 13:38+0200\n" -"PO-Revision-Date: 2007-03-29 13:41+0100\n" -"Last-Translator: Benjamin Drung \n" +"PO-Revision-Date: 2007-08-03 23:11+0100\n" +"Last-Translator: Michael Skiba \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -204,9 +204,8 @@ msgid "Account Modification" msgstr "Kontoänderung" #: ../data/glade/account_modification_window.glade.h:6 -#, fuzzy msgid "Administration operations" -msgstr "Administratorliste" +msgstr "Administrative Aktionen" #: ../data/glade/account_modification_window.glade.h:7 msgid "Auto-reconnect when connection is lost" @@ -379,9 +378,8 @@ msgid "Synch_ronize account status with global status" msgstr "Konto-Status mit globalem _Status abgleichen" #: ../data/glade/account_modification_window.glade.h:42 -#, fuzzy msgid "Synchronise contacts" -msgstr "_Abgemeldete Kontakte anzeigen" +msgstr "Synchronisiere Kontakte" #: ../data/glade/account_modification_window.glade.h:43 msgid "Use _SSL (legacy)" @@ -1039,9 +1037,8 @@ msgid "_Bookmark This Room" msgstr "Raum zu _Lesezeichen hinzufügen" #: ../data/glade/gc_control_popup_menu.glade.h:7 -#, fuzzy msgid "_Destroy room" -msgstr "_Neuer Raum" +msgstr "_Raum zerstören" #: ../data/glade/gc_occupants_menu.glade.h:1 msgid "Mo_derator" @@ -2338,9 +2335,8 @@ msgid "Bulgarian" msgstr "Bulgarisch" #: ../src/chat_control.py:52 -#, fuzzy msgid "Breton" -msgstr "Briton" +msgstr "Bretonisch" #: ../src/chat_control.py:52 msgid "Czech" @@ -2367,7 +2363,6 @@ msgid "Spanish" msgstr "Spanisch" #: ../src/chat_control.py:52 -#, fuzzy msgid "Basque" msgstr "Baskisch" @@ -2752,11 +2747,11 @@ msgstr "Sperrliste" #: ../src/config.py:2180 msgid "Member List" -msgstr "Mitgliedsliste" +msgstr "Mitgliederliste" #: ../src/config.py:2181 msgid "Owner List" -msgstr "Listenbesitzer" +msgstr "Besitzerliste" #: ../src/config.py:2182 msgid "Administrator List" @@ -3203,23 +3198,20 @@ msgid "%s is not the name of a group chat." msgstr "%s ist kein Name eines Gruppenchats." #: ../src/dialogs.py:1327 -#, fuzzy msgid "Without a connection, you can not synchronise your contacts." -msgstr "Sie müssen verbunden sein, um Ihr Passwort zu ändern" +msgstr "Sie müssen verbunden sein, um Ihre Kontakte zu Synchronisieren." #: ../src/dialogs.py:1374 -#, fuzzy msgid "This account is not connected to the server" -msgstr "Konto \"%s\" ist mit Server verbunden" +msgstr "Konto \"%s\" ist nicht mit dem Server verbunden" #: ../src/dialogs.py:1375 -#, fuzzy msgid "You cannot synchronize with an account unless it is connected." -msgstr "Sie können einem Gruppenchat erst beitreten, wenn Sie verbunden sind." +msgstr "Sie können nicht mit einem Konto Synchronisieren, solange es nicht verbunden ist." #: ../src/dialogs.py:1399 msgid "Synchronise" -msgstr "" +msgstr "Synchronisieren" #: ../src/dialogs.py:1457 #, python-format @@ -4557,19 +4549,21 @@ msgstr "Bitte geben Sie an, welchen Spitznamen Sie verwenden möchten:" #. Ask for a reason #: ../src/groupchat_control.py:1457 -#, fuzzy, python-format +#, python-format msgid "Destroying %s" -msgstr "Beschreibung: %s" +msgstr "Zerstöre %s" #: ../src/groupchat_control.py:1458 msgid "" "You are going to definitively destroy this room.\n" "You may specify a reason below:" msgstr "" +"Sie werden den Raum endgültig zerstören.\n" +"Sie können hier einen Grund angeben:" #: ../src/groupchat_control.py:1460 msgid "You may also enter an alternate venue:" -msgstr "" +msgstr "Sie können auch einen alternativen Raum eintragen:" #: ../src/groupchat_control.py:1490 msgid "Bookmark already set" @@ -5161,11 +5155,11 @@ msgid "Metacontacts are a way to regroup several contacts in one line. Generally msgstr "Metakontakte sind eine Möglichkeit, mehrere Kontakte in einer Zeile zu gruppieren. Normalerweise benutzt man Sie, wenn eine Person mehrere Jabber- oder Transport-Konten hat." #: ../src/roster_window.py:4132 -#, fuzzy, python-format +#, python-format msgid "Do you want to send that file to %s:" msgid_plural "Do you want to send those files to %s:" msgstr[0] "%s möchte ihnen eine Datei senden:" -msgstr[1] "%s möchte ihnen eine Datei senden:" +msgstr[1] "%s möchte ihnen diese Datei senden:" #: ../src/roster_window.py:4237 #, python-format @@ -5722,7 +5716,7 @@ msgstr "Kann leer, 'chat' oder 'normal' sein. Wenn nicht leer, dann werden alle #: ../src/common/config.py:227 msgid "If True, Gajim will scroll and select the contact who sent you the last message, if chat window is not already opened." -msgstr "" +msgstr "Wenn aktiviert, wird Gajim automatisch zu der Person springen und auswählen, die die letzte Nachricht geschickt hat, falls das Chat Fenster nicht bereits offen ist." #: ../src/common/config.py:238 msgid "Priority will change automatically according to your status. Priorities are defined in autopriority_* options." @@ -5874,13 +5868,13 @@ msgstr "Falscher Host" #: ../src/common/connection_handlers.py:180 #: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 -#, fuzzy, python-format +#, python-format msgid "The host %s you configured as the ft_add_hosts_to_send advanced option is not valid, so ignored." -msgstr "Der Host, den Sie für die erweiterte Option ft_override_host_to_send angeben haben ist ungültig und wird ignoriert." +msgstr "Der Host %s, den Sie für die erweiterte Option ft_override_host_to_send angeben haben ist ungültig und wird ignoriert." #: ../src/common/connection_handlers.py:216 msgid "Invalid local address? :-O" -msgstr "" +msgstr "Ungültige Lokale Adresse? :-O" #: ../src/common/connection_handlers.py:607 #, python-format @@ -5940,14 +5934,13 @@ msgstr "" #. Room has been destroyed. see #. http://www.xmpp.org/extensions/xep-0045.html#destroyroom #: ../src/common/connection_handlers.py:1676 -#, fuzzy msgid "Room has been destroyed" -msgstr "Autorisierung wurde entfernt" +msgstr "Raum wurde zerstört" #: ../src/common/connection_handlers.py:1683 #, python-format msgid "You can join this room instead: %s" -msgstr "" +msgstr "Sie können stattdessen diesem Raum beitreten: %s" #: ../src/common/connection_handlers.py:1709 msgid "I would like to add you to my roster." @@ -5996,9 +5989,8 @@ msgid "Invalid answer" msgstr "Ungültige Antwort" #: ../src/common/connection.py:379 -#, fuzzy msgid "Connection to proxy failed" -msgstr "Verbindung fehlgeschlagen" +msgstr "Verbindung mit Proxy fehlgeschlagen" #: ../src/common/connection.py:433 #: ../src/common/connection.py:531 diff --git a/po/ru.po b/po/ru.po index b9c68395f..3fc70b80d 100644 --- a/po/ru.po +++ b/po/ru.po @@ -6,24 +6,24 @@ # This file is distributed under the same license as the gajim package. # # +#: ../src/gajim-remote.py:202 ../src/gajim-remote.py:209 # , 2005. # , 2005. -# Yakov Bezrukov , 2005, 2006. +# Yakov Bezrukov , 2005, 2006, 2007. # Yakov Bezrukov , 2005. -#: ../src/gajim-remote.py:202 ../src/gajim-remote.py:209 msgid "" msgstr "" "Project-Id-Version: ru\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2006-12-18 09:32+0100\n" -"PO-Revision-Date: 2006-11-22 18:17+0300\n" -"Last-Translator: Alex V. Myltsev \n" +"PO-Revision-Date: 2007-07-08 21:53+0700\n" +"Last-Translator: Yakov Bezrukov \n" "Language-Team: Русский \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" -"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: KBabel 1.11.4\n" #: ../data/gajim.desktop.in.in.h:1 msgid "A GTK+ Jabber client" @@ -62,7 +62,7 @@ msgstr "_Комната" #: ../data/glade/account_context_menu.glade.h:6 #: ../data/glade/zeroconf_context_menu.glade.h:1 msgid "_Modify Account..." -msgstr "_Редактировать учетную запись..." +msgstr "_Изменить учетную запись..." #: ../data/glade/account_context_menu.glade.h:7 msgid "_Open Gmail Inbox" @@ -99,7 +99,7 @@ msgstr "" #: ../data/glade/account_creation_wizard_window.glade.h:7 msgid "Connect when I press Finish" -msgstr "Подключиться, когда я нажму Конец" +msgstr "Подключиться, когда я нажму \"Завершить\"" #: ../data/glade/account_creation_wizard_window.glade.h:8 msgid "Gajim: Account Creation Wizard" @@ -134,7 +134,7 @@ msgstr "Параметры сервера" #: ../data/glade/account_creation_wizard_window.glade.h:15 msgid "Set my profile when I connect" -msgstr "Установить мой профиль при подсоединении" +msgstr "Настроить мой профиль после соединения" #: ../data/glade/account_creation_wizard_window.glade.h:16 msgid "" @@ -151,7 +151,7 @@ msgstr "Ваш JID:" #: ../data/glade/account_creation_wizard_window.glade.h:19 #: ../data/glade/roster_window.glade.h:11 msgid "_Advanced" -msgstr "_Дополнительные действия" +msgstr "_Дополнительно" #: ../data/glade/account_creation_wizard_window.glade.h:20 msgid "_Finish" @@ -160,7 +160,7 @@ msgstr "_Закончить" #: ../data/glade/account_creation_wizard_window.glade.h:21 #: ../data/glade/manage_proxies_window.glade.h:9 msgid "_Host:" -msgstr "_Хост: " +msgstr "_Хост:" #: ../data/glade/account_creation_wizard_window.glade.h:22 #: ../data/glade/account_modification_window.glade.h:47 @@ -321,7 +321,7 @@ msgstr "" #: ../data/glade/account_modification_window.glade.h:23 msgid "Information about you, as stored in the server" -msgstr "Информация о вас, как она хранится на сервере" +msgstr "Информация о вас, сохраненная на сервере" #: ../data/glade/account_modification_window.glade.h:24 msgid "Manage..." @@ -402,7 +402,7 @@ msgstr "Сохранить _парольную фразу (небезопасн #: ../data/glade/account_modification_window.glade.h:37 #: ../data/glade/zeroconf_properties_window.glade.h:19 msgid "Save conversation _logs for all contacts" -msgstr "_История всех контактов для этой учетной записи" +msgstr "_Сохранять историю для всех контактов" #: ../data/glade/account_modification_window.glade.h:39 msgid "Send keep-alive packets" @@ -415,7 +415,7 @@ msgstr "Син_хронизировать статус учетной запис #: ../data/glade/account_modification_window.glade.h:41 msgid "Use _SSL (legacy)" -msgstr "Использовать _SSL (legacy)" +msgstr "Использовать _SSL (устарело)" #: ../data/glade/account_modification_window.glade.h:42 msgid "Use custom hostname/port" @@ -449,6 +449,8 @@ msgid "" "This is only available if python-avahi is installed and avahi-daemon is " "running." msgstr "" +"Если отмечено, то все локальные контакты, которые используют Bonjour-совместимый клиент (напр. iChat, Trillian или Gaim) будут показаны в ростере. Для этого не нужно подключаться к jabber-серверу.\n" +"Доступно только в том случае, когда установлен python-avahi и запущен avahi-daemon." #: ../data/glade/accounts_window.glade.h:4 msgid "" @@ -464,7 +466,7 @@ msgstr "_Объединить учетные записи" #: ../data/glade/accounts_window.glade.h:6 msgid "_Enable link-local messaging" -msgstr "" +msgstr "_Включить локальный обмен сообщениями" #: ../data/glade/accounts_window.glade.h:7 msgid "_Modify" @@ -508,7 +510,7 @@ msgid "" "You must be connected to the transport to be able\n" "to add a contact from this protocol." msgstr "" -"Чтобы добавить контакт этого протокола,\n" +"Чтобы добавить контакт для этого протокола,\n" "нужно соединиться с транспортом." #: ../data/glade/add_new_contact_window.glade.h:11 @@ -537,7 +539,7 @@ msgstr "Произошла ошибка:" #: ../data/glade/adhoc_commands_window.glade.h:2 msgid "Choose command to execute:" -msgstr "Выберите команду:" +msgstr "Выберите команду:" #: ../data/glade/adhoc_commands_window.glade.h:3 msgid "Ad-hoc Commands - Gajim" @@ -545,7 +547,7 @@ msgstr "Специальные команды - Gajim" #: ../data/glade/adhoc_commands_window.glade.h:4 msgid "Check once more" -msgstr "" +msgstr "Проверить еще раз" #: ../data/glade/adhoc_commands_window.glade.h:5 msgid "Error description..." @@ -573,9 +575,7 @@ msgstr "Описание" #: ../data/glade/advanced_configuration_window.glade.h:2 msgid "NOTE: You should restart gajim for some setting to take effect" -msgstr "" -"ПРИМЕЧАНИЕ: Вы должны перезапустить gajim, чтобы некоторые настройки " -"были применены" +msgstr "ПРИМЕЧАНИЕ: Вы должны перезапустить gajim, чтобы некоторые настройки вступили в силу" #: ../data/glade/advanced_configuration_window.glade.h:3 msgid "Advanced Configuration Editor" @@ -587,7 +587,7 @@ msgstr "Фильтр:" #: ../data/glade/advanced_menuitem_menu.glade.h:1 msgid "Delete MOTD" -msgstr "Удалить MOTD" +msgstr "Удалить сообщение дня" #: ../data/glade/advanced_menuitem_menu.glade.h:2 msgid "Deletes Message of the Day" @@ -595,16 +595,15 @@ msgstr "Удаляет сообщение дня." #: ../data/glade/advanced_menuitem_menu.glade.h:3 msgid "Sends a message to currently connected users to this server" -msgstr "" -"Отправляет сообщение пользователям подсоединенным к серверу в данный момент" +msgstr "Отправляет сообщение пользователям подсоединенным к серверу в данный момент" #: ../data/glade/advanced_menuitem_menu.glade.h:4 msgid "Set MOTD" -msgstr "Установить MOTD" +msgstr "Установить собщение дня" #: ../data/glade/advanced_menuitem_menu.glade.h:5 msgid "Sets Message of the Day" -msgstr "Устанавливает фортунку" +msgstr "Устанавливает сообщение дня" #: ../data/glade/advanced_menuitem_menu.glade.h:6 msgid "Show _XML Console" @@ -624,7 +623,7 @@ msgstr "_Администрирование" #: ../data/glade/advanced_menuitem_menu.glade.h:10 msgid "_Privacy Lists" -msgstr "Списки доступа" +msgstr "_Списки доступа" #: ../data/glade/advanced_menuitem_menu.glade.h:11 msgid "_Send Server Message" @@ -636,7 +635,7 @@ msgstr "О_тправить одиночное сообщение" #: ../data/glade/advanced_notifications_window.glade.h:1 msgid " a window/tab opened with that contact " -msgstr "" +msgstr " с этим контактом уже открыты окно или вкладка" #: ../data/glade/advanced_notifications_window.glade.h:2 msgid "Actions" @@ -652,19 +651,16 @@ msgid "Sounds" msgstr "Звуки" #: ../data/glade/advanced_notifications_window.glade.h:5 -#, fuzzy msgid "Advanced Actions" -msgstr "Расширенный" +msgstr "Дополнительные действия" #: ../data/glade/advanced_notifications_window.glade.h:6 -#, fuzzy msgid "Advanced Notifications Control" -msgstr "Расширенный редактор настроек" +msgstr "Дополнительное управление уведомлениями" #: ../data/glade/advanced_notifications_window.glade.h:7 -#, fuzzy msgid "All statuses" -msgstr "Статус: " +msgstr "Все статусы" #: ../data/glade/advanced_notifications_window.glade.h:8 #: ../src/common/helpers.py:234 @@ -672,17 +668,16 @@ msgid "Away" msgstr "Ушел" #: ../data/glade/advanced_notifications_window.glade.h:9 -#, fuzzy msgid "Busy " -msgstr "Занят" +msgstr "Занят " #: ../data/glade/advanced_notifications_window.glade.h:10 msgid "Don't have " -msgstr "" +msgstr "Не имеет " #: ../data/glade/advanced_notifications_window.glade.h:11 msgid "Have " -msgstr "" +msgstr "Имеет " #: ../data/glade/advanced_notifications_window.glade.h:12 #: ../src/common/helpers.py:244 @@ -690,9 +685,8 @@ msgid "Invisible" msgstr "Невидимка" #: ../data/glade/advanced_notifications_window.glade.h:13 -#, fuzzy msgid "Launch a command" -msgstr "команда" +msgstr "Выполнить команду" #: ../data/glade/advanced_notifications_window.glade.h:14 #: ../src/common/helpers.py:217 @@ -701,17 +695,15 @@ msgstr "Недоступен" #: ../data/glade/advanced_notifications_window.glade.h:15 msgid "One or more special statuses..." -msgstr "" +msgstr "Один или несколько специальных статусов..." #: ../data/glade/advanced_notifications_window.glade.h:16 -#, fuzzy msgid "Online / Free For Chat" -msgstr "Готов поболтать" +msgstr "В сети / Готов поболтать" #: ../data/glade/advanced_notifications_window.glade.h:17 -#, fuzzy msgid "Play a sound" -msgstr "Проигрывать _звук" +msgstr "Проигрывать звук" #: ../data/glade/advanced_notifications_window.glade.h:18 msgid "" @@ -725,58 +717,63 @@ msgid "" "File Transfert Started \n" "File Transfert Finished" msgstr "" +"Получено сообщение\n" +"Контакт подключился\n" +"Контакт отключился\n" +"Контакт сменил статус\n" +"Упоминание в комнате\n" +"Сообщение в комнате\n" +"Запрос на передачу файла\n" +"Начата передача файла\n" +"Завершена передача файла" #: ../data/glade/advanced_notifications_window.glade.h:27 msgid "When " -msgstr "" +msgstr "Когда " #: ../data/glade/advanced_notifications_window.glade.h:28 -msgid "" -"_Activate window manager's UrgencyHint to make chat window in taskbar flash" -msgstr "" +msgid "_Activate window manager's UrgencyHint to make chat window in taskbar flash" +msgstr "_Активировать функцию оконного менеджера \"UrgencyHint\", чтобы окно беседы мигало на панели" #: ../data/glade/advanced_notifications_window.glade.h:29 -#, fuzzy msgid "_Disable auto opening chat window" -msgstr "Скрывает кнопки окна комнаты" +msgstr "_Отключить автоматическое открытие окна беседы" #: ../data/glade/advanced_notifications_window.glade.h:30 msgid "_Disable existing popup window" -msgstr "" +msgstr "_Отключиться все всплывающие окна" #: ../data/glade/advanced_notifications_window.glade.h:31 msgid "_Disable existing sound for this event" -msgstr "" +msgstr "_Отключить звуки для этого события" #: ../data/glade/advanced_notifications_window.glade.h:32 msgid "_Disable showing event in roster" -msgstr "" +msgstr "_Отключить показ события в ростере" #: ../data/glade/advanced_notifications_window.glade.h:33 msgid "_Disable showing event in systray" -msgstr "" +msgstr "_Отключить показ события в системном лотке" #: ../data/glade/advanced_notifications_window.glade.h:34 msgid "_Inform me with a popup window" -msgstr "" +msgstr "_Сообщить с помощью всплывающего окна" #: ../data/glade/advanced_notifications_window.glade.h:35 msgid "_Open chat window with user" -msgstr "" +msgstr "_Открыть окно беседы с контактом" #: ../data/glade/advanced_notifications_window.glade.h:36 -#, fuzzy msgid "_Show event in roster" -msgstr "Показывать только в _ростере" +msgstr "_Показывать событие в ростере" #: ../data/glade/advanced_notifications_window.glade.h:37 -#, fuzzy msgid "_Show event in systray" -msgstr "Показывать только в _ростере" +msgstr "_Показывать событие в лотке" #: ../data/glade/advanced_notifications_window.glade.h:38 msgid "and I " -msgstr "" +msgstr "и я" #: ../data/glade/advanced_notifications_window.glade.h:39 msgid "" @@ -784,55 +781,53 @@ msgid "" "group(s)\n" "everybody" msgstr "" +"контакт(ы)\n" +"группа(ы)\n" +"все" #: ../data/glade/advanced_notifications_window.glade.h:42 -#, fuzzy msgid "for " -msgstr "Порт: " +msgstr "для " #: ../data/glade/advanced_notifications_window.glade.h:43 msgid "when I'm in" -msgstr "" +msgstr "Когда я в " #: ../data/glade/atom_entry_window.glade.h:1 msgid "2003-12-13T18:30:02Z" -msgstr "" +msgstr "2003-12-13T18:30:02Z" #: ../data/glade/atom_entry_window.glade.h:2 msgid "Romeo and Juliet" -msgstr "" +msgstr "Иван и Марья" #: ../data/glade/atom_entry_window.glade.h:3 -#, fuzzy msgid "Entry:" -msgstr "Страна:" +msgstr "Запись:" #: ../data/glade/atom_entry_window.glade.h:4 -#, fuzzy msgid "Feed name:" -msgstr "имя тeмы" +msgstr "Название ленты:" #: ../data/glade/atom_entry_window.glade.h:5 -#, fuzzy msgid "Last modified:" -msgstr "Имя:" +msgstr "Последнее изменение:" #: ../data/glade/atom_entry_window.glade.h:6 -#, fuzzy msgid "New entry received" -msgstr "Когда получено новое сообытие" +msgstr "Получена новая запись" #: ../data/glade/atom_entry_window.glade.h:7 msgid "Old stories" -msgstr "" +msgstr "Старые записи" #: ../data/glade/atom_entry_window.glade.h:8 msgid "Soliloquy" -msgstr "" +msgstr "Монолог" #: ../data/glade/atom_entry_window.glade.h:9 msgid "You have received new entry:" -msgstr "" +msgstr "Получена новая запись:" #: ../data/glade/change_password_dialog.glade.h:1 msgid "Change Password" @@ -856,7 +851,7 @@ msgstr "Предустановленные сообщения:" #: ../data/glade/change_status_message_dialog.glade.h:3 msgid "Save as Preset..." -msgstr "Сохранить как предустановленный параметр..." +msgstr "Сохранить как предустановленное сообщение..." #: ../data/glade/chat_context_menu.glade.h:1 msgid "Join _Group Chat" @@ -894,7 +889,7 @@ msgstr "Начать беседу" #: ../data/glade/chat_control_popup_menu.glade.h:1 msgid "Click to see past conversations with this contact" -msgstr "Щелкните для просмотра бесед с этим человеком" +msgstr "Щелкните для просмотра последних бесед с этим человеком" #: ../data/glade/chat_control_popup_menu.glade.h:2 #: ../data/glade/roster_contact_context_menu.glade.h:8 @@ -1017,7 +1012,7 @@ msgstr "" "Учетная запись\n" "Группа\n" "Контакт\n" -"Баннер" +"Заголовок окна беседы" #: ../data/glade/gajim_themes_window.glade.h:6 msgid "Bold" @@ -1134,9 +1129,8 @@ msgid "_Voice" msgstr "_Право говорить" #: ../data/glade/groups_post_window.glade.h:1 -#, fuzzy msgid "Create new post" -msgstr "Новое сообщение" +msgstr "Создать новое сообщение" #: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:259 msgid "From" @@ -1354,7 +1348,7 @@ msgstr "Настройки GMail" #: ../data/glade/preferences_window.glade.h:7 msgid "Interface Customization" -msgstr "Настройки интерфейса" +msgstr "Настройка интерфейса" #: ../data/glade/preferences_window.glade.h:9 msgid "Preset Status Messages" @@ -1399,7 +1393,7 @@ msgid "" "An example: If you have enabled status message for away, Gajim won't ask you " "anymore for a status message when you change your status to away; it will " "use the default one set here" -msgstr "" +msgstr "Пример: если вы включили статусные сообщения для режима \"Отошел\", Gajim вас больше не будет спрашивать о статусом сообщении, когда вы смените статус на \"Отошел\", поскольку будет использовать значение по-умолчанию, которое установлено здесь" #: ../data/glade/preferences_window.glade.h:21 msgid "Ask status message when I:" @@ -1459,7 +1453,7 @@ msgstr "Тема статусных _иконок:" #: ../data/glade/preferences_window.glade.h:35 msgid "Display _extra email details" -msgstr "" +msgstr "Отображать _дополнительные данные о почте" #: ../data/glade/preferences_window.glade.h:36 msgid "Display a_vatars of contacts in roster" @@ -1470,9 +1464,8 @@ msgid "Display status _messages of contacts in roster" msgstr "Показать _сообщения о статусе контакта в ростере" #: ../data/glade/preferences_window.glade.h:38 -#, fuzzy msgid "Displayed Chat state noti_fications:" -msgstr "_Уведомление об изменении состояния:" +msgstr "Отображать уведомления со_стоянии беседы:" #: ../data/glade/preferences_window.glade.h:39 msgid "E_very 5 minutes" @@ -1487,15 +1480,13 @@ msgid "Events" msgstr "События" #: ../data/glade/preferences_window.glade.h:42 -#, fuzzy 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 " "display in chat windows." msgstr "" "Gajim может отсылать и получать метаданные относящиеся к беседе с контактом. " -"Здесь вы можете указать какие состояние беседы клиент будет отсылать вашему " -"респонденту." +"Здесь вы можете указать какие состояние беседы вы хотели бы видеть в окне беседы." #: ../data/glade/preferences_window.glade.h:43 msgid "" @@ -1508,8 +1499,7 @@ msgstr "" "отсылать вашему респонденту." #: ../data/glade/preferences_window.glade.h:44 -msgid "" -"Gajim will automatically show new events by poping up the relative window" +msgid "Gajim will automatically show new events by poping up the relative window" msgstr "" "Gajim будет автоматически показывать новые события, поднимая соответствующее " "окно." @@ -1539,16 +1529,14 @@ msgstr "" "правом нижнем углу экрана" #: ../data/glade/preferences_window.glade.h:48 -msgid "" -"Gajim will only change the icon of the contact that triggered the new event" -msgstr "" -"Gajim будет лишь менять иконку у контакта, от которого пришло новое сообщение" +msgid "Gajim will only change the icon of the contact that triggered the new event" +msgstr "Gajim будет лишь менять иконку у контакта, от которого пришло новое сообщение" #: ../data/glade/preferences_window.glade.h:50 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" -msgstr "" +msgstr "Если отмечено, то Gajim будет включать информацию об отправителе новых писем." #: ../data/glade/preferences_window.glade.h:51 msgid "" @@ -1628,9 +1616,8 @@ msgid "One message _window:" msgstr "Одно _окно сообщения:" #: ../data/glade/preferences_window.glade.h:66 -#, fuzzy msgid "Outgoing Chat state noti_fications:" -msgstr "_Уведомление об изменении состояния:" +msgstr "Исходящие у_ведомления о состоянии беседы:" #: ../data/glade/preferences_window.glade.h:67 msgid "Play _sounds" @@ -1725,9 +1712,8 @@ msgstr "" "http://trac.gajim.org/wiki/GajimAndMusicPlayer" #: ../data/glade/preferences_window.glade.h:86 -#, fuzzy msgid "_Advanced Notifications Control..." -msgstr "Расширенный редактор настроек" +msgstr "_Дополнительные настройки уведомлений..." #: ../data/glade/preferences_window.glade.h:87 msgid "_After time:" @@ -1847,7 +1833,7 @@ msgstr "Разрешить" #: ../data/glade/privacy_list_window.glade.h:9 msgid "JabberID" -msgstr "Jabber ID:" +msgstr "JabberID" #: ../data/glade/privacy_list_window.glade.h:10 msgid "Order:" @@ -1872,6 +1858,10 @@ msgid "" "from\n" "to" msgstr "" +"нет\n" +"оба\n" +"от\n" +"к" #: ../data/glade/privacy_list_window.glade.h:18 msgid "to send me messages" @@ -2075,7 +2065,7 @@ msgstr "Выполнить команду..." #: ../data/glade/roster_contact_context_menu.glade.h:6 #: ../src/roster_window.py:1951 msgid "In_vite to" -msgstr "Пригласить в комнату" +msgstr "_Пригласить в" #: ../data/glade/roster_contact_context_menu.glade.h:7 #: ../data/glade/systray_context_menu.glade.h:2 @@ -2242,9 +2232,8 @@ msgid "_Send & Close" msgstr "Отправить и _закрыть" #: ../data/glade/subscription_request_window.glade.h:1 -#, fuzzy msgid "Au_thorize" -msgstr "_Авторизовать" +msgstr "А_вторизовать" #: ../data/glade/subscription_request_window.glade.h:2 msgid "Authorize contact so he can know when you're connected" @@ -2297,9 +2286,8 @@ msgid "Contact" msgstr "Контакт" #: ../data/glade/vcard_information_window.glade.h:12 -#, fuzzy msgid "Contact Information" -msgstr "Личная информация" +msgstr "Информация о контакте" #: ../data/glade/vcard_information_window.glade.h:24 #: ../data/glade/zeroconf_information_window.glade.h:4 @@ -2386,6 +2374,8 @@ msgid "" "setup you can select another one here.\n" "You might consider to change possible firewall settings." msgstr "" +"Если порт по умолчанию, который используется для входящих сообщения вас не устраивает, вы можете выбрать другой.\n" +"Так же возможно придется изменить некоторые настройки брандмауэра." #: ../data/glade/zeroconf_properties_window.glade.h:15 msgid "Modify Account" @@ -2432,7 +2422,7 @@ msgstr "Болгарский" #: ../src/chat_control.py:52 msgid "Briton" -msgstr "" +msgstr "Бриттский" #: ../src/chat_control.py:52 msgid "Czech" @@ -2471,7 +2461,6 @@ msgid "Italian" msgstr "Итальянский" #: ../src/chat_control.py:52 -#, fuzzy msgid "Norvegian b" msgstr "Норвежский b" @@ -2659,9 +2648,8 @@ msgid "Group Chat Message Received" msgstr "Получено сообщение в комнате" #: ../src/config.py:1086 -#, fuzzy msgid "GMail Email Received" -msgstr "Получено приглашение" +msgstr "Получено письмо на Gmail" #: ../src/config.py:1289 msgid "OpenPGP is not usable in this computer" @@ -2681,8 +2669,7 @@ msgstr "Непросмотренные события" #: ../src/config.py:1340 msgid "To change the account name, you must read all pending events." -msgstr "" -"Для смены имени учетной записи необходимо просмотреть ожидающие события." +msgstr "Для смены имени учетной записи необходимо просмотреть ожидающие события." #: ../src/config.py:1344 msgid "Account Name Already Used" @@ -2757,8 +2744,7 @@ msgstr "Вы не подключены к серверу" #: ../src/config.py:1601 msgid "Without a connection, you can not edit your personal information." -msgstr "" -"Чтобы отредактировать личную информацию, нужно подсоединиться к серверу." +msgstr "Чтобы отредактировать личную информацию, нужно подсоединиться к серверу." #: ../src/config.py:1605 msgid "Your server doesn't support Vcard" @@ -2973,8 +2959,7 @@ msgid "This bookmark has invalid data" msgstr "Эта закладка содержит неверные данные" #: ../src/config.py:2749 -msgid "" -"Please be sure to fill out server and room fields or remove this bookmark." +msgid "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" "Пожалуйста, удостоверьтесь, что заполнены поля с именем сервера и комнаты, " "либо удалите эту закладку." @@ -3106,7 +3091,7 @@ msgstr "Имя контакта: %s" #: ../src/dialogs.py:61 #, python-format msgid "Jabber ID: %s" -msgstr "" +msgstr "Jabber ID: %s" #: ../src/dialogs.py:211 msgid "Group" @@ -3238,8 +3223,7 @@ msgstr "Не могу привязаться к порту %s." msgid "" "Maybe you have another running instance of Gajim. File Transfer will be " "canceled." -msgstr "" -"Возможно, запущен ещё один экземпляр Gajim. Передача файлов будет отменена." +msgstr "Возможно, запущен ещё один экземпляр Gajim. Передача файлов будет отменена." #: ../src/dialogs.py:1058 #, python-format @@ -3295,8 +3279,7 @@ msgstr "Начать беседу" msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" -msgstr "" -"Введите ник или ID пользователя, которому вы хотите отправить сообщение:" +msgstr "Введите ник или ID пользователя, которому вы хотите отправить сообщение:" #. if offline or connecting #: ../src/dialogs.py:1276 ../src/dialogs.py:1635 ../src/dialogs.py:1764 @@ -3612,7 +3595,7 @@ msgstr "Описание" #. Id column #: ../src/disco.py:1490 msgid "Id" -msgstr "" +msgstr "ID" #: ../src/disco.py:1713 msgid "Subscribed" @@ -3806,7 +3789,7 @@ msgstr "Пауза" #: ../src/gajim.py:47 msgid "Gajim needs Xserver to run. Quiting..." -msgstr "Gajim для запуска требуется X-сервер. Выход..." +msgstr "Gajim'у для запуска требуется X-сервер. Выход..." #: ../src/gajim.py:51 msgid "Gajim needs PyGTK 2.6 or above" @@ -3838,8 +3821,7 @@ msgstr "" "стабильную версию с %s" #: ../src/gajim.py:64 -msgid "" -"Please make sure that GTK+ and PyGTK have libglade support in your system." +msgid "Please make sure that GTK+ and PyGTK have libglade support in your system." msgstr "Пожалуйста, удостоверьтесь что GTK+ и PyGTK поддерживают libglade." #: ../src/gajim.py:69 @@ -3855,7 +3837,7 @@ msgstr "Gajim для запуска требуется pywin32" msgid "" "Please make sure that Pywin32 is installed on your system. You can get it at " "%s" -msgstr "" +msgstr "Пожалуйста, удостоверьтесь что в вашей системе установлен Pywin32. Вы можете получить его на сайте: %s" #. set the icon to all newly opened wind #: ../src/gajim.py:238 @@ -3940,12 +3922,12 @@ msgid "New mail on %(gmail_mail_address)s" msgstr "Новое письмо на %(gmail_mail_address)s" #: ../src/gajim.py:1201 -#, fuzzy, python-format +#, 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 непрочитанных сообщений" +msgstr[0] "У вас есть %d непрочитанное письмо" +msgstr[1] "У вас есть %d непрочитанных письма" +msgstr[2] "У вас есть %d непрочитанных письма" #. FIXME: emulate Gtalk client popups. find out what they parse and how #. they decide what to show @@ -3992,8 +3974,7 @@ msgstr "Такое имя уже есть" #: ../src/gajim.py:1559 msgid "Please type a new username for your local account" -msgstr "" -"Пожалуйста, введите новое имя пользователя для локальной учетной записи" +msgstr "Пожалуйста, введите новое имя пользователя для локальной учетной записи" #. it is good to notify the user #. in case he or she cannot see the output of the console @@ -4007,8 +3988,7 @@ msgstr "Network Manager не используется" #: ../src/gajim.py:2165 msgid "Session Management support not available (missing gnome.ui module)" -msgstr "" -"Отсутствует поддержка управления сессиями (отсутствует модуль gnome.ui)" +msgstr "Отсутствует поддержка управления сессиями (отсутствует модуль gnome.ui)" #: ../src/gajim-remote.py:66 msgid "Shows a help on specific command" @@ -4067,8 +4047,7 @@ msgstr "статус" #: ../src/gajim-remote.py:96 msgid "one of: offline, online, chat, away, xa, dnd, invisible " -msgstr "" -"один из: отключен, в сети, чат, отошел, недоступен, не беспокоить, невидимка" +msgstr "один из: отключен, в сети, чат, отошел, недоступен, не беспокоить, невидимка" #: ../src/gajim-remote.py:97 ../src/gajim-remote.py:118 #: ../src/gajim-remote.py:132 @@ -4124,13 +4103,11 @@ msgstr "PGP ключ" #: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 msgid "if specified, the message will be encrypted using this public key" -msgstr "" -"если указано, сообщение будет зашифровано с использованием открытого ключа" +msgstr "если указано, сообщение будет зашифровано с использованием открытого ключа" #: ../src/gajim-remote.py:121 ../src/gajim-remote.py:135 msgid "if specified, the message will be sent using this account" -msgstr "" -"если указано, сообщение будет отправлено с использованием этой учетной записи" +msgstr "если указано, сообщение будет отправлено с использованием этой учетной записи" #: ../src/gajim-remote.py:126 msgid "" @@ -4181,8 +4158,7 @@ msgstr "Путь до файла" #: ../src/gajim-remote.py:156 msgid "if specified, file will be sent using this account" -msgstr "" -"если указано, файл будет отправлен с использованием этой учетной записи" +msgstr "если указано, файл будет отправлен с использованием этой учетной записи" #: ../src/gajim-remote.py:161 msgid "Lists all preferences and their values" @@ -4198,8 +4174,7 @@ msgstr "ключ=значение" #: ../src/gajim-remote.py:167 msgid "'key' is the name of the preference, 'value' is the value to set it to" -msgstr "" -"'ключ' это название параметра, а 'значение' это то, что ему присваивают" +msgstr "'ключ' это название параметра, а 'значение' это то, что ему присваивают" #: ../src/gajim-remote.py:172 msgid "Deletes a preference item" @@ -4240,8 +4215,7 @@ msgstr "" "запись)" #: ../src/gajim-remote.py:207 -msgid "" -"Returns current status message(the global one unless account is specified)" +msgid "Returns current status message(the global one unless account is specified)" msgstr "" "Возвращает текущий статус (по умолчанию глобальный, если не указана учетная " "запись)" @@ -4468,10 +4442,8 @@ msgstr "" #: ../src/groupchat_control.py:1259 #, python-format -msgid "" -"Usage: /%s , opens a private chat window to the specified occupant." -msgstr "" -"Использование: /%s <ник>, открывает окно привата с указанным посетителем." +msgid "Usage: /%s , opens a private chat window to the specified occupant." +msgstr "Использование: /%s <ник>, открывает окно привата с указанным посетителем." #: ../src/groupchat_control.py:1263 #, python-format @@ -4483,9 +4455,7 @@ msgstr "Использование: /%s, очищает текстовое ок msgid "" "Usage: /%s [reason], closes the current window or tab, displaying reason if " "specified." -msgstr "" -"Использование: /%s [причина], закрывает текущее окно или вкладку, с приводя " -"причину, если она указана." +msgstr "Использование: /%s [причина], закрывает текущее окно или вкладку, приводя причину, если она указана." #: ../src/groupchat_control.py:1268 #, python-format @@ -4551,13 +4521,11 @@ msgstr "Использование: /%s, показывает список пр #: ../src/groupchat_control.py:1301 #, python-format msgid "Usage: /%s [topic], displays or updates the current group chat topic." -msgstr "" -"Использование: /%s [тема], показывает или изменяет текущую тему комнаты." +msgstr "Использование: /%s [тема], показывает или изменяет текущую тему комнаты." #: ../src/groupchat_control.py:1304 #, python-format -msgid "" -"Usage: /%s , sends a message without looking for other commands." +msgid "Usage: /%s , sends a message without looking for other commands." msgstr "" "Использование: /%s <сообщение>, отсылает сообщение без поиска других команд " "в нем." @@ -4573,8 +4541,7 @@ msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Вы точно хотите выйти из комнаты \"%s\"?" #: ../src/groupchat_control.py:1358 -msgid "" -"If you close this window, you will be disconnected from this group chat." +msgid "If you close this window, you will be disconnected from this group chat." msgstr "Если вы закроете это окно, то вы выйдете из этой комнаты." #: ../src/groupchat_control.py:1362 ../src/roster_window.py:3962 @@ -4716,8 +4683,7 @@ msgstr "Сообщение" msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" -msgstr "" -"Вы хотите очистить базу данных? (КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ ЕСЛИ GAJIM ЗАПУЩЕН)" +msgstr "Вы хотите очистить базу данных? (КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ ЕСЛИ GAJIM ЗАПУЩЕН)" #: ../src/history_manager.py:188 msgid "" @@ -4871,13 +4837,11 @@ msgstr "Публикация vCard не удалась" msgid "" "There was an error while publishing your personal information, try again " "later." -msgstr "" -"При публикации вашей личной информации произошла ошибка, попробуйте позже." +msgstr "При публикации вашей личной информации произошла ошибка, попробуйте позже." #: ../src/profile_window.py:374 msgid "Without a connection, you can not get your contact information." -msgstr "" -"Необходимо присоединиться к серверу для получения информации о контакте" +msgstr "Необходимо присоединиться к серверу для получения информации о контакте" #: ../src/roster_window.py:168 ../src/roster_window.py:223 msgid "Merged accounts" @@ -5018,7 +4982,7 @@ msgstr "_Новая комната" #: ../src/roster_window.py:1842 msgid "I would like to add you to my roster" -msgstr "Вы не против, если я добавлю Вас себе в ростер?" +msgstr "Вы не против, если я добавлю Вас к себе в ростер?" #: ../src/roster_window.py:2005 ../src/roster_window.py:2052 msgid "Send Group M_essage" @@ -5142,8 +5106,7 @@ msgstr "Неверная парольная фраза" #: ../src/roster_window.py:2725 msgid "Please retype your GPG passphrase or press Cancel." -msgstr "" -"Пожалуйста, введите парольную фразу для GPG еще раз или нажмите Отмена." +msgstr "Пожалуйста, введите парольную фразу для GPG еще раз или нажмите Отмена." #: ../src/roster_window.py:2782 ../src/roster_window.py:2842 msgid "You are participating in one or more group chats" @@ -5163,11 +5126,10 @@ msgstr "Нет доступной учетной записи" #: ../src/roster_window.py:2801 msgid "You must create an account before you can chat with other contacts." -msgstr "" -"Для начала беседы с другими людьми прежде необходимо создать учетную запись." +msgstr "Для начала беседы с другими людьми прежде необходимо создать учетную запись." #: ../src/roster_window.py:2899 -#, fuzzy, python-format +#, python-format msgid "\"%(title)s\" by %(artist)s" msgstr "%(artist)s \"%(title)s\"" @@ -5192,8 +5154,7 @@ msgstr "" "следующем подключении." #: ../src/roster_window.py:3956 -msgid "" -"You are about to create a metacontact. Are you sure you want to continue?" +msgid "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Вы хотите создать метаконтакт?" #: ../src/roster_window.py:3958 @@ -5201,7 +5162,7 @@ msgid "" "Metacontacts are a way to regroup several contacts in one line. Generaly it " "is used when the same person has several Jabber accounts or transport " "accounts." -msgstr "" +msgstr "Метаконтакты это метод группировки нескольких контактов в одну запись. Обычно это используется когда один и тот же человек имеет несколько аккаунтов в Jabber или на транспортах." #: ../src/roster_window.py:4125 #, python-format @@ -5328,9 +5289,8 @@ msgid "since %s" msgstr "с %s" #: ../src/vcard.py:277 -#, fuzzy msgid "Affiliation:" -msgstr "Ранг: " +msgstr "Ранг:" #: ../src/vcard.py:285 msgid "" @@ -5413,10 +5373,8 @@ msgid "Not available as a result of being idle" msgstr "Автостатус 'Недоступен' из-за бездействия пользователя." #: ../src/common/config.py:82 -msgid "" -"List (space separated) of rows (accounts and groups) that are collapsed." -msgstr "" -"Список (через пробел) строк (учётных записей и групп), которые свёрнуты." +msgid "List (space separated) of rows (accounts and groups) that are collapsed." +msgstr "Список (через пробел) строк (учётных записей и групп), которые свёрнуты." #: ../src/common/config.py:87 msgid "Enable link-local/zeroconf messaging" @@ -5432,21 +5390,23 @@ msgid "" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" "'never' - never print time." msgstr "" +"\"всегда\" - печатать время у каждого сообщения.\n" +"\"иногда\" - печатать время каждые несколько минут.\n" +"\"никогда\" - не печатать время." #: ../src/common/config.py:92 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " "to disable fuzzyclock. 1 is the most precise clock, 4 the less precise one. " "This is used only if print_time is 'sometimes'." -msgstr "" +msgstr "Печатать время в беседе как в неточных часах. Степень неточности может быть от 1 до 4, 0 отключает эту функцию. 1 самые точные часы, 4 самые неточные. Используется только если режим печати времени установлен на \"иногда\"." #: ../src/common/config.py:95 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Обрабатывать пары * / _ как возможные форматирующие символы." #: ../src/common/config.py:96 -msgid "" -"If True, do not remove */_ . So *abc* will be bold but with * * not removed." +msgid "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" "Если True, то не будут удаляться */_. Так что *фыва* будет написано " "полужирным шрифтом, но * * удалены не будут" @@ -5461,13 +5421,13 @@ msgstr "" msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." -msgstr "" +msgstr "Символ, который нужно добавлять к нику, когда используется дополнение (tab) в комнате." #: ../src/common/config.py:109 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." -msgstr "" +msgstr "Символ, который будет добавляться после ника, когда желаемый ник уже занят кем-нибудь в комнате." #: ../src/common/config.py:142 msgid "Add * and [n] in roster title?" @@ -5521,21 +5481,20 @@ msgid "" msgstr "" #: ../src/common/config.py:155 -msgid "" -"Sent chat state notifications. Can be one of all, composing_only, disabled." -msgstr "" +msgid "Sent chat state notifications. Can be one of all, composing_only, disabled." +msgstr "Отсылать уведомления о состоянии беседы. Может быть одним из \"все\", \"только написание\", \"отключено\"." #: ../src/common/config.py:156 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." -msgstr "" +msgstr "Отображать состояния беседы в окне беседы. Может быть одним из \"все\", \"только написание\", \"отключено\"." #: ../src/common/config.py:158 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." -msgstr "" +msgstr "Есди отключена печать времени для каждого сообщения, то печатать его каждые X минут." #: ../src/common/config.py:159 msgid "Ask before closing a group chat tab/window." @@ -5571,26 +5530,23 @@ msgstr "IEC утверждает что KiB = 1024 байт, KB = 1000 байт" #: ../src/common/config.py:168 msgid "Notify of events in the system trayicon." -msgstr "" +msgstr "Уведомлять о событиях в системном лотке." #: ../src/common/config.py:174 msgid "Show tab when only one conversation?" msgstr "Показывать вкладку при одной беседе?" #: ../src/common/config.py:175 -#, fuzzy msgid "Show tabbed notebook border in chat windows?" -msgstr "Показывать границу вкладки при одной беседе?" +msgstr "Показывать границу вкладки в окне беседы?" #: ../src/common/config.py:176 msgid "Show close button in tab?" msgstr "Показывать кнопку закрытия на вкладке?" #: ../src/common/config.py:189 -msgid "" -"A semicolon-separated list of words that will be highlighted in group chats." -msgstr "" -"Список слов (через точку с запятой), которые будут подсвечиваться в комнатах." +msgid "A semicolon-separated list of words that will be highlighted in group chats." +msgstr "Список слов (через точку с запятой), которые будут подсвечиваться в комнатах." #: ../src/common/config.py:190 msgid "" @@ -5629,12 +5585,11 @@ msgstr "" "которого её не было в последний раз или она уже слишком старая." #: ../src/common/config.py:196 -#, fuzzy msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." msgstr "" -"Если False, то вы больше не будете видеть статусную строку в окне беседы, " +"Если отключено, то Gajim больше не будет показывать статусную строку в окне беседы, " "когда контакт меняет его или её статус и/или сообщение о статусе." #: ../src/common/config.py:197 @@ -5644,28 +5599,27 @@ msgid "" "status and/or his or her status message. If \"all\" Gajim will print all " "status messages. If \"in_and_out\", gajim will only print FOO enters/leaves " "group chat." -msgstr "" +msgstr "может быть \"нет\", \"все\" или \"вход и выход\". Если установлено \"нет\", то Gajim больше не будет выводить сообщения о статусе в комнатах когда участник или участница меняет свой статус или сообщение о статусе. Если установлено в \"все\", то Gajim будет выводить все сообщения о статусе. Если установлено в \"вход и выход\", то Gajim будет выводить сообщение только когда кто-то входит или выходит из комнаты." #: ../src/common/config.py:199 msgid "Background color of contacts when they just signed in." -msgstr "" +msgstr "Фоновый цвет контакта, который только что вошел." #: ../src/common/config.py:200 msgid "Background color of contacts when they just signed out." -msgstr "" +msgstr "Фоновый цвет контакта, который только что вышел." #: ../src/common/config.py:202 -msgid "" -"If True, restored messages will use a smaller font than the default one." -msgstr "" +msgid "If True, restored messages will use a smaller font than the default one." +msgstr "Если установлено, то восстановленные сообщения будут иметь меньший шрифт." #: ../src/common/config.py:203 msgid "Don't show avatar for the transport itself." -msgstr "" +msgstr "Не показывать аватар для транспорта." #: ../src/common/config.py:204 msgid "Don't show roster in the system taskbar." -msgstr "" +msgstr "Не показывать ростер в панели задач." #: ../src/common/config.py:205 msgid "" @@ -5738,7 +5692,7 @@ msgstr "Скрывает список посетителей в окне ком msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." -msgstr "" +msgstr "При беседе, показывать ник в начале строки только тогда, когда его произносит участник отличный от того, кто сказал предыдущее." #: ../src/common/config.py:219 msgid "Indentation when using merge consecutive nickame." @@ -5746,24 +5700,24 @@ msgstr "" #: ../src/common/config.py:220 msgid "List of colors that will be used to color nicknames in group chats." -msgstr "" +msgstr "Список цветов, которые будут использоваться для раскраски ников в комнатах." #: ../src/common/config.py:221 msgid "Ctrl-Tab go to next composing tab when none is unread." -msgstr "" +msgstr "Использовать Ctrl-Tab чтобы перейти к следующей вкладке с составляемым сообщением, когда нет непрочитанных сообщений." #: ../src/common/config.py:222 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." -msgstr "" +msgstr "А нам надо показывать диалог подтверждения о создании метаконтакта? Если тут пустая строка, то сообщение не будет показываться вообще." #: ../src/common/config.py:223 msgid "" "If True, you will be able to set a negative priority to your account in " "account modification window. BE CAREFULL, when you are logged in with a " "negative priority, you will NOT receive any message from your server." -msgstr "" +msgstr "Если установлено, то у вас появится возможность назначить для аккаунта приоритет меньше нуля в окне настройки аккаунта. БУДЬТЕ ОСТОРОЖНЫ, если вы подключитесь еще раз с отрицательным приоритетом, то вы НЕ получите никаких сообщений от сервера." #: ../src/common/config.py:234 msgid "" @@ -5794,17 +5748,17 @@ msgstr "Язык, который используется при проверк #: ../src/common/config.py:336 msgid "all or space separated status" -msgstr "" +msgstr "все или статусы, разделенные пробелом" #: ../src/common/config.py:337 msgid "'yes', 'no', or 'both'" -msgstr "" +msgstr "\"да\", \"нет\" или \"оба\"" #: ../src/common/config.py:338 ../src/common/config.py:340 #: ../src/common/config.py:341 ../src/common/config.py:344 #: ../src/common/config.py:345 msgid "'yes', 'no' or ''" -msgstr "" +msgstr "\"да\", \"нет\" или \"\"" #: ../src/common/config.py:351 msgid "Sleeping" @@ -5910,7 +5864,7 @@ msgstr "морской" #: ../src/common/connection_handlers.py:52 #: ../src/common/zeroconf/connection_handlers_zeroconf.py:44 msgid "Unable to load idle module" -msgstr "" +msgstr "Не могу загрузить модуль \"idle\"" #: ../src/common/connection_handlers.py:177 #: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 @@ -5927,12 +5881,12 @@ msgstr "" #: ../src/common/connection_handlers.py:590 #, python-format msgid "Registration information for transport %s has not arrived in time" -msgstr "" +msgstr "Данные о регистрации для транспорта %s не пришли вовремя." #: ../src/common/connection_handlers.py:1523 -#, fuzzy, python-format +#, python-format msgid "Nickname not allowed: %s" -msgstr "Ник не обнаружен: %s" +msgstr "Ник недопустим: %s" #. password required to join #. we are banned @@ -5961,11 +5915,11 @@ msgstr "Такой комнаты нет." #: ../src/common/connection_handlers.py:1595 msgid "Group chat creation is restricted." -msgstr "" +msgstr "Создание комнат запрещено." #: ../src/common/connection_handlers.py:1598 msgid "Your registered nickname must be used." -msgstr "" +msgstr "Требуется использовать ваш зарегистрированный ник." #: ../src/common/connection_handlers.py:1601 msgid "You are not in the members list." @@ -5976,6 +5930,8 @@ msgid "" "Your desired nickname is in use or registered by another occupant.\n" "Please specify another nickname below:" msgstr "" +"Тот ник что вы ввели уже используется или зарегистрирован другим пользователем.\n" +"Пожалуйста укажите другой ник ниже:" #: ../src/common/connection_handlers.py:1659 msgid "I would like to add you to my roster." @@ -5985,7 +5941,7 @@ msgstr "Вы не возражаете, если я добавлю Вас в с #: ../src/common/connection_handlers.py:1680 #, python-format msgid "we are now subscribed to %s" -msgstr "" +msgstr "теперь мы подписались на %s" #: ../src/common/connection_handlers.py:1682 #, python-format @@ -5995,14 +5951,14 @@ msgstr "%s хочет отменить подписку" #: ../src/common/connection_handlers.py:1684 #, python-format msgid "we are now unsubscribed from %s" -msgstr "" +msgstr "теперь мы отписались от %s" #: ../src/common/connection_handlers.py:1854 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " "management tools such as http://jru.jabberstudio.org/ to remove it" -msgstr "" +msgstr "JID %s не соответствует RFC. Он не будет добавлен в ваш ростер. Используйте средство управления ростера, например http://jru.jabberstudio.org/ чтобы удалить его" #: ../src/common/connection.py:175 #: ../src/common/zeroconf/connection_zeroconf.py:196 @@ -6012,12 +5968,12 @@ msgstr "Связь с учетной записью \"%s\" была потеря #: ../src/common/connection.py:176 msgid "Reconnect manually." -msgstr "" +msgstr "Переподключаться вручную." #: ../src/common/connection.py:187 ../src/common/connection.py:214 -#, fuzzy, python-format +#, python-format msgid "Transport %s answered wrongly to register request: %s" -msgstr "Транспорт %s неверно ответил на запрос о регистрации." +msgstr "Транспорт %s неверно ответил на запрос о регистрации: %s" #. wrong answer #: ../src/common/connection.py:213 @@ -6087,7 +6043,7 @@ msgstr "" #: ../src/common/connection.py:915 msgid "Not fetched because of invisible status" -msgstr "" +msgstr "Нельзя получить из-за невидимости" #. only say that to non Windows users #: ../src/common/dbus_support.py:33 @@ -6172,31 +6128,31 @@ msgstr "двенадцать" #. A "singular-form". It is used when talking about hour 0 #: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 msgid "%0 o'clock" -msgstr "" +msgstr "%0" #: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 msgid "five past %0" -msgstr "" +msgstr "пять минут %1" #: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:56 msgid "ten past %0" -msgstr "" +msgstr "десять минут %1" #: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 msgid "quarter past %0" -msgstr "" +msgstr "четверть %1" #: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:57 msgid "twenty past %0" -msgstr "" +msgstr "двадцать минут %1" #: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 msgid "twenty five past %0" -msgstr "" +msgstr "двадцать пять минут %1" #: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:58 msgid "half past %0" -msgstr "" +msgstr "половина %1" #: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 msgid "twenty five to %1" @@ -6220,7 +6176,7 @@ msgstr "без пяти %1" #: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 msgid "%1 o'clock" -msgstr "" +msgstr "%1" #: ../src/common/fuzzyclock.py:62 msgid "Night" @@ -6239,7 +6195,6 @@ msgid "Almost noon" msgstr "День" #: ../src/common/fuzzyclock.py:63 -#, fuzzy msgid "Noon" msgstr "Полдень" @@ -6248,7 +6203,6 @@ msgid "Afternoon" msgstr "День" #: ../src/common/fuzzyclock.py:63 -#, fuzzy msgid "Evening" msgstr "Вечер" @@ -6523,9 +6477,8 @@ msgid "cyan" msgstr "синий" #: ../src/common/optparser.py:302 -#, fuzzy msgid "migrating logs database to indeces" -msgstr "создается БД истории" +msgstr "переносим журнал на индексы" #: ../src/common/passwords.py:86 #, python-format @@ -6533,17 +6486,15 @@ msgid "Gajim account %s" msgstr "Учётная запись Gajim %s" #: ../src/common/zeroconf/client_zeroconf.py:189 -msgid "" -"Connection to host could not be established: Incorrect answer from server." -msgstr "" +msgid "Connection to host could not be established: Incorrect answer from server." +msgstr "Нельзя подключиться к хосту: Неверный ответ от сервера." #: ../src/common/zeroconf/client_zeroconf.py:205 msgid "Connection to host could not be established" msgstr "Не удалось соединиться с хостом" #: ../src/common/zeroconf/client_zeroconf.py:334 -msgid "" -"Connection to host could not be established: Timeout while sending data." +msgid "Connection to host could not be established: Timeout while sending data." msgstr "Не удалось соединиться с хостом: истекло время ожидания." #: ../src/common/zeroconf/client_zeroconf.py:629 @@ -6567,23 +6518,22 @@ msgstr "" #: ../src/common/zeroconf/connection_zeroconf.py:218 msgid "Please check if Avahi is installed." -msgstr "" +msgstr "Пожалуйста, удостоверьтесь что Avahi установлен." #: ../src/common/zeroconf/connection_zeroconf.py:227 #: ../src/common/zeroconf/connection_zeroconf.py:231 -#, fuzzy msgid "Could not start local service" -msgstr "Не могу загрузить изображение" +msgstr "Не могу запустить локальный сервис" #: ../src/common/zeroconf/connection_zeroconf.py:228 #, python-format msgid "Unable to bind to port %d." -msgstr "" +msgstr "Не могу использовать порт %d." #: ../src/common/zeroconf/connection_zeroconf.py:232 #: ../src/common/zeroconf/connection_zeroconf.py:325 msgid "Please check if avahi-daemon is running." -msgstr "" +msgstr "Пожалуйста, удостоверьтесь что демон avahi запущен." #: ../src/common/zeroconf/connection_zeroconf.py:324 #, python-format @@ -6594,7 +6544,7 @@ msgstr "Не могу изменить статус учётной записи msgid "" "You are not connected or not visible to others. Your message could not be " "sent." -msgstr "" +msgstr "Вы не подключены или невидимы для других. Ваше сообщение нельзы отправить." #. we're not english #: ../src/common/zeroconf/connection_zeroconf.py:353 @@ -6606,8 +6556,3 @@ msgstr "[Это сообщение зашифровано]" msgid "Error while adding service. %s" msgstr "Ошибка при добавлении службы. %s" -#~ msgid "This is result of query." -#~ msgstr "Вот результат запроса." - -#~ msgid "Edit items on the list" -#~ msgstr "Редактировать элементы списка" diff --git a/src/adhoc_commands.py b/src/adhoc_commands.py index c3bdc0e7b..ecee22521 100644 --- a/src/adhoc_commands.py +++ b/src/adhoc_commands.py @@ -53,6 +53,7 @@ class CommandWindow: # retrieving widgets from xml self.xml = gtkgui_helpers.get_glade('adhoc_commands_window.glade') self.window = self.xml.get_widget('adhoc_commands_window') + self.window.connect('delete-event', self.on_adhoc_commands_window_delete_event) for name in ('back_button', 'forward_button', 'execute_button','close_button','stages_notebook', 'retrieving_commands_stage_vbox', @@ -101,7 +102,7 @@ class CommandWindow: self.remove_pulsing() def on_adhoc_commands_window_delete_event(self, *anything): - return self.stage_adhoc_commands_window_delete_event(self, *anything) + return self.stage_adhoc_commands_window_delete_event(self.window) def __del__(self): print "Object has been deleted." @@ -171,7 +172,7 @@ class CommandWindow: for (commandnode, commandname) in self.commandlist: radio = gtk.RadioButton(first_radio, label=commandname) radio.connect("toggled", self.on_command_radiobutton_toggled, commandnode) - if first_radio is None: + if not first_radio: first_radio = radio self.commandnode = commandnode self.command_list_vbox.pack_start(radio, expand=False) @@ -252,6 +253,7 @@ class CommandWindow: else: self.window.destroy() return False + return True def stage3_back_button_clicked(self, widget): self.stage3_submit_form('prev') @@ -264,10 +266,10 @@ class CommandWindow: def stage3_submit_form(self, action='execute'): self.data_form_widget.set_sensitive(False) - if self.data_form_widget.get_data_form() is None: - self.data_form_widget.hide() - else: + if self.data_form_widget.get_data_form(): self.data_form_widget.data_form.type='submit' + else: + self.data_form_widget.hide() self.close_button.set_sensitive(True) self.back_button.set_sensitive(False) @@ -284,13 +286,13 @@ class CommandWindow: self.remove_pulsing() self.sending_form_progressbar.hide() - if self.sessionid is None: + if not self.sessionid: self.sessionid = command.getAttr('sessionid') self.form_status = command.getAttr('status') self.commandnode = command.getAttr('node') - if command.getTag('x') is not None: + if command.getTag('x'): self.dataform = dataforms.ExtendForm(node=command.getTag('x')) self.data_form_widget.set_sensitive(True) @@ -307,18 +309,18 @@ class CommandWindow: else: self.data_form_widget.hide() - action = command.getTag('action') - if action is None: + actions = command.getTag('actions') + if actions: + # actions, actions, actions... + self.close_button.set_sensitive(True) + self.back_button.set_sensitive(actions.getTag('prev') is not None) + self.forward_button.set_sensitive(actions.getTag('next') is not None) + self.execute_button.set_sensitive(True) + else: self.close_button.set_sensitive(True) self.back_button.set_sensitive(False) self.forward_button.set_sensitive(False) self.execute_button.set_sensitive(True) - else: - # actions, actions, actions... - self.close_button.set_sensitive(True) - self.back_button.set_sensitive(action.getTag('prev') is not None) - self.forward_button.set_sensitive(action.getTag('next') is not None) - self.execute_button.set_sensitive(True) if self.form_status == 'completed': self.close_button.set_sensitive(True) @@ -329,7 +331,7 @@ class CommandWindow: self.stage_adhoc_commands_window_delete_event = self.stage3_close_button_clicked note = command.getTag('note') - if note is not None: + if note: self.notes_label.set_text(note.getData().decode('utf-8')) self.notes_label.set_no_show_all(False) self.notes_label.show() @@ -369,9 +371,9 @@ class CommandWindow: # close old stage self.stage_finish() - assert errorid is not None or error is not None + assert errorid or error - if errorid is not None: + if errorid: # we've got error code, display appropriate message try: errorname = xmpp.NS_STANZAS + ' ' + str(errorid) @@ -380,7 +382,7 @@ class CommandWindow: del errorname, errordesc except KeyError: # when stanza doesn't have error description error = 'Service returned an error.' - elif error is not None: + elif error: # we've got error message pass else: @@ -409,7 +411,7 @@ class CommandWindow: def setup_pulsing(self, progressbar): '''Set the progressbar to pulse. Makes a custom function to repeatedly call progressbar.pulse() method.''' - assert self.pulse_id is None + assert not self.pulse_id assert isinstance(progressbar, gtk.ProgressBar) def callback(): @@ -421,7 +423,7 @@ class CommandWindow: def remove_pulsing(self): '''Stop pulsing, useful when especially when removing widget.''' - if self.pulse_id is not None: + if self.pulse_id: gobject.source_remove(self.pulse_id) self.pulse_id=None @@ -436,7 +438,7 @@ class CommandWindow: # FIXME: move to connection_handlers.py # is error => error stage error = response.getError() - if error is not None: + if error: # extracting error description from xmpp/protocol.py self.stage5(errorid = error) return @@ -470,10 +472,10 @@ class CommandWindow: 'action':action }) - if self.sessionid is not None: + if self.sessionid: cmdnode.setAttr('sessionid', self.sessionid) - if self.data_form_widget.data_form is not None: + if self.data_form_widget.data_form: # cmdnode.addChild(node=dataforms.DataForm(tofill=self.data_form_widget.data_form)) # FIXME: simplified form to send @@ -482,7 +484,7 @@ class CommandWindow: def callback(response): # FIXME: move to connection_handlers.py err = response.getError() - if err is not None: + if err: self.stage5(errorid = err) else: self.stage3_next_form(response.getTag('command')) @@ -491,8 +493,8 @@ class CommandWindow: def send_cancel(self): '''Send the command with action='cancel'. ''' - assert self.commandnode is not None - if self.sessionid is not None and self.account.connection: + assert self.commandnode + if self.sessionid and self.account.connection: # we already have sessionid, so the service sent at least one reply. stanza = xmpp.Iq(typ='set', to=self.jid) stanza.addChild('command', attrs={ diff --git a/src/chat_control.py b/src/chat_control.py index baa9beec8..9bf90ced9 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -4,6 +4,8 @@ ## Copyright (C) 2006-2007 Nikos Kouremenos ## Copyright (C) 2006 Travis Shirk ## Copyright (C) 2006 Dimitur Kirov +## Copyright (C) 2007 Lukas Petrovicky +## Copyright (C) 2007 Julien Pivotto ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published @@ -129,13 +131,39 @@ class ChatControlBase(MessageControl): id = self.widget.connect('key_press_event', self._on_keypress_event) self.handlers[id] = self.widget + # Create banner and connect signals widget = self.xml.get_widget('banner_eventbox') + widget.set_property('height-request', gajim.config.get('chat_avatar_height')) id = widget.connect('button-press-event', self._on_banner_eventbox_button_press_event) self.handlers[id] = widget + # Init DND + self.TARGET_TYPE_URI_LIST = 80 + self.dnd_list = [ ( 'text/uri-list', 0, self.TARGET_TYPE_URI_LIST ), + ('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_APP, 0)] + id = self.widget.connect('drag_data_received', + self._on_drag_data_received) + self.handlers[id] = self.widget + self.widget.drag_dest_set(gtk.DEST_DEFAULT_MOTION | + gtk.DEST_DEFAULT_HIGHLIGHT | + gtk.DEST_DEFAULT_DROP, + self.dnd_list, gtk.gdk.ACTION_COPY) # Create textviews and connect signals self.conv_textview = ConversationTextview(self.account) + # FIXME: DND on non editable TextView, find a better way + self.drag_entered = False + id = self.conv_textview.tv.connect('drag_data_received', + self._on_drag_data_received) + self.handlers[id] = self.conv_textview.tv + id = self.conv_textview.tv.connect('drag_motion', self._on_drag_motion) + self.handlers[id] = self.conv_textview.tv + id = self.conv_textview.tv.connect('drag_leave', self._on_drag_leave) + self.handlers[id] = self.conv_textview.tv + self.conv_textview.tv.drag_dest_set(gtk.DEST_DEFAULT_MOTION | + gtk.DEST_DEFAULT_HIGHLIGHT | + gtk.DEST_DEFAULT_DROP, + self.dnd_list, gtk.gdk.ACTION_COPY) self.conv_scrolledwindow = self.xml.get_widget( 'conversation_scrolledwindow') @@ -149,6 +177,7 @@ class ChatControlBase(MessageControl): self.handlers[id] = widget self.scroll_to_end_id = None self.was_at_the_end = True + # add MessageTextView to UI and connect signals self.msg_scrolledwindow = self.xml.get_widget('message_scrolledwindow') self.msg_textview = MessageTextView() @@ -164,6 +193,13 @@ class ChatControlBase(MessageControl): id = self.msg_textview.connect('populate_popup', self.on_msg_textview_populate_popup) self.handlers[id] = self.msg_textview + # Setup DND + id = self.msg_textview.connect('drag_data_received', + self._on_drag_data_received) + self.handlers[id] = self.msg_textview + self.msg_textview.drag_dest_set(gtk.DEST_DEFAULT_MOTION | + gtk.DEST_DEFAULT_HIGHLIGHT, + self.dnd_list, gtk.gdk.ACTION_COPY) self.update_font() @@ -481,6 +517,22 @@ class ChatControlBase(MessageControl): self.handle_message_textview_mykey_press(widget, event_keyval, event_keymod) + def _on_drag_data_received(self, widget, context, x, y, selection, + target_type, timestamp): + pass # Derived classes SHOULD implement this method + + def _on_drag_leave(self, widget, context, time): + # FIXME: DND on non editable TextView, find a better way + self.drag_entered = False + self.conv_textview.tv.set_editable(False) + + def _on_drag_motion(self, widget, context, x, y, time): + # FIXME: DND on non editable TextView, find a better way + if not self.drag_entered: + # We drag new data over the TextView, make it editable to catch dnd + self.drag_entered_conv = True + self.conv_textview.tv.set_editable(True) + def _process_command(self, message): if not message or message[0] != '/': return False @@ -496,23 +548,23 @@ class ChatControlBase(MessageControl): self.clear(self.msg_textview) # clear message textview too return True elif message == 'compact' and not len(message_array): - self.chat_buttons_set_visible(not self.hide_chat_buttons_current) + self.chat_buttons_set_visible(not self.hide_chat_buttons) self.clear(self.msg_textview) return True return False def send_message(self, message, keyID = '', type = 'chat', chatstate = None, - msg_id = None, composing_jep = None, resource = None): + msg_id = None, composing_xep = None, resource = None, + process_command = True): '''Send the given message to the active tab. Doesn't return None if error ''' if not message or message == '\n': return 1 - - if not self._process_command(message): + if not process_command or not self._process_command(message): ret = MessageControl.send_message(self, message, keyID, type = type, chatstate = chatstate, msg_id = msg_id, - composing_jep = composing_jep, resource = resource, + composing_xep = composing_xep, resource = resource, user_nick = self.user_nick) if ret: return ret @@ -569,7 +621,6 @@ class ChatControlBase(MessageControl): full_jid != self.parent_win.get_active_jid() or \ not self.parent_win.is_active() or not end)) or \ (gc_message and \ - gajim.interface.minimized_controls.has_key(self.account) and \ jid in gajim.interface.minimized_controls[self.account])) and \ kind in ('incoming', 'incoming_queue'): # we want to have save this message in events list @@ -667,31 +718,21 @@ class ChatControlBase(MessageControl): gajim.interface.instances['logs'][jid] = \ history_window.HistoryWindow(jid, self.account) - def _on_compact_view_menuitem_activate(self, widget): - isactive = widget.get_active() - self.chat_buttons_set_visible(isactive) - - def _on_minimize_menuitem_activate(self, widget): + def on_minimize_menuitem_toggled(self, widget): '''When a grouchat is minimized, unparent the tab, put it in roster etc''' - win = gajim.interface.msg_win_mgr.get_window(self.contact.jid, self.account) - ctrl = win.get_control(self.contact.jid, self.account) - - ctrl_page = win.notebook.page_num(ctrl.widget) - control = win.notebook.get_nth_page(ctrl_page) - - win.notebook.remove_page(ctrl_page) - control.unparent() - ctrl.parent_win = None - - if not gajim.interface.minimized_controls.has_key(self.account): - gajim.interface.minimized_controls[self.account] = {} - gajim.interface.minimized_controls[self.account][self.contact.jid] = ctrl - - del win._controls[self.account][self.contact.jid] - - win.check_tabs() - gajim.interface.roster.add_groupchat_to_roster(self.account, - self.contact.jid, status = self.subject) + old_value = False + minimized_gc = gajim.config.get_per('accounts', self.account, + 'minimized_gc').split() + if self.contact.jid in minimized_gc: + old_value = True + minimize = widget.get_active() + if minimize and not self.contact.jid in minimized_gc: + minimized_gc.append(self.contact.jid) + if not minimize and self.contact.jid in minimized_gc: + minimized_gc.remove(self.contact.jid) + if old_value != minimize: + gajim.config.set_per('accounts', self.account, 'minimized_gc', + ' '.join(minimized_gc)) def set_control_active(self, state): if state: @@ -825,11 +866,14 @@ class ChatControlBase(MessageControl): room_jid, nick = gajim.get_room_and_nick_from_fjid(jid) groupchat_control = gajim.interface.msg_win_mgr.get_control( room_jid, self.account) - if not groupchat_control and \ - gajim.interface.minimized_controls.has_key(self.account) and \ - room_jid in gajim.interface.minimized_controls[self.account]: + if room_jid in gajim.interface.minimized_controls[self.account]: groupchat_control = \ gajim.interface.minimized_controls[self.account][room_jid] + contact = \ + gajim.contacts.get_contact_with_highest_priority(self.account, \ + room_jid) + if contact: + gajim.interface.roster.draw_contact(room_jid, self.account) groupchat_control.draw_contact(nick) mw = gajim.interface.msg_win_mgr.get_window(room_jid, self.account) if mw: @@ -903,7 +947,7 @@ class ChatControl(ChatControlBase): '''A control for standard 1-1 chat''' TYPE_ID = message_control.TYPE_CHAT old_msg_kind = None # last kind of the printed message - CHAT_CMDS = ['clear', 'compact', 'help', 'ping'] + CHAT_CMDS = ['clear', 'compact', 'help', 'me', 'ping', 'say'] def __init__(self, parent_win, contact, acct, resource = None): ChatControlBase.__init__(self, self.TYPE_ID, parent_win, @@ -915,21 +959,10 @@ class ChatControl(ChatControlBase): id = widget.connect('clicked', self.on_actions_button_clicked) self.handlers[id] = widget - hide_chat_buttons_always = gajim.config.get( - 'always_hide_chat_buttons') - self.chat_buttons_set_visible(hide_chat_buttons_always) + compact_view = gajim.config.get('compact_view') + self.chat_buttons_set_visible(compact_view) self.widget_set_visible(self.xml.get_widget('banner_eventbox'), gajim.config.get('hide_chat_banner')) - # Initialize drag-n-drop - self.TARGET_TYPE_URI_LIST = 80 - self.dnd_list = [ ( 'text/uri-list', 0, self.TARGET_TYPE_URI_LIST ) ] - id = self.widget.connect('drag_data_received', - self._on_drag_data_received) - self.handlers[id] = self.widget - self.widget.drag_dest_set(gtk.DEST_DEFAULT_MOTION | - gtk.DEST_DEFAULT_HIGHLIGHT | - gtk.DEST_DEFAULT_DROP, - self.dnd_list, gtk.gdk.ACTION_COPY) # keep timeout id and window obj for possible big avatar # it is on enter-notify and leave-notify so no need to be per jid @@ -1085,6 +1118,8 @@ class ChatControl(ChatControlBase): jid = contact.jid banner_name_label = self.xml.get_widget('banner_name_label') + banner_eventbox = self.xml.get_widget('banner_eventbox') + name = contact.get_shown_name() if self.resource: name += '/' + self.resource @@ -1111,8 +1146,10 @@ class ChatControl(ChatControlBase): status = contact.status if status is not None: + self.status_tooltip.set_tip(banner_eventbox, status) + self.status_tooltip.enable() banner_name_label.set_ellipsize(pango.ELLIPSIZE_END) - status = helpers.reduce_chars_newlines(status, max_lines = 2) + status = helpers.reduce_chars_newlines(status, max_lines = 1) status_escaped = gobject.markup_escape_text(status) font_attrs, font_attrs_small = self.get_font_attrs() @@ -1121,12 +1158,12 @@ class ChatControl(ChatControlBase): if cs and st in ('composing_only', 'all'): if contact.show == 'offline': chatstate = '' - elif contact.composing_jep == 'JEP-0085': + elif contact.composing_xep == 'XEP-0085': if st == 'all' or cs == 'composing': chatstate = helpers.get_uf_chatstate(cs) else: chatstate = '' - elif contact.composing_jep == 'JEP-0022': + elif contact.composing_xep == 'XEP-0022': if cs in ('composing', 'paused'): # only print composing, paused chatstate = helpers.get_uf_chatstate(cs) @@ -1145,9 +1182,6 @@ class ChatControl(ChatControlBase): if status_escaped: label_text += '\n%s' %\ (font_attrs_small, status_escaped) - banner_eventbox = self.xml.get_widget('banner_eventbox') - self.status_tooltip.set_tip(banner_eventbox, status) - self.status_tooltip.enable() else: self.status_tooltip.disable() # setup the label that holds name and jid @@ -1196,6 +1230,9 @@ class ChatControl(ChatControlBase): if message_array == ['']: message_array = [] + if command == 'me': + return False # This is not really a command + if command == 'help': if len(message_array): subcommand = message_array.pop(0) @@ -1204,10 +1241,19 @@ class ChatControl(ChatControlBase): self.get_command_help(command) self.clear(self.msg_textview) return True - elif command == 'ping' and not len(message_array): - gajim.connections[self.account].sendPing(self.contact) + elif command == 'ping': + if not len(message_array): + gajim.connections[self.account].sendPing(self.contact) + else: + self.get_command_help(command) self.clear(self.msg_textview) return True + elif command == 'say': + return False + else: + self.print_conversation(_('No such command: /%s (if you want to send ' + 'this, prefix it with /say)') % command, 'info') + return True return False def get_command_help(self, command): @@ -1215,13 +1261,21 @@ class ChatControl(ChatControlBase): self.print_conversation(_('Commands: %s') % ChatControl.CHAT_CMDS, 'info') elif command == 'clear': - self.print_conversation(_('Usage: /%s, clears the text window.'), - 'info') + self.print_conversation(_('Usage: /%s, clears the text window.') % \ + command, 'info') elif command == 'compact': - self.print_conversation(_('Usage: /%s, hide the chat buttons.'), - 'info') + self.print_conversation(_('Usage: /%s, hide the chat buttons.') % \ + command, 'info') + elif command == 'me': + self.print_conversation(_('Usage: /%s , sends action to the ' + 'current group chat. Use third person. (e.g. /%s explodes.)') % \ + (command, command), 'info') elif command == 'ping': - self.print_conversation(_(''), 'info') + self.print_conversation(_('Usage: /%s, sends a ping to the contact') %\ + command, 'info') + elif command == 'say': + self.print_conversation(_('Usage: /%s, send the message to the contact') %\ + command, 'info') else: self.print_conversation(_('No help info for /%s') % command, 'info') @@ -1230,6 +1284,12 @@ class ChatControl(ChatControlBase): if message in ('', None, '\n') or self._process_command(message): return + # Do we need to process command for the message ? + process_command = True + if message.startswith('/say'): + message = message[5:] + process_command = False + # refresh timers self.reset_kbd_mouse_timeout_vars() @@ -1244,10 +1304,10 @@ class ChatControl(ChatControlBase): chatstates_on = gajim.config.get('outgoing_chat_state_notifications') != \ 'disabled' - composing_jep = contact.composing_jep + composing_xep = contact.composing_xep chatstate_to_send = None if chatstates_on and contact is not None: - if composing_jep is None: + if composing_xep is None: # no info about peer # send active to discover chat state capabilities # this is here (and not in send_chatstate) @@ -1256,13 +1316,13 @@ class ChatControl(ChatControlBase): if contact.our_chatstate: # We already asked for xep 85, don't ask it twice - composing_jep = 'asked_once' + composing_xep = 'asked_once' chatstate_to_send = 'active' contact.our_chatstate = 'ask' # pseudo state # if peer supports jep85 and we are not 'ask', send 'active' # NOTE: first active and 'ask' is set in gajim.py - elif composing_jep is not False: + elif composing_xep is not False: #send active chatstate on every message (as JEP says) chatstate_to_send = 'active' contact.our_chatstate = 'active' @@ -1272,7 +1332,8 @@ class ChatControl(ChatControlBase): self._schedule_activity_timers() if not ChatControlBase.send_message(self, message, keyID, type = 'chat', - chatstate = chatstate_to_send, composing_jep = composing_jep): + chatstate = chatstate_to_send, composing_xep = composing_xep, + process_command = process_command): self.print_conversation(message, self.contact.jid, encrypted = encrypted) @@ -1441,13 +1502,13 @@ class ChatControl(ChatControlBase): jid = self.contact.jid num_unread = len(gajim.events.get_events(self.account, jid, ['printed_' + self.type_id, self.type_id])) - # Set tab image (always 16x16); unread messages show the 'message' image + # Set tab image (always 16x16); unread messages show the 'event' image tab_img = None if num_unread and gajim.config.get('show_unread_tab_icon'): img_16 = gajim.interface.roster.get_appropriate_state_images( - self.contact.jid, icon_name = 'message') - tab_img = img_16['message'] + self.contact.jid, icon_name = 'event') + tab_img = img_16['event'] else: contact = gajim.contacts.get_contact_with_highest_priority( self.account, self.contact.jid) @@ -1474,7 +1535,6 @@ class ChatControl(ChatControlBase): toggle_gpg_menuitem = xml.get_widget('toggle_gpg_menuitem') add_to_roster_menuitem = xml.get_widget('add_to_roster_menuitem') send_file_menuitem = xml.get_widget('send_file_menuitem') - compact_view_menuitem = xml.get_widget('compact_view_menuitem') information_menuitem = xml.get_widget('information_menuitem') contact = self.parent_win.get_active_contact() @@ -1493,14 +1553,14 @@ class ChatControl(ChatControlBase): # If we don't have resource, we can't do file transfer # in transports, contact holds our info we need to disable it too - if contact.resource and contact.jid.find('@') != -1: + if self.TYPE_ID == message_control.TYPE_PM and self.gc_contact.jid and \ + self.gc_contact.resource: + send_file_menuitem.set_sensitive(True) + elif contact.resource and contact.jid.find('@') != -1: send_file_menuitem.set_sensitive(True) else: send_file_menuitem.set_sensitive(False) - # compact_view_menuitem - compact_view_menuitem.set_active(self.hide_chat_buttons_current) - # add_to_roster_menuitem if _('Not in Roster') in contact.groups: add_to_roster_menuitem.show() @@ -1517,9 +1577,6 @@ class ChatControl(ChatControlBase): id = send_file_menuitem.connect('activate', self._on_send_file_menuitem_activate) self.handlers[id] = send_file_menuitem - id = compact_view_menuitem.connect('activate', - self._on_compact_view_menuitem_activate) - self.handlers[id] = compact_view_menuitem id = add_to_roster_menuitem.connect('activate', self._on_add_to_roster_menuitem_activate) self.handlers[id] = add_to_roster_menuitem @@ -1565,7 +1622,7 @@ class ChatControl(ChatControlBase): if contact.show == 'offline': return - if contact.composing_jep is False: # jid cannot do jep85 nor jep22 + if contact.composing_xep is False: # jid cannot do xep85 nor xep22 return # if the new state we wanna send (state) equals @@ -1573,7 +1630,7 @@ class ChatControl(ChatControlBase): if contact.our_chatstate == state: return - if contact.composing_jep is None: + if contact.composing_xep is None: # we don't know anything about jid, so return # NOTE: # send 'active', set current state to 'ask' and return is done @@ -1587,7 +1644,7 @@ class ChatControl(ChatControlBase): # in JEP22, when we already sent stop composing # notification on paused, don't resend it - if contact.composing_jep == 'JEP-0022' and \ + if contact.composing_xep == 'XEP-0022' and \ contact.our_chatstate in ('paused', 'active', 'inactive') and \ state is not 'composing': # not composing == in (active, inactive, gone) contact.our_chatstate = 'active' @@ -1609,7 +1666,7 @@ class ChatControl(ChatControlBase): self.reset_kbd_mouse_timeout_vars() MessageControl.send_message(self, None, chatstate = state, - msg_id = contact.msg_id, composing_jep = contact.composing_jep) + msg_id = contact.msg_id, composing_xep = contact.composing_xep) contact.our_chatstate = state if contact.our_chatstate == 'active': self.reset_kbd_mouse_timeout_vars() @@ -1638,20 +1695,19 @@ class ChatControl(ChatControlBase): del self.handlers[i] self.conv_textview.del_handlers() self.msg_textview.destroy() - def allow_shutdown(self, method): if time.time() - gajim.last_message_time[self.account]\ [self.get_full_jid()] < 2: # 2 seconds dialog = dialogs.ConfirmationDialog( - #%s is being replaced in the code with JID + # %s is being replaced in the code with JID _('You just received a new message from "%s"') % self.contact.jid, _('If you close this tab and you have history disabled, '\ 'this message will be lost.')) if dialog.get_response() != gtk.RESPONSE_OK: - return False #stop the propagation of the event - return True + return 'no' # stop the propagation of the event + return 'yes' def handle_incoming_chatstate(self): ''' handle incoming chatstate that jid SENT TO us ''' @@ -1710,17 +1766,23 @@ class ChatControl(ChatControlBase): def _on_drag_data_received(self, widget, context, x, y, selection, target_type, timestamp): - # If not resource, we can't send file - if not self.contact.resource: + # If no resource is known, we can't send a file + if self.TYPE_ID == message_control.TYPE_PM: + c = self.gc_contact + else: + c = self.contact + if not c.resource: return if target_type == self.TARGET_TYPE_URI_LIST: + if not selection.data: + return uri = selection.data.strip() uri_splitted = uri.split() # we may have more than one file dropped for uri in uri_splitted: path = helpers.get_file_path_from_dnd_dropped_uri(uri) if os.path.isfile(path): # is it file? ft = gajim.interface.instances['file_transfers'] - ft.send_file(self.account, self.contact, path) + ft.send_file(self.account, c, path) def _on_message_tv_buffer_changed(self, textbuffer): self.kbd_activity_in_last_5_secs = True @@ -1833,7 +1895,7 @@ class ChatControl(ChatControlBase): show_transports = gajim.config.get('show_transports_group') if (not show_transports and gajim.jid_is_transport(jid)) or \ (not show_offline and typ == 'chat' and \ - len(gajim.contacts.get_contact(self.account, jid)) < 2): + len(gajim.contacts.get_contacts(self.account, jid)) < 2): gajim.interface.roster.really_remove_contact(self.contact, self.account) elif typ == 'pm': @@ -1919,8 +1981,12 @@ class ChatControl(ChatControlBase): self.bigger_avatar_window.window.set_cursor(cursor) def _on_send_file_menuitem_activate(self, widget): + if self.TYPE_ID == message_control.TYPE_PM: + c = self.gc_contact + else: + c = self.contact gajim.interface.instances['file_transfers'].show_file_send_request( - self.account, self.contact) + self.account, c) def _on_add_to_roster_menuitem_activate(self, widget): dialogs.AddNewContactWindow(self.account, self.contact.jid) diff --git a/src/common/atom.py b/src/common/atom.py index 7490f3bc7..86c75c5ba 100644 --- a/src/common/atom.py +++ b/src/common/atom.py @@ -63,10 +63,11 @@ class OldEntry(xmpp.Node, object): else: main_feed = None - if self.getTag('source-feed') is not None: - source_feed = self.getTag('source-feed').getTagData('title') + if self.getTag('feed') is not None: + source_feed = self.getTag('feed').getTagData('title') else: source_feed = None + if main_feed is not None and source_feed is not None: return u'%s: %s' % (main_feed, source_feed) @@ -78,14 +79,13 @@ class OldEntry(xmpp.Node, object): return u'' feed_title = property(get_feed_title, None, None, - ''' Title of feed. It is built from entry's original feed title and title of feed + ''' Title of feed. It is built from entry''s original feed title and title of feed which delivered this entry. ''') def get_feed_link(self): - ''' Get a link to main page of feed (in pubsub.com: second link of rel='alternate', - first contains raw xml data). ''' + ''' Get source link ''' try: - return self.getTag('source-feed').getTags('link', {'rel':'alternate'})[1].getData() + return self.getTag('feed').getTags('link',{'rel':'alternate'})[1].getData() except: return None diff --git a/src/common/caps.py b/src/common/caps.py new file mode 100644 index 000000000..49179db64 --- /dev/null +++ b/src/common/caps.py @@ -0,0 +1,259 @@ +## +## 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. +## + +from itertools import * +import xmpp +import xmpp.features_nb +import gajim + +class CapsCache(object): + ''' This object keeps the mapping between caps data and real disco + features they represent, and provides simple way to query that info. + It is application-wide, that is there's one object for all + connections. + Goals: + * handle storing/retrieving info from database + * cache info in memory + * expose simple interface + Properties: + * one object for all connections (move to logger.py?) + * store info efficiently (a set() of urls -- we can assume there won't be + too much of these, ensure that (X,Y,Z1) and (X,Y,Z2) has different + features. + + Connections with other objects: (TODO) + + Interface: + + # object creation + >>> cc=CapsCache(logger_object) + + >>> caps=('http://exodus.jabberstudio.org/caps', '0.9', None) # node, ver, ext + >>> muc='http://jabber.org/protocol/muc' + >>> chatstates='http://jabber.org/protocol/chatstates' + + # retrieving data + >>> muc in cc[caps].features + True + >>> muc in cc[caps] + True + >>> chatstates in cc[caps] + False + >>> cc[caps].identities + set({'category':'client', 'type':'pc'}) + >>> x=cc[caps] # more efficient if making several queries for one set of caps + ATypicalBlackBoxObject + >>> muc in x + True + >>> x.node + 'http://exodus.jabberstudio.org/caps' + + # retrieving data (multiple exts case) + >>> caps=('http://gajim.org/caps', '0.9', ('csn', 'ft')) + >>> muc in cc[caps] + True + + # setting data + >>> newcaps=('http://exodus.jabberstudio.org/caps', '0.9a', None) + >>> cc[newcaps].identities.add({'category':'client', 'type':'pc', 'name':'Gajim'}) + >>> cc[newcaps].features+=muc # same as: + >>> cc[newcaps]+=muc + >>> cc[newcaps]['csn']+=chatstates # adding data as if ext was 'csn' + # warning: no feature removal! + ''' + def __init__(self, logger=None): + ''' Create a cache for entity capabilities. ''' + # our containers: + # __names is a string cache; every string long enough is given + # another object, and we will have plenty of identical long + # strings. therefore we can cache them + # TODO: maybe put all known xmpp namespace strings here + # (strings given in xmpppy)? + # __cache is a dictionary mapping: pair of node and version maps + # to CapsCacheItem object + # __CacheItem is a class that stores data about particular + # client (node/version pair) + self.__names = {} + self.__cache = {} + + class CacheItem(object): + ''' TODO: logging data into db ''' + def __init__(ciself, node, version, ext=None): + # cached into db + ciself.node = node + ciself.version = version + ciself.features = set() + ciself.ext = ext + ciself.exts = {} + + # set of tuples: (category, type, name) + # (dictionaries are not hashable, so cannot be in sets) + ciself.identities = set() + + # not cached into db: + # have we sent the query? + # 0 == not queried + # 1 == queried + # 2 == got the answer + ciself.queried = 0 + + class CacheQuery(object): + def __init__(cqself, proxied): + cqself.proxied=proxied + + def __getattr__(cqself, obj): + if obj!='exts': return getattr(cqself.proxied[0], obj) + return set(chain(ci.features for ci in cqself.proxied)) + + def __getitem__(ciself, exts): + if not exts: # (), [], None, False, whatever + return ciself + if isinstance(exts, basestring): + exts=(exts,) + if len(exts)==1: + ext=exts[0] + if ext in ciself.exts: + return ciself.exts[ext] + x=CacheItem(ciself.node, ciself.version, ext) + ciself.exts[ext]=x + return x + proxied = [ciself] + proxied.extend(ciself[(e,)] for e in exts) + return ciself.CacheQuery(proxied) + + def update(ciself, identities, features): + # NOTE: self refers to CapsCache object, not to CacheItem + self.identities=identities + self.features=features + self.logger.add_caps_entry( + ciself.node, ciself.version, ciself.ext, + identities, features) + + self.__CacheItem = CacheItem + + # prepopulate data which we are sure of; note: we do not log these info + gajimnode = 'http://gajim.org/caps' + + gajimcaps=self[(gajimnode, '0.11.1')] + gajimcaps.category='client' + gajimcaps.type='pc' + gajimcaps.features=set((xmpp.NS_BYTESTREAM, xmpp.NS_SI, + xmpp.NS_FILE, xmpp.NS_MUC, xmpp.NS_COMMANDS, + xmpp.NS_DISCO_INFO, xmpp.NS_PING, xmpp.NS_TIME_REVISED)) + gajimcaps['cstates'].features=set((xmpp.NS_CHATSTATES,)) + gajimcaps['xhtml'].features=set((xmpp.NS_XHTML_IM,)) + + # TODO: older gajim versions + + # start logging data from the net + self.logger = logger + + def load_from_db(self): + # get data from logger... + if self.logger is not None: + for node, ver, ext, identities, features in self.logger.iter_caps_data(): + x=self[(node, ver, ext)] + x.identities=identities + x.features=features + x.queried=2 + + def __getitem__(self, caps): + node_version = caps[:2] + if node_version in self.__cache: + return self.__cache[node_version][caps[2]] + node, version = self.__names.setdefault(caps[0], caps[0]), caps[1] + x=self.__CacheItem(node, version) + self.__cache[(node, version)]=x + return x + + def preload(self, account, jid, node, ver, exts): + ''' Preload data about (node, ver, exts) caps using disco + query to jid using proper connection. Don't query if + the data is already in cache. ''' + q=self[(node, ver, ())] + qq=q + + if q.queried==0: + # do query for bare node+version pair + # this will create proper object + q.queried=1 + account.discoverInfo(jid, '%s#%s' % (node, ver)) + + for ext in exts: + qq=q[ext] + if qq.queried==0: + # do query for node+version+ext triple + qq.queried=1 + account.discoverInfo(jid, '%s#%s' % (node, ext)) + +gajim.capscache = CapsCache(gajim.logger) + +class ConnectionCaps(object): + ''' This class highly depends on that it is a part of Connection class. ''' + def _capsPresenceCB(self, con, presence): + ''' Handle incoming presence stanzas... This is a callback + for xmpp registered in connection_handlers.py''' + + # get the caps element + caps=presence.getTag('c') + if not caps: return + + node, ver=caps['node'], caps['ver'] + if node is None or ver is None: + # improper caps in stanza, ignoring + return + + try: + exts=caps['ext'].split(' ') + except AttributeError: + # no exts means no exts, a perfectly valid case + exts=[] + + # we will put these into proper Contact object and ask + # for disco... so that disco will learn how to interpret + # these caps + + jid=str(presence.getFrom()) + + # start disco query... + gajim.capscache.preload(self, jid, node, ver, exts) + + contact=gajim.contacts.get_contact_from_full_jid(self.name, jid) + if contact in [None, []]: + return # TODO: a way to put contact not-in-roster into Contacts + elif isinstance(contact, list): + contact = contact[0] + + # overwriting old data + contact.caps_node=node + contact.caps_ver=ver + contact.caps_exts=exts + + def _capsDiscoCB(self, jid, node, identities, features, data): + contact=gajim.contacts.get_contact_from_full_jid(self.name, jid) + if not contact: return + if not contact.caps_node: return # we didn't asked for that? + if not node.startswith(contact.caps_node+'#'): return + node, ext = node.split('#') + if ext==contact.caps_ver: # this can be also version (like '0.9') + exts=None + else: + exts=(ext,) + + # if we don't have this info already... + caps=gajim.capscache[(node, contact.caps_ver, exts)] + if caps.queried==2: return + + identities=set((i['category'], i['type'], i.get('name')) for i in identities) + caps.update(identities, features) + diff --git a/src/common/check_paths.py b/src/common/check_paths.py index 600855aab..b7f06046d 100644 --- a/src/common/check_paths.py +++ b/src/common/check_paths.py @@ -42,6 +42,7 @@ def create_log_db(): # logs.jid_id --> jids.jid_id but Sqlite doesn't do FK etc so it's done in python code # jids.jid text column will be JID if TC-related, room_jid if GC-related, # ROOM_JID/nick if pm-related. + # also check optparser.py, which updates databases on gajim updates cur.executescript( ''' CREATE TABLE jids( @@ -74,6 +75,12 @@ def create_log_db(): ); CREATE INDEX idx_logs_jid_id_kind ON logs (jid_id, kind); + + CREATE TABLE caps_cache ( + node TEXT, + ver TEXT, + ext TEXT, + data BLOB); ''' ) diff --git a/src/common/commands.py b/src/common/commands.py index 4fdb6d4d7..802095873 100644 --- a/src/common/commands.py +++ b/src/common/commands.py @@ -236,12 +236,42 @@ class LeaveGroupchatsCommand(AdHocCommand): return False +class ForwardMessagesCommand(AdHocCommand): + # http://www.xmpp.org/extensions/xep-0146.html#forward + commandnode = 'forward-messages' + commandname = _('Forward unread messages') + + @staticmethod + def isVisibleFor(samejid): + ''' Change status is visible only if the entity has the same bare jid. ''' + return samejid + + def execute(self, request): + account = self.connection.name + # Forward messages + events = gajim.events.get_events(account, types=['chat', 'normal']) + j, resource = gajim.get_room_and_nick_from_fjid(self.jid) + for jid in events: + for event in events[jid]: + self.connection.send_message(j, event.parameters[0], '', + type=event.type_, subject=event.parameters[1], + resource=resource, forward_from=jid) + + # Inform other client of completion + response, cmd = self.buildResponse(request, status = 'completed') + cmd.addChild('note', {}, _('All unread messages have been forwarded.')) + + self.connection.connection.send(response) + + return False # finish the session + class ConnectionCommands: ''' This class depends on that it is a part of Connection() class. ''' def __init__(self): # a list of all commands exposed: node -> command class self.__commands = {} - for cmdobj in (ChangeStatusCommand, LeaveGroupchatsCommand): + for cmdobj in (ChangeStatusCommand, ForwardMessagesCommand, + LeaveGroupchatsCommand): self.__commands[cmdobj.commandnode] = cmdobj # a list of sessions; keys are tuples (jid, sessionid, node) diff --git a/src/common/config.py b/src/common/config.py index 028d8f031..f17c51c42 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -7,6 +7,7 @@ ## Copyright (C) 2005 Travis Shirk ## Copyright (C) 2005 Norman Rasmussen ## Copyright (C) 2006 Stefan Bethge +## Copyright (C) 2007 Julien Pivotto ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published @@ -81,7 +82,7 @@ class Config: 'markedmsgcolor': [ opt_color, '#ff8080', '', True ], 'urlmsgcolor': [ opt_color, '#0000ff', '', True ], 'collapsed_rows': [ opt_str, '', _('List (space separated) of rows (accounts and groups) that are collapsed.'), True ], - 'roster_theme': [ opt_str, 'gtk+', '', True ], + 'roster_theme': [ opt_str, _('default'), '', True ], 'saveposition': [ opt_bool, True ], 'mergeaccounts': [ opt_bool, False, '', True ], 'sort_by_show': [ opt_bool, True, '', True ], @@ -182,12 +183,12 @@ class Config: 'tooltip_avatar_height': [opt_int, 125], 'vcard_avatar_width': [opt_int, 200], 'vcard_avatar_height': [opt_int, 200], + 'notification_preview_message': [opt_bool, True, _('Preview new messages in notification popup?')], 'notification_position_x': [opt_int, -1], 'notification_position_y': [opt_int, -1], 'notification_avatar_width': [opt_int, 48], 'notification_avatar_height': [opt_int, 48], 'muc_highlight_words': [opt_str, '', _('A semicolon-separated list of words that will be highlighted in group chats.')], - 'minimize_autojoined_rooms': [opt_bool, False, _('If True, autojoined bookmarked rooms will be minimized on startup.')], 'quit_on_roster_x_button': [opt_bool, False, _('If True, quits Gajim when X button of Window Manager is clicked. This setting is taken into account only if trayicon is used.')], 'check_if_gajim_is_default': [opt_bool, True, _('If True, Gajim will check if it\'s the default jabber client on each startup.')], 'show_unread_tab_icon': [opt_bool, False, _('If True, Gajim will display an icon on each tab containing unread messages. Depending on the theme, this icon may be animated.')], @@ -211,8 +212,7 @@ class Config: _('Controls the window where new messages are placed.\n\'always\' - All messages are sent to a single window.\n\'never\' - All messages get their own window.\n\'peracct\' - Messages for each account are sent to a specific window.\n\'pertype\' - Each message type (e.g., chats vs. groupchats) are sent to a specific window. Note, changing this option requires restarting Gajim before the changes will take effect.')], 'show_avatar_in_chat': [opt_bool, True, _('If False, you will no longer see the avatar in the chat window.')], 'escape_key_closes': [opt_bool, True, _('If True, pressing the escape key closes a tab/window.')], - 'always_hide_groupchat_buttons': [opt_bool, False, _('Hides the buttons in group chat window.')], - 'always_hide_chat_buttons': [opt_bool, False, _('Hides the buttons in two persons chat window.')], + 'compact_view': [opt_bool, False, _('Hides the buttons in chat windows.')], 'hide_groupchat_banner': [opt_bool, False, _('Hides the banner in a group chat window')], 'hide_chat_banner': [opt_bool, False, _('Hides the banner in two persons chat window')], 'hide_groupchat_occupants_list': [opt_bool, False, _('Hides the group chat occupants list in group chat window.')], @@ -228,6 +228,7 @@ class Config: 'scroll_roster_to_last_message': [opt_bool, True, _('If True, Gajim will scroll and select the contact who sent you the last message, if chat window is not already opened.')], 'use_latex': [opt_bool, False, _('If True, Gajim will convert string between $$ and $$ to an image using dvips and convert before insterting it in chat window.')], 'change_status_window_timeout': [opt_int, 15, _('Time of inactivity needed before the change status window closes down.')], + 'max_conversation_lines': [opt_int, 500, _('Maximum number of lines that are printed in conversations. Oldest lines are cleared.')], } __options_per_key = { @@ -260,6 +261,7 @@ class Config: 'gpgpassword': [ opt_str, '' ], 'sync_with_global_status': [ opt_bool, False, ], 'no_log_for': [ opt_str, '' ], + 'minimized_gc': [ opt_str, '' ], 'attached_gpg_keys': [ opt_str, '' ], 'keep_alives_enabled': [ opt_bool, True], # send keepalive every N seconds of inactivity @@ -387,8 +389,8 @@ class Config: themes_default = { # sorted alphanum - 'gtk+': [ '', '', '', 'B', '', '','', 'I', '', '', '', '', '','', '', - 'B' ], + _('default'): [ '', '', '', 'B', '', '','', 'I', '', '', '', '', '','', + '', 'B' ], _('green'): [ '', '#94aa8c', '', 'B', '#0000ff', '#eff3e7', '', 'I', '#000000', '', '', '', '', diff --git a/src/common/configpaths.py b/src/common/configpaths.py index f7e09a686..da41fb8d7 100644 --- a/src/common/configpaths.py +++ b/src/common/configpaths.py @@ -25,6 +25,11 @@ def fse(s): '''Convert from filesystem encoding if not already Unicode''' return unicode(s, sys.getfilesystemencoding()) +def windowsify(s): + if os.name == 'nt': + return s.capitalize() + return s + class ConfigPaths: def __init__(self, root=None): self.root = root @@ -68,51 +73,47 @@ class ConfigPaths: for key in self.paths.iterkeys(): yield (key, self[key]) -def windowsify(s): - if os.name == 'nt': - return s.capitalize() - return s + def init(self, root = None): + if root is not None: + self.root = root -def init(): - paths = ConfigPaths() + # LOG is deprecated + k = ( 'LOG', 'LOG_DB', 'VCARD', 'AVATAR', 'MY_EMOTS', + 'MY_ICONSETS' ) + v = (u'logs', u'logs.db', u'vcards', u'avatars', u'emoticons', + u'iconsets') - # LOG is deprecated - k = ( 'LOG', 'LOG_DB', 'VCARD', 'AVATAR', 'MY_EMOTS' ) - v = (u'logs', u'logs.db', u'vcards', u'avatars', u'emoticons') + if os.name == 'nt': + v = map(lambda x: x.capitalize(), v) - if os.name == 'nt': - v = map(lambda x: x.capitalize(), v) + for n, p in zip(k, v): + self.add_from_root(n, p) - for n, p in zip(k, v): - paths.add_from_root(n, p) + self.add('DATA', os.path.join(u'..', windowsify(u'data'))) + self.add('HOME', fse(os.path.expanduser('~'))) + self.add('TMP', fse(tempfile.gettempdir())) - paths.add('DATA', os.path.join(u'..', windowsify(u'data'))) - paths.add('HOME', fse(os.path.expanduser('~'))) - paths.add('TMP', fse(tempfile.gettempdir())) + try: + import svn_config + svn_config.configure(self) + except (ImportError, AttributeError): + pass - try: - import svn_config - svn_config.configure(paths) - except (ImportError, AttributeError): - pass + # for k, v in paths.iteritems(): + # print "%s: %s" % (repr(k), repr(v)) - # for k, v in paths.iteritems(): - # print "%s: %s" % (repr(k), repr(v)) + def init_profile(self, profile): + conffile = windowsify(u'config') + pidfile = windowsify(u'gajim') - return paths + if len(profile) > 0: + conffile += u'.' + profile + pidfile += u'.' + profile + pidfile += u'.pid' + self.add_from_root('CONFIG_FILE', conffile) + self.add_from_root('PID_FILE', pidfile) -gajimpaths = init() + # for k, v in paths.iteritems(): + # print "%s: %s" % (repr(k), repr(v)) -def init_profile(profile, paths=gajimpaths): - conffile = windowsify(u'config') - pidfile = windowsify(u'gajim') - - if len(profile) > 0: - conffile += u'.' + profile - pidfile += u'.' + profile - pidfile += u'.pid' - paths.add_from_root('CONFIG_FILE', conffile) - paths.add_from_root('PID_FILE', pidfile) - - # for k, v in paths.iteritems(): - # print "%s: %s" % (repr(k), repr(v)) +gajimpaths = ConfigPaths() diff --git a/src/common/connection.py b/src/common/connection.py index 00a17a54e..0284e1c39 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -6,6 +6,7 @@ ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005-2006 Dimitur Kirov ## Copyright (C) 2005-2006 Travis Shirk +## Copyright (C) 2007 Julien Pivotto ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published @@ -36,6 +37,7 @@ from common import helpers from common import gajim from common import GnuPG from common import passwords +from common import exceptions from connection_handlers import * USE_GPG = GnuPG.USE_GPG @@ -48,12 +50,50 @@ log = logging.getLogger('gajim.c.connection') import gtkgui_helpers +ssl_error = { +2: "Unable to get issuer certificate", +3: "Unable to get certificate CRL", +4: "Unable to decrypt certificate's signature", +5: "Unable to decrypt CRL's signature", +6: "Unable to decode issuer public key", +7: "Certificate signature failure", +8: "CRL signature failure", +9: "Certificate is not yet valid", +10: "Certificate has expired", +11: "CRL is not yet valid", +12: "CRL has expired", +13: "Format error in certificate's notBefore field", +14: "Format error in certificate's notAfter field", +15: "Format error in CRL's lastUpdate field", +16: "Format error in CRL's nextUpdate field", +17: "Out of memory", +18: "Self signed certificate in certificate chain", +19: "Unable to get local issuer certificate", +20: "Unable to verify the first certificate", +21: "Unable to verify the first certificate", +22: "Certificate chain too long", +23: "Certificate revoked", +24: "Invalid CA certificate", +25: "Path length constraint exceeded", +26: "Unsupported certificate purpose", +27: "Certificate not trusted", +28: "Certificate rejected", +29: "Subject issuer mismatch", +30: "Authority and subject key identifier mismatch", +31: "Authority and issuer serial number mismatch", +32: "Key usage does not include certificate signing", +50: "Application verification failure" +} class Connection(ConnectionHandlers): '''Connection class''' def __init__(self, name): ConnectionHandlers.__init__(self) self.name = name - self.connected = 0 # offline + # self.connected: + # 0=>offline, + # 1=>connection in progress, + # 2=>authorised + self.connected = 0 self.connection = None # xmpppy ClientCommon instance # this property is used to prevent double connections self.last_connection = None # last ClientCommon instance @@ -93,6 +133,10 @@ class Connection(ConnectionHandlers): self.pep_supported = False # 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} if USE_GPG: self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) gajim.config.set('usegpg', True) @@ -210,10 +254,7 @@ class Connection(ConnectionHandlers): % (data[0], data[3]))) return is_form = data[2] - if is_form: - conf = data[1] - else: - conf = data[1].asDict() + conf = data[1] self.dispatch('NEW_ACC_CONNECTED', (conf, is_form)) return if not data[1]: # wrong answer @@ -222,10 +263,7 @@ class Connection(ConnectionHandlers): (data[0], data[3]))) return is_form = data[2] - if is_form: - conf = data[1] - else: - conf = data[1].asDict() + conf = data[1] self.dispatch('REGISTER_AGENT_INFO', (data[0], conf, is_form)) elif realm == common.xmpp.NS_PRIVACY: if event == common.xmpp.features_nb.PRIVACY_LISTS_RECEIVED: @@ -262,6 +300,8 @@ class Connection(ConnectionHandlers): self.dispatch('STANZA_SENT', unicode(data)) def select_next_host(self, hosts): + '''Chooses best 'real' host basing on the SRV priority and weight data; + more info in RFC2782''' hosts_best_prio = [] best_prio = 65535 sum_weight = 0 @@ -440,72 +480,20 @@ class Connection(ConnectionHandlers): name = gajim.config.get_per('accounts', self.name, 'name') hostname = gajim.config.get_per('accounts', self.name, 'hostname') self.connection = con - - fpr_good = self._check_fingerprint(con, con_type) - if fpr_good == False: - self.disconnect(on_purpose = True) - self.dispatch('STATUS', 'offline') - self.dispatch('CONNECTION_LOST', - (_('Security error connecting to "%s"') % self._hostname, - _("The server's key has changed, or someone is trying to hack your connection."))) - if self.on_connect_auth: - self.on_connect_auth(None) - self.on_connect_auth = None - return - - if fpr_good == None: - log.warning(_("Unable to check fingerprint for %s. Connection could be insecure."), hostname) - - if fpr_good == True: - log.info("Fingerprint found and matched for %s.", hostname) - + try: + errnum = con.Connection.ssl_errnum + except AttributeError: + errnum = -1 # we don't have an errnum + if errnum > 0: + # FIXME: tell the user that the certificat is untrusted, and ask him what to do + try: + log.warning("The authenticity of the "+hostname+" certificate could be unvalid.\nSSL Error: "+ssl_error[errnum]) + except KeyError: + log.warning("Unknown SSL error: %d" % errnum) con.auth(name, self.password, self.server_resource, 1, self.__on_auth) return True - def _check_fingerprint(self, con, con_type): - fpr_good = None # None: Unable to check fpr, False: mismatch, True: match - - # FIXME: not tidy - if not common.xmpp.transports_nb.USE_PYOPENSSL: return None - - # FIXME: find a more permanent place for loading servers.xml - servers_xml = os.path.join(gajim.DATA_DIR, 'other', 'servers.xml') - servers = gtkgui_helpers.parse_server_xml(servers_xml) - servers = dict(map(lambda e: (e[0], e), servers)) - - hostname = gajim.config.get_per('accounts', self.name, 'hostname') - - try: - log.debug("con: %s", con) - log.debug("con.Connection: %s", con.Connection) - log.debug("con.Connection.serverDigestSHA1: %s", con.Connection.serverDigestSHA1) - log.debug("con.Connection.serverDigestMD5: %s", con.Connection.serverDigestMD5) - sha1 = gtkgui_helpers.HashDigest('sha1', con.Connection.serverDigestSHA1) - md5 = gtkgui_helpers.HashDigest('md5', con.Connection.serverDigestMD5) - log.debug("sha1: %s", repr(sha1)) - log.debug("md5: %s", repr(md5)) - - sv = servers.get(hostname) - if sv: - for got in (sha1, md5): - expected = sv[2]['digest'].get(got.algo) - if expected: - fpr_good = (got == expected) - break - - except AttributeError: - if con_type in ('ssl', 'tls'): - log.error(_("Missing fingerprint in SSL connection to %s") + ':', hostname, exc_info=True) - # fpr_good = False # FIXME: enable this when sequence is sorted - else: - log.debug("Connection to %s doesn't seem to have a fingerprint:", hostname, exc_info=True) - - if fpr_good == False: - log.error(_("Fingerprint mismatch for %s: Got %s, expected %s"), hostname, got, expected) - - return fpr_good - def _register_handlers(self, con, con_type): self.peerhost = con.get_peerhost() # notify the gui about con_type @@ -566,14 +554,14 @@ class Connection(ConnectionHandlers): iq = common.xmpp.Iq('get', to = pingTo.get_full_jid()) iq.addChild(name = 'ping', namespace = common.xmpp.NS_PING) def _on_response(resp): - timePong = time.time() + timePong = time_time() if not common.xmpp.isResultNode(resp): self.dispatch('PING_ERROR', (pingTo)) return timeDiff = round(timePong - timePing,2) self.dispatch('PING_REPLY', (pingTo, timeDiff)) self.dispatch('PING_SENT', (pingTo)) - timePing = time.time() + timePing = time_time() self.connection.SendAndCallForResponse(iq, _on_response) def get_active_default_lists(self): @@ -765,6 +753,12 @@ class Connection(ConnectionHandlers): 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() + }) self.connect_and_init(show, msg, signed) elif show == 'offline': @@ -825,8 +819,8 @@ class Connection(ConnectionHandlers): self.connection.send(msg_iq) def send_message(self, jid, msg, keyID, type = 'chat', subject='', - chatstate = None, msg_id = None, composing_jep = None, resource = None, - user_nick = None, xhtml = None): + chatstate = None, msg_id = None, composing_xep = None, resource = None, + user_nick = None, xhtml = None, forward_from = None): if not self.connection: return 1 if msg and not xhtml and gajim.config.get('rst_formatting_outgoing_messages'): @@ -850,7 +844,7 @@ class Connection(ConnectionHandlers): ' ([This message is *encrypted* (See :JEP:`27`])' else: # Encryption failed, do not send message - tim = time.localtime() + tim = localtime() self.dispatch('MSGNOTSENT', (jid, error, msgtxt, tim)) return 3 if msgtxt and not xhtml and gajim.config.get( @@ -879,12 +873,12 @@ class Connection(ConnectionHandlers): # please note that the only valid tag inside a message containing a # tag is the active event if chatstate is not None: - if (composing_jep == 'JEP-0085' or not composing_jep) and \ - composing_jep != 'asked_once': - # JEP-0085 + if (composing_xep == 'XEP-0085' or not composing_xep) and \ + composing_xep != 'asked_once': + # XEP-0085 msg_iq.setTag(chatstate, namespace = common.xmpp.NS_CHATSTATES) - if composing_jep in ('JEP-0022', 'asked_once') or not composing_jep: - # JEP-0022 + 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 not msgtxt: # when no , add @@ -895,21 +889,30 @@ class Connection(ConnectionHandlers): 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}) self.connection.send(msg_iq) - no_log_for = gajim.config.get_per('accounts', self.name, 'no_log_for')\ - .split() - ji = gajim.get_jid_without_resource(jid) - if self.name not in no_log_for and ji not in no_log_for: - log_msg = msg - if subject: - log_msg = _('Subject: %s\n%s') % (subject, msg) - if log_msg: - if type == 'chat': - kind = 'chat_msg_sent' - else: - kind = 'single_msg_sent' - gajim.logger.write(kind, jid, log_msg) - self.dispatch('MSGSENT', (jid, msg, keyID)) + if not forward_from: + no_log_for = gajim.config.get_per('accounts', self.name, 'no_log_for')\ + .split() + ji = gajim.get_jid_without_resource(jid) + if self.name not in no_log_for and ji not in no_log_for: + log_msg = msg + if subject: + log_msg = _('Subject: %s\n%s') % (subject, 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))) + self.dispatch('MSGSENT', (jid, msg, keyID)) def send_stanza(self, stanza): ''' send a stanza untouched ''' @@ -1059,7 +1062,9 @@ class Connection(ConnectionHandlers): def account_changed(self, new_name): self.name = new_name - def request_last_status_time(self, jid, resource): + 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''' if not self.connection: return to_whom_jid = jid @@ -1067,9 +1072,15 @@ class Connection(ConnectionHandlers): to_whom_jid += '/' + resource iq = common.xmpp.Iq(to = to_whom_jid, typ = 'get', queryNS =\ common.xmpp.NS_LAST) + id = self.connection.getAnID() + iq.setID(id) + if groupchat_jid: + self.groupchat_jids[id] = groupchat_jid self.connection.send(iq) - def request_os_info(self, jid, resource): + def request_os_info(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''' if not self.connection: return # If we are invisible, do not request @@ -1081,6 +1092,10 @@ class Connection(ConnectionHandlers): to_whom_jid += '/' + resource iq = common.xmpp.Iq(to = to_whom_jid, typ = 'get', queryNS =\ common.xmpp.NS_VERSION) + id = self.connection.getAnID() + iq.setID(id) + if groupchat_jid: + self.groupchat_jids[id] = groupchat_jid self.connection.send(iq) def get_settings(self): @@ -1088,7 +1103,7 @@ class Connection(ConnectionHandlers): if not self.connection: return iq = common.xmpp.Iq(typ='get') - iq2 = iq.addChild(name='query', namespace='jabber:iq:private') + iq2 = iq.addChild(name='query', namespace=common.xmpp.NS_PRIVATE) iq3 = iq2.addChild(name='gajim', namespace='gajim:prefs') self.connection.send(iq) @@ -1098,7 +1113,7 @@ class Connection(ConnectionHandlers): if not self.connection: return iq = common.xmpp.Iq(typ='get') - iq2 = iq.addChild(name='query', namespace='jabber:iq:private') + iq2 = iq.addChild(name='query', namespace=common.xmpp.NS_PRIVATE) iq2.addChild(name='storage', namespace='storage:bookmarks') self.connection.send(iq) @@ -1107,12 +1122,13 @@ class Connection(ConnectionHandlers): if not self.connection: return iq = common.xmpp.Iq(typ='set') - iq2 = iq.addChild(name='query', namespace='jabber:iq:private') + iq2 = iq.addChild(name='query', namespace=common.xmpp.NS_PRIVATE) iq3 = iq2.addChild(name='storage', namespace='storage:bookmarks') for bm in self.bookmarks: iq4 = iq3.addChild(name = "conference") iq4.setAttr('jid', bm['jid']) iq4.setAttr('autojoin', bm['autojoin']) + iq4.setAttr('minimize', bm['minimize']) iq4.setAttr('name', bm['name']) # Only add optional elements if not empty # Note: need to handle both None and '' as empty @@ -1131,7 +1147,7 @@ class Connection(ConnectionHandlers): if not self.connection: return iq = common.xmpp.Iq(typ='get') - iq2 = iq.addChild(name='query', namespace='jabber:iq:private') + iq2 = iq.addChild(name='query', namespace=common.xmpp.NS_PRIVATE) iq2.addChild(name='storage', namespace='storage:rosternotes') self.connection.send(iq) @@ -1140,7 +1156,7 @@ class Connection(ConnectionHandlers): if not self.connection: return iq = common.xmpp.Iq(typ='set') - iq2 = iq.addChild(name='query', namespace='jabber:iq:private') + iq2 = iq.addChild(name='query', namespace=common.xmpp.NS_PRIVATE) iq3 = iq2.addChild(name='storage', namespace='storage:rosternotes') for jid in self.annotations.keys(): if self.annotations[jid]: @@ -1155,7 +1171,7 @@ class Connection(ConnectionHandlers): if not self.connection: return iq = common.xmpp.Iq(typ='get') - iq2 = iq.addChild(name='query', namespace='jabber:iq:private') + iq2 = iq.addChild(name='query', namespace=common.xmpp.NS_PRIVATE) iq2.addChild(name='storage', namespace='storage:metacontacts') id = self.connection.getAnID() iq.setID(id) @@ -1167,7 +1183,7 @@ class Connection(ConnectionHandlers): if not self.connection: return iq = common.xmpp.Iq(typ='set') - iq2 = iq.addChild(name='query', namespace='jabber:iq:private') + iq2 = iq.addChild(name='query', namespace=common.xmpp.NS_PRIVATE) iq3 = iq2.addChild(name='storage', namespace='storage:metacontacts') for tag in tags_list: for data in tags_list[tag]: @@ -1264,7 +1280,7 @@ class Connection(ConnectionHandlers): self.connection.send(p) # Save the time we quit to avoid duplicate logs AND be faster than # get that date from DB - self.last_history_line[jid] = time.time() + self.last_history_line[jid] = time_time() def gc_set_role(self, room_jid, nick, role, reason = ''): '''role is for all the life of the room so it's based on nick''' @@ -1419,7 +1435,8 @@ class Connection(ConnectionHandlers): return df = [] for item in tag.getTags('item'): - f = {} + # We also show attributes. jid is there + f = item.attrs for i in item.getPayload(): f[i.getName()] = i.getData() df.append(f) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index d1de9bdbc..5d95db71e 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -18,13 +18,13 @@ ## import os -import time import base64 import sha import socket import sys -from time import localtime, strftime, gmtime +from time import (altzone, daylight, gmtime, localtime, mktime, strftime, + time as time_time, timezone, tzname) from calendar import timegm import socks5 @@ -35,8 +35,10 @@ 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.caps import ConnectionCaps STATUS_LIST = ['offline', 'connecting', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible', 'error'] @@ -414,7 +416,7 @@ class ConnectionBytestream: def _ResultCB(self, con, iq_obj): gajim.log.debug('_ResultCB') - # if we want to respect jep-0065 we have to check for proxy + # if we want to respect xep-0065 we have to check for proxy # activation result in any result iq real_id = unicode(iq_obj.getAttr('id')) if real_id[:3] != 'au_': @@ -562,6 +564,7 @@ class ConnectionBytestream: file_props['sender'] = helpers.get_full_jid_from_iq(iq_obj) 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 @@ -588,12 +591,12 @@ class ConnectionBytestream: class ConnectionDisco: ''' hold xmpppy handlers and public methods for discover services''' def discoverItems(self, jid, node = None, id_prefix = None): - '''According to JEP-0030: jid is mandatory, + '''According to XEP-0030: jid is mandatory, name, node, action is optional.''' self._discover(common.xmpp.NS_DISCO_ITEMS, jid, node, id_prefix) def discoverInfo(self, jid, node = None, id_prefix = None): - '''According to JEP-0030: + '''According to XEP-0030: For identity: category, type is mandatory, name is optional. For feature: var is mandatory''' self._discover(common.xmpp.NS_DISCO_INFO, jid, node, id_prefix) @@ -702,6 +705,10 @@ class ConnectionDisco: def _DiscoverItemsGetCB(self, con, iq_obj): gajim.log.debug('DiscoverItemsGetCB') node = iq_obj.getTagAttr('query', 'node') + if node is None: + result = iq_obj.buildReply('result') + self.connection.send(result) + raise common.xmpp.NodeProcessed if node==common.xmpp.NS_COMMANDS: self.commandListQuery(con, iq_obj) raise common.xmpp.NodeProcessed @@ -746,6 +753,10 @@ class ConnectionDisco: if (node is None or extension == 'xhtml') and not gajim.config.get('ignore_incoming_xhtml'): q.addChild('feature', attrs = {'var': common.xmpp.NS_XHTML_IM}) + if node is None: + q.addChild('feature', attrs = {'var': common.xmpp.NS_PING}) + q.addChild('feature', attrs = {'var': common.xmpp.NS_TIME_REVISED}) + if q.getChildren(): self.connection.send(iq) raise common.xmpp.NodeProcessed @@ -757,7 +768,7 @@ class ConnectionDisco: def _DiscoverInfoCB(self, con, iq_obj): gajim.log.debug('DiscoverInfoCB') - # According to JEP-0030: + # According to XEP-0030: # For identity: category, type is mandatory, name is optional. # For feature: var is mandatory identities, features, data = [], [], [] @@ -775,11 +786,13 @@ class ConnectionDisco: attr = {} for key in i.getAttrs().keys(): attr[key] = i.getAttr(key) - if attr.has_key('category') and attr['category'] in ('gateway', 'headline')\ - and attr.has_key('type'): + if attr.has_key('category') and \ + attr['category'] in ('gateway', 'headline') and \ + attr.has_key('type'): transport_type = attr['type'] - if attr.has_key('category') and attr['category'] == 'conference' \ - and attr.has_key('type') and attr['type'] == 'text': + if attr.has_key('category') and \ + attr['category'] == 'conference' and \ + attr.has_key('type') and attr['type'] == 'text': is_muc = True identities.append(attr) elif i.getName() == 'feature': @@ -796,6 +809,9 @@ class ConnectionDisco: identities = [{'category': 'server', 'type': 'im', 'name': node}] if id[0] == 'p': if jid == gajim.config.get_per('accounts', self.name, 'hostname'): + if features.__contains__(common.xmpp.NS_GMAILNOTIFY): + gajim.gmail_domains.append(jid) + self.request_gmail_notifications() for identity in identities: if identity['category'] == 'pubsub' and identity['type'] == \ 'pep': @@ -811,16 +827,17 @@ class ConnectionDisco: self.available_transports[transport_type].append(jid) else: self.available_transports[transport_type] = [jid] + self.dispatch('AGENT_INFO_INFO', (jid, node, identities, features, data)) + self._capsDiscoCB(jid, node, identities, features, data) class ConnectionVcard: def __init__(self): self.vcard_sha = None self.vcard_shas = {} # sha of contacts self.room_jids = [] # list of gc jids so that vcard are saved in a folder - self.groupchat_jids = {} # {ID : groupchat_jid} - + def add_sha(self, p, send_caps = True): c = p.setTag('x', namespace = common.xmpp.NS_VCARD_UPDATE) if self.vcard_sha is not None: @@ -830,7 +847,7 @@ class ConnectionVcard: return p def add_caps(self, p): - ''' advertise our capabilities in presence stanza (jep-0115)''' + ''' advertise our capabilities in presence stanza (xep-0115)''' c = p.setTag('c', namespace = common.xmpp.NS_CAPS) c.setAttr('node', 'http://gajim.org/caps') ext = [] @@ -880,9 +897,12 @@ class ConnectionVcard: path_to_file = os.path.join(gajim.VCARD_PATH, puny_jid, puny_nick) else: path_to_file = path - fil = open(path_to_file, 'w') - fil.write(str(card)) - fil.close() + try: + fil = open(path_to_file, 'w') + fil.write(str(card)) + fil.close() + except IOError, e: + self.dispatch('ERROR', (_('Disk Write Error'), str(e))) def get_cached_vcard(self, fjid, is_fake_jid = False): '''return the vcard as a dict @@ -1042,7 +1062,7 @@ class ConnectionVcard: elif self.awaiting_answers[id][0] == METACONTACTS_ARRIVED: if iq_obj.getType() == 'result': # Metacontact tags - # http://www.jabber.org/jeps/jep-XXXX.html + # http://www.xmpp.org/extensions/xep-0209.html meta_list = {} query = iq_obj.getTag('query') storage = query.getTag('storage') @@ -1171,12 +1191,13 @@ class ConnectionVcard: #('VCARD', {entry1: data, entry2: {entry21: data, ...}, ...}) self.dispatch('VCARD', vcard) -class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, ConnectionCommands, ConnectionPubSub): +class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, ConnectionCommands, ConnectionPubSub, ConnectionCaps): def __init__(self): ConnectionVcard.__init__(self) ConnectionBytestream.__init__(self) ConnectionCommands.__init__(self) ConnectionPubSub.__init__(self) + self.gmail_url=None # List of IDs we are waiting answers for {id: (type_of_request, data), } self.awaiting_answers = {} # List of IDs that will produce a timeout is answer doesn't arrive @@ -1229,7 +1250,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, def _PrivateCB(self, con, iq_obj): ''' - Private Data (JEP 048 and 049) + Private Data (XEP 048 and 049) ''' gajim.log.debug('PrivateCB') query = iq_obj.getTag('query') @@ -1238,18 +1259,22 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, ns = storage.getNamespace() if ns == 'storage:bookmarks': # Bookmarked URLs and Conferences - # http://www.jabber.org/jeps/jep-0048.html + # http://www.xmpp.org/extensions/xep-0048.html confs = storage.getTags('conference') for conf in confs: autojoin_val = conf.getAttr('autojoin') if autojoin_val is None: # not there (it's optional) autojoin_val = False + minimize_val = conf.getAttr('minimize') + if minimize_val is None: # not there (it's optional) + minimize_val = False print_status = conf.getTagData('print_status') if not print_status: print_status = conf.getTagData('show_status') bm = {'name': conf.getAttr('name'), 'jid': conf.getAttr('jid'), 'autojoin': autojoin_val, + 'minimize': minimize_val, 'password': conf.getTagData('password'), 'nick': conf.getTagData('nick'), 'print_status': print_status} @@ -1259,7 +1284,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, elif ns == 'gajim:prefs': # Preferences data - # http://www.jabber.org/jeps/jep-0049.html + # http://www.xmpp.org/extensions/xep-0049.html #TODO: implement this pass elif ns == 'storage:rosternotes': @@ -1279,7 +1304,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, ns = storage_tag.getNamespace() if ns == 'storage:metacontacts': self.metacontacts_supported = False - # Private XML Storage (JEP49) is not supported by server + # Private XML Storage (XEP49) is not supported by server # Continue connecting self.connection.initRoster() @@ -1329,7 +1354,12 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, seconds = int(seconds) except: return - who = helpers.get_full_jid_from_iq(iq_obj) + id = iq_obj.getID() + if id in self.groupchat_jids: + who = self.groupchat_jids[id] + del self.groupchat_jids[id] + else: + who = helpers.get_full_jid_from_iq(iq_obj) jid_stripped, resource = gajim.get_room_and_nick_from_fjid(who) self.dispatch('LAST_STATUS_TIME', (jid_stripped, resource, seconds, status)) @@ -1344,7 +1374,12 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, client_info += ' ' + qp.getTag('version').getData() if qp.getTag('os'): os_info += qp.getTag('os').getData() - who = helpers.get_full_jid_from_iq(iq_obj) + id = iq_obj.getID() + if id in self.groupchat_jids: + who = self.groupchat_jids[id] + del self.groupchat_jids[id] + else: + who = helpers.get_full_jid_from_iq(iq_obj) jid_stripped, resource = gajim.get_room_and_nick_from_fjid(who) self.dispatch('OS_INFO', (jid_stripped, resource, client_info, os_info)) @@ -1352,18 +1387,21 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, gajim.log.debug('TimeCB') iq_obj = iq_obj.buildReply('result') qp = iq_obj.getTag('query') - qp.setTagData('utc', strftime("%Y%m%dT%T", gmtime())) - qp.setTagData('tz', strftime("%Z", gmtime())) - qp.setTagData('display', strftime("%c", localtime())) + qp.setTagData('utc', strftime('%Y%m%dT%T', gmtime())) + qp.setTagData('tz', tzname[daylight]) + qp.setTagData('display', strftime('%c', localtime())) self.connection.send(iq_obj) raise common.xmpp.NodeProcessed def _TimeRevisedCB(self, con, iq_obj): gajim.log.debug('TimeRevisedCB') iq_obj = iq_obj.buildReply('result') - qp = iq_obj.setTag('time') - qp.setTagData('utc', strftime("%Y-%m-%dT%TZ", gmtime())) - qp.setTagData('tzo', "%+03d:00"% (-time.timezone/(60*60))) + qp = iq_obj.setTag('time', + namespace=common.xmpp.NS_TIME_REVISED) + qp.setTagData('utc', strftime('%Y-%m-%dT%TZ', gmtime())) + zone = -(timezone, altzone)[daylight] / 60 + tzo = (zone / 60, abs(zone % 60)) + qp.setTagData('tzo', '%+03d:%02d' % (tzo)) self.connection.send(iq_obj) raise common.xmpp.NodeProcessed @@ -1386,6 +1424,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, '''Called when we receive results from Querying the server for mail messages in gmail account''' if not gm.getTag('mailbox'): return + self.gmail_url = gm.getTag('mailbox').getAttr('url') if gm.getTag('mailbox').getNamespace() == common.xmpp.NS_GMAILNOTIFY: newmsgs = gm.getTag('mailbox').getAttr('total-matched') if newmsgs != '0': @@ -1425,10 +1464,17 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, mtype = msg.getType() subject = msg.getSubject() # if not there, it's None tim = msg.getTimestamp() - tim = time.strptime(tim, '%Y%m%dT%H:%M:%S') - tim = time.localtime(timegm(tim)) + tim = helpers.datetime_tuple(tim) + tim = localtime(timegm(tim)) frm = helpers.get_full_jid_from_iq(msg) jid = helpers.get_jid_from_iq(msg) + addressTag = msg.getTag('addresses', namespace = common.xmpp.NS_ADDRESS) + # Be sure it comes from one of our resource, else ignore address element + if addressTag and jid == gajim.get_jid_from_account(self.name): + address = addressTag.getTag('address', attrs={'type': 'ofrom'}) + if address: + frm = address.getAttr('jid') + jid = gajim.get_jid_without_resource(frm) no_log_for = gajim.config.get_per('accounts', self.name, 'no_log_for') if not no_log_for: @@ -1446,10 +1492,10 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, invite = None delayed = msg.getTag('x', namespace = common.xmpp.NS_DELAY) != None msg_id = None - composing_jep = None + composing_xep = None # FIXME: Msn transport (CMSN1.2.1 and PyMSN0.10) do NOT RECOMMENDED # invitation - # stanza (MUC JEP) remove in 2007, as we do not do NOT RECOMMENDED + # stanza (MUC XEP) remove in 2007, as we do not do NOT RECOMMENDED xtags = msg.getTags('x') for xtag in xtags: if xtag.getNamespace() == common.xmpp.NS_CONFERENCE and not invite: @@ -1458,22 +1504,22 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, return # chatstates - look for chatstate tags in a message if not delayed if not delayed: - composing_jep = False + composing_xep = False children = msg.getChildren() for child in children: if child.getNamespace() == 'http://jabber.org/protocol/chatstates': chatstate = child.getName() - composing_jep = 'JEP-0085' + composing_xep = 'XEP-0085' break - # No JEP-0085 support, fallback to JEP-0022 + # No XEP-0085 support, fallback to XEP-0022 if not chatstate: chatstate_child = msg.getTag('x', namespace = common.xmpp.NS_EVENT) if chatstate_child: chatstate = 'active' - composing_jep = 'JEP-0022' + composing_xep = 'XEP-0022' if not msgtxt and chatstate_child.getTag('composing'): chatstate = 'composing' - # JEP-0172 User Nickname + # XEP-0172 User Nickname user_nick = msg.getTagData('nick') if not user_nick: user_nick = '' @@ -1494,8 +1540,11 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, error_msg = msgtxt msgtxt = None if self.name not in no_log_for: - gajim.logger.write('error', frm, error_msg, tim = tim, - subject = subject) + try: + gajim.logger.write('error', frm, error_msg, tim = tim, + subject = subject) + except exceptions.PysqliteOperationalError, e: + self.dispatch('ERROR', (_('Disk Write Error'), str(e))) self.dispatch('MSGERROR', (frm, msg.getErrorCode(), error_msg, msgtxt, tim)) return @@ -1507,22 +1556,34 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, self.dispatch('GC_SUBJECT', (frm, subject, msgtxt, has_timestamp)) else: if not msg.getTag('body'): #no + # It could be a config change. See + # http://www.xmpp.org/extensions/xep-0045.html#roomconfig-notify + if msg.getTag('x'): + statusCode = msg.getStatusCode() + if statusCode != []: + self.dispatch('GC_CONFIG_CHANGE', (jid, statusCode)) return # Ignore message from room in which we are not if not self.last_history_line.has_key(jid): return self.dispatch('GC_MSG', (frm, msgtxt, tim, has_timestamp, msghtml)) - if self.name not in no_log_for and not int(float(time.mktime(tim)))\ + if self.name not in no_log_for and not int(float(mktime(tim)))\ <= self.last_history_line[jid] and msgtxt: - gajim.logger.write('gc_msg', frm, msgtxt, tim = tim) + try: + gajim.logger.write('gc_msg', frm, msgtxt, tim = tim) + except exceptions.PysqliteOperationalError, e: + self.dispatch('ERROR', (_('Disk Write Error'), str(e))) return elif mtype == 'chat': # it's type 'chat' if not msg.getTag('body') and chatstate is None: #no return if msg.getTag('body') and self.name not in no_log_for and jid not in\ no_log_for and msgtxt: - msg_id = gajim.logger.write('chat_msg_recv', frm, msgtxt, tim = tim, - subject = subject) + try: + msg_id = gajim.logger.write('chat_msg_recv', frm, msgtxt, + tim = tim, subject = subject) + except exceptions.PysqliteOperationalError, e: + self.dispatch('ERROR', (_('Disk Write Error'), str(e))) else: # it's single message if invite is not None: item = invite.getTag('invite') @@ -1533,14 +1594,17 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, self.dispatch('GC_INVITATION',(frm, jid_from, reason, password)) return if self.name not in no_log_for and jid not in no_log_for and msgtxt: - gajim.logger.write('single_msg_recv', frm, msgtxt, tim = tim, - subject = subject) + try: + gajim.logger.write('single_msg_recv', frm, msgtxt, tim = tim, + subject = subject) + except exceptions.PysqliteOperationalError, e: + self.dispatch('ERROR', (_('Disk Write Error'), str(e))) mtype = 'normal' treat_as = gajim.config.get('treat_incoming_messages') if treat_as: mtype = treat_as self.dispatch('MSG', (frm, msgtxt, tim, encrypted, mtype, - subject, chatstate, msg_id, composing_jep, user_nick, msghtml)) + subject, chatstate, msg_id, composing_xep, user_nick, msghtml)) # END messageCB def _pubsubEventCB(self, con, msg): @@ -1567,20 +1631,13 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if items is None: return for item in items.getTags('item'): - # check for event type (for now only one type supported: pubsub.com events) - child = item.getTag('pubsub-message') - if child is not None: - # we have pubsub.com notification - child = child.getTag('feed') - if child is None: continue - - for entry in child.getTags('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),)) + 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): @@ -1609,7 +1666,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, sigTag = None ns_muc_user_x = None avatar_sha = None - # JEP-0172 User Nickname + # XEP-0172 User Nickname user_nick = prs.getTagData('nick') if not user_nick: user_nick = '' @@ -1628,10 +1685,10 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, avatar_sha = x.getTagData('photo') contact_nickname = x.getTagData('nickname') elif namespace == common.xmpp.NS_DELAY: - # JEP-0091 + # XEP-0091 tim = prs.getTimestamp() - tim = time.strptime(tim, '%Y%m%dT%H:%M:%S') - timestamp = time.localtime(timegm(tim)) + tim = helpers.datetime_tuple(tim) + timestamp = localtime(timegm(tim)) elif namespace == 'http://delx.cjb.net/protocol/roster-subsync': # see http://trac.gajim.org/ticket/326 agent = gajim.get_server_from_jid(jid_stripped) @@ -1664,27 +1721,29 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if ptype == 'error': errmsg = prs.getError() errcode = prs.getErrorCode() + room_jid, nick = gajim.get_room_and_nick_from_fjid(who) if errcode == '502': # Internal Timeout: self.dispatch('NOTIFY', (jid_stripped, 'error', errmsg, resource, prio, keyID, timestamp, None)) elif errcode == '401': # password required to join - self.dispatch('ERROR', (_('Unable to join group chat'), - _('A password is required to join this group chat.'))) + self.dispatch('GC_PASSWORD_REQUIRED', (room_jid, nick)) elif errcode == '403': # we are banned self.dispatch('ERROR', (_('Unable to join group chat'), - _('You are banned from this group chat.'))) + _('You are banned from group chat %s.') % room_jid)) elif errcode == '404': # group chat does not exist self.dispatch('ERROR', (_('Unable to join group chat'), - _('Such group chat does not exist.'))) + _('Group chat %s does not exist.') % room_jid)) elif errcode == '405': self.dispatch('ERROR', (_('Unable to join group chat'), _('Group chat creation is restricted.'))) elif errcode == '406': self.dispatch('ERROR', (_('Unable to join group chat'), - _('Your registered nickname must be used.'))) + _('Your registered nickname must be used in group chat %s.') \ + % room_jid)) elif errcode == '407': self.dispatch('ERROR', (_('Unable to join group chat'), - _('You are not in the members list.'))) + _('You are not in the members list in groupchat %s.') % \ + room_jid)) elif errcode == '409': # nick conflict # the jid_from in this case is FAKE JID: room_jid/nick # resource holds the bad nick so propose a new one @@ -1692,7 +1751,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, gajim.config.get('gc_proposed_nick_char') room_jid = gajim.get_room_from_fjid(who) self.dispatch('ASK_NEW_NICK', (room_jid, _('Unable to join group chat'), - _('Your desired nickname is in use or registered by another occupant.\nPlease specify another nickname below:'), proposed_nickname)) + _('Your desired nickname in group chat %s is in use or registered by another occupant.\nPlease specify another nickname below:') % room_jid, proposed_nickname)) else: # print in the window the error self.dispatch('ERROR_ANSWER', ('', jid_stripped, errmsg, errcode)) @@ -1709,7 +1768,10 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if jid: # we know real jid, save it in db st += ' (%s)' % jid - gajim.logger.write('gcstatus', who, st, show) + try: + gajim.logger.write('gcstatus', who, st, show) + except exceptions.PysqliteOperationalError, e: + self.dispatch('ERROR', (_('Disk Write Error'), str(e))) if avatar_sha or avatar_sha == '': if avatar_sha == '': # contact has no avatar @@ -1728,7 +1790,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, jid = destroy.getAttr('jid') if jid: reason += '\n' + _('You can join this room instead: %s') % jid - statusCode = 'destroyed' + statusCode = ['destroyed'] else: reason = prs.getReason() statusCode = prs.getStatusCode() @@ -1763,10 +1825,10 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, # detect a subscription loop if not self.subscribed_events.has_key(jid_stripped): self.subscribed_events[jid_stripped] = [] - self.subscribed_events[jid_stripped].append(time.time()) + self.subscribed_events[jid_stripped].append(time_time()) block = False if len(self.subscribed_events[jid_stripped]) > 5: - if time.time() - self.subscribed_events[jid_stripped][0] < 5: + if time_time() - self.subscribed_events[jid_stripped][0] < 5: block = True self.subscribed_events[jid_stripped] = self.subscribed_events[jid_stripped][1:] if block: @@ -1783,10 +1845,10 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, # detect a unsubscription loop if not self.subscribed_events.has_key(jid_stripped): self.subscribed_events[jid_stripped] = [] - self.subscribed_events[jid_stripped].append(time.time()) + self.subscribed_events[jid_stripped].append(time_time()) block = False if len(self.subscribed_events[jid_stripped]) > 5: - if time.time() - self.subscribed_events[jid_stripped][0] < 5: + if time_time() - self.subscribed_events[jid_stripped][0] < 5: block = True self.subscribed_events[jid_stripped] = self.subscribed_events[jid_stripped][1:] if block: @@ -1816,9 +1878,12 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, # avatar has been updated self.request_vcard(jid_stripped) if not ptype or ptype == 'unavailable': - if gajim.config.get('log_contact_status_changes') and self.name\ - not in no_log_for and jid_stripped not in no_log_for: - gajim.logger.write('status', jid_stripped, status, show) + if gajim.config.get('log_contact_status_changes') and self.name \ + not in no_log_for and jid_stripped not in no_log_for: + try: + gajim.logger.write('status', jid_stripped, status, show) + except exceptions.PysqliteOperationalError, e: + self.dispatch('ERROR', (_('Disk Write Error'), str(e))) self.dispatch('NOTIFY', (jid_stripped, show, status, resource, prio, keyID, timestamp, contact_nickname)) # END presenceCB @@ -1875,6 +1940,10 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if not self.connection: return self.connection.getRoster(self._on_roster_set) + self.discoverItems(gajim.config.get_per('accounts', self.name, + 'hostname'), id_prefix='p') + self.discoverInfo(gajim.config.get_per('accounts', self.name, + 'hostname'), id_prefix='p') if gajim.config.get_per('accounts', self.name, 'use_ft_proxies'): self.discover_ft_proxies() @@ -1885,10 +1954,6 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, proxies = map(lambda e:e.strip(), cfg_proxies.split(',')) for proxy in proxies: gajim.proxy65_manager.resolve(proxy, self.connection) - self.discoverItems(gajim.config.get_per('accounts', self.name, - 'hostname'), id_prefix='p') - self.discoverInfo(gajim.config.get_per('accounts', self.name, - 'hostname'), id_prefix='p') def _on_roster_set(self, roster): raw_roster = roster.getRaw() @@ -1951,29 +2016,31 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, # Get annotations from private namespace self.get_annotations() - # If it's a gmail account, - # inform the server that we want e-mail notifications - if gajim.get_server_from_jid(our_jid) in gajim.gmail_domains: - gajim.log.debug(('%s is a gmail account. Setting option ' - 'to get e-mail notifications on the server.') % (our_jid)) - iq = common.xmpp.Iq(typ = 'set', to = our_jid) - iq.setAttr('id', 'MailNotify') - query = iq.setTag('usersetting') - query.setNamespace(common.xmpp.NS_GTALKSETTING) - query = query.setTag('mailnotifications') - query.setAttr('value', 'true') - self.connection.send(iq) - # Ask how many messages there are now - iq = common.xmpp.Iq(typ = 'get') - iq.setAttr('id', '13') - query = iq.setTag('query') - query.setNamespace(common.xmpp.NS_GMAILNOTIFY) - self.connection.send(iq) - #Inform GUI we just signed in self.dispatch('SIGNED_IN', ()) self.continue_connect_info = None + def request_gmail_notifications(self): + # It's a gmail account, + # inform the server that we want e-mail notifications + our_jid = helpers.parse_jid(gajim.get_jid_from_account(self.name)) + gajim.log.debug(('%s is a gmail account. Setting option ' + 'to get e-mail notifications on the server.') % (our_jid)) + iq = common.xmpp.Iq(typ = 'set', to = our_jid) + iq.setAttr('id', 'MailNotify') + query = iq.setTag('usersetting') + query.setNamespace(common.xmpp.NS_GTALKSETTING) + query = query.setTag('mailnotifications') + query.setAttr('value', 'true') + self.connection.send(iq) + # Ask how many messages there are now + iq = common.xmpp.Iq(typ = 'get') + iq.setID(self.connection.getAnID()) + query = iq.setTag('query') + query.setNamespace(common.xmpp.NS_GMAILNOTIFY) + self.connection.send(iq) + + def _search_fields_received(self, con, iq_obj): jid = jid = helpers.get_jid_from_iq(iq_obj) tag = iq_obj.getTag('query', namespace = common.xmpp.NS_SEARCH) @@ -1999,6 +2066,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, # that defines handlers con.RegisterHandler('message', self._messageCB) con.RegisterHandler('presence', self._presenceCB) + con.RegisterHandler('presence', self._capsPresenceCB) con.RegisterHandler('iq', self._vCardCB, 'result', common.xmpp.NS_VCARD) con.RegisterHandler('iq', self._rosterSetCB, 'set', diff --git a/src/common/contacts.py b/src/common/contacts.py index 0147a9fd3..65fe13fb7 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -2,6 +2,8 @@ ## ## Copyright (C) 2006 Yann Le Boulanger ## Copyright (C) 2006 Nikos Kouremenos +## Copyright (C) 2007 Lukas Petrovicky +## Copyright (C) 2007 Julien Pivotto ## ## ## This program is free software; you can redistribute it and/or modify @@ -20,7 +22,7 @@ class Contact: '''Information concerning each contact''' def __init__(self, jid='', name='', groups=[], show='', status='', sub='', ask='', resource='', priority=0, keyID='', our_chatstate=None, - chatstate=None, last_status_time=None, msg_id = None, composing_jep = None): + chatstate=None, last_status_time=None, msg_id = None, composing_xep = None): self.jid = jid self.name = name self.contact_name = '' # nick choosen by contact @@ -37,6 +39,12 @@ class Contact: self.priority = priority self.keyID = keyID + # Capabilities; filled by caps.py/ConnectionCaps object + # every time it gets these from presence stanzas + self.caps_node=None + self.caps_ver=None + self.caps_exts=None + # please read jep-85 http://www.jabber.org/jeps/jep-0085.html # we keep track of jep85 support with the peer by three extra states: # None, False and 'ask' @@ -47,9 +55,9 @@ class Contact: self.our_chatstate = our_chatstate self.msg_id = msg_id # tell which JEP we're using for composing state - # None = have to ask, JEP-0022 = use this jep, - # JEP-0085 = use this jep, False = no composing support - self.composing_jep = composing_jep + # None = have to ask, XEP-0022 = use this jep, + # XEP-0085 = use this jep, False = no composing support + self.composing_xep = composing_xep # this is contact's chatstate self.chatstate = chatstate self.last_status_time = last_status_time @@ -153,10 +161,10 @@ class Contacts: def create_contact(self, jid='', name='', groups=[], show='', status='', sub='', ask='', resource='', priority=0, keyID='', our_chatstate=None, - chatstate=None, last_status_time=None, composing_jep=None): + chatstate=None, last_status_time=None, composing_xep=None): return Contact(jid, name, groups, show, status, sub, ask, resource, priority, keyID, our_chatstate, chatstate, last_status_time, - composing_jep) + composing_xep) def copy_contact(self, contact): return self.create_contact(jid = contact.jid, name = contact.name, @@ -208,28 +216,28 @@ class Contacts: # remove metacontacts info self.remove_metacontact(account, jid) - def get_contact(self, account, jid, resource = None): - '''Returns the list of contact instances for this jid (one per resource) - or [] if no resource is given - returns the contact instance for the given resource if it's given - or None if there is not''' + def get_contacts(self, account, jid): + '''Returns the list of contact instances for this jid.''' + if jid in self._contacts[account]: + return self._contacts[account][jid] + else: + return [] + + def get_contact(self, account, jid, resource = None): + '''Returns the contact instance for the given resource if it's given else + the first contact is no resource is given or None if there is not''' if jid in self._contacts[account]: - contacts = self._contacts[account][jid] if not resource: - return contacts - for c in contacts: + return self._contacts[account][jid][0] + for c in self._contacts[account][jid]: if c.resource == resource: return c - if resource: - return None - return [] + return None - def get_contacts_from_jid(self, account, jid): - '''we may have two or more resources on that jid''' - if jid in self._contacts[account]: - contacts_instances = self._contacts[account][jid] - return contacts_instances - return [] + def get_contact_from_full_jid(self, account, fjid): + ''' Get Contact object for specific resource of given jid''' + barejid, resource = common.gajim.get_room_and_nick_from_fjid(fjid) + return self.get_contact(account, barejid, resource) def get_highest_prio_contact_from_contacts(self, contacts): if not contacts: @@ -241,7 +249,7 @@ class Contacts: return prim_contact def get_contact_with_highest_priority(self, account, jid): - contacts = self.get_contacts_from_jid(account, jid) + contacts = self.get_contacts(account, jid) if not contacts and '/' in jid: # jid may be a fake jid, try it room, nick = jid.split('/', 1) @@ -258,7 +266,7 @@ class Contacts: '''Returns all contacts in the given group''' group_contacts = [] for jid in self._contacts[account]: - contacts = self.get_contacts_from_jid(account, jid) + contacts = self.get_contacts(account, jid) if group in contacts[0].groups: group_contacts += contacts return group_contacts diff --git a/src/common/dataforms.py b/src/common/dataforms.py index 6c6817d6a..e46fcbfc2 100644 --- a/src/common/dataforms.py +++ b/src/common/dataforms.py @@ -13,7 +13,7 @@ class WrongFieldValue(Error): pass # when we get xmpp.Node which contains bad fi class ExtendedNode(xmpp.Node, object): @classmethod def __new__(cls, *a, **b): - if 'extend' not in b.keys(): + if 'extend' not in b.keys() or not b['extend']: return object.__new__(cls) extend = b['extend'] @@ -76,7 +76,9 @@ def ExtendForm(node): return SimpleDataForm(extend=node) class DataField(ExtendedNode): - """ Keeps data about one field - var, field type, labels, instructions... """ + """ Keeps data about one field - var, field type, labels, instructions... + Base class for different kinds of fields. Use Field() function to + construct one of these. """ def __init__(self, typ=None, var=None, value=None, label=None, desc=None, required=False, options=None, extend=None): @@ -390,8 +392,6 @@ class MultipleDataForm(DataForm): DataForm.__init__(self, type=type, title=title, instructions=instructions, extend=extend) # all records, recorded into DataRecords if extend is None: - # we have to build this object from scratch - xmpp.Node.__init__(self) if items is not None: self.items = items else: diff --git a/src/common/dbus_support.py b/src/common/dbus_support.py index 5a8be077b..94b973c5d 100644 --- a/src/common/dbus_support.py +++ b/src/common/dbus_support.py @@ -60,6 +60,8 @@ class SystemBus: return False if self.system_bus is None: return False + # Don't exit Gajim when dbus is stopped + self.system_bus.set_exit_on_disconnect(False) return True system_bus = SystemBus() diff --git a/src/common/defs.py b/src/common/defs.py index fe72a8e98..d557e6912 100644 --- a/src/common/defs.py +++ b/src/common/defs.py @@ -2,7 +2,7 @@ docdir = '../' datadir = '../' -version = '0.11.1.0' +version = '0.11.1.5' import sys, os.path for base in ('.', 'common'): diff --git a/src/common/events.py b/src/common/events.py index d796cfefb..ddb7eef2e 100644 --- a/src/common/events.py +++ b/src/common/events.py @@ -143,8 +143,8 @@ class Events: self.fire_event_removed(removed_list) return # no event nor type given, remove them all - del self._events[account][jid] self.fire_event_removed(self._events[account][jid]) + del self._events[account][jid] def change_jid(self, account, old_jid, new_jid): if not self._events[account].has_key(old_jid): diff --git a/src/common/exceptions.py b/src/common/exceptions.py index bceef79a4..12d674535 100644 --- a/src/common/exceptions.py +++ b/src/common/exceptions.py @@ -21,6 +21,15 @@ class PysqliteNotAvailable(Exception): def __str__(self): return _('pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting...') +class PysqliteOperationalError(Exception): + '''sqlite2 raised pysqlite2.dbapi2.OperationalError''' + def __init__(self, text=''): + Exception.__init__(self) + self.text = text + + def __str__(self): + return self.text + class ServiceNotAvailable(Exception): '''This exception is raised when we cannot use Gajim remotely''' def __init__(self): diff --git a/src/common/gajim.py b/src/common/gajim.py index 1b2225284..09d837c4d 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -71,6 +71,7 @@ LOGPATH = gajimpaths['LOG'] # deprecated VCARD_PATH = gajimpaths['VCARD'] AVATAR_PATH = gajimpaths['AVATAR'] MY_EMOTS_PATH = gajimpaths['MY_EMOTS'] +MY_ICONSETS_PATH = gajimpaths['MY_ICONSETS'] TMP = gajimpaths['TMP'] DATA_DIR = gajimpaths['DATA'] HOME_DIR = gajimpaths['HOME'] diff --git a/src/common/helpers.py b/src/common/helpers.py index 12388bf81..c768d10f8 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -5,6 +5,7 @@ ## Copyright (C) 2005 ## Dimitur Kirov ## Travis Shirk +## Copyright (C) 2007 Lukas Petrovicky ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published @@ -206,6 +207,8 @@ def get_contact_dict_for_account(account): contacts_dict['%s (%s)' % (name, contact1.jid)] = contact1 contacts_dict['%s (%s)' % (name, jid)] = contact else: + if contact.name == gajim.get_nick_from_jid(jid): + del contacts_dict[jid] contacts_dict[name] = contact return contacts_dict @@ -462,7 +465,7 @@ def play_sound(event): def play_sound_file(path_to_soundfile): if path_to_soundfile == 'beep': - print '\a' # make a speaker beep + exec_command('beep') return if path_to_soundfile is None or not os.path.exists(path_to_soundfile): return @@ -544,14 +547,19 @@ def get_global_status(): def get_icon_name_to_show(contact, account = None): '''Get the icon name to show in online, away, requested, ...''' if account and gajim.events.get_nb_roster_events(account, contact.jid): - return 'message' + return 'event' if account and gajim.events.get_nb_roster_events(account, contact.get_full_jid()): - return 'message' + return 'event' if account and gajim.interface.minimized_controls.has_key(account) and \ contact.jid in gajim.interface.minimized_controls[account] and gajim.interface.\ minimized_controls[account][contact.jid].get_nb_unread_pm() > 0: - return 'message' + return 'event' + if account and gajim.gc_connected[account].has_key(contact.jid): + if gajim.gc_connected[account][contact.jid]: + return 'muc_active' + else: + return 'muc_inactive' if contact.jid.find('@') <= 0: # if not '@' or '@' starts the jid ==> agent return contact.show if contact.sub in ('both', 'to'): @@ -863,66 +871,127 @@ def reduce_chars_newlines(text, max_chars = 0, max_lines = 0): lines = map(lambda e: _cut_if_long(e), lines) if lines: reduced_text = reduce(lambda e, e1: e + '\n' + e1, lines) + if reduced_text != text: + reduced_text += '...' else: reduced_text = '' return reduced_text -def get_notification_icon_tooltip_text(): - text = None - unread_chat = gajim.events.get_nb_events(types = ['printed_chat', - 'chat']) - unread_single_chat = gajim.events.get_nb_events(types = ['normal']) - unread_gc = gajim.events.get_nb_events(types = ['printed_gc_msg', - 'printed_marked_gc_msg', 'gc_msg']) - unread_pm = gajim.events.get_nb_events(types = ['printed_pm', 'pm']) +def get_account_status(account): + status = reduce_chars_newlines(account['status_line'], 100, 1) + return status + +def get_notification_icon_tooltip_dict(): + '''returns a dict of the form {acct: {'show': show, 'message': message, + 'event_lines': [list of text lines to show in tooltip]}''' + # How many events must there be before they're shown summarized, not per-user + max_ungrouped_events = 10 accounts = get_accounts_info() - if unread_chat or unread_single_chat or unread_gc or unread_pm: - text = 'Gajim ' - awaiting_events = unread_chat + unread_single_chat + unread_gc + unread_pm - if awaiting_events == unread_chat or awaiting_events == unread_single_chat \ - or awaiting_events == unread_gc or awaiting_events == unread_pm: - # This condition is like previous if but with xor... - # Print in one line - text += '-' - else: - # Print in multiple lines - text += '\n ' - if unread_chat: - text += ngettext( - ' %d unread message', - ' %d unread messages', - unread_chat, unread_chat, unread_chat) - text += '\n ' - if unread_single_chat: - text += ngettext( - ' %d unread single message', - ' %d unread single messages', - unread_single_chat, unread_single_chat, unread_single_chat) - text += '\n ' - if unread_gc: - text += ngettext( - ' %d unread group chat message', - ' %d unread group chat messages', - unread_gc, unread_gc, unread_gc) - text += '\n ' - if unread_pm: - text += ngettext( - ' %d unread private message', - ' %d unread private messages', - unread_pm, unread_pm, unread_pm) - text += '\n ' - text = text[:-4] # remove latest '\n ' - elif len(accounts) > 1: - text = _('Gajim') - elif len(accounts) == 1: - message = accounts[0]['status_line'] - message = reduce_chars_newlines(message, 100, 1) - text = _('Gajim - %s') % message - else: - text = _('Gajim - %s') % get_uf_show('offline') + # Gather events. (With accounts, when there are more.) + for account in accounts: + account_name = account['name'] + account['event_lines'] = [] + # Gather events per-account + pending_events = gajim.events.get_events(account = account_name) + messages, non_messages, total_messages, total_non_messages = {}, {}, 0, 0 + for jid in pending_events: + for event in pending_events[jid]: + if event.type_.count('file') > 0: + # This is a non-messagee event. + messages[jid] = non_messages.get(jid, 0) + 1 + total_non_messages = total_non_messages + 1 + else: + # This is a message. + messages[jid] = messages.get(jid, 0) + 1 + total_messages = total_messages + 1 + # Display unread messages numbers, if any + if total_messages > 0: + if total_messages > max_ungrouped_events: + text = ngettext( + '%d message pending', + '%d messages pending', + total_messages, total_messages, total_messages) + account['event_lines'].append(text) + else: + for jid in messages.keys(): + text = ngettext( + '%d message pending', + '%d messages pending', + messages[jid], messages[jid], messages[jid]) + contact = gajim.contacts.get_first_contact_from_jid( + account['name'], jid) + if jid in gajim.gc_connected[account['name']]: + text += _(' from room %s') % (jid) + elif contact: + name = contact.get_shown_name() + text += _(' from user %s') % (name) + else: + text += _(' from %s') % (jid) + account['event_lines'].append(text) + # Display unseen events numbers, if any + if total_non_messages > 0: + if total_non_messages > max_ungrouped_events: + text = ngettext( + '%d event pending', + '%d events pending', + total_non_messages, total_non_messages, total_non_messages) + accounts[account]['event_lines'].append(text) + else: + for jid in non_messages.keys(): + text = ngettext( + '%d event pending', + '%d events pending', + non_messages[jid], non_messages[jid], non_messages[jid]) + text += _(' from user %s') % (jid) + accounts[account]['event_lines'].append(text) + + return accounts + +def get_notification_icon_tooltip_text(): + text = None + # How many events must there be before they're shown summarized, not per-user + max_ungrouped_events = 10 + # Character which should be used to indent in the tooltip. + indent_with = ' ' + + accounts = get_notification_icon_tooltip_dict() + + if len(accounts) == 0: + # No configured account + return _('Gajim') + + # at least one account present + + # Is there more that one account? + if len(accounts) == 1: + show_more_accounts = False + else: + show_more_accounts = True + + # If there is only one account, its status is shown on the first line. + if show_more_accounts: + text = _('Gajim') + else: + text = _('Gajim - %s') % (get_account_status(accounts[0])) + + # Gather and display events. (With accounts, when there are more.) + for account in accounts: + account_name = account['name'] + # Set account status, if not set above + if (show_more_accounts): + message = '\n' + indent_with + ' %s - %s' + text += message % (account_name, get_account_status(account)) + # Account list shown, messages need to be indented more + indent_how = 2 + else: + # If no account list is shown, messages could have default indenting. + indent_how = 1 + for line in account['event_lines']: + text += '\n' + indent_with * indent_how + ' ' + text += line return text def get_accounts_info(): @@ -963,3 +1032,21 @@ def get_avatar_path(prefix): if os.path.exists(file_): return file_ return None + +def datetime_tuple(timestamp): + '''Converts timestamp using strptime and the format: %Y%m%dT%H:%M:%S + Because of various datetime formats are used the following exceptions + are handled: + - Optional milliseconds appened to the string are removed + - XEP-082 datetime strings have all '-' cahrs removed to meet + the above format.''' + timestamp = timestamp.split('.')[0] + timestamp = timestamp.replace('-', '') + from time import strptime + return strptime(timestamp, '%Y%m%dT%H:%M:%S') + +def get_iconset_path(iconset): + if os.path.isdir(os.path.join(gajim.DATA_DIR, 'iconsets', iconset)): + return os.path.join(gajim.DATA_DIR, 'iconsets', iconset) + elif os.path.isdir(os.path.join(gajim.MY_ICONSETS_PATH, iconset)): + return os.path.join(gajim.MY_ICONSETS_PATH, iconset) diff --git a/src/common/logger.py b/src/common/logger.py index 19c816f64..e5a36a8fe 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -13,10 +13,14 @@ ## GNU General Public License for more details. ## +''' This module allows to access the on-disk database of logs. ''' + import os import sys import time import datetime +from gzip import GzipFile +from cStringIO import StringIO import exceptions import gajim @@ -169,19 +173,21 @@ class Logger: jid = jid.split('/', 1)[0] # remove the resource if jid in self.jids_already_in: # we already have jids in DB self.cur.execute('SELECT jid_id FROM jids WHERE jid=?', [jid]) - jid_id = self.cur.fetchone()[0] - else: # oh! a new jid :), we add it now - if typestr == 'ROOM': - typ = constants.JID_ROOM_TYPE - else: - typ = constants.JID_NORMAL_TYPE - self.cur.execute('INSERT INTO jids (jid, type) VALUES (?, ?)', (jid, typ)) - try: - self.con.commit() - except sqlite.OperationalError, e: - print >> sys.stderr, str(e) - jid_id = self.cur.lastrowid - self.jids_already_in.append(jid) + row = self.cur.fetchone() + if row: + return row[0] + # oh! a new jid :), we add it now + if typestr == 'ROOM': + typ = constants.JID_ROOM_TYPE + else: + typ = constants.JID_NORMAL_TYPE + self.cur.execute('INSERT INTO jids (jid, type) VALUES (?, ?)', (jid, typ)) + try: + self.con.commit() + except sqlite.OperationalError, e: + print >> sys.stderr, str(e) + jid_id = self.cur.lastrowid + self.jids_already_in.append(jid) return jid_id def convert_human_values_to_db_api_values(self, kind, show): @@ -285,7 +291,10 @@ class Logger: def commit_to_db(self, values, write_unread = False): #print 'saving', values sql = 'INSERT INTO logs (jid_id, contact_name, time, kind, show, message, subject) VALUES (?, ?, ?, ?, ?, ?, ?)' - self.cur.execute(sql, values) + try: + self.cur.execute(sql, values) + except sqlite.OperationalError, e: + raise exceptions.PysqliteOperationalError(str(e)) message_id = None try: self.con.commit() @@ -625,3 +634,77 @@ class Logger: for result in results: answer[result[0]] = self.convert_api_values_to_human_transport_type(result[1]) return answer + + # A longer note here: + # The database contains a blob field. Pysqlite seems to need special care for such fields. + # When storing, we need to convert string into buffer object (1). + # When retrieving, we need to convert it back to a string to decompress it. (2) + # GzipFile needs a file-like object, StringIO emulates file for plain strings. + def iter_caps_data(self): + ''' Iterate over caps cache data stored in the database. + The iterator values are pairs of (node, ver, ext, identities, features): + identities == {'category':'foo', 'type':'bar', 'name':'boo'}, + features being a list of feature namespaces. ''' + + # get data from table + # the data field contains binary object (gzipped data), this is a hack + # to get that data without trying to convert it to unicode + #tmp, self.con.text_factory = self.con.text_factory, str + try: + self.cur.execute('''SELECT node, ver, ext, data FROM caps_cache;'''); + except sqlite.OperationalError: + # might happen when there's no caps_cache table yet + # -- there's no data to read anyway then + #self.con.text_factory = tmp + return + #self.con.text_factory = tmp + + for node, ver, ext, data in self.cur: + # for each row: unpack the data field + # (format: (category, type, name, category, type, name, ... + # ..., 'FEAT', feature1, feature2, ...).join(' ')) + # NOTE: if there's a need to do more gzip, put that to a function + data=GzipFile(fileobj=StringIO(str(data))).read().split('\0') # (2) -- note above + i=0 + identities=set() + features=set() + while i<(len(data)-2) and data[i]!='FEAT': + category=data[i] + type=data[i+1] + name=data[i+2] + identities.add((category,type,name)) + i+=3 + i+=1 + while i> sys.stderr, str(e) diff --git a/src/common/optparser.py b/src/common/optparser.py index 4ae169df1..c5aaede3e 100644 --- a/src/common/optparser.py +++ b/src/common/optparser.py @@ -153,9 +153,21 @@ class OptionsParser: self.update_config_to_01101() if old < [0, 11, 0, 2] and new >= [0, 11, 0, 2]: self.update_config_to_01102() + if old < [0, 11, 1, 1] and new >= [0, 11, 1, 1]: + self.update_config_to_01111() + if old < [0, 11, 1, 2] and new >= [0, 11, 1, 2]: + self.update_config_to_01112() + if old < [0, 11, 1, 3] and new >= [0, 11, 1, 3]: + self.update_config_to_01113() + if old < [0, 11, 1, 4] and new >= [0, 11, 1, 4]: + self.update_config_to_01114() + if old < [0, 11, 1, 5] and new >= [0, 11, 1, 5]: + self.update_config_to_01115() gajim.logger.init_vars() gajim.config.set('version', new_version) + + gajim.capscache.load_from_db() def update_config_x_to_09(self): # Var name that changed: @@ -178,7 +190,7 @@ class OptionsParser: 'groupfontattrs', 'contacttextcolor', 'contactbgcolor', 'contactfont', 'contactfontattrs', 'bannertextcolor', 'bannerbgcolor', 'bannerfont', 'bannerfontattrs'] - for theme_name in (_('grocery'), _('gtk+')): + for theme_name in (_('grocery'), _('default')): if theme_name not in gajim.config.get_per('themes'): gajim.config.add_per('themes', theme_name) theme = gajim.config.themes_default[theme_name] @@ -209,7 +221,6 @@ class OptionsParser: def assert_unread_msgs_table_exists(self): '''create table unread_messages if there is no such table''' - #FIXME see #2812 back = os.getcwd() os.chdir(logger.LOG_DB_FOLDER) con = sqlite.connect(logger.LOG_DB_FILE) @@ -384,3 +395,84 @@ class OptionsParser: gajim.config.set('ft_add_hosts_to_send', self.old_values['ft_override_host_to_send']) gajim.config.set('version', '0.11.0.2') + + def update_config_to_01111(self): + '''always_hide_chatbuttons -> compact_view''' + if self.old_values.has_key('always_hide_groupchat_buttons') and \ + self.old_values.has_key('always_hide_chat_buttons'): + gajim.config.set('compact_view', self.old_values['always_hide_groupchat_buttons'] and \ + self.old_values['always_hide_chat_buttons']) + gajim.config.set('version', '0.11.1.1') + + def update_config_to_01112(self): + '''gtk+ theme is renamed to default''' + if self.old_values.has_key('roster_theme') and \ + self.old_values['roster_theme'] == 'gtk+': + gajim.config.set('roster_theme', _('default')) + gajim.config.set('version', '0.11.1.2') + + def update_config_to_01113(self): + # copy&pasted from update_config_to_01013, possibly 'FIXME see #2812' applies too + back = os.getcwd() + os.chdir(logger.LOG_DB_FOLDER) + con = sqlite.connect(logger.LOG_DB_FILE) + os.chdir(back) + cur = con.cursor() + try: + cur.executescript( + ''' + CREATE TABLE caps_cache ( + node TEXT, + ver TEXT, + ext TEXT, + data BLOB + ); + ''' + ) + con.commit() + except sqlite.OperationalError, e: + pass + con.close() + gajim.config.set('version', '0.11.1.3') + + def update_config_to_01114(self): + # add default theme if it doesn't exist + d = ['accounttextcolor', 'accountbgcolor', 'accountfont', + 'accountfontattrs', 'grouptextcolor', 'groupbgcolor', 'groupfont', + 'groupfontattrs', 'contacttextcolor', 'contactbgcolor', 'contactfont', + 'contactfontattrs', 'bannertextcolor', 'bannerbgcolor', 'bannerfont', + 'bannerfontattrs'] + theme_name = _('default') + if theme_name not in gajim.config.get_per('themes'): + gajim.config.add_per('themes', theme_name) + if gajim.config.get_per('themes', 'gtk+'): + # copy from old gtk+ theme + for o in d: + val = gajim.config.get_per('themes', 'gtk+', o) + gajim.config.set_per('themes', theme_name, o, val) + gajim.config.del_per('themes', 'gtk+') + else: + # copy from default theme + theme = gajim.config.themes_default[theme_name] + for o in d: + gajim.config.set_per('themes', theme_name, o, theme[d.index(o)]) + gajim.config.set('version', '0.11.1.4') + + def update_config_to_01115(self): + # copy&pasted from update_config_to_01013, possibly 'FIXME see #2812' applies too + back = os.getcwd() + os.chdir(logger.LOG_DB_FOLDER) + con = sqlite.connect(logger.LOG_DB_FILE) + os.chdir(back) + cur = con.cursor() + try: + cur.executescript( + ''' + DELETE FROM caps_cache; + ''' + ) + con.commit() + except sqlite.OperationalError, e: + pass + con.close() + gajim.config.set('version', '0.11.1.5') diff --git a/src/common/passwords.py b/src/common/passwords.py index 77ddbf8c9..79d83cb16 100644 --- a/src/common/passwords.py +++ b/src/common/passwords.py @@ -81,12 +81,18 @@ class GnomePasswordStorage(PasswordStorage): def save_password(self, account_name, password, update=True): display_name = _('Gajim account %s') % account_name attributes = dict(account_name=str(account_name), gajim=1) - auth_token = gnomekeyring.item_create_sync( - self.keyring, gnomekeyring.ITEM_GENERIC_SECRET, - display_name, attributes, password, update) + try: + auth_token = gnomekeyring.item_create_sync( + self.keyring, gnomekeyring.ITEM_GENERIC_SECRET, + display_name, attributes, password, update) + except gnomekeyring.DeniedError: + set_storage(SimplePasswordStorage()) + storage.save_password(account_name, password) + return token = 'gnomekeyring:%i' % auth_token gajim.config.set_per('accounts', account_name, 'password', token) - + if gajim.connections.has_key(account_name): + gajim.connections[account_name].password = password storage = None def get_storage(): @@ -111,6 +117,8 @@ def get_storage(): storage = GnomePasswordStorage() except gnomekeyring.NoKeyringDaemonError: storage = SimplePasswordStorage() + except gnomekeyring.DeniedError: + storage = SimplePasswordStorage() else: storage = SimplePasswordStorage() return storage diff --git a/src/common/pubsub.py b/src/common/pubsub.py index acf3345dc..1cead4d4c 100644 --- a/src/common/pubsub.py +++ b/src/common/pubsub.py @@ -92,7 +92,7 @@ class ConnectionPubSub: try: cb, args, kwargs = self.__callbacks.pop(stanza.getID()) cb(conn, stanza, *args, **kwargs) - except KeyError: + except: pass def request_pb_configuration(self, jid, node): diff --git a/src/common/socks5.py b/src/common/socks5.py index 80c9a9a67..a4529b781 100644 --- a/src/common/socks5.py +++ b/src/common/socks5.py @@ -348,9 +348,10 @@ class Socks5: def __init__(self, idlequeue, host, port, initiator, target, sid): if host is not None: try: - self.host = socket.gethostbyname(host) + self.host = host + self.ais = socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM) except socket.gaierror: - self.host = None + self.ais = None self.idlequeue = idlequeue self.fd = -1 self.port = port @@ -793,6 +794,8 @@ class Socks5Listener(IdleObject): only pollin events though ''' self.port = port + self.ais = socket.getaddrinfo(None, port, socket.AF_UNSPEC, + socket.SOCK_STREAM, socket.SOL_TCP, socket.AI_PASSIVE) self.queue_idx = -1 self.idlequeue = idlequeue self.queue = None @@ -801,14 +804,21 @@ class Socks5Listener(IdleObject): self.fd = -1 def bind(self): - self._serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self._serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - self._serv.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - self._serv.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - # will fail when port as busy, or we don't have rights to bind - try: - self._serv.bind(('0.0.0.0', self.port)) - except Exception, e: + for ai in self.ais: + #try the different possibilities (ipv6, ipv4, etc.) + self._serv = socket.socket(*ai[:3]) + self._serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self._serv.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) + self._serv.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + # will fail when port as busy, or we don't have rights to bind + try: + self._serv.bind(ai[4]) + self.ai = ai + break + except: + self.ai = None + continue + if not self.ai: # unable to bind, show error dialog return None self._serv.listen(socket.SOMAXCONN) @@ -884,9 +894,18 @@ class Socks5Receiver(Socks5, IdleObject): def connect(self): ''' create the socket and plug it to the idlequeue ''' - self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - # this will not block the GUI - self._sock.setblocking(False) + for ai in self.ais: + try: + self._sock=socket.socket(*ai[:3]) + # this will not block the GUI + self._sock.setblocking(False) + self._server=ai[4] + break + except: + if sys.exc_value[0] == errno.EINPROGRESS: + break + #for all errors, we try other addresses + continue self.fd = self._sock.fileno() self.state = 0 # about to be connected self.idlequeue.plug_idle(self, True, False) @@ -950,7 +969,7 @@ class Socks5Receiver(Socks5, IdleObject): def do_connect(self): try: - self._sock.connect((self.host, self.port)) + self._sock.connect(self._server) self._sock.setblocking(False) self._send=self._sock.send self._recv=self._sock.recv diff --git a/src/common/xmpp/commands.py b/src/common/xmpp/commands.py index 6b23cbfe3..974d0162d 100644 --- a/src/common/xmpp/commands.py +++ b/src/common/xmpp/commands.py @@ -87,7 +87,7 @@ class Commands(PlugIn): elif self._handlers[''].has_key(node): self._handlers[''][node]['execute'](conn,request) else: - conn.send(Error(requet,ERR_ITEM_NOT_FOUND)) + conn.send(Error(request,ERR_ITEM_NOT_FOUND)) raise NodeProcessed def _DiscoHandler(self,conn,request,typ): diff --git a/src/common/xmpp/dispatcher_nb.py b/src/common/xmpp/dispatcher_nb.py index 9b3cf342c..d2ae71dfc 100644 --- a/src/common/xmpp/dispatcher_nb.py +++ b/src/common/xmpp/dispatcher_nb.py @@ -23,7 +23,7 @@ Contains one tunable attribute: DefaultTimeout (25 seconds by default). It defin Dispatcher.SendAndWaitForResponce method will wait for reply stanza before giving up. ''' -import simplexml, sys +import simplexml, sys, locale from xml.parsers.expat import ExpatError from protocol import * from client import PlugIn @@ -111,6 +111,9 @@ class Dispatcher(PlugIn): self._metastream.setAttr('version', '1.0') self._metastream.setAttr('xmlns:stream', NS_STREAMS) self._metastream.setAttr('to', self._owner.Server) + if locale.getdefaultlocale()[0]: + self._metastream.setAttr('xml:lang', + locale.getdefaultlocale()[0].split('_')[0]) self._owner.send("%s>" % str(self._metastream)[:-2]) def _check_stream_start(self, ns, tag, attrs): diff --git a/src/common/xmpp/features_nb.py b/src/common/xmpp/features_nb.py index 5785a3034..786c9f6bd 100644 --- a/src/common/xmpp/features_nb.py +++ b/src/common/xmpp/features_nb.py @@ -1,6 +1,7 @@ ## features.py ## ## Copyright (C) 2003-2004 Alexey "Snake" Nezhdanov +## Copyright (C) 2007 Julien Pivotto ## ## 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 @@ -71,6 +72,7 @@ def discoverItems(disp,jid,node=None, cb=None): cb(ret) _discover(disp, NS_DISCO_ITEMS, jid, node, _on_response) +# this one is def discoverInfo(disp,jid,node=None, cb=None): """ Query remote object about info that it publishes. Returns identities and features lists.""" """ According to JEP-0030: @@ -128,16 +130,13 @@ def _ReceivedRegInfo(con, resp, agent): return df=tag.getTag('x',namespace=NS_DATA) if df: - con.Event(NS_REGISTER,REGISTER_DATA_RECEIVED,(agent,DataForm(node=df),True,'')) + con.Event(NS_REGISTER,REGISTER_DATA_RECEIVED,(agent,df,True,'')) return - df=DataForm(typ='form') + df={} for i in resp.getQueryPayload(): if not isinstance(i, Node): - pass - elif i.getName()=='instructions': - df.addInstructions(i.getData()) - else: - df.setField(i.getName()).setValue(i.getData()) + continue + df[i.getName()] = i.getData() con.Event(NS_REGISTER, REGISTER_DATA_RECEIVED, (agent,df,False,'')) def register(disp, host, info, cb): diff --git a/src/common/xmpp/protocol.py b/src/common/xmpp/protocol.py index ead233682..3c160a62c 100644 --- a/src/common/xmpp/protocol.py +++ b/src/common/xmpp/protocol.py @@ -21,8 +21,8 @@ xmpp-related data structures. from simplexml import Node,NodeBuilder,ustr import time -NS_ACTIVITY ='http://jabber.org/protocol/activity' # JEP-0108 -NS_ADDRESS ='http://jabber.org/protocol/address' # JEP-0033 +NS_ACTIVITY ='http://jabber.org/protocol/activity' # XEP-0108 +NS_ADDRESS ='http://jabber.org/protocol/address' # XEP-0033 NS_AGENTS ='jabber:iq:agents' NS_AMP ='http://jabber.org/protocol/amp' NS_AMP_ERRORS =NS_AMP+'#errors' @@ -39,58 +39,58 @@ NS_CLIENT ='jabber:client' NS_COMMANDS ='http://jabber.org/protocol/commands' NS_COMPONENT_ACCEPT='jabber:component:accept' NS_COMPONENT_1 ='http://jabberd.jabberstudio.org/ns/component/1.0' -NS_COMPRESS ='http://jabber.org/protocol/compress' # JEP-0138 +NS_COMPRESS ='http://jabber.org/protocol/compress' # XEP-0138 NS_CONFERENCE ='jabber:x:conference' -NS_DATA ='jabber:x:data' # JEP-0004 +NS_DATA ='jabber:x:data' # XEP-0004 NS_DELAY ='jabber:x:delay' NS_DIALBACK ='jabber:server:dialback' NS_DISCO ='http://jabber.org/protocol/disco' NS_DISCO_INFO =NS_DISCO+'#info' NS_DISCO_ITEMS =NS_DISCO+'#items' -NS_ENCRYPTED ='jabber:x:encrypted' # JEP-0027 -NS_EVENT ='jabber:x:event' # JEP-0022 +NS_ENCRYPTED ='jabber:x:encrypted' # XEP-0027 +NS_EVENT ='jabber:x:event' # XEP-0022 NS_FEATURE ='http://jabber.org/protocol/feature-neg' NS_FILE ='http://jabber.org/protocol/si/profile/file-transfer' # JEP-0096 NS_GAMING ='http://jabber.org/protocol/gaming' # XEP-0196 NS_GEOLOC ='http://jabber.org/protocol/geoloc' # JEP-0080 NS_GROUPCHAT ='gc-1.0' -NS_HTTP_AUTH ='http://jabber.org/protocol/http-auth' # JEP-0070 -NS_HTTP_BIND ='http://jabber.org/protocol/httpbind' # JEP-0124 +NS_HTTP_AUTH ='http://jabber.org/protocol/http-auth' # XEP-0070 +NS_HTTP_BIND ='http://jabber.org/protocol/httpbind' # XEP-0124 NS_IBB ='http://jabber.org/protocol/ibb' NS_INVISIBLE ='presence-invisible' # Jabberd2 NS_IQ ='iq' # Jabberd2 NS_LAST ='jabber:iq:last' NS_MESSAGE ='message' # Jabberd2 -NS_MOOD ='http://jabber.org/protocol/mood' # JEP-0107 +NS_MOOD ='http://jabber.org/protocol/mood' # XEP-0107 NS_MUC ='http://jabber.org/protocol/muc' NS_MUC_USER =NS_MUC+'#user' NS_MUC_ADMIN =NS_MUC+'#admin' NS_MUC_OWNER =NS_MUC+'#owner' -NS_NICK ='http://jabber.org/protocol/nick' # JEP-0172 -NS_OFFLINE ='http://www.jabber.org/jeps/jep-0030.html' # JEP-0013 -NS_PHYSLOC ='http://jabber.org/protocol/physloc' # JEP-0112 +NS_NICK ='http://jabber.org/protocol/nick' # XEP-0172 +NS_OFFLINE ='http://www.jabber.org/jeps/jep-0030.html' # XEP-0013 +NS_PHYSLOC ='http://jabber.org/protocol/physloc' # XEP-0112 NS_PRESENCE ='presence' # Jabberd2 NS_PRIVACY ='jabber:iq:privacy' NS_PRIVATE ='jabber:iq:private' -NS_PROFILE ='http://jabber.org/protocol/profile' # JEP-0154 -NS_PUBSUB ='http://jabber.org/protocol/pubsub' # JEP-0060 +NS_PROFILE ='http://jabber.org/protocol/profile' # XEP-0154 +NS_PUBSUB ='http://jabber.org/protocol/pubsub' # XEP-0060 NS_PUBSUB_OWNER ='http://jabber.org/protocol/pubsub#owner' # JEP-0060 NS_REGISTER ='jabber:iq:register' NS_ROSTER ='jabber:iq:roster' -NS_ROSTERX ='http://jabber.org/protocol/rosterx' # JEP-0144 -NS_RPC ='jabber:iq:rpc' # JEP-0009 +NS_ROSTERX ='http://jabber.org/protocol/rosterx' # XEP-0144 +NS_RPC ='jabber:iq:rpc' # XEP-0009 NS_SASL ='urn:ietf:params:xml:ns:xmpp-sasl' NS_SEARCH ='jabber:iq:search' NS_SERVER ='jabber:server' NS_SESSION ='urn:ietf:params:xml:ns:xmpp-session' -NS_SI ='http://jabber.org/protocol/si' # JEP-0096 -NS_SI_PUB ='http://jabber.org/protocol/sipub' # JEP-0137 -NS_SIGNED ='jabber:x:signed' # JEP-0027 +NS_SI ='http://jabber.org/protocol/si' # XEP-0096 +NS_SI_PUB ='http://jabber.org/protocol/sipub' # XEP-0137 +NS_SIGNED ='jabber:x:signed' # XEP-0027 NS_STANZAS ='urn:ietf:params:xml:ns:xmpp-stanzas' NS_STREAM ='http://affinix.com/jabber/stream' NS_STREAMS ='http://etherx.jabber.org/streams' -NS_TIME ='jabber:iq:time' # JEP-0900 -NS_TIME_REVISED ='http://www.xmpp.org/extensions/xep-0202.html#ns' # JEP-0202 +NS_TIME ='jabber:iq:time' # XEP-0900 +NS_TIME_REVISED ='urn:xmpp:time' # XEP-0202 NS_TLS ='urn:ietf:params:xml:ns:xmpp-tls' NS_TUNE ='http://jabber.org/protocol/tune' # XEP-0118 NS_VACATION ='http://jabber.org/protocol/vacation' @@ -101,11 +101,11 @@ NS_VCARD_UPDATE =NS_VCARD+':x:update' NS_VERSION ='jabber:iq:version' NS_VIEWING ='http://jabber.org/protocol/viewing' # XEP--197 NS_PING ='urn:xmpp:ping' # XEP-0199 -NS_WAITINGLIST ='http://jabber.org/protocol/waitinglist' # JEP-0130 -NS_XHTML_IM ='http://jabber.org/protocol/xhtml-im' # JEP-0071 +NS_WAITINGLIST ='http://jabber.org/protocol/waitinglist' # XEP-0130 +NS_XHTML_IM ='http://jabber.org/protocol/xhtml-im' # XEP-0071 NS_XHTML = 'http://www.w3.org/1999/xhtml' # " -NS_DATA_LAYOUT ='http://jabber.org/protocol/xdata-layout' # JEP-0141 -NS_DATA_VALIDATE='http://jabber.org/protocol/xdata-validate' # JEP-0122 +NS_DATA_LAYOUT ='http://jabber.org/protocol/xdata-layout' # XEP-0141 +NS_DATA_VALIDATE='http://jabber.org/protocol/xdata-validate' # XEP-0122 NS_XMPP_STREAMS ='urn:ietf:params:xml:ns:xmpp-streams' xmpp_stream_error_conditions=""" @@ -429,7 +429,7 @@ class Message(Protocol): self.setTagData('body',val) def setXHTML(self,val,xmllang=None): - """ Sets the xhtml text of the message (JEP-0071). + """ Sets the xhtml text of the message (XEP-0071). The parameter is the "inner html" to the body.""" try: if xmllang: @@ -456,6 +456,14 @@ class Message(Protocol): th=self.getThread() if th: m.setThread(th) return m + def getStatusCode(self): + """Returns the status code of the message (for groupchat config + change)""" + attrs = [] + for xtag in self.getTags('x'): + for child in xtag.getTags('status'): + attrs.append(child.getAttr('code')) + return attrs class Presence(Protocol): """ XMPP Presence object.""" @@ -516,7 +524,11 @@ class Presence(Protocol): return self._muc_getSubTagDataAttr('actor','jid')[1] def getStatusCode(self): """Returns the status code of the presence (for groupchat)""" - return self._muc_getItemAttr('status','code') + attrs = [] + for xtag in self.getTags('x'): + for child in xtag.getTags('status'): + attrs.append(child.getAttr('code')) + return attrs class Iq(Protocol): """ XMPP Iq object - get/set dialog mechanism. """ @@ -597,7 +609,7 @@ class Error(Protocol): class DataField(Node): """ This class is used in the DataForm class to describe the single data item. - If you are working with jabber:x:data (JEP-0004, JEP-0068, JEP-0122) + If you are working with jabber:x:data (XEP-0004, XEP-0068, XEP-0122) then you will need to work with instances of this class. """ def __init__(self,name=None,value=None,typ=None,required=0,desc=None,options=[],node=None): """ Create new data field of specified name,value and type. @@ -674,7 +686,7 @@ class DataField(Node): class DataForm(Node): """ DataForm class. Used for manipulating dataforms in XMPP. - Relevant JEPs: 0004, 0068, 0122. + Relevant XEPs: 0004, 0068, 0122. Can be used in disco, pub-sub and many other applications.""" def __init__(self, typ=None, data=[], title=None, node=None): """ diff --git a/src/common/xmpp/transports_nb.py b/src/common/xmpp/transports_nb.py index c2dfd1924..c5115cc1c 100644 --- a/src/common/xmpp/transports_nb.py +++ b/src/common/xmpp/transports_nb.py @@ -33,6 +33,8 @@ import thread import logging log = logging.getLogger('gajim.c.x.transports_nb') +from common import gajim + USE_PYOPENSSL = False try: @@ -296,7 +298,7 @@ class NonBlockingTcp(PlugIn, IdleObject): self.renew_send_timeout() def connect(self,server=None, proxy = None, secure = None): - ''' Try to establish connection. Returns non-empty string on success. ''' + ''' Try to establish connection. Returns True/False on success/failure. ''' if not server: server=self._server else: @@ -416,6 +418,12 @@ class NonBlockingTcp(PlugIn, IdleObject): self.idlequeue.remove_timeout(self.fd) def onreceive(self, recv_handler): + ''' Sets the on_receive callback. Do not confuse it with + on_receive() method, which is the callback itself. + + If recv_handler==None, it tries to set that callback assuming that + our owner also has a Dispatcher object plugged in, to its + ProcessNonBlocking method.''' if not recv_handler: if hasattr(self._owner, 'Dispatcher'): self.on_receive = self._owner.Dispatcher.ProcessNonBlocking @@ -735,7 +743,12 @@ class NonBlockingTLS(PlugIn): # FIXME: should method be configurable? tcpsock._sslContext = OpenSSL.SSL.Context(OpenSSL.SSL.TLSv1_METHOD) #tcpsock._sslContext = OpenSSL.SSL.Context(OpenSSL.SSL.SSLv23_METHOD) - tcpsock._sslContext.set_info_callback(self._ssl_info_callback) + tcpsock.ssl_errnum = 0 + tcpsock._sslContext.set_verify(OpenSSL.SSL.VERIFY_PEER, self._ssl_verify_callback) + try: + tcpsock._sslContext.load_verify_locations(os.path.join(gajim.DATA_DIR, 'other', 'cacerts.pem')) + except: + log.warning(_("Unable to load SSL certificats from file %s" % os.path.abspath(os.path.join(gajim.DATA_DIR,'other','ca.crt')))) tcpsock._sslObj = OpenSSL.SSL.Connection(tcpsock._sslContext, tcpsock._sock) tcpsock._sslObj.set_connect_state() # set to client mode @@ -759,29 +772,6 @@ class NonBlockingTLS(PlugIn): # fake it, for now self.starttls='success' - def _on_ssl_handshake_done(self): - log.debug("Handshake done!") - #self.starttls='success' - - tcpsock = self._owner.Connection - cert = tcpsock._sslObj.get_peer_certificate() - peer = cert.get_subject() - issuer = cert.get_issuer() - tcpsock._sslIssuer = unicode(issuer) - tcpsock._sslServer = unicode(peer) - tcpsock.serverDigestSHA1 = cert.digest('sha1') - tcpsock.serverDigestMD5 = cert.digest('md5') - - if log.getEffectiveLevel() <= logging.DEBUG: - peercert = tcpsock._sslObj.get_peer_certificate() - ciphers = tcpsock._sslObj.get_cipher_list() - - print >> sys.stderr, "Ciphers:", ciphers - print >> sys.stderr, "Peer cert:", peercert - self._dumpX509(peercert) - - print >> sys.stderr, OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, peercert) - def _startSSL_stdlib(self): log.debug("_startSSL_stdlib called") tcpsock=self._owner.Connection @@ -795,37 +785,17 @@ class NonBlockingTLS(PlugIn): tcpsock._send = wrapper.send self.starttls='success' - def _ssl_info_callback(self, sslconn, type, st): + def _ssl_verify_callback(self, sslconn, cert, errnum, depth, ok): # Exceptions can't propagate up through this callback, so print them here. try: - self._ssl_info_callback_guarded(sslconn, type, st) + if errnum == 0: + return True + self._owner.Connection.ssl_errnum = errnum + return True except: log.error("Exception caught in _ssl_info_callback:", exc_info=True) traceback.print_exc() # Make sure something is printed, even if log is disabled. - def _ssl_info_callback_guarded(self, sslconn, type, st): - b = self.ssl_h_bits - - #if type & b['SSL_CB_LOOP']: - # if type & SSL_ST_CONNECT: tls_state = "connect" - # elif type & SSL_ST_ACCEPT: tls_state = "accept" - # else: tls_state = "undefined" - # print "tls_state: %s: %s" % (tls_state, sslconn.state_string()) - - #if type & b['SSL_CB_ALERT']: - # if type & SSL_CB_READ: rdwr = "read" - # elif type & SSL_CB_WRITE: rdwr = "write" - # else: rdwr = "unknown" - # print "tls_alert: %s:%d: %s" % (rdwr, st, sslconn.state_string()) - - #mask = "" - #for k, v in b.iteritems(): - # if type & v: mask += " " + k - #print "mask:", mask, st - - if type & b['SSL_CB_HANDSHAKE_DONE']: - self._on_ssl_handshake_done() - def StartTLSHandler(self, conn, starttls): ''' Handle server reply if TLS is allowed to process. Behaves accordingly. Used internally.''' diff --git a/src/common/zeroconf/client_zeroconf.py b/src/common/zeroconf/client_zeroconf.py index e9d9f452d..c3de88a38 100644 --- a/src/common/zeroconf/client_zeroconf.py +++ b/src/common/zeroconf/client_zeroconf.py @@ -121,6 +121,7 @@ class P2PClient(IdleObject): self.sock_type = TYPE_SERVER else: self.sock_type = TYPE_CLIENT + self.fd = -1 conn = P2PConnection('', _sock, host, port, self._caller, self.on_connect, self) self.sock_hash = conn._sock.__hash__ self.fd = conn.fd @@ -129,10 +130,14 @@ class P2PClient(IdleObject): for val in self.stanzaqueue: stanza, is_message = val if is_message: - if self.conn_holder.number_of_awaiting_messages.has_key(self.fd): - self.conn_holder.number_of_awaiting_messages[self.fd]+=1 + if self.fd == -1: + self._caller.dispatch('MSGERROR',[unicode(self.to), -1, \ + _('Connection to host could not be established'), None, None]) else: - self.conn_holder.number_of_awaiting_messages[self.fd]=1 + if self.conn_holder.number_of_awaiting_messages.has_key(self.fd): + self.conn_holder.number_of_awaiting_messages[self.fd]+=1 + else: + self.conn_holder.number_of_awaiting_messages[self.fd]=1 def add_stanza(self, stanza, is_message = False): if self.Connection: @@ -207,11 +212,11 @@ class P2PClient(IdleObject): def on_disconnect(self): if self.conn_holder: - if self.conn_holder.number_of_awaiting_messages.has_key(self.fd): - if self.conn_holder.number_of_awaiting_messages[self.fd] > 0: + if self.conn_holder.number_of_awaiting_messages.has_key(self.conn_holder.fd): + if self.conn_holder.number_of_awaiting_messages[self.conn_holder.fd] > 0: self._caller.dispatch('MSGERROR',[unicode(self.to), -1, \ _('Connection to host could not be established'), None, None]) - del self.conn_holder.number_of_awaiting_messages[self.fd] + del self.conn_holder.number_of_awaiting_messages[self.conn_holder.fd] self.conn_holder.remove_connection(self.sock_hash) if self.__dict__.has_key('Dispatcher'): self.Dispatcher.PlugOut() @@ -518,13 +523,6 @@ class ClientZeroconf: self.listener = None self.number_of_awaiting_messages = {} - def test_avahi(self): - try: - import avahi - except ImportError: - return False - return True - def connect(self, show, msg): self.port = self.start_listener(self.caller.port) if not self.port: diff --git a/src/common/zeroconf/connection_handlers_zeroconf.py b/src/common/zeroconf/connection_handlers_zeroconf.py index 2d36d4661..eaa2f6a17 100644 --- a/src/common/zeroconf/connection_handlers_zeroconf.py +++ b/src/common/zeroconf/connection_handlers_zeroconf.py @@ -640,7 +640,7 @@ class ConnectionHandlersZeroconf(ConnectionVcard, ConnectionBytestream): mtype = msg.getType() subject = msg.getSubject() # if not there, it's None tim = msg.getTimestamp() - tim = time.strptime(tim, '%Y%m%dT%H:%M:%S') + tim = helpers.datetime_tuple(tim) tim = time.localtime(timegm(tim)) frm = msg.getFrom() if frm == None: @@ -663,23 +663,23 @@ class ConnectionHandlersZeroconf(ConnectionVcard, ConnectionBytestream): invite = None delayed = msg.getTag('x', namespace = common.xmpp.NS_DELAY) != None msg_id = None - composing_jep = None + composing_xep = None xtags = msg.getTags('x') # chatstates - look for chatstate tags in a message if not delayed if not delayed: - composing_jep = False + composing_xep = False children = msg.getChildren() for child in children: if child.getNamespace() == 'http://jabber.org/protocol/chatstates': chatstate = child.getName() - composing_jep = 'JEP-0085' + composing_xep = 'XEP-0085' break # No JEP-0085 support, fallback to JEP-0022 if not chatstate: chatstate_child = msg.getTag('x', namespace = common.xmpp.NS_EVENT) if chatstate_child: chatstate = 'active' - composing_jep = 'JEP-0022' + composing_xep = 'XEP-0022' if not msgtxt and chatstate_child.getTag('composing'): chatstate = 'composing' # JEP-0172 User Nickname @@ -715,14 +715,14 @@ class ConnectionHandlersZeroconf(ConnectionVcard, ConnectionBytestream): msg_id = gajim.logger.write('chat_msg_recv', frm, msgtxt, tim = tim, subject = subject) self.dispatch('MSG', (frm, msgtxt, tim, encrypted, mtype, subject, - chatstate, msg_id, composing_jep, user_nick, msghtml)) + chatstate, msg_id, composing_xep, user_nick, msghtml)) elif mtype == 'normal': # it's single message if self.name not in no_log_for and jid not in no_log_for and msgtxt: gajim.logger.write('single_msg_recv', frm, msgtxt, tim = tim, subject = subject) if invite: self.dispatch('MSG', (frm, msgtxt, tim, encrypted, 'normal', - subject, chatstate, msg_id, composing_jep, user_nick)) + subject, chatstate, msg_id, composing_xep, user_nick)) # END messageCB def parse_data_form(self, node): diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index 29d40226c..b218eab41 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -41,6 +41,7 @@ import gobject from common import gajim from common import GnuPG from common.zeroconf import client_zeroconf +from common.zeroconf import zeroconf from connection_handlers_zeroconf import * USE_GPG = GnuPG.USE_GPG @@ -103,12 +104,11 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): 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) - #XXX make sure host is US-ASCII - self.host = unicode(socket.gethostname()) - gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'hostname', self.host) gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'custom_port', 5298) gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'is_zeroconf', True) - self.host = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'hostname') + #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') @@ -229,7 +229,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): self.get_config_values_or_default() if not self.connection: self.connection = client_zeroconf.ClientZeroconf(self) - if not self.connection.test_avahi(): + if not zeroconf.test_zeroconf(): self.dispatch('STATUS', 'offline') self.status = 'offline' self.dispatch('CONNECTION_LOST', @@ -348,7 +348,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): return STATUS_LIST[self.connected] def send_message(self, jid, msg, keyID, type = 'chat', subject='', - chatstate = None, msg_id = None, composing_jep = None, resource = None, + chatstate = None, msg_id = None, composing_xep = None, resource = None, user_nick = None): fjid = jid @@ -396,10 +396,10 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): # please note that the only valid tag inside a message containing a # tag is the active event if chatstate is not None: - if composing_jep == 'JEP-0085' or not composing_jep: + if composing_xep == 'XEP-0085' or not composing_xep: # JEP-0085 msg_iq.setTag(chatstate, namespace = common.xmpp.NS_CHATSTATES) - if composing_jep == 'JEP-0022' or not composing_jep: + 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 diff --git a/src/common/zeroconf/zeroconf.py b/src/common/zeroconf/zeroconf.py old mode 100755 new mode 100644 index 6a65e622d..e34599da2 --- a/src/common/zeroconf/zeroconf.py +++ b/src/common/zeroconf/zeroconf.py @@ -12,404 +12,29 @@ ## GNU General Public License for more details. ## -from common import gajim - -try: - import dbus.glib -except ImportError, e: - pass - - C_NAME, C_DOMAIN, C_INTERFACE, C_PROTOCOL, C_HOST, \ C_ADDRESS, C_PORT, C_BARE_NAME, C_TXT = range(9) -class Zeroconf: - def __init__(self, new_serviceCB, remove_serviceCB, name_conflictCB, - disconnected_CB, error_CB, name, host, port): - self.avahi = None - self.domain = None # specific domain to browse - self.stype = '_presence._tcp' - self.port = port # listening port that gets announced - self.username = name - self.host = host - self.txt = {} # service data - - #XXX these CBs should be set to None when we destroy the object - # (go offline), because they create a circular reference - self.new_serviceCB = new_serviceCB - self.remove_serviceCB = remove_serviceCB - self.name_conflictCB = name_conflictCB - self.disconnected_CB = disconnected_CB - self.error_CB = error_CB - - self.service_browser = None - self.domain_browser = None - self.bus = None - self.server = None - self.contacts = {} # all current local contacts with data - self.entrygroup = None - self.connected = False - self.announced = False - self.invalid_self_contact = {} +def test_avahi(): + try: + import avahi + except ImportError: + return False + return True +def test_bonjour(): + try: + import pybonjour + except ImportError: + return False + return True - ## handlers for dbus callbacks - def entrygroup_commit_error_CB(self, err): - # left blank for possible later usage - pass - - def error_callback1(self, err): - gajim.log.debug('Error while resolving: ' + str(err)) - - def error_callback(self, err): - gajim.log.debug(str(err)) - # timeouts are non-critical - if str(err) != 'Timeout reached': - self.disconnect() - self.disconnected_CB() +def test_zeroconf(): + return test_avahi() or test_bonjour() - def new_service_callback(self, interface, protocol, name, stype, domain, flags): - gajim.log.debug('Found service %s in domain %s on %i.%i.' % (name, domain, interface, protocol)) - if not self.connected: - return - - # synchronous resolving - self.server.ResolveService( int(interface), int(protocol), name, stype, \ - domain, self.avahi.PROTO_UNSPEC, dbus.UInt32(0), \ - reply_handler=self.service_resolved_callback, error_handler=self.error_callback1) - - def remove_service_callback(self, interface, protocol, name, stype, domain, flags): - gajim.log.debug('Service %s in domain %s on %i.%i disappeared.' % (name, domain, interface, protocol)) - if not self.connected: - return - if name != self.name: - for key in self.contacts.keys(): - if self.contacts[key][C_BARE_NAME] == name: - del self.contacts[key] - self.remove_serviceCB(key) - return - - def new_service_type(self, interface, protocol, stype, domain, flags): - # Are we already browsing this domain for this type? - if self.service_browser: - return - - object_path = self.server.ServiceBrowserNew(interface, protocol, \ - stype, domain, dbus.UInt32(0)) - - self.service_browser = dbus.Interface(self.bus.get_object(self.avahi.DBUS_NAME, \ - object_path) , self.avahi.DBUS_INTERFACE_SERVICE_BROWSER) - self.service_browser.connect_to_signal('ItemNew', self.new_service_callback) - self.service_browser.connect_to_signal('ItemRemove', self.remove_service_callback) - self.service_browser.connect_to_signal('Failure', self.error_callback) - - def new_domain_callback(self,interface, protocol, domain, flags): - if domain != "local": - self.browse_domain(interface, protocol, domain) - - def txt_array_to_dict(self, txt_array): - txt_dict = {} - for els in txt_array: - key, val = '', None - for c in els: - #FIXME: remove when outdated, this is for avahi < 0.6.14 - if c < 0 or c > 255: - c = '.' - else: - c = chr(c) - if val is None: - if c == '=': - val = '' - else: - key += c - else: - val += c - if val is None: # missing '=' - val = '' - txt_dict[key] = val.decode('utf-8') - return txt_dict - - def service_resolved_callback(self, interface, protocol, name, stype, domain, host, aprotocol, address, port, txt, flags): - gajim.log.debug('Service data for service %s in domain %s on %i.%i:' - % (name, domain, interface, protocol)) - gajim.log.debug('Host %s (%s), port %i, TXT data: %s' % (host, address, port, - self.txt_array_to_dict(txt))) - if not self.connected: - return - bare_name = name - if name.find('@') == -1: - name = name + '@' + name - - # we don't want to see ourselves in the list - if name != self.name: - self.contacts[name] = (name, domain, interface, protocol, host, address, port, - bare_name, txt) - self.new_serviceCB(name) - else: - # remember data - # In case this is not our own record but of another - # gajim instance on the same machine, - # it will be used when we get a new name. - self.invalid_self_contact[name] = (name, domain, interface, protocol, host, address, port, bare_name, txt) - - - # different handler when resolving all contacts - def service_resolved_all_callback(self, interface, protocol, name, stype, domain, host, aprotocol, address, port, txt, flags): - if not self.connected: - return - bare_name = name - if name.find('@') == -1: - name = name + '@' + name - self.contacts[name] = (name, domain, interface, protocol, host, address, port, bare_name, txt) - - def service_added_callback(self): - gajim.log.debug('Service successfully added') - - def service_committed_callback(self): - gajim.log.debug('Service successfully committed') - - def service_updated_callback(self): - gajim.log.debug('Service successfully updated') - - def service_add_fail_callback(self, err): - gajim.log.debug('Error while adding service. %s' % str(err)) - if str(err) == 'Local name collision': - alternative_name = self.server.GetAlternativeServiceName(self.username) - self.name_conflictCB(alternative_name) - return - self.error_CB(_('Error while adding service. %s') % str(err)) - self.disconnect() - - def server_state_changed_callback(self, state, error): - if state == self.avahi.SERVER_RUNNING: - self.create_service() - elif state == self.avahi.SERVER_COLLISION: - self.entrygroup.Reset() - elif state == self.avahi.CLIENT_FAILURE: - # does it ever go here? - gajim.log.debug('CLIENT FAILURE') - - def entrygroup_state_changed_callback(self, state, error): - # the name is already present, so recreate - if state == self.avahi.ENTRY_GROUP_COLLISION: - self.service_add_fail_callback('Local name collision') - elif state == self.avahi.ENTRY_GROUP_FAILURE: - gajim.log.debug('zeroconf.py: ENTRY_GROUP_FAILURE reached(that' - ' should not happen)') - - # make zeroconf-valid names - def replace_show(self, show): - if show in ['chat', 'online', '']: - return 'avail' - elif show == 'xa': - return 'away' - return show - - def avahi_txt(self): - utf8_dict = {} - for key in self.txt: - val = self.txt[key] - if isinstance(val, unicode): - utf8_dict[key] = val.encode('utf-8') - else: - utf8_dict[key] = val - return self.avahi.dict_to_txt_array(utf8_dict) - - def create_service(self): - try: - if not self.entrygroup: - # create an EntryGroup for publishing - self.entrygroup = dbus.Interface(self.bus.get_object(self.avahi.DBUS_NAME, self.server.EntryGroupNew()), self.avahi.DBUS_INTERFACE_ENTRY_GROUP) - self.entrygroup.connect_to_signal('StateChanged', self.entrygroup_state_changed_callback) - - txt = {} - - #remove empty keys - for key,val in self.txt.iteritems(): - if val: - txt[key] = val - - txt['port.p2pj'] = self.port - txt['version'] = 1 - txt['txtvers'] = 1 - - # replace gajim's show messages with compatible ones - if self.txt.has_key('status'): - txt['status'] = self.replace_show(self.txt['status']) - else: - txt['status'] = 'avail' - - self.txt = txt - gajim.log.debug('Publishing service %s of type %s' % (self.name, self.stype)) - self.entrygroup.AddService(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, dbus.UInt32(0), self.name, self.stype, '', '', self.port, self.avahi_txt(), reply_handler=self.service_added_callback, error_handler=self.service_add_fail_callback) - - self.entrygroup.Commit(reply_handler=self.service_committed_callback, - error_handler=self.entrygroup_commit_error_CB) - - return True - - except dbus.DBusException, e: - gajim.log.debug(str(e)) - return False - - def announce(self): - if not self.connected: - return False - - state = self.server.GetState() - if state == self.avahi.SERVER_RUNNING: - self.create_service() - self.announced = True - return True - - def remove_announce(self): - if self.announced == False: - return False - try: - if self.entrygroup.GetState() != self.avahi.ENTRY_GROUP_FAILURE: - self.entrygroup.Reset() - self.entrygroup.Free() - # .Free() has mem leaks - obj = self.entrygroup._obj - obj._bus = None - self.entrygroup._obj = None - self.entrygroup = None - self.announced = False - - return True - else: - return False - except dbus.DBusException, e: - gajim.log.debug("Can't remove service. That should not happen") - - def browse_domain(self, interface, protocol, domain): - self.new_service_type(interface, protocol, self.stype, domain, '') - - def avahi_dbus_connect_cb(self, a, connect, disconnect): - if connect != "": - gajim.log.debug('Lost connection to avahi-daemon') - self.disconnect() - if self.disconnected_CB: - self.disconnected_CB() - else: - gajim.log.debug('We are connected to avahi-daemon') - - # connect to dbus - def connect_dbus(self): - try: - import dbus - except ImportError: - gajim.log.debug('Error: python-dbus needs to be installed. No zeroconf support.') - return False - if self.bus: - return True - try: - self.bus = dbus.SystemBus() - self.bus.add_signal_receiver(self.avahi_dbus_connect_cb, - "NameOwnerChanged", "org.freedesktop.DBus", - arg0="org.freedesktop.Avahi") - except Exception, e: - # System bus is not present - self.bus = None - gajim.log.debug(str(e)) - return False - else: - return True - - # connect to avahi - def connect_avahi(self): - if not self.connect_dbus(): - return False - try: - import avahi - self.avahi = avahi - except ImportError: - gajim.log.debug('Error: python-avahi needs to be installed. No zeroconf support.') - return False - - if self.server: - return True - try: - self.server = dbus.Interface(self.bus.get_object(self.avahi.DBUS_NAME, \ - self.avahi.DBUS_PATH_SERVER), self.avahi.DBUS_INTERFACE_SERVER) - self.server.connect_to_signal('StateChanged', - self.server_state_changed_callback) - except Exception, e: - # Avahi service is not present - self.server = None - gajim.log.debug(str(e)) - return False - else: - return True - - def connect(self): - self.name = self.username + '@' + self.host # service name - if not self.connect_avahi(): - return False - - self.connected = True - # start browsing - if self.domain is None: - # Explicitly browse .local - self.browse_domain(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, "local") - - # Browse for other browsable domains - self.domain_browser = dbus.Interface(self.bus.get_object(self.avahi.DBUS_NAME, \ - self.server.DomainBrowserNew(self.avahi.IF_UNSPEC, \ - self.avahi.PROTO_UNSPEC, '', self.avahi.DOMAIN_BROWSER_BROWSE,\ - dbus.UInt32(0))), self.avahi.DBUS_INTERFACE_DOMAIN_BROWSER) - self.domain_browser.connect_to_signal('ItemNew', self.new_domain_callback) - self.domain_browser.connect_to_signal('Failure', self.error_callback) - else: - self.browse_domain(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, self.domain) - - return True - - def disconnect(self): - if self.connected: - self.connected = False - if self.service_browser: - self.service_browser.Free() - self.service_browser._obj._bus = None - self.service_browser._obj = None - if self.domain_browser: - self.domain_browser.Free() - self.domain_browser._obj._bus = None - self.domain_browser._obj = None - self.remove_announce() - self.server._obj._bus = None - self.server._obj = None - self.server = None - self.service_browser = None - self.domain_browser = None - - # refresh txt data of all contacts manually (no callback available) - def resolve_all(self): - if not self.connected: - return - for val in self.contacts.values(): - self.server.ResolveService(int(val[C_INTERFACE]), int(val[C_PROTOCOL]), val[C_BARE_NAME], \ - self.stype, val[C_DOMAIN], self.avahi.PROTO_UNSPEC, dbus.UInt32(0),\ - reply_handler=self.service_resolved_all_callback, error_handler=self.error_callback) - - def get_contacts(self): - return self.contacts - - def get_contact(self, jid): - if not jid in self.contacts: - return None - return self.contacts[jid] - - def update_txt(self, show = None): - if show: - self.txt['status'] = self.replace_show(show) - - txt = self.avahi_txt() - if self.connected and self.entrygroup: - self.entrygroup.UpdateServiceTxt(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, dbus.UInt32(0), self.name, self.stype,'', txt, reply_handler=self.service_updated_callback, error_handler=self.error_callback) - return True - else: - return False - - -# END Zeroconf +if test_avahi(): + from common.zeroconf import zeroconf_avahi + Zeroconf = zeroconf_avahi.Zeroconf +elif test_bonjour(): + from common.zeroconf import zeroconf_bonjour + Zeroconf = zeroconf_bonjour.Zeroconf diff --git a/src/common/zeroconf/zeroconf_avahi.py b/src/common/zeroconf/zeroconf_avahi.py new file mode 100644 index 000000000..6ad768826 --- /dev/null +++ b/src/common/zeroconf/zeroconf_avahi.py @@ -0,0 +1,415 @@ +## common/zeroconf/zeroconf.py +## +## Copyright (C) 2006 Stefan Bethge +## +## 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. +## + +from common import gajim + +try: + import dbus.glib +except ImportError, e: + pass + +from common.zeroconf.zeroconf import C_BARE_NAME, C_INTERFACE, C_PROTOCOL, C_DOMAIN + +class Zeroconf: + def __init__(self, new_serviceCB, remove_serviceCB, name_conflictCB, + disconnected_CB, error_CB, name, host, port): + self.avahi = None + self.domain = None # specific domain to browse + self.stype = '_presence._tcp' + self.port = port # listening port that gets announced + self.username = name + self.host = host + self.txt = {} # service data + + #XXX these CBs should be set to None when we destroy the object + # (go offline), because they create a circular reference + self.new_serviceCB = new_serviceCB + self.remove_serviceCB = remove_serviceCB + self.name_conflictCB = name_conflictCB + self.disconnected_CB = disconnected_CB + self.error_CB = error_CB + + self.service_browser = None + self.domain_browser = None + self.bus = None + self.server = None + self.contacts = {} # all current local contacts with data + self.entrygroup = None + self.connected = False + self.announced = False + self.invalid_self_contact = {} + + + ## handlers for dbus callbacks + def entrygroup_commit_error_CB(self, err): + # left blank for possible later usage + pass + + def error_callback1(self, err): + gajim.log.debug('Error while resolving: ' + str(err)) + + def error_callback(self, err): + gajim.log.debug(str(err)) + # timeouts are non-critical + if str(err) != 'Timeout reached': + self.disconnect() + self.disconnected_CB() + + def new_service_callback(self, interface, protocol, name, stype, domain, flags): + gajim.log.debug('Found service %s in domain %s on %i.%i.' % (name, domain, interface, protocol)) + if not self.connected: + return + + # synchronous resolving + self.server.ResolveService( int(interface), int(protocol), name, stype, \ + domain, self.avahi.PROTO_UNSPEC, dbus.UInt32(0), \ + reply_handler=self.service_resolved_callback, error_handler=self.error_callback1) + + def remove_service_callback(self, interface, protocol, name, stype, domain, flags): + gajim.log.debug('Service %s in domain %s on %i.%i disappeared.' % (name, domain, interface, protocol)) + if not self.connected: + return + if name != self.name: + for key in self.contacts.keys(): + if self.contacts[key][C_BARE_NAME] == name: + del self.contacts[key] + self.remove_serviceCB(key) + return + + def new_service_type(self, interface, protocol, stype, domain, flags): + # Are we already browsing this domain for this type? + if self.service_browser: + return + + object_path = self.server.ServiceBrowserNew(interface, protocol, \ + stype, domain, dbus.UInt32(0)) + + self.service_browser = dbus.Interface(self.bus.get_object(self.avahi.DBUS_NAME, \ + object_path) , self.avahi.DBUS_INTERFACE_SERVICE_BROWSER) + self.service_browser.connect_to_signal('ItemNew', self.new_service_callback) + self.service_browser.connect_to_signal('ItemRemove', self.remove_service_callback) + self.service_browser.connect_to_signal('Failure', self.error_callback) + + def new_domain_callback(self,interface, protocol, domain, flags): + if domain != "local": + self.browse_domain(interface, protocol, domain) + + def txt_array_to_dict(self, txt_array): + txt_dict = {} + for els in txt_array: + key, val = '', None + for c in els: + #FIXME: remove when outdated, this is for avahi < 0.6.14 + if c < 0 or c > 255: + c = '.' + else: + c = chr(c) + if val is None: + if c == '=': + val = '' + else: + key += c + else: + val += c + if val is None: # missing '=' + val = '' + txt_dict[key] = val.decode('utf-8') + return txt_dict + + def service_resolved_callback(self, interface, protocol, name, stype, domain, host, aprotocol, address, port, txt, flags): + gajim.log.debug('Service data for service %s in domain %s on %i.%i:' + % (name, domain, interface, protocol)) + gajim.log.debug('Host %s (%s), port %i, TXT data: %s' % (host, address, port, + self.txt_array_to_dict(txt))) + if not self.connected: + return + bare_name = name + if name.find('@') == -1: + name = name + '@' + name + + # we don't want to see ourselves in the list + if name != self.name: + self.contacts[name] = (name, domain, interface, protocol, host, address, port, + bare_name, txt) + self.new_serviceCB(name) + else: + # remember data + # In case this is not our own record but of another + # gajim instance on the same machine, + # it will be used when we get a new name. + self.invalid_self_contact[name] = (name, domain, interface, protocol, host, address, port, bare_name, txt) + + + # different handler when resolving all contacts + def service_resolved_all_callback(self, interface, protocol, name, stype, domain, host, aprotocol, address, port, txt, flags): + if not self.connected: + return + bare_name = name + if name.find('@') == -1: + name = name + '@' + name + self.contacts[name] = (name, domain, interface, protocol, host, address, port, bare_name, txt) + + def service_added_callback(self): + gajim.log.debug('Service successfully added') + + def service_committed_callback(self): + gajim.log.debug('Service successfully committed') + + def service_updated_callback(self): + gajim.log.debug('Service successfully updated') + + def service_add_fail_callback(self, err): + gajim.log.debug('Error while adding service. %s' % str(err)) + if str(err) == 'Local name collision': + alternative_name = self.server.GetAlternativeServiceName(self.username) + self.name_conflictCB(alternative_name) + return + self.error_CB(_('Error while adding service. %s') % str(err)) + self.disconnect() + + def server_state_changed_callback(self, state, error): + if state == self.avahi.SERVER_RUNNING: + self.create_service() + elif state == self.avahi.SERVER_COLLISION: + self.entrygroup.Reset() + elif state == self.avahi.CLIENT_FAILURE: + # does it ever go here? + gajim.log.debug('CLIENT FAILURE') + + def entrygroup_state_changed_callback(self, state, error): + # the name is already present, so recreate + if state == self.avahi.ENTRY_GROUP_COLLISION: + self.service_add_fail_callback('Local name collision') + elif state == self.avahi.ENTRY_GROUP_FAILURE: + gajim.log.debug('zeroconf.py: ENTRY_GROUP_FAILURE reached(that' + ' should not happen)') + + # make zeroconf-valid names + def replace_show(self, show): + if show in ['chat', 'online', '']: + return 'avail' + elif show == 'xa': + return 'away' + return show + + def avahi_txt(self): + utf8_dict = {} + for key in self.txt: + val = self.txt[key] + if isinstance(val, unicode): + utf8_dict[key] = val.encode('utf-8') + else: + utf8_dict[key] = val + return self.avahi.dict_to_txt_array(utf8_dict) + + def create_service(self): + try: + if not self.entrygroup: + # create an EntryGroup for publishing + self.entrygroup = dbus.Interface(self.bus.get_object(self.avahi.DBUS_NAME, self.server.EntryGroupNew()), self.avahi.DBUS_INTERFACE_ENTRY_GROUP) + self.entrygroup.connect_to_signal('StateChanged', self.entrygroup_state_changed_callback) + + txt = {} + + #remove empty keys + for key,val in self.txt.iteritems(): + if val: + txt[key] = val + + txt['port.p2pj'] = self.port + txt['version'] = 1 + txt['txtvers'] = 1 + + # replace gajim's show messages with compatible ones + if self.txt.has_key('status'): + txt['status'] = self.replace_show(self.txt['status']) + else: + txt['status'] = 'avail' + + self.txt = txt + gajim.log.debug('Publishing service %s of type %s' % (self.name, self.stype)) + self.entrygroup.AddService(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, dbus.UInt32(0), self.name, self.stype, '', '', self.port, self.avahi_txt(), reply_handler=self.service_added_callback, error_handler=self.service_add_fail_callback) + + self.entrygroup.Commit(reply_handler=self.service_committed_callback, + error_handler=self.entrygroup_commit_error_CB) + + return True + + except dbus.DBusException, e: + gajim.log.debug(str(e)) + return False + + def announce(self): + if not self.connected: + return False + + state = self.server.GetState() + if state == self.avahi.SERVER_RUNNING: + self.create_service() + self.announced = True + return True + + def remove_announce(self): + if self.announced == False: + return False + try: + if self.entrygroup.GetState() != self.avahi.ENTRY_GROUP_FAILURE: + self.entrygroup.Reset() + self.entrygroup.Free() + # .Free() has mem leaks + obj = self.entrygroup._obj + obj._bus = None + self.entrygroup._obj = None + self.entrygroup = None + self.announced = False + + return True + else: + return False + except dbus.DBusException, e: + gajim.log.debug("Can't remove service. That should not happen") + + def browse_domain(self, interface, protocol, domain): + self.new_service_type(interface, protocol, self.stype, domain, '') + + def avahi_dbus_connect_cb(self, a, connect, disconnect): + if connect != "": + gajim.log.debug('Lost connection to avahi-daemon') + self.disconnect() + if self.disconnected_CB: + self.disconnected_CB() + else: + gajim.log.debug('We are connected to avahi-daemon') + + # connect to dbus + def connect_dbus(self): + try: + import dbus + except ImportError: + gajim.log.debug('Error: python-dbus needs to be installed. No zeroconf support.') + return False + if self.bus: + return True + try: + self.bus = dbus.SystemBus() + self.bus.add_signal_receiver(self.avahi_dbus_connect_cb, + "NameOwnerChanged", "org.freedesktop.DBus", + arg0="org.freedesktop.Avahi") + except Exception, e: + # System bus is not present + self.bus = None + gajim.log.debug(str(e)) + return False + else: + return True + + # connect to avahi + def connect_avahi(self): + if not self.connect_dbus(): + return False + try: + import avahi + self.avahi = avahi + except ImportError: + gajim.log.debug('Error: python-avahi needs to be installed. No zeroconf support.') + return False + + if self.server: + return True + try: + self.server = dbus.Interface(self.bus.get_object(self.avahi.DBUS_NAME, \ + self.avahi.DBUS_PATH_SERVER), self.avahi.DBUS_INTERFACE_SERVER) + self.server.connect_to_signal('StateChanged', + self.server_state_changed_callback) + except Exception, e: + # Avahi service is not present + self.server = None + gajim.log.debug(str(e)) + return False + else: + return True + + def connect(self): + self.name = self.username + '@' + self.host # service name + if not self.connect_avahi(): + return False + + self.connected = True + # start browsing + if self.domain is None: + # Explicitly browse .local + self.browse_domain(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, "local") + + # Browse for other browsable domains + self.domain_browser = dbus.Interface(self.bus.get_object(self.avahi.DBUS_NAME, \ + self.server.DomainBrowserNew(self.avahi.IF_UNSPEC, \ + self.avahi.PROTO_UNSPEC, '', self.avahi.DOMAIN_BROWSER_BROWSE,\ + dbus.UInt32(0))), self.avahi.DBUS_INTERFACE_DOMAIN_BROWSER) + self.domain_browser.connect_to_signal('ItemNew', self.new_domain_callback) + self.domain_browser.connect_to_signal('Failure', self.error_callback) + else: + self.browse_domain(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, self.domain) + + return True + + def disconnect(self): + if self.connected: + self.connected = False + if self.service_browser: + self.service_browser.Free() + self.service_browser._obj._bus = None + self.service_browser._obj = None + if self.domain_browser: + self.domain_browser.Free() + self.domain_browser._obj._bus = None + self.domain_browser._obj = None + self.remove_announce() + self.server._obj._bus = None + self.server._obj = None + self.server = None + self.service_browser = None + self.domain_browser = None + + # refresh txt data of all contacts manually (no callback available) + def resolve_all(self): + if not self.connected: + return + for val in self.contacts.values(): + self.server.ResolveService(int(val[C_INTERFACE]), int(val[C_PROTOCOL]), + val[C_BARE_NAME], self.stype, val[C_DOMAIN], + self.avahi.PROTO_UNSPEC, dbus.UInt32(0), + reply_handler=self.service_resolved_all_callback, + error_handler=self.error_callback) + + def get_contacts(self): + return self.contacts + + def get_contact(self, jid): + if not jid in self.contacts: + return None + return self.contacts[jid] + + def update_txt(self, show = None): + if show: + self.txt['status'] = self.replace_show(show) + + txt = self.avahi_txt() + if self.connected and self.entrygroup: + self.entrygroup.UpdateServiceTxt(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, dbus.UInt32(0), self.name, self.stype,'', txt, reply_handler=self.service_updated_callback, error_handler=self.error_callback) + return True + else: + return False + + +# END Zeroconf diff --git a/src/common/zeroconf/zeroconf_bonjour.py b/src/common/zeroconf/zeroconf_bonjour.py new file mode 100644 index 000000000..3b7207004 --- /dev/null +++ b/src/common/zeroconf/zeroconf_bonjour.py @@ -0,0 +1,329 @@ +## common/zeroconf/zeroconf_bonjour.py +## +## Copyright (C) 2006 Stefan Bethge +## +## 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. +## + +from common import gajim +import sys +import select +from string import split +from common.zeroconf.zeroconf import C_BARE_NAME, C_DOMAIN + +try: + import pybonjour +except ImportError, e: + pass + + +resolve_timeout = 1 + +class Zeroconf: + def __init__(self, new_serviceCB, remove_serviceCB, name_conflictCB, + disconnected_CB, error_CB, name, host, port): + self.domain = None # specific domain to browse + self.stype = '_presence._tcp' + self.port = port # listening port that gets announced + self.username = name + self.host = host + self.txt = pybonjour.TXTRecord() # service data + + # XXX these CBs should be set to None when we destroy the object + # (go offline), because they create a circular reference + self.new_serviceCB = new_serviceCB + self.remove_serviceCB = remove_serviceCB + self.name_conflictCB = name_conflictCB + self.disconnected_CB = disconnected_CB + self.error_CB = error_CB + + self.contacts = {} # all current local contacts with data + self.connected = False + self.announced = False + self.invalid_self_contact = {} + self.resolved = [] + + + def browse_callback(self, sdRef, flags, interfaceIndex, errorCode, serviceName, regtype, replyDomain): + gajim.log.debug('Found service %s in domain %s on %i(type: %s).' % (serviceName, replyDomain, interfaceIndex, regtype)) + if not self.connected: + return + if errorCode != pybonjour.kDNSServiceErr_NoError: + return + if not (flags & pybonjour.kDNSServiceFlagsAdd): + self.remove_service_callback(serviceName) + return + + # asynchronous resolving + resolve_sdRef = pybonjour.DNSServiceResolve(0, interfaceIndex, serviceName, regtype, replyDomain, self.service_resolved_callback) + + try: + while not self.resolved: + ready = select.select([resolve_sdRef], [], [], resolve_timeout) + if resolve_sdRef not in ready[0]: + gajim.log.debug('Resolve timed out') + break + pybonjour.DNSServiceProcessResult(resolve_sdRef) + else: + self.resolved.pop() + finally: + resolve_sdRef.close() + + def remove_service_callback(self, name): + gajim.log.debug('Service %s disappeared.' % name) + if not self.connected: + return + if name != self.name: + for key in self.contacts.keys(): + if self.contacts[key][C_BARE_NAME] == name: + del self.contacts[key] + self.remove_serviceCB(key) + return + + def new_domain_callback(self,interface, protocol, domain, flags): + if domain != "local": + self.browse_domain(interface, protocol, domain) + + # takes a TXTRecord instance + def txt_array_to_dict(self, txt): + items = pybonjour.TXTRecord.parse(txt)._items + dict = {} + for val in items.values(): + dict[val[0]] = val[1] + return dict + + def service_resolved_callback(self, sdRef, flags, interfaceIndex, errorCode, fullname, + hosttarget, port, txtRecord): + + # TODO: do proper decoding... + escaping= { + r'\.': '.', + r'\032': ' ', + r'\064': '@', + } + + name, stype, protocol, domain, dummy = split(fullname, '.') + + # Replace the escaped values + for src, trg in escaping.items(): + name = name.replace(src, trg) + + txt = pybonjour.TXTRecord.parse(txtRecord) + + gajim.log.debug('Service data for service %s on %i:' % (fullname, interfaceIndex)) + gajim.log.debug('Host %s, port %i, TXT data: %s' % (hosttarget, port, txt._items)) + + if not self.connected: + return + + bare_name = name + if '@' not in name: + name = name + '@' + name + + # we don't want to see ourselves in the list + if name != self.name: + self.contacts[name] = (name, domain, interfaceIndex, protocol, hosttarget, hosttarget, port, bare_name, txtRecord) + + self.new_serviceCB(name) + else: + # remember data + # In case this is not our own record but of another + # gajim instance on the same machine, + # it will be used when we get a new name. + self.invalid_self_contact[name] = (name, domain, interfaceIndex, protocol, hosttarget, hosttarget, port, bare_name, txtRecord) + # count services + self.resolved.append(True) + + # different handler when resolving all contacts + def service_resolved_all_callback(self, sdRef, flags, interfaceIndex, errorCode, fullname, hosttarget, port, txtRecord): + if not self.connected: + return + + escaping= { + r'\.': '.', + r'\032': ' ', + r'\064': '@', + } + + name, stype, protocol, domain, dummy = split(fullname, '.') + + # Replace the escaped values + for src, trg in escaping.items(): + name = name.replace(src, trg) + + bare_name = name + if name.find('@') == -1: + name = name + '@' + name + + # we don't want to see ourselves in the list + if name != self.name: + self.contacts[name] = (name, domain, interfaceIndex, protocol, hosttarget, hosttarget, port, bare_name, txtRecord) + + + def service_added_callback(self, sdRef, flags, errorCode, name, regtype, domain): + if errorCode == pybonjour.kDNSServiceErr_NoError: + gajim.log.debug('Service successfully added') + + def service_add_fail_callback(self, err): + if err[0][0] == pybonjour.kDNSServiceErr_NameConflict: + gajim.log.debug('Error while adding service. %s' % str(err)) + parts = self.username.split(' ') + + #check if last part is a number and if, increment it + try: + stripped = str(int(parts[-1])) + except: + stripped = 1 + alternative_name = self.username + str(stripped+1) + self.name_conflictCB(alternative_name) + return + self.error_CB(_('Error while adding service. %s') % str(err)) + self.disconnect() + + # make zeroconf-valid names + def replace_show(self, show): + if show in ['chat', 'online', '']: + return 'avail' + elif show == 'xa': + return 'away' + return show + + def create_service(self): + txt = {} + + #remove empty keys + for key,val in self.txt: + if val: + txt[key] = val + + txt['port.p2pj'] = self.port + txt['version'] = 1 + txt['txtvers'] = 1 + + # replace gajim's show messages with compatible ones + if 'status' in self.txt: + txt['status'] = self.replace_show(self.txt['status']) + else: + txt['status'] = 'avail' + + self.txt = pybonjour.TXTRecord(txt, strict=True) + + try: + sdRef = pybonjour.DNSServiceRegister(name = self.name, + regtype = self.stype, port = self.port, txtRecord = self.txt, + callBack = self.service_added_callback) + self.service_sdRef = sdRef + except pybonjour.BonjourError, e: + self.service_add_fail_callback(e) + else: + gajim.log.debug('Publishing service %s of type %s' % (self.name, self.stype)) + + ready = select.select([sdRef], [], [], resolve_timeout) + if sdRef in ready[0]: + pybonjour.DNSServiceProcessResult(sdRef) + + def announce(self): + if not self.connected: + return False + + self.create_service() + self.announced = True + return True + + def remove_announce(self): + if self.announced == False: + return False + try: + self.service_sdRef.close() + self.announced = False + return True + except pybonjour.BonjourError, e: + geajim.log.debug(e) + return False + + + def connect(self): + self.name = self.username + '@' + self.host # service name + + self.connected = True + + # start browsing + if self.domain is None: + # Explicitly browse .local + self.browse_domain() + + # Browse for other browsable domains + #self.domain_sdRef = pybonjour.DNSServiceEnumerateDomains(flags, interfaceIndex=0, callBack=self.new_domain_callback) + + else: + self.browse_domain(self.domain) + + return True + + def disconnect(self): + if self.connected: + self.connected = False + self.browse_sdRef.close() + self.remove_announce() + + + def browse_domain(self, domain=None): + gajim.log.debug('starting to browse') + try: + self.browse_sdRef = pybonjour.DNSServiceBrowse(regtype=self.stype, domain=domain, callBack=self.browse_callback) + except pybonjour.BonjourError, e: + self.error_CB("Error while browsing: %s" % e) + + def browse_loop(self): + ready = select.select([self.browse_sdRef], [], [], 2) + if self.browse_sdRef in ready[0]: + pybonjour.DNSServiceProcessResult(self.browse_sdRef) + + # refresh txt data of all contacts manually (no callback available) + def resolve_all(self): + if not self.connected: + return + + # for now put here as this is synchronous + self.browse_loop() + + for val in self.contacts.values(): + resolve_sdRef = pybonjour.DNSServiceResolve(0, + pybonjour.kDNSServiceInterfaceIndexAny, val[C_BARE_NAME], + self.stype + '.', val[C_DOMAIN] + '.', + self.service_resolved_all_callback) + + try: + ready = select.select([resolve_sdRef], [], [], resolve_timeout) + if resolve_sdRef not in ready[0]: + gajim.log.debug('Resolve timed out (in resolve_all)') + break + pybonjour.DNSServiceProcessResult(resolve_sdRef) + finally: + resolve_sdRef.close() + + def get_contacts(self): + return self.contacts + + def get_contact(self, jid): + if not jid in self.contacts: + return None + return self.contacts[jid] + + def update_txt(self, show = None): + if show: + self.txt['status'] = self.replace_show(show) + + try: + pybonjour.DNSServiceUpdateRecord(self.service_sdRef, None, 0, self.txt) + except pybonjour.BonjourError, e: + return False + return True + diff --git a/src/config.py b/src/config.py index f3f329c41..69d4b3b00 100644 --- a/src/config.py +++ b/src/config.py @@ -89,10 +89,7 @@ class PreferencesWindow: self.treat_incoming_messages_combobox =\ self.xml.get_widget('treat_incoming_messages_combobox') - #FIXME: remove when ANC will be implemented - w = self.xml.get_widget('hbox3020') - w.set_no_show_all(True) - w.hide() + w = self.xml.get_widget('anc_hbox') # trayicon if gajim.interface.systray_capabilities: @@ -146,6 +143,8 @@ class PreferencesWindow: # iconset iconsets_list = os.listdir(os.path.join(gajim.DATA_DIR, 'iconsets')) + if os.path.isdir(gajim.MY_ICONSETS_PATH): + iconsets_list += os.listdir(gajim.MY_ICONSETS_PATH) # new model, image in 0, string in 1 model = gtk.ListStore(gtk.Image, str) renderer_image = cell_renderer_image.CellRendererImage(0, 0) @@ -158,7 +157,8 @@ class PreferencesWindow: self.iconset_combobox.set_model(model) l = [] for dir in iconsets_list: - if not os.path.isdir(os.path.join(gajim.DATA_DIR, 'iconsets', dir)): + if not os.path.isdir(os.path.join(gajim.DATA_DIR, 'iconsets', dir)) \ + and not os.path.isdir(os.path.join(gajim.MY_ICONSETS_PATH, dir)): continue if dir != '.svn' and dir != 'transports': l.append(dir) @@ -167,9 +167,9 @@ class PreferencesWindow: for i in xrange(len(l)): preview = gtk.Image() files = [] - files.append(os.path.join(gajim.DATA_DIR, 'iconsets', l[i], '16x16', + files.append(os.path.join(helpers.get_iconset_path(l[i]), '16x16', 'online.png')) - files.append(os.path.join(gajim.DATA_DIR, 'iconsets', l[i], '16x16', + files.append(os.path.join(helpers.get_iconset_path(l[i]), '16x16', 'online.gif')) for file in files: if os.path.exists(file): @@ -186,6 +186,10 @@ class PreferencesWindow: else: self.one_window_type_combobox.set_active(0) + # Compact View + st = gajim.config.get('compact_view') + self.xml.get_widget('compact_view_checkbutton').set_active(st) + # Set default for treat incoming messages choices = common.config.opt_treat_incoming_messages type = gajim.config.get('treat_incoming_messages') @@ -203,16 +207,7 @@ class PreferencesWindow: cell = gtk.CellRendererText() theme_combobox.pack_start(cell, True) theme_combobox.add_attribute(cell, 'text', 0) - model = gtk.ListStore(str) - theme_combobox.set_model(model) - - i = 0 - for config_theme in gajim.config.get_per('themes'): - theme = config_theme.replace('_', ' ') - model.append([theme]) - if gajim.config.get('roster_theme') == config_theme: - theme_combobox.set_active(i) - i += 1 + self.update_theme_list() # use speller if os.name == 'nt': @@ -394,6 +389,10 @@ class PreferencesWindow: self.auto_xa_message_entry.set_text(st) self.auto_xa_message_entry.set_sensitive(gajim.config.get('autoxa')) + from common import sleepy + if not sleepy.SUPPORTED: + self.xml.get_widget('autoaway_table').set_sensitive(False) + # ask_status when online / offline st = gajim.config.get('ask_online_status') self.xml.get_widget('prompt_online_status_message_checkbutton').\ @@ -504,8 +503,7 @@ class PreferencesWindow: notify_gmail_checkbutton = self.xml.get_widget('notify_gmail_checkbutton') notify_gmail_extra_checkbutton = self.xml.get_widget( 'notify_gmail_extra_checkbutton') - frame_gmail.set_no_show_all(True) - + for account in gajim.config.get_per('accounts'): jid = gajim.get_jid_from_account(account) if gajim.get_server_from_jid(jid) in gajim.gmail_domains: @@ -580,7 +578,14 @@ class PreferencesWindow: def on_show_avatars_in_roster_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'show_avatars_in_roster') gajim.interface.roster.draw_roster() - + # Redraw connected groupchats (in an ugly way) + for account in gajim.connections: + if gajim.connections[account].connected: + for gc_control in gajim.interface.msg_win_mgr.get_controls( + message_control.TYPE_GC) + \ + gajim.interface.minimized_controls[account].values(): + gc_control.draw_roster() + def on_emoticons_combobox_changed(self, widget): active = widget.get_active() model = widget.get_model() @@ -630,6 +635,18 @@ class PreferencesWindow: gajim.interface.roster.change_roster_style(None) gajim.interface.save_config() + def update_theme_list(self): + theme_combobox = self.xml.get_widget('theme_combobox') + model = gtk.ListStore(str) + theme_combobox.set_model(model) + i = 0 + for config_theme in gajim.config.get_per('themes'): + theme = config_theme.replace('_', ' ') + model.append([theme]) + if gajim.config.get('roster_theme') == config_theme: + theme_combobox.set_active(i) + i += 1 + def on_open_advanced_notifications_button_clicked(self, widget): dialogs.AdvancedNotificationsWindow() @@ -668,6 +685,15 @@ class PreferencesWindow: if spell_obj: spell_obj.detach() + def on_compact_view_checkbutton_toggled(self, widget): + active = widget.get_active() + for ctl in gajim.interface.msg_win_mgr.controls(): + ctl.chat_buttons_set_visible(active) + gajim.config.set('compact_view', active) + gajim.interface.save_config() + gajim.interface.roster.draw_roster() + + def on_speller_checkbutton_toggled(self, widget): active = widget.get_active() gajim.config.set('use_speller', active) @@ -1129,539 +1155,6 @@ class PreferencesWindow: gajim.interface.roster.enable_syncing_status_msg_from_current_music_track( widget.get_active()) -#---------- AccountModificationWindow class -------------# -class AccountModificationWindow: - '''Class for account informations''' - def on_account_modification_window_destroy(self, widget): - '''close window''' - if gajim.interface.instances.has_key(self.account): - if gajim.interface.instances[self.account].has_key( - 'account_modification'): - del gajim.interface.instances[self.account]['account_modification'] - return - if gajim.interface.instances.has_key('account_modification'): - del gajim.interface.instances['account_modification'] - - def on_cancel_button_clicked(self, widget): - self.window.destroy() - - def __init__(self, account): - self.xml = gtkgui_helpers.get_glade('account_modification_window.glade') - self.window = self.xml.get_widget('account_modification_window') - self.window.set_transient_for(gajim.interface.roster.window) - self.account = account - - # init proxy list - self.update_proxy_list() - - self.xml.signal_autoconnect(self) - self.init_account() - self.xml.get_widget('save_button').grab_focus() - self.window.show_all() - - def on_checkbutton_toggled(self, widget, widgets): - '''set or unset sensitivity of widgets when widget is toggled''' - for w in widgets: - w.set_sensitive(widget.get_active()) - - def init_account_gpg(self): - keyid = gajim.config.get_per('accounts', self.account, 'keyid') - keyname = gajim.config.get_per('accounts', self.account, 'keyname') - savegpgpass = gajim.config.get_per('accounts', self.account, - 'savegpgpass') - - if not keyid or not gajim.config.get('usegpg'): - return - - self.xml.get_widget('gpg_key_label').set_text(keyid) - self.xml.get_widget('gpg_name_label').set_text(keyname) - gpg_save_password_checkbutton = \ - self.xml.get_widget('gpg_save_password_checkbutton') - gpg_save_password_checkbutton.set_sensitive(True) - gpg_save_password_checkbutton.set_active(savegpgpass) - - if savegpgpass: - entry = self.xml.get_widget('gpg_password_entry') - entry.set_sensitive(True) - gpgpassword = gajim.config.get_per('accounts', - self.account, 'gpgpassword') - entry.set_text(gpgpassword) - - def update_proxy_list(self): - if self.account: - our_proxy = gajim.config.get_per('accounts', self.account, 'proxy') - else: - our_proxy = '' - if not our_proxy: - our_proxy = _('None') - self.proxy_combobox = self.xml.get_widget('proxies_combobox') - model = gtk.ListStore(str) - self.proxy_combobox.set_model(model) - l = gajim.config.get_per('proxies') - l.insert(0, _('None')) - for i in xrange(len(l)): - model.append([l[i]]) - if our_proxy == l[i]: - self.proxy_combobox.set_active(i) - - def init_account(self): - '''Initialize window with defaults values''' - self.xml.get_widget('name_entry').set_text(self.account) - jid = gajim.config.get_per('accounts', self.account, 'name') \ - + '@' + gajim.config.get_per('accounts', - self.account, 'hostname') - self.xml.get_widget('jid_entry').set_text(jid) - self.xml.get_widget('save_password_checkbutton').set_active( - gajim.config.get_per('accounts', self.account, 'savepass')) - if gajim.config.get_per('accounts', self.account, 'savepass'): - passstr = passwords.get_password(self.account) or '' - password_entry = self.xml.get_widget('password_entry') - password_entry.set_sensitive(True) - password_entry.set_text(passstr) - - self.xml.get_widget('resource_entry').set_text(gajim.config.get_per( - 'accounts', self.account, 'resource')) - self.xml.get_widget('adjust_priority_with_status_checkbutton').set_active( - gajim.config.get_per('accounts', self.account, - 'adjust_priority_with_status')) - spinbutton = self.xml.get_widget('priority_spinbutton') - if gajim.config.get('enable_negative_priority'): - spinbutton.set_range(-128, 127) - spinbutton.set_value(gajim.config.get_per('accounts', self.account, - 'priority')) - - usessl = gajim.config.get_per('accounts', self.account, 'usessl') - self.xml.get_widget('use_ssl_checkbutton').set_active(usessl) - - self.xml.get_widget('send_keepalive_checkbutton').set_active( - gajim.config.get_per('accounts', self.account, - 'keep_alives_enabled')) - - use_custom_host = gajim.config.get_per('accounts', self.account, - 'use_custom_host') - self.xml.get_widget('custom_host_port_checkbutton').set_active( - use_custom_host) - custom_host = gajim.config.get_per('accounts', self.account, - 'custom_host') - if not custom_host: - custom_host = gajim.config.get_per('accounts', - self.account, 'hostname') - self.xml.get_widget('custom_host_entry').set_text(custom_host) - custom_port = gajim.config.get_per('accounts', self.account, - 'custom_port') - if not custom_port: - custom_port = 5222 - self.xml.get_widget('custom_port_entry').set_text(unicode(custom_port)) - - gpg_key_label = self.xml.get_widget('gpg_key_label') - if gajim.config.get('usegpg'): - self.init_account_gpg() - else: - gpg_key_label.set_text(_('OpenPGP is not usable in this computer')) - self.xml.get_widget('gpg_choose_button').set_sensitive(False) - self.xml.get_widget('autoconnect_checkbutton').set_active(gajim.config.\ - get_per('accounts', self.account, 'autoconnect')) - self.xml.get_widget('autoreconnect_checkbutton').set_active(gajim.config.\ - get_per('accounts', self.account, 'autoreconnect')) - - self.xml.get_widget('sync_with_global_status_checkbutton').set_active( - gajim.config.get_per('accounts', self.account, - 'sync_with_global_status')) - self.xml.get_widget('autoconnect_checkbutton').set_active( - gajim.config.get_per('accounts', self.account, 'autoconnect')) - self.xml.get_widget('use_ft_proxies_checkbutton').set_active( - gajim.config.get_per('accounts', self.account, 'use_ft_proxies')) - list_no_log_for = gajim.config.get_per('accounts', self.account, - 'no_log_for').split() - if self.account in list_no_log_for: - self.xml.get_widget('log_history_checkbutton').set_active(0) - - def option_changed(self, config, opt): - if gajim.config.get_per('accounts', self.account, opt) != config[opt]: - return True - return False - - def options_changed_need_relogin(self, config, options): - '''accepts configuration and options - (tupple of strings of the name of options changed) - and returns True or False depending on if at least one of the options - need relogin to server to apply''' - for option in options: - if self.option_changed(config, option): - return True - return False - - def on_adjust_priority_with_status_checkbutton_toggled(self, widget): - self.xml.get_widget('priority_spinbutton').set_sensitive( - not widget.get_active()) - - def on_save_button_clicked(self, widget): - '''When save button is clicked: Save information in config file''' - config = {} - name = self.xml.get_widget('name_entry').get_text().decode('utf-8') - if gajim.connections.has_key(self.account): - if name != self.account: - if gajim.connections[self.account].connected != 0: - dialogs.ErrorDialog( - _('You are currently connected to the server'), - _('To change the account name, you must be disconnected.')) - return - if len(gajim.events.get_events(self.account)): - dialogs.ErrorDialog(_('Unread events'), - _('To change the account name, you must read all pending ' - 'events.')) - return - if name in gajim.connections: - dialogs.ErrorDialog(_('Account Name Already Used'), - _('This name is already used by another of your accounts. ' - 'Please choose another name.')) - return - if (name == ''): - dialogs.ErrorDialog(_('Invalid account name'), - _('Account name cannot be empty.')) - return - if name.find(' ') != -1: - dialogs.ErrorDialog(_('Invalid account name'), - _('Account name cannot contain spaces.')) - return - jid = self.xml.get_widget('jid_entry').get_text().decode('utf-8') - - # check if jid is conform to RFC and stringprep it - try: - jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: - pritext = _('Invalid Jabber ID') - dialogs.ErrorDialog(pritext, str(s)) - return - - n, hn = jid.split('@', 1) - if not n: - pritext = _('Invalid Jabber ID') - sectext = _('A Jabber ID must be in the form "user@servername".') - dialogs.ErrorDialog(pritext, sectext) - return - - resource = self.xml.get_widget('resource_entry').get_text().decode( - 'utf-8') - try: - resource = helpers.parse_resource(resource) - except helpers.InvalidFormat, s: - pritext = _('Invalid Jabber ID') - dialogs.ErrorDialog(pritext, (s)) - return - - config['savepass'] = self.xml.get_widget( - 'save_password_checkbutton').get_active() - config['password'] = self.xml.get_widget('password_entry').get_text().\ - decode('utf-8') - config['resource'] = resource - config['adjust_priority_with_status'] = self.xml.get_widget( - 'adjust_priority_with_status_checkbutton').get_active() - config['priority'] = self.xml.get_widget('priority_spinbutton').\ - get_value_as_int() - config['autoconnect'] = self.xml.get_widget('autoconnect_checkbutton').\ - get_active() - config['autoreconnect'] = self.xml.get_widget( - 'autoreconnect_checkbutton').get_active() - - if self.account: - list_no_log_for = gajim.config.get_per('accounts', self.account, - 'no_log_for').split() - else: - list_no_log_for = [] - if self.account in list_no_log_for: - list_no_log_for.remove(self.account) - if not self.xml.get_widget('log_history_checkbutton').get_active(): - list_no_log_for.append(name) - config['no_log_for'] = ' '.join(list_no_log_for) - - config['sync_with_global_status'] = self.xml.get_widget( - 'sync_with_global_status_checkbutton').get_active() - config['use_ft_proxies'] = self.xml.get_widget( - 'use_ft_proxies_checkbutton').get_active() - - active = self.proxy_combobox.get_active() - proxy = self.proxy_combobox.get_model()[active][0].decode('utf-8') - if proxy == _('None'): - proxy = '' - config['proxy'] = proxy - - config['usessl'] = self.xml.get_widget('use_ssl_checkbutton').get_active() - config['name'] = n - config['hostname'] = hn - - config['use_custom_host'] = self.xml.get_widget( - 'custom_host_port_checkbutton').get_active() - custom_port = self.xml.get_widget('custom_port_entry').get_text() - try: - custom_port = int(custom_port) - except: - dialogs.ErrorDialog(_('Invalid entry'), - _('Custom port must be a port number.')) - return - config['custom_port'] = custom_port - config['custom_host'] = self.xml.get_widget( - 'custom_host_entry').get_text().decode('utf-8') - - # update in case the name was changed to local account's name - config['is_zeroconf'] = False - - config['keyname'] = self.xml.get_widget('gpg_name_label').get_text().\ - decode('utf-8') - if config['keyname'] == '': # no key selected - config['keyid'] = '' - config['savegpgpass'] = False - config['gpgpassword'] = '' - else: - config['keyid'] = self.xml.get_widget('gpg_key_label').get_text().\ - decode('utf-8') - config['savegpgpass'] = self.xml.get_widget( - 'gpg_save_password_checkbutton').get_active() - config['gpgpassword'] = self.xml.get_widget('gpg_password_entry' - ).get_text().decode('utf-8') - # if we modify the name of the account - if name != self.account: - # update variables - gajim.interface.instances[name] = gajim.interface.instances[ - self.account] - gajim.nicks[name] = gajim.nicks[self.account] - gajim.block_signed_in_notifications[name] = \ - gajim.block_signed_in_notifications[self.account] - gajim.groups[name] = gajim.groups[self.account] - gajim.gc_connected[name] = gajim.gc_connected[self.account] - gajim.automatic_rooms[name] = gajim.automatic_rooms[self.account] - gajim.newly_added[name] = gajim.newly_added[self.account] - gajim.to_be_removed[name] = gajim.to_be_removed[self.account] - gajim.sleeper_state[name] = gajim.sleeper_state[self.account] - gajim.encrypted_chats[name] = gajim.encrypted_chats[self.account] - gajim.last_message_time[name] = \ - gajim.last_message_time[self.account] - gajim.status_before_autoaway[name] = \ - gajim.status_before_autoaway[self.account] - gajim.transport_avatar[name] = gajim.transport_avatar[self.account] - - gajim.contacts.change_account_name(self.account, name) - gajim.events.change_account_name(self.account, name) - - # change account variable for chat / gc controls - gajim.interface.msg_win_mgr.change_account_name(self.account, name) - # upgrade account variable in opened windows - for kind in ('infos', 'disco', 'gc_config', 'search'): - for j in gajim.interface.instances[name][kind]: - gajim.interface.instances[name][kind][j].account = name - - # ServiceCache object keep old property account - if hasattr(gajim.connections[self.account], 'services_cache'): - gajim.connections[self.account].services_cache.account = name - del gajim.interface.instances[self.account] - del gajim.nicks[self.account] - del gajim.block_signed_in_notifications[self.account] - del gajim.groups[self.account] - del gajim.gc_connected[self.account] - del gajim.automatic_rooms[self.account] - del gajim.newly_added[self.account] - del gajim.to_be_removed[self.account] - del gajim.sleeper_state[self.account] - del gajim.encrypted_chats[self.account] - del gajim.last_message_time[self.account] - del gajim.status_before_autoaway[self.account] - del gajim.transport_avatar[self.account] - gajim.connections[self.account].name = name - gajim.connections[name] = gajim.connections[self.account] - del gajim.connections[self.account] - gajim.config.del_per('accounts', self.account) - gajim.config.add_per('accounts', name) - self.account = name - - resend_presence = False - if gajim.connections[self.account].connected == 0: # we're disconnected - relogin_needed = False - else: # we're connected to the account we want to apply changes - # check if relogin is needed - relogin_needed = False - if self.options_changed_need_relogin(config, - ('resource', 'proxy', 'usessl', 'keyname', - 'use_custom_host', 'custom_host')): - relogin_needed = True - - elif config['use_custom_host'] and (self.option_changed(config, - 'custom_host') or self.option_changed(config, 'custom_port')): - relogin_needed = True - - if self.option_changed(config, 'use_ft_proxies') and \ - config['use_ft_proxies']: - gajim.connections[self.account].discover_ft_proxies() - - if self.option_changed(config, 'priority') or self.option_changed( - config, 'adjust_priority_with_status'): - resend_presence = True - - for opt in config: - gajim.config.set_per('accounts', name, opt, config[opt]) - if config['savepass']: - passwords.save_password(name, config['password']) - else: - passwords.save_password(name, '') - # refresh accounts window - if gajim.interface.instances.has_key('accounts'): - gajim.interface.instances['accounts'].init_accounts() - # refresh roster - gajim.interface.roster.draw_roster() - gajim.interface.save_config() - self.window.destroy() - - if relogin_needed: - def login(account, show_before, status_before): - ''' login with previous status''' - # first make sure connection is really closed, - # 0.5 may not be enough - gajim.connections[account].disconnect(True) - gajim.interface.roster.send_status(account, show_before, - status_before) - - def relog(widget): - self.dialog.destroy() - show_before = gajim.SHOW_LIST[gajim.connections[self.account].\ - connected] - status_before = gajim.connections[self.account].status - gajim.interface.roster.send_status(self.account, 'offline', - _('Be right back.')) - gobject.timeout_add(500, login, self.account, show_before, - status_before) - - def resend(widget): - self.resend_presence() - - on_no = None - if resend_presence: - on_no = resend - self.dialog = dialogs.YesNoDialog(_('Relogin now?'), - _('If you want all the changes to apply instantly, ' - 'you must relogin.'), on_response_yes = relog, - on_response_no = on_no) - elif resend_presence: - self.resend_presence() - - def resend_presence(self): - show = gajim.SHOW_LIST[gajim.connections[self.account].connected] - status = gajim.connections[self.account].status - gajim.connections[self.account].change_status(show, status) - - def on_change_password_button_clicked(self, widget): - try: - dialog = dialogs.ChangePasswordDialog(self.account) - except GajimGeneralException: - #if we showed ErrorDialog, there will not be dialog instance - return - - new_password = dialog.run() - if new_password != -1: - gajim.connections[self.account].change_password(new_password) - if self.xml.get_widget('save_password_checkbutton').get_active(): - self.xml.get_widget('password_entry').set_text(new_password) - - def on_edit_details_button_clicked(self, widget): - if not gajim.interface.instances.has_key(self.account): - dialogs.ErrorDialog(_('No such account available'), - _('You must create your account before editing your personal ' - 'information.')) - return - - # show error dialog if account is newly created (not in gajim.connections) - if not gajim.connections.has_key(self.account) or \ - gajim.connections[self.account].connected < 2: - dialogs.ErrorDialog(_('You are not connected to the server'), - _('Without a connection, you can not edit your personal information.')) - return - - if not gajim.connections[self.account].vcard_supported: - dialogs.ErrorDialog(_("Your server doesn't support Vcard"), - _("Your server can't save your personal information.")) - return - - gajim.interface.edit_own_details(self.account) - - def on_manage_proxies_button_clicked(self, widget): - if gajim.interface.instances.has_key('manage_proxies'): - gajim.interface.instances['manage_proxies'].window.present() - else: - gajim.interface.instances['manage_proxies'] = \ - ManageProxiesWindow() - - def on_synchronise_contacts_button_clicked(self, widget): - try: - dialog = dialogs.SynchroniseSelectAccountDialog(self.account) - except GajimGeneralException: - # If we showed ErrorDialog, there will not be dialog instance - return - - def on_gpg_choose_button_clicked(self, widget, data = None): - if gajim.connections.has_key(self.account): - secret_keys = gajim.connections[self.account].ask_gpg_secrete_keys() - - # self.account is None and/or gajim.connections is {} - else: - from common import GnuPG - if GnuPG.USE_GPG: - secret_keys = GnuPG.GnuPG().get_secret_keys() - else: - secret_keys = [] - if not secret_keys: - dialogs.ErrorDialog(_('Failed to get secret keys'), - _('There was a problem retrieving your OpenPGP secret keys.')) - return - secret_keys[_('None')] = _('None') - instance = dialogs.ChooseGPGKeyDialog(_('OpenPGP Key Selection'), - _('Choose your OpenPGP key'), secret_keys) - keyID = instance.run() - if keyID is None: - return - checkbutton = self.xml.get_widget('gpg_save_password_checkbutton') - gpg_key_label = self.xml.get_widget('gpg_key_label') - gpg_name_label = self.xml.get_widget('gpg_name_label') - if keyID[0] == _('None'): - gpg_key_label.set_text(_('No key selected')) - gpg_name_label.set_text('') - checkbutton.set_sensitive(False) - self.xml.get_widget('gpg_password_entry').set_sensitive(False) - else: - gpg_key_label.set_text(keyID[0]) - gpg_name_label.set_text(keyID[1]) - checkbutton.set_sensitive(True) - checkbutton.set_active(False) - self.xml.get_widget('gpg_password_entry').set_text('') - - def on_checkbutton_toggled_and_clear(self, widget, widgets): - self.on_checkbutton_toggled(widget, widgets) - for w in widgets: - if not widget.get_active(): - w.set_text('') - - def on_use_ssl_checkbutton_toggled(self, widget): - isactive = widget.get_active() - if isactive: - self.xml.get_widget('custom_port_entry').set_text('5223') - else: - self.xml.get_widget('custom_port_entry').set_text('5222') - - def on_send_keepalive_checkbutton_toggled(self, widget): - isactive = widget.get_active() - gajim.config.set_per('accounts', self.account, - 'keep_alives_enabled', isactive) - - def on_custom_host_port_checkbutton_toggled(self, widget): - isactive = widget.get_active() - self.xml.get_widget('custom_host_port_hbox').set_sensitive(isactive) - - def on_gpg_save_password_checkbutton_toggled(self, widget): - self.on_checkbutton_toggled_and_clear(widget, [ - self.xml.get_widget('gpg_password_entry')]) - - def on_save_password_checkbutton_toggled(self, widget): - self.on_checkbutton_toggled_and_clear(widget, - [self.xml.get_widget('password_entry')]) - self.xml.get_widget('password_entry').grab_focus() - #---------- ManageProxiesWindow class -------------# class ManageProxiesWindow: def __init__(self): @@ -1699,12 +1192,9 @@ class ManageProxiesWindow: self.xml.get_widget('proxytype_combobox').set_active(0) def on_manage_proxies_window_destroy(self, widget): - for account in gajim.connections: - if gajim.interface.instances[account].has_key('account_modification'): - gajim.interface.instances[account]['account_modification'].\ - update_proxy_list() - if gajim.interface.instances.has_key('account_modification'): - gajim.interface.instances['account_modification'].update_proxy_list() + if gajim.interface.instances.has_key('accounts'): + gajim.interface.instances['accounts'].\ + update_proxy_list() del gajim.interface.instances['manage_proxies'] def on_add_proxy_button_clicked(self, widget): @@ -1835,69 +1325,360 @@ class AccountsWindow: def on_close_button_clicked(self, widget): self.window.destroy() + def on_accounts_window_destroy(self, widget): + if gajim.interface.instances.has_key('accounts'): + del gajim.interface.instances['accounts'] + def __init__(self): self.xml = gtkgui_helpers.get_glade('accounts_window.glade') self.window = self.xml.get_widget('accounts_window') self.window.set_transient_for(gajim.interface.roster.window) self.accounts_treeview = self.xml.get_widget('accounts_treeview') - self.modify_button = self.xml.get_widget('modify_button') self.remove_button = self.xml.get_widget('remove_button') - model = gtk.ListStore(str, str, bool) + self.rename_button = self.xml.get_widget('rename_button') + #FIXME: I don't understand why this import is necessary + import os + path_to_kbd_input_img = os.path.join(gajim.DATA_DIR, 'pixmaps', + 'kbd_input.png') + img = self.xml.get_widget('rename_image') + img.set_from_file(path_to_kbd_input_img) + self.notebook = self.xml.get_widget('notebook') + # Name + model = gtk.ListStore(str) self.accounts_treeview.set_model(model) - #columns + # column renderer = gtk.CellRendererText() self.accounts_treeview.insert_column_with_attributes(-1, _('Name'), renderer, text = 0) - renderer = gtk.CellRendererText() - self.accounts_treeview.insert_column_with_attributes(-1, - _('Server'), renderer, text = 1) + + self.current_account = None + # When we fill info, we don't want to handle the changed signals + self.ignore_events = False + self.need_relogin = False + self.resend_presence = False + + self.update_proxy_list() self.xml.signal_autoconnect(self) self.init_accounts() self.window.show_all() - #Merge accounts + # Merge accounts st = gajim.config.get('mergeaccounts') self.xml.get_widget('merge_checkbutton').set_active(st) import os - avahi_error = False + self.avahi_available = True try: import avahi except ImportError: - avahi_error = True - - # enable zeroconf - st = gajim.config.get('enable_zeroconf') - w = self.xml.get_widget('enable_zeroconf_checkbutton') - w.set_active(st) - if os.name == 'nt' or (avahi_error and not w.get_active()): - w.set_sensitive(False) - self.zeroconf_toggled_id = w.connect('toggled', - self.on_enable_zeroconf_checkbutton_toggled) + self.avahi_available = False def on_accounts_window_key_press_event(self, widget, event): if event.keyval == gtk.keysyms.Escape: self.window.destroy() + def select_account(self, account): + model = self.accounts_treeview.get_model() + iter = model.get_iter_root() + while iter: + acct = model[iter][0].decode('utf-8') + if account == acct: + self.accounts_treeview.set_cursor(model.get_path(iter)) + return + iter = model.iter_next(iter) + def init_accounts(self): '''initialize listStore with existing accounts''' - self.modify_button.set_sensitive(False) self.remove_button.set_sensitive(False) + self.rename_button.set_sensitive(False) + self.current_account = None + self.init_account() model = self.accounts_treeview.get_model() model.clear() - for account in gajim.connections: + for account in gajim.config.get_per('accounts'): iter = model.append() - model.set(iter, 0, account, 1, gajim.get_hostname_from_account( - account)) + model.set(iter, 0, account) + + def resend(self): + show = gajim.SHOW_LIST[gajim.connections[self.current_account].connected] + status = gajim.connections[self.current_account].status + gajim.connections[self.current_account].change_status(show, status) def on_accounts_treeview_cursor_changed(self, widget): - '''Activate delete and modify buttons when a row is selected''' - self.modify_button.set_sensitive(True) - self.remove_button.set_sensitive(True) + '''Activate modify buttons when a row is selected, update accounts info''' + sel = self.accounts_treeview.get_selection() + (model, iter) = sel.get_selected() + if iter: + account = model[iter][0].decode('utf-8') + else: + account = None + if self.current_account and self.current_account == account: + # We're comming back to our current account, no need to update widgets + return + # Save config for previous account if needed cause focus_out event is + # called after the changed event + if self.current_account: + focused_widget = self.window.get_focus() + focused_widget_name = focused_widget.get_name() + if focused_widget_name in ('jid_entry1', 'resource_entry1', + 'custom_port_entry'): + if focused_widget_name == 'jid_entry1': + func = self.on_jid_entry1_focus_out_event + elif focused_widget_name == 'resource_entry1': + func = self.on_resource_entry1_focus_out_event + elif focused_widget_name == 'custom_port_entry': + func = self.on_custom_port_entry_focus_out_event + if func(focused_widget, None): + # Error detected in entry, don't change account, re-put cursor on + # previous row + self.select_account(self.current_account) + return True + self.window.set_focus(widget) - def on_new_button_clicked(self, widget): - '''When new button is clicked: open an account information window''' + if self.need_relogin and self.current_account == gajim.ZEROCONF_ACC_NAME: + if gajim.connections.has_key(gajim.ZEROCONF_ACC_NAME): + gajim.connections[gajim.ZEROCONF_ACC_NAME].update_details() + return + + elif self.need_relogin and gajim.connections[self.current_account].\ + connected > 0: + def login(account, show_before, status_before): + ''' login with previous status''' + # first make sure connection is really closed, + # 0.5 may not be enough + gajim.connections[account].disconnect(True) + gajim.interface.roster.send_status(account, show_before, + status_before) + + def relog(): + self.dialog.destroy() + show_before = gajim.SHOW_LIST[gajim.connections[ + self.current_account].connected] + status_before = gajim.connections[self.current_account].status + gajim.interface.roster.send_status(self.current_account, 'offline', + _('Be right back.')) + gobject.timeout_add(500, login, self.current_account, show_before, + status_before) + + self.dialog = dialogs.YesNoDialog(_('Relogin now?'), + _('If you want all the changes to apply instantly, ' + 'you must relogin.')) + resp = self.dialog.get_response() + if resp == gtk.RESPONSE_YES: + relog() + elif self.resend_presence: + self.resend() + elif self.resend_presence: + self.resend() + + self.need_relogin = False + self.resend_presence = False + self.remove_button.set_sensitive(True) + self.rename_button.set_sensitive(True) + if iter: + self.current_account = account + if account == gajim.ZEROCONF_ACC_NAME: + self.remove_button.set_sensitive(False) + self.rename_button.set_sensitive(False) + self.init_account() + self.update_proxy_list() + + def update_proxy_list(self): + if self.current_account: + our_proxy = gajim.config.get_per('accounts', self.current_account, + 'proxy') + else: + our_proxy = '' + + if not our_proxy: + our_proxy = _('None') + proxy_combobox = self.xml.get_widget('proxies_combobox1') + model = gtk.ListStore(str) + proxy_combobox.set_model(model) + l = gajim.config.get_per('proxies') + l.insert(0, _('None')) + for i in xrange(len(l)): + model.append([l[i]]) + if our_proxy == l[i]: + proxy_combobox.set_active(i) + + def init_account(self): + if not self.current_account: + self.notebook.set_current_page(0) + return + if gajim.config.get_per('accounts', self.current_account, 'is_zeroconf'): + self.ignore_events = True + self.init_zeroconf_account() + self.ignore_events = False + self.notebook.set_current_page(2) + return + self.ignore_events = True + self.init_normal_account() + self.ignore_events = False + self.notebook.set_current_page(1) + + def init_zeroconf_account(self): + enable = gajim.config.get('enable_zeroconf') + self.xml.get_widget('enable_zeroconf_checkbutton2').set_active(enable) + self.xml.get_widget('zeroconf_notebook').set_sensitive(enable) + # General tab + st = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'autoconnect') + self.xml.get_widget('autoconnect_checkbutton2').set_active(st) + + list_no_log_for = gajim.config.get_per('accounts', + gajim.ZEROCONF_ACC_NAME, 'no_log_for').split() + if gajim.ZEROCONF_ACC_NAME in list_no_log_for: + self.xml.get_widget('log_history_checkbutton2').set_active(0) + else: + self.xml.get_widget('log_history_checkbutton2').set_active(1) + + st = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'sync_with_global_status') + self.xml.get_widget('sync_with_global_status_checkbutton2').set_active(st) + + st = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'use_custom_host') + self.xml.get_widget('custom_port_checkbutton2').set_active(st) + self.xml.get_widget('custom_port_entry2').set_sensitive(st) + + st = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'custom_port') + if not st: + gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'custom_port', '5298') + st = '5298' + self.xml.get_widget('custom_port_entry2').set_text(str(st)) + + # Personal tab + gpg_key_label = self.xml.get_widget('gpg_key_label2') + if gajim.config.get('usegpg'): + self.xml.get_widget('gpg_choose_button2').set_sensitive(True) + self.init_account_gpg() + else: + gpg_key_label.set_text(_('OpenPGP is not usable in this computer')) + self.xml.get_widget('gpg_choose_button2').set_sensitive(False) + + for opt in ('first_name', 'last_name', 'jabber_id', 'email'): + st = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'zeroconf_' + opt) + self.xml.get_widget(opt + '_entry2').set_text(st) + + def init_account_gpg(self): + account = self.current_account + keyid = gajim.config.get_per('accounts', account, 'keyid') + keyname = gajim.config.get_per('accounts', account, 'keyname') + savegpgpass = gajim.config.get_per('accounts', account, 'savegpgpass') + + if account == gajim.ZEROCONF_ACC_NAME: + widget_name_add = '2' + else: + widget_name_add = '1' + + gpg_key_label = self.xml.get_widget('gpg_key_label' + widget_name_add) + gpg_name_label = self.xml.get_widget('gpg_name_label' + widget_name_add) + gpg_save_password_checkbutton = \ + self.xml.get_widget('gpg_save_password_checkbutton' + widget_name_add) + gpg_password_entry = self.xml.get_widget('gpg_password_entry' + \ + widget_name_add) + + if not keyid or not gajim.config.get('usegpg'): + gpg_save_password_checkbutton.set_sensitive(False) + gpg_password_entry.set_sensitive(False) + gpg_key_label.set_text(_('No key selected')) + gpg_name_label.set_text('') + return + + gpg_key_label.set_text(keyid) + gpg_name_label.set_text(keyname) + gpg_save_password_checkbutton.set_sensitive(True) + gpg_save_password_checkbutton.set_active(savegpgpass) + + if savegpgpass: + gpg_password_entry.set_sensitive(True) + gpgpassword = gajim.config.get_per('accounts', account, 'gpgpassword') + gpg_password_entry.set_text(gpgpassword) + + def init_normal_account(self): + account = self.current_account + # Account tab + jid = gajim.config.get_per('accounts', account, 'name') \ + + '@' + gajim.config.get_per('accounts', account, 'hostname') + self.xml.get_widget('jid_entry1').set_text(jid) + savepass = gajim.config.get_per('accounts', account, 'savepass') + self.xml.get_widget('save_password_checkbutton1').set_active(savepass) + password_entry = self.xml.get_widget('password_entry1') + if savepass: + passstr = passwords.get_password(account) or '' + password_entry.set_sensitive(True) + else: + passstr = '' + password_entry.set_sensitive(False) + password_entry.set_text(passstr) + + self.xml.get_widget('resource_entry1').set_text(gajim.config.get_per( + 'accounts', account, 'resource')) + self.xml.get_widget('adjust_priority_with_status_checkbutton1').\ + set_active(gajim.config.get_per('accounts', account, + 'adjust_priority_with_status')) + spinbutton = self.xml.get_widget('priority_spinbutton1') + if gajim.config.get('enable_negative_priority'): + spinbutton.set_range(-128, 127) + else: + spinbutton.set_range(0, 127) + spinbutton.set_value(gajim.config.get_per('accounts', account, + 'priority')) + + # Connection tab + usessl = gajim.config.get_per('accounts', account, 'usessl') + self.xml.get_widget('use_ssl_checkbutton1').set_active(usessl) + + self.xml.get_widget('send_keepalive_checkbutton1').set_active( + gajim.config.get_per('accounts', account, 'keep_alives_enabled')) + + use_custom_host = gajim.config.get_per('accounts', account, + 'use_custom_host') + self.xml.get_widget('custom_host_port_checkbutton1').set_active( + use_custom_host) + custom_host = gajim.config.get_per('accounts', account, 'custom_host') + if not custom_host: + custom_host = gajim.config.get_per('accounts', account, 'hostname') + self.xml.get_widget('custom_host_entry1').set_text(custom_host) + custom_port = gajim.config.get_per('accounts', account, 'custom_port') + if not custom_port: + custom_port = 5222 + self.xml.get_widget('custom_port_entry1').set_text(unicode(custom_port)) + + # Personal tab + gpg_key_label = self.xml.get_widget('gpg_key_label1') + if gajim.config.get('usegpg'): + self.xml.get_widget('gpg_choose_button1').set_sensitive(True) + self.init_account_gpg() + else: + gpg_key_label.set_text(_('OpenPGP is not usable in this computer')) + self.xml.get_widget('gpg_choose_button1').set_sensitive(False) + + # General tab + self.xml.get_widget('autoconnect_checkbutton1').set_active(gajim.config.\ + get_per('accounts', account, 'autoconnect')) + self.xml.get_widget('autoreconnect_checkbutton1').set_active(gajim. + config.get_per('accounts', account, 'autoreconnect')) + + list_no_log_for = gajim.config.get_per('accounts', account, + 'no_log_for').split() + if account in list_no_log_for: + self.xml.get_widget('log_history_checkbutton1').set_active(False) + else: + self.xml.get_widget('log_history_checkbutton1').set_active(True) + + self.xml.get_widget('sync_with_global_status_checkbutton1').set_active( + gajim.config.get_per('accounts', account, 'sync_with_global_status')) + self.xml.get_widget('use_ft_proxies_checkbutton1').set_active( + 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''' if gajim.interface.instances.has_key('account_creation_wizard'): gajim.interface.instances['account_creation_wizard'].window.present() else: @@ -1907,27 +1688,17 @@ class AccountsWindow: def on_remove_button_clicked(self, widget): '''When delete button is clicked: Remove an account from the listStore and from the config file''' - sel = self.accounts_treeview.get_selection() - (model, iter) = sel.get_selected() - if not iter: + if not self.current_account: return - account = model.get_value(iter, 0).decode('utf-8') + account = self.current_account if len(gajim.events.get_events(account)): dialogs.ErrorDialog(_('Unread events'), _('Read all pending events before removing this account.')) return if gajim.config.get_per('accounts', account, 'is_zeroconf'): - w = self.xml.get_widget('enable_zeroconf_checkbutton') - w.set_active(False) + # Should never happen as button is insensitive return - else: - if gajim.interface.instances[account].has_key('remove_account'): - gajim.interface.instances[account]['remove_account'].window.present( - ) - else: - gajim.interface.instances[account]['remove_account'] = \ - RemoveAccountWindow(account) win_opened = False if gajim.interface.msg_win_mgr.get_controls(acct = account): @@ -1958,39 +1729,417 @@ class AccountsWindow: else: remove(widget, account) - def on_modify_button_clicked(self, widget): - '''When modify button is clicked: - open/show the account modification window for this account''' - sel = self.accounts_treeview.get_selection() - (model, iter) = sel.get_selected() - if not iter: + def on_rename_button_clicked(self, widget): + if gajim.connections[self.current_account].connected != 0: + dialogs.ErrorDialog( + _('You are currently connected to the server'), + _('To change the account name, you must be disconnected.')) return - account = model[iter][0].decode('utf-8') - self.show_modification_window(account) + if len(gajim.events.get_events(self.current_account)): + dialogs.ErrorDialog(_('Unread events'), + _('To change the account name, you must read all pending ' + 'events.')) + return + # Get the new name + def on_renamed(new_name, old_name): + if new_name in gajim.connections: + dialogs.ErrorDialog(_('Account Name Already Used'), + _('This name is already used by another of your accounts. ' + 'Please choose another name.')) + return + if (new_name == ''): + dialogs.ErrorDialog(_('Invalid account name'), + _('Account name cannot be empty.')) + return + if new_name.find(' ') != -1: + dialogs.ErrorDialog(_('Invalid account name'), + _('Account name cannot contain spaces.')) + return + # update variables + gajim.interface.instances[new_name] = gajim.interface.instances[ + old_name] + gajim.interface.minimized_controls[new_name] = \ + gajim.interface.minimized_controls[old_name] + gajim.nicks[new_name] = gajim.nicks[old_name] + gajim.block_signed_in_notifications[new_name] = \ + gajim.block_signed_in_notifications[old_name] + gajim.groups[new_name] = gajim.groups[old_name] + gajim.gc_connected[new_name] = gajim.gc_connected[old_name] + gajim.automatic_rooms[new_name] = gajim.automatic_rooms[old_name] + gajim.newly_added[new_name] = gajim.newly_added[old_name] + gajim.to_be_removed[new_name] = gajim.to_be_removed[old_name] + gajim.sleeper_state[new_name] = gajim.sleeper_state[old_name] + gajim.encrypted_chats[new_name] = gajim.encrypted_chats[old_name] + gajim.last_message_time[new_name] = gajim.last_message_time[old_name] + gajim.status_before_autoaway[new_name] = \ + gajim.status_before_autoaway[old_name] + gajim.transport_avatar[new_name] = gajim.transport_avatar[old_name] - def on_accounts_treeview_row_activated(self, widget, path, column): - model = widget.get_model() - account = model[path][0].decode('utf-8') - self.show_modification_window(account) + gajim.contacts.change_account_name(old_name, new_name) + gajim.events.change_account_name(old_name, new_name) - def show_modification_window(self, account): - if gajim.config.get_per('accounts', account, 'is_zeroconf'): - if gajim.interface.instances.has_key('zeroconf_properties'): - gajim.interface.instances['zeroconf_properties'].window.present() - else: - gajim.interface.instances['zeroconf_properties'] = \ - ZeroconfPropertiesWindow() + # change account variable for chat / gc controls + gajim.interface.msg_win_mgr.change_account_name(old_name, new_name) + # upgrade account variable in opened windows + for kind in ('infos', 'disco', 'gc_config', 'search'): + for j in gajim.interface.instances[new_name][kind]: + gajim.interface.instances[new_name][kind][j].account = new_name + + # ServiceCache object keep old property account + if hasattr(gajim.connections[old_name], 'services_cache'): + gajim.connections[self.account].services_cache.account = new_name + del gajim.interface.instances[old_name] + del gajim.interface.minimized_controls[old_name] + del gajim.nicks[old_name] + del gajim.block_signed_in_notifications[old_name] + del gajim.groups[old_name] + del gajim.gc_connected[old_name] + del gajim.automatic_rooms[old_name] + del gajim.newly_added[old_name] + del gajim.to_be_removed[old_name] + del gajim.sleeper_state[old_name] + del gajim.encrypted_chats[old_name] + del gajim.last_message_time[old_name] + del gajim.status_before_autoaway[old_name] + del gajim.transport_avatar[old_name] + gajim.connections[old_name].name = new_name + gajim.connections[new_name] = gajim.connections[old_name] + del gajim.connections[old_name] + gajim.config.add_per('accounts', new_name) + old_config = gajim.config.get_per('accounts', old_name) + for opt in old_config: + gajim.config.set_per('accounts', new_name, opt, old_config[opt][1]) + gajim.config.del_per('accounts', old_name) + if self.current_account == old_name: + self.current_account = new_name + # refresh roster + gajim.interface.roster.draw_roster() + self.init_accounts() + self.select_account(new_name) + + title = _('Rename Account') + message = _('Enter a new name for account %s') % self.current_account + old_text = self.current_account + dialogs.InputDialog(title, message, old_text, is_modal=False, + ok_handler=(on_renamed, self.current_account)) + + def option_changed(self, option, value): + return gajim.config.get_per('accounts', self.current_account, option) != \ + value + + def on_jid_entry1_focus_out_event(self, widget, event): + if self.ignore_events: + return + jid = widget.get_text() + # check if jid is conform to RFC and stringprep it + try: + jid = helpers.parse_jid(jid) + except helpers.InvalidFormat, s: + if not widget.is_focus(): + pritext = _('Invalid Jabber ID') + dialogs.ErrorDialog(pritext, str(s)) + gobject.idle_add(lambda: widget.grab_focus()) + return True + + jid_splited = jid.split('@', 1) + if len(jid_splited) != 2: + if not widget.is_focus(): + pritext = _('Invalid Jabber ID') + sectext = _('A Jabber ID must be in the form "user@servername".') + dialogs.ErrorDialog(pritext, sectext) + gobject.idle_add(lambda: widget.grab_focus()) + return True + + if self.option_changed('name', jid_splited[0]) or \ + self.option_changed('hostname', jid_splited[1]): + self.need_relogin = True + + gajim.config.set_per('accounts', self.current_account, 'name', + jid_splited[0]) + gajim.config.set_per('accounts', self.current_account, 'hostname', + jid_splited[1]) + + def on_password_entry1_changed(self, widget): + if self.ignore_events: + return + passwords.save_password(self.current_account, widget.get_text()) + + def on_save_password_checkbutton1_toggled(self, widget): + if self.ignore_events: + return + active = widget.get_active() + gajim.config.set_per('accounts', self.current_account, 'savepass', active) + if active: + password = self.xml.get_widget('password_entry1').get_text() + passwords.save_password(self.current_account, password) else: - if gajim.interface.instances[account].has_key('account_modification'): - gajim.interface.instances[account]['account_modification'].window.\ - present() + passwords.save_password(self.current_account, '') + + def on_resource_entry1_focus_out_event(self, widget, event): + if self.ignore_events: + return + resource = self.xml.get_widget('resource_entry1').get_text().decode( + 'utf-8') + try: + resource = helpers.parse_resource(resource) + except helpers.InvalidFormat, s: + if not widget.is_focus(): + pritext = _('Invalid Jabber ID') + dialogs.ErrorDialog(pritext, str(s)) + gobject.idle_add(lambda: widget.grab_focus()) + return True + + if self.option_changed('resource', resource): + self.need_relogin = True + + gajim.config.set_per('accounts', self.current_account, 'resource', + resource) + + def on_adjust_priority_with_status_checkbutton1_toggled(self, widget): + self.xml.get_widget('priority_spinbutton1').set_sensitive( + not widget.get_active()) + self.on_checkbutton_toggled(widget, 'adjust_priority_with_status', + account = self.current_account) + + def on_priority_spinbutton1_value_changed(self, widget): + prio = widget.get_value_as_int() + + if self.option_changed('priority', prio): + self.resend_presence = True + + gajim.config.set_per('accounts', self.current_account, 'priority', prio) + + def on_synchronise_contacts_button1_clicked(self, widget): + try: + dialog = dialogs.SynchroniseSelectAccountDialog(self.current_account) + except GajimGeneralException: + # If we showed ErrorDialog, there will not be dialog instance + return + + def on_change_password_button1_clicked(self, widget): + try: + dialog = dialogs.ChangePasswordDialog(self.current_account) + except GajimGeneralException: + # if we showed ErrorDialog, there will not be dialog instance + return + + new_password = dialog.run() + if new_password != -1: + gajim.connections[self.current_account].change_password(new_password) + if self.xml.get_widget('save_password_checkbutton1').get_active(): + self.xml.get_widget('password_entry1').set_text(new_password) + + def on_autoconnect_checkbutton_toggled(self, widget): + if self.ignore_events: + return + self.on_checkbutton_toggled(widget, 'autoconnect', + account=self.current_account) + + def on_autoreconnect_checkbutton_toggled(self, widget): + if self.ignore_events: + return + self.on_checkbutton_toggled(widget, 'autoreconnect', + account=self.current_account) + + def on_log_history_checkbutton_toggled(self, widget): + if self.ignore_events: + return + list_no_log_for = gajim.config.get_per('accounts', self.current_account, + 'no_log_for').split() + if self.current_account in list_no_log_for: + list_no_log_for.remove(self.current_account) + if not self.xml.get_widget('log_history_checkbutton').get_active(): + list_no_log_for.append(self.current_account) + gajim.config.set_per('accounts', self.current_account, 'no_log_for', + ' '.join(list_no_log_for)) + + def on_sync_with_global_status_checkbutton_toggled(self, widget): + if self.ignore_events: + return + self.on_checkbutton_toggled(widget, 'sync_with_global_status', + account=self.current_account) + + def on_use_ft_proxies_checkbutton1_toggled(self, widget): + if self.ignore_events: + return + self.on_checkbutton_toggled(widget, 'use_ft_proxies', + account=self.current_account) + + def on_proxies_combobox1_changed(self, widget): + active = widget.get_active() + proxy = widget.get_model()[active][0].decode('utf-8') + if proxy == _('None'): + proxy = '' + + if self.option_changed('proxy', proxy): + self.need_relogin = True + + gajim.config.set_per('accounts', self.current_account, 'proxy', proxy) + + def on_manage_proxies_button1_clicked(self, widget): + if gajim.interface.instances.has_key('manage_proxies'): + gajim.interface.instances['manage_proxies'].window.present() + else: + gajim.interface.instances['manage_proxies'] = ManageProxiesWindow() + + def on_use_ssl_checkbutton1_toggled(self, widget): + if self.ignore_events: + return + + if self.option_changed('usessl', widget.get_active()): + self.need_relogin = True + + isactive = widget.get_active() + if isactive: + self.xml.get_widget('custom_port_entry1').set_text('5223') + else: + self.xml.get_widget('custom_port_entry1').set_text('5222') + + self.on_checkbutton_toggled(widget, 'usessl', + account=self.current_account) + + def on_send_keepalive_checkbutton1_toggled(self, widget): + if self.ignore_events: + return + self.on_checkbutton_toggled(widget, 'keep_alives_enabled', + account=self.current_account) + + def on_custom_host_port_checkbutton1_toggled(self, widget): + if self.option_changed('use_custom_host', widget.get_active()): + self.need_relogin = True + + self.on_checkbutton_toggled(widget, 'use_custom_host', + account=self.current_account) + active = widget.get_active() + self.xml.get_widget('custom_host_port_hbox1').set_sensitive(active) + + def on_custom_host_entry1_changed(self, widget): + if self.ignore_events: + return + host = widget.get_text().decode('utf-8') + if self.option_changed('custom_host', host): + self.need_relogin = True + gajim.config.set_per('accounts', self.current_account, 'custom_host', + host) + + def on_custom_port_entry_focus_out_event(self, widget, event): + if self.ignore_events: + return + custom_port = widget.get_text() + try: + custom_port = int(custom_port) + except: + if not widget.is_focus(): + dialogs.ErrorDialog(_('Invalid entry'), + _('Custom port must be a port number.')) + gobject.idle_add(lambda: widget.grab_focus()) + return True + if self.option_changed('custom_port', custom_port): + self.need_relogin = True + gajim.config.set_per('accounts', self.current_account, 'custom_port', + custom_port) + + def on_gpg_choose_button_clicked(self, widget, data = None): + if gajim.connections.has_key(self.current_account): + secret_keys = gajim.connections[self.current_account].\ + ask_gpg_secrete_keys() + + # self.current_account is None and/or gajim.connections is {} + else: + from common import GnuPG + if GnuPG.USE_GPG: + secret_keys = GnuPG.GnuPG().get_secret_keys() else: - gajim.interface.instances[account]['account_modification'] = \ - AccountModificationWindow(account) + secret_keys = [] + if not secret_keys: + dialogs.ErrorDialog(_('Failed to get secret keys'), + _('There was a problem retrieving your OpenPGP secret keys.')) + return + secret_keys[_('None')] = _('None') + instance = dialogs.ChooseGPGKeyDialog(_('OpenPGP Key Selection'), + _('Choose your OpenPGP key'), secret_keys) + keyID = instance.run() + if keyID is None: + return + if self.current_account == gajim.ZEROCONF_ACC_NAME: + wiget_name_ext = '2' + else: + wiget_name_ext = '1' + checkbutton = self.xml.get_widget('gpg_save_password_checkbutton' + \ + wiget_name_ext) + gpg_key_label = self.xml.get_widget('gpg_key_label' + wiget_name_ext) + gpg_name_label = self.xml.get_widget('gpg_name_label' + wiget_name_ext) + gpg_password_entry = self.xml.get_widget('gpg_password_entry' + \ + wiget_name_ext) + if keyID[0] == _('None'): + gpg_key_label.set_text(_('No key selected')) + gpg_name_label.set_text('') + checkbutton.set_sensitive(False) + gpg_password_entry.set_sensitive(False) + if self.option_changed('keyid', ''): + self.need_relogin = True + gajim.config.set_per('accounts', self.current_account, 'keyname', '') + gajim.config.set_per('accounts', self.current_account, 'keyid', '') + else: + gpg_key_label.set_text(keyID[0]) + gpg_name_label.set_text(keyID[1]) + checkbutton.set_sensitive(True) + if self.option_changed('keyid', keyID[0]): + self.need_relogin = True + gajim.config.set_per('accounts', self.current_account, 'keyname', + keyID[1]) + gajim.config.set_per('accounts', self.current_account, 'keyid', + keyID[0]) + gajim.config.set_per('accounts', self.current_account, 'savegpgpass', + False) + gajim.config.set_per('accounts', self.current_account, 'gpgpassword', '') + checkbutton.set_active(False) + gpg_password_entry.set_text('') + + def on_gpg_save_password_checkbutton_toggled(self, widget): + if self.current_account == gajim.ZEROCONF_ACC_NAME: + wiget_name_ext = '2' + else: + wiget_name_ext = '1' + self.xml.get_widget('gpg_password_entry' + wiget_name_ext).set_sensitive( + widget.get_active()) + self.on_checkbutton_toggled(widget, 'savegpgpass', + account = self.current_account) + + def on_gpg_password_entry_changed(self, widget): + if self.ignore_events: + return + gajim.config.set_per('accounts', self.current_account, 'gpgpassword', + widget.get_text().decode('utf-8')) + + def on_edit_details_button1_clicked(self, widget): + if not gajim.interface.instances.has_key(self.current_account): + dialogs.ErrorDialog(_('No such account available'), + _('You must create your account before editing your personal ' + 'information.')) + return + + # show error dialog if account is newly created (not in gajim.connections) + if not gajim.connections.has_key(self.current_account) or \ + gajim.connections[self.current_account].connected < 2: + dialogs.ErrorDialog(_('You are not connected to the server'), + _('Without a connection, you can not edit your personal information.')) + return + + if not gajim.connections[self.current_account].vcard_supported: + dialogs.ErrorDialog(_("Your server doesn't support Vcard"), + _("Your server can't save your personal information.")) + return + + gajim.interface.edit_own_details(self.current_account) def on_checkbutton_toggled(self, widget, config_name, - change_sensitivity_widgets = None): - gajim.config.set(config_name, widget.get_active()) + change_sensitivity_widgets = None, account = None): + if account: + gajim.config.set_per('accounts', account, config_name, + widget.get_active()) + else: + gajim.config.set(config_name, widget.get_active()) if change_sensitivity_widgets: for w in change_sensitivity_widgets: w.set_sensitive(widget.get_active()) @@ -2004,8 +2153,7 @@ class AccountsWindow: gajim.interface.roster.regroup = False gajim.interface.roster.draw_roster() - - def on_enable_zeroconf_checkbutton_toggled(self, widget): + def on_enable_zeroconf_checkbutton2_toggled(self, widget): # don't do anything if there is an account with the local name but is a # normal account if gajim.connections.has_key(gajim.ZEROCONF_ACC_NAME) and not \ @@ -2014,19 +2162,17 @@ class AccountsWindow: (_('Account Local already exists.'), _('Please rename or remove it before enabling link-local messaging' '.'))) - widget.disconnect(self.zeroconf_toggled_id) - widget.set_active(False) - self.zeroconf_toggled_id = widget.connect('toggled', - self.on_enable_zeroconf_checkbutton_toggled) return - if gajim.config.get('enable_zeroconf'): - #disable + if gajim.config.get('enable_zeroconf') and not widget.get_active(): + self.xml.get_widget('zeroconf_notebook').set_sensitive(False) + # disable gajim.interface.roster.close_all(gajim.ZEROCONF_ACC_NAME) gajim.connections[gajim.ZEROCONF_ACC_NAME].disable_account() del gajim.connections[gajim.ZEROCONF_ACC_NAME] gajim.interface.save_config() del gajim.interface.instances[gajim.ZEROCONF_ACC_NAME] + del gajim.interface.minimized_controls[gajim.ZEROCONF_ACC_NAME] del gajim.nicks[gajim.ZEROCONF_ACC_NAME] del gajim.block_signed_in_notifications[gajim.ZEROCONF_ACC_NAME] del gajim.groups[gajim.ZEROCONF_ACC_NAME] @@ -2047,16 +2193,16 @@ class AccountsWindow: gajim.interface.roster.regroup = False gajim.interface.roster.draw_roster() gajim.interface.roster.actions_menu_needs_rebuild = True - if gajim.interface.instances.has_key('accounts'): - gajim.interface.instances['accounts'].init_accounts() - - else: + + elif not gajim.config.get('enable_zeroconf') and widget.get_active(): + self.xml.get_widget('zeroconf_notebook').set_sensitive(True) # enable (will create new account if not present) gajim.connections[gajim.ZEROCONF_ACC_NAME] = common.zeroconf.\ connection_zeroconf.ConnectionZeroconf(gajim.ZEROCONF_ACC_NAME) # update variables gajim.interface.instances[gajim.ZEROCONF_ACC_NAME] = {'infos': {}, 'disco': {}, 'gc_config': {}, 'search': {}} + gajim.interface.minimized_controls[gajim.ZEROCONF_ACC_NAME] = {} gajim.connections[gajim.ZEROCONF_ACC_NAME].connected = 0 gajim.groups[gajim.ZEROCONF_ACC_NAME] = {} gajim.contacts.add_account(gajim.ZEROCONF_ACC_NAME) @@ -2071,9 +2217,6 @@ class AccountsWindow: gajim.last_message_time[gajim.ZEROCONF_ACC_NAME] = {} gajim.status_before_autoaway[gajim.ZEROCONF_ACC_NAME] = '' gajim.transport_avatar[gajim.ZEROCONF_ACC_NAME] = {} - # refresh accounts window - if gajim.interface.instances.has_key('accounts'): - gajim.interface.instances['accounts'].init_accounts() # refresh roster if len(gajim.connections) >= 2: # Do not merge accounts if only one exists @@ -2083,10 +2226,53 @@ class AccountsWindow: gajim.interface.roster.draw_roster() gajim.interface.roster.actions_menu_needs_rebuild = True gajim.interface.save_config() - gajim.connections[gajim.ZEROCONF_ACC_NAME].change_status('online', '') self.on_checkbutton_toggled(widget, 'enable_zeroconf') + def on_custom_port_checkbutton2_toggled(self, widget): + self.xml.get_widget('custom_port_entry2').set_sensitive( + widget.get_active()) + self.on_checkbutton_toggled(widget, 'use_custom_host', + account = self.current_account) + if not widget.get_active(): + self.xml.get_widget('custom_port_entry2').set_text('5298') + + def on_first_name_entry2_changed(self, widget): + if self.ignore_events: + return + name = widget.get_text().decode('utf-8') + if self.option_changed('zeroconf_first_name', name): + self.need_relogin = True + gajim.config.set_per('accounts', self.current_account, + 'zeroconf_first_name', name) + + def on_last_name_entry2_changed(self, widget): + if self.ignore_events: + return + name = widget.get_text().decode('utf-8') + if self.option_changed('zeroconf_last_name', name): + self.need_relogin = True + gajim.config.set_per('accounts', self.current_account, + 'zeroconf_last_name', name) + + def on_jabber_id_entry2_changed(self, widget): + if self.ignore_events: + return + id = widget.get_text().decode('utf-8') + if self.option_changed('zeroconf_jabber_id', id): + self.need_relogin = True + gajim.config.set_per('accounts', self.current_account, + 'zeroconf_jabber_id', id) + + def on_email_entry2_changed(self, widget): + if self.ignore_events: + return + email = widget.get_text().decode('utf-8') + if self.option_changed('zeroconf_email', email): + self.need_relogin = True + gajim.config.set_per('accounts', self.current_account, + 'zeroconf_email', email) + class FakeDataForm(gtk.Table, object): '''Class for forms that are in XML format value1 infos in a table {entry1: value1, }''' @@ -2449,6 +2635,7 @@ class RemoveAccountWindow: gajim.config.del_per('accounts', self.account) gajim.interface.save_config() del gajim.interface.instances[self.account] + del gajim.interface.minimized_controls[self.account] del gajim.nicks[self.account] del gajim.block_signed_in_notifications[self.account] del gajim.groups[self.account] @@ -2479,8 +2666,9 @@ class ManageBookmarksWindow: self.window = self.xml.get_widget('manage_bookmarks_window') self.window.set_transient_for(gajim.interface.roster.window) - # Account-JID, RoomName, Room-JID, Autojoin, Passowrd, Nick, Show_Status - self.treestore = gtk.TreeStore(str, str, str, bool, str, str, str) + # Account-JID, RoomName, Room-JID, Autojoin, Minimize, Passowrd, Nick, + # Show_Status + self.treestore = gtk.TreeStore(str, str, str, bool, bool, str, str, str) # Store bookmarks in treeview. for account in gajim.connections: @@ -2488,7 +2676,7 @@ class ManageBookmarksWindow: continue if gajim.connections[account].is_zeroconf: continue - iter = self.treestore.append(None, [None, account,None, + iter = self.treestore.append(None, [None, account, None, None, None, None, None, None]) for bookmark in gajim.connections[account].bookmarks: @@ -2502,6 +2690,9 @@ class ManageBookmarksWindow: autojoin = helpers.from_xs_boolean_to_python_boolean( bookmark['autojoin']) + minimize = helpers.from_xs_boolean_to_python_boolean( + bookmark['minimize']) + print_status = bookmark.get('print_status', '') if print_status not in ('', 'all', 'in_and_out', 'none'): print_status = '' @@ -2510,6 +2701,7 @@ class ManageBookmarksWindow: bookmark['name'], bookmark['jid'], autojoin, + minimize, bookmark['password'], bookmark['nick'], print_status ]) @@ -2551,6 +2743,7 @@ class ManageBookmarksWindow: self.pass_entry = self.xml.get_widget('pass_entry') self.pass_entry.connect('changed', self.on_pass_entry_changed) self.autojoin_checkbutton = self.xml.get_widget('autojoin_checkbutton') + self.minimize_checkbutton = self.xml.get_widget('minimize_checkbutton') self.xml.signal_autoconnect(self) self.window.show_all() @@ -2588,10 +2781,10 @@ class ManageBookmarksWindow: account = model[add_to][1].decode('utf-8') nick = gajim.nicks[account] iter_ = self.treestore.append(add_to, [account, _('New Group Chat'), '', - False, '', nick, 'in_and_out']) - self.view.set_cursor(model.get_path(iter_)) + False, False, '', nick, 'in_and_out']) self.view.expand_row(model.get_path(add_to), True) + self.view.set_cursor(model.get_path(iter_)) def on_remove_bookmark_button_clicked(self, widget): ''' @@ -2645,10 +2838,12 @@ class ManageBookmarksWindow: for bm in account.iterchildren(): #Convert True/False/None to '1' or '0' autojoin = unicode(int(bm[3])) + minimize = unicode(int(bm[4])) #create the bookmark-dict bmdict = { 'name': bm[1], 'jid': bm[2], 'autojoin': autojoin, - 'password': bm[4], 'nick': bm[5], 'print_status': bm[6]} + 'minimize': minimize, 'password': bm[5], 'nick': bm[6], + 'print_status': bm[7]} gajim.connections[account_unicode].bookmarks.append(bmdict) @@ -2672,7 +2867,7 @@ class ManageBookmarksWindow: widgets = [ self.title_entry, self.nick_entry, self.room_entry, self.server_entry, self.pass_entry, self.autojoin_checkbutton, - self.print_status_combobox] + self.minimize_checkbutton, self.print_status_combobox] if model.iter_parent(iter): # make the fields sensitive @@ -2699,8 +2894,12 @@ class ManageBookmarksWindow: self.server_entry.set_text(server) self.autojoin_checkbutton.set_active(model[iter][3]) - if model[iter][4] is not None: - password = model[iter][4].decode('utf-8') + self.minimize_checkbutton.set_active(model[iter][4]) + # sensitive only if auto join is checked + self.minimize_checkbutton.set_sensitive(model[iter][3]) + + if model[iter][5] is not None: + password = model[iter][5].decode('utf-8') else: password = None @@ -2708,14 +2907,14 @@ class ManageBookmarksWindow: self.pass_entry.set_text(password) else: self.pass_entry.set_text('') - nick = model[iter][5] + nick = model[iter][6] if nick: nick = nick.decode('utf-8') self.nick_entry.set_text(nick) else: self.nick_entry.set_text('') - print_status = model[iter][6] + print_status = model[iter][7] opts = self.option_list.keys() opts.sort() self.print_status_combobox.set_active(opts.index(print_status)) @@ -2730,7 +2929,7 @@ class ManageBookmarksWindow: def on_nick_entry_changed(self, widget): (model, iter) = self.selection.get_selected() if iter: - model[iter][5] = self.nick_entry.get_text() + model[iter][6] = self.nick_entry.get_text() def on_server_entry_changed(self, widget): (model, iter) = self.selection.get_selected() @@ -2749,12 +2948,18 @@ class ManageBookmarksWindow: def on_pass_entry_changed(self, widget): (model, iter) = self.selection.get_selected() if iter: - model[iter][4] = self.pass_entry.get_text() + model[iter][5] = self.pass_entry.get_text() def on_autojoin_checkbutton_toggled(self, widget): (model, iter) = self.selection.get_selected() if iter: model[iter][3] = self.autojoin_checkbutton.get_active() + self.minimize_checkbutton.set_sensitive(model[iter][3]) + + def on_minimize_checkbutton_toggled(self, widget): + (model, iter) = self.selection.get_selected() + if iter: + model[iter][4] = self.minimize_checkbutton.get_active() def on_print_status_combobox_changed(self, widget): active = widget.get_active() @@ -2762,7 +2967,7 @@ class ManageBookmarksWindow: print_status = model[active][1] (model2, iter) = self.selection.get_selected() if iter: - model2[iter][6] = print_status + model2[iter][7] = print_status def clear_fields(self): widgets = [ self.title_entry, self.nick_entry, self.room_entry, @@ -2770,6 +2975,7 @@ class ManageBookmarksWindow: for field in widgets: field.set_text('') self.autojoin_checkbutton.set_active(False) + self.minimize_checkbutton.set_active(False) self.print_status_combobox.set_active(1) class AccountCreationWizardWindow: @@ -2829,8 +3035,6 @@ class AccountCreationWizardWindow: self.update_progressbar_timeout_id = None self.notebook.set_current_page(0) - self.advanced_button.set_no_show_all(True) - self.finish_button.set_no_show_all(True) self.xml.signal_autoconnect(self) self.window.show_all() @@ -2842,7 +3046,7 @@ class AccountCreationWizardWindow: 'http://www.jabber.org/network/oldnetwork.shtml') def on_save_password_checkbutton_toggled(self, widget): - self.xml.get_widget('pass1_entry').grab_focus() + self.xml.get_widget('password_entry').grab_focus() def on_cancel_button_clicked(self, widget): self.window.destroy() @@ -3099,8 +3303,12 @@ class AccountCreationWizardWindow: gobject.source_remove(self.update_progressbar_timeout_id) def on_advanced_button_clicked(self, widget): - gajim.interface.instances[self.account]['account_modification'] = \ - AccountModificationWindow(self.account) + if gajim.interface.instances.has_key('accounts'): + gajim.interface.instances['accounts'].window.present() + else: + gajim.interface.instances['accounts'] = AccountsWindow() + gajim.interface.instances['accounts'].select_account( + self.account) self.window.destroy() def on_finish_button_clicked(self, widget): @@ -3198,6 +3406,7 @@ class AccountCreationWizardWindow: # update variables gajim.interface.instances[self.account] = {'infos': {}, 'disco': {}, 'gc_config': {}, 'search': {}} + gajim.interface.minimized_controls[self.account] = {} gajim.connections[self.account].connected = 0 gajim.groups[self.account] = {} gajim.contacts.add_account(self.account) diff --git a/src/conversation_textview.py b/src/conversation_textview.py index d3ac1e875..f4e06e1bb 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -26,6 +26,7 @@ import os import tooltips import dialogs import locale +import Queue import gtkgui_helpers from common import gajim @@ -141,9 +142,14 @@ class ConversationTextview: buffer.create_tag('focus-out-line', justification = gtk.JUSTIFY_CENTER) + # One mark at the begining then 2 marks between each lines + size = gajim.config.get('max_conversation_lines') + size = 2 * size - 1 + self.marks_queue = Queue.Queue(size) + self.allow_focus_out_line = True - # holds the iter's offset which points to the end of --- line - self.focus_out_end_iter_offset = None + # holds a mark at the end of --- line + self.focus_out_end_mark = None self.line_tooltip = tooltips.BaseTooltip() # use it for hr too @@ -213,13 +219,14 @@ class ConversationTextview: print_focus_out_line = False buffer = self.tv.get_buffer() - if self.focus_out_end_iter_offset is None: + if self.focus_out_end_mark is None: # this happens only first time we focus out on this room print_focus_out_line = True else: - if self.focus_out_end_iter_offset != buffer.get_end_iter().\ - get_offset(): + focus_out_end_iter = buffer.get_iter_at_mark(self.focus_out_end_mark) + focus_out_end_iter_offset = focus_out_end_iter.get_offset() + if focus_out_end_iter_offset != buffer.get_end_iter().get_offset(): # this means after last-focus something was printed # (else end_iter's offset is the same as before) # only then print ---- line (eg. we avoid printing many following @@ -230,9 +237,9 @@ class ConversationTextview: buffer.begin_user_action() # remove previous focus out line if such focus out line exists - if self.focus_out_end_iter_offset is not None: - end_iter_for_previous_line = buffer.get_iter_at_offset( - self.focus_out_end_iter_offset) + if self.focus_out_end_mark is not None: + end_iter_for_previous_line = buffer.get_iter_at_mark( + self.focus_out_end_mark) begin_iter_for_previous_line = end_iter_for_previous_line.copy() # img_char+1 (the '\n') begin_iter_for_previous_line.backward_chars(2) @@ -240,6 +247,7 @@ class ConversationTextview: # remove focus out line buffer.delete(begin_iter_for_previous_line, end_iter_for_previous_line) + buffer.delete_mark(self.focus_out_end_mark) # add the new focus out line end_iter = buffer.get_end_iter() @@ -255,7 +263,8 @@ class ConversationTextview: self.allow_focus_out_line = False # update the iter we hold to make comparison the next time - self.focus_out_end_iter_offset = buffer.get_end_iter().get_offset() + self.focus_out_end_mark = buffer.create_mark(None, + buffer.get_end_iter(), left_gravity=True) buffer.end_user_action() @@ -315,7 +324,10 @@ class ConversationTextview: buffer = self.tv.get_buffer() start, end = buffer.get_bounds() buffer.delete(start, end) - self.focus_out_end_iter_offset = None + size = gajim.config.get('max_conversation_lines') + size = 2 * size - 1 + self.marks_queue = Queue.Queue(size) + self.focus_out_end_mark = None def visit_url_from_menuitem(self, widget, link): '''basically it filters out the widget instance''' @@ -767,13 +779,29 @@ class ConversationTextview: '''prints 'chat' type messages''' buffer = self.tv.get_buffer() buffer.begin_user_action() + if self.marks_queue.full(): + # remove oldest line + m1 = self.marks_queue.get() + m2 = self.marks_queue.get() + i1 = buffer.get_iter_at_mark(m1) + i2 = buffer.get_iter_at_mark(m2) + buffer.delete(i1, i2) + buffer.delete_mark(m1) end_iter = buffer.get_end_iter() at_the_end = False if self.at_the_end(): at_the_end = True + # Create one mark and add it to queue once if it's the first line + # else twice (one for end bound, one for start bound) + mark = None if buffer.get_char_count() > 0: buffer.insert_with_tags_by_name(end_iter, '\n', 'eol') + mark = buffer.create_mark(None, end_iter, left_gravity=True) + self.marks_queue.put(mark) + if not mark: + mark = buffer.create_mark(None, end_iter, left_gravity=True) + self.marks_queue.put(mark) if kind == 'incoming_queue': kind = 'incoming' if old_kind == 'incoming_queue': diff --git a/src/dialogs.py b/src/dialogs.py index 4d7cc0a3c..c264adbcd 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -8,6 +8,7 @@ ## Copyright (C) 2005-2006 Travis Shirk ## Copyright (C) 2005 Norman Rasmussen ## Copyright (C) 2007 Lukas Petrovicky +## Copyright (C) 2007 Julien Pivotto ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published @@ -115,7 +116,7 @@ class EditGroupsDialog: if not gajim.interface.roster.regroup and _account != account: continue for _jid in all_jid[_account]: - contacts = gajim.contacts.get_contact(_account, _jid) + contacts = gajim.contacts.get_contacts(_account, _jid) for c in contacts: if group in c.groups: c.groups.remove(group) @@ -133,7 +134,7 @@ class EditGroupsDialog: if not gajim.interface.roster.regroup and _account != account: continue for _jid in all_jid[_account]: - contacts = gajim.contacts.get_contact(_account, _jid) + contacts = gajim.contacts.get_contacts(_account, _jid) for c in contacts: if not group in c.groups: c.groups.append(group) @@ -547,13 +548,20 @@ class ChangeStatusMessageDialog: if not msg_name: # msg_name was '' msg_name = msg_text_1l msg_name = msg_name.decode('utf-8') - iter_ = self.message_liststore.append((msg_name,)) - gajim.config.add_per('statusmsg', msg_name) + if msg_name in self.preset_messages_dict: + dlg2 = ConfirmationDialog(_('Overwrite Status Message?'), + _('This name is already used. Do you want to overwrite this status message?')) + resp = dlg2.run() + if resp != gtk.RESPONSE_OK: + return + else: + iter_ = self.message_liststore.append((msg_name,)) + gajim.config.add_per('statusmsg', msg_name) + # select in combobox the one we just saved + self.message_combobox.set_active_iter(iter_) gajim.config.set_per('statusmsg', msg_name, 'message', msg_text_1l) self.preset_messages_dict[msg_name] = msg_text - # select in combobox the one we just saved - self.message_combobox.set_active_iter(iter_) class AddNewContactWindow: @@ -610,6 +618,8 @@ _('Please fill in the data of the contact you want to add in account %s') %accou for j in gajim.contacts.get_jid_list(acct): if gajim.jid_is_transport(j): type_ = gajim.get_transport_name_from_jid(j, False) + if not type_: + continue if self.agents.has_key(type_): self.agents[type_].append(j) else: @@ -625,30 +635,37 @@ _('Please fill in the data of the contact you want to add in account %s') %accou self.agents[type_].append(jid_) self.available_types.append(type_) liststore = gtk.ListStore(str) - self.group_comboboxentry.set_model(liststore) - liststore = gtk.ListStore(str, str) + self.group_comboboxentry.set_model(liststore) + # Combobox with transport/jabber icons + liststore = gtk.ListStore(str, gtk.gdk.Pixbuf, str) + cell = gtk.CellRendererPixbuf() + self.protocol_combobox.pack_start(cell, False) + self.protocol_combobox.add_attribute(cell, 'pixbuf', 1) + cell = gtk.CellRendererText() + cell.set_property('xpad', 5) + self.protocol_combobox.pack_start(cell, True) + self.protocol_combobox.add_attribute(cell, 'text', 0) + self.protocol_combobox.set_model(liststore) uf_type = {'jabber': 'Jabber', 'aim': 'AIM', 'gadu-gadu': 'Gadu Gadu', 'icq': 'ICQ', 'msn': 'MSN', 'yahoo': 'Yahoo'} # Jabber as first - liststore.append(['Jabber', 'jabber']) + img = gajim.interface.roster.jabber_state_images['16']['online'] + liststore.append(['Jabber', img.get_pixbuf(), 'jabber']) for type_ in self.agents: if type_ == 'jabber': continue - if type_ in uf_type: - liststore.append([uf_type[type_], type_]) + imgs = gajim.interface.roster.transports_state_images + img = None + if imgs['16'].has_key(type_) and imgs['16'][type_].has_key('online'): + img = imgs['16'][type_]['online'] + if type_ in uf_type: + liststore.append([uf_type[type_], img.get_pixbuf(), type_]) + else: + liststore.append([type_, img.get_pixbuf(), type_]) else: - liststore.append([type_, type_]) - self.protocol_combobox.set_model(liststore) + liststore.append([type_, img, type_]) self.protocol_combobox.set_active(0) - self.protocol_jid_combobox.set_no_show_all(True) - self.protocol_jid_combobox.hide() - self.subscription_table.set_no_show_all(True) self.auto_authorize_checkbutton.show() - self.message_scrolledwindow.set_no_show_all(True) - self.register_hbox.set_no_show_all(True) - self.register_hbox.hide() - self.connected_label.set_no_show_all(True) - self.connected_label.hide() liststore = gtk.ListStore(str) self.protocol_jid_combobox.set_model(liststore) self.xml.signal_autoconnect(self) @@ -666,7 +683,7 @@ _('Please fill in the data of the contact you want to add in account %s') %accou iter = model.get_iter_first() i = 0 while iter: - if model[iter][1] == type_: + if model[iter][2] == type_: self.protocol_combobox.set_active(i) break iter = model.iter_next(iter) @@ -741,7 +758,7 @@ _('Please fill in the data of the contact you want to add in account %s') %accou model = self.protocol_combobox.get_model() iter = self.protocol_combobox.get_active_iter() - type_ = model[iter][1] + type_ = model[iter][2] if type_ != 'jabber': transport = self.protocol_jid_combobox.get_active_text().decode( 'utf-8') @@ -795,7 +812,7 @@ _('Please fill in the data of the contact you want to add in account %s') %accou def on_protocol_combobox_changed(self, widget): model = widget.get_model() iter = widget.get_active_iter() - type_ = model[iter][1] + type_ = model[iter][2] model = self.protocol_jid_combobox.get_model() model.clear() if len(self.agents[type_]): @@ -1192,6 +1209,7 @@ class InputDialog: def on_okbutton_clicked(self, widget): user_input = self.input_entry.get_text().decode('utf-8') + self.cancel_handler = None self.dialog.destroy() if isinstance(self.ok_handler, tuple): self.ok_handler[0](user_input, *self.ok_handler[1:]) @@ -1327,7 +1345,8 @@ class SubscriptionRequestWindow: class JoinGroupchatWindow: - def __init__(self, account, room_jid = '', nick = '', automatic = False): + def __init__(self, account, 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''' @@ -1351,9 +1370,12 @@ class JoinGroupchatWindow: self.window = self.xml.get_widget('join_groupchat_window') self._room_jid_entry = self.xml.get_widget('room_jid_entry') self._nickname_entry = self.xml.get_widget('nickname_entry') + self._password_entry = self.xml.get_widget('password_entry') self._room_jid_entry.set_text(room_jid) self._nickname_entry.set_text(nick) + if password: + self._password_entry.set_text(password) self.xml.signal_autoconnect(self) gajim.interface.instances[account]['join_gc'] = self #now add us to open windows if len(gajim.connections) > 1: @@ -1421,8 +1443,7 @@ class JoinGroupchatWindow: '''When Join button is clicked''' nickname = self._nickname_entry.get_text().decode('utf-8') room_jid = self._room_jid_entry.get_text().decode('utf-8') - password = self.xml.get_widget('password_entry').get_text().decode( - 'utf-8') + password = self._password_entry.get_text().decode('utf-8') user, server, resource = helpers.decompose_jid(room_jid) if not user or not server or resource: ErrorDialog(_('Invalid group chat Jabber ID'), @@ -1460,7 +1481,7 @@ class JoinGroupchatWindow: if not room_jid_bookmarked: name = gajim.get_nick_from_jid(room_jid) bmdict = { 'name': name, 'jid': room_jid, 'autojoin': u'1', - 'password': password, 'nick': nickname, + 'minimize': '0', 'password': password, 'nick': nickname, 'print_status': gajim.config.get('print_status_in_muc')} gajim.connections[self.account].bookmarks.append(bmdict) @@ -1858,17 +1879,6 @@ class SingleMessageWindow: spell2.set_language(lang) except gobject.GError, msg: dialogs.AspellDictError(lang) - self.send_button.set_no_show_all(True) - self.reply_button.set_no_show_all(True) - self.send_and_close_button.set_no_show_all(True) - self.to_label.set_no_show_all(True) - self.to_entry.set_no_show_all(True) - self.from_label.set_no_show_all(True) - self.from_entry.set_no_show_all(True) - self.close_button.set_no_show_all(True) - self.cancel_button.set_no_show_all(True) - self.message_scrolledwindow.set_no_show_all(True) - self.conversation_scrolledwindow.set_no_show_all(True) self.prepare_widgets_for(self.action) @@ -2217,7 +2227,7 @@ class PrivacyListWindow: jid_entry_completion.set_text_column(0) jid_entry_completion.set_model(jids_list_store) jid_entry_completion.set_popup_completion(True) - self.edit_type_jabberid_entry.set_completion(jid_entry_completion) + self.edit_type_jabberid_entry.set_completion(jid_entry_completion) if action == 'EDIT': self.refresh_rules() @@ -2231,7 +2241,6 @@ class PrivacyListWindow: self.window.set_title(title) - self.add_edit_vbox.set_no_show_all(True) self.window.show_all() self.add_edit_vbox.hide() @@ -2683,6 +2692,7 @@ class InvitationReceivedDialog: self.room_jid = room_jid self.account = account + self.password = password xml = gtkgui_helpers.get_glade('invitation_received_dialog.glade') self.dialog = xml.get_widget('invitation_received_dialog') @@ -2716,7 +2726,8 @@ class InvitationReceivedDialog: def on_accept_button_clicked(self, widget): self.dialog.destroy() try: - JoinGroupchatWindow(self.account, self.room_jid) + JoinGroupchatWindow(self.account, self.room_jid, + password=self.password) except GajimGeneralException: pass @@ -2796,7 +2807,10 @@ class ImageChooserDialog(FileChooserDialog): path_to_file = gtkgui_helpers.decode_filechooser_file_paths( (path_to_file,))[0] if os.path.exists(path_to_file): - callback(widget, path_to_file) + if isinstance(callback, tuple): + callback[0](widget, path_to_file, *callback[1:]) + else: + callback(widget, path_to_file) try: if os.name == 'nt': @@ -2856,12 +2870,19 @@ class AvatarChooserDialog(ImageChooserDialog): ImageChooserDialog.__init__(self, path_to_file, on_response_ok, on_response_cancel) button = gtk.Button(None, gtk.STOCK_CLEAR) + self.response_clear = on_response_clear if on_response_clear: - button.connect('clicked', on_response_clear) + button.connect('clicked', self.on_clear) button.show_all() self.action_area.pack_start(button) self.action_area.reorder_child(button, 0) + def on_clear(self, widget): + if isinstance(self.response_clear, tuple): + self.response_clear[0](widget, *self.response_clear[1:]) + else: + self.response_clear(widget) + class AddSpecialNotificationDialog: def __init__(self, jid): '''jid is the jid for which we want to add special notification @@ -2983,9 +3004,6 @@ class AdvancedNotificationsWindow: self.delete_button.set_sensitive(False) self.down_button.set_sensitive(False) self.up_button.set_sensitive(False) - self.recipient_list_entry.set_no_show_all(True) - for st in ['online', 'away', 'xa', 'dnd', 'invisible']: - self.__dict__[st + '_cb'].set_no_show_all(True) self.window.show_all() diff --git a/src/disco.py b/src/disco.py index 33b217efd..7446447e5 100644 --- a/src/disco.py +++ b/src/disco.py @@ -76,7 +76,7 @@ def _gen_agent_type_info(): ('_jid', 'weather'): (False, 'weather.png'), ('gateway', 'sip'): (False, 'sip.png'), ('directory', 'user'): (None, 'jud.png'), - ('pubsub', 'generic'): (None, 'pubsub.png'), + ('pubsub', 'generic'): (PubSubBrowser, 'pubsub.png'), ('pubsub', 'service'): (PubSubBrowser, 'pubsub.png'), ('proxy', 'bytestreams'): (None, 'bytestreams.png'), # Socks5 FT proxy @@ -438,8 +438,6 @@ _('Without a connection, you can not browse available services')) self.on_services_treeview_selection_changed) self.services_scrollwin = self.xml.get_widget('services_scrollwin') self.progressbar = self.xml.get_widget('services_progressbar') - self.progressbar.set_no_show_all(True) - self.progressbar.hide() self.banner = self.xml.get_widget('banner_agent_label') self.banner_icon = self.xml.get_widget('banner_agent_icon') self.banner_eventbox = self.xml.get_widget('banner_agent_eventbox') @@ -447,8 +445,6 @@ _('Without a connection, you can not browse available services')) self.banner.realize() self.paint_banner() self.filter_hbox = self.xml.get_widget('filter_hbox') - self.filter_hbox.set_no_show_all(True) - self.filter_hbox.hide() self.action_buttonbox = self.xml.get_widget('action_buttonbox') # Address combobox @@ -1047,7 +1043,7 @@ class ToplevelAgentBrowser(AgentBrowser): # as it was before setting the timeout if props and self.tooltip.id == props[0]: # bounding rectangle of coordinates for the cell within the treeview - rect = view.get_cell_area(props[0], props[1]) + rect = view.get_cell_area(props[0], props[1]) # position of the treeview on the screen position = view.window.get_origin() self.tooltip.show_tooltip(state, rect.height, position[1] + rect.y) @@ -1554,10 +1550,10 @@ class MucBrowser(AgentBrowser): self.join_button = None def _create_treemodel(self): - # JID, node, name, users, description, fetched + # JID, node, name, users_int, users_str, description, fetched # This is rather long, I'd rather not use a data_func here though. # Users is a string, because want to be able to leave it empty. - self.model = gtk.ListStore(str, str, str, str, str, bool) + self.model = gtk.ListStore(str, str, str, int, str, str, bool) self.model.set_sort_column_id(2, gtk.SORT_ASCENDING) self.window.services_treeview.set_model(self.model) # Name column @@ -1567,20 +1563,23 @@ class MucBrowser(AgentBrowser): renderer = gtk.CellRendererText() col.pack_start(renderer) col.set_attributes(renderer, text = 2) + col.set_sort_column_id(2) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) # Users column col = gtk.TreeViewColumn(_('Users')) renderer = gtk.CellRendererText() col.pack_start(renderer) - col.set_attributes(renderer, text = 3) + col.set_attributes(renderer, text = 4) + col.set_sort_column_id(3) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) # Description column col = gtk.TreeViewColumn(_('Description')) renderer = gtk.CellRendererText() col.pack_start(renderer) - col.set_attributes(renderer, text = 4) + col.set_attributes(renderer, text = 5) + col.set_sort_column_id(4) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) # Id column @@ -1588,9 +1587,11 @@ class MucBrowser(AgentBrowser): renderer = gtk.CellRendererText() col.pack_start(renderer) col.set_attributes(renderer, text = 0) + col.set_sort_column_id(0) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) self.window.services_treeview.set_headers_visible(True) + self.window.services_treeview.set_headers_clickable(True) # Source id for idle callback used to start disco#info queries. self._fetch_source = None # Query failure counter @@ -1692,7 +1693,7 @@ class MucBrowser(AgentBrowser): # We're at the end of the model, we can leave end=None though. pass while iter and self.model.get_path(iter) != end: - if not self.model.get_value(iter, 5): + if not self.model.get_value(iter, 6): jid = self.model.get_value(iter, 0).decode('utf-8') node = self.model.get_value(iter, 1).decode('utf-8') self.cache.get_info(jid, node, self._agent_info) @@ -1723,13 +1724,14 @@ class MucBrowser(AgentBrowser): if iter: if name: self.model[iter][2] = name - self.model[iter][3] = len(items) # The number of users - self.model[iter][5] = True + self.model[iter][3] = len(items) # The number of users + self.model[iter][4] = str(len(items)) # The number of users + self.model[iter][6] = True self._fetch_source = None self._query_visible() def _add_item(self, jid, node, item, force): - self.model.append((jid, node, item.get('name', ''), '', '', False)) + self.model.append((jid, node, item.get('name', ''), -1, '', '', False)) if not self._fetch_source: self._fetch_source = gobject.idle_add(self._start_info_query) @@ -1743,14 +1745,15 @@ class MucBrowser(AgentBrowser): users = form.getField('muc#roominfo_occupants') descr = form.getField('muc#roominfo_description') if users: - self.model[iter][3] = users.getValue() + self.model[iter][3] = int(users.getValue()) + self.model[iter][4] = users.getValue() if descr: - self.model[iter][4] = descr.getValue() + self.model[iter][5] = descr.getValue() # Only set these when we find a form with additional info # Some servers don't support forms and put extra info in # the name attribute, so we preserve it in that case. self.model[iter][2] = name - self.model[iter][5] = True + self.model[iter][6] = True break else: # We didn't find a form, switch to alternate query mode @@ -1791,8 +1794,9 @@ class DiscussionGroupsBrowser(AgentBrowser): def _create_treemodel(self): ''' Create treemodel for the window. ''' # JID, node, name (with description) - pango markup, dont have info?, subscribed? - self.model = gtk.ListStore(str, str, str, bool, bool) - self.model.set_sort_column_id(3, gtk.SORT_ASCENDING) + self.model = gtk.TreeStore(str, str, str, bool, bool) + # sort by name + self.model.set_sort_column_id(2, gtk.SORT_ASCENDING) self.window.services_treeview.set_model(self.model) # Name column @@ -1804,6 +1808,7 @@ class DiscussionGroupsBrowser(AgentBrowser): col.set_attributes(renderer, markup=2) col.set_resizable(True) self.window.services_treeview.insert_column(col, -1) + self.window.services_treeview.set_headers_visible(True) # Subscription state renderer = gtk.CellRendererToggle() @@ -1813,7 +1818,29 @@ class DiscussionGroupsBrowser(AgentBrowser): col.set_resizable(False) self.window.services_treeview.insert_column(col, -1) - self.window.services_treeview.set_headers_visible(True) + # Node Column + renderer = gtk.CellRendererText() + col = gtk.TreeViewColumn(_('Node')) + col.pack_start(renderer) + col.set_attributes(renderer, markup=1) + col.set_resizable(True) + self.window.services_treeview.insert_column(col, -1) + + def _add_items(self, jid, node, items, force): + for item in items: + jid = item['jid'] + node = item.get('node', '') + self._total_items += 1 + self._add_item(jid, node, item, force) + + def _in_list_foreach(self, model, path, iter, node): + if model[path][1] == node: + self.in_list = True + + def _in_list(self, node): + self.in_list = False + self.model.foreach(self._in_list_foreach, node) + return self.in_list def _add_item(self, jid, node, item, force): ''' Called when we got basic information about new node from query. @@ -1830,7 +1857,24 @@ class DiscussionGroupsBrowser(AgentBrowser): name = gobject.markup_escape_text(name) name = '%s' % name - self.model.append((jid, node, name, dunno, subscribed)) + node_splitted = node.split('/') + parent_iter = None + while len(node_splitted) > 1: + parent_node = node_splitted.pop(0) + parent_iter = self._get_child_iter(parent_iter, parent_node) + node_splitted[0] = parent_node + '/' + node_splitted[0] + if not self._in_list(node): + self.model.append(parent_iter, (jid, node, name, dunno, subscribed)) + self.cache.get_items(jid, node, self._add_items, force = force, + args = (force,)) + + def _get_child_iter(self, parent_iter, node): + child_iter = self.model.iter_children(parent_iter) + while child_iter: + if self.model[child_iter][1] == node: + return child_iter + child_iter = self.model.iter_next(child_iter) + return None def _add_actions(self): self.post_button = gtk.Button(label=_('New post'), use_underline=True) @@ -1905,7 +1949,7 @@ class DiscussionGroupsBrowser(AgentBrowser): model, iter = self.window.services_treeview.get_selection().get_selected() if iter is None: return - groupnode = model.get_value(iter, 1) # 1 = groupnode + groupnode = model.get_value(iter, 1) # 1 = groupnode gajim.connections[self.account].send_pb_unsubscribe(self.jid, groupnode, self._unsubscribeCB, groupnode) diff --git a/src/features_window.py b/src/features_window.py new file mode 100644 index 000000000..f0f7c061b --- /dev/null +++ b/src/features_window.py @@ -0,0 +1,276 @@ +## features_window.py +## +## Copyright (C) 2007 Yann Le Boulanger +## +## 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. +## + +import os +import gtk +import gobject +import gtkgui_helpers + +import dialogs + +from common import gajim +from common import helpers + +import random +from tempfile import gettempdir +from subprocess import Popen + +class FeaturesWindow: + '''Class for features window''' + + def __init__(self): + self.xml = gtkgui_helpers.get_glade('features_window.glade') + self.window = self.xml.get_widget('features_window') + treeview = self.xml.get_widget('features_treeview') + self.desc_label = self.xml.get_widget('feature_desc_label') + + # {name: (available_function, unix_text, windows_text)} + self.features = { + _('PyOpenSSL'): (self.pyopenssl_available, + _('A library used to validate server certificates to ensure a secure connection.'), + _('Requires python-pyopenssl.'), + _('Requires python-pyopenssl.')), + _('Bonjour / Zeroconf'): (self.zeroconf_available, + _('Serverless chatting with autodetected clients in a local network.'), + _('Requires python-avahi.'), + _('Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour).')), + _('gajim-remote'): (self.dbus_available, + _('A script to controle gajim via commandline.'), + _('Requires python-dbus.'), + _('Feature not available under Windows.')), + _('OpenGPG'): (self.gpg_available, + _('Encrypting chatmessages with gpg keys.'), + _('Requires gpg and python-GnuPGInterface.'), + _('Feature not available under Windows.')), + _('network-manager'): (self.network_manager_available, + _('Autodetection of network status.'), + _('Requires gnome-network-manager and python-dbus.'), + _('Feature not available under Windows.')), + _('Session Management'): (self.session_management_available, + _('Gajim session is stored on logout and restored on login.'), + _('Requires python-gnome2.'), + _('Feature not available under Windows.')), + _('gnome-keyring'): (self.gnome_keyring_available, + _('Passwords can be stored securely and not just in plaintext.'), + _('Requires gnome-keyring and python-gnome2-desktop.'), + _('Feature not available under Windows.')), + _('SRV'): (self.srv_available, + _('Ability to connect to servers which is using SRV records.'), + _('Requires dnsutils.'), + _('Requires nslookup to use SRV records.')), + _('Spell Checker'): (self.speller_available, + _('Spellchecking of composed messages.'), + _('Requires python-gnome2-extras or compilation of gtkspell module from Gajim sources.'), + _('Feature not available under Windows.')), + _('Notification-daemon'): (self.notification_available, + _('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.')), + _('Idle'): (self.idle_available, + _('Ability to measure idle time, in order to set auto status.'), + _('Requires compilation of the idle module from Gajim sources.'), + _('Requires compilation of the idle module from Gajim sources.')), + _('LaTeX'): (self.latex_available, + _('Transform LaTeX espressions between $$ $$.'), + _('Requires texlive-latex-base, dvips and imagemagick. You have to set \'use_latex\' to True in the Advanced Configuration Editor.'), + _('Feature not available under Windows.')), + } + + # name, supported + self.model = gtk.ListStore(str, bool) + treeview.set_model(self.model) + + col = gtk.TreeViewColumn(_('Available')) + treeview.append_column(col) + cell = gtk.CellRendererToggle() + cell.set_property('radio', True) + col.pack_start(cell) + col.set_attributes(cell, active = 1) + + col = gtk.TreeViewColumn(_('Feature')) + treeview.append_column(col) + cell = gtk.CellRendererText() + col.pack_start(cell, expand = True) + col.add_attribute(cell, 'text', 0) + + # Fill model + for feature in self.features: + func = self.features[feature][0] + rep = func() + self.model.append([feature, rep]) + self.xml.signal_autoconnect(self) + self.window.show_all() + self.xml.get_widget('close_button').grab_focus() + + def on_close_button_clicked(self, widget): + self.window.destroy() + + def on_features_treeview_cursor_changed(self, widget): + selection = widget.get_selection() + path = selection.get_selected_rows()[1][0] + available = self.model[path][1] + feature = self.model[path][0] + text = self.features[feature][1] + '\n' + if os.name == 'nt': + text = text + self.features[feature][3] + else: + text = text + self.features[feature][2] + self.desc_label.set_text(text) + + def pyopenssl_available(self): + try: + import OpenSSL.SSL + import OpenSSL.crypto + except: + return False + return True + + def zeroconf_available(self): + try: + import avahi + except: + try: + import pybonjour + except: + return False + return True + + def dbus_available(self): + if os.name == 'nt': + return False + from common import dbus_support + return dbus_support.supported + + def gpg_available(self): + if os.name == 'nt': + return False + from common import GnuPG + return GnuPG.USE_GPG + + def network_manager_available(self): + if os.name == 'nt': + return False + import network_manager_listener + return network_manager_listener.supported + + def session_management_available(self): + if os.name == 'nt': + return False + try: + import gnome.ui + except: + return False + return True + + def gnome_keyring_available(self): + if os.name == 'nt': + return False + try: + import gnomekeyring + except: + return False + return True + + def srv_available(self): + return helpers.is_in_path('nslookup') + + def speller_available(self): + if os.name == 'nt': + return False + try: + import gtkspell + except: + return False + return True + + def notification_available(self): + if os.name == 'nt': + return False + from common import dbus_support + if self.dbus_available() and dbus_support.get_notifications_interface(): + return True + try: + import pynotify + except: + return False + return True + + def trayicon_available(self): + if os.name == 'nt' and gtk.pygtk_version >= (2, 10, 0) and \ + gtk.gtk_version >= (2, 10, 0): + return True + try: + import systray + except: + return False + return True + + def idle_available(self): + from common import sleepy + return sleepy.SUPPORTED + + def latex_available(self): + '''check is latex is available and if it can create a picture.''' + + if os.name == 'nt': + return False + + exitcode = 0 + random.seed() + tmpfile = os.path.join(gettempdir(), "gajimtex_" + \ + random.randint(0,100).__str__()) + + # build latex string + texstr = '\\documentclass[12pt]{article}\\usepackage[dvips]{graphicx}' + texstr += '\\usepackage{amsmath}\\usepackage{amssymb}\\pagestyle{empty}' + texstr += '\\begin{document}\\begin{large}\\begin{gather*}test' + texstr += '\\end{gather*}\\end{large}\\end{document}' + + file = open(os.path.join(tmpfile + ".tex"), "w+") + file.write(texstr) + file.flush() + file.close() + try: + p = Popen(['latex', '--interaction=nonstopmode', tmpfile + '.tex'], + cwd=gettempdir()) + exitcode = p.wait() + except: + exitcode = 1 + if exitcode == 0: + try: + p = Popen(['dvips', '-E', '-o', tmpfile + '.ps', tmpfile + '.dvi'], + cwd=gettempdir()) + exitcode = p.wait() + except: + exitcode = 1 + if exitcode == 0: + try: + p = Popen(['convert', tmpfile + '.ps', tmpfile + '.png'], + cwd=gettempdir()) + exitcode = p.wait() + except: + exitcode = 1 + extensions = [".tex", ".log", ".aux", ".dvi", ".ps", ".png"] + for ext in extensions: + try: + os.remove(tmpfile + ext) + except Exception: + pass + if exitcode == 0: + return True + return False diff --git a/src/filetransfers_window.py b/src/filetransfers_window.py index ecc0c0479..8de1e4a74 100644 --- a/src/filetransfers_window.py +++ b/src/filetransfers_window.py @@ -116,8 +116,6 @@ class FileTransfersWindow: self.cancel_menuitem = self.xml.get_widget('cancel_menuitem') self.pause_menuitem = self.xml.get_widget('pause_menuitem') self.continue_menuitem = self.xml.get_widget('continue_menuitem') - self.continue_menuitem.hide() - self.continue_menuitem.set_no_show_all(True) self.remove_menuitem = self.xml.get_widget('remove_menuitem') self.xml.signal_autoconnect(self) @@ -420,10 +418,18 @@ _('Connection with peer cannot be established.')) #they are not translatable. return _('%(hours)02.d:%(minutes)02.d:%(seconds)02.d') % times - def _get_eta_and_speed(self, full_size, transfered_size, elapsed_time): - if elapsed_time == 0: + def _get_eta_and_speed(self, full_size, transfered_size, file_props): + if len(file_props['transfered_size']) == 0: return 0., 0. - speed = round(float(transfered_size) / elapsed_time) + elif len(file_props['transfered_size']) == 1: + speed = round(float(transfered_size) / file_props['elapsed-time']) + else: + # first and last are (time, transfered_size) + first = file_props['transfered_size'][0] + last = file_props['transfered_size'][-1] + transfered = last[1] - first[1] + tim = last[0] - first[0] + speed = round(float(transfered) / tim) if speed == 0.: return 0., 0. remaining_size = full_size - transfered_size @@ -484,8 +490,13 @@ _('Connection with peer cannot be established.')) if file_props.has_key('offset') and file_props['offset']: transfered_size -= file_props['offset'] full_size -= file_props['offset'] + + if file_props['elapsed-time'] > 0: + file_props['transfered_size'].append((file_props['last-time'], transfered_size)) + if len(file_props['transfered_size']) > 6: + file_props['transfered_size'].pop(0) eta, speed = self._get_eta_and_speed(full_size, transfered_size, - file_props['elapsed-time']) + file_props) self.model.set(iter, C_PROGRESS, text) self.model.set(iter, C_PERCENT, int(percent)) @@ -547,6 +558,8 @@ _('Connection with peer cannot be established.')) file_props['sender'] = account file_props['receiver'] = contact file_props['tt_account'] = account + # keep the last time: transfered_size to compute transfer speed + file_props['transfered_size'] = [] return file_props def add_transfer(self, account, contact, file_props): @@ -784,6 +797,8 @@ _('Connection with peer cannot be established.')) elif self.is_transfer_active(file_props): file_props['paused'] = True self.set_status(file_props['type'], file_props['sid'], 'pause') + # reset that to compute speed only when we resume + file_props['transfered_size'] = [] self.toggle_pause_continue(False) def on_cancel_button_clicked(self, widget): diff --git a/src/gajim-remote.py b/src/gajim-remote.py index e350409e5..91ff086a6 100755 --- a/src/gajim-remote.py +++ b/src/gajim-remote.py @@ -137,6 +137,15 @@ class GajimRemote: 'using this account'), False), ] ], + 'send_groupchat_message':[ + _('Sends new message to a groupchat you\'ve joined.'), + [ + ('room_jid', _('JID of the room that will receive the message'), True), + (_('message'), _('message contents'), True), + (_('account'), _('if specified, the message will be sent ' + 'using this account'), False), + ] + ], 'contact_info': [ _('Gets detailed info on a contact'), [ diff --git a/src/gajim.py b/src/gajim.py index 37970697d..b9e12222c 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -6,6 +6,8 @@ ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005-2006 Dimitur Kirov ## Copyright (C) 2005 Travis Shirk +## Copyright (C) 2007 Lukas Petrovicky +## Copyright (C) 2007 Julien Pivotto ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published @@ -70,10 +72,11 @@ def parseAndSetLogLevels(arg): def parseOpts(): profile = '' verbose = False + config_path = None try: - shortargs = 'hqvl:p:' - longargs = 'help quiet verbose loglevel= profile=' + shortargs = 'hqvl:p:c:' + longargs = 'help quiet verbose loglevel= profile= config_path=' opts, args = getopt.getopt(sys.argv[1:], shortargs, longargs.split()) except getopt.error, msg: print msg @@ -93,11 +96,22 @@ def parseOpts(): profile = a elif o in ('-l', '--loglevel'): parseAndSetLogLevels(a) - return profile, verbose + elif o in ('-c', '--config-path'): + config_path = a + return profile, verbose, config_path -profile, verbose = parseOpts() +profile, verbose, config_path = parseOpts() del parseOpts, parseAndSetLogLevels, parseLogTarget, parseLogLevel +import locale +profile = unicode(profile, locale.getpreferredencoding()) + +import common.configpaths +common.configpaths.gajimpaths.init(config_path) +del config_path +common.configpaths.gajimpaths.init_profile(profile) +del profile + import message_control from chat_control import ChatControlBase @@ -106,6 +120,8 @@ from atom_window import AtomWindow from common import exceptions from common.zeroconf import connection_zeroconf from common import dbus_support +if dbus_support.supported: + import dbus if os.name == 'posix': # dl module is Unix Only try: # rename the process name to gajim @@ -196,12 +212,6 @@ from common import optparser if verbose: gajim.verbose = True del verbose -import locale -profile = unicode(profile, locale.getpreferredencoding()) - -import common.configpaths -common.configpaths.init_profile(profile) -del profile gajimpaths = common.configpaths.gajimpaths pid_filename = gajimpaths['PID_FILE'] @@ -316,9 +326,15 @@ pid_dir = os.path.dirname(pid_filename) if not os.path.exists(pid_dir): check_paths.create_path(pid_dir) # Create pid file -f = open(pid_filename, 'w') -f.write(str(os.getpid())) -f.close() +try: + f = open(pid_filename, 'w') + f.write(str(os.getpid())) + f.close() +except IOError, e: + dlg = dialogs.ErrorDialog(_('Disk Write Error'), str(e)) + dlg.run() + dlg.destroy() + sys.exit() del pid_dir del f @@ -396,6 +412,9 @@ class Interface: prompt = data[2] proposed_nick = data[3] gc_control = self.msg_win_mgr.get_control(room_jid, account) + if not gc_control and \ + room_jid in self.minimized_controls[account]: + gc_control = self.minimized_controls[account][room_jid] if gc_control: # user may close the window before we are here gc_control.show_change_nick_input_dialog(title, prompt, proposed_nick) @@ -479,16 +498,21 @@ class Interface: model[self.roster.status_message_menuitem_iter][3] = True # Inform all controls for this account of the connection state change - for ctrl in self.msg_win_mgr.get_controls(): + ctrls = self.msg_win_mgr.get_controls() + if self.minimized_controls.has_key(account): + # Can not be the case when we remove account + ctrls += self.minimized_controls[account].values() + for ctrl in ctrls: if ctrl.account == account: if status == 'offline' or (status == 'invisible' and \ - gajim.connections[account].is_zeroconf): + gajim.connections[account].is_zeroconf): ctrl.got_disconnected() else: # Other code rejoins all GCs, so we don't do it here if not ctrl.type_id == message_control.TYPE_GC: ctrl.got_connected() - ctrl.parent_win.redraw_tab(ctrl) + if ctrl.parent_win: + ctrl.parent_win.redraw_tab(ctrl) self.roster.on_status_changed(account, status) if account in self.show_vcard_when_connect: @@ -535,7 +559,7 @@ class Interface: # Update contact jid_list = gajim.contacts.get_jid_list(account) if ji in jid_list or jid == gajim.get_jid_from_account(account): - lcontact = gajim.contacts.get_contacts_from_jid(account, ji) + lcontact = gajim.contacts.get_contacts(account, ji) contact1 = None resources = [] for c in lcontact: @@ -636,7 +660,7 @@ class Interface: # (when contact signs out or has errors) if array[1] in ('offline', 'error'): contact1.our_chatstate = contact1.chatstate = \ - contact1.composing_jep = None + contact1.composing_xep = None gajim.connections[account].remove_transfers_for_contact(contact1) self.roster.chg_contact_status(contact1, array[1], status_message, account) @@ -665,7 +689,7 @@ class Interface: def handle_event_msg(self, account, array): # 'MSG' (account, (jid, msg, time, encrypted, msg_type, subject, - # chatstate, msg_id, composing_jep, user_nick, xhtml)) + # chatstate, msg_id, composing_xep, user_nick, xhtml)) # user_nick is JEP-0172 full_jid_with_resource = array[0] @@ -678,7 +702,7 @@ class Interface: subject = array[5] chatstate = array[6] msg_id = array[7] - composing_jep = array[8] + composing_xep = array[8] xhtml = array[10] if gajim.config.get('ignore_incoming_xhtml'): xhtml = None @@ -687,9 +711,8 @@ class Interface: groupchat_control = self.msg_win_mgr.get_control(jid, account) if not groupchat_control and \ - gajim.interface.minimized_controls.has_key(account) and \ - jid in gajim.interface.minimized_controls[account]: - groupchat_control = gajim.interface.minimized_controls[account][jid] + jid in self.minimized_controls[account]: + groupchat_control = self.minimized_controls[account][jid] pm = False if groupchat_control and groupchat_control.type_id == \ message_control.TYPE_GC: @@ -720,11 +743,9 @@ class Interface: # Handle chat states contact = gajim.contacts.get_contact(account, jid, resource) - if contact and isinstance(contact, list): - contact = contact[0] if contact: - if contact.composing_jep != 'JEP-0085': # We cache xep85 support - contact.composing_jep = composing_jep + if contact.composing_xep != 'XEP-0085': # We cache xep85 support + contact.composing_xep = composing_xep if chat_control and chat_control.type_id == message_control.TYPE_CHAT: if chatstate is not None: # other peer sent us reply, so he supports jep85 or jep22 @@ -748,7 +769,7 @@ class Interface: return if gajim.config.get('ignore_unknown_contacts') and \ - not gajim.contacts.get_contact(account, jid) and not pm: + not gajim.contacts.get_contacts(account, jid) and not pm: return if not contact: # contact is not in the roster, create a fake one to display @@ -769,7 +790,7 @@ class Interface: if pm: nickname = resource groupchat_control.on_private_message(nickname, message, array[2], - xhtml) + xhtml, msg_id) else: # array: (jid, msg, time, encrypted, msg_type, subject) if encrypted: @@ -798,6 +819,9 @@ class Interface: jids = full_jid_with_resource.split('/', 1) jid = jids[0] gc_control = self.msg_win_mgr.get_control(jid, account) + if not gc_control and \ + jid in self.minimized_controls[account]: + gc_control = self.minimized_controls[account][jid] if gc_control and gc_control.type_id != message_control.TYPE_GC: gc_control = None if gc_control: @@ -821,7 +845,7 @@ class Interface: return gc_control.print_conversation('Error %s: %s' % (array[1], array[2])) - if gc_control.parent_win.get_active_jid() == jid: + if gc_control.parent_win and gc_control.parent_win.get_active_jid() == jid: gc_control.set_subject(gc_control.subject) return @@ -991,6 +1015,9 @@ class Interface: win.set_values(array) if account in self.show_vcard_when_connect: self.show_vcard_when_connect.remove(account) + jid = array['jid'] + if self.instances[account]['infos'].has_key(jid): + self.instances[account]['infos'][jid].set_values(array) def handle_event_vcard(self, account, vcard): # ('VCARD', account, data) @@ -1026,6 +1053,9 @@ class Interface: # Show avatar in roster or gc_roster gc_ctrl = self.msg_win_mgr.get_control(jid, account) + if not gc_ctrl and \ + jid in self.minimized_controls[account]: + gc_ctrl = self.minimized_controls[account][jid] if gc_ctrl and gc_ctrl.type_id == message_control.TYPE_GC: gc_ctrl.draw_avatar(resource) else: @@ -1042,10 +1072,6 @@ class Interface: win = self.instances[account]['infos'][array[0] + '/' + array[1]] if win: c = gajim.contacts.get_contact(account, array[0], array[1]) - # c is a list when no resource is given. it probably means that contact - # is offline, so only on Contact instance - if isinstance(c, list) and len(c): - c = c[0] if c: # c can be none if it's a gc contact c.last_status_time = time.localtime(time.time() - array[2]) if array[3]: @@ -1081,7 +1107,6 @@ class Interface: # PrivateChatControl control = self.msg_win_mgr.get_control(room_jid, account) if not control and \ - self.minimized_controls.has_key(account) and \ room_jid in self.minimized_controls[account]: control = self.minimized_controls[account][room_jid] @@ -1090,8 +1115,11 @@ class Interface: if control: control.chg_contact_status(nick, show, status, array[4], array[5], array[6], array[7], array[8], array[9], array[10], array[11]) - if control and not control.parent_win: - gajim.interface.roster.draw_contact(room_jid, account) + + contact = gajim.contacts.\ + get_contact_with_highest_priority(account, room_jid) + if contact: + self.roster.draw_contact(room_jid, account) ctrl = self.msg_win_mgr.get_control(fjid, account) @@ -1119,7 +1147,6 @@ class Interface: gc_control = self.msg_win_mgr.get_control(room_jid, account) if not gc_control and \ - self.minimized_controls.has_key(account) and \ room_jid in self.minimized_controls[account]: gc_control = self.minimized_controls[account][room_jid] @@ -1141,7 +1168,7 @@ class Interface: contact = gajim.contacts.\ get_contact_with_highest_priority(account, room_jid) if contact: - gajim.interface.roster.draw_contact(room_jid, account) + self.roster.draw_contact(room_jid, account) if self.remote_ctrl: self.remote_ctrl.raise_signal('GCMessage', (account, array)) @@ -1154,7 +1181,6 @@ class Interface: gc_control = self.msg_win_mgr.get_control(jid, account) if not gc_control and \ - self.minimized_controls.has_key(account) and \ jid in self.minimized_controls[account]: gc_control = self.minimized_controls[account][jid] @@ -1162,7 +1188,7 @@ class Interface: get_contact_with_highest_priority(account, jid) if contact: contact.status = array[1] - gajim.interface.roster.draw_contact(jid, account) + self.roster.draw_contact(jid, account) if not gc_control: return @@ -1197,6 +1223,46 @@ class Interface: self.instances[account]['gc_config'][room_jid] = \ config.GroupchatConfigWindow(account, room_jid, array[1]) + def handle_event_gc_config_change(self, account, array): + #('GC_CONFIG_CHANGE', account, (jid, statusCode)) statuscode is a list + # http://www.xmpp.org/extensions/xep-0045.html#roomconfig-notify + # http://www.xmpp.org/extensions/xep-0045.html#registrar-statuscodes-init + jid = array[0] + statusCode = array[1] + + gc_control = self.msg_win_mgr.get_control(jid, account) + if not gc_control and \ + jid in self.minimized_controls[account]: + gc_control = self.minimized_controls[account][jid] + if not gc_control: + return + + changes = [] + if '100' in statusCode: + # Can be a presence (see chg_contact_status in groupchat_contol.py) + changes.append(_('Any occupant is allowed to see your full JID')) + if '102' in statusCode: + changes.append(_('Room now shows unavailable member')) + if '103' in statusCode: + changes.append(_('room now does not show unavailable members')) + if '104' in statusCode: + changes.append(\ + _('A non-privacy-related room configuration change has occurred')) + if '170' in statusCode: + # Can be a presence (see chg_contact_status in groupchat_contol.py) + changes.append(_('Room logging is now enabled')) + if '171' in statusCode: + changes.append(_('Room logging is now disabled')) + if '172' in statusCode: + changes.append(_('Room is now non-anonymous')) + if '173' in statusCode: + changes.append(_('Room is now semi-anonymous')) + if '174' in statusCode: + changes.append(_('Room is now fully-anonymous')) + + for change in changes: + gc_control.print_conversation(change) + def handle_event_gc_affiliation(self, account, array): #('GC_AFFILIATION', account, (room_jid, affiliation, list)) list is list room_jid = array[0] @@ -1204,6 +1270,29 @@ class Interface: self.instances[account]['gc_config'][room_jid].\ affiliation_list_received(array[1], array[2]) + def handle_event_gc_password_required(self, account, array): + #('GC_PASSWORD_REQUIRED', account, (room_jid, nick)) + room_jid = array[0] + nick = array[1] + + def on_ok(text): + gajim.connections[account].join_gc(nick, room_jid, text) + gajim.gc_passwords[room_jid] = text + + def on_cancel(): + # get and destroy window + if room_jid in gajim.interface.minimized_controls[account]: + self.roster.on_disconnect(None, room_jid, account) + else: + win = self.msg_win_mgr.get_window(room_jid, account) + ctrl = win.get_control(room_jid, account) + win.remove_tab(ctrl, 3) + + dlg = dialogs.InputDialog(_('Password Required'), + _('A Password is required to join the room %s. Please type it') % \ + room_jid, is_modal=False, ok_handler=on_ok, cancel_handler=on_cancel) + dlg.input_entry.set_visibility(False) + def handle_event_gc_invitation(self, account, array): #('GC_INVITATION', (room_jid, jid_from, reason, password)) jid = gajim.get_jid_without_resource(array[1]) @@ -1240,7 +1329,7 @@ class Interface: sub = array[2] ask = array[3] groups = array[4] - contacts = gajim.contacts.get_contacts_from_jid(account, jid) + contacts = gajim.contacts.get_contacts(account, jid) # contact removes us. if (not sub or sub == 'none') and (not ask or ask == 'none') and \ not name and not groups: @@ -1304,11 +1393,11 @@ class Interface: # join autojoinable rooms for bm in bms: + minimize = bm['minimize'] in ('1', 'true') if bm['autojoin'] in ('1', 'true'): self.roster.join_gc_room(account, bm['jid'], bm['nick'], - bm['password'], - minimize = gajim.config.get('minimize_autojoined_rooms')) - + bm['password'], minimize = minimize) + def handle_event_file_send_error(self, account, array): jid = array[0] file_props = array[1] @@ -1620,7 +1709,8 @@ class Interface: if self.instances[account].has_key('profile'): win = self.instances[account]['profile'] win.vcard_published() - for gc_control in self.msg_win_mgr.get_controls(message_control.TYPE_GC): + for gc_control in self.msg_win_mgr.get_controls(message_control.TYPE_GC) + \ + self.minimized_controls[account].values(): if gc_control.account == account: show = gajim.SHOW_LIST[gajim.connections[account].connected] status = gajim.connections[account].status @@ -1648,7 +1738,8 @@ class Interface: if gajim.connections[account].connected == invisible_show: return # join already open groupchats - for gc_control in self.msg_win_mgr.get_controls(message_control.TYPE_GC): + for gc_control in self.msg_win_mgr.get_controls(message_control.TYPE_GC) + \ + self.minimized_controls[account].values(): if account != gc_control.account: continue room_jid = gc_control.room_jid @@ -2080,8 +2171,10 @@ class Interface: 'GC_MSG': self.handle_event_gc_msg, 'GC_SUBJECT': self.handle_event_gc_subject, 'GC_CONFIG': self.handle_event_gc_config, + 'GC_CONFIG_CHANGE': self.handle_event_gc_config_change, 'GC_INVITATION': self.handle_event_gc_invitation, 'GC_AFFILIATION': self.handle_event_gc_affiliation, + 'GC_PASSWORD_REQUIRED': self.handle_event_gc_password_required, 'BAD_PASSPHRASE': self.handle_event_bad_passphrase, 'ROSTER_INFO': self.handle_event_roster_info, 'BOOKMARKS': self.handle_event_bookmarks, @@ -2138,6 +2231,12 @@ class Interface: jid = gajim.get_jid_without_resource(fjid) if type_ in ('printed_gc_msg', 'printed_marked_gc_msg', 'gc_msg'): w = self.msg_win_mgr.get_window(jid, account) + if self.minimized_controls[account].has_key(jid): + if not w: + ctrl = self.minimized_controls[account][jid] + w = self.msg_win_mgr.create_window(ctrl.contact, \ + ctrl.account, ctrl.type_id) + self.roster.on_groupchat_maximized(None, jid, account) elif type_ in ('printed_chat', 'chat', ''): # '' is for log in/out notifications if self.msg_win_mgr.has_window(fjid, account): @@ -2153,8 +2252,10 @@ class Interface: gajim.events.change_jid(account, fjid, jid) resource = None fjid = jid - contact = gajim.contacts.get_contact(account, jid, resource) - if not contact or isinstance(contact, list): + contact = None + if resource: + contact = gajim.contacts.get_contact(account, jid, resource) + if not contact: contact = highest_contact self.roster.new_chat(contact, account, resource = resource) w = self.msg_win_mgr.get_window(fjid, account) @@ -2173,8 +2274,7 @@ class Interface: show = 'offline' gc_contact = gajim.contacts.create_gc_contact( room_jid = room_jid, name = nick, show = show) - c = gajim.contacts.contact_from_gc_contact(gc_contact) - self.roster.new_chat(c, account, private_chat = True) + self.roster.new_private_chat(gc_contact, account) w = self.msg_win_mgr.get_window(fjid, account) elif type_ in ('normal', 'file-request', 'file-request-error', 'file-send-error', 'file-error', 'file-stopped', 'file-completed'): @@ -2183,15 +2283,17 @@ class Interface: if not event: # default to jid without resource event = gajim.events.get_first_event(account, jid, type_) + if not event: + return # Open the window self.roster.open_event(account, jid, event) else: # Open the window self.roster.open_event(account, fjid, event) elif type_ == 'gmail': - url = 'http://mail.google.com/mail?account_id=%s' % urllib.quote( - gajim.config.get_per('accounts', account, 'name')) - helpers.launch_browser_mailer('url', url) + url=gajim.connections[account].gmail_url + if url: + helpers.launch_browser_mailer('url', url) elif type_ == 'gc-invitation': event = gajim.events.get_first_event(account, jid, type_) data = event.parameters @@ -2217,6 +2319,8 @@ class Interface: # handler when an emoticon is clicked in emoticons_menu self.emoticon_menuitem_clicked = None self.minimized_controls = {} + self.status_sent_to_users = {} + self.status_sent_to_groups = {} self.default_colors = { 'inmsgcolor': gajim.config.get('inmsgcolor'), 'outmsgcolor': gajim.config.get('outmsgcolor'), @@ -2252,7 +2356,7 @@ class Interface: #add default themes if there is not in the config file theme = gajim.config.get('roster_theme') if not theme in gajim.config.get_per('themes'): - gajim.config.set('roster_theme', 'gtk+') + gajim.config.set('roster_theme', _('default')) if len(gajim.config.get_per('themes')) == 0: d = ['accounttextcolor', 'accountbgcolor', 'accountfont', 'accountfontattrs', 'grouptextcolor', 'groupbgcolor', 'groupfont', @@ -2309,6 +2413,7 @@ class Interface: for a in gajim.connections: self.instances[a] = {'infos': {}, 'disco': {}, 'gc_config': {}, 'search': {}} + self.minimized_controls[a] = {} gajim.contacts.add_account(a) gajim.groups[a] = {} gajim.gc_connected[a] = {} @@ -2335,11 +2440,35 @@ class Interface: self.remote_ctrl = None if gajim.config.get('networkmanager_support') and dbus_support.supported: - try: - import network_manager_listener - except: + import network_manager_listener + if not network_manager_listener.supported: print >> sys.stderr, _('Network Manager support not available') + # Handle gnome screensaver + if dbus_support.supported: + def gnome_screensaver_ActiveChanged_cb(active): + if not active: + return + for account in gajim.connections: + if not gajim.sleeper_state.has_key(account) or \ + not gajim.sleeper_state[account]: + continue + if gajim.sleeper_state[account] == 'online': + # we save out online status + gajim.status_before_autoaway[account] = \ + gajim.connections[account].status + # we go away (no auto status) [we pass True to auto param] + auto_message = gajim.config.get('autoaway_message') + if not auto_message: + auto_message = gajim.connections[account].status + self.roster.send_status(account, 'away', auto_message, + auto=True) + gajim.sleeper_state[account] = 'autoaway' + + bus = dbus.SessionBus() + bus.add_signal_receiver(gnome_screensaver_ActiveChanged_cb, + 'ActiveChanged', 'org.gnome.ScreenSaver') + self.show_vcard_when_connect = [] path_to_file = os.path.join(gajim.DATA_DIR, 'pixmaps', 'gajim.png') @@ -2393,8 +2522,11 @@ class Interface: self.last_ftwindow_update = 0 gobject.timeout_add(100, self.autoconnect) - gobject.timeout_add(200, self.process_connections) - gobject.timeout_add(500, self.read_sleepy) + if os.name == 'nt': + gobject.timeout_add(200, self.process_connections) + else: + gobject.timeout_add(2000, self.process_connections) + gobject.timeout_add(10000, self.read_sleepy) if __name__ == '__main__': def sigint_cb(num, stack): diff --git a/src/gajim_themes_window.py b/src/gajim_themes_window.py index 6b0200ecb..3454ee79f 100644 --- a/src/gajim_themes_window.py +++ b/src/gajim_themes_window.py @@ -50,6 +50,7 @@ class GajimThemesWindow: self.italic_togglebutton = self.xml.get_widget('italic_togglebutton') self.themes_tree = self.xml.get_widget('themes_treeview') self.theme_options_vbox = self.xml.get_widget('theme_options_vbox') + self.theme_options_table = self.xml.get_widget('theme_options_table') self.colorbuttons = {} for chatstate in ('inactive', 'composing', 'paused', 'gone', 'muc_msg', 'muc_directed_msg'): @@ -67,6 +68,7 @@ class GajimThemesWindow: self.current_theme = gajim.config.get('roster_theme') self.no_update = False self.fill_themes_treeview() + self.select_active_theme() self.current_option = self.options[0] self.set_theme_options(self.current_theme, self.current_option) @@ -81,6 +83,8 @@ class GajimThemesWindow: return True # do NOT destroy the window def on_close_button_clicked(self, widget): + if gajim.interface.instances.has_key('preferences'): + gajim.interface.instances['preferences'].update_theme_list() self.window.hide() def on_theme_cell_edited(self, cell, row, new_name): @@ -90,6 +94,11 @@ class GajimThemesWindow: new_name = new_name.decode('utf-8') if old_name == new_name: return + if old_name == 'default': + dialogs.ErrorDialog( + _('You cannot make changes to the default theme'), + _('Please create a clean new theme with your desired name.')) + return new_config_name = new_name.replace(' ', '_') if new_config_name in gajim.config.get_per('themes'): return @@ -110,28 +119,31 @@ class GajimThemesWindow: self.current_theme = new_name def fill_themes_treeview(self): - self.xml.get_widget('remove_button').set_sensitive(False) - self.theme_options_vbox.set_sensitive(False) model = self.themes_tree.get_model() model.clear() for config_theme in gajim.config.get_per('themes'): theme = config_theme.replace('_', ' ') iter = model.append([theme]) - if gajim.config.get('roster_theme') == config_theme: - self.themes_tree.get_selection().select_iter(iter) - self.xml.get_widget('remove_button').set_sensitive(True) - self.theme_options_vbox.set_sensitive(True) def select_active_theme(self): model = self.themes_tree.get_model() iter = model.get_iter_root() - active_theme = gajim.config.get('roster_theme') + active_theme = gajim.config.get('roster_theme').replace('_', ' ') while iter: theme = model[iter][0] if theme == active_theme: self.themes_tree.get_selection().select_iter(iter) self.xml.get_widget('remove_button').set_sensitive(True) self.theme_options_vbox.set_sensitive(True) + self.theme_options_table.set_sensitive(True) + if active_theme == 'default': + self.xml.get_widget('remove_button').set_sensitive(False) + self.theme_options_vbox.set_sensitive(False) + self.theme_options_table.set_sensitive(False) + else: + self.xml.get_widget('remove_button').set_sensitive(True) + self.theme_options_vbox.set_sensitive(True) + self.theme_options_table.set_sensitive(True) break iter = model.iter_next(iter) @@ -140,12 +152,19 @@ class GajimThemesWindow: selected = self.themes_tree.get_selection().get_selected_rows() if not iter or selected[1] == []: self.theme_options_vbox.set_sensitive(False) + self.theme_options_table.set_sensitive(False) return - self.xml.get_widget('remove_button').set_sensitive(True) - self.theme_options_vbox.set_sensitive(True) self.current_theme = model.get_value(iter, 0).decode('utf-8') self.current_theme = self.current_theme.replace(' ', '_') self.set_theme_options(self.current_theme) + if self.current_theme == 'default': + self.xml.get_widget('remove_button').set_sensitive(False) + self.theme_options_vbox.set_sensitive(False) + self.theme_options_table.set_sensitive(False) + else: + self.xml.get_widget('remove_button').set_sensitive(True) + self.theme_options_vbox.set_sensitive(True) + self.theme_options_table.set_sensitive(True) def on_add_button_clicked(self, widget): model = self.themes_tree.get_model() @@ -173,6 +192,8 @@ class GajimThemesWindow: _('Please first choose another for your current theme.')) return self.theme_options_vbox.set_sensitive(False) + self.theme_options_table.set_sensitive(False) + self.xml.get_widget('remove_button').set_sensitive(False) gajim.config.del_per('themes', self.current_theme) model.remove(iter) diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 5757b865f..1315f1442 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -9,6 +9,8 @@ ## Norman Rasmussen ## Copyright (C) 2006 Travis Shirk ## Copyright (C) 2005-2007 Nikos Kouremenos +## Copyright (C) 2007 Julien Pivotto +## Copyright (C) 2007 Lukas Petrovicky ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published @@ -63,6 +65,12 @@ def tree_cell_data_func(column, renderer, model, iter, tv=None): # cell data func is global, because we don't want it to keep # reference to GroupchatControl instance (self) theme = gajim.config.get('roster_theme') + # allocate space for avatar only if needed + if isinstance(renderer, gtk.CellRendererPixbuf): + if model[iter][C_AVATAR]: + renderer.set_property('visible', True) + else: + renderer.set_property('visible', False) if model.iter_parent(iter): bgcolor = gajim.config.get_per('themes', theme, 'contactbgcolor') if bgcolor: @@ -97,12 +105,14 @@ def tree_cell_data_func(column, renderer, model, iter, tv=None): class PrivateChatControl(ChatControl): TYPE_ID = message_control.TYPE_PM - def __init__(self, parent_win, gc_contact, contact, acct): + def __init__(self, parent_win, gc_contact, contact, account): room_jid = contact.jid.split('/')[0] - room_ctrl = gajim.interface.msg_win_mgr.get_control(room_jid, acct) + room_ctrl = gajim.interface.msg_win_mgr.get_control(room_jid, account) + if gajim.interface.minimized_controls[account].has_key(room_jid): + room_ctrl = gajim.interface.minimized_controls[account][room_jid] self.room_name = room_ctrl.name self.gc_contact = gc_contact - ChatControl.__init__(self, parent_win, contact, acct) + ChatControl.__init__(self, parent_win, contact, account) self.TYPE_ID = 'pm' def send_message(self, message): @@ -127,7 +137,7 @@ class PrivateChatControl(ChatControl): return ChatControl.send_message(self, message) - + def update_ui(self): if self.contact.show == 'offline': self.got_disconnected() @@ -183,9 +193,8 @@ class GroupchatControl(ChatControlBase): self.nick = contact.name self.name = self.room_jid.split('@')[0] - hide_chat_buttons_always = gajim.config.get( - 'always_hide_groupchat_buttons') - self.chat_buttons_set_visible(hide_chat_buttons_always) + compact_view = gajim.config.get('compact_view') + self.chat_buttons_set_visible(compact_view) self.widget_set_visible(self.xml.get_widget('banner_eventbox'), gajim.config.get('hide_groupchat_banner')) self.widget_set_visible(self.xml.get_widget('list_scrolledwindow'), @@ -237,18 +246,14 @@ class GroupchatControl(ChatControlBase): self._on_change_subject_menuitem_activate) self.handlers[id] = self.change_subject_menuitem - self.compact_view_menuitem = xm.get_widget('compact_view_menuitem') - id = self.compact_view_menuitem.connect('activate', - self._on_compact_view_menuitem_activate) - self.handlers[id] = self.compact_view_menuitem - widget = xm.get_widget('history_menuitem') id = widget.connect('activate', self._on_history_menuitem_activate) self.handlers[id] = widget - widget = xm.get_widget('minimize_menuitem') - id = widget.connect('activate', self._on_minimize_menuitem_activate) - self.handlers[id] = widget + self.minimize_menuitem = xm.get_widget('minimize_menuitem') + id = self.minimize_menuitem.connect('toggled', + self.on_minimize_menuitem_toggled) + self.handlers[id] = self.minimize_menuitem self.gc_popup_menu = xm.get_widget('gc_control_popup_menu') @@ -285,14 +290,8 @@ class GroupchatControl(ChatControlBase): # first one img, second one text, third is sec pixbuf column = gtk.TreeViewColumn() - renderer_pixbuf = gtk.CellRendererPixbuf() # avatar image - column.pack_start(renderer_pixbuf, expand = False) - column.add_attribute(renderer_pixbuf, 'pixbuf', C_AVATAR) - column.set_cell_data_func(renderer_pixbuf, tree_cell_data_func, - self.list_treeview) - renderer_pixbuf.set_property('xalign', 1) # align pixbuf to the right - renderer_image = cell_renderer_image.CellRendererImage(0, 0) # status img + renderer_image.set_property('width', 26) column.pack_start(renderer_image, expand = False) column.add_attribute(renderer_image, 'image', C_IMG) column.set_cell_data_func(renderer_image, tree_cell_data_func, @@ -301,9 +300,17 @@ class GroupchatControl(ChatControlBase): renderer_text = gtk.CellRendererText() # nickname column.pack_start(renderer_text, expand = True) column.add_attribute(renderer_text, 'markup', C_TEXT) + renderer_text.set_property("ellipsize", pango.ELLIPSIZE_END) column.set_cell_data_func(renderer_text, tree_cell_data_func, self.list_treeview) + renderer_pixbuf = gtk.CellRendererPixbuf() # avatar image + column.pack_start(renderer_pixbuf, expand = False) + column.add_attribute(renderer_pixbuf, 'pixbuf', C_AVATAR) + column.set_cell_data_func(renderer_pixbuf, tree_cell_data_func, + self.list_treeview) + renderer_pixbuf.set_property('xalign', 1) # align pixbuf to the right + self.list_treeview.append_column(column) # workaround to avoid gtk arrows to be shown @@ -483,10 +490,10 @@ class GroupchatControl(ChatControlBase): self.name_label.set_markup(text) def prepare_context_menu(self): - '''sets compact view menuitem active state - sets sensitivity state for configure_room''' - # Check compact view menuitem - self.compact_view_menuitem.set_active(self.hide_chat_buttons_current) + '''sets sensitivity state for configure_room''' + if self.contact.jid in gajim.config.get_per('accounts', self.account, + 'minimized_gc').split(' '): + self.minimize_menuitem.set_active(True) if gajim.gc_connected[self.account][self.room_jid]: c = gajim.contacts.get_gc_contact(self.account, self.room_jid, self.nick) @@ -515,11 +522,13 @@ class GroupchatControl(ChatControlBase): else: # message from someone if has_timestamp: - self.print_old_conversation(msg, nick, tim, xhtml) + # don't print xhtml if it's an old message. + # Like that xhtml messages are grayed too. + self.print_old_conversation(msg, nick, tim, None) else: self.print_conversation(msg, nick, tim, xhtml) - def on_private_message(self, nick, msg, tim, xhtml): + def on_private_message(self, nick, msg, tim, xhtml, msg_id = None): # Do we have a queue? fjid = self.room_jid + '/' + nick no_queue = len(gajim.events.get_events(self.account, fjid)) == 0 @@ -531,7 +540,7 @@ class GroupchatControl(ChatControlBase): return event = gajim.events.create_event('pm', (msg, '', 'incoming', tim, - False, '', None, xhtml)) + False, '', msg_id, xhtml)) gajim.events.add_event(self.account, fjid, event) autopopup = gajim.config.get('autopopup') @@ -544,8 +553,8 @@ class GroupchatControl(ChatControlBase): model = self.list_treeview.get_model() state_images =\ gajim.interface.roster.get_appropriate_state_images( - self.room_jid, icon_name = 'message') - image = state_images['message'] + self.room_jid, icon_name = 'event') + image = state_images['event'] model[iter][C_IMG] = image if self.parent_win: self.parent_win.show_title() @@ -556,7 +565,10 @@ class GroupchatControl(ChatControlBase): self.list_treeview.expand_row(path[0:1], False) self.list_treeview.scroll_to_cell(path) self.list_treeview.set_cursor(path) - gajim.interface.roster.draw_contact(self.room_jid, self.account) + contact = gajim.contacts.get_contact_with_highest_priority(self.account, \ + self.room_jid) + if contact: + gajim.interface.roster.draw_contact(self.room_jid, self.account) def get_contact_iter(self, nick): model = self.list_treeview.get_model() @@ -662,8 +674,7 @@ class GroupchatControl(ChatControlBase): other_tags_for_text.append('gc_nickname_color_' + \ str(self.gc_custom_colors[contact])) - if self.parent_win: - self.check_and_possibly_add_focus_out_line() + self.check_and_possibly_add_focus_out_line() ChatControlBase.print_conversation_line(self, text, kind, contact, tim, other_tags_for_name, [], other_tags_for_text, xhtml = xhtml) @@ -697,7 +708,7 @@ class GroupchatControl(ChatControlBase): if self.needs_visual_notification(text): highlight = True if gajim.config.get_per('soundevents', 'muc_message_highlight', - 'enabled'): + 'enabled'): sound = 'highlight' # Is it a history message? Don't want sound-floods when we join. @@ -712,7 +723,7 @@ class GroupchatControl(ChatControlBase): it removes previous line first''' win = gajim.interface.msg_win_mgr.get_window(self.room_jid, self.account) - if self.room_jid == win.get_active_jid() and\ + if win and self.room_jid == win.get_active_jid() and\ win.window.get_property('has-toplevel-focus') and\ self.parent_win.get_active_control() == self: # it's the current room and it's the focused window. @@ -780,7 +791,8 @@ class GroupchatControl(ChatControlBase): gc_contact.show = 'offline' gc_contact.status = '' ctrl.update_ui() - ctrl.parent_win.redraw_tab(ctrl) + if ctrl.parent_win: + ctrl.parent_win.redraw_tab(ctrl) gajim.contacts.remove_gc_contact(self.account, gc_contact) gajim.gc_connected[self.account][self.room_jid] = False ChatControlBase.got_disconnected(self) @@ -795,6 +807,8 @@ class GroupchatControl(ChatControlBase): self.add_contact_to_roster(nick, gc_contact.show, gc_contact.role, gc_contact.affiliation, gc_contact.status, gc_contact.jid) + # Recalculate column width for ellipsizin + self.list_treeview.columns_autosize() def on_send_pm(self, widget = None, model = None, iter = None, nick = None, msg = None): @@ -809,6 +823,11 @@ class GroupchatControl(ChatControlBase): gajim.interface.msg_win_mgr.get_control(fjid, self.account).\ send_message(msg) + def on_send_file(self, widget, gc_contact): + '''sends a file to a contact in the room''' + gajim.interface.instances['file_transfers'].show_file_send_request( + self.account, gc_contact) + def draw_contact(self, nick, selected=False, focus=False): iter = self.get_contact_iter(nick) if not iter: @@ -818,7 +837,7 @@ class GroupchatControl(ChatControlBase): nick) state_images = gajim.interface.roster.jabber_state_images['16'] if len(gajim.events.get_events(self.account, self.room_jid + '/' + nick)): - image = state_images['message'] + image = state_images['event'] else: image = state_images[gc_contact.show] @@ -867,66 +886,99 @@ class GroupchatControl(ChatControlBase): affiliation = 'none' fake_jid = self.room_jid + '/' + nick newly_created = False + + # statusCode + # http://www.xmpp.org/extensions/xep-0045.html#registrar-statuscodes-init + if statusCode: + if '100' in statusCode: + # Can be a message (see handle_event_gc_config_change in gajim.py) + self.print_conversation(\ + _('Any occupant is allowed to see your full JID')) + if '170' in statusCode: + # Can be a message (see handle_event_gc_config_change in gajim.py) + self.print_conversation(_('Room logging is enabled')) + if '201' in statusCode: + self.print_conversation(_('A new room has been created')) + if '210' in statusCode: + self.print_conversation(\ + _('The server has assigned or modified your roomnick')) + if show in ('offline', 'error'): - if statusCode == '307': - if actor is None: # do not print 'kicked by None' - s = _('%(nick)s has been kicked: %(reason)s') % { + if statusCode: + if '307' in statusCode: + if actor is None: # do not print 'kicked by None' + s = _('%(nick)s has been kicked: %(reason)s') % { + 'nick': nick, + 'reason': reason } + else: + s = _('%(nick)s has been kicked by %(who)s: %(reason)s') % { + 'nick': nick, + 'who': actor, + 'reason': reason } + self.print_conversation(s, 'info', tim = tim) + elif '301' in statusCode: + if actor is None: # do not print 'banned by None' + s = _('%(nick)s has been banned: %(reason)s') % { + 'nick': nick, + 'reason': reason } + else: + s = _('%(nick)s has been banned by %(who)s: %(reason)s') % { + 'nick': nick, + 'who': actor, + 'reason': reason } + self.print_conversation(s, 'info', tim = tim) + elif '303' in statusCode: # Someone changed his or her nick + if new_nick == self.nick: # We changed our nick + s = _('You are now known as %s') % new_nick + else: + s = _('%s is now known as %s') % (nick, new_nick) + # We add new nick to muc roster here, so we don't see + # that "new_nick has joined the room" when he just changed nick. + # add_contact_to_roster will be called a second time + # after that, but that doesn't hurt + self.add_contact_to_roster(new_nick, show, role, affiliation, + status, jid) + if nick in self.attention_list: + self.attention_list.remove(nick) + # keep nickname color + if nick in self.gc_custom_colors: + self.gc_custom_colors[new_nick] = self.gc_custom_colors[nick] + # rename vcard / avatar + puny_jid = helpers.sanitize_filename(self.room_jid) + puny_nick = helpers.sanitize_filename(nick) + puny_new_nick = helpers.sanitize_filename(new_nick) + old_path = os.path.join(gajim.VCARD_PATH, puny_jid, puny_nick) + new_path = os.path.join(gajim.VCARD_PATH, puny_jid, puny_new_nick) + files = {old_path: new_path} + path = os.path.join(gajim.AVATAR_PATH, puny_jid) + # possible extensions + for ext in ('.png', '.jpeg', '_notif_size_bw.png', + '_notif_size_colored.png'): + files[os.path.join(path, puny_nick + ext)] = \ + os.path.join(path, puny_new_nick + ext) + for old_file in files: + if os.path.exists(old_file): + if os.path.exists(files[old_file]): + # Windows require this + os.remove(files[old_file]) + os.rename(old_file, files[old_file]) + self.print_conversation(s, 'info', tim) + elif '321' in statusCode: + s = _('%(nick)s has been removed from the room (%(reason)s)') % { + 'nick': nick, 'reason': _('affiliation changed') } + self.print_conversation(s, 'info', tim = tim) + elif '322' in statusCode: + s = _('%(nick)s has been removed from the room (%(reason)s)') % { 'nick': nick, - 'reason': reason } - else: - s = _('%(nick)s has been kicked by %(who)s: %(reason)s') % { + 'reason': _('room configuration changed to members-only') } + self.print_conversation(s, 'info', tim = tim) + elif '332' in statusCode: + s = _('%(nick)s has been removed from the room (%(reason)s)') % { 'nick': nick, - 'who': actor, - 'reason': reason } - self.print_conversation(s, 'info', tim = tim) - elif statusCode == '301': - if actor is None: # do not print 'banned by None' - s = _('%(nick)s has been banned: %(reason)s') % { - 'nick': nick, - 'reason': reason } - else: - s = _('%(nick)s has been banned by %(who)s: %(reason)s') % { - 'nick': nick, - 'who': actor, - 'reason': reason } - self.print_conversation(s, 'info', tim = tim) - elif statusCode == '303': # Someone changed his or her nick - if nick == self.nick: # We changed our nick - self.nick = new_nick - s = _('You are now known as %s') % new_nick - else: - s = _('%s is now known as %s') % (nick, new_nick) - # We add new nick to muc roster here, so we don't see - # that "new_nick has joined the room" when he just changed nick. - # add_contact_to_roster will be called a second time - # after that, but that doesn't hurt - self.add_contact_to_roster(new_nick, show, role, affiliation, - status, jid) - # keep nickname color - if nick in self.gc_custom_colors: - self.gc_custom_colors[new_nick] = self.gc_custom_colors[nick] - # rename vcard / avatar - puny_jid = helpers.sanitize_filename(self.room_jid) - puny_nick = helpers.sanitize_filename(nick) - puny_new_nick = helpers.sanitize_filename(new_nick) - old_path = os.path.join(gajim.VCARD_PATH, puny_jid, puny_nick) - new_path = os.path.join(gajim.VCARD_PATH, puny_jid, puny_new_nick) - files = {old_path: new_path} - path = os.path.join(gajim.AVATAR_PATH, puny_jid) - # possible extensions - for ext in ('.png', '.jpeg', '_notif_size_bw.png', - '_notif_size_colored.png'): - files[os.path.join(path, puny_nick + ext)] = \ - os.path.join(path, puny_new_nick + ext) - for old_file in files: - if os.path.exists(old_file): - if os.path.exists(files[old_file]): - # Windows require this - os.remove(files[old_file]) - os.rename(old_file, files[old_file]) - self.print_conversation(s, 'info', tim) - elif statusCode == 'destroyed': # Room has been destroyed - self.print_conversation(reason, 'info', tim) + 'reason': _('system shutdown') } + self.print_conversation(s, 'info', tim = tim) + elif 'destroyed' in statusCode: # Room has been destroyed + self.print_conversation(reason, 'info', tim) if len(gajim.events.get_events(self.account, fake_jid)) == 0: self.remove_contact(nick) @@ -934,7 +986,8 @@ class GroupchatControl(ChatControlBase): c = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick) c.show = show c.status = status - if nick == self.nick and statusCode != '303': # We became offline + if nick == self.nick and (not statusCode or \ + '303' not in statusCode): # We became offline self.got_disconnected() contact = gajim.contacts.\ get_contact_with_highest_priority(self.account, self.room_jid) @@ -948,7 +1001,7 @@ class GroupchatControl(ChatControlBase): iter = self.add_contact_to_roster(nick, show, role, affiliation, status, jid) newly_created = True - if statusCode == '201': # We just created the room + if statusCode and '201' in statusCode: # We just created the room gajim.connections[self.account].request_gc_config(self.room_jid) else: gc_c = gajim.contacts.get_gc_contact(self.account, self.room_jid, @@ -965,7 +1018,9 @@ class GroupchatControl(ChatControlBase): real_jid = fake_jid if con.vcard_shas.has_key(fake_jid): if avatar_sha != con.vcard_shas[fake_jid]: - con.request_vcard(real_jid, fake_jid) + server = gajim.get_server_from_jid(self.room_jid) + if not server.startswith('irc'): + con.request_vcard(real_jid, fake_jid) else: cached_vcard = con.get_cached_vcard(fake_jid, True) if cached_vcard and cached_vcard.has_key('PHOTO') and \ @@ -976,7 +1031,9 @@ class GroupchatControl(ChatControlBase): if cached_sha != avatar_sha: # avatar has been updated # sha in mem will be updated later - con.request_vcard(real_jid, fake_jid) + server = gajim.get_server_from_jid(self.room_jid) + if not server.startswith('irc'): + con.request_vcard(real_jid, fake_jid) else: # save sha in mem NOW con.vcard_shas[fake_jid] = avatar_sha @@ -997,7 +1054,8 @@ class GroupchatControl(ChatControlBase): if self.parent_win: self.parent_win.redraw_tab(self) if (time.time() - self.room_creation) > 30 and \ - nick != self.nick and statusCode != '303': + nick != self.nick and (not statusCode or \ + '303' not in statusCode): st = '' print_status = None for bookmark in gajim.connections[self.account].bookmarks: @@ -1011,8 +1069,11 @@ class GroupchatControl(ChatControlBase): # delete ressource simple_jid = gajim.get_jid_without_resource(jid) nick_jid += ' (%s)' % simple_jid + if show == 'offline': + if nick in self.attention_list: + self.attention_list.remove(nick) if show == 'offline' and print_status in ('all', 'in_and_out') and \ - statusCode != '307': + (not statusCode or '307' not in statusCode): st = _('%s has left') % nick_jid if reason: st += ' [%s]' % reason @@ -1127,6 +1188,7 @@ class GroupchatControl(ChatControlBase): nick = message_array[0] nick = helpers.parse_resource(nick) gajim.connections[self.account].join_gc(nick, self.room_jid, None) + self.nick = nick self.clear(self.msg_textview) else: self.get_command_help(command) @@ -1408,9 +1470,31 @@ class GroupchatControl(ChatControlBase): nick = instance.input_entry.get_text().decode('utf-8') nick = helpers.parse_resource(nick) gajim.connections[self.account].join_gc(nick, self.room_jid, None) + self.nick = nick instance = dialogs.InputDialog(title, prompt, proposed_nick, is_modal = False, ok_handler = on_ok) + def minimize(self, status='offline'): + # Minimize it + win = gajim.interface.msg_win_mgr.get_window(self.contact.jid, + self.account) + ctrl = win.get_control(self.contact.jid, self.account) + + ctrl_page = win.notebook.page_num(ctrl.widget) + control = win.notebook.get_nth_page(ctrl_page) + + win.notebook.remove_page(ctrl_page) + control.unparent() + ctrl.parent_win = None + + gajim.interface.minimized_controls[self.account][self.contact.jid] = \ + ctrl + + del win._controls[self.account][self.contact.jid] + + gajim.interface.roster.add_groupchat_to_roster(self.account, + self.contact.jid, status = self.subject) + def shutdown(self, status='offline'): gajim.connections[self.account].send_gc_status(self.nick, self.room_jid, show='offline', status=status) @@ -1441,13 +1525,15 @@ class GroupchatControl(ChatControlBase): gajim.events.remove_events(self.account, self.room_jid) def allow_shutdown(self, method): - '''If check_selection is True, ''' + if self.contact.jid in gajim.config.get_per('accounts', self.account, + 'minimized_gc').split(' '): + return 'minimize' if method == self.parent_win.CLOSE_ESC: model, iter = self.list_treeview.get_selection().get_selected() if iter: self.list_treeview.get_selection().unselect_all() - return False - retval = True + return 'no' + retval = 'yes' includes = gajim.config.get('confirm_close_muc_rooms').split(' ') excludes = gajim.config.get('noconfirm_close_muc_rooms').split(' ') # whether to ask for comfirmation before closing muc @@ -1463,7 +1549,7 @@ class GroupchatControl(ChatControlBase): _('Do _not ask me again')) if dialog.get_response() != gtk.RESPONSE_OK: - retval = False + retval = 'no' if dialog.is_checked(): # user does not want to be asked again gajim.config.set('confirm_close_muc', False) @@ -1546,6 +1632,7 @@ class GroupchatControl(ChatControlBase): 'name': self.name, 'jid': self.room_jid, 'autojoin': '0', + 'minimize': '0', 'password': '', 'nick': self.nick } @@ -1566,8 +1653,25 @@ class GroupchatControl(ChatControlBase): _('Bookmark has been added successfully'), _('You can manage your bookmarks via Actions menu in your roster.')) + def _on_drag_data_received(self, widget, context, x, y, selection, + target_type, timestamp): + # Invite contact to groupchat + treeview = gajim.interface.roster.tree + model = treeview.get_model() + if not selection.data: + return + data = selection.data + path = treeview.get_selection().get_selected_rows()[1][0] + iter = model.get_iter(path) + type = model[iter][2] + account = model[iter][4].decode('utf-8') + if type != 'contact': # source is not a contact + return + contact_jid = data.decode('utf-8') + 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 @@ -1800,13 +1904,21 @@ class GroupchatControl(ChatControlBase): item = xml.get_widget('add_to_roster_menuitem') if not jid: item.set_sensitive(False) - id = item.connect('activate', self.on_add_to_roster, jid) - self.handlers[id] = item + else: + id = item.connect('activate', self.on_add_to_roster, jid) + self.handlers[id] = item item = xml.get_widget('send_private_message_menuitem') id = item.connect('activate', self.on_send_pm, model, iter) self.handlers[id] = item + item = xml.get_widget('send_file_menuitem') + if not c.resource: + item.set_sensitive(False) + else: + id = item.connect('activate', self.on_send_file, c) + self.handlers[id] = item + # show the popup now! menu = xml.get_widget('gc_occupants_menu') menu.show_all() @@ -1835,7 +1947,7 @@ class GroupchatControl(ChatControlBase): else: # We want to send a private message nick = model[path][C_NICK].decode('utf-8') 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''' if not gajim.single_click: diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index a833ee4bd..3622adc8e 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -584,9 +584,8 @@ def make_python_month_gtk_month(month): def make_color_string(color): '''create #aabbcc color string from gtk color''' col = '#' - for i in (color.red, color.green, color.blue): - # GTK sometime return a value > 256 - h = hex(i%256)[2:4] + for i in ('red', 'green', 'blue'): + h = hex(getattr(color, i) / (16*16)).split('x')[1] if len(h) == 1: h = '0' + h col += h diff --git a/src/history_manager.py b/src/history_manager.py index c861d395d..569d0e8bd 100755 --- a/src/history_manager.py +++ b/src/history_manager.py @@ -76,10 +76,7 @@ class HistoryManager: self.search_results_scrolledwindow = xml.get_widget( 'search_results_scrolledwindow') self.welcome_label = xml.get_widget('welcome_label') - - self.logs_scrolledwindow.set_no_show_all(True) - self.search_results_scrolledwindow.set_no_show_all(True) - + self.jids_already_in = [] # holds jids that we already have in DB self.AT_LEAST_ONE_DELETION_DONE = False diff --git a/src/message_control.py b/src/message_control.py index e2d16a45b..1bc2ac0dd 100644 --- a/src/message_control.py +++ b/src/message_control.py @@ -34,7 +34,7 @@ class MessageControl: self.widget_name = widget_name self.contact = contact self.account = account - self.hide_chat_buttons_current = False + self.hide_chat_buttons = False self.resource = resource gajim.last_message_time[self.account][self.get_full_jid()] = 0 @@ -56,9 +56,9 @@ class MessageControl: def allow_shutdown(self, method): '''Called to check is a control is allowed to shutdown. If a control is not in a suitable shutdown state this method - should return False''' + should return 'no', else 'yes' or 'minimize' ''' # NOTE: Derived classes MAY implement this - return True + return 'yes' def shutdown(self): # NOTE: Derived classes MUST implement this @@ -99,7 +99,7 @@ class MessageControl: def chat_buttons_set_visible(self, state): # NOTE: Derived classes MAY implement this - self.hide_chat_buttons_current = state + self.hide_chat_buttons = state def got_connected(self): pass @@ -111,7 +111,7 @@ class MessageControl: return len(gajim.events.get_events(self.account, self.contact.jid)) def send_message(self, message, keyID = '', type = 'chat', - chatstate = None, msg_id = None, composing_jep = None, resource = None, + chatstate = None, msg_id = None, composing_xep = None, resource = None, user_nick = None): '''Send the given message to the active tab. Doesn't return None if error ''' @@ -119,5 +119,5 @@ class MessageControl: # Send and update history return gajim.connections[self.account].send_message(jid, message, keyID, type = type, chatstate = chatstate, msg_id = msg_id, - composing_jep = composing_jep, resource = self.resource, + composing_xep = composing_xep, resource = self.resource, user_nick = user_nick) diff --git a/src/message_window.py b/src/message_window.py index 6445495be..65d25968c 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -103,13 +103,13 @@ class MessageWindow: self.notebook.set_show_tabs(False) self.notebook.set_show_border(gajim.config.get('tabs_border')) - # set up DnD - self.hid = self.notebook.connect('drag_data_received', - self.on_tab_label_drag_data_received_cb) - self.handlers[self.hid] = self.notebook - - self.notebook.drag_dest_set(gtk.DEST_DEFAULT_ALL, self.DND_TARGETS, - gtk.gdk.ACTION_MOVE) + # if GTK+ version < 2.10, use OUR way to reorder tabs (set up DnD) + if gtk.pygtk_version < (2, 10, 0) or gtk.gtk_version < (2, 10, 0): + self.hid = self.notebook.connect('drag_data_received', + self.on_tab_label_drag_data_received_cb) + self.handlers[self.hid] = self.notebook + self.notebook.drag_dest_set(gtk.DEST_DEFAULT_ALL, self.DND_TARGETS, + gtk.gdk.ACTION_MOVE) def change_account_name(self, old_name, new_name): if self._controls.has_key(old_name): @@ -146,9 +146,16 @@ class MessageWindow: def _on_window_delete(self, win, event): # Make sure all controls are okay with being deleted + ctrl_to_minimize = [] for ctrl in self.controls(): - if not ctrl.allow_shutdown(self.CLOSE_CLOSE_BUTTON): + allow_shutdown = ctrl.allow_shutdown(self.CLOSE_CLOSE_BUTTON) + if allow_shutdown == 'no': return True # halt the delete + elif allow_shutdown == 'minimize': + ctrl_to_minimize.append(ctrl) + # If all are ok, minimize the one that need to be minimized + for ctrl in ctrl_to_minimize: + ctrl.minimize() return False def _on_window_destroy(self, win): @@ -191,7 +198,11 @@ class MessageWindow: control.handlers[id] = tab_label_box self.notebook.append_page(control.widget, tab_label_box) - self.setup_tab_dnd(control.widget) + # If GTK+ version >= 2.10, use gtk native way to reorder tabs + if gtk.pygtk_version >= (2, 10, 0) and gtk.gtk_version >= (2, 10, 0): + self.notebook.set_tab_reorderable(control.widget, True) + else: + self.setup_tab_dnd(control.widget) self.redraw_tab(control) self.window.show_all() @@ -301,7 +312,12 @@ class MessageWindow: '''reason is only for gc (offline status message) if force is True, do not ask any confirmation''' # Shutdown the MessageControl - if not force and not ctrl.allow_shutdown(method): + allow_shutdown = ctrl.allow_shutdown(method) + if not force and allow_shutdown == 'no': + return + if allow_shutdown == 'minimize' and method != self.CLOSE_COMMAND: + ctrl.minimize() + self.check_tabs() return if reason is not None: # We are leaving gc with a status message ctrl.shutdown(reason) @@ -313,7 +329,10 @@ class MessageWindow: types = ['printed_msg', 'chat', 'gc_msg']) del gajim.last_message_time[ctrl.account][ctrl.get_full_jid()] - self.disconnect_tab_dnd(ctrl.widget) + # Disconnect tab DnD only if GTK version < 2.10 + if gtk.pygtk_version < (2, 10, 0) or gtk.gtk_version < (2, 10, 0): + self.disconnect_tab_dnd(ctrl.widget) + self.notebook.remove_page(self.notebook.page_num(ctrl.widget)) fjid = ctrl.get_full_jid() @@ -533,7 +552,7 @@ class MessageWindow: (event.state & gtk.gdk.MOD1_MASK): # ALT + 1,2,3.. self.notebook.set_current_page(st.index(event.string)) elif event.keyval == gtk.keysyms.c: # ALT + C toggles chat buttons - ctrl.chat_buttons_set_visible(not ctrl.hide_chat_buttons_current) + ctrl.chat_buttons_set_visible(not ctrl.hide_chat_buttons) # Close tab bindings elif event.keyval == gtk.keysyms.Escape and \ gajim.config.get('escape_key_closes'): # Escape diff --git a/src/music_track_listener.py b/src/music_track_listener.py index aad6f803a..2b332ae5f 100644 --- a/src/music_track_listener.py +++ b/src/music_track_listener.py @@ -61,6 +61,8 @@ class MusicTrackListener(gobject.GObject): 'NameOwnerChanged', 'org.freedesktop.DBus', arg0='org.gnome.Rhythmbox') bus.add_signal_receiver(self._player_playing_changed_cb, 'playingChanged', 'org.gnome.Rhythmbox.Player') + bus.add_signal_receiver(self._player_playing_song_property_changed_cb, + 'playingSongPropertyChanged', 'org.gnome.Rhythmbox.Player') ## Banshee banshee_bus = dbus.SessionBus() @@ -77,7 +79,7 @@ class MusicTrackListener(gobject.GObject): # Otherwise, it opens Banshee! self.banshee_props ={} gobject.timeout_add(1000, self._banshee_check_track_status) - + def _check_if_banshee_bus(self): if self.dubus_methods.NameHasOwner('org.gnome.Banshee'): self._get_banshee_bus() @@ -86,7 +88,6 @@ class MusicTrackListener(gobject.GObject): self.banshee_is_here = False return True - def _get_banshee_bus(self): bus = dbus.SessionBus() banshee = bus.get_object('org.gnome.Banshee', '/org/gnome/Banshee/Player') @@ -106,6 +107,10 @@ class MusicTrackListener(gobject.GObject): else: self.emit('music-track-changed', None) + def _player_playing_song_property_changed_cb(self, a, b, c, d): + if b == 'rb:stream-song-title': + self.emit('music-track-changed', self._last_playing_music) + def _muine_properties_extract(self, song_string): d = dict((x.strip() for x in s1.split(':', 1)) for s1 in \ song_string.split('\n')) diff --git a/src/network_manager_listener.py b/src/network_manager_listener.py index aeeb13a34..5c5cba42d 100644 --- a/src/network_manager_listener.py +++ b/src/network_manager_listener.py @@ -27,23 +27,25 @@ def device_no_longer_active(self, *args): 'listen_to_network_manager') and connection.connected > 1: connection._disconnectedReconnCB() +supported = False -from common.dbus_support import system_bus +try: + from common.dbus_support import system_bus -import dbus -import dbus.glib + bus = system_bus.SystemBus() -bus = system_bus.SystemBus() - -bus.add_signal_receiver(device_no_longer_active, - 'DeviceNoLongerActive', - 'org.freedesktop.NetworkManager', - 'org.freedesktop.NetworkManager', - '/org/freedesktop/NetworkManager') - -bus.add_signal_receiver(device_now_active, - 'DeviceNowActive', - 'org.freedesktop.NetworkManager', - 'org.freedesktop.NetworkManager', - '/org/freedesktop/NetworkManager') + if 'org.freedesktop.NetworkManager' in bus.list_names(): + supported = True + bus.add_signal_receiver(device_no_longer_active, + 'DeviceNoLongerActive', + 'org.freedesktop.NetworkManager', + 'org.freedesktop.NetworkManager', + '/org/freedesktop/NetworkManager') + bus.add_signal_receiver(device_now_active, + 'DeviceNowActive', + 'org.freedesktop.NetworkManager', + 'org.freedesktop.NetworkManager', + '/org/freedesktop/NetworkManager') +except: + pass diff --git a/src/notify.py b/src/notify.py index 66b130791..36555b04c 100644 --- a/src/notify.py +++ b/src/notify.py @@ -154,7 +154,11 @@ def notify(event, jid, account, parameters, advanced_notif_num = None): message_type = parameters[0] is_first_message = parameters[1] nickname = parameters[2] - message = parameters[3] + if gajim.config.get('notification_preview_message'): + message = parameters[3] + else: + # We don't want message preview, do_preview = False + message = '' if helpers.allow_showing_notification(account, 'notify_on_new_message', advanced_notif_num, is_first_message): do_popup = True @@ -235,8 +239,12 @@ def notify(event, jid, account, parameters, advanced_notif_num = None): img = os.path.join(gajim.DATA_DIR, 'pixmaps', 'events', 'priv_msg_recv.png') title = _('New Private Message from group chat %s') % room_name - text = _('%(nickname)s: %(message)s') % {'nickname': nickname, - 'message': message} + if message: + text = _('%(nickname)s: %(message)s') % {'nickname': nickname, + 'message': message} + else: + text = _('Messaged by %(nickname)s') % {'nickname': nickname} + else: # chat message event_type = _('New Message') img = os.path.join(gajim.DATA_DIR, 'pixmaps', 'events', @@ -299,7 +307,8 @@ def popup(event_type, jid, account, msg_type = '', path_to_image = None, gajim.log.debug(str(e)) # we failed to speak to notification daemon via D-Bus if USER_HAS_PYNOTIFY: # try via libnotify - if not text: + if not text and event_type == 'new_message': + # empty text for new_message means do_preview = False text = gajim.get_name_from_jid(account, jid) # default value of text if not title: title = event_type @@ -408,8 +417,9 @@ class DesktopNotification: self.jid = jid self.msg_type = msg_type - if not text: - # default value of text + # default value of text + if not text and event_type == 'new_message': + # empty text for new_message means do_preview = False self.text = gajim.get_name_from_jid(account, jid) if not title: diff --git a/src/profile_window.py b/src/profile_window.py index b56329aa4..94a4cde4f 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -77,10 +77,6 @@ class ProfileWindow: # Create Image for avatar button image = gtk.Image() self.xml.get_widget('PHOTO_button').set_image(image) - text_button = self.xml.get_widget('NOPHOTO_button') - # We use 2 buttons because some GTK theme don't show images in buttons - text_button.set_no_show_all(True) - text_button.hide() self.xml.signal_autoconnect(self) self.window.show_all() diff --git a/src/remote_control.py b/src/remote_control.py index c9583f50f..e6712e8b5 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -4,6 +4,8 @@ ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005-2006 Dimitur Kirov ## Copyright (C) 2005-2006 Andrew Sayman +## Copyright (C) 2007 Lukas Petrovicky +## Copyright (C) 2007 Julien Pivotto ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published @@ -223,6 +225,31 @@ 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''' + connected_account = None + accounts = gajim.contacts.get_accounts() + # if there is only one account in roster, take it as default + # if user did not ask for account + if not account and len(accounts) == 1: + account = accounts[0] + if account: + if gajim.connections[account].connected > 1 and \ + room_jid in gajim.gc_connected[account] and \ + gajim.gc_connected[account][room_jid]: + # account and groupchat are connected + connected_account = account + else: + for account in accounts: + if gajim.connections[account].connected > 1 and \ + room_jid in gajim.gc_connected[account] and \ + gajim.gc_connected[account][room_jid]: + # account and groupchat are connected + connected_account = account + break + return connected_account + @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 @@ -269,6 +296,19 @@ class SignalObject(dbus.service.Object): 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'.''' + if not room_jid or not message: + return DBUS_BOOLEAN(False) + connected_account = self._get_account_for_groupchat(account, room_jid) + if connected_account: + connection = gajim.connections[connected_account] + connection.send_gc_message(room_jid, message) + return DBUS_BOOLEAN(True) + return DBUS_BOOLEAN(False) + @dbus.service.method(INTERFACE, in_signature='ss', out_signature='b') def open_chat(self, jid, account): '''Shows the tabbed window for new message to 'jid', using account @@ -410,7 +450,7 @@ class SignalObject(dbus.service.Object): if acct in accounts: for jid in gajim.contacts.get_jid_list(acct): item = self._contacts_as_dbus_structure( - gajim.contacts.get_contact(acct, jid)) + gajim.contacts.get_contacts(acct, jid)) if item: result.append(item) return result @@ -503,7 +543,7 @@ class SignalObject(dbus.service.Object): accounts = [account] contact_exists = False for account in accounts: - contacts = gajim.contacts.get_contact(account, jid) + contacts = gajim.contacts.get_contacts(account, jid) if contacts: gajim.connections[account].unsubscribe(jid) for contact in contacts: @@ -531,12 +571,12 @@ class SignalObject(dbus.service.Object): nick_in_roster = None # Is jid a nick ? for account in accounts: # Does jid exists in roster of one account ? - if gajim.contacts.get_contacts_from_jid(account, jid): + if gajim.contacts.get_contacts(account, jid): return jid if not nick_in_roster: # look in all contact if one has jid as nick for jid_ in gajim.contacts.get_jid_list(account): - c = gajim.contacts.get_contacts_from_jid(account, jid_) + c = gajim.contacts.get_contacts(account, jid_) if c[0].name == jid: nick_in_roster = jid_ break diff --git a/src/roster_window.py b/src/roster_window.py index 59f65d620..ebaa3cd31 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -4,6 +4,8 @@ ## Copyright (C) 2003-2006 Yann Le Boulanger ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2005-2006 Dimitur Kirov +## Copyright (C) 2007 Lukas Petrovicky +## Copyright (C) 2007 Julien Pivotto ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published @@ -16,6 +18,7 @@ ## import gtk +import pango import gobject import os import time @@ -33,6 +36,7 @@ import tooltips import message_control import adhoc_commands import notify +import features_window from common import gajim from common import helpers @@ -64,6 +68,7 @@ class RosterWindow: '''Class for main window of the GTK+ interface''' def get_account_iter(self, name): + ''' Returns a gtk.TreeIter of accounts in roster data model or None ''' model = self.tree.get_model() if model is None: return @@ -78,6 +83,7 @@ class RosterWindow: return account_iter def get_group_iter(self, name, account): + ''' Returns a gtk.TreeIter of groups in roster data model or None ''' model = self.tree.get_model() root = self.get_account_iter(account) group_iter = model.iter_children(root) @@ -143,8 +149,8 @@ class RosterWindow: path = None return path - def show_and_select_path(self, path, jid, account): - '''Show contact in roster (if he is invisible for example) + def show_and_select_path(self, path, jid, account): + '''Show contact in roster (if he is invisible for example) and select line''' if not path: # contact is in roster but we curently don't see him online @@ -163,10 +169,12 @@ class RosterWindow: self.tree.set_cursor(path) def add_account_to_roster(self, account): + ''' Add an account to roster data model. ''' model = self.tree.get_model() if self.get_account_iter(account): return + # if we merge accounts... if self.regroup: show = helpers.get_global_show() model.append(None, [self.jabber_state_images['16'][show], @@ -234,7 +242,7 @@ class RosterWindow: gajim.get_number_of_connected_accounts())) and gajim.config.get( 'show_contacts_number'): nbr_on, nbr_total = gajim.contacts.get_nb_online_total_contacts( - accounts = accounts) + accounts = accounts) account_name += ' (%s/%s)' % (repr(nbr_on),repr(nbr_total)) model[iter][C_NAME] = account_name @@ -254,7 +262,7 @@ class RosterWindow: contact = gajim.contacts.get_first_contact_from_jid(account, jid) nb_events = gajim.events.get_nb_roster_events(account, contact.jid) # count events from all resources - for contact_ in gajim.contacts.get_contact(account, jid): + for contact_ in gajim.contacts.get_contacts(account, jid): if contact_.resource: nb_events += gajim.events.get_nb_roster_events(account, contact_.get_full_jid()) @@ -293,7 +301,7 @@ class RosterWindow: family = gajim.contacts.get_metacontacts_family(account, jid) # family members that are in roster and belong to the same account. - shown_family = [] + shown_family = [] if family: for data in family: _account = data['account'] @@ -301,7 +309,7 @@ class RosterWindow: if _account != account and not self.regroup: continue _jid = data['jid'] - + if self.get_contact_iter(_jid, _account): shown_family.append(data) if _jid == jid and _account == account: @@ -331,14 +339,14 @@ class RosterWindow: if (contact.show in ('offline', 'error') or hide) and \ not showOffline and (not _('Transports') in contact.groups or \ gajim.connections[account].connected < 2) and \ - len(gajim.contacts.get_contact(account, jid)) == 1 and nb_events == 0 and\ + len(gajim.contacts.get_contacts(account, jid)) == 1 and nb_events == 0 and\ not _('Not in Roster') in contact.groups: return # Remove brother contacts that are already in roster to add them # under this iter for data in shown_family: - contacts = gajim.contacts.get_contact(data['account'], + contacts = gajim.contacts.get_contacts(data['account'], data['jid']) for c in contacts: self.remove_contact(c, data['account']) @@ -348,6 +356,7 @@ class RosterWindow: elif not groups: groups = [_('General')] for group in groups: + self.draw_group(group, account) iterG = self.get_group_iter(group, account) if not iterG: IterAcct = self.get_account_iter(account) @@ -370,7 +379,7 @@ class RosterWindow: typestr = 'contact' if group == _('Transports'): typestr = 'agent' - if group == _('Groupchats'): + if gajim.gc_connected[account].has_key(jid): typestr = 'groupchat' name = contact.get_shown_name() @@ -383,7 +392,7 @@ class RosterWindow: self.draw_avatar(jid, account) # put the children under this iter for data in shown_family: - contacts = gajim.contacts.get_contact(data['account'], + contacts = gajim.contacts.get_contacts(data['account'], data['jid']) self.add_contact_to_roster(data['jid'], data['account']) @@ -426,12 +435,19 @@ class RosterWindow: contact = gajim.contacts.get_contact_with_highest_priority(account, jid) if contact == None: contact = gajim.contacts.create_contact(jid = jid, name = jid, - groups = [_('Groupchats')], show = 'muc_active', + groups = [_('Groupchats')], show = 'online', status = status, sub = 'none', resource = resource) gajim.contacts.add_contact(account, contact) self.add_contact_to_roster(jid, account) - self.draw_group(_('Groupchats'), account) + self.draw_group(_('Groupchats'), account) + else: + contact.show = 'online' + self.draw_contact(jid, account) + self.add_contact_to_roster(jid, account) + for group in contact.groups: + self.draw_group(group, account) + self.draw_account(account) return contact def get_self_contact_iter(self, account): @@ -485,8 +501,8 @@ class RosterWindow: return if contact.jid in gajim.to_be_removed[account]: gajim.to_be_removed[account].remove(contact.jid) - - + + hide = contact.is_hidden_from_roster() show_offline = gajim.config.get('showoffline') @@ -526,7 +542,7 @@ class RosterWindow: c_account = model[child_iter][C_ACCOUNT].decode('utf-8') children.append((c_jid, c_account)) child_iter = model.iter_next(child_iter) - + # Remove iters and group iter if they are empty for i in iters: parent_i = model.iter_parent(i) @@ -543,6 +559,8 @@ class RosterWindow: else: if gajim.groups[account].has_key(group): del gajim.groups[account][group] + else: + self.draw_group(group, account) # re-add children for child in children: @@ -573,7 +591,7 @@ class RosterWindow: iters = self.get_contact_iter(jid, account) if len(iters) == 0: return - contact_instances = gajim.contacts.get_contact(account, jid) + contact_instances = gajim.contacts.get_contacts(account, jid) contact = gajim.contacts.get_highest_prio_contact_from_contacts( contact_instances) if not contact: @@ -581,8 +599,7 @@ class RosterWindow: name = gobject.markup_escape_text(contact.get_shown_name()) # gets number of unread gc marked messages - if gajim.interface.minimized_controls.has_key(account) and \ - jid in gajim.interface.minimized_controls[account]: + if jid in gajim.interface.minimized_controls[account]: nb_unread = len(gajim.events.get_events(account, jid, ['printed_marked_gc_msg'])) nb_unread += \ @@ -645,22 +662,28 @@ class RosterWindow: status = helpers.reduce_chars_newlines(status, max_lines = 1) # escape markup entities and make them small italic and fg color color = gtkgui_helpers._get_fade_color(self.tree, selected, focus) - colorstring = "#%04x%04x%04x" % (color.red, color.green, color.blue) + colorstring = '#%04x%04x%04x' % (color.red, color.green, color.blue) name += \ '\n%s' \ % (colorstring, gobject.markup_escape_text(status)) iter = iters[0] # choose the icon with the first iter + + if gajim.gc_connected[account].has_key(jid): + contact.show = 'online' + model[iter][C_TYPE] = 'groupchat' + icon_name = helpers.get_icon_name_to_show(contact, account) # look if another resource has awaiting events for c in contact_instances: c_icon_name = helpers.get_icon_name_to_show(c, account) - if c_icon_name == 'message': + if c_icon_name in ('event', 'muc_active', 'muc_inactive'): icon_name = c_icon_name break path = model.get_path(iter) if model.iter_has_child(iter): - if not self.tree.row_expanded(path) and icon_name != 'message': + if not self.tree.row_expanded(path) and \ + icon_name not in ('event', 'muc_active', 'muc_inactive'): child_iter = model.iter_children(iter) if icon_name in ('error', 'offline'): # get the icon from the first child as they are sorted by show @@ -677,7 +700,7 @@ class RosterWindow: child_jid = model[child_iter][C_JID].decode('utf-8') child_account = model[child_iter][C_ACCOUNT].decode('utf-8') if len(gajim.events.get_events(child_account, child_jid)): - icon_name = 'message' + icon_name = 'event' break child_iter = model.iter_next(child_iter) if self.tree.row_expanded(path): @@ -691,13 +714,6 @@ class RosterWindow: self.draw_parent_contact(jid, account) state_images = self.get_appropriate_state_images(jid, icon_name = icon_name) - - if icon_name != 'message' and gajim.gc_connected[account].\ - has_key(jid): - if gajim.gc_connected[account][jid]: - icon_name = 'muc_active' - else: - icon_name = 'muc_inactive' img = state_images[icon_name] @@ -742,44 +758,46 @@ class RosterWindow: win.set_active_tab(room_jid, account) dialogs.ErrorDialog(_('You are already in group chat %s') % room_jid) return - if gajim.interface.minimized_controls.has_key(account) and \ - room_jid in gajim.interface.minimized_controls[account]: - self.on_groupchat_maximized(None, room_jid, account) - return + minimized_control_exists = False + if room_jid in gajim.interface.minimized_controls[account]: + minimized_control_exists = True 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 invisible')) return - if minimize: + if minimize and not minimized_control_exists and \ + not gajim.interface.msg_win_mgr.has_window(room_jid, account): contact = gajim.contacts.create_contact(jid = room_jid, name = nick) gc_control = GroupchatControl(None, contact, account) - - if not gajim.interface.minimized_controls.has_key(account): - gajim.interface.minimized_controls[account] = {} gajim.interface.minimized_controls[account][room_jid] = gc_control - - self.add_groupchat_to_roster(account, room_jid) gajim.connections[account].join_gc(nick, room_jid, password) if password: gajim.gc_passwords[room_jid] = password + self.add_groupchat_to_roster(account, room_jid) return - if not gajim.interface.msg_win_mgr.has_window(room_jid, account): + if not minimized_control_exists and \ + not gajim.interface.msg_win_mgr.has_window(room_jid, account): self.new_room(room_jid, nick, account) - gc_win = gajim.interface.msg_win_mgr.get_window(room_jid, account) - gc_win.set_active_tab(room_jid, account) - gc_win.window.present() + if not minimized_control_exists: + gc_win = gajim.interface.msg_win_mgr.get_window(room_jid, account) + gc_win.set_active_tab(room_jid, account) + gc_win.window.present() gajim.connections[account].join_gc(nick, room_jid, password) if password: gajim.gc_passwords[room_jid] = password + contact = gajim.contacts.get_contact_with_highest_priority(account, \ + room_jid) + if contact or minimized_control_exists: + self.add_groupchat_to_roster(account, room_jid) def on_actions_menuitem_activate(self, widget): self.make_menu() - + def on_edit_menuitem_activate(self, widget): '''need to call make_menu to build profile, avatar item''' self.make_menu() - + def on_bookmark_menuitem_activate(self, widget, account, bookmark): self.join_gc_room(account, bookmark['jid'], bookmark['nick'], bookmark['password']) @@ -802,7 +820,7 @@ class RosterWindow: else: gajim.interface.instances[account]['privacy_lists'] = \ dialogs.PrivacyListsWindow(account) - + def on_blocked_contacts_menuitem_activate(self, widget, account): if gajim.interface.instances[account].has_key('blocked_contacts'): gajim.interface.instances[account]['blocked_contacts'].window.present() @@ -874,7 +892,7 @@ class RosterWindow: else: send_single_message_menuitem.connect('activate', self.on_send_single_message_menuitem_activate, account) - + send_server_message_menuitem.connect('activate', self.on_send_server_message_menuitem_activate, account) @@ -952,15 +970,15 @@ class RosterWindow: gc_sub_menu = gtk.Menu() # gc is always a submenu join_gc_menuitem.set_submenu(gc_sub_menu) - + connected_accounts = gajim.get_number_of_connected_accounts() if connected_accounts > 1: # 2 or more accounts? make submenus add_sub_menu = gtk.Menu() disco_sub_menu = gtk.Menu() new_chat_sub_menu = gtk.Menu() - accounts_list = gajim.contacts.get_accounts() - accounts_list.sort() + accounts_list = gajim.contacts.get_accounts() + accounts_list.sort() for account in accounts_list: if gajim.connections[account].connected <= 1: # if offline or connecting @@ -973,20 +991,15 @@ class RosterWindow: new_chat_item.connect('activate', self.on_new_chat_menuitem_activate, account) - if gajim.config.get_per('accounts', account, 'is_zeroconf'): - continue + if gajim.config.get_per('accounts', account, 'is_zeroconf'): + continue # join gc - label = gtk.Label() - label.set_markup('' + account.upper() +'') - label.set_use_underline(False) - gc_item = gtk.MenuItem() - gc_item.add(label) - gc_item.connect('state-changed', - gtkgui_helpers.on_bm_header_changed_state) + gc_item = gtk.MenuItem(_('using account %s') % account, False) gc_sub_menu.append(gc_item) - - self.add_bookmarks_list(gc_sub_menu, account) + gc_menuitem_menu = gtk.Menu() + self.add_bookmarks_list(gc_menuitem_menu, account) + gc_item.set_submenu(gc_menuitem_menu) # the 'manage gc bookmarks' item is shown # below to avoid duplicate code @@ -1009,6 +1022,7 @@ class RosterWindow: disco_sub_menu.show_all() new_chat_menuitem.set_submenu(new_chat_sub_menu) new_chat_sub_menu.show_all() + gc_sub_menu.show_all() elif connected_accounts == 1: # user has only one account for account in gajim.connections: @@ -1036,9 +1050,9 @@ class RosterWindow: new_chat_menuitem.add_accelerator('activate', ag, gtk.keysyms.n, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) self.have_new_chat_accel = True - + break # No other account connected - + if connected_accounts == 0: # no connected accounts, make the menuitems insensitive for item in [new_chat_menuitem, join_gc_menuitem,\ @@ -1048,7 +1062,7 @@ class RosterWindow: for item in [new_chat_menuitem, join_gc_menuitem,\ add_new_contact_menuitem, service_disco_menuitem]: item.set_sensitive(True) - + # disable some fields if only local account is there if connected_accounts == 1: for account in gajim.connections: @@ -1085,6 +1099,12 @@ class RosterWindow: pep_services_sub_menu.append(pep_services_item) pep_services_item.connect('activate', self.on_pep_services_menuitem_activate, account) + # profile, avatar + profile_avatar_item = gtk.MenuItem(_('of account %s') % account, + False) + profile_avatar_sub_menu.append(profile_avatar_item) + profile_avatar_item.connect('activate', + self.on_profile_avatar_menuitem_activate, account) profile_avatar_menuitem.set_submenu(profile_avatar_sub_menu) profile_avatar_sub_menu.show_all() pep_services_menuitem.set_submenu(pep_services_sub_menu) @@ -1117,7 +1137,7 @@ class RosterWindow: self.on_manage_bookmarks_menuitem_activate) gc_sub_menu.append(newitem) gc_sub_menu.show_all() - + # Advanced Actions if len(gajim.connections) == 0: # user has no accounts advanced_menuitem.set_sensitive(False) @@ -1126,7 +1146,7 @@ class RosterWindow: advanced_menuitem_menu = self.get_and_connect_advanced_menuitem_menu( account) self.advanced_menus.append(advanced_menuitem_menu) - + self._add_history_manager_menuitem(advanced_menuitem_menu) advanced_menuitem.set_submenu(advanced_menuitem_menu) @@ -1144,20 +1164,20 @@ class RosterWindow: self.get_and_connect_advanced_menuitem_menu(account) self.advanced_menus.append(advanced_menuitem_menu) advanced_item.set_submenu(advanced_menuitem_menu) - + self._add_history_manager_menuitem(advanced_sub_menu) - + advanced_menuitem.set_submenu(advanced_sub_menu) advanced_sub_menu.show_all() self.actions_menu_needs_rebuild = False def _add_history_manager_menuitem(self, menu): - '''adds a seperator and History Manager menuitem BELOW for account + '''adds a seperator and History Manager menuitem BELOW for account menuitems''' item = gtk.SeparatorMenuItem() # separator menu.append(item) - + # History manager item = gtk.ImageMenuItem(_('History Manager')) icon = gtk.image_new_from_stock(gtk.STOCK_JUSTIFY_FILL, @@ -1165,12 +1185,18 @@ class RosterWindow: item.set_image(icon) menu.append(item) 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''' - item = gtk.MenuItem(_('_Join New Group Chat')) + item = gtk.ImageMenuItem(_('_Join New Group Chat')) + icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) + item.set_image(icon) item.connect('activate', self.on_join_gc_activate, account) gc_sub_menu.append(item) + + if len(gajim.connections[account].bookmarks) > 0: # user has at least one bookmark + item = gtk.SeparatorMenuItem() # separator + gc_sub_menu.append(item) for bookmark in gajim.connections[account].bookmarks: item = gtk.MenuItem(bookmark['name'], False) # Do not use underline @@ -1179,7 +1205,7 @@ class RosterWindow: gc_sub_menu.append(item) def _change_style(self, model, path, iter, option): - if option is None or model[iter][C_TYPE] == option: + if option is None or model[iter][C_TYPE] == option: # We changed style for this type of row model[iter][C_NAME] = model[iter][C_NAME] @@ -1198,6 +1224,8 @@ class RosterWindow: for acct in gajim.connections: self.add_account_to_roster(acct) self.add_account_contacts(acct) + # Recalculate column width for ellipsizing + self.tree.columns_autosize() def add_account_contacts(self, account): '''adds contacts of group to roster treeview''' @@ -1280,13 +1308,18 @@ class RosterWindow: def chg_contact_status(self, contact, show, status, account): '''When a contact changes his or her status''' - contact_instances = gajim.contacts.get_contact(account, contact.jid) + contact_instances = gajim.contacts.get_contacts(account, contact.jid) contact.show = show contact.status = status + # name is to show in conversation window + name = contact.get_shown_name() + if show in ('offline', 'error') and \ len(gajim.events.get_events(account, contact.get_full_jid())) == 0: if len(contact_instances) > 1: # if multiple resources + if contact.resource != '': + name += '/' + contact.resource jid_with_resource = contact.jid + '/' + contact.resource if gajim.interface.msg_win_mgr.has_window(jid_with_resource, account): @@ -1296,33 +1329,26 @@ class RosterWindow: ctrl.update_ui() win.redraw_tab(ctrl) gajim.contacts.remove_contact(account, contact) + elif len(contact_instances) > 1 and contact.resource != '': + name += '/' + contact.resource self.remove_contact(contact, account) self.add_contact_to_roster(contact.jid, account) # print status in chat window and update status/GPG image - jid_list = [contact.jid] - for jid in jid_list: - if gajim.interface.msg_win_mgr.has_window(jid, account): - win = gajim.interface.msg_win_mgr.get_window(jid, account) - ctrl = win.get_control(jid, account) - ctrl.contact = gajim.contacts.get_contact_with_highest_priority( - account, contact.jid) - ctrl.update_ui() - win.redraw_tab(ctrl) + if gajim.interface.msg_win_mgr.has_window(contact.jid, account): + win = gajim.interface.msg_win_mgr.get_window(contact.jid, account) + ctrl = win.get_control(contact.jid, account) + ctrl.contact = gajim.contacts.get_contact_with_highest_priority( + account, contact.jid) + ctrl.update_ui() + win.redraw_tab(ctrl) - name = contact.get_shown_name() - - # if multiple resources (or second one disconnecting) - if (len(contact_instances) > 1 or (len(contact_instances) == 1 and \ - show in ('offline', 'error'))) and contact.resource != '': - name += '/' + contact.resource - - uf_show = helpers.get_uf_show(show) - if status: - ctrl.print_conversation(_('%s is now %s (%s)') % (name, uf_show, - status), 'status') - else: # No status message - ctrl.print_conversation(_('%s is now %s') % (name, uf_show), - 'status') + uf_show = helpers.get_uf_show(show) + if status: + ctrl.print_conversation(_('%s is now %s (%s)') % (name, uf_show, + status), 'status') + else: # No status message + ctrl.print_conversation(_('%s is now %s') % (name, uf_show), + 'status') if not contact.groups: self.draw_group(_('General'), account) @@ -1330,7 +1356,7 @@ class RosterWindow: for group in contact.groups: self.draw_group(group, account) - self.draw_account(account) + self.draw_account(account) def on_info(self, widget, contact, account): '''Call vcard_information_window class to display contact's information''' @@ -1349,7 +1375,7 @@ class RosterWindow: if info.has_key(contact.jid): info[contact.jid].window.present() else: - contact = gajim.contacts.get_first_contact_from_jid(account, + contact = gajim.contacts.get_first_contact_from_jid(account, contact.jid) if contact.show in ('offline', 'error'): # don't show info on offline contacts @@ -1365,7 +1391,7 @@ class RosterWindow: if props and self.tooltip.id == props[0]: # bounding rectangle of coordinates for the cell within the treeview rect = self.tree.get_cell_area(props[0], props[1]) - + # position of the treeview on the screen position = self.tree.window.get_origin() self.tooltip.show_tooltip(contact, rect.height, position[1] + rect.y) @@ -1398,7 +1424,7 @@ class RosterWindow: jid = model[iter][C_JID].decode('utf-8') if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: self.tooltip.id = row - contacts = gajim.contacts.get_contact(account, jid) + contacts = gajim.contacts.get_contacts(account, jid) connected_contacts = [] for c in contacts: if c.show not in ('offline', 'error'): @@ -1414,7 +1440,7 @@ class RosterWindow: jid = model[iter][C_JID].decode('utf-8') if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: self.tooltip.id = row - contact = gajim.contacts.get_contact(account, jid) + contact = gajim.contacts.get_contacts(account, jid) self.tooltip.account = account self.tooltip.timeout = gobject.timeout_add(500, self.show_tooltip, contact) @@ -1558,7 +1584,7 @@ class RosterWindow: # needed for draw_contact: gajim.connections[account].blocked_contacts.append(contact.jid) self.draw_contact(contact.jid, account) - else: + else: group = model[iter][C_JID].decode('utf-8') for (contact, account) in group_list: if account not in accounts: @@ -1671,12 +1697,12 @@ class RosterWindow: gajim.connections[account].status, to=contact.jid) else: self.send_status(account, show, - gajim.connections[account].status, to=contact.jid) + gajim.connections[account].status, to=contact.jid) def on_rename(self, widget, iter, path): # this function is called either by F2 or by Rename menuitem if gajim.interface.instances.has_key('rename'): - gajim.interface.instances['rename'].dialog.window.present() + gajim.interface.instances['rename'].dialog.present() return model = self.tree.get_model() @@ -1705,7 +1731,7 @@ class RosterWindow: if row_type in ('contact', 'agent'): if old_text == new_text: return - for u in gajim.contacts.get_contact(account, jid): + for u in gajim.contacts.get_contacts(account, jid): u.name = new_text gajim.connections[account].update_contact(jid, new_text, u.groups) self.draw_contact(jid, account) @@ -1745,7 +1771,7 @@ class RosterWindow: def on_canceled(): if gajim.interface.instances.has_key('rename'): del gajim.interface.instances['rename'] - + gajim.interface.instances['rename'] = dialogs.InputDialog(title, message, old_text, False, (on_renamed, account, row_type, jid, old_text), on_canceled) @@ -1785,8 +1811,8 @@ class RosterWindow: contact.name, contact.groups) self.add_contact_to_roster(contact.jid, account) else: - gajim.connections[account].unsubscribe(contact.jid) - for c in gajim.contacts.get_contact(account, contact.jid): + gajim.connections[account].unsubscribe(contact.jid) + for c in gajim.contacts.get_contacts(account, contact.jid): self.remove_contact(c, account) gajim.contacts.remove_jid(account, c.jid) self.readd_if_needed(contact, account) @@ -1814,11 +1840,11 @@ class RosterWindow: if keyID[0] == _('None'): if contact.jid in keys: del keys[contact.jid] - for u in gajim.contacts.get_contact(account, contact.jid): + for u in gajim.contacts.get_contacts(account, contact.jid): u.keyID = '' else: keys[contact.jid] = keyID[0] - for u in gajim.contacts.get_contact(account, contact.jid): + for u in gajim.contacts.get_contacts(account, contact.jid): u.keyID = keyID[0] if gajim.interface.msg_win_mgr.has_window(contact.jid, account): ctrl = gajim.interface.msg_win_mgr.get_control(contact.jid, account) @@ -1828,6 +1854,63 @@ class RosterWindow: keys_str += jid + ' ' + keys[jid] + ' ' gajim.config.set_per('accounts', account, 'attached_gpg_keys', keys_str) + def update_avatar_in_gui(self, jid, account): + # Update roster + self.draw_avatar(jid, account) + # Update chat window + if gajim.interface.msg_win_mgr.has_window(jid, account): + win = gajim.interface.msg_win_mgr.get_window(jid, account) + ctrl = win.get_control(jid, account) + if win and ctrl.type_id != message_control.TYPE_GC: + ctrl.show_avatar() + + def on_set_custom_avatar_activate(self, widget, contact, account): + def on_ok(widget, path_to_file): + filesize = os.path.getsize(path_to_file) # in bytes + invalid_file = False + msg = '' + if os.path.isfile(path_to_file): + stat = os.stat(path_to_file) + if stat[6] == 0: + invalid_file = True + msg = _('File is empty') + else: + invalid_file = True + msg = _('File does not exist') + if invalid_file: + dialogs.ErrorDialog(_('Could not load image'), msg) + return + try: + pixbuf = gtk.gdk.pixbuf_new_from_file(path_to_file) + if filesize > 16384: # 16 kb + # get the image at 'notification size' + # and hope that user did not specify in ACE crazy size + pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'tooltip') + except gobject.GError, msg: # unknown format + # msg should be string, not object instance + msg = str(msg) + dialogs.ErrorDialog(_('Could not load image'), msg) + return + puny_jid = helpers.sanitize_filename(contact.jid) + path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + '_local.png' + pixbuf.save(path_to_file, 'png') + dlg.destroy() + self.update_avatar_in_gui(contact.jid, account) + + def on_clear(widget): + dlg.destroy() + # Delete file: + puny_jid = helpers.sanitize_filename(contact.jid) + path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + '_local.png' + try: + os.remove(path_to_file) + except OSError: + gajim.log.debug('Cannot remove %s' % path_to_file) + self.update_avatar_in_gui(contact.jid, account) + + dlg = dialogs.AvatarChooserDialog(on_response_ok = on_ok, + on_response_clear = on_clear) + def on_edit_groups(self, widget, list_): dlg = dialogs.EditGroupsDialog(list_) dlg.run() @@ -1840,6 +1923,21 @@ class RosterWindow: gajim.interface.instances['logs'][contact.jid] = history_window.\ HistoryWindow(contact.jid, account) + def on_disconnect(self, widget, jid, account): + '''When disconnect menuitem is activated: disconect from room''' + ctrl = gajim.interface.minimized_controls[account][jid] + del gajim.interface.minimized_controls[account][jid] + ctrl.shutdown() + + contact = gajim.contacts.get_contact_with_highest_priority(account, jid) + if not contact: + return + if contact.groups == [_('Groupchats')]: + self.remove_contact(contact, account) + gajim.contacts.remove_contact(account, contact) + self.draw_group(_('Groupchats'), account) + self.draw_account(account) + def on_send_single_message_menuitem_activate(self, widget, account, contact = None): if contact is None: @@ -1886,9 +1984,6 @@ class RosterWindow: add_special_notification_menuitem = xml.get_widget( 'add_special_notification_menuitem') - add_special_notification_menuitem.hide() - add_special_notification_menuitem.set_no_show_all(True) - if not our_jid: # add a special img for rename menuitem path_to_kbd_input_img = os.path.join(gajim.DATA_DIR, 'pixmaps', @@ -1904,13 +1999,13 @@ class RosterWindow: information_menuitem = xml.get_widget('information_menuitem') history_menuitem = xml.get_widget('history_menuitem') - contacts = gajim.contacts.get_contact(account, jid) + contacts = gajim.contacts.get_contacts(account, jid) if len(contacts) > 1: # several resources sub_menu = gtk.Menu() start_chat_menuitem.set_submenu(sub_menu) iconset = gajim.config.get('iconset') - path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16') + path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for c in contacts: # icon MUST be different instance for every item state_images = self.load_iconset(path) @@ -1945,7 +2040,7 @@ class RosterWindow: account) if _('Not in Roster') not in contact.groups: - #contact is in normal group + # contact is in normal group edit_groups_menuitem.set_no_show_all(False) assign_openpgp_key_menuitem.set_no_show_all(False) edit_groups_menuitem.connect('activate', self.on_edit_groups, [( @@ -2008,13 +2103,35 @@ class RosterWindow: send_file_menuitem = xml.get_widget('send_file_menuitem') assign_openpgp_key_menuitem = xml.get_widget( 'assign_openpgp_key_menuitem') + set_custom_avatar_menuitem = xml.get_widget('set_custom_avatar_menuitem') add_special_notification_menuitem = xml.get_widget( 'add_special_notification_menuitem') execute_command_menuitem = xml.get_widget( 'execute_command_menuitem') - add_special_notification_menuitem.hide() - add_special_notification_menuitem.set_no_show_all(True) + # send custom status icon + blocked = False + if jid in gajim.connections[account].blocked_contacts: + blocked = True + else: + groups = contact.groups + if contact.is_observer(): + groups = [_('Observers')] + elif not groups: + groups = [_('General')] + for group in groups: + if group in gajim.connections[account].blocked_groups: + blocked = True + break + if blocked: + send_custom_status_menuitem.set_image(self.load_icon('offline')) + send_custom_status_menuitem.set_sensitive(False) + elif gajim.interface.status_sent_to_users.has_key(account) and \ + jid in gajim.interface.status_sent_to_users[account]: + send_custom_status_menuitem.set_image( + self.load_icon(gajim.interface.status_sent_to_users[account][jid])) + else: + send_custom_status_menuitem.set_image(None) if not our_jid: # add a special img for rename menuitem @@ -2041,12 +2158,12 @@ class RosterWindow: information_menuitem = xml.get_widget('information_menuitem') history_menuitem = xml.get_widget('history_menuitem') - contacts = gajim.contacts.get_contact(account, jid) + contacts = gajim.contacts.get_contacts(account, jid) # Invite to invite_to_submenu = gtk.Menu() invite_menuitem.set_submenu(invite_to_submenu) - invite_to_new_room_menuitem = gtk.ImageMenuItem(_('_New group chat')) + invite_to_new_room_menuitem = gtk.ImageMenuItem(_('_New Group Chat')) icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) invite_to_new_room_menuitem.set_image(icon) contact_transport = gajim.get_transport_name_from_jid(contact.jid) @@ -2056,7 +2173,8 @@ class RosterWindow: invite_to_submenu.append(invite_to_new_room_menuitem) rooms = [] # a list of (room_jid, account) tuple for gc_control in gajim.interface.msg_win_mgr.get_controls( - message_control.TYPE_GC): + message_control.TYPE_GC) + \ + gajim.interface.minimized_controls[account].values(): acct = gc_control.account room_jid = gc_control.room_jid if gajim.gc_connected[acct].has_key(room_jid) and \ @@ -2071,7 +2189,7 @@ class RosterWindow: status_menuitems = gtk.Menu() send_custom_status_menuitem.set_submenu(status_menuitems) iconset = gajim.config.get('iconset') - path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16') + path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for s in ['online', 'chat', 'away', 'xa', 'dnd', 'offline']: # icon MUST be different instance for every item state_images = self.load_iconset(path) @@ -2083,14 +2201,14 @@ class RosterWindow: status_menuitems.append(status_menuitem) if len(contacts) > 1: # several resources def resources_submenu(action, room_jid = None, room_account = None): - ''' Build a submenu with contact's resources. + ''' Build a submenu with contact's resources. room_jid and room_account are for action self.on_invite_to_room ''' sub_menu = gtk.Menu() iconset = gajim.config.get('iconset') if not iconset: iconset = gajim.config.DEFAULT_ICONSET - path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16') + path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for c in contacts: # icon MUST be different instance for every item state_images = self.load_iconset(path) @@ -2101,7 +2219,7 @@ class RosterWindow: item.set_image(icon) sub_menu.append(item) if action == self.on_invite_to_room: - item.connect('activate', action, [(c, account)], + item.connect('activate', action, [(c, account)], room_jid, room_account, c.resource) elif action == self.on_invite_to_new_room: item.connect('activate', action, [(c, account)], c.resource) @@ -2117,7 +2235,7 @@ class RosterWindow: self.on_invite_to_new_room)) for (room_jid, room_account) in rooms: menuitem = gtk.MenuItem(room_jid.split('@')[0]) - menuitem.set_submenu(resources_submenu(self.on_invite_to_room, + menuitem.set_submenu(resources_submenu(self.on_invite_to_room, room_jid, room_account)) invite_to_submenu.append(menuitem) @@ -2137,16 +2255,16 @@ class RosterWindow: our_jid_other_resource = None if our_jid: # It's another resource of us, be sure to send invite to her - our_jid_other_resource = contact.resource + our_jid_other_resource = contact.resource # Else this var is useless but harmless in next connect calls - - invite_to_new_room_menuitem.connect('activate', - self.on_invite_to_new_room, [(contact, account)], + + invite_to_new_room_menuitem.connect('activate', + self.on_invite_to_new_room, [(contact, account)], our_jid_other_resource) for (room_jid, room_account) in rooms: menuitem = gtk.MenuItem(room_jid.split('@')[0]) menuitem.connect('activate', self.on_invite_to_room, - [(contact, account)], room_jid, room_account, + [(contact, account)], room_jid, room_account, our_jid_other_resource) invite_to_submenu.append(menuitem) @@ -2169,7 +2287,7 @@ class RosterWindow: account) if _('Not in Roster') not in contact.groups: - #contact is in normal group + # contact is in normal group edit_groups_menuitem.set_no_show_all(False) assign_openpgp_key_menuitem.set_no_show_all(False) add_to_roster_menuitem.hide() @@ -2214,13 +2332,13 @@ class RosterWindow: add_to_roster_menuitem.connect('activate', self.on_add_to_roster, contact, account) + set_custom_avatar_menuitem.connect('activate', + self.on_set_custom_avatar_activate, contact, account) # Remove many items when it's self contact row if our_jid: - for menuitem in (rename_menuitem, edit_groups_menuitem, - above_subscription_separator, subscription_menuitem, - remove_from_roster_menuitem): - menuitem.set_no_show_all(True) - menuitem.hide() + menuitem = xml.get_widget('manage_contact') + menuitem.set_no_show_all(True) + menuitem.hide() # Unsensitive many items when account is offline if gajim.connections[account].connected < 2: @@ -2241,11 +2359,10 @@ class RosterWindow: block_menuitem.connect('activate', self.on_block, iter, None) unblock_menuitem.hide() else: - block_menuitem.set_no_show_all(True) unblock_menuitem.set_no_show_all(True) - block_menuitem.hide() + block_menuitem.set_sensitive(False) unblock_menuitem.hide() - + event_button = gtkgui_helpers.get_possible_button_event(event) roster_contact_context_menu.attach_to_widget(self.tree, None) @@ -2256,7 +2373,7 @@ class RosterWindow: event.time) def on_invite_to_new_room(self, widget, list_, resource = None): - ''' resource parameter MUST NOT be used if more than one contact in + ''' resource parameter MUST NOT be used if more than one contact in list ''' account_list = [] jid_list = [] @@ -2285,16 +2402,16 @@ class RosterWindow: continue break - def on_invite_to_room(self, widget, list_, room_jid, room_account, + 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 + ''' resource parameter MUST NOT be used if more than one contact in list ''' for (contact, acct) in list_: contact_jid = contact.jid if resource: # we MUST have one contact only in list_ contact_jid += '/' + resource gajim.connections[room_account].send_invite(room_jid, contact_jid) - + def make_multiple_contact_menu(self, event, iters): '''Make group's popup menu''' @@ -2324,16 +2441,27 @@ class RosterWindow: list_.append((contact, account)) menu = gtk.Menu() - - remove_item = gtk.ImageMenuItem(_('_Remove from Roster')) - icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU) - remove_item.set_image(icon) - menu.append(remove_item) - remove_item.connect('activate', self.on_req_usub, list_) - + account = None + for (contact, current_account) in list_: + # check that we use the same account for every sender + if account is not None and account != current_account: + account = None + break + account = current_account + if account is not None: + send_group_message_item = gtk.ImageMenuItem(_('Send Group M_essage')) + icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) + send_group_message_item.set_image(icon) + menu.append(send_group_message_item) + send_group_message_item.connect('activate', + self.on_send_single_message_menuitem_activate, account, list_) + + # Invite to Groupchat invite_item = gtk.ImageMenuItem(_('In_vite to')) - icon = gtk.image_new_from_stock(gtk.STOCK_GO_BACK, gtk.ICON_SIZE_MENU) - invite_item.set_image(icon) + muc_icon = self.load_icon('muc_active') + if muc_icon: + invite_item.set_image(muc_icon) + if contacts_transport == False: # they are not all from the same transport invite_item.set_sensitive(False) @@ -2354,7 +2482,8 @@ class RosterWindow: sub_menu.append(menuitem) rooms = [] # a list of (room_jid, account) tuple for gc_control in gajim.interface.msg_win_mgr.get_controls( - message_control.TYPE_GC): + message_control.TYPE_GC) + \ + gajim.interface.minimized_controls[account].values(): account = gc_control.account room_jid = gc_control.room_jid if gajim.gc_connected[account].has_key(room_jid) and \ @@ -2369,40 +2498,47 @@ class RosterWindow: menuitem.connect('activate', self.on_invite_to_room, list_, room_jid, account) sub_menu.append(menuitem) - + invite_item.set_submenu(sub_menu) menu.append(invite_item) - edit_groups_item = gtk.MenuItem(_('Edit _Groups')) + item = gtk.SeparatorMenuItem() # separator + menu.append(item) + + # Edit Groups + edit_groups_item = gtk.ImageMenuItem(_('Edit _Groups')) + icon = gtk.image_new_from_stock(gtk.STOCK_EDIT, gtk.ICON_SIZE_MENU) + edit_groups_item.set_image(icon) menu.append(edit_groups_item) edit_groups_item.connect('activate', self.on_edit_groups, list_) - - account = None - for (contact, current_account) in list_: - # check that we use the same account for every sender - if account is not None and account != current_account: - account = None - break - account = current_account - if account is not None: - send_group_message_item = gtk.MenuItem(_('Send Group M_essage')) - menu.append(send_group_message_item) - send_group_message_item.connect('activate', - self.on_send_single_message_menuitem_activate, account, list_) - if is_blocked: + item = gtk.SeparatorMenuItem() # separator + menu.append(item) + + # Block + if is_blocked and gajim.connections[account].privacy_rules_supported: unblock_menuitem = gtk.ImageMenuItem(_('_Unblock')) - icon = gtk.image_new_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_MENU) + icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) unblock_menuitem.set_image(icon) unblock_menuitem.connect('activate', self.on_unblock, None, list_) menu.append(unblock_menuitem) else: block_menuitem = gtk.ImageMenuItem(_('_Block')) - icon = gtk.image_new_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU) + icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) block_menuitem.set_image(icon) block_menuitem.connect('activate', self.on_block, None, list_) menu.append(block_menuitem) - # unsensitive if one account is not connected + + if not gajim.connections[account].privacy_rules_supported: + block_menuitem.set_sensitive(False) + + # Remove + remove_item = gtk.ImageMenuItem(_('_Remove from Roster')) + icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU) + remove_item.set_image(icon) + menu.append(remove_item) + remove_item.connect('activate', self.on_req_usub, list_) + # unsensitive remove if one account is not connected if one_account_offline: remove_item.set_sensitive(False) @@ -2419,32 +2555,53 @@ class RosterWindow: path = model.get_path(iter) jid = model[iter][C_JID].decode('utf-8') account = model[iter][C_ACCOUNT].decode('utf-8') - + contact = gajim.contacts.get_contact_with_highest_priority(account, jid) menu = gtk.Menu() - maximize_menuitem = gtk.ImageMenuItem(_('_Maximize')) - icon = gtk.image_new_from_stock(gtk.STOCK_GOTO_TOP, gtk.ICON_SIZE_MENU) - maximize_menuitem.set_image(icon) - maximize_menuitem.connect('activate', self.on_groupchat_maximized, \ - jid, account) + if jid in gajim.interface.minimized_controls[account]: + maximize_menuitem = gtk.ImageMenuItem(_('_Maximize')) + icon = gtk.image_new_from_stock(gtk.STOCK_GOTO_TOP, gtk.ICON_SIZE_MENU) + maximize_menuitem.set_image(icon) + maximize_menuitem.connect('activate', self.on_groupchat_maximized, \ + jid, account) + menu.append(maximize_menuitem) + + history_menuitem = gtk.ImageMenuItem(_('_History')) + history_icon = gtk.image_new_from_stock(gtk.STOCK_JUSTIFY_FILL, \ + gtk.ICON_SIZE_MENU) + history_menuitem.set_image(history_icon) + history_menuitem .connect('activate', self.on_history, \ + contact, account) + menu.append(history_menuitem) + + item = gtk.SeparatorMenuItem() # separator + menu.append(item) + + disconnect_menuitem = gtk.ImageMenuItem(_('_Disconnect')) + disconnect_icon = gtk.image_new_from_stock(gtk.STOCK_DISCONNECT, \ + gtk.ICON_SIZE_MENU) + disconnect_menuitem.set_image(disconnect_icon) + disconnect_menuitem .connect('activate', self.on_disconnect, jid, account) + menu.append(disconnect_menuitem) - menu.append(maximize_menuitem) - event_button = gtkgui_helpers.get_possible_button_event(event) - + menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() menu.popup(None, None, None, event_button, event.time) + def on_all_groupchat_maximized(self, widget, group_list): + for (contact, account) in group_list: + self.on_groupchat_maximized(widget, contact.jid, account) + + def on_groupchat_maximized(self, widget, jid, account): - '''When a groupshat is maximised''' - if not gajim.interface.minimized_controls.has_key(account): - return + '''When a groupchat is maximised''' if not gajim.interface.minimized_controls[account].has_key(jid): return - - + + ctrl = gajim.interface.minimized_controls[account][jid] mw = gajim.interface.msg_win_mgr.get_window(ctrl.contact.jid, ctrl.account) if not mw: @@ -2454,12 +2611,16 @@ class RosterWindow: mw.new_tab(ctrl) mw.set_active_tab(jid, account) mw.window.present() + del gajim.interface.minimized_controls[account][jid] contact = gajim.contacts.get_contact_with_highest_priority(account, jid) - self.remove_contact(contact, account) - gajim.contacts.remove_contact(account, contact) - self.draw_group(_('Groupchats'), account) - del gajim.interface.minimized_controls[account][jid] + if not contact: + return + if contact.groups == [_('Groupchats')]: + self.remove_contact(contact, account) + gajim.contacts.remove_contact(account, contact) + self.draw_group(_('Groupchats'), account) + self.draw_account(account) def make_group_menu(self, event, iter): '''Make group's popup menu''' @@ -2468,41 +2629,6 @@ class RosterWindow: group = model[iter][C_JID].decode('utf-8') account = model[iter][C_ACCOUNT].decode('utf-8') - menu = gtk.Menu() - if not group in helpers.special_groups + (_('General'),): - - rename_item = gtk.ImageMenuItem(_('Re_name')) - # add a special img for rename menuitem - path_to_kbd_input_img = os.path.join(gajim.DATA_DIR, 'pixmaps', - 'kbd_input.png') - img = gtk.Image() - img.set_from_file(path_to_kbd_input_img) - rename_item.set_image(img) - menu.append(rename_item) - rename_item.connect('activate', self.on_rename, iter, path) - - # Remove group - remove_item = gtk.ImageMenuItem(_('_Remove from Roster')) - icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU) - remove_item.set_image(icon) - menu.append(remove_item) - remove_item.connect('activate', self.on_remove_group_item_activated, - group, account) - - # unsensitive if account is not connected - if gajim.connections[account].connected < 2: - rename_item.set_sensitive(False) - send_group_message_item = gtk.MenuItem(_('Send Group M_essage')) - - send_group_message_submenu = gtk.Menu() - send_group_message_item.set_submenu(send_group_message_submenu) - menu.append(send_group_message_item) - - group_message_to_all_item = gtk.MenuItem(_('To all users')) - send_group_message_submenu.append(group_message_to_all_item) - - group_message_to_all_online_item = gtk.MenuItem(_('To all online users')) - send_group_message_submenu.append(group_message_to_all_online_item) list_ = [] # list of (jid, account) tuples list_online = [] # list of (jid, account) tuples @@ -2515,52 +2641,114 @@ class RosterWindow: if contact.show not in ('offline', 'error'): list_online.append((contact, account)) list_.append((contact, account)) + menu = gtk.Menu() - group_message_to_all_online_item.connect('activate', - self.on_send_single_message_menuitem_activate, account, list_online) - group_message_to_all_item.connect('activate', - self.on_send_single_message_menuitem_activate, account, list_) - - send_custom_status_menuitem = gtk.ImageMenuItem(_('Send Cus_tom Status')) - # add a special img for this menuitem - icon = gtk.image_new_from_stock(gtk.STOCK_GO_UP, gtk.ICON_SIZE_MENU) - send_custom_status_menuitem.set_image(icon) - status_menuitems = gtk.Menu() - send_custom_status_menuitem.set_submenu(status_menuitems) - iconset = gajim.config.get('iconset') - path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16') - for s in ['online', 'chat', 'away', 'xa', 'dnd', 'offline']: - # icon MUST be different instance for every item - state_images = self.load_iconset(path) - status_menuitem = gtk.ImageMenuItem(helpers.get_uf_show(s)) - status_menuitem.connect('activate', self.on_send_custom_status, list_, - s) - icon = state_images[s] - status_menuitem.set_image(icon) - status_menuitems.append(status_menuitem) - menu.append(send_custom_status_menuitem) - is_blocked = False - if self.regroup: - for g_account in gajim.connections: - if group in gajim.connections[g_account].blocked_groups: - is_blocked = True + # Make special context menu if group is Groupchats + if group == _('Groupchats'): + maximize_menuitem = gtk.ImageMenuItem(_('_Maximize All')) + icon = gtk.image_new_from_stock(gtk.STOCK_GOTO_TOP, gtk.ICON_SIZE_MENU) + maximize_menuitem.set_image(icon) + maximize_menuitem.connect('activate', self.on_all_groupchat_maximized, \ + list_) + menu.append(maximize_menuitem) else: + # Send Group Message + send_group_message_item = gtk.ImageMenuItem(_('Send Group M_essage')) + icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) + send_group_message_item.set_image(icon) + + send_group_message_submenu = gtk.Menu() + send_group_message_item.set_submenu(send_group_message_submenu) + menu.append(send_group_message_item) + + group_message_to_all_item = gtk.MenuItem(_('To all users')) + send_group_message_submenu.append(group_message_to_all_item) + + group_message_to_all_online_item = gtk.MenuItem(_('To all online users')) + send_group_message_submenu.append(group_message_to_all_online_item) + + group_message_to_all_online_item.connect('activate', + self.on_send_single_message_menuitem_activate, account, list_online) + group_message_to_all_item.connect('activate', + self.on_send_single_message_menuitem_activate, account, list_) + + # Send Custom Status + send_custom_status_menuitem = gtk.ImageMenuItem(_('Send Cus_tom Status')) + # add a special img for this menuitem if group in gajim.connections[account].blocked_groups: - is_blocked = True - - if group not in helpers.special_groups + (_('General'),): - if is_blocked: + send_custom_status_menuitem.set_image(self.load_icon('offline')) + send_custom_status_menuitem.set_sensitive(False) + elif gajim.interface.status_sent_to_groups.has_key(account) and \ + group in gajim.interface.status_sent_to_groups[account]: + send_custom_status_menuitem.set_image(self.load_icon( + gajim.interface.status_sent_to_groups[account][group])) + else: + send_custom_status_menuitem.set_image(None) + status_menuitems = gtk.Menu() + send_custom_status_menuitem.set_submenu(status_menuitems) + iconset = gajim.config.get('iconset') + path = os.path.join(helpers.get_iconset_path(iconset), '16x16') + for s in ['online', 'chat', 'away', 'xa', 'dnd', 'offline']: + # icon MUST be different instance for every item + state_images = self.load_iconset(path) + status_menuitem = gtk.ImageMenuItem(helpers.get_uf_show(s)) + status_menuitem.connect('activate', self.on_send_custom_status, list_, + s, group) + icon = state_images[s] + status_menuitem.set_image(icon) + status_menuitems.append(status_menuitem) + menu.append(send_custom_status_menuitem) + + if not group in helpers.special_groups + (_('General'),): + item = gtk.SeparatorMenuItem() # separator + menu.append(item) + + # Rename + rename_item = gtk.ImageMenuItem(_('Re_name')) + # add a special img for rename menuitem + path_to_kbd_input_img = os.path.join(gajim.DATA_DIR, 'pixmaps', + 'kbd_input.png') + img = gtk.Image() + img.set_from_file(path_to_kbd_input_img) + rename_item.set_image(img) + menu.append(rename_item) + rename_item.connect('activate', self.on_rename, iter, path) + + # Block group + is_blocked = False + if self.regroup: + for g_account in gajim.connections: + if group in gajim.connections[g_account].blocked_groups: + is_blocked = True + else: + if group in gajim.connections[account].blocked_groups: + is_blocked = True + + if is_blocked and gajim.connections[account].privacy_rules_supported: unblock_menuitem = gtk.ImageMenuItem(_('_Unblock')) - icon = gtk.image_new_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_MENU) + icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) unblock_menuitem.set_image(icon) unblock_menuitem.connect('activate', self.on_unblock, iter, list_) menu.append(unblock_menuitem) else: block_menuitem = gtk.ImageMenuItem(_('_Block')) - icon = gtk.image_new_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU) + icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) block_menuitem.set_image(icon) block_menuitem.connect('activate', self.on_block, iter, list_) menu.append(block_menuitem) + if not gajim.connections[account].privacy_rules_supported: + block_menuitem.set_sensitive(False) + + # Remove group + remove_item = gtk.ImageMenuItem(_('_Remove from Roster')) + icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU) + remove_item.set_image(icon) + menu.append(remove_item) + remove_item.connect('activate', self.on_remove_group_item_activated, + group, account) + # unsensitive if account is not connected + if gajim.connections[account].connected < 2: + rename_item.set_sensitive(False) event_button = gtkgui_helpers.get_possible_button_event(event) @@ -2578,6 +2766,7 @@ class RosterWindow: contact = gajim.contacts.get_contact_with_highest_priority(account, jid) menu = gtk.Menu() + # Log on item = gtk.ImageMenuItem(_('_Log on')) icon = gtk.image_new_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_MENU) item.set_image(icon) @@ -2588,6 +2777,7 @@ class RosterWindow: item.set_sensitive(False) item.connect('activate', self.on_agent_logging, jid, None, account) + # Log off item = gtk.ImageMenuItem(_('Log _off')) icon = gtk.image_new_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU) item.set_image(icon) @@ -2601,14 +2791,7 @@ class RosterWindow: item = gtk.SeparatorMenuItem() # separator menu.append(item) - item = gtk.ImageMenuItem(_('_Edit')) - icon = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, gtk.ICON_SIZE_MENU) - item.set_image(icon) - menu.append(item) - item.connect('activate', self.on_edit_agent, contact, account) - if gajim.account_is_disconnected(account): - item.set_sensitive(False) - + # Execute Command item = gtk.ImageMenuItem(_('Execute Command...')) icon = gtk.image_new_from_stock(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_MENU) item.set_image(icon) @@ -2618,6 +2801,16 @@ class RosterWindow: if gajim.account_is_disconnected(account): item.set_sensitive(False) + # Edit + item = gtk.ImageMenuItem(_('_Edit')) + icon = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, gtk.ICON_SIZE_MENU) + item.set_image(icon) + menu.append(item) + item.connect('activate', self.on_edit_agent, contact, account) + if gajim.account_is_disconnected(account): + item.set_sensitive(False) + + # Rename item = gtk.ImageMenuItem(_('_Rename')) # add a special img for rename menuitem path_to_kbd_input_img = os.path.join(gajim.DATA_DIR, 'pixmaps', @@ -2629,7 +2822,11 @@ class RosterWindow: item.connect('activate', self.on_rename, iter, path) if gajim.account_is_disconnected(account): item.set_sensitive(False) + + item = gtk.SeparatorMenuItem() # sepator + menu.append(item) + # Remove item = gtk.ImageMenuItem(_('_Remove from Roster')) icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU) item.set_image(icon) @@ -2638,6 +2835,13 @@ class RosterWindow: if gajim.account_is_disconnected(account): item.set_sensitive(False) + information_menuitem = gtk.ImageMenuItem(_('_Information')) + icon = gtk.image_new_from_stock(gtk.STOCK_INFO, gtk.ICON_SIZE_MENU) + information_menuitem.set_image(icon) + menu.append(information_menuitem) + information_menuitem.connect('activate', self.on_info, contact, account) + + event_button = gtkgui_helpers.get_possible_button_event(event) menu.attach_to_widget(self.tree, None) @@ -2646,25 +2850,23 @@ class RosterWindow: menu.popup(None, None, None, event_button, event.time) def on_edit_account(self, widget, account): - if gajim.interface.instances[account].has_key('account_modification'): - gajim.interface.instances[account]['account_modification'].\ - window.present() + if gajim.interface.instances.has_key('accounts'): + gajim.interface.instances['accounts'].window.present() else: - gajim.interface.instances[account]['account_modification'] = \ - config.AccountModificationWindow(account) + gajim.interface.instances['accounts'] = config.AccountsWindow() + gajim.interface.instances['accounts'].select_account(account) def on_zeroconf_properties(self, widget, account): - if gajim.interface.instances.has_key('zeroconf_properties'): - gajim.interface.instances['zeroconf_properties'].\ - window.present() + if gajim.interface.instances.has_key('accounts'): + gajim.interface.instances['accounts'].window.present() else: - gajim.interface.instances['zeroconf_properties'] = \ - config.ZeroconfPropertiesWindow() + gajim.interface.instances['accounts'] = config.AccountsWindow() + gajim.interface.instances['accounts'].select_account(account) def on_open_gmail_inbox(self, widget, account): - url = 'http://mail.google.com/mail?account_id=%s' % urllib.quote( - gajim.config.get_per('accounts', account, 'name')) - helpers.launch_browser_mailer('url', url) + url = gajim.connections[account].gmail_url + if url: + helpers.launch_browser_mailer('url', url) def on_change_activity_activate(self, widget, account): dlg = dialogs.ChangeActivityDialog(account) @@ -2683,7 +2885,7 @@ class RosterWindow: # we have to create our own set of icons for the menu # using self.jabber_status_images is poopoo iconset = gajim.config.get('iconset') - path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16') + path = os.path.join(helpers.get_iconset_path(iconset), '16x16') state_images = self.load_iconset(path) if not gajim.config.get_per('accounts', account, 'is_zeroconf'): @@ -2696,7 +2898,6 @@ class RosterWindow: if muc_icon: join_group_chat_menuitem.set_image(muc_icon) open_gmail_inbox_menuitem = xml.get_widget('open_gmail_inbox_menuitem') - new_message_menuitem = xml.get_widget('new_message_menuitem') add_contact_menuitem = xml.get_widget('add_contact_menuitem') service_discovery_menuitem = xml.get_widget( 'service_discovery_menuitem') @@ -2727,6 +2928,9 @@ class RosterWindow: if gajim.connections[account].connected < 2: item.set_sensitive(False) + item = gtk.SeparatorMenuItem() + sub_menu.append(item) + uf_show = helpers.get_uf_show('offline', use_mnemonic = True) item = gtk.ImageMenuItem(uf_show) icon = state_images['offline'] @@ -2748,8 +2952,7 @@ class RosterWindow: pep_menuitem.set_no_show_all(True) pep_menuitem.hide() - if gajim.config.get_per('accounts', account, 'hostname') not in \ - gajim.gmail_domains: + if not gajim.connections[account].gmail_url: open_gmail_inbox_menuitem.set_no_show_all(True) open_gmail_inbox_menuitem.hide() else: @@ -2766,17 +2969,15 @@ class RosterWindow: contact = gajim.contacts.create_contact(jid = hostname) # Fake contact execute_command_menuitem.connect('activate', self.on_execute_command, contact, account) - + gc_sub_menu = gtk.Menu() # gc is always a submenu join_group_chat_menuitem.set_submenu(gc_sub_menu) self.add_bookmarks_list(gc_sub_menu, account) - new_message_menuitem.connect('activate', - self.on_new_message_menuitem_activate, account) # make some items insensitive if account is offline if gajim.connections[account].connected < 2: for widget in [add_contact_menuitem, service_discovery_menuitem, - join_group_chat_menuitem, new_message_menuitem, + join_group_chat_menuitem, execute_command_menuitem, pep_menuitem]: widget.set_sensitive(False) else: @@ -2784,7 +2985,6 @@ class RosterWindow: account_context_menu = xml.get_widget('zeroconf_context_menu') status_menuitem = xml.get_widget('status_menuitem') - new_message_menuitem = xml.get_widget('new_message_menuitem') zeroconf_properties_menuitem = xml.get_widget( 'zeroconf_properties_menuitem') sub_menu = gtk.Menu() @@ -2845,7 +3045,7 @@ class RosterWindow: else: menu = gtk.Menu() iconset = gajim.config.get('iconset') - path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16') + path = os.path.join(helpers.get_iconset_path(iconset), '16x16') accounts = [] # Put accounts in a list to sort them for account in gajim.connections: accounts.append(account) @@ -3061,7 +3261,7 @@ class RosterWindow: self.tree.collapse_row(path) else: self.tree.expand_row(path, False) - + elif type_ == 'contact' and x < 27: account = model[path][C_ACCOUNT].decode('utf-8') jid = model[path][C_JID].decode('utf-8') @@ -3085,7 +3285,7 @@ class RosterWindow: remove_auth = False for (contact, account) in list_: gajim.connections[account].unsubscribe(contact.jid, remove_auth) - for c in gajim.contacts.get_contact(account, contact.jid): + for c in gajim.contacts.get_contacts(account, contact.jid): self.remove_contact(c, account) gajim.contacts.remove_jid(account, contact.jid) # redraw group rows for contact numbers @@ -3244,8 +3444,10 @@ class RosterWindow: gajim.SHOW_LIST.index('invisible') gajim.connections[account].change_status(status, txt, auto) - if not gajim.interface.minimized_controls.has_key(account): - gajim.interface.minimized_controls[account] = {} + if gajim.interface.status_sent_to_users.has_key(account): + gajim.interface.status_sent_to_users[account] = {} + if gajim.interface.status_sent_to_groups.has_key(account): + gajim.interface.status_sent_to_groups[account] = {} for gc_control in gajim.interface.msg_win_mgr.get_controls( message_control.TYPE_GC) + \ gajim.interface.minimized_controls[account].values(): @@ -3254,11 +3456,11 @@ class RosterWindow: gajim.connections[account].send_gc_status(gc_control.nick, gc_control.room_jid, status, txt) else: - # for some reason, we are not connected to the room even if + # for some reason, we are not connected to the room even if # tab is opened, send initial join_gc() - gajim.connections[account].join_gc(gc_control.nick, + gajim.connections[account].join_gc(gc_control.nick, gc_control.room_jid, None) - if was_invisible: + if was_invisible and status != 'offline': # We come back from invisible, join bookmarks for bm in gajim.connections[account].bookmarks: room_jid = bm['jid'] @@ -3266,14 +3468,14 @@ class RosterWindow: gajim.gc_connected[account][room_jid]: continue self.join_gc_room(account, room_jid, bm['nick'], bm['password'], - minimize = gajim.config.get('minimize_autojoined_rooms')) + minimize = bm['minimize']) def get_status_message(self, show): if show in gajim.config.get_per('defaultstatusmsg'): if gajim.config.get_per('defaultstatusmsg', show, 'enabled'): return gajim.config.get_per('defaultstatusmsg', show, 'message') if (show == 'online' and not gajim.config.get('ask_online_status')) or \ - (show in ('offline', 'invisible') + (show in ('offline', 'invisible') and not gajim.config.get('ask_offline_status')): return '' dlg = dialogs.ChangeStatusMessageDialog(show) @@ -3306,13 +3508,22 @@ class RosterWindow: else: change(None, account, status) - def on_send_custom_status(self, widget, contact_list, show): + def on_send_custom_status(self, widget, contact_list, show, group=None): '''send custom status''' dlg = dialogs.ChangeStatusMessageDialog(show) message = dlg.run() if message is not None: # None if user pressed Cancel for (contact, account) in contact_list: - self.send_status(account, show, message, to = contact.jid) + accounts = [] + if group and account not in accounts: + if not gajim.interface.status_sent_to_groups.has_key(account): + gajim.interface.status_sent_to_groups[account] = {} + gajim.interface.status_sent_to_groups[account][group] = show + accounts.append(group) + self.send_status(account, show, message, to = contact.jid) + if not gajim.interface.status_sent_to_users.has_key(account): + gajim.interface.status_sent_to_users[account] = {} + gajim.interface.status_sent_to_users[account][contact.jid] = show def on_status_combobox_changed(self, widget): '''When we change our status via the combobox''' @@ -3418,21 +3629,27 @@ class RosterWindow: listener.disconnect(self._music_track_changed_signal) self._music_track_changed_signal = None self._music_track_changed(None, None) - + def _change_awn_icon_status(self, status): if not dbus_support.supported: # do nothing if user doesn't have D-Bus bindings return + bus = dbus.SessionBus() + try: + if not 'com.google.code.Awn' in bus.list_names(): + # Awn is not installed + return + except: + pass iconset = gajim.config.get('iconset') - prefix = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '32x32') + prefix = os.path.join(helpers.get_iconset_path(iconset), '32x32') if status in ('chat', 'away', 'xa', 'dnd', 'invisible', 'offline'): status = status + '.png' elif status == 'online': prefix = os.path.join(gajim.DATA_DIR, 'pixmaps') status = 'gajim.png' path = os.path.join(prefix, status) - try: - bus = dbus.SessionBus() + try: obj = bus.get_object('com.google.code.Awn', '/com/google/code/Awn') awn = dbus.Interface(obj, 'com.google.code.Awn') awn.SetTaskIconByName('Gajim', os.path.abspath(path)) @@ -3516,7 +3733,7 @@ class RosterWindow: if gajim.con_types.has_key(account): gajim.con_types[account] = None for jid in gajim.contacts.get_jid_list(account): - lcontact = gajim.contacts.get_contact(account, jid) + lcontact = gajim.contacts.get_contacts(account, jid) lcontact_copy = [] for contact in lcontact: lcontact_copy.append(contact) @@ -3569,7 +3786,7 @@ class RosterWindow: if not contact: added_to_roster = True contact = self.add_to_not_in_the_roster(account, jid, - resource = resource) + resource = resource) if not gajim.interface.msg_win_mgr.has_window(fjid, account): self.new_chat(contact, account, resource = resource) @@ -3608,7 +3825,7 @@ class RosterWindow: if not contact: # If there is another resource, it may be a message from an invisible # resource - lcontact = gajim.contacts.get_contacts_from_jid(account, jid) + lcontact = gajim.contacts.get_contacts(account, jid) if (len(lcontact) > 1 or (lcontact and lcontact[0].resource and \ lcontact[0].show != 'offline')) and jid.find('@') > 0: contact = gajim.contacts.copy_contact(highest_contact) @@ -3682,8 +3899,8 @@ class RosterWindow: if path and not self.dragging and gajim.config.get( 'scroll_roster_to_last_message'): # we curently see contact in our roster OR he - # is not in the roster at all. - # show and select his line in roster + # is not in the roster at all. + # show and select his line in roster # do not change selection while DND'ing self.tree.expand_row(path[0:1], False) self.tree.expand_row(path[0:2], False) @@ -3730,9 +3947,6 @@ class RosterWindow: except GajimGeneralException: pass - def on_new_message_menuitem_activate(self, widget, account): - dialogs.SingleMessageWindow(account, action = 'send') - def on_new_chat_menuitem_activate(self, widget, account): dialogs.NewChatDialog(account) @@ -3743,6 +3957,9 @@ class RosterWindow: helpers.launch_browser_mailer('url', 'http://trac.gajim.org/wiki/GajimFaq') + def on_features_menuitem_activate(self, widget): + features_window.FeaturesWindow() + def on_about_menuitem_activate(self, widget): dialogs.AboutDialog() @@ -3765,7 +3982,7 @@ class RosterWindow: def on_manage_bookmarks_menuitem_activate(self, widget): config.ManageBookmarksWindow() - + def on_profile_avatar_menuitem_activate(self, widget, account): gajim.interface.edit_own_details(account) @@ -3776,12 +3993,13 @@ class RosterWindow: self.close_all_from_dict(w) else: 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 ''' - self.close_all_from_dict(gajim.interface.instances[account]) + 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): ctrl.parent_win.remove_tab(ctrl, ctrl.parent_win.CLOSE_CLOSE_BUTTON, force = force) @@ -3805,7 +4023,7 @@ class RosterWindow: if message is None: # user pressed Cancel to change status message dialog message = '' - + for acct in accounts: if gajim.connections[acct].connected: self.quit_on_next_offline += 1 @@ -4012,14 +4230,13 @@ class RosterWindow: self.tree.collapse_row(path) else: self.tree.expand_row(path, False) - elif gajim.interface.minimized_controls.has_key(account) and \ - gajim.interface.minimized_controls[account].has_key(jid): + elif jid in gajim.interface.minimized_controls[account]: self.on_groupchat_maximized(None, jid, account) else: first_ev = gajim.events.get_first_event(account, jid) if not first_ev: # look in other resources - for c in gajim.contacts.get_contact(account, jid): + for c in gajim.contacts.get_contacts(account, jid): fjid = c.get_full_jid() first_ev = gajim.events.get_first_event(account, fjid) if first_ev: @@ -4131,22 +4348,22 @@ class RosterWindow: 'not in roster') else: list = ('connecting', 'online', 'chat', 'away', 'xa', 'dnd', - 'invisible', 'offline', 'error', 'requested', 'message', 'opened', + 'invisible', 'offline', 'error', 'requested', 'event', 'opened', 'closed', 'not in roster', 'muc_active', 'muc_inactive') if pixbuf2: list = ('connecting', 'online', 'chat', 'away', 'xa', 'dnd', - 'offline', 'error', 'requested', 'message', 'not in roster') + 'offline', 'error', 'requested', 'event', 'not in roster') return self._load_icon_list(list, path, pixbuf2) - + def load_icon(self, icon_name): '''load an icon from the iconset in 16x16''' iconset = gajim.config.get('iconset') - path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16'+ '/') + path = os.path.join(helpers.get_iconset_path(iconset), '16x16'+ '/') icon_list = self._load_icon_list([icon_name], path) return icon_list[icon_name] - + def _load_icon_list(self, icons_list, path, pixbuf2 = None): - '''load icons in icons_list from the given path, + '''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: @@ -4176,20 +4393,34 @@ class RosterWindow: '''initialise jabber_state_images dict''' iconset = gajim.config.get('iconset') if iconset: - path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16') + path = os.path.join(helpers.get_iconset_path(iconset), '16x16') if not os.path.exists(path): iconset = gajim.config.DEFAULT_ICONSET - else: + else: iconset = gajim.config.DEFAULT_ICONSET - path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '32x32') + path = os.path.join(helpers.get_iconset_path(iconset), '32x32') self.jabber_state_images['32'] = self.load_iconset(path) - path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16') + path = os.path.join(helpers.get_iconset_path(iconset), '16x16') self.jabber_state_images['16'] = self.load_iconset(path) - pixo = gtk.gdk.pixbuf_new_from_file(os.path.join(path, 'opened.png')) + # try to find opened_meta.png file, else opened.png else nopixbuf merge + path_opened = os.path.join(path, 'opened_meta.png') + if not os.path.isfile(path_opened): + path_opened = os.path.join(path, 'opened.png') + if os.path.isfile(path_opened): + pixo = gtk.gdk.pixbuf_new_from_file(path_opened) + else: + pixo = None self.jabber_state_images['opened'] = self.load_iconset(path, pixo) - pixc = gtk.gdk.pixbuf_new_from_file(os.path.join(path, 'closed.png')) + # Same thing for closed + path_closed = os.path.join(path, 'opened_meta.png') + if not os.path.isfile(path_closed): + path_closed = os.path.join(path, 'closed.png') + if os.path.isfile(path_closed): + pixc = gtk.gdk.pixbuf_new_from_file(path_closed) + else: + pixc = None self.jabber_state_images['closed'] = self.load_iconset(path, pixc) if gajim.config.get('use_transports_iconsets'): @@ -4243,7 +4474,7 @@ class RosterWindow: redraw the treeview''' gajim.config.set('showoffline', not gajim.config.get('showoffline')) self.draw_roster() - + def set_renderer_color(self, renderer, style, set_background = True): '''set style for treeview cell, using PRELIGHT system color''' if set_background: @@ -4252,7 +4483,7 @@ class RosterWindow: else: fgcolor = self.tree.style.fg[style] renderer.set_property('foreground-gdk', fgcolor) - + def iconCellDataFunc(self, column, renderer, model, iter, data = None): '''When a row is added, set properties for icon renderer''' theme = gajim.config.get('roster_theme') @@ -4366,6 +4597,11 @@ class RosterWindow: padlock)''' theme = gajim.config.get('roster_theme') type_ = model[iter][C_TYPE] + # allocate space for the icon only if needed + if model[iter][C_SECPIXBUF]: + renderer.set_property('visible', True) + else: + renderer.set_property('visible', False) if type_ == 'account': color = gajim.config.get_per('themes', theme, 'accountbgcolor') if color: @@ -4432,6 +4668,10 @@ class RosterWindow: return 1 if name2 == _('Not in Roster'): return -1 + if name1 == _('Groupchats'): + return 1 + if name2 == _('Groupchats'): + return -1 account1 = model[iter1][C_ACCOUNT] account2 = model[iter2][C_ACCOUNT] if not account1 or not account2: @@ -4445,13 +4685,13 @@ class RosterWindow: jid1 = model[iter1][C_JID].decode('utf-8') jid2 = model[iter2][C_JID].decode('utf-8') if type1 == 'contact': - lcontact1 = gajim.contacts.get_contact(account1, jid1) + lcontact1 = gajim.contacts.get_contacts(account1, jid1) contact1 = gajim.contacts.get_first_contact_from_jid(account1, jid1) if not contact1: return 0 name1 = contact1.get_shown_name() if type2 == 'contact': - lcontact2 = gajim.contacts.get_contact(account2, jid2) + lcontact2 = gajim.contacts.get_contacts(account2, jid2) contact2 = gajim.contacts.get_first_contact_from_jid(account2, jid2) if not contact2: return 0 @@ -4476,12 +4716,6 @@ class RosterWindow: return -1 elif show1 > show2: return 1 - if show1 == 6 and show2 == 6: - # If both are offline, and one has a status message, it is above - if contact1.status and not contact2.status: - return -1 - elif contact2.status and not contact1.status: - return 1 # We compare names if name1.lower() < name2.lower(): return -1 @@ -4574,13 +4808,24 @@ class RosterWindow: if not confirm_metacontacts: # First time we see this window dlg.checkbutton.set_active(True) - def on_drop_in_group(self, widget, account, c_source, grp_dest, context, - etime, grp_source = None): + def on_drop_in_group(self, widget, account, c_source, grp_dest, is_big_brother, + context, etime, grp_source = None): if grp_source: self.remove_contact_from_group(account, c_source, grp_source) - # remove tag - gajim.contacts.remove_metacontact(account, c_source.jid) + if not is_big_brother: + # remove tag before readding + gajim.contacts.remove_metacontact(account, c_source.jid) self.add_contact_to_group(account, c_source, grp_dest) + if is_big_brother: + # add whole metacontact to new group + tag = gajim.contacts.get_metacontacts_tag(account, c_source.jid) + all_jid = gajim.contacts.get_metacontacts_jids(tag) + for _account in all_jid: + for _jid in all_jid[_account]: + _c = gajim.contacts.get_first_contact_from_jid(_account, _jid) + if grp_source: + self.remove_contact_from_group(_account, _c, grp_source) + self.add_contact_to_group(_account, _c, grp_dest) if context.action in (gtk.gdk.ACTION_MOVE, gtk.gdk.ACTION_COPY): context.finish(True, True, etime) @@ -4604,36 +4849,36 @@ class RosterWindow: def drag_data_received_data(self, treeview, context, x, y, selection, info, etime): - model = treeview.get_model() - if not selection.data: - return - data = selection.data drop_info = treeview.get_dest_row_at_pos(x, y) if not drop_info: return + if not selection.data: + return # prevents tb when several entrys are dragged + model = treeview.get_model() + data = selection.data path_dest, position = drop_info + if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 2 \ and path_dest[1] == 0: # dropped before the first group return + if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 2: + # dropped before a group: we drop it in the previous group every time + path_dest = (path_dest[0], path_dest[1]-1) + # destination: the row something got dropped on iter_dest = model.get_iter(path_dest) type_dest = model[iter_dest][C_TYPE].decode('utf-8') jid_dest = model[iter_dest][C_JID].decode('utf-8') account_dest = model[iter_dest][C_ACCOUNT].decode('utf-8') + # drop on account row in merged mode, we cannot know the desired account if account_dest == 'all': - # drop on account row in merged mode: we can't know which account it is return - - # if account is not connected, do nothing + # nothing can be done, if destination account is offline if gajim.connections[account_dest].connected < 2: return - # drop on self contact row - if type_dest == 'self_contact': - return - + # A file got dropped on the roster if info == self.TARGET_TYPE_URI_LIST: - # User dropped a file on the roster if len(path_dest) < 3: return if type_dest != 'contact': @@ -4643,55 +4888,72 @@ class RosterWindow: uri = data.strip() uri_splitted = uri.split() # we may have more than one file dropped nb_uri = len(uri_splitted) - prim_text = 'Send file?' - sec_text = i18n.ngettext('Do you want to send that file to %s:', - 'Do you want to send those files to %s:', nb_uri) %\ - c_dest.get_shown_name() - for uri in uri_splitted: - path = helpers.get_file_path_from_dnd_dropped_uri(uri) - sec_text += '\n' + os.path.basename(path) - def _on_send_files(widget, account, jid, uri): + def _on_send_files(widget, account, jid, uris): dialog.destroy() c = gajim.contacts.get_contact_with_highest_priority(account, jid) - uri_splitted = uri.split() # we may have more than one file dropped - for uri in uri_splitted: + for uri in uris: path = helpers.get_file_path_from_dnd_dropped_uri(uri) if os.path.isfile(path): # is it file? gajim.interface.instances['file_transfers'].send_file( account, c, path) - + # Popup dialog to confirm sending + prim_text = 'Send file?' + sec_text = i18n.ngettext('Do you want to send that file to %s:', + 'Do you want to send those files to %s:', nb_uri) %\ + c_dest.get_shown_name() + for uri in uri_splitted: + path = helpers.get_file_path_from_dnd_dropped_uri(uri) + sec_text += '\n' + os.path.basename(path) dialog = dialogs.NonModalConfirmationDialog(prim_text, sec_text, - on_response_ok = (_on_send_files, account_dest, jid_dest, uri)) + on_response_ok = (_on_send_files, account_dest, jid_dest, + uri_splitted)) dialog.popup() return + + # a roster entry was dragged and dropped somewhere in the roster - if gajim.config.get_per('accounts', account_dest, 'is_zeroconf'): - # drop on zeroconf account, no contact adds possible - return - - if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 2: - # dropped before a group : we drop it in the previous group - path_dest = (path_dest[0], path_dest[1]-1) + # source: the row that was dragged path_source = treeview.get_selection().get_selected_rows()[1][0] iter_source = model.get_iter(path_source) type_source = model[iter_source][C_TYPE] account_source = model[iter_source][C_ACCOUNT].decode('utf-8') - if type_source != 'contact': # source is not a contact - return - if type_dest == 'account' and account_source == account_dest: + + # Only normal contacts can be dragged + if type_source != 'contact': return if gajim.config.get_per('accounts', account_source, 'is_zeroconf'): return + + # A contact was dropped + if gajim.config.get_per('accounts', account_dest, 'is_zeroconf'): + # drop on zeroconf account, adding not possible + return + if type_dest == 'self_contact': + # drop on self contact row + return + if type_dest == 'account' and account_source == account_dest: + # drop on the account it was dragged from + return + if type_dest == 'groupchat': + # drop on a minimized groupchat + # TODO: Invite to groupchat + return + + # Get valid source group, jid and contact it = iter_source while model[it][C_TYPE] == 'contact': it = model.iter_parent(it) grp_source = model[it][C_JID].decode('utf-8') - if grp_source in helpers.special_groups: + if grp_source in helpers.special_groups and \ + grp_source not in ('Not in Roster', 'Observers'): + # a transport or a minimized groupchat was dragged + # we can add it to other accounts but not move it to another group, see below return jid_source = data.decode('utf-8') c_source = gajim.contacts.get_contact_with_highest_priority( account_source, jid_source) + # Get destination group grp_dest = None if type_dest == 'group': grp_dest = model[iter_dest][C_JID].decode('utf-8') @@ -4700,76 +4962,53 @@ class RosterWindow: while model[it][C_TYPE] != 'group': it = model.iter_parent(it) grp_dest = model[it][C_JID].decode('utf-8') + if grp_dest in helpers.special_groups: + return + if jid_source == jid_dest: + if grp_source == grp_dest and account_source == account_dest: + # Drop on self + return + + # contact drop somewhere in or on a foreign account if (type_dest == 'account' or not self.regroup) and \ - account_source != account_dest: - # add contact to this account in that group + account_source != account_dest: + # add to account in specified group dialogs.AddNewContactWindow(account = account_dest, jid = jid_source, user_nick = c_source.name, group = grp_dest) return + + # we may not add contacts from special_groups + if grp_source in helpers.special_groups : + return - # Get destination group - if type_dest == 'group': - if grp_dest in helpers.special_groups: - return - if context.action == gtk.gdk.ACTION_COPY: - self.on_drop_in_group(None, account_source, c_source, grp_dest, - context, etime) - return - self.on_drop_in_group(None, account_source, c_source, grp_dest, - context, etime, grp_source) - return - if grp_dest in helpers.special_groups: - return - if jid_source == jid_dest: - if grp_source == grp_dest and account_source == account_dest: - return - if grp_source == grp_dest: - # Add meta contact - #FIXME: doesn't work under windows: - # http://bugzilla.gnome.org/show_bug.cgi?id=329797 -# if context.action == gtk.gdk.ACTION_COPY: -# # Keep only MOVE -# return - c_dest = gajim.contacts.get_contact_with_highest_priority(account_dest, - jid_dest) - is_big_brother = False + # Is the contact we drag a meta contact? + is_meta_contact = False + is_big_brother = False + tag = gajim.contacts.get_metacontacts_tag(account_source, jid_source) + if tag: + is_meta_contact = True if model.iter_has_child(iter_source): is_big_brother = True + + # Contact drop on group row or between two contacts + if type_dest == 'group' or position == gtk.TREE_VIEW_DROP_BEFORE or \ + position == gtk.TREE_VIEW_DROP_AFTER: + self.on_drop_in_group(None, account_source, c_source, grp_dest, + is_big_brother, context, etime, grp_source) + return + + # Contact drop on another contact, make meta contacts + if position == gtk.TREE_VIEW_DROP_INTO_OR_AFTER or \ + position == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE: + c_dest = gajim.contacts.get_contact_with_highest_priority(account_dest, + jid_dest) if not c_dest: # c_dest is None if jid_dest doesn't belong to account return self.on_drop_in_contact(treeview, account_source, c_source, account_dest, c_dest, is_big_brother, context, etime) return - # We upgrade only the first user because user2.groups is a pointer to - # user1.groups - if context.action == gtk.gdk.ACTION_COPY: - self.on_drop_in_group(None, account_source, c_source, grp_dest, - context, etime) - else: - menu = gtk.Menu() - item = gtk.MenuItem(_('Drop %s in group %s') % (c_source.name, - grp_dest)) - item.connect('activate', self.on_drop_in_group, account_source, - c_source, grp_dest, context, etime, grp_source) - menu.append(item) - c_dest = gajim.contacts.get_contact_with_highest_priority( - account_dest, jid_dest) - item = gtk.MenuItem(_('Make %s and %s metacontacts') % - (c_source.get_shown_name(), c_dest.get_shown_name())) - is_big_brother = False - if model.iter_has_child(iter_source): - is_big_brother = True - item.connect('activate', self.on_drop_in_contact, account_source, - c_source, account_dest, c_dest, is_big_brother, context, etime) - - menu.append(item) - - menu.attach_to_widget(self.tree, None) - menu.connect('selection-done', gtkgui_helpers.destroy_widget) - menu.show_all() - menu.popup(None, None, None, 1, etime) def show_title(self): change_title_allowed = gajim.config.get('change_roster_title') @@ -4987,6 +5226,7 @@ class RosterWindow: col.set_cell_data_func(render_image, self.iconCellDataFunc, None) render_text = gtk.CellRendererText() # contact or group or account name + render_text.set_property("ellipsize", pango.ELLIPSIZE_END) col.pack_start(render_text, expand = True) col.add_attribute(render_text, 'markup', C_NAME) # where we hold the name col.set_cell_data_func(render_text, self.nameCellDataFunc, None) @@ -5006,10 +5246,11 @@ class RosterWindow: self.tree.append_column(col) col.set_visible(False) self.tree.set_expander_column(col) - + #signals self.TARGET_TYPE_URI_LIST = 80 - TARGETS = [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0)] + TARGETS = [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_APP | gtk.TARGET_SAME_WIDGET, + 0)] TARGETS2 = [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0), ('text/uri-list', 0, self.TARGET_TYPE_URI_LIST)] self.tree.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, TARGETS, @@ -5046,3 +5287,7 @@ class RosterWindow: if len(gajim.connections) == 0: # if we have no account gajim.interface.instances['account_creation_wizard'] = \ config.AccountCreationWizardWindow() + if not gajim.ZEROCONF_ACC_NAME in gajim.config.get_per('accounts'): + # Create zeroconf in config file + zeroconf = common.zeroconf.connection_zeroconf.ConnectionZeroconf( + gajim.ZEROCONF_ACC_NAME) diff --git a/src/search_window.py b/src/search_window.py index 4c95eef8f..ce40eb282 100644 --- a/src/search_window.py +++ b/src/search_window.py @@ -19,6 +19,8 @@ from common import xmpp, gajim, dataforms import gtkgui_helpers import dialogs +import vcard +import config import dataforms_widget class SearchWindow: @@ -32,12 +34,10 @@ class SearchWindow: # retrieving widgets from xml self.xml = gtkgui_helpers.get_glade('search_window.glade') self.window = self.xml.get_widget('search_window') - for name in ('label', 'progressbar', 'search_vbox', 'search_button'): + for name in ('label', 'progressbar', 'search_vbox', 'search_button', + 'add_contact_button', 'information_button'): self.__dict__[name] = self.xml.get_widget(name) - self.data_form_widget = dataforms_widget.DataFormWidget() - self.table = None - # displaying the window self.xml.signal_autoconnect(self) self.window.show_all() @@ -45,10 +45,9 @@ class SearchWindow: self.pulse_id = gobject.timeout_add(80, self.pulse_callback) self.is_form = None - - # for non-dataform forms - self.entries = {} - self.info = {} + + # Is there a jid column in results ? if -1: no, else column number + self.jid_column = -1 def request_form(self): gajim.connections[self.account].request_search_fields(self.jid) @@ -74,15 +73,14 @@ class SearchWindow: self.data_form_widget.data_form.type = 'submit' gajim.connections[self.account].send_search_form(self.jid, self.data_form_widget.data_form, True) - self.search_vbox.remove(self.data_form_widget) else: - for name in self.entries.keys(): - self.infos[name] = self.entries[name].get_text().decode('utf-8') - if self.infos.has_key('instructions'): - del self.infos['instructions'] - gajim.connections[self.account].send_search_form(self.jid, self.infos, + infos = self.data_form_widget.get_infos() + if infos.has_key('instructions'): + del infos['instructions'] + gajim.connections[self.account].send_search_form(self.jid, infos, False) - self.search_vbox.remove(self.table) + + self.search_vbox.remove(self.data_form_widget) self.progressbar.show() self.label.set_text(_('Waiting for results')) @@ -90,58 +88,66 @@ class SearchWindow: self.pulse_id = gobject.timeout_add(80, self.pulse_callback) self.search_button.hide() + def on_add_contact_button_clicked(self, widget): + (model, iter) = self.result_treeview.get_selection().get_selected() + if not iter: + return + jid = model[iter][self.jid_column] + dialogs.AddNewContactWindow(self.account, jid) + + def on_information_button_clicked(self, widget): + (model, iter) = self.result_treeview.get_selection().get_selected() + if not iter: + return + jid = model[iter][self.jid_column] + if gajim.interface.instances[self.account]['infos'].has_key(jid): + gajim.interface.instances[self.account]['infos'][jid].window.present() + else: + contact = gajim.contacts.create_contact(jid = jid, name='', groups=[], + show='', status='', sub='', ask='', resource='', priority=0, + keyID='', our_chatstate=None, chatstate=None) + gajim.interface.instances[self.account]['infos'][jid] = \ + vcard.VcardWindow(contact, self.account) + def on_form_arrived(self, form, is_form): if self.pulse_id: gobject.source_remove(self.pulse_id) self.progressbar.hide() self.label.hide() - if not is_form: - self.is_form = False - self.infos = form - nbrow = 0 - if self.infos.has_key('instructions'): - self.label.set_text(self.infos['instructions']) + if is_form: + self.is_form = True + self.data_form_widget = dataforms_widget.DataFormWidget() + self.dataform = dataforms.ExtendForm(node = form) + self.data_form_widget.set_sensitive(True) + try: + self.data_form_widget.data_form = self.dataform + except dataforms.Error: + self.label.set_text(_('Error in received dataform')) self.label.show() - self.table = gtk.Table() - for name in self.infos.keys(): - if not name: - continue - if name == 'instructions': - continue - - nbrow = nbrow + 1 - self.table.resize(rows = nbrow, columns = 2) - label = gtk.Label(name.capitalize() + ':') - self.table.attach(label, 0, 1, nbrow - 1, nbrow, 0, 0, 0, 0) - entry = gtk.Entry() - entry.set_activates_default(True) - if self.infos[name]: - entry.set_text(self.infos[name]) - if name == 'password': - entry.set_visibility(False) - self.table.attach(entry, 1, 2, nbrow - 1, nbrow, 0, 0, 0, 0) - self.entries[name] = entry - self.table.show_all() - self.search_vbox.pack_start(self.table) - return - - self.dataform = dataforms.ExtendForm(node = form) - - self.data_form_widget.set_sensitive(True) - try: - self.data_form_widget.data_form = self.dataform - except dataforms.Error: - self.label.set_text(_('Error in received dataform')) - self.label.show() - return - self.is_form = True + return + if self.data_form_widget.title: + self.window.set_title('%s - Search - Gajim' % \ + self.data_form_widget.title) + else: + self.is_form = False + self.data_form_widget = config.FakeDataForm(form) + self.data_form_widget.show_all() self.search_vbox.pack_start(self.data_form_widget) - self.data_form_widget.show() - if self.data_form_widget.title: - self.window.set_title('%s - Search - Gajim' % \ - self.data_form_widget.title) + + def on_result_treeview_cursor_changed(self, treeview): + if self.jid_column == -1: + return + (model, iter) = treeview.get_selection().get_selected() + if not iter: + return + if model[iter][self.jid_column]: + self.add_contact_button.set_sensitive(True) + self.information_button.set_sensitive(True) + else: + self.add_contact_button.set_sensitive(False) + self.information_button.set_sensitive(False) def on_result_arrived(self, form, is_form): if self.pulse_id: @@ -157,8 +163,10 @@ class SearchWindow: # We suppose all items have the same fields sw = gtk.ScrolledWindow() sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - treeview = gtk.TreeView() - sw.add(treeview) + self.result_treeview = gtk.TreeView() + self.result_treeview.connect('cursor-changed', + self.on_result_treeview_cursor_changed) + sw.add(self.result_treeview) # Create model fieldtypes = [str]*len(form[0]) model = gtk.ListStore(*fieldtypes) @@ -168,13 +176,18 @@ class SearchWindow: # Create columns counter = 0 for field in form[0].keys(): - treeview.append_column( + self.result_treeview.append_column( gtk.TreeViewColumn(field, gtk.CellRendererText(), text = counter)) + if field == 'jid': + self.jid_column = counter counter += 1 - treeview.set_model(model) + self.result_treeview.set_model(model) sw.show_all() self.search_vbox.pack_start(sw) + if self.jid_column > -1: + self.add_contact_button.show() + self.information_button.show() return self.dataform = dataforms.ExtendForm(node = form) @@ -187,8 +200,23 @@ class SearchWindow: self.label.show() return + self.result_treeview = self.data_form_widget.records_treeview + selection = self.result_treeview.get_selection() + selection.set_mode(gtk.SELECTION_SINGLE) + self.result_treeview.connect('cursor-changed', + self.on_result_treeview_cursor_changed) + + counter = 0 + for field in self.dataform.items[0].fields: + if field.var == 'jid': + self.jid_column = counter + break + counter += 1 self.search_vbox.pack_start(self.data_form_widget) self.data_form_widget.show() + if self.jid_column > -1: + self.add_contact_button.show() + self.information_button.show() if self.data_form_widget.title: self.window.set_title('%s - Search - Gajim' % \ self.data_form_widget.title) diff --git a/src/statusicon.py b/src/statusicon.py index 1e9f0ae4e..6610e0087 100644 --- a/src/statusicon.py +++ b/src/statusicon.py @@ -1,6 +1,7 @@ ## statusicon.py ## ## Copyright (C) 2006 Nikos Kouremenos +## Copyright (C) 2007 Lukas Petrovicky ## ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License @@ -56,7 +57,7 @@ class StatusIcon(systray.Systray): text = helpers.get_notification_icon_tooltip_text() self.status_icon.set_tooltip(text) if gajim.events.get_nb_systray_events(): - state = 'message' # FIXME: this state should be called event, not message + state = 'event' self.status_icon.props.blinking = True else: state = self.status diff --git a/src/systray.py b/src/systray.py index 0ba839c85..84ae49877 100644 --- a/src/systray.py +++ b/src/systray.py @@ -6,6 +6,7 @@ ## Copyright (C) 2005 Dimitur Kirov ## Copyright (C) 2005-2006 Travis Shirk ## Copyright (C) 2005 Norman Rasmussen +## Copyright (C) 2007 Lukas Petrovicky ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published @@ -82,7 +83,7 @@ class Systray: if not gajim.interface.systray_enabled: return if gajim.events.get_nb_systray_events(): - state = 'message' + state = 'event' else: state = self.status image = gajim.interface.roster.jabber_state_images['16'][state] @@ -144,7 +145,7 @@ class Systray: # We need our own set of status icons, let's make 'em! iconset = gajim.config.get('iconset') - path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16') + path = os.path.join(helpers.get_iconset_path(iconset), '16x16') state_images = gajim.interface.roster.load_iconset(path) if state_images.has_key('muc_active'): @@ -214,16 +215,13 @@ class Systray: account_menu_for_single_message.append(item) # join gc - label = gtk.Label() - label.set_markup('' + account.upper() +'') - label.set_use_underline(False) - gc_item = gtk.MenuItem() - gc_item.add(label) - gc_item.connect('state-changed', - gtkgui_helpers.on_bm_header_changed_state) + gc_item = gtk.MenuItem(_('using account %s') % account, False) gc_sub_menu.append(gc_item) - gajim.interface.roster.add_bookmarks_list(gc_sub_menu, + 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() elif connected_accounts == 1: # one account # one account connected, no need to show 'as jid' diff --git a/src/tooltips.py b/src/tooltips.py index 8e68ddfbb..f7aa83f75 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -4,6 +4,7 @@ ## Copyright (C) 2005-2006 Dimitur Kirov ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2005-2006 Yann Le Boulanger +## Copyright (C) 2007 Julien Pivotto ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published @@ -161,13 +162,15 @@ class StatusTable: self.table = gtk.Table(4, 1) self.table.set_property('column-spacing', 2) - def add_text_row(self, text): + def add_text_row(self, text, col_inc = 0): + self.current_row += 1 self.text_label = gtk.Label() self.text_label.set_line_wrap(True) self.text_label.set_alignment(0, 0) self.text_label.set_selectable(False) self.text_label.set_markup(text) - self.table.attach(self.text_label, 1, 4, 1, 2) + self.table.attach(self.text_label, 1 + col_inc, 4, self.current_row, + self.current_row + 1) def get_status_info(self, resource, priority, show, status): str_status = resource + ' (' + unicode(priority) + ')' @@ -226,7 +229,7 @@ class NotificationAreaTooltip(BaseTooltip, StatusTable): iconset = gajim.config.get('iconset') if not iconset: iconset = 'dcraven' - file_path = os.path.join(gajim.DATA_DIR, 'iconsets', iconset, '16x16') + file_path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for acct in accounts: message = acct['message'] # before reducing the chars we should assure we send unicode, else @@ -248,21 +251,19 @@ class NotificationAreaTooltip(BaseTooltip, StatusTable): self.add_status_row(file_path, acct['show'], gobject.markup_escape_text(acct['name']) , show_lock=show_lock) + for line in acct['event_lines']: + self.add_text_row(' ' + line, 2) def populate(self, data): self.create_window() self.create_table() - accounts = helpers.get_accounts_info() - if len(accounts) > 1: - self.table.resize(2, 1) - self.fill_table_with_accounts(accounts) + + accounts = helpers.get_notification_icon_tooltip_dict() + self.table.resize(2, 1) + self.fill_table_with_accounts(accounts) self.hbox = gtk.HBox() self.table.set_property('column-spacing', 1) - text = helpers.get_notification_icon_tooltip_text() - text = gobject.markup_escape_text(text) - - self.add_text_row(text) self.hbox.add(self.table) self.win.add(self.hbox) @@ -297,7 +298,7 @@ class GCTooltip(BaseTooltip): status = contact.status.strip() if status != '': # escape markup entities - status = helpers.reduce_chars_newlines(status, 100, 5) + status = helpers.reduce_chars_newlines(status, 300, 5) status = '' +\ gobject.markup_escape_text(status) + '' properties.append((status, None)) @@ -352,6 +353,7 @@ class GCTooltip(BaseTooltip): vertical_fill, 0, 0) else: label.set_markup(property[0]) + label.set_line_wrap(True) vcard_table.attach(label, 1, 3, vcard_current_row, vcard_current_row + 1, gtk.FILL, vertical_fill, 0) @@ -377,7 +379,7 @@ class RosterTooltip(NotificationAreaTooltip): self.create_table() if not contacts or len(contacts) == 0: # Tooltip for merged accounts row - accounts = helpers.get_accounts_info() + accounts = helpers.get_notification_icon_tooltip_dict() self.table.resize(2, 1) self.spacer_label = '' self.fill_table_with_accounts(accounts) @@ -441,8 +443,7 @@ class RosterTooltip(NotificationAreaTooltip): iconset = gajim.config.get('iconset') if not iconset: iconset = 'dcraven' - file_path = os.path.join(gajim.DATA_DIR, - 'iconsets', iconset, '16x16') + file_path = os.path.join(helpers.get_iconset_path(iconset), '16x16') contact_keys = contacts_dict.keys() contact_keys.sort() diff --git a/src/vcard.py b/src/vcard.py index 3c94dd4b6..3e11a3cb6 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -3,6 +3,7 @@ ## Copyright (C) 2003-2006 Yann Le Boulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2006 Stefan Bethge +## Copyright (C) 2007 Lukas Petrovicky ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published @@ -70,27 +71,28 @@ class VcardWindow: self.account = account self.gc_contact = gc_contact - self.xml.get_widget('no_user_avatar_label').set_no_show_all(True) - self.xml.get_widget('no_user_avatar_label').hide() - self.xml.get_widget('PHOTO_image').set_no_show_all(True) - self.xml.get_widget('PHOTO_image').hide() - image = gtk.Image() - self.photo_button = self.xml.get_widget('PHOTO_button') - self.photo_button.set_image(image) - self.nophoto_button = self.xml.get_widget('NOPHOTO_button') + # Get real jid + if gc_contact: + if gc_contact.jid: + self.real_jid = gc_contact.jid + if gc_contact.resource: + self.real_jid += '/' + gc_contact.resource + else: + self.real_jid = gc_contact.get_full_jid() + else: + self.real_jid = contact.get_full_jid() + puny_jid = helpers.sanitize_filename(contact.jid) local_avatar_basepath = os.path.join(gajim.AVATAR_PATH, puny_jid) + \ '_local' for extension in ('.png', '.jpeg'): local_avatar_path = local_avatar_basepath + extension if os.path.isfile(local_avatar_path): + image = self.xml.get_widget('custom_avatar_image') image.set_from_file(local_avatar_path) - self.nophoto_button.set_no_show_all(True) - self.nophoto_button.hide() + image.show() + self.xml.get_widget('custom_avatar_label').show() break - else: - self.photo_button.set_no_show_all(True) - self.photo_button.hide() self.avatar_mime_type = None self.avatar_encoded = None self.vcard_arrived = False @@ -123,94 +125,6 @@ class VcardWindow: if win and ctrl.type_id != message_control.TYPE_GC: ctrl.show_avatar() - def on_NOPHOTO_button_clicked(self, button): - def on_ok(widget, path_to_file): - filesize = os.path.getsize(path_to_file) # in bytes - invalid_file = False - msg = '' - if os.path.isfile(path_to_file): - stat = os.stat(path_to_file) - if stat[6] == 0: - invalid_file = True - msg = _('File is empty') - else: - invalid_file = True - msg = _('File does not exist') - if invalid_file: - dialogs.ErrorDialog(_('Could not load image'), msg) - return - try: - pixbuf = gtk.gdk.pixbuf_new_from_file(path_to_file) - if filesize > 16384: # 16 kb - # get the image at 'notification size' - # and hope that user did not specify in ACE crazy size - pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'tooltip') - except gobject.GError, msg: # unknown format - # msg should be string, not object instance - msg = str(msg) - dialogs.ErrorDialog(_('Could not load image'), msg) - return - puny_jid = helpers.sanitize_filename(self.contact.jid) - path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + '_local.png' - pixbuf.save(path_to_file, 'png') - self.dialog.destroy() - self.update_avatar_in_gui() - - # rescale it - pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'vcard') - image = self.photo_button.get_image() - image.set_from_pixbuf(pixbuf) - self.photo_button.show() - self.nophoto_button.hide() - - def on_clear(widget): - self.dialog.destroy() - self.on_clear_button_clicked(widget) - - self.dialog = dialogs.AvatarChooserDialog(on_response_ok = on_ok, - on_response_clear = on_clear) - - def on_clear_button_clicked(self, widget): - # empty the image - image = self.photo_button.get_image() - image.set_from_pixbuf(None) - self.photo_button.hide() - self.nophoto_button.show() - # Delete file: - puny_jid = helpers.sanitize_filename(self.contact.jid) - path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + '_local.png' - try: - os.remove(path_to_file) - except OSError: - gajim.log.debug('Cannot remove %s' % path_to_file) - self.update_avatar_in_gui() - - def on_PHOTO_button_press_event(self, widget, event): - '''If right-clicked, show popup''' - if event.button == 3 and self.avatar_encoded: # right click - menu = gtk.Menu() - - # Try to get pixbuf -# pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(self.jid) - -# if pixbuf: -# nick = self.contact.get_shown_name() -# menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) -# menuitem.connect('activate', -# gtkgui_helpers.on_avatar_save_as_menuitem_activate, self.jid, -# None, nick + '.jpeg') -# menu.append(menuitem) - # show clear - menuitem = gtk.ImageMenuItem(gtk.STOCK_CLEAR) - menuitem.connect('activate', self.on_clear_button_clicked) - menu.append(menuitem) - menu.connect('selection-done', lambda w:w.destroy()) - # show the menu - menu.show_all() - menu.popup(None, None, None, event.button, event.time) - elif event.button == 1: # left click - self.on_NOPHOTO_button_clicked(widget) - def on_vcard_information_window_destroy(self, widget): if self.update_progressbar_timeout_id is not None: gobject.source_remove(self.update_progressbar_timeout_id) @@ -334,7 +248,7 @@ class VcardWindow: def fill_status_label(self): if self.xml.get_widget('information_notebook').get_n_pages() < 5: return - contact_list = gajim.contacts.get_contact(self.account, self.contact.jid) + contact_list = gajim.contacts.get_contacts(self.account, self.contact.jid) connected_contact_list = [] for c in contact_list: if c.show not in ('offline', 'error'): @@ -415,8 +329,13 @@ class VcardWindow: self.contact.status = '' # Request list time status - gajim.connections[self.account].request_last_status_time(self.contact.jid, - self.contact.resource) + if self.gc_contact: + j, r = gajim.get_room_and_nick_from_fjid(self.real_jid) + gajim.connections[self.account].request_last_status_time(j, r, + self.contact.jid) + else: + gajim.connections[self.account].request_last_status_time( + self.contact.jid, self.contact.resource) # do not wait for os_info if contact is not connected or has error # additional check for observer is needed, as show is offline for him @@ -424,12 +343,17 @@ class VcardWindow: and not self.contact.is_observer(): self.os_info_arrived = True else: # Request os info if contact is connected - gobject.idle_add(gajim.connections[self.account].request_os_info, - self.contact.jid, self.contact.resource) + if self.gc_contact: + j, r = gajim.get_room_and_nick_from_fjid(self.real_jid) + gobject.idle_add(gajim.connections[self.account].request_os_info, + j, r, self.contact.jid) + else: + gobject.idle_add(gajim.connections[self.account].request_os_info, + self.contact.jid, self.contact.resource) self.os_info = {0: {'resource': self.contact.resource, 'client': '', 'os': ''}} i = 1 - contact_list = gajim.contacts.get_contact(self.account, self.contact.jid) + contact_list = gajim.contacts.get_contacts(self.account, self.contact.jid) if contact_list: for c in contact_list: if c.resource != self.contact.resource: @@ -454,7 +378,7 @@ class VcardWindow: self.fill_status_label() if self.gc_contact: - gajim.connections[self.account].request_vcard(self.contact.jid, + gajim.connections[self.account].request_vcard(self.real_jid, self.gc_contact.get_full_jid()) else: gajim.connections[self.account].request_vcard(self.contact.jid) @@ -522,7 +446,7 @@ class ZeroconfVcardWindow: def fill_status_label(self): if self.xml.get_widget('information_notebook').get_n_pages() < 2: return - contact_list = gajim.contacts.get_contact(self.account, self.contact.jid) + contact_list = gajim.contacts.get_contacts(self.account, self.contact.jid) # stats holds show and status message stats = '' one = True # Are we adding the first line ? From 853448943b3e5f05e136453fe4d681497529a9eb Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Thu, 9 Aug 2007 15:46:58 +0000 Subject: [PATCH 26/32] fix icon size in menu --- data/glade/account_context_menu.glade | 1 + 1 file changed, 1 insertion(+) diff --git a/data/glade/account_context_menu.glade b/data/glade/account_context_menu.glade index ef05651e6..f853d133b 100644 --- a/data/glade/account_context_menu.glade +++ b/data/glade/account_context_menu.glade @@ -26,6 +26,7 @@ gtk-home + 1 From a18e21c476a803ed9b3fb74f3724280a11266400 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Thu, 9 Aug 2007 15:54:16 +0000 Subject: [PATCH 27/32] fix new contacts API in pep --- src/common/pep.py | 101 ++++++++++++++++++++++++---------------------- 1 file changed, 52 insertions(+), 49 deletions(-) diff --git a/src/common/pep.py b/src/common/pep.py index 9b65781a1..a4611c49e 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -2,73 +2,76 @@ from common import gajim, xmpp def user_mood(items, name, jid): (user, resource) = gajim.get_room_and_nick_from_fjid(jid) - contacts = gajim.contacts.get_contact(name, user, resource=resource) + contact = gajim.contacts.get_contact(name, user, resource=resource) + if not contact: + return for item in items.getTags('item'): child = item.getTag('mood') if child is not None: - for contact in contacts: - if contact.mood.has_key('mood'): - del contact.mood['mood'] - if contact.mood.has_key('text'): - del contact.mood['text'] - for ch in child.getChildren(): - if ch.getName() != 'text': - contact.mood['mood'] = ch.getName() - else: - contact.mood['text'] = ch.getData() + if contact.mood.has_key('mood'): + del contact.mood['mood'] + if contact.mood.has_key('text'): + del contact.mood['text'] + for ch in child.getChildren(): + if ch.getName() != 'text': + contact.mood['mood'] = ch.getName() + else: + contact.mood['text'] = ch.getData() def user_tune(items, name, jid): (user, resource) = gajim.get_room_and_nick_from_fjid(jid) - contacts = gajim.contacts.get_contact(name, user, resource=resource) + contact = gajim.contacts.get_contact(name, user, resource=resource) + if not contact: + return for item in items.getTags('item'): child = item.getTag('tune') if child is not None: - for contact in contacts: - if contact.tune.has_key('artist'): - del contact.tune['artist'] - if contact.tune.has_key('title'): - del contact.tune['title'] - if contact.tune.has_key('source'): - del contact.tune['source'] - if contact.tune.has_key('track'): - del contact.tune['track'] - if contact.tune.has_key('length'): - del contact.tune['length'] - for ch in child.getChildren(): - if ch.getName() == 'artist': - contact.tune['artist'] = ch.getData() - elif ch.getName() == 'title': - contact.tune['title'] = ch.getData() - elif ch.getName() == 'source': - contact.tune['source'] = ch.getData() - elif ch.getName() == 'track': - contact.tune['track'] = ch.getData() - elif ch.getName() == 'length': - contact.tune['length'] = ch.getData() + if contact.tune.has_key('artist'): + del contact.tune['artist'] + if contact.tune.has_key('title'): + del contact.tune['title'] + if contact.tune.has_key('source'): + del contact.tune['source'] + if contact.tune.has_key('track'): + del contact.tune['track'] + if contact.tune.has_key('length'): + del contact.tune['length'] + for ch in child.getChildren(): + if ch.getName() == 'artist': + contact.tune['artist'] = ch.getData() + elif ch.getName() == 'title': + contact.tune['title'] = ch.getData() + elif ch.getName() == 'source': + contact.tune['source'] = ch.getData() + elif ch.getName() == 'track': + contact.tune['track'] = ch.getData() + elif ch.getName() == 'length': + contact.tune['length'] = ch.getData() def user_geoloc(items, name, jid): pass def user_activity(items, name, jid): (user, resource) = gajim.get_room_and_nick_from_fjid(jid) - contacts = gajim.contacts.get_contact(name, user, resource=resource) + contact = gajim.contacts.get_contact(name, user, resource=resource) + if not contact: + return for item in items.getTags('item'): child = item.getTag('activity') if child is not None: - for contact in contacts: - if contact.activity.has_key('activity'): - del contact.activity['activity'] - if contact.activity.has_key('subactivity'): - del contact.activity['subactivity'] - if contact.activity.has_key('text'): - del contact.activity['text'] - for ch in child.getChildren(): - if ch.getName() != 'text': - contact.activity['activity'] = ch.getName() - for chi in ch.getChildren(): - contact.activity['subactivity'] = chi.getName() - else: - contact.activity['text'] = ch.getData() + if contact.activity.has_key('activity'): + del contact.activity['activity'] + if contact.activity.has_key('subactivity'): + del contact.activity['subactivity'] + if contact.activity.has_key('text'): + del contact.activity['text'] + for ch in child.getChildren(): + if ch.getName() != 'text': + contact.activity['activity'] = ch.getName() + for chi in ch.getChildren(): + contact.activity['subactivity'] = chi.getName() + else: + contact.activity['text'] = ch.getData() def user_send_mood(account, mood, message = ''): item = xmpp.Node('mood', {'xmlns': xmpp.NS_MOOD}) From 947ec8e933c40219474a8c869e666064358d8f05 Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Thu, 9 Aug 2007 23:05:43 +0000 Subject: [PATCH 28/32] PEP prefs added --- TODO.pep | 19 +- data/glade/preferences_window.glade | 5814 +++++++++++++++++---------- src/common/config.py | 6 + src/common/connection.py | 12 + src/common/pep.py | 13 +- src/config.py | 52 + src/roster_window.py | 16 +- src/tooltips.py | 4 + 8 files changed, 3773 insertions(+), 2163 deletions(-) diff --git a/TODO.pep b/TODO.pep index 5ff51f706..3e6072e98 100644 --- a/TODO.pep +++ b/TODO.pep @@ -1,5 +1,18 @@ • configure access model when changing it in the combobox -• tab in preferences for PEP +• configure tab in preferences for PEP • PEP in status change -• possible transport of Mood in message -• Tune not set to none on connection + +Tune use cases: +• on connection of an account set Tune to current track +• on disconnection of an account set Tune to None +• on change of a track set Tune to a new value + +Tooltips use cases: +• Show PEP in contact tooltips +• Show PEP in GC tooltips +• Show PEP in account tooltips + +Mood/Activity use cases +• on connection of an account set them to None +• on disconnection of an account set them to None +• on explicit set publish them diff --git a/data/glade/preferences_window.glade b/data/glade/preferences_window.glade index f82682c62..8e5954841 100644 --- a/data/glade/preferences_window.glade +++ b/data/glade/preferences_window.glade @@ -1,2166 +1,3678 @@ - - - + + + - - 6 - Preferences - preferences - - - - - True - 6 - - - True - True - False - - - True - 12 - 6 - - - True - Use t_rayicon (aka. notification area icon) - True - 0 - True - - - - False - False - - - - - True - True - If checked, Gajim will remember the roster and chat window positions in the screen and the sizes of them next time you run it - Save _position and size for roster and chat windows - True - 0 - True - - - - False - False - 1 - - - - - True - True - If checked, Gajim will display avatars of contacts in roster window and in group chats - Display a_vatars of contacts in roster - True - 0 - True - - - - False - False - 2 - - - - - True - True - If checked, Gajim will display status messages of contacts under the contact name in roster window and in group chats - Display status _messages of contacts in roster - True - 0 - True - - - - False - False - 3 - - - - - True - True - _Sort contacts by status - True - 0 - True - - - - False - False - 4 - - - - - True - 0 - GTK_SHADOW_NONE - - - True - 6 - 4 - 12 - - - True - 12 - - - True - 12 - - - True - Default status _iconset: - True - iconset_combobox - - - False - False - - - - - True - - - - False - 1 - - - - - True - True - 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, etc...) - Use _transports iconsets - True - 0 - True - - - - False - 2 - - - - - - - True - 12 - - - True - T_heme: - True - theme_combobox - - - False - False - - - - - True - - - - False - 1 - - - - - True - True - Configure color and font of the interface - Ma_nage... - True - 0 - - - - False - False - 2 - - - - - 1 - - - - - - - - - True - <b>Interface Customization</b> - True - - - label_item - - - - - False - 12 - 5 - - - - - False - - - - - True - General - - - tab - False - False - - - - - True - 12 - 6 - - - True - 5 - - - True - 1 - One message _window: - True - one_window_type_combobox - - - False - False - - - - - True - Never + + + 6 + Preferences + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + preferences + True + False + False + GDK_WINDOW_TYPE_HINT_NORMAL + GDK_GRAVITY_NORTH_WEST + True + False + + + + + + True + False + 6 + + + + True + True + True + False + GTK_POS_TOP + False + False + + + + 12 + True + False + 6 + + + + True + Use t_rayicon (aka. notification area icon) + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + If checked, Gajim will remember the roster and chat window positions in the screen and the sizes of them next time you run it + True + Save _position and size for roster and chat windows + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + If checked, Gajim will display avatars of contacts in roster window and in group chats + True + Display a_vatars of contacts in roster + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + If checked, Gajim will display status messages of contacts under the contact name in roster window and in group chats + True + Display status _messages of contacts in roster + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + True + _Sort contacts by status + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + 6 + True + 0.5 + 0.5 + 1 + 1 + 4 + 0 + 12 + 0 + + + + True + False + 12 + + + + True + False + 12 + + + + True + Default status _iconset: + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + iconset_combobox + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + True + + + + 0 + False + True + + + + + + True + 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, etc...) + True + Use _transports iconsets + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + True + + + + + 0 + True + True + + + + + + True + False + 12 + + + + True + T_heme: + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + theme_combobox + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + True + + + + 0 + False + True + + + + + + True + Configure color and font of the interface + True + Ma_nage... + True + GTK_RELIEF_NORMAL + True + + + + 0 + False + False + + + + + 0 + True + True + + + + + + + + + + True + <b>Interface Customization</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 12 + False + True + + + + + False + True + + + + + + True + General + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 6 + + + + True + False + 5 + + + + True + One message _window: + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 1 + 0 + one_window_type_combobox + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + Never Always Per account Per type - - - - False - False - 1 - - - - - False - - - - - True - Hides buttons in chatwindows to - _Make message windows compact - True - 0 - True - - - - False - False - 1 - - - - - True - True - Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text. - Ignore rich content in incoming messages - True - 0 - True - - - - False - False - 2 - - - - - True - _Highlight misspelled words - True - 0 - True - - - - False - False - 3 - - - - - True - 4 - - - True - 1 - Treat all incoming messages as: - - - False - False - - - - - True - Determined by sender + False + True + + + + 0 + False + False + + + + + 0 + False + True + + + + + + Hides buttons in chatwindows to + True + _Make message windows compact + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text. + True + Ignore rich content in incoming messages + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + _Highlight misspelled words + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + False + 4 + + + + True + Treat all incoming messages as: + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 1 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + Determined by sender Chat message Single message - - - - False - False - 1 - - - - - False - 4 - - - - - True - 5 - - - True - If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons - - - True - 1 - Emoticons: - - - - - False - False - - - - - True - - - - False - 1 - - - - - False - 5 - - - - - True - 0 - GTK_SHADOW_NONE - - - True - 6 - 12 - - - True - 12 - - - True - 6 - - - True - 0 - Print time: - - - False - False - - - - - True - True - On every _message - True - 0 - True - - - - False - False - 1 - - - - - True - True - Also known as iChat style - E_very 5 minutes - True - 0 - True - time_always_radiobutton - - - - False - False - 2 - - - - - True - True - _Never - True - 0 - True - time_always_radiobutton - - - - False - False - 3 - - - - - False - - - - - True - 4 - 4 - 12 - 6 - - - True - True - Use system _default - True - 0 - True - - - - 2 - 4 - 3 - 4 - GTK_FILL - - - - - - True - 6 - - - True - 0 - _Font: - True - conversation_fontbutton - - - - - True - True - 0 - - - - False - 1 - - - - - 2 - 3 - 4 - GTK_FILL - - - - - True - - - True - - - False - - - - - True - True - False - 0 - - - - True - 0 - 0 - - - True - 2 - - - True - gtk-revert-to-saved - - - False - False - - - - - True - _Reset to Default Colors - True - - - False - False - 1 - - - - - - - - - False - False - 1 - - - - - 4 - 2 - 3 - GTK_FILL - - - - - True - True - 0 - - - - 3 - 4 - 1 - 2 - GTK_FILL - - - - - - True - 0 - _URL: - True - url_msg_colorbutton - - - 2 - 3 - 1 - 2 - GTK_FILL - - - - - - True - True - 0 - - - - 1 - 2 - 1 - 2 - - - - - - - True - 0 - _Status message: - True - GTK_JUSTIFY_CENTER - True - status_msg_colorbutton - - - 1 - 2 - GTK_FILL - - - - - - True - True - 0 - - - - 3 - 4 - GTK_FILL - - - - - - True - 0 - _Outgoing message: - True - GTK_JUSTIFY_CENTER - True - outgoing_msg_colorbutton - - - 2 - 3 - GTK_FILL - - - - - - True - True - True - True - True - 0 - - - - 1 - 2 - - - - - - - True - 0 - _Incoming message: - True - GTK_JUSTIFY_CENTER - True - incoming_msg_colorbutton - - - GTK_FILL - - - - - - False - 1 - - - - - - - - - True - <b>Format of a line</b> - True - - - label_item - - - - - False - False - 6 - - - - - 1 - False - - - - - True - Chat - - - tab - 1 - False - False - - - - - True - 12 - 12 - - - True - 0 - GTK_SHADOW_NONE - - - True - 6 - 12 - - - True - 6 - - - True - 2 - 0 - GTK_SHADOW_NONE - - - True - 12 - - - True - 3 - 6 - - - True - True - Gajim will notify you for new events via a popup in the bottom right of the screen - _Notify me about it - True - 0 - True - - - - False - False - - - - - True - True - Gajim will automatically show new events by popping up the relevant window - _Pop it up - True - 0 - True - notify_on_new_message_radiobutton - - - - False - False - 1 - - - - - True - True - Gajim will only change the icon of the contact that triggered the new event - Show only in _roster - True - 0 - True - notify_on_new_message_radiobutton - - - - False - False - 2 - - - - - - - - - True - When a new event (message, file transfer request etc..) is received, the following methods may be used to inform you about it. Please note that events about new messages only occur if it is a new message from a contact you are not already chatting with - - - True - When new event is received - - - - - label_item - - - - - False - False - - - - - True - 6 - - - True - Notify me about contacts that: - - - False - False - - - - - True - True - Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed in - Sign _in - True - 0 - True - - - - False - False - 1 - - - - - True - True - Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed out - Sign _out - True - 0 - True - - - - False - False - 2 - - - - - False - 1 - - - - - True - True - Allow popup/notifications when I'm _away/na/busy/invisible - True - 0 - True - - - - False - False - 2 - - - - - True - True - - - True - True - 0 - - - - True - 0 - 0 - - - True - 2 - - - True - gtk-open - - - False - False - - - - - True - _Advanced Notifications Control... - True - - - False - False - 1 - - - - - - - - - False - False - - - - - - - - - - - 3 - - - - - - - - - True - <b>Visual Notifications</b> - True - - - label_item - - - - - False - False - - - - - True - True - Check this option, only if someone you don't have in the roster spams/annoys you. Use with caution, because it blocks all messages from any contact that is not in the roster - _Ignore events from contacts not in the roster - True - 0 - True - - - - False - False - 1 - - - - - True - 12 - - - True - 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 send to the other party. - - - True - Outgoing Chat state noti_fications: - True - - - - - False - False - - - - - True - All chat states + False + True + + + + 0 + False + False + + + + + 0 + False + True + + + + + + True + False + 5 + + + + True + If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons + True + False + + + + True + Emoticons: + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 1 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + 0 + False + False + + + + + + True + False + True + + + + 0 + False + True + + + + + 0 + False + True + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + 6 + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 12 + + + + True + False + 6 + + + + True + Print time: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + True + On every _message + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + Also known as iChat style + True + E_very 5 minutes + True + GTK_RELIEF_NORMAL + True + False + False + True + time_always_radiobutton + + + + 0 + False + False + + + + + + True + True + _Never + True + GTK_RELIEF_NORMAL + True + False + False + True + time_always_radiobutton + + + + 0 + False + False + + + + + 0 + False + True + + + + + + True + 4 + 4 + False + 6 + 12 + + + + True + True + Use system _default + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 2 + 4 + 3 + 4 + + + + + + + + True + False + 6 + + + + True + _Font: + True + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + conversation_fontbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + True + True + + + + + + True + True + True + True + False + False + True + + + + 0 + False + True + + + + + 0 + 2 + 3 + 4 + + + + + + + True + False + 0 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + True + False + + + + + + True + True + GTK_RELIEF_NORMAL + False + + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-revert-to-saved + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + _Reset to Default Colors + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + + + + 0 + False + False + + + + + 0 + 4 + 2 + 3 + + + + + + + True + True + False + True + + + + 3 + 4 + 1 + 2 + + + + + + + + True + _URL: + True + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + url_msg_colorbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 1 + 2 + + + + + + + + True + True + False + True + + + + 1 + 2 + 1 + 2 + + + + + + + + True + _Status message: + True + False + GTK_JUSTIFY_CENTER + True + False + 0 + 0.5 + 0 + 0 + status_msg_colorbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + + + + + + + + True + True + False + True + + + + 3 + 4 + 0 + 1 + + + + + + + + True + _Outgoing message: + True + False + GTK_JUSTIFY_CENTER + True + False + 0 + 0.5 + 0 + 0 + outgoing_msg_colorbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 0 + 1 + + + + + + + + True + True + True + True + True + False + True + + + + 1 + 2 + 0 + 1 + + + + + + + + True + _Incoming message: + True + False + GTK_JUSTIFY_CENTER + True + False + 0 + 0.5 + 0 + 0 + incoming_msg_colorbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + + + + + + + 0 + False + True + + + + + + + + + + True + <b>Format of a line</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + False + True + + + + + + True + Chat + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 12 + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + 6 + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 6 + + + + 2 + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + 3 + True + False + 6 + + + + True + Gajim will notify you for new events via a popup in the bottom right of the screen + True + _Notify me about it + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + Gajim will automatically show new events by popping up the relevant window + True + _Pop it up + True + GTK_RELIEF_NORMAL + True + False + False + True + notify_on_new_message_radiobutton + + + + 0 + False + False + + + + + + True + Gajim will only change the icon of the contact that triggered the new event + True + Show only in _roster + True + GTK_RELIEF_NORMAL + True + False + False + True + notify_on_new_message_radiobutton + + + + 0 + False + False + + + + + + + + + + True + When a new event (message, file transfer request etc..) is received, the following methods may be used to inform you about it. Please note that events about new messages only occur if it is a new message from a contact you are not already chatting with + True + False + + + + True + When new event is received + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + label_item + + + + + 0 + False + False + + + + + + True + False + 6 + + + + True + Notify me about contacts that: + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed in + True + Sign _in + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed out + True + Sign _out + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + 0 + False + True + + + + + + True + True + Allow popup/notifications when I'm _away/na/busy/invisible + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + False + 0 + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-open + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + _Advanced Notifications Control... + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + + + + 0 + False + False + + + + + + + + + + + + + 0 + True + True + + + + + + + + + + True + <b>Visual Notifications</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + + True + Check this option, only if someone you don't have in the roster spams/annoys you. Use with caution, because it blocks all messages from any contact that is not in the roster + True + _Ignore events from contacts not in the roster + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + False + 12 + + + + True + 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 send to the other party. + True + False + + + + True + Outgoing Chat state noti_fications: + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + 0 + False + False + + + + + + True + All chat states Composing only Disabled - - - - False - 1 - - - - - False - False - 2 - - - - - True - 12 - - - True - 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 display in chat windows. - - - True - Displayed Chat state noti_fications: - True - - - - - False - False - - - - - True - All chat states + False + True + + + + 0 + False + True + + + + + 0 + False + False + + + + + + True + False + 12 + + + + True + 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 display in chat windows. + True + False + + + + True + Displayed Chat state noti_fications: + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + 0 + False + False + + + + + + True + All chat states Composing only Disabled - - - - False - 1 - - - - - False - False - 3 - - - - - True - True - - - True - 6 - - - True - 6 - True - - - True - True - Play _sounds - True - 0 - True - - - - - - 5 - - - True - _Player: - True - soundplayer_entry - - - - - True - True - - - - 1 - - - - - 1 - - - - - False - False - - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - - - True - True - - - - - - 1 - - - - - True - 6 - - - True - True - - - - - - True - True - ... - True - 0 - - - - False - False - 1 - - - - - True - True - 0 - - - - True - gtk-media-play - - - - - False - False - 2 - - - - - False - 2 - - - - - - - True - <b>Sounds</b> - True - - - label_item - - - - - 4 - - - - - 2 - False - - - - - True - Events - - - tab - 2 - False - False - - - - - True - 12 - 12 - - - True - 2 - 4 - 12 - 6 - - - True - True - The auto not available status message - - - - 3 - 4 - 1 - 2 - - - - - - True - True - The auto away status message - - - - 3 - 4 - - - - - - True - 1 - 0 - - - 50 - True - True - 20 1 1440 1 10 10 - 1 - - - - - - 1 - 2 - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - 1 - 0 - - - 50 - True - True - 12 1 720 1 10 10 - 1 - - - - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - 0 - minutes - - - 2 - 3 - 1 - 2 - GTK_FILL - - - - - - True - 0 - minutes - - - 2 - 3 - GTK_FILL - - - - - - True - True - Auto _not available after: - True - 0 - True - - - - 1 - 2 - GTK_FILL - - - - - - True - True - Auto _away after: - True - 0 - True - - - - GTK_FILL - - - - - - False - - - - - True - 6 - - - True - Ask status message when I: - - - False - False - - - - - True - 14 - - - True - True - Sign _in - True - 0 - True - - - - False - False - - - - - True - True - Sign _out - True - 0 - True - - - - False - False - 1 - - - - - False - False - 1 - - - - - False - False - 1 - - - - - True - True - Works for Rhythmbox and Muine players. For more players, please visit http://trac.gajim.org/wiki/GajimAndMusicPlayer - Set status message to reflect currently playing _music track - True - 0 - True - - - - False - False - 2 - - - - - True - An example: If you have enabled status message for away, Gajim won't ask you anymore for a status message when you change your status to away; it will use the default one set here - - - True - True - - - - True - True - 6 - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - - - True - True - - - - - - - True - Default Status Messages - - - label_item - - - - - - - False - 3 - - - - - True - 0 - GTK_SHADOW_NONE - - - True - 6 - 12 - - - True - 6 - - - True - 6 - - - True - True - 5 - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - - - True - True - False - - - - - - - - - True - GTK_BUTTONBOX_START - - - True - True - True - 5 - gtk-new - True - 0 - - - - - - True - True - True - 5 - gtk-delete - True - 0 - - - - 1 - - - - - False - 1 - - - - - - - True - True - 5 - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - - - True - True - - - - - False - False - 1 - - - - - - - - - True - <b>Preset Status Messages</b> - True - - - label_item - - - - - 4 - - - - - 3 - False - - - - - True - Status - - - tab - 3 - False - False - - - - - True - 12 - 6 - - - True - 0 - GTK_SHADOW_NONE - - - True - 6 - 12 - - - True - 6 - - - True - Autodetect on every Gajim startup + False + True + + + + 0 + False + True + + + + + 0 + False + False + + + + + + True + True + False + 0 + + + + True + False + 6 + + + + True + True + 6 + + + + True + True + Play _sounds + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + True + True + + + + + + False + 5 + + + + True + _Player: + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + soundplayer_entry + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + True + True + + + + + + True + True + True + True + 0 + + True + + False + + + + 0 + True + True + + + + + 0 + True + True + + + + + 0 + False + False + + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + False + False + False + + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + True + True + True + 0 + + True + + False + + + + 0 + True + True + + + + + + True + True + ... + True + GTK_RELIEF_NORMAL + True + + + + 0 + False + False + + + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-media-play + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + 0 + False + True + + + + + + + + True + <b>Sounds</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + True + + + + + False + True + + + + + + True + Events + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 12 + + + + True + 2 + 4 + False + 6 + 12 + + + + True + The auto not available status message + True + True + True + 0 + + True + + False + + + + 3 + 4 + 1 + 2 + + + + + + + True + The auto away status message + True + True + True + 0 + + True + + False + + + + 3 + 4 + 0 + 1 + + + + + + + True + 1 + 0.5 + 0 + 1 + 0 + 0 + 0 + 0 + + + + 50 + True + True + 1 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 20 1 1440 1 10 10 + + + + + + 1 + 2 + 1 + 2 + + + + + + + + True + 1 + 0.5 + 0 + 1 + 0 + 0 + 0 + 0 + + + + 50 + True + True + 1 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 12 1 720 1 10 10 + + + + + + 1 + 2 + 0 + 1 + + + + + + + + True + minutes + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 1 + 2 + + + + + + + + True + minutes + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 2 + 3 + 0 + 1 + + + + + + + + True + True + Auto _not available after: + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + 1 + 1 + 2 + + + + + + + + True + True + Auto _away after: + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + 1 + 0 + 1 + + + + + + + 0 + False + True + + + + + + True + False + 6 + + + + True + Ask status message when I: + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + False + 14 + + + + True + True + Sign _in + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + True + Sign _out + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + 0 + False + False + + + + + 0 + False + False + + + + + + True + Works for Rhythmbox and Muine players. For more players, please visit http://trac.gajim.org/wiki/GajimAndMusicPlayer + True + Set status message to reflect currently playing _music track + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + An example: If you have enabled status message for away, Gajim won't ask you anymore for a status message when you change your status to away; it will use the default one set here + True + False + + + + True + True + False + 0 + + + + + 6 + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + False + False + False + + + + + + + + True + Default Status Messages + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + + + 0 + False + True + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + 6 + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 6 + + + + True + False + 6 + + + + 5 + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + False + False + False + True + False + False + False + + + + + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_START + 0 + + + + 5 + True + True + True + gtk-new + True + GTK_RELIEF_NORMAL + True + + + + + + + 5 + True + True + True + gtk-delete + True + GTK_RELIEF_NORMAL + True + + + + + + 0 + False + True + + + + + 0 + True + True + + + + + + 5 + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + True + GTK_JUSTIFY_LEFT + GTK_WRAP_NONE + True + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 0 + False + False + + + + + + + + + + True + <b>Preset Status Messages</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + True + + + + + False + True + + + + + + True + Status + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 6 + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + 6 + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 6 + + + + True + Autodetect on every Gajim startup Always use GNOME default applications Always use KDE default applications Always use XFCE4 default applications Custom - - - - - - 0 - GTK_SHADOW_NONE - - - True - 6 - 12 - - - True - 3 - 2 - 12 - 6 - - - True - True - - - - 1 - 2 - 2 - 3 - - - - - - True - 0 - _File manager: - True - custom_file_manager_entry - - - 2 - 3 - GTK_FILL - - - - - - True - True - - - - 1 - 2 - - - - - - True - True - - - - 1 - 2 - 1 - 2 - - - - - - True - 0 - _Mail client: - True - custom_mail_client_entry - - - 1 - 2 - GTK_FILL - - - - - - True - 0 - _Browser: - True - custom_browser_entry - - - GTK_FILL - - - - - - - - - - True - <b>Custom</b> - True - - - label_item - - - - - 1 - - - - - - - - - True - <b>Applications</b> - True - - - label_item - - - - - False - False - - - - - True - True - 0 - GTK_SHADOW_NONE - - - True - 6 - 12 - - - True - 6 - - - True - True - Notify on new _GMail email - True - 0 - True - - - - False - False - - - - - True - True - If checked, Gajim will also include information about the sender of the new emails - Display _extra email details - True - 0 - True - - - - False - False - 1 - - - - - - - - - True - <b>GMail Options</b> - True - - - label_item - - - - - False - False - 1 - - - - - True - 0 - GTK_SHADOW_NONE - - - True - 6 - 12 - - - True - 6 - - - True - True - _Log status changes of contacts - True - 0 - True - - - - False - False - - - - - True - True - Allow _OS information to be sent - True - 0 - True - - - - False - False - 1 - - - - - True - True - Always check to see if Gajim is the _default Jabber client on startup - True - 0 - True - - - - False - False - 2 - - - - - - - - - True - <b>Miscellaneous</b> - True - - - label_item - - - - - False - False - 2 - - - - - True - 0 - GTK_SHADOW_NONE - - - True - 6 - 0 - 12 - 335 - - - True - True - 0 - - - - True - 0 - 0 - - - True - 2 - - - True - gtk-open - - - False - False - - - - - True - _Open... - True - - - False - False - 1 - - - - - - - - - - - - - True - <b>Advanced Configuration Editor</b> - True - - - label_item - - - - - False - False - 3 - - - - - 4 - False - - - - - True - Advanced - - - tab - 4 - False - False - - - - - - - True - 15 - GTK_BUTTONBOX_END - - - True - True - True - gtk-close - True - 0 - - - - - - False - 1 - - - - - + False + True + + + + 0 + True + True + + + + + + 0 + 0.5 + GTK_SHADOW_NONE + + + + 6 + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + 3 + 2 + False + 6 + 12 + + + + True + True + True + True + 0 + + True + + False + + + + 1 + 2 + 2 + 3 + + + + + + + True + _File manager: + True + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + custom_file_manager_entry + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 2 + 3 + + + + + + + + True + True + True + True + 0 + + True + + False + + + + 1 + 2 + 0 + 1 + + + + + + + True + True + True + True + 0 + + True + + False + + + + 1 + 2 + 1 + 2 + + + + + + + True + _Mail client: + True + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + custom_mail_client_entry + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + + + + + + + + True + _Browser: + True + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + custom_browser_entry + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + + + + + + + + + + + + True + <b>Custom</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + True + + + + + + + + + + True + <b>Applications</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + 6 + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 6 + + + + True + True + Notify on new _GMail email + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + If checked, Gajim will also include information about the sender of the new emails + True + Display _extra email details + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + + + + + True + <b>GMail Options</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + 6 + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 6 + + + + True + True + _Log status changes of contacts + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + True + Allow _OS information to be sent + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + True + Always check to see if Gajim is the _default Jabber client on startup + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + + + + + True + <b>Miscellaneous</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + 6 + True + 0.5 + 0.5 + 1 + 0 + 0 + 0 + 12 + 335 + + + + True + True + GTK_RELIEF_NORMAL + True + + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-open + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + _Open... + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + + + + + + + + + True + <b>Advanced Configuration Editor</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + False + True + + + + + + True + Advanced + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + 12 + True + False + 6 + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 0 + + + + True + True + Publish Mood + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + True + Publish Activity + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + True + Publish Tune + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + + + + + True + <b>Publish Personal Events</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + True + + + + + + True + 0 + 0.5 + GTK_SHADOW_NONE + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 0 + + + + True + True + Subscribe Mood + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + True + True + Subscribe Activity + True + GTK_RELIEF_NORMAL + True + True + False + True + + + + 0 + False + False + + + + + + True + True + Subscribe Tune + True + GTK_RELIEF_NORMAL + True + True + False + True + + + + 0 + False + False + + + + + + + + + + True + <b>Subscribe Personal Events</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + True + True + + + + + False + True + + + + + + True + Personal Events + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.449999988079 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + 0 + True + True + + + + + + True + GTK_BUTTONBOX_END + 15 + + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + True + + + + + + 0 + False + True + + + + + + diff --git a/src/common/config.py b/src/common/config.py index f17c51c42..5f5a8d29b 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -229,6 +229,12 @@ class Config: 'use_latex': [opt_bool, False, _('If True, Gajim will convert string between $$ and $$ to an image using dvips and convert before insterting it in chat window.')], 'change_status_window_timeout': [opt_int, 15, _('Time of inactivity needed before the change status window closes down.')], 'max_conversation_lines': [opt_int, 500, _('Maximum number of lines that are printed in conversations. Oldest lines are cleared.')], + 'publish_mood': [opt_bool, False], + 'publish_activity': [opt_bool, False], + 'publish_tune': [opt_bool, False], + 'subscribe_mood': [opt_bool, True], + 'subscribe_activity': [opt_bool, True], + 'subscribe_tune': [opt_bool, True], } __options_per_key = { diff --git a/src/common/connection.py b/src/common/connection.py index 0284e1c39..89d22c3de 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -50,6 +50,11 @@ log = logging.getLogger('gajim.c.connection') import gtkgui_helpers +from common import dbus_support +if dbus_support.supported: + from music_track_listener import MusicTrackListener + import dbus + ssl_error = { 2: "Unable to get issuer certificate", 3: "Unable to get certificate CRL", @@ -181,6 +186,8 @@ class Connection(ConnectionHandlers): # We are doing disconnect at so many places, better use one function in all def disconnect(self, on_purpose = False): + #FIXME: set the Tune to None before disconnection per account + #gajim.interface.roster._music_track_changed(None, None) self.on_purpose = on_purpose self.connected = 0 self.time_to_reconnect = None @@ -525,6 +532,11 @@ class Connection(ConnectionHandlers): if self.on_connect_auth: self.on_connect_auth(con) self.on_connect_auth = None + #FIXME: should set the Tune per account only + listener = MusicTrackListener.get() + track = listener.get_playing_track() + gajim.interface.roster._music_track_changed(listener, track) +# print "%s - %s" % (track.artist, track.title) else: # Forget password if needed if not gajim.config.get_per('accounts', self.name, 'savepass'): diff --git a/src/common/pep.py b/src/common/pep.py index a4611c49e..8b49d899e 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -74,8 +74,12 @@ def user_activity(items, name, jid): contact.activity['text'] = ch.getData() def user_send_mood(account, mood, message = ''): + print "Sending %s: %s" % (mood, message) + if gajim.config.get('publish_mood') == False: + return item = xmpp.Node('mood', {'xmlns': xmpp.NS_MOOD}) - item.addChild(mood) + if mood != '': + item.addChild(mood) if message != '': i = item.addChild('text') i.addData(message) @@ -83,8 +87,11 @@ def user_send_mood(account, mood, message = ''): gajim.connections[account].send_pb_publish('', xmpp.NS_MOOD, item, '0') def user_send_activity(account, activity, subactivity = '', message = ''): + if gajim.config.get('publish_activity') == False: + return item = xmpp.Node('activity', {'xmlns': xmpp.NS_ACTIVITY}) - i = item.addChild(activity) + if activity != '': + i = item.addChild(activity) if subactivity != '': i.addChild(subactivity) if message != '': @@ -94,6 +101,8 @@ def user_send_activity(account, activity, subactivity = '', message = ''): 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 gajim.config.get('publish_tune') == False: + return item = xmpp.Node('tune', {'xmlns': xmpp.NS_TUNE}) if artist != '': i = item.addChild('artist') diff --git a/src/config.py b/src/config.py index 69d4b3b00..02fce854c 100644 --- a/src/config.py +++ b/src/config.py @@ -43,6 +43,7 @@ from common import passwords from common import zeroconf from common import dbus_support from common import dataforms +from common import pep from common.exceptions import GajimGeneralException @@ -496,6 +497,25 @@ class PreferencesWindow: widget.set_active(st) else: widget.set_sensitive(False) + + # PEP + st = gajim.config.get('publish_mood') + self.xml.get_widget('pub_mood').set_active(st) + + st = gajim.config.get('publish_activity') + self.xml.get_widget('pub_activity').set_active(st) + + st = gajim.config.get('publish_tune') + self.xml.get_widget('pub_tune').set_active(st) + + st = gajim.config.get('subscribe_mood') + self.xml.get_widget('sub_mood').set_active(st) + + st = gajim.config.get('subscribe_activity') + self.xml.get_widget('sub_activity').set_active(st) + + st = gajim.config.get('subscribe_tune') + self.xml.get_widget('sub_tune').set_active(st) # Notify user of new gmail e-mail messages, # only show checkbox if user has a gtalk account @@ -561,6 +581,38 @@ class PreferencesWindow: gajim.interface.roster.draw_roster() gajim.interface.save_config() + def on_pub_mood_toggled(self, widget): + if widget.get_active() == False: + for account in gajim.connections: + if gajim.connections[account].pep_supported: + pep.user_send_mood(account, '') + self.on_checkbutton_toggled(widget, 'publish_mood') + + def on_pub_activity_toggled(self, widget): + if widget.get_active() == False: + for account in gajim.connections: + if gajim.connections[account].pep_supported: + pep.user_send_activity(account, '') + self.on_checkbutton_toggled(widget, 'publish_activity') + + def on_pub_tune_toggled(self, widget): + if widget.get_active() == False: + for account in gajim.connections: + if gajim.connections[account].pep_supported: + pep.user_send_tune(account, '') + self.on_checkbutton_toggled(widget, 'publish_tune') + gajim.interface.roster.enable_syncing_status_msg_from_current_music_track( + widget.get_active()) + + def on_sub_mood_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'subscribe_mood') + + def on_sub_activity_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'subscribe_activity') + + def on_sub_tune_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'subscribe_tune') + def on_save_position_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'saveposition') diff --git a/src/roster_window.py b/src/roster_window.py index ebaa3cd31..91146bf99 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -2942,12 +2942,14 @@ class RosterWindow: if gajim.connections[account].pep_supported: pep_submenu = gtk.Menu() pep_menuitem.set_submenu(pep_submenu) - item = gtk.MenuItem('Mood') - pep_submenu.append(item) - item.connect('activate', self.on_change_mood_activate, account) - item = gtk.MenuItem('Activity') - pep_submenu.append(item) - item.connect('activate', self.on_change_activity_activate, account) + if gajim.config.get('publish_mood'): + item = gtk.MenuItem('Mood') + pep_submenu.append(item) + item.connect('activate', self.on_change_mood_activate, account) + if gajim.config.get('publish_activity'): + item = gtk.MenuItem('Activity') + pep_submenu.append(item) + item.connect('activate', self.on_change_activity_activate, account) else: pep_menuitem.set_no_show_all(True) pep_menuitem.hide() @@ -5273,7 +5275,7 @@ class RosterWindow: ## accounts has no effect until they are connected. gobject.timeout_add(1000, self.enable_syncing_status_msg_from_current_music_track, - gajim.config.get('set_status_msg_from_current_music_track')) + gajim.config.get('pub_tune')) if gajim.config.get('show_roster_on_startup'): self.window.show_all() diff --git a/src/tooltips.py b/src/tooltips.py index f7aa83f75..d1394357d 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -458,6 +458,10 @@ class RosterTooltip(NotificationAreaTooltip): contact.last_status_time) properties.append((self.table, None)) else: # only one resource + + #FIXME: User {Mood, Activity, Tune} not shown if there are + #multiple resources + #FIXME: User {Mood, Activity, Tune} not shown for self if contact.show: show = helpers.get_uf_show(contact.show) if contact.last_status_time: From 55a7061ea39c660dbfb7685a5b1413e4b7b3382f Mon Sep 17 00:00:00 2001 From: Piotr Gaczkowski Date: Fri, 10 Aug 2007 20:18:32 +0000 Subject: [PATCH 29/32] Better Tune support --- TODO.pep | 3 --- src/common/connection.py | 10 -------- src/common/connection_handlers.py | 10 ++++++++ src/common/pep.py | 6 ++++- src/roster_window.py | 39 ++++++++++++++++--------------- 5 files changed, 35 insertions(+), 33 deletions(-) diff --git a/TODO.pep b/TODO.pep index 3e6072e98..05c924dbf 100644 --- a/TODO.pep +++ b/TODO.pep @@ -1,11 +1,8 @@ • configure access model when changing it in the combobox -• configure tab in preferences for PEP • PEP in status change Tune use cases: -• on connection of an account set Tune to current track • on disconnection of an account set Tune to None -• on change of a track set Tune to a new value Tooltips use cases: • Show PEP in contact tooltips diff --git a/src/common/connection.py b/src/common/connection.py index 89d22c3de..393a7d741 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -50,11 +50,6 @@ log = logging.getLogger('gajim.c.connection') import gtkgui_helpers -from common import dbus_support -if dbus_support.supported: - from music_track_listener import MusicTrackListener - import dbus - ssl_error = { 2: "Unable to get issuer certificate", 3: "Unable to get certificate CRL", @@ -532,11 +527,6 @@ class Connection(ConnectionHandlers): if self.on_connect_auth: self.on_connect_auth(con) self.on_connect_auth = None - #FIXME: should set the Tune per account only - listener = MusicTrackListener.get() - track = listener.get_playing_track() - gajim.interface.roster._music_track_changed(listener, track) -# print "%s - %s" % (track.artist, track.title) else: # Forget password if needed if not gajim.config.get_per('accounts', self.name, 'savepass'): diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 5d95db71e..1451da0a8 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -40,6 +40,11 @@ from common.commands import ConnectionCommands from common.pubsub import ConnectionPubSub from common.caps import ConnectionCaps +from common import dbus_support +if dbus_support.supported: + import dbus + from music_track_listener import MusicTrackListener + STATUS_LIST = ['offline', 'connecting', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible', 'error'] # kind of events we can wait for an answer @@ -816,6 +821,11 @@ class ConnectionDisco: if identity['category'] == 'pubsub' and identity['type'] == \ 'pep': self.pep_supported = True + listener = MusicTrackListener.get() + track = listener.get_playing_track() + if gajim.config.get('publish_tune'): + gajim.interface.roster._music_track_changed(listener, + track, self.name) break if features.__contains__(common.xmpp.NS_BYTESTREAM): gajim.proxy65_manager.resolve(jid, self.connection, self.name) diff --git a/src/common/pep.py b/src/common/pep.py index 8b49d899e..9259820f5 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -101,8 +101,11 @@ def user_send_activity(account, activity, subactivity = '', message = ''): 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 gajim.config.get('publish_tune') == False: + print "Tune to be created" + if (gajim.config.get('publish_tune') == False) or \ + (gajim.connections[account].pep_supported == False): return + print "publish_tune == True and pep_supported" item = xmpp.Node('tune', {'xmlns': xmpp.NS_TUNE}) if artist != '': i = item.addChild('artist') @@ -123,3 +126,4 @@ def user_send_tune(account, artist = '', title = '', source = '', track = 0,leng item.addChild(payload=items) gajim.connections[account].send_pb_publish('', xmpp.NS_TUNE, item, '0') + print "Tune published" diff --git a/src/roster_window.py b/src/roster_window.py index 91146bf99..803c4ff66 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -3623,14 +3623,14 @@ class RosterWindow: listener = MusicTrackListener.get() self._music_track_changed_signal = listener.connect( 'music-track-changed', self._music_track_changed) - track = listener.get_playing_track() - self._music_track_changed(listener, track) + track = listener.get_playing_track() + self._music_track_changed(listener, track) else: if self._music_track_changed_signal is not None: listener = MusicTrackListener.get() listener.disconnect(self._music_track_changed_signal) self._music_track_changed_signal = None - self._music_track_changed(None, None) + self._music_track_changed(None, None) def _change_awn_icon_status(self, status): if not dbus_support.supported: @@ -3658,9 +3658,11 @@ class RosterWindow: except Exception, e: pass - def _music_track_changed(self, unused_listener, music_track_info): + def _music_track_changed(self, unused_listener, music_track_info, + account=''): from common import pep - accounts = gajim.connections.keys() + if account == '': + accounts = gajim.connections.keys() if music_track_info is None: artist = '' title = '' @@ -3681,14 +3683,18 @@ class RosterWindow: status_message = '♪ ' + _('"%(title)s" by %(artist)s') % \ {'title': music_track_info.title, 'artist': music_track_info.artist } + ' ♪' - for account in accounts: - if not gajim.config.get_per('accounts', account, - 'sync_with_global_status'): - continue - #FIXME: updates should arrive, when all accounts are - # connected and we know their abilities - if not gajim.connections[account].pep_supported: - continue + print "change (%s - %s) for %s" % (artist, title, account) + if account == '': + print "Multi accounts" + for account in accounts: + if not gajim.config.get_per('accounts', account, + 'sync_with_global_status'): + continue + if not gajim.connections[account].pep_supported: + continue + pep.user_send_tune(account, artist, title, source = '') + else: + print "Single account" pep.user_send_tune(account, artist, title, source = '') @@ -5270,12 +5276,7 @@ class RosterWindow: self.tooltip = tooltips.RosterTooltip() self.draw_roster() - ## Music Track notifications - ## FIXME: we use a timeout because changing status of - ## accounts has no effect until they are connected. - gobject.timeout_add(1000, - self.enable_syncing_status_msg_from_current_music_track, - gajim.config.get('pub_tune')) + self.enable_syncing_status_msg_from_current_music_track(gajim.config.get('publish_tune')) if gajim.config.get('show_roster_on_startup'): self.window.show_all() From f3f622769c16c7dde054e494ed03930c9bef013e Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Tue, 4 Dec 2007 10:20:52 +0000 Subject: [PATCH 30/32] [Florob] add album to tune pep message. see #3053 --- src/roster_window.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/roster_window.py b/src/roster_window.py index 803c4ff66..474f07dbc 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -3680,10 +3680,8 @@ class RosterWindow: else: artist = music_track_info.artist title = music_track_info.title - status_message = '♪ ' + _('"%(title)s" by %(artist)s') % \ - {'title': music_track_info.title, - 'artist': music_track_info.artist } + ' ♪' - print "change (%s - %s) for %s" % (artist, title, account) + source = music_track_info.album + print "change (%s - %s - %s) for %s" % (artist, source, title, account) if account == '': print "Multi accounts" for account in accounts: @@ -3692,10 +3690,10 @@ class RosterWindow: continue if not gajim.connections[account].pep_supported: continue - pep.user_send_tune(account, artist, title, source = '') + pep.user_send_tune(account, artist, title, source) else: print "Single account" - pep.user_send_tune(account, artist, title, source = '') + pep.user_send_tune(account, artist, title, source) def update_status_combobox(self): From a645006bf84c976ffcf2cc57cee4f6366059a7b5 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 12 Dec 2007 08:44:46 +0000 Subject: [PATCH 31/32] merge diff from trunk --- AUTHORS | 4 +- COPYING | 840 +- ChangeLog | 29 + Makefile.am | 12 +- README.html | 4 +- README.osx | 99 + THANKS | 1 - TODO.osx | 36 + autogen.sh | 14 +- configure.ac | 81 +- data/Makefile.am | 2 +- data/emoticons/animated/emoticons.py | 1 + data/emoticons/static-big/emoticons.py | 4 + data/emoticons/static-big/lion.png | Bin 0 -> 1362 bytes data/emoticons/static/emoticons.py | 4 + data/emoticons/static/lion.png | Bin 0 -> 934 bytes data/gajim-remote.1 | 2 +- data/gajim.desktop.in.in | 7 +- data/glade/account_context_menu.glade | 62 +- .../account_creation_wizard_window.glade | 92 +- data/glade/accounts_window.glade | 81 +- data/glade/add_new_contact_window.glade | 1 + data/glade/advanced_menuitem_menu.glade | 218 +- data/glade/chat_context_menu.glade | 2 +- data/glade/chat_control_popup_menu.glade | 190 +- data/glade/chat_to_muc_window.glade | 185 + data/glade/filetransfers.glade | 2 +- data/glade/gc_control_popup_menu.glade | 6 +- data/glade/gc_occupants_menu.glade | 28 +- data/glade/history_manager.glade | 90 +- data/glade/history_window.glade | 625 +- data/glade/message_window.glade | 1996 ++--- data/glade/passphrase_dialog.glade | 1 + data/glade/preferences_window.glade | 5918 +++++-------- data/glade/roster_contact_context_menu.glade | 45 +- data/glade/roster_window.glade | 39 +- data/glade/service_discovery_window.glade | 77 +- data/glade/single_message_window.glade | 1 + .../glade/zeroconf_contact_context_menu.glade | 123 +- data/glade/zeroconf_context_menu.glade | 86 +- data/nibs/Gajim.nib/classes.nib | 4 + data/nibs/Gajim.nib/info.nib | 24 + data/nibs/Gajim.nib/keyedobjects.nib | Bin 0 -> 7184 bytes data/other/cacerts.pem | 37 +- data/pixmaps/gajim.icns | Bin 0 -> 42918 bytes debian/changelog | 49 + debian/control | 13 +- debian/gajim.menu | 2 +- gajim.iss | 5 +- launch.sh | 13 +- po/LINGUAS | 30 +- po/cs.po | 5078 ++++++----- po/da.po | 7648 ++++++++++++++++ po/de.po | 6122 ++++++++----- po/fr.po | 8 +- po/{gl_ES.po => gl.po} | 0 po/it.po | 4784 ++++++---- po/lt.po | 7655 +++++++++++++++++ po/pl.po | 5144 ++++++----- po/pt_BR.po | 4614 ++++++---- po/ru.po | 5387 +++++++----- po/sr@Latn.po | 7637 ++++++++++++++++ setup_osx.py | 200 + setup_win32.py | 20 +- src/Makefile.am | 3 +- src/adhoc_commands.py | 20 +- src/advanced.py | 20 +- src/atom_window.py | 15 +- src/cell_renderer_image.py | 21 +- src/chat_control.py | 336 +- src/common/GnuPG.py | 42 +- src/common/GnuPGInterface.py | 3 + src/common/caps.py | 15 +- src/common/check_paths.py | 17 +- src/common/commands.py | 37 +- src/common/config.py | 53 +- src/common/configpaths.py | 9 +- src/common/connection.py | 385 +- src/common/connection_handlers.py | 415 +- src/common/contacts.py | 144 +- src/common/crypto.py | 86 + src/common/dataforms.py | 2 +- src/common/dbus_support.py | 24 +- src/common/defs.py | 2 +- src/common/dh.py | 207 + src/common/events.py | 30 +- src/common/exceptions.py | 29 +- src/common/fuzzyclock.py | 17 +- src/common/gajim.py | 28 +- src/common/helpers.py | 58 +- src/common/i18n.py | 19 +- src/common/logger.py | 24 +- src/common/nslookup.py | 13 +- src/common/optparser.py | 60 +- src/common/passwords.py | 16 +- src/common/proxy65_manager.py | 21 +- src/common/rst_xhtml_generator.py | 15 +- src/common/sleepy.py | 23 +- src/common/socks5.py | 19 +- src/common/stanza_session.py | 910 ++ src/common/xmpp/c14n.py | 36 + src/common/xmpp/idlequeue.py | 16 +- src/common/xmpp/protocol.py | 3 + src/common/xmpp/roster.py | 4 + src/common/xmpp/transports_nb.py | 35 +- src/common/xmpp_stringprep.py | 15 +- src/common/zeroconf/client_zeroconf.py | 30 +- .../zeroconf/connection_handlers_zeroconf.py | 169 +- src/common/zeroconf/connection_zeroconf.py | 43 +- src/common/zeroconf/roster_zeroconf.py | 13 +- src/common/zeroconf/zeroconf.py | 13 +- src/common/zeroconf/zeroconf_avahi.py | 35 +- src/common/zeroconf/zeroconf_bonjour.py | 17 +- src/config.py | 809 +- src/conversation_textview.py | 221 +- src/dataforms_widget.py | 146 +- src/dialogs.py | 498 +- src/disco.py | 57 +- src/features_window.py | 52 +- src/filetransfers_window.py | 60 +- src/gajim-remote.py | 18 +- src/gajim.py | 666 +- src/gajim_themes_window.py | 18 +- src/groupchat_control.py | 239 +- src/gtkexcepthook.py | 15 +- src/gtkgui_helpers.py | 45 +- src/history_manager.py | 53 +- src/history_window.py | 279 +- src/htmltextview.py | 8 + src/lastfm.py | 217 + src/lastfm_track_listener.py | 103 + src/message_control.py | 42 +- src/message_textview.py | 19 +- src/message_window.py | 153 +- src/music_track_listener.py | 38 +- src/negotiation.py | 87 + src/network_manager_listener.py | 51 +- src/notify.py | 52 +- src/osx/.deps/idle_la-idle.Plo | 1 + src/osx/.deps/nsapp.Plo | 1 + src/osx/Makefile.am | 45 + src/osx/__init__.py | 45 + src/osx/dbus.py | 131 + src/osx/growl/.deps/_growlImage.Plo | 1 + src/osx/growl/.deps/_growl_la-_growl.Plo | 1 + src/osx/growl/Growl.py | 247 + src/osx/growl/Makefile.am | 41 + src/osx/growl/__init__.py | 1 + src/osx/growl/_growl.c | 239 + src/osx/growl/_growlImage.m | 274 + src/osx/growl/setup.py | 25 + src/osx/growler.py | 63 + src/osx/idle.c | 174 + src/osx/nsapp.h | 19 + src/osx/nsapp.m | 239 + src/osx/prep_py2app.py | 23 + src/osx/setup.py | 20 + .../syncmenu/.deps/syncmenu_la-pysyncmenu.Plo | 1 + .../syncmenu/.deps/syncmenu_la-sync-menu.Plo | 1 + src/osx/syncmenu/Makefile.am | 21 + src/osx/syncmenu/pysyncmenu.c | 55 + src/osx/syncmenu/setup.py | 27 + src/osx/syncmenu/sync-menu.c | 728 ++ src/osx/syncmenu/sync-menu.h | 27 + src/osx/syncmenu/test-menu.c | 107 + src/osx/syncmenu/test-menu.py | 78 + src/profile_window.py | 105 +- src/remote_control.py | 19 +- src/roster_window.py | 948 +- src/search_window.py | 20 +- src/secrets.py | 194 + src/statusicon.py | 30 +- src/systray.py | 25 +- src/tooltips.py | 44 +- src/vcard.py | 39 +- 175 files changed, 56827 insertions(+), 20227 deletions(-) create mode 100644 README.osx create mode 100644 TODO.osx create mode 100644 data/emoticons/static-big/lion.png create mode 100644 data/emoticons/static/lion.png create mode 100644 data/glade/chat_to_muc_window.glade create mode 100644 data/nibs/Gajim.nib/classes.nib create mode 100644 data/nibs/Gajim.nib/info.nib create mode 100644 data/nibs/Gajim.nib/keyedobjects.nib create mode 100644 data/pixmaps/gajim.icns create mode 100644 po/da.po rename po/{gl_ES.po => gl.po} (100%) create mode 100644 po/lt.po create mode 100644 po/sr@Latn.po create mode 100644 setup_osx.py create mode 100644 src/common/crypto.py create mode 100644 src/common/dh.py create mode 100644 src/common/stanza_session.py create mode 100644 src/common/xmpp/c14n.py create mode 100644 src/lastfm.py create mode 100644 src/lastfm_track_listener.py create mode 100644 src/negotiation.py create mode 100644 src/osx/.deps/idle_la-idle.Plo create mode 100644 src/osx/.deps/nsapp.Plo create mode 100644 src/osx/Makefile.am create mode 100644 src/osx/__init__.py create mode 100644 src/osx/dbus.py create mode 100644 src/osx/growl/.deps/_growlImage.Plo create mode 100644 src/osx/growl/.deps/_growl_la-_growl.Plo create mode 100644 src/osx/growl/Growl.py create mode 100644 src/osx/growl/Makefile.am create mode 100644 src/osx/growl/__init__.py create mode 100644 src/osx/growl/_growl.c create mode 100644 src/osx/growl/_growlImage.m create mode 100644 src/osx/growl/setup.py create mode 100644 src/osx/growler.py create mode 100644 src/osx/idle.c create mode 100644 src/osx/nsapp.h create mode 100644 src/osx/nsapp.m create mode 100644 src/osx/prep_py2app.py create mode 100644 src/osx/setup.py create mode 100644 src/osx/syncmenu/.deps/syncmenu_la-pysyncmenu.Plo create mode 100644 src/osx/syncmenu/.deps/syncmenu_la-sync-menu.Plo create mode 100644 src/osx/syncmenu/Makefile.am create mode 100644 src/osx/syncmenu/pysyncmenu.c create mode 100644 src/osx/syncmenu/setup.py create mode 100644 src/osx/syncmenu/sync-menu.c create mode 100644 src/osx/syncmenu/sync-menu.h create mode 100644 src/osx/syncmenu/test-menu.c create mode 100644 src/osx/syncmenu/test-menu.py create mode 100644 src/secrets.py diff --git a/AUTHORS b/AUTHORS index 9c646612b..b57e57a65 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,8 +1,10 @@ CURRENT DEVELOPERS: -Yann Le Boulanger (asterix AT lagaule.org) +Yann Leboulanger (asterix AT lagaule.org) Nikos Kouremenos (kourem AT gmail.com) Travis Shirk (travis AT pobox.com) +Stephan Erb (steve-e AT h3c.de) +Julien Pivotto (roidelapluie AT gmail.com) PAST DEVELOPERS: diff --git a/COPYING b/COPYING index e90dfed1a..94a9ed024 100644 --- a/COPYING +++ b/COPYING @@ -1,285 +1,626 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - Preamble + Preamble - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + TERMS AND CONDITIONS - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". + 0. Definitions. -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. + "This License" refers to version 3 of the GNU General Public License. - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. + A "covered work" means either the unmodified Program or a work based +on the Program. - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. + 1. Source Code. -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. + The Corresponding Source for a work in source code form is that +same work. -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. + 2. Basic Permissions. - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of this License. - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. + 13. Use with the GNU Affero General Public License. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. + 14. Revised Versions of this License. - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. - NO WARRANTY + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. + 15. Disclaimer of Warranty. - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - END OF TERMS AND CONDITIONS + 16. Limitation of Liability. - How to Apply These Terms to Your New Programs + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it @@ -287,15 +628,15 @@ free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least +state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) - This program is free software; you can redistribute it and/or modify + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -304,37 +645,30 @@ the "copyright" line and a pointer to where the full notice is found. GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/ChangeLog b/ChangeLog index a4fba5334..09d388784 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,32 @@ +Gajim 0.11.4 (06 December 2007) + + * Fix /nick command in groupchats + * Better Metacontacts sorting + * Fix Ctrl + PageUP/Down behaviour + * Fix saving files from filetransfer under windows + +Gajim 0.11.3 (17 November 2007) + + * Fix bookmarks support detection + * Improve file transfer on windows + * Fix some zeroconf bugs + * Fix focus bug in chat window + * Fix nickname changement behaviour in groupchats + +Gajim 0.11.2 (22 September 2007) + + * Improve idle, transports support + * Enable ellipsization in roster and chatwindow + * Fixed some metacontacts problems (#2156, #2761) + * Beter support of XEP-0070 (Verifying HTTP Requests via XMPP) + * Make the same height of a banner for all chat tabs + * Fix a bug with french translation and invitations (#3043) + * Fix a bug with UTF-8 and emoticons + * Corrected many bugs with passwords and gnome-keyring + * Improve xhtml-im and pictures support + * Improve Ad-Hoc support + * And many other bufixes + Gajim 0.11.1 (18 February 2007) * Fixes in gajim-remote and the way XMPP URI are handled * Fix Idle under Windows diff --git a/Makefile.am b/Makefile.am index 50329095c..59a6d995d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -48,6 +48,16 @@ MAINTAINERCLEANFILES = \ compile \ depcomp \ config.guess \ + config.log \ config.sub \ + config.status \ aclocal.m4 \ - libtool + libtool \ + po/POTFILES.in \ + src/trayicon_la-eggtrayicon.loT \ + m4/intltool.m4 + +MAINTAINERCLEANDIRS = \ + autom4te.cache \ + build \ + dist diff --git a/README.html b/README.html index c59ac15a9..f1f224896 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.4 or higher
    • -
    • pygtk2.6 or higher
    • +
    • pygtk2.8 or higher
    • python-libglade
    • pysqlite2 (if you have python 2.5, you already have this)
    @@ -29,6 +29,7 @@ Gajim is a GTK+ app that loves GNOME. You can do 'make' so you don't require gno

    Optional Runtime Requirements

    • PyOpenSSL (python-pyopenssl package in Debian) for secure SSL/TLS. Python's default SSL is insecure, so this package is highly recommended!
    • +
    • python-crypto to enable End to end encryption
    • 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; if you don't know what that is, you don't need it
    • gtkspell and aspell-LANG where lang is your locale eg. en, fr etc
    • @@ -37,6 +38,7 @@ Gajim is a GTK+ app that loves GNOME. You can do 'make' so you don't require gno
    • notification-daemon or notify-python (and D-Bus) to get cooler popups
    • D-Bus running to have gajim-remote working
    • python-dbus bindings
    • +
    • python-sexy to have clickable URLs in chat windows

    diff --git a/README.osx b/README.osx new file mode 100644 index 000000000..64c45ad85 --- /dev/null +++ b/README.osx @@ -0,0 +1,99 @@ +Introduction +------------ + +This is an alpha release of Gajim for OS/X using native GTK+. It is not finished +nor is it relatively stable. The native port of GTK+ is alpha and not stable +yet, though it has proven to be usable for Gajim. Having said that it is usable, +basic functionality works. See the TODO file for a list of what is and is not +working. + + + +Installing +---------- + +Install the GTK+ framework into your /Library/Frameworks directory. It can be +found at http://codepunks.org/misc/gtk/osx. + +Copy the Gajim.app into the /Applications directory or any other directory. + + +Installing language dictionaries +-------------------------------- + +The codepunks.org build of the GTK+ framework comes with the US English +dictionary pre-installed. If you wish to install a different dictionary download +the appropriate dictionary from here: + +http://ftp.gnu.org/gnu/aspell/dict/ + +Then follow these instructions: + +source /Library/Frameworks/GTK+.framework/Versions/Current/bin/env +tar -jxf aspell--.tbz2 +cd aspell-- +./configure +make +make install + + +Compiling Requirements +---------------------- +These instructions were gathered for building a universal binary on a PPC. The +steps for building on an i386 should be essentially the same. + +Requirements: +- OS/X 10.4, i386 or ppc +- Universal MacPython 2.5 + http://www.pythonmac.org/packages/py25-fat/index.html +- Latest XCode (2.4.0 or greater) +- py2app + http://svn.pythonmac.org/py2app/py2app/trunk/doc/index.html + +Install all of the requirements. Make sure that the universal MacPython is +installed before py2app. Then ensure that this is the first python in your +PATH. + + export PATH=/Library/Frameworks/Python.framework/Versions/2.5/bin:$PATH + +Then install py2app. + + +Compiling +--------- + +In the top level run the configure script. If this is source is from subversion +then run the autogen.sh script. Follow it up with a make: + + ./configure + or + ./autogen.sh + make + +Once that is done Gajim can be run from the source tree. You may also create an +app bundle suitable for use or distribution. To do that run: + + python setup_osx.py build + +The Gajim.app bundle is created in the dist directory. This bundle is ready +for use as is. Copy it to your /Applications directory and you're good to go. + +You now have a self contained (almost, requires GTK+.framework still) universal +native build of Gajim. + +Optionally to create a distribution of the Gajim app bundle do: + + python setup_osx.py dist + + + +Development +----------- + +It is possible to run Gajim correctly from the app bundle but still use the +python code in the source tree. This line must be added to the _run() function +in the Gajim.app/Resources/__boot__.py file. It needs to be located just after +the sys module is imported. Font forget to fix the path to match your +environment. + +sys.path = ["/Users/user/Source/gajim/src"] + sys.path diff --git a/THANKS b/THANKS index 4e1288a78..e00eaa901 100644 --- a/THANKS +++ b/THANKS @@ -20,7 +20,6 @@ Guillaume Morin Gustavo J. A. M. Carneiro Ivo Anjo Josef Vybíral -Julien Pivotto Juraj Michalek Luis Peralta Michael Scherer diff --git a/TODO.osx b/TODO.osx new file mode 100644 index 000000000..b5c332299 --- /dev/null +++ b/TODO.osx @@ -0,0 +1,36 @@ +The bits that work +------------------ + +-idle checking +-dbus and gajim-remote, using dbus from GTK+.framework. +-systray icon +-app bundle with universal binaries. Depends on the GTK+.framework. +-notifications through growl, internal fallback works fine as well +-spell checking +-running apps and opening files/urls +-playing sounds +-Network monitoring +-Mostly everything else except for whats below. + + + +The bits that dont work +----------------------- + +-Application start/stop/doc/DnD handling +-finish the .app bundle + - setup gajim-remote, maybe install it to /usr/local + - fix user session management +-integrate the Gajim and gajim-remote scripts with autoconf and add GTK + framework detection +-Maybe setup the pasteboard services for an OS/X alternative to the + gajim_remote +-CFBundleDocumentTypes.NSDocument +-zeroconf has a parsing problem with the MDNS result. + + +Native GTK bugs +---------------- + +-cut and paste blows up Finder and the os/x GUI server. very very nasty. +-with mutiple displays, popup menus show up on the wrong display diff --git a/autogen.sh b/autogen.sh index dbf2cc812..97eb8bbce 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,4 +1,12 @@ #!/usr/bin/env bash + AM_ARGS="--add-missing --gnu --copy" + CONF_ARGS="" + if test x`uname -s 2>/dev/null` = 'xDarwin';then + . /Library/Frameworks/GTK+.framework/Versions/Current/env + AM_ARGS="${AM_ARGS} --ignore-deps" + CONF_ARGS="${CONF_ARGS} --disable-idle --without-x" + fi + echo "[encoding: UTF-8]" > po/POTFILES.in \ && ls -1 -U data/gajim.desktop.in.in data/glade/*.glade \ src/*py src/common/*py src/common/zeroconf/*.py >> \ @@ -8,11 +16,11 @@ echo "See README.html for build requirements." exit 1 fi - set -x + intltoolize --force --automake \ && aclocal -I ./m4 \ && libtoolize --copy --force --automake \ && autoheader \ && autoconf \ - && automake --add-missing --gnu --copy \ - && ./configure $@ + && automake ${AM_ARGS} \ + && ./configure ${CONF_ARGS} $@ diff --git a/configure.ac b/configure.ac index c4bdb142e..68f3e9ada 100644 --- a/configure.ac +++ b/configure.ac @@ -1,11 +1,14 @@ AC_INIT([Gajim - A Jabber Instant Messager], - [0.11.1.5],[http://trac.gajim.org/],[gajim]) + [0.11.4.0-svn],[http://trac.gajim.org/],[gajim]) AC_PREREQ([2.59]) AM_INIT_AUTOMAKE([1.8]) AC_CONFIG_HEADER(config.h) AC_CONFIG_MACRO_DIR([m4]) AM_MAINTAINER_MODE +dnl Make Objective-C work with automake +AM_CONDITIONAL([am__fastdepOBJC], false) + IT_PROG_INTLTOOL([0.35.0]) PKG_PROG_PKG_CONFIG([0.19]) @@ -33,7 +36,7 @@ AM_NLS dnl **** dnl pygtk and gtk+ dnl **** -PKG_CHECK_MODULES([PYGTK], [gtk+-2.0 >= 2.6.0 pygtk-2.0 >= 2.6.0]) +PKG_CHECK_MODULES([PYGTK], [gtk+-2.0 >= 2.8.0 pygtk-2.0 >= 2.8.0]) AC_SUBST(PYGTK_CFLAGS) AC_SUBST(PYGTK_LIBS) PYGTK_DEFS=`$PKG_CONFIG --variable=defsdir pygtk-2.0` @@ -128,6 +131,75 @@ AC_ARG_ENABLE(trayicon, test "x$enable_trayicon" = "xyes" && have_trayicon=true || have_trayicon=false AM_CONDITIONAL(BUILD_TRAYICON, $have_trayicon) +dnl **** +dnl Cocoa +dnl **** +AC_ARG_ENABLE([cocoa], + [ --disable-cocoa build cocoa integration [default auto]], + enable_cocoa=$enableval, enable_cocoa=yes) + +if test "x$enable_cocoa" = "xyes";then + dnl There is no pkgconfig for cocoa; lets do a header check + temp_save_cflags="$CFLAGS" + CFLAGS="$CFLAGS -ObjC" + AC_CHECK_HEADER(Cocoa/Cocoa.h, [have_cocoa=true], [have_cocoa=false]) + AC_CHECK_HEADER(AppKit/AppKit.h, [have_appkit=true], [have_appkit=false]) + CFLAGS="$temp_save_cflags" + + if test "x$have_cocoa" = "xtrue";then + COCOA_LIBS="$COCOA_LIBS -Xlinker -framework -Xlinker Cocoa" + fi + if test "x$have_appkit" = "xtrue";then + COCOA_LIBS="$COCOA_LIBS -Xlinker -framework -Xlinker AppKit" + fi + if test "x$COCOA_LIBS" != "x";then + AC_SUBST(COCOA_LIBS) + true + fi +fi +AM_CONDITIONAL(BUILD_COCOA, $have_cocoa) + +dnl **** +dnl Carbon +dnl **** +AC_ARG_ENABLE([carbon], + [ --disable-carbon build with carbon [default auto]], + enable_carbon=$enableval, enable_carbon=yes) + +if test "x$enable_carbon" = "xyes";then + dnl There is no pkgconfig for carbon; lets do a header check + AC_CHECK_HEADER(Carbon/Carbon.h, [have_carbon=true], [have_carbon=false]) + AC_CHECK_HEADER(IOKit/IOKitLib.h, [have_iokit=true], [have_iokit=false]) + + if test "x$have_carbon" = "xtrue";then + CARBON_LIBS="$CARBON_LIBS -Xlinker -framework -Xlinker Carbon" + fi + if test "x$have_iokit" = "xtrue";then + CARBON_LIBS="$CARBON_LIBS -Xlinker -framework -Xlinker IOKit" + fi + if test "x$CARBON_LIBS" != "x";then + AC_SUBST(CARBON_LIBS) + have_idle_osx=true + dnl Disable X11 idle + have_idle=false + AM_CONDITIONAL(BUILD_IDLE, false) + dnl Disable custom trayicon + have_trayicon=gtk+ + AM_CONDITIONAL(BUILD_TRAYICON, false) + dnl Hack to work around failure in gettext package detection on OS/X + if test "x$GMSGFMT" = "x";then + AC_SUBST(GMSGFMT, msgfmt) + AC_SUBST(MSGFMT, msgfmt) + AC_SUBST(XGETTEXT, xgettext) + fi + else + have_carbon=false + have_idle_osx=false + fi +fi +AM_CONDITIONAL(BUILD_IDLE_OSX, $have_carbon) +AM_CONDITIONAL(BUILD_CARBON, $have_carbon) + ACLOCAL_AMFLAGS="\${ACLOCAL_FLAGS}" AC_SUBST(ACLOCAL_AMFLAGS) @@ -159,6 +231,9 @@ AC_CONFIG_FILES([ data/defs.py src/Makefile src/common/Makefile + src/osx/Makefile + src/osx/growl/Makefile + src/osx/syncmenu/Makefile scripts/gajim scripts/gajim-remote po/Makefile.in @@ -171,4 +246,6 @@ echo " idle module ...... ${have_idle} remote control ... ${have_remote} trayicon ......... ${have_trayicon} + idle module OSX .. ${have_idle_osx} + cocoa ............ ${have_cocoa} *****************************" diff --git a/data/Makefile.am b/data/Makefile.am index 9b6abc349..c34b2916f 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -12,7 +12,7 @@ soundsdir = $(pkgdatadir)/data/sounds sounds_DATA = $(srcdir)/sounds/*.wav otherdir = $(pkgdatadir)/data/other -other_DATA = other/servers.xml +other_DATA = other/servers.xml other/cacerts.pem man_MANS = gajim.1 gajim-remote.1 diff --git a/data/emoticons/animated/emoticons.py b/data/emoticons/animated/emoticons.py index 336124ee6..90d2c3011 100644 --- a/data/emoticons/animated/emoticons.py +++ b/data/emoticons/animated/emoticons.py @@ -1,3 +1,4 @@ +# coding=utf-8 emoticons = { ':-[': 'bat.gif', ':[': 'bat.gif', diff --git a/data/emoticons/static-big/emoticons.py b/data/emoticons/static-big/emoticons.py index 50505816a..977ce6ff2 100644 --- a/data/emoticons/static-big/emoticons.py +++ b/data/emoticons/static-big/emoticons.py @@ -1,3 +1,4 @@ +# coding=utf-8 emoticons = { ':-)': 'smile.png', ':)': 'smile.png', @@ -54,6 +55,9 @@ emoticons = { # ':-[': 'bat.png', ':[': 'bat.png', +# + '>:3': 'lion.png', + ':3': 'lion.png', # #MSN ones '(@)': 'pussy.png', diff --git a/data/emoticons/static-big/lion.png b/data/emoticons/static-big/lion.png new file mode 100644 index 0000000000000000000000000000000000000000..ae10ca7bf7ad37bd8f3b0aa0fd3a2e16281a11e1 GIT binary patch literal 1362 zcmV-Y1+DstP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L0E%e<0E%e=v1PL|00007bV*G`2iFS? z6C4g%`T~dm00h!WL_t(I%e|G|Z&P&`$3MT*({}APx~=P8nR9cz4#q69O)!x-B1+JZ zpwXxaAu%CnOpG=`;th8aQw<4%QSc976TBcIGqCX@lSNWsxWO{VU}Ixr?b>cF7NP zoCQ`Yj@*j;nkHN&&k*hJBptcER|T4jR&Swrc|FJ#lr?Q7@@HrH%ur8xY4aQ8Jynmu z0y6$=J;^ zyGon3qApqu@vF$>C^*YFbKxdmwnZuN*f{!W2>|bZHNj+Lh)-Hhuz5{Ba&8nX16%zL zbZw5A!E*pViBJFsFz8#m?WxL*JCIXnAU(mu7^bB2T9To$G%__yHA8Hyj$%{fqaNX@ z!_l;tvESQ?^q%eqRxAD>I`DP)>PZZ35>dDg04XJwWpV8MEJbcuX8{iRgIG$omSc0evAK(p+FwX%fHdg2l_1z2XU`8&)Yu44)#CH6 zIu7(y^T)X75!jmO#_1`{`&$RmO+k)o zA)GGkRdongE?8+4)eevo3V`YlLMXtDnbInR;>`M$NGTCQViS@N59?eTRzWt>P^xj@ z9SwVaE+TgkLIBc0*qj(C4Iu6hK2|Z1oVo*c51^1p8SFfeV&s8=X&MYoSfn$MHUz`7 z`QR<%UNWDZ2O*I%0Rav#$?yokz(U7e+Q@Y*(?qyynTi|q-m!QPHE`KYj(h;sKB)Fd zj_fvZ*-akAOnUFYRNO?kYmk;eyL%m=YazJJNW@anTbB?8ek#2xr3KL5Z6Pg#YM((> zv81Y4QtdO4mO*>BpwuI&^a?~_3(>(VWVCQ9d-bpZeAkV(Ydxij$)V<=`c~AuQYxH- zeE+N9LcgHns-S03VKgiV-Bvhu$;Oo-8~fhUscU!{QxtLM)FCWA@vT2dJM(hp6ADlO zgz^^G*VMlLF(Na;mCGF*znDNbU~{7ZNII^mI8@2@4Gx}b*@SddG5qskW=C!e1Ac#y z*gwEocmvRxTfW3w{mL#Jd5e&:3': 'lion.png', + ':3': 'lion.png', # #MSN ones '(@)': 'pussy.png', diff --git a/data/emoticons/static/lion.png b/data/emoticons/static/lion.png new file mode 100644 index 0000000000000000000000000000000000000000..0ab9e7d05d9a82a115bc81fbd1aa2dfdb83d961a GIT binary patch literal 934 zcmV;X16lluP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L0E%e<0E%e=v1PL|00007bV*G`2iFS? z6CWCA4TUxU00SmTL_t(I%U#gTYg|$$B#$=M1#>OOt4$_L*6-z{f zE_9*Lm9)DqtaK;15nP4VKR_sj3gX6vSVa_qRxq)omd3Q2l%|;^lS#sib2E45&V4z@ zg{i2&<-_xQ7C-Up``KA5>s%JnP=Q;yrP_@pA&rwpD*u{cr^f(P&{~UH^;=rSOF~*j zE9aa;2qLd`)wHrbmwHdXIcsO~9F$hh9&Fs(Pxp@YWCo5KRyqej*ldh@TMuS~%EP@x z&zO@PdC?3#m%Te*_@)p-Tj?B`>;dViX|sE3rmx;;Qr=x>G*bm&!%N@{P8-g%&-Dp^ z2h*(J<&J`off>}xU%8L(zM3x1ShBH%B@?VY*yo#H8oc~M0v-7Lw7AVH!+V?>j?pS4 zp1g?r_)a@;cfOP=Y~8N^aeF0bhL9S9$YrWvaJHDlF=}+W_c=3EVbXCSa1pr?+Hs2d zqlMpe)LxK)uj0T%nh@5}DrEki#|JlRw0G8tf{+h?9OZ|NP5@|@F_SiiomGI6Ku6LU z={HS@_P0Ps2pyrd1{DDstw9J4fUv=|1&JelgFu%Fq|Icu3tFIj(3+VEN#8pOj^&RM zm44@=Gi!`=`pDc7%)TMC2$7bZ0c;6GD)fD{fmRWv-2hXDZ0$#!yO!dO&!^cj21t#L zvy&MI+eQnMIBa=9Ac3l1+b+eiCQxavf7fPpGi0zkroR*VyCsD}mPfS|*S}W;I)hRs z?OM46R3)$(x|Id@$x3W>JWnQRFuxp8a3W3=G$#s*f)g>ntjQ!KR>uTxX*CZ1EH40? z0$}M1r|f*s&EeS#$EseHYoFey(F};y-;XmSWYZ>>-#$)Pu9x+1Z>$FO%K73Pi%$VV zNb^Fbf9&J_)2}BFG;D3G(rNDkidx%YU}%h-G$=2A?R(p+?`jo&Qk)|e9Ny9ul0q8i zjb!ejdtfxY4!;s3jT0Tz2|a8E~!ssI2007*qo IM6N<$f;PFT_5c6? literal 0 HcmV?d00001 diff --git a/data/gajim-remote.1 b/data/gajim-remote.1 index 8b13ff1a8..9bbbc7214 100644 --- a/data/gajim-remote.1 +++ b/data/gajim-remote.1 @@ -1,7 +1,7 @@ .\" 20050818 .TH "Gajim-remote" "1" "August 18, 2005" "Gajim dev team" "" .SH "NAME" -Gajim-remote +Gajim-remote \- tool to communicate with a running instance of Gajim .SH "SYNOPSIS" .B gajim-remote [help] [toggle_roster_appearance] [show_next_unread] [list_contacts] [list_accounts] [change_status] [open_chat] [send_message] [send_file] [contact_info] [account_info] [send_file] [prefs_list] [prefs_put] [prefs_del] [prefs_store] [remove_contact] [add_contact] [get_status] [get_status_message] [get_unread_msgs_number] [start_chat] .SH "DESCRIPTION" diff --git a/data/gajim.desktop.in.in b/data/gajim.desktop.in.in index 55b50e3ec..858078e09 100644 --- a/data/gajim.desktop.in.in +++ b/data/gajim.desktop.in.in @@ -1,12 +1,11 @@ [Desktop Entry] -Categories=Network;InstantMessaging;Application;GTK;GNOME; +Categories=Network;InstantMessaging;GTK;GNOME; _Name=Gajim Instant Messenger _GenericName=Jabber IM Client _Comment=A GTK+ Jabber client -Version=@VERSION@ -Encoding=UTF-8 +Version=1.0 Exec=gajim -Icon=gajim.png +Icon=gajim StartupNotify=true StartupWMClass=Gajim Terminal=false diff --git a/data/glade/account_context_menu.glade b/data/glade/account_context_menu.glade index f853d133b..4316c5f0c 100644 --- a/data/glade/account_context_menu.glade +++ b/data/glade/account_context_menu.glade @@ -32,21 +32,31 @@ - + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - + True - _Open Gmail Inbox + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + _Start Chat... True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-jump-to + 1 + + True - _Group Chat + Join _Group Chat... True @@ -57,6 +67,25 @@ + + + True + + + + + True + _Add Contact... + True + + + True + gtk-add + 1 + + + + True @@ -74,7 +103,7 @@ True - _Execute Command + _Execute Command... True @@ -85,29 +114,22 @@ + + + True + _Open Gmail Inbox + True + + True - - - True - _Add Contact - True - - - True - gtk-add - 1 - - - - True - _Modify Account... + _Modify Account True diff --git a/data/glade/account_creation_wizard_window.glade b/data/glade/account_creation_wizard_window.glade index 93ba1cb8b..38997769f 100644 --- a/data/glade/account_creation_wizard_window.glade +++ b/data/glade/account_creation_wizard_window.glade @@ -35,7 +35,6 @@ to the Jabber network. True - 0 GTK_SHADOW_NONE @@ -51,7 +50,7 @@ to the Jabber network. True True - I already have an account I want to use + I already have an account I want to _use True 0 True @@ -99,9 +98,6 @@ to the Jabber network. - - False - @@ -109,7 +105,6 @@ to the Jabber network. tab - False False @@ -294,7 +289,6 @@ to the Jabber network. 1 - False @@ -304,7 +298,6 @@ to the Jabber network. tab 1 - False False @@ -526,7 +519,6 @@ to the Jabber network. 2 - False @@ -536,7 +528,69 @@ to the Jabber network. tab 2 - False + False + + + + + True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-dialog-warning + 5 + + + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + 1 + + + + + False + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Add this certificate to the list of trusted certificates. +SHA1 fingerprint of the certificate: + + 0 + True + + + False + 1 + + + + + 3 + + + + + True + + + tab + 3 False @@ -548,8 +602,7 @@ to the Jabber network. - 3 - False + 4 @@ -558,8 +611,7 @@ to the Jabber network. tab - 3 - False + 4 False @@ -592,8 +644,7 @@ Please wait... - 4 - False + 5 @@ -602,8 +653,7 @@ Please wait... tab - 4 - False + 5 False @@ -671,8 +721,7 @@ Please wait... - 5 - False + 6 @@ -681,8 +730,7 @@ Please wait... tab - 5 - False + 6 False diff --git a/data/glade/accounts_window.glade b/data/glade/accounts_window.glade index ecd00cea6..4915193f9 100644 --- a/data/glade/accounts_window.glade +++ b/data/glade/accounts_window.glade @@ -780,42 +780,19 @@ - + True - 6 - - - True - False - True - If checked, Gajim will store the password in ~/.gajim/config with 'read' permission only for you - Save _passphrase (insecure) - True - True - - - - False - False - - - - - True - False - True - False - * - - - - 1 - - + False + True + If checked, Gajim will get the password from a GPG agent like seahorse + Use GPG _Agent + True + True + False - 1 + False @@ -1218,40 +1195,18 @@ You might consider to change possible firewall settings. - + True - 6 - - - True - True - If checked, Gajim will store the password in ~/.gajim/config with 'read' permission only for you - Save _passphrase (insecure) - True - True - - - - False - False - - - - - True - False - True - False - * - - - - 1 - - + True + If checked, Gajim will get the password from a GPG agent like seahorse + Use GPG _Agent + True + True + - 2 + False + False diff --git a/data/glade/add_new_contact_window.glade b/data/glade/add_new_contact_window.glade index cd10d283e..004d86963 100644 --- a/data/glade/add_new_contact_window.glade +++ b/data/glade/add_new_contact_window.glade @@ -206,6 +206,7 @@ True True + True A_llow this contact to view my status True 0 diff --git a/data/glade/advanced_menuitem_menu.glade b/data/glade/advanced_menuitem_menu.glade index b331dbb3e..f90116d81 100644 --- a/data/glade/advanced_menuitem_menu.glade +++ b/data/glade/advanced_menuitem_menu.glade @@ -1,142 +1,80 @@ - - - + + + - - - - - - _Send Single Message - True - - - - True - gtk-new - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - Show _XML Console - True - - - - - - True - _Blocked Contacts - True - - - - - True - gtk-stop - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - _Privacy Lists - True - - - - - - - - - - - _Administrator - True - - - - - - - Sends a message to users currently connected to this server - _Send Server Message - True - - - - True - gtk-new - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - - - - - - Sets Message of the Day - Set MOTD - True - - - - - - Updates Message of the Day - Update MOTD - True - - - - - - Deletes Message of the Day - Delete MOTD - True - - - - True - gtk-clear - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - - - + + + + Show _XML Console + True + + + + + Edit _Privacy Lists... + True + + + + + + + + + _Administrator + True + + + + + Sends a message to users currently connected to this server + _Send Server Message... + True + + + True + gtk-new + 1 + + + + + + + True + + + + + Sets Message of the Day + Set MOTD... + True + + + + + Updates Message of the Day + Update MOTD... + True + + + + + Deletes Message of the Day + Delete MOTD + True + + + True + gtk-clear + 1 + + + + + + + + + diff --git a/data/glade/chat_context_menu.glade b/data/glade/chat_context_menu.glade index 4bfa143a0..7a0179187 100644 --- a/data/glade/chat_context_menu.glade +++ b/data/glade/chat_context_menu.glade @@ -135,7 +135,7 @@ True - _Add to Roster + _Add to Roster... True diff --git a/data/glade/chat_control_popup_menu.glade b/data/glade/chat_control_popup_menu.glade index c3ebb1e24..36dd58801 100644 --- a/data/glade/chat_control_popup_menu.glade +++ b/data/glade/chat_control_popup_menu.glade @@ -1,90 +1,104 @@ - - - + + + - - - - - - True - Click to see past conversations with this contact - _History - True - - - - True - gtk-justify-fill - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - gtk-info - True - - - - - - True - Send _File - True - - - - - True - gtk-file - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - Toggle Open_PGP Encryption - True - False - - - - - - - True - _Add to Roster - True - - - - - True - gtk-add - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - + + + + True + _Add to Roster + True + + + + True + gtk-add + 1 + + + + + + + True + Send _File + True + + + + True + gtk-save + 1 + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Invite _Contacts + True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-missing-image + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + + + True + Toggle Open_PGP Encryption + True + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Toggle End to End Encryption + True + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + + + True + gtk-info + True + True + + + + + True + Click to see past conversations with this contact + _History + True + + + True + gtk-justify-fill + 1 + + + + + diff --git a/data/glade/chat_to_muc_window.glade b/data/glade/chat_to_muc_window.glade new file mode 100644 index 000000000..745b3d006 --- /dev/null +++ b/data/glade/chat_to_muc_window.glade @@ -0,0 +1,185 @@ + + + + + + True + 5 + Invite Friends ! + + + + + True + 6 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + You are going to begin a Multi-User Chat. +Select the contacts you want to invite + GTK_JUSTIFY_CENTER + + + False + False + 4 + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + 300 + True + True + False + + + + + + + + 4 + 1 + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + Please select a MUC server. + GTK_JUSTIFY_CENTER + True + + + False + False + 4 + + + + + True + + + + + + + False + 1 + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + MUC server + + + label_item + + + + + False + 2 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + GTK_BUTTONBOX_END + + + True + True + gtk-cancel + True + 0 + + + + False + False + 3 + + + + + True + True + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-jump-to + + + False + False + + + + + True + In_vite + True + + + False + False + 1 + + + + + + + + + False + False + 3 + 1 + + + + + False + 3 + + + + + + diff --git a/data/glade/filetransfers.glade b/data/glade/filetransfers.glade index 3106b3663..6f85e0e16 100644 --- a/data/glade/filetransfers.glade +++ b/data/glade/filetransfers.glade @@ -271,7 +271,7 @@ True - gtk-missing-image + gtk-directory 1 diff --git a/data/glade/gc_control_popup_menu.glade b/data/glade/gc_control_popup_menu.glade index 2c2e665e7..7ad038b06 100644 --- a/data/glade/gc_control_popup_menu.glade +++ b/data/glade/gc_control_popup_menu.glade @@ -5,7 +5,7 @@ - Change _Nickname + Change _Nickname... True @@ -28,7 +28,7 @@ GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Change _Subject + Change _Subject... True @@ -41,7 +41,7 @@ - Configure _Room + Configure _Room... True diff --git a/data/glade/gc_occupants_menu.glade b/data/glade/gc_occupants_menu.glade index 044a6bb4f..a8b4afbbc 100644 --- a/data/glade/gc_occupants_menu.glade +++ b/data/glade/gc_occupants_menu.glade @@ -17,6 +17,20 @@ + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Send _File + True + + + gtk-save + 1 + + + + True @@ -87,20 +101,6 @@ - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Send _File - True - - - gtk-save - 1 - - - - True diff --git a/data/glade/history_manager.glade b/data/glade/history_manager.glade index 2d7802f95..0ed565d08 100644 --- a/data/glade/history_manager.glade +++ b/data/glade/history_manager.glade @@ -43,18 +43,91 @@ True - + True - 0 - <big><b>Welcome to Gajim History Logs Manager</b></big> + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + <big><b>Welcome to Gajim History Logs Manager</b></big> + True + GTK_JUSTIFY_CENTER + True + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 1 + 0 + gtk-info + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + This log manager is not intended for log viewing. If you are looking for such functionality, use the history window instead. -You can select logs from the left and/or search database from below. - -<b>WARNING:</b> +Use this program to delete or export logs. You can select logs from the left and/or search database from below. + True + True + + + 1 + + + + + False + False + 20 + 1 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 1 + 0 + gtk-dialog-warning + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>WARNING:</b> If you plan to do massive deletions, please make sure Gajim is not running. Generally avoid deletions with contacts you currently chat with. - True - True + True + True + + + 1 + + + + + False + False + 20 + 2 + + + + False + @@ -115,7 +188,6 @@ If you plan to do massive deletions, please make sure Gajim is not running. Gene True True - * True diff --git a/data/glade/history_window.glade b/data/glade/history_window.glade index b475f03b4..ba74ec04c 100644 --- a/data/glade/history_window.glade +++ b/data/glade/history_window.glade @@ -1,346 +1,283 @@ - - - + + + - - - Conversation History - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - 650 - 350 - True - False - history - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - - - - - 6 - True - False - 6 - - - - True - True - 165 - - - - True - False - 6 - - - - True - True - GTK_CALENDAR_SHOW_HEADING|GTK_CALENDAR_SHOW_DAY_NAMES - - - - - 0 - False - True - - - - - True - False - - - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_ETCHED_IN - GTK_CORNER_TOP_LEFT - - - - - - - True - True - - - - - 0 - True - True - - - - - - True - True - _Log conversation history - True - GTK_RELIEF_NORMAL - True - True - False - True - - - 0 - False - False - - - - - - True - True - False - 0 - - - - - True - False - 6 - - - - True - False - 6 - - - - True - True - True - True - 0 - - True - * - True - - - 0 - True - True - - - - - - True - True - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-find - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - Search - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - 0 - False - False - - - - - - True - Build custom query - True - Query Builder... - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - 0 - False - True - - - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - True - False - True - False - False - False - - - - - - 0 - True - True - - - - - - - - True - _Search - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - False - True - - - - - - True - GTK_BUTTONBOX_END - 6 - - - - True - True - True - gtk-close - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - False - False - - - - - - + + Conversation History + history + 650 + 350 + + + + + True + 6 + 6 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + GTK_SHADOW_NONE + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 12 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Choose the chatlog you want to view. +Enter the jid of a groupchat or a contact here. For online accounts you can even enter a a contact's nickname. + + + + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>JID Selection</b> + True + + + label_item + + + + + False + False + 8 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + GTK_SHADOW_NONE + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 12 + + + True + True + 165 + + + True + 6 + + + True + True + + + + + False + + + + + False + False + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_ETCHED_IN + + + + + + True + False + + + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>History Viewer</b> + True + + + label_item + + + + + 1 + + + + + True + True + _Log conversation history + True + 0 + True + True + + + False + False + 2 + + + + + True + True + + + + True + 6 + + + True + 6 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Search + + + False + False + + + + + True + True + True + + + + 2 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + in + + + False + False + 3 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + False + Current History +All Chat Histories + + + + False + False + GTK_PACK_END + 1 + + + + + False + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + True + + + + + + 1 + + + + + + + True + _Search + True + + + label_item + + + + + False + 3 + + + + + True + 6 + GTK_BUTTONBOX_END + + + True + True + True + gtk-close + True + 0 + + + + + + False + False + 4 + + + + + diff --git a/data/glade/message_window.glade b/data/glade/message_window.glade index 77d9028b1..07d39763c 100644 --- a/data/glade/message_window.glade +++ b/data/glade/message_window.glade @@ -1,1216 +1,784 @@ - - - + + + - - - - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - 480 - 440 - True - False - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - False - - - - True - 0.5 - 0.5 - 1 - 1 - 2 - 0 - 0 - 0 - - - - True - True - True - True - GTK_POS_TOP - True - False - - - - 3 - True - False - 1 - - - - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 3 - 3 - - - - - - - 0 - False - False - - - - - - True - False - 0 - - - - 3 - 60 - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - - - - 0 - True - True - - - - - - 3 - True - True - GTK_POLICY_NEVER - GTK_POLICY_NEVER - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - - - - 0 - False - True - - - - - 0 - True - True - - - - - - True - False - 0 - - - - True - False - 1 - - - - True - OpenPGP Encryption - True - False - - - - True - GTK_RELIEF_NONE - False - False - False - - - - True - gtk-dialog-authentication - 4 - 0.5 - 0.5 - 0 - 0 - - - - - - - 0 - False - True - - - - - - True - - - 0 - False - True - - - - - 0 - True - True - - - - - - 3 - True - False - 6 - - - - True - Click to insert an emoticon (Alt+M) - True - GTK_RELIEF_NORMAL - True - - - - True - False - 0 - - - - True - 0.5 - 0.5 - 2 - 0 - - - 0 - True - True - - - - - - True - GTK_ARROW_DOWN - GTK_SHADOW_OUT - 0.5 - 0.5 - 0 - 0 - - - 0 - True - True - - - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-execute - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Actions - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - GTK_ARROW_DOWN - GTK_SHADOW_OUT - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - - - - 0 - False - False - - - - - - True - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-jump-to - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Send - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - 0 - False - False - - - - - 0 - False - True - - - - - 0 - False - True - - - - - False - True - - - - - - True - False - False - - - - True - False - 4 - - - - True - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - - False - True - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_END - -1 - False - 0 - - - 0 - True - True - - - - - - 20 - 20 - True - True - GTK_RELIEF_NONE - True - - - - True - gtk-close - 1 - 0.5 - 0.5 - 0 - 6 - - - - - 0 - False - False - - - - - - - tab - - - - - - 3 - False - 0 - - - - True - 0.5 - 0.5 - 1 - 1 - 0 - 1 - 3 - 3 - - - - - - - 0 - False - False - - - - - - 3 - True - True - 495 - - - - 150 - True - False - 6 - - - - True - False - 6 - - - - 200 - 60 - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - - - - 0 - True - True - - - - - - True - True - GTK_POLICY_NEVER - GTK_POLICY_NEVER - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - - - - 0 - False - True - - - - - 0 - True - True - - - - - False - False - - - - - - 100 - True - GTK_POLICY_NEVER - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - 1 - True - True - False - False - False - True - False - False - False - - - - - False - False - - - - - 0 - True - True - - - - - - 3 - True - False - 0 - - - - True - False - 0 - - - - - - - 0 - True - True - - - - - - True - False - 6 - - - - True - Click to insert an emoticon (Alt+M) - True - GTK_RELIEF_NORMAL - True - - - - True - False - 0 - - - - True - 0.5 - 0.5 - 2 - 0 - - - 0 - True - True - - - - - - True - GTK_ARROW_DOWN - GTK_SHADOW_OUT - 0.5 - 0.5 - 0 - 0 - - - 0 - True - True - - - - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-execute - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Actions - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - GTK_ARROW_DOWN - GTK_SHADOW_OUT - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - - - - 0 - False - False - - - - - - True - - - 2 - False - True - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-jump-to - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Send - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - 0 - False - False - - - - - 0 - False - True - - - - - 0 - False - True - - - - - False - True - - - - - - True - False - False - - - - True - False - 4 - - - - True - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - 20 - 20 - True - True - GTK_RELIEF_NONE - True - - - - True - gtk-close - 1 - 0.5 - 0.5 - 0 - 6 - - - - - 0 - False - False - - - - - - - tab - - - - - - - - + + 480 + 440 + + + True + 2 + + + True + True + True + + + True + 3 + 1 + + + True + 3 + 3 + + + + + + False + False + + + + + True + + + 60 + True + True + 3 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + + + + + + True + True + 3 + GTK_POLICY_NEVER + GTK_POLICY_NEVER + GTK_SHADOW_IN + + + + + + False + 1 + + + + + 1 + + + + + True + + + True + 1 + + + True + OpenPGP Encryption + + + True + GTK_RELIEF_NONE + False + 0 + + + True + gtk-dialog-authentication + + + + + + + False + + + + + True + + + False + 1 + + + + + + + True + 3 + 6 + + + True + True + Click to insert an emoticon (Alt+M) + 0 + + + True + + + True + 2 + None + + + + + True + GTK_ARROW_DOWN + + + 1 + + + + + + + False + False + + + + + True + True + 0 + + + True + 0 + 0 + + + True + 2 + + + True + gtk-execute + + + False + False + + + + + True + _Actions + True + + + False + False + 1 + + + + + True + GTK_ARROW_DOWN + + + False + False + 2 + + + + + + + + + False + False + 1 + + + + + True + + + False + False + 2 + + + + + True + True + 0 + + + True + 0 + 0 + + + True + 2 + + + True + gtk-jump-to + + + False + False + + + + + True + _Send + True + + + False + False + 1 + + + + + + + + + False + False + 3 + + + + + False + 1 + + + + + False + 2 + + + + + + + True + False + + + True + 4 + + + True + None + + + False + False + + + + + True + 0 + True + PANGO_ELLIPSIZE_END + + + 1 + + + + + 20 + 20 + True + True + GTK_RELIEF_NONE + 0 + + + True + 6 + gtk-close + 1 + + + + + False + False + 2 + + + + + + + tab + False + + + + + 3 + + + True + 1 + 3 + 3 + + + + + + False + False + + + + + True + True + 3 + 495 + + + 150 + True + 6 + + + True + 6 + + + 200 + 60 + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + + + + + + True + True + GTK_POLICY_NEVER + GTK_POLICY_NEVER + GTK_SHADOW_IN + + + + + + False + 1 + + + + + + + False + False + + + + + 100 + True + False + GTK_POLICY_NEVER + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + 1 + False + + + + + False + False + + + + + 1 + + + + + True + 3 + + + True + + + + + + + + True + 6 + + + True + True + Click to insert an emoticon (Alt+M) + 0 + + + True + + + True + 2 + None + + + + + True + GTK_ARROW_DOWN + + + 1 + + + + + + + False + False + + + + + True + True + 0 + + + True + 0 + 0 + + + True + 2 + + + True + gtk-execute + + + False + False + + + + + True + _Actions + True + + + False + False + 1 + + + + + True + GTK_ARROW_DOWN + + + False + False + 2 + + + + + + + + + False + False + 1 + + + + + True + + + False + 2 + 2 + + + + + True + True + 0 + + + True + 0 + 0 + + + True + 2 + + + True + gtk-jump-to + + + False + False + + + + + True + _Send + True + + + False + False + 1 + + + + + + + + + False + False + 3 + + + + + False + 1 + + + + + False + 2 + + + + + 1 + + + + + True + False + + + True + 4 + + + True + None + + + False + False + + + + + True + True + + + False + False + 1 + + + + + 20 + 20 + True + True + GTK_RELIEF_NONE + 0 + + + True + 6 + gtk-close + 1 + + + + + False + False + 2 + + + + + + + tab + 1 + False + + + + + + + diff --git a/data/glade/passphrase_dialog.glade b/data/glade/passphrase_dialog.glade index 6d42454b0..bc49f3475 100644 --- a/data/glade/passphrase_dialog.glade +++ b/data/glade/passphrase_dialog.glade @@ -19,6 +19,7 @@ True False True + diff --git a/data/glade/preferences_window.glade b/data/glade/preferences_window.glade index 8e5954841..831599d4b 100644 --- a/data/glade/preferences_window.glade +++ b/data/glade/preferences_window.glade @@ -1,3678 +1,2268 @@ - - - + + + - - - 6 - Preferences - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - True - False - preferences - True - False - False - GDK_WINDOW_TYPE_HINT_NORMAL - GDK_GRAVITY_NORTH_WEST - True - False - - - - - - True - False - 6 - - - - True - True - True - False - GTK_POS_TOP - False - False - - - - 12 - True - False - 6 - - - - True - Use t_rayicon (aka. notification area icon) - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - If checked, Gajim will remember the roster and chat window positions in the screen and the sizes of them next time you run it - True - Save _position and size for roster and chat windows - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - If checked, Gajim will display avatars of contacts in roster window and in group chats - True - Display a_vatars of contacts in roster - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - If checked, Gajim will display status messages of contacts under the contact name in roster window and in group chats - True - Display status _messages of contacts in roster - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - _Sort contacts by status - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 4 - 0 - 12 - 0 - - - - True - False - 12 - - - - True - False - 12 - - - - True - Default status _iconset: - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - iconset_combobox - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - False - True - - - - 0 - False - True - - - - - - True - 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, etc...) - True - Use _transports iconsets - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - True - - - - - 0 - True - True - - - - - - True - False - 12 - - - - True - T_heme: - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - theme_combobox - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - False - True - - - - 0 - False - True - - - - - - True - Configure color and font of the interface - True - Ma_nage... - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - 0 - True - True - - - - - - - - - - True - <b>Interface Customization</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 12 - False - True - - - - - False - True - - - - - - True - General - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 12 - True - False - 6 - - - - True - False - 5 - - - - True - One message _window: - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 1 - 0 - one_window_type_combobox - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - Never + + 6 + Preferences + preferences + + + + + True + 6 + + + True + True + False + + + True + 12 + 6 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + GTK_SHADOW_NONE + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 12 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + + + True + True + If checked, Gajim will display avatars of contacts in roster window and in group chats + Display a_vatars of contacts in roster + True + 0 + True + + + + False + False + + + + + True + True + If checked, Gajim will display status messages of contacts under the contact name in roster window and in group chats + Display status _messages of contacts in roster + True + 0 + True + + + + False + False + 1 + + + + + True + True + _Sort contacts by status + True + 0 + True + + + + False + False + 2 + + + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>Roster Appearance</b> + True + + + label_item + + + + + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + GTK_SHADOW_NONE + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 12 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + 2 + 6 + 6 + + + True + If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons + + + True + 0 + 1 + Emoticons: + + + + + GTK_FILL + + + + + True + + + + 1 + 2 + GTK_FILL + + + + + True + _Highlight misspelled words + True + 0 + True + + + + 2 + 5 + 6 + GTK_FILL + + + + + True + True + Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text. + Ignore rich content in incoming messages + True + 0 + True + + + + 2 + 4 + 5 + GTK_FILL + + + + + True + Hides buttons in chatwindows to + _Make message windows compact + True + 0 + True + + + + 2 + 3 + 4 + GTK_FILL + + + + + True + Never Always Per account Per type - False - True - - - - 0 - False - False - - - - - 0 - False - True - - - - - - Hides buttons in chatwindows to - True - _Make message windows compact - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text. - True - Ignore rich content in incoming messages - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - _Highlight misspelled words - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - False - 4 - - - - True - Treat all incoming messages as: - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 1 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - Determined by sender + + + + 1 + 2 + 2 + 3 + GTK_FILL + + + + + True + Determined by sender Chat message Single message - False - True - - - - 0 - False - False - - - - - 0 - False - True - - - - - - True - False - 5 - - - - True - If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons - True - False - - - - True - Emoticons: - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 1 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - 0 - False - False - - - - - - True - False - True - - - - 0 - False - True - - - - - 0 - False - True - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 12 - - - - True - False - 6 - - - - True - Print time: - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - True - On every _message - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - Also known as iChat style - True - E_very 5 minutes - True - GTK_RELIEF_NORMAL - True - False - False - True - time_always_radiobutton - - - - 0 - False - False - - - - - - True - True - _Never - True - GTK_RELIEF_NORMAL - True - False - False - True - time_always_radiobutton - - - - 0 - False - False - - - - - 0 - False - True - - - - - - True - 4 - 4 - False - 6 - 12 - - - - True - True - Use system _default - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 2 - 4 - 3 - 4 - - - - - - - - True - False - 6 - - - - True - _Font: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - conversation_fontbutton - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - True - True - - - - - - True - True - True - True - False - False - True - - - - 0 - False - True - - - - - 0 - 2 - 3 - 4 - - - - - - - True - False - 0 - - - - True - - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - True - False - - - - - - True - True - GTK_RELIEF_NORMAL - False - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-revert-to-saved - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Reset to Default Colors - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - 0 - False - False - - - - - 0 - 4 - 2 - 3 - - - - - - - True - True - False - True - - - - 3 - 4 - 1 - 2 - - - - - - - - True - _URL: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - url_msg_colorbutton - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 1 - 2 - - - - - - - - True - True - False - True - - - - 1 - 2 - 1 - 2 - - - - - - - - True - _Status message: - True - False - GTK_JUSTIFY_CENTER - True - False - 0 - 0.5 - 0 - 0 - status_msg_colorbutton - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - - - - - - - - True - True - False - True - - - - 3 - 4 - 0 - 1 - - - - - - - - True - _Outgoing message: - True - False - GTK_JUSTIFY_CENTER - True - False - 0 - 0.5 - 0 - 0 - outgoing_msg_colorbutton - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - - - - - - - - True - True - True - True - True - False - True - - - - 1 - 2 - 0 - 1 - - - - - - - - True - _Incoming message: - True - False - GTK_JUSTIFY_CENTER - True - False - 0 - 0.5 - 0 - 0 - incoming_msg_colorbutton - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - - - - - - - 0 - False - True - - - - - - - - - - True - <b>Format of a line</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - False - False - - - - - False - True - - - - - - True - Chat - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 12 - True - False - 12 - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 6 - - - - 2 - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - 3 - True - False - 6 - - - - True - Gajim will notify you for new events via a popup in the bottom right of the screen - True - _Notify me about it - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - Gajim will automatically show new events by popping up the relevant window - True - _Pop it up - True - GTK_RELIEF_NORMAL - True - False - False - True - notify_on_new_message_radiobutton - - - - 0 - False - False - - - - - - True - Gajim will only change the icon of the contact that triggered the new event - True - Show only in _roster - True - GTK_RELIEF_NORMAL - True - False - False - True - notify_on_new_message_radiobutton - - - - 0 - False - False - - - - - - - - - - True - When a new event (message, file transfer request etc..) is received, the following methods may be used to inform you about it. Please note that events about new messages only occur if it is a new message from a contact you are not already chatting with - True - False - - - - True - When new event is received - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - label_item - - - - - 0 - False - False - - - - - - True - False - 6 - - - - True - Notify me about contacts that: - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed in - True - Sign _in - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed out - True - Sign _out - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - 0 - False - True - - - - - - True - True - Allow popup/notifications when I'm _away/na/busy/invisible - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - False - 0 - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-open - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Advanced Notifications Control... - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - 0 - False - False - - - - - - - - - - - - - 0 - True - True - - - - - - - - - - True - <b>Visual Notifications</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - False - False - - - - - - True - Check this option, only if someone you don't have in the roster spams/annoys you. Use with caution, because it blocks all messages from any contact that is not in the roster - True - _Ignore events from contacts not in the roster - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - False - 12 - - - - True - 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 send to the other party. - True - False - - - - True - Outgoing Chat state noti_fications: - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - 0 - False - False - - - - - - True - All chat states + + + + 1 + 2 + 1 + 2 + GTK_FILL + + + + + True + 0 + 1 + Use only one message _window: + True + one_window_type_combobox + + + 2 + 3 + GTK_FILL + + + + + True + 0 + 1 + Treat all incoming messages as: + + + 1 + 2 + GTK_FILL + + + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>Chat Appearance</b> + True + + + label_item + + + + + False + 1 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + GTK_SHADOW_NONE + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 12 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 3 + 4 + 6 + 6 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + 3 + 4 + + + + + True + True + 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, etc...) + Use _transports iconsets + True + 0 + True + + + + 4 + 2 + 3 + + + + + True + + + + 1 + 2 + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + 0 + Status _iconset: + True + iconset_combobox + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + True + Configure color and font of the interface + Ma_nage... + True + 0 + + + + 2 + 3 + GTK_FILL + GTK_FILL + + + + + True + 0 + T_heme: + True + theme_combobox + + + GTK_FILL + GTK_FILL + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + 2 + 4 + 1 + 2 + + + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>Themes</b> + True + + + label_item + + + + + False + 2 + + + + + + + True + General + + + tab + False + + + + + True + 12 + 6 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + GTK_SHADOW_NONE + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 12 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 3 + 2 + 6 + 6 + + + True + True + Check this option, only if someone you don't have in the roster spams/annoys you. Use with caution, because it blocks all messages from any contact that is not in the roster + _Ignore events from contacts not in the roster + True + 0 + True + + + + 2 + 2 + 3 + GTK_FILL + + + + + True + All chat states Composing only Disabled - False - True - - - - 0 - False - True - - - - - 0 - False - False - - - - - - True - False - 12 - - - - True - 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 display in chat windows. - True - False - - - - True - Displayed Chat state noti_fications: - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - 0 - False - False - - - - - - True - All chat states + + + + 1 + 2 + 1 + 2 + GTK_FILL + + + + + True + 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 display in chat windows. + + + True + 0 + _Display chat state notifications: + True + + + + + 1 + 2 + GTK_FILL + + + + + True + 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 send to the other party. + + + True + 0 + _Send chat state notifications: + True + + + + + GTK_FILL + + + + + True + All chat states Composing only Disabled - False - True - - - - 0 - False - True - - - - - 0 - False - False - - - - - - True - True - False - 0 - - - - True - False - 6 - - - - True - True - 6 - - - - True - True - Play _sounds - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - True - True - - - - - - False - 5 - - - - True - _Player: - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - soundplayer_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - True - True - - - - - - True - True - True - True - 0 - - True - - False - - - - 0 - True - True - - - - - 0 - True - True - - - - - 0 - False - False - - - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - False - True - False - False - False - - - - - - 0 - True - True - - - - - - True - False - 6 - - - - True - True - True - True - 0 - - True - - False - - - - 0 - True - True - - - - - - True - True - ... - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - gtk-media-play - 4 - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - - - - 0 - False - True - - - - - - - - True - <b>Sounds</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - True - True - - - - - False - True - - - - - - True - Events - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 12 - True - False - 12 - - - - True - 2 - 4 - False - 6 - 12 - - - - True - The auto not available status message - True - True - True - 0 - - True - - False - - - - 3 - 4 - 1 - 2 - - - - - - - True - The auto away status message - True - True - True - 0 - - True - - False - - - - 3 - 4 - 0 - 1 - - - - - - - True - 1 - 0.5 - 0 - 1 - 0 - 0 - 0 - 0 - - - - 50 - True - True - 1 - 0 - False - GTK_UPDATE_ALWAYS - False - False - 20 1 1440 1 10 10 - - - - - - 1 - 2 - 1 - 2 - - - - - - - - True - 1 - 0.5 - 0 - 1 - 0 - 0 - 0 - 0 - - - - 50 - True - True - 1 - 0 - False - GTK_UPDATE_ALWAYS - False - False - 12 1 720 1 10 10 - - - - - - 1 - 2 - 0 - 1 - - - - - - - - True - minutes - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 1 - 2 - - - - - - - - True - minutes - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 2 - 3 - 0 - 1 - - - - - - - - True - True - Auto _not available after: - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - 1 - 1 - 2 - - - - - - - - True - True - Auto _away after: - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - 1 - 0 - 1 - - - - - - - 0 - False - True - - - - - - True - False - 6 - - - - True - Ask status message when I: - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - True - False - 14 - - - - True - True - Sign _in - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - Sign _out - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - 0 - False - False - - - - - 0 - False - False - - - - - - True - Works for Rhythmbox and Muine players. For more players, please visit http://trac.gajim.org/wiki/GajimAndMusicPlayer - True - Set status message to reflect currently playing _music track - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - An example: If you have enabled status message for away, Gajim won't ask you anymore for a status message when you change your status to away; it will use the default one set here - True - False - - - - True - True - False - 0 - - - - - 6 - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - False - True - False - False - False - - - - - - - - True - Default Status Messages - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - - - 0 - False - True - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 6 - - - - True - False - 6 - - - - 5 - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - False - False - False - True - False - False - False - - - - - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_START - 0 - - - - 5 - True - True - True - gtk-new - True - GTK_RELIEF_NORMAL - True - - - - - - - 5 - True - True - True - gtk-delete - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - False - True - - - - - 0 - True - True - - - - - - 5 - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - True - False - True - GTK_JUSTIFY_LEFT - GTK_WRAP_NONE - True - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - 0 - False - False - - - - - - - - - - True - <b>Preset Status Messages</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - True - True - - - - - False - True - - - - - - True - Status - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 12 - True - False - 6 - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 6 - - - - True - Autodetect on every Gajim startup + + + + 1 + 2 + GTK_FILL + + + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>Privacy</b> + True + + + label_item + + + + + False + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 12 + + + True + 4 + 4 + 12 + 6 + + + True + 0 + _Incoming message: + True + GTK_JUSTIFY_CENTER + True + incoming_msg_colorbutton + + + GTK_FILL + + + + + + True + True + True + True + True + 0 + + + + 1 + 2 + + + + + + + True + 0 + _Outgoing message: + True + GTK_JUSTIFY_CENTER + True + outgoing_msg_colorbutton + + + 2 + 3 + GTK_FILL + + + + + + True + True + 0 + + + + 3 + 4 + GTK_FILL + + + + + + True + 0 + _Status message: + True + GTK_JUSTIFY_CENTER + True + status_msg_colorbutton + + + 1 + 2 + GTK_FILL + + + + + + True + True + 0 + + + + 1 + 2 + 1 + 2 + + + + + + + True + 0 + _URL: + True + url_msg_colorbutton + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + + True + True + 0 + + + + 3 + 4 + 1 + 2 + GTK_FILL + + + + + + True + + + True + + + False + + + + + True + True + False + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-revert-to-saved + + + False + False + + + + + True + _Reset to Default Colors + True + + + False + False + 1 + + + + + + + + + False + False + 1 + + + + + 4 + 2 + 3 + GTK_FILL + + + + + True + 6 + + + True + 0 + _Font: + True + conversation_fontbutton + + + + + True + True + 0 + + + + False + 1 + + + + + 2 + 3 + 4 + GTK_FILL + + + + + True + True + Use system _default + True + 0 + True + + + + 2 + 4 + 3 + 4 + GTK_FILL + + + + + + False + + + + + + + + + True + <b>Format of a line</b> + True + + + label_item + + + + + False + False + 1 + + + + + 1 + + + + + True + Privacy + + + tab + 1 + False + + + + + True + 12 + 12 + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 6 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + When new event is received: + + + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Pop it up +Notify me about it +Show only in roster + + + + False + 1 + + + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Notify me about contacts that sign _in + True + 0 + True + + + + 1 + + + + + True + True + Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed out + Notify me about contacts that sign _out + True + 0 + True + + + + False + False + 2 + + + + + True + True + Allow popup/notifications when I'm _away/na/busy/invisible + True + 0 + True + + + + False + False + 3 + + + + + True + True + + + True + True + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-open + + + False + False + + + + + True + _Advanced Notifications Control... + True + + + False + False + 1 + + + + + + + + + False + False + + + + + + + + 4 + + + + + + + + + True + <b>Visual Notifications</b> + True + + + label_item + + + + + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + GTK_SHADOW_NONE + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 12 + + + True + 6 + + + True + 6 + True + + + True + True + Play _sounds + True + 0 + True + + + + + + 5 + + + True + _Player: + True + soundplayer_entry + + + + + True + True + + + + 1 + + + + + 1 + + + + + False + False + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + + + + + + 1 + + + + + True + 6 + + + True + True + + + + + + True + True + ... + True + 0 + + + + False + False + 1 + + + + + True + True + 0 + + + + True + gtk-media-play + + + + + False + False + 2 + + + + + False + 2 + + + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>Sounds</b> + True + + + label_item + + + + + False + 1 + + + + + 2 + + + + + True + Events + + + tab + 2 + False + + + + + True + 12 + 12 + + + True + 2 + 4 + 12 + 6 + + + True + True + Auto _away after: + True + 0 + True + + + + GTK_FILL + + + + + + True + True + Auto _not available after: + True + 0 + True + + + + 1 + 2 + GTK_FILL + + + + + + True + 0 + minutes + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + minutes + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + + True + 1 + 0 + + + 50 + True + True + 12 1 720 1 10 10 + 1 + + + + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + 1 + 0 + + + 50 + True + True + 20 1 1440 1 10 10 + 1 + + + + + + 1 + 2 + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + True + The auto away status message + + + + 3 + 4 + + + + + + True + True + The auto not available status message + + + + 3 + 4 + 1 + 2 + + + + + + False + + + + + True + 6 + + + True + Ask status message when I: + + + False + False + + + + + True + 14 + + + True + True + Sign _in + True + 0 + True + + + + False + False + + + + + True + True + Sign _out + True + 0 + True + + + + False + False + 1 + + + + + False + False + 1 + + + + + False + False + 1 + + + + + True + True + Works for Rhythmbox and Muine players. For more players, please visit http://trac.gajim.org/wiki/GajimAndMusicPlayer + Set status message to reflect currently playing _music track + True + 0 + True + + + + False + False + 2 + + + + + True + An example: If you have enabled status message for away, Gajim won't ask you anymore for a status message when you change your status to away; it will use the default one set here + + + True + True + + + + True + True + 6 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + + + + + + + True + Default Status Messages + + + label_item + + + + + + + False + 3 + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 6 + + + True + 6 + + + True + True + 5 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + False + + + + + + + + + True + GTK_BUTTONBOX_START + + + True + True + True + 5 + gtk-new + True + 0 + + + + + + True + True + True + 5 + gtk-delete + True + 0 + + + + 1 + + + + + False + 1 + + + + + + + True + True + 5 + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + + + + + False + False + 1 + + + + + + + + + True + <b>Preset Status Messages</b> + True + + + label_item + + + + + 4 + + + + + 3 + + + + + True + Status + + + tab + 3 + False + + + + + True + 12 + 6 + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 6 + + + True + Autodetect on every Gajim startup Always use GNOME default applications Always use KDE default applications -Always use XFCE4 default applications +Always use Xfce default applications Custom - False - True - - - - 0 - True - True - - - - - - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - 3 - 2 - False - 6 - 12 - - - - True - True - True - True - 0 - - True - - False - - - - 1 - 2 - 2 - 3 - - - - - - - True - _File manager: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - custom_file_manager_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 2 - 3 - - - - - - - - True - True - True - True - 0 - - True - - False - - - - 1 - 2 - 0 - 1 - - - - - - - True - True - True - True - 0 - - True - - False - - - - 1 - 2 - 1 - 2 - - - - - - - True - _Mail client: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - custom_mail_client_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 1 - 2 - - - - - - - - True - _Browser: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - custom_browser_entry - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - 1 - 0 - 1 - - - - - - - - - - - - True - <b>Custom</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - True - True - - - - - - - - - - True - <b>Applications</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - False - False - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 6 - - - - True - True - Notify on new _GMail email - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - If checked, Gajim will also include information about the sender of the new emails - True - Display _extra email details - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - - - - - True - <b>GMail Options</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - False - False - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 6 - - - - True - True - _Log status changes of contacts - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - Allow _OS information to be sent - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - Always check to see if Gajim is the _default Jabber client on startup - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - - - - - True - <b>Miscellaneous</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - False - False - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - 6 - True - 0.5 - 0.5 - 1 - 0 - 0 - 0 - 12 - 335 - - - - True - True - GTK_RELIEF_NORMAL - True - - - - - True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-open - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - _Open... - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - - - - - - - - - - True - <b>Advanced Configuration Editor</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - False - False - - - - - False - True - - - - - - True - Advanced - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - 12 - True - False - 6 - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 0 - - - - True - True - Publish Mood - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - Publish Activity - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - Publish Tune - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - - - - - True - <b>Publish Personal Events</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - True - True - - - - - - True - 0 - 0.5 - GTK_SHADOW_NONE - - - - True - 0.5 - 0.5 - 1 - 1 - 0 - 0 - 12 - 0 - - - - True - False - 0 - - - - True - True - Subscribe Mood - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - - True - True - Subscribe Activity - True - GTK_RELIEF_NORMAL - True - True - False - True - - - - 0 - False - False - - - - - - True - True - Subscribe Tune - True - GTK_RELIEF_NORMAL - True - True - False - True - - - - 0 - False - False - - - - - - - - - - True - <b>Subscribe Personal Events</b> - False - True - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - label_item - - - - - 0 - True - True - - - - - False - True - - - - - - True - Personal Events - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.449999988079 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - 0 - True - True - - - - - - True - GTK_BUTTONBOX_END - 15 - - - - True - True - True - gtk-close - True - GTK_RELIEF_NORMAL - True - - - - - - 0 - False - True - - - - - - + + + + + + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 3 + 2 + 12 + 6 + + + True + 0 + _Browser: + True + custom_browser_entry + + + GTK_FILL + + + + + + True + 0 + _Mail client: + True + custom_mail_client_entry + + + 1 + 2 + GTK_FILL + + + + + + True + True + + + + 1 + 2 + 1 + 2 + + + + + + True + True + + + + 1 + 2 + + + + + + True + 0 + _File manager: + True + custom_file_manager_entry + + + 2 + 3 + GTK_FILL + + + + + + True + True + + + + 1 + 2 + 2 + 3 + + + + + + + + + + True + <b>Custom</b> + True + + + label_item + + + + + 1 + + + + + + + + + True + <b>Applications</b> + True + + + label_item + + + + + False + False + + + + + True + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 6 + + + True + True + Notify on new _GMail email + True + 0 + True + + + + False + False + + + + + True + True + If checked, Gajim will also include information about the sender of the new emails + Display _extra email details + True + 0 + True + + + + False + False + 1 + + + + + + + + + True + <b>GMail Options</b> + True + + + label_item + + + + + False + False + 1 + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 6 + + + True + True + _Log status changes of contacts + True + 0 + True + + + + False + False + + + + + True + True + Allow _OS information to be sent + True + 0 + True + + + + False + False + 1 + + + + + True + True + Always check to see if Gajim is the _default Jabber client on startup + True + 0 + True + + + + False + False + 2 + + + + + + + + + True + <b>Miscellaneous</b> + True + + + label_item + + + + + False + False + 2 + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 0 + 12 + 335 + + + True + True + 0 + + + + True + 0 + 0 + + + True + 2 + + + True + gtk-open + + + False + False + + + + + True + _Open... + True + + + False + False + 1 + + + + + + + + + + + + + True + <b>Advanced Configuration Editor</b> + True + + + label_item + + + + + False + False + 3 + + + + + 4 + + + + + True + Advanced + + + tab + 4 + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + GTK_SHADOW_NONE + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 12 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Publish _Mood + True + 0 + True + + + + False + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Publish _Activity + True + 0 + True + + + + False + 1 + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Publish _Tune + True + 0 + True + + + + False + 2 + + + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>Publish Personal Events</b> + True + + + label_item + + + + + False + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 + GTK_SHADOW_NONE + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 12 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Subscribe to M_ood + True + 0 + True + + + + False + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Subscribe to A_ctivity + True + 0 + True + + + + False + 1 + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Subscribe to T_une + True + 0 + True + + + + False + 2 + + + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>Subscribe to Personal Events</b> + True + + + label_item + + + + + False + 1 + + + + + 5 + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Personal Events + + + tab + 5 + False + + + + + + + True + 15 + GTK_BUTTONBOX_END + + + True + True + True + gtk-close + True + 0 + + + + + + False + 1 + + + + + diff --git a/data/glade/roster_contact_context_menu.glade b/data/glade/roster_contact_context_menu.glade index 0d35d74a6..f873e7f77 100644 --- a/data/glade/roster_contact_context_menu.glade +++ b/data/glade/roster_contact_context_menu.glade @@ -20,7 +20,7 @@ True - Send Single _Message + Send Single _Message... True @@ -34,12 +34,12 @@ True - Send _File + Send _File... True True - gtk-floppy + gtk-save 1 @@ -103,7 +103,7 @@ GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - _Rename + _Rename... True @@ -116,7 +116,7 @@ - Edit _Groups + Edit _Groups... True @@ -130,13 +130,13 @@ - Assign Open_PGP Key + Assign Open_PGP Key... True True - gtk-missing-image + gtk-dialog-authentication 1 @@ -146,7 +146,7 @@ True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Set Custom _Avatar + Set Custom _Avatar... True @@ -160,9 +160,8 @@ - True True - Add Special _Notification + Add Special _Notification... True @@ -268,6 +267,19 @@ + + + _Add to Roster... + True + + + True + gtk-add + 1 + + + + _Remove @@ -281,19 +293,6 @@ - - - _Add to Roster - True - - - True - gtk-add - 1 - - - - diff --git a/data/glade/roster_window.glade b/data/glade/roster_window.glade index 1f1f10fb5..dc482bb8a 100644 --- a/data/glade/roster_window.glade +++ b/data/glade/roster_window.glade @@ -31,7 +31,7 @@ True - _Start Chat + _Start Chat... True @@ -42,10 +42,23 @@ + + + _Send Single Message... + True + + + True + gtk-new + 1 + + + + True - _Group Chat + Join _Group Chat... True @@ -64,7 +77,7 @@ True - Add _Contact + Add _Contact... True @@ -232,7 +245,24 @@ True - gtk-missing-image + gtk-save + 1 + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + _History + True + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-justify-fill 1 @@ -341,6 +371,7 @@ + diff --git a/data/glade/service_discovery_window.glade b/data/glade/service_discovery_window.glade index 197b18a9a..5c0ff24d5 100644 --- a/data/glade/service_discovery_window.glade +++ b/data/glade/service_discovery_window.glade @@ -62,16 +62,22 @@ Agent JID - node - + True - _Address: - True - address_comboboxentry + + + + + + + - 3 - GTK_FILL - + 1 + 2 + 1 + 2 + GTK_FILL @@ -127,22 +133,16 @@ Agent JID - node - + True - - - - - - - + _Address: + True + address_comboboxentry - 1 - 2 - 1 - 2 - GTK_FILL + 3 + GTK_FILL + @@ -171,41 +171,6 @@ Agent JID - node 2 - - - True - True - 6 - - - True - _Filter: - True - filter_entry - - - False - False - - - - - True - True - * - - - - 1 - - - - - False - False - 3 - - True @@ -260,7 +225,7 @@ Agent JID - node False 2 - 4 + 3 diff --git a/data/glade/single_message_window.glade b/data/glade/single_message_window.glade index 6c3f06641..67feb0147 100644 --- a/data/glade/single_message_window.glade +++ b/data/glade/single_message_window.glade @@ -8,6 +8,7 @@ 280 + True diff --git a/data/glade/zeroconf_contact_context_menu.glade b/data/glade/zeroconf_contact_context_menu.glade index 4ad215baa..e69c42668 100644 --- a/data/glade/zeroconf_contact_context_menu.glade +++ b/data/glade/zeroconf_contact_context_menu.glade @@ -9,7 +9,7 @@ Start _Chat True - + True gtk-jump-to 1 @@ -18,74 +18,103 @@ - - _Rename + + True + Send _File True - + True - gtk-refresh + gtk-save 1 - - - Edit _Groups - True - - True - + True - Send _File + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + _Manage Contact True - - + + True - gtk-missing-image + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + _Rename + True + + + True + gtk-refresh + 1 + + + + + + + Edit _Groups + True + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-edit + 1 + + + + + + + Assign Open_PGP Key + True + + + + True + gtk-dialog-authentication + 1 + + + + + + + True + Add Special _Notification + True + + + True + gtk-info + 1 + + + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-properties 1 - - Assign Open_PGP Key - True - - - - True - gtk-missing-image - 1 - - - - - - - True - True - Add Special _Notification - True - - - True - gtk-info - 1 - - - - - - + True @@ -101,7 +130,7 @@ _History True - + True gtk-justify-fill 1 diff --git a/data/glade/zeroconf_context_menu.glade b/data/glade/zeroconf_context_menu.glade index f2928cf04..349383017 100644 --- a/data/glade/zeroconf_context_menu.glade +++ b/data/glade/zeroconf_context_menu.glade @@ -1,49 +1,41 @@ - - - + + + - - - - - - True - _Status - True - - - - True - gtk-network - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - - - True - _Modify Account... - True - - - - True - gtk-preferences - 1 - 0.5 - 0.5 - 0 - 0 - - - - - - + + + + True + _Status + True + + + True + gtk-network + 1 + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + + + True + _Modify Account... + True + + + True + gtk-preferences + 1 + + + + + diff --git a/data/nibs/Gajim.nib/classes.nib b/data/nibs/Gajim.nib/classes.nib new file mode 100644 index 000000000..b9b4b09f6 --- /dev/null +++ b/data/nibs/Gajim.nib/classes.nib @@ -0,0 +1,4 @@ +{ + IBClasses = ({CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }); + IBVersion = 1; +} \ No newline at end of file diff --git a/data/nibs/Gajim.nib/info.nib b/data/nibs/Gajim.nib/info.nib new file mode 100644 index 000000000..9cb6b534d --- /dev/null +++ b/data/nibs/Gajim.nib/info.nib @@ -0,0 +1,24 @@ + + + + + IBDocumentLocation + 82 255 356 240 0 0 1280 832 + IBEditorPositions + + 29 + 476 296 342 44 0 0 1280 832 + + IBFramework Version + 446.1 + IBOldestOS + 4 + IBOpenObjects + + 289 + 29 + + IBSystem Version + 8S165 + + diff --git a/data/nibs/Gajim.nib/keyedobjects.nib b/data/nibs/Gajim.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..f13f467bfe6fadf16da4c85320890c42da20822f GIT binary patch literal 7184 zcmcgwd3+RAwm$b(?_J$pTeB|_!lDL9Lck=7m;?d=k{CK0Ng#BRB5Bg;4&5Dg;uVoy z1Ox;`jKDAq<0vwS4#V&qL`76afpHr}MMOm0_my|5DjjecfA6o?{p+qqRN`D1=Y9uocmPT(O0hCv401UZlk*pcQTb28&=REQ6JBC)@>h!&bNt+F(2U3HHDvupb_U1Mola6g&;b;9u}EyaKPn zYw#wVgZJP(dy9c zL}rr(q?O!4ZYRsgYO;phMYiDiy<{8NLH&5lv61c0lK3rcek?Y6x=LT>CxvRNrxNEs2ZV;Eu4dsTHB!*go!8Zj7T;K)|2q1z4 zGAQ7MPS6>;Kv(Dn-Ju8cgkI1a65uN61AQS8`aypf00ZG_xCX9;Bp3vPVF)DanJ+X@ zQ0fo1sECEG1-`7>S~VIC)C7Wo*qoejD1;~pM+}_g1pU#d8Z~BD6!;1Qby37lw6efg z;BQj(@#F$u`!wy&uSIHW3;|V!fVgg2IfZ4!dc-+Bd*B}hhq8ukiTAyOhS3;>=;fgE$~eYhhyv(_BXbS zEoY1^Wq)TYn3Wx5c6KWp#||(H1CjJ&^aO@H6^23@daiq`*~H9@I|0M-)^(7MatB9a zkwB;(^<_0Y-1jvVxn4q`~YODkeP-Di*LYVX?xEYFIBKV*fN}v?Vpqx2a7uJ*YWdm3e zOJ->-o#mZ`O4L*ZlVJ)}mlgOX_-oXl=1aIGQme8~tTS`I0)D80TBrjRra?WK)CgWnz(|*6a7FT(@rjjX|4t=F&rtYOL=8vg{ z@a3>#8?1nl7>l?U22AhJ;2}4wk!j&blje>;))GOFGUFg!4QsZ;8d$5D<;740YOoSx zk#Mks7tmYdszDR+bg#p7Z(uzzyIucVb~j;m@6oc$c-9RQ&|OPFwIF3{HItAP3?{_F z3Aqu}ce7#b{hGBNeh`jm>ImOw0FjDLEdsc42_)?<)f5mO^g znm#RZSK4zB?K#9K>yH*BzO2LiGRQUk|Lh1tZ`Lm!gvzX%a7()uL&s6g^`7BKof^^I z#^i?T{E<3+;?4e$8vKRg=TPx+RD3Ne9{Ag?zX&H#`6jMH2*8d2I|y= z!dL_D7>XLIg-#84uAg4PWYNqkU40!jo<@yBP~)KA);JyBzO0cAjw`FsmFY1p(e(UG z>;)8i5ycKgu_^ye?8jF`F*P2=a$iGumWCrVza^vz#_`Y0kAwAV)bTC54mAw>wFZNV ze(2D^v*B?K#TDUjQ&oHUXyeP46B9AR6k=sJu(2pNK18&!xV^e;+!ok&C`3h|Ooq%-M4x{_|BJ9HvFNKev>^d<@9D$0|L2cXS@@IMaI^5~y)+B5n!r z#8(?p)sS|gt@qE?)_2S)4XCs5a#?Y1&|j}@5VQ-r7=aTg8_jNHBiRTxisiB_sd+Y{ zZw$MsTIe!wURqj4QbJlr+JdBnc|(UMCncn&B`;V|a&ttT7S+pvBtbe7s*Zb&sj$R?lT7O3_Z4QU9esH1Q2pOVgFo^HNiWqQKOQ1=T{gc|!-M zC8wsRs@D!pPfEDrWPzdLCX%&{WVN$?d*Ick<{(nZfs`6fNIi+2p-RhStT3BGFWdmh)rNMERj{QMmCGpvwDbhF?4T!|+i)f(n zwbV3WAH!`zR;|8gnt;;t<7LMRF1P82$y{h5^O2qxAU)TW8S|r4qJ{+H6w9)XFoZ;e zM94y%zewv^;jETeSPf}AES7J_)!1fmS40-Wr2ENKbR_Q=giR(xfUJlciWW_bTU4xV z42%q|1^+hmbmVWki&@aztsooXQpi0R(=t{Pm&8iTeQIQ80Jq>BPLi$UJ~aA%R?aHW z%t;2|w?KOPK92kWCbh9VgnG5MMKe}wjs91pLyC3%mwl+Z?8D_4?a^cOSJt2fWqOHD z%tmPT!=yhWg6fEsOhIH-!D%=S7ZFvv5E0dgkEw_hKVoDc=Dh~xA`(d{<=^eC^jKjy>oAJSSH}c?kC?%@Kf5?SCWX8!*hRj%u9@Ucx_;`%HR_~(? zP>u+liv84z?C;0;He&p1FpgQsl{e^JwFL*o}H`>#;*)Za2CeB9%J4f=NEMk=m~m~o}&MzFVUCjEA&Li`^lf^EzC+K_cj-C$9z9Rrrx)l4^dkL`endZ}pU_X~XY_OW1^tqK zMZc!s&~NE?^n3aP{gM8}R@K#Bt!Eq9-E1S<#5S{g*cNs#+sf`^ zZR~!wjcsQ;*dN$V_D8mh{fX^ne`XJ`zpw|{Lu?OwnC)eMW&7A8Y(IOHJ;qvvbdmHC z)`;XPVX@Fts1k`RY!vzlD})T;qHvqANhH05^}sRoEbyg)SmV6h0P-SLiI~HZEP?edT2vFIq<7n^CagySKiOgfB)j@y$sQlp^s=Bkz#+X&TL?H8e(VK@4xA zkI=)Ih1W5@-{4Ea1bn%d$&KR1bNO5$SH$_a60VG!#8q;WxoXbO)p9CV&jq+fF2pr+ zbGX~NCEPM@Ew_c+%{{<9!X4tC;a=d*a364Aa6g);Ni=mc4KfWerJHh0qfEJ`LQ|=! z))X*BOt+hsn3kDVnC>v$X9pxx)8}TZ*<OhnmyPBg`YsS>_z`X!96zxw+chXl^ox%`?nV^L%rwd4+kid5d|gxy`)Ge8BvK z`Iz|)^QY#YEMTD)lclpI!P3u?Y{{?`T8bIWtfQ@Cta;Y))_iNBb*i<-T4$YRZLmhI zE!I}+GV2QK7VB1Pn{}IYhxMPmPuq>Q zn{1$3**4R*#J0?~!gh!4PTL;aUfVv~e%oWV1Ga;_RaP! z_O13d`#SH~d7NJpNd%%M6Wj$0hd92*>Mjt3kMI`%mB zI`%pCJ05c!a2#|Tay;R9(($z8jN`oHQ^&WC@0}*6-RX38abDw0b*4FoJJX$o&T?n9 zbDA^aT<%=&-0S?i^Ks`%=iAN;&QE#ZZM?`=@KyX2ekxzX*YVT%27Wpp$m!HqKA|)^67x9bvrTlV!CBKSa&9CLx@f-M!{APX&zm;#}xAD*N|K?BgZ}DgN zv-~;!Jb!_|$bZCNauFBjGP|rUkE@q!i0ekzO|C3gj%&25z*Xe(xk_9SSIjljHQP1U zHQ&|hy3MuHwZ?V8b>xkF8cKh5V?oxNTyTU!y9dI-ELiZx~V)s(_a`#I2D)(ylTK78l2KPqy zKito{pLhSu{i6G%``_-D-LJTRbYJoi59cv^tRB0^;Thsd@eK70^IYf2@Lcb?!Q=PT zdQ?xnC*W!HGpgdSHhJ#x-0Qi|bJTOp^PK0n=LOFR&neGKo>!1z zIAj&8U>BT%OYjJy&`Ibm^brz;{z9QpB>039p-h-0R0@;vwOq3h5u!qiFiT)aTek~K zgk8dJ;Q`@6VUMs^*eARpyeYgbyd%6TyeGUbd?0)%d?EZOT11=Z5P8up3Sx$sD~=V% zi4(+pu}~}$ePXd#E3On*iL1r6;yQ7IxKZ3JZV~Sn_lo<(N5n_Pzln#%C&j15XT%HQ zMe!r?6Y(?g3-K$7N=`|Tx=J-toit5qkfuvPDI_&Z5h*6klx9nFrTJ2;#H5ANB5AR- zR9Y^rlvYWrrM1#JX@j&;+AM96wn}Z%Hfe{nQ`#l%mi{U|E*+MRNKZ*erDM`_(sAi! z>8x~4Ixk(2E=nIspGcocUrXQ1M0Uus?3H`T*UE$B;c~j1C1=Z{}v5`K)|SJ}+O8FUlXu zpU9udU&vp{-^ky|Kgd5Rpisr6SQMM$PJgyv8 zjwnwlN0npBbINh$1?7ZtN_k0nRr!x{T6s%3qnuUVQ{GoTP(D;XRz6ieSH4ufQNB}t zP=4})mwL@!tJm)3y>74ImAzhXXKy!e4{tATg14`?pLd}58gG(!us6k<=Dp6F=^f$C l^^Wo8c_(^(-V*N=Z?)I&o$d{T{=u!i{^2r=WBlLS`oEoa5(xkR literal 0 HcmV?d00001 diff --git a/data/other/cacerts.pem b/data/other/cacerts.pem index 26a90f150..163f6c74c 100644 --- a/data/other/cacerts.pem +++ b/data/other/cacerts.pem @@ -476,7 +476,42 @@ zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD -----END CERTIFICATE----- - +CAcert_org_-_class3_CA +-----BEGIN CERTIFICATE----- +MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 +IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB +IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA +Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS +BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v +cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9 +4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB +Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J +0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ +FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx +bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q +SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb +6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV +m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g +eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG +kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7 +6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG +CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc +aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB +gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w +aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6 +tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0 +nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M +77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV +Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L +ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM +zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU +rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF +YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT +oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu +FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB +0m6lG5kngOcLqagA +-----END CERTIFICATE----- Certum_Root_CA diff --git a/data/pixmaps/gajim.icns b/data/pixmaps/gajim.icns new file mode 100644 index 0000000000000000000000000000000000000000..37516d5e80152b50a41bbf8885ac9ee0960585eb GIT binary patch literal 42918 zcmeEv2UrwI*KSWF&XCRSnpR!It^spE*GL*8sDNY;5D^s2p?d;R3`m+G4G0EQkeu@X z0um*tV9o(^4(mPDGlQ7-yLZ3;KF@vb>m>GPE{Aqc5WLn?8sqfyN!b} z3|mMmR=A?}So)vd``v$kgpc0)UtdfAQ+xa~x%0;H<1mcs#l;xulG0L1x;LhfQ+D~; zgNtQ30!%@2^ZlEbPcKXOm{MZt%XjZzKYv)7$cOR=Z{EIscDoG9hs9<+eet|AGj--6;6^2luZINqToYy$o@3%G}Fcm|`!%j|cWE;H9kc%lTO>%Uwx3jeg zHsWDQM)BL-9Bo}Zy~%@3dk%yIdvCKh1j!UbV`i>-b6;QGa~Sg3$W^v%bQ?p$e$Hi3%8w%&bk`*N)q%DtlFE?vLU78C6S727R} zksNl9iu8)fixKX|4hX9r-n>qv9^Y8oaK13&fT-b7M_tE}P43b41$C_jLQ(Xw)~4Fl z3+Eb&%X8wRg%}ocs=1=PtfVmSbaV(*EHvSKX-RQmUUrQr6b?-y+6xQvbF;H*!c3r^ z!shbA-0a+fl5nU^czStN?U}N?W9T3tELxVwc*QT#|>ta)Zk06nG2^4)Zk+(bnTVKG5Gc%W5XVF9Q%V|lfH9T%Gvr89_CyV z6^!ncXWiGzG$?N6@;(+jIdr9@$Rzcy$nFL2b-)YMQ{TRE7@#VEgf z;Tm*xH8m?u9!6nvadoulOCa;?_P{;Aukts(cdkZuiwe&KYo1w?0pu7 z8NZNApRJ<+;h?VL=Yx;|S{LCvsY5sAc$q_oWrXhzBRGcj@Xv04@vbAsUmFhe=WyU6 zmc;={6|O)$USpWvd+ER3e`DB}|KzfdA2Hg;kHu;qKR*8TYP>cz9i4_nHhp#0A3_aENB zef<(3*UO=x^y%w&??1eI^YZzVNB2viK=SbA>$mUTz6O$qw~>nE;)_?WU%z_!{ORL| z7bN>IT3-2+=lBce^QWLup0^)UIZ^fa*|VolA3wTx`ovyLW40m3_!xZ(5O?`9fPY860$%?w$LNku@R~zYhV?7O*9;#2>>*aA^?%~*oee=B?>^BA; z-M_++kM%a*QgM8fyT=BPqch!o{Vb>yM=)zE z*WFM^GsL|eaC>DtJ6lv{>EU4r+J>Hc2s>p|0!6DgIYAkHzGINBEpDTPiY!-KY_*yn zfN2adiS#43Zg8=)c3ivOa|?I*uX`{xgOyGmJGj1qf&3kwPF5!RdolX3nez+{2_w3p z;hgEe9mY_zijIwm5l5qD6(P>8KG%FYLmUCkDl)zezrwiGalYLxH&T+RfW{Zr!+g@q9}@DhQA3xO(mSwJR4dv^B+r z@5iW7i5KuojE)O!jYp%PSqZ~MQAxfT7tWt+J;^(f0Np(_D_^()-FS2@+JSIVbO>p> z+*S}L@`Yv<9@+fx#`&g(eD~7Ayp#3QdJcW;_yR96Z5W~FF##%y1Mnk`Lktk`${jW%T78H4z_#39V)gZ zwX(9JTv7)2x%|AGg#4JWgZq6jEq~$poN_2e_rHR?-0Tx2B7c9Vbz4Chl$8{bg;`0Z z;c&)9^(7_6#YM8RjPybww3mp=a=cKbpdcTVvog}NvPDoR%&WrlRr2z3b5L1oZZaS> zgehlob8~XCv$HaxEG7RKDhxSR2L)M~P?VOMl3WlU0);kF4W}g~1v#1Nnb|pc`9+Z? z(6oZ1kEa!uN-9s6=4YKqhz#0`u~zO52nh`f4-X3s_TRqjFm?}PsP!G#n?(u16ltTU zO`kIMx1LOBWn-5n6msTH{7s7zgemtnI$VCrcKMt!{gn=2DwHuUsX6;LS{qFo#0KGX zmxw_B&32qAL)73%cag2T*IM(1x&u_I42*Q*oV`t7^ICt6~zp#Tb zMaJ+kWB(Y|PmOW_Q=>6hzb={8x0j~UM6+K8(rE#h0z+fb{!^Q*XlZNXIvO^UjP^w=nqY;bY?hY&NVuCb=*J=tZd*ZUYm9Ik+edrMx?xD# zfBHfT2L?10>VRQG<{og=*4EM*xXROW#jolhp5Q)j>~Bn(0He_c@ilNQTvJIy0|{8B zgK5yqu=Z{d_*;Yd}cX z1JK8hA40yCw|-Lp__6hC`TOqjFP<(C`hIu${jc@Yx;>Kpo%*$WO4kF}$B!?jd@aY) zWeN<5f<_ia}NKfJrkM`Nh2Prs6vU5|58H{ZP~=_eOc++TL7eyYTWSMKP! z5S|3f$T_3bUT&={ zPZVP`p`_+M{*?Iy1|63wE21%4VnxR@{JA2GOP)M_bic7Y3Zs@^dCq;I_#Bly>})ED zz%)x6pTBqsWP;Jm!~3UC2{A@u<5uS=k~xDBxH@ee9* zUcY*Q20xvhRe9lH?M&Qm0vDJ5iT`|IIL0Wu`uydq*Z3P1GzKHx>1-@R<+abAzkEr& zQj$5}`JhsSX;waX_WZ?*moHw(>e+drOoY)3s-HZAa41W|(b;)Nk{E$eOX{C+pDLo5 zJ?wl?l`p~=a}AdSm3ML~(ed&HETh>gDR=+Q$E+)Iew7kyk{ zxyS&X+x}eSC@eVU>*2B6Z#KS?y<&x_{>&g(2gjYF=&dG3f!M%d#ttdTdp2&^xWPlT z!7Oaw-o1goev3Bo(Ll)&j|^C5-k^`hMu{BFzj>Zdh`~pv+~%x-OXdmY9}v}3=N%Z_yH^C3oyk6#HsbJ09?;? z@3Sj(?Yi0auD0`CT*6&te3q+M+aEBS0I4nO?6qhZ=*C~)n;X5$#l^wJnH#~gDJT&aUPT6n|Szc{nzUF`l0EaBu=o1>Bp6JJ4 z*IPP-B*%&}!;aep{sCJ}jRcs=G~=Lkmb^9Uq=1YC)Nz%q z=X?-xc5SodIpPj1Z~}q^0xL5YCq0lXbn~&|!AMpW%B2EJGtbqKkQ;9vWW}?`?NrHP zP_SHWwtZPJMqMPd;@eTWjcHe#?c_i?C(N1;16>su=%SG>1b3S;D)x8c+u+tJvO)`U zYj=GpHrV0Dx5lk-OGQ9hn43ASnG=lBr>ymMv*AK1zM5iTftynuHmwT9dMt3`wy;&zKMmM|`{`QpWn_6z6R%Hrdo|1mjKav8s(c=^)B z_VaCLQ{$pA+M&uT*YN8~*I9^C)LpBDk;v6WY^ z!&v?9-PtnQ0>K=Q)6PHMWL~tS#{*FIy1eXE=4Hx!G?;`uD3v%pcds3>d%+%3{Opnh>GF+ zN$IjO)6>$*N~47WOzB|GmD8uIssW4F^{s7cE;#5G7~;P^B&Vqu#{Xzoo|bYdtuoe| zj}1?_R#8z&g3r{}o~da(SD7XBi_9!R6*7T{as%ma+ zZaUjoMJ5FxpMgg9r;^f6M?#mhE-Jm`Oxu-9XYs23)c`$BCLkcwP$bP3!0^6UA}Py^ zfjNMoyMu)hk&%tX898~Cr=_V1ghYw>oaAFi5=)Q8ioy?iL$~C8s_x{;9K1qHmbX9{ zh-F$#bVjVn0j$rVwxpy&kV#MmgJdA{5V0`@kX-1sEROb{0eK^WDR zda4*N)kHEWEz~|UnXb`%_P+a0}G)^HEAfs+N|Tm~jaDC}Bcf8j-I70#bq^2#Jv6xslMpL^h^zbMYJ& zN|0ob<)@D4L)wfgYDgz?@NBlM928C^AI}jXNo6)KOAXQ~8R>`z%9D~)LO>wQ&nGhR z3^o*_CU`12Iq76d;vVR*wx6uX%OKL(WO>Rd&^UQAC07i6R$yXUfuy3O2&JO3vU75B z^K(-Yqj!X1T1u;T?hh5mB_tj{nRw(-OjK~dmLjW@J%F`G9Sby`m_CY8?8P*$}Ox%xLDALE21IIC-IIXnbPe zu8rN0)Ia7fS?{yib3+$rB&PQ34E^P+?HuhbO$}#(X%={+G(k^)vB?V4C7&Fm4xKP# z&I0{~b7xK*J-C-DB^qPVhmV;sW$KiPV@C|?twtAPDhh*#jTkv{_>fBVx={xT>>P@ExVXDkQc0n7a z^w9akB=+C|e81|x@L0<}>Y9@r*3Mwl_F@diVE&Fdz3?7v9gDt)I?kUz2R*XzPd$`^ z(V6LDs!9#OnC!K@q1rk+2xO-zJXc>|S5sNLzxNUV;cVJy$1!wYNCQndppR?wbXXR> zw@S`6ovEogwTk3XfK(1kV}Xg54@NiS_0iJ8wYfU1(W`nIMrD_$N6hYT+Xsj!Y%+(_ z)1s#UqxRpYjca*pt4?s3&}WAAM+^bX8StQzqoQW^w0_9fWHMv=w_UgnOx_ z$#_j%ouURV;Vc04Tdf9DfJ&1%HXHpn|3zAbBoz+nC*-w4uPOS=P4v|0KA0kv#!z;c zp`oeC)gnlMG8!GShOQpfn@NRa^yrlu8k)EkSEfv7tE$fF4VSi-tGc=dkIZP12`g2V zMapp9(!JExxtd%^Ye~~ss*51?M`NtlP!niyN#itC^@VV5XtY&B)Ok>bvRgEkYX7Nl zX)|X}RL3>=@{E`2?<3$k9Hp-&Q0D@QU{Q4YLV@-wHLf}jl3)ajs;Z|7B@8>Zw;C6Y zArCf(0R?nx0Pxsc6bsf&8Y)@b*9VRXRjST-DjZYweiN{H=vbxy@KB64YT<9{J}j;( zjn#Kzk5Ej9F?`yBMaI)7j2Ss}z~G@HMvt93ef)535vES1GkW(QIP~{XzYqDPmo}Y7 z{fJd#PGllY>EB7DF^t#lbud6#lYjF0rRFwDiaoiTqWTZu44=CICO_|PnEX_MdA57r z=Xv(?i*klSGrPAhbPqzTHn)9-*x3dcd%6J z{oS+H%x|cuAG-HhF1X7EB$e*%`BH-w_NW`+tFQ0xuKg^mV{d)!$mdG$>(KwEYQcAr4qzWIC)|M>GPv0TOEi)3+^`n_&VM-GPHe{^;sKK~+Ld(sVyzAE4T9M*Mo z;R~Sr@M;(0^Dnt_z!$&Ieh%w83itviKm0~-h;-h5r$?l0`F0EH94k+$%ZVZLO=l{q zOnuztLiaCs*(!>VDgOk9#|;G~Rknr}zw_~zCO&lDGt<&wt12llK55W^oTa9z-Lv1^ z4apa8cRuKR{QNNt-*2|YJ5BE0Q(IGw1tvb>F$!HlS(UA>sokSjpMJmmI(mlTD*b6A zfBmIjpI$w*HPwNhN&BJ_6sUrd3X83#p{WIPo$%4p($s(_Ib{U~ts8Z>YLH(k6e^WU zLmw)YLivL9OYqN+ojp+kSg#NvKg#|~#wgiEL~~zi&t;nef03|jVm3k6}W_2T72Ltrm(xXR3fQ4f1CdVe~dp;e0bwrwM0@{ zy!#Ty$S;vd&fE|@B}kFN!-rREB$AT+4vbM!BB{Cdl=qAaGRkAn17YXoYDr1Sd5jSQ zBj^iH{hr}ZaZpqyGo=sOB$DEoR*acaDyg{s?3vGV0_2n@U4YKZ<&x5rW{jR#DyhED zdrrLIKF7a++^Uw8CZ5G;C6cPg_;bG(I3SdsK7E4nwvdj+J8Ac-BqdFd5SCOtcn%bT zm&6Oo^RH01DkNnMkP4QR--hKo{x5N0QbFr>x-ngoNDAt}n_|foz~GQwX1sn2x$0N= zOUettqXaU-Bf~@|twU0rSPPkPNj>D85t{P)E%$@=TS!r%4D|Ev>_jKER#JQhV`P>{ z?jkhh)hqlp_KyDnf2IBzTt2BwFT+G-TlU-SU#8DonLVf@T1KTZ-0s|E3#zS51MvK~hwO zsgy{rlH`DX!j96iYhVHVo8VGr+4p(5BT4` zK74rp?k&tBpg56dL0%EiIWH+Db*{;E-ouOr_wSxk6_|NIof z?@24)RJkT811qJH2Qrm+a?iTyeCgRONhwsnRPsbt{dezhaIMeZFj4aEtLn%@aF0|f zk-(e>c^2Qk$%Lp8=trMn@`QQ+a(0(YlvLAL~@awwjo=& zPdBji5+bY1@1$Np)aZ(MMsmNz;R@ouAzq_P=_Lz1>AK(^J_L9pI&;eTlGD$+@ZPUM z=OtU_w5%;5>}g5vY1GHuhG`;nslW7lMR^H*gle~|m?XU}DXYThC6YEYp#(_cCI1xx zKvp*(^bSDTEGenN7&($kSRDwR)(c;<%b~ylOw^IHPJp7_uaFc}W3*C9`%~!op7UN{ zFZs~ZkT3<=<&D_ROG;``?^W>#aKv-(7X;Z;c7xFF0o56dS}JM9pAygfptGesh2EG! zhVP-EliDIFsm18f!QXs>Kjl8-KIf6$br*mJXCnvtKj>;7!qk}0GlJ~QDUTlEq^qzN zssXuL`v`v$K;9s_M75H#MvQ*4RMPmE`-K0LN8UV;7X3lJq&TGsV`hWw;p4}CPl(6F zBg#YYhkn07Qkn&#`35dIlG=xRK!8Iz^KOkK&&6PVEk^spz|aWiFsw2pmDe75Kjwkl zyOVz9v?SdM=g^D{4gRQrHHrF008(7$7oAyCDUqD>dqeHb-`rR5ztxO*vr8tLm5 zW7P4m0+6F>zc;O}0rJ)rd1blh{U7>tvhGL6mYzyMY0;cGt`)(d8XAtz!+Op(Fye5Q zY=|goY;0)AjSkrAzTPi$*3K&aL%+^mcMcipp4{Z<;Iut34&_ph_^w&Z;TRdr&cf6e z8iJz3k%p$m#+p;XTRc1ncLgGAg|6=M$O{426fcI))771w>IJh%>h|`|xF`h@rKx)@ zK;3X*DyBXRsW0VaH#Id%js|#c*g$wN+}*bxJ+}RzE@PsuWqh0)4)aXvc6JV14kSXp zROp6G8xBjtRP;gBMtHiZsrIOV4~jbO;>3e%btl>{nl(#r=FAy0rca+XZR%8fvcjwt z^L4HFC4?X<+zz)@@eE2%ITgRd1gP|nW2}Y1n)KnbqG4pJc6mrhKe~P zH8s^I`?%vkiEo5|9x7pp{?5+kx;rAmLqfR0ng@dp>;pPqZ|)>rduu_$9yuXyqiSul zMR@XLqQDfYJ3Agzg6f)y8=C54HsakFsd2|P;m$PObwXeM22FQ2R~IKodnevD-Dx(~ z>*K>e@!{6WRt|oNiSb((L#1OemA{NQ%MP4rsz17A{dxiz1>m1j;<0tk&YN^C!}szw zXvx@Y*X&-eYh+{X5Fgc@4!2Tr4Lx==avjw8uV_qpo*~Dxrl~P?mm93cMJ}RqA|)hr zIiUx+8?@zw)=t~)b-1H%aVx@7VS7wM%vxx&LQJ`zA;&zW zv0mi14rmGR)Ys!TclWSFKWAsZ>AIc=gM#+$kWo5q*}B$FN@*OjvW=B@N{~SAt|E+yx%E`=DLNp#?ePx|63a;splyZgpSl;=X0uCX1<) zCR*EClPw6hC!j^*FxiRbHSyI77Td(J2h2Ezp%~MEv$ehKi{zWBpl@{90Om2nG2bMw`E zqV_H~T5tek8ZJ(&%XD?Y*Ah@~u3O-G1!z%6k4EoULpUnBI<8tUd6A8?6K>0}*%BEa zx0#S#gWdUXbB5)<2w#rjeoSE@$E&W)!^MRFJ_7js)^ptyHi{FE3U@n0w}j%aXzQ>u zEdGedl|07nh;HWthY4k-nPsrhfwOQQ#xUf>)rC3ZGB!TcR^ZkPRuy|I4&dnbb<*uABfP*OGt1GNy5Z4VQUGJkh?C>jk`|C)r~7UcJ%0x z!-t6k=HbIfj)d%V#vQ+1Puz^|9u|O@*hZXKm^UcSI(aC3AAb|nmbcE=jkk{L%3kZf zdyg>s(9xrDQDJ^NT=6w>zdo<1GMokHP5xnFn>a@M;5=}a2PRil6IJ+WW@$?70b;%D z0bqkTy5P=)6JqJ^69LUvef4U~HJ-bC4?=et9=ZiC4OlIz2lp(cMV4;c{X*lC$}8~- zdU;`lmunz!aZ$x#%>p6w=+mX3ZE5MT!zU;L^}XRC-rHQE+cz{k080Q2jRYK}C6*g~ zqcS9te7HEg*9kr&k~>AfHO02Fa^OWqM@0z30=B!`ujF#5Mh3rzUKnpKQbt^G z%{{sFu%(TiqZ8qRtwCH|a0*qBkhKpjTU%>$v=ZN9mFcR0$OxX7v&CYZ!!&~XvVq}v zF{TXDY3L4WQ&MOnu*96XuKaE!a))R(X3Ljzm(e$c1(|VhBbuSXytyYZ#yq1%X~pZI zVOUb(RRnKP1v;rx?Dnv=ocWn# zC~|iJ)WO@C@5Ecv9ZFbZD+v=CKh(-73svkuP5=bi%E}RU_9dZQk`;MCSW~T5fe*C6 z5EDZH8*zwiA+S37I`P-=z&sbsOM%L;493*N#4Kn(2hkdE)@L1oiaGL~yaCCTA(5lF z6=sH;((Quy9D^*>cdX7#fx8jr7yv*X*yaKy0uoZ7YtU8>7-uZtEKf>b3x$rpYxn@< z%76qgD#3ykQxmVCb({r&oXS}&PTNXY@z?kOjt4$+fsg<~z^yPf-F48GGc_AkCn!yT zTVhrLjslWS4x>V&#!YG72UZy6AQ(3_h_Lbn5YL_m&T&aD+)}~9)O6*Zy^8>(Xvo=c zD%#T0${KeJaNvV$Tp0}Rv*s&SSO*F?hQMXOu{o7USRn|{jt5?G!7Bn*?pUl?;S{)y zV*peJ9Mj{;YpkrSy&Zh)`7$DSEVWdEImwkPJoc<7Ve>dkqfTzLw6qSi7XXL{P9YGw zS*}>Ib&msQ9_iMi11EL^mp_2`;1aUOwIo&}r|>=I9K&2p0V;T6kCl}T-`fN%k4Wo(RkdMo!sl_fxjR~zEaDjIm11;-S@R6gJ#4Y9>t@{VVDQ0%cn}850r0(eAZ<@TfIsf1 z;_Kt%E#TvuTH5)L-Z&T*ZUuY=gFpLc5|21`ZJEkyb%;cG~=PlI74QPfiroauA z^bPd&=gplpbu6s<`1(IlS6MQwR*Q^^j*5y#|Dqy=D03=|jtUUdqN0T;bGj}n8W*$T za*8X?G_?S}Z=6U)SD2w5wgXfEG8jwN~XE6^o-I^&ovJ ziV};D*KjWq9qR4vq#RajwUi$di=#vxu<9pTeC)K~5`Iymql1(q^_G^>BjV@?$fE8B z?ShNmm+?zlu$&GdNdA_Vv)Mqf8&awJqs4L6moNKV>2dk;rAuhd9bnEQlIG^pIC1oT z$fkOLk!Jjg&()q+u8=5T>H^h(DUY)lJz9LE{R)1SxQ1QlUh8@FDhWk4!6b6Ixw+x6 zIJyZ_h!V%QUb%Yh8gZStfnV3Sb`7w=Du=eV;LWr%hs040n4(Y|TYnYaV!Mvt;NHY< zXkNb#XdnhKSrwoKa7C|nGPL!|&r5CUU@{=8O_PYE!DUJl4C~+~;A-U+QM92C1>4#po@}8?fB-@zbY}kL&m1#WPatd+}%>two71 z$zu5E$rDh7WFT58-Yp{C+Z&v&CZwhkExsUAd-xcCLVfz|Dc;!=EkNz=qdbtjW@^1G zjxBIKqGoaL(WA$YpFAQS^t=x`Un#-G14?AY*iqs-nbPh1;2Q6KPiPlkX`t&3RLBs* z#ZYotu5TH&au@ zB2WnvCtUiZL)@m^xr5)Dp)7A_(AMJH>mP?1V; zbQPu?CC&j0P?c-YF$r#JNjn+D{HbXJb%r<+z@g$p7cL=kw1`)5LyPRgx?{-@(V7m4 zgR3#6C~@IMDH^}Vzm8v1Cp%Ipuk@M$Vrc#_lM^mJbpGNc6IgC zjfceHXE0{8IJ@KG#Y^~Q{0i?Xenm~*)k}e7>@vhrwHPxjN?g;?aS^{nTqdp%m)YbU zK}HCE@}aX8M~Bv7j0o}JwhmZo%)NwN=3QdRZ!XfV9$-y}Q3tLNEk1F+y}hHu_afe* zOx~YR7fcd09T$rmF@=C=aq5K&?d`rDc)ODP{)YhcvnS#1(}dB5QQ}i=_ywPK{DLBR zdjv<2yeS!6X~GnP!T@oi?fiM~3&eRQ-2adPK{K=dm^exp76e(}jlu9hB4S3wh~q2I zofDkL&*5z}00D|FNf5_G;38Uhc<@HZ{rZL=sB%nY%e7mnVsTDe8}A&^hPP4>Sg9#Z zEKa@LR$UlPYJ~Vg3RoBxMu^x+)mI;)iMIO{aglkgtwbBQ6>srwW}OuV#T8#7?{Q~~ zjuIkjSeOtVT=#{Bi$qb`XYatQr}FJfZ4I@xg%K`+Mcyqw%_@yYH#mgn6c!X#)V1PQ zlrFbPlF;*4=)NpWAw&p@$rm2sk2N0NY;S~Rj&-%QXC)gQ9JU-f9Z=h^I(EH-gG-qN zt=7%YE2wPhfJWI-c^LGCA*q;x7t)U|xsE@k-M@CO5pTfj8Fh6HS3C9|bWmC2u)U?N zgw)K#b6I7z=bV?!)^n*IFAIaL`sm4qUp_l;W^v|Bm(RA%nDz zPQIjpI}dR3@Y&=LSl!wrB_x*tXBXFAXur^$7Ymdj$6@(DFs66lj~I8ME)5ObMm3a2 zuRD9~LP_y@hm(*$$8(9C;pEHKr;<+|U+)l;*>t`X)lIst7*-JHRJK5SmylIFf(?be zOGJt7a4xR5)Ya7kX(MEuQNF#tzWs7tN%3ZfIJD}QmpLK>))7N8Iq|5I!}0X;*1FGF zA%R|84~-QzatRL$h{qJ6@^MX_j~-scYZbeQ@kSORzI?Hwqj<}q(MT1 zLypBdIHjlOww(Qv7hWc>Y->B49SJdr#k2y2qNqyfL$B1GfmP~KYHlN&48*mL(&Azt z2mhQ@Ud*3SkfR9=Id~u>A~B=dgQwIPEWGd2ob2?OT+A#wX0wtbg6Ej7Qsx%qUAC_Fe4(-ekB zRCYeR)l^koEoHB(!|S=wpyt%oK|qR&qa55aGSiY`V`TI}2O?s{d7o|Emi13U_X$fS!gARmCAG4tF*iaK<`IUehKZ7Iblz=%_X)rPUPC!^28S4N>xsI#wM|#g zmlPH4b#QXoc`W7B$+*byu*lfhXm7~;@5o61sue*4QrqtBnXSlTlm|&baQ-7tSo+zAtVmnwN_KKo{ zy*(WqHXcID=qp>=ihpP$DY?A9GA2AY2vgh}F23@hqr9R5ucUREA|;95mF7^s9u zQBXbb8vipy4YTobM{8w40iHi4!hgHlnvMLhWW-e5(0Z<1+R1fw1Ya6RN;;WbSz9QA z%`X&#MXC31S4zsu@d_G>6b=@M8gH95Y_%QL^WPDyYV8tj?`FP zR#cFan^#a&S=Z8b{v5nq(q(|$KjNzxA^sC5a%%EKVPHTgx^NE+;N=u#00(|8RZ}Vw?!&0zqBi`V!maC<+S|@H zR3j5al|RrEr+v)Z~Y4PT3cRixeY{rWI7ypSygAdzX6a{2BbTAFvZ7J4GVF%V?$WdJJBy0B^dG zuH$*y()&`k=9yPqUX9nO)WXX^g_$SGJMVs&6ozLAfk-L(Xjb{z>v!+mtPBKR0=y=9 zVbv5~!jOgpFHrh)d&09crOh(4tf8^tOm$^(X7XV%R|Jm@R*)axeGvBffQ>%5B8`Zw zD|cE>re^1tlu62ADGEe~^c&818A(qmF2;)(a=&|!ey5#4FTFpHH);bo0@)(hk zrzDl|UJ^X5ga!*wU<&)fBd*@gJb99vgr(t?yb7Y6AZaKloHP_pynu$Pjpr(nEiE11 z^oqu#7@1W^!^4D-OAi;FyH&S?1+oz)#>5cOw9@LxFi;K^mEJtZOTtd^ z%Xy$kz=@Js?edt0JjSzBGEa$--9zQ&qEOOo`pwIrndT$mLd1wqdKBa>4S9=aGf>k> zjm5=`n8eBg5tw9zijLg4p2khaGI2zd~ z5h#keaw88Evwc7f8T?X>?3@^=NgV={^o*JlqCim83lp8cE&;_nZW+In3yQ=idw8y_ zf^4!W9*&ER73bC*3e$tMzED(u{S4^kdxI8NW)6qi;kgu4I~uATo}rX}EDqF)tD}Wk zFiH?ft~Dno;%;Q%trxKv$Tg)pWAczF$kTJxwKj~1?PT+^=$(5O+ zP*6H3io19v2b7BV#rz^}mmwUgglADumFVbpeG+uiPbY~Ef{vdks_k+Kamo+yTyTtl z7$7`p1J9tOr{iggC*uzt%Beac@`G%DxTxXsX(EMRBmg{eiuejoNln7zX$4g=;gG5i z7nNVCCsKS1c?H}qb{qmFBd4aOp2QPqrR5QTRtyv6UTir9&nw(QZ@_cOCt>7$7amVl zNJ@x5R#qem19qV(`C>bs0S&}Uh0)2?+@P&@dl$5jp0CV9X z8&MO`9wGjC8lI|@l9F`zaGE4V6ar|WD7K}eFf}#ZJD;D&1GJo43RXt%;~h@ODnCYY zhl(QW+a)O}>HdJ_l34VLo)oJBSO6c+hXC2bQjoD#fDm~=F?G*uJ^)y8ryPH zGxornhzQr64<2TYW|k(3LIEcf#hhs?PRsDg766V*;s}{tJc)VoSZ+zY2u6Vl9^nxc zt>vj10a<(!hRhPAdvM=`MJa`)QQ;miy&x17wAQ3$3bMR2c^TYvB2CIhz#|mEP9zo= ziG&5{vdn0yOUv-jCaMJJmZ)A^ac8N4nKV!}`2C+I0f z&=CP>pXl(}vuXYr0)TLVhk%d~B!qE1y*Np905IO7xW=Z8z3DtaZ~-AF!H?53i;jtW z0b(bLsBV(@rhBLHx**VxpCFFY^9m1%>|qw-peU)a5gsQBvV7C{0OA6V)RIziYGzJ; zQDIs{P!SAV!$l{`Yhlz`&!{LX%FhBYUj}BLJei!9nOi{K*YmSaMu)k>WW+AG@kJj_ z$uF<1E-!<9Fk#~{81%tQqVQj8Dm0HQc=fXoJrlsKJ0~SEE?OiC+YWOPzxo6Q z!}A0);z&|vfdrlu;dvA$=!r@UZeAGNMifd*3NoelTYC7xKwcl1g&5=M8x+P9^%EaC zaVkAKzo?|F6dpJ$V5>oRAvZ58E&2G7xG1iO9(KUbb1ck4Ec4>-f#ijV8FnyGuxXXz z1+1^Jz1J?j|GuDu!6BicLKr}V9E8P7dwlWD&IVskLVUzNO+z5*ad-!nrJ<$MqgM}2 zwz49l6VqgB^!shdkii27z^e3~I+|**(aar;qR<~7sWD>2@56`wHhAE#Akl^$Y80q9 zFe>wxKe=Nx{`_O~s1d`54jK4M-(EVJY!wCCHH_Y4?0DS?_(ZJ<6LiOo{d4rl;X?-x z=-(SGf%r1K6gz0bq{&mJ64SJ%PMJJWcifoKBZdtb*uM{Qg-N}L4Nw?0dFu3;db4KD zo(&7fW=xwhNq5|zqlW)B@E3$pVo=&KMdtXaGxTQ9nLCe|uRU+>U$bUTpE7a$m{Gs~ zHn4wh*hNQ?egPXy8#7(+FPOj4hlv_PLj(N<^XAN&Ic<{en9&HA!qT@Bm&O>d*hO%bNo~LiLc$vwHRpx$YnjoVfT)u>32+(Ph#{W5D z=)iuxwAf1YR!rp&02(h@zQWAHDiN>m1sR&t7N$!V0aS15#Id7?5B?QMRhX1!Y`C`G z+=WIt)|R4i?K9j&DG~DTVZZ(e}Ei~^oA|+avg0gSD7p} zTJYD5$>aa{eTdA9CQS7=L~LSaX}6)Uw2Ub44cq2LJ3H7|tX#&?pQ|?&ymzfO%rDE8s zuOMs_>|SEKdgW5%g>z;i*9SvAA=CgLGJC$^VpDVLb;+q2S-Eh{6&Ie`wPhoCV~L!f zGjj^6DGCb-A1Q;JV%6V`l-oiMe&~;bSL~Q(+Il>_fzk%^TJ^ zfiufE;LPXj6JZ8((Q-4Zkl6SmppcRh&)c=l3(Y=StN`E1utQaQqhVrL09CXJ8=*d7%FMs!8!lREy2`@J#?}t)wqm{7 zeC6^b#`<$-O`n8L5$TBn6}ai+CQj3vv%rwE)C8`e)r4ga3-eW`%N85!&zlXG1j$VL z(TuSMkDoLhum;A9mztQa#8>rPxx#e$l0`-f=gkHu#*QX=Q9}f*<`~_{0ERAsvv|o; zVp)%+ix(LgESNic#?*=9{($Qj`VKW^bXBsbBLF*XCh9*7jEr$k4`X9P=so7lnlXih z4uW1m172f?UO{KnnDLXyPHWzRg$wl;E?h8wF6xgaPZ;;d$YFzjMg5F2gVKtrQiqQE zbKC^f2hN)P7cocsui1KJCph*G*g^nsT54p+HJCkou z`sb+MhXM@xH!yqwQ|<%rHvchZobH54lZeThlO|3W51sOe;lB-nJ{w`^?U*ucz>s0T zj~xByn6cyV@mk}?jUDp`>er#)hAv-S75dx`=yQJ^G-T-T5hF)&M{A54IpX(Wa8LN9 zU+*4TYO0D1$|X!uvH!0F2M-xKbQnHdW7x2vzYQ5g-c7VM;FT*n&7==d1 znF7koLvFcmKY*LKHGF6eoPN{ufYVoxR0}yd(PkDEg+Wk zf{+}8ZMf;o!Mx0jl$}$#I(%SITE2OKmX=q1?Zplr%-*nJ|Ctt`XgD0-Uwwg>G2-B| zmDR@E^LV?B)gW-NqXyKZhkIIPifv!Mlw-~2VOmkJvhwPhs?rnj{OHozJWb>v4@D^e?#-uYR9!@_r znE;YKIs->;hEuCGJO1#IjI-xjo9n9~e+U)IIg*gz0__=2u$%-}WlrAUY1NZShn3P) z=Ir!zp8;Ih_aZ=NfVSOc6L@{`Pdq+8p|I&}Q)4|uwlpa|o^PnBt}bh5d^R6;Z(t6v z+u+iRNezL0T!)`bU$4yv3SS*un>NT}voWrvt~tOhKK^i4abpwp{OAGdk4Ne@DkGKMdRr$*?b?Oe4@JvR;` z)CHi+WAQ=P#BDX39)u~-l=h_t^gzlX+Vrs-Ham^uYAQ}Oao-bzTh8o5sME(gd%2C| zl4p_+noJdSGglKP?Epq+PD_pbg&;MVzc_5(WILq?uF2O>gm_J{_42aq&FiM6qHg0d zl(`?H)0mzq<~&Vrt%KSFMR=I!Vx_h^x@YIU6u( zkSwJ$cP5)_b2WXm_G@#s=shP{Y})MWMfWt*)rPG%_-X=(3SSizMz1kt!gjGNI&*E( z$rF)*J6tV{rv2uvwMW}Wi`94B0t*LMFydf7Z%l7o%`IR#e?|zX?bf3z#IxBpQWbC>OV$rkrmn)&3?K9leQnWcOjT+y++P3 zwshMSmk=L+C@#!$P$;Q|ObOUHOOrifnvuB+xgDGRlG%SMLWcvJVnYWlU@9r}9LI6- zixnRn6bwq%IIWs9afr48bjmbpI4DtRIGx9&jl`q3;u;j#s#gos z^wshOCy_Y{n?F_}FhMLGfvxrP8~a8*@Q zRHnOHLlcK>LZCN=zS}!u1Tbp(Y5I`7IGYPCLB(+G?{sQ9lCKl#@ij2mj3t0X2%s;- zpqVpNR93n4p+oMF&NLO8@YVOr!~}@pN>Wi#UE`#Jky_&un-Vj|bo1%)& zWiKZSCJn??=FrgHeDy$?7`8}Jr4L(U#H2#Xj;R)WK$EMEX#{Bck;>5LsM02^na+e1 z8&iRQa0n9mYWi#VsC&bCLypnrIF3eQ@H}V=67w|!NwEOwF1GJaCxxc_jkszDHGDx& z0D2%=ZKoy`>Fu-Tss)iEZ<3O(WoN-eG8*&uy`EgP{ThCt=FO(Cz#e^ojS-UuNi_yj zYmYZnNtx|*= zGDt=WoC&ockod5@S#TXSxOlj$Wjn*OTJy1%h(0d!s zAWLb?9vjviVDDx5sd8250}RG9X}~~bs(QEuviCzNUxhwQesp7UdZYWYgIIgOoU*FUfRPhs&7U_# zkzNcNWix-bKpQ)*aWI@cVR%0^KUScsnu zAa_-?UTH9A`h-7*!MI;XO9P&M$k+D!4jeXm+@u+hMKFLT_nG5{_EA%S$B;6NMx~)g z&EFLVj-EPy>1y(?1DKnwS_Q)kQ)nv@xd!hTr9Unhl*gKo?KVuuljBa1FA0r z{lD(PjPLC&L%Pv9-V<8kwxLH>wnV$Me(O#fA5?4zt^Ysy!1Vz-ODfa{4a$- z>8m}#x|{v5XzhCzIA>Ds0jQh5k@0Z5?$0mNH zp!LO{8~MInx#Zm!o3{Ok{pT_pIqg6HZS!;1e~w7|=XT}Dw13Y2QzZL4f3Zbw>s!BH zvwuqaj{z&cW#DIJEB`V5Pl4V)v-K^x_fKj6G2kEE_P_Q({Ez8>3e5YO{pTe=+%NT~ zCO-pw_P3ONZdr=>#@}4}jPyS^`1W>vKXC;9&da~``FyL}pV*a)-~3zFG3@KjTjfT6 z@cZ_^XTR+SX1*)>7tep`ca8i&Q1b89Kj;T$zAHk1EbCwTSbf*X4+NI~l5wCJ@dGp8 z6~XN4zxMg+&v|{3pn!Mw2u{Z@&3avMgOXK zZ00{S+Xb8X@7l)-yO{scm;8U(JT~G#dIWqk>fg4HZT&~}mVvhX>*g`)Kg>QL56=8I z5&%8^QT7Fy|1V`=hW~Kqab#Hfc`)qXk3RfuzlpnwzPC@h+%oz5L*cH8|7PEdDxB0Z~#z-~J`TKvhcQv6=9%0z%n%#{in?$plWV2Z*UaBYs1;JV?*o$BZ z_3RK}+kY6zxfgf|644Cl|#cq6hI{AXKfZ&pW%{ zX7+n$cITb_){}FZdB1nw=b3l@zWIJ;tcIO0l>YqEYc%NG$Bv+I#tbPw-q-2q@2c9& zQBivj0kY(iQJD``-DD=36x>`@EnCA#z8FEhhxwL@`G&wsVdh@16aw2St)BW;#*4}4(kd49D{ z&PVN;qP%j{QUxO|==CPvr4b{6#Z69iCMdJ)g>h|m+pOFQ>1~4p*0uu3W^*kk@E*F} zG@ByF_j<-PZBZ7x$MIV{@YV8r&GE--HCmgx#_<e@1M}U*R*#^gPkU zZ|$;vA~1LP)^E@LasN$pV7jGO6Th7(EOS^Av}IRrJA6aW+FZPJ>FklORu8+}{%95R zNknca?ehFI$oip;%o`82GKr#IuYEW-?-xO*xh)^bX;Gmy-6tG_JQsj>dDW;dWgmgWQ^2GU$rN_1Y%oaN!)2*5w|@W0LW(HF*DRPU%47v@)m^eehGo)T;f}^NdrTH(vL0?#Ah91c>d2yUG^zly zM)j&Aj8*MwjX81RoYk=7g>z!anhc`1jwVWnYRrif8%;JPvW;TMnhZ-MSSH;iHRi;L zWRq*KH}(;kp1h1V%KVN4d%V}!V6dYY#NK5F%(K5IzzvsithjvH2%Ac z#}fwxULSq3|&_Ny!B8q4HZsJ9GW_rPGSR&`|!f?cbgMyY5?(|L*+${f^J`YKxYPR{E;@ zY1b1AJj6j2=7k)4ArJJ!?eII* zd(io&`+uFXSG`iLhRPU(rl?3L7N9}SKp4;i2~cDJD`W*-?sh@XukZLOcqI~Ws0_li z-3>;gR5zT_)7y)4$15j~ Wed, 05 Dec 2007 22:23:30 +0100 + +gajim (0.11.3-1) unstable; urgency=low + + * New upstream release. + * Fix depand list so that Gajim will work when python2.5 will be the + default. Closes: #445275 + * Fix focus bug. Closes: #447985 + * Depend on dnsutils to use SRV records. Closes: #434690 + + -- Yann Leboulanger Fri, 16 Nov 2007 19:01:54 +0100 + +gajim (0.11.2-1) unstable; urgency=low + + * New upstream release. + * Don't optionaly depend on python2.5. Closes: #418252 + * Better handle gnome-keyring. Closes: #433315, #424293 + * Handle dbus restart. Closes: #434993 + * Don't allow bookmark creation on server that don't support that. + Closes: #438620 + * Fix list_contact dbus signature. Closes: #440225 + * Remove changelog.gz from /usr/share/doc/gajim. Closes: #412632 + + -- Yann Le Boulanger Sun, 22 Sep 2007 22:22:34 +0100 + +gajim (0.11.1-1) unstable; urgency=low + + * New upstream release. + * Don't depend on python2.4 specifically + * Don't recommand libdbus, python-dbus does + * Tooltips in chat window are now correctly destroyed. Closes: #404693 + + -- Yann Le Boulanger Sun, 18 Feb 2007 22:15:57 +0100 + +gajim (0.11-2) unstable; urgency=low + + * Add missing build depends to get gajim-remote. Closes: #405969 + * Update recommands to support dbus. Closes: #402355 + * Make python-gnupginterface a recommanded package. Closes: #405808 + + -- Yann Le Boulanger Tue, 09 Jan 2007 18:32:26 +0100 + gajim (0.11-1) unstable; urgency=low * New upstream release. Closes: #403806 diff --git a/debian/control b/debian/control index 16602afc5..760ac7542 100644 --- a/debian/control +++ b/debian/control @@ -2,17 +2,20 @@ Source: gajim Section: net Priority: optional Maintainer: Yann Le Boulanger -Build-Depends: debhelper (>= 5.0.37.2), cdbs (>= 0.4.43), python-support (>= 0.3), python-dev, libgtk2.0-dev, python-gtk2-dev, libgtkspell-dev, gettext, libxss-dev, intltool, imagemagick, python-central (>= 0.5), libdbus-1-dev +Build-Depends: debhelper (>= 5.0.37.2), cdbs (>= 0.4.43), python-support (>= 0.7.1), python-dev, libgtk2.0-dev, python-gtk2-dev, libgtkspell-dev, gettext, libxss-dev, intltool, imagemagick, python-central (>= 0.5), libdbus-1-dev Build-Conflicts: python2.3 XS-Python-Version: >= 2.4 -Standards-Version: 3.7.2 +Standards-Version: 3.7.3 +Homepage: http://www.gajim.org +Vcs-Svn: svn://svn.gajim.org/gajim/ +Vcs-Browser: http://trac.gajim.org/browser Package: gajim Architecture: any XB-Python-Version: ${python:Versions} -Depends: ${python:Depends}, python-glade2 (>= 2.6.0), python-gtk2 (>= 2.6.0), python-pysqlite2 | python2.5 -Recommends: dnsutils, python2.4-dbus, notification-daemon, python-gnupginterface, python-pyopenssl -Suggests: python-gnome2, nautilus-sendto, avahi-daemon, python-avahi, network-manager +Depends: python (>= 2.4), python-support (>= 0.7.1), python-glade2 (>= 2.8.0), python-gtk2 (>= 2.8.0), python-pysqlite2 | python (>= 2.5), dnsutils +Recommends: dbus, python-dbus, notification-daemon, python-gnupginterface, python-pyopenssl +Suggests: python-gnome2, nautilus-sendto, avahi-daemon, python-avahi, network-manager, libgtkspell0, aspell-en, python-gnome2-desktop (>= 2.16.0) Description: Jabber client written in PyGTK Gajim is a Jabber client. It has a tabbed user interface with normal chats, group chats, and has many features such as, TLS, GPG, SSL, multiple accounts, diff --git a/debian/gajim.menu b/debian/gajim.menu index f1efc22e2..cd7a318f3 100644 --- a/debian/gajim.menu +++ b/debian/gajim.menu @@ -1,6 +1,6 @@ ?package(gajim): \ needs="X11" \ - section="Apps/Net" \ + section="Applications/Network/Communication" \ command="/usr/bin/gajim" \ icon="/usr/share/pixmaps/gajim.xpm" \ title="Gajim" \ diff --git a/gajim.iss b/gajim.iss index 5bab0137c..00ec90cc9 100644 --- a/gajim.iss +++ b/gajim.iss @@ -1,6 +1,7 @@ [Setup] AppName=Gajim -AppVerName=Gajim version 0.11-1 +AppVerName=Gajim version 0.11.4 +OutputBaseFilename=gajim-0.11.4-1 DefaultDirName={pf}\Gajim DefaultGroupName=Gajim UninstallDisplayIcon={app}\src\Gajim.exe @@ -27,6 +28,8 @@ Source: "dist\history_manager.exe"; DestDir: "{app}\src"; components: main Source: "data\*"; DestDir: "{app}\data"; Flags: recursesubdirs Source: "po\*.mo"; DestDir: "{app}\po"; Flags: recursesubdirs ;Source: "gtk\*"; DestDir: "{app}\src\gtk"; Flags: recursesubdirs +;Source: "gtk\bin\xmlparse.dll"; DestDir: "{app}\src" +;Source: "gtk\bin\xmltok.dll"; DestDir: "{app}\src" [Icons] Name: "{group}\Gajim"; Filename: "{app}\src\Gajim.exe"; WorkingDir: "{app}\src" diff --git a/launch.sh b/launch.sh index 08b9110a0..7a3f8b5f6 100755 --- a/launch.sh +++ b/launch.sh @@ -1,3 +1,14 @@ #!/bin/bash -cd `dirname $0`/src +BASE=`pwd`/`dirname $0` +OS=`uname -s` + +if [ "x${OS}" == "xDarwin" ]; then + export RESOURCEPATH="${BASE}/dist/Gajim.app/Contents/Resources" + GTK_DIR="/Library/Frameworks/GTK+.framework/Versions/Current" + export PATH="${GTK_DIR}/bin:$PATH" + export PYTHONPATH="${GTK_DIR}/lib/python2.5/site-packages:${GTK_DIR}/lib/python2.5/site-packages/gtk-2.0:${PYTHONPATH}" + unset GTK_DIR +fi + +cd ${BASE}/src exec -a gajim python -OOt gajim.py $@ diff --git a/po/LINGUAS b/po/LINGUAS index 0bf5641a2..476281bef 100644 --- a/po/LINGUAS +++ b/po/LINGUAS @@ -1,2 +1,30 @@ # available languages -fr pt el pl es ru bg de nb cs nl pt_BR sv it eu sk no zh_CN br eo hr en_GB be sr gl_ES +fr +pt +el +pl +es +ru +bg +de +nb +cs +nl +pt_BR +sv +it +eu +sk +no +zh_CN +br +eo +hr +en_GB +be +be@latin +sr +sr@Latn +gl +lt +da diff --git a/po/cs.po b/po/cs.po index dcbedded6..f56c61c84 100644 --- a/po/cs.po +++ b/po/cs.po @@ -14,11 +14,15 @@ # Petr Mensik , 2005. # Pihhan , 2005, 2006. # +#: ../src/gajim-remote.py:212 ../src/gajim-remote.py:219 +#: ../src/gajim-remote.py:245 ../src/gajim-remote.py:246 +#: ../src/gajim-remote.py:252 ../src/gajim-remote.py:253 +#: ../src/gajim-remote.py:254 ../src/gajim-remote.py:255 msgid "" msgstr "" "Project-Id-Version: gajim\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-02-06 12:50+0100\n" +"POT-Creation-Date: 2007-08-25 00:27+0200\n" "PO-Revision-Date: 2007-02-06 21:51+0100\n" "Last-Translator: Petr Menšík \n" "Language-Team: \n" @@ -43,46 +47,53 @@ msgid "Jabber IM Client" msgstr "Jabber IM klient" #: ../data/glade/account_context_menu.glade.h:1 -msgid "Send Single _Message..." -msgstr "Odeslat jednoduchou _zprávu..." +#: ../data/glade/chat_context_menu.glade.h:1 +#: ../data/glade/roster_window.glade.h:8 +msgid "Join _Group Chat" +msgstr "Vstoupit do _Diskuze" #: ../data/glade/account_context_menu.glade.h:2 -msgid "_Add Contact..." -msgstr "Přid_at kontakt..." +#, fuzzy +msgid "_Add Contact" +msgstr "Přidat _kontakt" # FIXME: chtelo by to cesky vyraz pro service discovery #: ../data/glade/account_context_menu.glade.h:3 -msgid "_Discover Services..." -msgstr "_Prohlížet služby..." +#: ../data/glade/roster_window.glade.h:15 +msgid "_Discover Services" +msgstr "_Prohlížet služby" -#: ../data/glade/account_context_menu.glade.h:4 -#: ../src/disco.py:1145 -msgid "_Execute Command..." +#: ../data/glade/account_context_menu.glade.h:4 ../src/disco.py:1143 +#, fuzzy +msgid "_Execute Command" msgstr "Spustit _příkaz..." #: ../data/glade/account_context_menu.glade.h:5 -#: ../data/glade/roster_window.glade.h:16 -#: ../data/glade/systray_context_menu.glade.h:6 -msgid "_Group Chat" -msgstr "_Diskuze" - -#: ../data/glade/account_context_menu.glade.h:6 #: ../data/glade/zeroconf_context_menu.glade.h:1 msgid "_Modify Account..." msgstr "Upravit úč_et..." -#: ../data/glade/account_context_menu.glade.h:7 +#: ../data/glade/account_context_menu.glade.h:6 msgid "_Open Gmail Inbox" msgstr "_Otevři schránku Gmailu" +#: ../data/glade/account_context_menu.glade.h:7 +#: ../data/glade/chat_context_menu.glade.h:7 +#: ../data/glade/roster_window.glade.h:22 +#: ../data/glade/subscription_request_popup_menu.glade.h:1 +#: ../data/glade/systray_context_menu.glade.h:7 +msgid "_Start Chat" +msgstr "_Začít rozhovor" + #: ../data/glade/account_context_menu.glade.h:8 #: ../data/glade/zeroconf_context_menu.glade.h:2 msgid "_Status" msgstr "_Stav" #: ../data/glade/account_creation_wizard_window.glade.h:1 +#, fuzzy msgid "" -"Account is being created\n" +"Connecting to server\n" "\n" "Please wait..." msgstr "" @@ -99,115 +110,131 @@ msgid "Please fill in the data for your new account" msgstr "Prosím vyplňte údaje pro Váš nový účet" #: ../data/glade/account_creation_wizard_window.glade.h:6 -msgid "Click to see features (like MSN, ICQ transports) of jabber servers" -msgstr "Klikněte pro seznam vlastností (jako MSN, ICQ transporty) jabber serverů" +msgid "Please select a server" +msgstr "" #: ../data/glade/account_creation_wizard_window.glade.h:7 +msgid "Click to see features (like MSN, ICQ transports) of jabber servers" +msgstr "" +"Klikněte pro seznam vlastností (jako MSN, ICQ transporty) jabber serverů" + +#: ../data/glade/account_creation_wizard_window.glade.h:8 msgid "Connect when I press Finish" msgstr "Připojit když stisknu Dokončit" -#: ../data/glade/account_creation_wizard_window.glade.h:8 +#: ../data/glade/account_creation_wizard_window.glade.h:9 msgid "Gajim: Account Creation Wizard" msgstr "Gajim: Průvodce vytváření účtu" -#: ../data/glade/account_creation_wizard_window.glade.h:9 +#: ../data/glade/account_creation_wizard_window.glade.h:10 msgid "I already have an account I want to use" msgstr "Už mám účet který bych rád(a) použil(a)" -#: ../data/glade/account_creation_wizard_window.glade.h:10 +#: ../data/glade/account_creation_wizard_window.glade.h:11 msgid "I want to _register for a new account" msgstr "Chtěl(a) bych za_registrovat nový účet" -#: ../data/glade/account_creation_wizard_window.glade.h:11 -#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/account_creation_wizard_window.glade.h:12 +#: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/accounts_window.glade.h:22 msgid "If checked, Gajim will remember the password for this account" msgstr "Pokud bude zaškrtnuto, Gajim si bude pamatovat heslo pro tento účet" -#: ../data/glade/account_creation_wizard_window.glade.h:12 -#: ../data/glade/manage_proxies_window.glade.h:7 -msgid "Pass_word:" -msgstr "He_slo:" - #: ../data/glade/account_creation_wizard_window.glade.h:13 -#: ../data/glade/account_modification_window.glade.h:38 +#: ../data/glade/account_modification_window.glade.h:26 +#: ../data/glade/accounts_window.glade.h:32 +msgid "Manage..." +msgstr "Spravovat..." + +#: ../data/glade/account_creation_wizard_window.glade.h:14 +#, fuzzy +msgid "Prox_y:" +msgstr "Proxy:" + +#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/accounts_window.glade.h:48 msgid "Save pass_word" msgstr "Uložit _heslo" -#: ../data/glade/account_creation_wizard_window.glade.h:14 +#: ../data/glade/account_creation_wizard_window.glade.h:16 msgid "Servers Features" msgstr "Vlastnosti serveru" -#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_creation_wizard_window.glade.h:17 msgid "Set my profile when I connect" msgstr "Nastavit profil, když se připojuji" -#: ../data/glade/account_creation_wizard_window.glade.h:16 +#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/accounts_window.glade.h:53 +msgid "Use custom hostname/port" +msgstr "Použít vlastní jméno počítače/port" + +#: ../data/glade/account_creation_wizard_window.glade.h:19 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." msgstr "Potřebujete mít účet pro připojení k síti Jabber." -#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_creation_wizard_window.glade.h:21 msgid "Your JID:" msgstr "Vaše JID:" -#: ../data/glade/account_creation_wizard_window.glade.h:19 -#: ../data/glade/roster_window.glade.h:11 +#: ../data/glade/account_creation_wizard_window.glade.h:22 +#: ../data/glade/roster_window.glade.h:13 msgid "_Advanced" msgstr "_Rozšířené" -#: ../data/glade/account_creation_wizard_window.glade.h:20 +#: ../data/glade/account_creation_wizard_window.glade.h:23 msgid "_Finish" msgstr "_Dokončit" -#: ../data/glade/account_creation_wizard_window.glade.h:21 -#: ../data/glade/manage_proxies_window.glade.h:10 -msgid "_Host:" -msgstr "_Počítač:" +#: ../data/glade/account_creation_wizard_window.glade.h:24 +#, fuzzy +msgid "_Hostname:" +msgstr "Počítač: " -#: ../data/glade/account_creation_wizard_window.glade.h:22 -#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_modification_window.glade.h:50 +#: ../data/glade/accounts_window.glade.h:58 msgid "_Password:" msgstr "_Heslo:" -#: ../data/glade/account_creation_wizard_window.glade.h:23 +#: ../data/glade/account_creation_wizard_window.glade.h:26 #: ../data/glade/manage_proxies_window.glade.h:11 msgid "_Port:" msgstr "_Port:" -#: ../data/glade/account_creation_wizard_window.glade.h:24 -msgid "_Retype Password:" -msgstr "Z_opakuj heslo:" - -#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_creation_wizard_window.glade.h:27 msgid "_Server:" msgstr "_Server:" -#: ../data/glade/account_creation_wizard_window.glade.h:26 -msgid "_Use proxy" -msgstr "_Používat proxy" - -#: ../data/glade/account_creation_wizard_window.glade.h:27 +#: ../data/glade/account_creation_wizard_window.glade.h:28 #: ../data/glade/manage_proxies_window.glade.h:12 msgid "_Username:" msgstr "_Uživatel:" #: ../data/glade/account_modification_window.glade.h:1 +#: ../data/glade/accounts_window.glade.h:1 #: ../data/glade/preferences_window.glade.h:8 msgid "Miscellaneous" msgstr "Příslušenství" #: ../data/glade/account_modification_window.glade.h:2 +#: ../data/glade/accounts_window.glade.h:2 #: ../data/glade/zeroconf_properties_window.glade.h:1 msgid "OpenPGP" msgstr "OpenPGP" #: ../data/glade/account_modification_window.glade.h:3 +#: ../data/glade/accounts_window.glade.h:3 #: ../data/glade/zeroconf_properties_window.glade.h:2 msgid "Personal Information" msgstr "Osobní údaje" #: ../data/glade/account_modification_window.glade.h:4 +#: ../data/glade/accounts_window.glade.h:4 msgid "Account" msgstr "Účet" @@ -216,227 +243,344 @@ msgid "Account Modification" msgstr "Úprava účtu" #: ../data/glade/account_modification_window.glade.h:6 +#: ../data/glade/accounts_window.glade.h:5 +#, fuzzy +msgid "Administration operations" +msgstr "Seznam správců" + +#: ../data/glade/account_modification_window.glade.h:7 +#: ../data/glade/accounts_window.glade.h:6 msgid "Auto-reconnect when connection is lost" msgstr "Automaticky se znovu připojit při ztrátě spojení" -#: ../data/glade/account_modification_window.glade.h:7 +#: ../data/glade/account_modification_window.glade.h:8 +#: ../data/glade/accounts_window.glade.h:7 #: ../data/glade/zeroconf_properties_window.glade.h:3 msgid "C_onnect on Gajim startup" msgstr "_Připojit po startu Gajimu" -#: ../data/glade/account_modification_window.glade.h:8 +#: ../data/glade/account_modification_window.glade.h:9 +#: ../data/glade/accounts_window.glade.h:8 msgid "Chan_ge Password" msgstr "_Změnit heslo" -#: ../data/glade/account_modification_window.glade.h:9 -msgid "Check this so Gajim will connect in port 5223 where legacy servers are expected to have SSL capabilities. Note that Gajim uses TLS encryption by default if broadcasted by the server, and with this option enabled TLS will be disabled" -msgstr "Zaškrtněte pokud se má Gajim připojit na port 5223, kde obvykle nabízejí starší servery SSL. Pozor- Gajim použije TLS šifrování standardně, pokud server ohlásí jeho podporu. Touto volbou bude TLS vypnuto" - #: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/accounts_window.glade.h:9 +msgid "" +"Check this so Gajim will connect in port 5223 where legacy servers are " +"expected to have SSL capabilities. Note that Gajim uses TLS encryption by " +"default if broadcasted by the server, and with this option enabled TLS will " +"be disabled" +msgstr "" +"Zaškrtněte pokud se má Gajim připojit na port 5223, kde obvykle nabízejí " +"starší servery SSL. Pozor- Gajim použije TLS šifrování standardně, pokud " +"server ohlásí jeho podporu. Touto volbou bude TLS vypnuto" + +#: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/accounts_window.glade.h:10 #: ../data/glade/zeroconf_properties_window.glade.h:4 msgid "Choose _Key..." msgstr "Vyberte _klíč..." -#: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/accounts_window.glade.h:11 msgid "Click to change account's password" msgstr "Klikněte pro změnu hesla k účtu" -#: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/accounts_window.glade.h:12 +msgid "Click to request authorization to all contacts of another account" +msgstr "" + +#: ../data/glade/account_modification_window.glade.h:14 +#: ../data/glade/accounts_window.glade.h:13 msgid "Connection" msgstr "Spojení" -#: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/account_modification_window.glade.h:15 +#: ../data/glade/accounts_window.glade.h:15 msgid "Edit Personal Information..." msgstr "Upravit osobní informace..." -#: ../data/glade/account_modification_window.glade.h:14 -#: ../data/glade/roster_window.glade.h:5 -#: ../src/notify.py:458 -#: ../src/notify.py:480 -#: ../src/notify.py:492 -#: ../src/common/helpers.py:914 +#. No configured account +#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/accounts_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:6 ../src/notify.py:470 +#: ../src/notify.py:492 ../src/notify.py:504 ../src/common/helpers.py:964 +#: ../src/common/helpers.py:976 msgid "Gajim" msgstr "Gajim" -#: ../data/glade/account_modification_window.glade.h:15 +#. General group cannot be changed +#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/accounts_window.glade.h:19 #: ../data/glade/preferences_window.glade.h:51 #: ../data/glade/zeroconf_properties_window.glade.h:7 -#: ../src/roster_window.py:346 -#: ../src/roster_window.py:1224 -#: ../src/roster_window.py:1435 -#: ../src/roster_window.py:2111 -#: ../src/roster_window.py:2153 -#: ../src/common/contacts.py:284 +#: ../src/roster_window.py:358 ../src/roster_window.py:623 +#: ../src/roster_window.py:1354 ../src/roster_window.py:1722 +#: ../src/roster_window.py:2112 ../src/roster_window.py:2628 +#: ../src/roster_window.py:2746 ../src/common/contacts.py:309 msgid "General" msgstr "Obecné" -#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/accounts_window.glade.h:20 msgid "Hostname: " msgstr "Počítač: " -#: ../data/glade/account_modification_window.glade.h:17 -msgid "If checked, Gajim will also broadcast some more IPs except from just your IP, so file transfer has higher chances of working." -msgstr "Pokud je zaškrtnuto, Gajim ohlásí navíc několik dalších IP kromě Vaší IP, takže přenos souboru má větší šanci správného fungování." - #: ../data/glade/account_modification_window.glade.h:19 -msgid "If checked, Gajim will send keep-alive packets to prevent connection timeout which results in disconnection" -msgstr "Pokud zaškrtnuto, Gajim bude posílat keep-alive pakety, aby předešel ztrátě spojení způsobeném vypršením spojení" - -#: ../data/glade/account_modification_window.glade.h:20 -#: ../data/glade/zeroconf_properties_window.glade.h:8 -msgid "If checked, Gajim will store the password in ~/.gajim/config with 'read' permission only for you" -msgstr "Pokud zaškrtnuto, Gajim uloží heslo v ~/.gajim/config s právem čtení pouze pro Vás" +#: ../data/glade/accounts_window.glade.h:21 +msgid "" +"If checked, Gajim will also broadcast some more IPs except from just your " +"IP, so file transfer has higher chances of working." +msgstr "" +"Pokud je zaškrtnuto, Gajim ohlásí navíc několik dalších IP kromě Vaší IP, " +"takže přenos souboru má větší šanci správného fungování." #: ../data/glade/account_modification_window.glade.h:21 -#: ../data/glade/zeroconf_properties_window.glade.h:9 -msgid "If checked, Gajim, when launched, will automatically connect to jabber using this account" -msgstr "Pokud zaškrtnuto, Gajim po spuštění se automaticky připojí pomocí tohoto účtu" +#: ../data/glade/accounts_window.glade.h:23 +msgid "" +"If checked, Gajim will send keep-alive packets to prevent connection timeout " +"which results in disconnection" +msgstr "" +"Pokud zaškrtnuto, Gajim bude posílat keep-alive pakety, aby předešel ztrátě " +"spojení způsobeném vypršením spojení" #: ../data/glade/account_modification_window.glade.h:22 -#: ../data/glade/zeroconf_properties_window.glade.h:10 -msgid "If checked, any change to the global status (handled by the combobox at the bottom of the roster window) will change the status of this account accordingly" -msgstr "Pokud zaškrtnuto, jakákoliv změna globálního stavu (pomocí comboboxu na spodní straně Seznamu) změní stav tohoto účtu také" +#: ../data/glade/accounts_window.glade.h:24 +#: ../data/glade/zeroconf_properties_window.glade.h:8 +msgid "" +"If checked, Gajim will store the password in ~/.gajim/config with 'read' " +"permission only for you" +msgstr "" +"Pokud zaškrtnuto, Gajim uloží heslo v ~/.gajim/config s právem čtení pouze " +"pro Vás" #: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/accounts_window.glade.h:25 +#: ../data/glade/zeroconf_properties_window.glade.h:9 +msgid "" +"If checked, Gajim, when launched, will automatically connect to jabber using " +"this account" +msgstr "" +"Pokud zaškrtnuto, Gajim po spuštění se automaticky připojí pomocí tohoto účtu" + +#: ../data/glade/account_modification_window.glade.h:24 +#: ../data/glade/accounts_window.glade.h:26 +#: ../data/glade/zeroconf_properties_window.glade.h:10 +msgid "" +"If checked, any change to the global status (handled by the combobox at the " +"bottom of the roster window) will change the status of this account " +"accordingly" +msgstr "" +"Pokud zaškrtnuto, jakákoliv změna globálního stavu (pomocí comboboxu na " +"spodní straně Seznamu) změní stav tohoto účtu také" + +#: ../data/glade/account_modification_window.glade.h:25 +#: ../data/glade/accounts_window.glade.h:29 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:24 -msgid "Manage..." -msgstr "Spravovat..." - -#: ../data/glade/account_modification_window.glade.h:25 -#: ../data/glade/zeroconf_properties_window.glade.h:16 -#: ../src/config.py:1608 -#: ../src/config.py:3405 +#: ../data/glade/account_modification_window.glade.h:27 +#: ../data/glade/accounts_window.glade.h:34 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1589 +#: ../src/config.py:2075 msgid "No key selected" msgstr "Není zvolen žádný klíč" #. None means no proxy profile selected -#: ../data/glade/account_modification_window.glade.h:27 -#: ../src/config.py:1188 -#: ../src/config.py:1193 -#: ../src/config.py:1377 -#: ../src/config.py:1598 -#: ../src/config.py:1607 -#: ../src/config.py:1667 -#: ../src/config.py:1741 -#: ../src/config.py:3395 -#: ../src/config.py:3404 -#: ../src/dialogs.py:281 -#: ../src/dialogs.py:283 +#. GPG Key +#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/accounts_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:32 ../src/config.py:1175 +#: ../src/config.py:1246 ../src/config.py:1495 ../src/config.py:1500 +#: ../src/config.py:1971 ../src/config.py:2058 ../src/config.py:2074 +#: ../src/config.py:3167 ../src/config.py:3213 ../src/dialogs.py:285 +#: ../src/dialogs.py:287 ../src/roster_window.py:1826 +#: ../src/roster_window.py:1833 ../src/roster_window.py:1840 msgid "None" msgstr "Žádný" -#: ../data/glade/account_modification_window.glade.h:28 +#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/accounts_window.glade.h:37 #: ../data/glade/profile_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:17 msgid "Personal Information" msgstr "Osobní údaje" -#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/accounts_window.glade.h:38 msgid "Port: " msgstr "Port: " -#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/accounts_window.glade.h:39 msgid "Priori_ty:" msgstr "Priori_ta:" -#: ../data/glade/account_modification_window.glade.h:31 -msgid "Priority is used in Jabber to determine who gets the events from the jabber server when two or more clients are connected using the same account; The client with the highest priority gets the events" -msgstr "Priorita je v Jabberu použita ke zjištění, kdo obdrží zprávu od jabber serveru, pokud je připojeno více klientů přes stejný účet. Zprávu obdrží klient s vyšší prioritou" +#: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/accounts_window.glade.h:40 +msgid "" +"Priority is used in Jabber to determine who gets the events from the jabber " +"server when two or more clients are connected using the same account; The " +"client with the highest priority gets the events" +msgstr "" +"Priorita je v Jabberu použita ke zjištění, kdo obdrží zprávu od jabber " +"serveru, pokud je připojeno více klientů přes stejný účet. Zprávu obdrží " +"klient s vyšší prioritou" -#: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/accounts_window.glade.h:41 msgid "Priority will change automatically according to your status." msgstr "Priorita se automaticky změní podle vašeho stavu." -#: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/account_modification_window.glade.h:35 +#: ../data/glade/accounts_window.glade.h:42 msgid "Proxy:" msgstr "Proxy:" -#: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/accounts_window.glade.h:44 msgid "Resour_ce:" msgstr "Zd_roj: " -#: ../data/glade/account_modification_window.glade.h:35 -msgid "Resource is sent to the Jabber server in order to separate the same JID in two or more parts depending on the number of the clients connected in the same server with the same account. So you might be connected in the same account with resource 'Home' and 'Work' at the same time. The resource which has the highest priority will get the events. (see below)" -msgstr "Zdroj je odeslán Jabber serveru pro oddělení stejné JID na dvě nebo více částí závisejících na počtu připojených klientů na stejný server se stejným účtem. Takže můžete být připojeni ke stejnému účtu se zdroji 'Domov' a 'Práce' zároveň. Zdroj, který má nejvyšší prioritu obdrží zprávy. (více následuje)" +#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/accounts_window.glade.h:45 +msgid "" +"Resource is sent to the Jabber server in order to separate the same JID in " +"two or more parts depending on the number of the clients connected in the " +"same server with the same account. So you might be connected in the same " +"account with resource 'Home' and 'Work' at the same time. The resource which " +"has the highest priority will get the events. (see below)" +msgstr "" +"Zdroj je odeslán Jabber serveru pro oddělení stejné JID na dvě nebo více " +"částí závisejících na počtu připojených klientů na stejný server se stejným " +"účtem. Takže můžete být připojeni ke stejnému účtu se zdroji 'Domov' a " +"'Práce' zároveň. Zdroj, který má nejvyšší prioritu obdrží zprávy. (více " +"následuje)" -#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/account_modification_window.glade.h:38 +#: ../data/glade/accounts_window.glade.h:46 #: ../data/glade/zeroconf_properties_window.glade.h:18 msgid "Save _passphrase (insecure)" msgstr "Uložit _heslo (nebezpečné)" -#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/accounts_window.glade.h:47 #: ../data/glade/zeroconf_properties_window.glade.h:19 msgid "Save conversation _logs for all contacts" msgstr "Uložit _historii pro všechny kontakty" -#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/accounts_window.glade.h:49 msgid "Send keep-alive packets" msgstr "Odesílat keep-alive pakety" -#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/account_modification_window.glade.h:42 +#: ../data/glade/accounts_window.glade.h:50 #: ../data/glade/zeroconf_properties_window.glade.h:20 msgid "Synch_ronize account status with global status" msgstr "Synch_ronizovat stav účtu s globálním stavem" -#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/accounts_window.glade.h:51 +#, fuzzy +msgid "Synchronise contacts" +msgstr "Zobrazit _odpojené kontakty" + +#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/accounts_window.glade.h:52 msgid "Use _SSL (legacy)" msgstr "Použít _SSL (staré)" -#: ../data/glade/account_modification_window.glade.h:42 -msgid "Use custom hostname/port" -msgstr "Použít vlastní jméno počítače/port" - -#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/account_modification_window.glade.h:46 +#: ../data/glade/accounts_window.glade.h:55 msgid "Use file transfer proxies" msgstr "Použij proxy při přenosu souborů" -#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/accounts_window.glade.h:56 msgid "_Adjust to status" msgstr "N_astavit podle stavu" -#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/account_modification_window.glade.h:48 +#: ../data/glade/accounts_window.glade.h:57 msgid "_Jabber ID:" msgstr "_Jabber ID:" -#: ../data/glade/account_modification_window.glade.h:46 +#: ../data/glade/account_modification_window.glade.h:49 msgid "_Name:" msgstr "_Jméno: " -#: ../data/glade/accounts_window.glade.h:1 -msgid "Accounts" -msgstr "Účty" +#: ../data/glade/accounts_window.glade.h:14 +#: ../data/glade/profile_window.glade.h:11 +#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/zeroconf_information_window.glade.h:2 +#: ../data/glade/zeroconf_properties_window.glade.h:5 +msgid "E-Mail:" +msgstr "E-Mail:" -#: ../data/glade/accounts_window.glade.h:2 +#. XML Console enable checkbutton +#: ../data/glade/accounts_window.glade.h:16 +#: ../data/glade/xml_console_window.glade.h:4 +msgid "Enable" +msgstr "Povolit" + +#: ../data/glade/accounts_window.glade.h:17 +#: ../data/glade/zeroconf_information_window.glade.h:3 +#: ../data/glade/zeroconf_properties_window.glade.h:6 +msgid "First Name:" +msgstr "Křestní:" + +#: ../data/glade/accounts_window.glade.h:27 +#: ../data/glade/zeroconf_properties_window.glade.h:11 msgid "" -"If checked, all local contacts that use a Bonjour compatible chat client (like iChat, Trillian or Gaim) will be shown in roster. You don't need to be connected to a jabber server for it to work.\n" -"This is only available if python-avahi is installed and avahi-daemon is running." +"If the default port that is used for incoming messages is unfitting for your " +"setup you can select another one here.\n" +"You might consider to change possible firewall settings." msgstr "" -"Pokud je zaškrtnuto, všechny místní kontakty používající Bonjour-kompatibilního klienta (iChat, Trillian nebo Gaim) se zobrazí v rosteru. Nemusíš být připojený(á) k jabber serveru, aby to fungovalo.\n" -"Je to dostupné pouze v případě, že je nainstalováno python-avahi a avahi-daemon běží." +"Pokud výchozí port použitý k přijímání zpráv nevyhovuje tvému nastavení, " +"můžeš si zvolit jiný.\n" +"Můžeš také zvážit změnu nastavení firewallu." -#: ../data/glade/accounts_window.glade.h:4 -msgid "If you have 2 or more accounts and this is checked, Gajim will list all contacts as if you had one account" -msgstr "Máte-li 2 nebo více účtů a je zaškrtnuto, Gajim zobrazí všechny kontakty jako by byly z jednoho účtu" +#: ../data/glade/accounts_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/zeroconf_information_window.glade.h:4 +#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:452 +msgid "Jabber ID:" +msgstr "Jabber ID:" -#: ../data/glade/accounts_window.glade.h:5 +#: ../data/glade/accounts_window.glade.h:31 +#: ../data/glade/zeroconf_information_window.glade.h:5 +#: ../data/glade/zeroconf_properties_window.glade.h:14 +msgid "Last Name:" +msgstr "Příjmení:" + +#: ../data/glade/accounts_window.glade.h:33 msgid "Mer_ge accounts" msgstr "_Spojit účty" -#: ../data/glade/accounts_window.glade.h:6 -msgid "_Enable link-local messaging" -msgstr "_Povolit lokální zprávy" +#. Rename +#: ../data/glade/accounts_window.glade.h:43 ../src/roster_window.py:2698 +msgid "Re_name" +msgstr "Přejme_novat" -#: ../data/glade/accounts_window.glade.h:7 -msgid "_Modify" -msgstr "_Upravit" +#: ../data/glade/accounts_window.glade.h:54 +#: ../data/glade/zeroconf_properties_window.glade.h:21 +msgid "Use custom port:" +msgstr "Použít vlastní port:" -#: ../data/glade/accounts_window.glade.h:8 -#: ../data/glade/remove_account_window.glade.h:4 -msgid "_Remove" -msgstr "Odst_ranit" +#: ../data/glade/accounts_window.glade.h:59 +msgid "gtk-add" +msgstr "" + +#: ../data/glade/accounts_window.glade.h:60 +msgid "gtk-close" +msgstr "" + +#: ../data/glade/accounts_window.glade.h:61 +msgid "gtk-remove" +msgstr "" #: ../data/glade/add_new_contact_window.glade.h:1 msgid "A_ccount:" @@ -535,7 +679,9 @@ msgstr "Popis" #: ../data/glade/advanced_configuration_window.glade.h:2 msgid "NOTE: You should restart Gajim for some settings to take effect" -msgstr "POZNÁMKA: Měl(a) by jste restartovat gajim, aby se projevila všechna nastavení" +msgstr "" +"POZNÁMKA: Měl(a) by jste restartovat gajim, aby se projevila všechna " +"nastavení" #: ../data/glade/advanced_configuration_window.glade.h:3 msgid "Advanced Configuration Editor" @@ -554,45 +700,41 @@ msgid "Deletes Message of the Day" msgstr "Smaže zprávu dne" #: ../data/glade/advanced_menuitem_menu.glade.h:3 +msgid "Edit _Privacy Lists" +msgstr "" + +#: ../data/glade/advanced_menuitem_menu.glade.h:4 msgid "Sends a message to users currently connected to this server" msgstr "Poslat zprávu momentálně připojeným uživatelům tohoto serveru" -#: ../data/glade/advanced_menuitem_menu.glade.h:4 +#: ../data/glade/advanced_menuitem_menu.glade.h:5 msgid "Set MOTD" msgstr "Nastavit MOTD" -#: ../data/glade/advanced_menuitem_menu.glade.h:5 +#: ../data/glade/advanced_menuitem_menu.glade.h:6 msgid "Sets Message of the Day" msgstr "Nastaví Zprávu dne" -#: ../data/glade/advanced_menuitem_menu.glade.h:6 +#: ../data/glade/advanced_menuitem_menu.glade.h:7 msgid "Show _XML Console" msgstr "Zobrazit _XML konzoli" -#: ../data/glade/advanced_menuitem_menu.glade.h:7 +#: ../data/glade/advanced_menuitem_menu.glade.h:8 msgid "Update MOTD" msgstr "Upravit MOTD" -#: ../data/glade/advanced_menuitem_menu.glade.h:8 +#: ../data/glade/advanced_menuitem_menu.glade.h:9 msgid "Updates Message of the Day" msgstr "Upraví Zprávu dne" -#: ../data/glade/advanced_menuitem_menu.glade.h:9 +#: ../data/glade/advanced_menuitem_menu.glade.h:10 msgid "_Administrator" msgstr "_Správce" -#: ../data/glade/advanced_menuitem_menu.glade.h:10 -msgid "_Privacy Lists" -msgstr "" - #: ../data/glade/advanced_menuitem_menu.glade.h:11 msgid "_Send Server Message" msgstr "Ode_slat zprávu serveru" -#: ../data/glade/advanced_menuitem_menu.glade.h:12 -msgid "_Send Single Message" -msgstr "Ode_slat jednoduchou zprávu" - #: ../data/glade/advanced_notifications_window.glade.h:1 msgid " a window/tab opened with that contact " msgstr "okno/žáložka otevřená s tímto kontaktem" @@ -623,8 +765,7 @@ msgid "All statuses" msgstr "Všechny stavy" #: ../data/glade/advanced_notifications_window.glade.h:8 -#: ../src/common/commands.py:91 -#: ../src/common/helpers.py:243 +#: ../src/common/commands.py:91 ../src/common/helpers.py:246 msgid "Away" msgstr "Pryč" @@ -641,7 +782,7 @@ msgid "Have " msgstr "Má" #: ../data/glade/advanced_notifications_window.glade.h:12 -#: ../src/common/helpers.py:253 +#: ../src/common/helpers.py:256 msgid "Invisible" msgstr "Neviditelný" @@ -650,7 +791,7 @@ msgid "Launch a command" msgstr "Provést příkaz" #: ../data/glade/advanced_notifications_window.glade.h:14 -#: ../src/common/helpers.py:226 +#: ../src/common/helpers.py:229 msgid "Not Available" msgstr "Nedostupný" @@ -691,8 +832,10 @@ msgid "When " msgstr "Když" #: ../data/glade/advanced_notifications_window.glade.h:27 -msgid "_Activate window manager's UrgencyHint to make chat window in taskbar flash" -msgstr "_Aktivuj UrgencyHint window manageru pro blikání okna rozhovoru v liště úloh" +msgid "" +"_Activate window manager's UrgencyHint to make chat window in taskbar flash" +msgstr "" +"_Aktivuj UrgencyHint window manageru pro blikání okna rozhovoru v liště úloh" #: ../data/glade/advanced_notifications_window.glade.h:28 msgid "_Disable auto opening chat window" @@ -741,7 +884,8 @@ msgid "" "everybody" msgstr "" "kontakty\n" -"skupiny\všichni" +"skupiny\n" +"šichni" #: ../data/glade/advanced_notifications_window.glade.h:41 msgid "for " @@ -771,6 +915,82 @@ msgstr "Přijat nový záznam" msgid "You have received new entry:" msgstr "Dostal(a) jste novou položku: " +#: ../data/glade/change_password_dialog.glade.h:1 +msgid "Change Password" +msgstr "Změnit heslo" + +#: ../data/glade/change_password_dialog.glade.h:2 +msgid "Enter it again for confirmation:" +msgstr "Zadejte znovu pro ověření:" + +#: ../data/glade/change_password_dialog.glade.h:3 +msgid "Enter new password:" +msgstr "Zadejte heslo:" + +#: ../data/glade/change_status_message_dialog.glade.h:1 +msgid "Type your new status message" +msgstr "Napište nový popis stavu" + +#: ../data/glade/change_status_message_dialog.glade.h:2 +msgid "Preset messages:" +msgstr "Uložené stavy:" + +# FIXME: not accurate +#: ../data/glade/change_status_message_dialog.glade.h:3 +msgid "Save as Preset..." +msgstr "Uložit stav..." + +#: ../data/glade/chat_context_menu.glade.h:2 +#: ../data/glade/chat_control_popup_menu.glade.h:5 +#: ../data/glade/gc_occupants_menu.glade.h:4 +#: ../data/glade/roster_contact_context_menu.glade.h:12 +msgid "_Add to Roster" +msgstr "Přid_at do Seznamu" + +#: ../data/glade/chat_context_menu.glade.h:3 +msgid "_Copy JID/Email Address" +msgstr "_Kopírovat JID/Emailovou adresu" + +#: ../data/glade/chat_context_menu.glade.h:4 +msgid "_Copy Link Location" +msgstr "_Kopírovat odkaz" + +#: ../data/glade/chat_context_menu.glade.h:5 +msgid "_Open Email Composer" +msgstr "_Otevři Emailový editor" + +#: ../data/glade/chat_context_menu.glade.h:6 +msgid "_Open Link in Browser" +msgstr "_Otevřít v prohlížeči" + +#: ../data/glade/chat_control_popup_menu.glade.h:1 +msgid "Click to see past conversations with this contact" +msgstr "Klikněte pro starší konverzaci s tímto kontaktem" + +#: ../data/glade/chat_control_popup_menu.glade.h:2 +msgid "Invite _Friends" +msgstr "" + +#: ../data/glade/chat_control_popup_menu.glade.h:3 +#: ../data/glade/gc_occupants_menu.glade.h:3 +#: ../data/glade/roster_contact_context_menu.glade.h:9 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:4 +msgid "Send _File" +msgstr "Odeslat _Soubor" + +#: ../data/glade/chat_control_popup_menu.glade.h:4 +msgid "Toggle Open_PGP Encryption" +msgstr "Přepnout Open_PGP šifrování" + +#: ../data/glade/chat_control_popup_menu.glade.h:6 +#: ../data/glade/gc_control_popup_menu.glade.h:7 +#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:6 +#: ../src/roster_window.py:2567 +msgid "_History" +msgstr "_Historie" + #: ../data/glade/data_form_window.glade.h:1 msgid "Fill in the form." msgstr "Vyplňte formulář." @@ -824,15 +1044,18 @@ msgid "Shows a list of file transfers between you and others" msgstr "Zobrazí výpis přenosů souborů mezi Vámi a ostatními" #: ../data/glade/filetransfers.glade.h:11 -msgid "This action removes single file transfer from the list. If the transfer is active, it is first stopped and then removed" -msgstr "Tato akce smaže jeden přenos souboru z výpisu. Pokud je přenos aktivní, bude nejdříve zastaven a potom smazán" +msgid "" +"This action removes single file transfer from the list. If the transfer is " +"active, it is first stopped and then removed" +msgstr "" +"Tato akce smaže jeden přenos souboru z výpisu. Pokud je přenos aktivní, bude " +"nejdříve zastaven a potom smazán" #: ../data/glade/filetransfers.glade.h:12 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:769 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:774 msgid "_Continue" msgstr "_Pokračovat" @@ -840,8 +1063,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:190 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:186 msgid "_Open Containing Folder" msgstr "_Otevřít obsahující složku" @@ -948,62 +1170,57 @@ msgid "Configure _Room" msgstr "Nastavit _místnost" #: ../data/glade/gc_control_popup_menu.glade.h:5 -msgid "_Bookmark This Room" +#, fuzzy +msgid "_Bookmark" msgstr "_Přidej do záložek" #: ../data/glade/gc_control_popup_menu.glade.h:6 -#: ../data/glade/chat_control_popup_menu.glade.h:5 -msgid "_Compact View Alt+C" -msgstr "_Zjednodušený pohled Alt+C" +msgid "_Destroy Room" +msgstr "" -#: ../data/glade/gc_control_popup_menu.glade.h:7 -#: ../data/glade/gc_occupants_menu.glade.h:5 -#: ../data/glade/chat_control_popup_menu.glade.h:6 -#: ../data/glade/roster_contact_context_menu.glade.h:13 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:6 -msgid "_History" -msgstr "_Historie" +#: ../data/glade/gc_control_popup_menu.glade.h:8 +#, fuzzy +msgid "_Manage Room" +msgstr "Spravuj záložky" + +#: ../data/glade/gc_control_popup_menu.glade.h:9 +msgid "_Minimize on close" +msgstr "" #: ../data/glade/gc_occupants_menu.glade.h:1 msgid "Mo_derator" msgstr "Mo_derátor" #: ../data/glade/gc_occupants_menu.glade.h:2 -#: ../data/glade/chat_context_menu.glade.h:2 -#: ../data/glade/chat_control_popup_menu.glade.h:4 -#: ../data/glade/roster_contact_context_menu.glade.h:10 -msgid "_Add to Roster" -msgstr "Přid_at do Seznamu" +#, fuzzy +msgid "Occupant Actions" +msgstr "_Akce účastníků" -#: ../data/glade/gc_occupants_menu.glade.h:3 +#: ../data/glade/gc_occupants_menu.glade.h:5 msgid "_Admin" msgstr "_Správce" -#: ../data/glade/gc_occupants_menu.glade.h:4 +#: ../data/glade/gc_occupants_menu.glade.h:6 msgid "_Ban" msgstr "_Zakázat" -#: ../data/glade/gc_occupants_menu.glade.h:6 +#: ../data/glade/gc_occupants_menu.glade.h:8 msgid "_Kick" msgstr "Vy_kopnout" -#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/gc_occupants_menu.glade.h:9 msgid "_Member" msgstr "Č_len" -#: ../data/glade/gc_occupants_menu.glade.h:8 -msgid "_Occupant Actions" -msgstr "_Akce účastníků" - -#: ../data/glade/gc_occupants_menu.glade.h:9 +#: ../data/glade/gc_occupants_menu.glade.h:10 msgid "_Owner" msgstr "_Vlastník" -#: ../data/glade/gc_occupants_menu.glade.h:10 +#: ../data/glade/gc_occupants_menu.glade.h:11 msgid "_Send Private Message" msgstr "_Odeslat soukromou zprávu" -#: ../data/glade/gc_occupants_menu.glade.h:11 +#: ../data/glade/gc_occupants_menu.glade.h:12 msgid "_Voice" msgstr "_Hlas" @@ -1011,14 +1228,12 @@ msgstr "_Hlas" msgid "Create new post" msgstr "Vytvoř nový zápis" -#: ../data/glade/groups_post_window.glade.h:2 -#: ../src/common/helpers.py:268 +#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:271 msgid "From" msgstr "Odesílatel" #. holds subject -#: ../data/glade/groups_post_window.glade.h:3 -#: ../src/history_manager.py:142 +#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:142 #: ../src/history_manager.py:173 msgid "Subject" msgstr "Předmět" @@ -1030,14 +1245,16 @@ msgid "" "You can select logs from the left and/or search database from below.\n" "\n" "WARNING:\n" -"If you plan to do massive deletions, please make sure Gajim is not running. Generally avoid deletions with contacts you currently chat with." +"If you plan to do massive deletions, please make sure Gajim is not running. " +"Generally avoid deletions with contacts you currently chat with." msgstr "" "Vítejte do Gajimova Správce Historie\n" "\n" "Můžete zvolit záznamy nalevo a/nebo prohledat databázi dole.\n" "\n" "VAROVÁNÍ:\n" -"Pokud plánujete rozsáhlé promazání, ujistěte se, že Gajim neběží. Obecně se vyvarujte mazání historie kontaktu, se kterým si právě píšete." +"Pokud plánujete rozsáhlé promazání, ujistěte se, že Gajim neběží. Obecně se " +"vyvarujte mazání historie kontaktu, se kterým si právě píšete." #: ../data/glade/history_manager.glade.h:7 msgid "Delete" @@ -1073,75 +1290,14 @@ msgid "Search" msgstr "Najít" #: ../data/glade/history_window.glade.h:5 +#: ../data/glade/zeroconf_information_window.glade.h:10 +msgid "_Log conversation history" +msgstr "_Zaznamenat historii konverzace" + +#: ../data/glade/history_window.glade.h:6 ../src/disco.py:1173 msgid "_Search" msgstr "_Najít" -#: ../data/glade/change_password_dialog.glade.h:1 -msgid "Change Password" -msgstr "Změnit heslo" - -#: ../data/glade/change_password_dialog.glade.h:2 -msgid "Enter it again for confirmation:" -msgstr "Zadejte znovu pro ověření:" - -#: ../data/glade/change_password_dialog.glade.h:3 -msgid "Enter new password:" -msgstr "Zadejte heslo:" - -#: ../data/glade/change_status_message_dialog.glade.h:1 -msgid "Type your new status message" -msgstr "Napište nový popis stavu" - -#: ../data/glade/change_status_message_dialog.glade.h:2 -msgid "Preset messages:" -msgstr "Uložené stavy:" - -# FIXME: not accurate -#: ../data/glade/change_status_message_dialog.glade.h:3 -msgid "Save as Preset..." -msgstr "Uložit stav..." - -#: ../data/glade/chat_context_menu.glade.h:1 -msgid "Join _Group Chat" -msgstr "Vstoupit do _Diskuze" - -#: ../data/glade/chat_context_menu.glade.h:3 -msgid "_Copy JID/Email Address" -msgstr "_Kopírovat JID/Emailovou adresu" - -#: ../data/glade/chat_context_menu.glade.h:4 -msgid "_Copy Link Location" -msgstr "_Kopírovat odkaz" - -#: ../data/glade/chat_context_menu.glade.h:5 -msgid "_Open Email Composer" -msgstr "_Otevři Emailový editor" - -#: ../data/glade/chat_context_menu.glade.h:6 -msgid "_Open Link in Browser" -msgstr "_Otevřít v prohlížeči" - -#: ../data/glade/chat_context_menu.glade.h:7 -#: ../data/glade/roster_window.glade.h:20 -#: ../data/glade/subscription_request_popup_menu.glade.h:1 -#: ../data/glade/systray_context_menu.glade.h:7 -msgid "_Start Chat" -msgstr "_Začít rozhovor" - -#: ../data/glade/chat_control_popup_menu.glade.h:1 -msgid "Click to see past conversations with this contact" -msgstr "Klikněte pro starší konverzaci s tímto kontaktem" - -#: ../data/glade/chat_control_popup_menu.glade.h:2 -#: ../data/glade/roster_contact_context_menu.glade.h:8 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:4 -msgid "Send _File" -msgstr "Odeslat _Soubor" - -#: ../data/glade/chat_control_popup_menu.glade.h:3 -msgid "Toggle Open_PGP Encryption" -msgstr "Přepnout Open_PGP šifrování" - #: ../data/glade/invitation_received_dialog.glade.h:1 msgid "Accept" msgstr "Přijmout" @@ -1155,8 +1311,7 @@ msgstr "Odmítnout" msgid "Invitation Received" msgstr "Přijata pozvánka" -#: ../data/glade/join_groupchat_window.glade.h:1 -#: ../src/dialogs.py:1148 +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1264 msgid "Join Group Chat" msgstr "Připojit se do diskuze" @@ -1165,14 +1320,14 @@ msgid "Join this room automatically when I connect" msgstr "Připoj se do této místnosti automaticky po připojení" #: ../data/glade/join_groupchat_window.glade.h:3 -#: ../data/glade/manage_bookmarks_window.glade.h:4 +#: ../data/glade/manage_bookmarks_window.glade.h:5 #: ../data/glade/profile_window.glade.h:24 -#: ../data/glade/vcard_information_window.glade.h:29 +#: ../data/glade/vcard_information_window.glade.h:31 msgid "Nickname:" msgstr "Přezdívka:" #: ../data/glade/join_groupchat_window.glade.h:4 -#: ../data/glade/manage_bookmarks_window.glade.h:5 +#: ../data/glade/manage_bookmarks_window.glade.h:6 msgid "Password:" msgstr "Heslo:" @@ -1181,13 +1336,12 @@ msgid "Recently:" msgstr "Nedávno:" #: ../data/glade/join_groupchat_window.glade.h:6 -#: ../data/glade/manage_bookmarks_window.glade.h:7 +#: ../data/glade/manage_bookmarks_window.glade.h:8 msgid "Room:" msgstr "Místnost:" -#: ../data/glade/join_groupchat_window.glade.h:7 -#: ../src/disco.py:1163 -#: ../src/disco.py:1546 +#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1161 +#: ../src/disco.py:1616 msgid "_Join" msgstr "_Vstoupit" @@ -1207,15 +1361,19 @@ msgstr "Pokud je zaškrtnuto, Gajim se připojí do této místnosti při spušt msgid "Manage Bookmarks" msgstr "Spravuj záložky" -#: ../data/glade/manage_bookmarks_window.glade.h:6 +#: ../data/glade/manage_bookmarks_window.glade.h:4 +msgid "Minimize on Auto Join" +msgstr "" + +#: ../data/glade/manage_bookmarks_window.glade.h:7 msgid "Print status:" msgstr "Vypiš stav:" -#: ../data/glade/manage_bookmarks_window.glade.h:8 +#: ../data/glade/manage_bookmarks_window.glade.h:9 msgid "Server:" msgstr "Server:" -#: ../data/glade/manage_bookmarks_window.glade.h:9 +#: ../data/glade/manage_bookmarks_window.glade.h:10 msgid "Title:" msgstr "Titul:" @@ -1241,10 +1399,14 @@ msgstr "Spravuj profily Proxy" #: ../data/glade/manage_proxies_window.glade.h:6 #: ../data/glade/profile_window.glade.h:23 -#: ../data/glade/vcard_information_window.glade.h:28 +#: ../data/glade/vcard_information_window.glade.h:30 msgid "Name:" msgstr "Jméno:" +#: ../data/glade/manage_proxies_window.glade.h:7 +msgid "Pass_word:" +msgstr "He_slo:" + #: ../data/glade/manage_proxies_window.glade.h:8 msgid "Type:" msgstr "Typ:" @@ -1253,18 +1415,21 @@ msgstr "Typ:" msgid "Use authentication" msgstr "Použij autentifikaci" +#: ../data/glade/manage_proxies_window.glade.h:10 +msgid "_Host:" +msgstr "_Počítač:" + #: ../data/glade/message_window.glade.h:1 msgid "Click to insert an emoticon (Alt+M)" msgstr "Klikni pro vložení smajlíku (Alt+M)" -#: ../data/glade/message_window.glade.h:2 -#: ../src/chat_control.py:1113 +#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1206 msgid "OpenPGP Encryption" msgstr "OpenPGP Šifrování" #. 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:4 -#: ../data/glade/roster_window.glade.h:10 +#: ../data/glade/roster_window.glade.h:12 #: ../data/glade/subscription_request_window.glade.h:6 msgid "_Actions" msgstr "_Akce" @@ -1272,7 +1437,7 @@ msgstr "_Akce" #. 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:6 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:253 +#: ../src/filetransfers_window.py:243 msgid "_Send" msgstr "Ode_slat" @@ -1333,7 +1498,8 @@ msgstr "Povolit odeslání informace o _OS" #: ../data/glade/preferences_window.glade.h:17 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" -msgstr "Povolit popup/upozornění pokud jsem _pryč/nedostupný/nerušit/neviditelný" +msgstr "" +"Povolit popup/upozornění pokud jsem _pryč/nedostupný/nerušit/neviditelný" #: ../data/glade/preferences_window.glade.h:18 msgid "Also known as iChat style" @@ -1344,8 +1510,13 @@ msgid "Always check to see if Gajim is the _default Jabber client on startup" msgstr "Vždy při startu zkontroluj, zda je Gajim _výchozí Jabber klient" #: ../data/glade/preferences_window.glade.h:20 -msgid "An example: If you have enabled status message for away, Gajim won't ask you anymore for a status message when you change your status to away; it will use the default one set here" -msgstr "Příklad: Pokud povolíš stavovou zprávu pro pryč, Gajim se nadále nebude ptát na text zprávy když se přepneš do pryč; použije tady uvedenou zprávu" +msgid "" +"An example: If you have enabled status message for away, Gajim won't ask you " +"anymore for a status message when you change your status to away; it will " +"use the default one set here" +msgstr "" +"Příklad: Pokud povolíš stavovou zprávu pro pryč, Gajim se nadále nebude ptát " +"na text zprávy když se přepneš do pryč; použije tady uvedenou zprávu" #: ../data/glade/preferences_window.glade.h:21 msgid "Ask status message when I:" @@ -1374,13 +1545,18 @@ msgstr "" "Vlastní" #: ../data/glade/preferences_window.glade.h:29 -#: ../src/chat_control.py:856 msgid "Chat" msgstr "Rozhovor" #: ../data/glade/preferences_window.glade.h:30 -msgid "Check this option, only if someone you don't have in the roster spams/annoys you. Use with caution, because it blocks all messages from any contact that is not in the roster" -msgstr "Zaškrtněte pouze pokud Vás obtěžuje někdo, koho nemáte v rosteru. Použijte s rozvahou, protože tato volba zakáže všechny zprávy od kontaktů, které ještě nemáte v rosteru" +msgid "" +"Check this option, only if someone you don't have in the roster spams/annoys " +"you. Use with caution, because it blocks all messages from any contact that " +"is not in the roster" +msgstr "" +"Zaškrtněte pouze pokud Vás obtěžuje někdo, koho nemáte v rosteru. Použijte s " +"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:31 msgid "Configure color and font of the interface" @@ -1433,66 +1609,122 @@ msgid "Events" msgstr "Události" #: ../data/glade/preferences_window.glade.h:44 -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 display in chat windows." -msgstr "Gajim umí ohlašovat svoji schopnost posílat a přijímat meta-informace vztahující se k rozhovoru. Tady můžete nastavit, které stavy rozhovoru chcete zobrazovat v oknech rozhovoru." +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 " +"display in chat windows." +msgstr "" +"Gajim umí ohlašovat svoji schopnost posílat a přijímat meta-informace " +"vztahující se k rozhovoru. Tady můžete nastavit, které stavy rozhovoru " +"chcete zobrazovat v oknech rozhovoru." #: ../data/glade/preferences_window.glade.h:45 -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 send to the other party." -msgstr "Gajim umí ohlašovat svoji schopnost posílat a přijímat meta-informace vztahující se k rozhovoru. Tady můžete nastavit, které stavy rozhovoru chcete posílat svému protějšku." +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 " +"send to the other party." +msgstr "" +"Gajim umí ohlašovat svoji schopnost posílat a přijímat meta-informace " +"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:46 -msgid "Gajim will automatically show new events by popping up the relevant window" +msgid "" +"Gajim will automatically show new events by popping up the relevant window" msgstr "Gajim automaticky zobrazí nové události vyskočením příslušného okna" #: ../data/glade/preferences_window.glade.h:47 -msgid "Gajim will notify you for new events via a popup in the bottom right of the screen" -msgstr "Gajim Vás upozorní o nové zprávě pomocí popupu v pravém dolním rohu obrazovky" +msgid "" +"Gajim will notify you for new events via a popup in the bottom right of the " +"screen" +msgstr "" +"Gajim Vás upozorní o nové zprávě pomocí popupu v pravém dolním rohu obrazovky" #: ../data/glade/preferences_window.glade.h:48 -msgid "Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed in" -msgstr "Gajim Vás upozorní o nově připojených kontaktech pomocí popupu v pravém dolním rohu obrazovky" +msgid "" +"Gajim will notify you via a popup window in the bottom right of the screen " +"about contacts that just signed in" +msgstr "" +"Gajim Vás upozorní o nově připojených kontaktech pomocí popupu v pravém " +"dolním rohu obrazovky" #: ../data/glade/preferences_window.glade.h:49 -msgid "Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed out" -msgstr "Gajim Vás upozorní o přávě odpojených kontaktech pomocí popupu v pravém dolním rohu obrazovky" +msgid "" +"Gajim will notify you via a popup window in the bottom right of the screen " +"about contacts that just signed out" +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:50 -msgid "Gajim will only change the icon of the contact that triggered the new event" +msgid "" +"Gajim will only change the icon of the contact that triggered the new event" msgstr "Gajim pouze změní ikonu kontaktu, který vyvolal novou událost" #: ../data/glade/preferences_window.glade.h:52 -msgid "If checked, Gajim will also include information about the sender of the new emails" -msgstr "Pokud zaškrtnuto, Gajim uvede také informaci o odesilateli zprávy nového emailu" +#, fuzzy +msgid "Hides buttons in chatwindows to " +msgstr "Skryje tlačítka v okně diskuze." #: ../data/glade/preferences_window.glade.h:53 -msgid "If checked, Gajim will display avatars of contacts in roster window and in group chats" -msgstr "Pokud zaškrtnuto, Gajim bude zobrazovat avatary kontaktů v okně Seznamu a v diskuzích" +msgid "" +"If checked, Gajim will also include information about the sender of the new " +"emails" +msgstr "" +"Pokud zaškrtnuto, Gajim uvede také informaci o odesilateli zprávy nového " +"emailu" #: ../data/glade/preferences_window.glade.h:54 -msgid "If checked, Gajim will display status messages of contacts under the contact name in roster window and in group chats" -msgstr "Pokud zaškrtnuto, Gajim bude zobrazovat popisy stavů kontaktů pod jménem v okně Seznamu a v diskuzích" +msgid "" +"If checked, Gajim will display avatars of contacts in roster window and in " +"group chats" +msgstr "" +"Pokud zaškrtnuto, Gajim bude zobrazovat avatary kontaktů v okně Seznamu a v " +"diskuzích" #: ../data/glade/preferences_window.glade.h:55 -msgid "If checked, Gajim will remember the roster and chat window positions in the screen and the sizes of them next time you run it" -msgstr "Pokud bude zaškrtnuto, Gajim si bude pamatovat polohy a velikosti Seznamu a oken rozhovorů po příštím spuštění" +msgid "" +"If checked, Gajim will display status messages of contacts under the contact " +"name in roster window and in group chats" +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:56 -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, etc...)" -msgstr "Pokud zaškrtnuto, Gajim použije ikony specifické pro protokol (např. kontakt z MSN bude mít odpovídající ikonu msn pro stavy připojen, pryč, nerušit, atd...)" +msgid "" +"If checked, Gajim will remember the roster and chat window positions in the " +"screen and the sizes of them next time you run it" +msgstr "" +"Pokud bude zaškrtnuto, Gajim si bude pamatovat polohy a velikosti Seznamu a " +"oken rozhovorů po příštím spuštění" #: ../data/glade/preferences_window.glade.h:57 -msgid "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons" -msgstr "Pokud zaškrtnuto, Gajim nahradí ascii smajlíky jako ':)' za ekvivalentní animované nebo statické grafické smajlíky" +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, " +"etc...)" +msgstr "" +"Pokud zaškrtnuto, Gajim použije ikony specifické pro protokol (např. kontakt " +"z MSN bude mít odpovídající ikonu msn pro stavy připojen, pryč, nerušit, " +"atd...)" #: ../data/glade/preferences_window.glade.h:58 +msgid "" +"If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " +"animated or static graphical emoticons" +msgstr "" +"Pokud zaškrtnuto, Gajim nahradí ascii smajlíky jako ':)' za ekvivalentní " +"animované nebo statické grafické smajlíky" + +#: ../data/glade/preferences_window.glade.h:59 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:59 +#: ../data/glade/preferences_window.glade.h:60 msgid "Ma_nage..." msgstr "Sp_ravovat..." -#: ../data/glade/preferences_window.glade.h:60 +#: ../data/glade/preferences_window.glade.h:61 msgid "" "Never\n" "Always\n" @@ -1504,183 +1736,205 @@ msgstr "" "Podle účtu\n" "Podle typu" -#: ../data/glade/preferences_window.glade.h:64 +#: ../data/glade/preferences_window.glade.h:65 msgid "Notify me about contacts that: " msgstr "Upozorni mě na kontakty které se: " -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:66 msgid "Notify on new _GMail email" msgstr "Upozorni při novém _GMail emailu" -#: ../data/glade/preferences_window.glade.h:66 +#: ../data/glade/preferences_window.glade.h:67 msgid "On every _message" msgstr "Při každé _zprávě" -#: ../data/glade/preferences_window.glade.h:67 +#: ../data/glade/preferences_window.glade.h:68 msgid "One message _window:" msgstr "_Okno jednoduché zprávy:" -#: ../data/glade/preferences_window.glade.h:68 +#: ../data/glade/preferences_window.glade.h:69 msgid "Outgoing Chat state noti_fications:" msgstr "Odchozí události stavu rozhovoru:" -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:70 msgid "Play _sounds" msgstr "Přehrávat _zvuky" -#: ../data/glade/preferences_window.glade.h:70 +#: ../data/glade/preferences_window.glade.h:71 msgid "Preferences" msgstr "Nastavení" -#: ../data/glade/preferences_window.glade.h:71 +#: ../data/glade/preferences_window.glade.h:72 msgid "Print time:" msgstr "Čas tisku:" -#: ../data/glade/preferences_window.glade.h:72 +#: ../data/glade/preferences_window.glade.h:73 msgid "Save _position and size for roster and chat windows" msgstr "Uložit _pozici a velikost pro seznam a okna rozhovorů" -#: ../data/glade/preferences_window.glade.h:73 -msgid "Set status message to reflect currently playing _music track" -msgstr "Nastav stavouvou zprávu, aby odrážela momentálně přehrávanou _hudební stopu" - #: ../data/glade/preferences_window.glade.h:74 +msgid "Set status message to reflect currently playing _music track" +msgstr "" +"Nastav stavouvou zprávu, aby odrážela momentálně přehrávanou _hudební stopu" + +#: ../data/glade/preferences_window.glade.h:75 msgid "Show only in _roster" msgstr "Zobrazit pouze v _Seznamu" -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:76 msgid "Sign _in" msgstr "_Přihlásí" -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:77 msgid "Sign _out" msgstr "_Odhlásí" -#: ../data/glade/preferences_window.glade.h:77 -msgid "Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text." -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:78 +msgid "" +"Some messages may include rich content (formatting, colors etc). If checked, " +"Gajim will just display the raw message text." +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:79 msgid "Status" msgstr "Stav" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:80 msgid "T_heme:" msgstr "_Téma:" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:81 msgid "The auto away status message" msgstr "Text stavu automaticky pryč" -#: ../data/glade/preferences_window.glade.h:81 +#: ../data/glade/preferences_window.glade.h:82 msgid "The auto not available status message" msgstr "Text stavu nedostupný" -#: ../data/glade/preferences_window.glade.h:82 +#: ../data/glade/preferences_window.glade.h:83 msgid "Treat all incoming messages as:" msgstr "Považovat všechny příchozí zprávy za: " -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:84 msgid "Use _transports iconsets" msgstr "Používej ikony _transportů" -#: ../data/glade/preferences_window.glade.h:84 +#: ../data/glade/preferences_window.glade.h:85 msgid "Use system _default" msgstr "Použij nastavení _systému" -#: ../data/glade/preferences_window.glade.h:85 +#: ../data/glade/preferences_window.glade.h:86 msgid "Use t_rayicon (aka. notification area icon)" msgstr "_Ikona v systrayi (jinak řečeno v oznamovací oblasti)" -#: ../data/glade/preferences_window.glade.h:86 -msgid "When a new event (message, file transfer request etc..) is received, the following methods may be used to inform you about it. Please note that events about new messages only occur if it is a new message from a contact you are not already chatting with" -msgstr "Když nová událost (zpráva, žádost o přenos souboru, a podobně) je přijata, následující metody Vás mohou upozornit. Vězte prosím, že událost přijetí nové zprávy nastane pouze tehdy, pokud je od kontaktu, se kterým už nehovoříte" - #: ../data/glade/preferences_window.glade.h:87 +msgid "" +"When a new event (message, file transfer request etc..) is received, the " +"following methods may be used to inform you about it. Please note that " +"events about new messages only occur if it is a new message from a contact " +"you are not already chatting with" +msgstr "" +"Když nová událost (zpráva, žádost o přenos souboru, a podobně) je přijata, " +"následující metody Vás mohou upozornit. Vězte prosím, že událost přijetí " +"nové zprávy nastane pouze tehdy, pokud je od kontaktu, se kterým už " +"nehovoříte" + +#: ../data/glade/preferences_window.glade.h:88 msgid "When new event is received" msgstr "Když je přijata nová zpráva" -#: ../data/glade/preferences_window.glade.h:88 -msgid "Works for Rhythmbox and Muine players. For more players, please visit http://trac.gajim.org/wiki/GajimAndMusicPlayer" -msgstr "Pracuje s Rhythmbox a Munie přehrávači. Pro jiné přehrávače, navštivte http://trac.gajim.org/wiki/GajimAndMusicPlayer" - #: ../data/glade/preferences_window.glade.h:89 +msgid "" +"Works for Rhythmbox and Muine players. For more players, please visit http://" +"trac.gajim.org/wiki/GajimAndMusicPlayer" +msgstr "" +"Pracuje s Rhythmbox a Munie přehrávači. Pro jiné přehrávače, navštivte " +"http://trac.gajim.org/wiki/GajimAndMusicPlayer" + +#: ../data/glade/preferences_window.glade.h:90 msgid "_Advanced Notifications Control..." msgstr "_Správa pokročilých notifikací..." -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:91 msgid "_Browser:" msgstr "_Prohlížeč:" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:92 msgid "_File manager:" msgstr "_Správce souborů:" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:93 msgid "_Font:" msgstr "_Písmo:" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:94 msgid "_Highlight misspelled words" msgstr "Zvýrazňovat _slova s překlepy" -#: ../data/glade/preferences_window.glade.h:94 +#: ../data/glade/preferences_window.glade.h:95 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:95 +#: ../data/glade/preferences_window.glade.h:96 msgid "_Incoming message:" msgstr "_Příchozí zpráva:" -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:97 msgid "_Log status changes of contacts" msgstr "Zaznamenávat změny _stavu kontaktů" -#: ../data/glade/preferences_window.glade.h:97 +#: ../data/glade/preferences_window.glade.h:98 msgid "_Mail client:" msgstr "E-_mailový klient:" -#: ../data/glade/preferences_window.glade.h:98 +#: ../data/glade/preferences_window.glade.h:99 +#, fuzzy +msgid "_Make message windows compact" +msgstr "_Okno jednoduché zprávy:" + +#: ../data/glade/preferences_window.glade.h:100 msgid "_Never" msgstr "_Nikdy" -#: ../data/glade/preferences_window.glade.h:99 +#: ../data/glade/preferences_window.glade.h:101 msgid "_Notify me about it" msgstr "_Upozornit mě" -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:102 msgid "_Open..." msgstr "_Otevřít..." -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:103 msgid "_Outgoing message:" msgstr "_Odchozí zpráva:" -#: ../data/glade/preferences_window.glade.h:102 +#: ../data/glade/preferences_window.glade.h:104 msgid "_Player:" msgstr "_Přehrávač:" -#: ../data/glade/preferences_window.glade.h:103 +#: ../data/glade/preferences_window.glade.h:105 msgid "_Pop it up" msgstr "Zobrazit o_kno se zprávou" -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:106 msgid "_Reset to Default Colors" msgstr "_Vrátit k výchozím barvám" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:107 msgid "_Sort contacts by status" msgstr "_Seřadit podle stavu" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:108 msgid "_Status message:" msgstr "_Stav:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:109 msgid "_URL:" msgstr "_URL:" -#: ../data/glade/preferences_window.glade.h:108 +#: ../data/glade/preferences_window.glade.h:110 msgid "minutes" msgstr "minutách" @@ -1724,8 +1978,7 @@ msgstr "Jabber ID" msgid "Order:" msgstr "Pořadí:" -#: ../data/glade/privacy_list_window.glade.h:11 -#: ../src/dialogs.py:1862 +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2097 msgid "Privacy List" msgstr "" @@ -1802,111 +2055,104 @@ msgid "Company:" msgstr "Společnost:" #: ../data/glade/profile_window.glade.h:9 -#: ../data/glade/vcard_information_window.glade.h:13 +#: ../data/glade/vcard_information_window.glade.h:14 msgid "Country:" msgstr "Země:" #: ../data/glade/profile_window.glade.h:10 -#: ../data/glade/vcard_information_window.glade.h:14 +#: ../data/glade/vcard_information_window.glade.h:15 msgid "Department:" msgstr "Oddělení:" -#: ../data/glade/profile_window.glade.h:11 -#: ../data/glade/vcard_information_window.glade.h:15 -#: ../data/glade/zeroconf_information_window.glade.h:2 -#: ../data/glade/zeroconf_properties_window.glade.h:5 -msgid "E-Mail:" -msgstr "E-Mail:" - #: ../data/glade/profile_window.glade.h:12 -#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/vcard_information_window.glade.h:17 msgid "Extra Address:" msgstr "Další adresa:" #. Family Name #: ../data/glade/profile_window.glade.h:14 -#: ../data/glade/vcard_information_window.glade.h:18 +#: ../data/glade/vcard_information_window.glade.h:19 msgid "Family:" msgstr "Příjmení:" #. Do NOT change sequence. Just translate YYYY and MM and DD (from Year, Month, Day accordingly) #: ../data/glade/profile_window.glade.h:16 -#: ../data/glade/vcard_information_window.glade.h:20 +#: ../data/glade/vcard_information_window.glade.h:21 msgid "Format: YYYY-MM-DD" msgstr "Formát: RRRR-MM-DD" -#. Given Name -#: ../data/glade/profile_window.glade.h:18 +#: ../data/glade/profile_window.glade.h:17 #: ../data/glade/vcard_information_window.glade.h:22 +#, fuzzy +msgid "Full Name" +msgstr "Jméno" + +#. Given Name +#: ../data/glade/profile_window.glade.h:19 +#: ../data/glade/vcard_information_window.glade.h:24 msgid "Given:" msgstr "Křestní:" -#: ../data/glade/profile_window.glade.h:19 -#: ../data/glade/vcard_information_window.glade.h:23 +#: ../data/glade/profile_window.glade.h:20 +#: ../data/glade/vcard_information_window.glade.h:25 msgid "Homepage:" msgstr "Dom. stránka:" #. Middle Name -#: ../data/glade/profile_window.glade.h:21 -#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/profile_window.glade.h:22 +#: ../data/glade/vcard_information_window.glade.h:28 msgid "Middle:" msgstr "Střední:" -#: ../data/glade/profile_window.glade.h:22 -#: ../data/glade/vcard_information_window.glade.h:27 -msgid "More" -msgstr "Více" - #: ../data/glade/profile_window.glade.h:25 -#: ../data/glade/vcard_information_window.glade.h:31 +#: ../data/glade/vcard_information_window.glade.h:34 msgid "Personal Info" msgstr "Osobní údaje" #: ../data/glade/profile_window.glade.h:27 -#: ../data/glade/vcard_information_window.glade.h:32 +#: ../data/glade/vcard_information_window.glade.h:35 msgid "Phone No.:" msgstr "Telefon:" #: ../data/glade/profile_window.glade.h:28 -#: ../data/glade/vcard_information_window.glade.h:33 +#: ../data/glade/vcard_information_window.glade.h:36 msgid "Position:" msgstr "Pozice:" #: ../data/glade/profile_window.glade.h:29 -#: ../data/glade/vcard_information_window.glade.h:34 +#: ../data/glade/vcard_information_window.glade.h:37 msgid "Postal Code:" msgstr "PSČ:" #. Prefix in Name #: ../data/glade/profile_window.glade.h:31 -#: ../data/glade/vcard_information_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:39 msgid "Prefix:" msgstr "Titul:" #: ../data/glade/profile_window.glade.h:32 -#: ../data/glade/vcard_information_window.glade.h:38 -#: ../src/vcard.py:273 +#: ../data/glade/vcard_information_window.glade.h:41 ../src/vcard.py:302 msgid "Role:" msgstr "Postavení:" #: ../data/glade/profile_window.glade.h:33 -#: ../data/glade/vcard_information_window.glade.h:39 +#: ../data/glade/vcard_information_window.glade.h:42 msgid "State:" msgstr "Stát:" #: ../data/glade/profile_window.glade.h:34 -#: ../data/glade/vcard_information_window.glade.h:41 +#: ../data/glade/vcard_information_window.glade.h:44 msgid "Street:" msgstr "Ulice:" #. Suffix in Name #: ../data/glade/profile_window.glade.h:36 -#: ../data/glade/vcard_information_window.glade.h:45 +#: ../data/glade/vcard_information_window.glade.h:48 msgid "Suffix:" msgstr "Za jménem:" #: ../data/glade/profile_window.glade.h:37 -#: ../data/glade/vcard_information_window.glade.h:46 +#: ../data/glade/vcard_information_window.glade.h:50 msgid "Work" msgstr "Práce" @@ -1922,6 +2168,16 @@ msgstr "Odstranit účet _pouze z Gajimu" msgid "Remove account from Gajim and from _server" msgstr "Odstranit účet z Gajimu i ze _serveru" +#. Remove +#. Remove group +#. Remove +#: ../data/glade/remove_account_window.glade.h:4 +#: ../data/glade/roster_contact_context_menu.glade.h:18 +#: ../src/roster_window.py:2524 ../src/roster_window.py:2734 +#: ../src/roster_window.py:2870 +msgid "_Remove" +msgstr "Odst_ranit" + #: ../data/glade/roster_contact_context_menu.glade.h:1 msgid "A_sk to see his/her status" msgstr "Požádat o zobrazení je(jí)ho _stavu" @@ -1936,58 +2192,81 @@ msgstr "Přidat zvláštní _upozornění" msgid "Assign Open_PGP Key" msgstr "Přiřadit Open_PGP klíč" +#. Edit Groups #: ../data/glade/roster_contact_context_menu.glade.h:4 #: ../data/glade/zeroconf_contact_context_menu.glade.h:3 -#: ../src/roster_window.py:2075 +#: ../src/roster_window.py:2497 msgid "Edit _Groups" msgstr "Upravit _skupiny" +#. Execute Command #: ../data/glade/roster_contact_context_menu.glade.h:5 -#: ../src/roster_window.py:2210 +#: ../src/roster_window.py:2827 msgid "Execute Command..." msgstr "Provést příkaz..." +#. Invite to Groupchat #: ../data/glade/roster_contact_context_menu.glade.h:6 -#: ../src/roster_window.py:2033 +#: ../src/roster_window.py:2440 msgid "In_vite to" msgstr "_Pozvat do" +#. Send Custom Status #: ../data/glade/roster_contact_context_menu.glade.h:7 +#: ../src/roster_window.py:2664 ../src/roster_window.py:2798 +#, fuzzy +msgid "Send Cus_tom Status" +msgstr "Poslat vlastní XML" + +#: ../data/glade/roster_contact_context_menu.glade.h:8 #: ../data/glade/systray_context_menu.glade.h:2 msgid "Send Single _Message" msgstr "Odeslat jednoduchou _zprávu" -#: ../data/glade/roster_contact_context_menu.glade.h:9 +#: ../data/glade/roster_contact_context_menu.glade.h:10 +msgid "Set Custom _Avatar" +msgstr "" + +#: ../data/glade/roster_contact_context_menu.glade.h:11 #: ../data/glade/zeroconf_contact_context_menu.glade.h:5 msgid "Start _Chat" msgstr "Začít _rozhovor" -#: ../data/glade/roster_contact_context_menu.glade.h:11 +#: ../data/glade/roster_contact_context_menu.glade.h:13 msgid "_Allow him/her to see my status" msgstr "_Dovol kontaktu vidět můj stav" -#: ../data/glade/roster_contact_context_menu.glade.h:12 +#: ../data/glade/roster_contact_context_menu.glade.h:14 +#: ../src/roster_window.py:2514 ../src/roster_window.py:2725 +msgid "_Block" +msgstr "" + +#: ../data/glade/roster_contact_context_menu.glade.h:15 msgid "_Forbid him/her to see my status" msgstr "_Zakaž mu/jí vidět můj stav" -#. Remove group -#: ../data/glade/roster_contact_context_menu.glade.h:14 -#: ../src/roster_window.py:2027 -#: ../src/roster_window.py:2124 -#: ../src/roster_window.py:2231 -msgid "_Remove from Roster" -msgstr "Odst_ranit ze Seznamu" - -#: ../data/glade/roster_contact_context_menu.glade.h:15 +#: ../data/glade/roster_contact_context_menu.glade.h:17 #: ../data/glade/zeroconf_contact_context_menu.glade.h:7 -#: ../src/roster_window.py:2219 +#, fuzzy +msgid "_Manage Contact" +msgstr "Přejmenovat kontakt" + +#. Rename +#: ../data/glade/roster_contact_context_menu.glade.h:19 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:8 +#: ../src/roster_window.py:2854 msgid "_Rename" msgstr "_Přejmenovat" -#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/roster_contact_context_menu.glade.h:20 msgid "_Subscription" msgstr "_Autorizace" +#: ../data/glade/roster_contact_context_menu.glade.h:21 +#: ../src/roster_window.py:2508 ../src/roster_window.py:2719 +msgid "_Unblock" +msgstr "" + #: ../data/glade/roster_window.glade.h:1 msgid "A_ccounts" msgstr "Úč_ty" @@ -1997,61 +2276,63 @@ msgid "Add _Contact" msgstr "Přidat _kontakt" #: ../data/glade/roster_window.glade.h:3 +#, fuzzy +msgid "Fea_tures" +msgstr "Vlastnosti serveru" + +#: ../data/glade/roster_window.glade.h:4 msgid "File _Transfers" msgstr "_Přenosy souborů" -#: ../data/glade/roster_window.glade.h:4 +#: ../data/glade/roster_window.glade.h:5 msgid "Frequently Asked Questions (online)" msgstr "Často kladené dotazy - FAQ (online)" -#: ../data/glade/roster_window.glade.h:6 +#: ../data/glade/roster_window.glade.h:7 msgid "Help online" msgstr "Nápověda online" -#: ../data/glade/roster_window.glade.h:7 +#: ../data/glade/roster_window.glade.h:9 msgid "Profile, A_vatar" msgstr "Profil, A_vatar" -#: ../data/glade/roster_window.glade.h:8 +#: ../data/glade/roster_window.glade.h:10 msgid "Show Trans_ports" msgstr "Zobrazuj trans_porty" -#: ../data/glade/roster_window.glade.h:9 +#: ../data/glade/roster_window.glade.h:11 msgid "Show _Offline Contacts" msgstr "Zobrazit _odpojené kontakty" -#: ../data/glade/roster_window.glade.h:12 +#: ../data/glade/roster_window.glade.h:14 msgid "_Contents" msgstr "_Obsah" -# FIXME: chtelo by to cesky vyraz pro service discovery -#: ../data/glade/roster_window.glade.h:13 -msgid "_Discover Services" -msgstr "_Prohlížet služby" - -#: ../data/glade/roster_window.glade.h:14 -#: ../src/disco.py:1284 -#: ../src/roster_window.py:2202 +#: ../data/glade/roster_window.glade.h:16 ../src/disco.py:1349 msgid "_Edit" msgstr "_Úpravy" -#: ../data/glade/roster_window.glade.h:15 +#: ../data/glade/roster_window.glade.h:17 msgid "_FAQ" msgstr "_FAQ" -#: ../data/glade/roster_window.glade.h:17 +#: ../data/glade/roster_window.glade.h:18 msgid "_Help" msgstr "_Nápověda" -#: ../data/glade/roster_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:19 msgid "_Preferences" msgstr "_Nastavení" -#: ../data/glade/roster_window.glade.h:19 +#: ../data/glade/roster_window.glade.h:20 msgid "_Quit" msgstr "_Konec" #: ../data/glade/roster_window.glade.h:21 +msgid "_Send Single Message" +msgstr "Ode_slat jednoduchou zprávu" + +#: ../data/glade/roster_window.glade.h:23 msgid "_View" msgstr "_Zobraz" @@ -2128,7 +2409,9 @@ msgid "Authorize contact so he or she can know when you're connected" msgstr "Autorizovat kontakt, aby věděl kdy jsi připojený(á)" #: ../data/glade/subscription_request_window.glade.h:3 -msgid "Deny authorization from contact so he or she cannot know when you're connected" +msgid "" +"Deny authorization from contact so he or she cannot know when you're " +"connected" msgstr "Odmítne autorizaci od kontaktu, takže nezjistí kdy jste připojen(a)" #: ../data/glade/subscription_request_window.glade.h:4 @@ -2155,6 +2438,10 @@ msgstr "Zobrazit _Seznam" msgid "Sta_tus" msgstr "S_tav" +#: ../data/glade/systray_context_menu.glade.h:6 +msgid "_Group Chat" +msgstr "_Diskuze" + #. Given Name #: ../data/glade/vcard_information_window.glade.h:5 msgid "Ask:" @@ -2169,44 +2456,46 @@ msgid "Comments" msgstr "Vlastní poznámky" #: ../data/glade/vcard_information_window.glade.h:11 +#, fuzzy +msgid "Configured avatar:" +msgstr "Nastavit _místnost" + +#: ../data/glade/vcard_information_window.glade.h:12 #: ../data/glade/zeroconf_information_window.glade.h:1 msgid "Contact" msgstr "Kontakt" -#: ../data/glade/vcard_information_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:13 msgid "Contact Information" msgstr "Informace o kontaktu" -#: ../data/glade/vcard_information_window.glade.h:24 -#: ../data/glade/zeroconf_information_window.glade.h:4 -#: ../data/glade/zeroconf_properties_window.glade.h:13 -#: ../src/dialogs.py:416 -msgid "Jabber ID:" -msgstr "Jabber ID:" +#: ../data/glade/vcard_information_window.glade.h:29 +msgid "More" +msgstr "Více" -#: ../data/glade/vcard_information_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:33 msgid "OS:" msgstr "OS:" -#: ../data/glade/vcard_information_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:40 #: ../data/glade/zeroconf_information_window.glade.h:8 msgid "Resource:" msgstr "Zdroj:" -#: ../data/glade/vcard_information_window.glade.h:40 +#: ../data/glade/vcard_information_window.glade.h:43 #: ../data/glade/zeroconf_information_window.glade.h:9 msgid "Status:" msgstr "Stav:" #. Family Name -#: ../data/glade/vcard_information_window.glade.h:43 +#: ../data/glade/vcard_information_window.glade.h:46 msgid "Subscription:" msgstr "Autorizace:" -#: ../data/glade/vcard_information_window.glade.h:47 -#: ../data/glade/zeroconf_information_window.glade.h:10 -msgid "_Log conversation history" -msgstr "_Zaznamenat historii konverzace" +#: ../data/glade/vcard_information_window.glade.h:49 +#, fuzzy +msgid "User avatar:" +msgstr "Avatar:" #: ../data/glade/xml_console_window.glade.h:1 msgid "Jabber Traffic" @@ -2216,11 +2505,6 @@ msgstr "Provoz Jabberu" msgid "XML Input" msgstr "Vstup XML" -#. XML Console enable checkbutton -#: ../data/glade/xml_console_window.glade.h:4 -msgid "Enable" -msgstr "Povolit" - #. Info/Query make the "IQ" initials. So translate like this 'YourLang/YourLang (Info/Query)'. Thanks (it's a tooltip so width is not a problem) #: ../data/glade/xml_console_window.glade.h:6 msgid "Info/Query" @@ -2239,16 +2523,6 @@ msgstr "_Zpráva" msgid "_Presence" msgstr "_Status" -#: ../data/glade/zeroconf_information_window.glade.h:3 -#: ../data/glade/zeroconf_properties_window.glade.h:6 -msgid "First Name:" -msgstr "Křestní:" - -#: ../data/glade/zeroconf_information_window.glade.h:5 -#: ../data/glade/zeroconf_properties_window.glade.h:14 -msgid "Last Name:" -msgstr "Příjmení:" - #: ../data/glade/zeroconf_information_window.glade.h:6 msgid "Local jid:" msgstr "Lokální jid: " @@ -2257,22 +2531,10 @@ msgstr "Lokální jid: " msgid "Personal" msgstr "Osobní" -#: ../data/glade/zeroconf_properties_window.glade.h:11 -msgid "" -"If the default port that is used for incoming messages is unfitting for your setup you can select another one here.\n" -"You might consider to change possible firewall settings." -msgstr "" -"Pokud výchozí port použitý k přijímání zpráv nevyhovuje tvému nastavení, můžeš si zvolit jiný.\n" -"Můžeš také zvážit změnu nastavení firewallu." - #: ../data/glade/zeroconf_properties_window.glade.h:15 msgid "Modify Account" msgstr "Upravit účet" -#: ../data/glade/zeroconf_properties_window.glade.h:21 -msgid "Use custom port:" -msgstr "Použít vlastní port:" - #. For i18n #: ../src/advanced.py:51 msgid "Activated" @@ -2320,285 +2582,487 @@ msgstr "(Žádný)" msgid "Hidden" msgstr "Skryté" -#: ../src/config.py:137 -#: ../src/config.py:586 +#. 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:54 +msgid "English" +msgstr "Angličtina" + +#: ../src/chat_control.py:54 +msgid "Belarusian" +msgstr "Běloruština" + +#: ../src/chat_control.py:54 +msgid "Bulgarian" +msgstr "Bulharština" + +#: ../src/chat_control.py:54 +msgid "Breton" +msgstr "Bretonština" + +#: ../src/chat_control.py:54 +msgid "Czech" +msgstr "Čeština" + +#: ../src/chat_control.py:54 +msgid "German" +msgstr "Němčina" + +#: ../src/chat_control.py:54 +msgid "Greek" +msgstr "Řečtina" + +#: ../src/chat_control.py:54 +msgid "British" +msgstr "Britština" + +#: ../src/chat_control.py:54 +msgid "Esperanto" +msgstr "Esperanto" + +#: ../src/chat_control.py:54 +msgid "Spanish" +msgstr "Španělština" + +#: ../src/chat_control.py:54 +msgid "Basque" +msgstr "Baskičtina" + +#: ../src/chat_control.py:54 +msgid "French" +msgstr "Francouzština" + +#: ../src/chat_control.py:54 +msgid "Croatian" +msgstr "Chorvatština" + +#: ../src/chat_control.py:54 +msgid "Italian" +msgstr "Italština" + +#: ../src/chat_control.py:54 +msgid "Norwegian (b)" +msgstr "Norština (b)" + +#: ../src/chat_control.py:54 +msgid "Dutch" +msgstr "Holandština" + +#: ../src/chat_control.py:54 +msgid "Norwegian" +msgstr "Norština" + +#: ../src/chat_control.py:54 +msgid "Polish" +msgstr "Polština" + +#: ../src/chat_control.py:54 +msgid "Portuguese" +msgstr "Portugalština" + +#: ../src/chat_control.py:54 +msgid "Brazilian Portuguese" +msgstr "Brazilská portugalština" + +#: ../src/chat_control.py:54 +msgid "Russian" +msgstr "Ruština" + +#: ../src/chat_control.py:54 +#, fuzzy +msgid "Serbian" +msgstr "Němčina" + +#: ../src/chat_control.py:54 +msgid "Slovak" +msgstr "Slovenština" + +#: ../src/chat_control.py:54 +msgid "Swedish" +msgstr "Švédština" + +#: ../src/chat_control.py:54 +msgid "Chinese (Ch)" +msgstr "Čínština" + +#: ../src/chat_control.py:282 +msgid "Spelling language" +msgstr "Kontrola jazyka" + +#. we are not connected +#: ../src/chat_control.py:305 ../src/chat_control.py:511 +msgid "A connection is not available" +msgstr "Spojení není dostupné" + +#: ../src/chat_control.py:306 ../src/chat_control.py:512 +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:1132 +#, python-format +msgid "%(nickname)s from group chat %(room_name)s" +msgstr "%(nickname)s z diskuze %(room_name)s" + +#. we talk about a contact here +#: ../src/chat_control.py:1220 +#, python-format +msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" +msgstr "%s nerozesílá svůj OpenPGP klíč nebo nemá žádný přiřazen" + +#: ../src/chat_control.py:1259 ../src/groupchat_control.py:1394 +#, python-format +msgid "No such command: /%s (if you want to send this, prefix it with /say)" +msgstr "Neznámý příkaz: /%s (pokud to chcete odeslat, napište před to /say)" + +#: ../src/chat_control.py:1266 ../src/groupchat_control.py:1417 +#, python-format +msgid "Commands: %s" +msgstr "Příkazy: %s" + +#: ../src/chat_control.py:1269 ../src/groupchat_control.py:1431 +#, python-format +msgid "Usage: /%s, clears the text window." +msgstr "Použití: /%s, smaže zprávy v okně." + +#: ../src/chat_control.py:1272 ../src/groupchat_control.py:1436 +#, python-format +msgid "Usage: /%s, hide the chat buttons." +msgstr "Použití: /%s, skryje tlačítka rozhovoru." + +#: ../src/chat_control.py:1275 ../src/groupchat_control.py:1452 +#, python-format +msgid "" +"Usage: /%s , sends action to the current group chat. Use third " +"person. (e.g. /%s explodes.)" +msgstr "" +"Použití: /%s , pošle akci do aktuální místnosti. Použijte třetí osobu " +"(například /%s explodoval.)" + +#: ../src/chat_control.py:1279 +#, python-format +msgid "Usage: /%s, sends a ping to the contact" +msgstr "" + +#: ../src/chat_control.py:1282 +#, fuzzy, python-format +msgid "Usage: /%s, send the message to the contact" +msgstr "Použití: /%s, skryje tlačítka rozhovoru." + +#: ../src/chat_control.py:1285 ../src/groupchat_control.py:1475 +#, python-format +msgid "No help info for /%s" +msgstr "Žádná další nápověda pro /%s" + +#: ../src/chat_control.py:1422 +msgid "Encryption enabled" +msgstr "Šifrování zapnuto" + +#: ../src/chat_control.py:1427 +msgid "Encryption disabled" +msgstr "Šifrování vypnuto" + +#. add_to_roster_menuitem +#: ../src/chat_control.py:1575 ../src/conversation_textview.py:559 +#: ../src/dialogs.py:673 ../src/gajim.py:887 ../src/gajim.py:888 +#: ../src/gajim.py:1357 ../src/roster_window.py:344 +#: ../src/roster_window.py:428 ../src/roster_window.py:1784 +#: ../src/roster_window.py:1794 ../src/roster_window.py:2039 +#: ../src/roster_window.py:2277 ../src/roster_window.py:3125 +#: ../src/roster_window.py:3332 ../src/roster_window.py:4682 +#: ../src/roster_window.py:4684 ../src/common/contacts.py:84 +#: ../src/common/helpers.py:44 ../src/common/helpers.py:258 +msgid "Not in Roster" +msgstr "není v seznamu" + +#. %s is being replaced in the code with JID +#: ../src/chat_control.py:1717 +#, 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:1718 +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/config.py:136 ../src/config.py:593 msgid "Disabled" msgstr "Vypnuto" -#: ../src/config.py:231 +#: ../src/config.py:228 #, python-format msgid "Every %s _minutes" msgstr "Každých %s _minut" -#: ../src/config.py:351 +#: ../src/config.py:348 msgid "Active" msgstr "Aktivní" -#: ../src/config.py:359 +#: ../src/config.py:356 msgid "Event" msgstr "Událost" -#: ../src/config.py:682 -#: ../src/gajim.py:2231 +#: ../src/config.py:710 ../src/dialogs.py:957 #, python-format msgid "Dictionary for lang %s not available" msgstr "Slovník pro jazyk %s není dostupný" -#: ../src/config.py:683 -#: ../src/gajim.py:2232 +#: ../src/config.py:711 #, python-format -msgid "You have to install %s dictionary to use spellchecking, or choose another language by setting the speller_language option." -msgstr "Musíš nainstalovat %s slovník k použití kontroly pravopisu, nebo vybrat jiný jazyk nastavením volby speller_language." +msgid "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option." +msgstr "" +"Musíš nainstalovat %s slovník k použití kontroly pravopisu, nebo vybrat jiný " +"jazyk nastavením volby speller_language." -#: ../src/config.py:1000 +#: ../src/config.py:1034 msgid "status message title" msgstr "titulek stavu" -#: ../src/config.py:1000 +#: ../src/config.py:1034 msgid "status message text" msgstr "text stavu" -#: ../src/config.py:1036 +#: ../src/config.py:1070 msgid "First Message Received" msgstr "První zpráva přijata" -#: ../src/config.py:1037 +#: ../src/config.py:1071 msgid "Next Message Received" msgstr "Další zpráva přijata" -#: ../src/config.py:1038 +#: ../src/config.py:1072 msgid "Contact Connected" msgstr "Kontakt se připojil" -#: ../src/config.py:1039 +#: ../src/config.py:1073 msgid "Contact Disconnected" msgstr "Kontakt se odpojil" -#: ../src/config.py:1040 +#: ../src/config.py:1074 msgid "Message Sent" msgstr "Zpráva odeslána" -#: ../src/config.py:1041 +#: ../src/config.py:1075 msgid "Group Chat Message Highlight" msgstr "Zvýraznění zprávy v diskuzi" -#: ../src/config.py:1042 +#: ../src/config.py:1076 msgid "Group Chat Message Received" msgstr "Přijetí zprávy v diskuzi" -#: ../src/config.py:1049 +#: ../src/config.py:1083 msgid "GMail Email Received" msgstr "Přišel GMail Email" -#: ../src/config.py:1252 -msgid "OpenPGP is not usable in this computer" -msgstr "OpenPGP není použitelné na tomto počítači" - -#: ../src/config.py:1298 -msgid "You are currently connected to the server" -msgstr "Nejste přávě připojen(a) k serveru" - -#: ../src/config.py:1299 -msgid "To change the account name, you must be disconnected." -msgstr "Ke změně jména účtu se musite odpojit." - -#: ../src/config.py:1302 -#: ../src/config.py:1901 -msgid "Unread events" -msgstr "Nepřečtené zprávy" - -#: ../src/config.py:1303 -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:1307 -msgid "Account Name Already Used" -msgstr "Jméno účtu už existuje" - -#: ../src/config.py:1308 -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:1312 -#: ../src/config.py:1316 -msgid "Invalid account name" -msgstr "Neplatné jméno účtu" - -#: ../src/config.py:1313 -msgid "Account name cannot be empty." -msgstr "Jméno účtu nemůže být prázdné." - -#: ../src/config.py:1317 -msgid "Account name cannot contain spaces." -msgstr "Jméno účtu nesmí obsahovat mezery." - -#: ../src/config.py:1325 -#: ../src/config.py:1331 -#: ../src/config.py:1341 -#: ../src/config.py:3004 -msgid "Invalid Jabber ID" -msgstr "Neplatné Jabber ID" - -#: ../src/config.py:1332 -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:1391 -msgid "Invalid entry" -msgstr "Neplatný záznam" - -#: ../src/config.py:1392 -msgid "Custom port must be a port number." -msgstr "Vlastní port musí být číslo portu." - -#: ../src/config.py:1520 -#: ../src/common/config.py:366 -msgid "Be right back." -msgstr "Hned jsem zpět." - -#: ../src/config.py:1530 -msgid "Relogin now?" -msgstr "Připojit se teď znovu?" - -#: ../src/config.py:1531 -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:1557 -msgid "No such account available" -msgstr "Takový účet není dostupný" - -#: ../src/config.py:1558 -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:1565 -#: ../src/dialogs.py:1130 -#: ../src/dialogs.py:1316 -#: ../src/disco.py:419 -#: ../src/profile_window.py:323 -msgid "You are not connected to the server" -msgstr "Nejste připojen(a) k serveru" - -#: ../src/config.py:1566 -msgid "Without a connection, you can not edit your personal information." -msgstr "Bez připojení nemůžete upravovat osobní údaje." - -#: ../src/config.py:1570 -msgid "Your server doesn't support Vcard" -msgstr "Váš server nepodporuje vizitky." - -#: ../src/config.py:1571 -msgid "Your server can't save your personal information." -msgstr "Váš server neumí uložit Vaše osobní informace." - -#: ../src/config.py:1595 -#: ../src/config.py:3392 -msgid "Failed to get secret keys" -msgstr "Selhalo získání privátního klíče" - -#: ../src/config.py:1596 -#: ../src/config.py:3393 -msgid "There was a problem retrieving your OpenPGP secret keys." -msgstr "Nastala chyba při získávání Vašich OpenPGP privátních klíčů." - -#: ../src/config.py:1599 -#: ../src/config.py:3396 -msgid "OpenPGP Key Selection" -msgstr "Výběr OpenPGP klíče" - -#: ../src/config.py:1600 -#: ../src/config.py:3397 -msgid "Choose your OpenPGP key" -msgstr "Vyberte Váš OpenPGP klíč" - #. Name column -#: ../src/config.py:1835 -#: ../src/disco.py:740 -#: ../src/disco.py:1495 -#: ../src/disco.py:1733 +#: ../src/config.py:1352 ../src/dialogs.py:1396 ../src/dialogs.py:1460 +#: ../src/disco.py:737 ../src/disco.py:1560 ../src/disco.py:1806 #: ../src/history_window.py:78 msgid "Name" msgstr "Jméno" -#: ../src/config.py:1838 -msgid "Server" -msgstr "Server" +#: ../src/config.py:1460 ../src/common/config.py:373 +msgid "Be right back." +msgstr "Hned jsem zpět." -#: ../src/config.py:1902 +#: ../src/config.py:1464 +msgid "Relogin now?" +msgstr "Připojit se teď znovu?" + +#: ../src/config.py:1465 +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:1560 ../src/config.py:1659 +msgid "OpenPGP is not usable in this computer" +msgstr "OpenPGP není použitelné na tomto počítači" + +#: ../src/config.py:1695 ../src/config.py:1739 +msgid "Unread events" +msgstr "Nepřečtené zprávy" + +#: ../src/config.py:1696 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:1939 +#: ../src/config.py:1725 #, python-format msgid "You have opened chat in account %s" msgstr "Otevřel(a) jsi rozhovor z účtu %s" -#: ../src/config.py:1940 +#: ../src/config.py:1726 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?" +msgstr "" +"Všechna okna rozhovorů a diskuzí budou zavřena. Opravdu chceš pokračovat?" -#: ../src/config.py:1999 +#: ../src/config.py:1735 +msgid "You are currently connected to the server" +msgstr "Nejste přávě připojen(a) k serveru" + +#: ../src/config.py:1736 +msgid "To change the account name, you must be disconnected." +msgstr "Ke změně jména účtu se musite odpojit." + +#: ../src/config.py:1740 +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:1746 +msgid "Account Name Already Used" +msgstr "Jméno účtu už existuje" + +#: ../src/config.py:1747 +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:1751 ../src/config.py:1755 +msgid "Invalid account name" +msgstr "Neplatné jméno účtu" + +#: ../src/config.py:1752 +msgid "Account name cannot be empty." +msgstr "Jméno účtu nemůže být prázdné." + +#: ../src/config.py:1756 +msgid "Account name cannot contain spaces." +msgstr "Jméno účtu nesmí obsahovat mezery." + +#: ../src/config.py:1820 +#, fuzzy +msgid "Rename Account" +msgstr "Spravuj účty" + +#: ../src/config.py:1821 +#, fuzzy, python-format +msgid "Enter a new name for account %s" +msgstr "Zadej nové jméno pro skupinu %s." + +#: ../src/config.py:1839 ../src/config.py:1847 ../src/config.py:1887 +#: ../src/config.py:3106 +msgid "Invalid Jabber ID" +msgstr "Neplatné Jabber ID" + +#: ../src/config.py:1848 +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:2033 ../src/config.py:3177 +msgid "Invalid entry" +msgstr "Neplatný záznam" + +#: ../src/config.py:2034 ../src/config.py:3178 +msgid "Custom port must be a port number." +msgstr "Vlastní port musí být číslo portu." + +#: ../src/config.py:2055 +msgid "Failed to get secret keys" +msgstr "Selhalo získání privátního klíče" + +#: ../src/config.py:2056 +msgid "There was a problem retrieving your OpenPGP secret keys." +msgstr "Nastala chyba při získávání Vašich OpenPGP privátních klíčů." + +#: ../src/config.py:2059 +msgid "OpenPGP Key Selection" +msgstr "Výběr OpenPGP klíče" + +#: ../src/config.py:2060 +msgid "Choose your OpenPGP key" +msgstr "Vyberte Váš OpenPGP klíč" + +#: ../src/config.py:2117 +msgid "No such account available" +msgstr "Takový účet není dostupný" + +#: ../src/config.py:2118 +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:2125 ../src/dialogs.py:1243 ../src/dialogs.py:1384 +#: ../src/dialogs.py:1564 ../src/disco.py:420 ../src/profile_window.py:325 +msgid "You are not connected to the server" +msgstr "Nejste připojen(a) k serveru" + +#: ../src/config.py:2126 +msgid "Without a connection, you can not edit your personal information." +msgstr "Bez připojení nemůžete upravovat osobní údaje." + +#: ../src/config.py:2130 +msgid "Your server doesn't support Vcard" +msgstr "Váš server nepodporuje vizitky." + +#: ../src/config.py:2131 +msgid "Your server can't save your personal information." +msgstr "Váš server neumí uložit Vaše osobní informace." + +#: ../src/config.py:2162 msgid "Account Local already exists." msgstr "Účet Local už existuje." -#: ../src/config.py:2000 +#: ../src/config.py:2163 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:2234 +#: ../src/config.py:2339 #, python-format msgid "Edit %s" msgstr "Uprav %s" -#: ../src/config.py:2236 +#: ../src/config.py:2341 #, python-format msgid "Register to %s" msgstr "Registrovat k %s" #. list at the beginning -#: ../src/config.py:2302 +#: ../src/config.py:2377 msgid "Ban List" msgstr "Ban List" -#: ../src/config.py:2303 +#: ../src/config.py:2378 msgid "Member List" msgstr "Seznam členů" -#: ../src/config.py:2304 +#: ../src/config.py:2379 msgid "Owner List" msgstr "Seznam vlastníků" -#: ../src/config.py:2305 +#: ../src/config.py:2380 msgid "Administrator List" msgstr "Seznam správců" #. Address column #. holds JID (who said this) -#: ../src/config.py:2338 -#: ../src/disco.py:747 -#: ../src/history_manager.py:155 +#: ../src/config.py:2429 ../src/disco.py:744 ../src/history_manager.py:155 msgid "JID" msgstr "JID" -#: ../src/config.py:2346 +#: ../src/config.py:2437 msgid "Reason" msgstr "Důvod" -#: ../src/config.py:2351 +#: ../src/config.py:2442 msgid "Nick" msgstr "Přezdívka" -#: ../src/config.py:2355 +#: ../src/config.py:2446 msgid "Role" msgstr "Postavení" -#: ../src/config.py:2376 +#: ../src/config.py:2471 msgid "Banning..." msgstr "Zakazuji..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2378 +#: ../src/config.py:2473 msgid "" "Whom do you want to ban?\n" "\n" @@ -2606,37 +3070,37 @@ msgstr "" "Koho chcete zakázat?\n" "\n" -#: ../src/config.py:2380 +#: ../src/config.py:2475 msgid "Adding Member..." msgstr "Přidávám člena..." -#: ../src/config.py:2381 +#: ../src/config.py:2476 msgid "" "Whom do you want to make a member?\n" "\n" msgstr "Kdo se má stát členem?\n" -#: ../src/config.py:2383 +#: ../src/config.py:2478 msgid "Adding Owner..." msgstr "Přidávám vlastníka..." -#: ../src/config.py:2384 +#: ../src/config.py:2479 msgid "" "Whom do you want to make an owner?\n" "\n" msgstr "Kdo se má stát vlastníkem?\n" -#: ../src/config.py:2386 +#: ../src/config.py:2481 msgid "Adding Administrator..." msgstr "Přidávám správce..." -#: ../src/config.py:2387 +#: ../src/config.py:2482 msgid "" "Whom do you want to make an administrator?\n" "\n" msgstr "Kdo se má stát správcem?\n" -#: ../src/config.py:2388 +#: ../src/config.py:2483 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" @@ -2649,779 +3113,777 @@ msgstr "" "1. uživatel@doména/zdroj (pouze zdroji, který je uveden).\n" "2. uživatel@doména (kterýkoliv zdroj odpovídá).\n" "3. doména/zdroj (pouze zdroji, který je uveden).\n" -"4. doména (doména samotná odpovídá, stejně jako kterýkoliv uživatel@doména),\n" +"4. doména (doména samotná odpovídá, stejně jako kterýkoliv " +"uživatel@doména),\n" "doména/zdroj, nebo adresa obsahující poddoménu." -#: ../src/config.py:2493 +#: ../src/config.py:2587 #, python-format msgid "Removing %s account" msgstr "Odstraňuju účet %s" -#: ../src/config.py:2510 -#: ../src/roster_window.py:2734 +#: ../src/config.py:2604 ../src/gajim.py:1300 ../src/roster_window.py:3391 msgid "Password Required" msgstr "Vyžadováno heslo" -#: ../src/config.py:2511 -#: ../src/roster_window.py:2730 +#: ../src/config.py:2605 ../src/roster_window.py:3387 #, python-format msgid "Enter your password for account %s" msgstr "Zadejte heslo pro účet %s" -#: ../src/config.py:2512 -#: ../src/roster_window.py:2735 +#: ../src/config.py:2606 ../src/roster_window.py:3392 msgid "Save password" msgstr "Uložit heslo" -#: ../src/config.py:2526 +#: ../src/config.py:2620 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Účet \"%s\" se připojil k serveru" -#: ../src/config.py:2527 +#: ../src/config.py:2621 msgid "If you remove it, the connection will be lost." msgstr "Pokud jej smažete, připojení bude ztraceno." -#: ../src/config.py:2612 +#: ../src/config.py:2714 msgid "Default" msgstr "Výchozí" -#: ../src/config.py:2612 +#: ../src/config.py:2714 msgid "?print_status:All" msgstr "?print_status:Všechny" -#: ../src/config.py:2613 +#: ../src/config.py:2715 msgid "Enter and leave only" msgstr "" -#: ../src/config.py:2614 +#: ../src/config.py:2716 msgid "?print_status:None" msgstr "?print_status:Žádný" -#: ../src/config.py:2682 +#: ../src/config.py:2785 msgid "New Group Chat" msgstr "Nová diskuze" -#: ../src/config.py:2715 +#: ../src/config.py:2818 msgid "This bookmark has invalid data" msgstr "Tato záložka má neplatná data" -#: ../src/config.py:2716 -msgid "Please be sure to fill out server and room fields or remove this bookmark." -msgstr "Prosím nezapomeňte vyplnit políčka server a místnost, nebo smažte tuto záložku." +#: ../src/config.py:2819 +msgid "" +"Please be sure to fill out server and room fields or remove this bookmark." +msgstr "" +"Prosím nezapomeňte vyplnit políčka server a místnost, nebo smažte tuto " +"záložku." -#: ../src/config.py:2979 +#: ../src/config.py:3089 msgid "Invalid username" msgstr "Neplatné uživatelské jméno" -#: ../src/config.py:2980 +#: ../src/config.py:3091 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:2990 -#: ../src/dialogs.py:1335 -msgid "Invalid password" -msgstr "Neplatné heslo" - -#: ../src/config.py:2991 -msgid "You must enter a password for the new account." -msgstr "Musíte zadat heslo pro nový účet." - -#: ../src/config.py:2995 -#: ../src/dialogs.py:1340 -msgid "Passwords do not match" -msgstr "Hesla se neshodují" - -#: ../src/config.py:2996 -#: ../src/dialogs.py:1341 -msgid "The passwords typed in both fields must be identical." -msgstr "Hesla zadaná v obou políčkách musí být identická." - -#: ../src/config.py:3015 +#: ../src/config.py:3117 msgid "Duplicate Jabber ID" msgstr "Dvakrát použité Jabber ID" -#: ../src/config.py:3016 +#: ../src/config.py:3118 msgid "This account is already configured in Gajim." msgstr "Tento účet už je nastaven v Gajimu." -#: ../src/config.py:3033 +#: ../src/config.py:3135 msgid "Account has been added successfully" msgstr "Účet byl úspěšně přidán" -#: ../src/config.py:3034 -#: ../src/config.py:3069 -msgid "You can set advanced account options by pressing the Advanced button, or later by choosing the Accounts menuitem under the Edit menu from the main window." -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:3136 ../src/config.py:3281 +msgid "" +"You can set advanced account options by pressing the Advanced button, or " +"later by choosing the Accounts menuitem under the Edit menu from the main " +"window." +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:3068 -msgid "Your new account has been created successfully" -msgstr "Váš účet byl úspěšně vytvořen" +#: ../src/config.py:3153 +#, fuzzy +msgid "Invalid server" +msgstr "Neplatné uživatelské jméno" -#: ../src/config.py:3086 +#: ../src/config.py:3154 +#, fuzzy +msgid "Please provide a server on which you want to register." +msgstr "Prosím zadejte novou přezdívku, kterou chcete používat:" + +#: ../src/config.py:3260 ../src/config.py:3299 msgid "An error occurred during account creation" msgstr "Nastala chyba při vytváření účtu" -#: ../src/config.py:3144 +#: ../src/config.py:3280 +msgid "Your new account has been created successfully" +msgstr "Váš účet byl úspěšně vytvořen" + +#: ../src/config.py:3385 msgid "Account name is in use" msgstr "Jméno účtu se používá" -#: ../src/config.py:3145 +#: ../src/config.py:3386 msgid "You already have an account using this name." msgstr "Již máte účet s tímto jménem." -#: ../src/conversation_textview.py:273 -msgid "Text below this line is what has been said since the last time you paid attention to this group chat" -msgstr "Text pod touto čarou označuje to, co bylo řečeno po posledním čtení této diskuze" +#: ../src/conversation_textview.py:334 +msgid "" +"Text below this line is what has been said since the last time you paid " +"attention to this group chat" +msgstr "" +"Text pod touto čarou označuje to, co bylo řečeno po posledním čtení této " +"diskuze" -#: ../src/conversation_textview.py:342 +#: ../src/conversation_textview.py:406 #, python-format msgid "_Actions for \"%s\"" msgstr "_Akce pro \"%s\"" -#: ../src/conversation_textview.py:354 +#: ../src/conversation_textview.py:418 msgid "Read _Wikipedia Article" msgstr "Číst článkek na _Wikipedia" -#: ../src/conversation_textview.py:359 +#: ../src/conversation_textview.py:423 msgid "Look it up in _Dictionary" msgstr "Vyhledat ve _slovníku" #. we must have %s in the url if not WIKTIONARY -#: ../src/conversation_textview.py:375 +#: ../src/conversation_textview.py:439 #, 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:388 +#: ../src/conversation_textview.py:452 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "URL pro hledání na webu chybí \"%s\"" -#: ../src/conversation_textview.py:391 +#: ../src/conversation_textview.py:455 msgid "Web _Search for it" msgstr "_Hledat na Webu" -#: ../src/conversation_textview.py:397 +#: ../src/conversation_textview.py:461 msgid "Open as _Link" msgstr "Otevřít jako _Odkaz" -#. add_to_roster_menuitem -#: ../src/conversation_textview.py:495 -#: ../src/dialogs.py:629 -#: ../src/gajim.py:850 -#: ../src/gajim.py:851 -#: ../src/gajim.py:1195 -#: ../src/chat_control.py:1412 -#: ../src/roster_window.py:332 -#: ../src/roster_window.py:410 -#: ../src/roster_window.py:1497 -#: ../src/roster_window.py:1507 -#: ../src/roster_window.py:1683 -#: ../src/roster_window.py:1889 -#: ../src/roster_window.py:2474 -#: ../src/roster_window.py:2675 -#: ../src/roster_window.py:3906 -#: ../src/roster_window.py:3908 -#: ../src/common/contacts.py:73 -#: ../src/common/helpers.py:43 -#: ../src/common/helpers.py:255 -msgid "Not in Roster" -msgstr "není v seznamu" - -#: ../src/conversation_textview.py:754 +#: ../src/conversation_textview.py:925 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:758 +#: ../src/conversation_textview.py:929 #, python-format msgid "%i days ago" msgstr "před %i dny" #. if we have subject, show it too! -#: ../src/conversation_textview.py:792 +#: ../src/conversation_textview.py:963 #, python-format msgid "Subject: %s\n" msgstr "Předmět: %s\n" -#: ../src/dialogs.py:59 +#: ../src/dialogs.py:63 #, python-format msgid "Contact name: %s" msgstr "Jméno kontaktu: %s" -#: ../src/dialogs.py:61 +#: ../src/dialogs.py:65 #, python-format msgid "Jabber ID: %s" msgstr "Jabber ID: %s" -#: ../src/dialogs.py:211 +#: ../src/dialogs.py:215 msgid "Group" msgstr "Skupina" -#: ../src/dialogs.py:218 +#: ../src/dialogs.py:222 msgid "In the group" msgstr "Ve skupině" -#: ../src/dialogs.py:269 +#: ../src/dialogs.py:273 msgid "KeyID" msgstr "ID klíče" -#: ../src/dialogs.py:272 +#: ../src/dialogs.py:276 msgid "Contact name" msgstr "Jméno kontaktu" -#: ../src/dialogs.py:318 +#: ../src/dialogs.py:322 #, python-format msgid "%s Status Message" msgstr "Text stavu %s" -#: ../src/dialogs.py:320 +#: ../src/dialogs.py:324 msgid "Status Message" msgstr "Text stavu" -#: ../src/dialogs.py:395 +#: ../src/dialogs.py:424 msgid "Save as Preset Status Message" msgstr "Uložit jako přednastavený stav" -#: ../src/dialogs.py:396 +#: ../src/dialogs.py:425 msgid "Please type a name for this status message" msgstr "Napište jméno pro tento stav" -#: ../src/dialogs.py:417 +#: ../src/dialogs.py:436 +#, fuzzy +msgid "Overwrite Status Message?" +msgstr "Text stavu" + +#: ../src/dialogs.py:437 +#, fuzzy +msgid "" +"This name is already used. Do you want to overwrite this status message?" +msgstr "Toto jméno je už použito pro jiný účet. Zvolte jiné, prosím." + +#: ../src/dialogs.py:453 msgid "AIM Address:" msgstr "AIM adresa:" -#: ../src/dialogs.py:418 +#: ../src/dialogs.py:454 msgid "GG Number:" msgstr "GG číslo: " -#: ../src/dialogs.py:419 +#: ../src/dialogs.py:455 msgid "ICQ Number:" msgstr "ICQ číslo: " -#: ../src/dialogs.py:420 +#: ../src/dialogs.py:456 msgid "MSN Address:" msgstr "MSN adresa:" -#: ../src/dialogs.py:421 +#: ../src/dialogs.py:457 msgid "Yahoo! Address:" msgstr "Yahoo! adresa:" -#: ../src/dialogs.py:457 +#: ../src/dialogs.py:493 #, 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:459 +#: ../src/dialogs.py:495 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:609 -#: ../src/dialogs.py:615 +#: ../src/dialogs.py:653 ../src/dialogs.py:659 msgid "Invalid User ID" msgstr "Neplatný identifikátor uživatele" -#: ../src/dialogs.py:616 +#: ../src/dialogs.py:660 msgid "The user ID must not contain a resource." msgstr "User ID nesmí obsahovat zdroj." -#: ../src/dialogs.py:630 +#: ../src/dialogs.py:674 msgid "Contact already in roster" msgstr "Kontakt už je v Seznamu" -#: ../src/dialogs.py:631 +#: ../src/dialogs.py:675 msgid "This contact is already listed in your roster." msgstr "Tento kontakt už je obsažen ve Vašem seznamu." -#: ../src/dialogs.py:668 +#: ../src/dialogs.py:711 msgid "User ID:" msgstr "Uživatel:" -#: ../src/dialogs.py:731 +#: ../src/dialogs.py:773 msgid "A GTK+ jabber client" msgstr "GTK+ Jabber client" -#: ../src/dialogs.py:732 +#: ../src/dialogs.py:774 msgid "GTK+ Version:" msgstr "GTK+ verze: " -#: ../src/dialogs.py:733 +#: ../src/dialogs.py:775 msgid "PyGTK Version:" msgstr "PyGTK verze: " -#: ../src/dialogs.py:747 +#: ../src/dialogs.py:789 msgid "Current Developers:" msgstr "Aktivní vývojáři:" -#: ../src/dialogs.py:749 +#: ../src/dialogs.py:791 msgid "Past Developers:" msgstr "Vysloužilí vývojáři:" -#: ../src/dialogs.py:759 +#: ../src/dialogs.py:801 msgid "THANKS:" msgstr "DÍKY:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:765 +#: ../src/dialogs.py:807 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ů." +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:778 +#: ../src/dialogs.py:820 msgid "translator-credits" msgstr "Petr Menšík " -#: ../src/dialogs.py:908 +#: ../src/dialogs.py:950 #, python-format msgid "Unable to bind to port %s." msgstr "Nemohu naslouchat na portu %s." -#: ../src/dialogs.py:909 -msgid "Maybe you have another running instance of Gajim. File Transfer will be cancelled." +#: ../src/dialogs.py:951 +msgid "" +"Maybe you have another running instance of Gajim. File Transfer will be " +"cancelled." msgstr "Možná máš puštěnou jinou instanci Gajimu. Přenos souborů bude zrušen." -#: ../src/dialogs.py:1060 +#: ../src/dialogs.py:958 +#, fuzzy, python-format +msgid "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option.\n" +"\n" +"Highlighting misspelled words feature will not be used" +msgstr "" +"Musíš nainstalovat %s slovník k použití kontroly pravopisu, nebo vybrat jiný " +"jazyk nastavením volby speller_language." + +#: ../src/dialogs.py:1172 #, python-format msgid "Subscription request for account %s from %s" msgstr "Žádost o autorizaci pro účet %s od %s" -#: ../src/dialogs.py:1063 +#: ../src/dialogs.py:1175 #, python-format msgid "Subscription request from %s" msgstr "Žádost o autorizaci od %s" -#: ../src/dialogs.py:1123 -#: ../src/roster_window.py:686 +#: ../src/dialogs.py:1236 ../src/roster_window.py:762 #, python-format msgid "You are already in group chat %s" msgstr "Už jsi v místnosti %s" -#: ../src/dialogs.py:1131 +#: ../src/dialogs.py:1244 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:1146 +#: ../src/dialogs.py:1262 #, python-format msgid "Join Group Chat with account %s" msgstr "Vstoupit do diskuze z účtu %s" -#: ../src/dialogs.py:1214 -#: ../src/dialogs.py:1220 +#: ../src/dialogs.py:1332 ../src/dialogs.py:1338 +#: ../src/groupchat_control.py:1639 msgid "Invalid group chat Jabber ID" msgstr "Neplatné Jabber ID diskuzní místnosti" -#: ../src/dialogs.py:1215 -#: ../src/dialogs.py:1221 +#: ../src/dialogs.py:1333 ../src/dialogs.py:1339 +#: ../src/groupchat_control.py:1640 msgid "The group chat Jabber ID has not allowed characters." msgstr "Jabber ID diskuze obsahuje nepřijatelné znaky." -#: ../src/dialogs.py:1227 +#: ../src/dialogs.py:1345 msgid "This is not a group chat" msgstr "Tohle není diskuze" -#: ../src/dialogs.py:1228 +#: ../src/dialogs.py:1346 #, python-format msgid "%s is not the name of a group chat." msgstr "%s není jméno diskuze." -#: ../src/dialogs.py:1267 +#: ../src/dialogs.py:1385 +#, fuzzy +msgid "Without a connection, you can not synchronise your contacts." +msgstr "Nemůžete měnit heslo, pokud nejste připojen(a)." + +#: ../src/dialogs.py:1399 +msgid "Server" +msgstr "Server" + +#: ../src/dialogs.py:1432 +#, fuzzy +msgid "This account is not connected to the server" +msgstr "Účet \"%s\" se připojil k serveru" + +#: ../src/dialogs.py:1433 +#, fuzzy +msgid "You cannot synchronize with an account unless it is connected." +msgstr "Nemůžete vstoupit do diskuze pokud nejste připojen(a)." + +#: ../src/dialogs.py:1457 +msgid "Synchronise" +msgstr "" + +#: ../src/dialogs.py:1515 #, python-format msgid "Start Chat with account %s" msgstr "Začít rozhovor z účtu %s" -#: ../src/dialogs.py:1269 +#: ../src/dialogs.py:1517 msgid "Start Chat" msgstr "Začít rozhovor" -#: ../src/dialogs.py:1270 +#: ../src/dialogs.py:1518 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" -msgstr "Vyplňte Jabber ID nebo přezdívku kontaktu, se kterým chcete začít rozhovor:" +msgstr "" +"Vyplňte Jabber ID nebo přezdívku kontaktu, se kterým chcete začít rozhovor:" #. if offline or connecting -#: ../src/dialogs.py:1295 -#: ../src/dialogs.py:1654 -#: ../src/dialogs.py:1785 +#: ../src/dialogs.py:1543 ../src/dialogs.py:1889 ../src/dialogs.py:2020 msgid "Connection not available" msgstr "Spojení není dostupné" -#: ../src/dialogs.py:1296 -#: ../src/dialogs.py:1655 -#: ../src/dialogs.py:1786 +#: ../src/dialogs.py:1544 ../src/dialogs.py:1890 ../src/dialogs.py:2021 #, 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:1305 -#: ../src/dialogs.py:1308 +#: ../src/dialogs.py:1553 ../src/dialogs.py:1556 msgid "Invalid JID" msgstr "Neplatné JID" -#: ../src/dialogs.py:1308 +#: ../src/dialogs.py:1556 #, python-format msgid "Unable to parse \"%s\"." msgstr "Nemůžu dekódovat \"%s\"." -#: ../src/dialogs.py:1317 +#: ../src/dialogs.py:1565 msgid "Without a connection, you can not change your password." msgstr "Nemůžete měnit heslo, pokud nejste připojen(a)." -#: ../src/dialogs.py:1336 +#: ../src/dialogs.py:1583 +msgid "Invalid password" +msgstr "Neplatné heslo" + +#: ../src/dialogs.py:1584 msgid "You must enter a password." msgstr "Musíte zadat heslo." +#: ../src/dialogs.py:1588 +msgid "Passwords do not match" +msgstr "Hesla se neshodují" + +#: ../src/dialogs.py:1589 +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:1383 -#: ../src/notify.py:212 -#: ../src/notify.py:416 +#: ../src/dialogs.py:1631 ../src/notify.py:218 ../src/notify.py:428 msgid "Contact Signed In" msgstr "Kontakt se přihlásil" -#: ../src/dialogs.py:1385 -#: ../src/notify.py:220 -#: ../src/notify.py:418 +#: ../src/dialogs.py:1633 ../src/notify.py:226 ../src/notify.py:430 msgid "Contact Signed Out" msgstr "Kontakt se odhlásil" #. chat message -#: ../src/dialogs.py:1387 -#: ../src/notify.py:239 -#: ../src/notify.py:420 +#: ../src/dialogs.py:1635 ../src/notify.py:249 ../src/notify.py:432 msgid "New Message" msgstr "Nová zpráva" #. single message -#: ../src/dialogs.py:1387 -#: ../src/notify.py:224 -#: ../src/notify.py:420 +#: ../src/dialogs.py:1635 ../src/notify.py:230 ../src/notify.py:432 msgid "New Single Message" msgstr "Nová jednoduché zpráva" #. private message -#: ../src/dialogs.py:1388 -#: ../src/notify.py:231 -#: ../src/notify.py:421 +#: ../src/dialogs.py:1636 ../src/notify.py:237 ../src/notify.py:433 msgid "New Private Message" msgstr "Nová soukromá zpráva" -#: ../src/dialogs.py:1388 -#: ../src/gajim.py:1290 -#: ../src/notify.py:429 +#: ../src/dialogs.py:1636 ../src/gajim.py:1453 ../src/notify.py:441 msgid "New E-mail" msgstr "Nový E-mail" -#: ../src/dialogs.py:1390 -#: ../src/gajim.py:1443 -#: ../src/notify.py:423 +#: ../src/dialogs.py:1638 ../src/gajim.py:1606 ../src/notify.py:435 msgid "File Transfer Request" msgstr "Žádost o přenos souboru" -#: ../src/dialogs.py:1392 -#: ../src/gajim.py:1262 -#: ../src/gajim.py:1419 -#: ../src/notify.py:425 +#: ../src/dialogs.py:1640 ../src/gajim.py:1425 ../src/gajim.py:1582 +#: ../src/notify.py:437 msgid "File Transfer Error" msgstr "Chyba přenosu souboru" -#: ../src/dialogs.py:1394 -#: ../src/gajim.py:1482 -#: ../src/gajim.py:1504 -#: ../src/gajim.py:1521 -#: ../src/notify.py:427 +#: ../src/dialogs.py:1642 ../src/gajim.py:1645 ../src/gajim.py:1667 +#: ../src/gajim.py:1684 ../src/notify.py:439 msgid "File Transfer Completed" msgstr "Přenos souboru dokončen" -#: ../src/dialogs.py:1395 -#: ../src/gajim.py:1485 -#: ../src/notify.py:427 +#: ../src/dialogs.py:1643 ../src/gajim.py:1648 ../src/notify.py:439 msgid "File Transfer Stopped" msgstr "Přenos souboru zastaven" -#: ../src/dialogs.py:1397 -#: ../src/gajim.py:1159 -#: ../src/notify.py:431 +#: ../src/dialogs.py:1645 ../src/gajim.py:1321 ../src/notify.py:443 msgid "Groupchat Invitation" msgstr "Skupinová pozvánka" -#: ../src/dialogs.py:1399 -#: ../src/notify.py:204 -#: ../src/notify.py:433 +#: ../src/dialogs.py:1647 ../src/notify.py:210 ../src/notify.py:445 msgid "Contact Changed Status" msgstr "Kontakt změnil stav" -#: ../src/dialogs.py:1516 -#: ../src/chat_control.py:208 -msgid "" -"If that is not your language for which you want to highlight misspelled words, then please set your $LANG as appropriate. Eg. for French do export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to make it global in /etc/profile.\n" -"\n" -"Highlighting misspelled words feature will not be used" -msgstr "" -"Pokud to není Váš jazyk, pro který chcete zvýrazňovat slova s překlepy, potom prosím nastavte proměnnou $LANG na správnou. Například. pro Češtinu spusťte export LANG=cs_CZ nebo export LANG=cs_CZ zapište do ~/.bash_profile nebo pro nastavení globálně do /etc/profile.\n" -"\n" -"Vlastnost zvýrazňování překlepů nebude použita" - -#: ../src/dialogs.py:1584 +#: ../src/dialogs.py:1819 #, python-format msgid "Single Message using account %s" msgstr "Jednoduchá zpráva z účtu %s" -#: ../src/dialogs.py:1586 +#: ../src/dialogs.py:1821 #, python-format msgid "Single Message in account %s" msgstr "Jednoduchá zpráva z účtu %s" -#: ../src/dialogs.py:1588 +#: ../src/dialogs.py:1823 msgid "Single Message" msgstr "Jednoduchá zpráva" #. prepare UI for Sending -#: ../src/dialogs.py:1591 +#: ../src/dialogs.py:1826 #, python-format msgid "Send %s" msgstr "Odeslat %s" #. prepare UI for Receiving -#: ../src/dialogs.py:1614 +#: ../src/dialogs.py:1849 #, python-format msgid "Received %s" msgstr "Přijaté %s" #. we create a new blank window to send and we preset RE: and to jid -#: ../src/dialogs.py:1686 +#: ../src/dialogs.py:1921 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:1687 +#: ../src/dialogs.py:1922 #, python-format msgid "%s wrote:\n" msgstr "%s napsal(a):\n" -#: ../src/dialogs.py:1731 +#: ../src/dialogs.py:1966 #, python-format msgid "XML Console for %s" msgstr "XML Konzole pro %s" -#: ../src/dialogs.py:1733 +#: ../src/dialogs.py:1968 msgid "XML Console" msgstr "XML Konzole" -#: ../src/dialogs.py:1856 +#: ../src/dialogs.py:2091 #, python-format msgid "Privacy List %s" msgstr "" -#: ../src/dialogs.py:1860 +#: ../src/dialogs.py:2095 #, python-format msgid "Privacy List for %s" msgstr "" -#: ../src/dialogs.py:1908 +#: ../src/dialogs.py:2152 #, python-format msgid "Order: %s, action: %s, type: %s, value: %s" msgstr "Pořadí: %s, akce: %s, typ: %s, hodnota: %s" -#: ../src/dialogs.py:1911 +#: ../src/dialogs.py:2155 #, python-format msgid "Order: %s, action: %s" msgstr "Pořadí: %s, akce: %s" -#: ../src/dialogs.py:1953 +#: ../src/dialogs.py:2197 msgid "Edit a rule" msgstr "Upravit pravidlo" -#: ../src/dialogs.py:2040 +#: ../src/dialogs.py:2284 msgid "Add a rule" msgstr "Přidat pravidlo" -#: ../src/dialogs.py:2136 +#: ../src/dialogs.py:2380 #, python-format msgid "Privacy Lists for %s" msgstr "" -#: ../src/dialogs.py:2138 +#: ../src/dialogs.py:2382 msgid "Privacy Lists" msgstr "" -#: ../src/dialogs.py:2208 +#: ../src/dialogs.py:2452 msgid "Invalid List Name" msgstr "Neplatné jméno seznamu" -#: ../src/dialogs.py:2209 +#: ../src/dialogs.py:2453 msgid "You must enter a name to create a privacy list." msgstr "Musíte zadat jméno pro vytvoření privacy listu." -#. Don't translate $Contact -#: ../src/dialogs.py:2243 +#: ../src/dialogs.py:2490 +#, fuzzy +msgid "$Contact has invited you to join a discussion" +msgstr "$Contact Vás pozval(a) do místnosti %(room_jid)s" + +#: ../src/dialogs.py:2492 #, 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" #. only if not None and not '' -#: ../src/dialogs.py:2255 +#: ../src/dialogs.py:2504 #, python-format msgid "Comment: %s" msgstr "Komentář: %s" -#: ../src/dialogs.py:2317 +#: ../src/dialogs.py:2570 msgid "Choose Sound" msgstr "Vyberte zvuk" -#: ../src/dialogs.py:2327 -#: ../src/dialogs.py:2372 +#: ../src/dialogs.py:2580 ../src/dialogs.py:2628 msgid "All files" msgstr "Všechny soubory" -#: ../src/dialogs.py:2332 +#: ../src/dialogs.py:2585 msgid "Wav Sounds" msgstr "Waw soubory" -#: ../src/dialogs.py:2362 +#: ../src/dialogs.py:2618 msgid "Choose Image" msgstr "Vyberte obrázek" -#: ../src/dialogs.py:2377 +#: ../src/dialogs.py:2633 msgid "Images" msgstr "Obrázky" -#: ../src/dialogs.py:2434 +#: ../src/dialogs.py:2697 #, python-format msgid "When %s becomes:" msgstr "Kdy %s může být:" -#: ../src/dialogs.py:2436 +#: ../src/dialogs.py:2699 #, python-format msgid "Adding Special Notification for %s" msgstr "Přidávám zvláštní notifikaci pro %s" #. # means number -#: ../src/dialogs.py:2507 +#: ../src/dialogs.py:2770 msgid "#" msgstr "č." -#: ../src/dialogs.py:2513 +#: ../src/dialogs.py:2776 msgid "Condition" msgstr "Podmínka" -#: ../src/dialogs.py:2634 +#: ../src/dialogs.py:2894 msgid "when I am " msgstr "když jsem " -#: ../src/disco.py:103 +#: ../src/disco.py:104 msgid "Others" msgstr "Ostatní" -#: ../src/disco.py:104 -#: ../src/disco.py:105 -#: ../src/disco.py:1281 -#: ../src/gajim.py:604 -#: ../src/roster_window.py:271 -#: ../src/roster_window.py:329 -#: ../src/roster_window.py:368 -#: ../src/roster_window.py:450 -#: ../src/roster_window.py:482 -#: ../src/roster_window.py:484 -#: ../src/roster_window.py:3902 -#: ../src/roster_window.py:3904 -#: ../src/common/contacts.py:267 -#: ../src/common/contacts.py:282 -#: ../src/common/helpers.py:43 +#: ../src/disco.py:105 ../src/disco.py:106 ../src/disco.py:1346 +#: ../src/gajim.py:638 ../src/roster_window.py:281 ../src/roster_window.py:341 +#: ../src/roster_window.py:381 ../src/roster_window.py:489 +#: ../src/roster_window.py:521 ../src/roster_window.py:523 +#: ../src/roster_window.py:4678 ../src/roster_window.py:4680 +#: ../src/common/contacts.py:290 ../src/common/contacts.py:305 +#: ../src/common/helpers.py:44 msgid "Transports" msgstr "Transporty" #. conference is a category for listing mostly groupchats in service discovery -#: ../src/disco.py:107 +#: ../src/disco.py:108 msgid "Conference" msgstr "Diskuze" -#: ../src/disco.py:420 +#: ../src/disco.py:421 msgid "Without a connection, you can not browse available services" msgstr "Bez spojení nemůžete prohlížet dostupné služby" -#: ../src/disco.py:499 +#: ../src/disco.py:496 #, python-format msgid "Service Discovery using account %s" msgstr "Procházení služeb s použitím účtu %s" -#: ../src/disco.py:501 +#: ../src/disco.py:498 msgid "Service Discovery" msgstr "Service Discovery" -#: ../src/disco.py:641 +#: ../src/disco.py:638 msgid "The service could not be found" msgstr "Tato služba nebyla nalezena" -#: ../src/disco.py:642 -msgid "There is no service at the address you entered, or it is not responding. Check the address and try again." -msgstr "Služba na zadané adrese neexistuje, nebo neodpovídá. Zkontrolujte adresu a opakujte znovu." +#: ../src/disco.py:639 +msgid "" +"There is no service at the address you entered, or it is not responding. " +"Check the address and try again." +msgstr "" +"Služba na zadané adrese neexistuje, nebo neodpovídá. Zkontrolujte adresu a " +"opakujte znovu." -#: ../src/disco.py:646 -#: ../src/disco.py:927 +#: ../src/disco.py:643 ../src/disco.py:924 msgid "The service is not browsable" msgstr "Službu nelze prohlížet" -#: ../src/disco.py:647 +#: ../src/disco.py:644 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:727 +#: ../src/disco.py:724 #, python-format msgid "Browsing %s using account %s" msgstr "Procházím %s pomocí účtu %s" -#: ../src/disco.py:766 +#: ../src/disco.py:763 msgid "_Browse" msgstr "_Prohlížet" -#: ../src/disco.py:928 +#: ../src/disco.py:925 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:1155 -#: ../src/disco.py:1286 +#: ../src/disco.py:1153 ../src/disco.py:1351 msgid "Re_gister" msgstr "Re_gistrace" # FIXME: tohle je blbe prelozene, najit v kontextu a vymyslet lepsi oznaceni -#: ../src/disco.py:1323 +#: ../src/disco.py:1388 #, python-format msgid "Scanning %d / %d.." msgstr "Skenuji %d / %d.." #. Users column -#: ../src/disco.py:1504 +#: ../src/disco.py:1570 msgid "Users" msgstr "Uživatelé" #. Description column -#: ../src/disco.py:1511 +#: ../src/disco.py:1578 msgid "Description" msgstr "Popis" #. Id column -#: ../src/disco.py:1518 +#: ../src/disco.py:1586 msgid "Id" msgstr "č." -#: ../src/disco.py:1741 +#: ../src/disco.py:1815 msgid "Subscribed" msgstr "Autorizován" -#: ../src/disco.py:1767 +#: ../src/disco.py:1823 +#, fuzzy +msgid "Node" +msgstr "Žádný" + +#: ../src/disco.py:1880 msgid "New post" msgstr "Nový záznam" -#: ../src/disco.py:1773 +#: ../src/disco.py:1886 msgid "_Subscribe" msgstr "_Žádat autorizaci" -#: ../src/disco.py:1779 +#: ../src/disco.py:1892 msgid "_Unsubscribe" msgstr "_Zrušit autorizaci" @@ -3437,142 +3899,132 @@ msgstr "Čas" msgid "Progress" msgstr "Průběh" -#: ../src/filetransfers_window.py:163 -#: ../src/filetransfers_window.py:223 +#: ../src/filetransfers_window.py:159 ../src/filetransfers_window.py:213 #, python-format msgid "Filename: %s" msgstr "Soubor: %s" -#: ../src/filetransfers_window.py:164 -#: ../src/filetransfers_window.py:298 +#: ../src/filetransfers_window.py:160 ../src/filetransfers_window.py:288 #, 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:173 -#: ../src/filetransfers_window.py:183 +#: ../src/filetransfers_window.py:169 ../src/filetransfers_window.py:179 #: ../src/history_manager.py:463 msgid "You" msgstr "Vy" -#: ../src/filetransfers_window.py:174 +#: ../src/filetransfers_window.py:170 #, python-format msgid "Sender: %s" msgstr "Odesílatel: %s" -#: ../src/filetransfers_window.py:175 -#: ../src/filetransfers_window.py:572 -#: ../src/tooltips.py:573 +#: ../src/filetransfers_window.py:171 ../src/filetransfers_window.py:577 +#: ../src/tooltips.py:586 msgid "Recipient: " msgstr "Příjemce: " -#: ../src/filetransfers_window.py:186 +#: ../src/filetransfers_window.py:182 #, python-format msgid "Saved in: %s" msgstr "Uloženo do: %s" -#: ../src/filetransfers_window.py:188 +#: ../src/filetransfers_window.py:184 msgid "File transfer completed" msgstr "Přenos soubor dokončen" -#: ../src/filetransfers_window.py:204 -#: ../src/filetransfers_window.py:212 +#: ../src/filetransfers_window.py:198 ../src/filetransfers_window.py:204 msgid "File transfer cancelled" msgstr "Přenos souboru zrušen" -#: ../src/filetransfers_window.py:204 -#: ../src/filetransfers_window.py:213 +#: ../src/filetransfers_window.py:198 ../src/filetransfers_window.py:205 msgid "Connection with peer cannot be established." msgstr "Spojení s protistranou se nepodařilo navázat." -#: ../src/filetransfers_window.py:224 +#: ../src/filetransfers_window.py:214 #, python-format msgid "Recipient: %s" msgstr "Příjemce: %s" -#: ../src/filetransfers_window.py:226 +#: ../src/filetransfers_window.py:216 #, python-format msgid "Error message: %s" msgstr "Chybová zpráva: %s" -#: ../src/filetransfers_window.py:227 +#: ../src/filetransfers_window.py:217 msgid "File transfer stopped by the contact at the other end" msgstr "Přenos souboru byl ukončen protistranou" -#: ../src/filetransfers_window.py:244 +#: ../src/filetransfers_window.py:234 msgid "Choose File to Send..." msgstr "Vyber soubor k odeslání..." -#: ../src/filetransfers_window.py:263 +#: ../src/filetransfers_window.py:253 msgid "Gajim cannot access this file" msgstr "Gajim nemůže otevřít tento soubor" -#: ../src/filetransfers_window.py:264 +#: ../src/filetransfers_window.py:254 msgid "This file is being used by another process." msgstr "Tento soubor je používán jiným procesem." -#: ../src/filetransfers_window.py:296 +#: ../src/filetransfers_window.py:286 #, python-format msgid "File: %s" msgstr "Soubor: %s" -#: ../src/filetransfers_window.py:301 +#: ../src/filetransfers_window.py:291 #, python-format msgid "Type: %s" msgstr "Typ: %s" -#: ../src/filetransfers_window.py:303 +#: ../src/filetransfers_window.py:293 #, python-format msgid "Description: %s" msgstr "Popis: %s" -#: ../src/filetransfers_window.py:304 +#: ../src/filetransfers_window.py:294 #, python-format msgid "%s wants to send you a file:" msgstr "%s Vám chce poslat soubor:" -#: ../src/filetransfers_window.py:318 -#: ../src/gtkgui_helpers.py:748 +#: ../src/filetransfers_window.py:308 ../src/gtkgui_helpers.py:766 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Nemohu přepsat existující soubor \"%s\"" -#: ../src/filetransfers_window.py:319 -#: ../src/gtkgui_helpers.py:750 -msgid "A file with this name already exists and you do not have permission to overwrite it." +#: ../src/filetransfers_window.py:309 ../src/gtkgui_helpers.py:768 +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:326 -#: ../src/gtkgui_helpers.py:754 +#: ../src/filetransfers_window.py:316 ../src/gtkgui_helpers.py:772 msgid "This file already exists" msgstr "Tento soubor už existuje" -#: ../src/filetransfers_window.py:326 -#: ../src/gtkgui_helpers.py:754 +#: ../src/filetransfers_window.py:316 ../src/gtkgui_helpers.py:772 msgid "What do you want to do?" msgstr "Co by jste rád(a) dělal(a)?" -#: ../src/filetransfers_window.py:338 -#: ../src/gtkgui_helpers.py:764 +#: ../src/filetransfers_window.py:328 ../src/gtkgui_helpers.py:782 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Adresář \"%s\" není zapisovatelný" -#: ../src/filetransfers_window.py:338 -#: ../src/gtkgui_helpers.py:765 +#: ../src/filetransfers_window.py:328 ../src/gtkgui_helpers.py:783 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:348 +#: ../src/filetransfers_window.py:338 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:429 +#: ../src/filetransfers_window.py:419 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -3580,97 +4032,104 @@ 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:505 +#: ../src/filetransfers_window.py:508 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" -#: ../src/filetransfers_window.py:544 -#: ../src/filetransfers_window.py:547 +#: ../src/filetransfers_window.py:547 ../src/filetransfers_window.py:550 msgid "Invalid File" msgstr "Neplatný soubor" -#: ../src/filetransfers_window.py:544 +#: ../src/filetransfers_window.py:547 msgid "File: " msgstr "Soubor: " -#: ../src/filetransfers_window.py:548 +#: ../src/filetransfers_window.py:551 msgid "It is not possible to send empty files" msgstr "Není možné posílat prázdné soubory" -#: ../src/filetransfers_window.py:568 -#: ../src/tooltips.py:563 +#: ../src/filetransfers_window.py:573 ../src/tooltips.py:576 msgid "Name: " msgstr "Jméno: " -#: ../src/filetransfers_window.py:570 -#: ../src/tooltips.py:567 +#: ../src/filetransfers_window.py:575 ../src/tooltips.py:580 msgid "Sender: " msgstr "Odesílatel: " -#: ../src/filetransfers_window.py:758 +#: ../src/filetransfers_window.py:763 msgid "Pause" msgstr "Pauza" -#: ../src/gajim.py:47 +#: ../src/gajim.py:49 #, python-format msgid "%s is not a valid loglevel" msgstr "%s není platný loglevel" -#: ../src/gajim.py:122 +#: ../src/gajim.py:138 msgid "Gajim needs X server to run. Quiting..." msgstr "Gajim vyžaduje k běhu X server. Končím..." -#: ../src/gajim.py:126 +#: ../src/gajim.py:142 msgid "Gajim needs PyGTK 2.8 or above" msgstr "Gajim vyžaduje PyGTK 2.8 nebo novější" -#: ../src/gajim.py:127 +#: ../src/gajim.py:143 msgid "Gajim needs PyGTK 2.8 or above to run. Quiting..." msgstr "Gajim vyžaduje PyGTK 2.8 nebo novější. Končím..." -#: ../src/gajim.py:129 +#: ../src/gajim.py:145 msgid "Gajim needs GTK 2.8 or above" msgstr "Gajim potřebuje GTK 2.8 nebo novější" -#: ../src/gajim.py:130 +#: ../src/gajim.py:146 msgid "Gajim needs GTK 2.8 or above to run. Quiting..." msgstr "Gajim vyžaduje GTK 2.8 nebo novější. Končím..." # FIXME: runtime je jak? -#: ../src/gajim.py:135 +#: ../src/gajim.py:151 msgid "GTK+ runtime is missing libglade support" msgstr "GTK+ runtime vyžaduje podporu libglade" # FIXME: runtime? -#: ../src/gajim.py:137 +#: ../src/gajim.py:153 #, python-format -msgid "Please remove your current GTK+ runtime and install the latest stable version from %s" -msgstr "Prosím odinstalujte stávající GTK+ runtime a nainstalujte poslední stabilní verzi z %s" +msgid "" +"Please remove your current GTK+ runtime and install the latest stable " +"version from %s" +msgstr "" +"Prosím odinstalujte stávající GTK+ runtime a nainstalujte poslední stabilní " +"verzi z %s" -#: ../src/gajim.py:139 -msgid "Please make sure that GTK+ and PyGTK have libglade support in your system." -msgstr "Ujistěte se prosím, že GTK+ a PyGTK ve Vašem systému podporují libglade." +#: ../src/gajim.py:155 +msgid "" +"Please make sure that GTK+ and PyGTK have libglade support in your system." +msgstr "" +"Ujistěte se prosím, že GTK+ a PyGTK ve Vašem systému podporují libglade." -#: ../src/gajim.py:144 +#: ../src/gajim.py:160 msgid "Gajim needs PySQLite2 to run" msgstr "Gajim vyžaduje PySQLite2" -#: ../src/gajim.py:152 +#: ../src/gajim.py:168 msgid "Gajim needs pywin32 to run" msgstr "Gajim potřebuje k běhu pywin32" -#: ../src/gajim.py:153 +#: ../src/gajim.py:169 #, python-format -msgid "Please make sure that Pywin32 is installed on your system. You can get it at %s" -msgstr "Prosím ujistěte se, že Pywin32 je nainstalován na vašem počítači. Můžete jej získat na %s" +msgid "" +"Please make sure that Pywin32 is installed on your system. You can get it at " +"%s" +msgstr "" +"Prosím ujistěte se, že Pywin32 je nainstalován na vašem počítači. Můžete jej " +"získat na %s" #. set the icon to all newly opened wind -#: ../src/gajim.py:300 +#: ../src/gajim.py:311 msgid "Gajim is already running" msgstr "Gajim již běží" -#: ../src/gajim.py:301 +#: ../src/gajim.py:312 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -3678,89 +4137,138 @@ msgstr "" "Jiná instance Gajimu pravděpodobně již běží\n" "Přesto spustit?" -#: ../src/gajim.py:408 +#: ../src/gajim.py:335 ../src/common/connection_handlers.py:897 +#: ../src/common/connection_handlers.py:1538 +#: ../src/common/connection_handlers.py:1566 +#: ../src/common/connection_handlers.py:1577 +#: ../src/common/connection_handlers.py:1596 +#: ../src/common/connection_handlers.py:1755 +#: ../src/common/connection_handlers.py:1867 ../src/common/connection.py:913 +msgid "Disk Write Error" +msgstr "" + +#: ../src/gajim.py:428 +msgid "Do you accept this request?" +msgstr "Chcete přijmout tuto žádost?" + +#: ../src/gajim.py:431 #, python-format msgid "HTTP (%s) Authorization for %s (id: %s)" msgstr "HTTP (%s) Autorizace pro %s (id: %s)" -#: ../src/gajim.py:409 -msgid "Do you accept this request?" -msgstr "Chcete přijmout tuto žádost?" - -#: ../src/gajim.py:455 -#: ../src/notify.py:435 +#: ../src/gajim.py:478 ../src/notify.py:447 msgid "Connection Failed" msgstr "Spojení selhalo" -#: ../src/gajim.py:775 +#: ../src/gajim.py:810 #, python-format msgid "Subject: %s" msgstr "Předmět: %s" #. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) -#: ../src/gajim.py:820 -#: ../src/gajim.py:833 +#: ../src/gajim.py:857 ../src/gajim.py:870 #, python-format msgid "error while sending %s ( %s )" msgstr "chyba při odesílání %s ( %s )" -#: ../src/gajim.py:866 +#: ../src/gajim.py:903 msgid "Authorization accepted" msgstr "Autorizace přijata" -#: ../src/gajim.py:867 +#: ../src/gajim.py:904 #, 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:875 +#: ../src/gajim.py:912 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Kontakt \"%s\" Vám odebral autorizaci" # FIXME: hrozna veta -#: ../src/gajim.py:876 +#: ../src/gajim.py:913 msgid "You will always see him or her as offline." msgstr "Uvidíte jej nebo ji vždy jako odpojenou." -#: ../src/gajim.py:919 +#: ../src/gajim.py:957 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Kontakt s \"%s\" nebyl navázán" -#: ../src/gajim.py:920 -#: ../src/common/connection.py:423 +#: ../src/gajim.py:958 ../src/common/connection.py:463 msgid "Check your connection or try again later." msgstr "Ověřte spojení nebo zkuste později." -#: ../src/gajim.py:1069 -#: ../src/roster_window.py:1217 +#: ../src/gajim.py:1129 ../src/roster_window.py:1342 #, python-format msgid "%s is now %s (%s)" msgstr "%s je nyní %s (%s)" #. No status message -#: ../src/gajim.py:1072 -#: ../src/groupchat_control.py:952 -#: ../src/roster_window.py:1220 +#: ../src/gajim.py:1132 ../src/groupchat_control.py:1100 +#: ../src/roster_window.py:1345 #, python-format msgid "%s is now %s" msgstr "%s je nyní %s" -#: ../src/gajim.py:1169 +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/gajim.py:1252 ../src/groupchat_control.py:912 +msgid "Any occupant is allowed to see your full JID" +msgstr "" + +#: ../src/gajim.py:1254 +msgid "Room now shows unavailable member" +msgstr "" + +#: ../src/gajim.py:1256 +msgid "room now does not show unavailable members" +msgstr "" + +#: ../src/gajim.py:1259 +msgid "A non-privacy-related room configuration change has occurred" +msgstr "" + +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#: ../src/gajim.py:1262 +msgid "Room logging is now enabled" +msgstr "" + +#: ../src/gajim.py:1264 +msgid "Room logging is now disabled" +msgstr "" + +#: ../src/gajim.py:1266 +msgid "Room is now non-anonymous" +msgstr "" + +#: ../src/gajim.py:1268 +msgid "Room is now semi-anonymous" +msgstr "" + +#: ../src/gajim.py:1270 +msgid "Room is now fully-anonymous" +msgstr "" + +#: ../src/gajim.py:1301 +#, fuzzy, python-format +msgid "A Password is required to join the room %s. Please type it" +msgstr "Pro připojení do této místnosti je vyžadováno heslo." + +#: ../src/gajim.py:1331 msgid "Your passphrase is incorrect" msgstr "Vaše heslo je neplatné" -#: ../src/gajim.py:1170 +#: ../src/gajim.py:1332 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:1273 +#: ../src/gajim.py:1436 #, python-format msgid "New mail on %(gmail_mail_address)s" msgstr "Nový E-mail pro %(gmail_mail_address)s" -#: ../src/gajim.py:1275 +#: ../src/gajim.py:1438 #, python-format msgid "You have %d new mail conversation" msgid_plural "You have %d new mail conversations" @@ -3771,7 +4279,7 @@ msgstr[2] "Máte %d nepřečtených E-mailů" #. FIXME: emulate Gtalk client popups. find out what they parse and how #. they decide what to show #. each message has a 'From', 'Subject' and 'Snippet' field -#: ../src/gajim.py:1284 +#: ../src/gajim.py:1447 #, python-format msgid "" "\n" @@ -3780,53 +4288,85 @@ msgstr "" "\n" "Od: %(from_address)s" -#: ../src/gajim.py:1440 +#: ../src/gajim.py:1603 #, python-format msgid "%s wants to send you a file." msgstr "%s Vám chce poslat soubor." -#: ../src/gajim.py:1505 +#: ../src/gajim.py:1668 #, 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:1509 +#: ../src/gajim.py:1672 #, 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:1522 +#: ../src/gajim.py:1685 #, 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:1526 +#: ../src/gajim.py:1689 #, 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:1639 +#: ../src/gajim.py:1823 msgid "Username Conflict" msgstr "Konflikt uživatelských jmen" -#: ../src/gajim.py:1640 +#: ../src/gajim.py:1824 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:1841 +msgid "Ping?" +msgstr "" + +#: ../src/gajim.py:1849 +#, python-format +msgid "Pong! (%s s.)" +msgstr "" + +#: ../src/gajim.py:1855 +msgid "Error." +msgstr "" + +#: ../src/gajim.py:1880 +#, fuzzy +msgid "Resource Conflict" +msgstr "Konflikt uživatelských jmen" + +#: ../src/gajim.py:1881 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" +msgstr "" + # FIXME: jaky je rozdil mezi settings a preferences? #. it is good to notify the user #. in case he or she cannot see the output of the console -#: ../src/gajim.py:1981 +#: ../src/gajim.py:2241 msgid "Could not save your settings and preferences" msgstr "Nelze uložit Vaše nastavení" -#: ../src/gajim.py:2179 +#. sorted alphanum +#: ../src/gajim.py:2376 ../src/common/config.py:85 ../src/common/config.py:393 +#: ../src/common/optparser.py:193 ../src/common/optparser.py:411 +#: ../src/common/optparser.py:445 +#, fuzzy +msgid "default" +msgstr "Výchozí" + +#: ../src/gajim.py:2462 msgid "Network Manager support not available" msgstr "Podpora Network Manageru není dostupná" -#: ../src/gajim.py:2258 +#: ../src/gajim.py:2563 msgid "Session Management support not available (missing gnome.ui module)" msgstr "Podpora Správce sezení není dostupná (schází gnome.ui modul)" @@ -3852,22 +4392,20 @@ msgid "Pops up a window with the next pending event" msgstr "Zobrazí okno s další nepřečtenou událostí" #: ../src/gajim-remote.py:81 -msgid "Prints a list of all contacts in the roster. Each contact appears on a separate line" -msgstr "Vytiskne seznam všech kontaktů v rosteru. Každý kontakt se objeví na samostatném řádku" +msgid "" +"Prints a list of all contacts in the roster. Each contact appears on a " +"separate line" +msgstr "" +"Vytiskne seznam všech kontaktů v rosteru. Každý kontakt se objeví na " +"samostatném řádku" -#: ../src/gajim-remote.py:84 -#: ../src/gajim-remote.py:99 -#: ../src/gajim-remote.py:109 -#: ../src/gajim-remote.py:122 -#: ../src/gajim-remote.py:136 -#: ../src/gajim-remote.py:157 -#: ../src/gajim-remote.py:187 -#: ../src/gajim-remote.py:196 -#: ../src/gajim-remote.py:203 -#: ../src/gajim-remote.py:210 -#: ../src/gajim-remote.py:221 -#: ../src/gajim-remote.py:237 -#: ../src/gajim-remote.py:246 +#: ../src/gajim-remote.py:84 ../src/gajim-remote.py:99 +#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:122 +#: ../src/gajim-remote.py:136 ../src/gajim-remote.py:145 +#: ../src/gajim-remote.py:166 ../src/gajim-remote.py:196 +#: ../src/gajim-remote.py:205 ../src/gajim-remote.py:212 +#: ../src/gajim-remote.py:219 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:246 ../src/gajim-remote.py:255 msgid "account" msgstr "účet" @@ -3890,11 +4428,11 @@ msgstr "stav" #: ../src/gajim-remote.py:97 msgid "one of: offline, online, chat, away, xa, dnd, invisible " -msgstr "jeden z: odpojen, připojen, ukecaný, pryč, nedostupný, nerušit, neviditelný " +msgstr "" +"jeden z: odpojen, připojen, ukecaný, pryč, nedostupný, nerušit, neviditelný " -#: ../src/gajim-remote.py:98 -#: ../src/gajim-remote.py:119 -#: ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:98 ../src/gajim-remote.py:119 +#: ../src/gajim-remote.py:133 ../src/gajim-remote.py:144 msgid "message" msgstr "zpráva" @@ -3903,8 +4441,12 @@ msgid "status message" msgstr "text stavu" #: ../src/gajim-remote.py:99 -msgid "change status of account \"account\". If not specified, try to change status of all accounts that have \"sync with global status\" option set" -msgstr "změnit stav účtu \"account\". Pokud není uveden, zkuste změnit stav všech účtů které mají povolenu volbu \"sync with global status\" " +msgid "" +"change status of account \"account\". If not specified, try to change status " +"of all accounts that have \"sync with global status\" option set" +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:105 msgid "Shows the chat dialog so that you can send messages to a contact" @@ -3914,43 +4456,51 @@ msgstr "Zobrazte okno rozhovoru, aby jste mohl(a) poslat zprávu kontaktu" msgid "JID of the contact that you want to chat with" msgstr "JID kontaktu, se kterým chcete komunikovat" -#: ../src/gajim-remote.py:109 -#: ../src/gajim-remote.py:187 +#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:196 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:114 -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 key', just set 'OpenPGP key' to ''." -msgstr "Poslat nový rozhovor kontaktu v Seznamu. Obojí OpenPGP klíč a účet jsou volitelné. Pokud chcete nastavit pouze 'account' bez 'OpenPGP key', nastavte prostě 'OpenPGP key' na ''." +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 " +"key', just set 'OpenPGP key' to ''." +msgstr "" +"Poslat nový rozhovor kontaktu v Seznamu. Obojí OpenPGP klíč a účet jsou " +"volitelné. Pokud chcete nastavit pouze 'account' bez 'OpenPGP key', nastavte " +"prostě 'OpenPGP key' na ''." -#: ../src/gajim-remote.py:118 -#: ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:118 ../src/gajim-remote.py:131 msgid "JID of the contact that will receive the message" msgstr "JID kontaktu, který obdrží zprávu" -#: ../src/gajim-remote.py:119 -#: ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:144 msgid "message contents" msgstr "Tělo zprávy" -#: ../src/gajim-remote.py:120 -#: ../src/gajim-remote.py:134 +#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 msgid "pgp key" msgstr "pgp klíč" -#: ../src/gajim-remote.py:120 -#: ../src/gajim-remote.py:134 +#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 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:122 -#: ../src/gajim-remote.py:136 +#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:136 +#: ../src/gajim-remote.py:145 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:127 -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 key', just set 'OpenPGP key' to ''." -msgstr "Poslat novou prostou zprávu kontaktu v Seznamu. Obojí OpenPGP klíč a účet jsou volitelné. Pokud chcete nastavit pouze 'account' bez 'OpenPGP key', nastavte prostě 'OpenPGP key' na ''." +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 " +"key', just set 'OpenPGP key' to ''." +msgstr "" +"Poslat novou prostou zprávu kontaktu v Seznamu. Obojí OpenPGP klíč a účet " +"jsou volitelné. Pokud chcete nastavit pouze 'account' bez 'OpenPGP key', " +"nastavte prostě 'OpenPGP key' na ''." #: ../src/gajim-remote.py:132 msgid "subject" @@ -3961,151 +4511,163 @@ msgid "message subject" msgstr "předmět zprávy" #: ../src/gajim-remote.py:141 +msgid "Sends new message to a groupchat you've joined." +msgstr "" + +#: ../src/gajim-remote.py:143 +#, fuzzy +msgid "JID of the room that will receive the message" +msgstr "JID kontaktu, který obdrží zprávu" + +#: ../src/gajim-remote.py:150 msgid "Gets detailed info on a contact" msgstr "Získej detailní informace o kontaktu" -#: ../src/gajim-remote.py:143 -#: ../src/gajim-remote.py:156 -#: ../src/gajim-remote.py:186 -#: ../src/gajim-remote.py:195 +#: ../src/gajim-remote.py:152 ../src/gajim-remote.py:165 +#: ../src/gajim-remote.py:195 ../src/gajim-remote.py:204 msgid "JID of the contact" msgstr "JID kontaktu" -#: ../src/gajim-remote.py:147 +#: ../src/gajim-remote.py:156 msgid "Gets detailed info on a account" msgstr "Získej detailní informace o účtu" -#: ../src/gajim-remote.py:149 +#: ../src/gajim-remote.py:158 msgid "Name of the account" msgstr "Jméno účtu" -#: ../src/gajim-remote.py:153 +#: ../src/gajim-remote.py:162 msgid "Sends file to a contact" msgstr "Pošle soubor kontaktu" -#: ../src/gajim-remote.py:155 +#: ../src/gajim-remote.py:164 msgid "file" msgstr "soubor" -#: ../src/gajim-remote.py:155 +#: ../src/gajim-remote.py:164 msgid "File path" msgstr "Cesta k souboru" -#: ../src/gajim-remote.py:157 +#: ../src/gajim-remote.py:166 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:162 +#: ../src/gajim-remote.py:171 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:166 +#: ../src/gajim-remote.py:175 msgid "Sets value of 'key' to 'value'." msgstr "Nastaví hodnotu klíče 'key' na hodnotu 'value'" -#: ../src/gajim-remote.py:168 +#: ../src/gajim-remote.py:177 msgid "key=value" msgstr "klíč=hodnota" # FIXME: opet -#: ../src/gajim-remote.py:168 +#: ../src/gajim-remote.py:177 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:173 +#: ../src/gajim-remote.py:182 msgid "Deletes a preference item" msgstr "Smaže položku nastavení" -#: ../src/gajim-remote.py:175 +#: ../src/gajim-remote.py:184 msgid "key" msgstr "klíč" -#: ../src/gajim-remote.py:175 +#: ../src/gajim-remote.py:184 msgid "name of the preference to be deleted" msgstr "jméno volby, která bude smazána" -#: ../src/gajim-remote.py:179 +#: ../src/gajim-remote.py:188 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:184 +#: ../src/gajim-remote.py:193 msgid "Removes contact from roster" msgstr "Odstraní kontakt ze Seznamu" -#: ../src/gajim-remote.py:193 +#: ../src/gajim-remote.py:202 msgid "Adds contact to roster" msgstr "Přidat kontakt do Seznamu" -#: ../src/gajim-remote.py:195 +#: ../src/gajim-remote.py:204 msgid "jid" msgstr "jid" -#: ../src/gajim-remote.py:196 +#: ../src/gajim-remote.py:205 msgid "Adds new contact to this account" msgstr "Přidá nový kontakt do tohoto účtu" -#: ../src/gajim-remote.py:201 +#: ../src/gajim-remote.py:210 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:208 -msgid "Returns current status message(the global one unless account is specified)" +#: ../src/gajim-remote.py:217 +msgid "" +"Returns current status message(the global one unless account is specified)" msgstr "Vrací aktuální stav (globální, pokud není uveden účet)" -#: ../src/gajim-remote.py:215 +#: ../src/gajim-remote.py:224 msgid "Returns number of unread messages" msgstr "Vrací počet nepřečtených zpráv" -#: ../src/gajim-remote.py:219 +#: ../src/gajim-remote.py:228 msgid "Opens 'Start Chat' dialog" msgstr "Otevře dialog 'Začít rozhovor'" -#: ../src/gajim-remote.py:221 +#: ../src/gajim-remote.py:230 msgid "Starts chat, using this account" msgstr "Začít rozhovor z tohoto účtu" -#: ../src/gajim-remote.py:225 +#: ../src/gajim-remote.py:234 msgid "Sends custom XML" msgstr "Poslat vlastní XML" -#: ../src/gajim-remote.py:227 +#: ../src/gajim-remote.py:236 msgid "XML to send" msgstr "XML k odeslání" -#: ../src/gajim-remote.py:228 -msgid "Account in which the xml will be sent; if not specified, xml will be sent to all accounts" -msgstr "Účet, ze kterého bude xml odesláno; pokud nebude uvedeno, xml bude odeslání ze všech účtů" +#: ../src/gajim-remote.py:237 +msgid "" +"Account in which the xml will be sent; if not specified, xml will be sent to " +"all accounts" +msgstr "" +"Účet, ze kterého bude xml odesláno; pokud nebude uvedeno, xml bude odeslání " +"ze všech účtů" -#: ../src/gajim-remote.py:234 +#: ../src/gajim-remote.py:243 msgid "Handle a xmpp:/ uri" msgstr "Obsluhovat xmpp:/ uri" -#: ../src/gajim-remote.py:236 +#: ../src/gajim-remote.py:245 msgid "uri" msgstr "uri" -#: ../src/gajim-remote.py:241 +#: ../src/gajim-remote.py:250 msgid "Join a MUC room" msgstr "_Vstoupit do místnosti MUC" -#: ../src/gajim-remote.py:243 +#: ../src/gajim-remote.py:252 msgid "room" msgstr "místnost" -#: ../src/gajim-remote.py:244 +#: ../src/gajim-remote.py:253 msgid "nick" msgstr "přezdívka" -#: ../src/gajim-remote.py:245 +#: ../src/gajim-remote.py:254 msgid "password" msgstr "heslo" -#: ../src/gajim-remote.py:268 +#: ../src/gajim-remote.py:277 msgid "Missing argument \"contact_jid\"" msgstr "Chybí parametry \"contact_jid\"" -#: ../src/gajim-remote.py:287 +#: ../src/gajim-remote.py:296 #, python-format msgid "" "'%s' is not in your roster.\n" @@ -4114,11 +4676,11 @@ 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:290 +#: ../src/gajim-remote.py:299 msgid "You have no active account" msgstr "Nemáte aktivní účet" -#: ../src/gajim-remote.py:354 +#: ../src/gajim-remote.py:363 #, python-format msgid "" "Usage: %s %s %s \n" @@ -4127,16 +4689,16 @@ msgstr "" "Použití: %s %s %s \n" "\t %s" -#: ../src/gajim-remote.py:357 +#: ../src/gajim-remote.py:366 msgid "Arguments:" msgstr "Parametry:" -#: ../src/gajim-remote.py:361 +#: ../src/gajim-remote.py:370 #, python-format msgid "%s not found" msgstr "%s nebyl nalezen" -#: ../src/gajim-remote.py:365 +#: ../src/gajim-remote.py:374 #, python-format msgid "" "Usage: %s command [arguments]\n" @@ -4145,7 +4707,7 @@ msgstr "" "Použití: %s příkaz [parametry]\n" "Příkaz je jeden z:\n" -#: ../src/gajim-remote.py:438 +#: ../src/gajim-remote.py:447 #, python-format msgid "" "Too many arguments. \n" @@ -4154,7 +4716,7 @@ msgstr "" "Příliš mnoho parametrů. \n" "Napište \"%s help %s\" pro více informací" -#: ../src/gajim-remote.py:442 +#: ../src/gajim-remote.py:451 #, python-format msgid "" "Argument \"%s\" is not specified. \n" @@ -4163,269 +4725,313 @@ msgstr "" "Parametry \"%s\" nebyl uveden. \n" "Napište \"%s help %s\" pro více informací" -#: ../src/gajim-remote.py:460 +#: ../src/gajim-remote.py:469 msgid "Wrong uri" msgstr "Nesprávné uri" -#: ../src/gajim_themes_window.py:60 +#: ../src/gajim_themes_window.py:61 msgid "Theme" msgstr "Téma" +#: ../src/gajim_themes_window.py:99 +#, fuzzy +msgid "You cannot make changes to the default theme" +msgstr "Nemůžete smazat právě používané téma" + +#: ../src/gajim_themes_window.py:100 +msgid "Please create a clean new theme with your desired name." +msgstr "" + #. don't confuse translators -#: ../src/gajim_themes_window.py:155 +#: ../src/gajim_themes_window.py:174 msgid "theme name" msgstr "jméno tématu" -#: ../src/gajim_themes_window.py:172 +#: ../src/gajim_themes_window.py:191 msgid "You cannot delete your current theme" msgstr "Nemůžete smazat právě používané téma" -#: ../src/gajim_themes_window.py:173 +#: ../src/gajim_themes_window.py:192 msgid "Please first choose another for your current theme." msgstr "Vyberte prosím napřed jiné téma." -#: ../src/groupchat_control.py:106 -msgid "Private Chat" -msgstr "Soukromý rozhovor" - -#: ../src/groupchat_control.py:106 -msgid "Private Chats" -msgstr "Soukromé rozhovory" - -#: ../src/groupchat_control.py:123 +#: ../src/groupchat_control.py:133 msgid "Sending private message failed" msgstr "Odesílání soukromé zprávy selhalo" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:125 +#: ../src/groupchat_control.py:135 #, python-format msgid "You are no longer in group chat \"%s\" or \"%s\" has left." msgstr "Už nejsi v místnosti \"%s\" nebo \"%s\" odešel(a)." -#: ../src/groupchat_control.py:144 -msgid "Group Chat" -msgstr "Diskuze" - -#: ../src/groupchat_control.py:144 -msgid "Group Chats" -msgstr "Diskuze" - -#: ../src/groupchat_control.py:318 +#: ../src/groupchat_control.py:341 msgid "Insert Nickname" msgstr "Vložit přezdívku" +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/groupchat_control.py:915 +msgid "Room logging is enabled" +msgstr "" + +#: ../src/groupchat_control.py:917 +#, fuzzy +msgid "A new room has been created" +msgstr "Váš účet byl úspěšně vytvořen" + +#: ../src/groupchat_control.py:920 +msgid "The server has assigned or modified your roomnick" +msgstr "" + #. do not print 'kicked by None' -#: ../src/groupchat_control.py:837 +#: ../src/groupchat_control.py:926 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s byli vyhozeni: %(reason)s" -#: ../src/groupchat_control.py:841 +#: ../src/groupchat_control.py:930 #, 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:848 +#: ../src/groupchat_control.py:937 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s byli zakázáni: %(reason)s" -#: ../src/groupchat_control.py:852 +#: ../src/groupchat_control.py:941 #, 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:860 +#. Someone changed his or her nick +#. We changed our nick +#: ../src/groupchat_control.py:948 #, python-format msgid "You are now known as %s" msgstr "Jste nyní znám(a) jako %s" -#: ../src/groupchat_control.py:862 +#: ../src/groupchat_control.py:950 #, python-format msgid "%s is now known as %s" msgstr "%s se přejmenoval na %s" -#: ../src/groupchat_control.py:945 +#: ../src/groupchat_control.py:983 ../src/groupchat_control.py:987 +#: ../src/groupchat_control.py:992 +#, fuzzy, python-format +msgid "%(nick)s has been removed from the room (%(reason)s)" +msgstr "%(nick)s byli vyhozeni od %(who)s: %(reason)s" + +#: ../src/groupchat_control.py:984 +#, fuzzy +msgid "affiliation changed" +msgstr "Přidružení:" + +#: ../src/groupchat_control.py:989 +msgid "room configuration changed to members-only" +msgstr "" + +#: ../src/groupchat_control.py:994 +msgid "system shutdown" +msgstr "" + +#: ../src/groupchat_control.py:1093 #, python-format msgid "%s has left" msgstr "%s odešel(a)" -#: ../src/groupchat_control.py:950 +#: ../src/groupchat_control.py:1098 #, python-format msgid "%s has joined the group chat" msgstr "%s vstoupil do místnosti" -#: ../src/groupchat_control.py:1072 -#: ../src/groupchat_control.py:1090 -#: ../src/groupchat_control.py:1183 -#: ../src/groupchat_control.py:1200 +#: ../src/groupchat_control.py:1229 ../src/groupchat_control.py:1247 +#: ../src/groupchat_control.py:1340 ../src/groupchat_control.py:1357 #, python-format msgid "Nickname not found: %s" msgstr "Přezdívka nenalezena: %s" -#: ../src/groupchat_control.py:1106 +#: ../src/groupchat_control.py:1263 msgid "This group chat has no subject" msgstr "Místnost nemá žádné téma" -#: ../src/groupchat_control.py:1119 +#: ../src/groupchat_control.py:1276 #, python-format msgid "Invited %(contact_jid)s to %(room_jid)s." msgstr "Pozval(a) %(contact_jid)s do %(room_jid)s." #. %s is something the user wrote but it is not a jid so we inform -#: ../src/groupchat_control.py:1126 -#: ../src/groupchat_control.py:1154 +#: ../src/groupchat_control.py:1283 ../src/groupchat_control.py:1311 #, python-format msgid "%s does not appear to be a valid JID" msgstr "%s nevypadá jako platné JID" -#: ../src/groupchat_control.py:1237 +#: ../src/groupchat_control.py:1420 #, python-format -msgid "No such command: /%s (if you want to send this, prefix it with /say)" -msgstr "Neznámý příkaz: /%s (pokud to chcete odeslat, napište před to /say)" +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. Does " +"NOT support spaces in nickname." +msgstr "" +"Použití: /%s [důvod], zakáže JID přístup do místnosti. " +"Přezdívka nájemníka může být nahrazena, pokud neobsahuje \"@\". Pokud je JID " +"právě v místnosti, bude vyhozen. NEpodporuje mezery v přezdívce." -#: ../src/groupchat_control.py:1260 +#: ../src/groupchat_control.py:1427 #, python-format -msgid "Commands: %s" -msgstr "Příkazy: %s" +msgid "" +"Usage: /%s , opens a private chat window with the specified " +"occupant." +msgstr "" +"Použití: /%s , otevře okno soukromého rozhovoru uvedenému " +"nájemníkovi." -#: ../src/groupchat_control.py:1262 +#: ../src/groupchat_control.py:1433 #, python-format -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. Does NOT support spaces in nickname." -msgstr "Použití: /%s [důvod], zakáže JID přístup do místnosti. Přezdívka nájemníka může být nahrazena, pokud neobsahuje \"@\". Pokud je JID právě v místnosti, bude vyhozen. NEpodporuje mezery v přezdívce." +msgid "" +"Usage: /%s [reason], closes the current window or tab, displaying reason if " +"specified." +msgstr "" +"Použití: /%s [důvod], uzavře toto okno nebo záložku, a vypíše důvod, pokud " +"byl uveden." -#: ../src/groupchat_control.py:1269 +#: ../src/groupchat_control.py:1439 #, python-format -msgid "Usage: /%s , opens a private chat window with the specified occupant." -msgstr "Použití: /%s , otevře okno soukromého rozhovoru uvedenému nájemníkovi." +msgid "" +"Usage: /%s [reason], invites JID to the current group chat, optionally " +"providing a reason." +msgstr "" +"Použití: /%s [důvod], pozve JID do této místnosti, případně s uvedeným " +"důvodem." -#: ../src/groupchat_control.py:1273 +#: ../src/groupchat_control.py:1443 #, python-format -msgid "Usage: /%s, clears the text window." -msgstr "Použití: /%s, smaže zprávy v okně." +msgid "" +"Usage: /%s @[/nickname], offers to join room@server optionally " +"using specified nickname." +msgstr "" +"Použití: /%s @[/přezdívka], nabízí vstup do místnosti " +"místnost@server, případně s uvedenou přezdívkou." -#: ../src/groupchat_control.py:1275 +#: ../src/groupchat_control.py:1447 #, python-format -msgid "Usage: /%s [reason], closes the current window or tab, displaying reason if specified." -msgstr "Použití: /%s [důvod], uzavře toto okno nebo záložku, a vypíše důvod, pokud byl uveden." +msgid "" +"Usage: /%s [reason], removes the occupant specified by nickname " +"from the group chat and optionally displays a reason. Does NOT support " +"spaces in nickname." +msgstr "" +"Použití: /%s [důvod], odstraní nájemníka určeného přezdívkou z " +"místnosti a případně zobrazí důvod. NEpodporuje mezery v přezdívce." -#: ../src/groupchat_control.py:1278 +#: ../src/groupchat_control.py:1456 #, python-format -msgid "Usage: /%s, hide the chat buttons." -msgstr "Použití: /%s, skryje tlačítka rozhovoru." +msgid "" +"Usage: /%s [message], opens a private message window and sends " +"message to the occupant specified by nickname." +msgstr "" +"Použití: /%s [zpráva], otevře okno se soukromou zprávou a odešle " +"zprávu nájemníkovi určeném přezdívkou." -#: ../src/groupchat_control.py:1281 -#, python-format -msgid "Usage: /%s [reason], invites JID to the current group chat, optionally providing a reason." -msgstr "Použití: /%s [důvod], pozve JID do této místnosti, případně s uvedeným důvodem." - -#: ../src/groupchat_control.py:1285 -#, python-format -msgid "Usage: /%s @[/nickname], offers to join room@server optionally using specified nickname." -msgstr "Použití: /%s @[/přezdívka], nabízí vstup do místnosti místnost@server, případně s uvedenou přezdívkou." - -#: ../src/groupchat_control.py:1289 -#, python-format -msgid "Usage: /%s [reason], removes the occupant specified by nickname from the group chat and optionally displays a reason. Does NOT support spaces in nickname." -msgstr "Použití: /%s [důvod], odstraní nájemníka určeného přezdívkou z místnosti a případně zobrazí důvod. NEpodporuje mezery v přezdívce." - -#: ../src/groupchat_control.py:1294 -#, python-format -msgid "Usage: /%s , sends action to the current group chat. Use third person. (e.g. /%s explodes.)" -msgstr "Použití: /%s , pošle akci do aktuální místnosti. Použijte třetí osobu (například /%s explodoval.)" - -#: ../src/groupchat_control.py:1298 -#, python-format -msgid "Usage: /%s [message], opens a private message window and sends message to the occupant specified by nickname." -msgstr "Použití: /%s [zpráva], otevře okno se soukromou zprávou a odešle zprávu nájemníkovi určeném přezdívkou." - -#: ../src/groupchat_control.py:1303 +#: ../src/groupchat_control.py:1461 #, python-format msgid "Usage: /%s , changes your nickname in current group chat." msgstr "Použití: /%s , změní Vaši přezdívku v aktuální místnosti" -#: ../src/groupchat_control.py:1307 +#: ../src/groupchat_control.py:1465 #, python-format msgid "Usage: /%s , display the names of group chat occupants." msgstr "Použití: /%s , zobrazí jména nájemníků v místnosti." -#: ../src/groupchat_control.py:1311 +#: ../src/groupchat_control.py:1469 #, python-format msgid "Usage: /%s [topic], displays or updates the current group chat topic." -msgstr "Použití: /%s [téma], zobrazí nebo aktualizuje téma v aktuální místnosti." +msgstr "" +"Použití: /%s [téma], zobrazí nebo aktualizuje téma v aktuální místnosti." -#: ../src/groupchat_control.py:1314 +#: ../src/groupchat_control.py:1472 #, python-format -msgid "Usage: /%s , sends a message without looking for other commands." +msgid "" +"Usage: /%s , sends a message without looking for other commands." msgstr "Použití: /%s , odešle zprávu bez hledání jiných příkazů." -#: ../src/groupchat_control.py:1317 -#, python-format -msgid "No help info for /%s" -msgstr "Žádná další nápověda pro /%s" - -#: ../src/groupchat_control.py:1380 +#: ../src/groupchat_control.py:1561 #, 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:1382 -msgid "If you close this window, you will be disconnected from this group chat." +#: ../src/groupchat_control.py:1563 +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:1386 -#: ../src/roster_window.py:4042 +#: ../src/groupchat_control.py:1567 ../src/roster_window.py:4826 msgid "Do _not ask me again" msgstr "Příště _nezobrazovat" -#: ../src/groupchat_control.py:1420 +#: ../src/groupchat_control.py:1601 msgid "Changing Subject" msgstr "Měním Téma" -#: ../src/groupchat_control.py:1421 +#: ../src/groupchat_control.py:1602 msgid "Please specify the new subject:" msgstr "Prosím zadejte nové téma:" -#: ../src/groupchat_control.py:1430 +#: ../src/groupchat_control.py:1611 msgid "Changing Nickname" msgstr "Měním přezdívku" -#: ../src/groupchat_control.py:1431 +#: ../src/groupchat_control.py:1612 msgid "Please specify the new nickname you want to use:" msgstr "Prosím zadejte novou přezdívku, kterou chcete používat:" -#: ../src/groupchat_control.py:1456 +#. Ask for a reason +#: ../src/groupchat_control.py:1627 +#, fuzzy, python-format +msgid "Destroying %s" +msgstr "Popis: %s" + +#: ../src/groupchat_control.py:1628 +msgid "" +"You are going to definitively destroy this room.\n" +"You may specify a reason below:" +msgstr "" + +#: ../src/groupchat_control.py:1630 +msgid "You may also enter an alternate venue:" +msgstr "" + +#: ../src/groupchat_control.py:1661 msgid "Bookmark already set" msgstr "Záložka je už nastavena" -#: ../src/groupchat_control.py:1457 +#: ../src/groupchat_control.py:1662 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Diskuze \"%s\" už je ve Vašich záložkách." -#: ../src/groupchat_control.py:1466 +#: ../src/groupchat_control.py:1671 msgid "Bookmark has been added successfully" msgstr "Záložka byla úspěšně přidána" -#: ../src/groupchat_control.py:1467 +#: ../src/groupchat_control.py:1672 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." #. ask for reason -#: ../src/groupchat_control.py:1595 +#: ../src/groupchat_control.py:1824 #, python-format msgid "Kicking %s" msgstr "Vyhazuji %s" -#: ../src/groupchat_control.py:1596 -#: ../src/groupchat_control.py:1879 +#: ../src/groupchat_control.py:1825 ../src/groupchat_control.py:2125 msgid "You may specify a reason below:" msgstr "Můžete uvést důvod níže:" #. ask for reason -#: ../src/groupchat_control.py:1878 +#: ../src/groupchat_control.py:2124 #, python-format msgid "Banning %s" msgstr "Zakazuji %s" @@ -4436,7 +5042,9 @@ msgid "A programming error has been detected" msgstr "Byla objevena chyba v programu" #: ../src/gtkexcepthook.py:42 -msgid "It probably is not fatal, but should be reported to the developers nonetheless." +msgid "" +"It probably is not fatal, but should be reported to the developers " +"nonetheless." msgstr "Pravděpodobně není fatální, ale přesto by měla být ohlášena vývojářům." #: ../src/gtkexcepthook.py:48 @@ -4448,8 +5056,7 @@ msgid "Details" msgstr "Detaily" #. we talk about file -#: ../src/gtkgui_helpers.py:156 -#: ../src/gtkgui_helpers.py:171 +#: ../src/gtkgui_helpers.py:156 ../src/gtkgui_helpers.py:171 #, python-format msgid "Error: cannot open %s for reading" msgstr "Chyba: nemůžu otevřít %s pro čtení" @@ -4470,32 +5077,33 @@ 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:692 +#: ../src/gtkgui_helpers.py:710 msgid "Gajim is not the default Jabber client" msgstr "Gajim není výchozí Jabber klient" -#: ../src/gtkgui_helpers.py:693 +#: ../src/gtkgui_helpers.py:711 msgid "Would you like to make Gajim the default Jabber client?" msgstr "Chcete nastavit Gajim jako výchozí Jabber klient?" -#: ../src/gtkgui_helpers.py:694 +#: ../src/gtkgui_helpers.py:712 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:793 +#: ../src/gtkgui_helpers.py:811 msgid "Extension not supported" msgstr "Rozšíření není podporováno" -#: ../src/gtkgui_helpers.py:794 +#: ../src/gtkgui_helpers.py:812 #, 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?" +msgstr "" +"Obrázek nelze uložit ve formátu %(type)s. Uložit jako %(new_filename)s?" -#: ../src/gtkgui_helpers.py:803 +#: ../src/gtkgui_helpers.py:821 msgid "Save Image as..." msgstr "Uložit obrázek jako..." -#: ../src/history_manager.py:65 +#: ../src/history_manager.py:68 msgid "Cannot find history logs database" msgstr "Nemůžu nalézt databázi s historií" @@ -4505,36 +5113,39 @@ msgid "Contacts" msgstr "Kontakty" #. holds time -#: ../src/history_manager.py:121 -#: ../src/history_manager.py:161 +#: ../src/history_manager.py:121 ../src/history_manager.py:161 #: ../src/history_window.py:86 msgid "Date" msgstr "Datum" #. holds nickname -#: ../src/history_manager.py:127 -#: ../src/history_manager.py:179 +#: ../src/history_manager.py:127 ../src/history_manager.py:179 msgid "Nickname" msgstr "Přezdívka" #. holds message -#: ../src/history_manager.py:135 -#: ../src/history_manager.py:167 +#: ../src/history_manager.py:135 ../src/history_manager.py:167 #: ../src/history_window.py:94 msgid "Message" msgstr "Zpráva" #: ../src/history_manager.py:187 -msgid "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS RUNNING)" +msgid "" +"Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " +"RUNNING)" msgstr "Chcete pročistit databázi? (VELICE NEDOPORUČUJEME POKUD GAJIM BĚŽÍ)" #: ../src/history_manager.py:189 msgid "" -"Normally allocated database size will not be freed, it will just become reusable. If you really want to reduce database filesize, click YES, else click NO.\n" +"Normally allocated database size will not be freed, it will just become " +"reusable. If you really want to reduce database filesize, click YES, else " +"click NO.\n" "\n" "In case you click YES, please wait..." msgstr "" -"Běžně se velikost alokovaná databází neuvolňuje, pouze se označí k novému použití. Pokud opravdu chcete snížit velikost databáze, klikněte ANO, jinak NE.\n" +"Běžně se velikost alokovaná databází neuvolňuje, pouze se označí k novému " +"použití. Pokud opravdu chcete snížit velikost databáze, klikněte ANO, jinak " +"NE.\n" "\n" "V případě kliknutí na ANO prosím vyčkejte..." @@ -4554,8 +5165,7 @@ 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:518 -#: ../src/history_manager.py:554 +#: ../src/history_manager.py:518 ../src/history_manager.py:554 msgid "This is an irreversible operation." msgstr "Tato operace je nevratná." @@ -4566,222 +5176,97 @@ msgstr[0] "Vážně chcete smazat vybranou zprávu?" msgstr[1] "Vážně chcete smazat vybrané zprávy?" msgstr[2] "" -#: ../src/history_window.py:103 -#: ../src/history_window.py:105 +#: ../src/history_window.py:103 ../src/history_window.py:105 #, python-format msgid "Conversation History with %s" msgstr "Historie rozhovorů s %s" -#: ../src/history_window.py:258 +#: ../src/history_window.py:266 #, 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:262 -#: ../src/notify.py:199 +#: ../src/history_window.py:270 ../src/notify.py:205 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s je nyní %(status)s" -#: ../src/history_window.py:268 +#: ../src/history_window.py:276 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Status je nyní %(status)s: %(status_msg)s" -#: ../src/history_window.py:271 +#: ../src/history_window.py:279 #, python-format msgid "Status is now: %(status)s" msgstr "Status je nyní %(status)s" -#. 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:52 -msgid "English" -msgstr "Angličtina" +#: ../src/htmltextview.py:583 ../src/htmltextview.py:594 +#, fuzzy +msgid "Timeout loading image" +msgstr "Nezdařilo se načtení obrázku" -#: ../src/chat_control.py:52 -msgid "Belarusian" -msgstr "Běloruština" +#: ../src/htmltextview.py:604 +msgid "Image is too big" +msgstr "" -#: ../src/chat_control.py:52 -msgid "Bulgarian" -msgstr "Bulharština" - -#: ../src/chat_control.py:52 -msgid "Breton" -msgstr "Bretonština" - -#: ../src/chat_control.py:52 -msgid "Czech" -msgstr "Čeština" - -#: ../src/chat_control.py:52 -msgid "German" -msgstr "Němčina" - -#: ../src/chat_control.py:52 -msgid "Greek" -msgstr "Řečtina" - -#: ../src/chat_control.py:52 -msgid "British" -msgstr "Britština" - -#: ../src/chat_control.py:52 -msgid "Esperanto" -msgstr "Esperanto" - -#: ../src/chat_control.py:52 -msgid "Spanish" -msgstr "Španělština" - -#: ../src/chat_control.py:52 -msgid "Basque" -msgstr "Baskičtina" - -#: ../src/chat_control.py:52 -msgid "French" -msgstr "Francouzština" - -#: ../src/chat_control.py:52 -msgid "Croatian" -msgstr "Chorvatština" - -#: ../src/chat_control.py:52 -msgid "Italian" -msgstr "Italština" - -#: ../src/chat_control.py:52 -msgid "Norwegian (b)" -msgstr "Norština (b)" - -#: ../src/chat_control.py:52 -msgid "Dutch" -msgstr "Holandština" - -#: ../src/chat_control.py:52 -msgid "Norwegian" -msgstr "Norština" - -#: ../src/chat_control.py:52 -msgid "Polish" -msgstr "Polština" - -#: ../src/chat_control.py:52 -msgid "Portuguese" -msgstr "Portugalština" - -#: ../src/chat_control.py:52 -msgid "Brazilian Portuguese" -msgstr "Brazilská portugalština" - -#: ../src/chat_control.py:52 -msgid "Russian" -msgstr "Ruština" - -#: ../src/chat_control.py:52 -msgid "Slovak" -msgstr "Slovenština" - -#: ../src/chat_control.py:52 -msgid "Swedish" -msgstr "Švédština" - -#: ../src/chat_control.py:52 -msgid "Chinese (Ch)" -msgstr "Čínština" - -#: ../src/chat_control.py:247 -msgid "Spelling language" -msgstr "Kontrola jazyka" - -#. we are not connected -#: ../src/chat_control.py:270 -#: ../src/chat_control.py:476 -msgid "A connection is not available" -msgstr "Spojení není dostupné" - -#: ../src/chat_control.py:271 -#: ../src/chat_control.py:477 -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:856 +#: ../src/message_window.py:287 msgid "Chats" msgstr "Rozhovory" -#: ../src/chat_control.py:1038 -#, python-format -msgid "%(nickname)s from group chat %(room_name)s" -msgstr "%(nickname)s z diskuze %(room_name)s" +#: ../src/message_window.py:289 +msgid "Group Chats" +msgstr "Diskuze" -#. we talk about a contact here -#: ../src/chat_control.py:1127 -#, python-format -msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" -msgstr "%s nerozesílá svůj OpenPGP klíč nebo nemá žádný přiřazen" +#: ../src/message_window.py:291 +msgid "Private Chats" +msgstr "Soukromé rozhovory" -#: ../src/chat_control.py:1263 -msgid "Encryption enabled" -msgstr "Šifrování zapnuto" - -#: ../src/chat_control.py:1268 -msgid "Encryption disabled" -msgstr "Šifrování vypnuto" - -#. %s is being replaced in the code with JID -#: ../src/chat_control.py:1556 -#, 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:1557 -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/message_window.py:273 +#: ../src/message_window.py:293 msgid "Messages" msgstr "Zprávy" -#: ../src/message_window.py:274 +#: ../src/message_window.py:294 #, python-format msgid "%s - Gajim" msgstr "%s - Gajim" -#: ../src/notify.py:197 +#: ../src/notify.py:203 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s Změnil(a) stav" -#: ../src/notify.py:207 +#: ../src/notify.py:213 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s se přihlásil" -#: ../src/notify.py:215 +#: ../src/notify.py:221 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s se odhlásil" -#: ../src/notify.py:227 +#: ../src/notify.py:233 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Nová jednoduché zpráva od %(nickname)s" -#: ../src/notify.py:235 +#: ../src/notify.py:241 #, python-format msgid "New Private Message from group chat %s" msgstr "Nová soukromá zpráva z místnosti %s" -#: ../src/notify.py:236 +#: ../src/notify.py:243 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:242 +#: ../src/notify.py:246 +#, fuzzy, python-format +msgid "Messaged by %(nickname)s" +msgstr "Nová zpráva od %(nickname)s" + +#: ../src/notify.py:252 #, python-format msgid "New Message from %(nickname)s" msgstr "Nová zpráva od %(nickname)s" @@ -4790,255 +5275,340 @@ msgstr "Nová zpráva od %(nickname)s" msgid "Retrieving profile..." msgstr "Stahuji profil..." +#: ../src/profile_window.py:123 ../src/roster_window.py:1876 +#, fuzzy +msgid "File is empty" +msgstr "Cesta k souboru" + +#: ../src/profile_window.py:126 ../src/roster_window.py:1879 +#, fuzzy +msgid "File does not exist" +msgstr "Taková diskuze neexistuje." + #. keep identation -#: ../src/profile_window.py:143 +#. unknown format +#: ../src/profile_window.py:140 ../src/profile_window.py:156 +#: ../src/roster_window.py:1881 ../src/roster_window.py:1892 msgid "Could not load image" msgstr "Nezdařilo se načtení obrázku" -#: ../src/profile_window.py:255 +#: ../src/profile_window.py:257 msgid "Information received" msgstr "Informace přijata" -#: ../src/profile_window.py:324 +#: ../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:336 +#: ../src/profile_window.py:338 msgid "Sending profile..." msgstr "Odesílám profil..." -#: ../src/profile_window.py:351 +#: ../src/profile_window.py:353 msgid "Information NOT published" msgstr "Informace NEBYLY zveřejněny" -#: ../src/profile_window.py:358 +#: ../src/profile_window.py:360 msgid "vCard publication failed" msgstr "publikování vizitky se nezdařilo" -#: ../src/profile_window.py:359 -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/profile_window.py:361 +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:171 -#: ../src/roster_window.py:226 +#: ../src/roster_window.py:181 ../src/roster_window.py:236 msgid "Merged accounts" msgstr "Spojené účty" -#: ../src/roster_window.py:344 -#: ../src/common/helpers.py:43 +#: ../src/roster_window.py:356 ../src/roster_window.py:621 +#: ../src/roster_window.py:2110 ../src/common/contacts.py:307 +#: ../src/common/helpers.py:44 msgid "Observers" msgstr "Přihlížející" -#: ../src/roster_window.py:691 -#: ../src/roster_window.py:3207 +#. Make special context menu if group is Groupchats +#: ../src/roster_window.py:440 ../src/roster_window.py:445 +#: ../src/roster_window.py:1935 ../src/roster_window.py:1938 +#: ../src/roster_window.py:2607 ../src/roster_window.py:2610 +#: ../src/roster_window.py:2635 ../src/roster_window.py:4686 +#: ../src/roster_window.py:4688 ../src/common/commands.py:194 +#: ../src/common/contacts.py:97 ../src/common/helpers.py:44 +msgid "Groupchats" +msgstr "Diskuze" + +#: ../src/roster_window.py:770 ../src/roster_window.py:3947 msgid "You cannot join a group chat while you are invisible" msgstr "Nemůžete vstoupit do diskuze, pokud jste neviditelný(á)" #. new chat +#. single message #. for chat_with #. for single message -#: ../src/roster_window.py:883 -#: ../src/systray.py:187 -#: ../src/systray.py:192 +#. join gc +#: ../src/roster_window.py:983 ../src/roster_window.py:993 +#: ../src/roster_window.py:1002 ../src/systray.py:207 ../src/systray.py:212 +#: ../src/systray.py:218 #, python-format msgid "using account %s" msgstr "pomocí účtu %s" -#. the 'manage gc bookmarks' item is shown -#. below to avoid duplicate code #. add -#: ../src/roster_window.py:908 +#: ../src/roster_window.py:1009 #, python-format msgid "to %s account" msgstr "do účtu %s" #. disco -#: ../src/roster_window.py:913 +#: ../src/roster_window.py:1014 #, python-format msgid "using %s account" msgstr "pomocí účtu %s" +#: ../src/roster_window.py:1095 +msgid "_Manage Bookmarks..." +msgstr "Spravovat _záložky..." + #. profile, avatar -#: ../src/roster_window.py:988 +#: ../src/roster_window.py:1114 #, python-format msgid "of account %s" msgstr "účtu %s" -#: ../src/roster_window.py:1008 -msgid "_Manage Bookmarks..." -msgstr "Spravovat _záložky..." - -#: ../src/roster_window.py:1037 +#: ../src/roster_window.py:1154 #, python-format msgid "for account %s" msgstr "pro účet %s" #. History manager -#: ../src/roster_window.py:1058 +#: ../src/roster_window.py:1175 msgid "History Manager" msgstr "Správce historie" -#: ../src/roster_window.py:1067 +#: ../src/roster_window.py:1184 msgid "_Join New Group Chat" msgstr "_Připojit se do diskuze" -#: ../src/roster_window.py:1397 -#: ../src/roster_window.py:3400 -#: ../src/roster_window.py:3407 +#: ../src/roster_window.py:1538 ../src/roster_window.py:4145 +#: ../src/roster_window.py:4152 msgid "You have unread messages" msgstr "Máte nepřečtené zprávy" -#: ../src/roster_window.py:1398 +#: ../src/roster_window.py:1539 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:1401 +#: ../src/roster_window.py:1542 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transport \"%s\" bude smazán" -#: ../src/roster_window.py:1402 -msgid "You will no longer be able to send and receive messages from contacts using this transport." -msgstr "Už více nebudete moci posílat i přijímat zprávy od kontaktů z tohoto transportu." +#: ../src/roster_window.py:1543 +msgid "" +"You will no longer be able to send and receive messages from contacts using " +"this transport." +msgstr "" +"Už více nebudete moci posílat i přijímat zprávy od kontaktů z tohoto " +"transportu." -#: ../src/roster_window.py:1405 +#: ../src/roster_window.py:1546 msgid "Transports will be removed" msgstr "Transport bude smazán" -#: ../src/roster_window.py:1410 +#: ../src/roster_window.py:1551 #, python-format -msgid "You will no longer be able to send and receive messages to contacts from these transports:%s" -msgstr "Už více nebudete moci posílat i přijímat zprávy od kontaktů z těchto transportů:%s" +msgid "" +"You will no longer be able to send and receive messages to contacts from " +"these transports:%s" +msgstr "" +"Už více nebudete moci posílat i přijímat zprávy od kontaktů z těchto " +"transportů:%s" #. it's jid -#: ../src/roster_window.py:1430 +#: ../src/roster_window.py:1717 msgid "Rename Contact" msgstr "Přejmenovat kontakt" -#: ../src/roster_window.py:1431 +#: ../src/roster_window.py:1718 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Zadej novou přezdívku pro kontakt %s." -#: ../src/roster_window.py:1438 +#: ../src/roster_window.py:1725 msgid "Rename Group" msgstr "Přejmenovat skupinu" -#: ../src/roster_window.py:1439 +#: ../src/roster_window.py:1726 #, python-format msgid "Enter a new name for group %s" msgstr "Zadej nové jméno pro skupinu %s." -#: ../src/roster_window.py:1514 +#: ../src/roster_window.py:1801 msgid "Remove Group" msgstr "Odstranit skupinu" -#: ../src/roster_window.py:1515 +#: ../src/roster_window.py:1802 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Chceš smazat skupinu %s z rosteru?" -#: ../src/roster_window.py:1516 +#: ../src/roster_window.py:1803 msgid "Remove also 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:1545 +#: ../src/roster_window.py:1834 msgid "Assign OpenPGP Key" msgstr "Přiřadit OpenPGP klíč" -#: ../src/roster_window.py:1546 +#: ../src/roster_window.py:1835 msgid "Select a key to apply to the contact" msgstr "Vybrat klíč k použítí s kontaktem" -#: ../src/roster_window.py:1781 -#: ../src/roster_window.py:2042 -msgid "_New group chat" -msgstr "_Nová diskuze" +#: ../src/roster_window.py:2156 +#, fuzzy +msgid "_New Group Chat" +msgstr "Nová diskuze" -#: ../src/roster_window.py:1912 +#: ../src/roster_window.py:2298 msgid "I would like to add you to my roster" msgstr "Rád bych si Vás přidal(a) do svého seznamu" -#: ../src/roster_window.py:2087 -#: ../src/roster_window.py:2134 +#. Send Group Message +#: ../src/roster_window.py:2432 ../src/roster_window.py:2644 msgid "Send Group M_essage" msgstr "Ode_slat skupinovou zprávu" -#: ../src/roster_window.py:2113 -msgid "Re_name" -msgstr "Přejme_novat" +#: ../src/roster_window.py:2451 +msgid "_New group chat" +msgstr "_Nová diskuze" -#: ../src/roster_window.py:2140 +#. Manage Transport submenu +#: ../src/roster_window.py:2489 +#, fuzzy +msgid "_Manage Contacts" +msgstr "Přejmenovat kontakt" + +#: ../src/roster_window.py:2550 +msgid "_Maximize" +msgstr "" + +#: ../src/roster_window.py:2557 +#, fuzzy +msgid "_Disconnect" +msgstr "Kontakt se odpojil" + +#: ../src/roster_window.py:2636 +msgid "_Maximize All" +msgstr "" + +#: ../src/roster_window.py:2652 msgid "To all users" msgstr "Všem uživatelům" -#: ../src/roster_window.py:2143 +#: ../src/roster_window.py:2655 msgid "To all online users" msgstr "Všem dostupným uživatelům" -#: ../src/roster_window.py:2179 +#. Log Off +#: ../src/roster_window.py:2772 +#, fuzzy +msgid "_Log off" +msgstr "_Odhlásit" + +#. Log on +#: ../src/roster_window.py:2778 msgid "_Log on" msgstr "Přih_lásit" -#: ../src/roster_window.py:2189 -msgid "Log _off" -msgstr "_Odhlásit" +#. Send single message +#: ../src/roster_window.py:2790 +#, fuzzy +msgid "Send Single Message" +msgstr "Ode_slat jednoduchou zprávu" -#: ../src/roster_window.py:2311 -#: ../src/roster_window.py:2382 +#. Manage Transport submenu +#: ../src/roster_window.py:2837 +#, fuzzy +msgid "_Manage Transport" +msgstr "Transporty" + +#. Modify Transport +#: ../src/roster_window.py:2845 +#, fuzzy +msgid "_Modify Transport" +msgstr "Zobrazuj trans_porty" + +#. Information +#: ../src/roster_window.py:2882 +#, fuzzy +msgid "_Information" +msgstr "Informace o kontaktu" + +#: ../src/roster_window.py:2959 ../src/roster_window.py:3033 msgid "_Change Status Message" msgstr "Z_měnit popis stavu" -#: ../src/roster_window.py:2454 +#: ../src/roster_window.py:3105 msgid "Authorization has been sent" msgstr "Autorizace byla odeslána" -#: ../src/roster_window.py:2455 +#: ../src/roster_window.py:3106 #, python-format msgid "Now \"%s\" will know your status." msgstr "Nyní bude \"%s\" znát váš status." -#: ../src/roster_window.py:2475 +#: ../src/roster_window.py:3126 msgid "Subscription request has been sent" msgstr "Žádost o autorizaci byla odeslána" -#: ../src/roster_window.py:2476 +#: ../src/roster_window.py:3127 #, 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 status." +msgstr "" +"Pokud \"%s\" povolí Vaši žádost o autorizaci, budete vidět jeho status." -#: ../src/roster_window.py:2488 +#: ../src/roster_window.py:3139 msgid "Authorization has been removed" msgstr "Autorizace byla zrušena" -#: ../src/roster_window.py:2489 +#: ../src/roster_window.py:3140 #, 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:2681 +#: ../src/roster_window.py:3338 #, 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:2685 -msgid "By removing this contact you also remove authorization resulting in him or her always seeing you as offline." -msgstr "Smazáním kontaktu také zrušíte autorizaci. Kontakt Vás tak vždy uvidí jako odpojeného." +#: ../src/roster_window.py:3342 +msgid "" +"By removing this contact you also remove authorization resulting in him or " +"her always seeing you as offline." +msgstr "" +"Smazáním kontaktu také zrušíte autorizaci. Kontakt Vás tak vždy uvidí jako " +"odpojeného." -#: ../src/roster_window.py:2690 -msgid "By removing this contact you also by default remove authorization resulting in him or her always seeing you as offline." -msgstr "Smazáním kontaktu také zrušíte autorizaci. Kontakt Vás tak vždy uvidí jako odpojeného." +#: ../src/roster_window.py:3347 +msgid "" +"By removing this contact you also by default remove authorization resulting " +"in him or her always seeing you as offline." +msgstr "" +"Smazáním kontaktu také zrušíte autorizaci. Kontakt Vás tak vždy uvidí jako " +"odpojeného." -#: ../src/roster_window.py:2693 +#: ../src/roster_window.py:3350 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:2697 +#: ../src/roster_window.py:3354 msgid "Contacts will be removed from your roster" msgstr "Kontakty budou smazány z Vašeho rosteru" -#: ../src/roster_window.py:2701 +#: ../src/roster_window.py:3358 #, python-format msgid "" "By removing these contacts:%s\n" @@ -5047,194 +5617,228 @@ 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:2733 -msgid "Gnome Keyring is installed but not correctly started (environment variable probably not correctly set)" -msgstr "Gnome Keyring je nainstalován ale není správně spuštěn (proměná prostředí není asi správně nastavena)" +#: ../src/roster_window.py:3390 +msgid "" +"Gnome Keyring is installed but not correctly started (environment variable " +"probably not correctly set)" +msgstr "" +"Gnome Keyring je nainstalován ale není správně spuštěn (proměná prostředí " +"není asi správně nastavena)" + +#: ../src/roster_window.py:3417 +msgid "GPG is not usable" +msgstr "" -#. TODO: make this string translatable #. %s is the account name here -#: ../src/roster_window.py:2761 -#: ../src/common/connection.py:677 -#: ../src/common/zeroconf/connection_zeroconf.py:158 +#: ../src/roster_window.py:3417 ../src/common/connection.py:681 +#: ../src/common/zeroconf/connection_zeroconf.py:165 #, python-format msgid "You will be connected to %s without OpenPGP." msgstr "Budete připojen(a) k %s bez OpenPGP." -#: ../src/roster_window.py:2778 +#: ../src/roster_window.py:3434 msgid "Passphrase Required" msgstr "Heslo Vyžadováno" -#: ../src/roster_window.py:2779 +#: ../src/roster_window.py:3435 #, python-format msgid "Enter GPG key passphrase for account %s." msgstr "Zadej heslo GPG klíče pro účet %s." -#: ../src/roster_window.py:2784 +#: ../src/roster_window.py:3440 msgid "Save passphrase" msgstr "Uložit heslo" -#: ../src/roster_window.py:2792 +#: ../src/roster_window.py:3448 msgid "Wrong Passphrase" msgstr "Nesprávné heslo" -#: ../src/roster_window.py:2793 +#: ../src/roster_window.py:3449 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/roster_window.py:2850 -#: ../src/roster_window.py:2910 +#: ../src/roster_window.py:3532 ../src/roster_window.py:3609 msgid "You are participating in one or more group chats" msgstr "Účinkujete v jedné nebo více diskuzích" -#: ../src/roster_window.py:2851 -#: ../src/roster_window.py:2911 -msgid "Changing your status to invisible will result in disconnection from those group chats. Are you sure you want to go invisible?" -msgstr "Změna vašeho stavu na neviditelný způsobí odpojení od těchto diskuzí. Jste si jistý(á), že se chcete stát neviditelným(ou)?" +#: ../src/roster_window.py:3533 ../src/roster_window.py:3610 +msgid "" +"Changing your status to invisible will result in disconnection from those " +"group chats. Are you sure you want to go invisible?" +msgstr "" +"Změna vašeho stavu na neviditelný způsobí odpojení od těchto diskuzí. Jste " +"si jistý(á), že se chcete stát neviditelným(ou)?" -#: ../src/roster_window.py:2868 +#: ../src/roster_window.py:3567 msgid "No account available" msgstr "Žádný účet není dostupný" -#: ../src/roster_window.py:2869 +#: ../src/roster_window.py:3568 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." +msgstr "" +"Musíte vytvořit účet před tím, než budete moci hovořit s jinými uživateli." -#: ../src/roster_window.py:2967 +#: ../src/roster_window.py:3696 #, python-format msgid "\"%(title)s\" by %(artist)s" msgstr "\"%(title)s\" od %(artist)s" -#: ../src/roster_window.py:3401 -#: ../src/roster_window.py:3408 -msgid "Messages will only be available for reading them later if you have history enabled." -msgstr "Zprávy bude možné číst později pouze v případě, budete-li mít povolenou historii." +#: ../src/roster_window.py:4146 ../src/roster_window.py:4153 +msgid "" +"Messages will only be available for reading them later if you have history " +"enabled." +msgstr "" +"Zprávy bude možné číst později pouze v případě, budete-li mít povolenou " +"historii." -#: ../src/roster_window.py:3992 +#: ../src/roster_window.py:4772 msgid "Metacontacts storage not supported by your server" msgstr "Uložení metakontaktů není podporováno serverem" -#: ../src/roster_window.py:3994 -msgid "Your server does not support storing metacontacts information. So those information will not be save on next reconnection." -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:4774 +msgid "" +"Your server does not support storing metacontacts information. So those " +"information will not be save on next reconnection." +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:4036 -msgid "You are about to create a metacontact. Are you sure you want to continue?" +#: ../src/roster_window.py:4820 +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:4038 -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 "Metakontakty jsou způsob k organizaci několika kontaktů do jednoho. Obecně jsou užitečné, když jeden člověk má víc účtů v síti Jabber nebo účty v transportech." +#: ../src/roster_window.py:4822 +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 "" +"Metakontakty jsou způsob k organizaci několika kontaktů do jednoho. Obecně " +"jsou užitečné, když jeden člověk má víc účtů v síti Jabber nebo účty v " +"transportech." -#: ../src/roster_window.py:4205 -#, python-format -msgid "Drop %s in group %s" -msgstr "Smazat %s ve skupině %s" - -#: ../src/roster_window.py:4212 -#, python-format -msgid "Make %s and %s metacontacts" -msgstr "Učiň %s a %s metakontakty" +#: ../src/roster_window.py:4920 +#, fuzzy, python-format +msgid "Do you want to send that file to %s:" +msgid_plural "Do you want to send those files to %s:" +msgstr[0] "%s Vám chce poslat soubor:" +msgstr[1] "%s Vám chce poslat soubor:" +msgstr[2] "%s Vám chce poslat soubor:" # FIXME: nejak divne, asi spatne prelozene -#: ../src/roster_window.py:4399 +#: ../src/roster_window.py:5202 msgid "Change Status Message..." msgstr "Změnit popis stavu..." -#: ../src/systray.py:144 +#: ../src/systray.py:164 msgid "_Change Status Message..." msgstr "_Změnit popis stavu..." -#: ../src/systray.py:232 +#: ../src/systray.py:249 msgid "Hide this menu" msgstr "Skryje toto menu" -#: ../src/tooltips.py:309 -#: ../src/tooltips.py:492 +#: ../src/tooltips.py:310 ../src/tooltips.py:503 msgid "Jabber ID: " msgstr "Jabber ID:" -#: ../src/tooltips.py:312 -#: ../src/tooltips.py:496 +#: ../src/tooltips.py:313 ../src/tooltips.py:507 msgid "Resource: " msgstr "Zdroj: " -#: ../src/tooltips.py:317 +#: ../src/tooltips.py:318 #, 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:430 -#: ../src/tooltips.py:610 +#: ../src/tooltips.py:416 +msgid " [blocked]" +msgstr "" + +#: ../src/tooltips.py:420 +msgid " [minimized]" +msgstr "" + +#: ../src/tooltips.py:435 ../src/tooltips.py:623 msgid "Status: " msgstr "Stav: " -#: ../src/tooltips.py:461 +#: ../src/tooltips.py:465 #, python-format msgid "Last status: %s" msgstr "Poslední stav: %s" -#: ../src/tooltips.py:463 +#: ../src/tooltips.py:467 #, python-format msgid " since %s" msgstr " od %s" +#: ../src/tooltips.py:485 +#, fuzzy +msgid "Connected" +msgstr "Spojení" + +#: ../src/tooltips.py:487 +#, fuzzy +msgid "Disconnected" +msgstr "Kontakt se odpojil" + #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:502 +#: ../src/tooltips.py:514 msgid "Subscription: " msgstr "Autorizace: " -#: ../src/tooltips.py:512 +#: ../src/tooltips.py:524 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:566 +#: ../src/tooltips.py:579 msgid "Download" msgstr "Download" -#: ../src/tooltips.py:572 +#: ../src/tooltips.py:585 msgid "Upload" msgstr "Upload" -#: ../src/tooltips.py:579 +#: ../src/tooltips.py:592 msgid "Type: " msgstr "Typ: " -#: ../src/tooltips.py:585 +#: ../src/tooltips.py:598 msgid "Transferred: " msgstr "Přeneseno: " -#: ../src/tooltips.py:588 -#: ../src/tooltips.py:609 +#: ../src/tooltips.py:601 ../src/tooltips.py:622 msgid "Not started" msgstr "Nespuštěno" -#: ../src/tooltips.py:592 +#: ../src/tooltips.py:605 msgid "Stopped" msgstr "Zastaveno" -#: ../src/tooltips.py:594 -#: ../src/tooltips.py:597 +#: ../src/tooltips.py:607 ../src/tooltips.py:610 msgid "Completed" msgstr "Dokončeno" -#: ../src/tooltips.py:601 +#: ../src/tooltips.py:614 msgid "?transfer status:Paused" msgstr "?transfer status:Pozastaveno" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:605 +#: ../src/tooltips.py:618 msgid "Stalled" msgstr "Stagnuje" -#: ../src/tooltips.py:607 +#: ../src/tooltips.py:620 msgid "Transferring" msgstr "Přenáším" -#: ../src/tooltips.py:639 +#: ../src/tooltips.py:652 msgid "This service has not yet responded with detailed information" msgstr "Tato služba dosud neodpověděla s detaily" -#: ../src/tooltips.py:642 +#: ../src/tooltips.py:655 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -5242,51 +5846,79 @@ msgstr "" "Tato služba nemůže odpovědět s více podrobnostmi.\n" "Pravděpodobně je stará nebo rozbitá" -#: ../src/vcard.py:217 +#: ../src/vcard.py:240 msgid "?Client:Unknown" msgstr "?Client:Neznámý" -#: ../src/vcard.py:219 +#: ../src/vcard.py:242 msgid "?OS:Unknown" msgstr "?OS:Neznámý" -#: ../src/vcard.py:247 -#: ../src/vcard.py:449 +#: ../src/vcard.py:267 ../src/vcard.py:277 ../src/vcard.py:467 #, python-format msgid "since %s" msgstr "od %s" -#: ../src/vcard.py:277 +#: ../src/vcard.py:306 msgid "Affiliation:" msgstr "Vztah:" -#: ../src/vcard.py:285 -msgid "This contact is interested in your presence information, but you are not interested in his/her presence" +#: ../src/vcard.py:314 +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:287 -msgid "You are interested in the contact's presence information, but he/she is not interested in yours" +#: ../src/vcard.py:316 +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:289 +#: ../src/vcard.py:318 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:291 -msgid "You are not interested in the contact's presence, and neither he/she is interested in yours" +#: ../src/vcard.py:320 +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:299 +#: ../src/vcard.py:328 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:311 -#: ../src/vcard.py:338 -#: ../src/vcard.py:482 +#: ../src/vcard.py:332 ../src/vcard.py:369 ../src/vcard.py:492 msgid " resource with priority " msgstr "zdroj s prioritou " +#: ../src/common/check_paths.py:33 +msgid "creating logs database" +msgstr "vytvářím databázi historie" + +#: ../src/common/check_paths.py:96 ../src/common/check_paths.py:107 +#: ../src/common/check_paths.py:114 +#, 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:97 ../src/common/check_paths.py:108 +#: ../src/common/check_paths.py:115 ../src/common/check_paths.py:123 +msgid "Gajim will now exit" +msgstr "Gajim se nyní ukončí" + +#: ../src/common/check_paths.py:122 +#, 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:138 +#, python-format +msgid "creating %s directory" +msgstr "vytvářím adresář %s " + #: ../src/common/commands.py:69 msgid "Change status information" msgstr "Informace o změně stavu" @@ -5344,47 +5976,54 @@ msgstr "Opustit diskuzi" msgid "Choose the groupchats you want to leave" msgstr "Vyber diskuze, které chceš opustit" -#: ../src/common/commands.py:194 -msgid "Groupchats" -msgstr "Diskuze" - #: ../src/common/commands.py:230 msgid "You left the following groupchats:" msgstr "Opustil(a) jste následující diskuze:" -#: ../src/common/config.py:56 +#: ../src/common/commands.py:242 +#, fuzzy +msgid "Forward unread messages" +msgstr "%d nepřečtená zpráva" + +#: ../src/common/commands.py:262 +msgid "All unread messages have been forwarded." +msgstr "" + +#: ../src/common/config.py:57 msgid "Use D-Bus and Notification-Daemon to show notifications" msgstr "Používej DBus a Notifikačního démona k zobrazování notifikací" -#: ../src/common/config.py:61 +#: ../src/common/config.py:62 msgid "Time in minutes, after which your status changes to away." msgstr "Čas v minutách, po kterém se Váš stav přepne na pryč." -#: ../src/common/config.py:62 +#: ../src/common/config.py:63 msgid "Away as a result of being idle" msgstr "Pryč jako výsledek nečinnosti" -#: ../src/common/config.py:64 +#: ../src/common/config.py:65 msgid "Time in minutes, after which your status changes to not available." msgstr "Čas v minutách, po kterém se Váš stav přepne na nedostupný." -#: ../src/common/config.py:65 +#: ../src/common/config.py:66 msgid "Not available as a result of being idle" msgstr "Nedostupný jako výsledek nečinnosti" -#: ../src/common/config.py:83 -msgid "List (space separated) of rows (accounts and groups) that are collapsed." -msgstr "Seznam (oddělené mezerami) řádků (účtů a skupin), které budou \"zhroucené\"." +#: ../src/common/config.py:84 +msgid "" +"List (space separated) of rows (accounts and groups) that are collapsed." +msgstr "" +"Seznam (oddělené mezerami) řádků (účtů a skupin), které budou \"zhroucené\"." -#: ../src/common/config.py:88 +#: ../src/common/config.py:89 msgid "Enable link-local/zeroconf messaging" msgstr "Povolit lokální zprávy typu zeroconf" -#: ../src/common/config.py:91 +#: ../src/common/config.py:92 msgid "Language used by speller" msgstr "Jazyk použitý kontrolou pravopisu" -#: ../src/common/config.py:92 +#: ../src/common/config.py:93 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" @@ -5394,608 +6033,786 @@ msgstr "" "'někdy' - vypiš čas každou print_ichat_every_foo_minutes minutu.\n" "'nikdy' - nevypisuj čas." -#: ../src/common/config.py:93 -msgid "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. This is used only if print_time is 'sometimes'." -msgstr "Vypiš čas v rozhovorech s použitím Fuzzy Clock. Hodnota náhodnosti je od 1 to 4, nebo 0 pro vypnutí Fuzzy Clock. 1 je nejpřesnější čas, 4 nejméně přesný. Toto se použije jenom při print_time nastaveném na 'někdy'." +#: ../src/common/config.py:94 +msgid "" +"Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " +"to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " +"This is used only if print_time is 'sometimes'." +msgstr "" +"Vypiš čas v rozhovorech s použitím Fuzzy Clock. Hodnota náhodnosti je od 1 " +"to 4, nebo 0 pro vypnutí Fuzzy Clock. 1 je nejpřesnější čas, 4 nejméně " +"přesný. Toto se použije jenom při print_time nastaveném na 'někdy'." -#: ../src/common/config.py:96 +#: ../src/common/config.py:97 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Ber * / _ páry jako možné formátovací znaky." -#: ../src/common/config.py:97 -msgid "If True, do not remove */_ . So *abc* will be bold but with * * not removed." -msgstr "Pokud zapnuto, nemažte */_ . Potom *abc* bude tučně ale s * * neodstraněnými." +#: ../src/common/config.py:98 +msgid "" +"If True, do not remove */_ . So *abc* will be bold but with * * not removed." +msgstr "" +"Pokud zapnuto, nemažte */_ . Potom *abc* bude tučně ale s * * neodstraněnými." -#: ../src/common/config.py:100 -msgid "Uses ReStructured text markup to send HTML, plus ascii formatting if selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html (If you want to use this, install docutils)" -msgstr "Pokud je vybráno, použije ReStructured text markup k odeslání HTML, navíc s ascii formátování. Pro syntaxi navštivte http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html (Pokud si to chcete prohlédnout, nainstalujte docutils)" - -#: ../src/common/config.py:109 -msgid "Character to add after nickname when using nick completion (tab) in group chat." -msgstr "Znak, který se přidá za přezdívku po použití doplňování jména tabulátorem v diskuzi." +#: ../src/common/config.py:101 +msgid "" +"Uses ReStructured text markup to send HTML, plus ascii formatting if " +"selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" +"restructuredtext.html (If you want to use this, install docutils)" +msgstr "" +"Pokud je vybráno, použije ReStructured text markup k odeslání HTML, navíc s " +"ascii formátování. Pro syntaxi navštivte http://docutils.sourceforge.net/" +"docs/ref/rst/restructuredtext.html (Pokud si to chcete prohlédnout, " +"nainstalujte docutils)" #: ../src/common/config.py:110 -msgid "Character to propose to add after desired nickname when desired nickname is used by someone else in group chat." -msgstr "Znak navržený pro přidání za zamýšlenou přezdívku, pokud už ji používá někdo jiný v diskuzi." +msgid "" +"Character to add after nickname when using nick completion (tab) in group " +"chat." +msgstr "" +"Znak, který se přidá za přezdívku po použití doplňování jména tabulátorem v " +"diskuzi." -#: ../src/common/config.py:133 -msgid "This option let you customize timestamp that is printed in conversation. For exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on strftime for full documentation: http://docs.python.org/lib/module-time.html" -msgstr "Tato volba umožní vlastní formátování času, který je zobrazován v rozhovorech. Například \"[%H:%M]\" zobrazí \"[hodina:minuta]\". Pro víc informací shlédněte dokumentaci pythonu funkce strftime na: http://docs.python.org/lib/module-time.html" +#: ../src/common/config.py:111 +msgid "" +"Character to propose to add after desired nickname when desired nickname is " +"used by someone else in group chat." +msgstr "" +"Znak navržený pro přidání za zamýšlenou přezdívku, pokud už ji používá někdo " +"jiný v diskuzi." #: ../src/common/config.py:134 +msgid "" +"This option let you customize timestamp that is printed in conversation. For " +"exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " +"strftime for full documentation: http://docs.python.org/lib/module-time.html" +msgstr "" +"Tato volba umožní vlastní formátování času, který je zobrazován v " +"rozhovorech. Například \"[%H:%M]\" zobrazí \"[hodina:minuta]\". Pro víc " +"informací shlédněte dokumentaci pythonu funkce strftime na: http://docs." +"python.org/lib/module-time.html" + +#: ../src/common/config.py:135 msgid "Characters that are printed before the nickname in conversations" msgstr "Znaky, které budou vypisovány před přezdívkou v rozhovorech" -#: ../src/common/config.py:135 +#: ../src/common/config.py:136 msgid "Characters that are printed after the nickname in conversations" msgstr "Znaky, které budou vypisovány za přezdívkou v rozhovorech" -#: ../src/common/config.py:142 +#: ../src/common/config.py:143 msgid "Add * and [n] in roster title?" msgstr "Přidat * a [n] k titulku Seznamu?" -#: ../src/common/config.py:143 -msgid "How many lines to remember from previous conversation when a chat tab/window is reopened." -msgstr "Jak moc řádků si pamatovat z předchozího rozhovoru, když je okno/záložka rozhovoru znovu otevřena." - #: ../src/common/config.py:144 +msgid "" +"How many lines to remember from previous conversation when a chat tab/window " +"is reopened." +msgstr "" +"Jak moc řádků si pamatovat z předchozího rozhovoru, když je okno/záložka " +"rozhovoru znovu otevřena." + +#: ../src/common/config.py:145 msgid "How many minutes should last lines from previous conversation last." msgstr "Kolik minut by měly řádky z předchozího rozhovoru zůstat." -#: ../src/common/config.py:145 -msgid "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ Client default behaviour)." -msgstr "Odeslat zprávu při Ctrl+Enter a při Enter přejít na nový řádek (výchozí chování klienta Mirabilis ICQ)." +#: ../src/common/config.py:146 +msgid "" +"Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " +"Client default behaviour)." +msgstr "" +"Odeslat zprávu při Ctrl+Enter a při Enter přejít na nový řádek (výchozí " +"chování klienta Mirabilis ICQ)." -#: ../src/common/config.py:147 +#: ../src/common/config.py:148 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Kolik řádků uložit pro Ctrl+Šipka nahoru." -#: ../src/common/config.py:150 +#: ../src/common/config.py:151 #, python-format -msgid "Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' which means use wiktionary." -msgstr "Buď vlastní url s %s v těle, kde %s je slovo nebo fráze, nebo 'WIKTIONARY', která znamená že se použije wiktionary." +msgid "" +"Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' " +"which means use wiktionary." +msgstr "" +"Buď vlastní url s %s v těle, kde %s je slovo nebo fráze, nebo 'WIKTIONARY', " +"která znamená že se použije wiktionary." -#: ../src/common/config.py:153 +#: ../src/common/config.py:154 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "Pokud zaškrtnuta, Gajim může být ovládán vzdáleně pomocí gajim-remote." -#: ../src/common/config.py:154 -msgid "If True, listen to D-Bus signals from NetworkManager and change the status of accounts (provided they do not have listen_to_network_manager set to False and they sync with global status) based upon the status of the network connection." -msgstr "Je-li povoleno, čeká na D-Bus signál z NetworkManager a změní stav účtů (pokud nemají nastaveno listen_to_network_manager nastavený na False a synchronizují se s globálním stavem) v závislosti na stavu síťového připojení." - #: ../src/common/config.py:155 -msgid "Sent chat state notifications. Can be one of all, composing_only, disabled." -msgstr "Odešílat události stavu rozhovoru. Může být pouze jediná, composing_only, vypnutá." +msgid "" +"If True, listen to D-Bus signals from NetworkManager and change the status " +"of accounts (provided they do not have listen_to_network_manager set to " +"False and they sync with global status) based upon the status of the network " +"connection." +msgstr "" +"Je-li povoleno, čeká na D-Bus signál z NetworkManager a změní stav účtů " +"(pokud nemají nastaveno listen_to_network_manager nastavený na False a " +"synchronizují se s globálním stavem) v závislosti na stavu síťového " +"připojení." #: ../src/common/config.py:156 -msgid "Displayed chat state notifications in chat windows. Can be one of all, composing_only, disabled." -msgstr "Zobraz stavy rozhovoru v okně rozhovoru. Může být jedno z all, composing_only nebo disabled." +msgid "" +"Sent chat state notifications. Can be one of all, composing_only, disabled." +msgstr "" +"Odešílat události stavu rozhovoru. Může být pouze jediná, composing_only, " +"vypnutá." -#: ../src/common/config.py:158 -msgid "When not printing time for every message (print_time==sometimes), print it every x minutes." -msgstr "Když nevypisuji čas pro každou zprávu (print_time=='někdy'), vypisuj ji každých x minut." +#: ../src/common/config.py:157 +msgid "" +"Displayed chat state notifications in chat windows. Can be one of all, " +"composing_only, disabled." +msgstr "" +"Zobraz stavy rozhovoru v okně rozhovoru. Může být jedno z all, " +"composing_only nebo disabled." #: ../src/common/config.py:159 +msgid "" +"When not printing time for every message (print_time==sometimes), print it " +"every x minutes." +msgstr "" +"Když nevypisuji čas pro každou zprávu (print_time=='někdy'), vypisuj ji " +"každých x minut." + +#: ../src/common/config.py:160 msgid "Ask before closing a group chat tab/window." msgstr "Ptát se před zavřením oken/záložek diskuzí." -#: ../src/common/config.py:160 -msgid "Always ask before closing group chat tab/window in this space separated list of group chat jids." -msgstr "Vždy se ptát před zavřením oken/panelů diskuzí uvedených v tomto seznamu mezerami oddělením Jabber ID místností." - #: ../src/common/config.py:161 -msgid "Never ask before closing group chat tab/window in this space separated list of group chat jids." -msgstr "Nikdy se neptát před zavřením oken/záložek diskuzí uvedených v tomto seznamu mezerami oddělenými Jabber ID místností." +msgid "" +"Always ask before closing group chat tab/window in this space separated list " +"of group chat jids." +msgstr "" +"Vždy se ptát před zavřením oken/panelů diskuzí uvedených v tomto seznamu " +"mezerami oddělením Jabber ID místností." -#: ../src/common/config.py:164 -msgid "Comma separated list of hosts that we send, in addition of local interfaces, for File Transfer in case of address translation/port forwarding." -msgstr "Čárkami oddělený seznam počítačů kterým posíláme, navíc k lokálním síťovým rozhraním, pro přenos souborů v případě překladu adres nebo přesměrováním portů." +#: ../src/common/config.py:162 +msgid "" +"Never ask before closing group chat tab/window in this space separated list " +"of group chat jids." +msgstr "" +"Nikdy se neptát před zavřením oken/záložek diskuzí uvedených v tomto seznamu " +"mezerami oddělenými Jabber ID místností." -#: ../src/common/config.py:166 +#: ../src/common/config.py:165 +msgid "" +"Comma separated list of hosts that we send, in addition of local interfaces, " +"for File Transfer in case of address translation/port forwarding." +msgstr "" +"Čárkami oddělený seznam počítačů kterým posíláme, navíc k lokálním síťovým " +"rozhraním, pro přenos souborů v případě překladu adres nebo přesměrováním " +"portů." + +#: ../src/common/config.py:167 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "IEC standard říká KiB = 1024 bytů, KB = 1000 bytů." -#: ../src/common/config.py:168 +#: ../src/common/config.py:169 msgid "Notify of events in the system trayicon." msgstr "Upozorni na události v systémovém trayi." -#: ../src/common/config.py:174 +#: ../src/common/config.py:175 msgid "Show tab when only one conversation?" msgstr "Zobrazit záložku při jediném rozhovoru?" -#: ../src/common/config.py:175 +#: ../src/common/config.py:176 msgid "Show tabbed notebook border in chat windows?" msgstr "Zobrazit okraj panelu v oknech rozhovorů?" -#: ../src/common/config.py:176 +#: ../src/common/config.py:177 msgid "Show close button in tab?" msgstr "Zobrazit tlačitko zavřít v záložce?" -#: ../src/common/config.py:189 -msgid "A semicolon-separated list of words that will be highlighted in group chats." -msgstr "Středníkem oddělený seznam slov, které budou zvýrazněny v diskuzích." - -#: ../src/common/config.py:190 -msgid "If True, quits Gajim when X button of Window Manager is clicked. This setting is taken into account only if trayicon is used." -msgstr "Pokud zapnuto, ukonči Gajim když bude stisknuto tlačítko X v titulku okna. Toto nastavení se použije pouze tehdy, pokud je použita ikona v trayi." +#: ../src/common/config.py:186 +msgid "Preview new messages in notification popup?" +msgstr "" #: ../src/common/config.py:191 -msgid "If True, Gajim will check if it's the default jabber client on each startup." -msgstr "Pokud zapnuto, Gajim zkontroluje, zda je výchozí jabber klient, při každém startu." +msgid "" +"A semicolon-separated list of words that will be highlighted in group chats." +msgstr "Středníkem oddělený seznam slov, které budou zvýrazněny v diskuzích." #: ../src/common/config.py:192 -msgid "If True, Gajim will display an icon on each tab containing unread messages. Depending on the theme, this icon may be animated." -msgstr "Pokud zapnuto, Gajim zobrazí ikonu v každé záložce obsahující nepřečtené zprávy. V závislosti na tématu, tato ikona může být animovaná." +msgid "" +"If True, quits Gajim when X button of Window Manager is clicked. This " +"setting is taken into account only if trayicon is used." +msgstr "" +"Pokud zapnuto, ukonči Gajim když bude stisknuto tlačítko X v titulku okna. " +"Toto nastavení se použije pouze tehdy, pokud je použita ikona v trayi." #: ../src/common/config.py:193 -msgid "If True, Gajim will display the status message, if not empty, for every contact under the contact name in roster window." -msgstr "Pokud zapnuto, Gajim zobrazí popis stavu, pokud není prázdný, pro každý kontakt pod jménem v okně Seznamu." +msgid "" +"If True, Gajim will check if it's the default jabber client on each startup." +msgstr "" +"Pokud zapnuto, Gajim zkontroluje, zda je výchozí jabber klient, při každém " +"startu." + +#: ../src/common/config.py:194 +msgid "" +"If True, Gajim will display an icon on each tab containing unread messages. " +"Depending on the theme, this icon may be animated." +msgstr "" +"Pokud zapnuto, Gajim zobrazí ikonu v každé záložce obsahující nepřečtené " +"zprávy. V závislosti na tématu, tato ikona může být animovaná." #: ../src/common/config.py:195 -msgid "If True, Gajim will ask for avatar each contact that did not have an avatar last time or has one cached that is too old." -msgstr "pokud zapnuto, Gajim se zeptá na avatara každého kontaktu který neměl naposledy avatara nebo kterého uložený je příliš starý." - -#: ../src/common/config.py:196 -msgid "If False, Gajim will no longer print status line in chats when a contact changes his or her status and/or his or her status message." -msgstr "Pokud vypnuto, Gajim nebude zobrazovat stavové řádky v rozhovorech, když kontakt změní jeho stav a/nebo jeho stavovou zprávu." +msgid "" +"If True, Gajim will display the status message, if not empty, for every " +"contact under the contact name in roster window." +msgstr "" +"Pokud zapnuto, Gajim zobrazí popis stavu, pokud není prázdný, pro každý " +"kontakt pod jménem v okně Seznamu." #: ../src/common/config.py:197 -msgid "can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no longer print status line in groupchats when a member changes his or her status and/or his or her status message. If \"all\" Gajim will print all status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves group chat." -msgstr "může být \"none\", \"all\", \"in_and_out\". Pokud je \"none\", Gajim nebude nadále vypisovat stavy v diskuzích když účastník změní svůj stav nebo stavovou zprávu. Pokud je \"all\", Gajim bude vypisovat všechny změny stavů. Při \"in_and_out\" Gajim vypíše stav jenom při vstupu a odchodu z místnosti." +msgid "" +"If True, Gajim will ask for avatar each contact that did not have an avatar " +"last time or has one cached that is too old." +msgstr "" +"pokud zapnuto, Gajim se zeptá na avatara každého kontaktu který neměl " +"naposledy avatara nebo kterého uložený je příliš starý." + +#: ../src/common/config.py:198 +msgid "" +"If False, Gajim will no longer print status line in chats when a contact " +"changes his or her status and/or his or her status message." +msgstr "" +"Pokud vypnuto, Gajim nebude zobrazovat stavové řádky v rozhovorech, když " +"kontakt změní jeho stav a/nebo jeho stavovou zprávu." #: ../src/common/config.py:199 +msgid "" +"can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " +"longer print status line in groupchats when a member changes his or her " +"status and/or his or her status message. If \"all\" Gajim will print all " +"status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " +"group chat." +msgstr "" +"může být \"none\", \"all\", \"in_and_out\". Pokud je \"none\", Gajim nebude " +"nadále vypisovat stavy v diskuzích když účastník změní svůj stav nebo " +"stavovou zprávu. Pokud je \"all\", Gajim bude vypisovat všechny změny stavů. " +"Při \"in_and_out\" Gajim vypíše stav jenom při vstupu a odchodu z místnosti." + +#: ../src/common/config.py:201 msgid "Background color of contacts when they just signed in." msgstr "Barva pozadí kontaktů, jež se zrovna přihlásili." -#: ../src/common/config.py:200 +#: ../src/common/config.py:202 msgid "Background color of contacts when they just signed out." msgstr "Barva pozadí kontaktů, jež se přávě odhlásili." -#: ../src/common/config.py:202 -msgid "If True, restored messages will use a smaller font than the default one." -msgstr "Pokud je povoleno, minulé zprávy budou vypsány menším písmem, než je výchozí." +#: ../src/common/config.py:204 +msgid "" +"If True, restored messages will use a smaller font than the default one." +msgstr "" +"Pokud je povoleno, minulé zprávy budou vypsány menším písmem, než je výchozí." -#: ../src/common/config.py:203 +#: ../src/common/config.py:205 msgid "Don't show avatar for the transport itself." msgstr "Nezobrazuj avatara pro transport samotný." -#: ../src/common/config.py:204 +#: ../src/common/config.py:206 msgid "Don't show roster in the system taskbar." msgstr "Nezobrazuj roster v liště úloh." -#: ../src/common/config.py:205 -msgid "If True and installed GTK+ and PyGTK versions are at least 2.8, make the window flash (the default behaviour in most Window Managers) when holding pending events." -msgstr "Pokud je True a instalované GTK+ a PyGTK verze jsou alespoň 2.8, blikej oknem (výchozí chování ve většině Window Managerů) pokud čekají nové události." - #: ../src/common/config.py:207 -msgid "Jabberd1.4 does not like sha info when one join a password protected group chat. Turn this option to False to stop sending sha info in group chat presences." -msgstr "Jabberd1.4 nemá rád sha informaci, pokud někdo vstupuje do místnosti chráněné heslem. Zaškrtněte tuto volbu na False, aby se sha informace neposílala v presenci u diskuzí." +msgid "" +"If True and installed GTK+ and PyGTK versions are at least 2.8, make the " +"window flash (the default behaviour in most Window Managers) when holding " +"pending events." +msgstr "" +"Pokud je True a instalované GTK+ a PyGTK verze jsou alespoň 2.8, blikej " +"oknem (výchozí chování ve většině Window Managerů) pokud čekají nové " +"události." + +#: ../src/common/config.py:209 +msgid "" +"Jabberd1.4 does not like sha info when one join a password protected group " +"chat. Turn this option to False to stop sending sha info in group chat " +"presences." +msgstr "" +"Jabberd1.4 nemá rád sha informaci, pokud někdo vstupuje do místnosti " +"chráněné heslem. Zaškrtněte tuto volbu na False, aby se sha informace " +"neposílala v presenci u diskuzí." #. always, never, peracct, pertype should not be translated -#: ../src/common/config.py:210 +#: ../src/common/config.py:212 msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" "'never' - All messages get their own window.\n" "'peracct' - Messages for each account are sent to a specific window.\n" -"'pertype' - Each message type (e.g., chats vs. groupchats) are sent to a specific window. Note, changing this option requires restarting Gajim before the changes will take effect." +"'pertype' - Each message type (e.g., chats vs. groupchats) are sent to a " +"specific window. Note, changing this option requires restarting Gajim before " +"the changes will take effect." msgstr "" "Řídí okno, kam budou doručeny nové zprávy.\n" "'vždy' - Všechny zprávy jsou odeslány do jediného okna.\n" "'nikdy' - Všechny zprávy dostanou svoje vlastní okno.\n" "'peracct' - Zprávy pro každý účet jsou doručeny do zvláštních oken.\n" -"'pertype' - Každý typ zprávy (např. rohovor vs diskuze) jsou odeslány do zvláštního okna. Vězte, že změna této volby vyžaduje restartování Gajimu, aby se projevila" +"'pertype' - Každý typ zprávy (např. rohovor vs diskuze) jsou odeslány do " +"zvláštního okna. Vězte, že změna této volby vyžaduje restartování Gajimu, " +"aby se projevila" -#: ../src/common/config.py:211 +#: ../src/common/config.py:213 msgid "If False, you will no longer see the avatar in the chat window." msgstr "Pokud je False, nebudete nadále vidět avatary v okně rozhovoru" -#: ../src/common/config.py:212 +#: ../src/common/config.py:214 msgid "If True, pressing the escape key closes a tab/window." msgstr "Pokud je True, stiskem escape zavřete panel nebo okno" -#: ../src/common/config.py:213 -msgid "Hides the buttons in group chat window." +#: ../src/common/config.py:215 +#, fuzzy +msgid "Hides the buttons in chat windows." msgstr "Skryje tlačítka v okně diskuze." -#: ../src/common/config.py:214 -msgid "Hides the buttons in two persons chat window." -msgstr "Skryje tlačítka v okně rozhovoru dvou lidí." - -#: ../src/common/config.py:215 +#: ../src/common/config.py:216 msgid "Hides the banner in a group chat window" msgstr "Skryje nadpis v okně diskuze" -#: ../src/common/config.py:216 +#: ../src/common/config.py:217 msgid "Hides the banner in two persons chat window" msgstr "Skryje nadpis v okně rozhovoru dvou lidí" -#: ../src/common/config.py:217 +#: ../src/common/config.py:218 msgid "Hides the group chat occupants list in group chat window." msgstr "Skryje seznam lidí místnosti v okně diskuze." -#: ../src/common/config.py:218 -msgid "In a chat, show the nickname at the beginning of a line only when it's not the same person talking than in previous message." -msgstr "V rozhovoru zobraz přezdívku na začátku řádku pouze v případě, když to není stejný člověk, jako v předchozí zprávě." - #: ../src/common/config.py:219 +msgid "" +"In a chat, show the nickname at the beginning of a line only when it's not " +"the same person talking than in previous message." +msgstr "" +"V rozhovoru zobraz přezdívku na začátku řádku pouze v případě, když to není " +"stejný člověk, jako v předchozí zprávě." + +#: ../src/common/config.py:220 msgid "Indentation when using merge consecutive nickname." msgstr "" -#: ../src/common/config.py:220 +#: ../src/common/config.py:221 +#, fuzzy +msgid "Smooth scroll message in conversation window" +msgstr "Odeslat zprávu a zavřít okno" + +#: ../src/common/config.py:222 msgid "List of colors that will be used to color nicknames in group chats." msgstr "Seznam barev používaných k obarvení přezdívek v diskuzích." -#: ../src/common/config.py:221 +#: ../src/common/config.py:223 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "Ctrl-Tab jde na další rozepsanou záložku, když žádný není nepřečtená." -#: ../src/common/config.py:222 -msgid "Should we show the confirm metacontacts creation dialog or not? Empty string means we never show the dialog." -msgstr "Mám zobrazit dialog vytvoření metakontaktu nebo ne? Prázdný řetezec znamená nikdy nezobrazovat dialog." - -#: ../src/common/config.py:223 -msgid "If True, you will be able to set a negative priority to your account in account modification window. BE CAREFUL, when you are logged in with a negative priority, you will NOT receive any message from your server." -msgstr "Je-li povoleno, bude možné použít zápornou prioritu účtu v okně úprava účtu. BUĎ OPATRNÝ, když jsi přihlášen se zápornou prioritou, nedostaneš od serveru žádnou zprávu." - #: ../src/common/config.py:224 -msgid "If True, Gajim will use Gnome Keyring (if available) to store account passwords." -msgstr "Je-li povoleno, Gajim použije Gnome Keyring (je-li dostupný) k uložení hesel k účtům." +msgid "" +"Should we show the confirm metacontacts creation dialog or not? Empty string " +"means we never show the dialog." +msgstr "" +"Mám zobrazit dialog vytvoření metakontaktu nebo ne? Prázdný řetezec znamená " +"nikdy nezobrazovat dialog." #: ../src/common/config.py:225 -msgid "If True, Gajim will show number of online and total contacts in account and group rows." -msgstr "Je-li povoleno, Gajim zobrazí počet dostupných a všech kontaktů v účtu a u řádků skupin." +msgid "" +"If True, you will be able to set a negative priority to your account in " +"account modification window. BE CAREFUL, when you are logged in with a " +"negative priority, you will NOT receive any message from your server." +msgstr "" +"Je-li povoleno, bude možné použít zápornou prioritu účtu v okně úprava účtu. " +"BUĎ OPATRNÝ, když jsi přihlášen se zápornou prioritou, nedostaneš od serveru " +"žádnou zprávu." #: ../src/common/config.py:226 -msgid "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages as if they were of this type" -msgstr "Může být prázdný, 'chat' nebo 'message'. Není-lí prázdné, považuj všechny příchozí zprávy jako uvedený typ" +msgid "" +"If True, Gajim will use Gnome Keyring (if available) to store account " +"passwords." +msgstr "" +"Je-li povoleno, Gajim použije Gnome Keyring (je-li dostupný) k uložení hesel " +"k účtům." -#: ../src/common/config.py:237 -msgid "Priority will change automatically according to your status. Priorities are defined in autopriority_* options." -msgstr "Priorita se změní automaticky podle tvého stavu. Priority jsou definovány v nastavení jako položky autopriority_*." +#: ../src/common/config.py:227 +msgid "" +"If True, Gajim will show number of online and total contacts in account and " +"group rows." +msgstr "" +"Je-li povoleno, Gajim zobrazí počet dostupných a všech kontaktů v účtu a u " +"řádků skupin." + +#: ../src/common/config.py:228 +msgid "" +"Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " +"as if they were of this type" +msgstr "" +"Může být prázdný, 'chat' nebo 'message'. Není-lí prázdné, považuj všechny " +"příchozí zprávy jako uvedený typ" + +#: ../src/common/config.py:229 +msgid "" +"If True, Gajim will scroll and select the contact who sent you the last " +"message, if chat window is not already opened." +msgstr "" + +#: ../src/common/config.py:230 +msgid "" +"If True, Gajim will convert string between $$ and $$ to an image using dvips " +"and convert before insterting it in chat window." +msgstr "" + +#: ../src/common/config.py:231 +msgid "Time of inactivity needed before the change status window closes down." +msgstr "" + +#: ../src/common/config.py:232 +msgid "" +"Maximum number of lines that are printed in conversations. Oldest lines are " +"cleared." +msgstr "" + +#: ../src/common/config.py:243 +msgid "" +"Priority will change automatically according to your status. Priorities are " +"defined in autopriority_* options." +msgstr "" +"Priorita se změní automaticky podle tvého stavu. Priority jsou definovány v " +"nastavení jako položky autopriority_*." #. yes, no, ask -#: ../src/common/config.py:266 +#: ../src/common/config.py:273 msgid "Jabberd2 workaround" msgstr "Jabberd2 workaround" -#: ../src/common/config.py:270 -msgid "If checked, Gajim will use your IP and proxies defined in file_transfer_proxies option for file transfer." -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:277 +msgid "" +"If checked, Gajim will use your IP and proxies defined in " +"file_transfer_proxies option for file transfer." +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:329 +#: ../src/common/config.py:336 msgid "Is OpenPGP enabled for this contact?" msgstr "Je OpenPGP povoleno pro tento kontakt?" -#: ../src/common/config.py:330 -#: ../src/common/config.py:333 +#: ../src/common/config.py:337 ../src/common/config.py:340 msgid "Language for which we want to check misspelled words" msgstr "Jazyk, pro který chcete kontrolovat překlepy ve slovech" -#: ../src/common/config.py:339 +#: ../src/common/config.py:346 msgid "all or space separated status" msgstr "všechny nebo mezerou oddělené stavy" -#: ../src/common/config.py:340 +#: ../src/common/config.py:347 msgid "'yes', 'no', or 'both'" msgstr "'yes', 'no', nebo 'both'" -#: ../src/common/config.py:341 -#: ../src/common/config.py:343 -#: ../src/common/config.py:344 -#: ../src/common/config.py:347 -#: ../src/common/config.py:348 +#: ../src/common/config.py:348 ../src/common/config.py:350 +#: ../src/common/config.py:351 ../src/common/config.py:354 +#: ../src/common/config.py:355 msgid "'yes', 'no' or ''" msgstr "'yes', 'no' nebo ''" -#: ../src/common/config.py:354 +#: ../src/common/config.py:361 msgid "Sleeping" msgstr "Spím" -#: ../src/common/config.py:355 +#: ../src/common/config.py:362 msgid "Back soon" msgstr "Hned jsem zpět" -#: ../src/common/config.py:355 +#: ../src/common/config.py:362 msgid "Back in some minutes." msgstr "Jsem zpátky za pár minut." -#: ../src/common/config.py:356 +#: ../src/common/config.py:363 msgid "Eating" msgstr "Jím" -#: ../src/common/config.py:356 +#: ../src/common/config.py:363 msgid "I'm eating, so leave me a message." msgstr "Právě jím, prosím zanechte mi zprávu." -#: ../src/common/config.py:357 +#: ../src/common/config.py:364 msgid "Movie" msgstr "Film" -#: ../src/common/config.py:357 +#: ../src/common/config.py:364 msgid "I'm watching a movie." msgstr "Dívám se na film." -#: ../src/common/config.py:358 +#: ../src/common/config.py:365 msgid "Working" msgstr "Pracuji" -#: ../src/common/config.py:358 +#: ../src/common/config.py:365 msgid "I'm working." msgstr "Právě pracuji." -#: ../src/common/config.py:359 +#: ../src/common/config.py:366 msgid "Phone" msgstr "Telefon" -#: ../src/common/config.py:359 +#: ../src/common/config.py:366 msgid "I'm on the phone." msgstr "Zrovna telefonuji." -#: ../src/common/config.py:360 +#: ../src/common/config.py:367 msgid "Out" msgstr "Venku" -#: ../src/common/config.py:360 +#: ../src/common/config.py:367 msgid "I'm out enjoying life." msgstr "Užívám si života venku." -#: ../src/common/config.py:364 +#: ../src/common/config.py:371 msgid "I'm available." msgstr "Jsem dostupný." -#: ../src/common/config.py:365 +#: ../src/common/config.py:372 msgid "I'm free for chat." msgstr "Hledám někoho na pokec." -#: ../src/common/config.py:367 +#: ../src/common/config.py:374 msgid "I'm not available." msgstr "Nejsem dostupný." -#: ../src/common/config.py:368 +#: ../src/common/config.py:375 msgid "Do not disturb." msgstr "Nerušit." -#: ../src/common/config.py:369 -#: ../src/common/config.py:370 +#: ../src/common/config.py:376 ../src/common/config.py:377 msgid "Bye!" msgstr "Zdar!" -#: ../src/common/config.py:379 -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 "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:386 +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 "" +"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:380 +#: ../src/common/config.py:387 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:389 -#: ../src/common/optparser.py:195 +#: ../src/common/config.py:396 ../src/common/optparser.py:207 msgid "green" msgstr "zelený" -#: ../src/common/config.py:393 -#: ../src/common/optparser.py:181 +#: ../src/common/config.py:400 ../src/common/optparser.py:193 msgid "grocery" msgstr "potraviny" -#: ../src/common/config.py:397 +#: ../src/common/config.py:404 msgid "human" msgstr "člověk" -#: ../src/common/config.py:401 +#: ../src/common/config.py:408 msgid "marine" msgstr "mariňák" -#: ../src/common/connection_handlers.py:52 +#: ../src/common/connection_handlers.py:54 #: ../src/common/zeroconf/connection_handlers_zeroconf.py:44 msgid "Unable to load idle module" msgstr "Nelze nahrát idle modul" -#: ../src/common/connection_handlers.py:180 -#: ../src/common/connection_handlers.py:215 +#: ../src/common/connection_handlers.py:182 +#: ../src/common/connection_handlers.py:217 #: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 msgid "Wrong host" msgstr "Nesprávné jméno počítače" -#: ../src/common/connection_handlers.py:180 +#: ../src/common/connection_handlers.py:182 #: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 #, python-format -msgid "The host %s you configured as the ft_add_hosts_to_send advanced option is not valid, so ignored." +msgid "" +"The host %s you configured as the ft_add_hosts_to_send advanced option is " +"not valid, so ignored." msgstr "" -#: ../src/common/connection_handlers.py:216 +#: ../src/common/connection_handlers.py:218 msgid "Invalid local address? :-O" msgstr "Neplatná místní adresa? :-O" -#: ../src/common/connection_handlers.py:607 +#: ../src/common/connection_handlers.py:610 #, 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:1565 +#: ../src/common/connection_handlers.py:1642 #, python-format msgid "Nickname not allowed: %s" msgstr "Přezdívka nepovolena: %s" -#. password required to join #. we are banned #. group chat does not exist -#: ../src/common/connection_handlers.py:1627 -#: ../src/common/connection_handlers.py:1630 -#: ../src/common/connection_handlers.py:1633 -#: ../src/common/connection_handlers.py:1636 -#: ../src/common/connection_handlers.py:1639 -#: ../src/common/connection_handlers.py:1642 -#: ../src/common/connection_handlers.py:1650 +#: ../src/common/connection_handlers.py:1712 +#: ../src/common/connection_handlers.py:1715 +#: ../src/common/connection_handlers.py:1718 +#: ../src/common/connection_handlers.py:1721 +#: ../src/common/connection_handlers.py:1725 +#: ../src/common/connection_handlers.py:1734 msgid "Unable to join group chat" msgstr "Nelze se připojit se do diskuze" -#: ../src/common/connection_handlers.py:1628 -msgid "A password is required to join this group chat." -msgstr "Pro připojení do této místnosti je vyžadováno heslo." - -#: ../src/common/connection_handlers.py:1631 -msgid "You are banned from this group chat." +#: ../src/common/connection_handlers.py:1713 +#, fuzzy, python-format +msgid "You are banned from group chat %s." msgstr "Máš zakázán přístup do této diskuze." -#: ../src/common/connection_handlers.py:1634 -msgid "Such group chat does not exist." +#: ../src/common/connection_handlers.py:1716 +#, fuzzy, python-format +msgid "Group chat %s does not exist." msgstr "Taková diskuze neexistuje." -#: ../src/common/connection_handlers.py:1637 +#: ../src/common/connection_handlers.py:1719 msgid "Group chat creation is restricted." msgstr "Vytváření místností není povoleno." -#: ../src/common/connection_handlers.py:1640 -msgid "Your registered nickname must be used." +#: ../src/common/connection_handlers.py:1722 +#, fuzzy, 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." -#: ../src/common/connection_handlers.py:1643 -msgid "You are not in the members list." +#: ../src/common/connection_handlers.py:1726 +#, fuzzy, python-format +msgid "You are not in the members list in groupchat %s." msgstr "Nejsi v seznamu členů." -#: ../src/common/connection_handlers.py:1651 +#: ../src/common/connection_handlers.py:1735 +#, fuzzy, python-format msgid "" -"Your desired nickname is in use or registered by another occupant.\n" +"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á nebo je zaregistrována někým jiným.\n" +"Tebou požadované přezdívka se již používá nebo je zaregistrována někým " +"jiným.\n" "Níže vyber jinou přezdívku:" -#: ../src/common/connection_handlers.py:1713 +#. Room has been destroyed. see +#. http://www.xmpp.org/extensions/xep-0045.html#destroyroom +#: ../src/common/connection_handlers.py:1766 +#, fuzzy +msgid "Room has been destroyed" +msgstr "Autorizace byla zrušena" + +#: ../src/common/connection_handlers.py:1773 +#, python-format +msgid "You can join this room instead: %s" +msgstr "" + +#: ../src/common/connection_handlers.py:1800 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:1734 +#: ../src/common/connection_handlers.py:1821 #, python-format msgid "we are now subscribed to %s" msgstr "jsme nyní zapsáni k %s" -#: ../src/common/connection_handlers.py:1736 +#: ../src/common/connection_handlers.py:1823 #, python-format msgid "unsubscribe request from %s" msgstr "Žádost o zrušení autorizace od %s" -#: ../src/common/connection_handlers.py:1738 +#: ../src/common/connection_handlers.py:1825 #, python-format msgid "we are now unsubscribed from %s" msgstr "byla nám zrušena autorizace od %s" -#: ../src/common/connection_handlers.py:1914 +#: ../src/common/connection_handlers.py:1947 #, python-format -msgid "JID %s is not RFC compliant. It will not be added to your roster. Use roster management tools such as http://jru.jabberstudio.org/ to remove it" -msgstr "JID %s neodpovídá RFC. Nebude přidáno do tvého rosteru. Použij nástroje pro správu rosteru jako je http://jru.jabberstudio.org/ k jeho odstranění" +msgid "" +"JID %s is not RFC compliant. It will not be added to your roster. Use roster " +"management tools such as http://jru.jabberstudio.org/ to remove it" +msgstr "" +"JID %s neodpovídá RFC. Nebude přidáno do tvého rosteru. Použij nástroje pro " +"správu rosteru jako je http://jru.jabberstudio.org/ k jeho odstranění" -#: ../src/common/connection.py:187 -#: ../src/common/zeroconf/connection_zeroconf.py:196 +#: ../src/common/connection.py:241 +#: ../src/common/zeroconf/connection_zeroconf.py:203 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Spojení s účtem \"%s\" bylo ztraceno" -#: ../src/common/connection.py:188 +#: ../src/common/connection.py:242 msgid "Reconnect manually." msgstr "Znovu připojit ručně." -#: ../src/common/connection.py:199 -#: ../src/common/connection.py:226 +#: ../src/common/connection.py:253 +#, fuzzy, python-format +msgid "Server %s answered wrongly to register request: %s" +msgstr "Transport %s odpověděl chybně na požadavek registrace: %s" + +#. wrong answer +#: ../src/common/connection.py:261 +msgid "Invalid answer" +msgstr "Neplatná odpověď" + +#: ../src/common/connection.py:262 #, python-format msgid "Transport %s answered wrongly to register request: %s" msgstr "Transport %s odpověděl chybně na požadavek registrace: %s" -#. wrong answer -#: ../src/common/connection.py:225 -msgid "Invalid answer" -msgstr "Neplatná odpověď" +#: ../src/common/connection.py:408 +#, fuzzy +msgid "Connection to proxy failed" +msgstr "Spojení selhalo" -#: ../src/common/connection.py:422 -#: ../src/common/connection.py:521 -#: ../src/common/connection.py:979 -#: ../src/common/zeroconf/connection_zeroconf.py:217 +#: ../src/common/connection.py:462 ../src/common/connection.py:508 +#: ../src/common/connection.py:1055 +#: ../src/common/zeroconf/connection_zeroconf.py:237 #, python-format msgid "Could not connect to \"%s\"" msgstr "Nemůžu se připojit k \"%s\"" -#: ../src/common/connection.py:436 +#: ../src/common/connection.py:476 #, python-format msgid "Connected to server %s:%s with %s" msgstr "Připojen k server %s: %s s %s" -#: ../src/common/connection.py:450 -#, python-format -msgid "Security error connecting to \"%s\"" -msgstr "Bezpečnostní chyba při připojení k \"%s\"" - -#: ../src/common/connection.py:451 -msgid "The server's key has changed, or someone is trying to hack your connection." -msgstr "Klíč serveru se změnil, nebo se někdo pokouší prolomit tvoje spojení." - -#: ../src/common/connection.py:458 -#, python-format -msgid "Unable to check fingerprint for %s. Connection could be insecure." -msgstr "Nemohu zkontrolovat otisk pro %s. Spojení nemusí být zcela bezpečné." - -#: ../src/common/connection.py:500 -#, python-format -msgid "Missing fingerprint in SSL connection to %s" -msgstr "Schází otisk v SSL spojení k %s" - -#: ../src/common/connection.py:506 -#, python-format -msgid "Fingerprint mismatch for %s: Got %s, expected %s" -msgstr "Otisk se neshoduje pro %s: Dostal jsem %s, očekával jsem %s" - -#: ../src/common/connection.py:522 +#: ../src/common/connection.py:509 msgid "Check your connection or try again later" msgstr "Ověřte připojení nebo zkuste později" -#: ../src/common/connection.py:548 +#: ../src/common/connection.py:534 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Autentizace selhala s \"%s\"" -#: ../src/common/connection.py:549 +#: ../src/common/connection.py:535 msgid "Please check your login and password for correctness." msgstr "Prosím zkontrolujte správnost jména a hesla." -#: ../src/common/connection.py:576 +#: ../src/common/connection.py:578 msgid "Error while removing privacy list" msgstr "chyba při odebírání privacy listu" -#: ../src/common/connection.py:577 +#: ../src/common/connection.py:579 #, 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." +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." #. We didn't set a passphrase -#: ../src/common/connection.py:675 -#: ../src/common/zeroconf/connection_zeroconf.py:156 +#: ../src/common/connection.py:679 +#: ../src/common/zeroconf/connection_zeroconf.py:163 msgid "OpenPGP passphrase was not given" msgstr "OpenPGP heslo nebylo zadáno" -#. do not show I'm invisible! -#: ../src/common/connection.py:717 -msgid "invisible" -msgstr "neviditelný" - -#: ../src/common/connection.py:718 -msgid "offline" -msgstr "odpojen" - -#: ../src/common/connection.py:719 -#, python-format -msgid "I'm %s" -msgstr "Jsem %s" - #. we're not english #. one in locale and one en -#: ../src/common/connection.py:810 +#: ../src/common/connection.py:842 msgid "[This message is *encrypted* (See :JEP:`27`]" msgstr "[Tato zpráva je *zašifrovaná* (Viz :JEP:`27`]" -#: ../src/common/connection.py:866 -#: ../src/common/zeroconf/connection_zeroconf.py:397 +#: ../src/common/connection.py:904 +#: ../src/common/zeroconf/connection_zeroconf.py:423 #, python-format msgid "" "Subject: %s\n" @@ -6004,11 +6821,11 @@ msgstr "" "Předmět: %s\n" "%s" -#: ../src/common/connection.py:1005 +#: ../src/common/connection.py:1087 msgid "Not fetched because of invisible status" msgstr "Nestáhnuto z důvodu stavu neviditelnosti" -#: ../src/common/contacts.py:271 +#: ../src/common/contacts.py:294 msgid "Not in roster" msgstr "Není v rosteru" @@ -6023,17 +6840,18 @@ msgstr "Možnosti D-Bus nemohou být použity" #: ../src/common/exceptions.py:22 msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." -msgstr "Závislost na pysqlite2 (neboli python-pysqlite2) není splněna. Končím..." +msgstr "" +"Závislost na pysqlite2 (neboli python-pysqlite2) není splněna. Končím..." -#: ../src/common/exceptions.py:30 +#: ../src/common/exceptions.py:39 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "Služba není dostupná. Gajim neběží, nebo remote_control je vypnutý" -#: ../src/common/exceptions.py:38 +#: ../src/common/exceptions.py:47 msgid "D-Bus is not present on this machine or python module is missing" msgstr "D-Bus není přítomna na tohto stroji nebo modul pythonu chybí" -#: ../src/common/exceptions.py:46 +#: ../src/common/exceptions.py:55 msgid "" "Session bus is not available.\n" "Try reading http://trac.gajim.org/wiki/GajimDBus" @@ -6091,68 +6909,55 @@ msgstr "dvanáct" #. Strings to use for the output. %0 will be replaced with the preceding hour (e.g. "x PAST %0"), %1 with the coming hour (e.g. "x TO %1). ''' #. A "singular-form". It is used when talking about hour 0 -#: ../src/common/fuzzyclock.py:47 -#: ../src/common/fuzzyclock.py:55 +#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 msgid "$0 o'clock" msgstr "$0 hodin" -#: ../src/common/fuzzyclock.py:47 -#: ../src/common/fuzzyclock.py:55 +#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 msgid "five past $0" msgstr "pět po $0" -#: ../src/common/fuzzyclock.py:48 -#: ../src/common/fuzzyclock.py:56 +#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 msgid "ten past $0" msgstr "deset po $0" -#: ../src/common/fuzzyclock.py:48 -#: ../src/common/fuzzyclock.py:56 +#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 msgid "quarter past $0" msgstr "čtvrt po $0" -#: ../src/common/fuzzyclock.py:49 -#: ../src/common/fuzzyclock.py:57 +#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 msgid "twenty past $0" msgstr "dvacet po $0" -#: ../src/common/fuzzyclock.py:49 -#: ../src/common/fuzzyclock.py:57 +#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 msgid "twenty five past $0" msgstr "dvacet pět po $%" -#: ../src/common/fuzzyclock.py:50 -#: ../src/common/fuzzyclock.py:58 +#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 msgid "half past $0" msgstr "půl $1" -#: ../src/common/fuzzyclock.py:50 -#: ../src/common/fuzzyclock.py:58 +#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 msgid "twenty five to $1" msgstr "dvacet pět do $1" -#: ../src/common/fuzzyclock.py:51 -#: ../src/common/fuzzyclock.py:59 +#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 msgid "twenty to $1" msgstr "dvacet do $1" -#: ../src/common/fuzzyclock.py:51 -#: ../src/common/fuzzyclock.py:59 +#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 msgid "quarter to $1" msgstr "tři čtvrtě na $1" -#: ../src/common/fuzzyclock.py:52 -#: ../src/common/fuzzyclock.py:60 +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 msgid "ten to $1" msgstr "za deset $1" -#: ../src/common/fuzzyclock.py:52 -#: ../src/common/fuzzyclock.py:60 +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 msgid "five to $1" msgstr "za pět $1" -#: ../src/common/fuzzyclock.py:52 -#: ../src/common/fuzzyclock.py:61 +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:61 msgid "$1 o'clock" msgstr "$1 hodin" @@ -6204,287 +7009,252 @@ msgstr "Konec týdne" msgid "Weekend!" msgstr "Víkend!" -#: ../src/common/helpers.py:114 +#: ../src/common/helpers.py:115 msgid "Invalid character in username." msgstr "Neplatný znak v uživatelském jméně." -#: ../src/common/helpers.py:119 +#: ../src/common/helpers.py:120 msgid "Server address required." msgstr "Je potřeba adresa serveru." -#: ../src/common/helpers.py:124 +#: ../src/common/helpers.py:125 msgid "Invalid character in hostname." msgstr "Neplatný znak v hostname." -#: ../src/common/helpers.py:130 +#: ../src/common/helpers.py:131 msgid "Invalid character in resource." msgstr "Neplatný znak ve zdroji." #. GiB means gibibyte -#: ../src/common/helpers.py:170 +#: ../src/common/helpers.py:171 #, python-format msgid "%s GiB" msgstr "%s GiB" #. GB means gigabyte -#: ../src/common/helpers.py:173 +#: ../src/common/helpers.py:174 #, python-format msgid "%s GB" msgstr "%s GB" #. MiB means mibibyte -#: ../src/common/helpers.py:177 +#: ../src/common/helpers.py:178 #, python-format msgid "%s MiB" msgstr "%s MiB" #. MB means megabyte -#: ../src/common/helpers.py:180 +#: ../src/common/helpers.py:181 #, python-format msgid "%s MB" msgstr "%s MB" #. KiB means kibibyte -#: ../src/common/helpers.py:184 +#: ../src/common/helpers.py:185 #, python-format msgid "%s KiB" msgstr "%s KiB" #. KB means kilo bytes -#: ../src/common/helpers.py:187 +#: ../src/common/helpers.py:188 #, python-format msgid "%s KB" msgstr "%s KB" #. B means bytes -#: ../src/common/helpers.py:190 +#: ../src/common/helpers.py:191 #, python-format msgid "%s B" msgstr "%s B" -#: ../src/common/helpers.py:219 +#: ../src/common/helpers.py:222 msgid "_Busy" msgstr "_Nerušit" -#: ../src/common/helpers.py:221 +#: ../src/common/helpers.py:224 msgid "Busy" msgstr "Nerušit" -#: ../src/common/helpers.py:224 +#: ../src/common/helpers.py:227 msgid "_Not Available" msgstr "Ne_dostupný" -#: ../src/common/helpers.py:229 +#: ../src/common/helpers.py:232 msgid "_Free for Chat" msgstr "_Ukecaný" -#: ../src/common/helpers.py:231 +#: ../src/common/helpers.py:234 msgid "Free for Chat" msgstr "Ukecaný" -#: ../src/common/helpers.py:234 +#: ../src/common/helpers.py:237 msgid "_Available" msgstr "Přip_ojen" -#: ../src/common/helpers.py:236 +#: ../src/common/helpers.py:239 msgid "Available" msgstr "Připojen" -#: ../src/common/helpers.py:238 +#: ../src/common/helpers.py:241 msgid "Connecting" msgstr "Připojuji se" -#: ../src/common/helpers.py:241 +#: ../src/common/helpers.py:244 msgid "A_way" msgstr "_Pryč" -#: ../src/common/helpers.py:246 +#: ../src/common/helpers.py:249 msgid "_Offline" msgstr "_Odpojen" -#: ../src/common/helpers.py:248 +#: ../src/common/helpers.py:251 msgid "Offline" msgstr "Odpojen" -#: ../src/common/helpers.py:251 +#: ../src/common/helpers.py:254 msgid "_Invisible" msgstr "Ne_viditelný" -#: ../src/common/helpers.py:257 +#: ../src/common/helpers.py:260 msgid "?contact has status:Unknown" msgstr "?contact has status:Neznámý" -#: ../src/common/helpers.py:259 +#: ../src/common/helpers.py:262 msgid "?contact has status:Has errors" msgstr "stav" -#: ../src/common/helpers.py:264 +#: ../src/common/helpers.py:267 msgid "?Subscription we already have:None" msgstr "?Subscription we already have:Žádná" -#: ../src/common/helpers.py:266 +#: ../src/common/helpers.py:269 msgid "To" msgstr "Příjemce" -#: ../src/common/helpers.py:270 +#: ../src/common/helpers.py:273 msgid "Both" msgstr "Oboustranná" -#: ../src/common/helpers.py:278 +#: ../src/common/helpers.py:281 msgid "?Ask (for Subscription):None" msgstr "?Ask (for Subscription):Není" -#: ../src/common/helpers.py:280 +#: ../src/common/helpers.py:283 msgid "Subscribe" msgstr "Žádat autorizaci" -#: ../src/common/helpers.py:289 +#: ../src/common/helpers.py:292 msgid "?Group Chat Contact Role:None" msgstr "?Group Chat Contact Role:Žádná" -#: ../src/common/helpers.py:292 +#: ../src/common/helpers.py:295 msgid "Moderators" msgstr "Moderátoři" -#: ../src/common/helpers.py:294 +#: ../src/common/helpers.py:297 msgid "Moderator" msgstr "Moderátor" -#: ../src/common/helpers.py:297 +#: ../src/common/helpers.py:300 msgid "Participants" msgstr "Účastníci" -#: ../src/common/helpers.py:299 +#: ../src/common/helpers.py:302 msgid "Participant" msgstr "Účastník" -#: ../src/common/helpers.py:302 +#: ../src/common/helpers.py:305 msgid "Visitors" msgstr "Návštěvníci" -#: ../src/common/helpers.py:304 +#: ../src/common/helpers.py:307 msgid "Visitor" msgstr "Návštěvník" -#: ../src/common/helpers.py:310 +#: ../src/common/helpers.py:313 msgid "?Group Chat Contact Affiliation:None" msgstr "?Group Chat Contact Affiliation:Žádná" -#: ../src/common/helpers.py:312 +#: ../src/common/helpers.py:315 msgid "Owner" msgstr "Vlastník" -#: ../src/common/helpers.py:314 +#: ../src/common/helpers.py:317 msgid "Administrator" msgstr "Správce" -#: ../src/common/helpers.py:316 +#: ../src/common/helpers.py:319 msgid "Member" msgstr "Člen" -#: ../src/common/helpers.py:355 +#: ../src/common/helpers.py:358 msgid "is paying attention to the conversation" msgstr "věnuje pozornost rozhovoru" -#: ../src/common/helpers.py:357 +#: ../src/common/helpers.py:360 msgid "is doing something else" msgstr "dělá něco jiného" -#: ../src/common/helpers.py:359 +#: ../src/common/helpers.py:362 msgid "is composing a message..." msgstr "píše zprávu..." #. paused means he or she was composing but has stopped for a while -#: ../src/common/helpers.py:362 +#: ../src/common/helpers.py:365 msgid "paused composing a message" msgstr "pozastavil(a) psaní zprávy" -#: ../src/common/helpers.py:364 +#: ../src/common/helpers.py:367 msgid "has closed the chat window or tab" msgstr "zavřel(a) okno zprávy" -#: ../src/common/helpers.py:890 -#, python-format -msgid " %d unread message" -msgid_plural " %d unread messages" -msgstr[0] "%d nepřečtená zpráva" -msgstr[1] "%d nepřečtené zprávy" -msgstr[2] "%d nepřečtených zpráv" +#: ../src/common/helpers.py:913 ../src/common/helpers.py:920 +#, fuzzy, python-format +msgid "%d message pending" +msgid_plural "%d messages pending" +msgstr[0] "Odeslat zprávu" +msgstr[1] "Odeslat zprávu" +msgstr[2] "Odeslat zprávu" -#: ../src/common/helpers.py:896 +#: ../src/common/helpers.py:926 #, python-format -msgid " %d unread single message" -msgid_plural " %d unread single messages" -msgstr[0] "%d nepřečtenou prostou zprávu" -msgstr[1] "%d nepřečtené prosté zprávy" -msgstr[2] "%d nepřečtených prostých zpráv" +msgid " from room %s" +msgstr "" -#: ../src/common/helpers.py:902 +#: ../src/common/helpers.py:929 ../src/common/helpers.py:948 #, python-format -msgid " %d unread group chat message" -msgid_plural " %d unread group chat messages" -msgstr[0] "%d nepřečtenou zprávu z diskuzí" -msgstr[1] "%d nepřečtené zprávy z diskuzí" -msgstr[2] "%d nepřečtených zpráv z diskuzí" +msgid " from user %s" +msgstr "" -#: ../src/common/helpers.py:908 +#: ../src/common/helpers.py:931 #, python-format -msgid " %d unread private message" -msgid_plural " %d unread private messages" -msgstr[0] "%d nepřečtenou soukromou zprávu" -msgstr[1] "%d nepřečtené soukromé zprávy" -msgstr[2] "%d nepřečtených soukromých zpráv" +msgid " from %s" +msgstr "" -#: ../src/common/helpers.py:918 -#: ../src/common/helpers.py:920 +#: ../src/common/helpers.py:938 ../src/common/helpers.py:945 +#, python-format +msgid "%d event pending" +msgid_plural "%d events pending" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../src/common/helpers.py:978 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" -#: ../src/common/check_paths.py:33 -msgid "creating logs database" -msgstr "vytvářím databázi historie" - -#: ../src/common/check_paths.py:89 -#: ../src/common/check_paths.py:100 -#: ../src/common/check_paths.py:107 -#, 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:90 -#: ../src/common/check_paths.py:101 -#: ../src/common/check_paths.py:108 -#: ../src/common/check_paths.py:116 -msgid "Gajim will now exit" -msgstr "Gajim se nyní ukončí" - -#: ../src/common/check_paths.py:115 -#, 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:131 -#, python-format -msgid "creating %s directory" -msgstr "vytvářím adresář %s " - #. we talk about a file #: ../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:181 -msgid "gtk+" -msgstr "gtk+" - -#: ../src/common/optparser.py:190 -#: ../src/common/optparser.py:191 +#: ../src/common/optparser.py:202 ../src/common/optparser.py:203 msgid "cyan" msgstr "azurová" -#: ../src/common/optparser.py:308 +#: ../src/common/optparser.py:319 msgid "migrating logs database to indices" msgstr "" @@ -6493,31 +7263,35 @@ msgstr "" msgid "Gajim account %s" msgstr "Gajim účet %s" -#: ../src/common/zeroconf/client_zeroconf.py:189 -msgid "Connection to host could not be established: Incorrect answer from server." -msgstr "Spojení k počítači nebylo navázáno: Neplatná odpověď serveru." - -#: ../src/common/zeroconf/client_zeroconf.py:205 +#: ../src/common/zeroconf/client_zeroconf.py:135 +#: ../src/common/zeroconf/client_zeroconf.py:218 msgid "Connection to host could not be established" msgstr "Spojení s počítačem se nepodařilo navázat" -#: ../src/common/zeroconf/client_zeroconf.py:334 -msgid "Connection to host could not be established: Timeout while sending data." +#: ../src/common/zeroconf/client_zeroconf.py:192 +msgid "" +"Connection to host could not be established: Incorrect answer from server." +msgstr "Spojení k počítači nebylo navázáno: Neplatná odpověď serveru." + +#: ../src/common/zeroconf/client_zeroconf.py:352 +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." -#: ../src/common/zeroconf/client_zeroconf.py:627 +#: ../src/common/zeroconf/client_zeroconf.py:638 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:197 +#: ../src/common/zeroconf/connection_zeroconf.py:204 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." +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:207 +#: ../src/common/zeroconf/connection_zeroconf.py:227 msgid "Avahi error" msgstr "Chyba Avahi" -#: ../src/common/zeroconf/connection_zeroconf.py:207 +#: ../src/common/zeroconf/connection_zeroconf.py:227 #, python-format msgid "" "%s\n" @@ -6526,66 +7300,206 @@ msgstr "" "%s\n" "Zasílání lokálních zpráv nemusí fungovat správně." -#: ../src/common/zeroconf/connection_zeroconf.py:218 +#: ../src/common/zeroconf/connection_zeroconf.py:238 msgid "Please check if Avahi is installed." msgstr "Zkontrolujte zda je Avahi nainstalováno." -#: ../src/common/zeroconf/connection_zeroconf.py:227 -#: ../src/common/zeroconf/connection_zeroconf.py:231 +#: ../src/common/zeroconf/connection_zeroconf.py:247 +#: ../src/common/zeroconf/connection_zeroconf.py:251 msgid "Could not start local service" msgstr "Nepodařilo se spustit lokální službu" -#: ../src/common/zeroconf/connection_zeroconf.py:228 +#: ../src/common/zeroconf/connection_zeroconf.py:248 #, python-format msgid "Unable to bind to port %d." msgstr "Nemůžu naslouchat na portu %d." -#: ../src/common/zeroconf/connection_zeroconf.py:232 -#: ../src/common/zeroconf/connection_zeroconf.py:325 +#: ../src/common/zeroconf/connection_zeroconf.py:252 +#: ../src/common/zeroconf/connection_zeroconf.py:347 msgid "Please check if avahi-daemon is running." msgstr "Zkontrolujte, zda avahi-daemon běží." -#: ../src/common/zeroconf/connection_zeroconf.py:324 +#: ../src/common/zeroconf/connection_zeroconf.py:346 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Nemůžu změnit stav účtu \"%s\"" -#: ../src/common/zeroconf/connection_zeroconf.py:341 -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." +#: ../src/common/zeroconf/connection_zeroconf.py:363 +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:353 +#: ../src/common/zeroconf/connection_zeroconf.py:375 msgid "[This message is encrypted]" msgstr "[Tato zpráva je zašifrovaná]" -#: ../src/common/zeroconf/zeroconf.py:180 -#, python-format -msgid "Error while adding service. %s" -msgstr "Chyba při přidávání služby. %s" +#~ msgid "Send Single _Message..." +#~ msgstr "Odeslat jednoduchou _zprávu..." + +#~ msgid "_Add Contact..." +#~ msgstr "Přid_at kontakt..." + +# FIXME: chtelo by to cesky vyraz pro service discovery +#~ msgid "_Discover Services..." +#~ msgstr "_Prohlížet služby..." + +#~ msgid "_Retype Password:" +#~ msgstr "Z_opakuj heslo:" + +#~ msgid "_Use proxy" +#~ msgstr "_Používat proxy" + +#~ msgid "Accounts" +#~ msgstr "Účty" + +#~ msgid "" +#~ "If checked, all local contacts that use a Bonjour compatible chat client " +#~ "(like iChat, Trillian or Gaim) will be shown in roster. You don't need to " +#~ "be connected to a jabber server for it to work.\n" +#~ "This is only available if python-avahi is installed and avahi-daemon is " +#~ "running." +#~ msgstr "" +#~ "Pokud je zaškrtnuto, všechny místní kontakty používající Bonjour-" +#~ "kompatibilního klienta (iChat, Trillian nebo Gaim) se zobrazí v rosteru. " +#~ "Nemusíš být připojený(á) k jabber serveru, aby to fungovalo.\n" +#~ "Je to dostupné pouze v případě, že je nainstalováno python-avahi a avahi-" +#~ "daemon běží." + +#~ msgid "" +#~ "If you have 2 or more accounts and this is checked, Gajim will list all " +#~ "contacts as if you had one account" +#~ msgstr "" +#~ "Máte-li 2 nebo více účtů a je zaškrtnuto, Gajim zobrazí všechny kontakty " +#~ "jako by byly z jednoho účtu" + +#~ msgid "_Enable link-local messaging" +#~ msgstr "_Povolit lokální zprávy" + +#~ msgid "_Modify" +#~ msgstr "_Upravit" + +#~ msgid "_Compact View Alt+C" +#~ msgstr "_Zjednodušený pohled Alt+C" + +#~ msgid "_Remove from Roster" +#~ msgstr "Odst_ranit ze Seznamu" + +#~ msgid "You must enter a password for the new account." +#~ msgstr "Musíte zadat heslo pro nový účet." + +#~ msgid "" +#~ "If that is not your language for which you want to highlight misspelled " +#~ "words, then please set your $LANG as appropriate. Eg. for French do " +#~ "export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to " +#~ "make it global in /etc/profile.\n" +#~ "\n" +#~ "Highlighting misspelled words feature will not be used" +#~ msgstr "" +#~ "Pokud to není Váš jazyk, pro který chcete zvýrazňovat slova s překlepy, " +#~ "potom prosím nastavte proměnnou $LANG na správnou. Například. pro Češtinu " +#~ "spusťte export LANG=cs_CZ nebo export LANG=cs_CZ zapište do ~/." +#~ "bash_profile nebo pro nastavení globálně do /etc/profile.\n" +#~ "\n" +#~ "Vlastnost zvýrazňování překlepů nebude použita" + +#~ msgid "Private Chat" +#~ msgstr "Soukromý rozhovor" + +#~ msgid "Group Chat" +#~ msgstr "Diskuze" + +#~ msgid "Drop %s in group %s" +#~ msgstr "Smazat %s ve skupině %s" + +#~ msgid "Make %s and %s metacontacts" +#~ msgstr "Učiň %s a %s metakontakty" + +#~ msgid "Hides the buttons in two persons chat window." +#~ msgstr "Skryje tlačítka v okně rozhovoru dvou lidí." + +#~ msgid "Security error connecting to \"%s\"" +#~ msgstr "Bezpečnostní chyba při připojení k \"%s\"" + +#~ msgid "" +#~ "The server's key has changed, or someone is trying to hack your " +#~ "connection." +#~ msgstr "" +#~ "Klíč serveru se změnil, nebo se někdo pokouší prolomit tvoje spojení." + +#~ msgid "Unable to check fingerprint for %s. Connection could be insecure." +#~ msgstr "" +#~ "Nemohu zkontrolovat otisk pro %s. Spojení nemusí být zcela bezpečné." + +#~ msgid "Missing fingerprint in SSL connection to %s" +#~ msgstr "Schází otisk v SSL spojení k %s" + +#~ msgid "Fingerprint mismatch for %s: Got %s, expected %s" +#~ msgstr "Otisk se neshoduje pro %s: Dostal jsem %s, očekával jsem %s" + +#~ msgid "invisible" +#~ msgstr "neviditelný" + +#~ msgid "offline" +#~ msgstr "odpojen" + +#~ msgid "I'm %s" +#~ msgstr "Jsem %s" + +#~ msgid " %d unread single message" +#~ msgid_plural " %d unread single messages" +#~ msgstr[0] "%d nepřečtenou prostou zprávu" +#~ msgstr[1] "%d nepřečtené prosté zprávy" +#~ msgstr[2] "%d nepřečtených prostých zpráv" + +#~ msgid " %d unread group chat message" +#~ msgid_plural " %d unread group chat messages" +#~ msgstr[0] "%d nepřečtenou zprávu z diskuzí" +#~ msgstr[1] "%d nepřečtené zprávy z diskuzí" +#~ msgstr[2] "%d nepřečtených zpráv z diskuzí" + +#~ msgid " %d unread private message" +#~ msgid_plural " %d unread private messages" +#~ msgstr[0] "%d nepřečtenou soukromou zprávu" +#~ msgstr[1] "%d nepřečtené soukromé zprávy" +#~ msgstr[2] "%d nepřečtených soukromých zpráv" + +#~ msgid "gtk+" +#~ msgstr "gtk+" + +#~ msgid "Error while adding service. %s" +#~ msgstr "Chyba při přidávání služby. %s" #~ msgid "A_fter nickname:" #~ msgstr "_Po přezdívce:" + #~ msgid "B_efore nickname:" #~ msgstr "Pře_d přezdívkou:" + #~ msgid "_After time:" #~ msgstr "_Po čase:" + #~ msgid "_Before time:" #~ msgstr "Pře_d časem:" + #~ msgid "_Publish" #~ msgstr "_Zveřejnit" + #~ msgid "_Retrieve" #~ msgstr "_Získat" + #~ msgid "Without a connection, you can not get your contact information." #~ msgstr "Bez opětovného připojení nemůžete získat Vaše osobní údaje." #, fuzzy #~ msgid "_New room" #~ msgstr "Nová místnost" + #~ msgid "Role: " #~ msgstr "Role:" -#~ msgid "Affiliation: " -#~ msgstr "Přidružení:" + #~ msgid "" #~ "Sound to play when any MUC message arrives. (This setting is taken into " #~ "account only if notify_on_all_muc_messages is True)" @@ -6612,33 +7526,45 @@ msgstr "Chyba při přidávání služby. %s" #, fuzzy #~ msgid "Not Available " #~ msgstr "Nedostupný" + #~ msgid "Contact _Info" #~ msgstr "_Informace o kontaktu" + #~ msgid "Jabber" #~ msgstr "Jabber" + #~ msgid "Invalid room or server name" #~ msgstr "Neplatná místnost nebo jméno serveru" + #~ msgid "Unknown D-Bus version: %s" #~ msgstr "Neznámá verze D-Bus: %s" + #~ msgid "vCard publication succeeded" #~ msgstr "publikování vizitky bylo úspěšné" + #~ msgid "Your personal information has been published successfully." #~ msgstr "Vaše osobní údaje byly úspěšně publikovány." + #~ msgid "Migrating Logs..." #~ msgstr "Převádím historii..." + #~ msgid "Gajim - %d unread message" #~ msgid_plural "Gajim - %d unread messages" #~ msgstr[0] "Gajim - %d nepřečtenou zprávu" #~ msgstr[1] "Gajim - %d nepřečtené zprávy" #~ msgstr[2] "Gajim - %d nepřečtených zpráv" + #~ msgid "Since %s" #~ msgstr "Od %s" + #~ msgid "Automatically authorize contact" #~ msgstr "Automaticky autorizovat kontakt" + #~ msgid "Send File" #~ msgstr "Odeslat Soubor" + #~ msgid "Underline" #~ msgstr "Podtržení" + #~ msgid "_Join New Room..." #~ msgstr "_Vstoupit do nové místnosti..." - diff --git a/po/da.po b/po/da.po new file mode 100644 index 000000000..fb22fe239 --- /dev/null +++ b/po/da.po @@ -0,0 +1,7648 @@ +# Danish translations for Gajim package. +# Copyright (C) 2007 GAJIM'S COPYRIGHT HOLDER +# This file is distributed under the same license as the Gajim package. +# Niels Felsted Thorsen , 2007. +# +#: ../src/gajim-remote.py:212 ../src/gajim-remote.py:219 +#: ../src/gajim-remote.py:245 ../src/gajim-remote.py:246 +#: ../src/gajim-remote.py:252 ../src/gajim-remote.py:253 +#: ../src/gajim-remote.py:254 ../src/gajim-remote.py:255 +msgid "" +msgstr "" +"Project-Id-Version: Gajim 0.11\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-09 11:23+0200\n" +"PO-Revision-Date: 2007-09-30 17:47+0200\n" +"Last-Translator: Niels Felsted Thorsen \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Emacs 22.1.50.1, po-mode 2.02+0.4\n" + +#: ../data/gajim.desktop.in.in.h:1 +msgid "A GTK+ Jabber client" +msgstr "En GTK+ Jabber klient" + +#: ../data/gajim.desktop.in.in.h:2 +msgid "Gajim Instant Messenger" +msgstr "Gajim Instant Messenger" + +#: ../data/gajim.desktop.in.in.h:3 +msgid "Jabber IM Client" +msgstr "Jabber IM Klient" + +#: ../data/glade/account_context_menu.glade.h:1 +#: ../data/glade/roster_window.glade.h:8 +msgid "Join _Group Chat..." +msgstr "Deltag i en _Gruppe Samtale..." + +#: ../data/glade/account_context_menu.glade.h:2 +msgid "_Add Contact..." +msgstr "_Tilføj Kontakt..." + +#: ../data/glade/account_context_menu.glade.h:3 +#: ../data/glade/roster_window.glade.h:15 +msgid "_Discover Services" +msgstr "Op_dag Tjenester" + +#: ../data/glade/account_context_menu.glade.h:4 +msgid "_Execute Command..." +msgstr "_Udfør Kommando..." + +#: ../data/glade/account_context_menu.glade.h:5 +msgid "_Modify Account" +msgstr "_Ændre Konto" + +#: ../data/glade/account_context_menu.glade.h:6 +msgid "_Open Gmail Inbox" +msgstr "_Åbn Gmail Indboks" + +#: ../data/glade/account_context_menu.glade.h:7 +#: ../data/glade/roster_window.glade.h:22 +msgid "_Start Chat..." +msgstr "_Start Samtale..." + +#: ../data/glade/account_context_menu.glade.h:8 +#: ../data/glade/zeroconf_context_menu.glade.h:2 +msgid "_Status" +msgstr "_Status" + +#: ../data/glade/account_creation_wizard_window.glade.h:1 +msgid "" +"Connecting to server\n" +"\n" +"Please wait..." +msgstr "" +"Tilslutter til server\n" +"\n" +"Vent venligst..." + +#: ../data/glade/account_creation_wizard_window.glade.h:4 +msgid "Please choose one of the options below:" +msgstr "Vælg en af mulighederne under:" + +#: ../data/glade/account_creation_wizard_window.glade.h:5 +msgid "Please fill in the data for your new account" +msgstr "Fyld ind data for din nye konto" + +#: ../data/glade/account_creation_wizard_window.glade.h:6 +msgid "Please select a server" +msgstr "Vælg venligst en server" + +#: ../data/glade/account_creation_wizard_window.glade.h:7 +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" + +#: ../data/glade/account_creation_wizard_window.glade.h:8 +msgid "Connect when I press Finish" +msgstr "Tilslut når jeg trykke Færdig" + +#: ../data/glade/account_creation_wizard_window.glade.h:9 +msgid "Gajim: Account Creation Wizard" +msgstr "Gajim: Konto Oprettelses Guide" + +#: ../data/glade/account_creation_wizard_window.glade.h:10 +msgid "I already have an account I want to use" +msgstr "Jeg har allerede en konto jeg vil bruge" + +#: ../data/glade/account_creation_wizard_window.glade.h:11 +msgid "I want to _register for a new account" +msgstr "Jeg vil _registrere en ny konto" + +#: ../data/glade/account_creation_wizard_window.glade.h:12 +#: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/accounts_window.glade.h:22 +msgid "If checked, Gajim will remember the password for this account" +msgstr "Hvis valgt vil Gajim huske adgangskoden for denne konto" + +#: ../data/glade/account_creation_wizard_window.glade.h:13 +#: ../data/glade/account_modification_window.glade.h:26 +#: ../data/glade/accounts_window.glade.h:32 +msgid "Manage..." +msgstr "Kan håndteres..." + +#: ../data/glade/account_creation_wizard_window.glade.h:14 +msgid "Prox_y:" +msgstr "Pro_xy:" + +#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/accounts_window.glade.h:48 +msgid "Save pass_word" +msgstr "Gem adgangs_kode" + +#: ../data/glade/account_creation_wizard_window.glade.h:16 +msgid "Servers Features" +msgstr "Server Egenskaber" + +#: ../data/glade/account_creation_wizard_window.glade.h:17 +msgid "Set my profile when I connect" +msgstr "Sæt min profil når jeg tilslutter" + +#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/accounts_window.glade.h:53 +msgid "Use custom hostname/port" +msgstr "Brug tilpasset værtsnavn/port" + +#: ../data/glade/account_creation_wizard_window.glade.h:19 +msgid "" +"You need to have an account in order to connect\n" +"to the Jabber network." +msgstr "" +"Du behøver en konto for at tilslutte dig\n" +"til Jabber netværket" + +#: ../data/glade/account_creation_wizard_window.glade.h:21 +msgid "Your JID:" +msgstr "Din JID:" + +#: ../data/glade/account_creation_wizard_window.glade.h:22 +#: ../data/glade/roster_window.glade.h:13 +msgid "_Advanced" +msgstr "_Avanceret" + +#: ../data/glade/account_creation_wizard_window.glade.h:23 +msgid "_Finish" +msgstr "_Færdig" + +#: ../data/glade/account_creation_wizard_window.glade.h:24 +msgid "_Hostname:" +msgstr "_Værtsnavn:" + +#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_modification_window.glade.h:50 +#: ../data/glade/accounts_window.glade.h:58 +msgid "_Password:" +msgstr "_Adgangskode" + +#: ../data/glade/account_creation_wizard_window.glade.h:26 +#: ../data/glade/manage_proxies_window.glade.h:11 +msgid "_Port:" +msgstr "_Port:" + +#: ../data/glade/account_creation_wizard_window.glade.h:27 +msgid "_Server:" +msgstr "_Server:" + +#: ../data/glade/account_creation_wizard_window.glade.h:28 +#: ../data/glade/manage_proxies_window.glade.h:12 +msgid "_Username:" +msgstr "_Brugernavn:" + +#: ../data/glade/account_modification_window.glade.h:1 +#: ../data/glade/accounts_window.glade.h:1 +#: ../data/glade/preferences_window.glade.h:8 +msgid "Miscellaneous" +msgstr "Diverse" + +#: ../data/glade/account_modification_window.glade.h:2 +#: ../data/glade/accounts_window.glade.h:2 +#: ../data/glade/zeroconf_properties_window.glade.h:1 +msgid "OpenPGP" +msgstr "OpenPGP" + +#: ../data/glade/account_modification_window.glade.h:3 +#: ../data/glade/accounts_window.glade.h:3 +#: ../data/glade/zeroconf_properties_window.glade.h:2 +msgid "Personal Information" +msgstr "Personlig Information" + +#: ../data/glade/account_modification_window.glade.h:4 +#: ../data/glade/accounts_window.glade.h:4 +msgid "Account" +msgstr "Konto" + +#: ../data/glade/account_modification_window.glade.h:5 +msgid "Account Modification" +msgstr "Ændring af Konto" + +#: ../data/glade/account_modification_window.glade.h:6 +#: ../data/glade/accounts_window.glade.h:5 +msgid "Administration operations" +msgstr "Administrative handlinger" + +#: ../data/glade/account_modification_window.glade.h:7 +#: ../data/glade/accounts_window.glade.h:6 +msgid "Auto-reconnect when connection is lost" +msgstr "Tilslut automatisk hvis tilslutningen tabes" + +#: ../data/glade/account_modification_window.glade.h:8 +#: ../data/glade/accounts_window.glade.h:7 +#: ../data/glade/zeroconf_properties_window.glade.h:3 +msgid "C_onnect on Gajim startup" +msgstr "T_ilslut når Gajim startes" + +#: ../data/glade/account_modification_window.glade.h:9 +#: ../data/glade/accounts_window.glade.h:8 +msgid "Chan_ge Password" +msgstr "Ænd_re Adgangskode" + +#: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/accounts_window.glade.h:9 +msgid "" +"Check this so Gajim will connect in port 5223 where legacy servers are " +"expected to have SSL capabilities. Note that Gajim uses TLS encryption by " +"default if broadcasted by the server, and with this option enabled TLS will " +"be disabled" +msgstr "" +"Tjek denne således at Gajim vil tilslutte på port 5223 hvor gamle servere " +"forventes at ha SSL muligheder. Bemærk at Gajim bruger TLS kryptering som " +"standard hvis det er rundsendt af serveren, og med denne indstilling valgt " +"vil TLS blive deaktiveret." + +#: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/accounts_window.glade.h:10 +#: ../data/glade/zeroconf_properties_window.glade.h:4 +msgid "Choose _Key..." +msgstr "Vælg _Nøgle..." + +#: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/accounts_window.glade.h:11 +msgid "Click to change account's password" +msgstr "Tryk for at ændre kontoens adgangskode" + +#: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/accounts_window.glade.h:12 +msgid "Click to request authorization to all contacts of another account" +msgstr "" +"Tryk for at forespørge om autorisering for alle kontakter af en anden konto" + +#: ../data/glade/account_modification_window.glade.h:14 +#: ../data/glade/accounts_window.glade.h:13 +msgid "Connection" +msgstr "Tilslutning" + +#: ../data/glade/account_modification_window.glade.h:15 +#: ../data/glade/accounts_window.glade.h:15 +msgid "Edit Personal Information..." +msgstr "Redigere Personlig Information..." + +#. No configured account +#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/accounts_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:6 ../src/notify.py:471 +#: ../src/notify.py:493 ../src/notify.py:505 ../src/common/helpers.py:964 +#: ../src/common/helpers.py:976 +msgid "Gajim" +msgstr "Gajim" + +#. General group cannot be changed +#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/accounts_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:45 +#: ../data/glade/zeroconf_properties_window.glade.h:7 +#: ../src/roster_window.py:359 ../src/roster_window.py:624 +#: ../src/roster_window.py:1360 ../src/roster_window.py:1728 +#: ../src/roster_window.py:2111 ../src/roster_window.py:2627 +#: ../src/roster_window.py:2745 ../src/common/contacts.py:309 +msgid "General" +msgstr "General" + +#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/accounts_window.glade.h:20 +msgid "Hostname: " +msgstr "Værtsnavn:" + +#: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/accounts_window.glade.h:21 +msgid "" +"If checked, Gajim will also broadcast some more IPs except from just your " +"IP, so file transfer has higher chances of working." +msgstr "" +"Hvis valgt vil Gajim rundsende flere IP adresser udover din egen IP adresse, " +"filoverførsler har en større chance for at lykkes." + +#: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/accounts_window.glade.h:23 +msgid "" +"If checked, Gajim will send keep-alive packets to prevent connection timeout " +"which results in disconnection" +msgstr "" +"Hvis valgt vil Gajim sende hold-i-live pakker for at forhindre at " +"tilslutningen afbrydes pga et tidsudløb" + +#: ../data/glade/account_modification_window.glade.h:22 +#: ../data/glade/accounts_window.glade.h:24 +#: ../data/glade/zeroconf_properties_window.glade.h:8 +msgid "" +"If checked, Gajim will store the password in ~/.gajim/config with 'read' " +"permission only for you" +msgstr "" +"Hvis valgt vil Gajim gemme adgangskoden i ~/.gajim/config med læse " +"rettigheder kun for dig" + +#: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/accounts_window.glade.h:25 +#: ../data/glade/zeroconf_properties_window.glade.h:9 +msgid "" +"If checked, Gajim, when launched, will automatically connect to jabber using " +"this account" +msgstr "" +"Hvis valgt vil Gajim vil Gajim, når den startes, automatisk tilslutte sig " +"til jabber med denne konto" + +#: ../data/glade/account_modification_window.glade.h:24 +#: ../data/glade/accounts_window.glade.h:26 +#: ../data/glade/zeroconf_properties_window.glade.h:10 +msgid "" +"If checked, any change to the global status (handled by the combobox at the " +"bottom of the roster window) will change the status of this account " +"accordingly" +msgstr "" +"Hvis valgt vil en hvilket som helst ændring til den globale status " +"(håndteret med kombinationsfeltet i bunden af kontaktvinduet) ændre status " +"på denne konto" + +#: ../data/glade/account_modification_window.glade.h:25 +#: ../data/glade/accounts_window.glade.h:29 +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:34 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1524 +#: ../src/config.py:2010 +msgid "No key selected" +msgstr "Ingen nøgle er valgt" + +#. None means no proxy profile selected +#. GPG Key +#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/accounts_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:32 ../src/config.py:1110 +#: ../src/config.py:1181 ../src/config.py:1430 ../src/config.py:1435 +#: ../src/config.py:1906 ../src/config.py:1993 ../src/config.py:2009 +#: ../src/config.py:3109 ../src/config.py:3155 ../src/dialogs.py:286 +#: ../src/dialogs.py:288 ../src/roster_window.py:1832 +#: ../src/roster_window.py:1839 ../src/roster_window.py:1846 +msgid "None" +msgstr "Ingen" + +#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/accounts_window.glade.h:37 +#: ../data/glade/profile_window.glade.h:26 +#: ../data/glade/zeroconf_properties_window.glade.h:17 +msgid "Personal Information" +msgstr "Personlig Information" + +#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/accounts_window.glade.h:38 +msgid "Port: " +msgstr "Port: " + +#: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/accounts_window.glade.h:39 +msgid "Priori_ty:" +msgstr "Priori_tet:" + +#: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/accounts_window.glade.h:40 +msgid "" +"Priority is used in Jabber to determine who gets the events from the jabber " +"server when two or more clients are connected using the same account; The " +"client with the highest priority gets the events" +msgstr "" +"Prioritet er brugt i Jabber for at bestemme hvem som får hændelser fra " +"jabber serveren når to eller flere klienter er tilsluttet med den samme " +"konto: Klienten med den højeste prioritet får hændelserne" + +#: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/accounts_window.glade.h:41 +msgid "Priority will change automatically according to your status." +msgstr "Prioritet vil automatisk ændres ifølge din status." + +#: ../data/glade/account_modification_window.glade.h:35 +#: ../data/glade/accounts_window.glade.h:42 +msgid "Proxy:" +msgstr "Proxy:" + +#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/accounts_window.glade.h:44 +msgid "Resour_ce:" +msgstr "Ressour_ce:" + +#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/accounts_window.glade.h:45 +msgid "" +"Resource is sent to the Jabber server in order to separate the same JID in " +"two or more parts depending on the number of the clients connected in the " +"same server with the same account. So you might be connected in the same " +"account with resource 'Home' and 'Work' at the same time. The resource which " +"has the highest priority will get the events. (see below)" +msgstr "" +"Ressource bliver sendt til Jabber serveren for at separere den samme JID i " +"to eller flere dele afhængig af antallet klienter som tilsluttet til den " +"samme server med den samme konto. Det vil sige du kan være tilsluttet med " +"denne samme konto med ressourcerne 'Hjemme' og 'Arbejde' på den samme tid. " +"Ressourcen med den højeste prioritet vil få hændelserne. (se under)" + +#: ../data/glade/account_modification_window.glade.h:38 +#: ../data/glade/accounts_window.glade.h:46 +#: ../data/glade/zeroconf_properties_window.glade.h:18 +msgid "Save _passphrase (insecure)" +msgstr "Gem _pgp-løsen (ikke sikkert)" + +#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/accounts_window.glade.h:47 +#: ../data/glade/zeroconf_properties_window.glade.h:19 +msgid "Save conversation _logs for all contacts" +msgstr "Gem konversations _logger for alle kontakter" + +#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/accounts_window.glade.h:49 +msgid "Send keep-alive packets" +msgstr "Send hold-i-live pakker" + +#: ../data/glade/account_modification_window.glade.h:42 +#: ../data/glade/accounts_window.glade.h:50 +#: ../data/glade/zeroconf_properties_window.glade.h:20 +msgid "Synch_ronize account status with global status" +msgstr "Synk_roniser konto status med global status" + +#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/accounts_window.glade.h:51 +#: ../data/glade/synchronise_select_account_dialog.glade.h:2 +msgid "Synchronise contacts" +msgstr "Synkroniser kontakter" + +#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/accounts_window.glade.h:52 +msgid "Use _SSL (legacy)" +msgstr "Brug _SSL (gammel type)" + +#: ../data/glade/account_modification_window.glade.h:46 +#: ../data/glade/accounts_window.glade.h:55 +msgid "Use file transfer proxies" +msgstr "Brug fil transport proxy" + +#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/accounts_window.glade.h:56 +msgid "_Adjust to status" +msgstr "_Tilpas til status" + +#: ../data/glade/account_modification_window.glade.h:48 +#: ../data/glade/accounts_window.glade.h:57 +msgid "_Jabber ID:" +msgstr "_Jabber ID:" + +#: ../data/glade/account_modification_window.glade.h:49 +msgid "_Name:" +msgstr "_Navn:" + +#: ../data/glade/accounts_window.glade.h:14 +#: ../data/glade/profile_window.glade.h:11 +#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/zeroconf_information_window.glade.h:2 +#: ../data/glade/zeroconf_properties_window.glade.h:5 +msgid "E-Mail:" +msgstr "Epost:" + +#. XML Console enable checkbutton +#: ../data/glade/accounts_window.glade.h:16 +#: ../data/glade/xml_console_window.glade.h:4 +msgid "Enable" +msgstr "Aktiver" + +#: ../data/glade/accounts_window.glade.h:17 +#: ../data/glade/zeroconf_information_window.glade.h:3 +#: ../data/glade/zeroconf_properties_window.glade.h:6 +msgid "First Name:" +msgstr "Fornavn:" + +#: ../data/glade/accounts_window.glade.h:27 +#: ../data/glade/zeroconf_properties_window.glade.h:11 +msgid "" +"If the default port that is used for incoming messages is unfitting for your " +"setup you can select another one here.\n" +"You might consider to change possible firewall settings." +msgstr "" +"Hvis den standard port der bruges til indkomne beskeder ikke passer dig " +"eller\n" +"din opsætning kan du vælge en anden her.\n" +"Du bør også ændre opsætning tilsvarende på en evt. brandmur." + +#: ../data/glade/accounts_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/zeroconf_information_window.glade.h:4 +#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:453 +msgid "Jabber ID:" +msgstr "Jabber ID:" + +#: ../data/glade/accounts_window.glade.h:31 +#: ../data/glade/zeroconf_information_window.glade.h:5 +#: ../data/glade/zeroconf_properties_window.glade.h:14 +msgid "Last Name:" +msgstr "Efternavn:" + +#: ../data/glade/accounts_window.glade.h:33 +msgid "Mer_ge accounts" +msgstr "Fle_t kontoer" + +#. Rename +#: ../data/glade/accounts_window.glade.h:43 ../src/roster_window.py:2697 +msgid "Re_name" +msgstr "Om_døb" + +#: ../data/glade/accounts_window.glade.h:54 +#: ../data/glade/zeroconf_properties_window.glade.h:21 +msgid "Use custom port:" +msgstr "Brug personlig port:" + +#: ../data/glade/accounts_window.glade.h:59 +msgid "gtk-add" +msgstr "gtk-tilføj" + +#: ../data/glade/accounts_window.glade.h:60 +#: ../data/glade/features_window.glade.h:4 +msgid "gtk-close" +msgstr "gtk-luk" + +#: ../data/glade/accounts_window.glade.h:61 +msgid "gtk-remove" +msgstr "gtk-fjern" + +#: ../data/glade/add_new_contact_window.glade.h:1 +msgid "A_ccount:" +msgstr "K_onto:" + +#: ../data/glade/add_new_contact_window.glade.h:2 +msgid "A_llow this contact to view my status" +msgstr "Ti_llad denne kontakt at se min status" + +#: ../data/glade/add_new_contact_window.glade.h:3 +msgid "Add New Contact" +msgstr "Tilføj Ny Kontakt" + +#: ../data/glade/add_new_contact_window.glade.h:4 +msgid "I would like to add you to my contact list." +msgstr "Jeg vil gerne tilføje dig til min kontakt liste." + +#: ../data/glade/add_new_contact_window.glade.h:5 +msgid "" +"You have to register with this transport\n" +"to be able to add a contact from this\n" +"protocol. Click on register button to\n" +"proceed." +msgstr "" +"Du må registrere dig for denne transport\n" +"for at være i stand til at tilføje kontakter fra denne\n" +"protokol. Klik på registrer knappen for at\n" +"fortsætte." + +#: ../data/glade/add_new_contact_window.glade.h:9 +msgid "" +"You must be connected to the transport to be able\n" +"to add a contact from this protocol." +msgstr "" +"Du må være tilsluttet til transporten for at kunne\n" +"tilføje en kontakt for denne protokol." + +#: ../data/glade/add_new_contact_window.glade.h:11 +msgid "_Group:" +msgstr "_Gruppe:" + +#: ../data/glade/add_new_contact_window.glade.h:12 +msgid "_Nickname:" +msgstr "_Kælenavn:" + +#: ../data/glade/add_new_contact_window.glade.h:13 +msgid "_Protocol:" +msgstr "_Protokol:" + +#: ../data/glade/add_new_contact_window.glade.h:14 +msgid "_Register" +msgstr "Kan _registreres" + +#: ../data/glade/add_new_contact_window.glade.h:15 +msgid "_User ID:" +msgstr "_Bruger ID:" + +#: ../data/glade/adhoc_commands_window.glade.h:1 +msgid "An error has occurred:" +msgstr "En fejl er opstået:" + +#: ../data/glade/adhoc_commands_window.glade.h:2 +msgid "Choose command to execute:" +msgstr "Vælg kommando som skal udføres:" + +#: ../data/glade/adhoc_commands_window.glade.h:3 +msgid "Ad-hoc Commands - Gajim" +msgstr "Ad-hoc Kommandoer - Gajim" + +#: ../data/glade/adhoc_commands_window.glade.h:4 +msgid "Check once more" +msgstr "Kontroller en gang til" + +#: ../data/glade/adhoc_commands_window.glade.h:5 +msgid "Error description..." +msgstr "Fejl beskrivelse..." + +#: ../data/glade/adhoc_commands_window.glade.h:6 +msgid "Please wait while retrieving command list..." +msgstr "Vent mens kommandolisten bliver modtaget..." + +#: ../data/glade/adhoc_commands_window.glade.h:7 +msgid "Please wait while the command is sending..." +msgstr "Vent mens kommandoen bliver sendt..." + +#: ../data/glade/adhoc_commands_window.glade.h:8 +msgid "Please wait..." +msgstr "Vent venligst..." + +#: ../data/glade/adhoc_commands_window.glade.h:9 +msgid "This jabber entity does not expose any commands." +msgstr "Denne jabber enhed eksponerer ikke nogen kommandoer." + +#: ../data/glade/advanced_configuration_window.glade.h:1 +#: ../data/glade/features_window.glade.h:1 +msgid "Description" +msgstr "Beskrivelse" + +#: ../data/glade/advanced_configuration_window.glade.h:2 +msgid "NOTE: You should restart Gajim for some settings to take effect" +msgstr "" +"NOTE: Du skal genstarte Gajim for at nogle af ændringerne kan træde i " +"kraft" + +#: ../data/glade/advanced_configuration_window.glade.h:3 +msgid "Advanced Configuration Editor" +msgstr "Avanceret Konfigurations Behandler" + +#: ../data/glade/advanced_configuration_window.glade.h:4 +msgid "Filter:" +msgstr "Filter:" + +#: ../data/glade/advanced_menuitem_menu.glade.h:1 +msgid "Delete MOTD" +msgstr "Slet MOTD" + +#: ../data/glade/advanced_menuitem_menu.glade.h:2 +msgid "Deletes Message of the Day" +msgstr "Slet Dagens Besked" + +#: ../data/glade/advanced_menuitem_menu.glade.h:3 +msgid "Edit _Privacy Lists..." +msgstr "Rediger _Privatlivs Liste..." + +#: ../data/glade/advanced_menuitem_menu.glade.h:4 +msgid "Sends a message to users currently connected to this server" +msgstr "Send en besked til brugere som er tilsluttet denne server" + +#: ../data/glade/advanced_menuitem_menu.glade.h:5 +msgid "Set MOTD..." +msgstr "Sæt MOTD..." + +#: ../data/glade/advanced_menuitem_menu.glade.h:6 +msgid "Sets Message of the Day" +msgstr "Sæt Dagens Besked" + +#: ../data/glade/advanced_menuitem_menu.glade.h:7 +msgid "Show _XML Console" +msgstr "Vis _XML Konsol" + +#: ../data/glade/advanced_menuitem_menu.glade.h:8 +msgid "Update MOTD..." +msgstr "Opdater MOTD..." + +#: ../data/glade/advanced_menuitem_menu.glade.h:9 +msgid "Updates Message of the Day" +msgstr "Opdater Dagens Besked" + +#: ../data/glade/advanced_menuitem_menu.glade.h:10 +msgid "_Administrator" +msgstr "_Administrator" + +#: ../data/glade/advanced_menuitem_menu.glade.h:11 +msgid "_Send Server Message..." +msgstr "_Send Server Besked..." + +#: ../data/glade/advanced_notifications_window.glade.h:1 +msgid " a window/tab opened with that contact " +msgstr "et vindue/faneblad åbnede med denne kontakt " + +#: ../data/glade/advanced_notifications_window.glade.h:2 +msgid "Actions" +msgstr "Handlinger" + +#: ../data/glade/advanced_notifications_window.glade.h:3 +msgid "Conditions" +msgstr "Betingelser" + +#: ../data/glade/advanced_notifications_window.glade.h:4 +#: ../data/glade/preferences_window.glade.h:12 +msgid "Sounds" +msgstr "Lyde" + +#: ../data/glade/advanced_notifications_window.glade.h:5 +msgid "Advanced Actions" +msgstr "Avancerede Handlinger" + +#: ../data/glade/advanced_notifications_window.glade.h:6 +msgid "Advanced Notifications Control" +msgstr "Avanceret Påmindelses Kontrol" + +#: ../data/glade/advanced_notifications_window.glade.h:7 +msgid "All statuses" +msgstr "Status For Alle" + +#: ../data/glade/advanced_notifications_window.glade.h:8 +#: ../src/common/commands.py:91 ../src/common/helpers.py:246 +msgid "Away" +msgstr "Borte" + +#: ../data/glade/advanced_notifications_window.glade.h:9 +msgid "Busy " +msgstr "Travlt " + +#: ../data/glade/advanced_notifications_window.glade.h:10 +msgid "Don't have " +msgstr "Har ikke" + +#: ../data/glade/advanced_notifications_window.glade.h:11 +msgid "Have " +msgstr "Har" + +#: ../data/glade/advanced_notifications_window.glade.h:12 +#: ../src/common/helpers.py:256 +msgid "Invisible" +msgstr "Usynlig" + +#: ../data/glade/advanced_notifications_window.glade.h:13 +msgid "Launch a command" +msgstr "Kør en kommando" + +#: ../data/glade/advanced_notifications_window.glade.h:14 +#: ../src/common/helpers.py:229 +msgid "Not Available" +msgstr "Ikke Tilgængelig" + +#: ../data/glade/advanced_notifications_window.glade.h:15 +msgid "One or more special statuses..." +msgstr "En eller flere specielle statuser..." + +#: ../data/glade/advanced_notifications_window.glade.h:16 +msgid "Online / Free For Chat" +msgstr "På net / Klar For Samtale" + +#: ../data/glade/advanced_notifications_window.glade.h:17 +msgid "Play a sound" +msgstr "Spil en lyd" + +#: ../data/glade/advanced_notifications_window.glade.h:18 +msgid "" +"Receive a Message\n" +"Contact Disconnected \n" +"Contact Change Status \n" +"Group Chat Message Highlight \n" +"Group Chat Message Received \n" +"File Transfer Request \n" +"File Transfer Started \n" +"File Transfer Finished" +msgstr "" +"Modtag en Besked\n" +"Kontakt Ikke Tilsluttet \n" +"Kontakt Ændrede Status \n" +"Gruppe Samtale Besked Fremhævelse \n" +"Gruppe Samtale Besked Modtaget \n" +"Fil Overførsel Forespørgsel \n" +"Fil Overførsel Er Startet \n" +"Fil Overførsel Er Sluttet" + +#: ../data/glade/advanced_notifications_window.glade.h:26 +msgid "When " +msgstr "Når " + +#: ../data/glade/advanced_notifications_window.glade.h:27 +msgid "" +"_Activate window manager's UrgencyHint to make chat window in taskbar flash" +msgstr "" +"_Aktiver vindueshåndteringens ViktigFif for at få samtale vinduet til at " +"blinke i opgavelinjen" + +#: ../data/glade/advanced_notifications_window.glade.h:28 +msgid "_Disable auto opening chat window" +msgstr "_Deaktivér automatisk åbning af samtale vindue" + +#: ../data/glade/advanced_notifications_window.glade.h:29 +msgid "_Disable existing popup window" +msgstr "_Deaktivér eksisterende pop op vinduer" + +#: ../data/glade/advanced_notifications_window.glade.h:30 +msgid "_Disable existing sound for this event" +msgstr "_Deaktivér nuværende lyd for denne hændelse" + +#: ../data/glade/advanced_notifications_window.glade.h:31 +msgid "_Disable showing event in roster" +msgstr "_Deaktivér visning af hændelse i kontaktvinduet" + +#: ../data/glade/advanced_notifications_window.glade.h:32 +msgid "_Disable showing event in systray" +msgstr "_Deaktivér visning af hændelse i systembakken" + +#: ../data/glade/advanced_notifications_window.glade.h:33 +msgid "_Inform me with a popup window" +msgstr "_Informer mig med et pop op vindue" + +#: ../data/glade/advanced_notifications_window.glade.h:34 +msgid "_Open chat window with user" +msgstr "_Åbn samtale vindue med bruger" + +#: ../data/glade/advanced_notifications_window.glade.h:35 +msgid "_Show event in roster" +msgstr "_Vis hændelse i kontaktvindue" + +#: ../data/glade/advanced_notifications_window.glade.h:36 +msgid "_Show event in systray" +msgstr "_Vis hændelse i systembakken" + +#: ../data/glade/advanced_notifications_window.glade.h:37 +msgid "and I " +msgstr "og jeg " + +#: ../data/glade/advanced_notifications_window.glade.h:38 +msgid "" +"contact(s)\n" +"group(s)\n" +"everybody" +msgstr "" +"kontakt(er)\n" +"gruppe(r)\n" +"alle" + +#: ../data/glade/advanced_notifications_window.glade.h:41 +msgid "for " +msgstr "for " + +#: ../data/glade/advanced_notifications_window.glade.h:42 +msgid "when I'm in" +msgstr "når jeg er i" + +#: ../data/glade/atom_entry_window.glade.h:1 +msgid "Entry:" +msgstr "Indgang:" + +#: ../data/glade/atom_entry_window.glade.h:2 +msgid "Feed name:" +msgstr "Feed navn:" + +#: ../data/glade/atom_entry_window.glade.h:3 +msgid "Last modified:" +msgstr "Sidst ændret:" + +#: ../data/glade/atom_entry_window.glade.h:4 +msgid "New entry received" +msgstr "Ny hændelse modtaget" + +#: ../data/glade/atom_entry_window.glade.h:5 +msgid "You have received new entry:" +msgstr "Du har modtaget en ny hændelse:" + +#: ../data/glade/blocked_contacts_window.glade.h:1 +msgid "Blocked Contacts" +msgstr "Blokerede Kontakter" + +#: ../data/glade/change_password_dialog.glade.h:1 +msgid "Change Password" +msgstr "Ændre Adgangskode" + +#: ../data/glade/change_password_dialog.glade.h:2 +msgid "Enter it again for confirmation:" +msgstr "Skriv adgangskoden igen for at bekræfte:" + +#: ../data/glade/change_password_dialog.glade.h:3 +msgid "Enter new password:" +msgstr "Skriv en ny adgangskode:" + +#: ../data/glade/change_status_message_dialog.glade.h:1 +msgid "Type your new status message" +msgstr "Skriv din nye status besked" + +#: ../data/glade/change_status_message_dialog.glade.h:2 +msgid "Preset messages:" +msgstr "Forvalgte beskeder:" + +#: ../data/glade/change_status_message_dialog.glade.h:3 +msgid "Save as Preset..." +msgstr "Gem som Forvalgt..." + +#: ../data/glade/chat_context_menu.glade.h:1 +msgid "Join _Group Chat" +msgstr "Bliv med i en _Gruppe Samtale" + +#: ../data/glade/chat_context_menu.glade.h:2 +#: ../data/glade/roster_contact_context_menu.glade.h:12 +msgid "_Add to Roster..." +msgstr "_Tilføj til Kontaktliste..." + +#: ../data/glade/chat_context_menu.glade.h:3 +msgid "_Copy JID/Email Address" +msgstr "_Kopier JID/E-post Adresse" + +#: ../data/glade/chat_context_menu.glade.h:4 +msgid "_Copy Link Location" +msgstr "_Kopier Henvisning" + +#: ../data/glade/chat_context_menu.glade.h:5 +msgid "_Open Email Composer" +msgstr "_Åbn E-post Program" + +#: ../data/glade/chat_context_menu.glade.h:6 +msgid "_Open Link in Browser" +msgstr "_Åbn Henvisning i Netlæser" + +#: ../data/glade/chat_context_menu.glade.h:7 +#: ../data/glade/subscription_request_popup_menu.glade.h:1 +#: ../data/glade/systray_context_menu.glade.h:7 +msgid "_Start Chat" +msgstr "_Start Samtale" + +#: ../data/glade/chat_control_popup_menu.glade.h:1 +msgid "Click to see past conversations with this contact" +msgstr "Klik for at se tidligere samtaler med denne kontakt" + +#: ../data/glade/chat_control_popup_menu.glade.h:2 +msgid "Invite _Friends" +msgstr "Inviter _Venner" + +#: ../data/glade/chat_control_popup_menu.glade.h:3 +#: ../data/glade/gc_occupants_menu.glade.h:3 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:4 +msgid "Send _File" +msgstr "Send _Fil" + +#: ../data/glade/chat_control_popup_menu.glade.h:4 +msgid "Toggle End to End Encryption" +msgstr "Slå til/fra ende til ende Kryptering" + +#: ../data/glade/chat_control_popup_menu.glade.h:5 +msgid "Toggle Open_PGP Encryption" +msgstr "Slå til/fra Open_PGP Kryptering" + +#: ../data/glade/chat_control_popup_menu.glade.h:6 +#: ../data/glade/gc_occupants_menu.glade.h:4 +msgid "_Add to Roster" +msgstr "_Tilføj til Kontaktliste" + +#: ../data/glade/chat_control_popup_menu.glade.h:7 +#: ../data/glade/gc_control_popup_menu.glade.h:7 +#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:6 +#: ../src/roster_window.py:2566 +msgid "_History" +msgstr "_Historie" + +#: ../data/glade/chat_to_muc_window.glade.h:1 +msgid "In_vite" +msgstr "In_viter" + +#: ../data/glade/chat_to_muc_window.glade.h:2 +msgid "Invite Friends !" +msgstr "Inviter Venner !" + +#: ../data/glade/chat_to_muc_window.glade.h:3 +msgid "MUC server" +msgstr "MUC server" + +#: ../data/glade/chat_to_muc_window.glade.h:4 +msgid "Please select a MUC server." +msgstr "Vælg en MUC server." + +#: ../data/glade/chat_to_muc_window.glade.h:5 +msgid "" +"You are going to begin a Multi-User Chat.\n" +"Select the contacts you want to invite" +msgstr "" +"Du er ved at begynde en Multibruger samtale.\n" +"Vælg de kontakter du vil invitere" + +#: ../data/glade/data_form_window.glade.h:1 +msgid "Fill in the form." +msgstr "Udfyld formen." + +#: ../data/glade/data_form_window.glade.h:2 +msgid "Room Configuration" +msgstr "Rum Konfigurering" + +#: ../data/glade/edit_groups_dialog.glade.h:1 +msgid "Edit Groups" +msgstr "Rediger Grupper" + +#: ../data/glade/features_window.glade.h:2 +msgid "List of possible features in Gajim:" +msgstr "Liste over mulige egenskaber i Gajim: " + +#: ../data/glade/features_window.glade.h:3 +msgid "Features" +msgstr "Egenskaber" + +#: ../data/glade/filetransfers.glade.h:1 +msgid "A list of active, completed and stopped file transfers" +msgstr "En liste over aktive, færdige og stoppede filoverførsler" + +#: ../data/glade/filetransfers.glade.h:2 +msgid "Cancel file transfer" +msgstr "Annuller filoverførsel" + +#: ../data/glade/filetransfers.glade.h:3 +msgid "Cancels the selected file transfer" +msgstr "Annullerer den valgte filoverførsel" + +#: ../data/glade/filetransfers.glade.h:4 +msgid "Cancels the selected file transfer and removes incomplete file" +msgstr "Annullerer den valgte filoverførsel og fjerner den ikke fuldførte fil" + +#: ../data/glade/filetransfers.glade.h:5 +msgid "Clean _up" +msgstr "Ryd _op" + +#: ../data/glade/filetransfers.glade.h:6 +msgid "File Transfers" +msgstr "Filoverførsler" + +#: ../data/glade/filetransfers.glade.h:7 +msgid "Hides the window" +msgstr "Skjuler vinduet" + +#: ../data/glade/filetransfers.glade.h:8 +msgid "Remove file transfer from the list." +msgstr "Fjern filoverførsler fra listen." + +#: ../data/glade/filetransfers.glade.h:9 +msgid "Removes completed, cancelled and failed file transfers from the list" +msgstr "Fjerner færdige, annullerede og mislykkede filoverførsler fra listen" + +#: ../data/glade/filetransfers.glade.h:10 +msgid "Shows a list of file transfers between you and others" +msgstr "Viser en liste over filoverførsler mellem dig og andre" + +#: ../data/glade/filetransfers.glade.h:11 +msgid "" +"This action removes single file transfer from the list. If the transfer is " +"active, it is first stopped and then removed" +msgstr "" +"Denne handling fjerner en enkelt filoverførsel fra listen. Hvis overførslen " +"er i gang, bliver den først stoppet og derefter fjernet" + +#: ../data/glade/filetransfers.glade.h:12 +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:774 +msgid "_Continue" +msgstr "_Fortsæt" + +#: ../data/glade/filetransfers.glade.h:14 +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:186 +msgid "_Open Containing Folder" +msgstr "_Åbn folderen med filen" + +#: ../data/glade/filetransfers.glade.h:16 +msgid "_Pause" +msgstr "_Pause" + +#: ../data/glade/filetransfers.glade.h:17 +msgid "file transfers list" +msgstr "filoverførsel liste" + +#: ../data/glade/gajim_themes_window.glade.h:1 +msgid "Chatstate Tab Colors" +msgstr "Samtalestatus Fane Farver" + +#: ../data/glade/gajim_themes_window.glade.h:2 +msgid "" +"Account row\n" +"Group row\n" +"Contact row\n" +"Chat Banner" +msgstr "" +"Konto række\n" +"Gruppe række\n" +"Kontakt række\n" +"Samtale Banner" + +#: ../data/glade/gajim_themes_window.glade.h:6 +msgid "Bold" +msgstr "Fed" + +#: ../data/glade/gajim_themes_window.glade.h:7 +msgid "Composing" +msgstr "Komponere" + +#: ../data/glade/gajim_themes_window.glade.h:8 +msgid "Font style:" +msgstr "Font stil:" + +#: ../data/glade/gajim_themes_window.glade.h:9 +msgid "Gajim Themes Customization" +msgstr "Gajim Tema Tilpasning" + +#: ../data/glade/gajim_themes_window.glade.h:10 +msgid "Gone" +msgstr "Borte" + +#: ../data/glade/gajim_themes_window.glade.h:11 +msgid "Inactive" +msgstr "Ikke aktiv" + +#: ../data/glade/gajim_themes_window.glade.h:12 +msgid "Italic" +msgstr "Kursiv" + +#: ../data/glade/gajim_themes_window.glade.h:13 +msgid "" +"MUC\n" +"Messages" +msgstr "" +"MUC\n" +"Beskeder" + +#: ../data/glade/gajim_themes_window.glade.h:15 +msgid "" +"MUC Directed\n" +"Messages" +msgstr "" +"MUC Sendte\n" +"Meldinger" + +#: ../data/glade/gajim_themes_window.glade.h:17 +msgid "Paused" +msgstr "Sat på pause" + +#: ../data/glade/gajim_themes_window.glade.h:18 +msgid "Text _color:" +msgstr "Tekst _farve:" + +#: ../data/glade/gajim_themes_window.glade.h:19 +msgid "Text _font:" +msgstr "Tekst _font:" + +#: ../data/glade/gajim_themes_window.glade.h:20 +msgid "_Background:" +msgstr "_Baggrund:" + +#: ../data/glade/gc_control_popup_menu.glade.h:1 +msgid "Change _Nickname..." +msgstr "Ændre _Kælenavn..." + +#: ../data/glade/gc_control_popup_menu.glade.h:2 +msgid "Change _Subject..." +msgstr "Ændre _Emne..." + +#: ../data/glade/gc_control_popup_menu.glade.h:3 +msgid "Click to see past conversation in this room" +msgstr "Klik for at se tidligere samtaler i dette rum" + +#: ../data/glade/gc_control_popup_menu.glade.h:4 +msgid "Configure _Room..." +msgstr "Tilpas _Rum..." + +#: ../data/glade/gc_control_popup_menu.glade.h:5 +msgid "_Bookmark" +msgstr "_Bogmærke" + +#: ../data/glade/gc_control_popup_menu.glade.h:6 +msgid "_Destroy Room" +msgstr "_Slet rum" + +#: ../data/glade/gc_control_popup_menu.glade.h:8 +msgid "_Manage Room" +msgstr "Håndter Ru_m" + +#: ../data/glade/gc_control_popup_menu.glade.h:9 +msgid "_Minimize on close" +msgstr "_Minimer ved lukning" + +#: ../data/glade/gc_occupants_menu.glade.h:1 +msgid "Mo_derator" +msgstr "Or_dstyrer" + +#: ../data/glade/gc_occupants_menu.glade.h:2 +msgid "Occupant Actions" +msgstr "Beboer Handlinger" + +#: ../data/glade/gc_occupants_menu.glade.h:5 +msgid "_Admin" +msgstr "_Administrator" + +#: ../data/glade/gc_occupants_menu.glade.h:6 +msgid "_Ban" +msgstr "_Udvis" + +#: ../data/glade/gc_occupants_menu.glade.h:8 +msgid "_Kick" +msgstr "_Kast ud" + +#: ../data/glade/gc_occupants_menu.glade.h:9 +msgid "_Member" +msgstr "_Medlem" + +#: ../data/glade/gc_occupants_menu.glade.h:10 +msgid "_Owner" +msgstr "_Ejer" + +#: ../data/glade/gc_occupants_menu.glade.h:11 +msgid "_Send Private Message" +msgstr "_Send en Privat Besked" + +#: ../data/glade/gc_occupants_menu.glade.h:12 +msgid "_Voice" +msgstr "_Stemme" + +#: ../data/glade/groups_post_window.glade.h:1 +msgid "Create new post" +msgstr "Lav en ny post" + +#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:271 +msgid "From" +msgstr "Fra" + +#. holds subject +#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:142 +#: ../src/history_manager.py:173 +msgid "Subject" +msgstr "Emne" + +#: ../data/glade/history_manager.glade.h:1 +msgid "" +"Welcome to Gajim History Logs Manager\n" +"\n" +"You can select logs from the left and/or search database from below.\n" +"\n" +"WARNING:\n" +"If you plan to do massive deletions, please make sure Gajim is not running. " +"Generally avoid deletions with contacts you currently chat with." +msgstr "" +"Velkommen til Gajim Historie Log Håndterer\n" +"\n" +"Du kan vælge logger til venstre og/eller søge i databasen under.\n" +"\n" +"ADVARSEL:\n" +"Hvis du planlægger at gøre massive sletninger, vær sikker på at Gajim ikke " +"kører. \n" +"Generelt undgå at slette logger fra kontakter du samtidig snakker med." + +#: ../data/glade/history_manager.glade.h:7 +msgid "Delete" +msgstr "Slet" + +#: ../data/glade/history_manager.glade.h:8 +msgid "Export" +msgstr "Eksporter" + +#: ../data/glade/history_manager.glade.h:9 +msgid "Gajim History Logs Manager" +msgstr "Gajim Loghistorie Håndterer" + +#: ../data/glade/history_manager.glade.h:10 +msgid "_Search Database" +msgstr "_Søge Database" + +#: ../data/glade/history_window.glade.h:1 +msgid "Build custom query" +msgstr "Byg tilpasset forespørgsel" + +#: ../data/glade/history_window.glade.h:2 +msgid "Conversation History" +msgstr "Samtale Historie" + +#: ../data/glade/history_window.glade.h:3 +msgid "Query Builder..." +msgstr "Forespørgsel Bygger..." + +#: ../data/glade/history_window.glade.h:4 +#: ../data/glade/search_window.glade.h:2 +msgid "Search" +msgstr "Søg" + +#: ../data/glade/history_window.glade.h:5 +#: ../data/glade/zeroconf_information_window.glade.h:10 +msgid "_Log conversation history" +msgstr "_Log samtale historie" + +#: ../data/glade/history_window.glade.h:6 +#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1172 +msgid "_Search" +msgstr "_Søg" + +#: ../data/glade/invitation_received_dialog.glade.h:1 +msgid "Accept" +msgstr "Godkend" + +#: ../data/glade/invitation_received_dialog.glade.h:2 +#: ../data/glade/privacy_list_window.glade.h:8 +msgid "Deny" +msgstr "Nægt" + +#: ../data/glade/invitation_received_dialog.glade.h:3 +msgid "Invitation Received" +msgstr "Invitation Modtaget" + +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1265 +msgid "Join Group Chat" +msgstr "Bliv med i en Gruppe Samtale" + +#: ../data/glade/join_groupchat_window.glade.h:2 +msgid "Join this room automatically when I connect" +msgstr "Bliv med i dette rum automatisk når jeg tilsutter" + +#: ../data/glade/join_groupchat_window.glade.h:3 +#: ../data/glade/manage_bookmarks_window.glade.h:5 +#: ../data/glade/profile_window.glade.h:24 +#: ../data/glade/vcard_information_window.glade.h:31 +msgid "Nickname:" +msgstr "Kælenavn:" + +#: ../data/glade/join_groupchat_window.glade.h:4 +#: ../data/glade/manage_bookmarks_window.glade.h:6 +msgid "Password:" +msgstr "Adgangskode:" + +#: ../data/glade/join_groupchat_window.glade.h:5 +msgid "Recently:" +msgstr "For nylig:" + +#: ../data/glade/join_groupchat_window.glade.h:6 +#: ../data/glade/manage_bookmarks_window.glade.h:8 +msgid "Room:" +msgstr "Rum:" + +#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1160 +#: ../src/disco.py:1615 +msgid "_Join" +msgstr "_Bliv med:" + +#: ../data/glade/manage_accounts_window.glade.h:1 +msgid "Manage Accounts" +msgstr "Håndter Kontoer" + +#: ../data/glade/manage_bookmarks_window.glade.h:1 +msgid "Auto join" +msgstr "Bliv automatisk med" + +#: ../data/glade/manage_bookmarks_window.glade.h:2 +msgid "If checked, Gajim will join this group chat on startup" +msgstr "Hvis valgt vil Gajim deltage i denne gruppe samtale ved start" + +#: ../data/glade/manage_bookmarks_window.glade.h:3 +msgid "Manage Bookmarks" +msgstr "Håndter Bogmærker" + +#: ../data/glade/manage_bookmarks_window.glade.h:4 +msgid "Minimize on Auto Join" +msgstr "Minimer ved Automatisk Deltagelse" + +#: ../data/glade/manage_bookmarks_window.glade.h:7 +msgid "Print status:" +msgstr "Skriv status:" + +#: ../data/glade/manage_bookmarks_window.glade.h:9 +msgid "Server:" +msgstr "Server:" + +#: ../data/glade/manage_bookmarks_window.glade.h:10 +msgid "Title:" +msgstr "Titel:" + +#: ../data/glade/manage_proxies_window.glade.h:1 +msgid "Properties" +msgstr "Egenskaber" + +#: ../data/glade/manage_proxies_window.glade.h:2 +msgid "Settings" +msgstr "Opsætning" + +#: ../data/glade/manage_proxies_window.glade.h:3 +msgid "" +"HTTP Connect\n" +"SOCKS5" +msgstr "" +"HTTP Tilslutning\n" +"SOCKS5" + +#: ../data/glade/manage_proxies_window.glade.h:5 +msgid "Manage Proxy Profiles" +msgstr "Håndter Proxy Profiler" + +#: ../data/glade/manage_proxies_window.glade.h:6 +#: ../data/glade/profile_window.glade.h:23 +#: ../data/glade/vcard_information_window.glade.h:30 +msgid "Name:" +msgstr "Navn:" + +#: ../data/glade/manage_proxies_window.glade.h:7 +msgid "Pass_word:" +msgstr "Adgangs_kode" + +#: ../data/glade/manage_proxies_window.glade.h:8 +msgid "Type:" +msgstr "Type:" + +#: ../data/glade/manage_proxies_window.glade.h:9 +msgid "Use authentication" +msgstr "Brug Godkendelse" + +#: ../data/glade/manage_proxies_window.glade.h:10 +msgid "_Host:" +msgstr "_Værtsmaskine:" + +#: ../data/glade/message_window.glade.h:1 +msgid "Click to insert an emoticon (Alt+M)" +msgstr "Klik for at indsætte et følelsesikon (Alt+M)" + +#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1212 +msgid "OpenPGP Encryption" +msgstr "OpenPGP Kryptering" + +#. 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:4 +#: ../data/glade/roster_window.glade.h:12 +#: ../data/glade/subscription_request_window.glade.h:6 +msgid "_Actions" +msgstr "_Handlinger" + +#. 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:6 +#: ../data/glade/xml_console_window.glade.h:11 +#: ../src/filetransfers_window.py:243 +msgid "_Send" +msgstr "_Send" + +#: ../data/glade/passphrase_dialog.glade.h:1 +msgid "Passphrase" +msgstr "PGP-løsen" + +#: ../data/glade/preferences_window.glade.h:1 +msgid "Advanced Configuration Editor" +msgstr "Avanceret Konfigurations Behandler" + +#: ../data/glade/preferences_window.glade.h:2 +msgid "Applications" +msgstr "Programmer" + +#: ../data/glade/preferences_window.glade.h:3 +msgid "Chat Appearance" +msgstr "Samtale udseende" + +#. a header for custom browser/client/file manager. so translate sth like: Custom Settings +#: ../data/glade/preferences_window.glade.h:5 +msgid "Custom" +msgstr "Tilpasset Opsætning" + +#: ../data/glade/preferences_window.glade.h:6 +msgid "Format of a line" +msgstr "Format for en linje" + +#: ../data/glade/preferences_window.glade.h:7 +msgid "GMail Options" +msgstr "GMail Indstillinger" + +#: ../data/glade/preferences_window.glade.h:9 +msgid "Preset Status Messages" +msgstr "Nuværende Status Beskeder" + +#: ../data/glade/preferences_window.glade.h:10 +msgid "Privacy" +msgstr "Privatliv" + +#: ../data/glade/preferences_window.glade.h:11 +msgid "Roster Appearance" +msgstr "Kontaktvinduets Udseende" + +#: ../data/glade/preferences_window.glade.h:13 +msgid "Themes" +msgstr "Temaer" + +#: ../data/glade/preferences_window.glade.h:14 +msgid "Visual Notifications" +msgstr "Synlige Påmindelser" + +#: ../data/glade/preferences_window.glade.h:15 +msgid "Advanced" +msgstr "Avanceret" + +#: ../data/glade/preferences_window.glade.h:16 +msgid "" +"All chat states\n" +"Composing only\n" +"Disabled" +msgstr "" +"Alle samtale tilstander\n" +"Kun skrivning\n" +"Ikke aktiveret" + +#: ../data/glade/preferences_window.glade.h:19 +msgid "Allow _OS information to be sent" +msgstr "Tillad _OS information at blive sendt" + +#: ../data/glade/preferences_window.glade.h:20 +msgid "Allow popup/notifications when I'm _away/na/busy/invisible" +msgstr "" +"Tillad pop op påmindelser når jeg er _borte/ikke tilgængelig/travel/usynlig" + +#: ../data/glade/preferences_window.glade.h:21 +msgid "Always check to see if Gajim is the _default Jabber client on startup" +msgstr "Altid kontroller om Gajim er standard Jabber klient ved start" + +#: ../data/glade/preferences_window.glade.h:22 +msgid "" +"An example: If you have enabled status message for away, Gajim won't ask you " +"anymore for a status message when you change your status to away; it will " +"use the default one set here" +msgstr "" +"Et eksempel: Hvis du har aktiveret status beskeder for borte status, vil " +"Gajim ikke spørge dig mere for en status besked når du ændrer din status til " +"borte; Gajim vil bruge standard beskeden sat her" + +#: ../data/glade/preferences_window.glade.h:23 +msgid "Ask status message when I:" +msgstr "Spørg om status besked når jeg:" + +#: ../data/glade/preferences_window.glade.h:24 +msgid "Auto _away after:" +msgstr "_Automatisk borte efter:" + +#: ../data/glade/preferences_window.glade.h:25 +msgid "Auto _not available after:" +msgstr "Automatisk _ikke tilgængelig efter:" + +#: ../data/glade/preferences_window.glade.h:26 +msgid "" +"Autodetect on every Gajim startup\n" +"Always use GNOME default applications\n" +"Always use KDE default applications\n" +"Always use XFCE4 default applications\n" +"Custom" +msgstr "" +"Automatisk genkend hvergang Gajim starter\n" +"Altid brug GNOME standard programmer\n" +"Altid brug KDE standard programmer\n" +"Altid brug XFCE4 standard programmer\n" +"Tilpasset" + +#: ../data/glade/preferences_window.glade.h:31 +msgid "" +"Check this option, only if someone you don't have in the roster spams/annoys " +"you. Use with caution, because it blocks all messages from any contact that " +"is not in the roster" +msgstr "" +"Kun tjek denne valgmulighed hvis nogen du ikke har i kontaktvinduet spammer/" +"generer\n" +"dig. Bruges varsomt, fordi den blokerer alle beskeder fra kontakter som \n" +"ikke er i kontaktvinduet" + +#: ../data/glade/preferences_window.glade.h:32 +msgid "Configure color and font of the interface" +msgstr "Konfigurér farve og skrifttyper for brugergrænsefladen" + +#: ../data/glade/preferences_window.glade.h:33 +msgid "Default Status Messages" +msgstr "Standard Status Beskeder" + +#: ../data/glade/preferences_window.glade.h:34 +msgid "" +"Determined by sender\n" +"Chat message\n" +"Single message" +msgstr "" +"Bestemt af senderen\n" +"Samtale besked\n" +"Enkel besked" + +#: ../data/glade/preferences_window.glade.h:37 +msgid "Display _extra email details" +msgstr "Vis _ekstra e-post detaljer" + +#: ../data/glade/preferences_window.glade.h:38 +msgid "Display a_vatars of contacts in roster" +msgstr "Vis a_vatarer for kontakter i kontaktvinduet" + +#: ../data/glade/preferences_window.glade.h:39 +msgid "Display status _messages of contacts in roster" +msgstr "Vis status _beskeder for kontakter i kontaktvinduet" + +#: ../data/glade/preferences_window.glade.h:40 +msgid "Emoticons:" +msgstr "Følelsesikoner:" + +#: ../data/glade/preferences_window.glade.h:41 +msgid "Events" +msgstr "Hændelser" + +#: ../data/glade/preferences_window.glade.h:42 +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 " +"display in chat windows." +msgstr "Gajim kan sende og modtage meta-information relateret til en samtale du har med en kontakt. Her kan du specificere hvilke typer samtalestatus du vil vise i samtalevinduerne." + +#: ../data/glade/preferences_window.glade.h:43 +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 " +"send to the other party." +msgstr "Gajim kan sende og modtage meta-information relateret til en samtale du har med en kontakt. Her kan du specificere hvilke typer samtalestatus du vil sende til modparten." + +#: ../data/glade/preferences_window.glade.h:44 +msgid "" +"Gajim will notify you via a popup window in the bottom right of the screen " +"about contacts that just signed out" +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:46 +msgid "Hides buttons in chatwindows to " +msgstr "Skjuler knapperne i gruppesamtale vinduer til " + +#: ../data/glade/preferences_window.glade.h:47 +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:48 +msgid "" +"If checked, Gajim will display avatars of contacts in roster window and in " +"group chats" +msgstr "" +"Hvis valgt vil Gajim vise avatarer af kontakter i kontaktvinduet og i gruppe " +"samtaler" + +#: ../data/glade/preferences_window.glade.h:49 +msgid "" +"If checked, Gajim will display status messages of contacts under the contact " +"name in roster window and in group chats" +msgstr "Hvis valgt vil Gajim vise status beskeder af kontakter under kontaktnavnet i kontaktvinduet og i gruppe samtaler" + +#: ../data/glade/preferences_window.glade.h:50 +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, " +"etc...)" +msgstr "Hvis valgt vil Gajim bruge protokol specifikke status ikoner. (F.eks. En kontakt fra MSN vil have det tilsvarende msn ikon for status tilsluttet, borte, Travlt, etc...)" + +#: ../data/glade/preferences_window.glade.h:51 +msgid "" +"If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " +"animated or static graphical emoticons" +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:52 +msgid "Ignore rich content in incoming messages" +msgstr "Ignorer rigt indhold i indkommende beskeder" + +#: ../data/glade/preferences_window.glade.h:53 +msgid "Ma_nage..." +msgstr "Hå_ndtere..." + +#: ../data/glade/preferences_window.glade.h:54 +msgid "" +"Never\n" +"Always\n" +"Per account\n" +"Per type" +msgstr "" +"Aldrig\n" +"Altid\n" +"Per konto\n" +"Per type" + +#: ../data/glade/preferences_window.glade.h:58 +msgid "Notify me about contacts that sign _in" +msgstr "Påmind mig om kontakter logger _ind" + +#: ../data/glade/preferences_window.glade.h:59 +msgid "Notify me about contacts that sign _out" +msgstr "Påmind mig om kontakter som logger u_d" + +#: ../data/glade/preferences_window.glade.h:60 +msgid "Notify on new _GMail email" +msgstr "Påmind mig ved ny _GMail e-post" + +#: ../data/glade/preferences_window.glade.h:61 +msgid "Play _sounds" +msgstr "Afspil _lyde" + +#: ../data/glade/preferences_window.glade.h:62 +msgid "" +"Pop it up\n" +"Notify me about it\n" +"Show only in roster" +msgstr "" +"Pop det op\n" +"Påmind mig om det\n" +"Hvis kun i kontaktvinduet" + +#: ../data/glade/preferences_window.glade.h:65 +msgid "Preferences" +msgstr "Indstillinger" + +#: ../data/glade/preferences_window.glade.h:66 +msgid "Privacy" +msgstr "Privatliv" + +#: ../data/glade/preferences_window.glade.h:67 +msgid "Set status message to reflect currently playing _music track" +msgstr "" +"Sæt status besked til at vise det musik nu_mmer du spiller på det pågældende " +"tidspunkt" + +#: ../data/glade/preferences_window.glade.h:68 +msgid "Sign _in" +msgstr "Logge _ind" + +#: ../data/glade/preferences_window.glade.h:69 +msgid "Sign _out" +msgstr "Log _af" + +#: ../data/glade/preferences_window.glade.h:70 +msgid "" +"Some messages may include rich content (formatting, colors etc). If checked, " +"Gajim will just display the raw message text." +msgstr "" +"Nogle beskeder kan indeholde rigt indhold (formatering, farver osv.). Hvis valgt\n" +"vil Gajim kun vise den rå tekst." + +#: ../data/glade/preferences_window.glade.h:71 +msgid "Status" +msgstr "Status" + +#: ../data/glade/preferences_window.glade.h:72 +msgid "Status _iconset:" +msgstr "Status _ikonsæt:" + +#: ../data/glade/preferences_window.glade.h:73 +msgid "T_heme:" +msgstr "T_ema:" + +#: ../data/glade/preferences_window.glade.h:74 +msgid "The auto away status message" +msgstr "Den automatiske status besked for borte" + +#: ../data/glade/preferences_window.glade.h:75 +msgid "The auto not available status message" +msgstr "Den automatiske besked for ikke tilgængelig" + +#: ../data/glade/preferences_window.glade.h:76 +msgid "Treat all incoming messages as:" +msgstr "Behandl alle indkomne beskeder som:" + +#: ../data/glade/preferences_window.glade.h:77 +msgid "Use _transports iconsets" +msgstr "Brug _transporternes ikonsæt" + +#: ../data/glade/preferences_window.glade.h:78 +msgid "Use only one message _window:" +msgstr "Brug kun et samtale _vindue:" + +#: ../data/glade/preferences_window.glade.h:79 +msgid "Use system _default" +msgstr "Brug system stan_dard" + +#: ../data/glade/preferences_window.glade.h:80 +msgid "When new event is received:" +msgstr "Når en ny hændelse er modtaget:" + +#: ../data/glade/preferences_window.glade.h:81 +msgid "" +"Works for Rhythmbox and Muine players. For more players, please visit http://" +"trac.gajim.org/wiki/GajimAndMusicPlayer" +msgstr "" +"Virker for afspiller som Rhythmbox og Muine. For andre afspiller besøg " +"http://trac.gajim.org/wiki/GajimAndMusicPlayer" + +#: ../data/glade/preferences_window.glade.h:82 +msgid "_Advanced Notifications Control..." +msgstr "Avanceret Påmindelses Kontrol..." + +#: ../data/glade/preferences_window.glade.h:83 +msgid "_Browser:" +msgstr "_Netlæser:" + +#: ../data/glade/preferences_window.glade.h:84 +msgid "_Display chat state notifications:" +msgstr "Vis samtalestatus påmin_delser:" + +#: ../data/glade/preferences_window.glade.h:85 +msgid "_File manager:" +msgstr "_Filhåndterer:" + +#: ../data/glade/preferences_window.glade.h:86 +msgid "_Font:" +msgstr "_Font:" + +#: ../data/glade/preferences_window.glade.h:87 +msgid "_Highlight misspelled words" +msgstr "Frem_hæv stavefejl" + +#: ../data/glade/preferences_window.glade.h:88 +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:89 +msgid "_Incoming message:" +msgstr "_Indkommende besked:" + +#: ../data/glade/preferences_window.glade.h:90 +msgid "_Log status changes of contacts" +msgstr "_Log status ændringer hos kontakter" + +#: ../data/glade/preferences_window.glade.h:91 +msgid "_Mail client:" +msgstr "_E-post klient:" + +#: ../data/glade/preferences_window.glade.h:92 +msgid "_Make message windows compact" +msgstr "Gør sa_mtalevinduer kompakte" + +#: ../data/glade/preferences_window.glade.h:93 +msgid "_Open..." +msgstr "_Åbn..." + +#: ../data/glade/preferences_window.glade.h:94 +msgid "_Outgoing message:" +msgstr "_Udgående besked:" + +#: ../data/glade/preferences_window.glade.h:95 +msgid "_Player:" +msgstr "Afs_piller:" + +#: ../data/glade/preferences_window.glade.h:96 +msgid "_Reset to Default Colors" +msgstr "_Nulstil til Standard Farver" + +#: ../data/glade/preferences_window.glade.h:97 +msgid "_Send chat state notifications:" +msgstr "_Send samtalestatus påmindelser:" + +#: ../data/glade/preferences_window.glade.h:98 +msgid "_Sort contacts by status" +msgstr "_Sorter kontakter efter status" + +#: ../data/glade/preferences_window.glade.h:99 +msgid "_Status message:" +msgstr "_Status besked:" + +#: ../data/glade/preferences_window.glade.h:100 +msgid "_URL:" +msgstr "_URL:" + +#: ../data/glade/preferences_window.glade.h:101 +msgid "minutes" +msgstr "minutter" + +#: ../data/glade/privacy_lists_window.glade.h:1 +msgid "Privacy Lists:" +msgstr "Privatlivs Lister:" + +#: ../data/glade/privacy_list_window.glade.h:1 +msgid "Add / Edit a rule" +msgstr "Tilføj / Ændre en regel" + +#: ../data/glade/privacy_list_window.glade.h:2 +msgid "List of rules" +msgstr "Liste af regler" + +#: ../data/glade/privacy_list_window.glade.h:3 +msgid "Privacy List" +msgstr "Privatlivs Liste" + +#: ../data/glade/privacy_list_window.glade.h:4 +msgid "Active for this session" +msgstr "Aktiv i denne session" + +#: ../data/glade/privacy_list_window.glade.h:5 +msgid "Active on each startup" +msgstr "Aktiv efter hver start" + +#: ../data/glade/privacy_list_window.glade.h:6 +msgid "All" +msgstr "Alle" + +#: ../data/glade/privacy_list_window.glade.h:7 +msgid "Allow" +msgstr "Tillad" + +#: ../data/glade/privacy_list_window.glade.h:9 +msgid "JabberID" +msgstr "Jabber ID" + +#: ../data/glade/privacy_list_window.glade.h:10 +msgid "Order:" +msgstr "Bestil:" + +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2104 +msgid "Privacy List" +msgstr "Privatlivs Liste" + +#: ../data/glade/privacy_list_window.glade.h:12 +msgid "all by subscription" +msgstr "Alle efter abonnering" + +#: ../data/glade/privacy_list_window.glade.h:13 +msgid "all in the group" +msgstr "Alle i gruppen" + +#: ../data/glade/privacy_list_window.glade.h:14 +msgid "" +"none\n" +"both\n" +"from\n" +"to" +msgstr "" +"ingen\n" +"begge\n" +"fra\n" +"til" + +#: ../data/glade/privacy_list_window.glade.h:18 +msgid "to send me messages" +msgstr "at sende mig beskeder" + +#: ../data/glade/privacy_list_window.glade.h:19 +msgid "to send me queries" +msgstr "at sende mig forespørgsler" + +#: ../data/glade/privacy_list_window.glade.h:20 +msgid "to send me status" +msgstr "at sende mig status" + +#: ../data/glade/privacy_list_window.glade.h:21 +msgid "to view my status" +msgstr "at se min status" + +#. "About" is the text of a tab of vcard window +#: ../data/glade/profile_window.glade.h:2 +#: ../data/glade/vcard_information_window.glade.h:2 +msgid "About" +msgstr "Om" + +#: ../data/glade/profile_window.glade.h:3 +#: ../data/glade/vcard_information_window.glade.h:3 +msgid "Address" +msgstr "Adress" + +#: ../data/glade/profile_window.glade.h:4 +msgid "Avatar:" +msgstr "Avatar:" + +#: ../data/glade/profile_window.glade.h:5 +#: ../data/glade/vcard_information_window.glade.h:6 +msgid "Birthday:" +msgstr "Fødselsdag:" + +#: ../data/glade/profile_window.glade.h:6 +#: ../data/glade/vcard_information_window.glade.h:7 +msgid "City:" +msgstr "By:" + +#: ../data/glade/profile_window.glade.h:7 +msgid "Click to set your avatar" +msgstr "Tryk for at se din avatar" + +#: ../data/glade/profile_window.glade.h:8 +#: ../data/glade/vcard_information_window.glade.h:10 +msgid "Company:" +msgstr "Firma:" + +#: ../data/glade/profile_window.glade.h:9 +#: ../data/glade/vcard_information_window.glade.h:14 +msgid "Country:" +msgstr "Land:" + +#: ../data/glade/profile_window.glade.h:10 +#: ../data/glade/vcard_information_window.glade.h:15 +msgid "Department:" +msgstr "Afdeling:" + +#: ../data/glade/profile_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:17 +msgid "Extra Address:" +msgstr "Ekstra Adresse:" + +#. Family Name +#: ../data/glade/profile_window.glade.h:14 +#: ../data/glade/vcard_information_window.glade.h:19 +msgid "Family:" +msgstr "Efternavn:" + +#. Do NOT change sequence. Just translate YYYY and MM and DD (from Year, Month, Day accordingly) +#: ../data/glade/profile_window.glade.h:16 +#: ../data/glade/vcard_information_window.glade.h:21 +msgid "Format: YYYY-MM-DD" +msgstr "Format: YYYY-MM-DD" + +#: ../data/glade/profile_window.glade.h:17 +#: ../data/glade/vcard_information_window.glade.h:22 +msgid "Full Name" +msgstr "Fuldt Navn" + +#. Given Name +#: ../data/glade/profile_window.glade.h:19 +#: ../data/glade/vcard_information_window.glade.h:24 +msgid "Given:" +msgstr "Fornavn:" + +#: ../data/glade/profile_window.glade.h:20 +#: ../data/glade/vcard_information_window.glade.h:25 +msgid "Homepage:" +msgstr "Hjemmeside:" + +#. Middle Name +#: ../data/glade/profile_window.glade.h:22 +#: ../data/glade/vcard_information_window.glade.h:28 +msgid "Middle:" +msgstr "Mellemnavn:" + +#: ../data/glade/profile_window.glade.h:25 +#: ../data/glade/vcard_information_window.glade.h:34 +msgid "Personal Info" +msgstr "Personlig Information" + +#: ../data/glade/profile_window.glade.h:27 +#: ../data/glade/vcard_information_window.glade.h:35 +msgid "Phone No.:" +msgstr "Telefonnr.:" + +#: ../data/glade/profile_window.glade.h:28 +#: ../data/glade/vcard_information_window.glade.h:36 +msgid "Position:" +msgstr "Placering:" + +#: ../data/glade/profile_window.glade.h:29 +#: ../data/glade/vcard_information_window.glade.h:37 +msgid "Postal Code:" +msgstr "Postnummer:" + +#. Prefix in Name +#: ../data/glade/profile_window.glade.h:31 +#: ../data/glade/vcard_information_window.glade.h:39 +msgid "Prefix:" +msgstr "Titel:" + +#: ../data/glade/profile_window.glade.h:32 +#: ../data/glade/vcard_information_window.glade.h:41 ../src/vcard.py:302 +msgid "Role:" +msgstr "Rolle:" + +#: ../data/glade/profile_window.glade.h:33 +#: ../data/glade/vcard_information_window.glade.h:42 +msgid "State:" +msgstr "Amt:" + +#: ../data/glade/profile_window.glade.h:34 +#: ../data/glade/vcard_information_window.glade.h:44 +msgid "Street:" +msgstr "Gade:" + +#. Suffix in Name +#: ../data/glade/profile_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:48 +msgid "Suffix:" +msgstr "Endelse:" + +#: ../data/glade/profile_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:50 +msgid "Work" +msgstr "Arbejde" + +#: ../data/glade/remove_account_window.glade.h:1 +msgid "What do you want to do?" +msgstr "Hvad vil du gøre?" + +#: ../data/glade/remove_account_window.glade.h:2 +msgid "Remove account _only from Gajim" +msgstr "Fjern kun k_ontoen fra Gajim" + +#: ../data/glade/remove_account_window.glade.h:3 +msgid "Remove account from Gajim and from _server" +msgstr "Fjern konto fra Gajim og fra _serveren" + +#. Remove +#. Remove group +#. Remove +#: ../data/glade/remove_account_window.glade.h:4 +#: ../data/glade/roster_contact_context_menu.glade.h:18 +#: ../src/roster_window.py:2523 ../src/roster_window.py:2733 +#: ../src/roster_window.py:2869 +msgid "_Remove" +msgstr "_Kan fjernes" + +#: ../data/glade/roster_contact_context_menu.glade.h:1 +msgid "A_sk to see his/her status" +msgstr "_Spørg om at kunne se hans/hendes status" + +#: ../data/glade/roster_contact_context_menu.glade.h:2 +msgid "Add Special _Notification..." +msgstr "Tilføj Speciel Påmi_ndelse..." + +#: ../data/glade/roster_contact_context_menu.glade.h:3 +msgid "Assign Open_PGP Key..." +msgstr "Tilskriv Open_PGP Nøgle..." + +#: ../data/glade/roster_contact_context_menu.glade.h:4 +msgid "Edit _Groups..." +msgstr "Ændre _Grupper..." + +#. Execute Command +#: ../data/glade/roster_contact_context_menu.glade.h:5 +#: ../src/roster_window.py:2826 +msgid "Execute Command..." +msgstr "Kør Kommando..." + +#. Invite to Groupchat +#: ../data/glade/roster_contact_context_menu.glade.h:6 +#: ../src/roster_window.py:2439 +msgid "In_vite to" +msgstr "In_viter til" + +#. Send Custom Status +#: ../data/glade/roster_contact_context_menu.glade.h:7 +#: ../src/roster_window.py:2663 ../src/roster_window.py:2797 +msgid "Send Cus_tom Status" +msgstr "Send _Tilpasset Status" + +#: ../data/glade/roster_contact_context_menu.glade.h:8 +msgid "Send Single _Message..." +msgstr "Send en Enkel _Besked" + +#: ../data/glade/roster_contact_context_menu.glade.h:9 +msgid "Send _File..." +msgstr "Send _Fil..." + +#: ../data/glade/roster_contact_context_menu.glade.h:10 +msgid "Set Custom _Avatar..." +msgstr "Angiv Personlig _Avatar..." + +#: ../data/glade/roster_contact_context_menu.glade.h:11 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:5 +msgid "Start _Chat" +msgstr "Start _samtale" + +#: ../data/glade/roster_contact_context_menu.glade.h:13 +msgid "_Allow him/her to see my status" +msgstr "Till_ad ham/hende at se min status" + +#: ../data/glade/roster_contact_context_menu.glade.h:14 +#: ../src/roster_window.py:2513 ../src/roster_window.py:2724 +msgid "_Block" +msgstr "_Bloker" + +#: ../data/glade/roster_contact_context_menu.glade.h:15 +msgid "_Forbid him/her to see my status" +msgstr "_Nægt ham/hende at se min status" + +#: ../data/glade/roster_contact_context_menu.glade.h:17 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:7 +msgid "_Manage Contact" +msgstr "_Håndter Kontakt" + +#: ../data/glade/roster_contact_context_menu.glade.h:19 +msgid "_Rename..." +msgstr "_Omdøb..." + +#: ../data/glade/roster_contact_context_menu.glade.h:20 +msgid "_Subscription" +msgstr "_Abonnement" + +#: ../data/glade/roster_contact_context_menu.glade.h:21 +#: ../src/roster_window.py:2507 ../src/roster_window.py:2718 +msgid "_Unblock" +msgstr "_Fjern blokering" + +#: ../data/glade/roster_window.glade.h:1 +msgid "A_ccounts" +msgstr "_Kontoer" + +#: ../data/glade/roster_window.glade.h:2 +msgid "Add _Contact..." +msgstr "_Tilføj Kontakt..." + +#: ../data/glade/roster_window.glade.h:3 +msgid "Fea_tures" +msgstr "_Egenskaber" + +#: ../data/glade/roster_window.glade.h:4 +msgid "File _Transfers" +msgstr "Filover_førsler" + +#: ../data/glade/roster_window.glade.h:5 +msgid "Frequently Asked Questions (online)" +msgstr "Ofte Stillede Spørgsmål (på net)" + +#: ../data/glade/roster_window.glade.h:7 +msgid "Help online" +msgstr "Hjælp på net" + +#: ../data/glade/roster_window.glade.h:9 +msgid "Profile, A_vatar" +msgstr "Profil, A_vatar" + +#: ../data/glade/roster_window.glade.h:10 +msgid "Show Trans_ports" +msgstr "Vis Trans_porter" + +#: ../data/glade/roster_window.glade.h:11 +msgid "Show _Offline Contacts" +msgstr "Vis _Afkoblede Kontakter" + +#: ../data/glade/roster_window.glade.h:14 +msgid "_Contents" +msgstr "_Indhold" + +#: ../data/glade/roster_window.glade.h:16 ../src/disco.py:1348 +msgid "_Edit" +msgstr "R_ediger" + +#: ../data/glade/roster_window.glade.h:17 +msgid "_FAQ" +msgstr "_OSS" + +#: ../data/glade/roster_window.glade.h:18 +msgid "_Help" +msgstr "_Hjælp" + +#: ../data/glade/roster_window.glade.h:19 +msgid "_Preferences" +msgstr "_Indstillinger" + +#: ../data/glade/roster_window.glade.h:20 +msgid "_Quit" +msgstr "_Afslut" + +#: ../data/glade/roster_window.glade.h:21 +msgid "_Send Single Message..." +msgstr "Send en Enkel _Besked..." + +#: ../data/glade/roster_window.glade.h:23 +msgid "_View" +msgstr "_Vis" + +#: ../data/glade/search_window.glade.h:1 +msgid "Please wait while retrieving search form..." +msgstr "Vent mens en søge form hentes..." + +#: ../data/glade/search_window.glade.h:3 +msgid "_Add contact" +msgstr "Tilføj Kont_akt" + +#. Information +#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:2881 +msgid "_Information" +msgstr "_Information" + +#: ../data/glade/service_discovery_window.glade.h:1 +msgid "G_o" +msgstr "N_aviger" + +#: ../data/glade/service_discovery_window.glade.h:2 +msgid "_Address:" +msgstr "_Adresse:" + +#: ../data/glade/service_registration_window.glade.h:1 +msgid "Register to" +msgstr "Registrer til" + +#: ../data/glade/service_registration_window.glade.h:2 +msgid "_Cancel" +msgstr "_Afbryd" + +#: ../data/glade/service_registration_window.glade.h:3 +msgid "_OK" +msgstr "_OK" + +#: ../data/glade/single_message_window.glade.h:1 +msgid "0" +msgstr "0" + +#: ../data/glade/single_message_window.glade.h:2 +msgid "From:" +msgstr "Fra:" + +#: ../data/glade/single_message_window.glade.h:3 +msgid "Reply to this message" +msgstr "Send et svar til denne besked" + +#: ../data/glade/single_message_window.glade.h:4 +msgid "Sen_d" +msgstr "Sen_d" + +#: ../data/glade/single_message_window.glade.h:5 +msgid "Send message" +msgstr "Send besked" + +#: ../data/glade/single_message_window.glade.h:6 +msgid "Send message and close window" +msgstr "Send besked og luk vinduet" + +#: ../data/glade/single_message_window.glade.h:7 +msgid "Subject:" +msgstr "Emne:" + +#: ../data/glade/single_message_window.glade.h:8 +msgid "To:" +msgstr "Til:" + +#: ../data/glade/single_message_window.glade.h:9 +msgid "_Reply" +msgstr "Sva_r" + +#: ../data/glade/single_message_window.glade.h:10 +msgid "_Send & Close" +msgstr "_Send & Luk" + +#: ../data/glade/subscription_request_window.glade.h:1 +msgid "Au_thorize" +msgstr "Au_torisere" + +#: ../data/glade/subscription_request_window.glade.h:2 +msgid "Authorize contact so he or she can know when you're connected" +msgstr "" +"Autoriser kontakt så han eller hun kan opnå information om at du er " +"tilsluttet" + +#: ../data/glade/subscription_request_window.glade.h:3 +msgid "" +"Deny authorization from contact so he or she cannot know when you're " +"connected" +msgstr "" +"Nægt autorisation fra kontakter så han eller hun ikke kan opnå information " +"om at du er tilsluttet" + +#: ../data/glade/subscription_request_window.glade.h:4 +msgid "Subscription Request" +msgstr "Abonnement Forespørgsel" + +#: ../data/glade/subscription_request_window.glade.h:7 +msgid "_Deny" +msgstr "_Nægt" + +#: ../data/glade/synchronise_select_account_dialog.glade.h:1 +msgid "Select the account with which you want to synchronise" +msgstr "Vælg den konto som du vil synkronisere med" + +#: ../data/glade/synchronise_select_contacts_dialog.glade.h:1 +msgid "Select the contacts you want to synchronise" +msgstr "Vælg de kontakter som du vil synkronisere" + +#: ../data/glade/synchronise_select_contacts_dialog.glade.h:2 +msgid "Synchronise : select contacts" +msgstr "Synkronisering : vælg kontakter" + +#: ../data/glade/systray_context_menu.glade.h:1 +msgid "Mute Sounds" +msgstr "Slå lyden af" + +#: ../data/glade/systray_context_menu.glade.h:2 +msgid "Send Single _Message" +msgstr "Send en Enkel _Besked" + +#: ../data/glade/systray_context_menu.glade.h:3 +msgid "Show All Pending _Events" +msgstr "Vis Alle Ventende Hænd_elser" + +#: ../data/glade/systray_context_menu.glade.h:4 +msgid "Show _Roster" +msgstr "Vis _Kontaktvindue" + +#: ../data/glade/systray_context_menu.glade.h:5 +msgid "Sta_tus" +msgstr "Sta_tus" + +#: ../data/glade/systray_context_menu.glade.h:6 +msgid "_Group Chat" +msgstr "_Gruppe Chat" + +#. Given Name +#: ../data/glade/vcard_information_window.glade.h:5 +msgid "Ask:" +msgstr "Spørg:" + +#: ../data/glade/vcard_information_window.glade.h:8 +msgid "Client:" +msgstr "Klient:" + +#: ../data/glade/vcard_information_window.glade.h:9 +msgid "Comments" +msgstr "Kommentarer" + +#: ../data/glade/vcard_information_window.glade.h:11 +msgid "Configured avatar:" +msgstr "Konfigureret avatar:" + +#: ../data/glade/vcard_information_window.glade.h:12 +#: ../data/glade/zeroconf_information_window.glade.h:1 +msgid "Contact" +msgstr "Kontakt" + +#: ../data/glade/vcard_information_window.glade.h:13 +msgid "Contact Information" +msgstr "Kontakt Information" + +#: ../data/glade/vcard_information_window.glade.h:29 +msgid "More" +msgstr "Mere" + +#: ../data/glade/vcard_information_window.glade.h:33 +msgid "OS:" +msgstr "OS:" + +#: ../data/glade/vcard_information_window.glade.h:40 +#: ../data/glade/zeroconf_information_window.glade.h:8 +msgid "Resource:" +msgstr "Resource:" + +#: ../data/glade/vcard_information_window.glade.h:43 +#: ../data/glade/zeroconf_information_window.glade.h:9 +msgid "Status:" +msgstr "Status:" + +#. Family Name +#: ../data/glade/vcard_information_window.glade.h:46 +msgid "Subscription:" +msgstr "Abonnement:" + +#: ../data/glade/vcard_information_window.glade.h:49 +msgid "User avatar:" +msgstr "Bruger avatar:" + +#: ../data/glade/xml_console_window.glade.h:1 +msgid "Jabber Traffic" +msgstr "Jabber Trafik" + +#: ../data/glade/xml_console_window.glade.h:2 +msgid "XML Input" +msgstr "XML Inddata" + +#. Info/Query make the "IQ" initials. So translate like this 'YourLang/YourLang (Info/Query)'. Thanks (it's a tooltip so width is not a problem) +#: ../data/glade/xml_console_window.glade.h:6 +msgid "Info/Query" +msgstr "Information/Forespørgsel (Info/Query)" + +#. Info/Query: all(?) jabber xml start with , sends action to the current group chat. Use third " +"person. (e.g. /%s explodes.)" +msgstr "" +"Brug: /%s , sender handling til den nuværende gruppe samtale. Brug " +"tredie person. (f.eks. /%s eksploderer.)" + +#: ../src/chat_control.py:1285 +#, python-format +msgid "Usage: /%s, sends a ping to the contact" +msgstr "Brug: %s, sender en ping til kontakten" + +#: ../src/chat_control.py:1288 +#, python-format +msgid "Usage: /%s, send the message to the contact" +msgstr "Brug: /%s, send beskeden til kontakten" + +#: ../src/chat_control.py:1291 ../src/groupchat_control.py:1476 +#, python-format +msgid "No help info for /%s" +msgstr "Ingen hjælp for /%s" + +#: ../src/chat_control.py:1429 ../src/chat_control.py:1455 +msgid "Encryption enabled" +msgstr "Kryptering aktiveret" + +#: ../src/chat_control.py:1434 +msgid "Session WILL be logged" +msgstr "Session VIL blive logget" + +#: ../src/chat_control.py:1436 +msgid "Session WILL NOT be logged" +msgstr "Session VIL IKKE blive logget" + +#: ../src/chat_control.py:1443 +msgid "The following message was NOT encrypted" +msgstr "Den følgende besked var IKKE krypteret" + +#: ../src/chat_control.py:1447 ../src/chat_control.py:1460 +#: ../src/chat_control.py:2089 +msgid "Encryption disabled" +msgstr "Kryptering ikke aktiveret" + +#. add_to_roster_menuitem +#: ../src/chat_control.py:1617 ../src/conversation_textview.py:562 +#: ../src/dialogs.py:674 ../src/gajim.py:894 ../src/gajim.py:895 +#: ../src/gajim.py:1364 ../src/roster_window.py:345 +#: ../src/roster_window.py:429 ../src/roster_window.py:1790 +#: ../src/roster_window.py:1800 ../src/roster_window.py:2038 +#: ../src/roster_window.py:2276 ../src/roster_window.py:3124 +#: ../src/roster_window.py:3331 ../src/roster_window.py:4691 +#: ../src/roster_window.py:4693 ../src/common/contacts.py:84 +#: ../src/common/helpers.py:44 ../src/common/helpers.py:258 +msgid "Not in Roster" +msgstr "Ikke i Kontaktvinduet" + +#. %s is being replaced in the code with JID +#: ../src/chat_control.py:1761 +#, python-format +msgid "You just received a new message from \"%s\"" +msgstr "Du har netop modtaget en besked fra \"%s\"" + +#: ../src/chat_control.py:1762 +msgid "" +"If you close this tab and you have history disabled, this message will be " +"lost." +msgstr "" +"Hvis du lukker dette faneblad og ikke har aktiveret historie loggen, vil du\n" +"miste denne besked." + +#: ../src/config.py:122 ../src/config.py:544 +msgid "Disabled" +msgstr "Ikke aktiveret" + +#: ../src/config.py:288 +msgid "Active" +msgstr "Aktiv" + +#: ../src/config.py:296 +msgid "Event" +msgstr "Hændelse" + +#: ../src/config.py:617 ../src/dialogs.py:958 +#, python-format +msgid "Dictionary for lang %s not available" +msgstr "Ordbog for sproget %s er ikke tilgængelig" + +#: ../src/config.py:618 +#, python-format +msgid "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option." +msgstr "" +"For at bruge stavekontrollen må du installer en %s ordbog, eller vælge et " +"andet sprog ved indstillingen for sprog til stavekontrollen." + +#: ../src/config.py:969 +msgid "status message title" +msgstr "status besked Titel" + +#: ../src/config.py:969 +msgid "status message text" +msgstr "status besked tekst" + +#: ../src/config.py:1005 +msgid "First Message Received" +msgstr "Første Besked er Modtaget" + +#: ../src/config.py:1006 +msgid "Next Message Received" +msgstr "Næste Besked er Modtaget" + +#: ../src/config.py:1007 +msgid "Contact Connected" +msgstr "Kontakt er Tilsluttet" + +#: ../src/config.py:1008 +msgid "Contact Disconnected" +msgstr "Kontakt er ikke Tilsluttet" + +#: ../src/config.py:1009 +msgid "Message Sent" +msgstr "Besked er Sendt" + +#: ../src/config.py:1010 +msgid "Group Chat Message Highlight" +msgstr "Gruppe Samtale Besked Fremhævning" + +#: ../src/config.py:1011 +msgid "Group Chat Message Received" +msgstr "Gruppe Samtale Besked Modtaget" + +#: ../src/config.py:1018 +msgid "GMail Email Received" +msgstr "GMail E-post Modtaget" + +#. Name column +#: ../src/config.py:1287 ../src/dialogs.py:1397 ../src/dialogs.py:1461 +#: ../src/disco.py:736 ../src/disco.py:1559 ../src/disco.py:1805 +#: ../src/history_window.py:78 +msgid "Name" +msgstr "Navn" + +#: ../src/config.py:1395 ../src/common/config.py:375 +msgid "Be right back." +msgstr "Er straks tilbage." + +#: ../src/config.py:1399 +msgid "Relogin now?" +msgstr "Log ind igen nu?" + +#: ../src/config.py:1400 +msgid "If you want all the changes to apply instantly, you must relogin." +msgstr "" +"Hvis du vil at alle ændringerne skal træde i kraft nu, må du logge ind igen." + +#: ../src/config.py:1495 ../src/config.py:1594 +msgid "OpenPGP is not usable in this computer" +msgstr "Det er ikke muligt at bruge OpenPGP på denne computer" + +#: ../src/config.py:1630 ../src/config.py:1674 +msgid "Unread events" +msgstr "Ulæste hændelser" + +#: ../src/config.py:1631 +msgid "Read all pending events before removing this account." +msgstr "Læs alle ventende hændelser før denne konto fjernes." + +#: ../src/config.py:1660 +#, python-format +msgid "You have opened chat in account %s" +msgstr "Du har en åben samtale med kontonavnet %s" + +#: ../src/config.py:1661 +msgid "All chat and groupchat windows will be closed. Do you want to continue?" +msgstr "" +"Alle samtale og gruppesamtale vinduer vil blive lukket. Vil du fortsætte?" + +#: ../src/config.py:1670 +msgid "You are currently connected to the server" +msgstr "Du er for øjeblikket tilsluttet til serveren" + +#: ../src/config.py:1671 +msgid "To change the account name, you must be disconnected." +msgstr "For at ændre kontonavnet må du afbryde din tilslutning" + +#: ../src/config.py:1675 +msgid "To change the account name, you must read all pending events." +msgstr "For at ændre kontonavnet må du læse alle ventende hændelser." + +#: ../src/config.py:1681 +msgid "Account Name Already Used" +msgstr "Kontonavnet er allerede i brug" + +#: ../src/config.py:1682 +msgid "" +"This name is already used by another of your accounts. Please choose another " +"name." +msgstr "" +"Dette navn er allerede brugt til en af dine andre kontoer. Vælg venligst et " +"andet navn." + +#: ../src/config.py:1686 ../src/config.py:1690 +msgid "Invalid account name" +msgstr "Ugyldigt kontonavn" + +#: ../src/config.py:1687 +msgid "Account name cannot be empty." +msgstr "Kontonavnet kan ikke være tomt." + +#: ../src/config.py:1691 +msgid "Account name cannot contain spaces." +msgstr "Kontonavnet kan ikke indeholde mellemrom." + +#: ../src/config.py:1755 +msgid "Rename Account" +msgstr "Omdøb Konto" + +#: ../src/config.py:1756 +#, python-format +msgid "Enter a new name for account %s" +msgstr "Indtast et nyt navn for kontoen %s" + +#: ../src/config.py:1774 ../src/config.py:1782 ../src/config.py:1822 +#: ../src/config.py:3048 +msgid "Invalid Jabber ID" +msgstr "Ugyldigt Jabber ID" + +#: ../src/config.py:1783 +msgid "A Jabber ID must be in the form \"user@servername\"." +msgstr "Et Jabber ID må være på formen \"bruger@servernavn\"." + +#: ../src/config.py:1968 ../src/config.py:3119 +msgid "Invalid entry" +msgstr "Ugyldig indgang" + +#: ../src/config.py:1969 ../src/config.py:3120 +msgid "Custom port must be a port number." +msgstr "Personlig port må være et port nummer." + +#: ../src/config.py:1990 +msgid "Failed to get secret keys" +msgstr "Forsøg på at hente krypteringsnøgler mislykkedes" + +#: ../src/config.py:1991 +msgid "There was a problem retrieving your OpenPGP secret keys." +msgstr "Der opstod et problem under forsøget på at hente dine OpenPGP nøgler." + +#: ../src/config.py:1994 +msgid "OpenPGP Key Selection" +msgstr "OpenPGP Nøgle Valg" + +#: ../src/config.py:1995 +msgid "Choose your OpenPGP key" +msgstr "Vælg din OpenPGP Nøgle" + +#: ../src/config.py:2052 +msgid "No such account available" +msgstr "Ingen konto ved det navn er tilgængelig" + +#: ../src/config.py:2053 +msgid "You must create your account before editing your personal information." +msgstr "Du må oprette en konto før du kan redigere din personlige information." + +#: ../src/config.py:2060 ../src/dialogs.py:1244 ../src/dialogs.py:1385 +#: ../src/dialogs.py:1565 ../src/disco.py:420 ../src/profile_window.py:325 +msgid "You are not connected to the server" +msgstr "Du er ikke tilsluttet til serveren" + +#: ../src/config.py:2061 +msgid "Without a connection, you can not edit your personal information." +msgstr "Uden en tilslutning kan du ikke redigere din personlige information." + +#: ../src/config.py:2065 +msgid "Your server doesn't support Vcard" +msgstr "Din server understøtter ikke Vcard" + +#: ../src/config.py:2066 +msgid "Your server can't save your personal information." +msgstr "Din server kan ikke gemme din personlige information." + +#: ../src/config.py:2097 +msgid "Account Local already exists." +msgstr "Den Lokale Konto eksisterer allerede." + +#: ../src/config.py:2098 +msgid "Please rename or remove it before enabling link-local messaging." +msgstr "Omdøb eller fjern den før du aktiverer link-local beskeder." + +#: ../src/config.py:2274 +#, python-format +msgid "Edit %s" +msgstr "Rediger %s" + +#: ../src/config.py:2276 +#, python-format +msgid "Register to %s" +msgstr "Registrer til %s" + +#. list at the beginning +#: ../src/config.py:2312 +msgid "Ban List" +msgstr "Liste over bandlyste" + +#: ../src/config.py:2313 +msgid "Member List" +msgstr "Medlems Liste" + +#: ../src/config.py:2314 +msgid "Owner List" +msgstr "Ejer Liste" + +#: ../src/config.py:2315 +msgid "Administrator List" +msgstr "Administrator Liste" + +#. Address column +#. holds JID (who said this) +#: ../src/config.py:2364 ../src/disco.py:743 ../src/history_manager.py:155 +msgid "JID" +msgstr "JID" + +#: ../src/config.py:2372 +msgid "Reason" +msgstr "Grund" + +#: ../src/config.py:2377 +msgid "Nick" +msgstr "Kælenavne" + +#: ../src/config.py:2381 +msgid "Role" +msgstr "Rolle" + +#: ../src/config.py:2406 +msgid "Banning..." +msgstr "Bandlysning..." + +#. You can move '\n' before user@domain if that line is TOO BIG +#: ../src/config.py:2408 +msgid "" +"Whom do you want to ban?\n" +"\n" +msgstr "" +"Hvem vil du bandlyse?\n" +"\n" + +#: ../src/config.py:2410 +msgid "Adding Member..." +msgstr "Tilføj Medlem..." + +#: ../src/config.py:2411 +msgid "" +"Whom do you want to make a member?\n" +"\n" +msgstr "" +"Hvem vil du gøre til medlem?\n" +"\n" + +#: ../src/config.py:2413 +msgid "Adding Owner..." +msgstr "Tilføj Ejer..." + +#: ../src/config.py:2414 +msgid "" +"Whom do you want to make an owner?\n" +"\n" +msgstr "" +"Hvem vil du gøre til ejer?\n" +"\n" + +#: ../src/config.py:2416 +msgid "Adding Administrator..." +msgstr "Tilføj Administrator..." + +#: ../src/config.py:2417 +msgid "" +"Whom do you want to make an administrator?\n" +"\n" +msgstr "" +"Hvem vil du gøre til administrator?\n" +"\n" + +#: ../src/config.py:2418 +msgid "" +"Can be one of the following:\n" +"1. user@domain/resource (only that resource matches).\n" +"2. user@domain (any resource matches).\n" +"3. domain/resource (only that resource matches).\n" +"4. domain (the domain itself matches, as does any user@domain,\n" +"domain/resource, or address containing a subdomain." +msgstr "" +"Kan være en af de følgende:\n" +"1. bruger@domæne/resource (kun denne resource træffer).\n" +"2. bruger@domæne (en hvilket som helst resource træffer).\n" +"3. domæne/resource (kun denne resource træffer).\n" +"4. domæne (domænet træffer, ligeledes et hvilken som helst bruger@domæne,\n" +"domæne/resource, eller adresse indeholdende et subdomæne." + +#: ../src/config.py:2522 +#, python-format +msgid "Removing %s account" +msgstr "Fjerne kontoen med navnet %s" + +#: ../src/config.py:2539 ../src/gajim.py:1307 ../src/roster_window.py:3390 +msgid "Password Required" +msgstr "Adgangskode er Påkrævet" + +#: ../src/config.py:2540 ../src/roster_window.py:3386 +#, python-format +msgid "Enter your password for account %s" +msgstr "Skriv din adgangskode for kontoen %s" + +#: ../src/config.py:2541 ../src/roster_window.py:3391 +msgid "Save password" +msgstr "Gem adgangskode" + +#: ../src/config.py:2555 +#, python-format +msgid "Account \"%s\" is connected to the server" +msgstr "Kontoen \"%s\" er tilsluttet til serveren" + +#: ../src/config.py:2556 +msgid "If you remove it, the connection will be lost." +msgstr "Hvis du fjerne den vil tilslutningen tabes." + +#: ../src/config.py:2649 +msgid "Default" +msgstr "Standard" + +#: ../src/config.py:2649 +msgid "?print_status:All" +msgstr "?print_status:Alle" + +#: ../src/config.py:2650 +msgid "Enter and leave only" +msgstr "Gå kun ind og ud" + +#: ../src/config.py:2651 +msgid "?print_status:None" +msgstr "?print_status:Ingen" + +#: ../src/config.py:2720 +msgid "New Group Chat" +msgstr "Ny Gruppe Samtale" + +#: ../src/config.py:2753 +msgid "This bookmark has invalid data" +msgstr "Dette bogmærke er ugyldigt" + +#: ../src/config.py:2754 +msgid "" +"Please be sure to fill out server and room fields or remove this bookmark." +msgstr "" +"Fyld ud server og rum tekstindtastningsfelterne eller fjern dette bogmærke." + +#: ../src/config.py:3031 +msgid "Invalid username" +msgstr "Ugyldigt brugernavn" + +#: ../src/config.py:3033 +msgid "You must provide a username to configure this account." +msgstr "Du må give et brugernavn for at konfigurere denne konto." + +#: ../src/config.py:3059 +msgid "Duplicate Jabber ID" +msgstr "Jabber ID eksisterer" + +#: ../src/config.py:3060 +msgid "This account is already configured in Gajim." +msgstr "Denne konto er allerede konfigureret i Gajim." + +#: ../src/config.py:3077 +msgid "Account has been added successfully" +msgstr "Kontoen er blevet tilføjet med succes" + +#: ../src/config.py:3078 ../src/config.py:3223 +msgid "" +"You can set advanced account options by pressing the Advanced button, or " +"later by choosing the Accounts menuitem under the Edit menu from the main " +"window." +msgstr "Du kan sætte avancerede konto indstillinger ved at trykke Avanceret knappen, eller senere ved at vælge kontoens menupunkt under Rediger menuen fra hovedvinduet." + +#: ../src/config.py:3095 +msgid "Invalid server" +msgstr "Ugyldigt server" + +#: ../src/config.py:3096 +msgid "Please provide a server on which you want to register." +msgstr "Anfør en server som du vil registrere dig ved." + +#: ../src/config.py:3202 ../src/config.py:3241 +msgid "An error occurred during account creation" +msgstr "Under oprettelsen af kontoen opstod der en fejl" + +#: ../src/config.py:3222 +msgid "Your new account has been created successfully" +msgstr "Din nye konto er blevet oprettet med succes" + +#: ../src/config.py:3327 +msgid "Account name is in use" +msgstr "Kontonavnet er i brug" + +#: ../src/config.py:3328 +msgid "You already have an account using this name." +msgstr "Du har allered en konto med dette navn." + +#: ../src/conversation_textview.py:337 +msgid "" +"Text below this line is what has been said since the last time you paid " +"attention to this group chat" +msgstr "Teksten under denne linje er hvad der er blevet sagt siden sidste gang du var opmærksom på denne gruppe samtale" + +#: ../src/conversation_textview.py:409 +#, python-format +msgid "_Actions for \"%s\"" +msgstr "_Handlinger for \"%s\"" + +#: ../src/conversation_textview.py:421 +msgid "Read _Wikipedia Article" +msgstr "Læs _Wikipedia Artikel" + +#: ../src/conversation_textview.py:426 +msgid "Look it up in _Dictionary" +msgstr "Slå dette op i Or_dbogen" + +#. we must have %s in the url if not WIKTIONARY +#: ../src/conversation_textview.py:442 +#, python-format +msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" +msgstr "Ordbogens URL mangler en \"%s\" og det må ikke være WIKTIONARY" + +#. we must have %s in the url +#: ../src/conversation_textview.py:455 +#, python-format +msgid "Web Search URL is missing an \"%s\"" +msgstr "Web søge URL'en mangler en \"%s\"" + +#: ../src/conversation_textview.py:458 +msgid "Web _Search for it" +msgstr "Søg på nettet efter det" + +#: ../src/conversation_textview.py:464 +msgid "Open as _Link" +msgstr "Åbn som et _Link" + +#: ../src/conversation_textview.py:929 +msgid "Yesterday" +msgstr "I går" + +#. the number is >= 2 +#. %i is day in year (1-365), %d (1-31) we want %i +#: ../src/conversation_textview.py:933 +#, python-format +msgid "%i days ago" +msgstr "%i dage siden" + +#. if we have subject, show it too! +#: ../src/conversation_textview.py:967 +#, python-format +msgid "Subject: %s\n" +msgstr "Emne: %s\n" + +#: ../src/dialogs.py:64 +#, python-format +msgid "Contact name: %s" +msgstr "Kontakt navn: %s" + +#: ../src/dialogs.py:66 +#, python-format +msgid "Jabber ID: %s" +msgstr "Jabber ID: %s" + +#: ../src/dialogs.py:216 +msgid "Group" +msgstr "Gruppe" + +#: ../src/dialogs.py:223 +msgid "In the group" +msgstr "I gruppen" + +#: ../src/dialogs.py:274 +msgid "KeyID" +msgstr "Nøgle ID" + +#: ../src/dialogs.py:277 +msgid "Contact name" +msgstr "Kontakt navn" + +#: ../src/dialogs.py:323 +#, python-format +msgid "%s Status Message" +msgstr "%s Status Besked" + +#: ../src/dialogs.py:325 +msgid "Status Message" +msgstr "Status Besked" + +#: ../src/dialogs.py:425 +msgid "Save as Preset Status Message" +msgstr "Gem som Forvalgt Status Besked" + +#: ../src/dialogs.py:426 +msgid "Please type a name for this status message" +msgstr "Skriv et navn for denne status besked" + +#: ../src/dialogs.py:437 +msgid "Overwrite Status Message?" +msgstr "Overskriv Status Besked?" + +#: ../src/dialogs.py:438 +msgid "" +"This name is already used. Do you want to overwrite this status message?" +msgstr "Dette navn er allerede i brug. Vil du overskrive denne status besked?" + +#: ../src/dialogs.py:454 +msgid "AIM Address:" +msgstr "AIM Adresse:" + +#: ../src/dialogs.py:455 +msgid "GG Number:" +msgstr "GG Nummer:" + +#: ../src/dialogs.py:456 +msgid "ICQ Number:" +msgstr "ICQ Nummer:" + +#: ../src/dialogs.py:457 +msgid "MSN Address:" +msgstr "MSN Adresse:" + +#: ../src/dialogs.py:458 +msgid "Yahoo! Address:" +msgstr "Yahoo! Adresse:" + +#: ../src/dialogs.py:495 +#, python-format +msgid "Please fill in the data of the contact you want to add in account %s" +msgstr "Fyld ind data for den kontakt som du vil tilføje kontoen med navnet %s" + +#: ../src/dialogs.py:497 +msgid "Please fill in the data of the contact you want to add" +msgstr "Fyld ind data for den kontakt som du vil tilføje" + +#: ../src/dialogs.py:654 ../src/dialogs.py:660 +msgid "Invalid User ID" +msgstr "Ugyldig Bruger ID" + +#: ../src/dialogs.py:661 +msgid "The user ID must not contain a resource." +msgstr "Bruger ID'en må ikke indeholde en resource." + +#: ../src/dialogs.py:675 +msgid "Contact already in roster" +msgstr "Kontakten er allerede i kontaktvinduet" + +#: ../src/dialogs.py:676 +msgid "This contact is already listed in your roster." +msgstr "Denne kontakt er allered i dit kontaktvindue" + +#: ../src/dialogs.py:712 +msgid "User ID:" +msgstr "Bruger ID:" + +#: ../src/dialogs.py:774 +msgid "A GTK+ jabber client" +msgstr "En GTK+ jabber klient" + +#: ../src/dialogs.py:775 +msgid "GTK+ Version:" +msgstr "GTK+ Version:" + +#: ../src/dialogs.py:776 +msgid "PyGTK Version:" +msgstr "PyGTK Version:" + +#: ../src/dialogs.py:790 +msgid "Current Developers:" +msgstr "Nuværende Programudviklere:" + +#: ../src/dialogs.py:792 +msgid "Past Developers:" +msgstr "Tidligere Programudviklerer:" + +#: ../src/dialogs.py:802 +msgid "THANKS:" +msgstr "TAK:" + +#. remove one english sentence +#. and add it manually as translatable +#: ../src/dialogs.py:808 +msgid "Last but not least, we would like to thank all the package maintainers." +msgstr "Sidst men ikke mindst, vil vi gerne takke alle pakke vedligeholdere." + +#. here you write your name in the form Name FamilyName +#: ../src/dialogs.py:821 +msgid "translator-credits" +msgstr "Niels Felsted Thorsen " + +#: ../src/dialogs.py:951 +#, python-format +msgid "Unable to bind to port %s." +msgstr "Ikke i stand til at tildele port %s." + +#: ../src/dialogs.py:952 +msgid "" +"Maybe you have another running instance of Gajim. File Transfer will be " +"cancelled." +msgstr "" +"Måske har du en anden instans af Gajim kørende. Filoverførsler vil blive " +"annulleret." + +#: ../src/dialogs.py:959 +#, python-format +msgid "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option.\n" +"\n" +"Highlighting misspelled words feature will not be used" +msgstr "" +"Du må installere en %s ordbog for at bruge stavekontrol, eller vælge et " +"andet sprog med stavekontrol sprog indstillingen.\n" +"\n" +"Egenskaben med at fremhæve stavefejl vil ikke blive brugt" + +#: ../src/dialogs.py:1173 +#, python-format +msgid "Subscription request for account %s from %s" +msgstr "Forespørgsel på abonnering for konto %s fra %s" + +#: ../src/dialogs.py:1176 +#, python-format +msgid "Subscription request from %s" +msgstr "Forespørgsel om abonnering fra %s" + +#: ../src/dialogs.py:1237 ../src/roster_window.py:763 +#, python-format +msgid "You are already in group chat %s" +msgstr "Du er allerede i en gruppe samtale %s" + +#: ../src/dialogs.py:1245 +msgid "You can not join a group chat unless you are connected." +msgstr "Du kan kun deltage i en gruppe samtale hvis du er tilsluttet." + +#: ../src/dialogs.py:1263 +#, python-format +msgid "Join Group Chat with account %s" +msgstr "Deltag i Gruppe Samtale med kontoen %s" + +#: ../src/dialogs.py:1333 ../src/dialogs.py:1339 +#: ../src/groupchat_control.py:1646 +msgid "Invalid group chat Jabber ID" +msgstr "Ugyldig gruppe samtale Jabber ID" + +#: ../src/dialogs.py:1334 ../src/dialogs.py:1340 +#: ../src/groupchat_control.py:1647 +msgid "The group chat Jabber ID has not allowed characters." +msgstr "Gruppe samtale Jabber ID'en indeholder ikke tilladte tegn." + +#: ../src/dialogs.py:1346 +msgid "This is not a group chat" +msgstr "Dette er ikke en gruppe samtale" + +#: ../src/dialogs.py:1347 +#, python-format +msgid "%s is not the name of a group chat." +msgstr "%s er ikke navnet på en gruppe samtale." + +#: ../src/dialogs.py:1386 +msgid "Without a connection, you can not synchronise your contacts." +msgstr "Du kan kun synkronisere dine kontakter når du er tilsluttet." + +#: ../src/dialogs.py:1400 +msgid "Server" +msgstr "Server" + +#: ../src/dialogs.py:1433 +msgid "This account is not connected to the server" +msgstr "Denne konto er ikke tilsluttet til serveren" + +#: ../src/dialogs.py:1434 +msgid "You cannot synchronize with an account unless it is connected." +msgstr "Du kan kun synkronisere med en konto hvis du er tilsluttet." + +#: ../src/dialogs.py:1458 +msgid "Synchronise" +msgstr "Synkroniser" + +#: ../src/dialogs.py:1516 +#, python-format +msgid "Start Chat with account %s" +msgstr "Start en samtale med konto %s" + +#: ../src/dialogs.py:1518 +msgid "Start Chat" +msgstr "Start Samtale" + +#: ../src/dialogs.py:1519 +msgid "" +"Fill in the nickname or the Jabber ID of the contact you would like\n" +"to send a chat message to:" +msgstr "" +"Udfyld kælenavnet eller Jabber ID'en for den kontakt du vil sende\n" +"en besked til:" + +#. if offline or connecting +#: ../src/dialogs.py:1544 ../src/dialogs.py:1891 ../src/dialogs.py:2027 +msgid "Connection not available" +msgstr "Tilslutning er ikke tilgængelig" + +#: ../src/dialogs.py:1545 ../src/dialogs.py:1892 ../src/dialogs.py:2028 +#, python-format +msgid "Please make sure you are connected with \"%s\"." +msgstr "Vær venligst sikker på at du er tilsluttet med \"%s\"." + +#: ../src/dialogs.py:1554 ../src/dialogs.py:1557 +msgid "Invalid JID" +msgstr "Ugyldig JID" + +#: ../src/dialogs.py:1557 +#, python-format +msgid "Unable to parse \"%s\"." +msgstr "Kan ikke fortolke \"%s\"." + +#: ../src/dialogs.py:1566 +msgid "Without a connection, you can not change your password." +msgstr "Du kan kun ændre din adgangskode hvis du er tilsluttet." + +#: ../src/dialogs.py:1584 +msgid "Invalid password" +msgstr "Ugyldig adgangskode" + +#: ../src/dialogs.py:1585 +msgid "You must enter a password." +msgstr "Du må indtaste en adgangskode." + +#: ../src/dialogs.py:1589 +msgid "Passwords do not match" +msgstr "Adgangskoderne er ikke ens" + +#: ../src/dialogs.py:1590 +msgid "The passwords typed in both fields must be identical." +msgstr "Adgangskoderene i de to tekstindtastningsfelter må være identiske." + +#. img to display +#. default value +#: ../src/dialogs.py:1632 ../src/notify.py:219 ../src/notify.py:429 +msgid "Contact Signed In" +msgstr "Kontakt Loggede Ind" + +#: ../src/dialogs.py:1634 ../src/notify.py:227 ../src/notify.py:431 +msgid "Contact Signed Out" +msgstr "Kontakt Loggede Ud" + +#. chat message +#: ../src/dialogs.py:1636 ../src/notify.py:250 ../src/notify.py:433 +msgid "New Message" +msgstr "Ny Besked" + +#. single message +#: ../src/dialogs.py:1636 ../src/notify.py:231 ../src/notify.py:433 +msgid "New Single Message" +msgstr "Ny Enkel Besked" + +#. private message +#: ../src/dialogs.py:1637 ../src/notify.py:238 ../src/notify.py:434 +msgid "New Private Message" +msgstr "Ny Privat Besked" + +#: ../src/dialogs.py:1637 ../src/gajim.py:1460 ../src/notify.py:442 +msgid "New E-mail" +msgstr "Ny E-post" + +#: ../src/dialogs.py:1639 ../src/gajim.py:1668 ../src/notify.py:436 +msgid "File Transfer Request" +msgstr "Filoverførsel Forespørgsel" + +#: ../src/dialogs.py:1641 ../src/gajim.py:1432 ../src/gajim.py:1644 +#: ../src/notify.py:438 +msgid "File Transfer Error" +msgstr "Filoverførsel Fejl" + +#: ../src/dialogs.py:1643 ../src/gajim.py:1707 ../src/gajim.py:1729 +#: ../src/gajim.py:1746 ../src/notify.py:440 +msgid "File Transfer Completed" +msgstr "Filoverførsel er Fuldført" + +#: ../src/dialogs.py:1644 ../src/gajim.py:1710 ../src/notify.py:440 +msgid "File Transfer Stopped" +msgstr "Filoverførsel Stoppede" + +#: ../src/dialogs.py:1646 ../src/gajim.py:1328 ../src/notify.py:444 +msgid "Groupchat Invitation" +msgstr "Gruppesamtale Invitation" + +#: ../src/dialogs.py:1648 ../src/notify.py:211 ../src/notify.py:446 +msgid "Contact Changed Status" +msgstr "Kontakt Ændrede Status" + +#: ../src/dialogs.py:1821 +#, python-format +msgid "Single Message using account %s" +msgstr "Enkel Besked med konto %s" + +#: ../src/dialogs.py:1823 +#, python-format +msgid "Single Message in account %s" +msgstr "Enkel Besked i konto %s" + +#: ../src/dialogs.py:1825 +msgid "Single Message" +msgstr "Enkel Besked" + +#. prepare UI for Sending +#: ../src/dialogs.py:1828 +#, python-format +msgid "Send %s" +msgstr "Send %s" + +#. prepare UI for Receiving +#: ../src/dialogs.py:1851 +#, python-format +msgid "Received %s" +msgstr "Modtaget %s" + +#. we create a new blank window to send and we preset RE: and to jid +#: ../src/dialogs.py:1928 +#, python-format +msgid "RE: %s" +msgstr "SV: %s" + +#: ../src/dialogs.py:1929 +#, python-format +msgid "%s wrote:\n" +msgstr "%s skrev:\n" + +#: ../src/dialogs.py:1973 +#, python-format +msgid "XML Console for %s" +msgstr "XML Konsol for %s" + +#: ../src/dialogs.py:1975 +msgid "XML Console" +msgstr "XML Konsol" + +#: ../src/dialogs.py:2098 +#, python-format +msgid "Privacy List %s" +msgstr "Privatlivs Liste %s" + +#: ../src/dialogs.py:2102 +#, python-format +msgid "Privacy List for %s" +msgstr "Privatlivs Liste for %s" + +#: ../src/dialogs.py:2158 +#, python-format +msgid "Order: %s, action: %s, type: %s, value: %s" +msgstr "Rækkefølge: %s, handling: %s, type: %s, værdi: %s" + +#: ../src/dialogs.py:2161 +#, python-format +msgid "Order: %s, action: %s" +msgstr "Rækkefølge: %s, handling: %s" + +#: ../src/dialogs.py:2203 +msgid "Edit a rule" +msgstr "Rediger en regel" + +#: ../src/dialogs.py:2290 +msgid "Add a rule" +msgstr "Tilføj en regel" + +#: ../src/dialogs.py:2386 +#, python-format +msgid "Privacy Lists for %s" +msgstr "Privatlivs Liste for %s" + +#: ../src/dialogs.py:2388 +msgid "Privacy Lists" +msgstr "Privatlivs lister" + +#: ../src/dialogs.py:2458 +msgid "Invalid List Name" +msgstr "Ugyldig Listenavn" + +#: ../src/dialogs.py:2459 +msgid "You must enter a name to create a privacy list." +msgstr "Du må indtaste et navn for at skabe en privatlivs liste." + +#: ../src/dialogs.py:2496 +msgid "$Contact has invited you to join a discussion" +msgstr "$Contact har inviteret dig til at deltage i en diskussion" + +#: ../src/dialogs.py:2498 +#, python-format +msgid "$Contact has invited you to group chat %(room_jid)s" +msgstr "" +"$Contact har inviteret dig til at deltage i en gruppe samtale %(room_jid)s" + +#. only if not None and not '' +#: ../src/dialogs.py:2510 +#, python-format +msgid "Comment: %s" +msgstr "Kommentar: %s" + +#: ../src/dialogs.py:2576 +msgid "Choose Sound" +msgstr "Vælg Lyd" + +#: ../src/dialogs.py:2586 ../src/dialogs.py:2634 +msgid "All files" +msgstr "Alle filer" + +#: ../src/dialogs.py:2591 +msgid "Wav Sounds" +msgstr "Wav Lyde" + +#: ../src/dialogs.py:2624 +msgid "Choose Image" +msgstr "Vælg Billede" + +#: ../src/dialogs.py:2639 +msgid "Images" +msgstr "Billeder" + +#: ../src/dialogs.py:2703 +#, python-format +msgid "When %s becomes:" +msgstr "Når %s bliver:" + +#: ../src/dialogs.py:2705 +#, python-format +msgid "Adding Special Notification for %s" +msgstr "Tilføj Speciel Påmindelse for %s" + +#. # means number +#: ../src/dialogs.py:2776 +msgid "#" +msgstr "#" + +#: ../src/dialogs.py:2782 +msgid "Condition" +msgstr "Betingelse" + +#: ../src/dialogs.py:2900 +msgid "when I am " +msgstr "når jeg er" + +#: ../src/disco.py:104 +msgid "Others" +msgstr "Andre" + +#: ../src/disco.py:105 ../src/disco.py:106 ../src/disco.py:1345 +#: ../src/gajim.py:644 ../src/roster_window.py:282 ../src/roster_window.py:342 +#: ../src/roster_window.py:382 ../src/roster_window.py:490 +#: ../src/roster_window.py:522 ../src/roster_window.py:524 +#: ../src/roster_window.py:4687 ../src/roster_window.py:4689 +#: ../src/common/contacts.py:290 ../src/common/contacts.py:305 +#: ../src/common/helpers.py:44 +msgid "Transports" +msgstr "Transporter" + +#. conference is a category for listing mostly groupchats in service discovery +#: ../src/disco.py:108 +msgid "Conference" +msgstr "Konference" + +#: ../src/disco.py:421 +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:495 +#, python-format +msgid "Service Discovery using account %s" +msgstr "Opdag Tjenester med kontoen %s" + +#: ../src/disco.py:497 +msgid "Service Discovery" +msgstr "Opdag Tjenester" + +#: ../src/disco.py:637 +msgid "The service could not be found" +msgstr "Tjenesten findes ikke" + +#: ../src/disco.py:638 +msgid "" +"There is no service at the address you entered, or it is not responding. " +"Check the address and try again." +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:642 ../src/disco.py:923 +msgid "The service is not browsable" +msgstr "Det er ikke mulig at gennemse denne tjeneste" + +#: ../src/disco.py:643 +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:723 +#, python-format +msgid "Browsing %s using account %s" +msgstr "Gennemse %s med konto %s" + +#: ../src/disco.py:762 +msgid "_Browse" +msgstr "_Gennemse" + +#: ../src/disco.py:924 +msgid "This service does not contain any items to browse." +msgstr "Denne tjeneste har ingen elementer som kan gennemses." + +#: ../src/disco.py:1142 +msgid "_Execute Command" +msgstr "_Kør Kommando" + +#: ../src/disco.py:1152 ../src/disco.py:1350 +msgid "Re_gister" +msgstr "Re_gistrer" + +#: ../src/disco.py:1387 +#, python-format +msgid "Scanning %d / %d.." +msgstr "Skanner %d / %d.." + +#. Users column +#: ../src/disco.py:1569 +msgid "Users" +msgstr "Brugere" + +#. Description column +#: ../src/disco.py:1577 +msgid "Description" +msgstr "Beskrivelse" + +#. Id column +#: ../src/disco.py:1585 +msgid "Id" +msgstr "Id" + +#: ../src/disco.py:1814 +msgid "Subscribed" +msgstr "Abonnerede" + +#: ../src/disco.py:1822 +msgid "Node" +msgstr "Knude" + +#: ../src/disco.py:1879 +msgid "New post" +msgstr "Ny post" + +#: ../src/disco.py:1885 +msgid "_Subscribe" +msgstr "_Abonner" + +#: ../src/disco.py:1891 +msgid "_Unsubscribe" +msgstr "_Frameld abonnement" + +#: ../src/features_window.py:41 +msgid "PyOpenSSL" +msgstr "PyOpenSSL" + +#: ../src/features_window.py:42 +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:43 ../src/features_window.py:44 +msgid "Requires python-pyopenssl." +msgstr "Kræver python-pyopenssl." + +#: ../src/features_window.py:45 +msgid "Bonjour / Zeroconf" +msgstr "Bonjour / Zeroconf" + +#: ../src/features_window.py:46 +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:47 +msgid "Requires python-avahi." +msgstr "Kræver python-avahi." + +#: ../src/features_window.py:48 +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:49 +msgid "gajim-remote" +msgstr "gajim-fjernstyring" + +#: ../src/features_window.py:50 +msgid "A script to controle gajim via commandline." +msgstr "Et script til at kontrollere gajim via kommandolinjen" + +#: ../src/features_window.py:51 +msgid "Requires python-dbus." +msgstr "Kræver python-dbus." + +#: ../src/features_window.py:52 ../src/features_window.py:56 +#: ../src/features_window.py:60 ../src/features_window.py:64 +#: ../src/features_window.py:68 ../src/features_window.py:76 +#: ../src/features_window.py:80 ../src/features_window.py:92 +msgid "Feature not available under Windows." +msgstr "Egenskab ikke tilgængelig under Windows." + +#: ../src/features_window.py:53 +msgid "OpenGPG" +msgstr "OpenGPG" + +#: ../src/features_window.py:54 +msgid "Encrypting chatmessages with gpg keys." +msgstr "Krypter samtale beskeder med gpg nøgler." + +#: ../src/features_window.py:55 +msgid "Requires gpg and python-GnuPGInterface." +msgstr "Kræver gpg og python-GnuPGInterface." + +#: ../src/features_window.py:57 +msgid "network-manager" +msgstr "network-manager" + +#: ../src/features_window.py:58 +msgid "Autodetection of network status." +msgstr "Automatisk opdagelse af netværksstatus." + +#: ../src/features_window.py:59 +msgid "Requires gnome-network-manager and python-dbus." +msgstr "Kræver gnome-network-manager og python-dbus." + +#: ../src/features_window.py:61 +msgid "Session Management" +msgstr "Sessions Håndtering" + +#: ../src/features_window.py:62 +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:63 +msgid "Requires python-gnome2." +msgstr "Kræver python-gnome2." + +#: ../src/features_window.py:65 +msgid "gnome-keyring" +msgstr "gnome-nøglering" + +#: ../src/features_window.py:66 +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:67 +msgid "Requires gnome-keyring and python-gnome2-desktop." +msgstr "Kræver gnome-keyring og python-gnome2-desktop." + +#: ../src/features_window.py:69 +msgid "SRV" +msgstr "SRV" + +#: ../src/features_window.py:70 +msgid "Ability to connect to servers which is using SRV records." +msgstr "Evnen til at tilslutte til servere som bruger SRV poster." + +#: ../src/features_window.py:71 +msgid "Requires dnsutils." +msgstr "Kræver dnsutils." + +#: ../src/features_window.py:72 +msgid "Requires nslookup to use SRV records." +msgstr "Kræver nslookup for at bruge SRV poster." + +#: ../src/features_window.py:73 +msgid "Spell Checker" +msgstr "Stavekontrol" + +#: ../src/features_window.py:74 +msgid "Spellchecking of composed messages." +msgstr "Stavekontrol af forfattede beskeder." + +#: ../src/features_window.py:75 +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 Gajim kildekoden." + +#: ../src/features_window.py:77 +msgid "Notification-daemon" +msgstr "Påmindelses-dæmon" + +#: ../src/features_window.py:78 +msgid "Passive popups notifying for new events." +msgstr "Passive pop op vinduer som påminder om nye hændelser." + +#: ../src/features_window.py:79 +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:81 +msgid "Trayicon" +msgstr "Statusikon" + +#: ../src/features_window.py:82 +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:83 +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." + +#: ../src/features_window.py:84 +msgid "Requires PyGTK >= 2.10." +msgstr "Kræver PyGTK >= 2.10." + +#: ../src/features_window.py:85 +msgid "Idle" +msgstr "Tomgang" + +#: ../src/features_window.py:86 +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:87 ../src/features_window.py:88 +msgid "Requires compilation of the idle module from Gajim sources." +msgstr "Kræver kompilering af tomgangs modulet fra Gajim kildekoden." + +#: ../src/features_window.py:89 +msgid "LaTeX" +msgstr "LaTeX" + +#: ../src/features_window.py:90 +msgid "Transform LaTeX espressions between $$ $$." +msgstr "Omdan LaTeX udtryk mellem $$ $$." + +#: ../src/features_window.py:91 +msgid "" +"Requires texlive-latex-base, dvips and imagemagick. You have to set " +"'use_latex' to True in the Advanced Configuration Editor." +msgstr "Kræver texlive-latex-base, dvips og imagemagick. Du må sætte 'use_latex' til True i den avancerede konfigurations editor." + +#: ../src/features_window.py:93 +msgid "End to end encryption" +msgstr "Ende til ende kryptering" + +#: ../src/features_window.py:94 +msgid "Encrypting chatmessages." +msgstr "Krypterer samtale beskeder." + +#: ../src/features_window.py:95 ../src/features_window.py:96 +msgid "Requires python-crypto." +msgstr "Kræver python-crypto." + +#: ../src/features_window.py:97 +msgid "RST Generator" +msgstr "RST Generator" + +#: ../src/features_window.py:98 +msgid "" +"Generate XHTML output from RST code (see http://docutils.sourceforge.net/" +"docs/ref/rst/restructuredtext.html)." +msgstr "Generer XHTML uddata fra RST kode (se http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html)." + +#: ../src/features_window.py:99 ../src/features_window.py:100 +msgid "Requires python-docutils." +msgstr "Kræver python-docutils." + +#: ../src/features_window.py:107 ../src/common/helpers.py:239 +msgid "Available" +msgstr "Tilgængelig" + +#: ../src/features_window.py:114 +msgid "Feature" +msgstr "Egenskab" + +#: ../src/filetransfers_window.py:72 +msgid "File" +msgstr "Fil" + +#: ../src/filetransfers_window.py:87 +msgid "Time" +msgstr "Tid" + +#: ../src/filetransfers_window.py:99 +msgid "Progress" +msgstr "Fremgang" + +#: ../src/filetransfers_window.py:159 ../src/filetransfers_window.py:213 +#, python-format +msgid "Filename: %s" +msgstr "Filnavn: %s" + +#: ../src/filetransfers_window.py:160 ../src/filetransfers_window.py:288 +#, 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:169 ../src/filetransfers_window.py:179 +#: ../src/history_manager.py:463 +msgid "You" +msgstr "Du" + +#: ../src/filetransfers_window.py:170 +#, python-format +msgid "Sender: %s" +msgstr "Afsender: %s" + +#: ../src/filetransfers_window.py:171 ../src/filetransfers_window.py:577 +#: ../src/tooltips.py:586 +msgid "Recipient: " +msgstr "Modtager: " + +#: ../src/filetransfers_window.py:182 +#, python-format +msgid "Saved in: %s" +msgstr "Gemt i: %s" + +#: ../src/filetransfers_window.py:184 +msgid "File transfer completed" +msgstr "Filoverførsel er fuldført" + +#: ../src/filetransfers_window.py:198 ../src/filetransfers_window.py:204 +msgid "File transfer cancelled" +msgstr "Filoverførsel er afbrudt" + +#: ../src/filetransfers_window.py:198 ../src/filetransfers_window.py:205 +msgid "Connection with peer cannot be established." +msgstr "Tilslutning til ligeværdige kan ikke oprettes." + +#: ../src/filetransfers_window.py:214 +#, python-format +msgid "Recipient: %s" +msgstr "Modtager: %s" + +#: ../src/filetransfers_window.py:216 +#, python-format +msgid "Error message: %s" +msgstr "Fejl besked: %s" + +#: ../src/filetransfers_window.py:217 +msgid "File transfer stopped by the contact at the other end" +msgstr "Filoverførslen blev stoppet af kontakten i den anden ende" + +#: ../src/filetransfers_window.py:234 +msgid "Choose File to Send..." +msgstr "Vælg en Fil at Sende..." + +#: ../src/filetransfers_window.py:253 +msgid "Gajim cannot access this file" +msgstr "Gajim kan ikke tilgå denne fil" + +#: ../src/filetransfers_window.py:254 +msgid "This file is being used by another process." +msgstr "Denne fil bliver brugt af en anden proces." + +#: ../src/filetransfers_window.py:286 +#, python-format +msgid "File: %s" +msgstr "Fil: %s" + +#: ../src/filetransfers_window.py:291 +#, python-format +msgid "Type: %s" +msgstr "Type: %s" + +#: ../src/filetransfers_window.py:293 +#, python-format +msgid "Description: %s" +msgstr "Beskrivelse: %s" + +#: ../src/filetransfers_window.py:294 +#, python-format +msgid "%s wants to send you a file:" +msgstr "%s vil gerne sende dig en fil:" + +#: ../src/filetransfers_window.py:308 ../src/gtkgui_helpers.py:767 +#, python-format +msgid "Cannot overwrite existing file \"%s\"" +msgstr "Kan ikke overskrive den eksisterende fil \"%s\"" + +#: ../src/filetransfers_window.py:309 ../src/gtkgui_helpers.py:769 +msgid "" +"A file with this name already exists and you do not have permission to " +"overwrite it." +msgstr "" +"En fil med dette navn eksisterer allerede og du har ikke rettigheder til at " +"overskrive den." + +#: ../src/filetransfers_window.py:316 ../src/gtkgui_helpers.py:773 +msgid "This file already exists" +msgstr "Denne fil eksisterer allerede" + +#: ../src/filetransfers_window.py:316 ../src/gtkgui_helpers.py:773 +msgid "What do you want to do?" +msgstr "Hvad vil du gøre?" + +#: ../src/filetransfers_window.py:328 ../src/gtkgui_helpers.py:783 +#, python-format +msgid "Directory \"%s\" is not writable" +msgstr "Kataloget \"%s\" er ikke skrivbart" + +#: ../src/filetransfers_window.py:328 ../src/gtkgui_helpers.py:784 +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:338 +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:419 +#, python-format +msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" +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:508 +#, python-format +msgid "(%(filesize_unit)s/s)" +msgstr "(%(filesize_unit)s/s)" + +#: ../src/filetransfers_window.py:547 ../src/filetransfers_window.py:550 +msgid "Invalid File" +msgstr "Ugyldig Fil" + +#: ../src/filetransfers_window.py:547 +msgid "File: " +msgstr "Fil: " + +#: ../src/filetransfers_window.py:551 +msgid "It is not possible to send empty files" +msgstr "Det er ikke mulig at sende tomme filer" + +#: ../src/filetransfers_window.py:573 ../src/tooltips.py:576 +msgid "Name: " +msgstr "Navn: " + +#: ../src/filetransfers_window.py:575 ../src/tooltips.py:580 +msgid "Sender: " +msgstr "Afsender: " + +#: ../src/filetransfers_window.py:763 +msgid "Pause" +msgstr "Pause" + +#: ../src/gajim.py:50 +#, python-format +msgid "%s is not a valid loglevel" +msgstr "%s er ikke et gyldigt logniveau" + +#: ../src/gajim.py:143 +msgid "Gajim needs X server to run. Quiting..." +msgstr "Gajim behøver en X server for at kunne køre. Slutter..." + +#: ../src/gajim.py:147 +msgid "Gajim needs PyGTK 2.8 or above" +msgstr "Gajim behøver PyGTK 2.8 eller højere" + +#: ../src/gajim.py:148 +msgid "Gajim needs PyGTK 2.8 or above to run. Quiting..." +msgstr "Gajim behøver PyGTK 2.8 eller højere for at køre. Slutter..." + +#: ../src/gajim.py:150 +msgid "Gajim needs GTK 2.8 or above" +msgstr "Gajim behøver GTK 2.8 eller højere" + +#: ../src/gajim.py:151 +msgid "Gajim needs GTK 2.8 or above to run. Quiting..." +msgstr "Gajim behøver GTK 2.8 eller højere for at køre. Slutter..." + +#: ../src/gajim.py:156 +msgid "GTK+ runtime is missing libglade support" +msgstr "GTK+ udførselsmiljø mangler libglade understøttelse" + +#: ../src/gajim.py:158 +#, python-format +msgid "" +"Please remove your current GTK+ runtime and install the latest stable " +"version from %s" +msgstr "" +"Fjern venligst dit nuværende GTK+ udførselsmiljø og installer den sidste " +"stabile version fra %s" + +#: ../src/gajim.py:160 +msgid "" +"Please make sure that GTK+ and PyGTK have libglade support in your system." +msgstr "" +"Hver venligst sikker på at GTK+ og PyGTK har libglade understøttelse på dit " +"system." + +#: ../src/gajim.py:165 +msgid "Gajim needs PySQLite2 to run" +msgstr "Gajim behøver PySQLite2 for at køre" + +#: ../src/gajim.py:173 +msgid "Gajim needs pywin32 to run" +msgstr "Gajim behøver pywin32 for at køre" + +#: ../src/gajim.py:174 +#, python-format +msgid "" +"Please make sure that Pywin32 is installed on your system. You can get it at " +"%s" +msgstr "" +"Hver venligst sikker på at Pywin32 er installeret på dit system. Du kan få " +"det fra %s" + +#. set the icon to all newly opened wind +#: ../src/gajim.py:317 +msgid "Gajim is already running" +msgstr "Gajim kører allerede" + +#: ../src/gajim.py:318 +msgid "" +"Another instance of Gajim seems to be running\n" +"Run anyway?" +msgstr "" +"En anden instans af Gajim ser ud til at køre\n" +"Kør alligevel?" + +#: ../src/gajim.py:341 ../src/common/connection_handlers.py:900 +#: ../src/common/connection_handlers.py:1601 +#: ../src/common/connection_handlers.py:1629 +#: ../src/common/connection_handlers.py:1639 +#: ../src/common/connection_handlers.py:1658 +#: ../src/common/connection_handlers.py:1889 +#: ../src/common/connection_handlers.py:2001 ../src/common/connection.py:925 +msgid "Disk Write Error" +msgstr "Disk skrivefejl" + +#: ../src/gajim.py:434 +msgid "Do you accept this request?" +msgstr "Accepterer du denne forespørsel?" + +#: ../src/gajim.py:437 +#, python-format +msgid "HTTP (%s) Authorization for %s (id: %s)" +msgstr "HTTP (%s) Autorisering for %s (id: %s)" + +#: ../src/gajim.py:484 ../src/notify.py:448 +msgid "Connection Failed" +msgstr "Tilslutning Fejlede" + +#: ../src/gajim.py:817 +#, python-format +msgid "Subject: %s" +msgstr "Emne: %s" + +#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) +#: ../src/gajim.py:864 ../src/gajim.py:877 +#, python-format +msgid "error while sending %s ( %s )" +msgstr "fejl opstod under sending %s ( %s )" + +#: ../src/gajim.py:910 +msgid "Authorization accepted" +msgstr "Autorisering accepteret" + +#: ../src/gajim.py:911 +#, 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:919 +#, python-format +msgid "Contact \"%s\" removed subscription from you" +msgstr "Kontakt \"%s\" har fjernet abonneringen på dig" + +#: ../src/gajim.py:920 +msgid "You will always see him or her as offline." +msgstr "Du vil altid se ham eller hende som ikke tilsluttet." + +#: ../src/gajim.py:964 +#, python-format +msgid "Contact with \"%s\" cannot be established" +msgstr "Kontakt med \"%s\" kan ikke blive etableret" + +#: ../src/gajim.py:965 ../src/common/connection.py:466 +msgid "Check your connection or try again later." +msgstr "Kontroller din tilslutning eller forsøg igen senere." + +#: ../src/gajim.py:1136 ../src/roster_window.py:1348 +#, python-format +msgid "%s is now %s (%s)" +msgstr "%s er nu %s (%s)" + +#. No status message +#: ../src/gajim.py:1139 ../src/groupchat_control.py:1101 +#: ../src/roster_window.py:1351 +#, python-format +msgid "%s is now %s" +msgstr "%s er nu %s" + +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/gajim.py:1259 ../src/groupchat_control.py:913 +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:1261 +msgid "Room now shows unavailable member" +msgstr "Rummet viser nu; ikke tilgængelige medlemmer" + +#: ../src/gajim.py:1263 +msgid "room now does not show unavailable members" +msgstr "Rummet viser nu ikke; ikke tilgængelige medlemmer" + +#: ../src/gajim.py:1266 +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_contol.py) +#: ../src/gajim.py:1269 +msgid "Room logging is now enabled" +msgstr "Rum logging er nu aktiveret" + +#: ../src/gajim.py:1271 +msgid "Room logging is now disabled" +msgstr "Rum logging er nu deaktiveret" + +#: ../src/gajim.py:1273 +msgid "Room is now non-anonymous" +msgstr "Rummet er nu ikke-anonymt" + +#: ../src/gajim.py:1275 +msgid "Room is now semi-anonymous" +msgstr "Rummet er nu semi-anonymt" + +#: ../src/gajim.py:1277 +msgid "Room is now fully-anonymous" +msgstr "Rummet er nu helt anonymt" + +#: ../src/gajim.py:1308 +#, 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. Skriv venligst din adgangskode" + +#: ../src/gajim.py:1338 +msgid "Your passphrase is incorrect" +msgstr "Dit pgp-løsen er ikke korrekt" + +#: ../src/gajim.py:1339 +msgid "You are currently connected without your OpenPGP key." +msgstr "Du er for øjeblikket tilsluttet uden din OpenPGP nøgle." + +#: ../src/gajim.py:1443 +#, python-format +msgid "New mail on %(gmail_mail_address)s" +msgstr "Ny e-post på %(gmail_mail_address)s" + +#: ../src/gajim.py:1445 +#, 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" + +# Du har %d nye e-post samtaler +#. FIXME: emulate Gtalk client popups. find out what they parse and how +#. they decide what to show +#. each message has a 'From', 'Subject' and 'Snippet' field +#: ../src/gajim.py:1454 +#, python-format +msgid "" +"\n" +"From: %(from_address)s" +msgstr "" +"\n" +"Fra: %(from_address)s" + +#: ../src/gajim.py:1665 +#, python-format +msgid "%s wants to send you a file." +msgstr "%s vil gerne sende dig en fil." + +#: ../src/gajim.py:1730 +#, 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:1734 +#, 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:1747 +#, 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:1751 +#, 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:1846 +msgid "Session negotiation cancelled" +msgstr "Session forhandling annulleret" + +#: ../src/gajim.py:1847 +#, python-format +msgid "The client at %s cancelled the session negotiation." +msgstr "Klienten ved %s annullerede sessions forhandlingerne." + +#: ../src/gajim.py:1887 ../src/gajim.py:1928 +msgid "Confirm these session options" +msgstr "Bekræft disse sessions indstillinger" + +#: ../src/gajim.py:1888 +#, python-format +msgid "" +"The remote client wants to negotiate an session with these features:\n" +"\n" +"\t%s\n" +"\n" +"\tAre these options acceptable?" +msgstr "" +"Den fjerne klient vil forhandle en session med disse egenskaber:\n" +"\n" +"\t%s\n" +"\n" +"\tKan disse indstillinger godkendes?" + +#: ../src/gajim.py:1929 +#, python-format +msgid "" +"The remote client selected these options:\n" +"\n" +"%s\n" +"\n" +"Continue with the session?" +msgstr "" +"Den fjerne klient valgte disse indstillinger:\n" +"\n" +"%s\n" +"\n" +"Fortsæt med sessionen?" + +#: ../src/gajim.py:2041 +msgid "Username Conflict" +msgstr "Brugernavns Konflikt" + +#: ../src/gajim.py:2042 +msgid "Please type a new username for your local account" +msgstr "Skriv et nyt brugernavn for din lokale konto" + +#: ../src/gajim.py:2059 +msgid "Ping?" +msgstr "Ping?" + +#: ../src/gajim.py:2067 +#, python-format +msgid "Pong! (%s s.)" +msgstr "Pong! (%s .s)" + +#: ../src/gajim.py:2073 +msgid "Error." +msgstr "Fejl." + +#: ../src/gajim.py:2098 +msgid "Resource Conflict" +msgstr "Ressource Konflikt" + +#: ../src/gajim.py:2099 +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" + +#. it is good to notify the user +#. in case he or she cannot see the output of the console +#: ../src/gajim.py:2461 +msgid "Could not save your settings and preferences" +msgstr "Kunne ikke gemme din opsætning og indstillinger" + +#. sorted alphanum +#: ../src/gajim.py:2596 ../src/common/config.py:86 ../src/common/config.py:395 +#: ../src/common/optparser.py:194 ../src/common/optparser.py:412 +#: ../src/common/optparser.py:446 +msgid "default" +msgstr "standard" + +#: ../src/gajim.py:2683 +msgid "Network Manager support not available" +msgstr "Netværks Manager understøttelse er ikke tilgængelig" + +#: ../src/gajim.py:2784 +msgid "Session Management support not available (missing gnome.ui module)" +msgstr "" +"Sesion håndterer understøttelse er ikke tilgængelig (mangler gnome.ui " +"modulet)" + +#: ../src/gajim-remote.py:65 +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:68 +msgid "command" +msgstr "Kommando" + +#: ../src/gajim-remote.py:69 +msgid "show help on command" +msgstr "Vis hjælp for kommando" + +#: ../src/gajim-remote.py:73 +msgid "Shows or hides the roster window" +msgstr "Viser eller gemmer kontaktvinduet" + +#: ../src/gajim-remote.py:77 +msgid "Pops up a window with the next pending event" +msgstr "Popper op et vindue ved næste hændelse" + +#: ../src/gajim-remote.py:81 +msgid "" +"Prints a list of all contacts in the roster. Each contact appears on a " +"separate line" +msgstr "" +"Udskriver en liste af alle kontakter i kontaktvinduet. Hver kontakt placeres " +"på en separat linie" + +#: ../src/gajim-remote.py:84 ../src/gajim-remote.py:99 +#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:122 +#: ../src/gajim-remote.py:136 ../src/gajim-remote.py:145 +#: ../src/gajim-remote.py:166 ../src/gajim-remote.py:196 +#: ../src/gajim-remote.py:205 ../src/gajim-remote.py:212 +#: ../src/gajim-remote.py:219 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:246 ../src/gajim-remote.py:255 +msgid "account" +msgstr "Konto" + +#: ../src/gajim-remote.py:84 +msgid "show only contacts of the given account" +msgstr "viser kun kontakter for den givne konto" + +#: ../src/gajim-remote.py:90 +msgid "Prints a list of registered accounts" +msgstr "Udskriver en liste af registrerede kontoer" + +#: ../src/gajim-remote.py:94 +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:97 +msgid "status" +msgstr "status" + +#: ../src/gajim-remote.py:97 +msgid "one of: offline, online, chat, away, xa, dnd, invisible " +msgstr "en af: offline, online, chat, away, xa, dnd, invisible" + +#: ../src/gajim-remote.py:98 ../src/gajim-remote.py:119 +#: ../src/gajim-remote.py:133 ../src/gajim-remote.py:144 +msgid "message" +msgstr "besked" + +#: ../src/gajim-remote.py:98 +msgid "status message" +msgstr "status besked" + +#: ../src/gajim-remote.py:99 +msgid "" +"change status of account \"account\". If not specified, try to 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" + +#: ../src/gajim-remote.py:105 +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:107 +msgid "JID of the contact that you want to chat with" +msgstr "Kontaktens JID som du vil samtale med" + +#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:196 +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:114 +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 " +"key', just set 'OpenPGP key' to ''." +msgstr "" +"Sender en ny besked til en kontakt i kontaktvinduet. Både OpenPGP 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:118 ../src/gajim-remote.py:131 +msgid "JID of the contact that will receive the message" +msgstr "JID på den kontakt som skal modtage beskeden" + +#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:144 +msgid "message contents" +msgstr "besked indhold" + +#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 +msgid "pgp key" +msgstr "pgp nøgle" + +#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 +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:122 ../src/gajim-remote.py:136 +#: ../src/gajim-remote.py:145 +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:127 +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 " +"key', just set 'OpenPGP key' to ''." +msgstr "" +"Sender en ny enkel besked til en kontakt i kontaktvinduet. Både OpenPGP " +"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:132 +msgid "subject" +msgstr "emne" + +#: ../src/gajim-remote.py:132 +msgid "message subject" +msgstr "emne på besked" + +#: ../src/gajim-remote.py:141 +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:143 +msgid "JID of the room that will receive the message" +msgstr "JID på den rum som skal modtage beskeden" + +#: ../src/gajim-remote.py:150 +msgid "Gets detailed info on a contact" +msgstr "Få detaljeret information om kontakten" + +#: ../src/gajim-remote.py:152 ../src/gajim-remote.py:165 +#: ../src/gajim-remote.py:195 ../src/gajim-remote.py:204 +msgid "JID of the contact" +msgstr "Kontaktens JID" + +#: ../src/gajim-remote.py:156 +msgid "Gets detailed info on a account" +msgstr "Få detaljeret information om kontoen" + +#: ../src/gajim-remote.py:158 +msgid "Name of the account" +msgstr "Navn på kontoen" + +#: ../src/gajim-remote.py:162 +msgid "Sends file to a contact" +msgstr "Send en fil til en kontakt" + +#: ../src/gajim-remote.py:164 +msgid "file" +msgstr "fil" + +#: ../src/gajim-remote.py:164 +msgid "File path" +msgstr "Filsti" + +#: ../src/gajim-remote.py:166 +msgid "if specified, file will be sent using this account" +msgstr "hvis specificeret vil filen blive sendt med denne konto" + +#: ../src/gajim-remote.py:171 +msgid "Lists all preferences and their values" +msgstr "Hvis alle indstillinger og deres værdier" + +#: ../src/gajim-remote.py:175 +msgid "Sets value of 'key' to 'value'." +msgstr "Sætter værdien for 'nøglen' til 'værdi'." + +#: ../src/gajim-remote.py:177 +msgid "key=value" +msgstr "nøgle=værdi" + +#: ../src/gajim-remote.py:177 +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:182 +msgid "Deletes a preference item" +msgstr "Sletter et indstillingspunkt" + +#: ../src/gajim-remote.py:184 +msgid "key" +msgstr "nøgle" + +#: ../src/gajim-remote.py:184 +msgid "name of the preference to be deleted" +msgstr "navn på den indstilling som skal slettes" + +#: ../src/gajim-remote.py:188 +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:193 +msgid "Removes contact from roster" +msgstr "Fjerner kontakt fra kontaktvinduet" + +#: ../src/gajim-remote.py:202 +msgid "Adds contact to roster" +msgstr "Tilføjer kontakt til kontaktvinduet" + +#: ../src/gajim-remote.py:204 +msgid "jid" +msgstr "jid" + +#: ../src/gajim-remote.py:205 +msgid "Adds new contact to this account" +msgstr "Tilføjer ny kontakt til denne konto" + +#: ../src/gajim-remote.py:210 +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:217 +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:224 +msgid "Returns number of unread messages" +msgstr "Returnerer antal ikke læste beskeder" + +#: ../src/gajim-remote.py:228 +msgid "Opens 'Start Chat' dialog" +msgstr "Åbner 'Start Samtale' vinduet" + +#: ../src/gajim-remote.py:230 +msgid "Starts chat, using this account" +msgstr "Starter en samtale med denne konto" + +#: ../src/gajim-remote.py:234 +msgid "Sends custom XML" +msgstr "Sender tilpasset XML" + +#: ../src/gajim-remote.py:236 +msgid "XML to send" +msgstr "XML som skal sendes" + +#: ../src/gajim-remote.py:237 +msgid "" +"Account in which the xml will be sent; if not specified, xml will be sent to " +"all accounts" +msgstr "" +"Den konto hvor XML vil blive sendt; hvis ikke den er specificeret, vil XML " +"blive sendt til alle kontoer" + +#: ../src/gajim-remote.py:243 +msgid "Handle a xmpp:/ uri" +msgstr "Håndter en xmpp:/ uri" + +#: ../src/gajim-remote.py:245 +msgid "uri" +msgstr "uri" + +#: ../src/gajim-remote.py:250 +msgid "Join a MUC room" +msgstr "Deltag i et MUC rum" + +#: ../src/gajim-remote.py:252 +msgid "room" +msgstr "rum" + +#: ../src/gajim-remote.py:253 +msgid "nick" +msgstr "kælenavn" + +#: ../src/gajim-remote.py:254 +msgid "password" +msgstr "adgangskode" + +#: ../src/gajim-remote.py:277 +msgid "Missing argument \"contact_jid\"" +msgstr "Manglende argument \"contact_jid\"" + +#: ../src/gajim-remote.py:296 +#, python-format +msgid "" +"'%s' is not in your roster.\n" +"Please specify account for sending the message." +msgstr "" +"'%s' er ikke i dit kontaktvindue.\n" +"Specificer venligst en konto for at sende beskeden." + +#: ../src/gajim-remote.py:299 +msgid "You have no active account" +msgstr "Du har ingen aktiv konto" + +#: ../src/gajim-remote.py:363 +#, python-format +msgid "" +"Usage: %s %s %s \n" +"\t %s" +msgstr "" +"Brug: %s %s %s \n" +"\t %s" + +#: ../src/gajim-remote.py:366 +msgid "Arguments:" +msgstr "Argumenter:" + +#: ../src/gajim-remote.py:370 +#, python-format +msgid "%s not found" +msgstr "%s ikke fundet" + +#: ../src/gajim-remote.py:374 +#, python-format +msgid "" +"Usage: %s command [arguments]\n" +"Command is one of:\n" +msgstr "" +"Brug: %s kommando [argumenter]\n" +"Kommando er en af:\n" + +#: ../src/gajim-remote.py:447 +#, python-format +msgid "" +"Too many arguments. \n" +"Type \"%s help %s\" for more info" +msgstr "" +"For mange argumenter. \n" +"Skriv \"%s help %s\" for mere information" + +#: ../src/gajim-remote.py:451 +#, python-format +msgid "" +"Argument \"%s\" is not specified. \n" +"Type \"%s help %s\" for more info" +msgstr "" +"Argument \"%s\" er ikke specificeret. \n" +"Skriv \"%s help %s\" for mere information" + +#: ../src/gajim-remote.py:469 +msgid "Wrong uri" +msgstr "Forkert uri" + +#: ../src/gajim_themes_window.py:62 +msgid "Theme" +msgstr "Tema" + +#: ../src/gajim_themes_window.py:100 +msgid "You cannot make changes to the default theme" +msgstr "Du kan ikke lave ændringer til standard temaet" + +#: ../src/gajim_themes_window.py:101 +msgid "Please create a clean new theme with your desired name." +msgstr "Opret et nyt tema med dit ønskede navn." + +#. don't confuse translators +#: ../src/gajim_themes_window.py:175 +msgid "theme name" +msgstr "Tema navn" + +#: ../src/gajim_themes_window.py:192 +msgid "You cannot delete your current theme" +msgstr "Du kan ikke slette det nuværende tema" + +#: ../src/gajim_themes_window.py:193 +msgid "Please first choose another for your current theme." +msgstr "Vælg venligst en anden for dit nuværende tema." + +#: ../src/groupchat_control.py:134 +msgid "Sending private message failed" +msgstr "Sending af privat besked fejlede" + +#. in second %s code replaces with nickname +#: ../src/groupchat_control.py:136 +#, python-format +msgid "You are no longer in group chat \"%s\" or \"%s\" has left." +msgstr "" +"Du er ikke længere i gruppe samtale \"%s\" eller \"%s\" har forladt rummet." + +#: ../src/groupchat_control.py:342 +msgid "Insert Nickname" +msgstr "Indsæt Kælenavn" + +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/groupchat_control.py:916 +msgid "Room logging is enabled" +msgstr "Rum logging er aktiveret" + +#: ../src/groupchat_control.py:918 +msgid "A new room has been created" +msgstr "Et nyt rum er blevet oprettet" + +#: ../src/groupchat_control.py:921 +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:927 +#, python-format +msgid "%(nick)s has been kicked: %(reason)s" +msgstr "%(nick)s er blevet udvist: %(reason)s" + +#: ../src/groupchat_control.py:931 +#, 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:938 +#, python-format +msgid "%(nick)s has been banned: %(reason)s" +msgstr "%(nick)s er blevet uønsket: %(reason)s" + +#: ../src/groupchat_control.py:942 +#, 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" + +#. Someone changed his or her nick +#. We changed our nick +#: ../src/groupchat_control.py:949 +#, python-format +msgid "You are now known as %s" +msgstr "Du er nu kendt som %s" + +#: ../src/groupchat_control.py:951 +#, python-format +msgid "%s is now known as %s" +msgstr "%s er nu kendt som %s" + +#: ../src/groupchat_control.py:984 ../src/groupchat_control.py:988 +#: ../src/groupchat_control.py:993 +#, 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:985 +msgid "affiliation changed" +msgstr "tilknytning ændret" + +#: ../src/groupchat_control.py:990 +msgid "room configuration changed to members-only" +msgstr "Rum konfiguration er blevet ændret til 'kun for medlemmer'" + +#: ../src/groupchat_control.py:995 +msgid "system shutdown" +msgstr "computeren slukkes" + +#: ../src/groupchat_control.py:1094 +#, python-format +msgid "%s has left" +msgstr "%s har forladt samtalen" + +#: ../src/groupchat_control.py:1099 +#, python-format +msgid "%s has joined the group chat" +msgstr "%s deltager nu i gruppe samtalen" + +#. Invalid Nickname +#. invalid char +#: ../src/groupchat_control.py:1212 ../src/groupchat_control.py:1494 +msgid "Invalid nickname" +msgstr "Ugyldigt kælenavn" + +#: ../src/groupchat_control.py:1213 ../src/groupchat_control.py:1495 +msgid "The nickname has not allowed characters." +msgstr "Kælenavnet har ikke tilladte tegn." + +#: ../src/groupchat_control.py:1236 ../src/groupchat_control.py:1254 +#: ../src/groupchat_control.py:1341 ../src/groupchat_control.py:1358 +#, python-format +msgid "Nickname not found: %s" +msgstr "Kælenavn ikke fundet: %s" + +#: ../src/groupchat_control.py:1270 +msgid "This group chat has no subject" +msgstr "Denne gruppe samtale har ikke noget emne" + +#: ../src/groupchat_control.py:1281 +#, python-format +msgid "Invited %(contact_jid)s to %(room_jid)s." +msgstr "Inviterede %(contact_jid)s til %(room_jid)s." + +#. %s is something the user wrote but it is not a jid so we inform +#: ../src/groupchat_control.py:1314 +#, python-format +msgid "%s does not appear to be a valid JID" +msgstr "%s ser ikke ud til at være et gyldigt JID" + +#: ../src/groupchat_control.py:1421 +#, python-format +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. Does " +"NOT support spaces in nickname." +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." + +#: ../src/groupchat_control.py:1428 +#, python-format +msgid "" +"Usage: /%s , opens a private chat window with the specified " +"occupant." +msgstr "Brug: /%s , åbner et privat samtale vindue med den specificerede bruger." + +#: ../src/groupchat_control.py:1434 +#, python-format +msgid "" +"Usage: /%s [reason], closes the current window or tab, displaying reason if " +"specified." +msgstr "" +"Brug: /%s [begrundelse], lukker det nuværende vindue eller fan, visende " +"begrundelsen hvis specificeret." + +#: ../src/groupchat_control.py:1440 +#, python-format +msgid "" +"Usage: /%s [reason], invites JID to the current group chat, optionally " +"providing a reason." +msgstr "Brug: /%s [begrundelse], inviter JID til den nuværende gruppe samtale, visende begrundelsen hvis specificeret" + +#: ../src/groupchat_control.py:1444 +#, python-format +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." + +#: ../src/groupchat_control.py:1448 +#, python-format +msgid "" +"Usage: /%s [reason], removes the occupant specified by nickname " +"from the group chat and optionally displays a reason. Does NOT support " +"spaces in nickname." +msgstr "Brug: /%s [begrundelse], fjerner deltager med kælenavnet fra gruppe samtalen og hvis specificeret, viser en begrundelse" + +#: ../src/groupchat_control.py:1457 +#, python-format +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." + +#: ../src/groupchat_control.py:1462 +#, python-format +msgid "Usage: /%s , changes your nickname in current group chat." +msgstr "" +"Brug: /%s , ændrer dit kælenavn i den nuværende gruppe samtale." + +#: ../src/groupchat_control.py:1466 +#, python-format +msgid "Usage: /%s , display the names of group chat occupants." +msgstr "Brug: /%s , viser navnene på deltagerne i gruppe samtalen." + +#: ../src/groupchat_control.py:1470 +#, python-format +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." + +#: ../src/groupchat_control.py:1473 +#, python-format +msgid "" +"Usage: /%s , sends a message without looking for other commands." +msgstr "" +"Brug: /%s , sender en besked uden at kigge efter andre kommandoer." + +#: ../src/groupchat_control.py:1568 +#, 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:1570 +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:1574 ../src/roster_window.py:4835 +msgid "Do _not ask me again" +msgstr "Ikke spørg mig ige_n" + +#: ../src/groupchat_control.py:1608 +msgid "Changing Subject" +msgstr "Ændre emne" + +#: ../src/groupchat_control.py:1609 +msgid "Please specify the new subject:" +msgstr "Anfør et nyt emne:" + +#: ../src/groupchat_control.py:1618 +msgid "Changing Nickname" +msgstr "Ændre kælenavn" + +#: ../src/groupchat_control.py:1619 +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:1634 +#, python-format +msgid "Destroying %s" +msgstr "Fjern %s" + +#: ../src/groupchat_control.py:1635 +msgid "" +"You are going to definitively destroy this room.\n" +"You may specify a reason below:" +msgstr "" +"Du er ved at definitivt fjerne dette rum.\n" +"Du kan anføre en grund herunder:" + +#: ../src/groupchat_control.py:1637 +msgid "You may also enter an alternate venue:" +msgstr "Du kan også indtaste et alternativt mødested:" + +#: ../src/groupchat_control.py:1668 +msgid "Bookmark already set" +msgstr "Bogmærke er allerede sat" + +#: ../src/groupchat_control.py:1669 +#, python-format +msgid "Group Chat \"%s\" is already in your bookmarks." +msgstr "Gruppe samtale \"%s\" er allerede i dine bogmærker." + +#: ../src/groupchat_control.py:1678 +msgid "Bookmark has been added successfully" +msgstr "Bogmærket er blevet tilføjet succesfuldt" + +#: ../src/groupchat_control.py:1679 +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." + +#. ask for reason +#: ../src/groupchat_control.py:1831 +#, python-format +msgid "Kicking %s" +msgstr "Sparker %s" + +#: ../src/groupchat_control.py:1832 ../src/groupchat_control.py:2132 +msgid "You may specify a reason below:" +msgstr "Du kan anføre en begrundelse under:" + +#. ask for reason +#: ../src/groupchat_control.py:2131 +#, python-format +msgid "Banning %s" +msgstr "Udeluk %s" + +#: ../src/gtkexcepthook.py:41 +msgid "A programming error has been detected" +msgstr "En programmeringsfejl er blevet opdaget" + +#: ../src/gtkexcepthook.py:42 +msgid "" +"It probably is not fatal, but should be reported to the developers " +"nonetheless." +msgstr "" +"Den er sikkert ikke kritisk, men bør alligevel rapporteres til udviklerne." + +#: ../src/gtkexcepthook.py:48 +msgid "_Report Bug" +msgstr "_Rapporter Fejl" + +#: ../src/gtkexcepthook.py:71 +msgid "Details" +msgstr "Detaljer" + +#. we talk about file +#: ../src/gtkgui_helpers.py:157 ../src/gtkgui_helpers.py:172 +#, python-format +msgid "Error: cannot open %s for reading" +msgstr "Fejl: kan ikke åbne %s for læsning" + +#: ../src/gtkgui_helpers.py:337 +msgid "Error reading file:" +msgstr "Fejl ved læsning af fil:" + +#: ../src/gtkgui_helpers.py:340 +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:377 +#, 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:711 +msgid "Gajim is not the default Jabber client" +msgstr "Gajim er ikke standard Jabber client" + +#: ../src/gtkgui_helpers.py:712 +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:713 +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:812 +msgid "Extension not supported" +msgstr "Udvidelse er ikke understøttet" + +#: ../src/gtkgui_helpers.py:813 +#, 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:822 +msgid "Save Image as..." +msgstr "Gem Billede som..." + +#: ../src/history_manager.py:68 +msgid "Cannot find history logs database" +msgstr "Kan ikke finde historik log databasen" + +#. holds jid +#: ../src/history_manager.py:108 +msgid "Contacts" +msgstr "Kontakter" + +#. holds time +#: ../src/history_manager.py:121 ../src/history_manager.py:161 +#: ../src/history_window.py:86 +msgid "Date" +msgstr "Dato" + +#. holds nickname +#: ../src/history_manager.py:127 ../src/history_manager.py:179 +msgid "Nickname" +msgstr "Kælenavn" + +#. holds message +#: ../src/history_manager.py:135 ../src/history_manager.py:167 +#: ../src/history_window.py:94 +msgid "Message" +msgstr "Besked" + +#: ../src/history_manager.py:187 +msgid "" +"Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " +"RUNNING)" +msgstr "" +"Vil du rydde op i databasen? (DETTE ER IKKE ANBEFALET HVIS GAJIM KØRER)" + +#: ../src/history_manager.py:189 +msgid "" +"Normally allocated database size will not be freed, it will just become " +"reusable. If you really want to reduce database filesize, click YES, else " +"click NO.\n" +"\n" +"In case you click YES, please wait..." +msgstr "" +"Normalt vil den allokerede database størrelse ikke blive frigjort, den vil " +"bare kunne genbruges. Hvis du virkelig vil reducere database filstørrelsen, " +"tryk JA, eller tryk NEJ.\n" +"\n" +"I tilfælde du trykker JA, venligst vent..." + +#: ../src/history_manager.py:401 +msgid "Exporting History Logs..." +msgstr "Eksporter Historik Log..." + +#: ../src/history_manager.py:476 +#, 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:514 +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:518 ../src/history_manager.py:554 +msgid "This is an irreversible operation." +msgstr "Dette er en irreversibel handling." + +#: ../src/history_manager.py:551 +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:103 ../src/history_window.py:105 +#, python-format +msgid "Conversation History with %s" +msgstr "Konversations Historik med %s" + +#: ../src/history_window.py:266 +#, 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:270 ../src/notify.py:206 +#, python-format +msgid "%(nick)s is now %(status)s" +msgstr "%(nick)s er nu %(status)s" + +#: ../src/history_window.py:276 +#, python-format +msgid "Status is now: %(status)s: %(status_msg)s" +msgstr "Status er nu: %(status)s: %(status_msg)s" + +#: ../src/history_window.py:279 +#, python-format +msgid "Status is now: %(status)s" +msgstr "Status er nu: %(status)s" + +#: ../src/htmltextview.py:583 ../src/htmltextview.py:594 +msgid "Timeout loading image" +msgstr "Tidsudløb nået for at laste billede" + +#: ../src/htmltextview.py:604 +msgid "Image is too big" +msgstr "Billede er for stort" + +#: ../src/message_window.py:288 +msgid "Chats" +msgstr "Samtaler" + +#: ../src/message_window.py:290 +msgid "Group Chats" +msgstr "Gruppe Samtaler" + +#: ../src/message_window.py:292 +msgid "Private Chats" +msgstr "Private Samtaler" + +#: ../src/message_window.py:294 +msgid "Messages" +msgstr "Beskeder" + +#: ../src/message_window.py:295 +#, python-format +msgid "%s - Gajim" +msgstr "%s - Gajim" + +#: ../src/negotiation.py:13 +msgid "- messages will be logged" +msgstr "- beskeder vil blive logget" + +#: ../src/negotiation.py:15 +msgid "- messages will not be logged" +msgstr "- beskeder vil ikke blive logget" + +#: ../src/negotiation.py:18 +msgid "Verify the remote client's identity" +msgstr "Bekræft den fjerne klients identitet" + +#: ../src/negotiation.py:18 +#, python-format +msgid "" +"You've begun an encrypted session with %s, but it can't be guaranteed that " +"you're talking directly to the person you think you are.\n" +"\n" +"You should speak with them directly (in person or on the phone) and confirm " +"that their Short Authentication String is identical to this one: %s" +msgstr "" +"Du er begyndt på en krypteret session med %s, men det kan ikke garanteres at du snakker direkte med den person du tror du gør.\n" +"\n" +"Du bør snakke med dem direkte (ansigt til ansigt eller på telefonen) og på den måde bekræfte at deres Korte Autoriserings Streng er identisk til denne: %s" + +#: ../src/notify.py:204 +#, python-format +msgid "%(nick)s Changed Status" +msgstr "%(nick)s Ændrede Status" + +#: ../src/notify.py:214 +#, python-format +msgid "%(nickname)s Signed In" +msgstr "%(nickname)s Loggede Ind" + +#: ../src/notify.py:222 +#, python-format +msgid "%(nickname)s Signed Out" +msgstr "%(nickname)s Loggede Ud" + +#: ../src/notify.py:234 +#, python-format +msgid "New Single Message from %(nickname)s" +msgstr "Ny Besked fra %(nickname)s" + +#: ../src/notify.py:242 +#, python-format +msgid "New Private Message from group chat %s" +msgstr "Ny Privat Besked fra gruppe samtale %s" + +#: ../src/notify.py:244 +#, python-format +msgid "%(nickname)s: %(message)s" +msgstr "%(nickname)s: %(message)s" + +#: ../src/notify.py:247 +#, python-format +msgid "Messaged by %(nickname)s" +msgstr "Besked fra %(nickname)s" + +#: ../src/notify.py:253 +#, python-format +msgid "New Message from %(nickname)s" +msgstr "Ny Besked fra %(nickname)s" + +#: ../src/profile_window.py:72 +msgid "Retrieving profile..." +msgstr "Henter profil..." + +#: ../src/profile_window.py:123 ../src/roster_window.py:1882 +msgid "File is empty" +msgstr "Filen er tom" + +#: ../src/profile_window.py:126 ../src/roster_window.py:1885 +msgid "File does not exist" +msgstr "Filen eksisterer ikke" + +#. keep identation +#. unknown format +#: ../src/profile_window.py:140 ../src/profile_window.py:156 +#: ../src/roster_window.py:1887 ../src/roster_window.py:1898 +msgid "Could not load image" +msgstr "Kunne ikke laste billede" + +#: ../src/profile_window.py:257 +msgid "Information received" +msgstr "Information modtaget" + +#: ../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:338 +msgid "Sending profile..." +msgstr "Sender profil..." + +#: ../src/profile_window.py:353 +msgid "Information NOT published" +msgstr "Information er IKKE publiceret" + +#: ../src/profile_window.py:360 +msgid "vCard publication failed" +msgstr "vCard publicering fejlede" + +#: ../src/profile_window.py:361 +msgid "" +"There was an error while publishing your personal information, try again " +"later." +msgstr "" +"Der var en fejl under publicering af din personlige information, prøv igen " +"senere." + +#: ../src/roster_window.py:182 ../src/roster_window.py:237 +msgid "Merged accounts" +msgstr "Flettede kontoer" + +#: ../src/roster_window.py:357 ../src/roster_window.py:622 +#: ../src/roster_window.py:2109 ../src/common/contacts.py:307 +#: ../src/common/helpers.py:44 +msgid "Observers" +msgstr "Iagttagere" + +#. Make special context menu if group is Groupchats +#: ../src/roster_window.py:441 ../src/roster_window.py:446 +#: ../src/roster_window.py:1934 ../src/roster_window.py:1937 +#: ../src/roster_window.py:2606 ../src/roster_window.py:2609 +#: ../src/roster_window.py:2634 ../src/roster_window.py:4695 +#: ../src/roster_window.py:4697 ../src/common/commands.py:194 +#: ../src/common/contacts.py:97 ../src/common/helpers.py:44 +msgid "Groupchats" +msgstr "Gruppesamtaler" + +#: ../src/roster_window.py:771 ../src/roster_window.py:3951 +msgid "You cannot join a group chat while you are invisible" +msgstr "Du kan ikke deltage i en gruppe samtale mens du er usynlig" + +#. new chat +#. single message +#. for chat_with +#. for single message +#. join gc +#: ../src/roster_window.py:984 ../src/roster_window.py:994 +#: ../src/roster_window.py:1003 ../src/systray.py:207 ../src/systray.py:212 +#: ../src/systray.py:218 +#, python-format +msgid "using account %s" +msgstr "med konto %s" + +#. add +#: ../src/roster_window.py:1010 +#, python-format +msgid "to %s account" +msgstr "til %s konto" + +#. disco +#: ../src/roster_window.py:1015 +#, python-format +msgid "using %s account" +msgstr "bruger %s konto" + +#: ../src/roster_window.py:1096 +msgid "_Manage Bookmarks..." +msgstr "Håndter Bog_mærker..." + +#. profile, avatar +#: ../src/roster_window.py:1115 +#, python-format +msgid "of account %s" +msgstr "fra konto %s" + +#: ../src/roster_window.py:1155 +#, python-format +msgid "for account %s" +msgstr "for konto %s" + +#. History manager +#: ../src/roster_window.py:1176 +msgid "History Manager" +msgstr "Historik Håndterer" + +#: ../src/roster_window.py:1185 +msgid "_Join New Group Chat" +msgstr "_Deltag i Ny Gruppe Samtale" + +#: ../src/roster_window.py:1544 ../src/roster_window.py:4149 +#: ../src/roster_window.py:4156 +msgid "You have unread messages" +msgstr "Du har ulæste beskeder" + +#: ../src/roster_window.py:1545 +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:1548 +#, python-format +msgid "Transport \"%s\" will be removed" +msgstr "Transport \"%s\" vil blive fjernet" + +#: ../src/roster_window.py:1549 +msgid "" +"You will no longer be able to send and receive messages from contacts using " +"this transport." +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:1552 +msgid "Transports will be removed" +msgstr "Transporter vil blive fjernet" + +#: ../src/roster_window.py:1557 +#, python-format +msgid "" +"You will no longer be able to send and receive messages to contacts from " +"these transports:%s" +msgstr "" +"Du vil ikke længere være i stand til at sende og modtage beskeder fra " +"kontakter som bruger disse transporter:%s" + +#. it's jid +#: ../src/roster_window.py:1723 +msgid "Rename Contact" +msgstr "Omdøb Kontakt" + +#: ../src/roster_window.py:1724 +#, python-format +msgid "Enter a new nickname for contact %s" +msgstr "Indtast et nyt kælenavn for kontakt %s" + +#: ../src/roster_window.py:1731 +msgid "Rename Group" +msgstr "Omdøb Gruppe" + +#: ../src/roster_window.py:1732 +#, python-format +msgid "Enter a new name for group %s" +msgstr "Indtast et nyt navn for gruppen %s" + +#: ../src/roster_window.py:1807 +msgid "Remove Group" +msgstr "Fjern Gruppen" + +#: ../src/roster_window.py:1808 +#, 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:1809 +msgid "Remove also all contacts in this group from your roster" +msgstr "Fjern også alle kontakter i denne gruppe fra kontaktvinduet" + +#: ../src/roster_window.py:1840 +msgid "Assign OpenPGP Key" +msgstr "Tildel OpenPGP Nøgle" + +#: ../src/roster_window.py:1841 +msgid "Select a key to apply to the contact" +msgstr "Vælg den nøgle du vil anvende til kontakten" + +#: ../src/roster_window.py:2155 +msgid "_New Group Chat" +msgstr "_Ny Gruppe Samtale" + +#: ../src/roster_window.py:2297 +msgid "I would like to add you to my roster" +msgstr "Jeg vil gerne tilføje dig til mit kontaktvindue" + +#. Send Group Message +#: ../src/roster_window.py:2431 ../src/roster_window.py:2643 +msgid "Send Group M_essage" +msgstr "Send Gruppeb_esked" + +#: ../src/roster_window.py:2450 +msgid "_New group chat" +msgstr "_Ny gruppe samtale" + +#. Manage Transport submenu +#: ../src/roster_window.py:2488 +msgid "_Manage Contacts" +msgstr "_Håndter Kontakter" + +#: ../src/roster_window.py:2549 +msgid "_Maximize" +msgstr "_Maksimer" + +#: ../src/roster_window.py:2556 +msgid "_Disconnect" +msgstr "Afbry_d tilslutningen" + +#: ../src/roster_window.py:2635 +msgid "_Maximize All" +msgstr "_Maksimer alt" + +#: ../src/roster_window.py:2651 +msgid "To all users" +msgstr "Til alle brugere" + +#: ../src/roster_window.py:2654 +msgid "To all online users" +msgstr "Til alle brugere på net" + +#. Log Off +#: ../src/roster_window.py:2771 +msgid "_Log off" +msgstr "_Log af" + +#. Log on +#: ../src/roster_window.py:2777 +msgid "_Log on" +msgstr "_Log på" + +#. Send single message +#: ../src/roster_window.py:2789 +msgid "Send Single Message" +msgstr "Send Enkel Besked" + +#. Manage Transport submenu +#: ../src/roster_window.py:2836 +msgid "_Manage Transport" +msgstr "Hå_ndter Transport" + +#. Modify Transport +#: ../src/roster_window.py:2844 +msgid "_Modify Transport" +msgstr "_Modificer Transport" + +#: ../src/roster_window.py:2958 ../src/roster_window.py:3032 +msgid "_Change Status Message" +msgstr "_Ændre Status Besked" + +#: ../src/roster_window.py:3104 +msgid "Authorization has been sent" +msgstr "Godkendelse er blevet sendt" + +#: ../src/roster_window.py:3105 +#, python-format +msgid "Now \"%s\" will know your status." +msgstr "Nu vil %s vide din status." + +#: ../src/roster_window.py:3125 +msgid "Subscription request has been sent" +msgstr "Forespørgsel på abonnering er blevet sendt" + +#: ../src/roster_window.py:3126 +#, 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:3138 +msgid "Authorization has been removed" +msgstr "Godkendelse er blevet fjernet" + +#: ../src/roster_window.py:3139 +#, python-format +msgid "Now \"%s\" will always see you as offline." +msgstr "Nu vil %s altid se dig som offline." + +#: ../src/roster_window.py:3337 +#, python-format +msgid "Contact \"%s\" will be removed from your roster" +msgstr "Kontakt %s vil blive fjernet fra dit kontaktvindue" + +#: ../src/roster_window.py:3341 +msgid "" +"By removing this contact you also remove authorization resulting in him or " +"her always seeing you as offline." +msgstr "" +"Ved at fjerne denne kontakt fjerner du også godkendelsen, så han eller hun " +"vil altid se dig som offline." + +#: ../src/roster_window.py:3346 +msgid "" +"By removing this contact you also by default remove authorization resulting " +"in him or her always seeing you as offline." +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:3349 +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:3353 +msgid "Contacts will be removed from your roster" +msgstr "Kontakter vil blive fjernet fra dit kontaktvindue" + +#: ../src/roster_window.py:3357 +#, python-format +msgid "" +"By removing these contacts:%s\n" +"you also remove authorization resulting in them always seeing you as offline." +msgstr "" +"Ved at fjerne disse kontakter:%s\n" +"fjerner du også godkendelsen, hvilket medfører at de altid vil se dig som " +"offline." + +#: ../src/roster_window.py:3389 +msgid "" +"Gnome Keyring is installed but not correctly started (environment variable " +"probably not correctly set)" +msgstr "Gnomes Nøglering er installeret men ikke startet korrekt (miljøvariabel er sandsynligvis ikke sat op rigtig)" + +#: ../src/roster_window.py:3416 +msgid "GPG is not usable" +msgstr "GPG er ikke brugbar" + +#. %s is the account name here +#: ../src/roster_window.py:3416 ../src/common/connection.py:684 +#: ../src/common/zeroconf/connection_zeroconf.py:165 +#, python-format +msgid "You will be connected to %s without OpenPGP." +msgstr "Du vil blive tilsluttet til %s uden OpenPGP." + +#: ../src/roster_window.py:3433 +msgid "Passphrase Required" +msgstr "Adgangskode Påkrævet" + +#: ../src/roster_window.py:3434 +#, python-format +msgid "Enter GPG key passphrase for account %s." +msgstr "Indtast adgangskoden til GPG nøglen for konto %s." + +#: ../src/roster_window.py:3439 +msgid "Save passphrase" +msgstr "Gem adgangskode" + +#: ../src/roster_window.py:3447 +msgid "Wrong Passphrase" +msgstr "Forkert Adgangskode" + +#: ../src/roster_window.py:3448 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "Indtast din GPG adgangskode igen eller annuller." + +#: ../src/roster_window.py:3531 ../src/roster_window.py:3608 +msgid "You are participating in one or more group chats" +msgstr "Du deltager i en eller flere gruppesamtaler" + +#: ../src/roster_window.py:3532 ../src/roster_window.py:3609 +msgid "" +"Changing your status to invisible will result in disconnection from those " +"group chats. Are you sure you want to go invisible?" +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:3566 +msgid "No account available" +msgstr "Ingen konto tilgængelig" + +#: ../src/roster_window.py:3567 +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:3695 +#, python-format +msgid "\"%(title)s\" by %(artist)s" +msgstr "\"%(title)s\" by %(artist)s" + +#: ../src/roster_window.py:4150 ../src/roster_window.py:4157 +msgid "" +"Messages will only be available for reading them later if you have history " +"enabled." +msgstr "Beskeder vil kun kunne læses senere hvis du har aktiveret historik." + +#: ../src/roster_window.py:4781 +msgid "Metacontacts storage not supported by your server" +msgstr "Metakontakt lagring er ikke understøttet af din server" + +#: ../src/roster_window.py:4783 +msgid "" +"Your server does not support storing metacontacts information. So those " +"information will not be save on next reconnection." +msgstr "" +"Din server understøtter ikke muligheden for at gemme metakontakt " +"information. Så denne information vil ikke blive gemt til næste gang du " +"tilslutter dig." + +#: ../src/roster_window.py:4829 +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:4831 +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 "" +"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:4929 +#, python-format +msgid "Do you want to send that file to %s:" +msgid_plural "Do you want to send those 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:5211 +msgid "Change Status Message..." +msgstr "Ændre Status Besked..." + +#: ../src/search_window.py:86 +msgid "Waiting for results" +msgstr "Venter på resultater" + +#: ../src/search_window.py:126 ../src/search_window.py:199 +msgid "Error in received dataform" +msgstr "Fejl i modtaget dataform" + +#: ../src/search_window.py:160 +msgid "No result" +msgstr "Intet resultat" + +#: ../src/systray.py:164 +msgid "_Change Status Message..." +msgstr "_Ændre Status Besked..." + +#: ../src/systray.py:249 +msgid "Hide this menu" +msgstr "Skjul denne menu" + +#: ../src/tooltips.py:310 ../src/tooltips.py:503 +msgid "Jabber ID: " +msgstr "Jabber ID: " + +#: ../src/tooltips.py:313 ../src/tooltips.py:507 +msgid "Resource: " +msgstr "Ressource: " + +#: ../src/tooltips.py:318 +#, 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:416 +msgid " [blocked]" +msgstr " [blokeret]" + +#: ../src/tooltips.py:420 +msgid " [minimized]" +msgstr " [minimeret]" + +#: ../src/tooltips.py:435 ../src/tooltips.py:623 +msgid "Status: " +msgstr "Status: " + +#: ../src/tooltips.py:465 +#, python-format +msgid "Last status: %s" +msgstr "Sidste status: %s" + +#: ../src/tooltips.py:467 +#, python-format +msgid " since %s" +msgstr " siden %s" + +#: ../src/tooltips.py:485 +msgid "Connected" +msgstr "Tilsluttet" + +#: ../src/tooltips.py:487 +msgid "Disconnected" +msgstr "Tilslutning afbrudt" + +#. ('both' is the normal sub so we don't show it) +#: ../src/tooltips.py:514 +msgid "Subscription: " +msgstr "Abonnering: " + +#: ../src/tooltips.py:524 +msgid "OpenPGP: " +msgstr "OpenPGP: " + +#: ../src/tooltips.py:579 +msgid "Download" +msgstr "Hent" + +#: ../src/tooltips.py:585 +msgid "Upload" +msgstr "Send" + +#: ../src/tooltips.py:592 +msgid "Type: " +msgstr "Type: " + +#: ../src/tooltips.py:598 +msgid "Transferred: " +msgstr "Overført: " + +#: ../src/tooltips.py:601 ../src/tooltips.py:622 +msgid "Not started" +msgstr "Ikke startet" + +#: ../src/tooltips.py:605 +msgid "Stopped" +msgstr "Stoppet" + +#: ../src/tooltips.py:607 ../src/tooltips.py:610 +msgid "Completed" +msgstr "Fuldført" + +#: ../src/tooltips.py:614 +msgid "?transfer status:Paused" +msgstr "?transfer status:Midlertidig stoppet" + +#. stalled is not paused. it is like 'frozen' it stopped alone +#: ../src/tooltips.py:618 +msgid "Stalled" +msgstr "Hænger" + +#: ../src/tooltips.py:620 +msgid "Transferring" +msgstr "Overfører" + +#: ../src/tooltips.py:652 +msgid "This service has not yet responded with detailed information" +msgstr "Denne tjeneste har endnu ikke svaret med detaljeret information" + +#: ../src/tooltips.py:655 +msgid "" +"This service could not respond with detailed information.\n" +"It is most likely legacy or broken" +msgstr "" +"Denne tjeneste kunne ikke svare med detaljeret information.\n" +"Den er højst sandsynlig ikke fungerende" + +#: ../src/vcard.py:240 +msgid "?Client:Unknown" +msgstr "?Client:Ukendt" + +#: ../src/vcard.py:242 +msgid "?OS:Unknown" +msgstr "?OS:Ukendt" + +#: ../src/vcard.py:267 ../src/vcard.py:277 ../src/vcard.py:467 +#, python-format +msgid "since %s" +msgstr "siden %s" + +#: ../src/vcard.py:306 +msgid "Affiliation:" +msgstr "Tilknytning:" + +#: ../src/vcard.py:314 +msgid "" +"This contact is interested in your presence information, but you are not " +"interested in his/her presence" +msgstr "" +"Denne kontakt er interesseret i din tilstedeværelses information, men du er " +"ikke interesseret i hans/hendes tilstedeværelse" + +#: ../src/vcard.py:316 +msgid "" +"You are interested in the contact's presence information, but he/she is not " +"interested in yours" +msgstr "" +"Du er interesseret i kontaktens tilstedeværelses information, men han/hun er " +"ikke interesseret i din" + +#: ../src/vcard.py:318 +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:320 +msgid "" +"You are not interested in the contact's presence, and neither he/she is " +"interested in yours" +msgstr "" +"Du er ikke interesseret i kontaktens tilstedeværelse, og han/hun er ikke " +"interesseret i din" + +#: ../src/vcard.py:328 +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:332 ../src/vcard.py:369 ../src/vcard.py:492 +msgid " resource with priority " +msgstr " ressource med prioritet " + +#: ../src/common/check_paths.py:33 +msgid "creating logs database" +msgstr "opretter log database" + +#: ../src/common/check_paths.py:96 ../src/common/check_paths.py:107 +#: ../src/common/check_paths.py:114 +#, python-format +msgid "%s is a file but it should be a directory" +msgstr "%s er en fil, men burde være et katalog" + +#: ../src/common/check_paths.py:97 ../src/common/check_paths.py:108 +#: ../src/common/check_paths.py:115 ../src/common/check_paths.py:123 +msgid "Gajim will now exit" +msgstr "Gajim vil nu slutte" + +#: ../src/common/check_paths.py:122 +#, python-format +msgid "%s is a directory but should be a file" +msgstr "%s er et katalog men burde være en fil" + +#: ../src/common/check_paths.py:138 +#, python-format +msgid "creating %s directory" +msgstr "opretter %s katalog" + +#: ../src/common/commands.py:69 +msgid "Change status information" +msgstr "Ændre status information" + +#: ../src/common/commands.py:82 +msgid "Change status" +msgstr "Ændre status" + +#: ../src/common/commands.py:83 +msgid "Set the presence type and description" +msgstr "Sæt tilstedeværelses type og beskrivelse" + +#: ../src/common/commands.py:89 +msgid "Free for chat" +msgstr "Åben for samtaler" + +#: ../src/common/commands.py:90 +msgid "Online" +msgstr "Online" + +#: ../src/common/commands.py:92 +msgid "Extended away" +msgstr "Udvidet borte" + +#: ../src/common/commands.py:93 +msgid "Do not disturb" +msgstr "Forstyr ikke" + +#: ../src/common/commands.py:94 +msgid "Offline - disconnect" +msgstr "Ofline - ikke tilsluttet" + +#: ../src/common/commands.py:99 +msgid "Presence description:" +msgstr "Tilstedeværelses beskrivelse:" + +#: ../src/common/commands.py:134 +msgid "The status has been changed." +msgstr "Din status er blevet ændret." + +#: ../src/common/commands.py:179 +#, python-format +msgid "%(nickname)s on %(room_jid)s" +msgstr "%(nickname)s i %(room_jid)s" + +#: ../src/common/commands.py:183 +msgid "You have not joined a groupchat." +msgstr "Du detlager ikke i en gruppesamtale." + +#: ../src/common/commands.py:189 +msgid "Leave Groupchats" +msgstr "Forlad Gruppesamtaler" + +#: ../src/common/commands.py:190 +msgid "Choose the groupchats you want to leave" +msgstr "Vælg de gruppesamtaler du vil forlade" + +#: ../src/common/commands.py:230 +msgid "You left the following groupchats:" +msgstr "Du forlod de følgende gruppesamtaler:" + +#: ../src/common/commands.py:242 +msgid "Forward unread messages" +msgstr "Videresend ulæste beskeder" + +#: ../src/common/commands.py:262 +msgid "All unread messages have been forwarded." +msgstr "Alle ulæste beskeder er blevet videresendt." + +#: ../src/common/config.py:58 +msgid "Use D-Bus and Notification-Daemon to show notifications" +msgstr "Brug D-Bus og Påmindelses-dæmonen (Notification-Daemon) til at vise påmindelser" + +#: ../src/common/config.py:63 +msgid "Time in minutes, after which your status changes to away." +msgstr "Tid i minutter før din status ændres til borte." + +#: ../src/common/config.py:64 +msgid "Away as a result of being idle" +msgstr "Borte som et resultat af tomgang" + +#: ../src/common/config.py:66 +msgid "Time in minutes, after which your status changes to not available." +msgstr "Tid i minutter før din status ændres til ikke tilgængelig." + +#: ../src/common/config.py:67 +msgid "Not available as a result of being idle" +msgstr "Ikke tilgængelig som et resultat af tomgang" + +#: ../src/common/config.py:85 +msgid "" +"List (space separated) of rows (accounts and groups) that are collapsed." +msgstr "" +"Liste (separeret med mellemrum) af rækker (kontoer og grupper) som er " +"kollapset." + +#: ../src/common/config.py:90 +msgid "Enable link-local/zeroconf messaging" +msgstr "Aktiver link-local/zeroconf beskeder" + +#: ../src/common/config.py:93 +msgid "Language used by speller" +msgstr "Sprog brugt af stavelseskontrollen" + +#: ../src/common/config.py:94 +msgid "" +"'always' - print time for every message.\n" +"'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" +"'never' - never print time." +msgstr "" +"'altid' - skriv tid for hver besked.\n" +"'nogen ganger' - skriv tid for hver print_ichat_every_foo_minutes minutter.\n" +"'aldrig' - skriv aldrig tiden." + +#: ../src/common/config.py:95 +msgid "" +"Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " +"to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " +"This is used only if print_time is 'sometimes'." +msgstr "" +"Print tiden i samtaler med en upræcis klokke. Værdien for hvor upræcis " +"klokken skal være kan rangere fra 1 til 4, eller 0 for at deaktivere den " +"upræcise klokke. 1 er den mest præcise klokke, 4 den mindst præcise. Dette " +"bruges kun hvis print_time er 'nogen ganger'." + +#: ../src/common/config.py:98 +msgid "Treat * / _ pairs as possible formatting characters." +msgstr "Behandle * / _ par som mulige formaterings tegn." + +#: ../src/common/config.py:99 +msgid "" +"If True, do not remove */_ . So *abc* will be bold but with * * not removed." +msgstr "" +"Hvis sandt, ikke fjern */_. Således at *abc* bliver skrevet med fed skrift " +"men * * bliver ikke fjernet." + +#: ../src/common/config.py:102 +msgid "" +"Uses ReStructured text markup to send HTML, plus ascii formatting if " +"selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" +"restructuredtext.html (If you want to use this, install docutils)" +msgstr "" +"Bruger ReStruktureret tekst redigering til at sende HTML, plus ascii " +"formatering hvis valgt. For syntaks, se http://docutils.sourceforge.net/docs/" +"ref/rst/restructuredtext.html (Hvis du vil bruge dette, installer docutils)" + +#: ../src/common/config.py:111 +msgid "" +"Character to add after nickname when using nick completion (tab) in group " +"chat." +msgstr "" +"Tegn som tilføjes efter kælenavn når der bruges kælenavnsfuldførelse (tab) i " +"en gruppesamtale." + +#: ../src/common/config.py:112 +msgid "" +"Character to propose to add after desired nickname when desired nickname is " +"used by someone else in group chat." +msgstr "" +"Tegnforslag til at tilføje efter det ønskede kælenavn, når det ønskede " +"kælenavn er i brug af en anden i gruppesamtalen." + +#: ../src/common/config.py:135 +msgid "" +"This option let you customize timestamp that is printed in conversation. For " +"exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " +"strftime for full documentation: http://docs.python.org/lib/module-time.html" +msgstr "" +"Denne valgmulighed giver dig muligheden for at tilpasse hvordan " +"klokkeslettet bliver skrevet i en samtale. For eksempel [%H:%M] vil vise " +"[timer:minutter]. Se python dokumentationen for strftime: http://docs.python." +"org/lib/module-time.html" + +#: ../src/common/config.py:136 +msgid "Characters that are printed before the nickname in conversations" +msgstr "Tegn som bliver skrevet før kælenavnet i samtaler" + +#: ../src/common/config.py:137 +msgid "Characters that are printed after the nickname in conversations" +msgstr "Tegn som bliver skrevet efter kælenavnet i samtaler" + +#: ../src/common/config.py:144 +msgid "Add * and [n] in roster title?" +msgstr "Tilføj * og [n] i tittelen på kontaktvinduet?" + +#: ../src/common/config.py:145 +msgid "" +"How many lines to remember from previous conversation when a chat tab/window " +"is reopened." +msgstr "Hvor mange linjer skal huskes fra forrige samtale når et samtale vindue/faneblad genåbnes." + +#: ../src/common/config.py:146 +msgid "How many minutes should last lines from previous conversation last." +msgstr "Hvor mange minutter skal sidste linjer fra forrige samtale vare." + +#: ../src/common/config.py:147 +msgid "" +"Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " +"Client default behaviour)." +msgstr "" +"Send besked med Ctrl+Enter og lave en ny linie med Enter (standard Mirabilis " +"ICQ klient adfærd)." + +#: ../src/common/config.py:149 +msgid "How many lines to store for Ctrl+KeyUP." +msgstr "Hvor mange linjer skal gemmes for Ctrl+KeyUP." + +#: ../src/common/config.py:152 +#, python-format +msgid "" +"Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' " +"which means use wiktionary." +msgstr "" +"Enten en tilpasset url som indeholder %s hvor %s er ordet/frasen, eller " +"'WIKTIONARY' som betyder brug wiktionary." + +#: ../src/common/config.py:155 +msgid "If checked, Gajim can be controlled remotely using gajim-remote." +msgstr "" +"Hvis valgt kan Gajim blive kontrolleret eksternt ved hjælp af gajim-remote." + +#: ../src/common/config.py:156 +msgid "" +"If True, listen to D-Bus signals from NetworkManager and change the status " +"of accounts (provided they do not have listen_to_network_manager set to " +"False and they sync with global status) based upon the status of the network " +"connection." +msgstr "" +"Hvis Sandt, lyt til D-Bus signaler fra NetworkManager og ændre status på " +"kontoer (forudsat at de ikke har listen_to_network_manager sat til Falsk og " +"de synkroniserer med global status) baseret på status af " +"netværksforbindelsen." + +#: ../src/common/config.py:157 +msgid "" +"Sent chat state notifications. Can be one of all, composing_only, disabled." +msgstr "" +"Send samtale status påmindelser. Kan være en af disse: all, composing_only, " +"disabled." + +#: ../src/common/config.py:158 +msgid "" +"Displayed chat state notifications in chat windows. Can be one of all, " +"composing_only, disabled." +msgstr "" +"Vis samtale status påmindelser i samtale vinduer. Kan være en af disse: all, " +"composing_only, disabled." + +#: ../src/common/config.py:160 +msgid "" +"When not printing time for every message (print_time==sometimes), print it " +"every x minutes." +msgstr "" +"Når der ikke skrives tid for hver besked (print_time==sometimes), skriv " +"tiden for hver x minutter." + +#: ../src/common/config.py:161 +msgid "Ask before closing a group chat tab/window." +msgstr "Spørg før et gruppesamtale vindue/faneblad lukkes." + +#: ../src/common/config.py:162 +msgid "" +"Always ask before closing group chat tab/window in this space separated list " +"of group chat jids." +msgstr "" +"Altid spørg før et gruppesamtale vindue/faneblad lukkes, hvis den findes i " +"denne mellemrums separerede liste af gruppesamtale jids." + +#: ../src/common/config.py:163 +msgid "" +"Never ask before closing group chat tab/window in this space separated list " +"of group chat jids." +msgstr "" +"Aldrig spørg før et gruppesamtale vindue/faneblad lukkes, hvis den findes i " +"denne mellemrums separerede liste af gruppesamtale jids." + +#: ../src/common/config.py:166 +msgid "" +"Comma separated list of hosts that we send, in addition of local interfaces, " +"for File Transfer in case of address translation/port forwarding." +msgstr "Komma separeret liste af værter som vi sender, i tillæg til lokale grænseflader, for filoverførsler i tilfælde af adresse omskrivning/port videresending." + +#: ../src/common/config.py:168 +msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." +msgstr "IEC standard siger KiB = 1024 byte, KB = 1000 byte." + +#: ../src/common/config.py:170 +msgid "Notify of events in the system trayicon." +msgstr "Vis påmindelse af hændelser i statusfelt ikonet." + +#: ../src/common/config.py:176 +msgid "Show tab when only one conversation?" +msgstr "Vis et faneblad når der kun er en samtale?" + +#: ../src/common/config.py:177 +msgid "Show tabbed notebook border in chat windows?" +msgstr "Vis faneblade i samtalevinduer?" + +#: ../src/common/config.py:178 +msgid "Show close button in tab?" +msgstr "Vis lukke knap i faneblad?" + +#: ../src/common/config.py:179 +msgid "" +"When negotiating an encrypted session, should Gajim assume you want your " +"messages to be logged?" +msgstr "Ved forhandling af en krypteret session, skal Gajim da antage at du vil have dine beskeder logget?" + +#: ../src/common/config.py:188 +msgid "Preview new messages in notification popup?" +msgstr "Forhåndsvis nye beskeder i et påmindelses pop op vinduer?" + +#: ../src/common/config.py:193 +msgid "" +"A semicolon-separated list of words that will be highlighted in group chats." +msgstr "" +"En semikolon-separeret liste af ord som vil blive fremhævet i gruppesamtaler." + +#: ../src/common/config.py:194 +msgid "" +"If True, quits Gajim when X button of Window Manager is clicked. This " +"setting is taken into account only if trayicon is used." +msgstr "Hvis Sandt, lukker Gajim når X knappen fra vindueshåndteringen klikkes. Denne indstilling tages der kun hensyn til hvis et statusfelt ikon bruges." + +#: ../src/common/config.py:195 +msgid "" +"If True, Gajim will check if it's the default jabber client on each startup." +msgstr "" +"Hvis Sandt, vil Gajim kontrollere om den er standard jabber klient ved hver " +"opstart." + +#: ../src/common/config.py:196 +msgid "" +"If True, Gajim will display an icon on each tab containing unread messages. " +"Depending on the theme, this icon may be animated." +msgstr "" +"Hvis Sandt, vil Gajim vise et ikon på hvert faneblad som indeholder ulæste " +"beskeder. Afhængig af temaet, kan dette ikon være animeret." + +#: ../src/common/config.py:197 +msgid "" +"If True, Gajim will display the status message, if not empty, for every " +"contact under the contact name in roster window." +msgstr "" +"Hvis Sandt, vil Gajim vise status beskeder, hvis ikke tomme, for hver " +"kontakt under kontaktnavnet i kontaktvinduet." + +#: ../src/common/config.py:199 +msgid "" +"If True, Gajim will ask for avatar each contact that did not have an avatar " +"last time or has one cached that is too old." +msgstr "" +"Hvis Sandt, vil Gajim spørge for en avatar for hver kontakt som ikke havde " +"en avatar sidste gang eller har en gemt som er for gammel." + +#: ../src/common/config.py:200 +msgid "" +"If False, Gajim will no longer print status line in chats when a contact " +"changes his or her status and/or his or her status message." +msgstr "Hvis Falsk, vil Gajim ikke længere skrive statuslinjer i samtaler når en kontakt ændrer hans eller hendes status og/eller hans eller hendes status besked." + +#: ../src/common/config.py:201 +msgid "" +"can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " +"longer print status line in groupchats when a member changes his or her " +"status and/or his or her status message. If \"all\" Gajim will print all " +"status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " +"group chat." +msgstr "" +"kan være \"none\", \"all\" eller \"in_and_out\". Hvis \"nono\" vil Gajim " +"ikke længere skrive statuslinier i gruppesamtaler når et medlem ændrer hans " +"eller hendes status og/eller hans eller hendes status besked. Hvis \"all\" " +"vil Gajim skrive alle status beskeder. Hvis \"in_and_out\" vil Gajim kun " +"skrive FOO kommer/forlader gruppesamtalen." + +#: ../src/common/config.py:203 +msgid "Background color of contacts when they just signed in." +msgstr "Baggrundsfarve på kontakter når de netop har tilsluttet sig." + +#: ../src/common/config.py:204 +msgid "Background color of contacts when they just signed out." +msgstr "Baggrundsfarve på kontakter når de netop har afbrudt tilslutningen." + +#: ../src/common/config.py:206 +msgid "" +"If True, restored messages will use a smaller font than the default one." +msgstr "" +"Hvis Sandt vil gamle beskeder fra forrige samtale bruge en mindre skrifttype " +"end den som er standard." + +#: ../src/common/config.py:207 +msgid "Don't show avatar for the transport itself." +msgstr "Ikke vis en avatar for selve transporten." + +#: ../src/common/config.py:208 +msgid "Don't show roster in the system taskbar." +msgstr "Ikke hvis kontaktvindue i vindueslisten." + +#: ../src/common/config.py:209 +msgid "" +"If True and installed GTK+ and PyGTK versions are at least 2.8, make the " +"window flash (the default behaviour in most Window Managers) when holding " +"pending events." +msgstr "Hvis Sandt og GTK+ og PyGTK installerede versioner er mindst 2.8, blink med vinduet (standard adfærd i de fleste vindueshåndterere) når det indeholder ventende begivenheder." + +#: ../src/common/config.py:211 +msgid "" +"Jabberd1.4 does not like sha info when one join a password protected group " +"chat. Turn this option to False to stop sending sha info in group chat " +"presences." +msgstr "" +"Jabberd1.4 kan ikke lide sha information når man deltager i en adgangskode " +"beskyttet gruppesamtale. Sæt dette valg til Falsk for at stoppe med at sende " +"sha information i gruppesamtaler." + +#. always, never, peracct, pertype should not be translated +#: ../src/common/config.py:214 +msgid "" +"Controls the window where new messages are placed.\n" +"'always' - All messages are sent to a single window.\n" +"'never' - All messages get their own window.\n" +"'peracct' - Messages for each account are sent to a specific window.\n" +"'pertype' - Each message type (e.g., chats vs. groupchats) are sent to a " +"specific window. Note, changing this option requires restarting Gajim before " +"the changes will take effect." +msgstr "" +"Kontrollerer vinduet hvor nye beskeder er placeret.\n" +"'always' - Alle beskeder bliver vist i et enkelt vindue.\n" +"'never' - Alle beskeder får deres eget vindue.\n" +"'peracct' - Beskeder for den enkelte konto bliver sendt til specifikke " +"vinduer.\n" +"'pertype' - Hver besked type (for eks. samtaler versus gruppesamtaler) " +"bliver sendt til et specifikt vindue. Note, ved ændring af denne indstilling " +"kræves en genstart af Gajim før ændringen tager effekt." + +#: ../src/common/config.py:215 +msgid "If False, you will no longer see the avatar in the chat window." +msgstr "Hvis Falsk vil du ikke længere se en avatar i samtale vinduet." + +#: ../src/common/config.py:216 +msgid "If True, pressing the escape key closes a tab/window." +msgstr "Hvis Sandt vil tryk på escape tasten lukke et vindue/faneblad." + +#: ../src/common/config.py:217 +msgid "Hides the buttons in chat windows." +msgstr "Skjuler knapperne i samtale vinduer." + +#: ../src/common/config.py:218 +msgid "Hides the banner in a group chat window" +msgstr "Skjuler banneret i et gruppesamtale vindue" + +#: ../src/common/config.py:219 +msgid "Hides the banner in two persons chat window" +msgstr "Skjuler banneret i et to personers samtalevindue" + +#: ../src/common/config.py:220 +msgid "Hides the group chat occupants list in group chat window." +msgstr "Skjuler gruppesamtale deltagerlisten i gruppesamtale vinduer." + +#: ../src/common/config.py:221 +msgid "" +"In a chat, show the nickname at the beginning of a line only when it's not " +"the same person talking than in previous message." +msgstr "" +"I en samtale, vis kælenavn i begyndelsen af en linie kun når det ikke er den " +"samme person som snakker som i forrige besked." + +#: ../src/common/config.py:222 +msgid "Indentation when using merge consecutive nickname." +msgstr "Indrykning når man fletter ens kælenavne." + +#: ../src/common/config.py:223 +msgid "Smooth scroll message in conversation window" +msgstr "Udglattet rulning af beskeder i samtale vinduet" + +#: ../src/common/config.py:224 +msgid "List of colors that will be used to color nicknames in group chats." +msgstr "" +"Liste af farver som vil blive brugt til at farve kælenavne i gruppesamtaler." + +#: ../src/common/config.py:225 +msgid "Ctrl-Tab go to next composing tab when none is unread." +msgstr "Ctrl-Tab gå til næste faneblad når ingen er ulæste." + +#: ../src/common/config.py:226 +msgid "" +"Should we show the confirm metacontacts creation dialog or not? Empty string " +"means we never show the dialog." +msgstr "" +"Skal vi vise bekræftelses vinduet for oprettelse af metakontakter? Tom " +"streng betyder at vi aldrig viser vinduet." + +#: ../src/common/config.py:227 +msgid "" +"If True, you will be able to set a negative priority to your account in " +"account modification window. BE CAREFUL, when you are logged in with a " +"negative priority, you will NOT receive any message from your server." +msgstr "" +"Hvis Sandt vil du være i stand til at sætte en negativ prioritet til din " +"konto i kontoændrings vinduet. VÆR FORSIGTIG, når du er logget med en " +"negativ prioritet vil du IKKE modtage nogen beskeder fra din server." + +#: ../src/common/config.py:228 +msgid "" +"If True, Gajim will use Gnome Keyring (if available) to store account " +"passwords." +msgstr "" +"Hvis Sandt vil Gajim bruge Gnome Nøglering (hvis tilgængelig) til at gemme " +"konto adgangskoder." + +#: ../src/common/config.py:229 +msgid "" +"If True, Gajim will show number of online and total contacts in account and " +"group rows." +msgstr "" +"Hvis Sandt vil Gajim vise antallet af online og totale kontakter i konto og " +"gruppe rækker." + +#: ../src/common/config.py:230 +msgid "" +"Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " +"as if they were of this type" +msgstr "" +"Kan være tom, 'chat' eller 'normal'. Hvis ikke tom, behandl alle indkommende " +"beskeder som om de var af denne type" + +#: ../src/common/config.py:231 +msgid "" +"If True, Gajim will scroll and select the contact who sent you the last " +"message, if chat window is not already opened." +msgstr "" +"Hvis Sandt vil Gajim rulle ned/op og vælge den kontakt som sendte dig den " +"sidste besked, hvis ikke allerede kontaktvinduet er åbent." + +#: ../src/common/config.py:232 +msgid "" +"If True, Gajim will convert string between $$ and $$ to an image using dvips " +"and convert before insterting it in chat window." +msgstr "" +"Hvis Sandt vil Gajim omdanne strengen mellem $$ og $$ til et billede med " +"dvips og omdanne det inden det bliver sat ind i et samtale vindue." + +#: ../src/common/config.py:233 +msgid "Time of inactivity needed before the change status window closes down." +msgstr "Tid med inaktivitet der skal gå før vinduet til at ændre status lukkes." + +#: ../src/common/config.py:234 +msgid "" +"Maximum number of lines that are printed in conversations. Oldest lines are " +"cleared." +msgstr "Maksimum antal linjer som bliver skrevet i samtaler. De ældste linjer bliver slettet." + +#: ../src/common/config.py:245 +msgid "" +"Priority will change automatically according to your status. Priorities are " +"defined in autopriority_* options." +msgstr "" +"Prioriteten vil ændres automatisk ifølge din status. Prioriteter er " +"defineret i autopriority_* indstillingerne." + +#. yes, no, ask +#: ../src/common/config.py:275 +msgid "Jabberd2 workaround" +msgstr "Jabberd2 tilpasning" + +#: ../src/common/config.py:279 +msgid "" +"If checked, Gajim will use your IP and proxies defined in " +"file_transfer_proxies option for file transfer." +msgstr "" +"Hvis valgt vil Gajim bruge din IP og proxy defineret i file_transfer_proxies " +"indstillingen for filoverførsler." + +#: ../src/common/config.py:338 +msgid "Is OpenPGP enabled for this contact?" +msgstr "Er OpenPGP aktiveret for denne kontakt?" + +#: ../src/common/config.py:339 ../src/common/config.py:342 +msgid "Language for which we want to check misspelled words" +msgstr "Sprog som vi vil bruge til at kontrollere for stavefejl" + +#: ../src/common/config.py:348 +msgid "all or space separated status" +msgstr "alt eller mellemrums separeret status" + +#: ../src/common/config.py:349 +msgid "'yes', 'no', or 'both'" +msgstr "'ja', 'nej', eller 'begge'" + +#: ../src/common/config.py:350 ../src/common/config.py:352 +#: ../src/common/config.py:353 ../src/common/config.py:356 +#: ../src/common/config.py:357 +msgid "'yes', 'no' or ''" +msgstr "'ja', 'nej' eller ''" + +#: ../src/common/config.py:363 +msgid "Sleeping" +msgstr "Sover" + +#: ../src/common/config.py:364 +msgid "Back soon" +msgstr "Snart tilbage" + +#: ../src/common/config.py:364 +msgid "Back in some minutes." +msgstr "Tilbage om få minutter." + +#: ../src/common/config.py:365 +msgid "Eating" +msgstr "Spiser" + +#: ../src/common/config.py:365 +msgid "I'm eating, so leave me a message." +msgstr "Jeg spiser, så læg en besked." + +#: ../src/common/config.py:366 +msgid "Movie" +msgstr "Film" + +#: ../src/common/config.py:366 +msgid "I'm watching a movie." +msgstr "Jeg ser en film." + +#: ../src/common/config.py:367 +msgid "Working" +msgstr "Arbejder" + +#: ../src/common/config.py:367 +msgid "I'm working." +msgstr "Jeg arbejder." + +#: ../src/common/config.py:368 +msgid "Phone" +msgstr "Telefon" + +#: ../src/common/config.py:368 +msgid "I'm on the phone." +msgstr "Jeg snakker i telefon." + +#: ../src/common/config.py:369 +msgid "Out" +msgstr "Ude" + +#: ../src/common/config.py:369 +msgid "I'm out enjoying life." +msgstr "Jeg er ude og nyder livet." + +#: ../src/common/config.py:373 +msgid "I'm available." +msgstr "Jeg er tilgængelig." + +#: ../src/common/config.py:374 +msgid "I'm free for chat." +msgstr "Jeg er tilgængelig for en samtale." + +#: ../src/common/config.py:376 +msgid "I'm not available." +msgstr "Jeg er ikke tilgængelig." + +#: ../src/common/config.py:377 +msgid "Do not disturb." +msgstr "Ikke forstyr." + +#: ../src/common/config.py:378 ../src/common/config.py:379 +msgid "Bye!" +msgstr "Farvel!" + +#: ../src/common/config.py:388 +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 "" +"Lyd som spilles når en gruppesamtale besked indeholder en af følgende ord i " +"muc_highlight_words, eller når en gruppesamtale besked indeholder dit " +"kælenavn." + +#: ../src/common/config.py:389 +msgid "Sound to play when any MUC message arrives." +msgstr "Lyd som spilles når en hvilken som helst MUC besked ankommer." + +#: ../src/common/config.py:398 ../src/common/optparser.py:208 +msgid "green" +msgstr "grøn" + +#: ../src/common/config.py:402 ../src/common/optparser.py:194 +msgid "grocery" +msgstr "købmandsvarer" + +#: ../src/common/config.py:406 +msgid "human" +msgstr "menneske" + +#: ../src/common/config.py:410 +msgid "marine" +msgstr "marint" + +#: ../src/common/connection_handlers.py:56 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:44 +msgid "Unable to load idle module" +msgstr "Ikke i stand til at indlæse tomgangs modulet" + +#: ../src/common/connection_handlers.py:184 +#: ../src/common/connection_handlers.py:219 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 +msgid "Wrong host" +msgstr "Forkert vært" + +#: ../src/common/connection_handlers.py:184 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 +#, python-format +msgid "" +"The host %s you configured as the ft_add_hosts_to_send advanced option is " +"not valid, so ignored." +msgstr "" +"Værten %s du konfigurerte i ft_add_hosts_to_send avancerte indstillinger er " +"ikke gyldig, så den bliver ignoreret." + +#: ../src/common/connection_handlers.py:220 +msgid "Invalid local address? :-O" +msgstr "Invalid local address? :-O" + +#: ../src/common/connection_handlers.py:612 +#, python-format +msgid "Registration information for transport %s has not arrived in time" +msgstr "Registrerings information for transporten %s har ikke ankommet i tide" + +#: ../src/common/connection_handlers.py:1776 +#, python-format +msgid "Nickname not allowed: %s" +msgstr "Kælenavn er ikke tilladt: %s" + +#. we are banned +#. group chat does not exist +#: ../src/common/connection_handlers.py:1846 +#: ../src/common/connection_handlers.py:1849 +#: ../src/common/connection_handlers.py:1852 +#: ../src/common/connection_handlers.py:1855 +#: ../src/common/connection_handlers.py:1859 +#: ../src/common/connection_handlers.py:1868 +msgid "Unable to join group chat" +msgstr "Ikke i stand til at deltage i gruppesamtale." + +#: ../src/common/connection_handlers.py:1847 +#, python-format +msgid "You are banned from group chat %s." +msgstr "Du er bandlyst fra gruppesamtalen %s." + +#: ../src/common/connection_handlers.py:1850 +#, python-format +msgid "Group chat %s does not exist." +msgstr "Gruppesamtalen %s eksisterer ikke." + +#: ../src/common/connection_handlers.py:1853 +msgid "Group chat creation is restricted." +msgstr "Gruppesamtale oprettelse er begrænset." + +#: ../src/common/connection_handlers.py:1856 +#, python-format +msgid "Your registered nickname must be used in group chat %s." +msgstr "Dit registrerede kælenavn skal bruges i gruppesamtalen %s." + +#: ../src/common/connection_handlers.py:1860 +#, python-format +msgid "You are not in the members list in groupchat %s." +msgstr "Du er ikke i medlemslisten for gruppesamtalen %s." + +#: ../src/common/connection_handlers.py:1869 +#, 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:" + +#. Room has been destroyed. see +#. http://www.xmpp.org/extensions/xep-0045.html#destroyroom +#: ../src/common/connection_handlers.py:1900 +msgid "Room has been destroyed" +msgstr "Rummet er blevet ødelagt" + +#: ../src/common/connection_handlers.py:1907 +#, python-format +msgid "You can join this room instead: %s" +msgstr "Du kan deltage i dette rum i stedet: %s" + +#: ../src/common/connection_handlers.py:1934 +msgid "I would like to add you to my roster." +msgstr "Jeg vil gerne tilføje dig til min kontaktliste." + +#. BE CAREFUL: no con.updateRosterItem() in a callback +#: ../src/common/connection_handlers.py:1955 +#, python-format +msgid "we are now subscribed to %s" +msgstr "vi abonnerer nu på %s" + +#: ../src/common/connection_handlers.py:1957 +#, python-format +msgid "unsubscribe request from %s" +msgstr "forespørsel om ophør på abonnement fra %s" + +#: ../src/common/connection_handlers.py:1959 +#, python-format +msgid "we are now unsubscribed from %s" +msgstr "nu abonnerer vi ikke længere på %s" + +#: ../src/common/connection_handlers.py:2081 +#, python-format +msgid "" +"JID %s is not RFC compliant. It will not be added to your roster. Use roster " +"management tools such as http://jru.jabberstudio.org/ to remove it" +msgstr "" +"JID %s er ikke RFC føjelig. Den vil ikke blive tilføjet til dit " +"kontaktvindue. Brug kontaktvindue håndterings redskaber som http://jru." +"jabberstudio.org/ til at fjerne det." + +#: ../src/common/connection.py:244 +#: ../src/common/zeroconf/connection_zeroconf.py:203 +#, python-format +msgid "Connection with account \"%s\" has been lost" +msgstr "Tilslutning til konto \"%s\" er blevet afbrudt" + +#: ../src/common/connection.py:245 +msgid "Reconnect manually." +msgstr "Tilslut manuelt." + +#: ../src/common/connection.py:256 +#, python-format +msgid "Server %s answered wrongly to register request: %s" +msgstr "Server %s svarede forkert på indskrivnings forespørgslen: %s" + +#. wrong answer +#: ../src/common/connection.py:264 +msgid "Invalid answer" +msgstr "Forkert svar" + +#: ../src/common/connection.py:265 +#, python-format +msgid "Transport %s answered wrongly to register request: %s" +msgstr "Transport %s svarede forkert på indskrivnings forespørgslen: %s" + +#: ../src/common/connection.py:411 +msgid "Connection to proxy failed" +msgstr "Tilslutning til proxy fejlede" + +#: ../src/common/connection.py:465 ../src/common/connection.py:511 +#: ../src/common/connection.py:1067 +#: ../src/common/zeroconf/connection_zeroconf.py:237 +#, python-format +msgid "Could not connect to \"%s\"" +msgstr "Kunne ikke tilslutte til \"%s\"" + +#: ../src/common/connection.py:479 +#, python-format +msgid "Connected to server %s:%s with %s" +msgstr "Tilsluttet til server %s:%s med %s" + +#: ../src/common/connection.py:512 +msgid "Check your connection or try again later" +msgstr "Kontroller din tilslutning eller prøv igen senere" + +#: ../src/common/connection.py:537 +#, python-format +msgid "Authentication failed with \"%s\"" +msgstr "Godkendelse fejlede med \"%s\"" + +#: ../src/common/connection.py:538 +msgid "Please check your login and password for correctness." +msgstr "Venligst kontroller om dit logind og adgangskode er korrekt." + +#: ../src/common/connection.py:581 +msgid "Error while removing privacy list" +msgstr "Fejl under fjernelse af privatlivs liste" + +#: ../src/common/connection.py:582 +#, 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 "Privatlivs liste %s er ikke blevet fjernet. Den er måske aktiv i en af dine tilsluttede ressourcer. Deaktivér den og prøv igen." + +#. We didn't set a passphrase +#: ../src/common/connection.py:682 +#: ../src/common/zeroconf/connection_zeroconf.py:163 +msgid "OpenPGP passphrase was not given" +msgstr "OpenPGP adgangskode blev ikke givet" + +#. we're not english +#. one in locale and one en +#: ../src/common/connection.py:845 +msgid "[This message is *encrypted* (See :JEP:`27`]" +msgstr "[Denne besked er *krypteret* (Se :JEP:`27`]" + +#: ../src/common/connection.py:916 +#: ../src/common/zeroconf/connection_zeroconf.py:423 +#, python-format +msgid "" +"Subject: %s\n" +"%s" +msgstr "" +"Emne: %s\n" +"%s" + +#: ../src/common/connection.py:1099 +msgid "Not fetched because of invisible status" +msgstr "Ikke hentet på grund af usynlig status" + +#: ../src/common/contacts.py:294 +msgid "Not in roster" +msgstr "Ikke i kontaktvindue" + +#. only say that to non Windows users +#: ../src/common/dbus_support.py:33 +msgid "D-Bus python bindings are missing in this computer" +msgstr "D-Bus python bindinger mangler på denne computer" + +#: ../src/common/dbus_support.py:34 +msgid "D-Bus capabilities of Gajim cannot be used" +msgstr "Gajims D-Bus evner kan ikke bruges" + +#: ../src/common/exceptions.py:22 +msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." +msgstr "pysqlite2 (også kaldet python-pysqlite2) afhængighed mangler. Slutter..." + +#: ../src/common/exceptions.py:39 +msgid "Service not available: Gajim is not running, or remote_control is False" +msgstr "" +"Tjeneste ikke tilgængelig: Gajim kører ikke, eller remote_control er Falsk" + +#: ../src/common/exceptions.py:47 +msgid "D-Bus is not present on this machine or python module is missing" +msgstr "" +"D-Bus er ikke tilgængelig på denne maskine eller et python modul mangler" + +#: ../src/common/exceptions.py:55 +msgid "" +"Session bus is not available.\n" +"Try reading http://trac.gajim.org/wiki/GajimDBus" +msgstr "" +"Sessions bussen er ikke tilgængelig.\n" +"Prøv at læse http://trac.gajim.org/wiki/GajimDBus" + +#: ../src/common/fuzzyclock.py:42 +msgid "one" +msgstr "en" + +#: ../src/common/fuzzyclock.py:42 +msgid "two" +msgstr "to" + +#: ../src/common/fuzzyclock.py:42 +msgid "three" +msgstr "tre" + +#: ../src/common/fuzzyclock.py:42 +msgid "four" +msgstr "fire" + +#: ../src/common/fuzzyclock.py:42 +msgid "five" +msgstr "fem" + +#: ../src/common/fuzzyclock.py:42 +msgid "six" +msgstr "seks" + +#: ../src/common/fuzzyclock.py:43 +msgid "seven" +msgstr "syv" + +#: ../src/common/fuzzyclock.py:43 +msgid "eight" +msgstr "otte" + +#: ../src/common/fuzzyclock.py:43 +msgid "nine" +msgstr "ni" + +#: ../src/common/fuzzyclock.py:43 +msgid "ten" +msgstr "ti" + +#: ../src/common/fuzzyclock.py:43 +msgid "eleven" +msgstr "elleve" + +#: ../src/common/fuzzyclock.py:44 +msgid "twelve" +msgstr "tolv" + +#. Strings to use for the output. %0 will be replaced with the preceding hour (e.g. "x PAST %0"), %1 with the coming hour (e.g. "x TO %1). ''' +#. A "singular-form". It is used when talking about hour 0 +#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 +msgid "$0 o'clock" +msgstr "klokken $0" + +#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 +msgid "five past $0" +msgstr "fem over $0" + +#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 +msgid "ten past $0" +msgstr "ti over $0" + +#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 +msgid "quarter past $0" +msgstr "kvart over $0" + +#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 +msgid "twenty past $0" +msgstr "tyve over $0" + +#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 +msgid "twenty five past $0" +msgstr "femogtyve over $0" + +#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 +msgid "half past $0" +msgstr "halv $1" + +#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 +msgid "twenty five to $1" +msgstr "femogtyve minutter i $1" + +#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 +msgid "twenty to $1" +msgstr "tyve minutter i $1" + +#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 +msgid "quarter to $1" +msgstr "kvart på $1" + +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +msgid "ten to $1" +msgstr "ti på $1" + +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +msgid "five to $1" +msgstr "fem på $1" + +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:61 +msgid "$1 o'clock" +msgstr "klokken $1" + +#: ../src/common/fuzzyclock.py:64 +msgid "Night" +msgstr "Nat" + +#: ../src/common/fuzzyclock.py:64 +msgid "Early morning" +msgstr "Tidlig morgen" + +#: ../src/common/fuzzyclock.py:64 +msgid "Morning" +msgstr "Morgen" + +#: ../src/common/fuzzyclock.py:64 +msgid "Almost noon" +msgstr "Næsten middag" + +#: ../src/common/fuzzyclock.py:65 +msgid "Noon" +msgstr "Middag" + +#: ../src/common/fuzzyclock.py:65 +msgid "Afternoon" +msgstr "Eftermiddag" + +#: ../src/common/fuzzyclock.py:65 +msgid "Evening" +msgstr "Aften" + +#: ../src/common/fuzzyclock.py:65 +msgid "Late evening" +msgstr "Sen aften" + +#: ../src/common/fuzzyclock.py:67 +msgid "Start of week" +msgstr "Ugestart" + +#: ../src/common/fuzzyclock.py:67 +msgid "Middle of week" +msgstr "Midten af ugen" + +#: ../src/common/fuzzyclock.py:67 +msgid "End of week" +msgstr "Slutten af ugen" + +#: ../src/common/fuzzyclock.py:68 +msgid "Weekend!" +msgstr "Weekend!" + +#: ../src/common/helpers.py:115 +msgid "Invalid character in username." +msgstr "Ugyldig karakter i brugernavn." + +#: ../src/common/helpers.py:120 +msgid "Server address required." +msgstr "Server adresse påkrævet." + +#: ../src/common/helpers.py:125 +msgid "Invalid character in hostname." +msgstr "Ugyldig karakter i værtsnavn." + +#: ../src/common/helpers.py:131 +msgid "Invalid character in resource." +msgstr "Ugyldig karakter i ressource." + +#. GiB means gibibyte +#: ../src/common/helpers.py:171 +#, python-format +msgid "%s GiB" +msgstr "%s GiB" + +#. GB means gigabyte +#: ../src/common/helpers.py:174 +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#. MiB means mibibyte +#: ../src/common/helpers.py:178 +#, python-format +msgid "%s MiB" +msgstr "%s MiB" + +#. MB means megabyte +#: ../src/common/helpers.py:181 +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#. KiB means kibibyte +#: ../src/common/helpers.py:185 +#, python-format +msgid "%s KiB" +msgstr "%s KiB" + +#. KB means kilo bytes +#: ../src/common/helpers.py:188 +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#. B means bytes +#: ../src/common/helpers.py:191 +#, python-format +msgid "%s B" +msgstr "%s B" + +#: ../src/common/helpers.py:222 +msgid "_Busy" +msgstr "_Travlt" + +#: ../src/common/helpers.py:224 +msgid "Busy" +msgstr "Travlt" + +#: ../src/common/helpers.py:227 +msgid "_Not Available" +msgstr "_Ikke tilgængelig" + +#: ../src/common/helpers.py:232 +msgid "_Free for Chat" +msgstr "_Tilgængelig for samtale" + +#: ../src/common/helpers.py:234 +msgid "Free for Chat" +msgstr "Tilgængelig for samtale" + +#: ../src/common/helpers.py:237 +msgid "_Available" +msgstr "Ti_lgængelig" + +#: ../src/common/helpers.py:241 +msgid "Connecting" +msgstr "Tilslutter" + +#: ../src/common/helpers.py:244 +msgid "A_way" +msgstr "_Væk" + +#: ../src/common/helpers.py:249 +msgid "_Offline" +msgstr "_Afkoblet" + +#: ../src/common/helpers.py:251 +msgid "Offline" +msgstr "Afkoblet" + +#: ../src/common/helpers.py:254 +msgid "_Invisible" +msgstr "_Usynlig" + +#: ../src/common/helpers.py:260 +msgid "?contact has status:Unknown" +msgstr "?contact has status:Ukendt" + +#: ../src/common/helpers.py:262 +msgid "?contact has status:Has errors" +msgstr "?contact has status:Har fejl" + +#: ../src/common/helpers.py:267 +msgid "?Subscription we already have:None" +msgstr "?Subscription we already have:Intet" + +#: ../src/common/helpers.py:269 +msgid "To" +msgstr "Til" + +#: ../src/common/helpers.py:273 +msgid "Both" +msgstr "Begge" + +#: ../src/common/helpers.py:281 +msgid "?Ask (for Subscription):None" +msgstr "?Ask (for Subscription):Intet" + +#: ../src/common/helpers.py:283 +msgid "Subscribe" +msgstr "Abonner" + +#: ../src/common/helpers.py:292 +msgid "?Group Chat Contact Role:None" +msgstr "?Group Chat Contact Role:Ingen" + +#: ../src/common/helpers.py:295 +msgid "Moderators" +msgstr "Moderatorer" + +#: ../src/common/helpers.py:297 +msgid "Moderator" +msgstr "Moderator" + +#: ../src/common/helpers.py:300 +msgid "Participants" +msgstr "Deltagere" + +#: ../src/common/helpers.py:302 +msgid "Participant" +msgstr "Deltager" + +#: ../src/common/helpers.py:305 +msgid "Visitors" +msgstr "Besøgende" + +#: ../src/common/helpers.py:307 +msgid "Visitor" +msgstr "Besøgende" + +#: ../src/common/helpers.py:313 +msgid "?Group Chat Contact Affiliation:None" +msgstr "?Group Chat Contact Affiliation:Ingen" + +#: ../src/common/helpers.py:315 +msgid "Owner" +msgstr "Ejer" + +#: ../src/common/helpers.py:317 +msgid "Administrator" +msgstr "Administrator" + +#: ../src/common/helpers.py:319 +msgid "Member" +msgstr "Medlem" + +#: ../src/common/helpers.py:358 +msgid "is paying attention to the conversation" +msgstr "er opmærksom på samtalen" + +#: ../src/common/helpers.py:360 +msgid "is doing something else" +msgstr "gør noget andet" + +#: ../src/common/helpers.py:362 +msgid "is composing a message..." +msgstr "komponerer en besked..." + +#. paused means he or she was composing but has stopped for a while +#: ../src/common/helpers.py:365 +msgid "paused composing a message" +msgstr "holder pause med at komponere en besked" + +#: ../src/common/helpers.py:367 +msgid "has closed the chat window or tab" +msgstr "har lukket samtalevinduet eller fanebladet" + +#: ../src/common/helpers.py:913 ../src/common/helpers.py:920 +#, python-format +msgid "%d message pending" +msgid_plural "%d messages pending" +msgstr[0] "%d besked venter" +msgstr[1] "%d beskeder venter" + +#: ../src/common/helpers.py:926 +#, python-format +msgid " from room %s" +msgstr "fra rum %s" + +#: ../src/common/helpers.py:929 ../src/common/helpers.py:948 +#, python-format +msgid " from user %s" +msgstr "fra bruger %s" + +#: ../src/common/helpers.py:931 +#, python-format +msgid " from %s" +msgstr " fra %s" + +#: ../src/common/helpers.py:938 ../src/common/helpers.py:945 +#, python-format +msgid "%d event pending" +msgid_plural "%d events pending" +msgstr[0] "" +msgstr[1] "" + +#: ../src/common/helpers.py:978 +#, python-format +msgid "Gajim - %s" +msgstr "Gajim - %s" + +#. we talk about a file +#: ../src/common/optparser.py:60 +#, python-format +msgid "error: cannot open %s for reading" +msgstr "fejl: kan ikke åbne %s for læsning" + +#: ../src/common/optparser.py:203 ../src/common/optparser.py:204 +msgid "cyan" +msgstr "cyan" + +#: ../src/common/optparser.py:320 +msgid "migrating logs database to indices" +msgstr "flytter log databasen til flere indeks" + +#: ../src/common/passwords.py:82 +#, python-format +msgid "Gajim account %s" +msgstr "Gajim konto %s" + +#: ../src/common/zeroconf/client_zeroconf.py:135 +#: ../src/common/zeroconf/client_zeroconf.py:218 +msgid "Connection to host could not be established" +msgstr "Tilslutning til vært kunne ikke etableres" + +#: ../src/common/zeroconf/client_zeroconf.py:192 +msgid "" +"Connection to host could not be established: Incorrect answer from server." +msgstr "Tilslutning til vært kunne ikke etableres: Forkert svar fra server." + +#: ../src/common/zeroconf/client_zeroconf.py:352 +msgid "" +"Connection to host could not be established: Timeout while sending data." +msgstr "" +"Tilslutning til vært kunne ikke etableres: Tidsudløb mens data var blevet " +"sendt." + +#: ../src/common/zeroconf/client_zeroconf.py:638 +msgid "Contact is offline. Your message could not be sent." +msgstr "Kontakt er afkoblet. Din besked kunne ikke sendes." + +#: ../src/common/zeroconf/connection_zeroconf.py:204 +msgid "To continue sending and receiving messages, you will need to reconnect." +msgstr "" +"For at kunne fortsætte med at sende og modtage beskeder, må du tilslutte dig " +"igen." + +#: ../src/common/zeroconf/connection_zeroconf.py:227 +msgid "Avahi error" +msgstr "Avahi fejl" + +#: ../src/common/zeroconf/connection_zeroconf.py:227 +#, python-format +msgid "" +"%s\n" +"Link-local messaging might not work properly." +msgstr "" +"%s\n" +"Link-local beskeder vil sandsynligvis ikke virke ordentligt." + +#: ../src/common/zeroconf/connection_zeroconf.py:238 +msgid "Please check if Avahi is installed." +msgstr "Kontroller venligst om Avahi er installeret." + +#: ../src/common/zeroconf/connection_zeroconf.py:247 +#: ../src/common/zeroconf/connection_zeroconf.py:251 +msgid "Could not start local service" +msgstr "Kunne ikke starte lokal tjeneste" + +#: ../src/common/zeroconf/connection_zeroconf.py:248 +#, python-format +msgid "Unable to bind to port %d." +msgstr "Ikke i stand til at tildele port %d." + +#: ../src/common/zeroconf/connection_zeroconf.py:252 +#: ../src/common/zeroconf/connection_zeroconf.py:347 +msgid "Please check if avahi-daemon is running." +msgstr "Kontroller venligst om avahi-dæmonen kører." + +#: ../src/common/zeroconf/connection_zeroconf.py:346 +#, python-format +msgid "Could not change status of account \"%s\"" +msgstr "Kunne ikke ændre status på kontoen \"%s\"" + +#: ../src/common/zeroconf/connection_zeroconf.py:363 +msgid "" +"You are not connected or not visible to others. Your message could not be " +"sent." +msgstr "" +"Du er ikke tilsluttet eller synlig for andre. Din besked kunne ikke sendes." + +#. we're not english +#: ../src/common/zeroconf/connection_zeroconf.py:375 +msgid "[This message is encrypted]" +msgstr "[Denne besked er krypteret]" + +#: ../src/common/zeroconf/zeroconf_avahi.py:178 +#: ../src/common/zeroconf/zeroconf_bonjour.py:187 +#, python-format +msgid "Error while adding service. %s" +msgstr "Fejl ved tilføjelse af tjeneste. %s" + diff --git a/po/de.po b/po/de.po index ec658b229..2b640dfaa 100644 --- a/po/de.po +++ b/po/de.po @@ -3,14 +3,20 @@ # This file is distributed under the same license as the gajim package. # Fridtjof Busse , 2005, 2006. # Benjamin Drung , 2007. +# Fabian Fingerle , 2007. +# Sebastian Schäfer , 2007. # +#: ../src/gajim-remote.py:220 ../src/gajim-remote.py:227 +#: ../src/gajim-remote.py:253 ../src/gajim-remote.py:254 +#: ../src/gajim-remote.py:260 ../src/gajim-remote.py:261 +#: ../src/gajim-remote.py:262 ../src/gajim-remote.py:263 msgid "" msgstr "" "Project-Id-Version: gajim 0.11\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-03-29 13:38+0200\n" -"PO-Revision-Date: 2007-08-03 23:11+0100\n" -"Last-Translator: Michael Skiba \n" +"POT-Creation-Date: 2007-11-23 11:00+0100\n" +"PO-Revision-Date: 2007-11-04 16:37+0100\n" +"Last-Translator: Nico Gulden \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -30,37 +36,36 @@ msgid "Jabber IM Client" msgstr "Jabber IM-Client" #: ../data/glade/account_context_menu.glade.h:1 -msgid "Send Single _Message..." -msgstr "Einzelne _Nachricht senden..." +#: ../data/glade/roster_window.glade.h:8 +msgid "Join _Group Chat..." +msgstr "_Chatraum beitreten..." #: ../data/glade/account_context_menu.glade.h:2 msgid "_Add Contact..." msgstr "Kontakt _hinzufügen..." #: ../data/glade/account_context_menu.glade.h:3 -msgid "_Discover Services..." -msgstr "_Durchsuche Dienste..." +#: ../data/glade/roster_window.glade.h:15 +msgid "_Discover Services" +msgstr "_Dienste durchsuchen" #: ../data/glade/account_context_menu.glade.h:4 -#: ../src/disco.py:1145 msgid "_Execute Command..." msgstr "_Befehl ausführen..." #: ../data/glade/account_context_menu.glade.h:5 -#: ../data/glade/roster_window.glade.h:16 -#: ../data/glade/systray_context_menu.glade.h:6 -msgid "_Group Chat" -msgstr "_Gruppenchat" +msgid "_Modify Account" +msgstr "Konto bearbeiten" #: ../data/glade/account_context_menu.glade.h:6 -#: ../data/glade/zeroconf_context_menu.glade.h:1 -msgid "_Modify Account..." -msgstr "_Konto bearbeiten..." - -#: ../data/glade/account_context_menu.glade.h:7 msgid "_Open Gmail Inbox" msgstr "Google Mail Posteingang _öffnen" +#: ../data/glade/account_context_menu.glade.h:7 +#: ../data/glade/roster_window.glade.h:23 +msgid "_Start Chat..." +msgstr "_Chat starten" + #: ../data/glade/account_context_menu.glade.h:8 #: ../data/glade/zeroconf_context_menu.glade.h:2 msgid "_Status" @@ -68,7 +73,7 @@ msgstr "_Status" #: ../data/glade/account_creation_wizard_window.glade.h:1 msgid "" -"Account is being created\n" +"Connecting to server\n" "\n" "Please wait..." msgstr "" @@ -85,49 +90,68 @@ msgid "Please fill in the data for your new account" msgstr "Bitte geben Sie die Daten für Ihr neues Konto ein" #: ../data/glade/account_creation_wizard_window.glade.h:6 -msgid "Click to see features (like MSN, ICQ transports) of jabber servers" -msgstr "Klicken, um die Fähigkeiten (z.B. MSN-, ICQ-Transporte) auf Jabber-Servern zu sehen." +msgid "Please select a server" +msgstr "Bitte einen Server wählen" #: ../data/glade/account_creation_wizard_window.glade.h:7 +msgid "Click to see features (like MSN, ICQ transports) of jabber servers" +msgstr "" +"Klicken, um die Fähigkeiten (z.B. MSN-, ICQ-Transporte) auf Jabber-Servern " +"zu sehen." + +#: ../data/glade/account_creation_wizard_window.glade.h:8 msgid "Connect when I press Finish" msgstr "Verbinde, sobald ich Fertig klicke" -#: ../data/glade/account_creation_wizard_window.glade.h:8 +#: ../data/glade/account_creation_wizard_window.glade.h:9 msgid "Gajim: Account Creation Wizard" msgstr "Gajim: Kontoeinrichtungs-Assistent" -#: ../data/glade/account_creation_wizard_window.glade.h:9 -msgid "I already have an account I want to use" -msgstr "Ich habe bereits ein Konto, das ich benutzen möchte" - #: ../data/glade/account_creation_wizard_window.glade.h:10 +msgid "I already have an account I want to _use" +msgstr "Ich habe bereits ein Konto, das ich _benutzen möchte" + +#: ../data/glade/account_creation_wizard_window.glade.h:11 msgid "I want to _register for a new account" msgstr "Ich möchte ein neues Konto _erstellen" -#: ../data/glade/account_creation_wizard_window.glade.h:11 -#: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/account_creation_wizard_window.glade.h:12 +#: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/accounts_window.glade.h:23 msgid "If checked, Gajim will remember the password for this account" msgstr "Falls aktiviert, speichert Gajim das Passwort für dieses Konto" -#: ../data/glade/account_creation_wizard_window.glade.h:12 -#: ../data/glade/manage_proxies_window.glade.h:7 -msgid "Pass_word:" -msgstr "Pass_wort:" - #: ../data/glade/account_creation_wizard_window.glade.h:13 -#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/account_modification_window.glade.h:26 +#: ../data/glade/accounts_window.glade.h:32 +msgid "Manage..." +msgstr "_Verwalten..." + +#: ../data/glade/account_creation_wizard_window.glade.h:14 +msgid "Prox_y:" +msgstr "Proxy:" + +#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/accounts_window.glade.h:47 msgid "Save pass_word" msgstr "Pass_wort speichern" -#: ../data/glade/account_creation_wizard_window.glade.h:14 +#: ../data/glade/account_creation_wizard_window.glade.h:16 msgid "Servers Features" msgstr "Fähigkeiten des Servers" -#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_creation_wizard_window.glade.h:17 msgid "Set my profile when I connect" msgstr "Setze mein Profil, wenn ich mich verbinde" -#: ../data/glade/account_creation_wizard_window.glade.h:16 +#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/accounts_window.glade.h:53 +msgid "Use custom hostname/port" +msgstr "Verwende benutzerdefinierten Hostnamen und Port" + +#: ../data/glade/account_creation_wizard_window.glade.h:19 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." @@ -135,67 +159,64 @@ msgstr "" "Sie müssen ein Konto erstellen, bevor Sie sich zum Jabber-Netzwerk \n" "verbinden können." -#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_creation_wizard_window.glade.h:21 msgid "Your JID:" msgstr "Ihre JID:" -#: ../data/glade/account_creation_wizard_window.glade.h:19 -#: ../data/glade/roster_window.glade.h:11 +#: ../data/glade/account_creation_wizard_window.glade.h:22 +#: ../data/glade/roster_window.glade.h:13 msgid "_Advanced" msgstr "_Erweitert" -#: ../data/glade/account_creation_wizard_window.glade.h:20 +#: ../data/glade/account_creation_wizard_window.glade.h:23 msgid "_Finish" msgstr "_Beenden" -#: ../data/glade/account_creation_wizard_window.glade.h:21 -#: ../data/glade/manage_proxies_window.glade.h:10 -msgid "_Host:" -msgstr "_Server:" +#: ../data/glade/account_creation_wizard_window.glade.h:24 +#, fuzzy +msgid "_Hostname:" +msgstr "_Hostname: " -#: ../data/glade/account_creation_wizard_window.glade.h:22 -#: ../data/glade/account_modification_window.glade.h:49 +#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_modification_window.glade.h:50 +#: ../data/glade/accounts_window.glade.h:58 msgid "_Password:" msgstr "_Passwort:" -#: ../data/glade/account_creation_wizard_window.glade.h:23 +#: ../data/glade/account_creation_wizard_window.glade.h:26 #: ../data/glade/manage_proxies_window.glade.h:11 msgid "_Port:" msgstr "_Port:" -#: ../data/glade/account_creation_wizard_window.glade.h:24 -msgid "_Retype Password:" -msgstr "Passwort e_rneut eingeben:" - -#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_creation_wizard_window.glade.h:27 msgid "_Server:" msgstr "_Server:" -#: ../data/glade/account_creation_wizard_window.glade.h:26 -msgid "_Use proxy" -msgstr "_Proxy benutzen" - -#: ../data/glade/account_creation_wizard_window.glade.h:27 +#: ../data/glade/account_creation_wizard_window.glade.h:28 #: ../data/glade/manage_proxies_window.glade.h:12 msgid "_Username:" msgstr "_Benutzername:" #: ../data/glade/account_modification_window.glade.h:1 +#: ../data/glade/accounts_window.glade.h:1 #: ../data/glade/preferences_window.glade.h:8 msgid "Miscellaneous" msgstr "Verschiedenes" #: ../data/glade/account_modification_window.glade.h:2 +#: ../data/glade/accounts_window.glade.h:2 #: ../data/glade/zeroconf_properties_window.glade.h:1 msgid "OpenPGP" msgstr "OpenPGP" #: ../data/glade/account_modification_window.glade.h:3 +#: ../data/glade/accounts_window.glade.h:3 #: ../data/glade/zeroconf_properties_window.glade.h:2 msgid "Personal Information" msgstr "Persönliche Informationen" #: ../data/glade/account_modification_window.glade.h:4 +#: ../data/glade/accounts_window.glade.h:4 msgid "Account" msgstr "Konto" @@ -204,239 +225,358 @@ msgid "Account Modification" msgstr "Kontoänderung" #: ../data/glade/account_modification_window.glade.h:6 +#: ../data/glade/accounts_window.glade.h:5 msgid "Administration operations" msgstr "Administrative Aktionen" #: ../data/glade/account_modification_window.glade.h:7 +#: ../data/glade/accounts_window.glade.h:6 msgid "Auto-reconnect when connection is lost" msgstr "Automatisch neu verbinden, wenn die Verbindung abbricht" #: ../data/glade/account_modification_window.glade.h:8 +#: ../data/glade/accounts_window.glade.h:7 #: ../data/glade/zeroconf_properties_window.glade.h:3 msgid "C_onnect on Gajim startup" msgstr "Beim Pr_ogrammstart verbinden" #: ../data/glade/account_modification_window.glade.h:9 +#: ../data/glade/accounts_window.glade.h:8 msgid "Chan_ge Password" msgstr "Pass_wort ändern" #: ../data/glade/account_modification_window.glade.h:10 -msgid "Check this so Gajim will connect in port 5223 where legacy servers are expected to have SSL capabilities. Note that Gajim uses TLS encryption by default if broadcasted by the server, and with this option enabled TLS will be disabled" -msgstr "Aktivieren Sie diese Option, damit Gajim auf Port 5223 verbindet, auf dem veraltete Server SSL-Fähigkeiten haben. Beachten Sie, dass Gajim standardmäßig TLS-Verschlüsselung benutzt, wenn sie vom Server verwendet wird und sie TLS mit dieser Option deaktivieren" +#: ../data/glade/accounts_window.glade.h:9 +msgid "" +"Check this so Gajim will connect in port 5223 where legacy servers are " +"expected to have SSL capabilities. Note that Gajim uses TLS encryption by " +"default if broadcasted by the server, and with this option enabled TLS will " +"be disabled" +msgstr "" +"Aktivieren Sie diese Option, damit Gajim auf Port 5223 verbindet, auf dem " +"veraltete Server SSL-Fähigkeiten haben. Beachten Sie, dass Gajim " +"standardmäßig TLS-Verschlüsselung benutzt, wenn sie vom Server verwendet " +"wird und sie TLS mit dieser Option deaktivieren" #: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/accounts_window.glade.h:10 #: ../data/glade/zeroconf_properties_window.glade.h:4 msgid "Choose _Key..." msgstr "_Schlüssel wählen..." #: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/accounts_window.glade.h:11 msgid "Click to change account's password" msgstr "Klicken, um das Konto-Passwort zu ändern" #: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/accounts_window.glade.h:12 +msgid "Click to request authorization to all contacts of another account" +msgstr "" + +#: ../data/glade/account_modification_window.glade.h:14 +#: ../data/glade/accounts_window.glade.h:13 msgid "Connection" msgstr "Verbindung" -#: ../data/glade/account_modification_window.glade.h:14 +#: ../data/glade/account_modification_window.glade.h:15 +#: ../data/glade/accounts_window.glade.h:15 msgid "Edit Personal Information..." msgstr "Persönliche Details bearbeiten ..." -#: ../data/glade/account_modification_window.glade.h:15 -#: ../data/glade/roster_window.glade.h:5 -#: ../src/notify.py:458 -#: ../src/notify.py:480 -#: ../src/notify.py:492 -#: ../src/common/helpers.py:914 +#. No configured account +#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/accounts_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:6 ../src/notify.py:489 +#: ../src/notify.py:520 ../src/notify.py:532 ../src/common/helpers.py:998 +#: ../src/common/helpers.py:1010 msgid "Gajim" msgstr "Gajim" -#: ../data/glade/account_modification_window.glade.h:16 -#: ../data/glade/preferences_window.glade.h:51 +#. General group cannot be changed +#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/accounts_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:45 #: ../data/glade/zeroconf_properties_window.glade.h:7 -#: ../src/roster_window.py:347 -#: ../src/roster_window.py:1225 -#: ../src/roster_window.py:1435 -#: ../src/roster_window.py:2114 -#: ../src/roster_window.py:2156 -#: ../src/common/contacts.py:284 +#: ../src/roster_window.py:372 ../src/roster_window.py:637 +#: ../src/roster_window.py:1384 ../src/roster_window.py:1760 +#: ../src/roster_window.py:2145 ../src/roster_window.py:2657 +#: ../src/roster_window.py:2775 ../src/common/contacts.py:314 msgid "General" msgstr "Allgemein" -#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/accounts_window.glade.h:20 msgid "Hostname: " msgstr "Hostname: " -#: ../data/glade/account_modification_window.glade.h:18 -msgid "If checked, Gajim will also broadcast some more IPs except from just your IP, so file transfer has higher chances of working." -msgstr "Wenn aktiviert, wird Gajim von mehr IPs als nur Ihrer eigenen senden, wodurch Datentransfers eine höhere Erfolgswahrscheinlichkeit bekommen." - -#: ../data/glade/account_modification_window.glade.h:20 -msgid "If checked, Gajim will send keep-alive packets to prevent connection timeout which results in disconnection" -msgstr "Wenn aktiviert, sendet Gajim regelmäßig Keepalive-Pakete, um einen Verbindungsabbruch durch eine Zeitüberschreitung zu verhindern" +#: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/accounts_window.glade.h:21 +msgid "" +"If checked, Gajim will also broadcast some more IPs except from just your " +"IP, so file transfer has higher chances of working." +msgstr "" +"Wenn aktiviert, wird Gajim von mehr IPs als nur Ihrer eigenen senden, " +"wodurch Datentransfers eine höhere Erfolgswahrscheinlichkeit bekommen." #: ../data/glade/account_modification_window.glade.h:21 -#: ../data/glade/zeroconf_properties_window.glade.h:8 -msgid "If checked, Gajim will store the password in ~/.gajim/config with 'read' permission only for you" -msgstr "Wenn aktiviert, wird Gajim das Passwort in ~/.gajim/config mit Lese-Rechten nur für Sie speichern" +#: ../data/glade/accounts_window.glade.h:24 +msgid "" +"If checked, Gajim will send keep-alive packets to prevent connection timeout " +"which results in disconnection" +msgstr "" +"Wenn aktiviert, sendet Gajim regelmäßig Keepalive-Pakete, um einen " +"Verbindungsabbruch durch eine Zeitüberschreitung zu verhindern" #: ../data/glade/account_modification_window.glade.h:22 -#: ../data/glade/zeroconf_properties_window.glade.h:9 -msgid "If checked, Gajim, when launched, will automatically connect to jabber using this account" -msgstr "Wenn aktiviert, wird Gajim während des Startvorgangs automatisch zu diesem Konto verbinden" +#: ../data/glade/zeroconf_properties_window.glade.h:8 +msgid "" +"If checked, Gajim will store the password in ~/.gajim/config with 'read' " +"permission only for you" +msgstr "" +"Wenn aktiviert, wird Gajim das Passwort in ~/.gajim/config mit Lese-Rechten " +"nur für Sie speichern" #: ../data/glade/account_modification_window.glade.h:23 -#: ../data/glade/zeroconf_properties_window.glade.h:10 -msgid "If checked, any change to the global status (handled by the combobox at the bottom of the roster window) will change the status of this account accordingly" -msgstr "Wenn aktiviert, wird jede Änderung des globalen Status (verwaltet von der Combobox am Fuße des Kontaktfensters) auch den Status dieses Kontakts entsprechend ändern" +#: ../data/glade/accounts_window.glade.h:25 +#: ../data/glade/zeroconf_properties_window.glade.h:9 +msgid "" +"If checked, Gajim, when launched, will automatically connect to jabber using " +"this account" +msgstr "" +"Wenn aktiviert, wird Gajim während des Startvorgangs automatisch zu diesem " +"Konto verbinden" #: ../data/glade/account_modification_window.glade.h:24 +#: ../data/glade/accounts_window.glade.h:26 +#: ../data/glade/zeroconf_properties_window.glade.h:10 +msgid "" +"If checked, any change to the global status (handled by the combobox at the " +"bottom of the roster window) will change the status of this account " +"accordingly" +msgstr "" +"Wenn aktiviert, wird jede Änderung des globalen Status (verwaltet von der " +"Combobox am Fuße des Kontaktfensters) auch den Status dieses Kontakts " +"entsprechend ändern" + +#: ../data/glade/account_modification_window.glade.h:25 +#: ../data/glade/accounts_window.glade.h:29 msgid "Information about you, as stored in the server" msgstr "Informationen über Sie, wie sie auf dem Server gespeichert sind" -#: ../data/glade/account_modification_window.glade.h:25 -msgid "Manage..." -msgstr "_Verwalten..." - -#: ../data/glade/account_modification_window.glade.h:26 -#: ../data/glade/zeroconf_properties_window.glade.h:16 -#: ../src/config.py:1623 -#: ../src/config.py:3301 +#: ../data/glade/account_modification_window.glade.h:27 +#: ../data/glade/accounts_window.glade.h:34 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1553 +#: ../src/config.py:2030 msgid "No key selected" msgstr "Kein Schlüssel gewählt" #. None means no proxy profile selected #. GPG Key -#: ../data/glade/account_modification_window.glade.h:28 -#: ../src/config.py:1196 -#: ../src/config.py:1201 -#: ../src/config.py:1385 -#: ../src/config.py:1613 -#: ../src/config.py:1622 -#: ../src/config.py:1682 -#: ../src/config.py:1756 -#: ../src/config.py:3291 -#: ../src/config.py:3300 -#: ../src/dialogs.py:281 -#: ../src/dialogs.py:283 -#: ../src/roster_window.py:1539 -#: ../src/roster_window.py:1546 -#: ../src/roster_window.py:1553 +#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/accounts_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:32 ../src/config.py:1142 +#: ../src/config.py:1213 ../src/config.py:1462 ../src/config.py:1467 +#: ../src/config.py:1928 ../src/config.py:2015 ../src/config.py:2029 +#: ../src/config.py:3111 ../src/config.py:3157 ../src/dialogs.py:344 +#: ../src/dialogs.py:346 ../src/roster_window.py:1864 +#: ../src/roster_window.py:1871 ../src/roster_window.py:1878 msgid "None" msgstr "Kein" -#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/accounts_window.glade.h:37 #: ../data/glade/profile_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:17 msgid "Personal Information" msgstr "Persönliche Informationen" -#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/accounts_window.glade.h:38 msgid "Port: " msgstr "Port: " -#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/accounts_window.glade.h:39 msgid "Priori_ty:" msgstr "Priori_tät:" -#: ../data/glade/account_modification_window.glade.h:32 -msgid "Priority is used in Jabber to determine who gets the events from the jabber server when two or more clients are connected using the same account; The client with the highest priority gets the events" -msgstr "Die Priorität wird von Jabber verwendet, um festzustellen, wer die Ereignisse des Jabber-Servers bekommt, wenn zwei oder mehr Clients mit dem selben Konto verbunden sind. Der Client mit der höchsten Priorität bekommt die Ereignisse" - #: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/accounts_window.glade.h:40 +msgid "" +"Priority is used in Jabber to determine who gets the events from the jabber " +"server when two or more clients are connected using the same account; The " +"client with the highest priority gets the events" +msgstr "" +"Die Priorität wird von Jabber verwendet, um festzustellen, wer die " +"Ereignisse des Jabber-Servers bekommt, wenn zwei oder mehr Clients mit dem " +"selben Konto verbunden sind. Der Client mit der höchsten Priorität bekommt " +"die Ereignisse" + +#: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/accounts_window.glade.h:41 msgid "Priority will change automatically according to your status." msgstr "Die Priorität wird sich automatisch gemäß des Status ändern." -#: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/account_modification_window.glade.h:35 +#: ../data/glade/accounts_window.glade.h:42 msgid "Proxy:" msgstr "Proxy:" -#: ../data/glade/account_modification_window.glade.h:35 +#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/accounts_window.glade.h:44 msgid "Resour_ce:" msgstr "Ressour_ce: " -#: ../data/glade/account_modification_window.glade.h:36 -msgid "Resource is sent to the Jabber server in order to separate the same JID in two or more parts depending on the number of the clients connected in the same server with the same account. So you might be connected in the same account with resource 'Home' and 'Work' at the same time. The resource which has the highest priority will get the events. (see below)" -msgstr "Die Resource wird zum Jabber-Server geschickt, um die selbe JID in zwei oder mehr Teile zu trennen, abhängig von der Anzahl der Clients die mit dem selben Konto auf dem selben Server verbunden sind. Daher kann man gleichzeitig mit den Ressourcen \"Heim\" und \"Arbeit\" auf das selbe Konto verbinden. Die Ressource mit der höchsten Priorität wird die Nachrichten erhalten (siehe unten)." - #: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/accounts_window.glade.h:45 +msgid "" +"Resource is sent to the Jabber server in order to separate the same JID in " +"two or more parts depending on the number of the clients connected in the " +"same server with the same account. So you might be connected in the same " +"account with resource 'Home' and 'Work' at the same time. The resource which " +"has the highest priority will get the events. (see below)" +msgstr "" +"Die Resource wird zum Jabber-Server geschickt, um die selbe JID in zwei oder " +"mehr Teile zu trennen, abhängig von der Anzahl der Clients die mit dem " +"selben Konto auf dem selben Server verbunden sind. Daher kann man " +"gleichzeitig mit den Ressourcen \"Heim\" und \"Arbeit\" auf das selbe Konto " +"verbinden. Die Ressource mit der höchsten Priorität wird die Nachrichten " +"erhalten (siehe unten)." + +#: ../data/glade/account_modification_window.glade.h:38 #: ../data/glade/zeroconf_properties_window.glade.h:18 msgid "Save _passphrase (insecure)" msgstr "_Passphrase speichern (unsicher)" -#: ../data/glade/account_modification_window.glade.h:38 +#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/accounts_window.glade.h:46 #: ../data/glade/zeroconf_properties_window.glade.h:19 msgid "Save conversation _logs for all contacts" msgstr "Unter_haltungsverlauf für alle Kontakte dieses Kontos speichern" -#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/accounts_window.glade.h:48 msgid "Send keep-alive packets" msgstr "Sende Keepalive-Pakete" -#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/account_modification_window.glade.h:42 +#: ../data/glade/accounts_window.glade.h:49 #: ../data/glade/zeroconf_properties_window.glade.h:20 msgid "Synch_ronize account status with global status" msgstr "Konto-Status mit globalem _Status abgleichen" -#: ../data/glade/account_modification_window.glade.h:42 +#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/accounts_window.glade.h:50 +#: ../data/glade/synchronise_select_account_dialog.glade.h:2 msgid "Synchronise contacts" msgstr "Synchronisiere Kontakte" -#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/accounts_window.glade.h:52 msgid "Use _SSL (legacy)" msgstr "_SSL verwenden (veraltet)" -#: ../data/glade/account_modification_window.glade.h:44 -msgid "Use custom hostname/port" -msgstr "Verwende benutzerdefinierten Hostnamen und Port" - -#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/account_modification_window.glade.h:46 +#: ../data/glade/accounts_window.glade.h:55 msgid "Use file transfer proxies" msgstr "Verwende Datentransfer-Proxies" -#: ../data/glade/account_modification_window.glade.h:46 +#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/accounts_window.glade.h:56 msgid "_Adjust to status" msgstr "Mit dem Status _abgleichen" -#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/account_modification_window.glade.h:48 +#: ../data/glade/accounts_window.glade.h:57 msgid "_Jabber ID:" msgstr "_Jabber ID:" -#: ../data/glade/account_modification_window.glade.h:48 +#: ../data/glade/account_modification_window.glade.h:49 msgid "_Name:" msgstr "_Name: " -#: ../data/glade/accounts_window.glade.h:1 -msgid "Accounts" -msgstr "Konten" +#: ../data/glade/accounts_window.glade.h:14 +#: ../data/glade/profile_window.glade.h:11 +#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/zeroconf_information_window.glade.h:2 +#: ../data/glade/zeroconf_properties_window.glade.h:5 +msgid "E-Mail:" +msgstr "E-Mail:" -#: ../data/glade/accounts_window.glade.h:2 -msgid "" -"If checked, all local contacts that use a Bonjour compatible chat client (like iChat, Trillian or Gaim) will be shown in roster. You don't need to be connected to a jabber server for it to work.\n" -"This is only available if python-avahi is installed and avahi-daemon is running." +#. XML Console enable checkbutton +#: ../data/glade/accounts_window.glade.h:16 +#: ../data/glade/xml_console_window.glade.h:4 +msgid "Enable" +msgstr "Einschalten" + +#: ../data/glade/accounts_window.glade.h:17 +#: ../data/glade/zeroconf_information_window.glade.h:3 +#: ../data/glade/zeroconf_properties_window.glade.h:6 +msgid "First Name:" +msgstr "Vorname:" + +#: ../data/glade/accounts_window.glade.h:22 +msgid "If checked, Gajim will get the password from a GPG agent like seahorse" msgstr "" -"Wenn aktiviert, werden alle lokalen Kontakte, welche einen zu Bonjour kompatiblen Chat-Client (Wie z.B. iChat, Trillian oder Gaim) nutzen, in Ihrer Kontaktliste angezeigt. Dafür müssen Sie nicht mit einem Jabber-Server verbunden sein.\n" -"Dies ist nur möglich, wenn python-avahi verfügbar ist und avahi-daemon läuft (Automatische Diensterkennung)." +"Falls aktiviert, wird Gajim das Passwort von einem GnuPG-Agent wie seahorse " +"beziehen" -#: ../data/glade/accounts_window.glade.h:4 -msgid "If you have 2 or more accounts and this is checked, Gajim will list all contacts as if you had one account" -msgstr "Wenn Sie zwei oder mehr Konten haben und diese Option gewählt ist, wird Gajim alle Kontakte auflisten, als hätten Sie nur ein Konto" +#: ../data/glade/accounts_window.glade.h:27 +#: ../data/glade/zeroconf_properties_window.glade.h:11 +msgid "" +"If the default port that is used for incoming messages is unfitting for your " +"setup you can select another one here.\n" +"You might consider to change possible firewall settings." +msgstr "" +"Wenn der Standardport, der für eingehende Nachrichten benutzt wird, nicht " +"für Ihre Konfiguration geeignet ist, können sie hier einen anderen Port " +"festlegen.\n" +"Möglicherweise ist es von Nöten, Ihre Firewall-Einstellungen zu ändern." -#: ../data/glade/accounts_window.glade.h:5 +#: ../data/glade/accounts_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/zeroconf_information_window.glade.h:4 +#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:511 +msgid "Jabber ID:" +msgstr "Jabber-ID:" + +#: ../data/glade/accounts_window.glade.h:31 +#: ../data/glade/zeroconf_information_window.glade.h:5 +#: ../data/glade/zeroconf_properties_window.glade.h:14 +msgid "Last Name:" +msgstr "Nachname:" + +#: ../data/glade/accounts_window.glade.h:33 msgid "Mer_ge accounts" msgstr "Konten _zusammenführen" -#: ../data/glade/accounts_window.glade.h:6 -msgid "_Enable link-local messaging" -msgstr "_Kontakte im LAN anzeigen" +#. Rename +#: ../data/glade/accounts_window.glade.h:43 ../src/roster_window.py:2727 +msgid "Re_name" +msgstr "_Umbenennen" -#: ../data/glade/accounts_window.glade.h:7 -msgid "_Modify" -msgstr "_Ändern" +#: ../data/glade/accounts_window.glade.h:51 +msgid "Use GPG _Agent" +msgstr "" -#: ../data/glade/accounts_window.glade.h:8 -#: ../data/glade/remove_account_window.glade.h:4 -msgid "_Remove" -msgstr "_Entfernen" +#: ../data/glade/accounts_window.glade.h:54 +#: ../data/glade/zeroconf_properties_window.glade.h:21 +msgid "Use custom port:" +msgstr "Verwende benutzerdefinierten Port:" + +#: ../data/glade/accounts_window.glade.h:59 +msgid "gtk-add" +msgstr "" + +#: ../data/glade/accounts_window.glade.h:60 +#: ../data/glade/features_window.glade.h:4 +msgid "gtk-close" +msgstr "" + +#: ../data/glade/accounts_window.glade.h:61 +msgid "gtk-remove" +msgstr "" #: ../data/glade/add_new_contact_window.glade.h:1 msgid "A_ccount:" @@ -531,12 +671,15 @@ msgid "This jabber entity does not expose any commands." msgstr "Diese Jabber-Instanz gibt keine Kommandos von sich." #: ../data/glade/advanced_configuration_window.glade.h:1 +#: ../data/glade/features_window.glade.h:1 msgid "Description" msgstr "Beschreibung" #: ../data/glade/advanced_configuration_window.glade.h:2 msgid "NOTE: You should restart Gajim for some settings to take effect" -msgstr "HINWEIS: Sie sollten Gajim neu starten, damit alle Änderungen in Kraft treten" +msgstr "" +"HINWEIS: Sie sollten Gajim neu starten, damit alle Änderungen in " +"Kraft treten" #: ../data/glade/advanced_configuration_window.glade.h:3 msgid "Advanced Configuration Editor" @@ -555,45 +698,42 @@ msgid "Deletes Message of the Day" msgstr "Löscht die Nachricht des Tages" #: ../data/glade/advanced_menuitem_menu.glade.h:3 +#, fuzzy +msgid "Edit _Privacy Lists..." +msgstr "_Privatlisten" + +#: ../data/glade/advanced_menuitem_menu.glade.h:4 msgid "Sends a message to users currently connected to this server" msgstr "Sendet eine Nachricht an momentan angemeldete Benutzer des Servers" -#: ../data/glade/advanced_menuitem_menu.glade.h:4 -msgid "Set MOTD" +#: ../data/glade/advanced_menuitem_menu.glade.h:5 +msgid "Set MOTD..." msgstr "_Setze MOTD" -#: ../data/glade/advanced_menuitem_menu.glade.h:5 +#: ../data/glade/advanced_menuitem_menu.glade.h:6 msgid "Sets Message of the Day" msgstr "Setzt Message of the Day" -#: ../data/glade/advanced_menuitem_menu.glade.h:6 +#: ../data/glade/advanced_menuitem_menu.glade.h:7 msgid "Show _XML Console" msgstr "Zeige _XML Konsole" -#: ../data/glade/advanced_menuitem_menu.glade.h:7 -msgid "Update MOTD" +#: ../data/glade/advanced_menuitem_menu.glade.h:8 +msgid "Update MOTD..." msgstr "_Aktualisiere MOTD" -#: ../data/glade/advanced_menuitem_menu.glade.h:8 +#: ../data/glade/advanced_menuitem_menu.glade.h:9 msgid "Updates Message of the Day" msgstr "Aktualisiert Message of the Day" -#: ../data/glade/advanced_menuitem_menu.glade.h:9 +#: ../data/glade/advanced_menuitem_menu.glade.h:10 msgid "_Administrator" msgstr "_Administrator" -#: ../data/glade/advanced_menuitem_menu.glade.h:10 -msgid "_Privacy Lists" -msgstr "_Privatlisten" - #: ../data/glade/advanced_menuitem_menu.glade.h:11 -msgid "_Send Server Message" +msgid "_Send Server Message..." msgstr "_Sende Servernachricht" -#: ../data/glade/advanced_menuitem_menu.glade.h:12 -msgid "_Send Single Message" -msgstr "Sende _einzelne Nachricht" - #: ../data/glade/advanced_notifications_window.glade.h:1 msgid " a window/tab opened with that contact " msgstr " ein Fenster/Tab mit diesem Kontakt geöffnet " @@ -607,7 +747,7 @@ msgid "Conditions" msgstr "Ereignisse" #: ../data/glade/advanced_notifications_window.glade.h:4 -#: ../data/glade/preferences_window.glade.h:10 +#: ../data/glade/preferences_window.glade.h:12 msgid "Sounds" msgstr "Klänge" @@ -624,8 +764,7 @@ msgid "All statuses" msgstr "Alle Status " #: ../data/glade/advanced_notifications_window.glade.h:8 -#: ../src/common/commands.py:91 -#: ../src/common/helpers.py:243 +#: ../src/common/commands.py:96 ../src/common/helpers.py:255 msgid "Away" msgstr "Abwesend" @@ -642,7 +781,7 @@ msgid "Have " msgstr "habe " #: ../data/glade/advanced_notifications_window.glade.h:12 -#: ../src/common/helpers.py:253 +#: ../src/common/helpers.py:265 msgid "Invisible" msgstr "Unsichtbar" @@ -651,7 +790,7 @@ msgid "Launch a command" msgstr "Starte ein Kommando" #: ../data/glade/advanced_notifications_window.glade.h:14 -#: ../src/common/helpers.py:226 +#: ../src/common/helpers.py:238 msgid "Not Available" msgstr "Nicht verfügbar" @@ -692,8 +831,11 @@ msgid "When " msgstr "Wenn " #: ../data/glade/advanced_notifications_window.glade.h:27 -msgid "_Activate window manager's UrgencyHint to make chat window in taskbar flash" -msgstr "_Aktivere den UrgencyHint des Fenstermanagers, um das Chatfenster in der Taskleiste blinken zu lassen" +msgid "" +"_Activate window manager's UrgencyHint to make chat window in taskbar flash" +msgstr "" +"_Aktivere den UrgencyHint des Fenstermanagers, um das Chatfenster in der " +"Taskleiste blinken zu lassen" #: ../data/glade/advanced_notifications_window.glade.h:28 msgid "_Disable auto opening chat window" @@ -773,6 +915,10 @@ msgstr "Neuen Eintrag empfangen" msgid "You have received new entry:" msgstr "Sie haben einen neuen Eintrag erhalten:" +#: ../data/glade/blocked_contacts_window.glade.h:1 +msgid "Blocked Contacts" +msgstr "blockierte Kontakte" + #: ../data/glade/change_password_dialog.glade.h:1 msgid "Change Password" msgstr "Passwort ändern" @@ -802,10 +948,8 @@ msgid "Join _Group Chat" msgstr "_Gruppenchat beitreten" #: ../data/glade/chat_context_menu.glade.h:2 -#: ../data/glade/chat_control_popup_menu.glade.h:4 -#: ../data/glade/gc_occupants_menu.glade.h:2 -#: ../data/glade/roster_contact_context_menu.glade.h:10 -msgid "_Add to Roster" +#: ../data/glade/roster_contact_context_menu.glade.h:12 +msgid "_Add to Roster..." msgstr "Zur Kont_aktliste hinzufügen" #: ../data/glade/chat_context_menu.glade.h:3 @@ -825,7 +969,6 @@ msgid "_Open Link in Browser" msgstr "Link _öffnen" #: ../data/glade/chat_context_menu.glade.h:7 -#: ../data/glade/roster_window.glade.h:20 #: ../data/glade/subscription_request_popup_menu.glade.h:1 #: ../data/glade/systray_context_menu.glade.h:7 msgid "_Start Chat" @@ -836,28 +979,64 @@ msgid "Click to see past conversations with this contact" msgstr "Klicken, um die früheren Unterhaltungen mit diesem Kontakt zu sehen" #: ../data/glade/chat_control_popup_menu.glade.h:2 -#: ../data/glade/roster_contact_context_menu.glade.h:8 +#, fuzzy +msgid "Invite _Contacts" +msgstr "Kontakte verwalten" + +#: ../data/glade/chat_control_popup_menu.glade.h:3 +#: ../data/glade/gc_occupants_menu.glade.h:3 #: ../data/glade/zeroconf_contact_context_menu.glade.h:4 msgid "Send _File" msgstr "_Datei senden" -#: ../data/glade/chat_control_popup_menu.glade.h:3 +#: ../data/glade/chat_control_popup_menu.glade.h:4 +msgid "Toggle End to End Encryption" +msgstr "OpenPGP-Verschlüsselung aktivieren" + +#: ../data/glade/chat_control_popup_menu.glade.h:5 msgid "Toggle Open_PGP Encryption" msgstr "Open_PGP-Verschlüsselung aktivieren" -#: ../data/glade/chat_control_popup_menu.glade.h:5 -#: ../data/glade/gc_control_popup_menu.glade.h:6 -msgid "_Compact View Alt+C" -msgstr "_Kompakte Ansicht Alt+C" - #: ../data/glade/chat_control_popup_menu.glade.h:6 -#: ../data/glade/gc_control_popup_menu.glade.h:8 -#: ../data/glade/gc_occupants_menu.glade.h:5 -#: ../data/glade/roster_contact_context_menu.glade.h:13 +#: ../data/glade/gc_occupants_menu.glade.h:4 +msgid "_Add to Roster" +msgstr "Zur Kont_aktliste hinzufügen" + +#: ../data/glade/chat_control_popup_menu.glade.h:7 +#: ../data/glade/gc_control_popup_menu.glade.h:7 +#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/roster_window.glade.h:19 #: ../data/glade/zeroconf_contact_context_menu.glade.h:6 +#: ../src/roster_window.py:2596 msgid "_History" msgstr "_Verlauf" +#: ../data/glade/chat_to_muc_window.glade.h:1 +msgid "In_vite" +msgstr "_Einladen zu" + +#: ../data/glade/chat_to_muc_window.glade.h:2 +msgid "Invite Friends !" +msgstr "Freunde einladen !" + +#: ../data/glade/chat_to_muc_window.glade.h:3 +#, fuzzy +msgid "MUC server" +msgstr "Beobachter" + +#: ../data/glade/chat_to_muc_window.glade.h:4 +msgid "Please select a MUC server." +msgstr "Bitte wählen Sie einen MUC-Server aus." + +#: ../data/glade/chat_to_muc_window.glade.h:5 +msgid "" +"You are going to begin a Multi-User Chat.\n" +"Select the contacts you want to invite" +msgstr "" +"Sie beginnen einen Multi-User Chat.\n" +"Wählen Sie die Kontakte, die Sie einladen möchten" + #: ../data/glade/data_form_window.glade.h:1 msgid "Fill in the form." msgstr "Formular ausfüllen" @@ -870,6 +1049,15 @@ msgstr "Raum-Konfiguration" msgid "Edit Groups" msgstr "Gruppen bearbeiten" +#: ../data/glade/features_window.glade.h:2 +msgid "List of possible features in Gajim:" +msgstr "Liste möglicher Gajim-Features:" + +#: ../data/glade/features_window.glade.h:3 +#, fuzzy +msgid "Features" +msgstr "Fähigkeiten des Servers" + #: ../data/glade/filetransfers.glade.h:1 msgid "A list of active, completed and stopped file transfers" msgstr "Eine Liste der aktiven, fertigen und angehaltenen Dateitransfers" @@ -884,7 +1072,8 @@ msgstr "Bricht den ausgewählten Dateitransfer ab" #: ../data/glade/filetransfers.glade.h:4 msgid "Cancels the selected file transfer and removes incomplete file" -msgstr "Bricht den ausgewählten Dateitransfer ab und löscht unvollständige Daten" +msgstr "" +"Bricht den ausgewählten Dateitransfer ab und löscht unvollständige Daten" #: ../data/glade/filetransfers.glade.h:5 msgid "Clean _up" @@ -904,22 +1093,27 @@ msgstr "Entferne Dateitransfer von Liste" #: ../data/glade/filetransfers.glade.h:9 msgid "Removes completed, cancelled and failed file transfers from the list" -msgstr "Entfernt beendete, abgebrochene und fehlgeschlagene Dateitransfers von der Liste" +msgstr "" +"Entfernt beendete, abgebrochene und fehlgeschlagene Dateitransfers von der " +"Liste" #: ../data/glade/filetransfers.glade.h:10 msgid "Shows a list of file transfers between you and others" msgstr "Zeigt eine Liste von Dateiübertragungen an" #: ../data/glade/filetransfers.glade.h:11 -msgid "This action removes single file transfer from the list. If the transfer is active, it is first stopped and then removed" -msgstr "Diese Aktion entfernt einen Dateitransfer von der Liste. Falls der Transfer aktiv ist, wird er erst gestoppt, dann entfernt" +msgid "" +"This action removes single file transfer from the list. If the transfer is " +"active, it is first stopped and then removed" +msgstr "" +"Diese Aktion entfernt einen Dateitransfer von der Liste. Falls der Transfer " +"aktiv ist, wird er erst gestoppt, dann entfernt" #: ../data/glade/filetransfers.glade.h:12 msgid "When a file transfer is complete show a popup notification" msgstr "Zeige eine Benachrichtigung, wenn die Datei komplett übertragen wurde." -#: ../data/glade/filetransfers.glade.h:13 -#: ../src/filetransfers_window.py:761 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:790 msgid "_Continue" msgstr "_Fortsetzen" @@ -927,8 +1121,7 @@ msgstr "_Fortsetzen" msgid "_Notify me when a file transfer is complete" msgstr "_Benachrichtige mich, wenn der Dateitransfer abgeschlossen ist" -#: ../data/glade/filetransfers.glade.h:15 -#: ../src/filetransfers_window.py:188 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:191 msgid "_Open Containing Folder" msgstr "_Öffne Ordner" @@ -1017,11 +1210,11 @@ msgid "_Background:" msgstr "_Hintergrund:" #: ../data/glade/gc_control_popup_menu.glade.h:1 -msgid "Change _Nickname" +msgid "Change _Nickname..." msgstr "_Spitzname ändern" #: ../data/glade/gc_control_popup_menu.glade.h:2 -msgid "Change _Subject" +msgid "Change _Subject..." msgstr "_Thema ändern" #: ../data/glade/gc_control_popup_menu.glade.h:3 @@ -1029,50 +1222,58 @@ msgid "Click to see past conversation in this room" msgstr "Klicken, um die früheren Unterhaltungen in diesem Raum zu sehen" #: ../data/glade/gc_control_popup_menu.glade.h:4 -msgid "Configure _Room" +msgid "Configure _Room..." msgstr "_Raum einrichten" #: ../data/glade/gc_control_popup_menu.glade.h:5 -msgid "_Bookmark This Room" +msgid "_Bookmark" msgstr "Raum zu _Lesezeichen hinzufügen" -#: ../data/glade/gc_control_popup_menu.glade.h:7 -msgid "_Destroy room" -msgstr "_Raum zerstören" +#: ../data/glade/gc_control_popup_menu.glade.h:6 +msgid "_Destroy Room" +msgstr "_Raum auflösen" + +#: ../data/glade/gc_control_popup_menu.glade.h:8 +msgid "_Manage Room" +msgstr "Raum verwalten" + +#: ../data/glade/gc_control_popup_menu.glade.h:9 +msgid "_Minimize on close" +msgstr "Beim Schließen _minimieren" #: ../data/glade/gc_occupants_menu.glade.h:1 msgid "Mo_derator" msgstr "Mo_derator" -#: ../data/glade/gc_occupants_menu.glade.h:3 +#: ../data/glade/gc_occupants_menu.glade.h:2 +msgid "Occupant Actions" +msgstr "Benutzer Aktionen" + +#: ../data/glade/gc_occupants_menu.glade.h:5 msgid "_Admin" msgstr "_Admin" -#: ../data/glade/gc_occupants_menu.glade.h:4 +#: ../data/glade/gc_occupants_menu.glade.h:6 msgid "_Ban" msgstr "_Verbannen" -#: ../data/glade/gc_occupants_menu.glade.h:6 +#: ../data/glade/gc_occupants_menu.glade.h:8 msgid "_Kick" msgstr "_Rausschmeißen" -#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/gc_occupants_menu.glade.h:9 msgid "_Member" msgstr "_Mitglied" -#: ../data/glade/gc_occupants_menu.glade.h:8 -msgid "_Occupant Actions" -msgstr "_Benutzer Aktionen" - -#: ../data/glade/gc_occupants_menu.glade.h:9 +#: ../data/glade/gc_occupants_menu.glade.h:10 msgid "_Owner" msgstr "_Besitzer" -#: ../data/glade/gc_occupants_menu.glade.h:10 +#: ../data/glade/gc_occupants_menu.glade.h:11 msgid "_Send Private Message" msgstr "Private Nachricht _senden" -#: ../data/glade/gc_occupants_menu.glade.h:11 +#: ../data/glade/gc_occupants_menu.glade.h:12 msgid "_Voice" msgstr "_Stimme verleihen" @@ -1080,15 +1281,13 @@ msgstr "_Stimme verleihen" msgid "Create new post" msgstr "Neue Nachricht" -#: ../data/glade/groups_post_window.glade.h:2 -#: ../src/common/helpers.py:268 +#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:280 msgid "From" msgstr "Von" #. holds subject -#: ../data/glade/groups_post_window.glade.h:3 -#: ../src/history_manager.py:142 -#: ../src/history_manager.py:173 +#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:147 +#: ../src/history_manager.py:178 msgid "Subject" msgstr "Betreff" @@ -1099,14 +1298,17 @@ msgid "" "You can select logs from the left and/or search database from below.\n" "\n" "WARNING:\n" -"If you plan to do massive deletions, please make sure Gajim is not running. Generally avoid deletions with contacts you currently chat with." +"If you plan to do massive deletions, please make sure Gajim is not running. " +"Generally avoid deletions with contacts you currently chat with." msgstr "" "Willkommen zum Gajim Verlaufsmanager\n" "\n" "Sie können Logs links auswählen und/oder unten die Datenbank durchsuchen.\n" "\n" "WARNUNG:\n" -"Wenn Sie massiv Daten löschen möchten, stellen Sie sicher, dass Gajim nicht läuft. Vermeiden Sie generell Löschungen von Kontakten, mit denen Sie gerade chatten." +"Wenn Sie massiv Daten löschen möchten, stellen Sie sicher, dass Gajim nicht " +"läuft. Vermeiden Sie generell Löschungen von Kontakten, mit denen Sie gerade " +"chatten." #: ../data/glade/history_manager.glade.h:7 msgid "Delete" @@ -1125,25 +1327,50 @@ msgid "_Search Database" msgstr "_Suche Datenbank" #: ../data/glade/history_window.glade.h:1 -msgid "Build custom query" -msgstr "Personalisierte Anfrage bauen" +msgid "History Viewer" +msgstr "Verlauf ansehen" #: ../data/glade/history_window.glade.h:2 +msgid "JID Selection" +msgstr "JID Auswahl" + +#: ../data/glade/history_window.glade.h:3 +msgid "" +"Choose the chatlog you want to view. \n" +"Enter the jid of a groupchat or a contact here. For online accounts you can " +"even enter a a contact's nickname." +msgstr "" + +#: ../data/glade/history_window.glade.h:5 ../src/history_window.py:224 msgid "Conversation History" msgstr "Unterhaltungsverlauf" -#: ../data/glade/history_window.glade.h:3 -msgid "Query Builder..." -msgstr "Anfrage-Baukasten ..." +#: ../data/glade/history_window.glade.h:6 +msgid "" +"Current History\n" +"All Chat Histories" +msgstr "" -#: ../data/glade/history_window.glade.h:4 +#: ../data/glade/history_window.glade.h:8 +#: ../data/glade/search_window.glade.h:2 msgid "Search" msgstr "Suche" -#: ../data/glade/history_window.glade.h:5 +#: ../data/glade/history_window.glade.h:9 +#: ../data/glade/zeroconf_information_window.glade.h:10 +msgid "_Log conversation history" +msgstr "Unterhaltungs-Ver_lauf" + +#: ../data/glade/history_window.glade.h:10 +#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1182 msgid "_Search" msgstr "_Suche" +#: ../data/glade/history_window.glade.h:11 +#, fuzzy +msgid "in" +msgstr "Neun" + #: ../data/glade/invitation_received_dialog.glade.h:1 msgid "Accept" msgstr "Akzeptieren" @@ -1157,8 +1384,7 @@ msgstr "Ablehnen" msgid "Invitation Received" msgstr "Einladung empfangen" -#: ../data/glade/join_groupchat_window.glade.h:1 -#: ../src/dialogs.py:1208 +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1385 msgid "Join Group Chat" msgstr "Betrete Gruppenchat" @@ -1167,14 +1393,14 @@ msgid "Join this room automatically when I connect" msgstr "Betrete diesen Raum automatisch, wenn ich mich verbinde" #: ../data/glade/join_groupchat_window.glade.h:3 -#: ../data/glade/manage_bookmarks_window.glade.h:4 +#: ../data/glade/manage_bookmarks_window.glade.h:5 #: ../data/glade/profile_window.glade.h:24 -#: ../data/glade/vcard_information_window.glade.h:29 +#: ../data/glade/vcard_information_window.glade.h:31 msgid "Nickname:" msgstr "Spitzname:" #: ../data/glade/join_groupchat_window.glade.h:4 -#: ../data/glade/manage_bookmarks_window.glade.h:5 +#: ../data/glade/manage_bookmarks_window.glade.h:6 msgid "Password:" msgstr "Passwort:" @@ -1183,13 +1409,12 @@ msgid "Recently:" msgstr "Kürzlich:" #: ../data/glade/join_groupchat_window.glade.h:6 -#: ../data/glade/manage_bookmarks_window.glade.h:7 +#: ../data/glade/manage_bookmarks_window.glade.h:8 msgid "Room:" msgstr "Raum:" -#: ../data/glade/join_groupchat_window.glade.h:7 -#: ../src/disco.py:1163 -#: ../src/disco.py:1546 +#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1170 +#: ../src/disco.py:1625 msgid "_Join" msgstr "_Betreten" @@ -1209,15 +1434,19 @@ msgstr "Wenn aktiviert, tritt Gajim dem Gruppenchat beim Programmstart bei" msgid "Manage Bookmarks" msgstr "Verwalte Lesezeichen" -#: ../data/glade/manage_bookmarks_window.glade.h:6 +#: ../data/glade/manage_bookmarks_window.glade.h:4 +msgid "Minimize on Auto Join" +msgstr "Minimieren bei Auto-Join" + +#: ../data/glade/manage_bookmarks_window.glade.h:7 msgid "Print status:" msgstr "Status anzeigen:" -#: ../data/glade/manage_bookmarks_window.glade.h:8 +#: ../data/glade/manage_bookmarks_window.glade.h:9 msgid "Server:" msgstr "Server:" -#: ../data/glade/manage_bookmarks_window.glade.h:9 +#: ../data/glade/manage_bookmarks_window.glade.h:10 msgid "Title:" msgstr "Titel:" @@ -1243,10 +1472,14 @@ msgstr "Proxy Verwaltung" #: ../data/glade/manage_proxies_window.glade.h:6 #: ../data/glade/profile_window.glade.h:23 -#: ../data/glade/vcard_information_window.glade.h:28 +#: ../data/glade/vcard_information_window.glade.h:30 msgid "Name:" msgstr "Name:" +#: ../data/glade/manage_proxies_window.glade.h:7 +msgid "Pass_word:" +msgstr "Pass_wort:" + #: ../data/glade/manage_proxies_window.glade.h:8 msgid "Type:" msgstr "Art:" @@ -1255,18 +1488,21 @@ msgstr "Art:" msgid "Use authentication" msgstr "Verwende Authentifizierung" +#: ../data/glade/manage_proxies_window.glade.h:10 +msgid "_Host:" +msgstr "_Server:" + #: ../data/glade/message_window.glade.h:1 msgid "Click to insert an emoticon (Alt+M)" msgstr "Klicken Sie, um ein Emoticon einzufügen (Alt+M)" -#: ../data/glade/message_window.glade.h:2 -#: ../src/chat_control.py:1109 +#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1268 msgid "OpenPGP Encryption" -msgstr "OpenPGP-Verschlüsselung" +msgstr "Open_PGP-Verschlüsselung" #. 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:4 -#: ../data/glade/roster_window.glade.h:10 +#: ../data/glade/roster_window.glade.h:12 #: ../data/glade/subscription_request_window.glade.h:6 msgid "_Actions" msgstr "_Aktionen" @@ -1274,7 +1510,7 @@ msgstr "_Aktionen" #. 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:6 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:245 +#: ../src/filetransfers_window.py:252 msgid "_Send" msgstr "_Senden" @@ -1290,36 +1526,51 @@ msgstr "Erweiterter Konfigurations-Editor" msgid "Applications" msgstr "Anwendungen" +#: ../data/glade/preferences_window.glade.h:3 +#, fuzzy +msgid "Chat Appearance" +msgstr "Eine Regel bearbeiten" + #. a header for custom browser/client/file manager. so translate sth like: Custom Settings -#: ../data/glade/preferences_window.glade.h:4 +#: ../data/glade/preferences_window.glade.h:5 msgid "Custom" msgstr "Benutzerdefiniert" -#: ../data/glade/preferences_window.glade.h:5 +#: ../data/glade/preferences_window.glade.h:6 msgid "Format of a line" msgstr "Format einer Zeile" -#: ../data/glade/preferences_window.glade.h:6 +#: ../data/glade/preferences_window.glade.h:7 msgid "GMail Options" msgstr "Gmail-Optionen" -#: ../data/glade/preferences_window.glade.h:7 -msgid "Interface Customization" -msgstr "Benutzerdefiniertes Aussehen" - #: ../data/glade/preferences_window.glade.h:9 msgid "Preset Status Messages" msgstr "Voreingestellte Status-Nachrichten" +#: ../data/glade/preferences_window.glade.h:10 +#, fuzzy +msgid "Privacy" +msgstr "Privatsphären-Liste" + #: ../data/glade/preferences_window.glade.h:11 +msgid "Roster Appearance" +msgstr "Roster-Aussehen" + +#: ../data/glade/preferences_window.glade.h:13 +#, fuzzy +msgid "Themes" +msgstr "Eigenschaften" + +#: ../data/glade/preferences_window.glade.h:14 msgid "Visual Notifications" msgstr "Visuelle Benachrichtigungen" -#: ../data/glade/preferences_window.glade.h:12 +#: ../data/glade/preferences_window.glade.h:15 msgid "Advanced" msgstr "Erweitert" -#: ../data/glade/preferences_window.glade.h:13 +#: ../data/glade/preferences_window.glade.h:16 msgid "" "All chat states\n" "Composing only\n" @@ -1329,39 +1580,44 @@ msgstr "" "Nur beim Schreiben\n" "Deaktiviert" -#: ../data/glade/preferences_window.glade.h:16 +#: ../data/glade/preferences_window.glade.h:19 msgid "Allow _OS information to be sent" msgstr "Sende _Betriebssystem-Information" -#: ../data/glade/preferences_window.glade.h:17 +#: ../data/glade/preferences_window.glade.h:20 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" -msgstr "Popups/Benachrichtigungen _zulassen, wenn ich abwesend/NA/beschäftigt/unsichtbar bin" +msgstr "" +"Popups/Benachrichtigungen _zulassen, wenn ich abwesend/NA/beschäftigt/" +"unsichtbar bin" -#: ../data/glade/preferences_window.glade.h:18 -msgid "Also known as iChat style" -msgstr "Auch als iChat-Stil bekannt" - -#: ../data/glade/preferences_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:21 msgid "Always check to see if Gajim is the _default Jabber client on startup" msgstr "Beim Starten überprüfen, ob Gajim der _Standard-Jabber-Client ist" -#: ../data/glade/preferences_window.glade.h:20 -msgid "An example: If you have enabled status message for away, Gajim won't ask you anymore for a status message when you change your status to away; it will use the default one set here" -msgstr "Ein Beispiel: Wenn Sie eine Status-Nachricht für Abwesend aktiviert haben, wird Sie Gajim nicht noch einmal nach einer Status-Nachricht fragen, wenn Sie Ihren Status zu Abwesend ändern; es wird die hier definierte Nachricht verwendet." +#: ../data/glade/preferences_window.glade.h:22 +msgid "" +"An example: If you have enabled status message for away, Gajim won't ask you " +"anymore for a status message when you change your status to away; it will " +"use the default one set here" +msgstr "" +"Ein Beispiel: Wenn Sie eine Status-Nachricht für Abwesend aktiviert haben, " +"wird Sie Gajim nicht noch einmal nach einer Status-Nachricht fragen, wenn " +"Sie Ihren Status zu Abwesend ändern; es wird die hier definierte Nachricht " +"verwendet." -#: ../data/glade/preferences_window.glade.h:21 +#: ../data/glade/preferences_window.glade.h:23 msgid "Ask status message when I:" msgstr "Erfrage Status-Nachricht beim: " -#: ../data/glade/preferences_window.glade.h:22 +#: ../data/glade/preferences_window.glade.h:24 msgid "Auto _away after:" msgstr "Automatisch _abwesend nach:" -#: ../data/glade/preferences_window.glade.h:23 +#: ../data/glade/preferences_window.glade.h:25 msgid "Auto _not available after:" msgstr "Automatisch _nicht verfügbar nach:" -#: ../data/glade/preferences_window.glade.h:24 +#: ../data/glade/preferences_window.glade.h:26 msgid "" "Autodetect on every Gajim startup\n" "Always use GNOME default applications\n" @@ -1372,28 +1628,28 @@ msgstr "" "Bei jedem Programmstart automatisch erkennen\n" "Immer GNOME Standard-Anwendungen verwenden\n" "Immer KDE Standard-Anwendungen verwenden\n" +"Immer XFCE4 Standard-Anwendungen verwenden\n" "Benutzerdefiniert" -#: ../data/glade/preferences_window.glade.h:29 -msgid "Chat" -msgstr "Chat" - -#: ../data/glade/preferences_window.glade.h:30 -msgid "Check this option, only if someone you don't have in the roster spams/annoys you. Use with caution, because it blocks all messages from any contact that is not in the roster" -msgstr "Aktivieren Sie diese Option nur, wenn jemand, der nicht in ihrer Liste ist, Spam an Sie verschickt oder Sie belästigt. Verwenden Sie diese Option mit Vorsicht, da sie alle Nachrichten von allen Kontakten blockiert, die nicht in ihrer Liste sind." - #: ../data/glade/preferences_window.glade.h:31 +msgid "" +"Check this option, only if someone you don't have in the roster spams/annoys " +"you. Use with caution, because it blocks all messages from any contact that " +"is not in the roster" +msgstr "" +"Aktivieren Sie diese Option nur, wenn jemand, der nicht in ihrer Liste ist, " +"Spam an Sie verschickt oder Sie belästigt. Verwenden Sie diese Option mit " +"Vorsicht, da sie alle Nachrichten von allen Kontakten blockiert, die nicht " +"in ihrer Liste sind." + +#: ../data/glade/preferences_window.glade.h:32 msgid "Configure color and font of the interface" msgstr "Farbe und Schriftart für die Oberfläche konfigurieren" -#: ../data/glade/preferences_window.glade.h:32 +#: ../data/glade/preferences_window.glade.h:33 msgid "Default Status Messages" msgstr "Vorgegebene Status-Nachrichten" -#: ../data/glade/preferences_window.glade.h:33 -msgid "Default status _iconset:" -msgstr "Standard Status-S_ymbole:" - #: ../data/glade/preferences_window.glade.h:34 msgid "" "Determined by sender\n" @@ -1417,82 +1673,96 @@ msgid "Display status _messages of contacts in roster" msgstr "Zeige die Status_nachrichten von Kontakten im Roster" #: ../data/glade/preferences_window.glade.h:40 -msgid "Displayed Chat state noti_fications:" -msgstr "Zeige Benachrichtigung über Chatstatus:" - -#: ../data/glade/preferences_window.glade.h:41 -msgid "E_very 5 minutes" -msgstr "Alle 5 _Minuten" - -#: ../data/glade/preferences_window.glade.h:42 msgid "Emoticons:" msgstr "Emoticons:" -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:41 msgid "Events" msgstr "Ereignisse" -#: ../data/glade/preferences_window.glade.h:44 -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 display in chat windows." -msgstr "Gajim kann Meta-Information, die eine Unterhaltung mit einem Kontakt betrifft, empfangen und versenden. Hier können Sie definieren, welche Chatstatus Sie in Ihrem Chatfenster anzeigen möchten." +#: ../data/glade/preferences_window.glade.h:42 +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 " +"display in chat windows." +msgstr "" +"Gajim kann Meta-Information, die eine Unterhaltung mit einem Kontakt " +"betrifft, empfangen und versenden. Hier können Sie definieren, welche " +"Chatstatus Sie in Ihrem Chatfenster anzeigen möchten." -#: ../data/glade/preferences_window.glade.h:45 -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 send to the other party." -msgstr "Gajim kann Meta-Information, die eine Unterhaltung mit einem Kontakt betrifft, empfangen und versenden. Hier können Sie definieren, welche Chatstates Sie Ihrem Gegenüber senden möchten." +#: ../data/glade/preferences_window.glade.h:43 +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 " +"send to the other party." +msgstr "" +"Gajim kann Meta-Information, die eine Unterhaltung mit einem Kontakt " +"betrifft, empfangen und versenden. Hier können Sie definieren, welche " +"Chatstates Sie Ihrem Gegenüber senden möchten." + +#: ../data/glade/preferences_window.glade.h:44 +msgid "" +"Gajim will notify you via a popup window in the bottom right of the screen " +"about contacts that just signed out" +msgstr "" +"Gajim wird Sie über ein Popup-Fenster in der rechten unteren Bildschirmecke " +"über Kontakte informieren, die sich gerade abgemeldet haben" #: ../data/glade/preferences_window.glade.h:46 -msgid "Gajim will automatically show new events by popping up the relevant window" -msgstr "Gajim wird neue Ereignisse automatisch anzeigen, indem das betreffende Fenster geöffnet wird" +msgid "Hides buttons in chatwindows to " +msgstr "Versteckt die Knöpfe im Gruppenchat-Fenster." #: ../data/glade/preferences_window.glade.h:47 -msgid "Gajim will notify you for new events via a popup in the bottom right of the screen" -msgstr "Gajim wird Sie über neue Ereignisse mit einem Popup in der rechten unteren Ecke des Bildschirms benachrichtigen" +msgid "" +"If checked, Gajim will also include information about the sender of the new " +"emails" +msgstr "" +"Wenn aktiviert, wird Gajim auch Informationen über den Absender von neuen E-" +"Mails hinzufügen." #: ../data/glade/preferences_window.glade.h:48 -msgid "Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed in" -msgstr "Gajim wird Sie über ein Popup-Fenster in der rechten unteren Ecke des Bildschirmes über Kontakte informieren, die sich gerade angemeldet haben" +msgid "" +"If checked, Gajim will display avatars of contacts in roster window and in " +"group chats" +msgstr "" +"Wenn aktiviert, wird Gajim einen Avatar im Roster-Fenster und in " +"Gruppenchats einblenden" #: ../data/glade/preferences_window.glade.h:49 -msgid "Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed out" -msgstr "Gajim wird Sie über ein Popup-Fenster in der rechten unteren Bildschirmecke über Kontakte informieren, die sich gerade abgemeldet haben" +msgid "" +"If checked, Gajim will display status messages of contacts under the contact " +"name in roster window and in group chats" +msgstr "" +"Wenn aktiviert, wird Gajim für jeden Kontakt unter dem Kontaktnamen im " +"Roster und im Gruppenchat-Fenster die Statusnachricht anzeigen" #: ../data/glade/preferences_window.glade.h:50 -msgid "Gajim will only change the icon of the contact that triggered the new event" -msgstr "Gajim wird nur das Symbol des Kontaktes ändern, von dem die neue Nachricht kommt" +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, " +"etc...)" +msgstr "" +"Wenn Sie diese Option aktivieren wird Gajim Protokoll-spezifische Symbole " +"verwenden (Ein Kontakt aus MSN wird z.B. das äquivalente MSN-Symbol für den " +"Status \"Anwesend\", \"Abwesend\", \"Beschäftigt\", etc. haben)" + +#: ../data/glade/preferences_window.glade.h:51 +msgid "" +"If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " +"animated or static graphical emoticons" +msgstr "" +"Wenn nicht deaktivert, wird Gajim ASCII-Smilies wie ':)' mit äquivalenten " +"graphischen Emoticons ersetzen" #: ../data/glade/preferences_window.glade.h:52 -msgid "If checked, Gajim will also include information about the sender of the new emails" -msgstr "Wenn aktiviert, wird Gajim auch Informationen über den Absender von neuen E-Mails hinzufügen." - -#: ../data/glade/preferences_window.glade.h:53 -msgid "If checked, Gajim will display avatars of contacts in roster window and in group chats" -msgstr "Wenn aktiviert, wird Gajim einen Avatar im Roster-Fenster und in Gruppenchats einblenden" - -#: ../data/glade/preferences_window.glade.h:54 -msgid "If checked, Gajim will display status messages of contacts under the contact name in roster window and in group chats" -msgstr "Wenn aktiviert, wird Gajim für jeden Kontakt unter dem Kontaktnamen im Roster und im Gruppenchat-Fenster die Statusnachricht anzeigen" - -#: ../data/glade/preferences_window.glade.h:55 -msgid "If checked, Gajim will remember the roster and chat window positions in the screen and the sizes of them next time you run it" -msgstr "Wenn aktiviert, erinnert sich Gajim an die Position und Größe der Kontaktliste auf dem Bildschirm beim nächsten Start" - -#: ../data/glade/preferences_window.glade.h:56 -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, etc...)" -msgstr "Wenn Sie diese Option aktivieren wird Gajim Protokoll-spezifische Symbole verwenden (Ein Kontakt aus MSN wird z.B. das äquivalente MSN-Symbol für den Status \"Anwesend\", \"Abwesend\", \"Beschäftigt\", etc. haben)" - -#: ../data/glade/preferences_window.glade.h:57 -msgid "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons" -msgstr "Wenn nicht deaktivert, wird Gajim ASCII-Smilies wie ':)' mit äquivalenten graphischen Emoticons ersetzen" - -#: ../data/glade/preferences_window.glade.h:58 msgid "Ignore rich content in incoming messages" msgstr "Formatierten Inhalt in ankommenden Nachrichten ignorieren" -#: ../data/glade/preferences_window.glade.h:59 +#: ../data/glade/preferences_window.glade.h:53 msgid "Ma_nage..." msgstr "_Verwalte..." -#: ../data/glade/preferences_window.glade.h:60 +#: ../data/glade/preferences_window.glade.h:54 msgid "" "Never\n" "Always\n" @@ -1504,183 +1774,187 @@ msgstr "" "Pro Account\n" "Pro Typ" -#: ../data/glade/preferences_window.glade.h:64 -msgid "Notify me about contacts that: " -msgstr "Über Kontakte benachrichtigen, die sich " +#: ../data/glade/preferences_window.glade.h:58 +msgid "Notify me about contacts that sign _in" +msgstr "Über Kontakte benachrichtigen, die sich einloggen" -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:59 +msgid "Notify me about contacts that sign _out" +msgstr "Über Kontakte benachrichtigen, die sich abmelden" + +#: ../data/glade/preferences_window.glade.h:60 msgid "Notify on new _GMail email" msgstr "Über neue _Google Mail E-Mails benachrichtigen" -#: ../data/glade/preferences_window.glade.h:66 -msgid "On every _message" -msgstr "In jeder _Zeile" - -#: ../data/glade/preferences_window.glade.h:67 -msgid "One message _window:" -msgstr "Ein _Nachrichtenfenster:" - -#: ../data/glade/preferences_window.glade.h:68 -msgid "Outgoing Chat state noti_fications:" -msgstr "_Sende Chatstatus:" - -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:61 msgid "Play _sounds" msgstr "_Klänge abspielen" -#: ../data/glade/preferences_window.glade.h:70 +#: ../data/glade/preferences_window.glade.h:62 +msgid "" +"Pop it up\n" +"Notify me about it\n" +"Show only in roster" +msgstr "" +"Popup öffnen\n" +"Benachrichtige mich darüber\n" +"Nur im Roster anzeigen" + +#: ../data/glade/preferences_window.glade.h:65 msgid "Preferences" msgstr "Einstellungen" -#: ../data/glade/preferences_window.glade.h:71 -msgid "Print time:" -msgstr "Zeit anzeigen:" +#: ../data/glade/preferences_window.glade.h:66 +#, fuzzy +msgid "Privacy" +msgstr "Privatliste" -#: ../data/glade/preferences_window.glade.h:72 -msgid "Save _position and size for roster and chat windows" -msgstr "Speichere _Position und Größe der Kontaktliste und Chatfenster" - -#: ../data/glade/preferences_window.glade.h:73 +#: ../data/glade/preferences_window.glade.h:67 msgid "Set status message to reflect currently playing _music track" msgstr "Setze Status-Nachricht auf den aktuell spielenden _Musiktitel" -#: ../data/glade/preferences_window.glade.h:74 -msgid "Show only in _roster" -msgstr "Nur in der _Kontaktliste anzeigen" - -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:68 msgid "Sign _in" msgstr "_anmelden" -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:69 msgid "Sign _out" msgstr "a_bmelden" -#: ../data/glade/preferences_window.glade.h:77 -msgid "Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text." -msgstr "Einige Nachrichten könnten formatierten Inhalt enthalten (Farben, Schriftarten etc.). Wenn aktiviert, wird Gajim nur den puren Nachrichtentext anzeigen." +#: ../data/glade/preferences_window.glade.h:70 +msgid "" +"Some messages may include rich content (formatting, colors etc). If checked, " +"Gajim will just display the raw message text." +msgstr "" +"Einige Nachrichten könnten formatierten Inhalt enthalten (Farben, " +"Schriftarten etc.). Wenn aktiviert, wird Gajim nur den puren Nachrichtentext " +"anzeigen." -#: ../data/glade/preferences_window.glade.h:78 +#: ../data/glade/preferences_window.glade.h:71 msgid "Status" msgstr "Status" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:72 +msgid "Status _iconset:" +msgstr "Status-S_ymbole:" + +#: ../data/glade/preferences_window.glade.h:73 msgid "T_heme:" msgstr "T_hema:" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:74 msgid "The auto away status message" msgstr "Automatische Statusnachricht für Abwesend" -#: ../data/glade/preferences_window.glade.h:81 +#: ../data/glade/preferences_window.glade.h:75 msgid "The auto not available status message" msgstr "Automatische Statusnachricht für Nicht verfügbar" -#: ../data/glade/preferences_window.glade.h:82 +#: ../data/glade/preferences_window.glade.h:76 msgid "Treat all incoming messages as:" msgstr " Behandle alle eingehenden Nachrichten als:" -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:77 msgid "Use _transports iconsets" msgstr "_Transport-Symbole verwenden" -#: ../data/glade/preferences_window.glade.h:84 +#: ../data/glade/preferences_window.glade.h:78 +msgid "Use only one message _window:" +msgstr "Nur ein _Nachrichtenfenster:" + +#: ../data/glade/preferences_window.glade.h:79 msgid "Use system _default" msgstr "Benutze System-_Voreinstellung" -#: ../data/glade/preferences_window.glade.h:85 -msgid "Use t_rayicon (aka. notification area icon)" -msgstr "Verwende _Trayicon (Benachrichtigungs-Icon)" - -#: ../data/glade/preferences_window.glade.h:86 -msgid "When a new event (message, file transfer request etc..) is received, the following methods may be used to inform you about it. Please note that events about new messages only occur if it is a new message from a contact you are not already chatting with" -msgstr "Wenn ein neues Ereignis (Nachricht, Dateitransferanfrage usw.) empfangen wird, können die folgenden Methoden zur Benachrichtigung verwendet werden. Bitte beachten Sie, dass Ereignisse über neue Nachrichten nur auftreten, wenn Sie eine Nachricht von einem Kontakt erhalten, mit dem Sie nicht bereits chatten" - -#: ../data/glade/preferences_window.glade.h:87 -msgid "When new event is received" +#: ../data/glade/preferences_window.glade.h:80 +msgid "When new event is received:" msgstr "Wenn neue Nachricht empfangen wird" -#: ../data/glade/preferences_window.glade.h:88 -msgid "Works for Rhythmbox and Muine players. For more players, please visit http://trac.gajim.org/wiki/GajimAndMusicPlayer" -msgstr "Funktioniert mit Rhythmbox und Muine. Für weitere Wiedergabeprogramme besuchen Sie bitte http://trac.gajim.org/wiki/GajimAndMusicPlayer (Englisch)" +#: ../data/glade/preferences_window.glade.h:81 +msgid "" +"Works for Rhythmbox and Muine players. For more players, please visit http://" +"trac.gajim.org/wiki/GajimAndMusicPlayer" +msgstr "" +"Funktioniert mit Rhythmbox und Muine. Für weitere Wiedergabeprogramme " +"besuchen Sie bitte http://trac.gajim.org/wiki/GajimAndMusicPlayer (Englisch)" -#: ../data/glade/preferences_window.glade.h:89 +#: ../data/glade/preferences_window.glade.h:82 msgid "_Advanced Notifications Control..." msgstr "_Erweiterter Konfigurations-Editor..." -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:83 msgid "_Browser:" msgstr "_Browser:" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:84 +msgid "_Display chat state notifications:" +msgstr "Zeige Benachrichtigung über Chatstatus:" + +#: ../data/glade/preferences_window.glade.h:85 msgid "_File manager:" msgstr "_Dateimanager:" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:86 msgid "_Font:" msgstr "_Schriftart:" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:87 msgid "_Highlight misspelled words" msgstr "Falsch geschriebene Wörter _hervorheben" -#: ../data/glade/preferences_window.glade.h:94 +#: ../data/glade/preferences_window.glade.h:88 msgid "_Ignore events from contacts not in the roster" msgstr "Ereignisse von Kontakten, die nicht in der Liste sind, _ignorieren" -#: ../data/glade/preferences_window.glade.h:95 +#: ../data/glade/preferences_window.glade.h:89 msgid "_Incoming message:" msgstr "_Eingehende Nachricht:" -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:90 msgid "_Log status changes of contacts" msgstr "_Logge die Statusveränderungen von Kontakten" -#: ../data/glade/preferences_window.glade.h:97 +#: ../data/glade/preferences_window.glade.h:91 msgid "_Mail client:" msgstr "_Mail-Programm:" -#: ../data/glade/preferences_window.glade.h:98 -msgid "_Never" -msgstr "_Nie" +#: ../data/glade/preferences_window.glade.h:92 +msgid "_Make message windows compact" +msgstr "Nachrichtenfenster _kompakt anzeigen" -#: ../data/glade/preferences_window.glade.h:99 -msgid "_Notify me about it" -msgstr "Be_nachrichtigen" - -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:93 msgid "_Open..." msgstr "Ö_ffnen..." -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:94 msgid "_Outgoing message:" msgstr "_Ausgehende Nachricht:" -#: ../data/glade/preferences_window.glade.h:102 +#: ../data/glade/preferences_window.glade.h:95 msgid "_Player:" msgstr "_Player:" -#: ../data/glade/preferences_window.glade.h:103 -msgid "_Pop it up" -msgstr "_Öffnen" - -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:96 msgid "_Reset to Default Colors" msgstr "Auf Standard-Farben zu_rücksetzen" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:97 +msgid "_Send chat state notifications:" +msgstr "Zeige Benachrichtigung über Chatstatus:" + +#: ../data/glade/preferences_window.glade.h:98 msgid "_Sort contacts by status" msgstr "Kontakte nach Status _sortieren" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:99 msgid "_Status message:" msgstr "_Statusnachricht:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:100 msgid "_URL:" msgstr "_URL:" -#: ../data/glade/preferences_window.glade.h:108 +#: ../data/glade/preferences_window.glade.h:101 msgid "minutes" msgstr "Minuten" @@ -1724,8 +1998,7 @@ msgstr "Jabber-ID:" msgid "Order:" msgstr "Reihenfolge:" -#: ../data/glade/privacy_list_window.glade.h:11 -#: ../src/dialogs.py:2052 +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2258 msgid "Privacy List" msgstr "Privatliste" @@ -1800,111 +2073,103 @@ msgid "Company:" msgstr "Firma:" #: ../data/glade/profile_window.glade.h:9 -#: ../data/glade/vcard_information_window.glade.h:13 +#: ../data/glade/vcard_information_window.glade.h:14 msgid "Country:" msgstr "Land:" #: ../data/glade/profile_window.glade.h:10 -#: ../data/glade/vcard_information_window.glade.h:14 +#: ../data/glade/vcard_information_window.glade.h:15 msgid "Department:" msgstr "Abteilung:" -#: ../data/glade/profile_window.glade.h:11 -#: ../data/glade/vcard_information_window.glade.h:15 -#: ../data/glade/zeroconf_information_window.glade.h:2 -#: ../data/glade/zeroconf_properties_window.glade.h:5 -msgid "E-Mail:" -msgstr "E-Mail:" - #: ../data/glade/profile_window.glade.h:12 -#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/vcard_information_window.glade.h:17 msgid "Extra Address:" msgstr "Zusatz-Adresse:" #. Family Name #: ../data/glade/profile_window.glade.h:14 -#: ../data/glade/vcard_information_window.glade.h:18 +#: ../data/glade/vcard_information_window.glade.h:19 msgid "Family:" msgstr "Nachname:" #. Do NOT change sequence. Just translate YYYY and MM and DD (from Year, Month, Day accordingly) #: ../data/glade/profile_window.glade.h:16 -#: ../data/glade/vcard_information_window.glade.h:20 +#: ../data/glade/vcard_information_window.glade.h:21 msgid "Format: YYYY-MM-DD" msgstr "Format: JJJJ-MM-TT" -#. Given Name -#: ../data/glade/profile_window.glade.h:18 +#: ../data/glade/profile_window.glade.h:17 #: ../data/glade/vcard_information_window.glade.h:22 +msgid "Full Name" +msgstr "Name" + +#. Given Name +#: ../data/glade/profile_window.glade.h:19 +#: ../data/glade/vcard_information_window.glade.h:24 msgid "Given:" msgstr "Vorname:" -#: ../data/glade/profile_window.glade.h:19 -#: ../data/glade/vcard_information_window.glade.h:23 +#: ../data/glade/profile_window.glade.h:20 +#: ../data/glade/vcard_information_window.glade.h:25 msgid "Homepage:" msgstr "Homepage:" #. Middle Name -#: ../data/glade/profile_window.glade.h:21 -#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/profile_window.glade.h:22 +#: ../data/glade/vcard_information_window.glade.h:28 msgid "Middle:" msgstr "Mittelname" -#: ../data/glade/profile_window.glade.h:22 -#: ../data/glade/vcard_information_window.glade.h:27 -msgid "More" -msgstr "Mehr" - #: ../data/glade/profile_window.glade.h:25 -#: ../data/glade/vcard_information_window.glade.h:31 +#: ../data/glade/vcard_information_window.glade.h:34 msgid "Personal Info" msgstr "Persönliche Details" #: ../data/glade/profile_window.glade.h:27 -#: ../data/glade/vcard_information_window.glade.h:32 +#: ../data/glade/vcard_information_window.glade.h:35 msgid "Phone No.:" msgstr "Telefon-Nummer:" #: ../data/glade/profile_window.glade.h:28 -#: ../data/glade/vcard_information_window.glade.h:33 +#: ../data/glade/vcard_information_window.glade.h:36 msgid "Position:" msgstr "Position:" #: ../data/glade/profile_window.glade.h:29 -#: ../data/glade/vcard_information_window.glade.h:34 +#: ../data/glade/vcard_information_window.glade.h:37 msgid "Postal Code:" msgstr "Postleitzahl:" #. Prefix in Name #: ../data/glade/profile_window.glade.h:31 -#: ../data/glade/vcard_information_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:39 msgid "Prefix:" msgstr "Präfix" #: ../data/glade/profile_window.glade.h:32 -#: ../data/glade/vcard_information_window.glade.h:38 -#: ../src/vcard.py:273 +#: ../data/glade/vcard_information_window.glade.h:41 ../src/vcard.py:307 msgid "Role:" msgstr "Rolle:" #: ../data/glade/profile_window.glade.h:33 -#: ../data/glade/vcard_information_window.glade.h:39 +#: ../data/glade/vcard_information_window.glade.h:42 msgid "State:" msgstr "Staat:" #: ../data/glade/profile_window.glade.h:34 -#: ../data/glade/vcard_information_window.glade.h:41 +#: ../data/glade/vcard_information_window.glade.h:44 msgid "Street:" msgstr "Straße:" #. Suffix in Name #: ../data/glade/profile_window.glade.h:36 -#: ../data/glade/vcard_information_window.glade.h:45 +#: ../data/glade/vcard_information_window.glade.h:48 msgid "Suffix:" msgstr "Suffix:" #: ../data/glade/profile_window.glade.h:37 -#: ../data/glade/vcard_information_window.glade.h:46 +#: ../data/glade/vcard_information_window.glade.h:50 msgid "Work" msgstr "Arbeit" @@ -1920,138 +2185,180 @@ msgstr "Konto entfernen (_nur in Gajim)" msgid "Remove account from Gajim and from _server" msgstr "Konto _entfernen (in Gajim und auf dem Server)" +#. Remove +#. Remove group +#. Remove +#: ../data/glade/remove_account_window.glade.h:4 +#: ../data/glade/roster_contact_context_menu.glade.h:18 +#: ../src/roster_window.py:2553 ../src/roster_window.py:2763 +#: ../src/roster_window.py:2899 +msgid "_Remove" +msgstr "_Entfernen" + #: ../data/glade/roster_contact_context_menu.glade.h:1 msgid "A_sk to see his/her status" msgstr "_Bitte Kontakt, seinen Status zu sehen" #: ../data/glade/roster_contact_context_menu.glade.h:2 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:1 -msgid "Add Special _Notification" +msgid "Add Special _Notification..." msgstr "Spezielle Be_nachrichtigung hinzufügen" #: ../data/glade/roster_contact_context_menu.glade.h:3 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:2 -msgid "Assign Open_PGP Key" +msgid "Assign Open_PGP Key..." msgstr "Open_PGP-Schlüssel zuweisen" #: ../data/glade/roster_contact_context_menu.glade.h:4 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:3 -#: ../src/roster_window.py:2078 -msgid "Edit _Groups" +msgid "Edit _Groups..." msgstr "_Gruppen bearbeiten" +#. Execute Command #: ../data/glade/roster_contact_context_menu.glade.h:5 -#: ../src/roster_window.py:2213 +#: ../src/roster_window.py:2856 msgid "Execute Command..." msgstr "_Befehl ausführen..." +#. Invite to Groupchat #: ../data/glade/roster_contact_context_menu.glade.h:6 -#: ../src/roster_window.py:2036 +#: ../src/roster_window.py:2469 msgid "In_vite to" msgstr "_Einladen zu" +#. Send Custom Status #: ../data/glade/roster_contact_context_menu.glade.h:7 -#: ../data/glade/systray_context_menu.glade.h:2 -msgid "Send Single _Message" -msgstr "Einzelne Nachricht _senden..." +#: ../src/roster_window.py:2693 ../src/roster_window.py:2827 +msgid "Send Cus_tom Status" +msgstr "Benutzerdefinierten Status senden" + +#: ../data/glade/roster_contact_context_menu.glade.h:8 +msgid "Send Single _Message..." +msgstr "Einzelne _Nachricht senden..." #: ../data/glade/roster_contact_context_menu.glade.h:9 +msgid "Send _File..." +msgstr "_Datei senden" + +#: ../data/glade/roster_contact_context_menu.glade.h:10 +msgid "Set Custom _Avatar..." +msgstr "Benutzerdefinierten Avatar wählen..." + +#: ../data/glade/roster_contact_context_menu.glade.h:11 #: ../data/glade/zeroconf_contact_context_menu.glade.h:5 msgid "Start _Chat" msgstr "_Chat starten" -#: ../data/glade/roster_contact_context_menu.glade.h:11 +#: ../data/glade/roster_contact_context_menu.glade.h:13 msgid "_Allow him/her to see my status" msgstr "_Erlaube Kontakt, meinen Status zu sehen" -#: ../data/glade/roster_contact_context_menu.glade.h:12 +#: ../data/glade/roster_contact_context_menu.glade.h:14 +#: ../src/roster_window.py:2543 ../src/roster_window.py:2754 +msgid "_Block" +msgstr "_Blockieren" + +#: ../data/glade/roster_contact_context_menu.glade.h:15 msgid "_Forbid him/her to see my status" msgstr "_Verbiete Kontakt, meinen Status zu sehen" -#. Remove group -#: ../data/glade/roster_contact_context_menu.glade.h:14 -#: ../src/roster_window.py:2030 -#: ../src/roster_window.py:2127 -#: ../src/roster_window.py:2234 -msgid "_Remove from Roster" -msgstr "Entfernen von _Kontaktliste" - -#: ../data/glade/roster_contact_context_menu.glade.h:15 +#: ../data/glade/roster_contact_context_menu.glade.h:17 #: ../data/glade/zeroconf_contact_context_menu.glade.h:7 -#: ../src/roster_window.py:2222 -msgid "_Rename" +msgid "_Manage Contact" +msgstr "Kontakt verwalten" + +#: ../data/glade/roster_contact_context_menu.glade.h:19 +msgid "_Rename..." msgstr "_Umbenennen" -#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/roster_contact_context_menu.glade.h:20 msgid "_Subscription" msgstr "_Abonnement" +#: ../data/glade/roster_contact_context_menu.glade.h:21 +#: ../src/roster_window.py:2537 ../src/roster_window.py:2748 +msgid "_Unblock" +msgstr "Entblocken" + #: ../data/glade/roster_window.glade.h:1 msgid "A_ccounts" msgstr "_Konten" #: ../data/glade/roster_window.glade.h:2 -msgid "Add _Contact" -msgstr "_Kontakt hinzufügen" +msgid "Add _Contact..." +msgstr "Kontakt _hinzufügen..." #: ../data/glade/roster_window.glade.h:3 +#, fuzzy +msgid "Fea_tures" +msgstr "Fähigkeiten des Servers" + +#: ../data/glade/roster_window.glade.h:4 msgid "File _Transfers" msgstr "_Dateitransfers" -#: ../data/glade/roster_window.glade.h:4 +#: ../data/glade/roster_window.glade.h:5 msgid "Frequently Asked Questions (online)" msgstr "Häufig gestellte Fragen (online)" -#: ../data/glade/roster_window.glade.h:6 +#: ../data/glade/roster_window.glade.h:7 msgid "Help online" msgstr "Online-Hilfe" -#: ../data/glade/roster_window.glade.h:7 +#: ../data/glade/roster_window.glade.h:9 msgid "Profile, A_vatar" msgstr "Profile, A_vatar" -#: ../data/glade/roster_window.glade.h:8 +#: ../data/glade/roster_window.glade.h:10 msgid "Show Trans_ports" msgstr "Zeige Trans_porte" -#: ../data/glade/roster_window.glade.h:9 +#: ../data/glade/roster_window.glade.h:11 msgid "Show _Offline Contacts" msgstr "_Abgemeldete Kontakte anzeigen" -#: ../data/glade/roster_window.glade.h:12 +#: ../data/glade/roster_window.glade.h:14 msgid "_Contents" msgstr "In_halte" -#: ../data/glade/roster_window.glade.h:13 -msgid "_Discover Services" -msgstr "_Dienste durchsuchen" - -#: ../data/glade/roster_window.glade.h:14 -#: ../src/disco.py:1284 -#: ../src/roster_window.py:2205 +#: ../data/glade/roster_window.glade.h:16 ../src/disco.py:1358 msgid "_Edit" msgstr "_Ändern" -#: ../data/glade/roster_window.glade.h:15 +#: ../data/glade/roster_window.glade.h:17 msgid "_FAQ" msgstr "_FAQ" -#: ../data/glade/roster_window.glade.h:17 +#: ../data/glade/roster_window.glade.h:18 msgid "_Help" msgstr "_Hilfe" -#: ../data/glade/roster_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:20 msgid "_Preferences" msgstr "_Einstellungen" -#: ../data/glade/roster_window.glade.h:19 +#: ../data/glade/roster_window.glade.h:21 msgid "_Quit" msgstr "_Beenden" -#: ../data/glade/roster_window.glade.h:21 +#: ../data/glade/roster_window.glade.h:22 +msgid "_Send Single Message..." +msgstr "Einzelne _Nachricht senden..." + +#: ../data/glade/roster_window.glade.h:24 msgid "_View" msgstr "_Ansicht" +#: ../data/glade/search_window.glade.h:1 +msgid "Please wait while retrieving search form..." +msgstr "Bitte warten Sie, während das Suchformular geladen wird ..." + +#: ../data/glade/search_window.glade.h:3 +msgid "_Add contact" +msgstr "_Kontakt hinzufügen" + +#. Information +#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:2911 +msgid "_Information" +msgstr "Informationen" + #: ../data/glade/service_discovery_window.glade.h:1 msgid "G_o" msgstr "_Los" @@ -2060,10 +2367,6 @@ msgstr "_Los" msgid "_Address:" msgstr "_Adresse:" -#: ../data/glade/service_discovery_window.glade.h:3 -msgid "_Filter:" -msgstr "_Filter:" - #: ../data/glade/service_registration_window.glade.h:1 msgid "Register to" msgstr "Registrieren auf" @@ -2125,8 +2428,12 @@ msgid "Authorize contact so he or she can know when you're connected" msgstr "Kontakt autorisieren, so dass er Ihren Status sehen kann" #: ../data/glade/subscription_request_window.glade.h:3 -msgid "Deny authorization from contact so he or she cannot know when you're connected" -msgstr "Autorisierung des Kontakts verweigern, so dass er nicht sehen kann, wann Sie verbunden sind" +msgid "" +"Deny authorization from contact so he or she cannot know when you're " +"connected" +msgstr "" +"Autorisierung des Kontakts verweigern, so dass er nicht sehen kann, wann Sie " +"verbunden sind" #: ../data/glade/subscription_request_window.glade.h:4 msgid "Subscription Request" @@ -2136,10 +2443,29 @@ msgstr "Abonnementanfrage" msgid "_Deny" msgstr "_Ablehnen" +#: ../data/glade/synchronise_select_account_dialog.glade.h:1 +#, fuzzy +msgid "Select the account with which you want to synchronise" +msgstr "JID des Kontakts mit dem Sie chatten möchten" + +#: ../data/glade/synchronise_select_contacts_dialog.glade.h:1 +#, fuzzy +msgid "Select the contacts you want to synchronise" +msgstr "JID der Kontakte die Sie synchronisieren möchten" + +#: ../data/glade/synchronise_select_contacts_dialog.glade.h:2 +#, fuzzy +msgid "Synchronise : select contacts" +msgstr "Synchronisiere gewählte Kontakte" + #: ../data/glade/systray_context_menu.glade.h:1 msgid "Mute Sounds" msgstr "_Klänge stummschalten" +#: ../data/glade/systray_context_menu.glade.h:2 +msgid "Send Single _Message" +msgstr "Einzelne Nachricht _senden..." + #: ../data/glade/systray_context_menu.glade.h:3 msgid "Show All Pending _Events" msgstr "Zeige alle schwebenden _Ereignisse" @@ -2152,6 +2478,10 @@ msgstr "_Roster anzeigen" msgid "Sta_tus" msgstr "Sta_tus" +#: ../data/glade/systray_context_menu.glade.h:6 +msgid "_Group Chat" +msgstr "_Gruppenchat" + #. Given Name #: ../data/glade/vcard_information_window.glade.h:5 msgid "Ask:" @@ -2166,44 +2496,44 @@ msgid "Comments" msgstr "Kommentare" #: ../data/glade/vcard_information_window.glade.h:11 +msgid "Configured avatar:" +msgstr "Gewählter Avatar:" + +#: ../data/glade/vcard_information_window.glade.h:12 #: ../data/glade/zeroconf_information_window.glade.h:1 msgid "Contact" msgstr "Kontakt" -#: ../data/glade/vcard_information_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:13 msgid "Contact Information" msgstr "Kontakt-Information" -#: ../data/glade/vcard_information_window.glade.h:24 -#: ../data/glade/zeroconf_information_window.glade.h:4 -#: ../data/glade/zeroconf_properties_window.glade.h:13 -#: ../src/dialogs.py:416 -msgid "Jabber ID:" -msgstr "Jabber-ID:" +#: ../data/glade/vcard_information_window.glade.h:29 +msgid "More" +msgstr "Mehr" -#: ../data/glade/vcard_information_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:33 msgid "OS:" msgstr "BS:" -#: ../data/glade/vcard_information_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:40 #: ../data/glade/zeroconf_information_window.glade.h:8 msgid "Resource:" msgstr "Ressource:" -#: ../data/glade/vcard_information_window.glade.h:40 +#: ../data/glade/vcard_information_window.glade.h:43 #: ../data/glade/zeroconf_information_window.glade.h:9 msgid "Status:" msgstr "Status:" #. Family Name -#: ../data/glade/vcard_information_window.glade.h:43 +#: ../data/glade/vcard_information_window.glade.h:46 msgid "Subscription:" msgstr "Abonnement:" -#: ../data/glade/vcard_information_window.glade.h:47 -#: ../data/glade/zeroconf_information_window.glade.h:10 -msgid "_Log conversation history" -msgstr "Unterhaltungs-Ver_lauf" +#: ../data/glade/vcard_information_window.glade.h:49 +msgid "User avatar:" +msgstr "Avatar auswählen" #: ../data/glade/xml_console_window.glade.h:1 msgid "Jabber Traffic" @@ -2213,11 +2543,6 @@ msgstr "Jabber Verkehrsdaten" msgid "XML Input" msgstr "XML Direkteingabe" -#. XML Console enable checkbutton -#: ../data/glade/xml_console_window.glade.h:4 -msgid "Enable" -msgstr "Einschalten" - #. Info/Query make the "IQ" initials. So translate like this 'YourLang/YourLang (Info/Query)'. Thanks (it's a tooltip so width is not a problem) #: ../data/glade/xml_console_window.glade.h:6 msgid "Info/Query" @@ -2236,15 +2561,29 @@ msgstr "_Nachricht" msgid "_Presence" msgstr "_Anwesenheit" -#: ../data/glade/zeroconf_information_window.glade.h:3 -#: ../data/glade/zeroconf_properties_window.glade.h:6 -msgid "First Name:" -msgstr "Vorname:" +#: ../data/glade/zeroconf_contact_context_menu.glade.h:1 +msgid "Add Special _Notification" +msgstr "Spezielle Be_nachrichtigung hinzufügen" -#: ../data/glade/zeroconf_information_window.glade.h:5 -#: ../data/glade/zeroconf_properties_window.glade.h:14 -msgid "Last Name:" -msgstr "Nachname:" +#: ../data/glade/zeroconf_contact_context_menu.glade.h:2 +msgid "Assign Open_PGP Key" +msgstr "Open_PGP-Schlüssel zuweisen" + +#. Edit Groups +#: ../data/glade/zeroconf_contact_context_menu.glade.h:3 +#: ../src/roster_window.py:2526 +msgid "Edit _Groups" +msgstr "_Gruppen bearbeiten" + +#. Rename +#: ../data/glade/zeroconf_contact_context_menu.glade.h:8 +#: ../src/roster_window.py:2883 +msgid "_Rename" +msgstr "_Umbenennen" + +#: ../data/glade/zeroconf_context_menu.glade.h:1 +msgid "_Modify Account..." +msgstr "_Konto bearbeiten..." #: ../data/glade/zeroconf_information_window.glade.h:6 msgid "Local jid:" @@ -2254,535 +2593,564 @@ msgstr "Lokale JID:" msgid "Personal" msgstr "Persönlich" -#: ../data/glade/zeroconf_properties_window.glade.h:11 -msgid "" -"If the default port that is used for incoming messages is unfitting for your setup you can select another one here.\n" -"You might consider to change possible firewall settings." -msgstr "" -"Wenn der Standardport, der für eingehende Nachrichten benutzt wird, nicht für Ihre Konfiguration geeignet ist, können sie hier einen anderen Port festlegen.\n" -"Möglicherweise ist es von Nöten, Ihre Firewall-Einstellungen zu ändern." - #: ../data/glade/zeroconf_properties_window.glade.h:15 msgid "Modify Account" msgstr "Konto bearbeiten" -#: ../data/glade/zeroconf_properties_window.glade.h:21 -msgid "Use custom port:" -msgstr "Verwende benutzerdefinierten Port:" - #. For i18n -#: ../src/advanced.py:51 +#: ../src/advanced.py:56 msgid "Activated" msgstr "Aktiviert" -#: ../src/advanced.py:51 +#: ../src/advanced.py:56 msgid "Deactivated" msgstr "Deaktiviert" -#: ../src/advanced.py:53 +#: ../src/advanced.py:58 msgid "Boolean" msgstr "Boolean" -#: ../src/advanced.py:54 +#: ../src/advanced.py:59 msgid "Integer" msgstr "Ganzzahl" -#: ../src/advanced.py:55 +#: ../src/advanced.py:60 msgid "Text" msgstr "Text" -#: ../src/advanced.py:56 +#: ../src/advanced.py:61 msgid "Color" msgstr "Farbe" -#: ../src/advanced.py:65 +#: ../src/advanced.py:70 msgid "Preference Name" msgstr "Einstellungsname" -#: ../src/advanced.py:71 +#: ../src/advanced.py:76 msgid "Value" msgstr "Wert" -#: ../src/advanced.py:79 +#: ../src/advanced.py:84 msgid "Type" msgstr "Typ" #. we talk about option description in advanced configuration editor -#: ../src/advanced.py:136 +#: ../src/advanced.py:140 msgid "(None)" msgstr "(Kein)" #. we talk about password -#: ../src/advanced.py:239 +#: ../src/advanced.py:243 msgid "Hidden" msgstr "Versteckt" #. 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) +#. LANG=$(for i in *.po; do j=${i/.po/}; echo -n "_('"$j"')":" '"$j"', " ; done) #. echo "{_('en'):'en'",$LANG"}" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "English" msgstr "Englisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Belarusian" msgstr "Weißrussisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Bulgarian" msgstr "Bulgarisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Breton" msgstr "Bretonisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Czech" msgstr "Tschechisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "German" msgstr "Deutsch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Greek" msgstr "Griechisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "British" msgstr "Britisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Esperanto" msgstr "Esperanto" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Spanish" msgstr "Spanisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Basque" msgstr "Baskisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "French" msgstr "Französisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Croatian" msgstr "Kroatisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Italian" msgstr "Italienisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Norwegian (b)" msgstr "Norwegisch (Bokmål)" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Dutch" msgstr "Niederländisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Norwegian" msgstr "Norwegisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Polish" msgstr "Polnisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Portuguese" msgstr "Portugiesisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Brazilian Portuguese" msgstr "Brasilianisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Russian" msgstr "Russsich" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Serbian" msgstr "Serbisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Slovak" msgstr "Slovakisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Swedish" msgstr "Schwedisch" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Chinese (Ch)" msgstr "Chinesisch" -#: ../src/chat_control.py:207 -#: ../src/dialogs.py:1706 -msgid "" -"If that is not your language for which you want to highlight misspelled words, then please set your $LANG as appropriate. Eg. for French do export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to make it global in /etc/profile.\n" -"\n" -"Highlighting misspelled words feature will not be used" -msgstr "" -"Wenn das nicht die Sprache ist, für die Sie falschgeschriebene Wörter hervorheben möchten, setzen Sie bitte Ihre $LANG entsprechend. Z.B. für Französisch: export LANG=fr_FR oder export LANG=fr_FR.UTF-8 in ~/.bash_profile or global in /etc/profile.\n" -"\n" -"Falschgeschriebene Wörter werden nicht hervorgehoben" - -#: ../src/chat_control.py:246 +#: ../src/chat_control.py:313 msgid "Spelling language" msgstr "Sprache für die Rechtschreibprüfung" #. we are not connected -#: ../src/chat_control.py:269 -#: ../src/chat_control.py:475 +#: ../src/chat_control.py:336 ../src/chat_control.py:559 msgid "A connection is not available" msgstr "Keine Verbindung verfügbar" -#: ../src/chat_control.py:270 -#: ../src/chat_control.py:476 +#: ../src/chat_control.py:337 ../src/chat_control.py:560 msgid "Your message can not be sent until you are connected." msgstr "Ihre Nachricht kann erst gesendet werden, wenn Sie verbunden sind." -#: ../src/chat_control.py:1034 +#: ../src/chat_control.py:1186 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s aus Gruppenchat %(room_name)s" #. we talk about a contact here -#: ../src/chat_control.py:1123 +#: ../src/chat_control.py:1282 #, python-format msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" -msgstr "%s hat keinen OpenPGP-Schlüssel verbreitet und es wurde keiner zugewiesen" +msgstr "" +"%s hat keinen OpenPGP-Schlüssel verbreitet und es wurde keiner zugewiesen" -#: ../src/chat_control.py:1259 +#: ../src/chat_control.py:1325 ../src/groupchat_control.py:1433 +#, python-format +msgid "No such command: /%s (if you want to send this, prefix it with /say)" +msgstr "" +"Kein Kommando: /%s (wenn Sie dies senden wollen, setzen Sie /say voran)" + +#: ../src/chat_control.py:1332 ../src/groupchat_control.py:1456 +#, python-format +msgid "Commands: %s" +msgstr "Kommandos: %s" + +#: ../src/chat_control.py:1335 ../src/groupchat_control.py:1470 +#, python-format +msgid "Usage: /%s, clears the text window." +msgstr "Bedienung: /%s, leert das Textfenster." + +#: ../src/chat_control.py:1338 ../src/groupchat_control.py:1475 +#, python-format +msgid "Usage: /%s, hide the chat buttons." +msgstr "Verwendung: /%s, versteckt die Chatbuttons." + +#: ../src/chat_control.py:1341 ../src/groupchat_control.py:1491 +#, python-format +msgid "" +"Usage: /%s , sends action to the current group chat. Use third " +"person. (e.g. /%s explodes.)" +msgstr "" +"Bedienung: /%s , sendet die Aktion im aktuellen Gruppenchat. " +"Verwende dritte Person, z.B. /%s explodiert)." + +#: ../src/chat_control.py:1345 +#, python-format +msgid "Usage: /%s, sends a ping to the contact" +msgstr "Bedienung: /%s, sendet einen Ping zum Kontakt" + +#: ../src/chat_control.py:1348 +#, python-format +msgid "Usage: /%s, send the message to the contact" +msgstr "Verwendung: /%s, sendet eine Nachricht zum Kontakt" + +#: ../src/chat_control.py:1351 ../src/groupchat_control.py:1514 +#, python-format +msgid "No help info for /%s" +msgstr "Keine Hilfe vorhanden für /%s" + +#: ../src/chat_control.py:1489 ../src/chat_control.py:1515 msgid "Encryption enabled" msgstr "Verschlüsselung aktiviert" -#: ../src/chat_control.py:1264 +#: ../src/chat_control.py:1494 +msgid "Session WILL be logged" +msgstr "Sitzung wird aufgezeichnet" + +#: ../src/chat_control.py:1496 +msgid "Session WILL NOT be logged" +msgstr "Sitzung wird nicht aufgezeichnet" + +#: ../src/chat_control.py:1503 +msgid "The following message was NOT encrypted" +msgstr "[Die folgende Nachricht wurde nicht verschlüsselt]" + +#: ../src/chat_control.py:1507 ../src/chat_control.py:1520 +#: ../src/chat_control.py:2166 msgid "Encryption disabled" msgstr "Verschlüsselung deaktiviert" #. add_to_roster_menuitem -#: ../src/chat_control.py:1408 -#: ../src/conversation_textview.py:497 -#: ../src/dialogs.py:629 -#: ../src/gajim.py:850 -#: ../src/gajim.py:851 -#: ../src/gajim.py:1196 -#: ../src/roster_window.py:333 -#: ../src/roster_window.py:411 -#: ../src/roster_window.py:1497 -#: ../src/roster_window.py:1507 -#: ../src/roster_window.py:1686 -#: ../src/roster_window.py:1892 -#: ../src/roster_window.py:2477 -#: ../src/roster_window.py:2678 -#: ../src/roster_window.py:3916 -#: ../src/roster_window.py:3918 -#: ../src/common/contacts.py:73 -#: ../src/common/helpers.py:43 -#: ../src/common/helpers.py:255 +#: ../src/chat_control.py:1683 ../src/conversation_textview.py:705 +#: ../src/dialogs.py:732 ../src/gajim.py:911 ../src/gajim.py:912 +#: ../src/gajim.py:1436 ../src/gajim.py:1687 ../src/roster_window.py:358 +#: ../src/roster_window.py:442 ../src/roster_window.py:1822 +#: ../src/roster_window.py:1832 ../src/roster_window.py:2072 +#: ../src/roster_window.py:2306 ../src/roster_window.py:3154 +#: ../src/roster_window.py:3393 ../src/roster_window.py:4755 +#: ../src/roster_window.py:4757 ../src/common/contacts.py:89 +#: ../src/common/helpers.py:53 ../src/common/helpers.py:267 msgid "Not in Roster" msgstr "Nicht in der Liste" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:1552 +#: ../src/chat_control.py:1836 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Sie haben eine neue Nachricht von \"%s\"" -#: ../src/chat_control.py:1553 -msgid "If you close this tab and you have history disabled, this message will be lost." -msgstr "Wenn sie das Fenster schließen und der Verlauf abgeschaltet ist, geht die Nachricht verloren." +#: ../src/chat_control.py:1837 +msgid "" +"If you close this tab and you have history disabled, this message will be " +"lost." +msgstr "" +"Wenn sie das Fenster schließen und der Verlauf abgeschaltet ist, geht die " +"Nachricht verloren." -#: ../src/config.py:139 -#: ../src/config.py:588 +#: ../src/config.py:127 ../src/config.py:565 msgid "Disabled" msgstr "Deaktiviert" -#: ../src/config.py:233 -#, python-format -msgid "Every %s _minutes" -msgstr "Alle %s _Minuten" - -#: ../src/config.py:353 +#: ../src/config.py:293 msgid "Active" msgstr "Aktiv" -#: ../src/config.py:361 +#: ../src/config.py:301 msgid "Event" msgstr "Ereignis" -#: ../src/config.py:684 -#: ../src/gajim.py:2237 +#: ../src/config.py:407 +msgid "Always use OS/X default applications" +msgstr "" + +#: ../src/config.py:408 +#, fuzzy +msgid "Custom" +msgstr "Benutzerdefiniert" + +#: ../src/config.py:638 ../src/dialogs.py:1018 #, python-format msgid "Dictionary for lang %s not available" msgstr "Wörterburch für Sprache %s nicht verfügbar" -#: ../src/config.py:685 -#: ../src/gajim.py:2238 +#: ../src/config.py:639 #, python-format -msgid "You have to install %s dictionary to use spellchecking, or choose another language by setting the speller_language option." -msgstr "Sie müssen das Wörterbuch %s installieren oder eine andere Sprache wählen, um die Rechtschreibprüfung zu nutzen." +msgid "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option." +msgstr "" +"Sie müssen das Wörterbuch %s installieren oder eine andere Sprache wählen, " +"um die Rechtschreibprüfung zu nutzen." -#: ../src/config.py:1008 +#: ../src/config.py:1001 msgid "status message title" msgstr "Statusbetreff" -#: ../src/config.py:1008 +#: ../src/config.py:1001 msgid "status message text" msgstr "Statusnachricht" -#: ../src/config.py:1044 +#: ../src/config.py:1037 msgid "First Message Received" msgstr "Erste empfangene Nachricht" -#: ../src/config.py:1045 +#: ../src/config.py:1038 msgid "Next Message Received" msgstr "Nächste empfangene Nachricht" -#: ../src/config.py:1046 +#: ../src/config.py:1039 msgid "Contact Connected" msgstr "Kontakt verbunden" -#: ../src/config.py:1047 +#: ../src/config.py:1040 msgid "Contact Disconnected" msgstr "Kontakt nicht verbunden" -#: ../src/config.py:1048 +#: ../src/config.py:1041 msgid "Message Sent" msgstr "Nachricht gesendet" -#: ../src/config.py:1049 +#: ../src/config.py:1042 msgid "Group Chat Message Highlight" msgstr "Gruppenchat Nachrichten-Hervorhebung" -#: ../src/config.py:1050 +#: ../src/config.py:1043 msgid "Group Chat Message Received" msgstr "Gruppenchat-Nachricht empfangen" -#: ../src/config.py:1057 +#: ../src/config.py:1050 msgid "GMail Email Received" msgstr "E-Mail über Googlemail empfangen" -#: ../src/config.py:1260 -msgid "OpenPGP is not usable in this computer" -msgstr "OpenPGP kann auf diesem Computer nicht genutzt werden" - -#: ../src/config.py:1306 -msgid "You are currently connected to the server" -msgstr "Sie sind mit dem Server verbunden" - -#: ../src/config.py:1307 -msgid "To change the account name, you must be disconnected." -msgstr "Verbindung muss beendet werden, um Kontonamen zu ändern." - -#: ../src/config.py:1310 -#: ../src/config.py:1916 -msgid "Unread events" -msgstr "Ungelesene Ereignisse" - -#: ../src/config.py:1311 -msgid "To change the account name, you must read all pending events." -msgstr "Um Kontonamen zu ändern, müssen Sie alle neunen Ereignisse lesen." - -#: ../src/config.py:1315 -msgid "Account Name Already Used" -msgstr "Kontoname wird bereits verwendet" - -#: ../src/config.py:1316 -msgid "This name is already used by another of your accounts. Please choose another name." -msgstr "Dieser Name wird bereits für einen anderen Ihrer Accounts verwendet. Bitte wählenSie einen anderen Namen." - -#: ../src/config.py:1320 -#: ../src/config.py:1324 -msgid "Invalid account name" -msgstr "Ungültiger Kontoname" - -#: ../src/config.py:1321 -msgid "Account name cannot be empty." -msgstr "Kontoname darf nicht leer sein." - -#: ../src/config.py:1325 -msgid "Account name cannot contain spaces." -msgstr "Kontoname darf keine Leerzeichen enthalten." - -#: ../src/config.py:1333 -#: ../src/config.py:1339 -#: ../src/config.py:1349 -#: ../src/config.py:2900 -msgid "Invalid Jabber ID" -msgstr "Ungültige Jabber ID" - -#: ../src/config.py:1340 -msgid "A Jabber ID must be in the form \"user@servername\"." -msgstr "Jabber ID muss in der Form \"user@servername\" sein." - -#: ../src/config.py:1399 -msgid "Invalid entry" -msgstr "Ungültiger Eintrag" - -#: ../src/config.py:1400 -msgid "Custom port must be a port number." -msgstr "Proxy Port muss eine Portnummer sein." - -#: ../src/config.py:1528 -#: ../src/common/config.py:367 -msgid "Be right back." -msgstr "Bin gleich zurück." - -#: ../src/config.py:1538 -msgid "Relogin now?" -msgstr "Jetzt neu einloggen?" - -#: ../src/config.py:1539 -msgid "If you want all the changes to apply instantly, you must relogin." -msgstr "Wenn die Änderungen sofort übernommen werden sollen, müssen Sie sich neu einloggen." - -#: ../src/config.py:1565 -msgid "No such account available" -msgstr "Account nicht verfügbar" - -#: ../src/config.py:1566 -msgid "You must create your account before editing your personal information." -msgstr "Sie müssen ein Konto erstellen, bevor Sie die persönlichen Informationen ändern können" - -#: ../src/config.py:1573 -#: ../src/dialogs.py:1190 -#: ../src/dialogs.py:1326 -#: ../src/dialogs.py:1506 -#: ../src/disco.py:419 -#: ../src/profile_window.py:323 -msgid "You are not connected to the server" -msgstr "Sie sind nicht mit dem Server verbunden" - -#: ../src/config.py:1574 -msgid "Without a connection, you can not edit your personal information." -msgstr "Sie müssen angemeldet sein, um Ihre persönlichen Informationen zu bearbeiten" - -#: ../src/config.py:1578 -msgid "Your server doesn't support Vcard" -msgstr "Ihr Server unterstützt vCard nicht" - -#: ../src/config.py:1579 -msgid "Your server can't save your personal information." -msgstr "Ihr Server kann keine persönlichen Informationen speichern." - -#: ../src/config.py:1610 -#: ../src/config.py:3288 -msgid "Failed to get secret keys" -msgstr "Holen der geheimen Schlüssel fehlgeschlagen" - -#: ../src/config.py:1611 -#: ../src/config.py:3289 -msgid "There was a problem retrieving your OpenPGP secret keys." -msgstr "Es gab ein Problem beim Holen ihres geheimen OpenPGP-Schlüssels." - -#: ../src/config.py:1614 -#: ../src/config.py:3292 -msgid "OpenPGP Key Selection" -msgstr "OpenPGP Schlüssel-Auswahl" - -#: ../src/config.py:1615 -#: ../src/config.py:3293 -msgid "Choose your OpenPGP key" -msgstr "Wählen Sie Ihren OpenPGP Schlüssel" - #. Name column -#: ../src/config.py:1850 -#: ../src/dialogs.py:1338 -#: ../src/dialogs.py:1402 -#: ../src/disco.py:740 -#: ../src/disco.py:1495 -#: ../src/disco.py:1733 -#: ../src/history_window.py:78 +#: ../src/config.py:1319 ../src/dialogs.py:1517 ../src/dialogs.py:1581 +#: ../src/disco.py:743 ../src/disco.py:1569 ../src/disco.py:1815 +#: ../src/history_window.py:113 msgid "Name" msgstr "Name" -#: ../src/config.py:1853 -#: ../src/dialogs.py:1341 -msgid "Server" -msgstr "Server" +#: ../src/config.py:1427 ../src/common/config.py:393 +msgid "Be right back." +msgstr "Bin gleich zurück." -#: ../src/config.py:1917 +#: ../src/config.py:1431 +msgid "Relogin now?" +msgstr "Jetzt neu einloggen?" + +#: ../src/config.py:1432 +msgid "If you want all the changes to apply instantly, you must relogin." +msgstr "" +"Wenn die Änderungen sofort übernommen werden sollen, müssen Sie sich neu " +"einloggen." + +#: ../src/config.py:1527 ../src/config.py:1618 +msgid "OpenPGP is not usable in this computer" +msgstr "OpenPGP kann auf diesem Computer nicht genutzt werden" + +#: ../src/config.py:1654 ../src/config.py:1695 +msgid "Unread events" +msgstr "Ungelesene Ereignisse" + +#: ../src/config.py:1655 msgid "Read all pending events before removing this account." msgstr "Alle ungelesenen Ereignisse lesen, bevor der Account entfernt wird." -#: ../src/config.py:1954 +#: ../src/config.py:1681 #, python-format msgid "You have opened chat in account %s" msgstr "Sie haben mit Account %s einen Chat geöffnet" -#: ../src/config.py:1955 +#: ../src/config.py:1682 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "Alle Chatfenster werden geschlossen. Fortfahren?" -#: ../src/config.py:2014 +#: ../src/config.py:1691 +msgid "You are currently connected to the server" +msgstr "Sie sind mit dem Server verbunden" + +#: ../src/config.py:1692 +msgid "To change the account name, you must be disconnected." +msgstr "Verbindung muss beendet werden, um Kontonamen zu ändern." + +#: ../src/config.py:1696 +msgid "To change the account name, you must read all pending events." +msgstr "Um Kontonamen zu ändern, müssen Sie alle neunen Ereignisse lesen." + +#: ../src/config.py:1702 +msgid "Account Name Already Used" +msgstr "Kontoname wird bereits verwendet" + +#: ../src/config.py:1703 +msgid "" +"This name is already used by another of your accounts. Please choose another " +"name." +msgstr "" +"Dieser Name wird bereits für einen anderen Ihrer Accounts verwendet. Bitte " +"wählenSie einen anderen Namen." + +#: ../src/config.py:1707 ../src/config.py:1711 +msgid "Invalid account name" +msgstr "Ungültiger Kontoname" + +#: ../src/config.py:1708 +msgid "Account name cannot be empty." +msgstr "Kontoname darf nicht leer sein." + +#: ../src/config.py:1712 +msgid "Account name cannot contain spaces." +msgstr "Kontoname darf keine Leerzeichen enthalten." + +#: ../src/config.py:1776 +msgid "Rename Account" +msgstr "Konto umbenennen" + +#: ../src/config.py:1777 +#, python-format +msgid "Enter a new name for account %s" +msgstr "Geben Sie einen neuen Namen für das Konto %s ein" + +#: ../src/config.py:1795 ../src/config.py:1803 ../src/config.py:1843 +#: ../src/config.py:3050 ../src/dataforms_widget.py:533 +msgid "Invalid Jabber ID" +msgstr "Ungültige Jabber ID" + +#: ../src/config.py:1804 +msgid "A Jabber ID must be in the form \"user@servername\"." +msgstr "Jabber ID muss in der Form \"user@servername\" sein." + +#: ../src/config.py:1990 ../src/config.py:3121 +msgid "Invalid entry" +msgstr "Ungültiger Eintrag" + +#: ../src/config.py:1991 ../src/config.py:3122 +msgid "Custom port must be a port number." +msgstr "Proxy Port muss eine Portnummer sein." + +#: ../src/config.py:2012 +msgid "Failed to get secret keys" +msgstr "Holen der geheimen Schlüssel fehlgeschlagen" + +#: ../src/config.py:2013 +msgid "There was a problem retrieving your OpenPGP secret keys." +msgstr "Es gab ein Problem beim Holen ihres geheimen OpenPGP-Schlüssels." + +#: ../src/config.py:2016 +msgid "OpenPGP Key Selection" +msgstr "OpenPGP Schlüssel-Auswahl" + +#: ../src/config.py:2017 +msgid "Choose your OpenPGP key" +msgstr "Wählen Sie Ihren OpenPGP Schlüssel" + +#: ../src/config.py:2057 +msgid "No such account available" +msgstr "Account nicht verfügbar" + +#: ../src/config.py:2058 +msgid "You must create your account before editing your personal information." +msgstr "" +"Sie müssen ein Konto erstellen, bevor Sie die persönlichen Informationen " +"ändern können" + +#: ../src/config.py:2065 ../src/dialogs.py:1364 ../src/dialogs.py:1505 +#: ../src/dialogs.py:1685 ../src/disco.py:427 ../src/profile_window.py:318 +msgid "You are not connected to the server" +msgstr "Sie sind nicht mit dem Server verbunden" + +#: ../src/config.py:2066 +msgid "Without a connection, you can not edit your personal information." +msgstr "" +"Sie müssen angemeldet sein, um Ihre persönlichen Informationen zu bearbeiten" + +#: ../src/config.py:2070 +msgid "Your server doesn't support Vcard" +msgstr "Ihr Server unterstützt vCard nicht" + +#: ../src/config.py:2071 +msgid "Your server can't save your personal information." +msgstr "Ihr Server kann keine persönlichen Informationen speichern." + +#: ../src/config.py:2102 msgid "Account Local already exists." msgstr "Ein Konto mit dem Namen 'Local' ist bereits vorhanden" -#: ../src/config.py:2015 +#: ../src/config.py:2103 msgid "Please rename or remove it before enabling link-local messaging." -msgstr "Bitte benennen Sie es um oder entfernen es, bevor Sie LAN-Kontakte aktivieren." +msgstr "" +"Bitte benennen Sie es um oder entfernen es, bevor Sie LAN-Kontakte " +"aktivieren." -#: ../src/config.py:2111 +#: ../src/config.py:2279 #, python-format msgid "Edit %s" msgstr "%s ändern" -#: ../src/config.py:2113 +#: ../src/config.py:2281 #, python-format msgid "Register to %s" msgstr "Auf %s registrieren" #. list at the beginning -#: ../src/config.py:2179 +#: ../src/config.py:2317 msgid "Ban List" msgstr "Sperrliste" -#: ../src/config.py:2180 +#: ../src/config.py:2318 msgid "Member List" msgstr "Mitgliederliste" -#: ../src/config.py:2181 +#: ../src/config.py:2319 msgid "Owner List" msgstr "Besitzerliste" -#: ../src/config.py:2182 +#: ../src/config.py:2320 msgid "Administrator List" msgstr "Administratorliste" #. Address column #. holds JID (who said this) -#: ../src/config.py:2231 -#: ../src/disco.py:747 -#: ../src/history_manager.py:155 +#: ../src/config.py:2369 ../src/disco.py:750 ../src/history_manager.py:160 msgid "JID" msgstr "JID" -#: ../src/config.py:2239 +#: ../src/config.py:2377 msgid "Reason" msgstr "Grund" -#: ../src/config.py:2244 +#: ../src/config.py:2382 msgid "Nick" msgstr "Spitzname" -#: ../src/config.py:2248 +#: ../src/config.py:2386 msgid "Role" msgstr "Rolle" -#: ../src/config.py:2273 +#: ../src/config.py:2411 msgid "Banning..." msgstr "Verbanne ..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2275 +#: ../src/config.py:2413 msgid "" "Whom do you want to ban?\n" "\n" @@ -2790,11 +3158,11 @@ msgstr "" "Wen möchten Sie verbannen?\n" "\n" -#: ../src/config.py:2277 +#: ../src/config.py:2415 msgid "Adding Member..." msgstr "Füge Mitglied hinzu ..." -#: ../src/config.py:2278 +#: ../src/config.py:2416 msgid "" "Whom do you want to make a member?\n" "\n" @@ -2802,11 +3170,11 @@ msgstr "" "Wen möchten Sie zum Mitglied machen?\n" "\n" -#: ../src/config.py:2280 +#: ../src/config.py:2418 msgid "Adding Owner..." msgstr "Füge Besitzer hinzu ..." -#: ../src/config.py:2281 +#: ../src/config.py:2419 msgid "" "Whom do you want to make an owner?\n" "\n" @@ -2814,11 +3182,11 @@ msgstr "" "Wen möchten Sie zum Besitzer machen?\n" "\n" -#: ../src/config.py:2283 +#: ../src/config.py:2421 msgid "Adding Administrator..." msgstr "Füge Administrator hinzu ..." -#: ../src/config.py:2284 +#: ../src/config.py:2422 msgid "" "Whom do you want to make an administrator?\n" "\n" @@ -2826,7 +3194,7 @@ msgstr "" "Wen möchten Sie zum Administrator machen?\n" "\n" -#: ../src/config.py:2285 +#: ../src/config.py:2423 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" @@ -2835,394 +3203,443 @@ msgid "" "4. domain (the domain itself matches, as does any user@domain,\n" "domain/resource, or address containing a subdomain." msgstr "" -"Kann eines der folgenden sein:\"1. benutzer@domain/resource (nur die Resource trifft zu).\n" +"Kann eines der folgenden sein:\"1. benutzer@domain/resource (nur die " +"Resource trifft zu).\n" "2. benutzer@domain (jede Resource trifft zu).\n" "3 domain (die Domain selbst trifft zu, als auch jeder benutzer@domain,\n" "jede domain/resource oder Adresse, die eine Subdomain enthält." -#: ../src/config.py:2389 +#: ../src/config.py:2527 #, python-format msgid "Removing %s account" msgstr "Entferne Konto %s" -#: ../src/config.py:2406 -#: ../src/roster_window.py:2737 +#: ../src/config.py:2542 ../src/gajim.py:1343 ../src/roster_window.py:3451 msgid "Password Required" msgstr "Passwort benötigt" -#: ../src/config.py:2407 -#: ../src/roster_window.py:2733 +#: ../src/config.py:2543 ../src/roster_window.py:3447 #, python-format msgid "Enter your password for account %s" msgstr "Geben Sie ihr Passwort für %s ein" -#: ../src/config.py:2408 -#: ../src/roster_window.py:2738 +#: ../src/config.py:2544 ../src/roster_window.py:3452 msgid "Save password" msgstr "Passwort speichern" -#: ../src/config.py:2422 +#: ../src/config.py:2557 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Konto \"%s\" ist mit Server verbunden" -#: ../src/config.py:2423 +#: ../src/config.py:2558 msgid "If you remove it, the connection will be lost." msgstr "Wenn Sie es entfernen, wird die Verbindung beendet." -#: ../src/config.py:2508 +#: ../src/config.py:2651 msgid "Default" msgstr "Standard" -#: ../src/config.py:2508 +#: ../src/config.py:2651 msgid "?print_status:All" msgstr "?print_status:Alle" -#: ../src/config.py:2509 +#: ../src/config.py:2652 msgid "Enter and leave only" msgstr "Nur betreten und verlassen" -#: ../src/config.py:2510 +#: ../src/config.py:2653 msgid "?print_status:None" msgstr "?print_status:Nichts" -#: ../src/config.py:2578 +#: ../src/config.py:2722 msgid "New Group Chat" msgstr "Neuer Gruppenchat" -#: ../src/config.py:2611 +#: ../src/config.py:2755 msgid "This bookmark has invalid data" msgstr "Dieses Lesezeichen hat ungültige Daten" -#: ../src/config.py:2612 -msgid "Please be sure to fill out server and room fields or remove this bookmark." +#: ../src/config.py:2756 +msgid "" +"Please be sure to fill out server and room fields or remove this bookmark." msgstr "Bitte Serverfeld und Raumfeld ausfüllen oder Lesezeichen löschen." -#: ../src/config.py:2875 +#: ../src/config.py:3033 msgid "Invalid username" msgstr "Ungültiger Benutzername" -#: ../src/config.py:2876 +#: ../src/config.py:3035 msgid "You must provide a username to configure this account." -msgstr "Sie müssen einen Benutzernamen angeben, um diesen Account zu konfigurieren." +msgstr "" +"Sie müssen einen Benutzernamen angeben, um diesen Account zu konfigurieren." -#: ../src/config.py:2886 -#: ../src/dialogs.py:1525 -msgid "Invalid password" -msgstr "Ungültiges Passwort" - -#: ../src/config.py:2887 -msgid "You must enter a password for the new account." -msgstr "Sie müssen ein Passwort für das neue Konto eingeben." - -#: ../src/config.py:2891 -#: ../src/dialogs.py:1530 -msgid "Passwords do not match" -msgstr "Passwörter stimmen nicht überein" - -#: ../src/config.py:2892 -#: ../src/dialogs.py:1531 -msgid "The passwords typed in both fields must be identical." -msgstr "Die Passwörter in beiden Feldern müssen identisch sein." - -#: ../src/config.py:2911 +#: ../src/config.py:3061 msgid "Duplicate Jabber ID" msgstr "Doppelte Jabber ID" -#: ../src/config.py:2912 +#: ../src/config.py:3062 msgid "This account is already configured in Gajim." -msgstr "Dieser Kontakt bwurde in Gajim bereits konfiguriert." +msgstr "Dieser Kontakt wurde in Gajim bereits konfiguriert." -#: ../src/config.py:2929 +#: ../src/config.py:3079 msgid "Account has been added successfully" msgstr "Account wurde erfolgreich hinzugefügt" -#: ../src/config.py:2930 -#: ../src/config.py:2965 -msgid "You can set advanced account options by pressing the Advanced button, or later by choosing the Accounts menuitem under the Edit menu from the main window." -msgstr "Sie können die erweiterten Kontooptionen durch Klicken des Erweitert-Buttons oder durch Klicken des Konto-Menüpunktes im Bearbeiten-Menü des Hauptfensters erreichen." +#: ../src/config.py:3080 ../src/config.py:3225 +msgid "" +"You can set advanced account options by pressing the Advanced button, or " +"later by choosing the Accounts menuitem under the Edit menu from the main " +"window." +msgstr "" +"Sie können die erweiterten Kontooptionen durch Klicken des Erweitert-Buttons " +"oder durch Klicken des Konto-Menüpunktes im Bearbeiten-Menü des " +"Hauptfensters erreichen." -#: ../src/config.py:2964 -msgid "Your new account has been created successfully" -msgstr "Ihr neues Konto wurde erfolgreich erstellt" +#: ../src/config.py:3097 +msgid "Invalid server" +msgstr "Ungültiger Server" -#: ../src/config.py:2982 +#: ../src/config.py:3098 +msgid "Please provide a server on which you want to register." +msgstr "Bitte geben Sie an, bei dem Sie sich registrieren möchten." + +#: ../src/config.py:3204 ../src/config.py:3243 msgid "An error occurred during account creation" msgstr "Während der Konto-Erstellung ist ein Fehler aufgetreten" -#: ../src/config.py:3040 +#: ../src/config.py:3224 +msgid "Your new account has been created successfully" +msgstr "Ihr neues Konto wurde erfolgreich erstellt" + +#: ../src/config.py:3327 msgid "Account name is in use" msgstr "Kontoname ist schon vergeben" -#: ../src/config.py:3041 +#: ../src/config.py:3328 msgid "You already have an account using this name." msgstr "Sie haben bereits ein Konto mit diesem Namen." -#: ../src/conversation_textview.py:275 -msgid "Text below this line is what has been said since the last time you paid attention to this group chat" -msgstr "Text unterhalb dieser Linie stellt dar, was seit ihrem letzten Besuch in diesem Gruppenchat gesagt wurde" +#: ../src/conversation_textview.py:454 +msgid "" +"Text below this line is what has been said since the last time you paid " +"attention to this group chat" +msgstr "" +"Text unterhalb dieser Linie stellt dar, was seit ihrem letzten Besuch in " +"diesem Gruppenchat gesagt wurde" -#: ../src/conversation_textview.py:344 +#: ../src/conversation_textview.py:552 #, python-format msgid "_Actions for \"%s\"" msgstr "_Aktionen für \"%s\"" -#: ../src/conversation_textview.py:356 +#: ../src/conversation_textview.py:564 msgid "Read _Wikipedia Article" msgstr "_Wikipedia-Artikel lesen" -#: ../src/conversation_textview.py:361 +#: ../src/conversation_textview.py:569 msgid "Look it up in _Dictionary" msgstr "Im Wörterbuch _suchen" #. we must have %s in the url if not WIKTIONARY -#: ../src/conversation_textview.py:377 +#: ../src/conversation_textview.py:585 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "In Wörterbuch URL fehlt ein \"%s\" und ist nicht Wiktionary" #. we must have %s in the url -#: ../src/conversation_textview.py:390 +#: ../src/conversation_textview.py:598 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "In Websuche URL fehlt ein \"%s\"" -#: ../src/conversation_textview.py:393 +#: ../src/conversation_textview.py:601 msgid "Web _Search for it" msgstr "Im _Internet suchen" -#: ../src/conversation_textview.py:399 +#: ../src/conversation_textview.py:607 msgid "Open as _Link" msgstr "Als _Link öffnen" -#: ../src/conversation_textview.py:760 +#: ../src/conversation_textview.py:1073 msgid "Yesterday" msgstr "Gestern" #. the number is >= 2 #. %i is day in year (1-365), %d (1-31) we want %i -#: ../src/conversation_textview.py:764 +#: ../src/conversation_textview.py:1077 #, python-format msgid "%i days ago" msgstr "Vor %i Tagen" #. if we have subject, show it too! -#: ../src/conversation_textview.py:798 +#: ../src/conversation_textview.py:1111 #, python-format msgid "Subject: %s\n" msgstr "Thema: %s\n" -#: ../src/dialogs.py:59 +#: ../src/dataforms_widget.py:537 +#, fuzzy +msgid "Jabber ID already in list" +msgstr "Jabber IM-Client" + +#: ../src/dataforms_widget.py:538 +msgid "The Jabber ID you entered is already in the list. Choose another one." +msgstr "" + +#. Default jid +#: ../src/dataforms_widget.py:549 +msgid "new@jabber.id" +msgstr "" + +#: ../src/dataforms_widget.py:552 ../src/dataforms_widget.py:554 +#, python-format +msgid "new%d@jabber.id" +msgstr "" + +#: ../src/dialogs.py:71 #, python-format msgid "Contact name: %s" msgstr "Kontaktname: %s" -#: ../src/dialogs.py:61 +#: ../src/dialogs.py:73 #, python-format msgid "Jabber ID: %s" msgstr "Jabber ID: %s " -#: ../src/dialogs.py:211 +#: ../src/dialogs.py:223 msgid "Group" msgstr "Gruppe" -#: ../src/dialogs.py:218 +#: ../src/dialogs.py:230 msgid "In the group" msgstr "In der Gruppe" -#: ../src/dialogs.py:269 +#: ../src/dialogs.py:330 msgid "KeyID" msgstr "Schlüssel-ID" -#: ../src/dialogs.py:272 +#: ../src/dialogs.py:335 msgid "Contact name" msgstr "Name des Kontakts" -#: ../src/dialogs.py:318 +#: ../src/dialogs.py:381 #, python-format msgid "%s Status Message" msgstr "%s Status-Nachricht" -#: ../src/dialogs.py:320 +#: ../src/dialogs.py:383 msgid "Status Message" msgstr "Status-Nachricht" -#: ../src/dialogs.py:395 +#: ../src/dialogs.py:483 msgid "Save as Preset Status Message" msgstr "Als derzeitige Statusnachricht speichern" -#: ../src/dialogs.py:396 +#: ../src/dialogs.py:484 msgid "Please type a name for this status message" msgstr "Bitte geben Sie einen Namen für diese Statusnachricht ein:" -#: ../src/dialogs.py:417 +#: ../src/dialogs.py:495 +msgid "Overwrite Status Message?" +msgstr "Status-Nachricht überschreiben" + +#: ../src/dialogs.py:496 +msgid "" +"This name is already used. Do you want to overwrite this status message?" +msgstr "" +"Dieser Name wird bereits verwendet. Möchten Sie die Status-Nachricht " +"überschreiben?" + +#: ../src/dialogs.py:512 msgid "AIM Address:" msgstr "AIM-Adresse" -#: ../src/dialogs.py:418 +#: ../src/dialogs.py:513 msgid "GG Number:" msgstr "GG Nummer" -#: ../src/dialogs.py:419 +#: ../src/dialogs.py:514 msgid "ICQ Number:" msgstr "ICQ-Nummer" -#: ../src/dialogs.py:420 +#: ../src/dialogs.py:515 msgid "MSN Address:" msgstr "MSN-Adresse" -#: ../src/dialogs.py:421 +#: ../src/dialogs.py:516 msgid "Yahoo! Address:" msgstr "Yahoo!-Adresse" -#: ../src/dialogs.py:457 +#: ../src/dialogs.py:553 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" -msgstr "Bitte füllen Sie die Daten für den Kontakt aus, den Sie dem Konto %s hinzufügen wollen" +msgstr "" +"Bitte füllen Sie die Daten für den Kontakt aus, den Sie dem Konto %s " +"hinzufügen wollen" -#: ../src/dialogs.py:459 +#: ../src/dialogs.py:555 msgid "Please fill in the data of the contact you want to add" msgstr "Bitte geben sie die Daten des neuen Kontakts ein" -#: ../src/dialogs.py:609 -#: ../src/dialogs.py:615 +#: ../src/dialogs.py:712 ../src/dialogs.py:718 msgid "Invalid User ID" msgstr "Ungültige Benutzer ID" -#: ../src/dialogs.py:616 +#: ../src/dialogs.py:719 msgid "The user ID must not contain a resource." msgstr "Die Benutzer-ID darf keine resource enthalten." -#: ../src/dialogs.py:630 +#: ../src/dialogs.py:733 msgid "Contact already in roster" msgstr "Kontakt bereits im Roster" -#: ../src/dialogs.py:631 +#: ../src/dialogs.py:734 msgid "This contact is already listed in your roster." msgstr "Der Kontakt befindet sich bereit in Ihrem Roster." -#: ../src/dialogs.py:668 +#: ../src/dialogs.py:770 msgid "User ID:" msgstr "_Benutzer-ID:" -#: ../src/dialogs.py:731 +#: ../src/dialogs.py:832 msgid "A GTK+ jabber client" msgstr "Ein GTK+ Jabber-Client" -#: ../src/dialogs.py:732 +#: ../src/dialogs.py:833 msgid "GTK+ Version:" msgstr "GTK+-Version:" -#: ../src/dialogs.py:733 +#: ../src/dialogs.py:834 msgid "PyGTK Version:" msgstr "PyGTK-Version" -#: ../src/dialogs.py:747 +#: ../src/dialogs.py:848 msgid "Current Developers:" msgstr "Derzeitige Entwickler:" -#: ../src/dialogs.py:749 +#: ../src/dialogs.py:850 msgid "Past Developers:" msgstr "Frühere Entwickler:" -#: ../src/dialogs.py:759 +#: ../src/dialogs.py:860 msgid "THANKS:" msgstr "DANKE:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:765 +#: ../src/dialogs.py:866 msgid "Last but not least, we would like to thank all the package maintainers." msgstr "Zuletzt möchten wird gerne allen Paket-Verwaltern danken." #. here you write your name in the form Name FamilyName -#: ../src/dialogs.py:778 +#: ../src/dialogs.py:879 msgid "translator-credits" msgstr "" "Fridtjof Busse\n" -"Benjamin Drung " +"Benjamin Drung \n" +"Fabian Fingerle \n" +"Sebastian Schäfer " -#: ../src/dialogs.py:908 +#: ../src/dialogs.py:1011 #, python-format msgid "Unable to bind to port %s." -msgstr "Konnte nicht mit Port %s verbinden." +msgstr "Konnte nicht an Port %s binden." -#: ../src/dialogs.py:909 -msgid "Maybe you have another running instance of Gajim. File Transfer will be cancelled." +#: ../src/dialogs.py:1012 +msgid "" +"Maybe you have another running instance of Gajim. File Transfer will be " +"cancelled." msgstr "Möglicherweise läuft Gajim bereits. Dateitransfer wird abgebrochen." -#: ../src/dialogs.py:1120 +#: ../src/dialogs.py:1019 +#, python-format +msgid "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option.\n" +"\n" +"Highlighting misspelled words feature will not be used" +msgstr "" +"Sie müssen das Wörterbuch %s installieren oder eine andere Sprache wählen, " +"um die Rechtschreibprüfung zu nutzen.\n" +"\n" +"Das Hervorheben falsch geschriebener Worte wird nicht genutzt" + +#: ../src/dialogs.py:1293 #, python-format msgid "Subscription request for account %s from %s" msgstr "Abonnement-Anforderung für Konto %s von %s" -#: ../src/dialogs.py:1123 +#: ../src/dialogs.py:1296 #, python-format msgid "Subscription request from %s" msgstr "Abonnement-Anforderung von %s" -#: ../src/dialogs.py:1183 -#: ../src/roster_window.py:687 +#: ../src/dialogs.py:1357 ../src/roster_window.py:776 #, python-format msgid "You are already in group chat %s" msgstr "Sie sind bereits im Gruppenchat %s" -#: ../src/dialogs.py:1191 +#: ../src/dialogs.py:1365 msgid "You can not join a group chat unless you are connected." msgstr "Sie können einem Gruppenchat erst beitreten, wenn Sie verbunden sind." -#: ../src/dialogs.py:1206 +#: ../src/dialogs.py:1383 #, python-format msgid "Join Group Chat with account %s" msgstr "Betrete Gruppenchat mit Account %s" -#: ../src/dialogs.py:1274 -#: ../src/dialogs.py:1280 -#: ../src/groupchat_control.py:1469 +#: ../src/dialogs.py:1453 ../src/dialogs.py:1459 +#: ../src/groupchat_control.py:1683 msgid "Invalid group chat Jabber ID" msgstr "Ungültige Jabber-ID für den Gruppenchat" -#: ../src/dialogs.py:1275 -#: ../src/dialogs.py:1281 -#: ../src/groupchat_control.py:1470 +#: ../src/dialogs.py:1454 ../src/dialogs.py:1460 +#: ../src/groupchat_control.py:1684 msgid "The group chat Jabber ID has not allowed characters." msgstr "Die Jabber-ID für den Gruppenchat enthält nicht erlaubte Zeichen." -#: ../src/dialogs.py:1287 +#: ../src/dialogs.py:1466 msgid "This is not a group chat" msgstr "Das ist kein Gruppenchat" -#: ../src/dialogs.py:1288 +#: ../src/dialogs.py:1467 #, python-format msgid "%s is not the name of a group chat." msgstr "%s ist kein Name eines Gruppenchats." -#: ../src/dialogs.py:1327 +#: ../src/dialogs.py:1506 msgid "Without a connection, you can not synchronise your contacts." msgstr "Sie müssen verbunden sein, um Ihre Kontakte zu Synchronisieren." -#: ../src/dialogs.py:1374 +#: ../src/dialogs.py:1520 +msgid "Server" +msgstr "Server" + +#: ../src/dialogs.py:1553 msgid "This account is not connected to the server" msgstr "Konto \"%s\" ist nicht mit dem Server verbunden" -#: ../src/dialogs.py:1375 +#: ../src/dialogs.py:1554 msgid "You cannot synchronize with an account unless it is connected." -msgstr "Sie können nicht mit einem Konto Synchronisieren, solange es nicht verbunden ist." +msgstr "" +"Sie können nicht mit einem Konto Synchronisieren, solange es nicht verbunden " +"ist." -#: ../src/dialogs.py:1399 +#: ../src/dialogs.py:1578 msgid "Synchronise" msgstr "Synchronisieren" -#: ../src/dialogs.py:1457 +#: ../src/dialogs.py:1636 #, python-format msgid "Start Chat with account %s" msgstr "Starte Chat mit Account %s" -#: ../src/dialogs.py:1459 +#: ../src/dialogs.py:1638 msgid "Start Chat" msgstr "Chat starten" -#: ../src/dialogs.py:1460 +#: ../src/dialogs.py:1639 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" @@ -3231,523 +3648,761 @@ msgstr "" "an den Sie eine Chat-Nachricht schicken wollen:" #. if offline or connecting -#: ../src/dialogs.py:1485 -#: ../src/dialogs.py:1844 -#: ../src/dialogs.py:1975 +#: ../src/dialogs.py:1664 ../src/dialogs.py:2040 ../src/dialogs.py:2181 msgid "Connection not available" msgstr "Verbindung nicht verfügbar" -#: ../src/dialogs.py:1486 -#: ../src/dialogs.py:1845 -#: ../src/dialogs.py:1976 +#: ../src/dialogs.py:1665 ../src/dialogs.py:2041 ../src/dialogs.py:2182 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Vergewissern Sie sich, dass Sie mit \"%s\" verbunden sind." -#: ../src/dialogs.py:1495 -#: ../src/dialogs.py:1498 +#: ../src/dialogs.py:1674 ../src/dialogs.py:1677 msgid "Invalid JID" msgstr "Ungültige JID" -#: ../src/dialogs.py:1498 +#: ../src/dialogs.py:1677 #, python-format msgid "Unable to parse \"%s\"." msgstr "Kann \"%s\" nicht parsen." -#: ../src/dialogs.py:1507 +#: ../src/dialogs.py:1686 msgid "Without a connection, you can not change your password." msgstr "Sie müssen verbunden sein, um Ihr Passwort zu ändern" -#: ../src/dialogs.py:1526 +#: ../src/dialogs.py:1704 +msgid "Invalid password" +msgstr "Ungültiges Passwort" + +#: ../src/dialogs.py:1705 msgid "You must enter a password." msgstr "Sie müssen ein Passwort eingeben." +#: ../src/dialogs.py:1709 +msgid "Passwords do not match" +msgstr "Passwörter stimmen nicht überein" + +#: ../src/dialogs.py:1710 +msgid "The passwords typed in both fields must be identical." +msgstr "Die Passwörter in beiden Feldern müssen identisch sein." + #. img to display #. default value -#: ../src/dialogs.py:1573 -#: ../src/notify.py:212 -#: ../src/notify.py:416 +#: ../src/dialogs.py:1752 ../src/notify.py:232 ../src/notify.py:447 msgid "Contact Signed In" msgstr "Kontakt hat sich angemeldet" -#: ../src/dialogs.py:1575 -#: ../src/notify.py:220 -#: ../src/notify.py:418 +#: ../src/dialogs.py:1754 ../src/notify.py:240 ../src/notify.py:449 msgid "Contact Signed Out" msgstr "Kontakt hat sich abgemeldet" #. chat message -#: ../src/dialogs.py:1577 -#: ../src/notify.py:239 -#: ../src/notify.py:420 +#: ../src/dialogs.py:1756 ../src/notify.py:263 ../src/notify.py:451 msgid "New Message" msgstr "Neue Nachricht" #. single message -#: ../src/dialogs.py:1577 -#: ../src/notify.py:224 -#: ../src/notify.py:420 +#: ../src/dialogs.py:1756 ../src/notify.py:244 ../src/notify.py:451 msgid "New Single Message" msgstr "Neue einzelne Nachricht" #. private message -#: ../src/dialogs.py:1578 -#: ../src/notify.py:231 -#: ../src/notify.py:421 +#: ../src/dialogs.py:1757 ../src/notify.py:251 ../src/notify.py:452 msgid "New Private Message" msgstr "Neue private Nachricht" -#: ../src/dialogs.py:1578 -#: ../src/gajim.py:1291 -#: ../src/notify.py:429 +#: ../src/dialogs.py:1757 ../src/gajim.py:1532 ../src/notify.py:460 msgid "New E-mail" msgstr "Neue E-Mail" -#: ../src/dialogs.py:1580 -#: ../src/gajim.py:1444 -#: ../src/notify.py:423 +#: ../src/dialogs.py:1759 ../src/gajim.py:1707 ../src/notify.py:454 msgid "File Transfer Request" msgstr "Dateitransfer Anfrage" -#: ../src/dialogs.py:1582 -#: ../src/gajim.py:1263 -#: ../src/gajim.py:1420 -#: ../src/notify.py:425 +#: ../src/dialogs.py:1761 ../src/gajim.py:1504 ../src/gajim.py:1674 +#: ../src/notify.py:456 msgid "File Transfer Error" msgstr "Dateitransfer-Fehler" -#: ../src/dialogs.py:1584 -#: ../src/gajim.py:1483 -#: ../src/gajim.py:1505 -#: ../src/gajim.py:1522 -#: ../src/notify.py:427 +#: ../src/dialogs.py:1763 ../src/gajim.py:1746 ../src/gajim.py:1768 +#: ../src/gajim.py:1785 ../src/notify.py:458 msgid "File Transfer Completed" msgstr "Dateitransfer beendet" -#: ../src/dialogs.py:1585 -#: ../src/gajim.py:1486 -#: ../src/notify.py:427 +#: ../src/dialogs.py:1764 ../src/gajim.py:1749 ../src/notify.py:458 msgid "File Transfer Stopped" msgstr "Dateitransfer gestoppt" -#: ../src/dialogs.py:1587 -#: ../src/gajim.py:1160 -#: ../src/notify.py:431 +#: ../src/dialogs.py:1766 ../src/gajim.py:1364 ../src/notify.py:462 msgid "Groupchat Invitation" msgstr "Gruppenchat-Einladung" -#: ../src/dialogs.py:1589 -#: ../src/notify.py:204 -#: ../src/notify.py:433 +#: ../src/dialogs.py:1768 ../src/notify.py:224 ../src/notify.py:464 msgid "Contact Changed Status" msgstr "Kontakt hat Status verändert" -#: ../src/dialogs.py:1774 +#: ../src/dialogs.py:1959 #, python-format msgid "Single Message using account %s" msgstr "Einzelne Nachricht mit Account %s" -#: ../src/dialogs.py:1776 +#: ../src/dialogs.py:1961 #, python-format msgid "Single Message in account %s" msgstr "Einzelne Nachricht in Account %s" -#: ../src/dialogs.py:1778 +#: ../src/dialogs.py:1963 msgid "Single Message" msgstr "Einzelne Nachricht" #. prepare UI for Sending -#: ../src/dialogs.py:1781 +#: ../src/dialogs.py:1966 #, python-format msgid "Send %s" msgstr "Sende %s" #. prepare UI for Receiving -#: ../src/dialogs.py:1804 +#: ../src/dialogs.py:1989 #, python-format msgid "Received %s" msgstr "%s empfangen" +#. prepare UI for Receiving +#: ../src/dialogs.py:2012 +#, fuzzy, python-format +msgid "Form %s" +msgstr "Von %s" + #. we create a new blank window to send and we preset RE: and to jid -#: ../src/dialogs.py:1876 +#: ../src/dialogs.py:2082 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:1877 +#: ../src/dialogs.py:2083 #, python-format msgid "%s wrote:\n" msgstr "%s schrieb:\n" -#: ../src/dialogs.py:1921 +#: ../src/dialogs.py:2127 #, python-format msgid "XML Console for %s" msgstr "XML Konsole für %s" -#: ../src/dialogs.py:1923 +#: ../src/dialogs.py:2129 msgid "XML Console" msgstr "XML Konsole" -#: ../src/dialogs.py:2046 +#: ../src/dialogs.py:2252 #, python-format msgid "Privacy List %s" msgstr "Privatliste %s" -#: ../src/dialogs.py:2050 +#: ../src/dialogs.py:2256 #, python-format msgid "Privacy List for %s" msgstr "Privatsphären-Liste für %s" -#: ../src/dialogs.py:2098 +#: ../src/dialogs.py:2312 #, python-format msgid "Order: %s, action: %s, type: %s, value: %s" msgstr "Sortierung: %s, Aktion: %s, Typ: %s, Wert: %s" -#: ../src/dialogs.py:2101 +#: ../src/dialogs.py:2315 #, python-format msgid "Order: %s, action: %s" msgstr "Sortierung: %s, Aktion: %s" -#: ../src/dialogs.py:2143 +#: ../src/dialogs.py:2357 msgid "Edit a rule" msgstr "Eine Regel bearbeiten" -#: ../src/dialogs.py:2230 +#: ../src/dialogs.py:2444 msgid "Add a rule" msgstr "Eine Regel hinzufügen" -#: ../src/dialogs.py:2326 +#: ../src/dialogs.py:2540 #, python-format msgid "Privacy Lists for %s" msgstr "Privatliste für %s" -#: ../src/dialogs.py:2328 +#: ../src/dialogs.py:2542 msgid "Privacy Lists" msgstr "Privatlisten" -#: ../src/dialogs.py:2398 +#: ../src/dialogs.py:2612 msgid "Invalid List Name" msgstr "Ungültiger Listenname" -#: ../src/dialogs.py:2399 +#: ../src/dialogs.py:2613 msgid "You must enter a name to create a privacy list." -msgstr "Sie müssen einen Namen eingeben um eine Privatsphären-Liste zu erstellen." +msgstr "" +"Sie müssen einen Namen eingeben um eine Privatsphären-Liste zu erstellen." -#. Don't translate $Contact -#: ../src/dialogs.py:2433 +#: ../src/dialogs.py:2650 +msgid "$Contact has invited you to join a discussion" +msgstr "$Contact hat Sie in den Gruppenchat %(room_jid)s eingeladen" + +#: ../src/dialogs.py:2652 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact hat Sie in den Gruppenchat %(room_jid)s eingeladen" -#. only if not None and not '' -#: ../src/dialogs.py:2445 +#: ../src/dialogs.py:2665 #, python-format msgid "Comment: %s" msgstr "Kommentar: %s" -#: ../src/dialogs.py:2507 +#: ../src/dialogs.py:2731 msgid "Choose Sound" msgstr "Sound wählen" -#: ../src/dialogs.py:2517 -#: ../src/dialogs.py:2562 +#: ../src/dialogs.py:2741 ../src/dialogs.py:2792 msgid "All files" msgstr "Alle Dateien" -#: ../src/dialogs.py:2522 +#: ../src/dialogs.py:2746 msgid "Wav Sounds" msgstr "Wav Dateien" -#: ../src/dialogs.py:2552 +#: ../src/dialogs.py:2779 msgid "Choose Image" msgstr "Bild auswählen" -#: ../src/dialogs.py:2567 +#: ../src/dialogs.py:2797 msgid "Images" msgstr "Bilder" -#: ../src/dialogs.py:2624 +#: ../src/dialogs.py:2862 #, python-format msgid "When %s becomes:" msgstr "Wenn %s wird:" -#: ../src/dialogs.py:2626 +#: ../src/dialogs.py:2864 #, python-format msgid "Adding Special Notification for %s" msgstr "Füge speziellen Hinweis für %s hinzu" #. # means number -#: ../src/dialogs.py:2697 +#: ../src/dialogs.py:2935 msgid "#" msgstr "Nr." -#: ../src/dialogs.py:2703 +#: ../src/dialogs.py:2941 msgid "Condition" msgstr "Bedingung" -#: ../src/dialogs.py:2824 +#: ../src/dialogs.py:3059 msgid "when I am " msgstr "wenn Ich bin " -#: ../src/disco.py:103 +#: ../src/disco.py:111 msgid "Others" msgstr "Andere" -#: ../src/disco.py:104 -#: ../src/disco.py:105 -#: ../src/disco.py:1281 -#: ../src/gajim.py:604 -#: ../src/roster_window.py:272 -#: ../src/roster_window.py:330 -#: ../src/roster_window.py:369 -#: ../src/roster_window.py:451 -#: ../src/roster_window.py:483 -#: ../src/roster_window.py:485 -#: ../src/roster_window.py:3912 -#: ../src/roster_window.py:3914 -#: ../src/common/contacts.py:267 -#: ../src/common/contacts.py:282 -#: ../src/common/helpers.py:43 +#: ../src/disco.py:112 ../src/disco.py:113 ../src/disco.py:1355 +#: ../src/gajim.py:660 ../src/roster_window.py:295 ../src/roster_window.py:355 +#: ../src/roster_window.py:395 ../src/roster_window.py:503 +#: ../src/roster_window.py:535 ../src/roster_window.py:537 +#: ../src/roster_window.py:4751 ../src/roster_window.py:4753 +#: ../src/common/contacts.py:295 ../src/common/contacts.py:310 +#: ../src/common/helpers.py:53 msgid "Transports" msgstr "Transports" #. conference is a category for listing mostly groupchats in service discovery -#: ../src/disco.py:107 +#: ../src/disco.py:115 msgid "Conference" msgstr "Konferenz" -#: ../src/disco.py:420 +#: ../src/disco.py:428 msgid "Without a connection, you can not browse available services" msgstr "Sie müssen angemeldet sein um Dienste zu durchsuchen" -#: ../src/disco.py:499 +#: ../src/disco.py:502 #, python-format msgid "Service Discovery using account %s" msgstr "Dienste durchsuchen für Konto %s" -#: ../src/disco.py:501 +#: ../src/disco.py:504 msgid "Service Discovery" msgstr "Dienste durchsuchen" -#: ../src/disco.py:641 +#: ../src/disco.py:644 msgid "The service could not be found" msgstr "Der Dienst konnte nicht gefunden werden" -#: ../src/disco.py:642 -msgid "There is no service at the address you entered, or it is not responding. Check the address and try again." -msgstr "Es existiert kein Dienst an der Adresse, die sie angegeben haben oder er antwortet nicht. Überprüfen Sie die Adresse und versuchen Sie es erneut." +#: ../src/disco.py:645 +msgid "" +"There is no service at the address you entered, or it is not responding. " +"Check the address and try again." +msgstr "" +"Es existiert kein Dienst an der Adresse, die sie angegeben haben oder er " +"antwortet nicht. Überprüfen Sie die Adresse und versuchen Sie es erneut." -#: ../src/disco.py:646 -#: ../src/disco.py:927 +#: ../src/disco.py:649 ../src/disco.py:930 msgid "The service is not browsable" msgstr "Der Dienst ist nicht durchsuchbar" -#: ../src/disco.py:647 +#: ../src/disco.py:650 msgid "This type of service does not contain any items to browse." -msgstr "Dieser Art von Dienst enthält keine Objekte, di edurchsucht werden können." +msgstr "" +"Dieser Art von Dienst enthält keine Objekte, di edurchsucht werden können." -#: ../src/disco.py:727 +#: ../src/disco.py:730 #, python-format msgid "Browsing %s using account %s" msgstr "Durchsuche %s mit Konto %s" -#: ../src/disco.py:766 +#: ../src/disco.py:769 msgid "_Browse" msgstr "_Durchsuche" -#: ../src/disco.py:928 +#: ../src/disco.py:931 msgid "This service does not contain any items to browse." msgstr "Dieser Dienst enthält keine keine durchsuchbaren Objekte." -#: ../src/disco.py:1155 -#: ../src/disco.py:1286 +#: ../src/disco.py:1152 +msgid "_Execute Command" +msgstr "_Befehl ausführen..." + +#: ../src/disco.py:1162 ../src/disco.py:1360 msgid "Re_gister" msgstr "Re_gistrieren" -#: ../src/disco.py:1323 +#: ../src/disco.py:1397 #, python-format msgid "Scanning %d / %d.." msgstr "Durchsuche %d / %d.." #. Users column -#: ../src/disco.py:1504 +#: ../src/disco.py:1579 msgid "Users" msgstr "Benutzer" #. Description column -#: ../src/disco.py:1511 +#: ../src/disco.py:1587 msgid "Description" msgstr "Beschreibung" #. Id column -#: ../src/disco.py:1518 +#: ../src/disco.py:1595 msgid "Id" msgstr "Id" -#: ../src/disco.py:1741 +#: ../src/disco.py:1824 msgid "Subscribed" msgstr "Abonniert" -#: ../src/disco.py:1767 +#: ../src/disco.py:1832 +msgid "Node" +msgstr "Node" + +#: ../src/disco.py:1889 msgid "New post" msgstr "Neue Nachricht" -#: ../src/disco.py:1773 +#: ../src/disco.py:1895 msgid "_Subscribe" msgstr "_Abonnieren" -#: ../src/disco.py:1779 +#: ../src/disco.py:1901 msgid "_Unsubscribe" msgstr "_Abbestellen" -#: ../src/filetransfers_window.py:72 +#: ../src/features_window.py:47 +msgid "PyOpenSSL" +msgstr "PyOpenSSL" + +#: ../src/features_window.py:48 +msgid "" +"A library used to validate server certificates to ensure a secure connection." +msgstr "" +"Eine Bibliothek um Server-Zertifikate zu validieren um eine sichere " +"Verbindung zu gewährleisten." + +#: ../src/features_window.py:49 ../src/features_window.py:50 +msgid "Requires python-pyopenssl." +msgstr "Erfordert python-pyopenssl." + +#: ../src/features_window.py:51 +msgid "Bonjour / Zeroconf" +msgstr "Bonjour / Zeroconf" + +#: ../src/features_window.py:52 +msgid "Serverless chatting with autodetected clients in a local network." +msgstr "" +"Serverloses Chatten mit automatisch erkannten Clients in einem lokalen Netz" + +#: ../src/features_window.py:53 +msgid "Requires python-avahi." +msgstr "Erfordert python-avahi." + +#: ../src/features_window.py:54 +msgid "Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." +msgstr "Erfordert pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." + +#: ../src/features_window.py:55 +msgid "gajim-remote" +msgstr "gajim-remote" + +#: ../src/features_window.py:56 +msgid "A script to controle gajim via commandline." +msgstr "Ein Skript um Gajim über die Kommandozeile zu steuern." + +#: ../src/features_window.py:57 +msgid "Requires python-dbus." +msgstr "Erfordert python-dbus." + +#: ../src/features_window.py:58 ../src/features_window.py:62 +#: ../src/features_window.py:66 ../src/features_window.py:70 +#: ../src/features_window.py:74 ../src/features_window.py:82 +#: ../src/features_window.py:86 ../src/features_window.py:98 +msgid "Feature not available under Windows." +msgstr "Funktion unter Windows nicht verfügbar." + +#: ../src/features_window.py:59 +msgid "OpenGPG" +msgstr "OpenPGP: " + +#: ../src/features_window.py:60 +msgid "Encrypting chatmessages with gpg keys." +msgstr "Chat Nachrichten werden mit gpg Schlüssel verschlüsselt" + +#: ../src/features_window.py:61 +msgid "Requires gpg and python-GnuPGInterface." +msgstr "Erfordert gpg und python-GnuPGInterface." + +#: ../src/features_window.py:63 +msgid "network-manager" +msgstr "network-manager" + +#: ../src/features_window.py:64 +msgid "Autodetection of network status." +msgstr "Auto-Erkennung des Netzwerk-Status." + +#: ../src/features_window.py:65 +msgid "Requires gnome-network-manager and python-dbus." +msgstr "Erfordert gnome-network-manager und python-dbus." + +#: ../src/features_window.py:67 +msgid "Session Management" +msgstr "Sitzungsverwaltung" + +#: ../src/features_window.py:68 +msgid "Gajim session is stored on logout and restored on login." +msgstr "" +"Gajim-Sitzung wird beim Logout gespeichert und beim Login wiederhergestellt" + +#: ../src/features_window.py:69 +msgid "Requires python-gnome2." +msgstr "Erfordert python-gnome2." + +#: ../src/features_window.py:71 +msgid "gnome-keyring" +msgstr "gnome-keyring" + +#: ../src/features_window.py:72 +msgid "Passwords can be stored securely and not just in plaintext." +msgstr "Passwörter können sicher und nicht nur im Klartext gespeichert werden" + +#: ../src/features_window.py:73 +msgid "Requires gnome-keyring and python-gnome2-desktop." +msgstr "Erfordert gnome-keyring und python-gnome2-desktop." + +#: ../src/features_window.py:75 +msgid "SRV" +msgstr "SRV" + +#: ../src/features_window.py:76 +msgid "Ability to connect to servers which are using SRV records." +msgstr "Fähigkeit zu Servern die SRV-Einträge verwenden zu verbinden." + +#: ../src/features_window.py:77 +msgid "Requires dnsutils." +msgstr "Erfordert dnsutils." + +#: ../src/features_window.py:78 +msgid "Requires nslookup to use SRV records." +msgstr "Erfordert nslookup zur Nutzung von SRV-Einträgen." + +#: ../src/features_window.py:79 +msgid "Spell Checker" +msgstr "Rechtschreibprüfung" + +#: ../src/features_window.py:80 +msgid "Spellchecking of composed messages." +msgstr "Rechtschreibprüfung erstellter Nachrichten." + +#: ../src/features_window.py:81 +msgid "" +"Requires python-gnome2-extras or compilation of gtkspell module from Gajim " +"sources." +msgstr "" +"Erfordert python-gnome2-extras oder die Kompilation des gtkspell-Moduls aus " +"den Gajim-Quellen." + +#: ../src/features_window.py:83 +msgid "Notification-daemon" +msgstr "Notification-daemon" + +#: ../src/features_window.py:84 +msgid "Passive popups notifying for new events." +msgstr "Popups informieren über neue Ereignisse." + +#: ../src/features_window.py:85 +msgid "" +"Requires python-notify or instead python-dbus in conjunction with " +"notification-daemon." +msgstr "" +"Erforder python-notify oder stattdessen python-dbus in Verbindung mit " +"notification-daemon." + +#: ../src/features_window.py:87 +msgid "Trayicon" +msgstr "Tray-Symbol" + +#: ../src/features_window.py:88 +msgid "A icon in systemtray reflecting the current presence." +msgstr "Ein Icon im Systemtray, das den Status widerspiegelt." + +#: ../src/features_window.py:89 +msgid "" +"Requires python-gnome2-extras or compiled trayicon module from Gajim " +"sources." +msgstr "" +"Erfordert python-gnome2-extras oder das kompilierte Trayicon-Modul aus den " +"Gajim-Quellen" + +#: ../src/features_window.py:90 +msgid "Requires PyGTK >= 2.10." +msgstr "Erforder PyGTK >= 2.10." + +#: ../src/features_window.py:91 +msgid "Idle" +msgstr "Idle" + +#: ../src/features_window.py:92 +msgid "Ability to measure idle time, in order to set auto status." +msgstr "Fähigkeit die Idle-Zeit zu messen um den Status automatisch zu setzen" + +#: ../src/features_window.py:93 ../src/features_window.py:94 +msgid "Requires compilation of the idle module from Gajim sources." +msgstr "Erfordert die Kompilation des Idle-Moduls aus den Gajim-Quellen." + +#: ../src/features_window.py:95 +msgid "LaTeX" +msgstr "LaTeX" + +#: ../src/features_window.py:96 +msgid "Transform LaTeX espressions between $$ $$." +msgstr "LaTeX-Ausdrücke zwischen $$ $$ umwandeln." + +#: ../src/features_window.py:97 +msgid "" +"Requires texlive-latex-base, dvips and imagemagick. You have to set " +"'use_latex' to True in the Advanced Configuration Editor." +msgstr "" +"Erfordert texlive-latex-base, dvips und imagemagick. Sie müssen 'use_latex' " +"im Advanced Configuration Editor auf 'true' setzen." + +#: ../src/features_window.py:99 +msgid "End to end encryption" +msgstr "OpenPGP-Verschlüsselung" + +#: ../src/features_window.py:100 +msgid "Encrypting chatmessages." +msgstr "Chatnachrichten werden verschlüsselt." + +#: ../src/features_window.py:101 ../src/features_window.py:102 +msgid "Requires python-crypto." +msgstr "Erfordert python-crypto" + +#: ../src/features_window.py:103 +msgid "RST Generator" +msgstr "RST Generator" + +#: ../src/features_window.py:104 +msgid "" +"Generate XHTML output from RST code (see http://docutils.sourceforge.net/" +"docs/ref/rst/restructuredtext.html)." +msgstr "" +"Erzeug aus RST-Code XHTML-Ausgaben (siehe http://docutils.sourceforge.net/" +"docs/ref/rst/restructuredtext.html)." + +#: ../src/features_window.py:105 ../src/features_window.py:106 +msgid "Requires python-docutils." +msgstr "Erfordert python-docutils." + +#: ../src/features_window.py:107 +msgid "libsexy" +msgstr "" + +#: ../src/features_window.py:108 +#, fuzzy +msgid "Ability to have clickable URLs in chat window." +msgstr "Versteckt die Knöpfe im Gruppenchat-Fenster." + +#: ../src/features_window.py:109 ../src/features_window.py:110 +msgid "Requires python-sexy." +msgstr "Erfordert python-sexy." + +#: ../src/features_window.py:117 ../src/common/helpers.py:248 +msgid "Available" +msgstr "Angemeldet" + +#: ../src/features_window.py:124 +#, fuzzy +msgid "Feature" +msgstr "Fähigkeiten des Servers" + +#: ../src/filetransfers_window.py:77 msgid "File" msgstr "Datei" -#: ../src/filetransfers_window.py:87 +#: ../src/filetransfers_window.py:92 msgid "Time" msgstr "Zeit" -#: ../src/filetransfers_window.py:99 +#: ../src/filetransfers_window.py:104 msgid "Progress" msgstr "Fortschritt" -#: ../src/filetransfers_window.py:161 -#: ../src/filetransfers_window.py:215 +#: ../src/filetransfers_window.py:164 ../src/filetransfers_window.py:218 #, python-format msgid "Filename: %s" msgstr "Dateiname: %s" -#: ../src/filetransfers_window.py:162 -#: ../src/filetransfers_window.py:290 +#: ../src/filetransfers_window.py:165 ../src/filetransfers_window.py:305 #, python-format msgid "Size: %s" msgstr "Größe: %s" #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:171 -#: ../src/filetransfers_window.py:181 -#: ../src/history_manager.py:463 +#: ../src/filetransfers_window.py:174 ../src/filetransfers_window.py:184 +#: ../src/history_manager.py:468 msgid "You" msgstr "Sie" -#: ../src/filetransfers_window.py:172 +#: ../src/filetransfers_window.py:175 #, python-format msgid "Sender: %s" msgstr "Gespeichert in: %s" -#: ../src/filetransfers_window.py:173 -#: ../src/filetransfers_window.py:564 -#: ../src/tooltips.py:573 +#: ../src/filetransfers_window.py:176 ../src/filetransfers_window.py:593 +#: ../src/tooltips.py:593 msgid "Recipient: " msgstr "Empfänger: " -#: ../src/filetransfers_window.py:184 +#: ../src/filetransfers_window.py:187 #, python-format msgid "Saved in: %s" msgstr "Absender: %s" -#: ../src/filetransfers_window.py:186 +#: ../src/filetransfers_window.py:189 msgid "File transfer completed" msgstr "Dateitransfer abgeschlossen" -#: ../src/filetransfers_window.py:200 -#: ../src/filetransfers_window.py:206 +#: ../src/filetransfers_window.py:203 ../src/filetransfers_window.py:209 msgid "File transfer cancelled" msgstr "Dateitransfer abgebrochen" -#: ../src/filetransfers_window.py:200 -#: ../src/filetransfers_window.py:207 +#: ../src/filetransfers_window.py:203 ../src/filetransfers_window.py:210 msgid "Connection with peer cannot be established." msgstr "Verbindung zum Teilnehmer kann nicht hergestellt werden" -#: ../src/filetransfers_window.py:216 +#: ../src/filetransfers_window.py:219 #, python-format msgid "Recipient: %s" msgstr "Empfänger: %s" -#: ../src/filetransfers_window.py:218 +#: ../src/filetransfers_window.py:221 #, python-format msgid "Error message: %s" msgstr "Fehlermeldung: %s" -#: ../src/filetransfers_window.py:219 +#: ../src/filetransfers_window.py:222 msgid "File transfer stopped by the contact at the other end" msgstr "Gegenseite hat Dateitransfer gestoppt" -#: ../src/filetransfers_window.py:236 +#: ../src/filetransfers_window.py:243 msgid "Choose File to Send..." msgstr "Datei auswählen ..." -#: ../src/filetransfers_window.py:255 +#: ../src/filetransfers_window.py:259 ../src/tooltips.py:632 +#, fuzzy +msgid "Description: " +msgstr "Beschreibung: %s" + +#: ../src/filetransfers_window.py:270 msgid "Gajim cannot access this file" msgstr "Gajim kann auf diese Datei nicht zugreifen" -#: ../src/filetransfers_window.py:256 +#: ../src/filetransfers_window.py:271 msgid "This file is being used by another process." msgstr "Diese Datei wird von einem anderen Prozess verwendet." -#: ../src/filetransfers_window.py:288 +#: ../src/filetransfers_window.py:303 #, python-format msgid "File: %s" msgstr "Datei: %s" -#: ../src/filetransfers_window.py:293 +#: ../src/filetransfers_window.py:308 #, python-format msgid "Type: %s" msgstr "Typ: %s" -#: ../src/filetransfers_window.py:295 +#: ../src/filetransfers_window.py:310 #, python-format msgid "Description: %s" msgstr "Beschreibung: %s" -#: ../src/filetransfers_window.py:296 +#: ../src/filetransfers_window.py:311 #, python-format msgid "%s wants to send you a file:" msgstr "%s möchte ihnen eine Datei senden:" -#: ../src/filetransfers_window.py:310 -#: ../src/gtkgui_helpers.py:750 +#: ../src/filetransfers_window.py:324 ../src/gtkgui_helpers.py:773 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Kann existierende Datei \"%s\" nicht überschreiben" -#: ../src/filetransfers_window.py:311 -#: ../src/gtkgui_helpers.py:752 -msgid "A file with this name already exists and you do not have permission to overwrite it." -msgstr "Eine Datei mit diesem Namen existiert bereits und Sie haben nicht die Rechte sie zu überschreiben." +#: ../src/filetransfers_window.py:325 ../src/gtkgui_helpers.py:775 +msgid "" +"A file with this name already exists and you do not have permission to " +"overwrite it." +msgstr "" +"Eine Datei mit diesem Namen existiert bereits und Sie haben nicht die Rechte " +"sie zu überschreiben." -#: ../src/filetransfers_window.py:318 -#: ../src/gtkgui_helpers.py:756 +#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:779 msgid "This file already exists" msgstr "Diese Datei existiert bereits" -#: ../src/filetransfers_window.py:318 -#: ../src/gtkgui_helpers.py:756 +#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:779 msgid "What do you want to do?" msgstr "Was möchten Sie tun?" -#: ../src/filetransfers_window.py:330 -#: ../src/gtkgui_helpers.py:766 +#: ../src/filetransfers_window.py:344 ../src/gtkgui_helpers.py:789 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Verzeichnis \"%s\" ist nicht schreibbar" -#: ../src/filetransfers_window.py:330 -#: ../src/gtkgui_helpers.py:767 +#: ../src/filetransfers_window.py:344 ../src/gtkgui_helpers.py:790 msgid "You do not have permission to create files in this directory." -msgstr "Ihre Benutzerrechte erlauben es Ihnen nicht, in diesem Verzeichnis Dateien anzulegen." +msgstr "" +"Ihre Benutzerrechte erlauben es Ihnen nicht, in diesem Verzeichnis Dateien " +"anzulegen." -#: ../src/filetransfers_window.py:340 +#: ../src/filetransfers_window.py:354 msgid "Save File as..." msgstr "Datei speichern unter ..." #. 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:421 +#: ../src/filetransfers_window.py:434 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -3755,95 +4410,103 @@ 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:497 +#: ../src/filetransfers_window.py:523 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" -#: ../src/filetransfers_window.py:536 -#: ../src/filetransfers_window.py:539 +#: ../src/filetransfers_window.py:563 ../src/filetransfers_window.py:566 msgid "Invalid File" msgstr "Ungültige Datei" -#: ../src/filetransfers_window.py:536 +#: ../src/filetransfers_window.py:563 msgid "File: " msgstr "Datei: " -#: ../src/filetransfers_window.py:540 +#: ../src/filetransfers_window.py:567 msgid "It is not possible to send empty files" msgstr "Es nicht möglich, leere Dateien zu versenden" -#: ../src/filetransfers_window.py:560 -#: ../src/tooltips.py:563 +#: ../src/filetransfers_window.py:589 ../src/tooltips.py:583 msgid "Name: " msgstr "Name: " -#: ../src/filetransfers_window.py:562 -#: ../src/tooltips.py:567 +#: ../src/filetransfers_window.py:591 ../src/tooltips.py:587 msgid "Sender: " msgstr "Absender: " -#: ../src/filetransfers_window.py:750 +#: ../src/filetransfers_window.py:779 msgid "Pause" msgstr "Pause" -#: ../src/gajim.py:47 +#: ../src/gajim.py:56 #, python-format msgid "%s is not a valid loglevel" msgstr "%s ist kein gültiger Loglevel." -#: ../src/gajim.py:122 +#: ../src/gajim.py:129 msgid "Gajim needs X server to run. Quiting..." msgstr "Gajim benötigt einen laufenden X-Server. Breche ab ..." -#: ../src/gajim.py:126 +#: ../src/gajim.py:156 msgid "Gajim needs PyGTK 2.8 or above" msgstr "Gajim benötigt PyGTK 2.6 oder höher" -#: ../src/gajim.py:127 +#: ../src/gajim.py:157 msgid "Gajim needs PyGTK 2.8 or above to run. Quiting..." msgstr "Gajim benötigt PyGTK 2.6 oder höher. Breche ab ..." -#: ../src/gajim.py:129 +#: ../src/gajim.py:159 msgid "Gajim needs GTK 2.8 or above" msgstr "Gajim benötigt GTK 2.6 oder höher" -#: ../src/gajim.py:130 +#: ../src/gajim.py:160 msgid "Gajim needs GTK 2.8 or above to run. Quiting..." msgstr "Gajim benötigt GTK 2.6+. Breche ab ..." -#: ../src/gajim.py:135 +#: ../src/gajim.py:165 msgid "GTK+ runtime is missing libglade support" msgstr "GTK+ runtine fehlt libglade-Unterstützung" -#: ../src/gajim.py:137 +#: ../src/gajim.py:167 #, python-format -msgid "Please remove your current GTK+ runtime and install the latest stable version from %s" -msgstr "Bitte entfernen Sie Ihre derzeitige GTK+ Laufzeitumgebung und installieren Sie die aktuelle Version von %s" +msgid "" +"Please remove your current GTK+ runtime and install the latest stable " +"version from %s" +msgstr "" +"Bitte entfernen Sie Ihre derzeitige GTK+ Laufzeitumgebung und installieren " +"Sie die aktuelle Version von %s" -#: ../src/gajim.py:139 -msgid "Please make sure that GTK+ and PyGTK have libglade support in your system." -msgstr "Bitte stellen Sie sicher, dass GTK+ und PyGTK auf Ihrem System libglade-Unterstützung besitzen." +#: ../src/gajim.py:169 +msgid "" +"Please make sure that GTK+ and PyGTK have libglade support in your system." +msgstr "" +"Bitte stellen Sie sicher, dass GTK+ und PyGTK auf Ihrem System libglade-" +"Unterstützung besitzen." -#: ../src/gajim.py:144 +#: ../src/gajim.py:174 msgid "Gajim needs PySQLite2 to run" msgstr "Gajim benötigt PySQLite2 zum Starten" -#: ../src/gajim.py:152 +#: ../src/gajim.py:182 msgid "Gajim needs pywin32 to run" msgstr "Gajim benötigt pywin32 zum Laufen" -#: ../src/gajim.py:153 +#: ../src/gajim.py:183 #, python-format -msgid "Please make sure that Pywin32 is installed on your system. You can get it at %s" -msgstr "Bitte stellen Sie sicher das Pywin32 auf Ihrem System installiert ist. Sie können es unter folgender URL herunterladen: %s " +msgid "" +"Please make sure that Pywin32 is installed on your system. You can get it at " +"%s" +msgstr "" +"Bitte stellen Sie sicher das Pywin32 auf Ihrem System installiert ist. Sie " +"können es unter folgender URL herunterladen: %s " #. set the icon to all newly opened wind -#: ../src/gajim.py:300 +#: ../src/gajim.py:328 msgid "Gajim is already running" msgstr "Gajim läuft bereits" -#: ../src/gajim.py:301 +#: ../src/gajim.py:329 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -3851,88 +4514,169 @@ msgstr "" "Eine andere Instanz von Gajim schein bereits zu laufen\n" "Trotzdem starten?" -#: ../src/gajim.py:408 +#: ../src/gajim.py:352 ../src/common/connection_handlers.py:908 +#: ../src/common/connection_handlers.py:1620 +#: ../src/common/connection_handlers.py:1649 +#: ../src/common/connection_handlers.py:1659 +#: ../src/common/connection_handlers.py:1678 +#: ../src/common/connection_handlers.py:1915 +#: ../src/common/connection_handlers.py:2027 ../src/common/connection.py:938 +msgid "Disk Write Error" +msgstr "Fehler beim Schreiben auf Festplatte" + +#: ../src/gajim.py:448 +msgid "Do you accept this request?" +msgstr "Akzeptieren Sie diese Anfrage?" + +#: ../src/gajim.py:450 +#, python-format +msgid "Do you accept this request on account %s?" +msgstr "Akzeptieren Sie diese Anfrage vom %s Konto?" + +#: ../src/gajim.py:453 #, python-format msgid "HTTP (%s) Authorization for %s (id: %s)" msgstr "HTTP (%s) Autorisierung für %s (id: %s)" -#: ../src/gajim.py:409 -msgid "Do you accept this request?" -msgstr "Akzeptieren Sie diese Anfrage?" - -#: ../src/gajim.py:455 -#: ../src/notify.py:435 +#: ../src/gajim.py:500 ../src/notify.py:466 msgid "Connection Failed" msgstr "Verbindung fehlgeschlagen" -#: ../src/gajim.py:775 +#: ../src/gajim.py:834 #, python-format msgid "Subject: %s" msgstr "Thema: %s" #. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) -#: ../src/gajim.py:820 -#: ../src/gajim.py:833 +#: ../src/gajim.py:881 ../src/gajim.py:894 #, python-format msgid "error while sending %s ( %s )" msgstr "Fehler beim Senden von %s ( %s )" -#: ../src/gajim.py:866 +#: ../src/gajim.py:927 msgid "Authorization accepted" msgstr "Autorisierung akzeptiert" -#: ../src/gajim.py:867 +#: ../src/gajim.py:928 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "Kontakt \"%s\" hat Sie autorisiert seinen oder ihren Staus zu sehen." -#: ../src/gajim.py:875 +#: ../src/gajim.py:936 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Kontakt \"%s\" hat das Abonnement zurückgezogen" -#: ../src/gajim.py:876 +#: ../src/gajim.py:937 msgid "You will always see him or her as offline." msgstr "Sie werden den Kontakt ab sofort als offline sehen." -#: ../src/gajim.py:920 +#: ../src/gajim.py:981 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Kontakt mit \"%s\" konnte nicht hergestellt werden" -#: ../src/gajim.py:921 -#: ../src/common/connection.py:434 +#: ../src/gajim.py:982 ../src/common/connection.py:465 msgid "Check your connection or try again later." -msgstr "Überprüfen Sie die Verbindung oder versuchen Sie es später noch einmal." +msgstr "" +"Überprüfen Sie die Verbindung oder versuchen Sie es später noch einmal." -#: ../src/gajim.py:1070 -#: ../src/roster_window.py:1218 +#: ../src/gajim.py:1151 ../src/groupchat_control.py:991 +#, python-format +msgid "%s is now known as %s" +msgstr "%s heißt jetzt %s" + +#: ../src/gajim.py:1167 ../src/roster_window.py:1372 #, python-format msgid "%s is now %s (%s)" msgstr "%s ist jetzt %s (%s)" #. No status message -#: ../src/gajim.py:1073 -#: ../src/groupchat_control.py:962 -#: ../src/roster_window.py:1221 +#: ../src/gajim.py:1170 ../src/groupchat_control.py:1142 +#: ../src/roster_window.py:1375 #, python-format msgid "%s is now %s" msgstr "%s ist jetzt %s" -#: ../src/gajim.py:1170 +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/gajim.py:1291 ../src/groupchat_control.py:951 +msgid "Any occupant is allowed to see your full JID" +msgstr "Jeder Teilnehmer darf Ihre volle JID sehen" + +#: ../src/gajim.py:1294 +msgid "Room now shows unavailable member" +msgstr "Raum zeigt jetzt abwesende Teilnehmer" + +#: ../src/gajim.py:1296 +msgid "room now does not show unavailable members" +msgstr "Raum zeigt jetzt abwesende Teilnehmer nicht an" + +#: ../src/gajim.py:1299 +msgid "A non-privacy-related room configuration change has occurred" +msgstr "" +"Eine nicht Privatsphären-bezogene Raum-Konfigurations-Änderung ist " +"aufgetreten" + +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#: ../src/gajim.py:1302 +msgid "Room logging is now enabled" +msgstr "Raum-Mitschnitt ist jetzt aktiviert" + +#: ../src/gajim.py:1304 +msgid "Room logging is now disabled" +msgstr "Raum-Mitschnitt ist jetzt deaktiviert" + +#: ../src/gajim.py:1306 +msgid "Room is now non-anonymous" +msgstr "Raum ist jetzt un-anonym" + +#: ../src/gajim.py:1309 +msgid "Room is now semi-anonymous" +msgstr "Raum ist jetzt semi-anonym" + +#: ../src/gajim.py:1312 +msgid "Room is now fully-anonymous" +msgstr "Raum ist jetzt voll anonym" + +#: ../src/gajim.py:1344 +#, python-format +msgid "A Password is required to join the room %s. Please type it" +msgstr "Für das Betreten des Gruppenchats-Raumes %s wird ein Passwort benötig." + +#: ../src/gajim.py:1379 msgid "Your passphrase is incorrect" msgstr "Ihre Passphrase ist falsch" -#: ../src/gajim.py:1171 +#: ../src/gajim.py:1380 msgid "You are currently connected without your OpenPGP key." msgstr "Sie wurden ohne ihren GPG-Schlüssel verbunden" -#: ../src/gajim.py:1274 +#: ../src/gajim.py:1392 +msgid "Passphrase Required" +msgstr "Passphrase benötigt" + +#: ../src/gajim.py:1393 +#, python-format +msgid "Enter GPG key passphrase for account %s." +msgstr "Geben Sie die GPG-Passphrase für das Konto %s ein." + +#: ../src/gajim.py:1405 +msgid "Wrong Passphrase" +msgstr "Falsche Passphrase" + +#: ../src/gajim.py:1406 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "" +"Bitte geben Sie Ihre GPG-Passphrase erneut ein oder klicken Sie auf " +"Abbrechen." + +#: ../src/gajim.py:1515 #, python-format msgid "New mail on %(gmail_mail_address)s" msgstr "Neue E-Mail auf %(gmail_mail_address)s" -#: ../src/gajim.py:1276 +#: ../src/gajim.py:1517 #, python-format msgid "You have %d new mail conversation" msgid_plural "You have %d new mail conversations" @@ -3942,7 +4686,7 @@ msgstr[1] "Sie haben %d ungelesene E-Mail-Nachrichten" #. FIXME: emulate Gtalk client popups. find out what they parse and how #. they decide what to show #. each message has a 'From', 'Subject' and 'Snippet' field -#: ../src/gajim.py:1285 +#: ../src/gajim.py:1526 #, python-format msgid "" "\n" @@ -3951,329 +4695,430 @@ msgstr "" "\n" "Von: %(from_address)s" -#: ../src/gajim.py:1441 +#: ../src/gajim.py:1704 #, python-format msgid "%s wants to send you a file." msgstr "%s möchte ihnen eine Datei senden." -#: ../src/gajim.py:1506 +#: ../src/gajim.py:1769 #, python-format msgid "You successfully received %(filename)s from %(name)s." msgstr "Sie haben %(filename)s erfolgreich von %(name)s erhalten." #. ft stopped -#: ../src/gajim.py:1510 +#: ../src/gajim.py:1773 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Dateitransfer %(filename)s von %(name)s wurde gestoppt." -#: ../src/gajim.py:1523 +#: ../src/gajim.py:1786 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Sie haben%(filename)s erfolgreich an %(name)s gesendet." #. ft stopped -#: ../src/gajim.py:1527 +#: ../src/gajim.py:1790 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Dateitransfer von %(filename)s an %(name)s wurde gestoppt." -#: ../src/gajim.py:1640 +#: ../src/gajim.py:1885 +msgid "Session negotiation cancelled" +msgstr "Sitzungs-Aushandlung abgebrochen" + +#: ../src/gajim.py:1886 +#, python-format +msgid "The client at %s cancelled the session negotiation." +msgstr "Der Client bei %s hat die Sitzungs-Aushandlung abgebrochen." + +#: ../src/gajim.py:1927 ../src/gajim.py:1971 +msgid "Confirm these session options" +msgstr "Bestätigen Sie diese Sitzungs-Optionen" + +#: ../src/gajim.py:1928 +#, python-format +msgid "" +"The remote client wants to negotiate an session with these features:\n" +"\n" +"\t\t%s\n" +"\n" +"\t\tAre these options acceptable?" +msgstr "" +"Der entfernte Client will eine Sitzung mit diesen Features aushandeln:\n" +"\n" +"\t\t%s\n" +"\n" +"\t\tSind diese Einstellungen akzeptabel?" + +#: ../src/gajim.py:1972 +#, python-format +msgid "" +"The remote client selected these options:\n" +"\n" +"%s\n" +"\n" +"Continue with the session?" +msgstr "" +"Der entfernte Client hat diese Optionen ausgewählt:\n" +"\n" +"%s\n" +"\n" +"Mit der Sitzung fortfahren?" + +#: ../src/gajim.py:2097 msgid "Username Conflict" msgstr "Benutzernamenkonflikt" -#: ../src/gajim.py:1641 +#: ../src/gajim.py:2098 msgid "Please type a new username for your local account" -msgstr "Bitte geben Sie einen neuen Benutzernamen für Ihr lokales Konto ein" +msgstr "Bitte geben Sie einen neuen Benutzernamen für Ihr lokales Konto ein" + +#: ../src/gajim.py:2115 +msgid "Ping?" +msgstr "Ping?" + +#: ../src/gajim.py:2123 +#, python-format +msgid "Pong! (%s s.)" +msgstr "Pong! (%s s.)" + +#: ../src/gajim.py:2129 +msgid "Error." +msgstr "Fehler:" + +#: ../src/gajim.py:2154 +msgid "Resource Conflict" +msgstr "Resourcenkonflikt" + +#: ../src/gajim.py:2155 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" +msgstr "" +"Sie sind mit diesem Konto bereits mit derselben Ressource verbunden.Bitte " +"geben Sie eine neue ein" #. it is good to notify the user #. in case he or she cannot see the output of the console -#: ../src/gajim.py:1987 +#: ../src/gajim.py:2520 msgid "Could not save your settings and preferences" msgstr "Konnte Einstellungen nicht speichern" -#: ../src/gajim.py:2185 +#. sorted alphanum +#: ../src/gajim.py:2656 ../src/common/config.py:102 +#: ../src/common/config.py:413 ../src/common/optparser.py:206 +#: ../src/common/optparser.py:424 ../src/common/optparser.py:458 +msgid "default" +msgstr "Standard" + +#: ../src/gajim.py:2742 msgid "Network Manager support not available" msgstr "Unterstützung für Network Manager nicht verfügbar" -#: ../src/gajim.py:2264 +#: ../src/gajim.py:2847 msgid "Session Management support not available (missing gnome.ui module)" msgstr "Sitzungsmanagment-Unterstützung nicht verfügbar (Modul gnome.ui fehlt)" -#: ../src/gajim-remote.py:65 +#: ../src/gajim-remote.py:73 msgid "Shows a help on specific command" msgstr "zeige die Hilfe für einen bestimmten Befehl" #. User gets help for the command, specified by this parameter -#: ../src/gajim-remote.py:68 +#: ../src/gajim-remote.py:76 msgid "command" msgstr "Befehl" -#: ../src/gajim-remote.py:69 +#: ../src/gajim-remote.py:77 msgid "show help on command" msgstr "zeige Hilfe für Befehl" -#: ../src/gajim-remote.py:73 +#: ../src/gajim-remote.py:81 msgid "Shows or hides the roster window" msgstr "Ein- oder Ausblenden des Hauptfensters" -#: ../src/gajim-remote.py:77 +#: ../src/gajim-remote.py:85 msgid "Pops up a window with the next pending event" msgstr "Zeige Popup-Fenster mit dem nächsten ungelesenen Ereignis" -#: ../src/gajim-remote.py:81 -msgid "Prints a list of all contacts in the roster. Each contact appears on a separate line" +#: ../src/gajim-remote.py:89 +msgid "" +"Prints a list of all contacts in the roster. Each contact appears on a " +"separate line" msgstr "Gibt eine Liste aller Kontakte im Roster aus. Eine Zeile je Kontakt" -#: ../src/gajim-remote.py:84 -#: ../src/gajim-remote.py:99 -#: ../src/gajim-remote.py:109 -#: ../src/gajim-remote.py:122 -#: ../src/gajim-remote.py:136 -#: ../src/gajim-remote.py:157 -#: ../src/gajim-remote.py:187 -#: ../src/gajim-remote.py:196 -#: ../src/gajim-remote.py:203 -#: ../src/gajim-remote.py:210 -#: ../src/gajim-remote.py:221 -#: ../src/gajim-remote.py:237 -#: ../src/gajim-remote.py:246 +#: ../src/gajim-remote.py:92 ../src/gajim-remote.py:107 +#: ../src/gajim-remote.py:117 ../src/gajim-remote.py:130 +#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:153 +#: ../src/gajim-remote.py:174 ../src/gajim-remote.py:204 +#: ../src/gajim-remote.py:213 ../src/gajim-remote.py:220 +#: ../src/gajim-remote.py:227 ../src/gajim-remote.py:238 +#: ../src/gajim-remote.py:254 ../src/gajim-remote.py:263 msgid "account" msgstr "Konto" -#: ../src/gajim-remote.py:84 +#: ../src/gajim-remote.py:92 msgid "show only contacts of the given account" msgstr "zeige nur Kontakte für das gegebene Konto" -#: ../src/gajim-remote.py:90 +#: ../src/gajim-remote.py:98 msgid "Prints a list of registered accounts" msgstr "Gibt eine Liste registrierter Konten aus" -#: ../src/gajim-remote.py:94 +#: ../src/gajim-remote.py:102 msgid "Changes the status of account or accounts" msgstr "Ändere den Status eines oder mehrerer Konten" #. offline, online, chat, away, xa, dnd, invisible should not be translated -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:105 msgid "status" msgstr "Status" -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:105 msgid "one of: offline, online, chat, away, xa, dnd, invisible " msgstr "Eins von: offline, online, chat, away, xa, dnd, invisible " -#: ../src/gajim-remote.py:98 -#: ../src/gajim-remote.py:119 -#: ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:106 ../src/gajim-remote.py:127 +#: ../src/gajim-remote.py:141 ../src/gajim-remote.py:152 msgid "message" msgstr "Nachricht" -#: ../src/gajim-remote.py:98 +#: ../src/gajim-remote.py:106 msgid "status message" msgstr "Statusnachricht" -#: ../src/gajim-remote.py:99 -msgid "change status of account \"account\". If not specified, try to change status of all accounts that have \"sync with global status\" option set" -msgstr "Ändere Status vom Konto \"account\". Falls nicht angegeben, ändere Status aller Konten für die \"Kontostatus mit globalem Status abgleichen\" aktiviert ist" - -#: ../src/gajim-remote.py:105 -msgid "Shows the chat dialog so that you can send messages to a contact" -msgstr "Zeige Chatfenster, so dass eine Nachricht an einen Kontakt gesendet werden kann" - #: ../src/gajim-remote.py:107 +msgid "" +"change status of account \"account\". If not specified, try to change status " +"of all accounts that have \"sync with global status\" option set" +msgstr "" +"Ändere Status vom Konto \"account\". Falls nicht angegeben, ändere Status " +"aller Konten für die \"Kontostatus mit globalem Status abgleichen\" " +"aktiviert ist" + +#: ../src/gajim-remote.py:113 +msgid "Shows the chat dialog so that you can send messages to a contact" +msgstr "" +"Zeige Chatfenster, so dass eine Nachricht an einen Kontakt gesendet werden " +"kann" + +#: ../src/gajim-remote.py:115 msgid "JID of the contact that you want to chat with" msgstr "JID des Kontakts mit Sie chatten möchten" -#: ../src/gajim-remote.py:109 -#: ../src/gajim-remote.py:187 +#: ../src/gajim-remote.py:117 ../src/gajim-remote.py:204 msgid "if specified, contact is taken from the contact list of this account" msgstr "falls angegeben, wird der Kontakt von der Liste dieses Kontos gewählt" -#: ../src/gajim-remote.py:114 -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 key', just set 'OpenPGP key' to ''." -msgstr "Sende neue Chat-Nachricht zu einem Kontakt im Roster. OpenPGP-Schlüssel und Konto sind optional. Falls nur 'Konto' gesetzt werden soll, ohne OpenGPG-Schlüssel, setzen Sie 'OpenGPG-Schlüssel' einfach auf ''." +#: ../src/gajim-remote.py:122 +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 " +"key', just set 'OpenPGP key' to ''." +msgstr "" +"Sende neue Chat-Nachricht zu einem Kontakt im Roster. OpenPGP-Schlüssel und " +"Konto sind optional. Falls nur 'Konto' gesetzt werden soll, ohne OpenGPG-" +"Schlüssel, setzen Sie 'OpenGPG-Schlüssel' einfach auf ''." -#: ../src/gajim-remote.py:118 -#: ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:126 ../src/gajim-remote.py:139 msgid "JID of the contact that will receive the message" msgstr "JID des Kontakts, der die Nachricht empfängt" -#: ../src/gajim-remote.py:119 -#: ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:127 ../src/gajim-remote.py:141 +#: ../src/gajim-remote.py:152 msgid "message contents" msgstr "Nachrichteninhalt" -#: ../src/gajim-remote.py:120 -#: ../src/gajim-remote.py:134 +#: ../src/gajim-remote.py:128 ../src/gajim-remote.py:142 msgid "pgp key" msgstr "PGP-Schlüssel" -#: ../src/gajim-remote.py:120 -#: ../src/gajim-remote.py:134 +#: ../src/gajim-remote.py:128 ../src/gajim-remote.py:142 msgid "if specified, the message will be encrypted using this public key" msgstr "falls angegeben, wird die Nachricht damit verschlüsselt" -#: ../src/gajim-remote.py:122 -#: ../src/gajim-remote.py:136 +#: ../src/gajim-remote.py:130 ../src/gajim-remote.py:144 +#: ../src/gajim-remote.py:153 msgid "if specified, the message will be sent using this account" msgstr "falls angegeben, wird die Nachricht über dieses Konto gesendet" -#: ../src/gajim-remote.py:127 -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 key', just set 'OpenPGP key' to ''." -msgstr "Sende neue einzelne Nachricht an einen Kontakt im Roster. OpenPGP-Schlüssel und Konto sind optional. Falls nur 'Konto' gesetzt werden soll, ohne OpenGPG-Schlüssel, lassen Sie 'OpenGPG-Schlüssel' einfach leer." +#: ../src/gajim-remote.py:135 +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 " +"key', just set 'OpenPGP key' to ''." +msgstr "" +"Sende neue einzelne Nachricht an einen Kontakt im Roster. OpenPGP-Schlüssel " +"und Konto sind optional. Falls nur 'Konto' gesetzt werden soll, ohne OpenGPG-" +"Schlüssel, lassen Sie 'OpenGPG-Schlüssel' einfach leer." -#: ../src/gajim-remote.py:132 +#: ../src/gajim-remote.py:140 msgid "subject" msgstr "Betreff" -#: ../src/gajim-remote.py:132 +#: ../src/gajim-remote.py:140 msgid "message subject" msgstr "Nachrichten-Betreff" -#: ../src/gajim-remote.py:141 +#: ../src/gajim-remote.py:149 +msgid "Sends new message to a groupchat you've joined." +msgstr "" +"Sendet eine neue Nachricht an einen Gruppenchat, den Sie betreten haben." + +#: ../src/gajim-remote.py:151 +msgid "JID of the room that will receive the message" +msgstr "JID des Raums, der die Nachricht empfängt" + +#: ../src/gajim-remote.py:158 msgid "Gets detailed info on a contact" msgstr "Zeige detaillierte Informationen über Kontakt" -#: ../src/gajim-remote.py:143 -#: ../src/gajim-remote.py:156 -#: ../src/gajim-remote.py:186 -#: ../src/gajim-remote.py:195 +#: ../src/gajim-remote.py:160 ../src/gajim-remote.py:173 +#: ../src/gajim-remote.py:203 ../src/gajim-remote.py:212 msgid "JID of the contact" msgstr "JID des Kontakts" -#: ../src/gajim-remote.py:147 +#: ../src/gajim-remote.py:164 msgid "Gets detailed info on a account" msgstr "Zeige detaillierte Informationen über ein Konto" -#: ../src/gajim-remote.py:149 +#: ../src/gajim-remote.py:166 msgid "Name of the account" msgstr "Name des Kontos" -#: ../src/gajim-remote.py:153 +#: ../src/gajim-remote.py:170 msgid "Sends file to a contact" msgstr "Sendet dem Kontakt eine Datei" -#: ../src/gajim-remote.py:155 +#: ../src/gajim-remote.py:172 msgid "file" msgstr "Datei" -#: ../src/gajim-remote.py:155 +#: ../src/gajim-remote.py:172 msgid "File path" msgstr "Dateipfad" -#: ../src/gajim-remote.py:157 +#: ../src/gajim-remote.py:174 msgid "if specified, file will be sent using this account" msgstr "Falls angegeben, wird die Nachricht über dieses Konto gesendet" -#: ../src/gajim-remote.py:162 +#: ../src/gajim-remote.py:179 msgid "Lists all preferences and their values" msgstr "Zeige alle Einstellung und ihre Werte" -#: ../src/gajim-remote.py:166 +#: ../src/gajim-remote.py:183 msgid "Sets value of 'key' to 'value'." msgstr "Setze Wert von 'Schlüssel' auf 'Wert'." -#: ../src/gajim-remote.py:168 +#: ../src/gajim-remote.py:185 msgid "key=value" msgstr "key=value" -#: ../src/gajim-remote.py:168 +#: ../src/gajim-remote.py:185 msgid "'key' is the name of the preference, 'value' is the value to set it to" msgstr "'key' ist der Name der Option, 'value' ist der der einzustellende Wert" -#: ../src/gajim-remote.py:173 +#: ../src/gajim-remote.py:190 msgid "Deletes a preference item" msgstr "Lösche eine Einstellung" -#: ../src/gajim-remote.py:175 +#: ../src/gajim-remote.py:192 msgid "key" msgstr "Schlüssel" -#: ../src/gajim-remote.py:175 +#: ../src/gajim-remote.py:192 msgid "name of the preference to be deleted" msgstr "Name der zu löschenden Einstellung" -#: ../src/gajim-remote.py:179 +#: ../src/gajim-remote.py:196 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Schreibe die aktuellen Gajim-Einstellung in die Konfigurationsdatei" -#: ../src/gajim-remote.py:184 +#: ../src/gajim-remote.py:201 msgid "Removes contact from roster" msgstr "Entfernt den Kontakt aus dem Roster" -#: ../src/gajim-remote.py:193 +#: ../src/gajim-remote.py:210 msgid "Adds contact to roster" msgstr "Fügt Kontakt zum Roster hinzu" -#: ../src/gajim-remote.py:195 +#: ../src/gajim-remote.py:212 msgid "jid" msgstr "JID" -#: ../src/gajim-remote.py:196 +#: ../src/gajim-remote.py:213 msgid "Adds new contact to this account" msgstr "Fügt neuen Kontakt zu diesem Konto hinzu" -#: ../src/gajim-remote.py:201 +#: ../src/gajim-remote.py:218 msgid "Returns current status (the global one unless account is specified)" -msgstr "Gibt derzeitigen Status zurück (der globale Status, außer, es wird ein Account spezifiziert)" +msgstr "" +"Gibt derzeitigen Status zurück (der globale Status, außer, es wird ein " +"Account spezifiziert)" -#: ../src/gajim-remote.py:208 -msgid "Returns current status message(the global one unless account is specified)" -msgstr "Gibt derzeitige Statusnachricht zurück (der globale, außer, es wird ein Account angegeben)" +#: ../src/gajim-remote.py:225 +msgid "" +"Returns current status message(the global one unless account is specified)" +msgstr "" +"Gibt derzeitige Statusnachricht zurück (der globale, außer, es wird ein " +"Account angegeben)" -#: ../src/gajim-remote.py:215 +#: ../src/gajim-remote.py:232 msgid "Returns number of unread messages" msgstr "Gibt die Anzahl der ungelesenen Nachrichten zurück" -#: ../src/gajim-remote.py:219 +#: ../src/gajim-remote.py:236 msgid "Opens 'Start Chat' dialog" msgstr "Öffnet den 'Chat starten' Dialog" -#: ../src/gajim-remote.py:221 +#: ../src/gajim-remote.py:238 msgid "Starts chat, using this account" msgstr "Starte Chat mit diesem Account" -#: ../src/gajim-remote.py:225 +#: ../src/gajim-remote.py:242 msgid "Sends custom XML" msgstr "Benutzerdefinierten XML-Code senden" -#: ../src/gajim-remote.py:227 +#: ../src/gajim-remote.py:244 msgid "XML to send" msgstr "Zu sendender XML-Code" -#: ../src/gajim-remote.py:228 -msgid "Account in which the xml will be sent; if not specified, xml will be sent to all accounts" -msgstr "Konto, an welchen XML gesendet wird; wenn nicht spezifiziert, wird XML an alle Konten gesendet" +#: ../src/gajim-remote.py:245 +msgid "" +"Account in which the xml will be sent; if not specified, xml will be sent to " +"all accounts" +msgstr "" +"Konto, an welchen XML gesendet wird; wenn nicht spezifiziert, wird XML an " +"alle Konten gesendet" -#: ../src/gajim-remote.py:234 +#: ../src/gajim-remote.py:251 msgid "Handle a xmpp:/ uri" msgstr "Behandle eine xmpp:/ URI" -#: ../src/gajim-remote.py:236 +#: ../src/gajim-remote.py:253 msgid "uri" msgstr "URI" -#: ../src/gajim-remote.py:241 +#: ../src/gajim-remote.py:258 msgid "Join a MUC room" msgstr "Neuen Raum betreten" -#: ../src/gajim-remote.py:243 +#: ../src/gajim-remote.py:260 msgid "room" msgstr "Raum" -#: ../src/gajim-remote.py:244 +#: ../src/gajim-remote.py:261 msgid "nick" msgstr "Spitzname" -#: ../src/gajim-remote.py:245 +#: ../src/gajim-remote.py:262 msgid "password" msgstr "Passwort" -#: ../src/gajim-remote.py:268 +#: ../src/gajim-remote.py:285 msgid "Missing argument \"contact_jid\"" msgstr "Fehlendes Argument \"contact_jid\"" -#: ../src/gajim-remote.py:287 +#: ../src/gajim-remote.py:304 #, python-format msgid "" "'%s' is not in your roster.\n" @@ -4282,11 +5127,11 @@ msgstr "" "'%s' ist nicht in ihrer Kontaktliste.\n" "Bitte geben Sie ein Konto zum Senden der Nachricht an." -#: ../src/gajim-remote.py:290 +#: ../src/gajim-remote.py:307 msgid "You have no active account" msgstr "Kein aktives Konto" -#: ../src/gajim-remote.py:354 +#: ../src/gajim-remote.py:371 #, python-format msgid "" "Usage: %s %s %s \n" @@ -4295,16 +5140,16 @@ msgstr "" "Verwendung: %s %s %s \n" "\t %s" -#: ../src/gajim-remote.py:357 +#: ../src/gajim-remote.py:374 msgid "Arguments:" msgstr "Parameter:" -#: ../src/gajim-remote.py:361 +#: ../src/gajim-remote.py:378 #, python-format msgid "%s not found" msgstr "%s nicht gefunden" -#: ../src/gajim-remote.py:365 +#: ../src/gajim-remote.py:382 #, python-format msgid "" "Usage: %s command [arguments]\n" @@ -4313,7 +5158,7 @@ msgstr "" "Verwendung: %s Befehl [Argumente]\n" "Befehl ist einer von:\n" -#: ../src/gajim-remote.py:438 +#: ../src/gajim-remote.py:455 #, python-format msgid "" "Too many arguments. \n" @@ -4322,7 +5167,7 @@ msgstr "" "Zu viele Argumente. \n" "Geben Sie \"%s help %s\" ein für weitere Informationen" -#: ../src/gajim-remote.py:442 +#: ../src/gajim-remote.py:459 #, python-format msgid "" "Argument \"%s\" is not specified. \n" @@ -4331,229 +5176,291 @@ msgstr "" "Argument \"%s\" wurde nicht angegeben. \n" "Geben Sie \"%s help %s\" ein für Hilfe" -#: ../src/gajim-remote.py:460 +#: ../src/gajim-remote.py:477 msgid "Wrong uri" msgstr "Falscher URI" -#: ../src/gajim_themes_window.py:60 +#: ../src/gajim_themes_window.py:67 msgid "Theme" msgstr "Thema" +#: ../src/gajim_themes_window.py:105 +msgid "You cannot make changes to the default theme" +msgstr "Sie können ihr derzeitiges Theme nicht ändern" + +#: ../src/gajim_themes_window.py:106 +msgid "Please create a clean new theme with your desired name." +msgstr "" +"Bitte erstellen Sie ein neues leeres Thema mit Ihrem gewünschten Namen." + #. don't confuse translators -#: ../src/gajim_themes_window.py:155 +#: ../src/gajim_themes_window.py:180 msgid "theme name" msgstr "Name des Themas" -#: ../src/gajim_themes_window.py:172 +#: ../src/gajim_themes_window.py:197 msgid "You cannot delete your current theme" msgstr "Sie können ihr derzeitiges Theme nicht löschen" -#: ../src/gajim_themes_window.py:173 +#: ../src/gajim_themes_window.py:198 msgid "Please first choose another for your current theme." msgstr "Bitte wählen Sie zuerst einen anderen Namen für ihr derzeitiges Theme." -#: ../src/groupchat_control.py:122 +#: ../src/groupchat_control.py:139 msgid "Sending private message failed" msgstr "Senden privater Nachricht fehlgeschlagen" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:124 +#: ../src/groupchat_control.py:141 #, python-format msgid "You are no longer in group chat \"%s\" or \"%s\" has left." -msgstr "Sie sind nicht mehr im Gruppenchat \"%s\" oder \"%s\" hat den Gruppenchat verlassen." +msgstr "" +"Sie sind nicht mehr im Gruppenchat \"%s\" oder \"%s\" hat den Gruppenchat " +"verlassen." -#: ../src/groupchat_control.py:322 +#: ../src/groupchat_control.py:350 msgid "Insert Nickname" msgstr "Spitzname einfügen" +#: ../src/groupchat_control.py:878 +msgid "Really send file?" +msgstr "Datei wirklich senden?" + +#: ../src/groupchat_control.py:879 +#, python-format +msgid "If you send a file to %s, he/she will know your real Jabber ID." +msgstr "" +"Wenn Sie eine Datei an %s senden wird er/sie Ihre echte Jabber ID kennen." + +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/groupchat_control.py:954 +msgid "Room logging is enabled" +msgstr "Raum-Mitschnitt ist aktiviert" + +#: ../src/groupchat_control.py:956 +msgid "A new room has been created" +msgstr "Ein neuer Raum wurde erstellt" + +#: ../src/groupchat_control.py:959 +msgid "The server has assigned or modified your roomnick" +msgstr "Der Server hat Ihren Raum-Nick zugewiesen oder verändert" + #. do not print 'kicked by None' -#: ../src/groupchat_control.py:844 +#: ../src/groupchat_control.py:965 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s wurde rausgeschmissen: %(reason)s" -#: ../src/groupchat_control.py:848 +#: ../src/groupchat_control.py:969 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s wurde von %(who)s rausgeschmissen: %(reason)s" #. do not print 'banned by None' -#: ../src/groupchat_control.py:855 +#: ../src/groupchat_control.py:976 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s wurde gebannt: %(reason)s" -#: ../src/groupchat_control.py:859 +#: ../src/groupchat_control.py:980 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s wurde von %(who)s gebannt: %(reason)s" -#: ../src/groupchat_control.py:867 +#: ../src/groupchat_control.py:989 #, python-format msgid "You are now known as %s" msgstr "Sie heißen nun %s" -#: ../src/groupchat_control.py:869 +#: ../src/groupchat_control.py:1025 ../src/groupchat_control.py:1029 +#: ../src/groupchat_control.py:1034 #, python-format -msgid "%s is now known as %s" -msgstr "%s heißt jetzt %s" +msgid "%(nick)s has been removed from the room (%(reason)s)" +msgstr "%(nick)s wurde von %(who)s rausgeschmissen: %(reason)s" -#: ../src/groupchat_control.py:955 +#: ../src/groupchat_control.py:1026 +#, fuzzy +msgid "affiliation changed" +msgstr "Zugehörigkeit: " + +#: ../src/groupchat_control.py:1031 +msgid "room configuration changed to members-only" +msgstr "Gruppenchatkonfiguration wurde auf ausschließlich Mitgleider geändert" + +#: ../src/groupchat_control.py:1036 +msgid "system shutdown" +msgstr "System wird heruntergefahren" + +#: ../src/groupchat_control.py:1135 #, python-format msgid "%s has left" msgstr "%s ist gegangen" -#: ../src/groupchat_control.py:960 +#: ../src/groupchat_control.py:1140 #, python-format msgid "%s has joined the group chat" msgstr "%s hat den Gruppenchat betreten" -#: ../src/groupchat_control.py:1082 -#: ../src/groupchat_control.py:1100 -#: ../src/groupchat_control.py:1193 -#: ../src/groupchat_control.py:1210 +#. Invalid Nickname +#. invalid char +#: ../src/groupchat_control.py:1253 ../src/groupchat_control.py:1532 +msgid "Invalid nickname" +msgstr "Ungültiger Benutzername" + +#: ../src/groupchat_control.py:1254 ../src/groupchat_control.py:1533 +msgid "The nickname has not allowed characters." +msgstr "Die Jabber-ID für den Gruppenchat enthält nicht erlaubte Zeichen." + +#: ../src/groupchat_control.py:1277 ../src/groupchat_control.py:1295 +#: ../src/groupchat_control.py:1379 ../src/groupchat_control.py:1396 #, python-format msgid "Nickname not found: %s" msgstr "Spitzname nicht gefunden: %s" -#: ../src/groupchat_control.py:1116 +#: ../src/groupchat_control.py:1311 msgid "This group chat has no subject" msgstr "Dieser Gruppenchat hat kein Thema" -#: ../src/groupchat_control.py:1129 +#: ../src/groupchat_control.py:1322 #, python-format msgid "Invited %(contact_jid)s to %(room_jid)s." msgstr "%(contact_jid)s in %(room_jid)s eingeladen" -#. %s is something the user wrote but it is not a jid so we inform -#: ../src/groupchat_control.py:1136 -#: ../src/groupchat_control.py:1164 +#: ../src/groupchat_control.py:1459 #, python-format -msgid "%s does not appear to be a valid JID" -msgstr "%s scheint keine gültige JID zu sein" +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. Does " +"NOT support spaces in nickname." +msgstr "" +"Bedienung: /%s [Grund], bannt die JID aus dem Gruppenchat. " +"Der Spitzname eines Teilnehmers kann hinzugefügt werden, aber nicht, wenn es " +"ein \"@\" enthält. Wenn die JID derzeit im Gruppenchat ist, wird er/sie/es " +"ebenfalls gebannt. Unterstützt KEINE Leerzeichen im Spitznamen." -#: ../src/groupchat_control.py:1247 +#: ../src/groupchat_control.py:1466 #, python-format -msgid "No such command: /%s (if you want to send this, prefix it with /say)" -msgstr "Kein Kommando: /%s (wenn Sie dies senden wollen, setzen Sie /say voran)" +msgid "" +"Usage: /%s , opens a private chat window with the specified " +"occupant." +msgstr "" +"Verwendung: /%s , öffnet ein privates Nachrichtenfenster mit dem " +"Inhaber des angegebenen Spitznamens." -#: ../src/groupchat_control.py:1270 +#: ../src/groupchat_control.py:1472 #, python-format -msgid "Commands: %s" -msgstr "Kommandos: %s" +msgid "" +"Usage: /%s [reason], closes the current window or tab, displaying reason if " +"specified." +msgstr "" +"Bedienung: /%s [Grund], schließt das aktuelle Fenster oder Tab, mit Anzeige " +"eines Grundes, falls angegeben." -#: ../src/groupchat_control.py:1273 +#: ../src/groupchat_control.py:1478 #, python-format -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. Does NOT support spaces in nickname." -msgstr "Bedienung: /%s [Grund], bannt die JID aus dem Gruppenchat. Der Spitzname eines Teilnehmers kann hinzugefügt werden, aber nicht, wenn es ein \"@\" enthält. Wenn die JID derzeit im Gruppenchat ist, wird er/sie/es ebenfalls gebannt. Unterstützt KEINE Leerzeichen im Spitznamen." +msgid "" +"Usage: /%s [reason], invites JID to the current group chat, optionally " +"providing a reason." +msgstr "" +"Bedienung: /%s [Grund], lädt die JID in den aktuellen Gruppenchat ein, " +"optional mit der Angabe eines Grundes." -#: ../src/groupchat_control.py:1280 +#: ../src/groupchat_control.py:1482 #, python-format -msgid "Usage: /%s , opens a private chat window with the specified occupant." -msgstr "Verwendung: /%s , öffnet ein privates Nachrichtenfenster mit dem Inhaber des angegebenen Spitznamens." +msgid "" +"Usage: /%s @[/nickname], offers to join room@server optionally " +"using specified nickname." +msgstr "" +"Bedienung: /%s @ [/Spitzname], bietet den Beitritt zu " +"Raum@Server an, optional mit Spitznamen." -#: ../src/groupchat_control.py:1284 +#: ../src/groupchat_control.py:1486 #, python-format -msgid "Usage: /%s, clears the text window." -msgstr "Bedienung: /%s, leert das Textfenster." +msgid "" +"Usage: /%s [reason], removes the occupant specified by nickname " +"from the group chat and optionally displays a reason. Does NOT support " +"spaces in nickname." +msgstr "" +"Bedienung: /%s [Grund], verweist den Inhaber des Spitznamen des " +"Gruppenchats und zeigt optional einen Grund. Unterstützt KEINE Leerzeichen " +"im Spitznamen." -#: ../src/groupchat_control.py:1286 +#: ../src/groupchat_control.py:1495 #, python-format -msgid "Usage: /%s [reason], closes the current window or tab, displaying reason if specified." -msgstr "Bedienung: /%s [Grund], schließt das aktuelle Fenster oder Tab, mit Anzeige eines Grundes, falls angegeben." +msgid "" +"Usage: /%s [message], opens a private message window and sends " +"message to the occupant specified by nickname." +msgstr "" +"Verwendung: /%s [Nachricht], öffnet ein privates " +"Nachrichtenfenster und sendet die Nachricht zum Inhaber des angegebenen " +"Spitznamens." -#: ../src/groupchat_control.py:1289 -#, python-format -msgid "Usage: /%s, hide the chat buttons." -msgstr "Verwendung: /%s, versteckt die Chatbuttons." - -#: ../src/groupchat_control.py:1292 -#, python-format -msgid "Usage: /%s [reason], invites JID to the current group chat, optionally providing a reason." -msgstr "Bedienung: /%s [Grund], lädt die JID in den aktuellen Gruppenchat ein, optional mit der Angabe eines Grundes." - -#: ../src/groupchat_control.py:1296 -#, python-format -msgid "Usage: /%s @[/nickname], offers to join room@server optionally using specified nickname." -msgstr "Bedienung: /%s @ [/Spitzname], bietet den Beitritt zu Raum@Server an, optional mit Spitznamen." - -#: ../src/groupchat_control.py:1300 -#, python-format -msgid "Usage: /%s [reason], removes the occupant specified by nickname from the group chat and optionally displays a reason. Does NOT support spaces in nickname." -msgstr "Bedienung: /%s [Grund], verweist den Inhaber des Spitznamen des Gruppenchats und zeigt optional einen Grund. Unterstützt KEINE Leerzeichen im Spitznamen." - -#: ../src/groupchat_control.py:1305 -#, python-format -msgid "Usage: /%s , sends action to the current group chat. Use third person. (e.g. /%s explodes.)" -msgstr "Bedienung: /%s , sendet die Aktion im aktuellen Gruppenchat. Verwende dritte Person, z.B. /%s explodiert)." - -#: ../src/groupchat_control.py:1309 -#, python-format -msgid "Usage: /%s [message], opens a private message window and sends message to the occupant specified by nickname." -msgstr "Verwendung: /%s [Nachricht], öffnet ein privates Nachrichtenfenster und sendet die Nachricht zum Inhaber des angegebenen Spitznamens." - -#: ../src/groupchat_control.py:1314 +#: ../src/groupchat_control.py:1500 #, python-format msgid "Usage: /%s , changes your nickname in current group chat." -msgstr "Bedienung: /%s , ändert den Spitznamen im aktuellen Gruppenchat." +msgstr "" +"Bedienung: /%s , ändert den Spitznamen im aktuellen Gruppenchat." -#: ../src/groupchat_control.py:1318 +#: ../src/groupchat_control.py:1504 #, python-format msgid "Usage: /%s , display the names of group chat occupants." msgstr "Benutzung: /%s , zeigt die Namen der Gruppenchatbesucher." -#: ../src/groupchat_control.py:1322 +#: ../src/groupchat_control.py:1508 #, python-format msgid "Usage: /%s [topic], displays or updates the current group chat topic." -msgstr "Benutzung: /%s [topic], zeigt oder aktualisiert das derzeitige Gruppenchat-Thema." +msgstr "" +"Benutzung: /%s [topic], zeigt oder aktualisiert das derzeitige Gruppenchat-" +"Thema." -#: ../src/groupchat_control.py:1325 +#: ../src/groupchat_control.py:1511 #, python-format -msgid "Usage: /%s , sends a message without looking for other commands." -msgstr "Benutzung: /%s , sendet eine Nachricht ohne andere Befehle zu beachten." +msgid "" +"Usage: /%s , sends a message without looking for other commands." +msgstr "" +"Benutzung: /%s , sendet eine Nachricht ohne andere Befehle zu " +"beachten." -#: ../src/groupchat_control.py:1328 -#, python-format -msgid "No help info for /%s" -msgstr "Keine Hilfe vorhanden für /%s" - -#: ../src/groupchat_control.py:1391 +#: ../src/groupchat_control.py:1606 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Möchten Sie den Gruppenchat \"%s\" wirklich verlassen?" -#: ../src/groupchat_control.py:1393 -msgid "If you close this window, you will be disconnected from this group chat." -msgstr "Wenn Sie dieses Fenster schließen, wird die Verbindung zu diesem Gruppenchat geschlossen." +#: ../src/groupchat_control.py:1608 +msgid "" +"If you close this window, you will be disconnected from this group chat." +msgstr "" +"Wenn Sie dieses Fenster schließen, wird die Verbindung zu diesem Gruppenchat " +"geschlossen." -#: ../src/groupchat_control.py:1397 -#: ../src/roster_window.py:4058 +#: ../src/groupchat_control.py:1612 ../src/roster_window.py:4898 msgid "Do _not ask me again" msgstr "_Nicht noch einmal fragen" -#: ../src/groupchat_control.py:1431 +#: ../src/groupchat_control.py:1644 msgid "Changing Subject" msgstr "Thema ändern" -#: ../src/groupchat_control.py:1432 +#: ../src/groupchat_control.py:1645 msgid "Please specify the new subject:" msgstr "Bitte bestimmen Sie ein neues Thema" -#: ../src/groupchat_control.py:1441 +#: ../src/groupchat_control.py:1654 msgid "Changing Nickname" msgstr "Spitzname ändern" -#: ../src/groupchat_control.py:1442 +#: ../src/groupchat_control.py:1655 msgid "Please specify the new nickname you want to use:" msgstr "Bitte geben Sie an, welchen Spitznamen Sie verwenden möchten:" #. Ask for a reason -#: ../src/groupchat_control.py:1457 +#: ../src/groupchat_control.py:1670 #, python-format msgid "Destroying %s" msgstr "Zerstöre %s" -#: ../src/groupchat_control.py:1458 +#: ../src/groupchat_control.py:1671 msgid "" "You are going to definitively destroy this room.\n" "You may specify a reason below:" @@ -4561,715 +5468,876 @@ msgstr "" "Sie werden den Raum endgültig zerstören.\n" "Sie können hier einen Grund angeben:" -#: ../src/groupchat_control.py:1460 +#: ../src/groupchat_control.py:1673 msgid "You may also enter an alternate venue:" msgstr "Sie können auch einen alternativen Raum eintragen:" -#: ../src/groupchat_control.py:1490 +#: ../src/groupchat_control.py:1705 msgid "Bookmark already set" msgstr "Lesezeichen existiert schon" -#: ../src/groupchat_control.py:1491 +#: ../src/groupchat_control.py:1706 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Der Gruppenchat \"%s\" ist schon in den Lesezeichen." -#: ../src/groupchat_control.py:1500 +#: ../src/groupchat_control.py:1715 msgid "Bookmark has been added successfully" msgstr "Lesezeichen wurde erfolgreich hinzugefügt" -#: ../src/groupchat_control.py:1501 +#: ../src/groupchat_control.py:1716 msgid "You can manage your bookmarks via Actions menu in your roster." -msgstr "Sie können ihre Lesezeichen über das Aktionen-Menü in der Kontaktliste bearbeiten" +msgstr "" +"Sie können ihre Lesezeichen über das Aktionen-Menü in der Kontaktliste " +"bearbeiten" #. ask for reason -#: ../src/groupchat_control.py:1629 +#: ../src/groupchat_control.py:1868 #, python-format msgid "Kicking %s" msgstr "%s rausschmeißen" -#: ../src/groupchat_control.py:1630 -#: ../src/groupchat_control.py:1913 +#: ../src/groupchat_control.py:1869 ../src/groupchat_control.py:2169 msgid "You may specify a reason below:" msgstr "Sie können eine Begründung angeben:" #. ask for reason -#: ../src/groupchat_control.py:1912 +#: ../src/groupchat_control.py:2168 #, python-format msgid "Banning %s" msgstr "%s verbannen" -#: ../src/gtkexcepthook.py:41 +#: ../src/gtkexcepthook.py:46 msgid "A programming error has been detected" msgstr "Es wurde ein Programmfehler entdeckt" -#: ../src/gtkexcepthook.py:42 -msgid "It probably is not fatal, but should be reported to the developers nonetheless." -msgstr "Es ist vermutlich nicht fatal, aber der Fehler sollte trotzdem den Entwicklern gemeldet werden" +#: ../src/gtkexcepthook.py:47 +msgid "" +"It probably is not fatal, but should be reported to the developers " +"nonetheless." +msgstr "" +"Es ist vermutlich nicht fatal, aber der Fehler sollte trotzdem den " +"Entwicklern gemeldet werden" -#: ../src/gtkexcepthook.py:48 +#: ../src/gtkexcepthook.py:53 msgid "_Report Bug" msgstr "Bug melden" -#: ../src/gtkexcepthook.py:71 +#: ../src/gtkexcepthook.py:76 msgid "Details" msgstr "Details" #. we talk about file -#: ../src/gtkgui_helpers.py:156 -#: ../src/gtkgui_helpers.py:171 +#: ../src/gtkgui_helpers.py:162 ../src/gtkgui_helpers.py:177 #, python-format msgid "Error: cannot open %s for reading" msgstr "Fehler: Kann %s kann nicht zum Lesen öffnen" -#: ../src/gtkgui_helpers.py:336 +#: ../src/gtkgui_helpers.py:347 msgid "Error reading file:" msgstr "Fehler beim Lesen der Datei:" -#: ../src/gtkgui_helpers.py:339 +#: ../src/gtkgui_helpers.py:350 msgid "Error parsing file:" msgstr "Fehler bei der Dateianalyse:" #. do not traceback (could be a permission problem) #. we talk about a file here -#: ../src/gtkgui_helpers.py:376 +#: ../src/gtkgui_helpers.py:387 #, python-format msgid "Could not write to %s. Session Management support will not work" -msgstr "Konnte nicht an %s schreiben. Sitzungmanagment-Unterstützung wird nicht funktionieren" +msgstr "" +"Konnte nicht an %s schreiben. Sitzungmanagment-Unterstützung wird nicht " +"funktionieren" #. xmpp: is currently handled by another program, so ask the user -#: ../src/gtkgui_helpers.py:694 +#: ../src/gtkgui_helpers.py:719 msgid "Gajim is not the default Jabber client" msgstr "Gajim ist nicht Ihr Standard-Jabber-Client" -#: ../src/gtkgui_helpers.py:695 +#: ../src/gtkgui_helpers.py:720 msgid "Would you like to make Gajim the default Jabber client?" msgstr "Möchten Sie Gajim zu Ihrem Standard-Jabber-Client machen?" -#: ../src/gtkgui_helpers.py:696 +#: ../src/gtkgui_helpers.py:721 msgid "Always check to see if Gajim is the default Jabber client on startup" -msgstr "Immer beim Programmstart prüfen, ob Gajim der Standard-Jabber-Client ist" +msgstr "" +"Immer beim Programmstart prüfen, ob Gajim der Standard-Jabber-Client ist" -#: ../src/gtkgui_helpers.py:795 +#: ../src/gtkgui_helpers.py:818 msgid "Extension not supported" msgstr "Erweiterung wird nicht unterstützt." -#: ../src/gtkgui_helpers.py:796 +#: ../src/gtkgui_helpers.py:819 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" -msgstr "Bild kann nicht im %(type)s-Format gespeichert werden. Als %(new_filename)s speichern?" +msgstr "" +"Bild kann nicht im %(type)s-Format gespeichert werden. Als %(new_filename)s " +"speichern?" -#: ../src/gtkgui_helpers.py:805 +#: ../src/gtkgui_helpers.py:828 msgid "Save Image as..." msgstr "Bild speichern unter ..." -#: ../src/history_manager.py:65 +#: ../src/history_manager.py:73 msgid "Cannot find history logs database" msgstr "Kann Verlaufs-Datenkbank nicht finden" #. holds jid -#: ../src/history_manager.py:108 +#: ../src/history_manager.py:113 msgid "Contacts" msgstr "Kontakte" #. holds time -#: ../src/history_manager.py:121 -#: ../src/history_manager.py:161 -#: ../src/history_window.py:86 +#: ../src/history_manager.py:126 ../src/history_manager.py:166 +#: ../src/history_window.py:121 msgid "Date" msgstr "Datum" #. holds nickname -#: ../src/history_manager.py:127 -#: ../src/history_manager.py:179 +#: ../src/history_manager.py:132 ../src/history_manager.py:184 msgid "Nickname" msgstr "Spitzname" #. holds message -#: ../src/history_manager.py:135 -#: ../src/history_manager.py:167 -#: ../src/history_window.py:94 +#: ../src/history_manager.py:140 ../src/history_manager.py:172 +#: ../src/history_window.py:129 msgid "Message" msgstr "Nachricht" -#: ../src/history_manager.py:187 -msgid "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS RUNNING)" -msgstr "Möchten Sie die Datenbank aufräumen? (NICHT EMPFOHLEN, WENN GAJIM GERADE LÄUFT)" - -#: ../src/history_manager.py:189 +#: ../src/history_manager.py:192 msgid "" -"Normally allocated database size will not be freed, it will just become reusable. If you really want to reduce database filesize, click YES, else click NO.\n" +"Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " +"RUNNING)" +msgstr "" +"Möchten Sie die Datenbank aufräumen? (NICHT EMPFOHLEN, WENN GAJIM GERADE " +"LÄUFT)" + +#: ../src/history_manager.py:194 +msgid "" +"Normally allocated database size will not be freed, it will just become " +"reusable. If you really want to reduce database filesize, click YES, else " +"click NO.\n" "\n" "In case you click YES, please wait..." msgstr "" -"Der reservierte Datenbankspeicherplatz wird nicht freigegeben, er wird nur wiederverwendbar. Wenn Sie wirklich den Speicherplatz reduzieren möchten, klicken Sie JA, ansonsten NEIN.\n" +"Der reservierte Datenbankspeicherplatz wird nicht freigegeben, er wird nur " +"wiederverwendbar. Wenn Sie wirklich den Speicherplatz reduzieren möchten, " +"klicken Sie JA, ansonsten NEIN.\n" "\n" "Falls Sie JA klicken, warten Sie bitte einen Augenblick ..." -#: ../src/history_manager.py:401 +#: ../src/history_manager.py:406 msgid "Exporting History Logs..." msgstr "Exportiere Verlauf ..." -#: ../src/history_manager.py:476 +#: ../src/history_manager.py:481 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s sagte um %(time)s: %(message)s\n" -#: ../src/history_manager.py:514 +#: ../src/history_manager.py:518 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] "Möchten Sie wirklich alle Logs des ausgewählten Kontakts löschen?" -msgstr[1] "Möchten Sie wirklich alle Logs des ausgewählten Kontakte löschen?" +msgstr[1] "Möchten Sie wirklich alle Logs der ausgewählten Kontakte löschen?" -#: ../src/history_manager.py:518 -#: ../src/history_manager.py:554 +#: ../src/history_manager.py:522 ../src/history_manager.py:557 msgid "This is an irreversible operation." msgstr "Dies ist ein unwiderruflicher Vorgang." -#: ../src/history_manager.py:551 +#: ../src/history_manager.py:554 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Möchten Sie die ausgewählte Nachricht wirklich löschen?" msgstr[1] "Möchten Sie die ausgewählten Nachrichten wirklich löschen?" -#: ../src/history_window.py:103 -#: ../src/history_window.py:105 +#: ../src/history_window.py:209 ../src/history_window.py:211 #, python-format msgid "Conversation History with %s" msgstr "Unterhaltungs-Verlauf mit %s" -#: ../src/history_window.py:258 +#: ../src/history_window.py:342 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s ist jezt %(status)s: %(status_msg)s" -#: ../src/history_window.py:262 -#: ../src/notify.py:199 +#: ../src/history_window.py:346 ../src/notify.py:219 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s ist jetzt %(status)s" -#: ../src/history_window.py:268 +#: ../src/history_window.py:352 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Status ist jetzt: %(status)s: %(status_msg)s" -#: ../src/history_window.py:271 +#: ../src/history_window.py:355 #, python-format msgid "Status is now: %(status)s" msgstr "Status ist jetzt: %(status)s" -#: ../src/message_window.py:273 +#: ../src/htmltextview.py:586 ../src/htmltextview.py:597 +msgid "Timeout loading image" +msgstr "Konnte Bild nicht laden" + +#: ../src/htmltextview.py:607 +msgid "Image is too big" +msgstr "Das Bild ist zu groß" + +#: ../src/message_window.py:350 msgid "Chats" msgstr "Chats" -#: ../src/message_window.py:275 +#: ../src/message_window.py:352 msgid "Group Chats" msgstr "Gruppenchat" -#: ../src/message_window.py:277 +#: ../src/message_window.py:354 msgid "Private Chats" msgstr "Private Chats" -#: ../src/message_window.py:279 +#: ../src/message_window.py:356 msgid "Messages" msgstr "Nachrichten" -#: ../src/message_window.py:280 +#: ../src/message_window.py:357 #, python-format msgid "%s - Gajim" msgstr "%s - Gajim" -#: ../src/notify.py:197 +#: ../src/negotiation.py:13 +msgid "- messages will be logged" +msgstr "- Nachrichten werden aufgezeichnet" + +#: ../src/negotiation.py:15 +msgid "- messages will not be logged" +msgstr "- Nachrichten werden nicht aufgezeichnet" + +#: ../src/negotiation.py:24 +msgid "OK to continue with negotiation?" +msgstr "In Ordnung mit der Verhandlung fortzufahren?" + +#: ../src/negotiation.py:25 +#, python-format +msgid "" +"You've begun an encrypted session with %s, but it can't be guaranteed that " +"you're talking directly to the person you think you are.\n" +"\n" +"You should speak with them directly (in person or on the phone) and confirm " +"that their Short Authentication String is identical to this one: %s\n" +"\n" +"Would you like to continue with the encrypted session?" +msgstr "" +"Sie haben eine verschlüsselte Sitzung mit %s begonnen, aber es kann nicht " +"garantiert werden, dass Sie tatsächlich mit der Person sprechen, die sie " +"vorgibt zu sein.\n" +"\n" +"Sie sollten mit der Person direkt (persönlich oder am Telefon) sprechen und " +"sich vergewissern, dass ihr kurzer Authentifizierungs-String mit diesem " +"übereinstimmt: %s\n" +"\n" +"Möchten Sie mit der verschlüsselten Sitzung fortfahren?" + +#: ../src/negotiation.py:31 +msgid "Yes, I verified the Short Authentication String" +msgstr "Ja, Ich habe den kurzen Authentifizierungs-String überprüft" + +#: ../src/notify.py:217 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s änderte Status" -#: ../src/notify.py:207 +#: ../src/notify.py:227 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s angemeldet" -#: ../src/notify.py:215 +#: ../src/notify.py:235 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s abgemeldet" -#: ../src/notify.py:227 +#: ../src/notify.py:247 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Neue einzelne Nachricht von %(nickname)s" -#: ../src/notify.py:235 +#: ../src/notify.py:255 #, python-format msgid "New Private Message from group chat %s" msgstr "Neue private Nachricht von Gruppenchat %s" -#: ../src/notify.py:236 +#: ../src/notify.py:257 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:242 +#: ../src/notify.py:260 +#, python-format +msgid "Messaged by %(nickname)s" +msgstr "Neue Nachricht von %(nickname)s" + +#: ../src/notify.py:266 #, python-format msgid "New Message from %(nickname)s" msgstr "Neue Nachricht von %(nickname)s" -#: ../src/profile_window.py:72 +#: ../src/profile_window.py:54 msgid "Retrieving profile..." msgstr "Empfange Profil ..." +#: ../src/profile_window.py:107 ../src/roster_window.py:1914 +msgid "File is empty" +msgstr "Datei ist leer" + +#: ../src/profile_window.py:110 ../src/roster_window.py:1917 +msgid "File does not exist" +msgstr "Datei existiert nicht" + #. keep identation -#: ../src/profile_window.py:143 +#. unknown format +#: ../src/profile_window.py:124 ../src/profile_window.py:140 +#: ../src/roster_window.py:1919 ../src/roster_window.py:1930 msgid "Could not load image" msgstr "Konnte Bild nicht laden" -#: ../src/profile_window.py:255 +#: ../src/profile_window.py:250 msgid "Information received" msgstr "Informationen empfangen" -#: ../src/profile_window.py:324 +#: ../src/profile_window.py:319 msgid "Without a connection you can not publish your contact information." -msgstr "Sie müssen angemeldet sein, um Kontakt-Informationen zu veröffentlichen" +msgstr "" +"Sie müssen angemeldet sein, um Kontakt-Informationen zu veröffentlichen" -#: ../src/profile_window.py:336 +#: ../src/profile_window.py:331 msgid "Sending profile..." msgstr "Sende Profil ..." -#: ../src/profile_window.py:351 +#: ../src/profile_window.py:346 msgid "Information NOT published" msgstr "Informationen NICHT veröffentlicht" -#: ../src/profile_window.py:358 +#: ../src/profile_window.py:353 msgid "vCard publication failed" msgstr "vCard Veröffentlichung fehlgeschlagen" -#: ../src/profile_window.py:359 -msgid "There was an error while publishing your personal information, try again later." -msgstr "Bei der Veröffentlichung Ihrer persönlichen Informationen ist ein Fehler aufgetreten, versuchen Sie es später nochmals." +#: ../src/profile_window.py:354 +msgid "" +"There was an error while publishing your personal information, try again " +"later." +msgstr "" +"Bei der Veröffentlichung Ihrer persönlichen Informationen ist ein Fehler " +"aufgetreten, versuchen Sie es später nochmals." -#: ../src/roster_window.py:172 -#: ../src/roster_window.py:227 +#: ../src/roster_window.py:194 ../src/roster_window.py:249 msgid "Merged accounts" msgstr "Alle Konten" -#: ../src/roster_window.py:345 -#: ../src/common/helpers.py:43 +#: ../src/roster_window.py:370 ../src/roster_window.py:635 +#: ../src/roster_window.py:2143 ../src/common/contacts.py:312 +#: ../src/common/helpers.py:53 msgid "Observers" msgstr "Beobachter" -#: ../src/roster_window.py:692 -#: ../src/roster_window.py:3215 +#. Make special context menu if group is Groupchats +#: ../src/roster_window.py:454 ../src/roster_window.py:459 +#: ../src/roster_window.py:1967 ../src/roster_window.py:1970 +#: ../src/roster_window.py:2636 ../src/roster_window.py:2639 +#: ../src/roster_window.py:2664 ../src/roster_window.py:4759 +#: ../src/roster_window.py:4761 ../src/common/commands.py:199 +#: ../src/common/contacts.py:102 ../src/common/helpers.py:53 +msgid "Groupchats" +msgstr "Gruppenchat" + +#: ../src/roster_window.py:784 ../src/roster_window.py:4008 msgid "You cannot join a group chat while you are invisible" -msgstr "Sie können einem Gruppenchat nicht beitreten, wenn Sie unsichtbar sind." +msgstr "" +"Sie können einem Gruppenchat nicht beitreten, wenn Sie unsichtbar sind." #. new chat +#. single message #. for chat_with #. for single message -#: ../src/roster_window.py:884 -#: ../src/systray.py:206 -#: ../src/systray.py:211 +#. join gc +#: ../src/roster_window.py:1005 ../src/roster_window.py:1015 +#: ../src/roster_window.py:1024 ../src/systray.py:212 ../src/systray.py:217 +#: ../src/systray.py:223 #, python-format msgid "using account %s" msgstr "mit Konto %s" -#. the 'manage gc bookmarks' item is shown -#. below to avoid duplicate code #. add -#: ../src/roster_window.py:909 +#: ../src/roster_window.py:1031 #, python-format msgid "to %s account" msgstr "an Konto %s" #. disco -#: ../src/roster_window.py:914 +#: ../src/roster_window.py:1036 #, python-format msgid "using %s account" msgstr "mit Konto %s" +#: ../src/roster_window.py:1117 +msgid "_Manage Bookmarks..." +msgstr "_Verwalte Lesezeichen..." + #. profile, avatar -#: ../src/roster_window.py:989 +#: ../src/roster_window.py:1136 #, python-format msgid "of account %s" msgstr "von Konto %s" -#: ../src/roster_window.py:1009 -msgid "_Manage Bookmarks..." -msgstr "_Verwalte Lesezeichen..." - -#: ../src/roster_window.py:1038 +#: ../src/roster_window.py:1176 #, python-format msgid "for account %s" msgstr "für Konto %s" #. History manager -#: ../src/roster_window.py:1059 +#: ../src/roster_window.py:1200 msgid "History Manager" msgstr "_Verlaufsmanager" -#: ../src/roster_window.py:1068 +#: ../src/roster_window.py:1209 msgid "_Join New Group Chat" msgstr "_Gruppenchat betreten" -#: ../src/roster_window.py:1397 -#: ../src/roster_window.py:3410 -#: ../src/roster_window.py:3417 +#: ../src/roster_window.py:1576 ../src/roster_window.py:4213 +#: ../src/roster_window.py:4220 msgid "You have unread messages" msgstr "Sie haben ungelesene Nachrichten" -#: ../src/roster_window.py:1398 +#: ../src/roster_window.py:1577 msgid "You must read them before removing this transport." msgstr "Sie müssen sie alle lesen, bevor der Account entfernt wird." -#: ../src/roster_window.py:1401 +#: ../src/roster_window.py:1580 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transport \"%s\" wird entfernt" -#: ../src/roster_window.py:1402 -msgid "You will no longer be able to send and receive messages from contacts using this transport." -msgstr "Sie können nun keine Nachrichten mehr mit Kontakten von diesem Transport austauschen." +#: ../src/roster_window.py:1581 +msgid "" +"You will no longer be able to send and receive messages from contacts using " +"this transport." +msgstr "" +"Sie können nun keine Nachrichten mehr mit Kontakten von diesem Transport " +"austauschen." -#: ../src/roster_window.py:1405 +#: ../src/roster_window.py:1584 msgid "Transports will be removed" msgstr "Transporte werden entfernt" -#: ../src/roster_window.py:1410 +#: ../src/roster_window.py:1589 #, python-format -msgid "You will no longer be able to send and receive messages to contacts from these transports:%s" -msgstr "Sie können nun keine Nachrichten mehr mit Kontakten von diesen Transporten austauschen:%s" +msgid "" +"You will no longer be able to send and receive messages to contacts from " +"these transports:%s" +msgstr "" +"Sie können nun keine Nachrichten mehr mit Kontakten von diesen Transporten " +"austauschen:%s" #. it's jid -#: ../src/roster_window.py:1430 +#: ../src/roster_window.py:1755 msgid "Rename Contact" msgstr "Kontakt umbenennen" -#: ../src/roster_window.py:1431 +#: ../src/roster_window.py:1756 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Geben Sie einen Spitznamen für den Kontakt %s ein" -#: ../src/roster_window.py:1438 +#: ../src/roster_window.py:1763 msgid "Rename Group" msgstr "Gruppe umbenennen" -#: ../src/roster_window.py:1439 +#: ../src/roster_window.py:1764 #, python-format msgid "Enter a new name for group %s" msgstr "Geben Sie einen neuen Namen für die Gruppe %s ein" -#: ../src/roster_window.py:1514 +#: ../src/roster_window.py:1839 msgid "Remove Group" msgstr "Gruppe entfernen" -#: ../src/roster_window.py:1515 +#: ../src/roster_window.py:1840 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Möchten Sie wirklich die Gruppe %s von Ihrer Kontaktliste entfernen?" -#: ../src/roster_window.py:1516 +#: ../src/roster_window.py:1841 msgid "Remove also all contacts in this group from your roster" msgstr "Auch alle Kontakte dieser Gruppe von Ihrer Kontaktliste entfernen" -#: ../src/roster_window.py:1547 +#: ../src/roster_window.py:1872 msgid "Assign OpenPGP Key" msgstr "OpenPGP-Schlüssel Zuweisen" -#: ../src/roster_window.py:1548 +#: ../src/roster_window.py:1873 msgid "Select a key to apply to the contact" msgstr "Weisen Sie dem Kontakt einen Schüssel zu" -#: ../src/roster_window.py:1784 -#: ../src/roster_window.py:2045 -msgid "_New group chat" -msgstr "_Neuer Gruppenchat" +#: ../src/roster_window.py:2189 +msgid "_New Group Chat" +msgstr "Neuer Gruppenchat" -#: ../src/roster_window.py:1915 +#: ../src/roster_window.py:2327 msgid "I would like to add you to my roster" msgstr "Ich würde dich gerne in meine Liste aufnehmen" -#: ../src/roster_window.py:2090 -#: ../src/roster_window.py:2137 +#. Send Group Message +#: ../src/roster_window.py:2461 ../src/roster_window.py:2673 msgid "Send Group M_essage" msgstr "_Sende Nachricht an Gruppe" -#: ../src/roster_window.py:2116 -msgid "Re_name" -msgstr "_Umbenennen" +#: ../src/roster_window.py:2480 +msgid "_New group chat" +msgstr "_Neuer Gruppenchat" -#: ../src/roster_window.py:2143 +#. Manage Transport submenu +#: ../src/roster_window.py:2518 +msgid "_Manage Contacts" +msgstr "Kontakte verwalten" + +#: ../src/roster_window.py:2579 +msgid "_Maximize" +msgstr "_Maximieren" + +#: ../src/roster_window.py:2586 +msgid "_Disconnect" +msgstr "_Verbindung trennen" + +#: ../src/roster_window.py:2665 +msgid "_Maximize All" +msgstr "Alle _maximieren" + +#: ../src/roster_window.py:2681 msgid "To all users" msgstr "An alle Benutzern" -#: ../src/roster_window.py:2146 +#: ../src/roster_window.py:2684 msgid "To all online users" msgstr "An alle angemeldeten Benutzer" -#: ../src/roster_window.py:2182 +#. Log Off +#: ../src/roster_window.py:2801 +msgid "_Log off" +msgstr "_Abmelden" + +#. Log on +#: ../src/roster_window.py:2807 msgid "_Log on" msgstr "_Anmelden" -#: ../src/roster_window.py:2192 -msgid "Log _off" -msgstr "_Abmelden" +#. Send single message +#: ../src/roster_window.py:2819 +msgid "Send Single Message" +msgstr "Sende _einzelne Nachricht" -#: ../src/roster_window.py:2314 -#: ../src/roster_window.py:2385 +#. Manage Transport submenu +#: ../src/roster_window.py:2866 +msgid "_Manage Transport" +msgstr "Transports" + +#. Modify Transport +#: ../src/roster_window.py:2874 +msgid "_Modify Transport" +msgstr "Trans_port ändern" + +#: ../src/roster_window.py:2988 ../src/roster_window.py:3062 msgid "_Change Status Message" msgstr "Ändere _Statusnachricht" -#: ../src/roster_window.py:2457 +#: ../src/roster_window.py:3134 msgid "Authorization has been sent" msgstr "Autorisierung wurde erneut gesendet" -#: ../src/roster_window.py:2458 +#: ../src/roster_window.py:3135 #, python-format msgid "Now \"%s\" will know your status." msgstr "\"%s\" kennt jetzt ihren Status." -#: ../src/roster_window.py:2478 +#: ../src/roster_window.py:3155 msgid "Subscription request has been sent" msgstr "Abonnement-Anforderung wurde gesendet" -#: ../src/roster_window.py:2479 +#: ../src/roster_window.py:3156 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Wenn \"%s\" diese Anfrage akzeptiert, erfahren Sie dessen Status." -#: ../src/roster_window.py:2491 +#: ../src/roster_window.py:3168 msgid "Authorization has been removed" msgstr "Autorisierung wurde entfernt" -#: ../src/roster_window.py:2492 +#: ../src/roster_window.py:3169 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "\"%s\" wird Sie nun immer als offline sehen." -#: ../src/roster_window.py:2684 +#: ../src/roster_window.py:3403 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Kontakt \"%s\" wird von ihrer Kontaktliste entfernt" -#: ../src/roster_window.py:2688 -msgid "By removing this contact you also remove authorization resulting in him or her always seeing you as offline." -msgstr "Durch das Entfernen dieses Kontaktes entziehen Sie ihm auch die Berechtigung Ihren Status zu sehen, wodurch der Kontakt Sie nur noch als offline sehen wird." +#: ../src/roster_window.py:3407 +msgid "" +"By removing this contact you also remove authorization resulting in him or " +"her always seeing you as offline." +msgstr "" +"Durch das Entfernen dieses Kontaktes entziehen Sie ihm auch die Berechtigung " +"Ihren Status zu sehen, wodurch der Kontakt Sie nur noch als offline sehen " +"wird." -#: ../src/roster_window.py:2693 -msgid "By removing this contact you also by default remove authorization resulting in him or her always seeing you as offline." -msgstr "Durch das Entfernen dieses Kontaktes entziehen Sie ihm auch standardmäßig die Berechtigung Ihren Status zu sehen, wodurch der Kontakt Sie nur noch als offline sehen wird." +#: ../src/roster_window.py:3412 +msgid "" +"By removing this contact you also by default remove authorization resulting " +"in him or her always seeing you as offline." +msgstr "" +"Durch das Entfernen dieses Kontaktes entziehen Sie ihm auch standardmäßig " +"die Berechtigung Ihren Status zu sehen, wodurch der Kontakt Sie nur noch als " +"offline sehen wird." -#: ../src/roster_window.py:2696 +#: ../src/roster_window.py:3415 msgid "I want this contact to know my status after removal" -msgstr "Ich möchte, dass dieser Kontakt meinen Status auch nach dem Entfernen sieht" +msgstr "" +"Ich möchte, dass dieser Kontakt meinen Status auch nach dem Entfernen sieht" #. several contact to remove at the same time -#: ../src/roster_window.py:2700 +#: ../src/roster_window.py:3419 msgid "Contacts will be removed from your roster" msgstr "Kontakte werden von Ihrer Kontaktliste entfernt" -#: ../src/roster_window.py:2704 +#: ../src/roster_window.py:3423 #, python-format msgid "" "By removing these contacts:%s\n" "you also remove authorization resulting in them always seeing you as offline." msgstr "" "Durch das Entfernen dieser Kontakte:%s\n" -"entziehen Sie ihnen auch die Berechtigung Ihren Status zu sehen, wodurch die Kontakte Sie nur noch als offline sehen werden." +"entziehen Sie ihnen auch die Berechtigung Ihren Status zu sehen, wodurch die " +"Kontakte Sie nur noch als offline sehen werden." -#: ../src/roster_window.py:2736 -msgid "Gnome Keyring is installed but not correctly started (environment variable probably not correctly set)" -msgstr "Gnome Keyring ist installiert, aber nicht korrekt gestartet (Umgebungsvariablen wahrscheinlich falsch gesetzt)" +#: ../src/roster_window.py:3450 +msgid "" +"Gnome Keyring is installed but not correctly started (environment variable " +"probably not correctly set)" +msgstr "" +"Gnome Keyring ist installiert, aber nicht korrekt gestartet " +"(Umgebungsvariablen wahrscheinlich falsch gesetzt)" + +#: ../src/roster_window.py:3469 +msgid "GPG is not usable" +msgstr "GPG ist nicht benutzbar" -#. TODO: make this string translatable #. %s is the account name here -#: ../src/roster_window.py:2764 -#: ../src/common/connection.py:687 -#: ../src/common/zeroconf/connection_zeroconf.py:158 +#: ../src/roster_window.py:3470 ../src/common/connection_handlers.py:2153 +#: ../src/common/zeroconf/connection_zeroconf.py:171 #, python-format msgid "You will be connected to %s without OpenPGP." msgstr "Sie werden ohne OpenPGP mit %s verbunden." -#: ../src/roster_window.py:2781 -msgid "Passphrase Required" -msgstr "Passphrase benötigt" - -#: ../src/roster_window.py:2782 -#, python-format -msgid "Enter GPG key passphrase for account %s." -msgstr "Geben Sie die GPG-Passphrase für das Konto %s ein." - -#: ../src/roster_window.py:2787 -msgid "Save passphrase" -msgstr "Passphrase speichern" - -#: ../src/roster_window.py:2795 -msgid "Wrong Passphrase" -msgstr "Falsche Passphrase" - -#: ../src/roster_window.py:2796 -msgid "Please retype your GPG passphrase or press Cancel." -msgstr "Bitte geben Sie Ihre GPG-Passphrase erneut ein oder klicken Sie auf Abbrechen." - -#: ../src/roster_window.py:2853 -#: ../src/roster_window.py:2913 +#: ../src/roster_window.py:3541 ../src/roster_window.py:3619 msgid "You are participating in one or more group chats" msgstr "Sie nehmen an einem oder mehreren Gruppenchats teil" -#: ../src/roster_window.py:2854 -#: ../src/roster_window.py:2914 -msgid "Changing your status to invisible will result in disconnection from those group chats. Are you sure you want to go invisible?" -msgstr "Wenn Sie Ihren Status auf unsichtbar setzen, werden sie von diesen Gruppenchats getrennt. Sind Sie sicher, dass sie unsichtbar werden möchten?" +#: ../src/roster_window.py:3542 ../src/roster_window.py:3620 +msgid "" +"Changing your status to invisible will result in disconnection from those " +"group chats. Are you sure you want to go invisible?" +msgstr "" +"Wenn Sie Ihren Status auf unsichtbar setzen, werden sie von diesen " +"Gruppenchats getrennt. Sind Sie sicher, dass sie unsichtbar werden möchten?" -#: ../src/roster_window.py:2871 +#: ../src/roster_window.py:3576 msgid "No account available" msgstr "Kein Konto vorhanden" -#: ../src/roster_window.py:2872 +#: ../src/roster_window.py:3577 msgid "You must create an account before you can chat with other contacts." -msgstr "Sie müssen ein Konto erstellen, bevor Sie sich zum Jabber-Netzwerk verbinden können." +msgstr "" +"Sie müssen ein Konto erstellen, bevor Sie sich zum Jabber-Netzwerk verbinden " +"können." -#: ../src/roster_window.py:2974 +#: ../src/roster_window.py:3726 #, python-format msgid "\"%(title)s\" by %(artist)s" msgstr "\"%(title)s\" von %(artist)s" -#: ../src/roster_window.py:3411 -#: ../src/roster_window.py:3418 -msgid "Messages will only be available for reading them later if you have history enabled." +#: ../src/roster_window.py:4214 ../src/roster_window.py:4221 +msgid "" +"Messages will only be available for reading them later if you have history " +"enabled." msgstr "Um Nachrichten später lesen zu können, muss der Verlauf aktiv sein." -#: ../src/roster_window.py:4008 +#: ../src/roster_window.py:4845 msgid "Metacontacts storage not supported by your server" -msgstr "Das Speichern von Metakontakten wird von Ihrem Server nicht unterstützt" +msgstr "" +"Das Speichern von Metakontakten wird von Ihrem Server nicht unterstützt" -#: ../src/roster_window.py:4010 -msgid "Your server does not support storing metacontacts information. So those information will not be save on next reconnection." -msgstr "Ihr Server unterstützt leider nicht das Speichern von Metakontakt-Informationen. Aus diesem Grund werden diese Informationen bei der nächsten Neuverbindung nicht gespeichert werden." +#: ../src/roster_window.py:4847 +msgid "" +"Your server does not support storing metacontacts information. So those " +"information will not be saved on next reconnection." +msgstr "" +"Ihr Server unterstützt leider nicht das Speichern von Metakontakt-" +"Informationen. Aus diesem Grund werden diese Informationen bei der nächsten " +"Neuverbindung nicht gespeichert werden." -#: ../src/roster_window.py:4052 -msgid "You are about to create a metacontact. Are you sure you want to continue?" -msgstr "Sie sind dabei einen Metakontakt zu erstellen. Wollen Sie wirklich fortfahren?" +#: ../src/roster_window.py:4892 +msgid "" +"You are about to create a metacontact. Are you sure you want to continue?" +msgstr "" +"Sie sind dabei einen Metakontakt zu erstellen. Wollen Sie wirklich " +"fortfahren?" -#: ../src/roster_window.py:4054 -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 "Metakontakte sind eine Möglichkeit, mehrere Kontakte in einer Zeile zu gruppieren. Normalerweise benutzt man Sie, wenn eine Person mehrere Jabber- oder Transport-Konten hat." +#: ../src/roster_window.py:4894 +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 "" +"Metakontakte sind eine Möglichkeit, mehrere Kontakte in einer Zeile zu " +"gruppieren. Normalerweise benutzt man Sie, wenn eine Person mehrere Jabber- " +"oder Transport-Konten hat." -#: ../src/roster_window.py:4132 -#, python-format -msgid "Do you want to send that file to %s:" +#: ../src/roster_window.py:4989 +#, fuzzy +msgid "Invalid file URI:" +msgstr "Ungültige Datei" + +#: ../src/roster_window.py:5000 +#, fuzzy, python-format +msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send those files to %s:" msgstr[0] "%s möchte ihnen eine Datei senden:" -msgstr[1] "%s möchte ihnen diese Datei senden:" +msgstr[1] "%s möchte ihnen diese Dateien senden:" -#: ../src/roster_window.py:4237 -#, python-format -msgid "Drop %s in group %s" -msgstr "Setze %s in Gruppe %s" - -#: ../src/roster_window.py:4244 -#, python-format -msgid "Make %s and %s metacontacts" -msgstr "Mache %s und %s Metakontakte" - -#: ../src/roster_window.py:4431 +#: ../src/roster_window.py:5328 msgid "Change Status Message..." msgstr "Ändere Statusnachricht ..." -#: ../src/systray.py:163 +#: ../src/search_window.py:91 +msgid "Waiting for results" +msgstr "Warte auf Ergebnisse" + +#: ../src/search_window.py:131 ../src/search_window.py:209 +msgid "Error in received dataform" +msgstr "Fehler den empfangenen Daten" + +#. No result +#: ../src/search_window.py:165 ../src/search_window.py:201 +msgid "No result" +msgstr "Kein Ergebnis" + +#: ../src/systray.py:169 msgid "_Change Status Message..." msgstr "Ändere _Statusnachricht..." -#: ../src/systray.py:251 +#: ../src/systray.py:254 msgid "Hide this menu" msgstr "Versteckt dieses Menü" -#: ../src/tooltips.py:309 -#: ../src/tooltips.py:492 +#: ../src/tooltips.py:317 ../src/tooltips.py:510 msgid "Jabber ID: " msgstr "Jabber-ID:" -#: ../src/tooltips.py:312 -#: ../src/tooltips.py:496 +#: ../src/tooltips.py:320 ../src/tooltips.py:514 msgid "Resource: " msgstr "Ressource: " -#: ../src/tooltips.py:317 +#: ../src/tooltips.py:325 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s dieses Gruppenchats" -#: ../src/tooltips.py:430 -#: ../src/tooltips.py:610 +#: ../src/tooltips.py:423 +msgid " [blocked]" +msgstr " [blockiert]" + +#: ../src/tooltips.py:427 +msgid " [minimized]" +msgstr " [minimiert]" + +#: ../src/tooltips.py:442 ../src/tooltips.py:630 msgid "Status: " msgstr "Status: " -#: ../src/tooltips.py:461 +#: ../src/tooltips.py:472 #, python-format msgid "Last status: %s" msgstr "Letzter Status: %s" -#: ../src/tooltips.py:463 +#: ../src/tooltips.py:474 #, python-format msgid " since %s" msgstr " seit %s" +#: ../src/tooltips.py:492 +msgid "Connected" +msgstr "Verbunden" + +#: ../src/tooltips.py:494 +msgid "Disconnected" +msgstr "Nicht verbunden" + #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:502 +#: ../src/tooltips.py:521 msgid "Subscription: " msgstr "Abonnement: " -#: ../src/tooltips.py:512 +#: ../src/tooltips.py:531 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:566 +#: ../src/tooltips.py:586 msgid "Download" msgstr "Download" -#: ../src/tooltips.py:572 +#: ../src/tooltips.py:592 msgid "Upload" msgstr "Upload" -#: ../src/tooltips.py:579 +#: ../src/tooltips.py:599 msgid "Type: " msgstr "Typ: " -#: ../src/tooltips.py:585 +#: ../src/tooltips.py:605 msgid "Transferred: " msgstr "Übertragen: " -#: ../src/tooltips.py:588 -#: ../src/tooltips.py:609 +#: ../src/tooltips.py:608 ../src/tooltips.py:629 msgid "Not started" msgstr "Nicht gestartet" -#: ../src/tooltips.py:592 +#: ../src/tooltips.py:612 msgid "Stopped" msgstr "Angehalten" -#: ../src/tooltips.py:594 -#: ../src/tooltips.py:597 +#: ../src/tooltips.py:614 ../src/tooltips.py:617 msgid "Completed" msgstr "Abgeschlossen" -#: ../src/tooltips.py:601 +#: ../src/tooltips.py:621 msgid "?transfer status:Paused" msgstr "?Transferstatus:Pausiert" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:605 +#: ../src/tooltips.py:625 msgid "Stalled" msgstr "Steht still" -#: ../src/tooltips.py:607 +#: ../src/tooltips.py:627 msgid "Transferring" msgstr "Übertrage" -#: ../src/tooltips.py:639 +#: ../src/tooltips.py:661 msgid "This service has not yet responded with detailed information" msgstr "Dieser Dienst hat nicht mit detaillierten Informationen geantwortet" -#: ../src/tooltips.py:642 +#: ../src/tooltips.py:664 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -5277,177 +6345,193 @@ msgstr "" "Dieser Dienst konnte nicht mit detaillierten Informationen antworten\n" "Er ist wahrscheinlich verwaltet oder defekt" -#: ../src/vcard.py:217 +#: ../src/vcard.py:245 msgid "?Client:Unknown" msgstr "Unbekannt" -#: ../src/vcard.py:219 +#: ../src/vcard.py:247 msgid "?OS:Unknown" msgstr "Unbekannt" -#: ../src/vcard.py:247 -#: ../src/vcard.py:449 +#: ../src/vcard.py:272 ../src/vcard.py:282 ../src/vcard.py:472 #, python-format msgid "since %s" msgstr "seit %s" -#: ../src/vcard.py:277 +#: ../src/vcard.py:311 msgid "Affiliation:" msgstr "Zugehörigkeit: " -#: ../src/vcard.py:285 -msgid "This contact is interested in your presence information, but you are not interested in his/her presence" -msgstr "Dieser Kontakt ist an Ihren Anwesenheitsinformationen interessiert, aber Sie sind nicht an seiner/ihrer Anwesenheit interessiert" +#: ../src/vcard.py:319 +msgid "" +"This contact is interested in your presence information, but you are not " +"interested in his/her presence" +msgstr "" +"Dieser Kontakt ist an Ihren Anwesenheitsinformationen interessiert, aber Sie " +"sind nicht an seiner/ihrer Anwesenheit interessiert" -#: ../src/vcard.py:287 -msgid "You are interested in the contact's presence information, but he/she is not interested in yours" -msgstr "Sie sind an den Anwesenheitsinformationen des Kontakts interessiert, aber er/sie ist nicht an ihren interessiert" +#: ../src/vcard.py:321 +msgid "" +"You are interested in the contact's presence information, but he/she is not " +"interested in yours" +msgstr "" +"Sie sind an den Anwesenheitsinformationen des Kontakts interessiert, aber er/" +"sie ist nicht an ihren interessiert" -#: ../src/vcard.py:289 +#: ../src/vcard.py:323 msgid "You and the contact are interested in each other's presence information" -msgstr "Sie und der Kontakt sind an den Anwesenheitsinformationen des Anderen interessiert" +msgstr "" +"Sie und der Kontakt sind an den Anwesenheitsinformationen des Anderen " +"interessiert" #. None -#: ../src/vcard.py:291 -msgid "You are not interested in the contact's presence, and neither he/she is interested in yours" -msgstr "Sie sind nicht an der Anwesenheit des Kontakts interessiert, und er/sie ist nicht interessiert an ihrer" +#: ../src/vcard.py:325 +msgid "" +"You are not interested in the contact's presence, and neither he/she is " +"interested in yours" +msgstr "" +"Sie sind nicht an der Anwesenheit des Kontakts interessiert, und er/sie ist " +"nicht interessiert an ihrer" -#: ../src/vcard.py:299 +#: ../src/vcard.py:333 msgid "You are waiting contact's answer about your subscription request" msgstr "Sie warten auf die Antwort des Kontaktes auf ihre Abonnement-Anfrage" -#: ../src/vcard.py:311 -#: ../src/vcard.py:338 -#: ../src/vcard.py:482 +#: ../src/vcard.py:337 ../src/vcard.py:374 ../src/vcard.py:497 msgid " resource with priority " msgstr " resource mit Priorität " -#: ../src/common/check_paths.py:33 +#: ../src/common/check_paths.py:38 msgid "creating logs database" msgstr "Erstelle Log-Datenbank" -#: ../src/common/check_paths.py:89 -#: ../src/common/check_paths.py:100 -#: ../src/common/check_paths.py:107 +#: ../src/common/check_paths.py:101 ../src/common/check_paths.py:112 +#: ../src/common/check_paths.py:119 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s ist eine Datei, aber es sollte ein Verzeichnis sein" -#: ../src/common/check_paths.py:90 -#: ../src/common/check_paths.py:101 -#: ../src/common/check_paths.py:108 -#: ../src/common/check_paths.py:116 +#: ../src/common/check_paths.py:102 ../src/common/check_paths.py:113 +#: ../src/common/check_paths.py:120 ../src/common/check_paths.py:128 msgid "Gajim will now exit" msgstr "Gajim wird nun beendet" -#: ../src/common/check_paths.py:115 +#: ../src/common/check_paths.py:127 #, python-format msgid "%s is a directory but should be a file" msgstr "%s ist ein Verzeichnis, sollte aber eine Datei sein" -#: ../src/common/check_paths.py:131 +#: ../src/common/check_paths.py:143 #, python-format msgid "creating %s directory" msgstr "Erstelle Verzeichnis %s" -#: ../src/common/commands.py:69 +#: ../src/common/commands.py:74 msgid "Change status information" msgstr "Ändere Statusinformation" -#: ../src/common/commands.py:82 +#: ../src/common/commands.py:87 msgid "Change status" msgstr "Kontakt hat Status verändert" -#: ../src/common/commands.py:83 +#: ../src/common/commands.py:88 msgid "Set the presence type and description" msgstr "Lege den Anwesenheitstyp und die Beschreibung fest" -#: ../src/common/commands.py:89 +#: ../src/common/commands.py:94 msgid "Free for chat" msgstr "Frei zum Chatten" -#: ../src/common/commands.py:90 +#: ../src/common/commands.py:95 msgid "Online" msgstr "Online" -#: ../src/common/commands.py:92 +#: ../src/common/commands.py:97 msgid "Extended away" msgstr "Längere Zeit abwesend" -#: ../src/common/commands.py:93 +#: ../src/common/commands.py:98 msgid "Do not disturb" msgstr "Bitte nicht stören" -#: ../src/common/commands.py:94 +#: ../src/common/commands.py:99 msgid "Offline - disconnect" msgstr "Offline - Abgemeldet" -#: ../src/common/commands.py:99 +#: ../src/common/commands.py:104 msgid "Presence description:" msgstr "Anwesenheitsbeschreibung:" -#: ../src/common/commands.py:134 +#: ../src/common/commands.py:139 msgid "The status has been changed." msgstr "Der Status hat sich verändert." -#: ../src/common/commands.py:179 +#: ../src/common/commands.py:184 #, python-format msgid "%(nickname)s on %(room_jid)s" msgstr "%(nickname)s aus Gruppenchat %(room_jid)s" -#: ../src/common/commands.py:183 +#: ../src/common/commands.py:188 msgid "You have not joined a groupchat." msgstr "Sie haben keinen Gruppenchat betreten." -#: ../src/common/commands.py:189 +#: ../src/common/commands.py:194 msgid "Leave Groupchats" msgstr "Verlasse Gruppenchat" -#: ../src/common/commands.py:190 +#: ../src/common/commands.py:195 msgid "Choose the groupchats you want to leave" msgstr "Wählen Sie den Gruppenchat, den Sie verlassen möchten" -#: ../src/common/commands.py:194 -msgid "Groupchats" -msgstr "Gruppenchat" - -#: ../src/common/commands.py:230 +#: ../src/common/commands.py:235 msgid "You left the following groupchats:" msgstr "Sie haben folgende Gruppenchats verlassen:" -#: ../src/common/config.py:56 -msgid "Use D-Bus and Notification-Daemon to show notifications" -msgstr "Verwende D-Bus und Notification-Daemon, um Benachrichtigungen zu zeigen" +#: ../src/common/commands.py:247 +msgid "Forward unread messages" +msgstr "Ungelesene Nachrichten weiterleiten" -#: ../src/common/config.py:61 +#: ../src/common/commands.py:267 +msgid "All unread messages have been forwarded." +msgstr "Alle ungelesenen Nachrichten wurden weitergeleitet." + +#: ../src/common/config.py:74 +msgid "Use D-Bus and Notification-Daemon to show notifications" +msgstr "" +"Verwende D-Bus und Notification-Daemon, um Benachrichtigungen zu zeigen" + +#: ../src/common/config.py:79 msgid "Time in minutes, after which your status changes to away." msgstr "Zeit in Minuten, nach der Ihr Status auf abwesend gesetzt wird" -#: ../src/common/config.py:62 +#: ../src/common/config.py:80 msgid "Away as a result of being idle" msgstr "Abwesend, da untätig" -#: ../src/common/config.py:64 +#: ../src/common/config.py:82 msgid "Time in minutes, after which your status changes to not available." msgstr "Zeit in Minuten, nach der Ihr Status auf nicht verfügbar gesetzt wird." -#: ../src/common/config.py:65 +#: ../src/common/config.py:83 msgid "Not available as a result of being idle" msgstr "Nicht verfügbar, da untätig" -#: ../src/common/config.py:83 -msgid "List (space separated) of rows (accounts and groups) that are collapsed." -msgstr "Liste (leerzeichengeteilt) von Reihen (Kontos und Gruppen), die eingeklappt sind." +#: ../src/common/config.py:101 +msgid "" +"List (space separated) of rows (accounts and groups) that are collapsed." +msgstr "" +"Liste (leerzeichengeteilt) von Reihen (Kontos und Gruppen), die eingeklappt " +"sind." -#: ../src/common/config.py:88 +#: ../src/common/config.py:106 msgid "Enable link-local/zeroconf messaging" msgstr "Aktiviere Anzeige von Kontakten im LAN über Zeroconf." -#: ../src/common/config.py:91 +#: ../src/common/config.py:109 msgid "Language used by speller" msgstr "Sprache der Rechtschreibprüfung" -#: ../src/common/config.py:92 +#: ../src/common/config.py:110 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" @@ -5457,614 +6541,841 @@ msgstr "" "'sometimes' - Zeige Zeit alle print_ichat_every_foo_minutes Minuten.\n" "'never' - Zeige nie die Zeit." -#: ../src/common/config.py:93 -msgid "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. This is used only if print_time is 'sometimes'." -msgstr "Zeige die Zeit in Chats mittels ungenauer Uhr an. Werte für die Ungenauigkeit sind 1 bis 4 oder 0, um die ungenaue Uhr zu deaktivieren. 1 ist am Genauesten, 4 ist am Ungenaueste. Dies wird nur verwendet, wenn print_time auf 'sometimes' gesetzt ist." +#: ../src/common/config.py:111 +msgid "" +"Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " +"to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " +"This is used only if print_time is 'sometimes'." +msgstr "" +"Zeige die Zeit in Chats mittels ungenauer Uhr an. Werte für die " +"Ungenauigkeit sind 1 bis 4 oder 0, um die ungenaue Uhr zu deaktivieren. 1 " +"ist am Genauesten, 4 ist am Ungenaueste. Dies wird nur verwendet, wenn " +"print_time auf 'sometimes' gesetzt ist." -#: ../src/common/config.py:96 +#: ../src/common/config.py:114 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Behandle * / _ Paare als mögliche Formatierungszeichen." -#: ../src/common/config.py:97 -msgid "If True, do not remove */_ . So *abc* will be bold but with * * not removed." -msgstr "Wenn aktiviert, wird */_ nicht entfernt. So wird *abc* fett gedruckt, aber * * wird nicht entfernt." +#: ../src/common/config.py:115 +msgid "" +"If True, do not remove */_ . So *abc* will be bold but with * * not removed." +msgstr "" +"Wenn aktiviert, wird */_ nicht entfernt. So wird *abc* fett gedruckt, aber * " +"* wird nicht entfernt." -#: ../src/common/config.py:100 -msgid "Uses ReStructured text markup to send HTML, plus ascii formatting if selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html (If you want to use this, install docutils)" -msgstr "Wenn aktiviert, wird reStructuredText für die HTML und ASCII-Formatierung verwendet (falls dies erwünscht ist, installieren Sie docutils). Informationen zur Syntax finden Sie unter http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html (Englisch)" +#: ../src/common/config.py:118 +msgid "" +"Uses ReStructured text markup to send HTML, plus ascii formatting if " +"selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" +"restructuredtext.html (If you want to use this, install docutils)" +msgstr "" +"Wenn aktiviert, wird reStructuredText für die HTML und ASCII-Formatierung " +"verwendet (falls dies erwünscht ist, installieren Sie docutils). " +"Informationen zur Syntax finden Sie unter http://docutils.sourceforge.net/" +"docs/ref/rst/restructuredtext.html (Englisch)" -#: ../src/common/config.py:109 -msgid "Character to add after nickname when using nick completion (tab) in group chat." -msgstr "Zeichen, das hinter Spitznamen angezeigt wird, wenn Spitznamenvervollständigung (Tab) im Gruppenchat verwendet wird." +#: ../src/common/config.py:127 +msgid "" +"Character to add after nickname when using nick completion (tab) in group " +"chat." +msgstr "" +"Zeichen, das hinter Spitznamen angezeigt wird, wenn " +"Spitznamenvervollständigung (Tab) im Gruppenchat verwendet wird." -#: ../src/common/config.py:110 -msgid "Character to propose to add after desired nickname when desired nickname is used by someone else in group chat." -msgstr "Zeichen, das hinter den gewünschten Spitznamen gehängt wird, falls der gewünschteName im Gruppenchat bereits vergeben ist." +#: ../src/common/config.py:128 +msgid "" +"Character to propose to add after desired nickname when desired nickname is " +"used by someone else in group chat." +msgstr "" +"Zeichen, das hinter den gewünschten Spitznamen gehängt wird, falls der " +"gewünschteName im Gruppenchat bereits vergeben ist." -#: ../src/common/config.py:133 -msgid "This option let you customize timestamp that is printed in conversation. For exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on strftime for full documentation: http://docs.python.org/lib/module-time.html" -msgstr "Hiermit lässt sich der Zeitstempel anpassen, der in den Unterhaltungen verwendet wird. Zum Beispiel wird \"[%H:%M] \" zu \"[Stunde:Minute] \". Weitere Informationen finden Sie in der Python-Dokumentation zu 'strftime' unter http://docs.python.org/lib/module-time.html (Englisch)." +#: ../src/common/config.py:151 +msgid "" +"This option let you customize timestamp that is printed in conversation. For " +"exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " +"strftime for full documentation: http://docs.python.org/lib/module-time.html" +msgstr "" +"Hiermit lässt sich der Zeitstempel anpassen, der in den Unterhaltungen " +"verwendet wird. Zum Beispiel wird \"[%H:%M] \" zu \"[Stunde:Minute] \". " +"Weitere Informationen finden Sie in der Python-Dokumentation zu 'strftime' " +"unter http://docs.python.org/lib/module-time.html (Englisch)." -#: ../src/common/config.py:134 +#: ../src/common/config.py:152 msgid "Characters that are printed before the nickname in conversations" msgstr "Zeichen, die vor dem Spitzname gedruckt werden" -#: ../src/common/config.py:135 +#: ../src/common/config.py:153 msgid "Characters that are printed after the nickname in conversations" msgstr "Zeichen, die nach dem Spitznamen gedruckt werden" -#: ../src/common/config.py:142 +#: ../src/common/config.py:156 +msgid "" +"If checked, Gajim can regularly poll a Last.fm account and adjust the status " +"message to reflect recently played songs. " +"set_status_msg_from_current_music_track option must be False." +msgstr "" + +#: ../src/common/config.py:157 +msgid "The username used to identify the Last.fm account." +msgstr "" + +#: ../src/common/config.py:162 msgid "Add * and [n] in roster title?" msgstr "Füge * und [n] in die Kontaktleiste?" -#: ../src/common/config.py:143 -msgid "How many lines to remember from previous conversation when a chat tab/window is reopened." -msgstr "Wie viele Zeilen von der vorherigen Unterhaltung gespeichert werden, wenn ein Chat Tab/Fenster wieder geöffnet wird." +#: ../src/common/config.py:163 +msgid "" +"How many lines to remember from previous conversation when a chat tab/window " +"is reopened." +msgstr "" +"Wie viele Zeilen von der vorherigen Unterhaltung gespeichert werden, wenn " +"ein Chat Tab/Fenster wieder geöffnet wird." -#: ../src/common/config.py:144 +#: ../src/common/config.py:164 msgid "How many minutes should last lines from previous conversation last." -msgstr "Wie viele Minuten die Zeilen vom vorherigen Chat angezeigt werden sollen." +msgstr "" +"Wie viele Minuten die Zeilen vom vorherigen Chat angezeigt werden sollen." -#: ../src/common/config.py:145 -msgid "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ Client default behaviour)." -msgstr "Sende Nachricht mit Strg+Enter und mache bei Enter einen Zeilenumbruch (Mirabilis ICQ-Client Standardeinstellung)." +#: ../src/common/config.py:165 +msgid "" +"Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " +"Client default behaviour)." +msgstr "" +"Sende Nachricht mit Strg+Enter und mache bei Enter einen Zeilenumbruch " +"(Mirabilis ICQ-Client Standardeinstellung)." -#: ../src/common/config.py:147 +#: ../src/common/config.py:167 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Wie viele Zeilen für Strg+BildAuf gespeichert werden." -#: ../src/common/config.py:150 +#: ../src/common/config.py:170 #, python-format -msgid "Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' which means use wiktionary." -msgstr "Entweder eine spezielle URL mit %s, wobei %s das Word/Phrase ist oder 'WIKTIONARY', was bedeutet, dass das Wörterbuch Wiktionary verwendet wird." +msgid "" +"Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' " +"which means use wiktionary." +msgstr "" +"Entweder eine spezielle URL mit %s, wobei %s das Word/Phrase ist oder " +"'WIKTIONARY', was bedeutet, dass das Wörterbuch Wiktionary verwendet wird." -#: ../src/common/config.py:153 +#: ../src/common/config.py:173 msgid "If checked, Gajim can be controlled remotely using gajim-remote." -msgstr "Falls aktiviert, kann Gajim von Außerhalb mittels gajim-remote kontrolliert werden." +msgstr "" +"Falls aktiviert, kann Gajim von Außerhalb mittels gajim-remote kontrolliert " +"werden." -#: ../src/common/config.py:154 -msgid "If True, listen to D-Bus signals from NetworkManager and change the status of accounts (provided they do not have listen_to_network_manager set to False and they sync with global status) based upon the status of the network connection." -msgstr "Wenn aktiviert, reagiere auf D-Bus-Signale vom NetworkManager und ändere den Status von Konten (vorausgesetzt, sie haben listen_to_network_manager nicht auf False gesetzt und sie synchronisieren sich mit dem globalen Status) basierend auf dem Status der Netzwerkverbindung." +#: ../src/common/config.py:174 +msgid "" +"If True, listen to D-Bus signals from NetworkManager and change the status " +"of accounts (provided they do not have listen_to_network_manager set to " +"False and they sync with global status) based upon the status of the network " +"connection." +msgstr "" +"Wenn aktiviert, reagiere auf D-Bus-Signale vom NetworkManager und ändere den " +"Status von Konten (vorausgesetzt, sie haben listen_to_network_manager nicht " +"auf False gesetzt und sie synchronisieren sich mit dem globalen Status) " +"basierend auf dem Status der Netzwerkverbindung." -#: ../src/common/config.py:155 -msgid "Sent chat state notifications. Can be one of all, composing_only, disabled." -msgstr "Chat-Statusbenachrichtigungen gesendet. Kann eine von allen sein, composing_only deaktiviert." +#: ../src/common/config.py:175 +msgid "" +"Sent chat state notifications. Can be one of all, composing_only, disabled." +msgstr "" +"Chat-Statusbenachrichtigungen gesendet. Kann eine von allen sein, " +"composing_only deaktiviert." -#: ../src/common/config.py:156 -msgid "Displayed chat state notifications in chat windows. Can be one of all, composing_only, disabled." -msgstr "Angezeigte Chat-Status Benachrichtigungen im Chatfenster. Kann all, composing_only oder disabled sein." +#: ../src/common/config.py:176 +msgid "" +"Displayed chat state notifications in chat windows. Can be one of all, " +"composing_only, disabled." +msgstr "" +"Angezeigte Chat-Status Benachrichtigungen im Chatfenster. Kann all, " +"composing_only oder disabled sein." -#: ../src/common/config.py:158 -msgid "When not printing time for every message (print_time==sometimes), print it every x minutes." -msgstr "Wenn die Uhrzeit nicht für jede Nachricht angezeigt werden soll (print_time==sometimes), zeige sie alle x Minuten." +#: ../src/common/config.py:178 +msgid "" +"When not printing time for every message (print_time==sometimes), print it " +"every x minutes." +msgstr "" +"Wenn die Uhrzeit nicht für jede Nachricht angezeigt werden soll " +"(print_time==sometimes), zeige sie alle x Minuten." -#: ../src/common/config.py:159 +#: ../src/common/config.py:179 msgid "Ask before closing a group chat tab/window." msgstr "Fragen, bevor ein Gruppenchat Tab/Fenster geschlossen wird." -#: ../src/common/config.py:160 -msgid "Always ask before closing group chat tab/window in this space separated list of group chat jids." -msgstr "Immer fragen, bevor ein Gruppenchat-Fenster/Tab aus der Leerzeichen-seperierten Liste von Gruppchatnamen geschlossen wird." +#: ../src/common/config.py:180 +msgid "" +"Always ask before closing group chat tab/window in this space separated list " +"of group chat jids." +msgstr "" +"Immer fragen, bevor ein Gruppenchat-Fenster/Tab aus der Leerzeichen-" +"seperierten Liste von Gruppchatnamen geschlossen wird." -#: ../src/common/config.py:161 -msgid "Never ask before closing group chat tab/window in this space separated list of group chat jids." -msgstr "Niemals fragen, bevor ein Gruppenchat-Fenster/Tab aus der Leerzeichen-seperierten Liste von Gruppenchatnamen geschlossen wird." +#: ../src/common/config.py:181 +msgid "" +"Never ask before closing group chat tab/window in this space separated list " +"of group chat jids." +msgstr "" +"Niemals fragen, bevor ein Gruppenchat-Fenster/Tab aus der Leerzeichen-" +"seperierten Liste von Gruppenchatnamen geschlossen wird." -#: ../src/common/config.py:164 +#: ../src/common/config.py:184 #, fuzzy -msgid "Comma separated list of hosts that we send, in addition of local interfaces, for File Transfer in case of address translation/port forwarding." -msgstr "Überschreibt den Host für Datenübertragung für den Fall von NAT/Port-Forwarding" +msgid "" +"Comma separated list of hosts that we send, in addition of local interfaces, " +"for File Transfer in case of address translation/port forwarding." +msgstr "" +"Überschreibt den Host für Datenübertragung für den Fall von NAT/Port-" +"Forwarding" -#: ../src/common/config.py:166 +#: ../src/common/config.py:186 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "IEC-Standard sagt KiB = 1024 Byte, kB = 1000 Byte." -#: ../src/common/config.py:168 +#: ../src/common/config.py:188 msgid "Notify of events in the system trayicon." msgstr "Benachrichtige über Ereignisse durch das Trayicon" -#: ../src/common/config.py:174 +#: ../src/common/config.py:194 msgid "Show tab when only one conversation?" msgstr "Tab bei einer einzelnen Unterhaltung anzeigen?" -#: ../src/common/config.py:175 +#: ../src/common/config.py:195 msgid "Show tabbed notebook border in chat windows?" msgstr "Tab-Grenze im Chat-Fenster anzeigen?" -#: ../src/common/config.py:176 +#: ../src/common/config.py:196 msgid "Show close button in tab?" msgstr "Schließen-Button im Tab anzeigen?" -#: ../src/common/config.py:189 -msgid "A semicolon-separated list of words that will be highlighted in group chats." -msgstr "Eine mit Semilkolon seperierte Liste von Worten, die in einem Gruppenchat hervorgehoben werden." - -#: ../src/common/config.py:190 -msgid "If True, quits Gajim when X button of Window Manager is clicked. This setting is taken into account only if trayicon is used." -msgstr "Falls aktiviert, wird Gajim beendet, wenn der X-Button des Fenstermanagers geklickt wird. Diese Option wird nur beachtet, wenn die Trayicon-Unterstützung aktiv ist." - -#: ../src/common/config.py:191 -msgid "If True, Gajim will check if it's the default jabber client on each startup." -msgstr "Wenn aktiviert, wird Gajim beim Starten überprüfen, ob Gajim der Standard-Jabber-Client ist." - -#: ../src/common/config.py:192 -msgid "If True, Gajim will display an icon on each tab containing unread messages. Depending on the theme, this icon may be animated." -msgstr "Falls aktiviert, wird Gajim ein Icon auf jedem Tab mit ungelesenen Nachrichten anzeigen. Abhängig vom Thema kann dieses Icon animiert sein." - -#: ../src/common/config.py:193 -msgid "If True, Gajim will display the status message, if not empty, for every contact under the contact name in roster window." -msgstr "Falls aktiviert, wird Gajim für jeden Kontakt die Statusnachricht, falls nicht leer, unter dem jeweiligen Kontaktnamen im Roster anzeigen." - -#: ../src/common/config.py:195 -msgid "If True, Gajim will ask for avatar each contact that did not have an avatar last time or has one cached that is too old." -msgstr "Falls aktiviert fragt Gajim nach einem Avatar für jeden Kontakt, der beim letzten Mal keinen hatte oder einen veralteten hat." - -#: ../src/common/config.py:196 -msgid "If False, Gajim will no longer print status line in chats when a contact changes his or her status and/or his or her status message." -msgstr "Falls deaktiviert, werden Sie keine Statuszeile im Chat sehen, wenn ein Kontakt seinen Status und/oder seine Statusnachricht ändert." - #: ../src/common/config.py:197 -msgid "can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no longer print status line in groupchats when a member changes his or her status and/or his or her status message. If \"all\" Gajim will print all status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves group chat." -msgstr "Kann \"none\", \"all\" oder \"in_and_out\" sein. Falls \"none\", wird Gajim keine Status-Zeilen mehr in Gruppenchats anzeigen, wenn ein Mitglied seinen Status oder seine Statusnachricht ändert. Falls \"all\", wird Gajim alle Statusnachrichten anzeigen. Falls \"in_and_out\", wird Gajim nur einen Status anzeigen, wenn jemand den Gruppenchat betritt oder verlässt." +msgid "" +"When negotiating an encrypted session, should Gajim assume you want your " +"messages to be logged?" +msgstr "" +"Soll Gajim beim Aushandeln einer verschlüsselten Sitzung annehmen, dass Sie " +"Ihre Nachricht mitschneiden wollen?" -#: ../src/common/config.py:199 +#: ../src/common/config.py:198 +msgid "" +"When negotiating an encrypted session, should Gajim prefer to use public " +"keys for identification?" +msgstr "" +"Soll Gajim bei Aushandeln einer verschlüsselten Situng öffentliche Schlüssel " +"zur Identifikation bevorzugen?" + +#: ../src/common/config.py:207 +#, fuzzy +msgid "Preview new messages in notification popup?" +msgstr "Sende Statusbenachrichtigungen:" + +#: ../src/common/config.py:212 +msgid "" +"A semicolon-separated list of words that will be highlighted in group chats." +msgstr "" +"Eine mit Semilkolon seperierte Liste von Worten, die in einem Gruppenchat " +"hervorgehoben werden." + +#: ../src/common/config.py:213 +msgid "" +"If True, quits Gajim when X button of Window Manager is clicked. This " +"setting is taken into account only if trayicon is used." +msgstr "" +"Falls aktiviert, wird Gajim beendet, wenn der X-Button des Fenstermanagers " +"geklickt wird. Diese Option wird nur beachtet, wenn die Trayicon-" +"Unterstützung aktiv ist." + +#: ../src/common/config.py:214 +msgid "" +"If True, Gajim will check if it's the default jabber client on each startup." +msgstr "" +"Wenn aktiviert, wird Gajim beim Starten überprüfen, ob Gajim der Standard-" +"Jabber-Client ist." + +#: ../src/common/config.py:215 +msgid "" +"If True, Gajim will display an icon on each tab containing unread messages. " +"Depending on the theme, this icon may be animated." +msgstr "" +"Falls aktiviert, wird Gajim ein Icon auf jedem Tab mit ungelesenen " +"Nachrichten anzeigen. Abhängig vom Thema kann dieses Icon animiert sein." + +#: ../src/common/config.py:216 +msgid "" +"If True, Gajim will display the status message, if not empty, for every " +"contact under the contact name in roster window." +msgstr "" +"Falls aktiviert, wird Gajim für jeden Kontakt die Statusnachricht, falls " +"nicht leer, unter dem jeweiligen Kontaktnamen im Roster anzeigen." + +#: ../src/common/config.py:218 +msgid "" +"If True, Gajim will ask for avatar each contact that did not have an avatar " +"last time or has one cached that is too old." +msgstr "" +"Falls aktiviert fragt Gajim nach einem Avatar für jeden Kontakt, der beim " +"letzten Mal keinen hatte oder einen veralteten hat." + +#: ../src/common/config.py:219 +msgid "" +"If False, Gajim will no longer print status line in chats when a contact " +"changes his or her status and/or his or her status message." +msgstr "" +"Falls deaktiviert, werden Sie keine Statuszeile im Chat sehen, wenn ein " +"Kontakt seinen Status und/oder seine Statusnachricht ändert." + +#: ../src/common/config.py:220 +msgid "" +"can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " +"longer print status line in groupchats when a member changes his or her " +"status and/or his or her status message. If \"all\" Gajim will print all " +"status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " +"group chat." +msgstr "" +"Kann \"none\", \"all\" oder \"in_and_out\" sein. Falls \"none\", wird Gajim " +"keine Status-Zeilen mehr in Gruppenchats anzeigen, wenn ein Mitglied seinen " +"Status oder seine Statusnachricht ändert. Falls \"all\", wird Gajim alle " +"Statusnachrichten anzeigen. Falls \"in_and_out\", wird Gajim nur einen " +"Status anzeigen, wenn jemand den Gruppenchat betritt oder verlässt." + +#: ../src/common/config.py:222 msgid "Background color of contacts when they just signed in." msgstr "Hintergrundfarbe von Kontakten wenn sie sich gerade noch anmeldeten." -#: ../src/common/config.py:200 +#: ../src/common/config.py:223 msgid "Background color of contacts when they just signed out." msgstr "Hintergrundfarbe von Kontakten wenn sie sich gerade noch abmeldeten." -#: ../src/common/config.py:202 -msgid "If True, restored messages will use a smaller font than the default one." -msgstr "Falls aktiv, werden wiederhergestellte Nachrichten mit einer kleineren Schrift als der Standard dargestellt." +#: ../src/common/config.py:225 +msgid "" +"If True, restored messages will use a smaller font than the default one." +msgstr "" +"Falls aktiv, werden wiederhergestellte Nachrichten mit einer kleineren " +"Schrift als der Standard dargestellt." -#: ../src/common/config.py:203 +#: ../src/common/config.py:226 msgid "Don't show avatar for the transport itself." msgstr "Zeige keinen Avatar für den Transport selber." -#: ../src/common/config.py:204 +#: ../src/common/config.py:227 msgid "Don't show roster in the system taskbar." msgstr "Kontaktliste nicht in der System-Taskleiste anzeigen." -#: ../src/common/config.py:205 -msgid "If True and installed GTK+ and PyGTK versions are at least 2.8, make the window flash (the default behaviour in most Window Managers) when holding pending events." -msgstr "Wenn aktiviert und die installierten GTK+ und PyGTK Versionen wenigstens 2.8 sind, lasse das Fenster bei neuen Ereignissen aufblitzen (Standardverhalten in den meisten Window-Managers) " +#: ../src/common/config.py:228 +msgid "" +"If True and installed GTK+ and PyGTK versions are at least 2.8, make the " +"window flash (the default behaviour in most Window Managers) when holding " +"pending events." +msgstr "" +"Wenn aktiviert und die installierten GTK+ und PyGTK Versionen wenigstens 2.8 " +"sind, lasse das Fenster bei neuen Ereignissen aufblitzen (Standardverhalten " +"in den meisten Window-Managers) " -#: ../src/common/config.py:207 -msgid "Jabberd1.4 does not like sha info when one join a password protected group chat. Turn this option to False to stop sending sha info in group chat presences." -msgstr "Jabberd1.4 mag keine SHA-Informationen wenn ein passwortgeschützter Gruppenchat betreten wird. Deaktivieren Sie diese Option um keine SHA-Informationen in Gruppenchats zu senden" +#: ../src/common/config.py:230 +msgid "" +"Jabberd1.4 does not like sha info when one join a password protected group " +"chat. Turn this option to False to stop sending sha info in group chat " +"presences." +msgstr "" +"Jabberd1.4 mag keine SHA-Informationen wenn ein passwortgeschützter " +"Gruppenchat betreten wird. Deaktivieren Sie diese Option um keine SHA-" +"Informationen in Gruppenchats zu senden" #. always, never, peracct, pertype should not be translated -#: ../src/common/config.py:210 +#: ../src/common/config.py:233 msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" "'never' - All messages get their own window.\n" "'peracct' - Messages for each account are sent to a specific window.\n" -"'pertype' - Each message type (e.g., chats vs. groupchats) are sent to a specific window. Note, changing this option requires restarting Gajim before the changes will take effect." +"'pertype' - Each message type (e.g., chats vs. groupchats) are sent to a " +"specific window. Note, changing this option requires restarting Gajim before " +"the changes will take effect." msgstr "" "Kontrolliert das Fenster in dem neue Nachrichten platziert werden.\n" "'always' - Alle Nachrichten landen in einem einzelnen Fenster.\n" "'never' - Alle Nachrichten bekommen ihr eigenes Fenster.\n" -"'peracct' - Nachrichten für jeden Account landen in einem speziellen Fenster.\n" -"'pertype' - Jede Nachrichtentyp (z.B. Chat vs. Gruppenchat) landet in in einem speziellen Fenster. Falls Sie diese Option ändern, muss Gajim neu gestartet werden, damit die Änderungen übernommen werden" +"'peracct' - Nachrichten für jeden Account landen in einem speziellen " +"Fenster.\n" +"'pertype' - Jede Nachrichtentyp (z.B. Chat vs. Gruppenchat) landet in in " +"einem speziellen Fenster. Falls Sie diese Option ändern, muss Gajim neu " +"gestartet werden, damit die Änderungen übernommen werden" -#: ../src/common/config.py:211 +#: ../src/common/config.py:234 msgid "If False, you will no longer see the avatar in the chat window." -msgstr "Wenn deaktiviert, werden Sie den Avatar nicht mehr im Chatfenster sehen." +msgstr "" +"Wenn deaktiviert, werden Sie den Avatar nicht mehr im Chatfenster sehen." -#: ../src/common/config.py:212 +#: ../src/common/config.py:235 msgid "If True, pressing the escape key closes a tab/window." msgstr "Wenn aktiviert, schließt die Escape-Taste ein Tab/Fenster." -#: ../src/common/config.py:213 -msgid "Hides the buttons in group chat window." +#: ../src/common/config.py:236 +msgid "Hides the buttons in chat windows." msgstr "Versteckt die Knöpfe im Gruppenchat-Fenster." -#: ../src/common/config.py:214 -msgid "Hides the buttons in two persons chat window." -msgstr "Versteckt die Knöpfe im Zwei-Personen-Chatfenster" - -#: ../src/common/config.py:215 +#: ../src/common/config.py:237 msgid "Hides the banner in a group chat window" msgstr "Versteckt das Banner im Gruppenchat-Fenster" -#: ../src/common/config.py:216 +#: ../src/common/config.py:238 msgid "Hides the banner in two persons chat window" msgstr "Versteckt das Banner im Zwei-Personen-Chatfenster" -#: ../src/common/config.py:217 +#: ../src/common/config.py:239 msgid "Hides the group chat occupants list in group chat window." msgstr "Versteckt die Gruppenchat-Benutzerliste im Gruppenchat-Fenster." -#: ../src/common/config.py:218 -msgid "In a chat, show the nickname at the beginning of a line only when it's not the same person talking than in previous message." -msgstr "Zeige in einem Chat den Spitznamen nur dann am Beginn einer Linie, wenn es nicht die selbe Person ist die schon die letzte Nachricht geschrieben hat." +#: ../src/common/config.py:240 +msgid "" +"In a chat, show the nickname at the beginning of a line only when it's not " +"the same person talking than in previous message." +msgstr "" +"Zeige in einem Chat den Spitznamen nur dann am Beginn einer Linie, wenn es " +"nicht die selbe Person ist die schon die letzte Nachricht geschrieben hat." -#: ../src/common/config.py:219 +#: ../src/common/config.py:241 msgid "Indentation when using merge consecutive nickname." -msgstr "Einrückung, wenn das Zusammenführen nachfolgender Spitznamen verwendet wird." +msgstr "" +"Einrückung, wenn das Zusammenführen nachfolgender Spitznamen verwendet wird." -#: ../src/common/config.py:220 +#: ../src/common/config.py:242 +#, fuzzy +msgid "Smooth scroll message in conversation window" +msgstr "Nachricht senden und Fenster schließen" + +#: ../src/common/config.py:243 msgid "List of colors that will be used to color nicknames in group chats." -msgstr "Farbliste, die für die Einfärbung von Spitzenamen im Gruppenchat verwendet wird." +msgstr "" +"Farbliste, die für die Einfärbung von Spitzenamen im Gruppenchat verwendet " +"wird." -#: ../src/common/config.py:221 +#: ../src/common/config.py:244 msgid "Ctrl-Tab go to next composing tab when none is unread." -msgstr "Strg-Tab, um zum nächsten Reiter zu gehen, wenn kein Anderer neue Nachrichten enthält." +msgstr "" +"Strg-Tab, um zum nächsten Reiter zu gehen, wenn kein Anderer neue " +"Nachrichten enthält." -#: ../src/common/config.py:222 -msgid "Should we show the confirm metacontacts creation dialog or not? Empty string means we never show the dialog." -msgstr "Soll der Bestätigungsdialog beim Erstellen von Metakontakten angezeigt werden oder nicht? Bei leerer Zeichenfolge wird der Dialog nie gezeigt." +#: ../src/common/config.py:245 +msgid "" +"Should we show the confirm metacontacts creation dialog or not? Empty string " +"means we never show the dialog." +msgstr "" +"Soll der Bestätigungsdialog beim Erstellen von Metakontakten angezeigt " +"werden oder nicht? Bei leerer Zeichenfolge wird der Dialog nie gezeigt." -#: ../src/common/config.py:223 -msgid "If True, you will be able to set a negative priority to your account in account modification window. BE CAREFUL, when you are logged in with a negative priority, you will NOT receive any message from your server." -msgstr "Wenn aktiviert, werden Sie in der Lage sein eine negative Priorität für Ihr Konto im Konto-Bearbeiten Fenster zu setzen. SEIEN SIE VORSICHTIG, wenn Sie mit einer negativen Priorität angemeldet sind: Sie werden KEINE Nachrichten mehr von Ihrem Server erhalten." +#: ../src/common/config.py:246 +msgid "" +"If True, you will be able to set a negative priority to your account in " +"account modification window. BE CAREFUL, when you are logged in with a " +"negative priority, you will NOT receive any message from your server." +msgstr "" +"Wenn aktiviert, werden Sie in der Lage sein eine negative Priorität für Ihr " +"Konto im Konto-Bearbeiten Fenster zu setzen. SEIEN SIE VORSICHTIG, wenn Sie " +"mit einer negativen Priorität angemeldet sind: Sie werden KEINE Nachrichten " +"mehr von Ihrem Server erhalten." -#: ../src/common/config.py:224 -msgid "If True, Gajim will use Gnome Keyring (if available) to store account passwords." -msgstr "Wenn aktiviert, wird Gnome Keyring (falls verfügbar) verwendet, um die Passwörter der Konten zu speichern." +#: ../src/common/config.py:247 +msgid "" +"If True, Gajim will use Gnome Keyring (if available) to store account " +"passwords." +msgstr "" +"Wenn aktiviert, wird Gnome Keyring (falls verfügbar) verwendet, um die " +"Passwörter der Konten zu speichern." -#: ../src/common/config.py:225 -msgid "If True, Gajim will show number of online and total contacts in account and group rows." -msgstr "Wenn aktiviert, wird Gajim die Anzahl der angemeldeten und gesamten Kontakte in den Konto- und Gruppenreihen anzeigen." +#: ../src/common/config.py:248 +msgid "" +"If True, Gajim will show number of online and total contacts in account and " +"group rows." +msgstr "" +"Wenn aktiviert, wird Gajim die Anzahl der angemeldeten und gesamten Kontakte " +"in den Konto- und Gruppenreihen anzeigen." -#: ../src/common/config.py:226 -msgid "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages as if they were of this type" -msgstr "Kann leer, 'chat' oder 'normal' sein. Wenn nicht leer, dann werden alle eingehenden Nachrichten so behandelt, als wären sie von diesem Typ." +#: ../src/common/config.py:249 +msgid "" +"Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " +"as if they were of this type" +msgstr "" +"Kann leer, 'chat' oder 'normal' sein. Wenn nicht leer, dann werden alle " +"eingehenden Nachrichten so behandelt, als wären sie von diesem Typ." -#: ../src/common/config.py:227 -msgid "If True, Gajim will scroll and select the contact who sent you the last message, if chat window is not already opened." -msgstr "Wenn aktiviert, wird Gajim automatisch zu der Person springen und auswählen, die die letzte Nachricht geschickt hat, falls das Chat Fenster nicht bereits offen ist." +#: ../src/common/config.py:250 +msgid "" +"If True, Gajim will scroll and select the contact who sent you the last " +"message, if chat window is not already opened." +msgstr "" +"Wenn aktiviert, wird Gajim automatisch zu der Person springen und auswählen, " +"die die letzte Nachricht geschickt hat, falls das Chat Fenster nicht bereits " +"offen ist." -#: ../src/common/config.py:238 -msgid "Priority will change automatically according to your status. Priorities are defined in autopriority_* options." -msgstr "Die Priorität wird automatisch dem Status entsprechend geändert. Prioritäten sind in den autopriority_* Optionen definiert." +#: ../src/common/config.py:251 +msgid "" +"If True, Gajim will convert string between $$ and $$ to an image using dvips " +"and convert before insterting it in chat window." +msgstr "" +"Falls 'true', wird Gajim eine Zeichenkette zwischen $$ und $$ mittels dvips " +"vor dem Einfügen in ein Chat-Fenster in ein Bild umwandeln." + +#: ../src/common/config.py:252 +msgid "Time of inactivity needed before the change status window closes down." +msgstr "" +"Benötigte Inaktivitäts-Zeit bevor das 'Status ändern'-Fenster geschlossen " +"wird." + +#: ../src/common/config.py:253 +msgid "" +"Maximum number of lines that are printed in conversations. Oldest lines are " +"cleared." +msgstr "" +"Maximale Anzahl Zeilen, die in einem Gespräch angezeigt werden. Die ältesten " +"Zeilen werden gelöscht." + +#: ../src/common/config.py:254 +msgid "" +"If True, notification windows from notification-daemon will be attached to " +"systray icon." +msgstr "" + +#: ../src/common/config.py:265 +msgid "" +"Priority will change automatically according to your status. Priorities are " +"defined in autopriority_* options." +msgstr "" +"Die Priorität wird automatisch dem Status entsprechend geändert. Prioritäten " +"sind in den autopriority_* Optionen definiert." #. yes, no, ask -#: ../src/common/config.py:267 +#: ../src/common/config.py:293 msgid "Jabberd2 workaround" msgstr "Jabberd2 Workaround" -#: ../src/common/config.py:271 -msgid "If checked, Gajim will use your IP and proxies defined in file_transfer_proxies option for file transfer." -msgstr "Wenn aktiviert, wird Gajim Ihre IP und die in der file_transfer_proxies Option definierten Proxies für den Datentransfer verwenden." +#: ../src/common/config.py:297 +msgid "" +"If checked, Gajim will use your IP and proxies defined in " +"file_transfer_proxies option for file transfer." +msgstr "" +"Wenn aktiviert, wird Gajim Ihre IP und die in der file_transfer_proxies " +"Option definierten Proxies für den Datentransfer verwenden." -#: ../src/common/config.py:330 +#: ../src/common/config.py:356 msgid "Is OpenPGP enabled for this contact?" msgstr "Ist OpenPGP für diesen Kontakt aktiviert?" -#: ../src/common/config.py:331 -#: ../src/common/config.py:334 +#: ../src/common/config.py:357 ../src/common/config.py:360 msgid "Language for which we want to check misspelled words" msgstr "Sprache für, die nach falsch geschriebenen Wörtern gesucht werden soll" -#: ../src/common/config.py:340 +#: ../src/common/config.py:366 msgid "all or space separated status" msgstr "alle oder Leerzeichen-getrennter Status" -#: ../src/common/config.py:341 +#: ../src/common/config.py:367 msgid "'yes', 'no', or 'both'" msgstr "'ja', 'nein' oder 'beide'" -#: ../src/common/config.py:342 -#: ../src/common/config.py:344 -#: ../src/common/config.py:345 -#: ../src/common/config.py:348 -#: ../src/common/config.py:349 +#: ../src/common/config.py:368 ../src/common/config.py:370 +#: ../src/common/config.py:371 ../src/common/config.py:374 +#: ../src/common/config.py:375 msgid "'yes', 'no' or ''" msgstr "'ja, 'nein' oder ''" -#: ../src/common/config.py:355 +#: ../src/common/config.py:381 msgid "Sleeping" msgstr "Schlafen" -#: ../src/common/config.py:356 +#: ../src/common/config.py:382 msgid "Back soon" msgstr "Bin gleich wieder da" -#: ../src/common/config.py:356 +#: ../src/common/config.py:382 msgid "Back in some minutes." msgstr "Bin in ein paar Minuten zurück." -#: ../src/common/config.py:357 +#: ../src/common/config.py:383 msgid "Eating" msgstr "Essen" -#: ../src/common/config.py:357 +#: ../src/common/config.py:383 msgid "I'm eating, so leave me a message." msgstr "Ich esse gerade, also hinterlasst eine Nachricht." -#: ../src/common/config.py:358 +#: ../src/common/config.py:384 msgid "Movie" msgstr "Film" -#: ../src/common/config.py:358 +#: ../src/common/config.py:384 msgid "I'm watching a movie." msgstr "Ich sehe mir einen Film an." -#: ../src/common/config.py:359 +#: ../src/common/config.py:385 msgid "Working" msgstr "Arbeiten" -#: ../src/common/config.py:359 +#: ../src/common/config.py:385 msgid "I'm working." msgstr "Ich arbeite." -#: ../src/common/config.py:360 +#: ../src/common/config.py:386 msgid "Phone" msgstr "Telefon" -#: ../src/common/config.py:360 +#: ../src/common/config.py:386 msgid "I'm on the phone." msgstr "Ich telefoniere." -#: ../src/common/config.py:361 +#: ../src/common/config.py:387 msgid "Out" msgstr "Draußen" -#: ../src/common/config.py:361 +#: ../src/common/config.py:387 msgid "I'm out enjoying life." msgstr "Ich bin draußen und genieße das Leben." -#: ../src/common/config.py:365 +#: ../src/common/config.py:391 msgid "I'm available." msgstr "Ich bin angemeldet." -#: ../src/common/config.py:366 +#: ../src/common/config.py:392 msgid "I'm free for chat." msgstr "Ich bin frei zum Chatten." -#: ../src/common/config.py:368 +#: ../src/common/config.py:394 msgid "I'm not available." msgstr "Ich bin nicht verfügbar." -#: ../src/common/config.py:369 +#: ../src/common/config.py:395 msgid "Do not disturb." msgstr "Bitte nicht stören." -#: ../src/common/config.py:370 -#: ../src/common/config.py:371 +#: ../src/common/config.py:396 ../src/common/config.py:397 msgid "Bye!" msgstr "Auf Wiedersehen!" -#: ../src/common/config.py:380 -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 "Abzuspielender Ton, falls eine Gruppenchat-Nachricht eines der Wörter aus der muc_highlights_works-Liste oder Ihren Spitznamen enthält." +#: ../src/common/config.py:406 +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 "" +"Abzuspielender Ton, falls eine Gruppenchat-Nachricht eines der Wörter aus " +"der muc_highlights_works-Liste oder Ihren Spitznamen enthält." -#: ../src/common/config.py:381 +#: ../src/common/config.py:407 msgid "Sound to play when any MUC message arrives." -msgstr "Ton der beim empfangen einer Gruppenchat-Nachricht abgespielt werden soll" +msgstr "" +"Ton der beim empfangen einer Gruppenchat-Nachricht abgespielt werden soll" -#: ../src/common/config.py:390 -#: ../src/common/optparser.py:195 +#: ../src/common/config.py:416 ../src/common/optparser.py:220 msgid "green" msgstr "grün" -#: ../src/common/config.py:394 -#: ../src/common/optparser.py:181 +#: ../src/common/config.py:420 ../src/common/optparser.py:206 msgid "grocery" msgstr "gemüse" -#: ../src/common/config.py:398 +#: ../src/common/config.py:424 msgid "human" msgstr "menschlich" -#: ../src/common/config.py:402 +#: ../src/common/config.py:428 msgid "marine" msgstr "Marine" -#: ../src/common/connection_handlers.py:52 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:44 +#: ../src/common/connection_handlers.py:61 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:49 msgid "Unable to load idle module" msgstr "Konnte Idle-Modus nicht laden" -#: ../src/common/connection_handlers.py:180 -#: ../src/common/connection_handlers.py:215 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 +#: ../src/common/connection_handlers.py:219 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:243 msgid "Wrong host" msgstr "Falscher Host" -#: ../src/common/connection_handlers.py:180 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 -#, python-format -msgid "The host %s you configured as the ft_add_hosts_to_send advanced option is not valid, so ignored." -msgstr "Der Host %s, den Sie für die erweiterte Option ft_override_host_to_send angeben haben ist ungültig und wird ignoriert." - -#: ../src/common/connection_handlers.py:216 +#: ../src/common/connection_handlers.py:220 msgid "Invalid local address? :-O" msgstr "Ungültige Lokale Adresse? :-O" -#: ../src/common/connection_handlers.py:607 +#: ../src/common/connection_handlers.py:618 #, python-format msgid "Registration information for transport %s has not arrived in time" -msgstr "Registrierungsinformation für Transport %s sind nicht rechtzeitig angekommen" +msgstr "" +"Registrierungsinformation für Transport %s sind nicht rechtzeitig angekommen" -#: ../src/common/connection_handlers.py:1544 +#: ../src/common/connection_handlers.py:1802 #, python-format msgid "Nickname not allowed: %s" msgstr "Spitzname nicht erlaubt: %s" -#. password required to join #. we are banned #. group chat does not exist -#: ../src/common/connection_handlers.py:1609 -#: ../src/common/connection_handlers.py:1612 -#: ../src/common/connection_handlers.py:1615 -#: ../src/common/connection_handlers.py:1618 -#: ../src/common/connection_handlers.py:1621 -#: ../src/common/connection_handlers.py:1624 -#: ../src/common/connection_handlers.py:1632 +#: ../src/common/connection_handlers.py:1872 +#: ../src/common/connection_handlers.py:1875 +#: ../src/common/connection_handlers.py:1878 +#: ../src/common/connection_handlers.py:1881 +#: ../src/common/connection_handlers.py:1885 +#: ../src/common/connection_handlers.py:1894 msgid "Unable to join group chat" msgstr "Fehler beim Betreten des Gruppenchats" -#: ../src/common/connection_handlers.py:1610 -msgid "A password is required to join this group chat." -msgstr "Für das Betreten dieses Gruppenchats ist ein Passwort nötig." +#: ../src/common/connection_handlers.py:1873 +#, python-format +msgid "You are banned from group chat %s." +msgstr "Sie sind von Gruppenchat %s gebannt." -#: ../src/common/connection_handlers.py:1613 -msgid "You are banned from this group chat." -msgstr "Sie sind von diesem Gruppenchat gebannt." - -#: ../src/common/connection_handlers.py:1616 -msgid "Such group chat does not exist." +#: ../src/common/connection_handlers.py:1876 +#, python-format +msgid "Group chat %s does not exist." msgstr "Dieser Gruppenchat existiert nicht." -#: ../src/common/connection_handlers.py:1619 +#: ../src/common/connection_handlers.py:1879 msgid "Group chat creation is restricted." msgstr "Gruppenchaterstellung ist beschränkt." -#: ../src/common/connection_handlers.py:1622 -msgid "Your registered nickname must be used." +#: ../src/common/connection_handlers.py:1882 +#, python-format +msgid "Your registered nickname must be used in group chat %s." msgstr "Sie müssen Ihren registrierten Spitznamen verwenden" -#: ../src/common/connection_handlers.py:1625 -msgid "You are not in the members list." +#: ../src/common/connection_handlers.py:1886 +#, python-format +msgid "You are not in the members list in groupchat %s." msgstr "Sie sind nicht in der Mitgliedliste" -#: ../src/common/connection_handlers.py:1633 +#: ../src/common/connection_handlers.py:1895 +#, python-format msgid "" -"Your desired nickname is in use or registered by another occupant.\n" +"Your desired nickname in group chat %s is in use or registered by another " +"occupant.\n" "Please specify another nickname below:" msgstr "" -"Der gewünschte Benutzername wird bereits verwendet oder ist von einem anderen Benutzer registriert.\n" +"Der gewünschte Benutzername wird bereits verwendet oder ist von einem " +"anderen Benutzer registriert.\n" "Bitte geben Sie einen anderen Benutzernamen an:" #. Room has been destroyed. see #. http://www.xmpp.org/extensions/xep-0045.html#destroyroom -#: ../src/common/connection_handlers.py:1676 +#: ../src/common/connection_handlers.py:1926 msgid "Room has been destroyed" msgstr "Raum wurde zerstört" -#: ../src/common/connection_handlers.py:1683 +#: ../src/common/connection_handlers.py:1933 #, python-format msgid "You can join this room instead: %s" msgstr "Sie können stattdessen diesem Raum beitreten: %s" -#: ../src/common/connection_handlers.py:1709 +#: ../src/common/connection_handlers.py:1960 msgid "I would like to add you to my roster." msgstr "Ich würde dich gerne zu meiner Liste hinzufügen." #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:1730 +#: ../src/common/connection_handlers.py:1981 #, python-format msgid "we are now subscribed to %s" msgstr "wir haben jetzt %s abonniert" -#: ../src/common/connection_handlers.py:1732 +#: ../src/common/connection_handlers.py:1983 #, python-format msgid "unsubscribe request from %s" msgstr "Anfrage zur Kündigung des Abonnements von %s" -#: ../src/common/connection_handlers.py:1734 +#: ../src/common/connection_handlers.py:1985 #, python-format msgid "we are now unsubscribed from %s" msgstr "%s hat das Abonnement beendet" -#: ../src/common/connection_handlers.py:1851 +#: ../src/common/connection_handlers.py:2112 #, python-format -msgid "JID %s is not RFC compliant. It will not be added to your roster. Use roster management tools such as http://jru.jabberstudio.org/ to remove it" -msgstr "Jid %s ist nicht RFC-konform. Sie wird nicht zu ihrem Roster hinzugefügt. Verwenden Sie ein Roster-Managment-Tool wie , um ihn zu entfernen" +msgid "" +"JID %s is not RFC compliant. It will not be added to your roster. Use roster " +"management tools such as http://jru.jabberstudio.org/ to remove it" +msgstr "" +"Jid %s ist nicht RFC-konform. Sie wird nicht zu ihrem Roster hinzugefügt. " +"Verwenden Sie ein Roster-Managment-Tool wie , " +"um ihn zu entfernen" -#: ../src/common/connection.py:193 -#: ../src/common/zeroconf/connection_zeroconf.py:196 +#. We didn't set a passphrase +#: ../src/common/connection_handlers.py:2151 +#: ../src/common/zeroconf/connection_zeroconf.py:169 +msgid "OpenPGP passphrase was not given" +msgstr "Keine OpenPGP-Passphrase gewählt" + +#: ../src/common/connection.py:243 +#: ../src/common/zeroconf/connection_zeroconf.py:209 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Verbindung mit Konto \"%s\" abgebrochen" -#: ../src/common/connection.py:194 +#: ../src/common/connection.py:244 msgid "Reconnect manually." msgstr "Manuelle Neuverbindung." -#: ../src/common/connection.py:205 -#: ../src/common/connection.py:232 -#, python-format -msgid "Transport %s answered wrongly to register request: %s" -msgstr "Transport %s beantwortete unsere Registrierungsanfrage nicht korrekt: %s" +#: ../src/common/connection.py:255 +#, fuzzy, python-format +msgid "Server %s answered wrongly to register request: %s" +msgstr "" +"Transport %s beantwortete unsere Registrierungsanfrage nicht korrekt: %s" #. wrong answer -#: ../src/common/connection.py:231 +#: ../src/common/connection.py:263 msgid "Invalid answer" msgstr "Ungültige Antwort" -#: ../src/common/connection.py:379 +#: ../src/common/connection.py:264 +#, python-format +msgid "Transport %s answered wrongly to register request: %s" +msgstr "" +"Transport %s beantwortete unsere Registrierungsanfrage nicht korrekt: %s" + +#: ../src/common/connection.py:410 msgid "Connection to proxy failed" msgstr "Verbindung mit Proxy fehlgeschlagen" -#: ../src/common/connection.py:433 -#: ../src/common/connection.py:531 -#: ../src/common/connection.py:984 -#: ../src/common/zeroconf/connection_zeroconf.py:217 +#: ../src/common/connection.py:464 ../src/common/connection.py:510 +#: ../src/common/connection.py:1080 +#: ../src/common/zeroconf/connection_zeroconf.py:243 #, python-format msgid "Could not connect to \"%s\"" msgstr "Konnte nicht mit %s verbinden" -#: ../src/common/connection.py:447 +#: ../src/common/connection.py:478 #, python-format msgid "Connected to server %s:%s with %s" msgstr "Verbunden mit Server %s:%s mit %s" -#: ../src/common/connection.py:460 -#, python-format -msgid "Security error connecting to \"%s\"" -msgstr "Konnte nicht mit %s verbinden" - -#: ../src/common/connection.py:461 -msgid "The server's key has changed, or someone is trying to hack your connection." -msgstr "Der Schlüssel des Servers wurde geändert oder jemand versucht ihre Verbindung zu hacken." - -#: ../src/common/connection.py:468 -#, python-format -msgid "Unable to check fingerprint for %s. Connection could be insecure." -msgstr "Konnte Fingerabdruck von %s nicht überprüfen. Die Verbindung ist möglicherweise unsicher." - -#: ../src/common/connection.py:510 -#, python-format -msgid "Missing fingerprint in SSL connection to %s" -msgstr "Fehlender Fingerabdruck in der SSL-Verbindung zu %s" - -#: ../src/common/connection.py:516 -#, python-format -msgid "Fingerprint mismatch for %s: Got %s, expected %s" -msgstr "Fingerabdruck von %s stimmt nicht überein: Erhalten %s, erwartet %s" - -#: ../src/common/connection.py:532 +#: ../src/common/connection.py:511 msgid "Check your connection or try again later" msgstr "Überprüfen Sie die Verbindung oder versuchen Sie es später noch einmal" -#: ../src/common/connection.py:558 +#: ../src/common/connection.py:536 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Authentifizierung mit \"%s\" fehlgeschlagen" -#: ../src/common/connection.py:559 +#: ../src/common/connection.py:538 msgid "Please check your login and password for correctness." msgstr "Bitte überprüfen Sie ihren Benutzernamen und Passwort." -#: ../src/common/connection.py:586 +#: ../src/common/connection.py:581 msgid "Error while removing privacy list" msgstr "Fehler beim Entfernen der Privatliste" -#: ../src/common/connection.py:587 +#: ../src/common/connection.py:582 #, 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 "Privatliste %s wurde nicht entfernt. Möglicherweise ist die Privatliste noch in einer Ihrer Verbindungen aktiv. Deaktivieren Sie diese und versuchen Sie es erneut." - -#. We didn't set a passphrase -#: ../src/common/connection.py:685 -#: ../src/common/zeroconf/connection_zeroconf.py:156 -msgid "OpenPGP passphrase was not given" -msgstr "Keine OpenPGP-Passphrase gewählt" +msgid "" +"Privacy list %s has not been removed. It is maybe active in one of your " +"connected resources. Deactivate it and try again." +msgstr "" +"Privatliste %s wurde nicht entfernt. Möglicherweise ist die Privatliste noch " +"in einer Ihrer Verbindungen aktiv. Deaktivieren Sie diese und versuchen Sie " +"es erneut." #. we're not english #. one in locale and one en -#: ../src/common/connection.py:814 +#: ../src/common/connection.py:855 msgid "[This message is *encrypted* (See :JEP:`27`]" msgstr "[Diese Nachricht ist *verschlüsselt* (Siehe: JEP:`27`)]" -#: ../src/common/connection.py:870 -#: ../src/common/zeroconf/connection_zeroconf.py:397 +#: ../src/common/connection.py:929 +#: ../src/common/zeroconf/connection_zeroconf.py:437 #, python-format msgid "" "Subject: %s\n" @@ -6073,486 +7384,487 @@ msgstr "" "Thema: %s\n" "%s" -#: ../src/common/connection.py:1010 +#: ../src/common/connection.py:1112 msgid "Not fetched because of invisible status" msgstr "Nicht abgeholt aufgrund eines Unsichtbar-Status" -#: ../src/common/contacts.py:271 +#: ../src/common/contacts.py:299 msgid "Not in roster" msgstr "Nicht in der Kontaktliste" #. only say that to non Windows users -#: ../src/common/dbus_support.py:33 +#: ../src/common/dbus_support.py:41 msgid "D-Bus python bindings are missing in this computer" msgstr "Auf diesem Computer fehlen die Python Bibliotheken für D-Bus" -#: ../src/common/dbus_support.py:34 +#: ../src/common/dbus_support.py:42 msgid "D-Bus capabilities of Gajim cannot be used" msgstr "Gajims D-BUS-Möglichkeiten können nicht genutzt werden" -#: ../src/common/exceptions.py:22 +#: ../src/common/exceptions.py:27 msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." -msgstr "pysqlite2 (auch python-pysqlite2 genannt) Abhängigkeit fehlt. Beende ..." +msgstr "" +"pysqlite2 (auch python-pysqlite2 genannt) Abhängigkeit fehlt. Beende ..." -#: ../src/common/exceptions.py:30 +#: ../src/common/exceptions.py:44 msgid "Service not available: Gajim is not running, or remote_control is False" -msgstr "Dienst nicht verfügbar: Gajim ist nicht aktiv oder remote_control ist deaktiviert" +msgstr "" +"Dienst nicht verfügbar: Gajim ist nicht aktiv oder remote_control ist " +"deaktiviert" -#: ../src/common/exceptions.py:38 +#: ../src/common/exceptions.py:52 msgid "D-Bus is not present on this machine or python module is missing" msgstr "D-Bus auf diesem Computer nicht vorhanden oder das Python-Modul fehlt" -#: ../src/common/exceptions.py:46 +#: ../src/common/exceptions.py:60 msgid "" "Session bus is not available.\n" "Try reading http://trac.gajim.org/wiki/GajimDBus" -msgstr "Sitzungsbus ist nicht verfügbar.\"Bitte lesen Sie http://trac.gajim.org/wiki/GajimDBus (Englisch)" +msgstr "" +"Sitzungsbus ist nicht verfügbar.\"Bitte lesen Sie http://trac.gajim.org/wiki/" +"GajimDBus (Englisch)" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "one" msgstr "Eins" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "two" msgstr "Zwei" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "three" msgstr "Drei" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "four" msgstr "Vier" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "five" msgstr "Fünf" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "six" msgstr "Sechs" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "seven" msgstr "Sieben" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "eight" msgstr "Acht" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "nine" msgstr "Neun" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "ten" msgstr "Zehn" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "eleven" msgstr "Elf" -#: ../src/common/fuzzyclock.py:44 +#: ../src/common/fuzzyclock.py:49 msgid "twelve" msgstr "Zwölf" #. Strings to use for the output. %0 will be replaced with the preceding hour (e.g. "x PAST %0"), %1 with the coming hour (e.g. "x TO %1). ''' #. A "singular-form". It is used when talking about hour 0 -#: ../src/common/fuzzyclock.py:47 -#: ../src/common/fuzzyclock.py:55 +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 msgid "$0 o'clock" msgstr "%0 Uhr" -#: ../src/common/fuzzyclock.py:47 -#: ../src/common/fuzzyclock.py:55 +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 msgid "five past $0" msgstr "fünf nach %0" -#: ../src/common/fuzzyclock.py:48 -#: ../src/common/fuzzyclock.py:56 +#: ../src/common/fuzzyclock.py:53 ../src/common/fuzzyclock.py:61 msgid "ten past $0" msgstr "zehn nach %0" -#: ../src/common/fuzzyclock.py:48 -#: ../src/common/fuzzyclock.py:56 +#: ../src/common/fuzzyclock.py:53 ../src/common/fuzzyclock.py:61 msgid "quarter past $0" msgstr "viertel nach %0" -#: ../src/common/fuzzyclock.py:49 -#: ../src/common/fuzzyclock.py:57 +#: ../src/common/fuzzyclock.py:54 ../src/common/fuzzyclock.py:62 msgid "twenty past $0" msgstr "zwanzig nach %0" -#: ../src/common/fuzzyclock.py:49 -#: ../src/common/fuzzyclock.py:57 +#: ../src/common/fuzzyclock.py:54 ../src/common/fuzzyclock.py:62 msgid "twenty five past $0" msgstr "fünfundzwanzig nach %0" -#: ../src/common/fuzzyclock.py:50 -#: ../src/common/fuzzyclock.py:58 +#: ../src/common/fuzzyclock.py:55 ../src/common/fuzzyclock.py:63 msgid "half past $0" msgstr "dreißig nach %0" -#: ../src/common/fuzzyclock.py:50 -#: ../src/common/fuzzyclock.py:58 +#: ../src/common/fuzzyclock.py:55 ../src/common/fuzzyclock.py:63 msgid "twenty five to $1" msgstr "fünfundzwanzig vor %1" -#: ../src/common/fuzzyclock.py:51 -#: ../src/common/fuzzyclock.py:59 +#: ../src/common/fuzzyclock.py:56 ../src/common/fuzzyclock.py:64 msgid "twenty to $1" msgstr "zwanzig vor %1" -#: ../src/common/fuzzyclock.py:51 -#: ../src/common/fuzzyclock.py:59 +#: ../src/common/fuzzyclock.py:56 ../src/common/fuzzyclock.py:64 msgid "quarter to $1" msgstr "viertel vor %1" -#: ../src/common/fuzzyclock.py:52 -#: ../src/common/fuzzyclock.py:60 +#: ../src/common/fuzzyclock.py:57 ../src/common/fuzzyclock.py:65 msgid "ten to $1" msgstr "zehn vor %1" -#: ../src/common/fuzzyclock.py:52 -#: ../src/common/fuzzyclock.py:60 +#: ../src/common/fuzzyclock.py:57 ../src/common/fuzzyclock.py:65 msgid "five to $1" msgstr "fünf vor %1" -#: ../src/common/fuzzyclock.py:52 -#: ../src/common/fuzzyclock.py:61 +#: ../src/common/fuzzyclock.py:57 ../src/common/fuzzyclock.py:66 msgid "$1 o'clock" msgstr "%1 Uhr" -#: ../src/common/fuzzyclock.py:64 +#: ../src/common/fuzzyclock.py:69 msgid "Night" msgstr "Nacht" -#: ../src/common/fuzzyclock.py:64 +#: ../src/common/fuzzyclock.py:69 msgid "Early morning" msgstr "Früh Morgens" -#: ../src/common/fuzzyclock.py:64 +#: ../src/common/fuzzyclock.py:69 msgid "Morning" msgstr "Morgen" -#: ../src/common/fuzzyclock.py:64 +#: ../src/common/fuzzyclock.py:69 msgid "Almost noon" msgstr "Fast Mittag" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:70 msgid "Noon" msgstr "Mittag" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:70 msgid "Afternoon" msgstr "Nachmittag" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:70 msgid "Evening" msgstr "Abend" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:70 msgid "Late evening" msgstr "Später Abend" -#: ../src/common/fuzzyclock.py:67 +#: ../src/common/fuzzyclock.py:72 msgid "Start of week" msgstr "Anfang der Woche" -#: ../src/common/fuzzyclock.py:67 +#: ../src/common/fuzzyclock.py:72 msgid "Middle of week" msgstr "Mitte der Woche" -#: ../src/common/fuzzyclock.py:67 +#: ../src/common/fuzzyclock.py:72 msgid "End of week" msgstr "Ende der Woche" -#: ../src/common/fuzzyclock.py:68 +#: ../src/common/fuzzyclock.py:73 msgid "Weekend!" msgstr "Wochenende!" -#: ../src/common/helpers.py:114 +#: ../src/common/helpers.py:124 msgid "Invalid character in username." msgstr "Ungültiges Zeichen im Benutzernamen" -#: ../src/common/helpers.py:119 +#: ../src/common/helpers.py:129 msgid "Server address required." msgstr "Server-Adresse wird benötigt." -#: ../src/common/helpers.py:124 +#: ../src/common/helpers.py:134 msgid "Invalid character in hostname." msgstr "Ungültiges Zeichen in Hostname." -#: ../src/common/helpers.py:130 +#: ../src/common/helpers.py:140 msgid "Invalid character in resource." msgstr "Ungültiges Zeichen in Resource." #. GiB means gibibyte -#: ../src/common/helpers.py:170 +#: ../src/common/helpers.py:180 #, python-format msgid "%s GiB" msgstr "%s GiB" #. GB means gigabyte -#: ../src/common/helpers.py:173 +#: ../src/common/helpers.py:183 #, python-format msgid "%s GB" msgstr "%s GB" #. MiB means mibibyte -#: ../src/common/helpers.py:177 +#: ../src/common/helpers.py:187 #, python-format msgid "%s MiB" msgstr "%s MiB" #. MB means megabyte -#: ../src/common/helpers.py:180 +#: ../src/common/helpers.py:190 #, python-format msgid "%s MB" msgstr "%s MB" #. KiB means kibibyte -#: ../src/common/helpers.py:184 +#: ../src/common/helpers.py:194 #, python-format msgid "%s KiB" msgstr "%s KiB" #. KB means kilo bytes -#: ../src/common/helpers.py:187 +#: ../src/common/helpers.py:197 #, python-format msgid "%s KB" msgstr "%s kB" #. B means bytes -#: ../src/common/helpers.py:190 +#: ../src/common/helpers.py:200 #, python-format msgid "%s B" msgstr "%s B" -#: ../src/common/helpers.py:219 +#: ../src/common/helpers.py:231 msgid "_Busy" msgstr "_Beschäftigt" -#: ../src/common/helpers.py:221 +#: ../src/common/helpers.py:233 msgid "Busy" msgstr "Beschäftigt" -#: ../src/common/helpers.py:224 +#: ../src/common/helpers.py:236 msgid "_Not Available" msgstr "_Nicht verfügbar" -#: ../src/common/helpers.py:229 +#: ../src/common/helpers.py:241 msgid "_Free for Chat" msgstr "_Frei zum Chatten" -#: ../src/common/helpers.py:231 +#: ../src/common/helpers.py:243 msgid "Free for Chat" msgstr "Frei zum Chatten" -#: ../src/common/helpers.py:234 +#: ../src/common/helpers.py:246 msgid "_Available" msgstr "_Angemeldet" -#: ../src/common/helpers.py:236 -msgid "Available" -msgstr "Angemeldet" - -#: ../src/common/helpers.py:238 +#: ../src/common/helpers.py:250 msgid "Connecting" msgstr "Verbinde" -#: ../src/common/helpers.py:241 +#: ../src/common/helpers.py:253 msgid "A_way" msgstr "Ab_wesend" -#: ../src/common/helpers.py:246 +#: ../src/common/helpers.py:258 msgid "_Offline" msgstr "A_bgemeldet" -#: ../src/common/helpers.py:248 +#: ../src/common/helpers.py:260 msgid "Offline" msgstr "Abgemeldet" -#: ../src/common/helpers.py:251 +#: ../src/common/helpers.py:263 msgid "_Invisible" msgstr "_Unsichtbar" -#: ../src/common/helpers.py:257 +#: ../src/common/helpers.py:269 msgid "?contact has status:Unknown" msgstr "Unbekannt" -#: ../src/common/helpers.py:259 +#: ../src/common/helpers.py:271 msgid "?contact has status:Has errors" msgstr "Hat Fehler" -#: ../src/common/helpers.py:264 +#: ../src/common/helpers.py:276 msgid "?Subscription we already have:None" msgstr "Keine" -#: ../src/common/helpers.py:266 +#: ../src/common/helpers.py:278 msgid "To" msgstr "An" -#: ../src/common/helpers.py:270 +#: ../src/common/helpers.py:282 msgid "Both" msgstr "Beide" -#: ../src/common/helpers.py:278 +#: ../src/common/helpers.py:290 msgid "?Ask (for Subscription):None" msgstr "Keine" -#: ../src/common/helpers.py:280 +#: ../src/common/helpers.py:292 msgid "Subscribe" msgstr "Abonnieren" -#: ../src/common/helpers.py:289 +#: ../src/common/helpers.py:301 msgid "?Group Chat Contact Role:None" msgstr "Keine" -#: ../src/common/helpers.py:292 +#: ../src/common/helpers.py:304 msgid "Moderators" msgstr "Moderatoren" -#: ../src/common/helpers.py:294 +#: ../src/common/helpers.py:306 msgid "Moderator" msgstr "Moderator" -#: ../src/common/helpers.py:297 +#: ../src/common/helpers.py:309 msgid "Participants" msgstr "Teilnehmer" -#: ../src/common/helpers.py:299 +#: ../src/common/helpers.py:311 msgid "Participant" msgstr "Teilnehmer" -#: ../src/common/helpers.py:302 +#: ../src/common/helpers.py:314 msgid "Visitors" msgstr "Besucher" -#: ../src/common/helpers.py:304 +#: ../src/common/helpers.py:316 msgid "Visitor" msgstr "Besucher" -#: ../src/common/helpers.py:310 +#: ../src/common/helpers.py:322 msgid "?Group Chat Contact Affiliation:None" msgstr "?Gruppenchat Kontaktverbindung:Keine" -#: ../src/common/helpers.py:312 +#: ../src/common/helpers.py:324 msgid "Owner" msgstr "Besitzer" -#: ../src/common/helpers.py:314 +#: ../src/common/helpers.py:326 msgid "Administrator" msgstr "Administrator" -#: ../src/common/helpers.py:316 +#: ../src/common/helpers.py:328 msgid "Member" msgstr "Mitglied" -#: ../src/common/helpers.py:355 +#: ../src/common/helpers.py:367 msgid "is paying attention to the conversation" msgstr "beobachtet diese Unterhaltung" -#: ../src/common/helpers.py:357 +#: ../src/common/helpers.py:369 msgid "is doing something else" msgstr "tut etwas anderes" -#: ../src/common/helpers.py:359 +#: ../src/common/helpers.py:371 msgid "is composing a message..." msgstr "schreibt im Moment" #. paused means he or she was composing but has stopped for a while -#: ../src/common/helpers.py:362 +#: ../src/common/helpers.py:374 msgid "paused composing a message" msgstr "macht gerade eine Schreibpause" -#: ../src/common/helpers.py:364 +#: ../src/common/helpers.py:376 msgid "has closed the chat window or tab" msgstr "hat das Chatfenster oder den Tab geschlossen" -#: ../src/common/helpers.py:890 +#: ../src/common/helpers.py:947 ../src/common/helpers.py:954 #, python-format -msgid " %d unread message" -msgid_plural " %d unread messages" -msgstr[0] " %d ungelesene Nachricht" -msgstr[1] " %d ungelesene Nachrichten" +msgid "%d message pending" +msgid_plural "%d messages pending" +msgstr[0] "%d Nachricht schwebend" +msgstr[1] "%d Nachrichten schwebend" -#: ../src/common/helpers.py:896 +#: ../src/common/helpers.py:960 #, python-format -msgid " %d unread single message" -msgid_plural " %d unread single messages" -msgstr[0] " %d ungelesene Einzel-Nachricht" -msgstr[1] " %d ungelesene Einzel-Nachrichten" +msgid " from room %s" +msgstr "Von Gruppenchat %s" -#: ../src/common/helpers.py:902 +#: ../src/common/helpers.py:963 ../src/common/helpers.py:982 #, python-format -msgid " %d unread group chat message" -msgid_plural " %d unread group chat messages" -msgstr[0] " %d ungelesene Gruppenchat-Nachricht" -msgstr[1] " %d ungelesene Gruppenchat-Nachrichten" +msgid " from user %s" +msgstr "Von Benutzer %s" -#: ../src/common/helpers.py:908 +#: ../src/common/helpers.py:965 #, python-format -msgid " %d unread private message" -msgid_plural " %d unread private messages" -msgstr[0] " %d ungelesene private Nachricht" -msgstr[1] " %d ungelesene private Nachrichten" +msgid " from %s" +msgstr "Von %s" -#: ../src/common/helpers.py:918 -#: ../src/common/helpers.py:920 +#: ../src/common/helpers.py:972 ../src/common/helpers.py:979 +#, python-format +msgid "%d event pending" +msgid_plural "%d events pending" +msgstr[0] "%d Ereignis anstehend" +msgstr[1] "%d Ereignisse anstehend" + +#: ../src/common/helpers.py:1012 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" #. we talk about a file -#: ../src/common/optparser.py:59 +#: ../src/common/optparser.py:65 #, python-format msgid "error: cannot open %s for reading" msgstr "Fehler: %s kann nicht zum Lesen geöffnet werden" -#: ../src/common/optparser.py:181 -msgid "gtk+" -msgstr "gtk+" - -#: ../src/common/optparser.py:190 -#: ../src/common/optparser.py:191 +#: ../src/common/optparser.py:215 ../src/common/optparser.py:216 msgid "cyan" msgstr "cyan" -#: ../src/common/optparser.py:308 +#: ../src/common/optparser.py:332 msgid "migrating logs database to indices" msgstr "migriere Logdatenbank zu Indices" -#: ../src/common/passwords.py:82 +#: ../src/common/passwords.py:88 #, python-format msgid "Gajim account %s" msgstr "Gajim-Konto %s" -#: ../src/common/zeroconf/client_zeroconf.py:189 -msgid "Connection to host could not be established: Incorrect answer from server." -msgstr "Verbindung zum Host konnte nicht aufgebaut werden: Fehlerhafte Antwort vom Server." - -#: ../src/common/zeroconf/client_zeroconf.py:205 +#: ../src/common/zeroconf/client_zeroconf.py:149 +#: ../src/common/zeroconf/client_zeroconf.py:232 msgid "Connection to host could not be established" msgstr "Verbindung zu Host konnte nicht hergestellt werden" -#: ../src/common/zeroconf/client_zeroconf.py:339 -msgid "Connection to host could not be established: Timeout while sending data." -msgstr "Verbindung zum Host konnte nicht hergestellt werden: Zeitüberschreitung beim Senden von Daten." +#: ../src/common/zeroconf/client_zeroconf.py:206 +msgid "" +"Connection to host could not be established: Incorrect answer from server." +msgstr "" +"Verbindung zum Host konnte nicht aufgebaut werden: Fehlerhafte Antwort vom " +"Server." -#: ../src/common/zeroconf/client_zeroconf.py:632 +#: ../src/common/zeroconf/client_zeroconf.py:366 +msgid "" +"Connection to host could not be established: Timeout while sending data." +msgstr "" +"Verbindung zum Host konnte nicht hergestellt werden: Zeitüberschreitung beim " +"Senden von Daten." + +#: ../src/common/zeroconf/client_zeroconf.py:652 msgid "Contact is offline. Your message could not be sent." msgstr "Kontakt ist offline. Ihre Nachricht konnte nicht versendet werden." -#: ../src/common/zeroconf/connection_zeroconf.py:197 -msgid "To continue sending and receiving messages, you will need to reconnect." -msgstr "Um weiterhin Nachrichten Senden und Empfangen zu können, müssen Sie sich erneut verbinden." +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:243 +#, python-format +msgid "" +"The host %s you configured as the ft_add_hosts_to_send advanced option is " +"not valid, so ignored." +msgstr "" +"Der Host %s, den Sie für die erweiterte Option ft_override_host_to_send " +"angeben haben ist ungültig und wird ignoriert." -#: ../src/common/zeroconf/connection_zeroconf.py:207 +#: ../src/common/zeroconf/connection_zeroconf.py:210 +msgid "To continue sending and receiving messages, you will need to reconnect." +msgstr "" +"Um weiterhin Nachrichten Senden und Empfangen zu können, müssen Sie sich " +"erneut verbinden." + +#: ../src/common/zeroconf/connection_zeroconf.py:233 msgid "Avahi error" msgstr "Avahi-Fehler" -#: ../src/common/zeroconf/connection_zeroconf.py:207 +#: ../src/common/zeroconf/connection_zeroconf.py:233 #, python-format msgid "" "%s\n" @@ -6561,233 +7873,567 @@ msgstr "" "%s\n" "Lokaler Nachrichtenversand funktioniert eventuell nicht richtig." -#: ../src/common/zeroconf/connection_zeroconf.py:218 +#: ../src/common/zeroconf/connection_zeroconf.py:244 msgid "Please check if Avahi is installed." msgstr "Bitte überprüfen Sie, ob Avahi installiert ist." -#: ../src/common/zeroconf/connection_zeroconf.py:227 -#: ../src/common/zeroconf/connection_zeroconf.py:231 +#: ../src/common/zeroconf/connection_zeroconf.py:253 +#: ../src/common/zeroconf/connection_zeroconf.py:257 msgid "Could not start local service" msgstr "Lokaler Dienst konnte nicht gestartet werden" -#: ../src/common/zeroconf/connection_zeroconf.py:228 +#: ../src/common/zeroconf/connection_zeroconf.py:254 #, python-format msgid "Unable to bind to port %d." msgstr "Konnte nicht mit Port %d verbinden." -#: ../src/common/zeroconf/connection_zeroconf.py:232 -#: ../src/common/zeroconf/connection_zeroconf.py:325 +#: ../src/common/zeroconf/connection_zeroconf.py:258 +#: ../src/common/zeroconf/connection_zeroconf.py:353 msgid "Please check if avahi-daemon is running." msgstr "Bitte überprüfen Sie, ob avahi-daemon läuft." -#: ../src/common/zeroconf/connection_zeroconf.py:324 +#: ../src/common/zeroconf/connection_zeroconf.py:352 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Der Status des Kontos \"%s\" konnte nicht geändert werden." -#: ../src/common/zeroconf/connection_zeroconf.py:341 -msgid "You are not connected or not visible to others. Your message could not be sent." -msgstr "Sie sind nicht verbunden oder für andere nicht sichtbar. Ihre Nachricht konnte nicht versendet werden." +#: ../src/common/zeroconf/connection_zeroconf.py:369 +msgid "" +"You are not connected or not visible to others. Your message could not be " +"sent." +msgstr "" +"Sie sind nicht verbunden oder für andere nicht sichtbar. Ihre Nachricht " +"konnte nicht versendet werden." #. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:353 +#: ../src/common/zeroconf/connection_zeroconf.py:381 msgid "[This message is encrypted]" msgstr "[Diese Nachricht ist verschlüsselt]" -#: ../src/common/zeroconf/zeroconf.py:180 +#: ../src/common/zeroconf/zeroconf_avahi.py:183 +#: ../src/common/zeroconf/zeroconf_bonjour.py:194 #, python-format msgid "Error while adding service. %s" msgstr "Fehler beim Hinzufügen des Dienstes. %s" +#, fuzzy +#~ msgid "Select the account with which to synchronise" +#~ msgstr "JID des Kontakts mit dem Sie chatten möchten" + +#~ msgid "Save passphrase" +#~ msgstr "Passphrase speichern" + +#~ msgid "" +#~ "To continue, Gajim needs to access your stored secrets. Enter your " +#~ "passphrase" +#~ msgstr "" +#~ "Um fortzufahren benötigt Gajim Zugriff auf Ihre gespeicherten Passwörter. " +#~ "Geben Sie Ihre Passphrase ein" + +#, fuzzy +#~ msgid "Confirm Passphrase" +#~ msgstr "Falsche Passphrase" + +#, fuzzy +#~ msgid "Enter your new passphrase again for confirmation" +#~ msgstr "Erneut eingeben zur Bestätigung:" + +#, fuzzy +#~ msgid "Create Passphrase" +#~ msgstr "Passphrase speichern" + +#~ msgid "Passphrases did not match.\n" +#~ msgstr "Passwörter stimmen nicht überein.\n" + +#~ msgid "Gajim needs you to create a passphrase to encrypt stored secrets" +#~ msgstr "" +#~ "Sie müssen eine Passphrase angeben um Ihre gespeicherten Passwörter zu " +#~ "verschlüsseln" + +#~ msgid "Invite _Friends" +#~ msgstr "_Freunde einladen" + +#~ msgid "Build custom query" +#~ msgstr "Personalisierte Anfrage bauen" + +#~ msgid "" +#~ "Enter a contact jid or MUC jid here to view its history.\n" +#~ "If a contact is connected you can even enter his nick name.\n" +#~ msgstr "" +#~ "Geben Sie hier eine JID ein, im ihren Verlauf anzusehen.\n" +#~ "Wenn ein Kontakt eingeloggt ist, können Sie sogar seinen Spitznamen " +#~ "eingeben.\n" + +#~ msgid "Query Builder..." +#~ msgstr "Anfrage-Baukasten ..." + +#~ msgid "%s does not appear to be a valid JID" +#~ msgstr "%s scheint keine gültige JID zu sein" + +#~ msgid "_Discover Services..." +#~ msgstr "_Durchsuche Dienste..." + +#~ msgid "_Retype Password:" +#~ msgstr "Passwort e_rneut eingeben:" + +#~ msgid "_Use proxy" +#~ msgstr "_Proxy benutzen" + +#~ msgid "Accounts" +#~ msgstr "Konten" + +#~ msgid "" +#~ "If checked, all local contacts that use a Bonjour compatible chat client " +#~ "(like iChat, Trillian or Gaim) will be shown in roster. You don't need to " +#~ "be connected to a jabber server for it to work.\n" +#~ "This is only available if python-avahi is installed and avahi-daemon is " +#~ "running." +#~ msgstr "" +#~ "Wenn aktiviert, werden alle lokalen Kontakte, welche einen zu Bonjour " +#~ "kompatiblen Chat-Client (Wie z.B. iChat, Trillian oder Gaim) nutzen, in " +#~ "Ihrer Kontaktliste angezeigt. Dafür müssen Sie nicht mit einem Jabber-" +#~ "Server verbunden sein.\n" +#~ "Dies ist nur möglich, wenn python-avahi verfügbar ist und avahi-daemon " +#~ "läuft (Automatische Diensterkennung)." + +#~ msgid "" +#~ "If you have 2 or more accounts and this is checked, Gajim will list all " +#~ "contacts as if you had one account" +#~ msgstr "" +#~ "Wenn Sie zwei oder mehr Konten haben und diese Option gewählt ist, wird " +#~ "Gajim alle Kontakte auflisten, als hätten Sie nur ein Konto" + +#~ msgid "_Enable link-local messaging" +#~ msgstr "_Kontakte im LAN anzeigen" + +#~ msgid "_Modify" +#~ msgstr "_Ändern" + +#~ msgid "_Compact View Alt+C" +#~ msgstr "_Kompakte Ansicht Alt+C" + +#~ msgid "Interface Customization" +#~ msgstr "Benutzerdefiniertes Aussehen" + +#~ msgid "Also known as iChat style" +#~ msgstr "Auch als iChat-Stil bekannt" + +#~ msgid "Chat" +#~ msgstr "Chat" + +#~ msgid "E_very 5 minutes" +#~ msgstr "Alle 5 _Minuten" + +#~ msgid "" +#~ "Gajim will automatically show new events by popping up the relevant window" +#~ msgstr "" +#~ "Gajim wird neue Ereignisse automatisch anzeigen, indem das betreffende " +#~ "Fenster geöffnet wird" + +#~ msgid "" +#~ "Gajim will notify you for new events via a popup in the bottom right of " +#~ "the screen" +#~ msgstr "" +#~ "Gajim wird Sie über neue Ereignisse mit einem Popup in der rechten " +#~ "unteren Ecke des Bildschirms benachrichtigen" + +#~ msgid "" +#~ "Gajim will notify you via a popup window in the bottom right of the " +#~ "screen about contacts that just signed in" +#~ msgstr "" +#~ "Gajim wird Sie über ein Popup-Fenster in der rechten unteren Ecke des " +#~ "Bildschirmes über Kontakte informieren, die sich gerade angemeldet haben" + +#~ msgid "" +#~ "Gajim will only change the icon of the contact that triggered the new " +#~ "event" +#~ msgstr "" +#~ "Gajim wird nur das Symbol des Kontaktes ändern, von dem die neue " +#~ "Nachricht kommt" + +#~ msgid "" +#~ "If checked, Gajim will remember the roster and chat window positions in " +#~ "the screen and the sizes of them next time you run it" +#~ msgstr "" +#~ "Wenn aktiviert, erinnert sich Gajim an die Position und Größe der " +#~ "Kontaktliste auf dem Bildschirm beim nächsten Start" + +#~ msgid "On every _message" +#~ msgstr "In jeder _Zeile" + +#~ msgid "Outgoing Chat state noti_fications:" +#~ msgstr "_Sende Chatstatus:" + +#~ msgid "Print time:" +#~ msgstr "Zeit anzeigen:" + +#~ msgid "Save _position and size for roster and chat windows" +#~ msgstr "Speichere _Position und Größe der Kontaktliste und Chatfenster" + +#~ msgid "Show only in _roster" +#~ msgstr "Nur in der _Kontaktliste anzeigen" + +#~ msgid "Use t_rayicon (aka. notification area icon)" +#~ msgstr "Verwende _Trayicon (Benachrichtigungs-Icon)" + +#~ msgid "" +#~ "When a new event (message, file transfer request etc..) is received, the " +#~ "following methods may be used to inform you about it. Please note that " +#~ "events about new messages only occur if it is a new message from a " +#~ "contact you are not already chatting with" +#~ msgstr "" +#~ "Wenn ein neues Ereignis (Nachricht, Dateitransferanfrage usw.) empfangen " +#~ "wird, können die folgenden Methoden zur Benachrichtigung verwendet " +#~ "werden. Bitte beachten Sie, dass Ereignisse über neue Nachrichten nur " +#~ "auftreten, wenn Sie eine Nachricht von einem Kontakt erhalten, mit dem " +#~ "Sie nicht bereits chatten" + +#~ msgid "_Never" +#~ msgstr "_Nie" + +#~ msgid "_Notify me about it" +#~ msgstr "Be_nachrichtigen" + +#~ msgid "_Pop it up" +#~ msgstr "_Öffnen" + +#~ msgid "_Remove from Roster" +#~ msgstr "Entfernen von _Kontaktliste" + +#~ msgid "_Filter:" +#~ msgstr "_Filter:" + +#~ msgid "" +#~ "If that is not your language for which you want to highlight misspelled " +#~ "words, then please set your $LANG as appropriate. Eg. for French do " +#~ "export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to " +#~ "make it global in /etc/profile.\n" +#~ "\n" +#~ "Highlighting misspelled words feature will not be used" +#~ msgstr "" +#~ "Wenn das nicht die Sprache ist, für die Sie falschgeschriebene Wörter " +#~ "hervorheben möchten, setzen Sie bitte Ihre $LANG entsprechend. Z.B. für " +#~ "Französisch: export LANG=fr_FR oder export LANG=fr_FR.UTF-8 in ~/." +#~ "bash_profile or global in /etc/profile.\n" +#~ "\n" +#~ "Falschgeschriebene Wörter werden nicht hervorgehoben" + +#~ msgid "Every %s _minutes" +#~ msgstr "Alle %s _Minuten" + +#~ msgid "You must enter a password for the new account." +#~ msgstr "Sie müssen ein Passwort für das neue Konto eingeben." + +#~ msgid "Drop %s in group %s" +#~ msgstr "Setze %s in Gruppe %s" + +#~ msgid "Make %s and %s metacontacts" +#~ msgstr "Mache %s und %s Metakontakte" + +#~ msgid "Hides the buttons in two persons chat window." +#~ msgstr "Versteckt die Knöpfe im Zwei-Personen-Chatfenster" + +#~ msgid "Security error connecting to \"%s\"" +#~ msgstr "Konnte nicht mit %s verbinden" + +#~ msgid "" +#~ "The server's key has changed, or someone is trying to hack your " +#~ "connection." +#~ msgstr "" +#~ "Der Schlüssel des Servers wurde geändert oder jemand versucht ihre " +#~ "Verbindung zu hacken." + +#~ msgid "Unable to check fingerprint for %s. Connection could be insecure." +#~ msgstr "" +#~ "Konnte Fingerabdruck von %s nicht überprüfen. Die Verbindung ist " +#~ "möglicherweise unsicher." + +#~ msgid "Missing fingerprint in SSL connection to %s" +#~ msgstr "Fehlender Fingerabdruck in der SSL-Verbindung zu %s" + +#~ msgid "Fingerprint mismatch for %s: Got %s, expected %s" +#~ msgstr "Fingerabdruck von %s stimmt nicht überein: Erhalten %s, erwartet %s" + +#~ msgid " %d unread single message" +#~ msgid_plural " %d unread single messages" +#~ msgstr[0] " %d ungelesene Einzel-Nachricht" +#~ msgstr[1] " %d ungelesene Einzel-Nachrichten" + +#~ msgid " %d unread group chat message" +#~ msgid_plural " %d unread group chat messages" +#~ msgstr[0] " %d ungelesene Gruppenchat-Nachricht" +#~ msgstr[1] " %d ungelesene Gruppenchat-Nachrichten" + +#~ msgid " %d unread private message" +#~ msgid_plural " %d unread private messages" +#~ msgstr[0] " %d ungelesene private Nachricht" +#~ msgstr[1] " %d ungelesene private Nachrichten" + +#~ msgid "gtk+" +#~ msgstr "gtk+" + #~ msgid "Private Chat" #~ msgstr "Privater Chat" + #~ msgid "Group Chat" #~ msgstr "Gruppenchat" + #~ msgid "invisible" #~ msgstr "unsichtbar" + #~ msgid "offline" #~ msgstr "abgemeldet" + #~ msgid "I'm %s" #~ msgstr "Ich bin %s" + #~ msgid "2003-12-13T18:30:02Z" #~ msgstr "2003-12-13T18:30:02Z" + #~ msgid "Romeo and Juliet" #~ msgstr "Romeo und Julia" + #~ msgid "Old stories" #~ msgstr "Alte Geschichten" + #~ msgid "Soliloquy" #~ msgstr "Selbstgespräch" + #~ msgid "A_fter nickname:" #~ msgstr "Nach dem Spit_znamen:" + #~ msgid "B_efore nickname:" #~ msgstr "Vor d_em Spitznamen:" + #~ msgid "_After time:" #~ msgstr "_Nach der Zeit:" + #~ msgid "_Before time:" #~ msgstr "_Vor der Zeit:" + #~ msgid "_Publish" #~ msgstr "_Veröffentlichen" + #~ msgid "_Retrieve" #~ msgstr "Ab_rufen" + #~ msgid "Information published" #~ msgstr "Informationen veröffentlicht" + #~ msgid "Without a connection, you can not get your contact information." #~ msgstr "Sie müssen angemeldet sein, um Kontakt-Informationen abzurufen" + #~ msgid "This is result of query." #~ msgstr "Dies ist das Ergebnis der Anfrage." + #~ msgid "Edit items on the list" #~ msgstr "Bearbeite Punkte auf der Liste" + #~ msgid "Receive a Message" #~ msgstr "Nachricht empfangen" + #~ msgid "Role: " #~ msgstr "Rolle:" -#~ msgid "Affiliation: " -#~ msgstr "Zugehörigkeit: " + #~ msgid "" #~ "Sound to play when any MUC message arrives. (This setting is taken into " #~ "account only if notify_on_all_muc_messages is True)" #~ msgstr "" #~ "Abzuspielender Ton, falls eine MUC-Nachricht ankommt. (Diese Einstellung " #~ "wirdnur beachtet, wenn notify_on_all_muc_messages aktiviert ist)" + #~ msgid "Create your own Privacy Lists" #~ msgstr "Erstelle eigene Privatliste" + #~ msgid "Server-based Privacy Lists" #~ msgstr "Server-basierte Privatliste" + #~ msgid "Contact _Info" #~ msgstr "Kontakt-_Info" + #~ msgid "Jabber ID" #~ msgstr "Jabber-ID" + #~ msgid "User ID" #~ msgstr "Benutzer-ID" + #~ msgid "Invalid room or server name" #~ msgstr "Ungültiger Raum oder Servername" + #~ msgid "Unknown D-Bus version: %s" #~ msgstr "Unbekannte D-BUS-Version: %s" + #~ msgid "vCard publication succeeded" #~ msgstr "vCard erfolgreich veröffentlicht" + #~ msgid "Your personal information has been published successfully." #~ msgstr "Ihre persönlichen Informationen wurden erfolgreich veröffentlicht." + #~ msgid "Gajim - %d unread message" #~ msgid_plural "Gajim - %d unread messages" #~ msgstr[0] "Gajim - %d ungelesene Nachricht" #~ msgstr[1] "Gajim - %d ungelesene Nachrichten" + #~ msgid "Since %s" #~ msgstr "Seit %s" + #~ msgid "Personal details" #~ msgstr "Persönliche Details" + #~ msgid "Be right back" #~ msgstr "Bin gleich zurück" + #~ msgid "Jabber" #~ msgstr "Jabber" + #~ msgid "Migrating Logs..." #~ msgstr "Migriere Logs ..." + #~ msgid "Automatically authorize contact" #~ msgstr "Kontakt automatisch autorisieren" + #~ msgid "Send File" #~ msgstr "Datei Senden" + #~ msgid "Underline" #~ msgstr "Unterstreichen" + #~ msgid "_Join New Room..." #~ msgstr "_Neuen Raum betreten..." -#~ msgid "Usage: /%s, sets the groupchat window to compact mode." -#~ msgstr "Bedienung: /%s, stellt das Gruppenchat-Fenster auf Kompaktmodus." + #~ msgid "Please modify your special notification below" #~ msgstr "Bitte wählen Sie eine der Optionen:" + #~ msgid "Delete Message of the Day" #~ msgstr "Lösche Nachricht des Tages" -#~ msgid "I want a notification popup:" -#~ msgstr "Sende Statusbenachrichtigungen:" + #~ msgid "I want to listen to:" #~ msgstr "%s möchte ihnen eine Datei senden:" + #~ msgid "Send _New Message..." #~ msgstr "Sende _neue Nachricht..." + #~ msgid "Set Message of the Day" #~ msgstr "Setze Message of the Day" + #~ msgid "Update Message of the Day" #~ msgstr "Aktualisiere Nachricht des Tages (MOTD)" + #~ msgid "_XML Console..." #~ msgstr "_XML Konsole..." -#~ msgid "Choose Avatar" -#~ msgstr "Avatar auswählen" + #~ msgid "Use compact view when you open a chat window" #~ msgstr "Kompaktansicht verwenden, wenn Sie ein Chatfenster öffnen" + #~ msgid "Use compact view when you open a group chat window" #~ msgstr "Verwende Kompaktansicht wenn ein Gruppenchat-Fenster geöffnet wird" + #~ msgid "plain" #~ msgstr "plain" + #~ msgid "Send" #~ msgstr "Senden" + #~ msgid "%(nickname)s in room %(room_name)s has sent you a new message." #~ msgstr "" #~ "%(nickname)s im Raum %(room_name)s hat Ihnen eine neue Nachricht gesendet." + #~ msgid "%s has sent you a new message." #~ msgstr "%s hat Ihnen eine neue Nachricht gesendet." + #~ msgid "GUI Migration failed" #~ msgstr "vCard Veröffentlichung fehlgeschlagen" + #~ msgid "Logs have been successfully migrated to the database." #~ msgstr "Logs wurden erfolgreich in die Datenbank migriert." + #~ msgid "If checked, Gajim will also have a trayicon" #~ msgstr "Wenn aktiviert, wird Gajim ein Tray-Symbol verwenden" + #~ msgid "Start Chat with Contact" #~ msgstr "Starte Chat mit Account %s" + #~ msgid "All contacts in this group are offline or have errors" #~ msgstr "Alle Kontakte dieser Gruppe sind abgemeldet oder haben Fehler" + #~ msgid "Size: " #~ msgstr "Größe: " + #~ msgid "Session bus is not available" #~ msgstr "Session-Bus nicht verfügbar" + #~ msgid "Sound" #~ msgstr "Sound" + #~ msgid "Image" #~ msgstr "Bild" -#~ msgid "From %s" -#~ msgstr "Von %s" + #~ msgid "To %s" #~ msgstr "An %s" + #~ msgid "You have been invited to the %(room_jid)s room by %(contact_jid)s" #~ msgstr "Sie wurden in den Raum %(room_jid)s von %(contact_jid)s eingeladen" + #~ msgid "Manage Emoticons" #~ msgstr "Emoticons anpassen" + #~ msgid "Or choose a preset message:" #~ msgstr "Oder wählen Sie eine voreingestellte Nachricht:" + #~ msgid "Use _emoticons" #~ msgstr "_Emoticons verwenden" + #~ msgid "_Set Image..." #~ msgstr "_Bild wählen..." + #~ msgid "Switch to %s" #~ msgstr "Wechseln zu %s" + #~ msgid "using account " #~ msgstr "mit Konto" + #~ msgid "The filesize of image \"%s\" is too large" #~ msgstr "Die Dateigröße des Bildes \"%s\" ist zu groß" + #~ msgid "The file must not be more than 32 kilobytes." #~ msgstr "Die Datei darf nicht größer als 32 Kilobytes sein." + #~ msgid "Timeout" #~ msgstr "Timeout" + #~ msgid "account: " #~ msgstr "Konto: " + #~ msgid "Are you sure you want to leave rooms \"%s\"?" #~ msgstr "Möchten Sie die Räume \"%s\" wirklich verlassen?" + #~ msgid "If you close this window, you will be disconnected from these rooms." #~ msgstr "" #~ "Wenn Sie dieses Fenster schließen, wird die Verbindung mit diesen Räumen " #~ "abgebrochen." + #~ msgid "Activate/Disable notification for when a file transfer is complete" #~ msgstr "Benachrichtigung für beendete Dateitransfers ein/ausschalten" + #~ msgid "Removing selected file transfer" #~ msgstr "Ausgewählten Dateitransfer entfernen" + #~ msgid "Stoping selected file transfer" #~ msgstr "Bricht den ausgewählten Dateitransfer ab" + #~ msgid "" #~ "If you close this tab and you have history disabled, the message will be " #~ "lost." #~ msgstr "" #~ "Wenn Sie diesen Reiter schließen und die History abgeschaltet haben, ist " #~ "die Nachricht verloren." + #~ msgid "Cannot remove last group" #~ msgstr "Letzte Gruppe kann nicht entfernt werden" + #~ msgid "At least one contact group must be present." #~ msgstr "Mindestens eine Gruppe wird benötigt." + #~ msgid "" #~ "pysqlite2 (aka python-pysqlite2) dependency is missing. After you install " #~ "pysqlite3, if you want to migrate your logs to the new database, please " @@ -6797,47 +8443,64 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ "Sie pysqlite2installiert haben, wenn Sie Ihre Logs in die neue Datenbank " #~ "migrieren möchte, lesen Siebitte: http://trac.gajim.org/wiki/" #~ "MigrateLogToDot9DB Beende ..." -#~ msgid "Image is too big" -#~ msgstr "Das Bild ist zu groß" + #~ msgid "" #~ "Image for emoticon has to be less than or equal to 24 pixels in width and " #~ "24 in height." #~ msgstr "" #~ "Das Bild darf eine Höhe und Breite von je 24 Pixeln nicht überschreiten." + #~ msgid "Changes in latest version" #~ msgstr "Änderungen in der neuesten Version" + #~ msgid "Check for new _version on Gajim startup" #~ msgstr "Beim Start von Gajim auf neue _Versionen prüfen" + #~ msgid "Log history" #~ msgstr "Log-Verlauf" + #~ msgid "New version of Gajim available" #~ msgstr "Es ist eine neue Version von Gajim verfügbar" + #~ msgid "Open Download Page" #~ msgstr "Download-Seite öffnen" + #~ msgid "(%s/s)" #~ msgstr "(%s/s)" + #~ msgid "Session bus is not available." #~ msgstr "Session-Bus nicht verfügbar." + #~ msgid "with account " #~ msgstr "Konto: " + #~ msgid "Chat with" #~ msgstr "Unterhalten mit" + #~ msgid "as %s" #~ msgstr "als %s" + #~ msgid "as " #~ msgstr "als " + #~ msgid "Send _New Message" #~ msgstr "Sende _neue Nachricht" + #~ msgid "Re_quest Authorization from" #~ msgstr "Autorisierung anfordern" + #~ msgid "Send Authorization to" #~ msgstr "Autorisierung senden" + #~ msgid "Log" #~ msgstr "Log" + #~ msgid "Log presences in _contact's log file" #~ msgstr "Anwesenheit in _Kontakt-Logdateien schreiben" + #~ msgid "Log presences in an _external file" #~ msgstr "Anwesenheit in eine _externe Datei speichern" + #~ msgid "" #~ "You can set advanced account options by pressing Advanced button,or later " #~ "by clicking in Accounts menuitem under Edit menu from the main window." @@ -6845,12 +8508,14 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ "Sie können die erweiterten Konten-Optionen durch Klicken des Erweitert-" #~ "Buttons erreichen, oder später durch klicken des Konten Menüitems im " #~ "Bearbeiten-Menü." + #~ msgid "" #~ "Set value of 'key' to 'value'. If there is no such key, new item in the " #~ "preferences is inserted." #~ msgstr "" #~ "Setze den Wert von 'key' auf 'value'. Wenn kein solcher key existiert " #~ "wirdeine neuer Wert in den Einstellungen erstellt." + #~ msgid "" #~ "When a new message is received which is not from a contact already in a " #~ "chat window, the three following actions may happen in order for you to " @@ -6859,20 +8524,28 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ "Wenn eine neue Nachricht von einem neuen Kontakt in einem Chatfenster " #~ "empfangen wird, können die drei folgenden Aktionen ausgeführt werden, um " #~ "Sie darüber zu informieren" + #~ msgid "_Earliest" #~ msgstr "_Erste" + #~ msgid "_Latest" #~ msgstr "_Letzte" + #~ msgid "_Previous" #~ msgstr "_Vorherige" + #~ msgid "Filter query too short" #~ msgstr "Filteranfrage zu kurz" + #~ msgid "Query must be at least 3 characters long." #~ msgstr "Anfrage muss wenigstens 3 Zeichen lang sein." + #~ msgid "%s is now %s: %s" #~ msgstr "%s ist jetzt %s (%s)" + #~ msgid "Allow controlling Gajim via D-Bus service." #~ msgstr "Erlaube die Steuerung von Gajim mit dem D-Bus Dienst." + #~ msgid "" #~ "\n" #~ "\n" @@ -6885,6 +8558,7 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ "\n" #~ "== Originalnachricht ==\n" #~ "%s" + #~ msgid "" #~ "Your new account has been created successfully.\n" #~ "You can set advanced account options by pressing Advanced button,\n" @@ -6893,6 +8567,7 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ msgstr "" #~ "Konto wurde erfolgreich hinzugefügt.\n" #~ "Erweiterte Optionen sind über \"Ändern->Konten\" zu erreichen." + #~ msgid "" #~ "When we remove a contact, remove both his and our subscription, so we do " #~ "not receive his presence anymore and he ours." @@ -6900,18 +8575,17 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ "Wenn wir einen Kontakt entfernen, lösche sowohl sein als auch unser " #~ "Abonnement, damitwir nicht mehr gegenseitig über die Präsenz informiert " #~ "werden" + #~ msgid "" #~ "Should Gajim send inactive (\"is doing something else\") on just focus " #~ "out of window/switch to another tab?" #~ msgstr "" #~ "Soll Gajim Inaktivitätsbenachrichtungen von Tabs im Fokus an andere " #~ "Fenster/Tabs senden?" -#~ msgid "Error:" -#~ msgstr "Fehler:" + #~ msgid "Service" #~ msgstr "Dienst" -#~ msgid "Node" -#~ msgstr "Node" + #~ msgid "" #~ "Your new account has been created and added to your gajim configuration.\n" #~ "You can set advanced account options using \"Edit->Accounts\" in the main " @@ -6919,49 +8593,69 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ msgstr "" #~ "Ihr neues Konto wurde erstellt und der Gajimkonfiguration hinzugefügt.\n" #~ "Erweiterte Optionen sind über \"Ändern->Konten\" zu erreichen." + #~ msgid "You need to enter a valid server address to add an account." #~ msgstr "" #~ "Sie müssen einen gültigen Server angeben, um ein neues Konto zu erstellen." + #~ msgid "Contact names must be of the form \"user@servername\"." #~ msgstr "Benutzernamen müssen die Form \"benutzer@servername\" haben." + #~ msgid "Invalid contact ID" #~ msgstr "Ungültige Benutzer-ID" + #~ msgid "Contact ID must be of the form \"username@servername\"." #~ msgstr "Benutzer-ID muss in der Form \"username@servername\" sein." + #~ msgid "Account registration successful" #~ msgstr "Kontoregistrierung erfolgreich" + #~ msgid "The account \"%s\" has been registered with the Jabber server." #~ msgstr "Konto \"%s\" wurde auf dem Jabberserver registriert." + #~ msgid "theme_name" #~ msgstr "thema_name" + #~ msgid "Edit" #~ msgstr "_Ändern" + #~ msgid "Please fill in the data for your existing account" #~ msgstr "Bitte tragen Sie die Daten für ihr bestehendes Konto ein" + #~ msgid "Check if you want to register for a new jabber account" #~ msgstr "Prüfen Sie, ob Sie ein neues Konto erstellen möchten" + #~ msgid "Click to get contact's extended information" #~ msgstr "Klicken, um erweiterte Informationen des Kontaktes einzusehen" + #~ msgid "_Compact View" #~ msgstr "_Kompakte Ansicht" + #~ msgid "_Refresh" #~ msgstr "_Aktualisieren" + #~ msgid "_Register new account" #~ msgstr "Neues Konto e_rstellen" + #~ msgid "You just received a new message in room \"%s\"" #~ msgstr "Sie haben eine neue Nachricht im Raum \"%s\" erhalten" + #~ msgid "" #~ "If you close this window and you have history disabled, this message will " #~ "be lost." #~ msgstr "" #~ "Wenn sie das Fenster schließen und die History abgeschaltet haben, geht " #~ "die Nachricht verloren." + #~ msgid "New _Room" #~ msgstr "Neuer _Raum" + #~ msgid "Always use compact _view" #~ msgstr "Benutze immer die kompakte Ansicht" + #~ msgid "Banner:" #~ msgstr "Banner:" + #~ msgid "" #~ "If checked, all chat and group chat windows will have the information " #~ "area in the top and the buttons area in the bottom hidden. You can quick " @@ -6972,28 +8666,34 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ "den Chat- und Chatraumfenstern ausgeblendet. Mit Alt+C können Sie " #~ "schnell zwischen der kompakten und der normalen Ansicht umschalten. " #~ "Achtung: die jeweils letzte Ansicht wird nicht beibehalten" + #~ msgid "Inactivate account" #~ msgstr "Kein aktives Konto" -#~ msgid "Join _Group Chat..." -#~ msgstr "_Chatraum beitreten..." + #~ msgid "Po_sition:" #~ msgstr "Position:" + #~ msgid "Show roster window on Gajim startup" #~ msgstr "Kontaktliste beim Start von Gajim anzeigen" + #~ msgid "_Service Discovery" #~ msgstr "_Dienste durchsuchen" + #~ msgid "_Service Discovery..." #~ msgstr "_Dienste durchsuchen..." + #~ msgid "error appeared while processing xmpp:" #~ msgstr "Fehler während der Verarbeitung von xmpp:" + #~ msgid "" #~ "Cancels the selected file transfer. If there is an incomplete file, kept " #~ "in the file system it will be removed. This operation is not reversable" #~ msgstr "" #~ "Stoppt den ausgewählten Dateitransfer. Unvollständige Dateien werden " #~ "gelöscht. Diese Aktion ist nicht rückgangig zu machen." + #~ msgid "Chan_ge" #~ msgstr "_Ändern" + #~ msgid "Unknown type %s " #~ msgstr "Unbekannter Typ %s " - diff --git a/po/fr.po b/po/fr.po index 7c2f28549..7149ff9ff 100644 --- a/po/fr.po +++ b/po/fr.po @@ -2524,19 +2524,19 @@ msgstr "texte du message d'état :" #: ../src/config.py:1036 msgid "First Message Received" -msgstr "Premier Message Reçu" +msgstr "Premier message reçu" #: ../src/config.py:1037 msgid "Next Message Received" -msgstr "Message Suivant Reçu" +msgstr "Message reçu suivant" #: ../src/config.py:1038 msgid "Contact Connected" -msgstr "Contacte Connecté" +msgstr "Contact connecté" #: ../src/config.py:1039 msgid "Contact Disconnected" -msgstr "Contacte déconnecté" +msgstr "Contact déconnecté" #: ../src/config.py:1040 msgid "Message Sent" diff --git a/po/gl_ES.po b/po/gl.po similarity index 100% rename from po/gl_ES.po rename to po/gl.po diff --git a/po/it.po b/po/it.po index fbaf570e1..1cf26330b 100644 --- a/po/it.po +++ b/po/it.po @@ -5,17 +5,18 @@ # Mauro Brenna , 2005,2006. # Andrea Ratti , 2005. # Matteo Dell'Amico , 2005, 2006. -#: ../src/gajim-remote.py:203 ../src/gajim-remote.py:210 -#: ../src/gajim-remote.py:236 ../src/gajim-remote.py:237 -#: ../src/gajim-remote.py:243 ../src/gajim-remote.py:244 +# Daniel Coppi , 2007. +#: ../src/gajim-remote.py:212 ../src/gajim-remote.py:219 #: ../src/gajim-remote.py:245 ../src/gajim-remote.py:246 +#: ../src/gajim-remote.py:252 ../src/gajim-remote.py:253 +#: ../src/gajim-remote.py:254 ../src/gajim-remote.py:255 msgid "" msgstr "" "Project-Id-Version: Gajim 2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-01-19 11:39+0100\n" -"PO-Revision-Date: 2007-01-31 14:26+0100\n" -"Last-Translator: Matteo Dell'Amico \n" +"POT-Creation-Date: 2007-09-14 21:09+0200\n" +"PO-Revision-Date: 2007-09-14 20:53+0100\n" +"Last-Translator: neoex \n" "Language-Team: Italian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -35,35 +36,35 @@ msgid "Jabber IM Client" msgstr "Client IM Jabber" #: ../data/glade/account_context_menu.glade.h:1 -msgid "Send Single _Message..." -msgstr "Invia _messaggio singolo..." +#: ../data/glade/roster_window.glade.h:8 +msgid "Join _Group Chat..." +msgstr "Entra in chat di _gruppo..." #: ../data/glade/account_context_menu.glade.h:2 msgid "_Add Contact..." msgstr "_Aggiungi Contatto..." #: ../data/glade/account_context_menu.glade.h:3 -msgid "_Discover Services..." -msgstr "_Ricerca servizi..." +#: ../data/glade/roster_window.glade.h:15 +msgid "_Discover Services" +msgstr "_Ricerca servizi" -#: ../data/glade/account_context_menu.glade.h:4 ../src/disco.py:1145 +#: ../data/glade/account_context_menu.glade.h:4 msgid "_Execute Command..." -msgstr "Esegui _comando..." +msgstr "_Esegui comando..." #: ../data/glade/account_context_menu.glade.h:5 -#: ../data/glade/roster_window.glade.h:16 -#: ../data/glade/systray_context_menu.glade.h:6 -msgid "_Group Chat" -msgstr "Chat di _gruppo" +msgid "_Modify Account" +msgstr "_Modifica account" #: ../data/glade/account_context_menu.glade.h:6 -#: ../data/glade/zeroconf_context_menu.glade.h:1 -msgid "_Modify Account..." -msgstr "_Modifica account..." +msgid "_Open Gmail Inbox" +msgstr "_Apri posta ricevuta" #: ../data/glade/account_context_menu.glade.h:7 -msgid "_Open Gmail Inbox" -msgstr "_Apri composizione email" +#: ../data/glade/roster_window.glade.h:22 +msgid "_Start Chat..." +msgstr "_Inizia chat..." #: ../data/glade/account_context_menu.glade.h:8 #: ../data/glade/zeroconf_context_menu.glade.h:2 @@ -72,11 +73,11 @@ msgstr "_Stato" #: ../data/glade/account_creation_wizard_window.glade.h:1 msgid "" -"Account is being created\n" +"Connecting to server\n" "\n" "Please wait..." msgstr "" -"Creazione dell'account in corso\n" +"Connessione al server\n" "\n" "Attendere prego..." @@ -89,50 +90,68 @@ msgid "Please fill in the data for your new account" msgstr "Inserire i dati per il nuovo account" #: ../data/glade/account_creation_wizard_window.glade.h:6 -msgid "Click to see features (like MSN, ICQ transports) of jabber servers" -msgstr "" -"Cliccare per vedere i servizi (come i trasporti MSN o ICQ) dei server Jabber" +msgid "Please select a server" +msgstr "Selezionare un server" #: ../data/glade/account_creation_wizard_window.glade.h:7 -msgid "Connect when I press Finish" -msgstr "Collegati alla pressione di Fine" +msgid "Click to see features (like MSN, ICQ transports) of jabber servers" +msgstr "" +"Clicca per vedere i servizi (come i trasporti MSN o ICQ) dei server Jabber" #: ../data/glade/account_creation_wizard_window.glade.h:8 +msgid "Connect when I press Finish" +msgstr "Connettiti alla pressione di Fine" + +#: ../data/glade/account_creation_wizard_window.glade.h:9 msgid "Gajim: Account Creation Wizard" msgstr "Gajim: Assistente creazione account" -#: ../data/glade/account_creation_wizard_window.glade.h:9 -msgid "I already have an account I want to use" +#: ../data/glade/account_creation_wizard_window.glade.h:10 +#, fuzzy +msgid "I already have an account I want to _use" msgstr "Ho già un account da usare" -#: ../data/glade/account_creation_wizard_window.glade.h:10 +#: ../data/glade/account_creation_wizard_window.glade.h:11 msgid "I want to _register for a new account" msgstr "Voglio _registrare un nuovo account" -#: ../data/glade/account_creation_wizard_window.glade.h:11 -#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/account_creation_wizard_window.glade.h:12 +#: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/accounts_window.glade.h:22 msgid "If checked, Gajim will remember the password for this account" msgstr "Se marcato, Gajim ricorderà la password per questo account" -#: ../data/glade/account_creation_wizard_window.glade.h:12 -#: ../data/glade/manage_proxies_window.glade.h:6 -msgid "Pass_word:" -msgstr "Pass_word:" - #: ../data/glade/account_creation_wizard_window.glade.h:13 -#: ../data/glade/account_modification_window.glade.h:38 -msgid "Save pass_word" -msgstr "_Memorizza password" +#: ../data/glade/account_modification_window.glade.h:26 +#: ../data/glade/accounts_window.glade.h:32 +msgid "Manage..." +msgstr "Gestisci..." #: ../data/glade/account_creation_wizard_window.glade.h:14 +msgid "Prox_y:" +msgstr "Prox_y:" + +#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/accounts_window.glade.h:48 +msgid "Save pass_word" +msgstr "Ricorda la pass_word" + +#: ../data/glade/account_creation_wizard_window.glade.h:16 msgid "Servers Features" msgstr "Servizi del server" -#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_creation_wizard_window.glade.h:17 msgid "Set my profile when I connect" -msgstr "Imposta il profilo durante la connessione" +msgstr "Configura il mio profilo appena effettuata la connessione" -#: ../data/glade/account_creation_wizard_window.glade.h:16 +#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/accounts_window.glade.h:53 +msgid "Use custom hostname/port" +msgstr "Usa hostname/porta personalizzati" + +#: ../data/glade/account_creation_wizard_window.glade.h:19 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." @@ -140,67 +159,63 @@ msgstr "" "È necessario avere un account per connettersi\n" "alla rete Jabber." -#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_creation_wizard_window.glade.h:21 msgid "Your JID:" msgstr "Il tuo JID:" -#: ../data/glade/account_creation_wizard_window.glade.h:19 -#: ../data/glade/roster_window.glade.h:11 +#: ../data/glade/account_creation_wizard_window.glade.h:22 +#: ../data/glade/roster_window.glade.h:13 msgid "_Advanced" msgstr "_Avanzato" -#: ../data/glade/account_creation_wizard_window.glade.h:20 +#: ../data/glade/account_creation_wizard_window.glade.h:23 msgid "_Finish" msgstr "_Fine" -#: ../data/glade/account_creation_wizard_window.glade.h:21 -#: ../data/glade/manage_proxies_window.glade.h:9 -msgid "_Host:" -msgstr "_Host:" +#: ../data/glade/account_creation_wizard_window.glade.h:24 +msgid "_Hostname:" +msgstr "Nome dell'_host: " -#: ../data/glade/account_creation_wizard_window.glade.h:22 -#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_modification_window.glade.h:50 +#: ../data/glade/accounts_window.glade.h:58 msgid "_Password:" msgstr "_Password:" -#: ../data/glade/account_creation_wizard_window.glade.h:23 -#: ../data/glade/manage_proxies_window.glade.h:10 +#: ../data/glade/account_creation_wizard_window.glade.h:26 +#: ../data/glade/manage_proxies_window.glade.h:11 msgid "_Port:" msgstr "_Porta:" -#: ../data/glade/account_creation_wizard_window.glade.h:24 -msgid "_Retype Password:" -msgstr "_Ripetere password:" - -#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_creation_wizard_window.glade.h:27 msgid "_Server:" msgstr "_Server:" -#: ../data/glade/account_creation_wizard_window.glade.h:26 -msgid "_Use proxy" -msgstr "_Usa proxy" - -#: ../data/glade/account_creation_wizard_window.glade.h:27 -#: ../data/glade/manage_proxies_window.glade.h:11 +#: ../data/glade/account_creation_wizard_window.glade.h:28 +#: ../data/glade/manage_proxies_window.glade.h:12 msgid "_Username:" msgstr "_Nome utente:" #: ../data/glade/account_modification_window.glade.h:1 +#: ../data/glade/accounts_window.glade.h:1 #: ../data/glade/preferences_window.glade.h:8 msgid "Miscellaneous" msgstr "Varie" #: ../data/glade/account_modification_window.glade.h:2 +#: ../data/glade/accounts_window.glade.h:2 #: ../data/glade/zeroconf_properties_window.glade.h:1 msgid "OpenPGP" msgstr "OpenPGP" #: ../data/glade/account_modification_window.glade.h:3 +#: ../data/glade/accounts_window.glade.h:3 #: ../data/glade/zeroconf_properties_window.glade.h:2 msgid "Personal Information" msgstr "Informazioni personali" #: ../data/glade/account_modification_window.glade.h:4 +#: ../data/glade/accounts_window.glade.h:4 msgid "Account" msgstr "Account" @@ -209,68 +224,93 @@ msgid "Account Modification" msgstr "Modifica account" #: ../data/glade/account_modification_window.glade.h:6 -msgid "Auto-reconnect when connection is lost" -msgstr "Riconnettiti automaticamente quando si perde la connessione" +#: ../data/glade/accounts_window.glade.h:5 +msgid "Administration operations" +msgstr "Operazioni amministrative" #: ../data/glade/account_modification_window.glade.h:7 -#: ../data/glade/zeroconf_properties_window.glade.h:3 -msgid "C_onnect on Gajim startup" -msgstr "_Connetti all'avvio di Gajim" +#: ../data/glade/accounts_window.glade.h:6 +msgid "Auto-reconnect when connection is lost" +msgstr "Riconnetti automaticamente quando si perde la connessione" #: ../data/glade/account_modification_window.glade.h:8 +#: ../data/glade/accounts_window.glade.h:7 +#: ../data/glade/zeroconf_properties_window.glade.h:3 +msgid "C_onnect on Gajim startup" +msgstr "C_onnetti all'avvio di Gajim" + +#: ../data/glade/account_modification_window.glade.h:9 +#: ../data/glade/accounts_window.glade.h:8 msgid "Chan_ge Password" msgstr "_Cambia password" -#: ../data/glade/account_modification_window.glade.h:9 +#: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/accounts_window.glade.h:9 msgid "" "Check this so Gajim will connect in port 5223 where legacy servers are " "expected to have SSL capabilities. Note that Gajim uses TLS encryption by " "default if broadcasted by the server, and with this option enabled TLS will " "be disabled" msgstr "" -"Selezionando questa opzione Gajim si connetterà alla porta 5223, sulla quale " -"i server più vecchi attivano SSL. Notare che Gajim usa la cifratura TLS di " -"default se il server la annuncia, e abilitando questa opzione TLS sarà " -"disabilitata." +"Se marcato, Gajim si connetterà alla porta 5223, sulla quale i server più " +"vecchi attivano SSL. Notare che Gajim usa la cifratura TLS di default se il " +"server la annuncia, e abilitando questa opzione TLS sarà disabilitata" -#: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/accounts_window.glade.h:10 #: ../data/glade/zeroconf_properties_window.glade.h:4 msgid "Choose _Key..." msgstr "Scegli _chiave..." -#: ../data/glade/account_modification_window.glade.h:11 -msgid "Click to change account's password" -msgstr "Cliccare per cambiare la password dell'account" - #: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/accounts_window.glade.h:11 +msgid "Click to change account's password" +msgstr "Clicca per cambiare la password dell'account" + +#: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/accounts_window.glade.h:12 +msgid "Click to request authorization to all contacts of another account" +msgstr "" +"Clicca per richiedere l'autorizzazione a tutti i contatti di un altro account" + +#: ../data/glade/account_modification_window.glade.h:14 +#: ../data/glade/accounts_window.glade.h:13 msgid "Connection" msgstr "Connessione" -#: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/account_modification_window.glade.h:15 +#: ../data/glade/accounts_window.glade.h:15 msgid "Edit Personal Information..." msgstr "Modifica informazioni personali..." -#: ../data/glade/account_modification_window.glade.h:14 -#: ../data/glade/roster_window.glade.h:5 ../src/notify.py:458 -#: ../src/notify.py:480 ../src/notify.py:492 ../src/common/helpers.py:914 +#. No configured account +#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/accounts_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:6 ../src/notify.py:471 +#: ../src/notify.py:493 ../src/notify.py:505 ../src/common/helpers.py:964 +#: ../src/common/helpers.py:976 msgid "Gajim" msgstr "Gajim" -#. Contact is not in a group, so count it in General group -#: ../data/glade/account_modification_window.glade.h:15 -#: ../data/glade/preferences_window.glade.h:51 +#. General group cannot be changed +#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/accounts_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:45 #: ../data/glade/zeroconf_properties_window.glade.h:7 -#: ../src/roster_window.py:346 ../src/roster_window.py:1225 -#: ../src/roster_window.py:1436 ../src/roster_window.py:2112 -#: ../src/roster_window.py:2154 ../src/common/contacts.py:280 +#: ../src/roster_window.py:359 ../src/roster_window.py:624 +#: ../src/roster_window.py:1360 ../src/roster_window.py:1728 +#: ../src/roster_window.py:2112 ../src/roster_window.py:2628 +#: ../src/roster_window.py:2746 ../src/common/contacts.py:309 msgid "General" msgstr "Generale" -#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/accounts_window.glade.h:20 msgid "Hostname: " msgstr "Nome dell'host: " -#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/accounts_window.glade.h:21 msgid "" "If checked, Gajim will also broadcast some more IPs except from just your " "IP, so file transfer has higher chances of working." @@ -279,7 +319,8 @@ msgstr "" "su cui viene eseguito, di modo che il trasferimento file abbia maggiori " "possibilità di funzionare correttamente." -#: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/accounts_window.glade.h:23 msgid "" "If checked, Gajim will send keep-alive packets to prevent connection timeout " "which results in disconnection" @@ -287,94 +328,107 @@ msgstr "" "Se marcato, Gajim invierà dei pacchetti di keep-alive per prevenire il " "timeout che provoca una disconnessione" -#: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/account_modification_window.glade.h:22 +#: ../data/glade/accounts_window.glade.h:24 #: ../data/glade/zeroconf_properties_window.glade.h:8 msgid "" "If checked, Gajim will store the password in ~/.gajim/config with 'read' " "permission only for you" msgstr "" "Se marcato, Gajim memorizzerà la password in ~/.gajim/config, con permessi " -"di lettura solo per l'utente che esegue il programma" +"di lettura solo per l'utente corrente" -#: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/accounts_window.glade.h:25 #: ../data/glade/zeroconf_properties_window.glade.h:9 msgid "" "If checked, Gajim, when launched, will automatically connect to jabber using " "this account" msgstr "" "Se marcato, Gajim, quando lanciato, si connetterà automaticamente a Jabber " -"usando questo account." +"usando questo account" -#: ../data/glade/account_modification_window.glade.h:22 +#: ../data/glade/account_modification_window.glade.h:24 +#: ../data/glade/accounts_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:10 msgid "" "If checked, any change to the global status (handled by the combobox at the " "bottom of the roster window) will change the status of this account " "accordingly" msgstr "" -"Se marcato, ogni cambio allo stato globale (gestito dalla combo box sotto la " -"lista contatti) cambierà di conseguenza lo stato di questo account" +"Se marcato, ogni cambio allo stato globale (gestito dal menu a tendina sotto " +"la lista contatti) cambierà anche lo stato di questo account" -#: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/account_modification_window.glade.h:25 +#: ../data/glade/accounts_window.glade.h:29 msgid "Information about you, as stored in the server" msgstr "Informazioni su di te, archiviate sul server" -#: ../data/glade/account_modification_window.glade.h:24 -msgid "Manage..." -msgstr "Gestisci..." - -#: ../data/glade/account_modification_window.glade.h:25 -#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1617 -#: ../src/config.py:3409 +#: ../data/glade/account_modification_window.glade.h:27 +#: ../data/glade/accounts_window.glade.h:34 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1524 +#: ../src/config.py:2010 msgid "No key selected" msgstr "Nessuna chiave selezionata" #. None means no proxy profile selected -#: ../data/glade/account_modification_window.glade.h:27 ../src/config.py:1197 -#: ../src/config.py:1202 ../src/config.py:1386 ../src/config.py:1607 -#: ../src/config.py:1616 ../src/config.py:1675 ../src/config.py:1749 -#: ../src/config.py:3399 ../src/config.py:3408 ../src/dialogs.py:281 -#: ../src/dialogs.py:283 +#. GPG Key +#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/accounts_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:32 ../src/config.py:1110 +#: ../src/config.py:1181 ../src/config.py:1430 ../src/config.py:1435 +#: ../src/config.py:1906 ../src/config.py:1993 ../src/config.py:2009 +#: ../src/config.py:3109 ../src/config.py:3155 ../src/dialogs.py:286 +#: ../src/dialogs.py:288 ../src/roster_window.py:1832 +#: ../src/roster_window.py:1839 ../src/roster_window.py:1846 msgid "None" msgstr "Nessuno" -#: ../data/glade/account_modification_window.glade.h:28 -#: ../data/glade/profile_window.glade.h:25 +#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/accounts_window.glade.h:37 +#: ../data/glade/profile_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:17 msgid "Personal Information" msgstr "Informazioni personali" -#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/accounts_window.glade.h:38 msgid "Port: " msgstr "Porta: " -#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/accounts_window.glade.h:39 msgid "Priori_ty:" -msgstr "Pr_iorità:" +msgstr "Priori_tà:" -#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/accounts_window.glade.h:40 msgid "" "Priority is used in Jabber to determine who gets the events from the jabber " "server when two or more clients are connected using the same account; The " "client with the highest priority gets the events" msgstr "" "La priorità si usa in Jabber per determinare chi riceve gli eventi dal " -"server Jabber, quando due o più client sono connessi usando lo stesso " -"account; il client con la maggiore priorità riceverà gli eventi." +"server Jabber quando due o più client sono connessi usando lo stesso " +"account; il client con la maggiore priorità riceverà gli eventi" -#: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/accounts_window.glade.h:41 msgid "Priority will change automatically according to your status." msgstr "La priorità cambierà automaticamente in funzione del tuo stato." -#: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/account_modification_window.glade.h:35 +#: ../data/glade/accounts_window.glade.h:42 msgid "Proxy:" msgstr "Proxy:" -#: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/accounts_window.glade.h:44 msgid "Resour_ce:" msgstr "_Risorsa: " -#: ../data/glade/account_modification_window.glade.h:35 +#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/accounts_window.glade.h:45 msgid "" "Resource is sent to the Jabber server in order to separate the same JID in " "two or more parts depending on the number of the clients connected in the " @@ -383,97 +437,132 @@ msgid "" "has the highest priority will get the events. (see below)" msgstr "" "La risorsa viene inviata al server Jabber per distinguere tra due o più " -"client connessi allo stesso server. In questa maniera, è possibile " +"client connessi allo stesso account. In questa maniera, è possibile " "connettersi allo stesso account con risorse 'Casa' e 'Lavoro' " -"contemporaneamente. La risorsa con la priorità maggiore riceverà gli eventi " -"(vedi sotto)." +"contemporaneamente. La risorsa con la priorità maggiore riceverà gli eventi. " +"(vedi sotto)" -#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/account_modification_window.glade.h:38 +#: ../data/glade/accounts_window.glade.h:46 #: ../data/glade/zeroconf_properties_window.glade.h:18 msgid "Save _passphrase (insecure)" msgstr "Salva _passphrase (non sicuro)" -#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/accounts_window.glade.h:47 #: ../data/glade/zeroconf_properties_window.glade.h:19 msgid "Save conversation _logs for all contacts" -msgstr "Memorizza i _log delle conversazioni con tutti i contatti" +msgstr "_Registra le conversazioni con tutti i contatti" -#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/accounts_window.glade.h:49 msgid "Send keep-alive packets" msgstr "Invia pacchetti di keep-alive" -#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/account_modification_window.glade.h:42 +#: ../data/glade/accounts_window.glade.h:50 #: ../data/glade/zeroconf_properties_window.glade.h:20 msgid "Synch_ronize account status with global status" -msgstr "_Sincronizza lo stato dell'account con lo stato globale" - -#: ../data/glade/account_modification_window.glade.h:41 -msgid "Use _SSL (legacy)" -msgstr "Usa _SSL (legacy)" - -#: ../data/glade/account_modification_window.glade.h:42 -msgid "Use custom hostname/port" -msgstr "Usa hostname/port personalizzati" +msgstr "Sinc_ronizza lo stato dell'account con lo stato globale" #: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/accounts_window.glade.h:51 +msgid "Synchronise contacts" +msgstr "Sincronizza contatti" + +#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/accounts_window.glade.h:52 +msgid "Use _SSL (legacy)" +msgstr "Usa _SSL (vecchio)" + +#: ../data/glade/account_modification_window.glade.h:46 +#: ../data/glade/accounts_window.glade.h:55 msgid "Use file transfer proxies" msgstr "Usa proxy per il trasferimento file" -#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/accounts_window.glade.h:56 msgid "_Adjust to status" msgstr "_Modifica lo stato" -#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/account_modification_window.glade.h:48 +#: ../data/glade/accounts_window.glade.h:57 msgid "_Jabber ID:" msgstr "ID _Jabber:" -#: ../data/glade/account_modification_window.glade.h:46 +#: ../data/glade/account_modification_window.glade.h:49 msgid "_Name:" msgstr "_Nome:" -#: ../data/glade/accounts_window.glade.h:1 -msgid "Accounts" -msgstr "Account" +#: ../data/glade/accounts_window.glade.h:14 +#: ../data/glade/profile_window.glade.h:11 +#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/zeroconf_information_window.glade.h:2 +#: ../data/glade/zeroconf_properties_window.glade.h:5 +msgid "E-Mail:" +msgstr "E-Mail:" -#: ../data/glade/accounts_window.glade.h:2 +#. XML Console enable checkbutton +#: ../data/glade/accounts_window.glade.h:16 +#: ../data/glade/xml_console_window.glade.h:4 +msgid "Enable" +msgstr "Abilita" + +#: ../data/glade/accounts_window.glade.h:17 +#: ../data/glade/zeroconf_information_window.glade.h:3 +#: ../data/glade/zeroconf_properties_window.glade.h:6 +msgid "First Name:" +msgstr "Nome:" + +#: ../data/glade/accounts_window.glade.h:27 +#: ../data/glade/zeroconf_properties_window.glade.h:11 msgid "" -"If checked, all local contacts that use a Bonjour compatible chat client " -"(like iChat, Trillian or Gaim) will be shown in roster. You don't need to be " -"connected to a jabber server for it to work.\n" -"This is only available if python-avahi is installed and avahi-daemon is " -"running." +"If the default port that is used for incoming messages is unfitting for your " +"setup you can select another one here.\n" +"You might consider to change possible firewall settings." msgstr "" -"Se selezionato, tutti i contatti locali che usano un client chat compatibile " -"con Bonjour (es. IChat, Trillian or Gaim) saranno visibili nella lista " -"contatti. Non è necessario essere connesso a un server jabber affinché " -"funzioni.\n" -"Questo è possibile solo se python-avahi è installato e avahi-daemon è in " -"esecuzione." +"Se la porta predefinita usata per i messaggi in entrata non si adatta alle " +"tue configurazioni puoi selezionarne un'altra qui.\n" +"Potresti considerare di cambiare la configurazione del firewall" -#: ../data/glade/accounts_window.glade.h:4 -msgid "" -"If you have 2 or more accounts and this is checked, Gajim will list all " -"contacts as if you had one account" -msgstr "" -"Se marcato e se sono presenti 2 o più account, Gajim mostrerà tutti i " -"contatti come se ci fosse un unico account" +#: ../data/glade/accounts_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/zeroconf_information_window.glade.h:4 +#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:453 +msgid "Jabber ID:" +msgstr "ID Jabber: " -#: ../data/glade/accounts_window.glade.h:5 +#: ../data/glade/accounts_window.glade.h:31 +#: ../data/glade/zeroconf_information_window.glade.h:5 +#: ../data/glade/zeroconf_properties_window.glade.h:14 +msgid "Last Name:" +msgstr "Cognome:" + +#: ../data/glade/accounts_window.glade.h:33 msgid "Mer_ge accounts" msgstr "_Unisci account" -#: ../data/glade/accounts_window.glade.h:6 -msgid "_Enable link-local messaging" -msgstr "_Abilita la messaggistica sulla rete locale" +#. Rename +#: ../data/glade/accounts_window.glade.h:43 ../src/roster_window.py:2698 +msgid "Re_name" +msgstr "Ri_nomina" -#: ../data/glade/accounts_window.glade.h:7 -msgid "_Modify" -msgstr "_Modifica" +#: ../data/glade/accounts_window.glade.h:54 +#: ../data/glade/zeroconf_properties_window.glade.h:21 +msgid "Use custom port:" +msgstr "Usa porta personalizzata:" -#: ../data/glade/accounts_window.glade.h:8 -#: ../data/glade/remove_account_window.glade.h:4 -msgid "_Remove" -msgstr "_Elimina" +#: ../data/glade/accounts_window.glade.h:59 +msgid "gtk-add" +msgstr "gtk-add" + +#: ../data/glade/accounts_window.glade.h:60 +msgid "gtk-close" +msgstr "gtk-close" + +#: ../data/glade/accounts_window.glade.h:61 +msgid "gtk-remove" +msgstr "gtk-remove" #: ../data/glade/add_new_contact_window.glade.h:1 msgid "A_ccount:" @@ -508,8 +597,8 @@ msgid "" "You must be connected to the transport to be able\n" "to add a contact from this protocol." msgstr "" -"È necessario essere connesso all'account per poter aggiungere\n" -" un contatto da questo protocollo" +"È necessario essere connesso al trasporto per poter aggiungere\n" +" un contatto da questo protocollo." #: ../data/glade/add_new_contact_window.glade.h:11 msgid "_Group:" @@ -533,11 +622,11 @@ msgstr "_ID utente:" #: ../data/glade/adhoc_commands_window.glade.h:1 msgid "An error has occurred:" -msgstr "È avvenuto un errore:" +msgstr "Si è verificato un errore:" #: ../data/glade/adhoc_commands_window.glade.h:2 msgid "Choose command to execute:" -msgstr "Scegliere il comando da eseguire:" +msgstr "Scegli il comando da eseguire:" #: ../data/glade/adhoc_commands_window.glade.h:3 msgid "Ad-hoc Commands - Gajim" @@ -545,7 +634,7 @@ msgstr "Comandi ad-hoc - Gajim" #: ../data/glade/adhoc_commands_window.glade.h:4 msgid "Check once more" -msgstr "Controlla un'altra volta" +msgstr "Controlla ancora" #: ../data/glade/adhoc_commands_window.glade.h:5 msgid "Error description..." @@ -557,7 +646,7 @@ msgstr "Attendere durante il recupero della lista comandi..." #: ../data/glade/adhoc_commands_window.glade.h:7 msgid "Please wait while the command is sending..." -msgstr "Attendere durante l'invio del comando.." +msgstr "Attendere durante l'invio del comando..." #: ../data/glade/adhoc_commands_window.glade.h:8 msgid "Please wait..." @@ -565,7 +654,7 @@ msgstr "Attendere..." #: ../data/glade/adhoc_commands_window.glade.h:9 msgid "This jabber entity does not expose any commands." -msgstr "Questa entità jabber non mostra alcun comando." +msgstr "Questa entità Jabber non mostra alcun comando." #: ../data/glade/advanced_configuration_window.glade.h:1 msgid "Description" @@ -573,7 +662,9 @@ msgstr "Descrizione" #: ../data/glade/advanced_configuration_window.glade.h:2 msgid "NOTE: You should restart Gajim for some settings to take effect" -msgstr "NOTA: È necessario riavviare Gajim perché alcune impostazioni abbiano effetto" +msgstr "" +"NOTA: È necessario riavviare Gajim perché alcune impostazioni abbiano " +"effetto" #: ../data/glade/advanced_configuration_window.glade.h:3 msgid "Advanced Configuration Editor" @@ -592,44 +683,40 @@ msgid "Deletes Message of the Day" msgstr "Elimina il messaggio del giorno" #: ../data/glade/advanced_menuitem_menu.glade.h:3 +msgid "Edit _Privacy Lists..." +msgstr "Modifica liste _privacy..." + +#: ../data/glade/advanced_menuitem_menu.glade.h:4 msgid "Sends a message to users currently connected to this server" msgstr "Invia un messaggio agli utenti attualmenti connessi a questo server" -#: ../data/glade/advanced_menuitem_menu.glade.h:4 -msgid "Set MOTD" -msgstr "Imposta MOTD" - #: ../data/glade/advanced_menuitem_menu.glade.h:5 +msgid "Set MOTD..." +msgstr "Imposta MOTD..." + +#: ../data/glade/advanced_menuitem_menu.glade.h:6 msgid "Sets Message of the Day" msgstr "Imposta messaggio del giorno" -#: ../data/glade/advanced_menuitem_menu.glade.h:6 +#: ../data/glade/advanced_menuitem_menu.glade.h:7 msgid "Show _XML Console" msgstr "Mostra console _XML" -#: ../data/glade/advanced_menuitem_menu.glade.h:7 -msgid "Update MOTD" -msgstr "Aggiorna MOTD" - #: ../data/glade/advanced_menuitem_menu.glade.h:8 +msgid "Update MOTD..." +msgstr "Aggiorna MOTD..." + +#: ../data/glade/advanced_menuitem_menu.glade.h:9 msgid "Updates Message of the Day" msgstr "Aggiorna il messaggio del giorno" -#: ../data/glade/advanced_menuitem_menu.glade.h:9 +#: ../data/glade/advanced_menuitem_menu.glade.h:10 msgid "_Administrator" msgstr "_Amministratore" -#: ../data/glade/advanced_menuitem_menu.glade.h:10 -msgid "_Privacy Lists" -msgstr "_Liste privacy" - #: ../data/glade/advanced_menuitem_menu.glade.h:11 -msgid "_Send Server Message" -msgstr "_Invia messaggio server" - -#: ../data/glade/advanced_menuitem_menu.glade.h:12 -msgid "_Send Single Message" -msgstr "_Invia messaggio singolo" +msgid "_Send Server Message..." +msgstr "_Invia messaggio server..." #: ../data/glade/advanced_notifications_window.glade.h:1 msgid " a window/tab opened with that contact " @@ -644,7 +731,7 @@ msgid "Conditions" msgstr "Condizioni" #: ../data/glade/advanced_notifications_window.glade.h:4 -#: ../data/glade/preferences_window.glade.h:10 +#: ../data/glade/preferences_window.glade.h:12 msgid "Sounds" msgstr "Suoni" @@ -654,14 +741,14 @@ msgstr "Azioni avanzate" #: ../data/glade/advanced_notifications_window.glade.h:6 msgid "Advanced Notifications Control" -msgstr "Controllo notifiche avanzato" +msgstr "Gestione avanzata delle notifiche" #: ../data/glade/advanced_notifications_window.glade.h:7 msgid "All statuses" msgstr "Tutti gli stati" #: ../data/glade/advanced_notifications_window.glade.h:8 -#: ../src/common/commands.py:91 ../src/common/helpers.py:243 +#: ../src/common/commands.py:91 ../src/common/helpers.py:246 msgid "Away" msgstr "Assente" @@ -678,7 +765,7 @@ msgid "Have " msgstr "Ho " #: ../data/glade/advanced_notifications_window.glade.h:12 -#: ../src/common/helpers.py:253 +#: ../src/common/helpers.py:256 msgid "Invisible" msgstr "Invisibile" @@ -687,7 +774,7 @@ msgid "Launch a command" msgstr "Lancia un comando" #: ../data/glade/advanced_notifications_window.glade.h:14 -#: ../src/common/helpers.py:226 +#: ../src/common/helpers.py:229 msgid "Not Available" msgstr "Non disponibile" @@ -701,7 +788,7 @@ msgstr "Online / Libero per chat" #: ../data/glade/advanced_notifications_window.glade.h:17 msgid "Play a sound" -msgstr "Riproduci suono" +msgstr "Riproduci un suono" #: ../data/glade/advanced_notifications_window.glade.h:18 msgid "" @@ -752,7 +839,7 @@ msgstr "_Disabilita l'evento di apparizione nella lista contatti" #: ../data/glade/advanced_notifications_window.glade.h:32 msgid "_Disable showing event in systray" -msgstr "_Disabilita l'evento di apparizione nell'area di notifica" +msgstr "_Disabilita la visualizzazione dell'evento nell'area di notifica" #: ../data/glade/advanced_notifications_window.glade.h:33 msgid "_Inform me with a popup window" @@ -768,11 +855,11 @@ msgstr "Mostra evento nella lista _contatti" #: ../data/glade/advanced_notifications_window.glade.h:36 msgid "_Show event in systray" -msgstr "Mostra evento nella s_ystray" +msgstr "_Mostra evento nell'area di notifica" #: ../data/glade/advanced_notifications_window.glade.h:37 msgid "and I " -msgstr "ed io" +msgstr "ed io " #: ../data/glade/advanced_notifications_window.glade.h:38 msgid "" @@ -793,38 +880,22 @@ msgid "when I'm in" msgstr "quando sono in" #: ../data/glade/atom_entry_window.glade.h:1 -msgid "2003-12-13T18:30:02Z" -msgstr "2003-12-13T18:30:02Z" - -#: ../data/glade/atom_entry_window.glade.h:2 -msgid "Romeo and Juliet" -msgstr "Romeo e Giulietta" - -#: ../data/glade/atom_entry_window.glade.h:3 msgid "Entry:" msgstr "Voce:" -#: ../data/glade/atom_entry_window.glade.h:4 +#: ../data/glade/atom_entry_window.glade.h:2 msgid "Feed name:" msgstr "Nome feed:" -#: ../data/glade/atom_entry_window.glade.h:5 +#: ../data/glade/atom_entry_window.glade.h:3 msgid "Last modified:" msgstr "Ultima modifica:" -#: ../data/glade/atom_entry_window.glade.h:6 +#: ../data/glade/atom_entry_window.glade.h:4 msgid "New entry received" msgstr "Nuova voce ricevuta" -#: ../data/glade/atom_entry_window.glade.h:7 -msgid "Old stories" -msgstr "Vecchie storie" - -#: ../data/glade/atom_entry_window.glade.h:8 -msgid "Soliloquy" -msgstr "Soliloquio" - -#: ../data/glade/atom_entry_window.glade.h:9 +#: ../data/glade/atom_entry_window.glade.h:5 msgid "You have received new entry:" msgstr "Hai ricevuto un nuovo evento:" @@ -857,15 +928,13 @@ msgid "Join _Group Chat" msgstr "Entra in chat di _gruppo" #: ../data/glade/chat_context_menu.glade.h:2 -#: ../data/glade/chat_control_popup_menu.glade.h:4 -#: ../data/glade/gc_occupants_menu.glade.h:2 -#: ../data/glade/roster_contact_context_menu.glade.h:10 -msgid "_Add to Roster" -msgstr "_Aggiungi ai contatti" +#: ../data/glade/roster_contact_context_menu.glade.h:12 +msgid "_Add to Roster..." +msgstr "_Aggiungi ai contatti..." #: ../data/glade/chat_context_menu.glade.h:3 msgid "_Copy JID/Email Address" -msgstr "_Copia Indirizzo Email/JID" +msgstr "_Copia JID/indirizzo email" #: ../data/glade/chat_context_menu.glade.h:4 msgid "_Copy Link Location" @@ -880,7 +949,6 @@ msgid "_Open Link in Browser" msgstr "_Apri il collegamento nel browser" #: ../data/glade/chat_context_menu.glade.h:7 -#: ../data/glade/roster_window.glade.h:20 #: ../data/glade/subscription_request_popup_menu.glade.h:1 #: ../data/glade/systray_context_menu.glade.h:7 msgid "_Start Chat" @@ -888,34 +956,43 @@ msgstr "_Inizia chat" #: ../data/glade/chat_control_popup_menu.glade.h:1 msgid "Click to see past conversations with this contact" -msgstr "Cliccare per vedere le conversazioni precedenti con questo contatto" +msgstr "Clicca per vedere le conversazioni precedenti con questo contatto" #: ../data/glade/chat_control_popup_menu.glade.h:2 -#: ../data/glade/roster_contact_context_menu.glade.h:8 +msgid "Invite _Friends" +msgstr "Invita _amici" + +#: ../data/glade/chat_control_popup_menu.glade.h:3 +#: ../data/glade/gc_occupants_menu.glade.h:3 #: ../data/glade/zeroconf_contact_context_menu.glade.h:4 msgid "Send _File" msgstr "Invia _file" -#: ../data/glade/chat_control_popup_menu.glade.h:3 +#: ../data/glade/chat_control_popup_menu.glade.h:4 +msgid "Toggle End to End Encryption" +msgstr "Attiva cifratura end-to-end" + +#: ../data/glade/chat_control_popup_menu.glade.h:5 msgid "Toggle Open_PGP Encryption" msgstr "Attiva cifratura Open_PGP" -#: ../data/glade/chat_control_popup_menu.glade.h:5 -#: ../data/glade/gc_control_popup_menu.glade.h:6 -msgid "_Compact View Alt+C" -msgstr "_Vista compatta Alt+C" - #: ../data/glade/chat_control_popup_menu.glade.h:6 +#: ../data/glade/gc_occupants_menu.glade.h:4 +msgid "_Add to Roster" +msgstr "_Aggiungi ai contatti" + +#: ../data/glade/chat_control_popup_menu.glade.h:7 #: ../data/glade/gc_control_popup_menu.glade.h:7 -#: ../data/glade/gc_occupants_menu.glade.h:5 -#: ../data/glade/roster_contact_context_menu.glade.h:13 +#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/roster_contact_context_menu.glade.h:16 #: ../data/glade/zeroconf_contact_context_menu.glade.h:6 +#: ../src/roster_window.py:2567 msgid "_History" msgstr "_Cronologia" #: ../data/glade/data_form_window.glade.h:1 msgid "Fill in the form." -msgstr "Completa nel form" +msgstr "Completa nel form." #: ../data/glade/data_form_window.glade.h:2 msgid "Room Configuration" @@ -979,7 +1056,7 @@ msgid "When a file transfer is complete show a popup notification" msgstr "" "Mostra una notifica popup quando un trasferimento file viene completato" -#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:769 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:774 msgid "_Continue" msgstr "_Continua" @@ -987,7 +1064,7 @@ msgstr "_Continua" msgid "_Notify me when a file transfer is complete" msgstr "_Notifica quando un trasferimento file viene completato" -#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:190 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:186 msgid "_Open Containing Folder" msgstr "_Apri cartella" @@ -1048,16 +1125,16 @@ msgid "" "MUC\n" "Messages" msgstr "" -"Messaggi\n" -"MUC" +"Messaggi di una\n" +"chat di gruppo" #: ../data/glade/gajim_themes_window.glade.h:15 msgid "" "MUC Directed\n" "Messages" msgstr "" -"Messaggi diretti\n" -"a MUC" +"Messaggi inviati in\n" +"una chat di gruppo" #: ../data/glade/gajim_themes_window.glade.h:17 msgid "Paused" @@ -1076,58 +1153,70 @@ msgid "_Background:" msgstr "_Sfondo:" #: ../data/glade/gc_control_popup_menu.glade.h:1 -msgid "Change _Nickname" -msgstr "Cambia _nickname" +msgid "Change _Nickname..." +msgstr "Cambia _nickname..." #: ../data/glade/gc_control_popup_menu.glade.h:2 -msgid "Change _Subject" -msgstr "Cambia _oggetto" +msgid "Change _Subject..." +msgstr "Cambia _oggetto..." #: ../data/glade/gc_control_popup_menu.glade.h:3 msgid "Click to see past conversation in this room" -msgstr "Cliccare per vedere le conversazioni precedenti di questa stanza" +msgstr "Clicca per vedere le conversazioni precedenti di questa stanza" #: ../data/glade/gc_control_popup_menu.glade.h:4 -msgid "Configure _Room" -msgstr "Configu_ra la stanza" +msgid "Configure _Room..." +msgstr "Configura la _stanza..." #: ../data/glade/gc_control_popup_menu.glade.h:5 -msgid "_Bookmark This Room" -msgstr "Inserire un _segnalibro per questa stanza" +msgid "_Bookmark" +msgstr "Aggiungi _segnalibro" + +#: ../data/glade/gc_control_popup_menu.glade.h:6 +msgid "_Destroy Room" +msgstr "_Elimina stanza" + +#: ../data/glade/gc_control_popup_menu.glade.h:8 +msgid "_Manage Room" +msgstr "Gestisci stanza" + +#: ../data/glade/gc_control_popup_menu.glade.h:9 +msgid "_Minimize on close" +msgstr "_Minimizza alla chiusura" #: ../data/glade/gc_occupants_menu.glade.h:1 msgid "Mo_derator" msgstr "Mo_deratore" -#: ../data/glade/gc_occupants_menu.glade.h:3 -msgid "_Admin" -msgstr "_Admin" +#: ../data/glade/gc_occupants_menu.glade.h:2 +msgid "Occupant Actions" +msgstr "Azioni partecipante" -#: ../data/glade/gc_occupants_menu.glade.h:4 +#: ../data/glade/gc_occupants_menu.glade.h:5 +msgid "_Admin" +msgstr "_Amministratore" + +#: ../data/glade/gc_occupants_menu.glade.h:6 msgid "_Ban" msgstr "_Bandisci" -#: ../data/glade/gc_occupants_menu.glade.h:6 +#: ../data/glade/gc_occupants_menu.glade.h:8 msgid "_Kick" msgstr "_Caccia" -#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/gc_occupants_menu.glade.h:9 msgid "_Member" msgstr "_Membro" -#: ../data/glade/gc_occupants_menu.glade.h:8 -msgid "_Occupant Actions" -msgstr "Azioni _partecipanti" - -#: ../data/glade/gc_occupants_menu.glade.h:9 +#: ../data/glade/gc_occupants_menu.glade.h:10 msgid "_Owner" msgstr "_Proprietario" -#: ../data/glade/gc_occupants_menu.glade.h:10 +#: ../data/glade/gc_occupants_menu.glade.h:11 msgid "_Send Private Message" msgstr "_Invia messaggio privato" -#: ../data/glade/gc_occupants_menu.glade.h:11 +#: ../data/glade/gc_occupants_menu.glade.h:12 msgid "_Voice" msgstr "_Voce" @@ -1135,7 +1224,7 @@ msgstr "_Voce" msgid "Create new post" msgstr "Crea nuovo post" -#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:268 +#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:271 msgid "From" msgstr "Da" @@ -1155,15 +1244,15 @@ msgid "" "If you plan to do massive deletions, please make sure Gajim is not running. " "Generally avoid deletions with contacts you currently chat with." msgstr "" -"Benvenuti al gestore delle cronologie di Gajim\n" +"Benvenuto nel gestore della cronologia di Gajim\n" "\n" -"Si possono selezionare elementi alla sinistra e/o cercare nella base dati da " -"sotto.\n" +"Puoi selezionare le conversazioni da sinistra e/o cercare nel database " +"tramite il campo in basso.\n" "\n" "ATTENZIONE:\n" -"Se si ha intenzione di cancellare molte cose, verificare che Gajim non sia " -"in esecuzione. Generalmente evitare di eliminare dati sui contatti con cui " -"si sta conversando." +"Se hai intenzione di cancellare molte cose, verifica che Gajim non sia in " +"esecuzione. Generalmente evita di eliminare conversazioni dei contatti con " +"cui stai chattando." #: ../data/glade/history_manager.glade.h:7 msgid "Delete" @@ -1175,29 +1264,51 @@ msgstr "Esporta" #: ../data/glade/history_manager.glade.h:9 msgid "Gajim History Logs Manager" -msgstr "Gestore delle cronologie di Gajim" +msgstr "Gestore cronologia di Gajim" #: ../data/glade/history_manager.glade.h:10 msgid "_Search Database" -msgstr "_Cerca base dati" +msgstr "_Cerca nel database" #: ../data/glade/history_window.glade.h:1 +msgid "History Viewer" +msgstr "Gestore cronologia" + +#: ../data/glade/history_window.glade.h:2 +msgid "JID Selection" +msgstr "Selezione JID" + +#: ../data/glade/history_window.glade.h:3 msgid "Build custom query" msgstr "Costruisci richiesta personalizzata" -#: ../data/glade/history_window.glade.h:2 +#: ../data/glade/history_window.glade.h:4 ../src/history_window.py:199 msgid "Conversation History" msgstr "Cronologia conversazione" -#: ../data/glade/history_window.glade.h:3 +#: ../data/glade/history_window.glade.h:5 +msgid "" +"Enter a contact jid or MUC jid here to view its history.\n" +"If a contact is connected you can even enter his nick name.\n" +msgstr "" +"Inserisci il JID di un contatto o di una stanza di gruppo per visualizzarne " +"la cronologia.\n" +"Se il contatto è connesso puoi anche inserire il suo nickname.\n" + +#: ../data/glade/history_window.glade.h:8 msgid "Query Builder..." msgstr "Costruttore richieste..." -#: ../data/glade/history_window.glade.h:4 +#: ../data/glade/history_window.glade.h:9 msgid "Search" msgstr "Cerca" -#: ../data/glade/history_window.glade.h:5 +#: ../data/glade/history_window.glade.h:10 +#: ../data/glade/zeroconf_information_window.glade.h:10 +msgid "_Log conversation history" +msgstr "_Memorizza cronologia conversazione" + +#: ../data/glade/history_window.glade.h:11 ../src/disco.py:1172 msgid "_Search" msgstr "_Cerca" @@ -1214,7 +1325,7 @@ msgstr "Nega" msgid "Invitation Received" msgstr "Invito ricevuto" -#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1148 +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1265 msgid "Join Group Chat" msgstr "Entra in chat di gruppo" @@ -1223,14 +1334,14 @@ msgid "Join this room automatically when I connect" msgstr "Entra automaticamente in questa stanza alla connessione" #: ../data/glade/join_groupchat_window.glade.h:3 -#: ../data/glade/manage_bookmarks_window.glade.h:4 -#: ../data/glade/profile_window.glade.h:23 -#: ../data/glade/vcard_information_window.glade.h:29 +#: ../data/glade/manage_bookmarks_window.glade.h:5 +#: ../data/glade/profile_window.glade.h:24 +#: ../data/glade/vcard_information_window.glade.h:31 msgid "Nickname:" msgstr "Nickname:" #: ../data/glade/join_groupchat_window.glade.h:4 -#: ../data/glade/manage_bookmarks_window.glade.h:5 +#: ../data/glade/manage_bookmarks_window.glade.h:6 msgid "Password:" msgstr "Password:" @@ -1239,12 +1350,12 @@ msgid "Recently:" msgstr "Recenti:" #: ../data/glade/join_groupchat_window.glade.h:6 -#: ../data/glade/manage_bookmarks_window.glade.h:7 +#: ../data/glade/manage_bookmarks_window.glade.h:8 msgid "Room:" msgstr "Stanza:" -#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1163 -#: ../src/disco.py:1546 +#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1160 +#: ../src/disco.py:1615 msgid "_Join" msgstr "_Entra" @@ -1258,21 +1369,25 @@ msgstr "Partecipa automaticamente" #: ../data/glade/manage_bookmarks_window.glade.h:2 msgid "If checked, Gajim will join this group chat on startup" -msgstr "Se marcato, all'avvio Gajim entrerà in questa chat di gruppo" +msgstr "Se marcato, Gajim entrerà in questa chat di gruppo all'avvio" #: ../data/glade/manage_bookmarks_window.glade.h:3 msgid "Manage Bookmarks" msgstr "Gestisci segnalibri" -#: ../data/glade/manage_bookmarks_window.glade.h:6 +#: ../data/glade/manage_bookmarks_window.glade.h:4 +msgid "Minimize on Auto Join" +msgstr "Minimizza automaticamente" + +#: ../data/glade/manage_bookmarks_window.glade.h:7 msgid "Print status:" msgstr "Scrivi stato:" -#: ../data/glade/manage_bookmarks_window.glade.h:8 +#: ../data/glade/manage_bookmarks_window.glade.h:9 msgid "Server:" msgstr "Server:" -#: ../data/glade/manage_bookmarks_window.glade.h:9 +#: ../data/glade/manage_bookmarks_window.glade.h:10 msgid "Title:" msgstr "Titolo:" @@ -1285,46 +1400,59 @@ msgid "Settings" msgstr "Impostazioni" #: ../data/glade/manage_proxies_window.glade.h:3 -msgid "HTTP Connect" -msgstr "Connessione HTTP" +#, fuzzy +msgid "" +"HTTP Connect\n" +"SOCKS5" +msgstr "" +"Connessione HTTP\n" +"SOCKS5" -#: ../data/glade/manage_proxies_window.glade.h:4 +#: ../data/glade/manage_proxies_window.glade.h:5 msgid "Manage Proxy Profiles" msgstr "Gestisci profili proxy" -#: ../data/glade/manage_proxies_window.glade.h:5 -#: ../data/glade/profile_window.glade.h:22 -#: ../data/glade/vcard_information_window.glade.h:28 +#: ../data/glade/manage_proxies_window.glade.h:6 +#: ../data/glade/profile_window.glade.h:23 +#: ../data/glade/vcard_information_window.glade.h:30 msgid "Name:" msgstr "Nome:" #: ../data/glade/manage_proxies_window.glade.h:7 +msgid "Pass_word:" +msgstr "Pass_word:" + +#: ../data/glade/manage_proxies_window.glade.h:8 msgid "Type:" msgstr "Tipo:" -#: ../data/glade/manage_proxies_window.glade.h:8 +#: ../data/glade/manage_proxies_window.glade.h:9 msgid "Use authentication" msgstr "Usa autenticazione" +#: ../data/glade/manage_proxies_window.glade.h:10 +msgid "_Host:" +msgstr "_Host:" + #: ../data/glade/message_window.glade.h:1 msgid "Click to insert an emoticon (Alt+M)" -msgstr "Cliccare per inserire un emoticon (Alt+M)" +msgstr "Clicca per inserire un emoticon (Alt+M)" -#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1109 +#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1213 msgid "OpenPGP Encryption" msgstr "Cifratura OpenPGP" #. 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:4 -#: ../data/glade/roster_window.glade.h:10 +#: ../data/glade/roster_window.glade.h:12 #: ../data/glade/subscription_request_window.glade.h:6 msgid "_Actions" -msgstr "A_zioni" +msgstr "_Azioni" #. 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:6 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:253 +#: ../src/filetransfers_window.py:243 msgid "_Send" msgstr "_Invia" @@ -1340,36 +1468,48 @@ msgstr "Editor di configurazione avanzata" msgid "Applications" msgstr "Applicazioni" +#: ../data/glade/preferences_window.glade.h:3 +msgid "Chat Appearance" +msgstr "Aspetto della chat" + #. a header for custom browser/client/file manager. so translate sth like: Custom Settings -#: ../data/glade/preferences_window.glade.h:4 +#: ../data/glade/preferences_window.glade.h:5 msgid "Custom" msgstr "Personalizzato" -#: ../data/glade/preferences_window.glade.h:5 +#: ../data/glade/preferences_window.glade.h:6 msgid "Format of a line" msgstr "Formato di una linea" -#: ../data/glade/preferences_window.glade.h:6 +#: ../data/glade/preferences_window.glade.h:7 msgid "GMail Options" msgstr "Opzioni GMail" -#: ../data/glade/preferences_window.glade.h:7 -msgid "Interface Customization" -msgstr "Personalizzazione dell'interfaccia" - #: ../data/glade/preferences_window.glade.h:9 msgid "Preset Status Messages" msgstr "Messaggi di stato predefiniti" +#: ../data/glade/preferences_window.glade.h:10 +msgid "Privacy" +msgstr "Privacy" + #: ../data/glade/preferences_window.glade.h:11 +msgid "Roster Appearance" +msgstr "Aspetto lista contatti" + +#: ../data/glade/preferences_window.glade.h:13 +msgid "Themes" +msgstr "Temi" + +#: ../data/glade/preferences_window.glade.h:14 msgid "Visual Notifications" msgstr "Notifiche visuali" -#: ../data/glade/preferences_window.glade.h:12 +#: ../data/glade/preferences_window.glade.h:15 msgid "Advanced" msgstr "Avanzato" -#: ../data/glade/preferences_window.glade.h:13 +#: ../data/glade/preferences_window.glade.h:16 msgid "" "All chat states\n" "Composing only\n" @@ -1379,45 +1519,41 @@ msgstr "" "Solo composizione\n" "Disattivato" -#: ../data/glade/preferences_window.glade.h:16 +#: ../data/glade/preferences_window.glade.h:19 msgid "Allow _OS information to be sent" msgstr "Consentire invio di informazioni sull'_OS" -#: ../data/glade/preferences_window.glade.h:17 +#: ../data/glade/preferences_window.glade.h:20 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "Consentire notifiche/popup quando _assente/nd/occupato/invisibile." -#: ../data/glade/preferences_window.glade.h:18 -msgid "Also known as iChat style" -msgstr "Conosciuto anche come stile iChat" - -#: ../data/glade/preferences_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:21 msgid "Always check to see if Gajim is the _default Jabber client on startup" msgstr "Verifica sempre se Gajim è il client Jabber _predefinito all'avvio" -#: ../data/glade/preferences_window.glade.h:20 +#: ../data/glade/preferences_window.glade.h:22 msgid "" "An example: If you have enabled status message for away, Gajim won't ask you " "anymore for a status message when you change your status to away; it will " "use the default one set here" msgstr "" "Un esempio: se si ha abilitato il messaggio di stato per l'assenza, Gajim " -"non chiederà più il messaggio di stato si diventa assente; verrà usato il " -"valore predefinito impostato qui" +"non chiederà più il messaggio di stato quando si diventa assente; verrà " +"usato il valore predefinito impostato qui" -#: ../data/glade/preferences_window.glade.h:21 +#: ../data/glade/preferences_window.glade.h:23 msgid "Ask status message when I:" msgstr "Chiedi messaggio di stato per:" -#: ../data/glade/preferences_window.glade.h:22 +#: ../data/glade/preferences_window.glade.h:24 msgid "Auto _away after:" msgstr "_Assente automaticamente dopo:" -#: ../data/glade/preferences_window.glade.h:23 +#: ../data/glade/preferences_window.glade.h:25 msgid "Auto _not available after:" -msgstr "N_on disponibile automaticamente dopo:" +msgstr "_Non disponibile automaticamente dopo:" -#: ../data/glade/preferences_window.glade.h:24 +#: ../data/glade/preferences_window.glade.h:26 msgid "" "Autodetect on every Gajim startup\n" "Always use GNOME default applications\n" @@ -1425,34 +1561,29 @@ msgid "" "Always use XFCE4 default applications\n" "Custom" msgstr "" -"Ricerca in automatico ad ogni avvio di Gajim\n" +"Rilevamento automatico ad ogni avvio di Gajim\n" "Usa sempre le applicazioni predefinite di GNOME\n" "Usa sempre le applicazioni predefinite di KDE\n" "Usa sempre le applicazioni predefinite XFCE4\n" -"Personalizza" +"Personalizzate" -#: ../data/glade/preferences_window.glade.h:29 ../src/chat_control.py:852 -msgid "Chat" -msgstr "Chat" - -#: ../data/glade/preferences_window.glade.h:30 +#: ../data/glade/preferences_window.glade.h:31 msgid "" "Check this option, only if someone you don't have in the roster spams/annoys " "you. Use with caution, because it blocks all messages from any contact that " "is not in the roster" -msgstr "Selezionare questa opzione solo se qualche utente fuori dalla lista contatti spamma o disturba. Usare con cautela: verranno bloccati tutti i messaggi ricevuti da chi non è membro della lista contatti." +msgstr "" +"Selezionare questa opzione solo se qualche utente fuori dalla lista contatti " +"spamma o disturba. Usare con cautela, poiché verranno bloccati tutti i " +"messaggi ricevuti da chi non è membro della lista contatti." -#: ../data/glade/preferences_window.glade.h:31 +#: ../data/glade/preferences_window.glade.h:32 msgid "Configure color and font of the interface" msgstr "Configura colore e tipo di carattere per l'interfaccia" -#: ../data/glade/preferences_window.glade.h:32 -msgid "Default Status Messages" -msgstr "Messaggio di stato" - #: ../data/glade/preferences_window.glade.h:33 -msgid "Default status _iconset:" -msgstr "_Icone stato predefinite:" +msgid "Default Status Messages" +msgstr "Messaggi di stato preimpostati" #: ../data/glade/preferences_window.glade.h:34 msgid "" @@ -1466,33 +1597,25 @@ msgstr "" #: ../data/glade/preferences_window.glade.h:37 msgid "Display _extra email details" -msgstr "Mostra _dettagli email extra" +msgstr "Mostra dettagli email _extra" #: ../data/glade/preferences_window.glade.h:38 msgid "Display a_vatars of contacts in roster" -msgstr "Mostra gli a_vatar dei contatti nella lista" +msgstr "Mostra gli a_vatar dei contatti nella lista contatti" #: ../data/glade/preferences_window.glade.h:39 msgid "Display status _messages of contacts in roster" -msgstr "Mostra i _messaggi di stato dei contatti nella lista" +msgstr "Mostra i _messaggi di stato dei contatti nella lista contatti" #: ../data/glade/preferences_window.glade.h:40 -msgid "Displayed Chat state noti_fications:" -msgstr "Noti_fiche dello stato di chat" - -#: ../data/glade/preferences_window.glade.h:41 -msgid "E_very 5 minutes" -msgstr "_Ogni 5 minuti" - -#: ../data/glade/preferences_window.glade.h:42 msgid "Emoticons:" msgstr "Emoticon:" -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:41 msgid "Events" msgstr "Eventi" -#: ../data/glade/preferences_window.glade.h:44 +#: ../data/glade/preferences_window.glade.h:42 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 " @@ -1500,9 +1623,9 @@ msgid "" msgstr "" "Gajim può ricevere ed inviare meta-informazioni relative ad una " "conversazione con un contatto. Qui è possibile specificare che stati di chat " -"si vogliono inviare al corrispondente." +"si vogliono visualizzare nella finestra di chat." -#: ../data/glade/preferences_window.glade.h:45 +#: ../data/glade/preferences_window.glade.h:43 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 " @@ -1510,30 +1633,9 @@ msgid "" msgstr "" "Gajim può ricevere ed inviare meta-informazioni relative ad una " "conversazione con un contatto. Qui è possibile specificare che stati di chat " -"si vogliono inviare al corrispondente." +"si vogliono inviare al contatto." -#: ../data/glade/preferences_window.glade.h:46 -msgid "" -"Gajim will automatically show new events by popping up the relevant window" -msgstr "Gajim mostrerà automaticamente i nuovi eventi sollevando la finestra relativa" - -#: ../data/glade/preferences_window.glade.h:47 -msgid "" -"Gajim will notify you for new events via a popup in the bottom right of the " -"screen" -msgstr "" -"Gajim notificherà i nuovi eventi tramite popup nell'angolo in fondo a destra " -"dello schermo" - -#: ../data/glade/preferences_window.glade.h:48 -msgid "" -"Gajim will notify you via a popup window in the bottom right of the screen " -"about contacts that just signed in" -msgstr "" -"Gajim notificherà tramite popup nell'angolo in fondo a destra dello schermo " -"quando un contatto si connette" - -#: ../data/glade/preferences_window.glade.h:49 +#: ../data/glade/preferences_window.glade.h:44 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1541,12 +1643,11 @@ msgstr "" "Gajim notificherà tramite popup nell'angolo in fondo a destra dello schermo " "quando un contatto si disconnette" -#: ../data/glade/preferences_window.glade.h:50 -msgid "" -"Gajim will only change the icon of the contact that triggered the new event" -msgstr "Gajim cambierà solamente l'icona del contatto fonte del nuovo evento" +#: ../data/glade/preferences_window.glade.h:46 +msgid "Hides buttons in chatwindows to " +msgstr "Nasconde i pulsanti nella finestra di chat" -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:47 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" @@ -1554,7 +1655,7 @@ msgstr "" "Se selezionato, Gajim includerà informazioni riguardo al mittente delle " "nuove email" -#: ../data/glade/preferences_window.glade.h:53 +#: ../data/glade/preferences_window.glade.h:48 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1562,7 +1663,7 @@ msgstr "" "Se marcato, Gajim mostrerà gli avatar dei contatti nella lista contatti e " "nelle chat di gruppo" -#: ../data/glade/preferences_window.glade.h:54 +#: ../data/glade/preferences_window.glade.h:49 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -1570,25 +1671,17 @@ msgstr "" "Se marcato, Gajim mostrerà il messaggio di stato di ogni membro di lista " "contatti e chat di gruppo sotto il suo nome" -#: ../data/glade/preferences_window.glade.h:55 -msgid "" -"If checked, Gajim will remember the roster and chat window positions in the " -"screen and the sizes of them next time you run it" -msgstr "" -"Se marcato, Gajim manterrà le posizioni delle finestre di chat e della lista " -"contatti sullo schermo la prossima volta che verrà eseguito" - -#: ../data/glade/preferences_window.glade.h:56 +#: ../data/glade/preferences_window.glade.h:50 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, " "etc...)" msgstr "" "Se marcato, Gajim userà icone di stato specifiche per il protocollo usato. " -"(es., un contatto MSN avrà l'icona MSN equivalente per gli stati online, " +"(es. un contatto MSN avrà l'icona MSN equivalente per gli stati disponibile, " "assente, occupato, ecc...)" -#: ../data/glade/preferences_window.glade.h:57 +#: ../data/glade/preferences_window.glade.h:51 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" @@ -1596,15 +1689,15 @@ msgstr "" "Se marcato, Gajim sostituirà gli smiley ASCII come ':)' con gli equivalenti " "emoticon grafici animati o statici" -#: ../data/glade/preferences_window.glade.h:58 +#: ../data/glade/preferences_window.glade.h:52 msgid "Ignore rich content in incoming messages" -msgstr "Ignora il rich content dei messaggi ricevuti" +msgstr "Ignora la formattazione dei messaggi ricevuti" -#: ../data/glade/preferences_window.glade.h:59 +#: ../data/glade/preferences_window.glade.h:53 msgid "Ma_nage..." msgstr "_Gestisci..." -#: ../data/glade/preferences_window.glade.h:60 +#: ../data/glade/preferences_window.glade.h:54 msgid "" "Never\n" "Always\n" @@ -1616,211 +1709,197 @@ msgstr "" "Per account\n" "Per tipo" -#: ../data/glade/preferences_window.glade.h:64 -msgid "Notify me about contacts that: " -msgstr "Notificare i contatti che eseguono:" +#: ../data/glade/preferences_window.glade.h:58 +msgid "Notify me about contacts that sign _in" +msgstr "Mostra notifica per i contatti che si _connettono" -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:59 +msgid "Notify me about contacts that sign _out" +msgstr "Mostra notifica per i contatti che si _disconnettono" + +#: ../data/glade/preferences_window.glade.h:60 msgid "Notify on new _GMail email" msgstr "Notifica le nuove e-mail su _Gmail" -#: ../data/glade/preferences_window.glade.h:66 -msgid "On every _message" -msgstr "In _tutti i messaggi" - -#: ../data/glade/preferences_window.glade.h:67 -msgid "One message _window:" -msgstr "Una _finestra messaggi:" - -#: ../data/glade/preferences_window.glade.h:68 -msgid "Outgoing Chat state noti_fications:" -msgstr "Noti_fiche dello stato di chat" - -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:61 msgid "Play _sounds" msgstr "Riproduci _suoni" -#: ../data/glade/preferences_window.glade.h:70 +#: ../data/glade/preferences_window.glade.h:62 +msgid "" +"Pop it up\n" +"Notify me about it\n" +"Show only in roster" +msgstr "" +"Mostra immediatamente\n" +"Mostra una notifica\n" +"Mostra solo nella lista contatti" + +#: ../data/glade/preferences_window.glade.h:65 msgid "Preferences" msgstr "Preferenze" -#: ../data/glade/preferences_window.glade.h:71 -msgid "Print time:" -msgstr "Scrivi ora:" +#: ../data/glade/preferences_window.glade.h:66 +msgid "Privacy" +msgstr "Privacy" -#: ../data/glade/preferences_window.glade.h:72 -msgid "Save _position and size for roster and chat windows" -msgstr "Salva _posizione e dimensione delle finestre di chat e lista contatti" - -#: ../data/glade/preferences_window.glade.h:73 +#: ../data/glade/preferences_window.glade.h:67 msgid "Set status message to reflect currently playing _music track" msgstr "" -"Imposta il messaggio di stato in modo che rifletta la traccia _musicale " -"correntemente ascoltata" +"Imposta il messaggio di stato in modo che rifletta la traccia _musicale in " +"riproduzione" -#: ../data/glade/preferences_window.glade.h:74 -msgid "Show only in _roster" -msgstr "Mostra solo nella lista _contatti" - -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:68 msgid "Sign _in" msgstr "C_onnessione" -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:69 msgid "Sign _out" msgstr "_Disconnessione" -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:70 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." msgstr "" -"Alcuni messaggi potrebbero includere con contenuto ricco (formattazione, " -"colori, ecc.). Se selezionato, Gajim li mostrerà come messaggi semplici." +"Alcuni messaggi potrebbero includere contenuto ricco (formattazione, colori, " +"ecc.). Se selezionato, Gajim li mostrerà come messaggi semplici." -#: ../data/glade/preferences_window.glade.h:78 +#: ../data/glade/preferences_window.glade.h:71 msgid "Status" msgstr "Stato" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:72 +msgid "Status _iconset:" +msgstr "_Icone di stato:" + +#: ../data/glade/preferences_window.glade.h:73 msgid "T_heme:" msgstr "T_ema:" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:74 msgid "The auto away status message" msgstr "Il messaggio di stato per l'assenza automatica" -#: ../data/glade/preferences_window.glade.h:81 +#: ../data/glade/preferences_window.glade.h:75 msgid "The auto not available status message" msgstr "Il messaggio di stato per il 'non disponibile' automatico" -#: ../data/glade/preferences_window.glade.h:82 +#: ../data/glade/preferences_window.glade.h:76 msgid "Treat all incoming messages as:" msgstr "Trattare tutti i messaggi in arrivo come:" -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:77 msgid "Use _transports iconsets" msgstr "Usa le icone dei _trasporti" -#: ../data/glade/preferences_window.glade.h:84 +#: ../data/glade/preferences_window.glade.h:78 +msgid "Use only one message _window:" +msgstr "Usa solo una _finestra dei messaggi:" + +#: ../data/glade/preferences_window.glade.h:79 msgid "Use system _default" msgstr "Usa il sistema _predefinito" -#: ../data/glade/preferences_window.glade.h:85 -msgid "Use t_rayicon (aka. notification area icon)" -msgstr "Usa _icona nell'area di notifica" +#: ../data/glade/preferences_window.glade.h:80 +msgid "When new event is received:" +msgstr "Quando si riceve un nuovo evento:" -#: ../data/glade/preferences_window.glade.h:86 -msgid "" -"When a new event (message, file transfer request etc..) is received, the " -"following methods may be used to inform you about it. Please note that " -"events about new messages only occur if it is a new message from a contact " -"you are not already chatting with" -msgstr "" -"Quando un nuovo evento (messaggio, richiesta di trasferimento file, ecc...) " -"viene ricevuto, i seguenti metodi possono venire usati per informarti di " -"ciò. Notare che gli eventi per i nuovi messaggi avverranno solo se si tratta " -"di un nuovo messaggio da un contatto con cui non si sta già chattando" - -#: ../data/glade/preferences_window.glade.h:87 -msgid "When new event is received" -msgstr "Quando si riceve un nuovo evento" - -#: ../data/glade/preferences_window.glade.h:88 +#: ../data/glade/preferences_window.glade.h:81 msgid "" "Works for Rhythmbox and Muine players. For more players, please visit http://" "trac.gajim.org/wiki/GajimAndMusicPlayer" msgstr "" -"Funziona con Rhythmbox e Muine. Per altri player visita http://trac.gajim." +"Funziona con Rhythmbox e Muine. Per altri player, visita http://trac.gajim." "org/wiki/GajimAndMusicPlayer" -#: ../data/glade/preferences_window.glade.h:89 +#: ../data/glade/preferences_window.glade.h:82 msgid "_Advanced Notifications Control..." msgstr "Controllo notifiche _avanzato..." -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:83 msgid "_Browser:" msgstr "_Browser:" -#: ../data/glade/preferences_window.glade.h:91 -msgid "_File manager:" -msgstr "Gestore _file:" +#: ../data/glade/preferences_window.glade.h:84 +msgid "_Display chat state notifications:" +msgstr "Notifica dello stato di chat in _entrata:" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:85 +msgid "_File manager:" +msgstr "_File manager:" + +#: ../data/glade/preferences_window.glade.h:86 msgid "_Font:" msgstr "_Carattere:" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:87 msgid "_Highlight misspelled words" -msgstr "Evidenzia _parole scorrette" +msgstr "_Evidenzia parole errate" -#: ../data/glade/preferences_window.glade.h:94 +#: ../data/glade/preferences_window.glade.h:88 msgid "_Ignore events from contacts not in the roster" msgstr "_Ignora gli eventi da contatti non appartenenti alla lista" -#: ../data/glade/preferences_window.glade.h:95 +#: ../data/glade/preferences_window.glade.h:89 msgid "_Incoming message:" msgstr "Messaggio in _arrivo:" -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:90 msgid "_Log status changes of contacts" msgstr "_Registra i cambiamenti di stato dei contatti" -#: ../data/glade/preferences_window.glade.h:97 +#: ../data/glade/preferences_window.glade.h:91 msgid "_Mail client:" -msgstr "_Client mail:" +msgstr "_Client di posta:" -#: ../data/glade/preferences_window.glade.h:98 -msgid "_Never" -msgstr "_Mai" +#: ../data/glade/preferences_window.glade.h:92 +msgid "_Make message windows compact" +msgstr "Rendi compatta la finestra dei _messaggi" -#: ../data/glade/preferences_window.glade.h:99 -msgid "_Notify me about it" -msgstr "_Notifica" - -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:93 msgid "_Open..." msgstr "_Apri..." -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:94 msgid "_Outgoing message:" msgstr "Messaggio in _uscita:" -#: ../data/glade/preferences_window.glade.h:102 +#: ../data/glade/preferences_window.glade.h:95 msgid "_Player:" msgstr "_Riproduttore:" -#: ../data/glade/preferences_window.glade.h:103 -msgid "_Pop it up" -msgstr "_Mostra" - -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:96 msgid "_Reset to Default Colors" msgstr "_Reimposta ai colori di default" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:97 +msgid "_Send chat state notifications:" +msgstr "Notifica dello stato di chat in usci_ta:" + +#: ../data/glade/preferences_window.glade.h:98 msgid "_Sort contacts by status" msgstr "_Ordina i contatti per stato" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:99 msgid "_Status message:" msgstr "Messaggio di _stato:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:100 msgid "_URL:" msgstr "_URL:" -#: ../data/glade/preferences_window.glade.h:108 +#: ../data/glade/preferences_window.glade.h:101 msgid "minutes" msgstr "minuti" #: ../data/glade/privacy_lists_window.glade.h:1 msgid "Privacy Lists:" -msgstr "Liste utenti bloccati:" +msgstr "Liste privacy:" #: ../data/glade/privacy_list_window.glade.h:1 msgid "Add / Edit a rule" -msgstr "Aggiungi/ modifica una regola" +msgstr "Aggiungi/modifica una regola" #: ../data/glade/privacy_list_window.glade.h:2 msgid "List of rules" @@ -1832,15 +1911,15 @@ msgstr "Lista privacy" #: ../data/glade/privacy_list_window.glade.h:4 msgid "Active for this session" -msgstr "Attivo per la sessione corrente" +msgstr "Attiva per questa sessione" #: ../data/glade/privacy_list_window.glade.h:5 msgid "Active on each startup" -msgstr "Attivo ad ogni avvio di Gajim" +msgstr "Attiva ad ogni avvio di Gajim" #: ../data/glade/privacy_list_window.glade.h:6 msgid "All" -msgstr "Tutti" +msgstr "a tutti" #: ../data/glade/privacy_list_window.glade.h:7 msgid "Allow" @@ -1854,17 +1933,17 @@ msgstr "ID Jabber" msgid "Order:" msgstr "Ordine:" -#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:1862 +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2104 msgid "Privacy List" -msgstr "Lista utenti bloccati" +msgstr "Lista privacy" #: ../data/glade/privacy_list_window.glade.h:12 msgid "all by subscription" -msgstr "tutti per abbonamento" +msgstr "a tutti per abbonamento" #: ../data/glade/privacy_list_window.glade.h:13 msgid "all in the group" -msgstr "tutti nel gruppo" +msgstr "a tutti nel gruppo" #: ../data/glade/privacy_list_window.glade.h:14 msgid "" @@ -1880,19 +1959,19 @@ msgstr "" #: ../data/glade/privacy_list_window.glade.h:18 msgid "to send me messages" -msgstr "invio di messaggi" +msgstr "di inviarmi messaggi" #: ../data/glade/privacy_list_window.glade.h:19 msgid "to send me queries" -msgstr "invio di richieste" +msgstr "di inviarmi richieste" #: ../data/glade/privacy_list_window.glade.h:20 msgid "to send me status" -msgstr "invio di stato" +msgstr "di inviarmi uno stato" #: ../data/glade/privacy_list_window.glade.h:21 msgid "to view my status" -msgstr "vedere il mio stato" +msgstr "di vedere il mio stato" #. "About" is the text of a tab of vcard window #: ../data/glade/profile_window.glade.h:2 @@ -1920,121 +1999,118 @@ msgid "City:" msgstr "Città:" #: ../data/glade/profile_window.glade.h:7 +msgid "Click to set your avatar" +msgstr "Clicca per inserire l'avatar" + +#: ../data/glade/profile_window.glade.h:8 #: ../data/glade/vcard_information_window.glade.h:10 msgid "Company:" msgstr "Società:" -#: ../data/glade/profile_window.glade.h:8 -#: ../data/glade/vcard_information_window.glade.h:13 +#: ../data/glade/profile_window.glade.h:9 +#: ../data/glade/vcard_information_window.glade.h:14 msgid "Country:" msgstr "Paese:" -#: ../data/glade/profile_window.glade.h:9 -#: ../data/glade/vcard_information_window.glade.h:14 +#: ../data/glade/profile_window.glade.h:10 +#: ../data/glade/vcard_information_window.glade.h:15 msgid "Department:" msgstr "Dipartimento:" -#: ../data/glade/profile_window.glade.h:10 -#: ../data/glade/vcard_information_window.glade.h:15 -#: ../data/glade/zeroconf_information_window.glade.h:2 -#: ../data/glade/zeroconf_properties_window.glade.h:5 -msgid "E-Mail:" -msgstr "E-Mail:" - -#: ../data/glade/profile_window.glade.h:11 -#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/profile_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:17 msgid "Extra Address:" msgstr "Indirizzo extra:" #. Family Name -#: ../data/glade/profile_window.glade.h:13 -#: ../data/glade/vcard_information_window.glade.h:18 +#: ../data/glade/profile_window.glade.h:14 +#: ../data/glade/vcard_information_window.glade.h:19 msgid "Family:" msgstr "Cognome:" #. Do NOT change sequence. Just translate YYYY and MM and DD (from Year, Month, Day accordingly) -#: ../data/glade/profile_window.glade.h:15 -#: ../data/glade/vcard_information_window.glade.h:20 +#: ../data/glade/profile_window.glade.h:16 +#: ../data/glade/vcard_information_window.glade.h:21 msgid "Format: YYYY-MM-DD" msgstr "Formato: AAAA-MM-GG" -#. Given Name #: ../data/glade/profile_window.glade.h:17 #: ../data/glade/vcard_information_window.glade.h:22 +msgid "Full Name" +msgstr "Nome completo" + +#. Given Name +#: ../data/glade/profile_window.glade.h:19 +#: ../data/glade/vcard_information_window.glade.h:24 msgid "Given:" msgstr "Nome:" -#: ../data/glade/profile_window.glade.h:18 -#: ../data/glade/vcard_information_window.glade.h:23 +#: ../data/glade/profile_window.glade.h:20 +#: ../data/glade/vcard_information_window.glade.h:25 msgid "Homepage:" msgstr "Homepage:" #. Middle Name -#: ../data/glade/profile_window.glade.h:20 -#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/profile_window.glade.h:22 +#: ../data/glade/vcard_information_window.glade.h:28 msgid "Middle:" msgstr "Secondo nome:" -#: ../data/glade/profile_window.glade.h:21 -#: ../data/glade/vcard_information_window.glade.h:27 -msgid "More" -msgstr "Ancora" - -#: ../data/glade/profile_window.glade.h:24 -#: ../data/glade/vcard_information_window.glade.h:31 +#: ../data/glade/profile_window.glade.h:25 +#: ../data/glade/vcard_information_window.glade.h:34 msgid "Personal Info" msgstr "Informazioni personali" -#: ../data/glade/profile_window.glade.h:26 -#: ../data/glade/vcard_information_window.glade.h:32 +#: ../data/glade/profile_window.glade.h:27 +#: ../data/glade/vcard_information_window.glade.h:35 msgid "Phone No.:" msgstr "Telefono:" -#: ../data/glade/profile_window.glade.h:27 -#: ../data/glade/vcard_information_window.glade.h:33 +#: ../data/glade/profile_window.glade.h:28 +#: ../data/glade/vcard_information_window.glade.h:36 msgid "Position:" msgstr "Titolo:" -#: ../data/glade/profile_window.glade.h:28 -#: ../data/glade/vcard_information_window.glade.h:34 +#: ../data/glade/profile_window.glade.h:29 +#: ../data/glade/vcard_information_window.glade.h:37 msgid "Postal Code:" msgstr "Codice postale:" #. Prefix in Name -#: ../data/glade/profile_window.glade.h:30 -#: ../data/glade/vcard_information_window.glade.h:36 +#: ../data/glade/profile_window.glade.h:31 +#: ../data/glade/vcard_information_window.glade.h:39 msgid "Prefix:" msgstr "Prefisso:" -#: ../data/glade/profile_window.glade.h:31 -#: ../data/glade/vcard_information_window.glade.h:38 ../src/vcard.py:273 +#: ../data/glade/profile_window.glade.h:32 +#: ../data/glade/vcard_information_window.glade.h:41 ../src/vcard.py:302 msgid "Role:" msgstr "Ruolo:" -#: ../data/glade/profile_window.glade.h:32 -#: ../data/glade/vcard_information_window.glade.h:39 +#: ../data/glade/profile_window.glade.h:33 +#: ../data/glade/vcard_information_window.glade.h:42 msgid "State:" msgstr "Regione:" -#: ../data/glade/profile_window.glade.h:33 -#: ../data/glade/vcard_information_window.glade.h:41 +#: ../data/glade/profile_window.glade.h:34 +#: ../data/glade/vcard_information_window.glade.h:44 msgid "Street:" msgstr "Via:" #. Suffix in Name -#: ../data/glade/profile_window.glade.h:35 -#: ../data/glade/vcard_information_window.glade.h:45 +#: ../data/glade/profile_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:48 msgid "Suffix:" msgstr "Suffisso:" -#: ../data/glade/profile_window.glade.h:36 -#: ../data/glade/vcard_information_window.glade.h:46 +#: ../data/glade/profile_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:50 msgid "Work" msgstr "Lavoro" #: ../data/glade/remove_account_window.glade.h:1 msgid "What do you want to do?" -msgstr "Cosa fare?" +msgstr "Cosa vuoi fare?" #: ../data/glade/remove_account_window.glade.h:2 msgid "Remove account _only from Gajim" @@ -2042,135 +2118,165 @@ msgstr "Rimuovi l'account solo da _Gajim" #: ../data/glade/remove_account_window.glade.h:3 msgid "Remove account from Gajim and from _server" -msgstr "Eliminare l'account da Gajim e dal _server" +msgstr "Rimuovi l'account da Gajim e dal _server" + +#. Remove +#. Remove group +#. Remove +#: ../data/glade/remove_account_window.glade.h:4 +#: ../data/glade/roster_contact_context_menu.glade.h:18 +#: ../src/roster_window.py:2524 ../src/roster_window.py:2734 +#: ../src/roster_window.py:2870 +msgid "_Remove" +msgstr "_Elimina" #: ../data/glade/roster_contact_context_menu.glade.h:1 msgid "A_sk to see his/her status" msgstr "_Chiedi di poter vedere il suo stato" #: ../data/glade/roster_contact_context_menu.glade.h:2 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:1 -msgid "Add Special _Notification" -msgstr "Crea _notifica speciale" +msgid "Add Special _Notification..." +msgstr "Aggiungi _notifica speciale..." #: ../data/glade/roster_contact_context_menu.glade.h:3 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:2 -msgid "Assign Open_PGP Key" -msgstr "Assegna chiave Open_PGP" +msgid "Assign Open_PGP Key..." +msgstr "Assegna chiave Open_PGP..." #: ../data/glade/roster_contact_context_menu.glade.h:4 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:3 -#: ../src/roster_window.py:2076 -msgid "Edit _Groups" -msgstr "Modifica _gruppi" +msgid "Edit _Groups..." +msgstr "Modifica _gruppi..." +#. Execute Command #: ../data/glade/roster_contact_context_menu.glade.h:5 -#: ../src/roster_window.py:2211 +#: ../src/roster_window.py:2827 msgid "Execute Command..." -msgstr "Esegui Comando..." +msgstr "Esegui comando..." +#. Invite to Groupchat #: ../data/glade/roster_contact_context_menu.glade.h:6 -#: ../src/roster_window.py:2034 +#: ../src/roster_window.py:2440 msgid "In_vite to" msgstr "In_vita a " +#. Send Custom Status #: ../data/glade/roster_contact_context_menu.glade.h:7 -#: ../data/glade/systray_context_menu.glade.h:2 -msgid "Send Single _Message" -msgstr "Invia _messaggio singolo" +#: ../src/roster_window.py:2664 ../src/roster_window.py:2798 +msgid "Send Cus_tom Status" +msgstr "Invia s_tato personalizzato" + +#: ../data/glade/roster_contact_context_menu.glade.h:8 +msgid "Send Single _Message..." +msgstr "Invia _messaggio singolo..." #: ../data/glade/roster_contact_context_menu.glade.h:9 +msgid "Send _File..." +msgstr "Invia _file..." + +#: ../data/glade/roster_contact_context_menu.glade.h:10 +msgid "Set Custom _Avatar..." +msgstr "Imposta _avatar personalizzato..." + +#: ../data/glade/roster_contact_context_menu.glade.h:11 #: ../data/glade/zeroconf_contact_context_menu.glade.h:5 msgid "Start _Chat" msgstr "Inizia _chat" -#: ../data/glade/roster_contact_context_menu.glade.h:11 +#: ../data/glade/roster_contact_context_menu.glade.h:13 msgid "_Allow him/her to see my status" msgstr "Permetti di _vedere il mio stato" -#: ../data/glade/roster_contact_context_menu.glade.h:12 +#: ../data/glade/roster_contact_context_menu.glade.h:14 +#: ../src/roster_window.py:2514 ../src/roster_window.py:2725 +msgid "_Block" +msgstr "_Blocca" + +#: ../data/glade/roster_contact_context_menu.glade.h:15 msgid "_Forbid him/her to see my status" msgstr "_Proibisci di vedere il mio stato" -#. Remove group -#: ../data/glade/roster_contact_context_menu.glade.h:14 -#: ../src/roster_window.py:2028 ../src/roster_window.py:2125 -#: ../src/roster_window.py:2232 -msgid "_Remove from Roster" -msgstr "_Elimina dai contatti" - -#: ../data/glade/roster_contact_context_menu.glade.h:15 +#: ../data/glade/roster_contact_context_menu.glade.h:17 #: ../data/glade/zeroconf_contact_context_menu.glade.h:7 -#: ../src/roster_window.py:2220 -msgid "_Rename" -msgstr "_Rinomina" +msgid "_Manage Contact" +msgstr "_Gestisci contatto" -#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/roster_contact_context_menu.glade.h:19 +msgid "_Rename..." +msgstr "_Rinomina..." + +#: ../data/glade/roster_contact_context_menu.glade.h:20 msgid "_Subscription" msgstr "_Abbonamento" +#: ../data/glade/roster_contact_context_menu.glade.h:21 +#: ../src/roster_window.py:2508 ../src/roster_window.py:2719 +msgid "_Unblock" +msgstr "_Sblocca" + #: ../data/glade/roster_window.glade.h:1 msgid "A_ccounts" msgstr "_Account" #: ../data/glade/roster_window.glade.h:2 -msgid "Add _Contact" -msgstr "Aggiungi _contatto" +msgid "Add _Contact..." +msgstr "Aggiungi _contatto......" #: ../data/glade/roster_window.glade.h:3 +msgid "Fea_tures" +msgstr "Fun_zioni" + +#: ../data/glade/roster_window.glade.h:4 msgid "File _Transfers" msgstr "_Trasferimenti file" -#: ../data/glade/roster_window.glade.h:4 +#: ../data/glade/roster_window.glade.h:5 msgid "Frequently Asked Questions (online)" msgstr "Domande frequenti (online)" -#: ../data/glade/roster_window.glade.h:6 +#: ../data/glade/roster_window.glade.h:7 msgid "Help online" msgstr "Aiuto online" -#: ../data/glade/roster_window.glade.h:7 +#: ../data/glade/roster_window.glade.h:9 msgid "Profile, A_vatar" msgstr "Profilo, a_vatar" -#: ../data/glade/roster_window.glade.h:8 +#: ../data/glade/roster_window.glade.h:10 msgid "Show Trans_ports" msgstr "Mostra tras_porti" -#: ../data/glade/roster_window.glade.h:9 +#: ../data/glade/roster_window.glade.h:11 msgid "Show _Offline Contacts" msgstr "Mostra contatti _offline" -#: ../data/glade/roster_window.glade.h:12 +#: ../data/glade/roster_window.glade.h:14 msgid "_Contents" msgstr "_Contenuti" -#: ../data/glade/roster_window.glade.h:13 -msgid "_Discover Services" -msgstr "_Ricerca servizi" - -#: ../data/glade/roster_window.glade.h:14 ../src/disco.py:1284 -#: ../src/roster_window.py:2203 +#: ../data/glade/roster_window.glade.h:16 ../src/disco.py:1348 msgid "_Edit" msgstr "_Modifica" -#: ../data/glade/roster_window.glade.h:15 +#: ../data/glade/roster_window.glade.h:17 msgid "_FAQ" msgstr "_Domande frequenti" -#: ../data/glade/roster_window.glade.h:17 +#: ../data/glade/roster_window.glade.h:18 msgid "_Help" msgstr "_Aiuto" -#: ../data/glade/roster_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:19 msgid "_Preferences" msgstr "_Preferenze" -#: ../data/glade/roster_window.glade.h:19 +#: ../data/glade/roster_window.glade.h:20 msgid "_Quit" msgstr "_Esci" #: ../data/glade/roster_window.glade.h:21 +msgid "_Send Single Message..." +msgstr "Invia _messaggio singolo..." + +#: ../data/glade/roster_window.glade.h:23 msgid "_View" msgstr "_Visualizza" @@ -2182,10 +2288,6 @@ msgstr "_Vai" msgid "_Address:" msgstr "_Indirizzo:" -#: ../data/glade/service_discovery_window.glade.h:3 -msgid "_Filter:" -msgstr "_Filtro:" - #: ../data/glade/service_registration_window.glade.h:1 msgid "Register to" msgstr "Registra a" @@ -2250,7 +2352,8 @@ msgstr "Autorizza il contatto affinché sappia quando sei connesso" msgid "" "Deny authorization from contact so he or she cannot know when you're " "connected" -msgstr "Nega l'autorizzazione al contatto cosicché non sappia quando sei connesso" +msgstr "" +"Nega l'autorizzazione al contatto cosicché non sappia quando sei connesso" #: ../data/glade/subscription_request_window.glade.h:4 msgid "Subscription Request" @@ -2264,6 +2367,10 @@ msgstr "_Nega" msgid "Mute Sounds" msgstr "Disabilita suoni" +#: ../data/glade/systray_context_menu.glade.h:2 +msgid "Send Single _Message" +msgstr "Invia _messaggio singolo" + #: ../data/glade/systray_context_menu.glade.h:3 msgid "Show All Pending _Events" msgstr "Mostra tutti gli _eventi in attesa" @@ -2276,6 +2383,10 @@ msgstr "Mostra lista _contatti" msgid "Sta_tus" msgstr "Sta_to" +#: ../data/glade/systray_context_menu.glade.h:6 +msgid "_Group Chat" +msgstr "Chat di _gruppo" + #. Given Name #: ../data/glade/vcard_information_window.glade.h:5 msgid "Ask:" @@ -2290,43 +2401,44 @@ msgid "Comments" msgstr "Commenti" #: ../data/glade/vcard_information_window.glade.h:11 +msgid "Configured avatar:" +msgstr "Avatar personalizzato:" + +#: ../data/glade/vcard_information_window.glade.h:12 #: ../data/glade/zeroconf_information_window.glade.h:1 msgid "Contact" msgstr "Contatto" -#: ../data/glade/vcard_information_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:13 msgid "Contact Information" msgstr "Informazioni sul contatto" -#: ../data/glade/vcard_information_window.glade.h:24 -#: ../data/glade/zeroconf_information_window.glade.h:4 -#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:416 -msgid "Jabber ID:" -msgstr "ID Jabber: " +#: ../data/glade/vcard_information_window.glade.h:29 +msgid "More" +msgstr "Ancora" -#: ../data/glade/vcard_information_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:33 msgid "OS:" msgstr "OS:" -#: ../data/glade/vcard_information_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:40 #: ../data/glade/zeroconf_information_window.glade.h:8 msgid "Resource:" msgstr "Risorsa:" -#: ../data/glade/vcard_information_window.glade.h:40 +#: ../data/glade/vcard_information_window.glade.h:43 #: ../data/glade/zeroconf_information_window.glade.h:9 msgid "Status:" msgstr "Stato:" #. Family Name -#: ../data/glade/vcard_information_window.glade.h:43 +#: ../data/glade/vcard_information_window.glade.h:46 msgid "Subscription:" msgstr "Abbonamento:" -#: ../data/glade/vcard_information_window.glade.h:47 -#: ../data/glade/zeroconf_information_window.glade.h:10 -msgid "_Log conversation history" -msgstr "_Memorizza cronologia conversazione" +#: ../data/glade/vcard_information_window.glade.h:49 +msgid "User avatar:" +msgstr "Avatar dell'utente:" #: ../data/glade/xml_console_window.glade.h:1 msgid "Jabber Traffic" @@ -2336,11 +2448,6 @@ msgstr "Traffico Jabber" msgid "XML Input" msgstr "Inserimento XML" -#. XML Console enable checkbutton -#: ../data/glade/xml_console_window.glade.h:4 -msgid "Enable" -msgstr "Abilita" - #. Info/Query make the "IQ" initials. So translate like this 'YourLang/YourLang (Info/Query)'. Thanks (it's a tooltip so width is not a problem) #: ../data/glade/xml_console_window.glade.h:6 msgid "Info/Query" @@ -2349,7 +2456,7 @@ msgstr "Info/Richiesta (Info/Query)" #. Info/Query: all(?) jabber xml start with , sends action to the current group chat. Use third " +"person. (e.g. /%s explodes.)" +msgstr "" +"Utilizzo: /%s , invia l'azione alla stanza corrente. Usare la terza " +"persona (esempio: /%s esplode)." + +#: ../src/chat_control.py:1286 +#, python-format +msgid "Usage: /%s, sends a ping to the contact" +msgstr "Utilizzo: /%s, invia un ping al contatto" + +#: ../src/chat_control.py:1289 +#, python-format +msgid "Usage: /%s, send the message to the contact" +msgstr "Utilizzo: /%s, invia il messaggio al contatto" + +#: ../src/chat_control.py:1292 ../src/groupchat_control.py:1492 +#, python-format +msgid "No help info for /%s" +msgstr "Non esiste aiuto per /%s" + +#: ../src/chat_control.py:1430 ../src/chat_control.py:1456 msgid "Encryption enabled" msgstr "Cifratura attivata" -#: ../src/chat_control.py:1264 +#: ../src/chat_control.py:1435 +msgid "Session WILL be logged" +msgstr "La sessione SARÀ registrata" + +#: ../src/chat_control.py:1437 +msgid "Session WILL NOT be logged" +msgstr "La sessione NON SARÀ registrata" + +#: ../src/chat_control.py:1444 +msgid "The following message was NOT encrypted" +msgstr "Il seguente messaggio NON è stato cifrato" + +#: ../src/chat_control.py:1448 ../src/chat_control.py:1461 +#: ../src/chat_control.py:2090 msgid "Encryption disabled" msgstr "Cifratura disattivata" #. add_to_roster_menuitem -#: ../src/chat_control.py:1406 ../src/conversation_textview.py:493 -#: ../src/dialogs.py:629 ../src/gajim.py:842 ../src/gajim.py:843 -#: ../src/gajim.py:1187 ../src/roster_window.py:332 -#: ../src/roster_window.py:410 ../src/roster_window.py:1498 -#: ../src/roster_window.py:1508 ../src/roster_window.py:1684 -#: ../src/roster_window.py:1890 ../src/roster_window.py:2475 -#: ../src/roster_window.py:3900 ../src/roster_window.py:3902 -#: ../src/common/contacts.py:73 ../src/common/helpers.py:43 -#: ../src/common/helpers.py:255 +#: ../src/chat_control.py:1618 ../src/conversation_textview.py:562 +#: ../src/dialogs.py:674 ../src/gajim.py:894 ../src/gajim.py:895 +#: ../src/gajim.py:1369 ../src/gajim.py:1662 ../src/roster_window.py:345 +#: ../src/roster_window.py:429 ../src/roster_window.py:1790 +#: ../src/roster_window.py:1800 ../src/roster_window.py:2039 +#: ../src/roster_window.py:2277 ../src/roster_window.py:3125 +#: ../src/roster_window.py:3351 ../src/roster_window.py:4711 +#: ../src/roster_window.py:4713 ../src/common/contacts.py:84 +#: ../src/common/helpers.py:44 ../src/common/helpers.py:258 msgid "Not in Roster" msgstr "Non nei contatti" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:1550 +#: ../src/chat_control.py:1762 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Hai appena ricevuto un nuovo messaggio da \"%s\"" -#: ../src/chat_control.py:1551 +#: ../src/chat_control.py:1763 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." msgstr "" -"Se questa scheda viene chiusa e la cronologia è disabilitata, questo " -"messaggio verrà perso." +"Se chiudi questa scheda e la cronologia è disabilitata, questo messaggio " +"verrà perso." -#: ../src/config.py:137 ../src/config.py:588 +#: ../src/config.py:122 ../src/config.py:544 msgid "Disabled" msgstr "Disabilitato" -#: ../src/config.py:231 -#, python-format -msgid "Every %s _minutes" -msgstr "Ogni %s _minuti" - -#: ../src/config.py:353 +#: ../src/config.py:288 msgid "Active" msgstr "Attivo" -#: ../src/config.py:361 +#: ../src/config.py:296 msgid "Event" msgstr "Evento" -#: ../src/config.py:684 ../src/gajim.py:2222 +#: ../src/config.py:617 ../src/dialogs.py:958 #, python-format msgid "Dictionary for lang %s not available" msgstr "Dizionario per lingua %s non disponibile" -#: ../src/config.py:685 ../src/gajim.py:2223 +#: ../src/config.py:618 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -2654,249 +2797,256 @@ msgstr "" "E' necessario installare il dizionario %s per usare il controllo " "ortografico, o configurare un'altra lingua nelle opzioni speller_language" -#: ../src/config.py:1009 +#: ../src/config.py:969 msgid "status message title" msgstr "titolo del messaggio di stato" -#: ../src/config.py:1009 +#: ../src/config.py:969 msgid "status message text" msgstr "testo del messaggio di stato" -#: ../src/config.py:1045 +#: ../src/config.py:1005 msgid "First Message Received" msgstr "Primo messaggio ricevuto" -#: ../src/config.py:1046 +#: ../src/config.py:1006 msgid "Next Message Received" msgstr "Prossimo messaggio ricevuto" -#: ../src/config.py:1047 +#: ../src/config.py:1007 msgid "Contact Connected" msgstr "Contatto connesso" -#: ../src/config.py:1048 +#: ../src/config.py:1008 msgid "Contact Disconnected" msgstr "Contatto disconnesso" -#: ../src/config.py:1049 +#: ../src/config.py:1009 msgid "Message Sent" msgstr "Messaggio inviato" -#: ../src/config.py:1050 +#: ../src/config.py:1010 msgid "Group Chat Message Highlight" msgstr "Evidenziatura messaggi in chat di gruppo" -#: ../src/config.py:1051 +#: ../src/config.py:1011 msgid "Group Chat Message Received" msgstr "Messaggio ricevuto in chat di gruppo" -#: ../src/config.py:1058 +#: ../src/config.py:1018 msgid "GMail Email Received" msgstr "Email GMail ricevuta" -#: ../src/config.py:1261 -msgid "OpenPGP is not usable in this computer" -msgstr "Non è possibile usare OpenPGP su questo computer" +#. Name column +#: ../src/config.py:1287 ../src/dialogs.py:1397 ../src/dialogs.py:1461 +#: ../src/disco.py:736 ../src/disco.py:1559 ../src/disco.py:1805 +#: ../src/history_window.py:108 +msgid "Name" +msgstr "Nome" -#: ../src/config.py:1307 -msgid "You are currently connected to the server" -msgstr "Si è ora connessi al server" - -#: ../src/config.py:1308 -msgid "To change the account name, you must be disconnected." -msgstr "Per cambiare nome account, è necessario disconnettersi." - -#: ../src/config.py:1311 ../src/config.py:1905 -msgid "Unread events" -msgstr "Eventi non letti" - -#: ../src/config.py:1312 -msgid "To change the account name, you must read all pending events." -msgstr "Per cambiare nome account, è necessario leggere tutti gli eventi in attesa." - -#: ../src/config.py:1316 -msgid "Account Name Already Used" -msgstr "Nome account già in uso" - -#: ../src/config.py:1317 -msgid "" -"This name is already used by another of your accounts. Please choose another " -"name." -msgstr "Questo nome è già usato da un altro account. Scegliere un altro nome." - -#: ../src/config.py:1321 ../src/config.py:1325 -msgid "Invalid account name" -msgstr "Il nome account non è valido" - -#: ../src/config.py:1322 -msgid "Account name cannot be empty." -msgstr "Il nome account non può essere vuoto." - -#: ../src/config.py:1326 -msgid "Account name cannot contain spaces." -msgstr "Il nome account non può contenere spazi." - -#: ../src/config.py:1334 ../src/config.py:1340 ../src/config.py:1350 -#: ../src/config.py:3008 -msgid "Invalid Jabber ID" -msgstr "ID Jabber non valido" - -#: ../src/config.py:1341 -msgid "A Jabber ID must be in the form \"user@servername\"." -msgstr "Un ID Jabber deve essere nella forma \"utente@nomeserver\"." - -#: ../src/config.py:1400 -msgid "Invalid entry" -msgstr "Voce non valida" - -#: ../src/config.py:1401 -msgid "Custom port must be a port number." -msgstr "Si deve scegliere un numero di porta." - -#: ../src/config.py:1529 ../src/common/config.py:366 +#: ../src/config.py:1395 ../src/common/config.py:375 msgid "Be right back." msgstr "Torno subito." -#: ../src/config.py:1539 +#: ../src/config.py:1399 msgid "Relogin now?" msgstr "Effettuare un nuovo login?" -#: ../src/config.py:1540 +#: ../src/config.py:1400 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "" "Se si vogliono applicare subito i cambiamenti, è necessario effettuare un " "nuovo login." -#: ../src/config.py:1566 -msgid "No such account available" -msgstr "Questo account non è disponibile" +#: ../src/config.py:1495 ../src/config.py:1594 +msgid "OpenPGP is not usable in this computer" +msgstr "Non è possibile usare OpenPGP su questo computer" -#: ../src/config.py:1567 -msgid "You must create your account before editing your personal information." -msgstr "" -"È necessario creare un nuovo account prima di poter modificare le " -"informazioni personali." +#: ../src/config.py:1630 ../src/config.py:1674 +msgid "Unread events" +msgstr "Eventi non letti" -#: ../src/config.py:1574 ../src/dialogs.py:1130 ../src/dialogs.py:1316 -#: ../src/disco.py:419 ../src/profile_window.py:313 -msgid "You are not connected to the server" -msgstr "Non si è connessi al server" - -#: ../src/config.py:1575 -msgid "Without a connection, you can not edit your personal information." -msgstr "" -"Senza una connessione, non è possibile modificare le informazioni personali." - -#: ../src/config.py:1579 -msgid "Your server doesn't support Vcard" -msgstr "Il server non supporta Vcard" - -#: ../src/config.py:1580 -msgid "Your server can't save your personal information." -msgstr "Il server non può salvare le informazioni personali." - -#: ../src/config.py:1604 ../src/config.py:3396 -msgid "Failed to get secret keys" -msgstr "Fallimento nella ricezione delle chiavi segrete" - -#: ../src/config.py:1605 ../src/config.py:3397 -msgid "There was a problem retrieving your OpenPGP secret keys." -msgstr "C'è stato un problema nel recuperare le chiavi segrete OpenPGP." - -#: ../src/config.py:1608 ../src/config.py:3400 -msgid "OpenPGP Key Selection" -msgstr "Scelta chiave OpenPGP" - -#: ../src/config.py:1609 ../src/config.py:3401 -msgid "Choose your OpenPGP key" -msgstr "Scegliere la chiave OpenPGP" - -#. Name column -#: ../src/config.py:1839 ../src/disco.py:740 ../src/disco.py:1495 -#: ../src/disco.py:1733 ../src/history_window.py:78 -msgid "Name" -msgstr "Nome" - -#: ../src/config.py:1842 -msgid "Server" -msgstr "Server" - -#: ../src/config.py:1906 +#: ../src/config.py:1631 msgid "Read all pending events before removing this account." msgstr "Leggere tutti gli eventi in attesa prima di rimuovere questo account." -#: ../src/config.py:1943 +#: ../src/config.py:1660 #, python-format msgid "You have opened chat in account %s" msgstr "Hai aperto una chat nell'account %s" -#: ../src/config.py:1944 +#: ../src/config.py:1661 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "" "Tutte le finestre di chat e le chat di gruppo saranno chiuse. Desideri " "continuare?" -#: ../src/config.py:2003 +#: ../src/config.py:1670 +msgid "You are currently connected to the server" +msgstr "Si è ora connessi al server" + +#: ../src/config.py:1671 +msgid "To change the account name, you must be disconnected." +msgstr "Per cambiare nome account, è necessario disconnettersi." + +#: ../src/config.py:1675 +msgid "To change the account name, you must read all pending events." +msgstr "" +"Per cambiare nome account, è necessario leggere tutti gli eventi in attesa." + +#: ../src/config.py:1681 +msgid "Account Name Already Used" +msgstr "Nome account già in uso" + +#: ../src/config.py:1682 +msgid "" +"This name is already used by another of your accounts. Please choose another " +"name." +msgstr "Questo nome è già usato da un altro account. Scegliere un altro nome." + +#: ../src/config.py:1686 ../src/config.py:1690 +msgid "Invalid account name" +msgstr "Il nome account non è valido" + +#: ../src/config.py:1687 +msgid "Account name cannot be empty." +msgstr "Il nome account non può essere vuoto." + +#: ../src/config.py:1691 +msgid "Account name cannot contain spaces." +msgstr "Il nome account non può contenere spazi." + +#: ../src/config.py:1755 +msgid "Rename Account" +msgstr "Rinomina account" + +#: ../src/config.py:1756 +#, python-format +msgid "Enter a new name for account %s" +msgstr "Inserisci un nuovo nome per l'account %s" + +#: ../src/config.py:1774 ../src/config.py:1782 ../src/config.py:1822 +#: ../src/config.py:3048 +msgid "Invalid Jabber ID" +msgstr "ID Jabber non valido" + +#: ../src/config.py:1783 +msgid "A Jabber ID must be in the form \"user@servername\"." +msgstr "Un ID Jabber deve essere nella forma \"utente@nomeserver\"." + +#: ../src/config.py:1968 ../src/config.py:3119 +msgid "Invalid entry" +msgstr "Voce non valida" + +#: ../src/config.py:1969 ../src/config.py:3120 +msgid "Custom port must be a port number." +msgstr "Si deve scegliere un numero di porta." + +#: ../src/config.py:1990 +msgid "Failed to get secret keys" +msgstr "Fallimento nella ricezione delle chiavi segrete" + +#: ../src/config.py:1991 +msgid "There was a problem retrieving your OpenPGP secret keys." +msgstr "C'è stato un problema nel recuperare le chiavi segrete OpenPGP." + +#: ../src/config.py:1994 +msgid "OpenPGP Key Selection" +msgstr "Scelta chiave OpenPGP" + +#: ../src/config.py:1995 +msgid "Choose your OpenPGP key" +msgstr "Scegliere la chiave OpenPGP" + +#: ../src/config.py:2052 +msgid "No such account available" +msgstr "Questo account non è disponibile" + +#: ../src/config.py:2053 +msgid "You must create your account before editing your personal information." +msgstr "" +"È necessario creare un nuovo account prima di poter modificare le " +"informazioni personali." + +#: ../src/config.py:2060 ../src/dialogs.py:1244 ../src/dialogs.py:1385 +#: ../src/dialogs.py:1565 ../src/disco.py:420 ../src/profile_window.py:325 +msgid "You are not connected to the server" +msgstr "Non si è connessi al server" + +#: ../src/config.py:2061 +msgid "Without a connection, you can not edit your personal information." +msgstr "" +"Senza una connessione, non è possibile modificare le informazioni personali." + +#: ../src/config.py:2065 +msgid "Your server doesn't support Vcard" +msgstr "Il server non supporta Vcard" + +#: ../src/config.py:2066 +msgid "Your server can't save your personal information." +msgstr "Il server non può salvare le informazioni personali." + +#: ../src/config.py:2097 msgid "Account Local already exists." msgstr "Nome account già in uso" -#: ../src/config.py:2004 +#: ../src/config.py:2098 msgid "Please rename or remove it before enabling link-local messaging." msgstr "" "Per favore rinominalo o rimuovilo prima di abilitare la messaggistica sulla " "rete locale." -#: ../src/config.py:2238 +#: ../src/config.py:2274 #, python-format msgid "Edit %s" msgstr "Modifica %s" -#: ../src/config.py:2240 +#: ../src/config.py:2276 #, python-format msgid "Register to %s" msgstr "Registra a %s" #. list at the beginning -#: ../src/config.py:2306 +#: ../src/config.py:2312 msgid "Ban List" msgstr "Lista utenti bloccati" -#: ../src/config.py:2307 +#: ../src/config.py:2313 msgid "Member List" msgstr "Lista membri" -#: ../src/config.py:2308 +#: ../src/config.py:2314 msgid "Owner List" msgstr "Lista proprietari" -#: ../src/config.py:2309 +#: ../src/config.py:2315 msgid "Administrator List" msgstr "Lista amministratori" #. Address column #. holds JID (who said this) -#: ../src/config.py:2342 ../src/disco.py:747 ../src/history_manager.py:155 +#: ../src/config.py:2364 ../src/disco.py:743 ../src/history_manager.py:155 msgid "JID" msgstr "JID" -#: ../src/config.py:2350 +#: ../src/config.py:2372 msgid "Reason" msgstr "Motivo" -#: ../src/config.py:2355 +#: ../src/config.py:2377 msgid "Nick" msgstr "Nickname" -#: ../src/config.py:2359 +#: ../src/config.py:2381 msgid "Role" msgstr "Ruolo" -#: ../src/config.py:2380 +#: ../src/config.py:2406 msgid "Banning..." msgstr "Sto bloccando..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2382 +#: ../src/config.py:2408 msgid "" "Whom do you want to ban?\n" "\n" @@ -2904,11 +3054,11 @@ msgstr "" "Chi si vuole bloccare?\n" "\n" -#: ../src/config.py:2384 +#: ../src/config.py:2410 msgid "Adding Member..." msgstr "Aggiunta membro..." -#: ../src/config.py:2385 +#: ../src/config.py:2411 msgid "" "Whom do you want to make a member?\n" "\n" @@ -2916,11 +3066,11 @@ msgstr "" "Chi si vuole rendere membro?\n" "\n" -#: ../src/config.py:2387 +#: ../src/config.py:2413 msgid "Adding Owner..." msgstr "Aggiunta proprietario..." -#: ../src/config.py:2388 +#: ../src/config.py:2414 msgid "" "Whom do you want to make an owner?\n" "\n" @@ -2928,11 +3078,11 @@ msgstr "" "Chi si vuole rendere proprietario?\n" "\n" -#: ../src/config.py:2390 +#: ../src/config.py:2416 msgid "Adding Administrator..." msgstr "Aggiunta amministratore..." -#: ../src/config.py:2391 +#: ../src/config.py:2417 msgid "" "Whom do you want to make an administrator?\n" "\n" @@ -2940,7 +3090,7 @@ msgstr "" "Chi si vuole rendere amministratore?\n" "\n" -#: ../src/config.py:2392 +#: ../src/config.py:2418 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" @@ -2957,124 +3107,119 @@ msgstr "" "4. dominio (il dominio corrisponde, così come qualsiasi utente@dominio,\n" "dominio/risorsa, o indirizzo contenente un sottodominio)." -#: ../src/config.py:2497 +#: ../src/config.py:2522 #, python-format msgid "Removing %s account" msgstr "Eliminazione account %s" -#: ../src/config.py:2514 ../src/roster_window.py:2733 +#: ../src/config.py:2539 ../src/gajim.py:1312 ../src/roster_window.py:3410 msgid "Password Required" msgstr "Password richiesta" -#: ../src/config.py:2515 ../src/roster_window.py:2729 +#: ../src/config.py:2540 ../src/roster_window.py:3406 #, python-format msgid "Enter your password for account %s" msgstr "Inserire la password per l'account %s" -#: ../src/config.py:2516 ../src/roster_window.py:2734 +#: ../src/config.py:2541 ../src/roster_window.py:3411 msgid "Save password" msgstr "Memorizza password" -#: ../src/config.py:2530 +#: ../src/config.py:2555 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "L'account \"%s\" è connesso al server" -#: ../src/config.py:2531 +#: ../src/config.py:2556 msgid "If you remove it, the connection will be lost." msgstr "Se viene rimosso, la connessione verrà persa." -#: ../src/config.py:2616 +#: ../src/config.py:2649 msgid "Default" msgstr "Predefinito" -#: ../src/config.py:2616 +#: ../src/config.py:2649 msgid "?print_status:All" msgstr "?print_status:Tutti" -#: ../src/config.py:2617 +#: ../src/config.py:2650 msgid "Enter and leave only" msgstr "Solo ingresso ed uscita" -#: ../src/config.py:2618 +#: ../src/config.py:2651 msgid "?print_status:None" msgstr "Nessuno" -#: ../src/config.py:2686 +#: ../src/config.py:2720 msgid "New Group Chat" msgstr "Nuova chat di gruppo" -#: ../src/config.py:2719 +#: ../src/config.py:2753 msgid "This bookmark has invalid data" msgstr "Questo segnalibro contiene dati non validi" -#: ../src/config.py:2720 +#: ../src/config.py:2754 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" "Controllare di avere compilato i campi server e stanza, o eliminare questo " "segnalibro." -#: ../src/config.py:2983 +#: ../src/config.py:3031 msgid "Invalid username" msgstr "Nome utente non valido" -#: ../src/config.py:2984 +#: ../src/config.py:3033 msgid "You must provide a username to configure this account." msgstr "È necessario inserire un nome utente per configurare questo account." -#: ../src/config.py:2994 ../src/dialogs.py:1335 -msgid "Invalid password" -msgstr "Password non valida" - -#: ../src/config.py:2995 -msgid "You must enter a password for the new account." -msgstr "È necessario inserire una password per il nuovo account." - -#: ../src/config.py:2999 ../src/dialogs.py:1340 -msgid "Passwords do not match" -msgstr "Le password non coincidono" - -#: ../src/config.py:3000 ../src/dialogs.py:1341 -msgid "The passwords typed in both fields must be identical." -msgstr "Le password immesse nei due campi devono essere identiche." - -#: ../src/config.py:3019 +#: ../src/config.py:3059 msgid "Duplicate Jabber ID" msgstr "ID Jabber duplicato" -#: ../src/config.py:3020 +#: ../src/config.py:3060 msgid "This account is already configured in Gajim." msgstr "Questo account è già configurato in Gajim." -#: ../src/config.py:3037 +#: ../src/config.py:3077 msgid "Account has been added successfully" msgstr "L'account è stato aggiunto con successo" -#: ../src/config.py:3038 ../src/config.py:3073 +#: ../src/config.py:3078 ../src/config.py:3223 msgid "" "You can set advanced account options by pressing the Advanced button, or " "later by choosing the Accounts menuitem under the Edit menu from the main " "window." -msgstr "È possibile impostare ora le opzioni avanzate premendo il pulsante \"Avanzate\", o farlo più tardi scegliendo la voce \"Account\" nel menu \"Modifica\" della finestra principale." +msgstr "" +"È possibile impostare ora le opzioni avanzate premendo il pulsante \"Avanzate" +"\", o farlo più tardi scegliendo la voce \"Account\" nel menu \"Modifica\" " +"della finestra principale." -#: ../src/config.py:3072 -msgid "Your new account has been created successfully" -msgstr "Il nuovo account è stato creato con successo" +#: ../src/config.py:3095 +msgid "Invalid server" +msgstr "Server non valido" -#: ../src/config.py:3090 +#: ../src/config.py:3096 +msgid "Please provide a server on which you want to register." +msgstr "Per favore fornire il server su cui vuoi registrarti." + +#: ../src/config.py:3202 ../src/config.py:3241 msgid "An error occurred during account creation" msgstr "Si è verificato un errore durante la creazione dell'account" -#: ../src/config.py:3148 +#: ../src/config.py:3222 +msgid "Your new account has been created successfully" +msgstr "Il nuovo account è stato creato con successo" + +#: ../src/config.py:3327 msgid "Account name is in use" msgstr "Il nome account è già in uso" -#: ../src/config.py:3149 +#: ../src/config.py:3328 msgid "You already have an account using this name." msgstr "Esiste già un account con lo stesso nome" -#: ../src/conversation_textview.py:271 +#: ../src/conversation_textview.py:337 msgid "" "Text below this line is what has been said since the last time you paid " "attention to this group chat" @@ -3082,518 +3227,583 @@ msgstr "" "Il testo sotto a questa riga è quanto è stato detto dall'ultima volta che si " "è prestata attenzione a questa chat di gruppo" -#: ../src/conversation_textview.py:340 +#: ../src/conversation_textview.py:409 #, python-format msgid "_Actions for \"%s\"" msgstr "_Azioni per \"%s\"" -#: ../src/conversation_textview.py:352 +#: ../src/conversation_textview.py:421 msgid "Read _Wikipedia Article" msgstr "Leggi l'articolo di _Wikipedia" -#: ../src/conversation_textview.py:357 +#: ../src/conversation_textview.py:426 msgid "Look it up in _Dictionary" msgstr "Controlla nel _Dizionario" #. we must have %s in the url if not WIKTIONARY -#: ../src/conversation_textview.py:373 +#: ../src/conversation_textview.py:442 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "Manca un \"%s\" nell'URL del Dizionario e questo non è WIKTIONARY" #. we must have %s in the url -#: ../src/conversation_textview.py:386 +#: ../src/conversation_textview.py:455 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "Manca un \"%s\" nell'URL di ricerca su web" -#: ../src/conversation_textview.py:389 +#: ../src/conversation_textview.py:458 msgid "Web _Search for it" msgstr "_Cercalo nel Web" -#: ../src/conversation_textview.py:395 +#: ../src/conversation_textview.py:464 msgid "Open as _Link" msgstr "Apri come _Link" -#: ../src/conversation_textview.py:752 +#: ../src/conversation_textview.py:929 msgid "Yesterday" msgstr "Ieri" #. the number is >= 2 #. %i is day in year (1-365), %d (1-31) we want %i -#: ../src/conversation_textview.py:756 +#: ../src/conversation_textview.py:933 #, python-format msgid "%i days ago" msgstr "%i giorni fa" #. if we have subject, show it too! -#: ../src/conversation_textview.py:790 +#: ../src/conversation_textview.py:967 #, python-format msgid "Subject: %s\n" msgstr "Oggetto: %s\n" -#: ../src/dialogs.py:59 +#: ../src/dialogs.py:64 #, python-format msgid "Contact name: %s" msgstr "Nome contatto: %s" -#: ../src/dialogs.py:61 +#: ../src/dialogs.py:66 #, python-format msgid "Jabber ID: %s" msgstr "ID Jabber: %s" -#: ../src/dialogs.py:211 +#: ../src/dialogs.py:216 msgid "Group" msgstr "Gruppo" -#: ../src/dialogs.py:218 +#: ../src/dialogs.py:223 msgid "In the group" msgstr "Nel gruppo" -#: ../src/dialogs.py:269 +#: ../src/dialogs.py:274 msgid "KeyID" msgstr "KeyID" -#: ../src/dialogs.py:272 +#: ../src/dialogs.py:277 msgid "Contact name" msgstr "Nome contatto" -#: ../src/dialogs.py:318 +#: ../src/dialogs.py:323 #, python-format msgid "%s Status Message" msgstr "Messaggio di stato %s" -#: ../src/dialogs.py:320 +#: ../src/dialogs.py:325 msgid "Status Message" msgstr "Messaggio di stato" -#: ../src/dialogs.py:395 +#: ../src/dialogs.py:425 msgid "Save as Preset Status Message" msgstr "Salva come messaggio di stato predefinito" -#: ../src/dialogs.py:396 +#: ../src/dialogs.py:426 msgid "Please type a name for this status message" msgstr "Inserire un nome per questo messaggio di stato" -#: ../src/dialogs.py:417 +#: ../src/dialogs.py:437 +msgid "Overwrite Status Message?" +msgstr "Sovrascrivere messaggio di stato?" + +#: ../src/dialogs.py:438 +msgid "" +"This name is already used. Do you want to overwrite this status message?" +msgstr "" +"Questo nome è già stato utilizzato. Vuoi sovrascrivere questo messaggio di " +"stato?" + +#: ../src/dialogs.py:454 msgid "AIM Address:" msgstr "Indirizzo AIM:" -#: ../src/dialogs.py:418 +#: ../src/dialogs.py:455 msgid "GG Number:" msgstr "Numero GG:" -#: ../src/dialogs.py:419 +#: ../src/dialogs.py:456 msgid "ICQ Number:" msgstr "Numero ICQ:" -#: ../src/dialogs.py:420 +#: ../src/dialogs.py:457 msgid "MSN Address:" msgstr "Indirizzo MSN:" -#: ../src/dialogs.py:421 +#: ../src/dialogs.py:458 msgid "Yahoo! Address:" msgstr "Indirizzo Yahoo!:" -#: ../src/dialogs.py:457 +#: ../src/dialogs.py:495 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" msgstr "Inserire i dati del contatto che si vuole aggiungere all'account %s" -#: ../src/dialogs.py:459 +#: ../src/dialogs.py:497 msgid "Please fill in the data of the contact you want to add" msgstr "Inserire i dati del contatto che si vuole aggiungere" -#: ../src/dialogs.py:609 ../src/dialogs.py:615 +#: ../src/dialogs.py:654 ../src/dialogs.py:660 msgid "Invalid User ID" msgstr "ID utente non valido" -#: ../src/dialogs.py:616 +#: ../src/dialogs.py:661 msgid "The user ID must not contain a resource." msgstr "L'identificatore dell'utente deve non contenere una risorsa." -#: ../src/dialogs.py:630 +#: ../src/dialogs.py:675 msgid "Contact already in roster" -msgstr "Contatto già presente nella lista" +msgstr "Contatto già presente nella lista contatti" -#: ../src/dialogs.py:631 +#: ../src/dialogs.py:676 msgid "This contact is already listed in your roster." -msgstr "Questo contatto è già presente nella lista." +msgstr "Questo contatto è già presente nella lista contatti." -#: ../src/dialogs.py:668 +#: ../src/dialogs.py:712 msgid "User ID:" msgstr "ID utente:" -#: ../src/dialogs.py:731 +#: ../src/dialogs.py:774 msgid "A GTK+ jabber client" msgstr "Un client jabber GTK+" -#: ../src/dialogs.py:732 +#: ../src/dialogs.py:775 msgid "GTK+ Version:" msgstr "Versione di GTK+:" -#: ../src/dialogs.py:733 +#: ../src/dialogs.py:776 msgid "PyGTK Version:" msgstr "Versione di PyGTK:" -#: ../src/dialogs.py:747 +#: ../src/dialogs.py:790 msgid "Current Developers:" msgstr "Sviluppatori attuali:" -#: ../src/dialogs.py:749 +#: ../src/dialogs.py:792 msgid "Past Developers:" msgstr "Sviluppatori precedenti:" -#: ../src/dialogs.py:759 +#: ../src/dialogs.py:802 msgid "THANKS:" msgstr "GRAZIE:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:765 +#: ../src/dialogs.py:808 msgid "Last but not least, we would like to thank all the package maintainers." msgstr "Dulcis in fundo, ringraziamo tutti i gestori dei pacchetti" #. here you write your name in the form Name FamilyName -#: ../src/dialogs.py:778 +#: ../src/dialogs.py:821 msgid "translator-credits" msgstr "" "Mauro Brenna \n" "Andrea Ratti \n" -"Matteo Dell'Amico " +"Matteo Dell'Amico \n" +"Daniel Coppi " -#: ../src/dialogs.py:908 +#: ../src/dialogs.py:951 #, python-format msgid "Unable to bind to port %s." msgstr "Non è possibile fare il bind alla porta %s" -#: ../src/dialogs.py:909 +#: ../src/dialogs.py:952 msgid "" "Maybe you have another running instance of Gajim. File Transfer will be " "cancelled." -msgstr "Potrebbe essere in esecuzione un altra istanza di Gajim. Il trasferimento file verrà annullato." +msgstr "" +"Potrebbe essere in esecuzione un altra istanza di Gajim. Il trasferimento " +"file verrà annullato." -#: ../src/dialogs.py:1060 +#: ../src/dialogs.py:959 +#, python-format +msgid "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option.\n" +"\n" +"Highlighting misspelled words feature will not be used" +msgstr "" +"E' necessario installare il dizionario %s per usare il controllo " +"ortografico, o configurare un'altra lingua nelle opzioni speller_language.\n" +"\n" +"L'evidenziazione delle parole errate non verrà usata" + +#: ../src/dialogs.py:1173 #, python-format msgid "Subscription request for account %s from %s" msgstr "Richiesta di abbonamento per l'account %s da %s" -#: ../src/dialogs.py:1063 +#: ../src/dialogs.py:1176 #, python-format msgid "Subscription request from %s" msgstr "Richiesta di abbonamento da %s" -#: ../src/dialogs.py:1123 ../src/roster_window.py:687 +#: ../src/dialogs.py:1237 ../src/roster_window.py:763 #, python-format msgid "You are already in group chat %s" msgstr "Si è già nella stanza %s" -#: ../src/dialogs.py:1131 +#: ../src/dialogs.py:1245 msgid "You can not join a group chat unless you are connected." msgstr "Non è possibile unirsi a chat di gruppo quando non si è connessi." -#: ../src/dialogs.py:1146 +#: ../src/dialogs.py:1263 #, python-format msgid "Join Group Chat with account %s" msgstr "Entra in chat di gruppo con l'account %s" -#: ../src/dialogs.py:1214 ../src/dialogs.py:1220 +#: ../src/dialogs.py:1333 ../src/dialogs.py:1339 +#: ../src/groupchat_control.py:1662 msgid "Invalid group chat Jabber ID" msgstr "ID Jabber non valido" -#: ../src/dialogs.py:1215 ../src/dialogs.py:1221 +#: ../src/dialogs.py:1334 ../src/dialogs.py:1340 +#: ../src/groupchat_control.py:1663 msgid "The group chat Jabber ID has not allowed characters." msgstr "Il nome della stanza o del server contiene caratteri non permessi." -#: ../src/dialogs.py:1227 +#: ../src/dialogs.py:1346 msgid "This is not a group chat" msgstr "Questa non è una chat di gruppo" -#: ../src/dialogs.py:1228 +#: ../src/dialogs.py:1347 #, python-format msgid "%s is not the name of a group chat." msgstr "%s non è il nome di una chat di gruppo" -#: ../src/dialogs.py:1267 +#: ../src/dialogs.py:1386 +msgid "Without a connection, you can not synchronise your contacts." +msgstr "Senza una connessione, non puoi sincronizzare i tuoi contatti." + +#: ../src/dialogs.py:1400 +msgid "Server" +msgstr "Server" + +#: ../src/dialogs.py:1433 +msgid "This account is not connected to the server" +msgstr "Questo account non è connesso al server" + +#: ../src/dialogs.py:1434 +msgid "You cannot synchronize with an account unless it is connected." +msgstr "Non puoi sincronizzarti con un account a meno che non sia connesso." + +#: ../src/dialogs.py:1458 +msgid "Synchronise" +msgstr "Sincronizza" + +#: ../src/dialogs.py:1516 #, python-format msgid "Start Chat with account %s" msgstr "Inizia chat con l'account %s" -#: ../src/dialogs.py:1269 +#: ../src/dialogs.py:1518 msgid "Start Chat" msgstr "Inizia chat" -#: ../src/dialogs.py:1270 +#: ../src/dialogs.py:1519 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" msgstr "Introdurre il nickname o l'ID del contatto con cui chattare:" #. if offline or connecting -#: ../src/dialogs.py:1295 ../src/dialogs.py:1654 ../src/dialogs.py:1785 +#: ../src/dialogs.py:1544 ../src/dialogs.py:1891 ../src/dialogs.py:2027 msgid "Connection not available" msgstr "Connessione non disponibile" -#: ../src/dialogs.py:1296 ../src/dialogs.py:1655 ../src/dialogs.py:1786 +#: ../src/dialogs.py:1545 ../src/dialogs.py:1892 ../src/dialogs.py:2028 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Assicurarsi di essere connesso con \"%s\"." -#: ../src/dialogs.py:1305 ../src/dialogs.py:1308 +#: ../src/dialogs.py:1554 ../src/dialogs.py:1557 msgid "Invalid JID" msgstr "ID Jabber non valido" -#: ../src/dialogs.py:1308 +#: ../src/dialogs.py:1557 #, python-format msgid "Unable to parse \"%s\"." msgstr "Impossibile processare \"%s\"." -#: ../src/dialogs.py:1317 +#: ../src/dialogs.py:1566 msgid "Without a connection, you can not change your password." msgstr "Senza una connessione, non è possibile cambiare la password." -#: ../src/dialogs.py:1336 +#: ../src/dialogs.py:1584 +msgid "Invalid password" +msgstr "Password non valida" + +#: ../src/dialogs.py:1585 msgid "You must enter a password." msgstr "È necessario inserire una password." +#: ../src/dialogs.py:1589 +msgid "Passwords do not match" +msgstr "Le password non coincidono" + +#: ../src/dialogs.py:1590 +msgid "The passwords typed in both fields must be identical." +msgstr "Le password immesse nei due campi devono essere identiche." + #. img to display #. default value -#: ../src/dialogs.py:1383 ../src/notify.py:212 ../src/notify.py:416 +#: ../src/dialogs.py:1632 ../src/notify.py:219 ../src/notify.py:429 msgid "Contact Signed In" msgstr "Contatto connesso" -#: ../src/dialogs.py:1385 ../src/notify.py:220 ../src/notify.py:418 +#: ../src/dialogs.py:1634 ../src/notify.py:227 ../src/notify.py:431 msgid "Contact Signed Out" msgstr "Contatto disconnesso" #. chat message -#: ../src/dialogs.py:1387 ../src/notify.py:239 ../src/notify.py:420 +#: ../src/dialogs.py:1636 ../src/notify.py:250 ../src/notify.py:433 msgid "New Message" msgstr "Nuovo messaggio" #. single message -#: ../src/dialogs.py:1387 ../src/notify.py:224 ../src/notify.py:420 +#: ../src/dialogs.py:1636 ../src/notify.py:231 ../src/notify.py:433 msgid "New Single Message" msgstr "Nuovo messaggio singolo" #. private message -#: ../src/dialogs.py:1388 ../src/notify.py:231 ../src/notify.py:421 +#: ../src/dialogs.py:1637 ../src/notify.py:238 ../src/notify.py:434 msgid "New Private Message" msgstr "Nuovo messaggio privato" -#: ../src/dialogs.py:1388 ../src/gajim.py:1282 ../src/notify.py:429 +#: ../src/dialogs.py:1637 ../src/gajim.py:1465 ../src/notify.py:442 msgid "New E-mail" msgstr "Nuova e-mail" -#: ../src/dialogs.py:1390 ../src/gajim.py:1435 ../src/notify.py:423 +#: ../src/dialogs.py:1639 ../src/gajim.py:1682 ../src/notify.py:436 msgid "File Transfer Request" msgstr "Richiesta di trasferimento file" -#: ../src/dialogs.py:1392 ../src/gajim.py:1254 ../src/gajim.py:1411 -#: ../src/notify.py:425 +#: ../src/dialogs.py:1641 ../src/gajim.py:1437 ../src/gajim.py:1649 +#: ../src/notify.py:438 msgid "File Transfer Error" msgstr "Errore nel trasferimento file" -#: ../src/dialogs.py:1394 ../src/gajim.py:1474 ../src/gajim.py:1496 -#: ../src/gajim.py:1513 ../src/notify.py:427 +#: ../src/dialogs.py:1643 ../src/gajim.py:1721 ../src/gajim.py:1743 +#: ../src/gajim.py:1760 ../src/notify.py:440 msgid "File Transfer Completed" msgstr "Trasferimento file completato" -#: ../src/dialogs.py:1395 ../src/gajim.py:1477 ../src/notify.py:427 +#: ../src/dialogs.py:1644 ../src/gajim.py:1724 ../src/notify.py:440 msgid "File Transfer Stopped" msgstr "Trasferimento file fermato" -#: ../src/dialogs.py:1397 ../src/gajim.py:1151 ../src/notify.py:431 +#: ../src/dialogs.py:1646 ../src/gajim.py:1333 ../src/notify.py:444 msgid "Groupchat Invitation" msgstr "Invito a chat di gruppo" -#: ../src/dialogs.py:1399 ../src/notify.py:204 ../src/notify.py:433 +#: ../src/dialogs.py:1648 ../src/notify.py:211 ../src/notify.py:446 msgid "Contact Changed Status" msgstr "Stato Contatto Cambiato" -#: ../src/dialogs.py:1584 +#: ../src/dialogs.py:1821 #, python-format msgid "Single Message using account %s" msgstr "Messaggio singolo con l'account %s" -#: ../src/dialogs.py:1586 +#: ../src/dialogs.py:1823 #, python-format msgid "Single Message in account %s" msgstr "Messaggio singolo nell'account %s" -#: ../src/dialogs.py:1588 +#: ../src/dialogs.py:1825 msgid "Single Message" msgstr "Messaggio singolo" #. prepare UI for Sending -#: ../src/dialogs.py:1591 +#: ../src/dialogs.py:1828 #, python-format msgid "Send %s" msgstr "Invia %s" #. prepare UI for Receiving -#: ../src/dialogs.py:1614 +#: ../src/dialogs.py:1851 #, python-format msgid "Received %s" msgstr "Ricevuto %s" #. we create a new blank window to send and we preset RE: and to jid -#: ../src/dialogs.py:1686 +#: ../src/dialogs.py:1928 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:1687 +#: ../src/dialogs.py:1929 #, python-format msgid "%s wrote:\n" msgstr "%s ha scritto:\n" -#: ../src/dialogs.py:1731 +#: ../src/dialogs.py:1973 #, python-format msgid "XML Console for %s" msgstr "Console XML per %s" -#: ../src/dialogs.py:1733 +#: ../src/dialogs.py:1975 msgid "XML Console" msgstr "Console XML" -#: ../src/dialogs.py:1856 +#: ../src/dialogs.py:2098 #, python-format msgid "Privacy List %s" msgstr "Lista privacy %s" -#: ../src/dialogs.py:1860 +#: ../src/dialogs.py:2102 #, python-format msgid "Privacy List for %s" msgstr "Lista privacy per %s" -#: ../src/dialogs.py:1908 +#: ../src/dialogs.py:2158 #, python-format msgid "Order: %s, action: %s, type: %s, value: %s" msgstr "Ordine: %s, azione: %s, tipo: %s, valore: %s" -#: ../src/dialogs.py:1911 +#: ../src/dialogs.py:2161 #, python-format msgid "Order: %s, action: %s" msgstr "Ordine: %s, azione: %s" -#: ../src/dialogs.py:1953 +#: ../src/dialogs.py:2203 msgid "Edit a rule" msgstr "Modifica una regola" -#: ../src/dialogs.py:2040 +#: ../src/dialogs.py:2290 msgid "Add a rule" msgstr "Aggiungi una regola" -#: ../src/dialogs.py:2136 +#: ../src/dialogs.py:2386 #, python-format msgid "Privacy Lists for %s" msgstr "Lista privacy per %s" -#: ../src/dialogs.py:2138 +#: ../src/dialogs.py:2388 msgid "Privacy Lists" msgstr "Liste privacy" -#: ../src/dialogs.py:2208 +#: ../src/dialogs.py:2458 msgid "Invalid List Name" msgstr "Nome lista non valido" -#: ../src/dialogs.py:2209 +#: ../src/dialogs.py:2459 msgid "You must enter a name to create a privacy list." msgstr "È necessario inserire una nome per creare una lista privacy" -#. Don't translate $Contact -#: ../src/dialogs.py:2243 +#: ../src/dialogs.py:2496 +msgid "$Contact has invited you to join a discussion" +msgstr "$Contact ti ha invitato a partecipare a una discussione" + +#: ../src/dialogs.py:2498 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact ti ha invitato alla chat di gruppo %(room_jid)s" #. only if not None and not '' -#: ../src/dialogs.py:2255 +#: ../src/dialogs.py:2510 #, python-format msgid "Comment: %s" msgstr "Commento: %s" -#: ../src/dialogs.py:2317 +#: ../src/dialogs.py:2576 msgid "Choose Sound" msgstr "Scegliere il suono" -#: ../src/dialogs.py:2327 ../src/dialogs.py:2372 +#: ../src/dialogs.py:2586 ../src/dialogs.py:2634 msgid "All files" msgstr "Tutti i file" -#: ../src/dialogs.py:2332 +#: ../src/dialogs.py:2591 msgid "Wav Sounds" msgstr "Suoni Wav" -#: ../src/dialogs.py:2362 +#: ../src/dialogs.py:2624 msgid "Choose Image" msgstr "Scegli immagine" -#: ../src/dialogs.py:2377 +#: ../src/dialogs.py:2639 msgid "Images" msgstr "Immagini" -#: ../src/dialogs.py:2434 +#: ../src/dialogs.py:2703 #, python-format msgid "When %s becomes:" msgstr "Quando %s diventa:" -#: ../src/dialogs.py:2436 +#: ../src/dialogs.py:2705 #, python-format msgid "Adding Special Notification for %s" msgstr "Creazione notifica speciale per %s" #. # means number -#: ../src/dialogs.py:2507 +#: ../src/dialogs.py:2776 msgid "#" msgstr "#" -#: ../src/dialogs.py:2513 +#: ../src/dialogs.py:2782 msgid "Condition" msgstr "Condizione" -#: ../src/dialogs.py:2634 +#: ../src/dialogs.py:2900 msgid "when I am " msgstr "quando io sono " -#: ../src/disco.py:103 +#: ../src/disco.py:104 msgid "Others" msgstr "Altri" -#: ../src/disco.py:104 ../src/disco.py:105 ../src/disco.py:1281 -#: ../src/gajim.py:596 ../src/roster_window.py:271 ../src/roster_window.py:329 -#: ../src/roster_window.py:368 ../src/roster_window.py:451 -#: ../src/roster_window.py:483 ../src/roster_window.py:485 -#: ../src/roster_window.py:3896 ../src/roster_window.py:3898 -#: ../src/common/contacts.py:267 ../src/common/helpers.py:43 +#: ../src/disco.py:105 ../src/disco.py:106 ../src/disco.py:1345 +#: ../src/gajim.py:644 ../src/roster_window.py:282 ../src/roster_window.py:342 +#: ../src/roster_window.py:382 ../src/roster_window.py:490 +#: ../src/roster_window.py:522 ../src/roster_window.py:524 +#: ../src/roster_window.py:4707 ../src/roster_window.py:4709 +#: ../src/common/contacts.py:290 ../src/common/contacts.py:305 +#: ../src/common/helpers.py:44 msgid "Transports" msgstr "Trasporti" #. conference is a category for listing mostly groupchats in service discovery -#: ../src/disco.py:107 +#: ../src/disco.py:108 msgid "Conference" msgstr "Conferenze" -#: ../src/disco.py:420 +#: ../src/disco.py:421 msgid "Without a connection, you can not browse available services" msgstr "" "Senza una connessione, non è possibile consultare i servizi disponibili" -#: ../src/disco.py:499 +#: ../src/disco.py:495 #, python-format msgid "Service Discovery using account %s" msgstr "Ricerca servizi usando l'account %s" -#: ../src/disco.py:501 +#: ../src/disco.py:497 msgid "Service Discovery" msgstr "Ricerca servizi" -#: ../src/disco.py:641 +#: ../src/disco.py:637 msgid "The service could not be found" msgstr "Il servizio non è stato trovato" -#: ../src/disco.py:642 +#: ../src/disco.py:638 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." @@ -3601,64 +3811,72 @@ msgstr "" "Il servizio all'indirizzo immesso non risponde o è inesistente. Controllare " "l'indirizzo e riprovare." -#: ../src/disco.py:646 ../src/disco.py:927 +#: ../src/disco.py:642 ../src/disco.py:923 msgid "The service is not browsable" msgstr "Non è possibile consultare il servizio" -#: ../src/disco.py:647 +#: ../src/disco.py:643 msgid "This type of service does not contain any items to browse." msgstr "Questo tipo di servizio non contiene oggetti da consultare." -#: ../src/disco.py:727 +#: ../src/disco.py:723 #, python-format msgid "Browsing %s using account %s" msgstr "Consulta %s usando l'account %s" -#: ../src/disco.py:766 +#: ../src/disco.py:762 msgid "_Browse" msgstr "C_onsulta" -#: ../src/disco.py:928 +#: ../src/disco.py:924 msgid "This service does not contain any items to browse." msgstr "Questo servizio non contiene oggetti da consultare." -#: ../src/disco.py:1155 ../src/disco.py:1286 +#: ../src/disco.py:1142 +msgid "_Execute Command" +msgstr "_Esegui comando" + +#: ../src/disco.py:1152 ../src/disco.py:1350 msgid "Re_gister" msgstr "_Registra" -#: ../src/disco.py:1323 +#: ../src/disco.py:1387 #, python-format msgid "Scanning %d / %d.." msgstr "Analisi %d / %d..." #. Users column -#: ../src/disco.py:1504 +#: ../src/disco.py:1569 msgid "Users" msgstr "Utenti" #. Description column -#: ../src/disco.py:1511 +#: ../src/disco.py:1577 msgid "Description" msgstr "Descrizione" #. Id column -#: ../src/disco.py:1518 +#: ../src/disco.py:1585 msgid "Id" msgstr "Id" -#: ../src/disco.py:1741 +#: ../src/disco.py:1814 msgid "Subscribed" msgstr "Abbonati" -#: ../src/disco.py:1767 +#: ../src/disco.py:1822 +msgid "Node" +msgstr "Nodo" + +#: ../src/disco.py:1879 msgid "New post" msgstr "Nuovo post" -#: ../src/disco.py:1773 +#: ../src/disco.py:1885 msgid "_Subscribe" msgstr "A_bbonati" -#: ../src/disco.py:1779 +#: ../src/disco.py:1891 msgid "_Unsubscribe" msgstr "Disa_bbonati" @@ -3674,102 +3892,102 @@ msgstr "Tempo" msgid "Progress" msgstr "Progresso" -#: ../src/filetransfers_window.py:163 ../src/filetransfers_window.py:223 +#: ../src/filetransfers_window.py:159 ../src/filetransfers_window.py:213 #, python-format msgid "Filename: %s" msgstr "Nome file: %s" -#: ../src/filetransfers_window.py:164 ../src/filetransfers_window.py:298 +#: ../src/filetransfers_window.py:160 ../src/filetransfers_window.py:288 #, python-format msgid "Size: %s" msgstr "Dimensione: %s" #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:183 +#: ../src/filetransfers_window.py:169 ../src/filetransfers_window.py:179 #: ../src/history_manager.py:463 msgid "You" msgstr "Tu" -#: ../src/filetransfers_window.py:174 +#: ../src/filetransfers_window.py:170 #, python-format msgid "Sender: %s" msgstr "Mittente: %s" -#: ../src/filetransfers_window.py:175 ../src/filetransfers_window.py:572 -#: ../src/tooltips.py:573 +#: ../src/filetransfers_window.py:171 ../src/filetransfers_window.py:577 +#: ../src/tooltips.py:586 msgid "Recipient: " msgstr "Destinatario: " -#: ../src/filetransfers_window.py:186 +#: ../src/filetransfers_window.py:182 #, python-format msgid "Saved in: %s" msgstr "Memorizzato in: %s" -#: ../src/filetransfers_window.py:188 +#: ../src/filetransfers_window.py:184 msgid "File transfer completed" msgstr "Trasferimento file completato" -#: ../src/filetransfers_window.py:204 ../src/filetransfers_window.py:212 +#: ../src/filetransfers_window.py:198 ../src/filetransfers_window.py:204 msgid "File transfer cancelled" msgstr "Trasferimento file annullato" -#: ../src/filetransfers_window.py:204 ../src/filetransfers_window.py:213 +#: ../src/filetransfers_window.py:198 ../src/filetransfers_window.py:205 msgid "Connection with peer cannot be established." msgstr "La connessione non può essere stabilita." -#: ../src/filetransfers_window.py:224 +#: ../src/filetransfers_window.py:214 #, python-format msgid "Recipient: %s" msgstr "Destinatario: %s" -#: ../src/filetransfers_window.py:226 +#: ../src/filetransfers_window.py:216 #, python-format msgid "Error message: %s" msgstr "Messaggio di errore: %s" -#: ../src/filetransfers_window.py:227 +#: ../src/filetransfers_window.py:217 msgid "File transfer stopped by the contact at the other end" msgstr "Trasferimento file fermato dal contatto dall'altra parte" -#: ../src/filetransfers_window.py:244 +#: ../src/filetransfers_window.py:234 msgid "Choose File to Send..." msgstr "Scegliere il file da inviare..." -#: ../src/filetransfers_window.py:263 +#: ../src/filetransfers_window.py:253 msgid "Gajim cannot access this file" msgstr "Gajim non riesce a leggere questo file" -#: ../src/filetransfers_window.py:264 +#: ../src/filetransfers_window.py:254 msgid "This file is being used by another process." msgstr "Questo file è in uso da un altro processo." -#: ../src/filetransfers_window.py:296 +#: ../src/filetransfers_window.py:286 #, python-format msgid "File: %s" msgstr "File: %s" -#: ../src/filetransfers_window.py:301 +#: ../src/filetransfers_window.py:291 #, python-format msgid "Type: %s" msgstr "Tipo: %s" -#: ../src/filetransfers_window.py:303 +#: ../src/filetransfers_window.py:293 #, python-format msgid "Description: %s" msgstr "Descrizione: %s" -#: ../src/filetransfers_window.py:304 +#: ../src/filetransfers_window.py:294 #, python-format msgid "%s wants to send you a file:" msgstr "%s vuole inviarti un file:" -#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:747 +#: ../src/filetransfers_window.py:308 ../src/gtkgui_helpers.py:767 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Non è possibile sovrascrivere il file esistente \"%s\"" -#: ../src/filetransfers_window.py:319 ../src/gtkgui_helpers.py:749 +#: ../src/filetransfers_window.py:309 ../src/gtkgui_helpers.py:769 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." @@ -3777,31 +3995,31 @@ msgstr "" "Un file con lo stesso nome è già presente e non si ha il permesso per " "sovrascriverlo" -#: ../src/filetransfers_window.py:326 ../src/gtkgui_helpers.py:753 +#: ../src/filetransfers_window.py:316 ../src/gtkgui_helpers.py:773 msgid "This file already exists" msgstr "Questo file esiste già" -#: ../src/filetransfers_window.py:326 ../src/gtkgui_helpers.py:753 +#: ../src/filetransfers_window.py:316 ../src/gtkgui_helpers.py:773 msgid "What do you want to do?" msgstr "Cosa fare?" -#: ../src/filetransfers_window.py:338 ../src/gtkgui_helpers.py:763 +#: ../src/filetransfers_window.py:328 ../src/gtkgui_helpers.py:783 #, python-format msgid "Directory \"%s\" is not writable" msgstr "La cartella \"%s\" non è scrivibile." -#: ../src/filetransfers_window.py:338 ../src/gtkgui_helpers.py:764 +#: ../src/filetransfers_window.py:328 ../src/gtkgui_helpers.py:784 msgid "You do not have permission to create files in this directory." msgstr "Non si ha il permesso di creare file in questa cartella." -#: ../src/filetransfers_window.py:348 +#: ../src/filetransfers_window.py:338 msgid "Save File as..." msgstr "Salva file come..." #. 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:429 +#: ../src/filetransfers_window.py:419 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -3809,65 +4027,66 @@ 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:505 +#: ../src/filetransfers_window.py:508 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" -#: ../src/filetransfers_window.py:544 ../src/filetransfers_window.py:547 +#: ../src/filetransfers_window.py:547 ../src/filetransfers_window.py:550 msgid "Invalid File" msgstr "File non valido" -#: ../src/filetransfers_window.py:544 +#: ../src/filetransfers_window.py:547 msgid "File: " msgstr "File: " -#: ../src/filetransfers_window.py:548 +#: ../src/filetransfers_window.py:551 msgid "It is not possible to send empty files" msgstr "Non è possibile inviare file vuoti" -#: ../src/filetransfers_window.py:568 ../src/tooltips.py:563 +#: ../src/filetransfers_window.py:573 ../src/tooltips.py:576 msgid "Name: " msgstr "Nome: " -#: ../src/filetransfers_window.py:570 ../src/tooltips.py:567 +#: ../src/filetransfers_window.py:575 ../src/tooltips.py:580 msgid "Sender: " msgstr "Mittente: " -#: ../src/filetransfers_window.py:758 +#: ../src/filetransfers_window.py:763 msgid "Pause" msgstr "Pausa" -#: ../src/gajim.py:47 +#: ../src/gajim.py:50 #, python-format msgid "%s is not a valid loglevel" msgstr "%s non è un livello di log valido" -#: ../src/gajim.py:122 +#: ../src/gajim.py:143 msgid "Gajim needs X server to run. Quiting..." msgstr "Gajim ha bisogno di un server X per essere eseguito. Uscita..." -#: ../src/gajim.py:126 +#: ../src/gajim.py:147 msgid "Gajim needs PyGTK 2.8 or above" msgstr "Gajim ha bisogno di PyGTK 2.8 o superiore" -#: ../src/gajim.py:127 +#: ../src/gajim.py:148 msgid "Gajim needs PyGTK 2.8 or above to run. Quiting..." -msgstr "Gajim ha bisogno di PyGTK 2.8 o superiore per essere eseguito. Uscita..." +msgstr "" +"Gajim ha bisogno di PyGTK 2.8 o superiore per essere eseguito. Uscita..." -#: ../src/gajim.py:129 +#: ../src/gajim.py:150 msgid "Gajim needs GTK 2.8 or above" msgstr "Gajim ha bisogno di GTK2.8 o superiore" -#: ../src/gajim.py:130 +#: ../src/gajim.py:151 msgid "Gajim needs GTK 2.8 or above to run. Quiting..." msgstr "Gajim ha bisogno di GTK2.8 o superiore per essere eseguito. Uscita..." -#: ../src/gajim.py:135 +#: ../src/gajim.py:156 msgid "GTK+ runtime is missing libglade support" msgstr "Supporto libglade mancante nel runtime GTK+" -#: ../src/gajim.py:137 +#: ../src/gajim.py:158 #, python-format msgid "" "Please remove your current GTK+ runtime and install the latest stable " @@ -3876,20 +4095,20 @@ msgstr "" "Eliminare il runtime GTK+ corrente ed installare l'ultima versione stabile " "da %s" -#: ../src/gajim.py:139 +#: ../src/gajim.py:160 msgid "" "Please make sure that GTK+ and PyGTK have libglade support in your system." msgstr "Verificare che GTK+ e PyGTK abbiano supporto libglade sul sistema." -#: ../src/gajim.py:144 +#: ../src/gajim.py:165 msgid "Gajim needs PySQLite2 to run" msgstr "Gajim ha bisogno di PySQLite2 per essere eseguito" -#: ../src/gajim.py:152 +#: ../src/gajim.py:173 msgid "Gajim needs pywin32 to run" msgstr "Gajim ha bisogno di pywin32 per essere eseguito" -#: ../src/gajim.py:153 +#: ../src/gajim.py:174 #, python-format msgid "" "Please make sure that Pywin32 is installed on your system. You can get it at " @@ -3899,11 +4118,11 @@ msgstr "" "%s" #. set the icon to all newly opened wind -#: ../src/gajim.py:296 +#: ../src/gajim.py:317 msgid "Gajim is already running" msgstr "Gajim è già in esecuzione" -#: ../src/gajim.py:297 +#: ../src/gajim.py:318 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -3911,83 +4130,140 @@ msgstr "" "Un'altra istanza di Gajim sembra essere in esecuzione\n" "Continuare comunque?" -#: ../src/gajim.py:403 +#: ../src/gajim.py:341 ../src/common/connection_handlers.py:896 +#: ../src/common/connection_handlers.py:1597 +#: ../src/common/connection_handlers.py:1626 +#: ../src/common/connection_handlers.py:1636 +#: ../src/common/connection_handlers.py:1655 +#: ../src/common/connection_handlers.py:1892 +#: ../src/common/connection_handlers.py:2004 ../src/common/connection.py:925 +msgid "Disk Write Error" +msgstr "Errore di scrittura su disco" + +#: ../src/gajim.py:434 +msgid "Do you accept this request?" +msgstr "Accettare questa richiesta?" + +#: ../src/gajim.py:437 #, python-format msgid "HTTP (%s) Authorization for %s (id: %s)" msgstr "Autorizzazione HTTP (%s) per %s (id: %s)" -#: ../src/gajim.py:404 -msgid "Do you accept this request?" -msgstr "Accettare questa richiesta?" - -#: ../src/gajim.py:450 ../src/notify.py:435 +#: ../src/gajim.py:484 ../src/notify.py:448 msgid "Connection Failed" msgstr "Connessione fallita" -#: ../src/gajim.py:767 +#: ../src/gajim.py:817 #, python-format msgid "Subject: %s" msgstr "Oggetto: %s" #. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) -#: ../src/gajim.py:812 ../src/gajim.py:825 +#: ../src/gajim.py:864 ../src/gajim.py:877 #, python-format msgid "error while sending %s ( %s )" msgstr "errore durante l'invio di %s ( %s )" -#: ../src/gajim.py:858 +#: ../src/gajim.py:910 msgid "Authorization accepted" msgstr "Autorizzazione accettata" -#: ../src/gajim.py:859 +#: ../src/gajim.py:911 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "Il contatto \"%s\" ti ha autorizzato a vedere il suo stato." -#: ../src/gajim.py:867 +#: ../src/gajim.py:919 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Il contatto \"%s\" ha eliminato il tuo abbonamento verso di lui" -#: ../src/gajim.py:868 +#: ../src/gajim.py:920 msgid "You will always see him or her as offline." msgstr "Lo vedrai sempre come offline." -#: ../src/gajim.py:911 +#: ../src/gajim.py:964 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Non si può contattare \"%s\"" -#: ../src/gajim.py:912 ../src/common/connection.py:417 +#: ../src/gajim.py:965 ../src/common/connection.py:466 msgid "Check your connection or try again later." msgstr "Controllare la connessione o riprovare più tardi." -#: ../src/gajim.py:1061 ../src/roster_window.py:1218 +#: ../src/gajim.py:1136 ../src/roster_window.py:1348 #, python-format msgid "%s is now %s (%s)" msgstr "%s è ora %s (%s)" #. No status message -#: ../src/gajim.py:1064 ../src/groupchat_control.py:944 -#: ../src/roster_window.py:1221 +#: ../src/gajim.py:1139 ../src/groupchat_control.py:1120 +#: ../src/roster_window.py:1351 #, python-format msgid "%s is now %s" msgstr "%s è ora %s" -#: ../src/gajim.py:1161 +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/gajim.py:1260 ../src/groupchat_control.py:932 +msgid "Any occupant is allowed to see your full JID" +msgstr "Tutti i partecipanti possono vedere il tuo JID" + +#: ../src/gajim.py:1263 +msgid "Room now shows unavailable member" +msgstr "La stanza ora mostra i membri non disponibili" + +#: ../src/gajim.py:1265 +msgid "room now does not show unavailable members" +msgstr "la stanza ora non mostra i membri non disponibili" + +#: ../src/gajim.py:1268 +msgid "A non-privacy-related room configuration change has occurred" +msgstr "" +"E' stata effettuata una modifica alla configurazione della stanza che non " +"riguarda la privacy" + +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#: ../src/gajim.py:1271 +msgid "Room logging is now enabled" +msgstr "La registrazione dei messaggi della stanza è stata attivata" + +#: ../src/gajim.py:1273 +msgid "Room logging is now disabled" +msgstr "La registrazione dei messaggi della stanza è stata disattivata" + +#: ../src/gajim.py:1275 +msgid "Room is now non-anonymous" +msgstr "La stanza è ora completamente non anonima" + +#: ../src/gajim.py:1278 +msgid "Room is now semi-anonymous" +msgstr "La stanza è ora semi-anonima" + +#: ../src/gajim.py:1281 +msgid "Room is now fully-anonymous" +msgstr "La stanza è ora completamente anonima" + +#: ../src/gajim.py:1313 +#, python-format +msgid "A Password is required to join the room %s. Please type it" +msgstr "" +"È necessaria una password per entrare nella stanza %s. Inserisci la password" + +#: ../src/gajim.py:1343 msgid "Your passphrase is incorrect" msgstr "Passphrase errata" -#: ../src/gajim.py:1162 +#: ../src/gajim.py:1344 msgid "You are currently connected without your OpenPGP key." -msgstr "Si è connessi senza la chiave OpenPGP" +msgstr "Sei connesso senza la chiave OpenPGP." -#: ../src/gajim.py:1265 +#: ../src/gajim.py:1448 #, python-format msgid "New mail on %(gmail_mail_address)s" msgstr "Nuova e-mail su %(gmail_mail_address)s" -#: ../src/gajim.py:1267 +#: ../src/gajim.py:1450 #, python-format msgid "You have %d new mail conversation" msgid_plural "You have %d new mail conversations" @@ -3997,7 +4273,7 @@ msgstr[1] "Ci sono %d nuove conversazioni in e-mail" #. FIXME: emulate Gtalk client popups. find out what they parse and how #. they decide what to show #. each message has a 'From', 'Subject' and 'Snippet' field -#: ../src/gajim.py:1276 +#: ../src/gajim.py:1459 #, python-format msgid "" "\n" @@ -4006,52 +4282,126 @@ msgstr "" "\n" "Da: %(from_address)s" -#: ../src/gajim.py:1432 +#: ../src/gajim.py:1679 #, python-format msgid "%s wants to send you a file." msgstr "%s vuole inviarti un file." -#: ../src/gajim.py:1497 +#: ../src/gajim.py:1744 #, python-format msgid "You successfully received %(filename)s from %(name)s." msgstr "%(filename)s ricevuto con successo da %(name)s." #. ft stopped -#: ../src/gajim.py:1501 +#: ../src/gajim.py:1748 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Il trasferimento file di %(filename)s da %(name)s è fermo." -#: ../src/gajim.py:1514 +#: ../src/gajim.py:1761 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Invio di %(filename)s a %(name)s effettuato con successo." #. ft stopped -#: ../src/gajim.py:1518 +#: ../src/gajim.py:1765 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Trasferimento file di %(filename)s a %(name)s fermato." -#: ../src/gajim.py:1631 +#: ../src/gajim.py:1860 +msgid "Session negotiation cancelled" +msgstr "Negoziazione della sessione annullata" + +#: ../src/gajim.py:1861 +#, python-format +msgid "The client at %s cancelled the session negotiation." +msgstr "Il client a %s ha annullato la negoziazione della sessione." + +#: ../src/gajim.py:1901 ../src/gajim.py:1942 +msgid "Confirm these session options" +msgstr "Conferma queste opzioni di sessione" + +#: ../src/gajim.py:1902 +#, python-format +msgid "" +"The remote client wants to negotiate an session with these features:\n" +"\n" +"\t%s\n" +"\n" +"\tAre these options acceptable?" +msgstr "" +"Il client remoto vuole negoziare una sessione con queste caratteristiche:\n" +"\n" +"\t%s\n" +"\n" +"\tQueste opzioni sono accettabili?" + +#: ../src/gajim.py:1943 +#, python-format +msgid "" +"The remote client selected these options:\n" +"\n" +"%s\n" +"\n" +"Continue with the session?" +msgstr "" +"Il client remoto ha selezionato queste opzioni:\n" +"\n" +"%s\n" +"\n" +"Continuare la sessione?" + +#: ../src/gajim.py:2055 msgid "Username Conflict" msgstr "Conflitto di nomi utenti" -#: ../src/gajim.py:1632 +#: ../src/gajim.py:2056 msgid "Please type a new username for your local account" msgstr "Inserire un nuovo nome utente per l'account locale" +#: ../src/gajim.py:2073 +msgid "Ping?" +msgstr "Ping?" + +#: ../src/gajim.py:2081 +#, python-format +msgid "Pong! (%s s.)" +msgstr "Pong! (%s s.)" + +#: ../src/gajim.py:2087 +msgid "Error." +msgstr "Errore." + +#: ../src/gajim.py:2112 +msgid "Resource Conflict" +msgstr "Conflitto tra risorse" + +#: ../src/gajim.py:2113 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" +msgstr "" +"Sei già connesso a questo account con la stessa risorsa. Inseriscine un'altra" + #. it is good to notify the user #. in case he or she cannot see the output of the console -#: ../src/gajim.py:1972 +#: ../src/gajim.py:2475 msgid "Could not save your settings and preferences" msgstr "Impossibile salvare impostazioni e preferenze" -#: ../src/gajim.py:2170 +#. sorted alphanum +#: ../src/gajim.py:2610 ../src/common/config.py:86 ../src/common/config.py:395 +#: ../src/common/optparser.py:194 ../src/common/optparser.py:412 +#: ../src/common/optparser.py:446 +msgid "default" +msgstr "predefinito" + +#: ../src/gajim.py:2697 msgid "Network Manager support not available" msgstr "Supporto Network Manager non disponibile" -#: ../src/gajim.py:2249 +#: ../src/gajim.py:2798 msgid "Session Management support not available (missing gnome.ui module)" msgstr "Supporto gestione sessioni non disponibile (modulo gnome.ui mancante)" @@ -4084,11 +4434,11 @@ msgstr "Scrive la lista contatti. Ogni contatto appare su una linea separata" #: ../src/gajim-remote.py:84 ../src/gajim-remote.py:99 #: ../src/gajim-remote.py:109 ../src/gajim-remote.py:122 -#: ../src/gajim-remote.py:136 ../src/gajim-remote.py:157 -#: ../src/gajim-remote.py:187 ../src/gajim-remote.py:196 -#: ../src/gajim-remote.py:203 ../src/gajim-remote.py:210 -#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:237 -#: ../src/gajim-remote.py:246 +#: ../src/gajim-remote.py:136 ../src/gajim-remote.py:145 +#: ../src/gajim-remote.py:166 ../src/gajim-remote.py:196 +#: ../src/gajim-remote.py:205 ../src/gajim-remote.py:212 +#: ../src/gajim-remote.py:219 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:246 ../src/gajim-remote.py:255 msgid "account" msgstr "account" @@ -4115,7 +4465,7 @@ msgstr "" "uno fra: offline, online, chat, assente, xa, non disturbare, invisibile" #: ../src/gajim-remote.py:98 ../src/gajim-remote.py:119 -#: ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:133 ../src/gajim-remote.py:144 msgid "message" msgstr "messaggio" @@ -4140,7 +4490,7 @@ msgstr "Mostra la finestra di chat per mandare messaggi ad un contatto" msgid "JID of the contact that you want to chat with" msgstr "JID del contatto con cui si vuole chattare" -#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:187 +#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:196 msgid "if specified, contact is taken from the contact list of this account" msgstr "" "se specificato, il contatto è preso dalla lista contatti di questo account" @@ -4160,6 +4510,7 @@ msgid "JID of the contact that will receive the message" msgstr "JID del contatto che riceverà il messaggio" #: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:144 msgid "message contents" msgstr "contenuti messaggi" @@ -4173,6 +4524,7 @@ msgstr "" "se specificato, il messaggio verrà cifrato usando questa chiave pubblica" #: ../src/gajim-remote.py:122 ../src/gajim-remote.py:136 +#: ../src/gajim-remote.py:145 msgid "if specified, the message will be sent using this account" msgstr "se specificato, il messaggio verrà inviato usando questo account" @@ -4195,121 +4547,129 @@ msgid "message subject" msgstr "oggetto del messaggio " #: ../src/gajim-remote.py:141 +msgid "Sends new message to a groupchat you've joined." +msgstr "Invia nuovi messaggi alla chat di gruppo in cui sei entrato." + +#: ../src/gajim-remote.py:143 +msgid "JID of the room that will receive the message" +msgstr "JID della stanza che riceverà il messaggio" + +#: ../src/gajim-remote.py:150 msgid "Gets detailed info on a contact" msgstr "Ottiene informazioni dettagliate su un contatto" -#: ../src/gajim-remote.py:143 ../src/gajim-remote.py:156 -#: ../src/gajim-remote.py:186 ../src/gajim-remote.py:195 +#: ../src/gajim-remote.py:152 ../src/gajim-remote.py:165 +#: ../src/gajim-remote.py:195 ../src/gajim-remote.py:204 msgid "JID of the contact" msgstr "JID del contatto" -#: ../src/gajim-remote.py:147 +#: ../src/gajim-remote.py:156 msgid "Gets detailed info on a account" msgstr "Ottiene informazioni dettagliate su un contatto" -#: ../src/gajim-remote.py:149 +#: ../src/gajim-remote.py:158 msgid "Name of the account" msgstr "Nome dell'account" -#: ../src/gajim-remote.py:153 +#: ../src/gajim-remote.py:162 msgid "Sends file to a contact" msgstr "Invia file ad un contatto" -#: ../src/gajim-remote.py:155 +#: ../src/gajim-remote.py:164 msgid "file" msgstr "file" -#: ../src/gajim-remote.py:155 +#: ../src/gajim-remote.py:164 msgid "File path" msgstr "Percorso file" -#: ../src/gajim-remote.py:157 +#: ../src/gajim-remote.py:166 msgid "if specified, file will be sent using this account" msgstr "se specificato, il file verrà inviato usando questo account" -#: ../src/gajim-remote.py:162 +#: ../src/gajim-remote.py:171 msgid "Lists all preferences and their values" msgstr "Mostra tutte le preferenze ed i relativi valori" -#: ../src/gajim-remote.py:166 +#: ../src/gajim-remote.py:175 msgid "Sets value of 'key' to 'value'." msgstr "Imposta il valore di 'chiave' a 'valore'." -#: ../src/gajim-remote.py:168 +#: ../src/gajim-remote.py:177 msgid "key=value" msgstr "chiave=valore" -#: ../src/gajim-remote.py:168 +#: ../src/gajim-remote.py:177 msgid "'key' is the name of the preference, 'value' is the value to set it to" msgstr "" "'chiave' è il nome della preferenza, 'valore' è il valore a cui impostarla" -#: ../src/gajim-remote.py:173 +#: ../src/gajim-remote.py:182 msgid "Deletes a preference item" msgstr "Elimina un oggetto dalle preferenze" -#: ../src/gajim-remote.py:175 +#: ../src/gajim-remote.py:184 msgid "key" msgstr "chiave" -#: ../src/gajim-remote.py:175 +#: ../src/gajim-remote.py:184 msgid "name of the preference to be deleted" msgstr "nome della preferenza da eliminare" -#: ../src/gajim-remote.py:179 +#: ../src/gajim-remote.py:188 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Scrive lo stato corrente delle preferenze di Gajim nel file .config" -#: ../src/gajim-remote.py:184 +#: ../src/gajim-remote.py:193 msgid "Removes contact from roster" msgstr "Elimina il contatto dalla lista" -#: ../src/gajim-remote.py:193 +#: ../src/gajim-remote.py:202 msgid "Adds contact to roster" msgstr "Aggiunge il contatto alla lista" -#: ../src/gajim-remote.py:195 +#: ../src/gajim-remote.py:204 msgid "jid" msgstr "jid" -#: ../src/gajim-remote.py:196 +#: ../src/gajim-remote.py:205 msgid "Adds new contact to this account" msgstr "Aggiunge un nuovo contatto a questo account" -#: ../src/gajim-remote.py:201 +#: ../src/gajim-remote.py:210 msgid "Returns current status (the global one unless account is specified)" msgstr "" "Restituisce lo stato corrente (quello globale se non è specificato un " "account)" -#: ../src/gajim-remote.py:208 +#: ../src/gajim-remote.py:217 msgid "" "Returns current status message(the global one unless account is specified)" msgstr "" "Restituisce il messaggio di stato corrente (quello globale se non è " "specificato un account)" -#: ../src/gajim-remote.py:215 +#: ../src/gajim-remote.py:224 msgid "Returns number of unread messages" msgstr "Restituisce il numero di messaggi non letti" -#: ../src/gajim-remote.py:219 +#: ../src/gajim-remote.py:228 msgid "Opens 'Start Chat' dialog" msgstr "Apre la finestra di inizio chat" -#: ../src/gajim-remote.py:221 +#: ../src/gajim-remote.py:230 msgid "Starts chat, using this account" msgstr "Inizia chat usando questo account" -#: ../src/gajim-remote.py:225 +#: ../src/gajim-remote.py:234 msgid "Sends custom XML" msgstr "Invia XML personalizzato" -#: ../src/gajim-remote.py:227 +#: ../src/gajim-remote.py:236 msgid "XML to send" msgstr "XML da inviare" -#: ../src/gajim-remote.py:228 +#: ../src/gajim-remote.py:237 msgid "" "Account in which the xml will be sent; if not specified, xml will be sent to " "all accounts" @@ -4317,35 +4677,35 @@ msgstr "" "L'account al quale l'xml è inviato; se non specificato, l'xml sarà spedito a " "tutti gli account." -#: ../src/gajim-remote.py:234 +#: ../src/gajim-remote.py:243 msgid "Handle a xmpp:/ uri" msgstr "Gestisci un uri xmpp:/" -#: ../src/gajim-remote.py:236 +#: ../src/gajim-remote.py:245 msgid "uri" msgstr "uri" -#: ../src/gajim-remote.py:241 +#: ../src/gajim-remote.py:250 msgid "Join a MUC room" msgstr "Entra in una stanza MUC" -#: ../src/gajim-remote.py:243 +#: ../src/gajim-remote.py:252 msgid "room" msgstr "stanza" -#: ../src/gajim-remote.py:244 +#: ../src/gajim-remote.py:253 msgid "nick" msgstr "nickname" -#: ../src/gajim-remote.py:245 +#: ../src/gajim-remote.py:254 msgid "password" msgstr "password" -#: ../src/gajim-remote.py:268 +#: ../src/gajim-remote.py:277 msgid "Missing argument \"contact_jid\"" msgstr "Parametro mancante \"contact_jid\"" -#: ../src/gajim-remote.py:287 +#: ../src/gajim-remote.py:296 #, python-format msgid "" "'%s' is not in your roster.\n" @@ -4354,38 +4714,38 @@ msgstr "" "'%s' non appartiene alla lista contatti.\n" "Specificare l'account per l'invio del messaggio." -#: ../src/gajim-remote.py:290 +#: ../src/gajim-remote.py:299 msgid "You have no active account" msgstr "Non ci sono account attivi" -#: ../src/gajim-remote.py:354 +#: ../src/gajim-remote.py:363 #, python-format msgid "" "Usage: %s %s %s \n" "\t %s" msgstr "" -"Uso: %s %s %s \n" +"Utilizzo: %s %s %s \n" "\t %s" -#: ../src/gajim-remote.py:357 +#: ../src/gajim-remote.py:366 msgid "Arguments:" msgstr "Parametri:" -#: ../src/gajim-remote.py:361 +#: ../src/gajim-remote.py:370 #, python-format msgid "%s not found" msgstr "%s non trovato" -#: ../src/gajim-remote.py:365 +#: ../src/gajim-remote.py:374 #, python-format msgid "" "Usage: %s command [arguments]\n" "Command is one of:\n" msgstr "" -"Uso: %s comando [parametri]\n" +"Utilizzo: %s comando [parametri]\n" "Il comando è uno fra:\n" -#: ../src/gajim-remote.py:438 +#: ../src/gajim-remote.py:447 #, python-format msgid "" "Too many arguments. \n" @@ -4394,7 +4754,7 @@ msgstr "" "Troppi parametri. \n" "Scrivere \"%s help %s\" per maggiori informazioni" -#: ../src/gajim-remote.py:442 +#: ../src/gajim-remote.py:451 #, python-format msgid "" "Argument \"%s\" is not specified. \n" @@ -4403,131 +4763,160 @@ msgstr "" "Il parametro \"%s\" non è specificato. \n" "Scrivere\"%s help %s\" per maggiori informazioni" -#: ../src/gajim-remote.py:460 +#: ../src/gajim-remote.py:469 msgid "Wrong uri" -msgstr "Uri errato" +msgstr "URI errato" -#: ../src/gajim_themes_window.py:60 +#: ../src/gajim_themes_window.py:62 msgid "Theme" msgstr "Tema" +#: ../src/gajim_themes_window.py:100 +msgid "You cannot make changes to the default theme" +msgstr "Non è possibile modificare il tema di default" + +#: ../src/gajim_themes_window.py:101 +msgid "Please create a clean new theme with your desired name." +msgstr "Creare un nuovo tema con il nome desiderato." + #. don't confuse translators -#: ../src/gajim_themes_window.py:155 +#: ../src/gajim_themes_window.py:175 msgid "theme name" msgstr "nome del tema" -#: ../src/gajim_themes_window.py:172 +#: ../src/gajim_themes_window.py:192 msgid "You cannot delete your current theme" msgstr "Non è possibile eliminare il tema corrente" -#: ../src/gajim_themes_window.py:173 +#: ../src/gajim_themes_window.py:193 msgid "Please first choose another for your current theme." msgstr "Scegliere prima un altro tema." -#: ../src/groupchat_control.py:106 -msgid "Private Chat" -msgstr "Chat privata" - -#: ../src/groupchat_control.py:106 -msgid "Private Chats" -msgstr "Chat private" - -#: ../src/groupchat_control.py:123 +#: ../src/groupchat_control.py:134 msgid "Sending private message failed" msgstr "Invio messaggio privato fallito" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:125 +#: ../src/groupchat_control.py:136 #, python-format msgid "You are no longer in group chat \"%s\" or \"%s\" has left." msgstr "Non sei più nella stanza \"%s\" o \"%s\" è uscito." -#: ../src/groupchat_control.py:144 -msgid "Group Chat" -msgstr "Chat di gruppo" - -#: ../src/groupchat_control.py:144 -msgid "Group Chats" -msgstr "Chat di gruppo" - -#: ../src/groupchat_control.py:318 +#: ../src/groupchat_control.py:343 msgid "Insert Nickname" msgstr "Inserisci nickname" +#: ../src/groupchat_control.py:859 +msgid "Really send file?" +msgstr "" + +#: ../src/groupchat_control.py:860 +#, python-format +msgid "If you send a file to %s, he/she will know your real Jabber ID." +msgstr "" + +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/groupchat_control.py:935 +msgid "Room logging is enabled" +msgstr "La registrazione dei messaggi della stanza è stata attivata" + +#: ../src/groupchat_control.py:937 +msgid "A new room has been created" +msgstr "E' stata creata una nuova stanza" + +#: ../src/groupchat_control.py:940 +msgid "The server has assigned or modified your roomnick" +msgstr "Il server ha assegnato o modificato il tuo nickname" + #. do not print 'kicked by None' -#: ../src/groupchat_control.py:829 +#: ../src/groupchat_control.py:946 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s è stato cacciato: %(reason)s" -#: ../src/groupchat_control.py:833 +#: ../src/groupchat_control.py:950 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s è stato cacciato da %(who)s : %(reason)s" #. do not print 'banned by None' -#: ../src/groupchat_control.py:840 +#: ../src/groupchat_control.py:957 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s è stato bloccato: %(reason)s" -#: ../src/groupchat_control.py:844 +#: ../src/groupchat_control.py:961 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s è stato bloccato da %(who)s : %(reason)s" -#: ../src/groupchat_control.py:852 +#. Someone changed his or her nick +#. We changed our nick +#: ../src/groupchat_control.py:968 #, python-format msgid "You are now known as %s" msgstr "Sei ora conosciuto come %s" -#: ../src/groupchat_control.py:854 +#: ../src/groupchat_control.py:970 #, python-format msgid "%s is now known as %s" msgstr "%s è ora conosciuto come %s" -#: ../src/groupchat_control.py:937 +#: ../src/groupchat_control.py:1003 ../src/groupchat_control.py:1007 +#: ../src/groupchat_control.py:1012 +#, python-format +msgid "%(nick)s has been removed from the room (%(reason)s)" +msgstr "%(nick)s è stato cacciato dalla stanza (%(reason)s)" + +#: ../src/groupchat_control.py:1004 +msgid "affiliation changed" +msgstr "l'affiliazione è stata cambiata" + +#: ../src/groupchat_control.py:1009 +msgid "room configuration changed to members-only" +msgstr "la stanza è ora accessibile solo ai membri" + +#: ../src/groupchat_control.py:1014 +#, fuzzy +msgid "system shutdown" +msgstr "spegnimento del sistema" + +#: ../src/groupchat_control.py:1113 #, python-format msgid "%s has left" msgstr "%s se ne è andato" -#: ../src/groupchat_control.py:942 +#: ../src/groupchat_control.py:1118 #, python-format msgid "%s has joined the group chat" msgstr "%s è entrato nella chat di gruppo" -#: ../src/groupchat_control.py:1063 ../src/groupchat_control.py:1081 -#: ../src/groupchat_control.py:1174 ../src/groupchat_control.py:1191 +#. Invalid Nickname +#. invalid char +#: ../src/groupchat_control.py:1231 ../src/groupchat_control.py:1510 +msgid "Invalid nickname" +msgstr "Nickname non valido" + +#: ../src/groupchat_control.py:1232 ../src/groupchat_control.py:1511 +msgid "The nickname has not allowed characters." +msgstr "Il nickname contiene caratteri non consentiti." + +#: ../src/groupchat_control.py:1255 ../src/groupchat_control.py:1273 +#: ../src/groupchat_control.py:1357 ../src/groupchat_control.py:1374 #, python-format msgid "Nickname not found: %s" msgstr "Nickname non trovato: %s" -#: ../src/groupchat_control.py:1097 +#: ../src/groupchat_control.py:1289 msgid "This group chat has no subject" msgstr "Questa stanza non ha oggetto" -#: ../src/groupchat_control.py:1110 +#: ../src/groupchat_control.py:1300 #, python-format msgid "Invited %(contact_jid)s to %(room_jid)s." msgstr "Si è invitato %(contact_jid)s a %(room_jid)s." -#. %s is something the user wrote but it is not a jid so we inform -#: ../src/groupchat_control.py:1117 ../src/groupchat_control.py:1145 -#, python-format -msgid "%s does not appear to be a valid JID" -msgstr "%s non sembra essere un JID valido" - -#: ../src/groupchat_control.py:1228 -#, python-format -msgid "No such command: /%s (if you want to send this, prefix it with /say)" -msgstr "Comando inesistente: /%s (per inviarlo, scrivere /say prima di esso)" - -#: ../src/groupchat_control.py:1251 -#, python-format -msgid "Commands: %s" -msgstr "Comandi: %s" - -#: ../src/groupchat_control.py:1253 +#: ../src/groupchat_control.py:1437 #, python-format msgid "" "Usage: /%s [reason], bans the JID from the group chat. The " @@ -4535,176 +4924,174 @@ msgid "" "the JID is currently in the group chat, he/she/it will also be kicked. Does " "NOT support spaces in nickname." msgstr "" -"Uso: /%s [motivo], bandisce il JID dalla stanza. Il nickname " -"di un partecipante può venire usato al posto del JID, ma non se contiene \"@" -"\". Se il JID è correntemente nella stanza, verrà anche cacciato. NON " -"supporta la presenza di spazi nel nickname." +"Utilizzo: /%s [motivo], bandisce il JID dalla stanza. Il " +"nickname di un partecipante può venire usato al posto del JID, ma non se " +"contiene \"@\". Se il JID è correntemente nella stanza, verrà anche " +"cacciato. NON supporta la presenza di spazi nel nickname." -#: ../src/groupchat_control.py:1260 +#: ../src/groupchat_control.py:1444 #, python-format msgid "" "Usage: /%s , opens a private chat window with the specified " "occupant." msgstr "" -"Uso: /%s , apre una finestra di chat privata al partecipante " +"Utilizzo: /%s , apre una finestra di chat privata al partecipante " "specificato." -#: ../src/groupchat_control.py:1264 -#, python-format -msgid "Usage: /%s, clears the text window." -msgstr "Uso: /%s, pulisce la finestra di testo." - -#: ../src/groupchat_control.py:1266 +#: ../src/groupchat_control.py:1450 #, python-format msgid "" "Usage: /%s [reason], closes the current window or tab, displaying reason if " "specified." msgstr "" -"Uso: /%s [motivo], chiude la finestra oi scheda corrente, mostrando il " +"Utilizzo: /%s [motivo], chiude la finestra oi scheda corrente, mostrando il " "motivo se specificato." -#: ../src/groupchat_control.py:1269 -#, python-format -msgid "Usage: /%s, hide the chat buttons." -msgstr "Uso: /%s, nasconde i pulsanti di chat." - -#: ../src/groupchat_control.py:1272 +#: ../src/groupchat_control.py:1456 #, python-format msgid "" "Usage: /%s [reason], invites JID to the current group chat, optionally " "providing a reason." msgstr "" -"Uso: /%s [motivo], invita JID alla stanza corrente, opzionalmente " +"Utilizzo: /%s [motivo], invita JID alla stanza corrente, opzionalmente " "fornendo un motivo." -#: ../src/groupchat_control.py:1276 +#: ../src/groupchat_control.py:1460 #, python-format msgid "" "Usage: /%s @[/nickname], offers to join room@server optionally " "using specified nickname." msgstr "" -"Uso: /%s @[/nickname], offre la possibilità di entrare in " -"stanza@server, opzionalmente usando il nickname specificato." +"Utilizzo: /%s @[/nickname], offre la possibilità di entrare " +"in stanza@server, opzionalmente usando il nickname specificato." -#: ../src/groupchat_control.py:1280 +#: ../src/groupchat_control.py:1464 #, python-format msgid "" "Usage: /%s [reason], removes the occupant specified by nickname " "from the group chat and optionally displays a reason. Does NOT support " "spaces in nickname." msgstr "" -"Uso: /%s [motivo], rimuove il partecipante specificato per " +"Utilizzo: /%s [motivo], rimuove il partecipante specificato per " "nickname dalla stanza e opzionalmente mostra un motivo. NON supporta la " "presenza di spazi nel nickname." -#: ../src/groupchat_control.py:1285 -#, python-format -msgid "" -"Usage: /%s , sends action to the current group chat. Use third " -"person. (e.g. /%s explodes.)" -msgstr "" -"Uso: /%s , invia l'azione alla stanza corrente. Usare la terza " -"persona (esempio: /%s esplode)." - -#: ../src/groupchat_control.py:1289 +#: ../src/groupchat_control.py:1473 #, python-format msgid "" "Usage: /%s [message], opens a private message window and sends " "message to the occupant specified by nickname." msgstr "" -"Uso: /%s [messaggio], apre una finestra di messaggi privati ed " -"invia il messaggio al partecipante specificato per nickname." +"Utilizzo: /%s [messaggio], apre una finestra di messaggi privati " +"ed invia il messaggio al partecipante specificato per nickname." -#: ../src/groupchat_control.py:1294 +#: ../src/groupchat_control.py:1478 #, python-format msgid "Usage: /%s , changes your nickname in current group chat." -msgstr "Uso: /%s , cambia il tuo nickname nella stanza corrente." +msgstr "" +"Utilizzo: /%s , cambia il tuo nickname nella stanza corrente." -#: ../src/groupchat_control.py:1298 +#: ../src/groupchat_control.py:1482 #, python-format msgid "Usage: /%s , display the names of group chat occupants." msgstr "" -"Uso: /%s [argomento], mostra o aggiorna l'argomento della stanza corrente." +"Utilizzo: /%s [argomento], mostra o aggiorna l'argomento della stanza " +"corrente." -#: ../src/groupchat_control.py:1302 +#: ../src/groupchat_control.py:1486 #, python-format msgid "Usage: /%s [topic], displays or updates the current group chat topic." msgstr "" -"Uso: /%s [argomento], mostra o aggiorna l'argomento della stanza corrente." +"Utilizzo: /%s [argomento], mostra o aggiorna l'argomento della stanza " +"corrente." -#: ../src/groupchat_control.py:1305 +#: ../src/groupchat_control.py:1489 #, python-format msgid "" "Usage: /%s , sends a message without looking for other commands." msgstr "" -"Uso: /%s , invia un messaggio senza considerare gli altri comandi." +"Utilizzo: /%s , invia un messaggio senza considerare gli altri " +"comandi." -#: ../src/groupchat_control.py:1308 -#, python-format -msgid "No help info for /%s" -msgstr "Non esiste aiuto per /%s" - -#: ../src/groupchat_control.py:1359 +#: ../src/groupchat_control.py:1584 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Si è sicuri di voler uscire dalla stanza \"%s\"?" -#: ../src/groupchat_control.py:1361 +#: ../src/groupchat_control.py:1586 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Chiudendo questa finestra, si verrà disconnessi da questa stanza." -#: ../src/groupchat_control.py:1365 ../src/roster_window.py:4036 +#: ../src/groupchat_control.py:1590 ../src/roster_window.py:4855 msgid "Do _not ask me again" msgstr "_Non chiederlo più" -#: ../src/groupchat_control.py:1399 +#: ../src/groupchat_control.py:1624 msgid "Changing Subject" msgstr "Cambio oggetto" -#: ../src/groupchat_control.py:1400 +#: ../src/groupchat_control.py:1625 msgid "Please specify the new subject:" msgstr "Specificare il nuovo oggetto:" -#: ../src/groupchat_control.py:1409 +#: ../src/groupchat_control.py:1634 msgid "Changing Nickname" msgstr "Cambio nickname" -#: ../src/groupchat_control.py:1410 +#: ../src/groupchat_control.py:1635 msgid "Please specify the new nickname you want to use:" msgstr "Specificare il nuovo nickname da usare:" -#: ../src/groupchat_control.py:1435 +#. Ask for a reason +#: ../src/groupchat_control.py:1650 +#, python-format +msgid "Destroying %s" +msgstr "Eliminazione %s" + +#: ../src/groupchat_control.py:1651 +msgid "" +"You are going to definitively destroy this room.\n" +"You may specify a reason below:" +msgstr "" +"Stai per cancellare definitivamente questa stanza.\n" +"Puoi specificare il motivo qui sotto:" + +#: ../src/groupchat_control.py:1653 +msgid "You may also enter an alternate venue:" +msgstr "Puoi anche inserire un nome alternativo:" + +#: ../src/groupchat_control.py:1684 msgid "Bookmark already set" msgstr "Segnalibro già impostato" -#: ../src/groupchat_control.py:1436 +#: ../src/groupchat_control.py:1685 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "La stanza \"%s\" è già tra i segnalibri." -#: ../src/groupchat_control.py:1445 +#: ../src/groupchat_control.py:1694 msgid "Bookmark has been added successfully" msgstr "Il segnalibro è stato aggiunto con successo" -#: ../src/groupchat_control.py:1446 +#: ../src/groupchat_control.py:1695 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "" "È possibile gestire i segnalibri attraverso il menu Azioni nella finestra " "della lista contatti." #. ask for reason -#: ../src/groupchat_control.py:1574 +#: ../src/groupchat_control.py:1847 #, python-format msgid "Kicking %s" msgstr "Sto cacciando %s" -#: ../src/groupchat_control.py:1575 ../src/groupchat_control.py:1858 +#: ../src/groupchat_control.py:1848 ../src/groupchat_control.py:2148 msgid "You may specify a reason below:" msgstr "Specifica un motivo qui sotto:" #. ask for reason -#: ../src/groupchat_control.py:1857 +#: ../src/groupchat_control.py:2147 #, python-format msgid "Banning %s" msgstr "Sto bandendo %s" @@ -4730,56 +5117,56 @@ msgid "Details" msgstr "Dettagli" #. we talk about file -#: ../src/gtkgui_helpers.py:156 ../src/gtkgui_helpers.py:171 +#: ../src/gtkgui_helpers.py:157 ../src/gtkgui_helpers.py:172 #, python-format msgid "Error: cannot open %s for reading" msgstr "Errore: impossibile aprire %s in lettura" -#: ../src/gtkgui_helpers.py:336 +#: ../src/gtkgui_helpers.py:337 msgid "Error reading file:" msgstr "Errore leggendo il file:" -#: ../src/gtkgui_helpers.py:339 +#: ../src/gtkgui_helpers.py:340 msgid "Error parsing file:" msgstr "Errore processando il file:" #. do not traceback (could be a permission problem) #. we talk about a file here -#: ../src/gtkgui_helpers.py:376 +#: ../src/gtkgui_helpers.py:377 #, python-format msgid "Could not write to %s. Session Management support will not work" msgstr "" "Non si è potuto scrivere su %s. Il supporto gestione sessioni non funzionerà" #. xmpp: is currently handled by another program, so ask the user -#: ../src/gtkgui_helpers.py:691 +#: ../src/gtkgui_helpers.py:711 msgid "Gajim is not the default Jabber client" msgstr "Gajim non è il client Jabber predefinito" -#: ../src/gtkgui_helpers.py:692 +#: ../src/gtkgui_helpers.py:712 msgid "Would you like to make Gajim the default Jabber client?" msgstr "Si vuole rendere Gajim il client Jabber predefinito?" -#: ../src/gtkgui_helpers.py:693 +#: ../src/gtkgui_helpers.py:713 msgid "Always check to see if Gajim is the default Jabber client on startup" msgstr "Verifica sempre se Gajim è il client Jabber predefinito all'avvio" -#: ../src/gtkgui_helpers.py:792 +#: ../src/gtkgui_helpers.py:812 msgid "Extension not supported" msgstr "Dbus non è supportato." -#: ../src/gtkgui_helpers.py:793 +#: ../src/gtkgui_helpers.py:813 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" "L'immagine non può essere salvata in formato %(type)s. Salvarla come %" "(new_filename)s?" -#: ../src/gtkgui_helpers.py:802 +#: ../src/gtkgui_helpers.py:822 msgid "Save Image as..." msgstr "Salva immagine come..." -#: ../src/history_manager.py:65 +#: ../src/history_manager.py:68 msgid "Cannot find history logs database" msgstr "Impossibile trovare la base dati delle cronologie" @@ -4790,7 +5177,7 @@ msgstr "Contatti" #. holds time #: ../src/history_manager.py:121 ../src/history_manager.py:161 -#: ../src/history_window.py:86 +#: ../src/history_window.py:116 msgid "Date" msgstr "Data" @@ -4801,7 +5188,7 @@ msgstr "Nickname" #. holds message #: ../src/history_manager.py:135 ../src/history_manager.py:167 -#: ../src/history_window.py:94 +#: ../src/history_window.py:124 msgid "Message" msgstr "Messaggio" @@ -4853,71 +5240,96 @@ msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Si vuole davvero eliminare il messaggio selezionato?" msgstr[1] "Si vogliono davvero eliminare i messaggi selezionati?" -#: ../src/history_window.py:103 ../src/history_window.py:105 +#: ../src/history_window.py:185 ../src/history_window.py:187 #, python-format msgid "Conversation History with %s" msgstr "Cronologia conversazione con %s" -#: ../src/history_window.py:258 +#: ../src/history_window.py:332 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s ora è %(status)s: %(status_msg)s" -#: ../src/history_window.py:262 ../src/notify.py:199 +#: ../src/history_window.py:336 ../src/notify.py:206 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s è ora %(status)s" -#: ../src/history_window.py:268 +#: ../src/history_window.py:342 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Lo stato ora è: %(status)s: %(status_msg)s" -#: ../src/history_window.py:271 +#: ../src/history_window.py:345 #, python-format msgid "Status is now: %(status)s" msgstr "Lo stato ora è: %(status)s" -#: ../src/message_window.py:273 +#: ../src/htmltextview.py:583 ../src/htmltextview.py:594 +msgid "Timeout loading image" +msgstr "Impossibile caricare l'immagine" + +#: ../src/htmltextview.py:604 +msgid "Image is too big" +msgstr "L'immagine è troppo grande" + +#: ../src/message_window.py:288 +msgid "Chats" +msgstr "Chat" + +#: ../src/message_window.py:290 +msgid "Group Chats" +msgstr "Chat di gruppo" + +#: ../src/message_window.py:292 +msgid "Private Chats" +msgstr "Chat private" + +#: ../src/message_window.py:294 msgid "Messages" msgstr "Messaggi" -#: ../src/message_window.py:274 +#: ../src/message_window.py:295 #, python-format msgid "%s - Gajim" msgstr "%s - Gajim" -#: ../src/notify.py:197 +#: ../src/notify.py:204 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s ha cambiato stato" -#: ../src/notify.py:207 +#: ../src/notify.py:214 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s connesso" -#: ../src/notify.py:215 +#: ../src/notify.py:222 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s disconnesso" -#: ../src/notify.py:227 +#: ../src/notify.py:234 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Nuovo messaggio singolo da %(nickname)s" -#: ../src/notify.py:235 +#: ../src/notify.py:242 #, python-format msgid "New Private Message from group chat %s" msgstr "Nuovo messaggio privato dalla stanza %s" -#: ../src/notify.py:236 +#: ../src/notify.py:244 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:242 +#: ../src/notify.py:247 +#, python-format +msgid "Messaged by %(nickname)s" +msgstr "Messaggio inviato da %(nickname)s" + +#: ../src/notify.py:253 #, python-format msgid "New Message from %(nickname)s" msgstr "Nuovo messaggio da %(nickname)s" @@ -4926,37 +5338,42 @@ msgstr "Nuovo messaggio da %(nickname)s" msgid "Retrieving profile..." msgstr "Recupero profilo..." -#: ../src/profile_window.py:107 ../src/profile_window.py:210 -#: ../src/profile_window.py:219 -msgid "Click to set your avatar" -msgstr "Cliccare per inserire l'avatar" +#: ../src/profile_window.py:123 ../src/roster_window.py:1882 +msgid "File is empty" +msgstr "Il file è vuoto" + +#: ../src/profile_window.py:126 ../src/roster_window.py:1885 +msgid "File does not exist" +msgstr "Il file non esiste" #. keep identation -#: ../src/profile_window.py:137 +#. unknown format +#: ../src/profile_window.py:140 ../src/profile_window.py:156 +#: ../src/roster_window.py:1887 ../src/roster_window.py:1898 msgid "Could not load image" msgstr "Impossibile caricare l'immagine" -#: ../src/profile_window.py:245 +#: ../src/profile_window.py:257 msgid "Information received" -msgstr "Informazione ricevuta" +msgstr "Informazioni ricevute" -#: ../src/profile_window.py:314 +#: ../src/profile_window.py:326 msgid "Without a connection you can not publish your contact information." msgstr "Senza una connessione non è possibile pubblicare i dati personali." -#: ../src/profile_window.py:326 +#: ../src/profile_window.py:338 msgid "Sending profile..." msgstr "Invio del profilo..." -#: ../src/profile_window.py:341 +#: ../src/profile_window.py:353 msgid "Information NOT published" msgstr "Informazione NON pubblicata" -#: ../src/profile_window.py:348 +#: ../src/profile_window.py:360 msgid "vCard publication failed" msgstr "Pubblicazione della vCard fallita" -#: ../src/profile_window.py:349 +#: ../src/profile_window.py:361 msgid "" "There was an error while publishing your personal information, try again " "later." @@ -4964,89 +5381,105 @@ msgstr "" "C'è stato un errore nella pubblicazione delle informazioni personali, " "riprovare più tardi." -#: ../src/roster_window.py:171 ../src/roster_window.py:226 +#: ../src/roster_window.py:182 ../src/roster_window.py:237 msgid "Merged accounts" msgstr "Account uniti" -#: ../src/roster_window.py:344 ../src/common/helpers.py:43 +#: ../src/roster_window.py:357 ../src/roster_window.py:622 +#: ../src/roster_window.py:2110 ../src/common/contacts.py:307 +#: ../src/common/helpers.py:44 msgid "Observers" msgstr "Osservatori" -#: ../src/roster_window.py:692 ../src/roster_window.py:3201 +#. Make special context menu if group is Groupchats +#: ../src/roster_window.py:441 ../src/roster_window.py:446 +#: ../src/roster_window.py:1935 ../src/roster_window.py:1938 +#: ../src/roster_window.py:2607 ../src/roster_window.py:2610 +#: ../src/roster_window.py:2635 ../src/roster_window.py:4715 +#: ../src/roster_window.py:4717 ../src/common/commands.py:194 +#: ../src/common/contacts.py:97 ../src/common/helpers.py:44 +msgid "Groupchats" +msgstr "Chat di gruppo" + +#: ../src/roster_window.py:771 ../src/roster_window.py:3971 msgid "You cannot join a group chat while you are invisible" msgstr "Non è possibile unirsi ad una stanza quando si è invisibile" #. new chat +#. single message #. for chat_with #. for single message -#: ../src/roster_window.py:884 ../src/systray.py:187 ../src/systray.py:192 +#. join gc +#: ../src/roster_window.py:984 ../src/roster_window.py:994 +#: ../src/roster_window.py:1003 ../src/systray.py:207 ../src/systray.py:212 +#: ../src/systray.py:218 #, python-format msgid "using account %s" msgstr "usando l'account %s" -#. the 'manage gc bookmarks' item is shown -#. below to avoid duplicate code #. add -#: ../src/roster_window.py:909 +#: ../src/roster_window.py:1010 #, python-format msgid "to %s account" msgstr "all'account %s" #. disco -#: ../src/roster_window.py:914 +#: ../src/roster_window.py:1015 #, python-format msgid "using %s account" msgstr "usando l'account %s" +#: ../src/roster_window.py:1096 +msgid "_Manage Bookmarks..." +msgstr "_Gestione segnalibri..." + #. profile, avatar -#: ../src/roster_window.py:989 +#: ../src/roster_window.py:1115 #, python-format msgid "of account %s" msgstr "dell'account %s" -#: ../src/roster_window.py:1009 -msgid "_Manage Bookmarks..." -msgstr "_Gestione segnalibri..." - -#: ../src/roster_window.py:1038 +#: ../src/roster_window.py:1155 #, python-format msgid "for account %s" msgstr "per l'account %s" #. History manager -#: ../src/roster_window.py:1059 +#: ../src/roster_window.py:1176 msgid "History Manager" msgstr "Gestore cronologia" -#: ../src/roster_window.py:1068 +#: ../src/roster_window.py:1185 msgid "_Join New Group Chat" -msgstr "_Entrare in chat di gruppo" +msgstr "_Nuova chat di gruppo" -#: ../src/roster_window.py:1398 ../src/roster_window.py:3394 -#: ../src/roster_window.py:3401 +#: ../src/roster_window.py:1544 ../src/roster_window.py:4169 +#: ../src/roster_window.py:4176 msgid "You have unread messages" msgstr "Ci sono messaggi non letti" -#: ../src/roster_window.py:1399 +#: ../src/roster_window.py:1545 msgid "You must read them before removing this transport." msgstr "Leggere tutti gli eventi pendenti prima di rimuovere questo account." -#: ../src/roster_window.py:1402 +#: ../src/roster_window.py:1548 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Il trasporto \"%s\" verrà rimosso" -#: ../src/roster_window.py:1403 +#: ../src/roster_window.py:1549 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." -msgstr "Non si potranno più inviare e ricevere messaggi verso i contatti di questo trasporto." +msgstr "" +"Non si potranno più inviare e ricevere messaggi verso i contatti di questo " +"trasporto." -#: ../src/roster_window.py:1406 +#: ../src/roster_window.py:1552 msgid "Transports will be removed" msgstr "I trasporti verranno rimossi" -#: ../src/roster_window.py:1411 +#: ../src/roster_window.py:1557 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " @@ -5056,114 +5489,154 @@ msgstr "" "trasporti:%s" #. it's jid -#: ../src/roster_window.py:1431 +#: ../src/roster_window.py:1723 msgid "Rename Contact" msgstr "Rinomina contatto" -#: ../src/roster_window.py:1432 +#: ../src/roster_window.py:1724 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Inserire un nuovo nickname per il contatto %s." -#: ../src/roster_window.py:1439 +#: ../src/roster_window.py:1731 msgid "Rename Group" msgstr "Rinomina Gruppo" -#: ../src/roster_window.py:1440 +#: ../src/roster_window.py:1732 #, python-format msgid "Enter a new name for group %s" msgstr "Inserire un nome per il gruppo %s." -#: ../src/roster_window.py:1515 +#: ../src/roster_window.py:1807 msgid "Remove Group" msgstr "Elimina Gruppo" -#: ../src/roster_window.py:1516 +#: ../src/roster_window.py:1808 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Rimuovere il gruppo %s dalla lista?" -#: ../src/roster_window.py:1517 +#: ../src/roster_window.py:1809 msgid "Remove also all contacts in this group from your roster" msgstr "Elimina anche tutti i contatti di questo gruppo dalla lista" -#: ../src/roster_window.py:1546 +#: ../src/roster_window.py:1840 msgid "Assign OpenPGP Key" msgstr "Assegna chiave OpenPGP" -#: ../src/roster_window.py:1547 +#: ../src/roster_window.py:1841 msgid "Select a key to apply to the contact" msgstr "Seleziona una chiave da applicare al contatto" -#: ../src/roster_window.py:1782 ../src/roster_window.py:2043 -msgid "_New group chat" +#: ../src/roster_window.py:2156 +msgid "_New Group Chat" msgstr "_Nuova chat di gruppo" -#: ../src/roster_window.py:1913 +#: ../src/roster_window.py:2298 msgid "I would like to add you to my roster" msgstr "Vorrei aggiungerti ai miei contatti" -#: ../src/roster_window.py:2088 ../src/roster_window.py:2135 +#. Send Group Message +#: ../src/roster_window.py:2432 ../src/roster_window.py:2644 msgid "Send Group M_essage" msgstr "Invia _messaggio di gruppo" -#: ../src/roster_window.py:2114 -msgid "Re_name" -msgstr "Ri_nomina" +#: ../src/roster_window.py:2451 +msgid "_New group chat" +msgstr "_Nuova chat di gruppo" -#: ../src/roster_window.py:2141 +#. Manage Transport submenu +#: ../src/roster_window.py:2489 +msgid "_Manage Contacts" +msgstr "_Gestisci contatti" + +#: ../src/roster_window.py:2550 +msgid "_Maximize" +msgstr "_Massimizza" + +#: ../src/roster_window.py:2557 +msgid "_Disconnect" +msgstr "_Disconnetti" + +#: ../src/roster_window.py:2636 +msgid "_Maximize All" +msgstr "_Massimizza tutti" + +#: ../src/roster_window.py:2652 msgid "To all users" msgstr "A tutti gli utenti" -#: ../src/roster_window.py:2144 +#: ../src/roster_window.py:2655 msgid "To all online users" msgstr "Utenti _online" -#: ../src/roster_window.py:2180 +#. Log Off +#: ../src/roster_window.py:2772 +msgid "_Log off" +msgstr "_Disconnetti" + +#. Log on +#: ../src/roster_window.py:2778 msgid "_Log on" msgstr "_Connetti" -#: ../src/roster_window.py:2190 -msgid "Log _off" -msgstr "_Disconnetti" +#. Send single message +#: ../src/roster_window.py:2790 +msgid "Send Single Message" +msgstr "Invia messaggio singolo" -#: ../src/roster_window.py:2312 ../src/roster_window.py:2383 +#. Manage Transport submenu +#: ../src/roster_window.py:2837 +msgid "_Manage Transport" +msgstr "_Gestisci trasporto" + +#. Modify Transport +#: ../src/roster_window.py:2845 +msgid "_Modify Transport" +msgstr "_Modifica trasporto" + +#. Information +#: ../src/roster_window.py:2882 +msgid "_Information" +msgstr "_Informazioni" + +#: ../src/roster_window.py:2959 ../src/roster_window.py:3033 msgid "_Change Status Message" msgstr "_Cambia messaggio di stato" -#: ../src/roster_window.py:2455 +#: ../src/roster_window.py:3105 msgid "Authorization has been sent" msgstr "Autorizzazione inviata" -#: ../src/roster_window.py:2456 +#: ../src/roster_window.py:3106 #, python-format msgid "Now \"%s\" will know your status." msgstr "Ora \"%s\" conoscerà il tuo stato." -#: ../src/roster_window.py:2476 +#: ../src/roster_window.py:3126 msgid "Subscription request has been sent" msgstr "La richiesta di abbonamento è stata inviata" -#: ../src/roster_window.py:2477 +#: ../src/roster_window.py:3127 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Se \"%s\" accetta questa richiesta conoscerai il suo stato." -#: ../src/roster_window.py:2489 +#: ../src/roster_window.py:3139 msgid "Authorization has been removed" msgstr "L'autorizzazione è stata rimossa" -#: ../src/roster_window.py:2490 +#: ../src/roster_window.py:3140 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Ora \"%s\" ti vedrà sempre come offline." -#: ../src/roster_window.py:2680 +#: ../src/roster_window.py:3357 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Il contatto \"%s\" sarà rimosso dalla tua lista" -#: ../src/roster_window.py:2684 +#: ../src/roster_window.py:3361 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." @@ -5171,7 +5644,7 @@ msgstr "" "Eliminando questo contatto ne verrà rimossa anche l'autorizzazione. Questi " "ti vedrà sempre offline." -#: ../src/roster_window.py:2689 +#: ../src/roster_window.py:3366 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." @@ -5179,16 +5652,16 @@ msgstr "" "Eliminando questo contatto ne rimuoverai anche l'autorizzazione. Questi ti " "vedrà sempre offline." -#: ../src/roster_window.py:2692 +#: ../src/roster_window.py:3369 msgid "I want this contact to know my status after removal" msgstr "Voglio che questo contatto conosca il mio stato dopo la rimozione" #. several contact to remove at the same time -#: ../src/roster_window.py:2696 +#: ../src/roster_window.py:3373 msgid "Contacts will be removed from your roster" msgstr "Il contatto sarà rimosso dalla tua lista" -#: ../src/roster_window.py:2700 +#: ../src/roster_window.py:3377 #, python-format msgid "" "By removing these contacts:%s\n" @@ -5197,46 +5670,51 @@ msgstr "" "Eliminando questi contatti:%s\n" "ne verrà rimossa anche l'autorizzazione. Ti vedranno sempre offline." -#: ../src/roster_window.py:2732 +#: ../src/roster_window.py:3409 msgid "" -"Gnomekeyring is installed but not correctly started (environment variable " +"Gnome Keyring is installed but not correctly started (environment variable " "probably not correctly set)" -msgstr "Gnomekeyring è installato ma non avviato correttamente (la variabile d'ambiente è probabilmente impostata in maniera scorretta)" +msgstr "" +"Gnome Keyring è installato ma non avviato correttamente (la variabile " +"d'ambiente è probabilmente impostata in maniera non corretta)" + +#: ../src/roster_window.py:3436 +msgid "GPG is not usable" +msgstr "Non è possibile utilizzare GPG" -#. TODO: make this string translatable #. %s is the account name here -#: ../src/roster_window.py:2760 ../src/common/connection.py:671 -#: ../src/common/zeroconf/connection_zeroconf.py:158 +#: ../src/roster_window.py:3436 ../src/common/connection.py:684 +#: ../src/common/zeroconf/connection_zeroconf.py:165 #, python-format msgid "You will be connected to %s without OpenPGP." -msgstr "Ci si connetterà a %s senza OpenPGP" +msgstr "Ti connetterai a %s senza OpenPGP." -#: ../src/roster_window.py:2777 +#: ../src/roster_window.py:3453 msgid "Passphrase Required" msgstr "Passphrase richiesta" -#: ../src/roster_window.py:2778 +#: ../src/roster_window.py:3454 #, python-format msgid "Enter GPG key passphrase for account %s." msgstr "Inserire la passphrase della chiave GPG per l'account %s." -#: ../src/roster_window.py:2783 +#: ../src/roster_window.py:3459 msgid "Save passphrase" msgstr "Memorizza passphrase" -#: ../src/roster_window.py:2791 +#: ../src/roster_window.py:3467 msgid "Wrong Passphrase" msgstr "Passphrase errata" -#: ../src/roster_window.py:2792 +#: ../src/roster_window.py:3468 msgid "Please retype your GPG passphrase or press Cancel." msgstr "Riscrivere la passphrase GPG o premere Annulla." -#: ../src/roster_window.py:2849 ../src/roster_window.py:2909 +#: ../src/roster_window.py:3551 ../src/roster_window.py:3628 msgid "You are participating in one or more group chats" msgstr "Si sta partecipando ad una o più chat di gruppo" -#: ../src/roster_window.py:2850 ../src/roster_window.py:2910 +#: ../src/roster_window.py:3552 ../src/roster_window.py:3629 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" @@ -5244,21 +5722,21 @@ msgstr "" "Impostare lo stato invisibile ti farà disconnettere da queste chat di " "gruppo. Diventare veramente invisibile?" -#: ../src/roster_window.py:2867 +#: ../src/roster_window.py:3586 msgid "No account available" msgstr "Nessun account disponibile" -#: ../src/roster_window.py:2868 +#: ../src/roster_window.py:3587 msgid "You must create an account before you can chat with other contacts." msgstr "" "È necessario creare un account prima di poter chattare con altri contatti." -#: ../src/roster_window.py:2966 +#: ../src/roster_window.py:3715 #, python-format msgid "\"%(title)s\" by %(artist)s" msgstr "\"%(title)s\" di %(artist)s" -#: ../src/roster_window.py:3395 ../src/roster_window.py:3402 +#: ../src/roster_window.py:4170 ../src/roster_window.py:4177 msgid "" "Messages will only be available for reading them later if you have history " "enabled." @@ -5266,24 +5744,25 @@ msgstr "" "I messaggi saranno disponibili per una lettura successiva solo se la " "cronologia è abilitata" -#: ../src/roster_window.py:3986 +#: ../src/roster_window.py:4801 msgid "Metacontacts storage not supported by your server" msgstr "Il supporto metacontatti non è supportato dal tuo server" -#: ../src/roster_window.py:3988 +#: ../src/roster_window.py:4803 +#, fuzzy msgid "" "Your server does not support storing metacontacts information. So those " -"information will not be save on next reconnection." +"information will not be saved on next reconnection." msgstr "" "Il tuo server non supporta il salvataggio di informazioni metacontatti. " "Perciò queste informazioni non saranno salvate al prossimo riavvio." -#: ../src/roster_window.py:4030 +#: ../src/roster_window.py:4849 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Stai per creare un metacontatto. Continuare?" -#: ../src/roster_window.py:4032 +#: ../src/roster_window.py:4851 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 " @@ -5293,110 +5772,123 @@ msgstr "" "Generalmente si usano quando la stessa persona ha più account jabber o su " "vari transport." -#: ../src/roster_window.py:4199 +#: ../src/roster_window.py:4949 #, python-format -msgid "Drop %s in group %s" -msgstr "Sposta %s nel gruppo %s" +msgid "Do you want to send that file to %s:" +msgid_plural "Do you want to send those files to %s:" +msgstr[0] "Vuoi inviare questo file a %s:" +msgstr[1] "Vuoi inviare questi file a %s:" -#: ../src/roster_window.py:4206 -#, python-format -msgid "Make %s and %s metacontacts" -msgstr "Rendi %s e %s metacontatti" - -#: ../src/roster_window.py:4393 +#: ../src/roster_window.py:5232 msgid "Change Status Message..." msgstr "Cambia messaggio di stato..." -#: ../src/systray.py:144 +#: ../src/systray.py:164 msgid "_Change Status Message..." msgstr "_Cambia messaggio di stato..." -#: ../src/systray.py:232 +#: ../src/systray.py:249 msgid "Hide this menu" msgstr "Nascondi questo menu" -#: ../src/tooltips.py:309 ../src/tooltips.py:492 +#: ../src/tooltips.py:310 ../src/tooltips.py:503 msgid "Jabber ID: " msgstr "ID Jabber: " -#: ../src/tooltips.py:312 ../src/tooltips.py:496 +#: ../src/tooltips.py:313 ../src/tooltips.py:507 msgid "Resource: " msgstr "Risorsa: " -#: ../src/tooltips.py:317 +#: ../src/tooltips.py:318 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s di questa chat di gruppo" -#: ../src/tooltips.py:430 ../src/tooltips.py:610 +#: ../src/tooltips.py:416 +msgid " [blocked]" +msgstr " [bloccato]" + +#: ../src/tooltips.py:420 +msgid " [minimized]" +msgstr " [minimizzata]" + +#: ../src/tooltips.py:435 ../src/tooltips.py:623 msgid "Status: " msgstr "Stato: " -#: ../src/tooltips.py:461 +#: ../src/tooltips.py:465 #, python-format msgid "Last status: %s" msgstr "Ultimo stato: %s" -#: ../src/tooltips.py:463 +#: ../src/tooltips.py:467 #, python-format msgid " since %s" -msgstr "da %s" +msgstr " dalle %s" + +#: ../src/tooltips.py:485 +msgid "Connected" +msgstr "Connesso" + +#: ../src/tooltips.py:487 +msgid "Disconnected" +msgstr "Disconnesso" #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:502 +#: ../src/tooltips.py:514 msgid "Subscription: " msgstr "Abbonamento: " -#: ../src/tooltips.py:512 +#: ../src/tooltips.py:524 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:566 +#: ../src/tooltips.py:579 msgid "Download" msgstr "Scarica" -#: ../src/tooltips.py:572 +#: ../src/tooltips.py:585 msgid "Upload" msgstr "Invia" -#: ../src/tooltips.py:579 +#: ../src/tooltips.py:592 msgid "Type: " msgstr "Tipo: " -#: ../src/tooltips.py:585 +#: ../src/tooltips.py:598 msgid "Transferred: " msgstr "Trasferito: " -#: ../src/tooltips.py:588 ../src/tooltips.py:609 +#: ../src/tooltips.py:601 ../src/tooltips.py:622 msgid "Not started" msgstr "Non iniziato" -#: ../src/tooltips.py:592 +#: ../src/tooltips.py:605 msgid "Stopped" msgstr "Fermato" -#: ../src/tooltips.py:594 ../src/tooltips.py:597 +#: ../src/tooltips.py:607 ../src/tooltips.py:610 msgid "Completed" msgstr "Completato" -#: ../src/tooltips.py:601 +#: ../src/tooltips.py:614 msgid "?transfer status:Paused" msgstr "?transfer status:In pausa" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:605 +#: ../src/tooltips.py:618 msgid "Stalled" msgstr "In stallo" -#: ../src/tooltips.py:607 +#: ../src/tooltips.py:620 msgid "Transferring" msgstr "Trasferimento in corso" -#: ../src/tooltips.py:639 +#: ../src/tooltips.py:652 msgid "This service has not yet responded with detailed information" msgstr "Questo servizio non ha ancora inviato informazioni dettagliate" -#: ../src/tooltips.py:642 +#: ../src/tooltips.py:655 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -5404,24 +5896,24 @@ msgstr "" "Questo servizio non ha inviato informazioni dettagliate.\n" "È probabilmente vecchio o malfunzionante" -#: ../src/vcard.py:217 +#: ../src/vcard.py:240 msgid "?Client:Unknown" msgstr "?Client:Sconosciuto" -#: ../src/vcard.py:219 +#: ../src/vcard.py:242 msgid "?OS:Unknown" msgstr "Sconosciuto" -#: ../src/vcard.py:247 ../src/vcard.py:449 +#: ../src/vcard.py:267 ../src/vcard.py:277 ../src/vcard.py:467 #, python-format msgid "since %s" -msgstr "da %s" +msgstr "dalle %s" -#: ../src/vcard.py:277 +#: ../src/vcard.py:306 msgid "Affiliation:" msgstr "Affiliazione: " -#: ../src/vcard.py:285 +#: ../src/vcard.py:314 msgid "" "This contact is interested in your presence information, but you are not " "interested in his/her presence" @@ -5429,7 +5921,7 @@ msgstr "" "Questo contatto è interessato alle informazioni sulla tua presenza, ma tu " "non sei interessato alla sua" -#: ../src/vcard.py:287 +#: ../src/vcard.py:316 msgid "" "You are interested in the contact's presence information, but he/she is not " "interested in yours" @@ -5437,14 +5929,14 @@ msgstr "" "Sei interessato alle informazioni sulla presenza di questo contatto, ma lui/" "lei non è interessato/a alla tua" -#: ../src/vcard.py:289 +#: ../src/vcard.py:318 msgid "You and the contact are interested in each other's presence information" msgstr "" "Tu ed il contatto siete reciprocamente interessati alle informazioni sulla " "presenza dell'altro" #. None -#: ../src/vcard.py:291 +#: ../src/vcard.py:320 msgid "" "You are not interested in the contact's presence, and neither he/she is " "interested in yours" @@ -5452,12 +5944,12 @@ msgstr "" "Non sei interessato alla presenza del contatto, e lui/lei non è interessato " "alla tua" -#: ../src/vcard.py:299 +#: ../src/vcard.py:328 msgid "You are waiting contact's answer about your subscription request" msgstr "" "Sei in attesa della risposta del contatto alla tua richiesta di abbonamento" -#: ../src/vcard.py:311 ../src/vcard.py:338 ../src/vcard.py:482 +#: ../src/vcard.py:332 ../src/vcard.py:369 ../src/vcard.py:492 msgid " resource with priority " msgstr " risorsa con priorità " @@ -5465,23 +5957,23 @@ msgstr " risorsa con priorità " msgid "creating logs database" msgstr "creazione database log" -#: ../src/common/check_paths.py:89 ../src/common/check_paths.py:100 -#: ../src/common/check_paths.py:107 +#: ../src/common/check_paths.py:96 ../src/common/check_paths.py:107 +#: ../src/common/check_paths.py:114 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s è un file ma dovrebbe essere una cartella" -#: ../src/common/check_paths.py:90 ../src/common/check_paths.py:101 -#: ../src/common/check_paths.py:108 ../src/common/check_paths.py:116 +#: ../src/common/check_paths.py:97 ../src/common/check_paths.py:108 +#: ../src/common/check_paths.py:115 ../src/common/check_paths.py:123 msgid "Gajim will now exit" msgstr "Gajim sta per uscire" -#: ../src/common/check_paths.py:115 +#: ../src/common/check_paths.py:122 #, python-format msgid "%s is a directory but should be a file" msgstr "%s è una cartella ma dovrebbe essere un file" -#: ../src/common/check_paths.py:131 +#: ../src/common/check_paths.py:138 #, python-format msgid "creating %s directory" msgstr "creazione della cartella %s" @@ -5537,54 +6029,58 @@ msgstr "Non si è entrati in una chat di gruppo." #: ../src/common/commands.py:189 msgid "Leave Groupchats" -msgstr "Lasciare le chat di gruppo" +msgstr "Esci dalle chat di gruppo" #: ../src/common/commands.py:190 msgid "Choose the groupchats you want to leave" -msgstr "Scegliere le chat di gruppo da lasciare" - -#: ../src/common/commands.py:194 -msgid "Groupchats" -msgstr "Chat di gruppo" +msgstr "Scegliere le chat di gruppo da cui vuoi uscire" #: ../src/common/commands.py:230 -msgid "You leaved the following groupchats:" -msgstr "Sono state lasciate le seguenti chat di gruppo:" +msgid "You left the following groupchats:" +msgstr "Sei uscito dalle seguenti chat di gruppo:" -#: ../src/common/config.py:56 +#: ../src/common/commands.py:242 +msgid "Forward unread messages" +msgstr "Inoltra messaggi non letti" + +#: ../src/common/commands.py:262 +msgid "All unread messages have been forwarded." +msgstr "Tutti i messaggi non letti sono stati inoltrati." + +#: ../src/common/config.py:58 msgid "Use D-Bus and Notification-Daemon to show notifications" msgstr "Usa D-Bus e Notification-Daemon per mostrare le notifiche" -#: ../src/common/config.py:61 +#: ../src/common/config.py:63 msgid "Time in minutes, after which your status changes to away." -msgstr "Tempo in minuti dopo il quale lo stato diventa \"assente\"." +msgstr "Tempo in minuti dopo il quale lo stato diventa 'assente'." -#: ../src/common/config.py:62 +#: ../src/common/config.py:64 msgid "Away as a result of being idle" msgstr "Assente per inattività" -#: ../src/common/config.py:64 +#: ../src/common/config.py:66 msgid "Time in minutes, after which your status changes to not available." -msgstr "Tempo in minuti dopo il quale lo stato diventa \"non disponibile\"." +msgstr "Tempo in minuti dopo il quale lo stato diventa 'non disponibile'." -#: ../src/common/config.py:65 +#: ../src/common/config.py:67 msgid "Not available as a result of being idle" msgstr "Non disponibile per inattività" -#: ../src/common/config.py:83 +#: ../src/common/config.py:85 msgid "" "List (space separated) of rows (accounts and groups) that are collapsed." msgstr "Lista (separata da spazi) di linee (account e gruppi) raggruppate." -#: ../src/common/config.py:88 +#: ../src/common/config.py:90 msgid "Enable link-local/zeroconf messaging" msgstr "Abilità la messaggistica zeroconf sulla rete locale" -#: ../src/common/config.py:91 +#: ../src/common/config.py:93 msgid "Language used by speller" msgstr "Lingua usata dal controllo ortografico" -#: ../src/common/config.py:92 +#: ../src/common/config.py:94 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" @@ -5594,32 +6090,37 @@ msgstr "" "'a volte' - scrive l'ora ogni print_ichat_every_foo_minutes minuti.\n" "'mai' - non scrive mai l'ora." -#: ../src/common/config.py:93 +#: ../src/common/config.py:95 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " "to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " "This is used only if print_time is 'sometimes'." -msgstr "Scrive l'ora nelle chat usando l'orologio vago. Valore di vaghezza da 1 a 4, o 0 per disabilitarlo. 1 è l'orologio più preciso, 4 è il meno preciso. Viene usato solo se print_time è 'sometimes'." +msgstr "" +"Scrive l'ora nelle chat usando l'orologio vago. Valore di vaghezza da 1 a 4, " +"o 0 per disabilitarlo. 1 è l'orologio più preciso, 4 è il meno preciso. " +"Viene usato solo se print_time è 'sometimes'." -#: ../src/common/config.py:96 +#: ../src/common/config.py:98 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Tratta le coppie di * / _ come possibili caratteri di formattazione." -#: ../src/common/config.py:97 +#: ../src/common/config.py:99 msgid "" "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" -"Se Vero, non verranno rimossi */_ . *abc* verrà mostrato in grassetto ma " -"senza rimuovere * *." +"Se Vero, non verranno rimossi */_ . Perciò *abc* verrà mostrato in grassetto " +"ma senza rimuovere * *." -#: ../src/common/config.py:100 +#: ../src/common/config.py:102 msgid "" "Uses ReStructured text markup to send HTML, plus ascii formatting if " "selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" "restructuredtext.html (If you want to use this, install docutils)" -msgstr "Usa il testo annotato ReStructured per inviare HTML, più la formattazione ascii se selezionata (se si vuole usare questa opzione, installare docutils)" +msgstr "" +"Usa il testo annotato ReStructured per inviare HTML, più la formattazione " +"ascii se selezionata (se si vuole usare questa opzione, installare docutils)" -#: ../src/common/config.py:109 +#: ../src/common/config.py:111 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." @@ -5627,7 +6128,7 @@ msgstr "" "Carattere da aggiungere dopo il nickname quando si usa il completamento nick " "(tab) nella chat di gruppo." -#: ../src/common/config.py:110 +#: ../src/common/config.py:112 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." @@ -5635,26 +6136,30 @@ msgstr "" "Carattere da proporre di aggiungere dopo il nickname desiderato quando il " "nickname desiderato è già usato da qualcun'altro nella chat di gruppo" -#: ../src/common/config.py:133 +#: ../src/common/config.py:135 msgid "" "This option let you customize timestamp that is printed in conversation. For " "exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " "strftime for full documentation: http://docs.python.org/lib/module-time.html" -msgstr "Questa opzione permette di personalizzare l'orario stampato nelle conversazioni. Per esempio, \"[%H:%M] \" mostrerà \"[ora:minuto] \". Vedere la documentazione della funzione python strftime per ottenere documentazione completa: http://docs.python.org/lib/module-time.html" +msgstr "" +"Questa opzione permette di personalizzare l'orario stampato nelle " +"conversazioni. Per esempio, \"[%H:%M] \" mostrerà \"[ora:minuto] \". Vedere " +"la documentazione della funzione python strftime per ottenere documentazione " +"completa: http://docs.python.org/lib/module-time.html" -#: ../src/common/config.py:134 +#: ../src/common/config.py:136 msgid "Characters that are printed before the nickname in conversations" msgstr "Caratteri scritti prima del nickname nelle conversazioni" -#: ../src/common/config.py:135 +#: ../src/common/config.py:137 msgid "Characters that are printed after the nickname in conversations" msgstr "Caratteri scritti dopo il nickname nelle conversazioni" -#: ../src/common/config.py:142 +#: ../src/common/config.py:144 msgid "Add * and [n] in roster title?" msgstr "Aggiungere * e [n] al titolo della lista contatti?" -#: ../src/common/config.py:143 +#: ../src/common/config.py:145 msgid "" "How many lines to remember from previous conversation when a chat tab/window " "is reopened." @@ -5662,12 +6167,12 @@ msgstr "" "Quante linee ricordare dalla precedente conversazione quando una scheda/" "finestra di chat viene riaperta." -#: ../src/common/config.py:144 +#: ../src/common/config.py:146 msgid "How many minutes should last lines from previous conversation last." msgstr "" "Quanti minuti devono durare le ultime linee dalla conversazione precedente." -#: ../src/common/config.py:145 +#: ../src/common/config.py:147 msgid "" "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " "Client default behaviour)." @@ -5675,11 +6180,11 @@ msgstr "" "Inviare il messaggio con Ctrl-Invio e con Invio creare una nuova linea " "(comportamento predefinito del client ICQ Mirabilis)." -#: ../src/common/config.py:147 +#: ../src/common/config.py:149 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Quante linee memorizzare per Ctrl+Alto." -#: ../src/common/config.py:150 +#: ../src/common/config.py:152 #, python-format msgid "" "Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' " @@ -5688,12 +6193,12 @@ msgstr "" "URL personalizzato contenente %s dove %s è la parola/frase o 'WIKTIONARY', " "che significa usare wiktionary." -#: ../src/common/config.py:153 +#: ../src/common/config.py:155 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "" "Se marcato, Gajim può essere controllato da remoto usando gajim-remote." -#: ../src/common/config.py:154 +#: ../src/common/config.py:156 msgid "" "If True, listen to D-Bus signals from NetworkManager and change the status " "of accounts (provided they do not have listen_to_network_manager set to " @@ -5705,13 +6210,13 @@ msgstr "" "che sia sincronizzato con lo stato globale) basandosi sullo stato della " "connessione di rete." -#: ../src/common/config.py:155 +#: ../src/common/config.py:157 msgid "" "Sent chat state notifications. Can be one of all, composing_only, disabled." msgstr "" "Notifiche di stato inviate. Può essere una tra all, composing_only, disabled." -#: ../src/common/config.py:156 +#: ../src/common/config.py:158 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." @@ -5719,7 +6224,7 @@ msgstr "" "Le notifiche di stato mostrate nella finestra di chat. Possono essere una " "tra all, composing_only, disabled." -#: ../src/common/config.py:158 +#: ../src/common/config.py:160 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." @@ -5727,11 +6232,11 @@ msgstr "" "Quando non scrivi la data ad ogni messaggio (print_time==sometimes), " "scriverla ogni x minuti." -#: ../src/common/config.py:159 +#: ../src/common/config.py:161 msgid "Ask before closing a group chat tab/window." msgstr "Chiedere prima di chiudere una finestra/scheda di chat di gruppo." -#: ../src/common/config.py:160 +#: ../src/common/config.py:162 msgid "" "Always ask before closing group chat tab/window in this space separated list " "of group chat jids." @@ -5739,7 +6244,7 @@ msgstr "" "Chiedere sempre prima di chiudere una finestra/scheda di chat di gruppo in " "questa lista separata da spazi di jid di stanze." -#: ../src/common/config.py:161 +#: ../src/common/config.py:163 msgid "" "Never ask before closing group chat tab/window in this space separated list " "of group chat jids." @@ -5747,42 +6252,56 @@ msgstr "" "Non chiedere mai prima di chiudere una scheda/finestra di chat in questa " "lista separata da spazi di jid di stanze." -#: ../src/common/config.py:164 -msgid "" -"Overrides the host we send for File Transfer in case of address translation/" -"port forwarding." -msgstr "" -"Imposta l'host inviato per il trasferimento file in caso di traduzione di " -"indirizzo/port forwarding." - #: ../src/common/config.py:166 +#, fuzzy +msgid "" +"Comma separated list of hosts that we send, in addition of local interfaces, " +"for File Transfer in case of address translation/port forwarding." +msgstr "" +"Lista di host separati da una virgola che saranno inviati, insieme alle " +"interfacce locali, per il trasferimento file in caso di traslazione " +"dell'indirizzo/inoltro porte." + +#: ../src/common/config.py:168 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "Secondo lo standard IEC, KiB = 1024 byte, KB = 1000 byte." -#: ../src/common/config.py:168 +#: ../src/common/config.py:170 msgid "Notify of events in the system trayicon." msgstr "Notifica gli eventi nell'area di notifica." -#: ../src/common/config.py:174 +#: ../src/common/config.py:176 msgid "Show tab when only one conversation?" msgstr "Mostrare scheda quando c'è una sola conversazione?" -#: ../src/common/config.py:175 +#: ../src/common/config.py:177 msgid "Show tabbed notebook border in chat windows?" msgstr "Mostrare bordo per le schede quando c'è una sola conversazione?" -#: ../src/common/config.py:176 +#: ../src/common/config.py:178 msgid "Show close button in tab?" msgstr "Mostrare il pulsante \"chiudi\" nelle schede?" -#: ../src/common/config.py:189 +#: ../src/common/config.py:179 +msgid "" +"When negotiating an encrypted session, should Gajim assume you want your " +"messages to be logged?" +msgstr "" +"Durante la negoziazione di una sessione cifrata, Gajim deve abilitare la " +"registrazione dei messaggi?" + +#: ../src/common/config.py:188 +msgid "Preview new messages in notification popup?" +msgstr "Includere l'anteprima dei nuovi messaggi nelle notifiche popup?" + +#: ../src/common/config.py:193 msgid "" "A semicolon-separated list of words that will be highlighted in group chats." msgstr "" "Una lista separata da caratteri ';' di parole che verranno evidenziate nelle " "chat multi-utente." -#: ../src/common/config.py:190 +#: ../src/common/config.py:194 msgid "" "If True, quits Gajim when X button of Window Manager is clicked. This " "setting is taken into account only if trayicon is used." @@ -5791,12 +6310,13 @@ msgstr "" "cliccato. Questa impostazione è presa in considerazione solo se viene usata " "l'icona nello spazio di notifica." -#: ../src/common/config.py:191 +#: ../src/common/config.py:195 msgid "" "If True, Gajim will check if it's the default jabber client on each startup." -msgstr "Se Vero, Gajim controllerà se è il client Jabber predefinito ad ogni avvio." +msgstr "" +"Se Vero, Gajim controllerà se è il client Jabber predefinito ad ogni avvio." -#: ../src/common/config.py:192 +#: ../src/common/config.py:196 msgid "" "If True, Gajim will display an icon on each tab containing unread messages. " "Depending on the theme, this icon may be animated." @@ -5804,7 +6324,7 @@ msgstr "" "Se Vero, Gajim mostrerà un icona su ogni scheda contenente messaggi non " "letti. A seconda del tema, questa icona può essere animata." -#: ../src/common/config.py:193 +#: ../src/common/config.py:197 msgid "" "If True, Gajim will display the status message, if not empty, for every " "contact under the contact name in roster window." @@ -5812,7 +6332,7 @@ msgstr "" "Se Vero, Gajim mostrerà il messaggio di stato, se non vuoto, per ogni " "contatto sotto il nome del contatto nella finestra dei contatti" -#: ../src/common/config.py:195 +#: ../src/common/config.py:199 msgid "" "If True, Gajim will ask for avatar each contact that did not have an avatar " "last time or has one cached that is too old." @@ -5820,7 +6340,7 @@ msgstr "" "Se Vero, Gajim chiederà un avatar ad ogni contatto che non aveva un avatar " "l'ultima volta o ne ha uno troppo vecchio in cache." -#: ../src/common/config.py:196 +#: ../src/common/config.py:200 msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." @@ -5828,39 +6348,44 @@ msgstr "" "Se Falso, non si vedrà più la linea di stato nelle chat quando un contatto " "cambia stato o messaggio di stato." -#: ../src/common/config.py:197 +#: ../src/common/config.py:201 msgid "" "can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " "longer print status line in groupchats when a member changes his or her " "status and/or his or her status message. If \"all\" Gajim will print all " "status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " "group chat." -msgstr "può essere \"none\", \"all\" o \"in_and_out\". Se \"none\", Gajim non scriverà più la riga di stato nelle chat di gruppo quando un membro cambia il suo stato e/o il suo messaggio di stato. Se \"all\" Gajim scriverà tutti i messaggi di stato. Se \"in_and_out\", gajim scriverà solo quando qualcuno entra od esce dalla chat di gruppo." +msgstr "" +"può essere \"none\", \"all\" o \"in_and_out\". Se \"none\", Gajim non " +"scriverà più la riga di stato nelle chat di gruppo quando un membro cambia " +"il suo stato e/o il suo messaggio di stato. Se \"all\" Gajim scriverà tutti " +"i messaggi di stato. Se \"in_and_out\", gajim scriverà solo quando qualcuno " +"entra od esce dalla chat di gruppo." -#: ../src/common/config.py:199 +#: ../src/common/config.py:203 msgid "Background color of contacts when they just signed in." msgstr "Colore di sfondo dei contatti appena collegati." -#: ../src/common/config.py:200 +#: ../src/common/config.py:204 msgid "Background color of contacts when they just signed out." msgstr "Colore di sfondo dei contatti appena scollegati." -#: ../src/common/config.py:202 +#: ../src/common/config.py:206 msgid "" "If True, restored messages will use a smaller font than the default one." msgstr "" "Se Vero, i messaggi recuperati useranno un font più piccolo di quello " "predefinito." -#: ../src/common/config.py:203 +#: ../src/common/config.py:207 msgid "Don't show avatar for the transport itself." msgstr "Non mostrare l'avatar per il trasporto stesso." -#: ../src/common/config.py:204 +#: ../src/common/config.py:208 msgid "Don't show roster in the system taskbar." msgstr "Non mostrare l'account nella taskbar del sistema." -#: ../src/common/config.py:205 +#: ../src/common/config.py:209 msgid "" "If True and installed GTK+ and PyGTK versions are at least 2.8, make the " "window flash (the default behaviour in most Window Managers) when holding " @@ -5870,7 +6395,7 @@ msgstr "" "finestra lampeggia (comportamento predefinito per la maggior parte dei " "gestori di finestre) quando contiene nuovi eventi." -#: ../src/common/config.py:207 +#: ../src/common/config.py:211 msgid "" "Jabberd1.4 does not like sha info when one join a password protected group " "chat. Turn this option to False to stop sending sha info in group chat " @@ -5881,7 +6406,7 @@ msgstr "" "SHA nella presenza sulle chat di gruppo" #. always, never, peracct, pertype should not be translated -#: ../src/common/config.py:210 +#: ../src/common/config.py:214 msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" @@ -5900,36 +6425,32 @@ msgstr "" "ad una specifica finestra. Nota, cambiare questa opzione richiede il riavvio " "di Gajim prima che le modifiche abbiano effetto" -#: ../src/common/config.py:211 +#: ../src/common/config.py:215 msgid "If False, you will no longer see the avatar in the chat window." msgstr "Se Falso, l'avatar non verrà mostrato nella finestra di chat" -#: ../src/common/config.py:212 +#: ../src/common/config.py:216 msgid "If True, pressing the escape key closes a tab/window." msgstr "Se Vero, premere il tasto Esc chiude una scheda/finestra" -#: ../src/common/config.py:213 -msgid "Hides the buttons in group chat window." -msgstr "Nasconde i pulsanti nella finestra di chat di gruppo" +#: ../src/common/config.py:217 +msgid "Hides the buttons in chat windows." +msgstr "Nascondi i pulsanti nella finestra di chat di gruppo." -#: ../src/common/config.py:214 -msgid "Hides the buttons in two persons chat window." -msgstr "Nasconde i pulsanti nella finestra di chat a due persone" - -#: ../src/common/config.py:215 +#: ../src/common/config.py:218 msgid "Hides the banner in a group chat window" msgstr "Nasconde l'intestazione in una finestra di chat di gruppo" -#: ../src/common/config.py:216 +#: ../src/common/config.py:219 msgid "Hides the banner in two persons chat window" msgstr "Nasconde l'intestazione nella finestra di chat a due persone" -#: ../src/common/config.py:217 +#: ../src/common/config.py:220 msgid "Hides the group chat occupants list in group chat window." msgstr "" "Nasconde la lista dei presenti nella stanza nella finestra di chat di gruppo" -#: ../src/common/config.py:218 +#: ../src/common/config.py:221 msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." @@ -5937,22 +6458,26 @@ msgstr "" "In una chat, mostra il nickname all'inizio della riga solo quando non è " "quello della persona che parlava nel messaggio precedente." -#: ../src/common/config.py:219 +#: ../src/common/config.py:222 msgid "Indentation when using merge consecutive nickname." msgstr "Indentazione quando si raggruppano nickname consecutivi." -#: ../src/common/config.py:220 +#: ../src/common/config.py:223 +msgid "Smooth scroll message in conversation window" +msgstr "Scorrimento fluido dei messaggi nella finestra di continuazione" + +#: ../src/common/config.py:224 msgid "List of colors that will be used to color nicknames in group chats." msgstr "" "Lista di colori che saranno usati per colorare i nickname nelle chat di " "gruppo." -#: ../src/common/config.py:221 +#: ../src/common/config.py:225 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "" "Ctrl-Tab va alla prossima scheda di composizione se nessuna è non letta." -#: ../src/common/config.py:222 +#: ../src/common/config.py:226 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." @@ -5960,7 +6485,7 @@ msgstr "" "Mostrare la richiesta di conferma creazione metacontatti o meno? Una stringa " "vuota significa che non verrà mai mostrata." -#: ../src/common/config.py:223 +#: ../src/common/config.py:227 msgid "" "If True, you will be able to set a negative priority to your account in " "account modification window. BE CAREFUL, when you are logged in with a " @@ -5970,25 +6495,61 @@ msgstr "" "di modifica account. ATTENZIONE, quando si è collegati con priorità " "negativa, NON si riceveranno messaggi dal server." -#: ../src/common/config.py:224 +#: ../src/common/config.py:228 msgid "" "If True, Gajim will use Gnome Keyring (if available) to store account " "passwords." -msgstr "Se Vero, Gajim userà il Keyring Gnome (se disponibile) per memorizzare le password degli account." +msgstr "" +"Se Vero, Gajim userà il Keyring Gnome (se disponibile) per memorizzare le " +"password degli account." -#: ../src/common/config.py:225 +#: ../src/common/config.py:229 msgid "" "If True, Gajim will show number of online and total contacts in account and " "group rows." -msgstr "Se Vero, Gajim mostrerà il numero di account online e totali nelle linee degli account e dei gruppi." +msgstr "" +"Se Vero, Gajim mostrerà il numero di account online e totali nelle linee " +"degli account e dei gruppi." -#: ../src/common/config.py:226 +#: ../src/common/config.py:230 msgid "" "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " "as if they were of this type" -msgstr "Può essere vuoto, 'chat' o 'normal'. Se non vuoto, tratta tutti i messaggi in iarrivo come se fossero di questo tipo" +msgstr "" +"Può essere vuoto, 'chat' o 'normal'. Se non vuoto, tratta tutti i messaggi " +"in iarrivo come se fossero di questo tipo" -#: ../src/common/config.py:237 +#: ../src/common/config.py:231 +msgid "" +"If True, Gajim will scroll and select the contact who sent you the last " +"message, if chat window is not already opened." +msgstr "" +"Se Vero, Gajim scorrerà e selezionerà il contatto che ti ha mandato l'ultimo " +"messaggio, se la finestra di chat non è già aperta." + +#: ../src/common/config.py:232 +msgid "" +"If True, Gajim will convert string between $$ and $$ to an image using dvips " +"and convert before insterting it in chat window." +msgstr "" +"Se Vero, Gajim converterà le stringhe comprese tra $$ e $$ in un'immagine " +"usando dvips e convertendola prima di inserirla in una finestra di chat." + +#: ../src/common/config.py:233 +msgid "Time of inactivity needed before the change status window closes down." +msgstr "" +"Tempo di inattività richiesto prima che la finestra di cambiamento del " +"messaggio di stato si chiuda." + +#: ../src/common/config.py:234 +msgid "" +"Maximum number of lines that are printed in conversations. Oldest lines are " +"cleared." +msgstr "" +"Massimo numero di linee che sono visualizzate nelle conversazioni. Le linee " +"più vecchie verranno cancellate." + +#: ../src/common/config.py:245 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." @@ -5997,11 +6558,11 @@ msgstr "" "definite nelle opzioni autopriority_*." #. yes, no, ask -#: ../src/common/config.py:266 +#: ../src/common/config.py:275 msgid "Jabberd2 workaround" msgstr "Workaround Jabberd2" -#: ../src/common/config.py:270 +#: ../src/common/config.py:279 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." @@ -6009,101 +6570,101 @@ msgstr "" "Se marcato, Gajim userà l'IP della macchina ed i proxy definiti nell'opzione " "file_transfer_proxies per il trasferimento file." -#: ../src/common/config.py:329 +#: ../src/common/config.py:338 msgid "Is OpenPGP enabled for this contact?" msgstr "OpenPGP è abilitato per questo contatto?" -#: ../src/common/config.py:330 ../src/common/config.py:333 +#: ../src/common/config.py:339 ../src/common/config.py:342 msgid "Language for which we want to check misspelled words" msgstr "Linguaggio per il quale controllare le parole sbagliate" -#: ../src/common/config.py:339 +#: ../src/common/config.py:348 msgid "all or space separated status" msgstr "tutto o stati separati da uno spazio" -#: ../src/common/config.py:340 +#: ../src/common/config.py:349 msgid "'yes', 'no', or 'both'" msgstr "'yes', 'no', o 'both'" -#: ../src/common/config.py:341 ../src/common/config.py:343 -#: ../src/common/config.py:344 ../src/common/config.py:347 -#: ../src/common/config.py:348 +#: ../src/common/config.py:350 ../src/common/config.py:352 +#: ../src/common/config.py:353 ../src/common/config.py:356 +#: ../src/common/config.py:357 msgid "'yes', 'no' or ''" msgstr "'yes', 'no' o 'both'" -#: ../src/common/config.py:354 +#: ../src/common/config.py:363 msgid "Sleeping" msgstr "Dormo" -#: ../src/common/config.py:355 +#: ../src/common/config.py:364 msgid "Back soon" msgstr "Torno presto" -#: ../src/common/config.py:355 +#: ../src/common/config.py:364 msgid "Back in some minutes." -msgstr "Di ritorno tra qualche minuto." +msgstr "Torno tra qualche minuto." -#: ../src/common/config.py:356 +#: ../src/common/config.py:365 msgid "Eating" msgstr "Mangio" -#: ../src/common/config.py:356 +#: ../src/common/config.py:365 msgid "I'm eating, so leave me a message." -msgstr "Sto mangiando, lascia pure un messaggio" +msgstr "Sto mangiando, lascia pure un messaggio." -#: ../src/common/config.py:357 +#: ../src/common/config.py:366 msgid "Movie" msgstr "Film" -#: ../src/common/config.py:357 +#: ../src/common/config.py:366 msgid "I'm watching a movie." msgstr "Sto guardando un film." -#: ../src/common/config.py:358 +#: ../src/common/config.py:367 msgid "Working" msgstr "Lavoro" -#: ../src/common/config.py:358 +#: ../src/common/config.py:367 msgid "I'm working." msgstr "Sto lavorando." -#: ../src/common/config.py:359 +#: ../src/common/config.py:368 msgid "Phone" msgstr "Telefono" -#: ../src/common/config.py:359 +#: ../src/common/config.py:368 msgid "I'm on the phone." -msgstr "Sono al telefono" +msgstr "Sono al telefono." -#: ../src/common/config.py:360 +#: ../src/common/config.py:369 msgid "Out" msgstr "Fuori" -#: ../src/common/config.py:360 +#: ../src/common/config.py:369 msgid "I'm out enjoying life." -msgstr "Sono fuori a divertirmi" +msgstr "Sono fuori a divertirmi." -#: ../src/common/config.py:364 +#: ../src/common/config.py:373 msgid "I'm available." -msgstr "Disponibile" +msgstr "Sono disponibile." -#: ../src/common/config.py:365 +#: ../src/common/config.py:374 msgid "I'm free for chat." -msgstr "Libero per chat" +msgstr "Solo libero per chat." -#: ../src/common/config.py:367 +#: ../src/common/config.py:376 msgid "I'm not available." -msgstr "Servizio non disponibile" +msgstr "Non sono disponibile." -#: ../src/common/config.py:368 +#: ../src/common/config.py:377 msgid "Do not disturb." msgstr "Non disturbare." -#: ../src/common/config.py:369 ../src/common/config.py:370 +#: ../src/common/config.py:378 ../src/common/config.py:379 msgid "Bye!" msgstr "Ciao ciao!" -#: ../src/common/config.py:379 +#: ../src/common/config.py:388 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." @@ -6111,123 +6672,130 @@ msgstr "" "Suono da riprodurre quando un messaggio MUC contiene una delle parole in " "muc_highlight_words, o quando un messaggio MUC contiene il tuo nickname." -#: ../src/common/config.py:380 +#: ../src/common/config.py:389 msgid "Sound to play when any MUC message arrives." msgstr "Suono da riprodurre quando un messaggio MUC arriva." -#: ../src/common/config.py:389 ../src/common/optparser.py:193 +#: ../src/common/config.py:398 ../src/common/optparser.py:208 msgid "green" msgstr "verde" -#: ../src/common/config.py:393 ../src/common/optparser.py:179 +#: ../src/common/config.py:402 ../src/common/optparser.py:194 msgid "grocery" msgstr "drogheria" -#: ../src/common/config.py:397 +#: ../src/common/config.py:406 msgid "human" msgstr "umano" -#: ../src/common/config.py:401 +#: ../src/common/config.py:410 msgid "marine" msgstr "marino" -#: ../src/common/connection_handlers.py:52 +#: ../src/common/connection_handlers.py:56 #: ../src/common/zeroconf/connection_handlers_zeroconf.py:44 msgid "Unable to load idle module" msgstr "Impossibile caricare il modulo idle" -#: ../src/common/connection_handlers.py:177 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 +#: ../src/common/connection_handlers.py:215 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 msgid "Wrong host" msgstr "Host errato" -#: ../src/common/connection_handlers.py:177 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 -msgid "" -"The host you configured as the ft_override_host_to_send advanced option is " -"not valid, so ignored." -msgstr "" -"L'host configurato come ft_override_host_to_send nelle opzioni avanzate non " -"è valido, sarà ignorato." +#: ../src/common/connection_handlers.py:216 +msgid "Invalid local address? :-O" +msgstr "Indirizzo locale non valido? :-O" -#: ../src/common/connection_handlers.py:590 +#: ../src/common/connection_handlers.py:608 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "" "Le informazioni di registrazione per il transport %s non sono arrivate in " "tempo" -#: ../src/common/connection_handlers.py:1543 +#: ../src/common/connection_handlers.py:1779 #, python-format msgid "Nickname not allowed: %s" msgstr "Nickname non permesso: %s" -#. password required to join #. we are banned #. group chat does not exist -#: ../src/common/connection_handlers.py:1605 -#: ../src/common/connection_handlers.py:1608 -#: ../src/common/connection_handlers.py:1611 -#: ../src/common/connection_handlers.py:1614 -#: ../src/common/connection_handlers.py:1617 -#: ../src/common/connection_handlers.py:1620 -#: ../src/common/connection_handlers.py:1628 +#: ../src/common/connection_handlers.py:1849 +#: ../src/common/connection_handlers.py:1852 +#: ../src/common/connection_handlers.py:1855 +#: ../src/common/connection_handlers.py:1858 +#: ../src/common/connection_handlers.py:1862 +#: ../src/common/connection_handlers.py:1871 msgid "Unable to join group chat" msgstr "Non è possibile entrare nella stanza" -#: ../src/common/connection_handlers.py:1606 -msgid "A password is required to join this group chat." -msgstr "È necessaria una password per entrare in questa stanza." +#: ../src/common/connection_handlers.py:1850 +#, python-format +msgid "You are banned from group chat %s." +msgstr "Sei stato bandito dalla stanza %s." -#: ../src/common/connection_handlers.py:1609 -msgid "You are banned from this group chat." -msgstr "Sei bandito da questa stanza." +#: ../src/common/connection_handlers.py:1853 +#, python-format +msgid "Group chat %s does not exist." +msgstr "La stanza %s non esiste." -#: ../src/common/connection_handlers.py:1612 -msgid "Such group chat does not exist." -msgstr "Questa stanza non esiste." - -#: ../src/common/connection_handlers.py:1615 +#: ../src/common/connection_handlers.py:1856 msgid "Group chat creation is restricted." msgstr "Non è permessa la creazione di stanze." -#: ../src/common/connection_handlers.py:1618 -msgid "Your registered nickname must be used." -msgstr "È necessario usare il nickname registrato." +#: ../src/common/connection_handlers.py:1859 +#, python-format +msgid "Your registered nickname must be used in group chat %s." +msgstr "Il tuo nickname è già in uso nella stanza di gruppo %s:" -#: ../src/common/connection_handlers.py:1621 -msgid "You are not in the members list." -msgstr "Non si appartiene alla lista dei membri." +#: ../src/common/connection_handlers.py:1863 +#, python-format +msgid "You are not in the members list in groupchat %s." +msgstr "Non sei nella lista dei membri nella chat di gruppo %s." -#: ../src/common/connection_handlers.py:1629 +#: ../src/common/connection_handlers.py:1872 +#, python-format msgid "" -"Your desired nickname is in use or registered by another occupant.\n" +"Your desired nickname in group chat %s is in use or registered by another " +"occupant.\n" "Please specify another nickname below:" msgstr "" -"Il nickname desiderato è in uso o registrato da un altro partecipante.\n" +"Il nickname desiderato è in uso o registrato da un altro partecipante alla " +"chat di gruppo %s.\n" "Specificare un altro nickname sotto:" -#: ../src/common/connection_handlers.py:1679 +#. Room has been destroyed. see +#. http://www.xmpp.org/extensions/xep-0045.html#destroyroom +#: ../src/common/connection_handlers.py:1903 +msgid "Room has been destroyed" +msgstr "La stanza è stata cancellata" + +#: ../src/common/connection_handlers.py:1910 +#, python-format +msgid "You can join this room instead: %s" +msgstr "Puoi invece entrare in questa stanza: %s" + +#: ../src/common/connection_handlers.py:1937 msgid "I would like to add you to my roster." msgstr "Vorrei aggiungerti ai miei contatti." #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:1700 +#: ../src/common/connection_handlers.py:1958 #, python-format msgid "we are now subscribed to %s" msgstr "si è ora abbonati a %s" -#: ../src/common/connection_handlers.py:1702 +#: ../src/common/connection_handlers.py:1960 #, python-format msgid "unsubscribe request from %s" msgstr "richiesta di cancellazione abbonamento da %s" -#: ../src/common/connection_handlers.py:1704 +#: ../src/common/connection_handlers.py:1962 #, python-format msgid "we are now unsubscribed from %s" msgstr "è stato ora cancellato l'abbonamento a %s" -#: ../src/common/connection_handlers.py:1874 +#: ../src/common/connection_handlers.py:2084 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " @@ -6237,117 +6805,91 @@ msgstr "" "strumenti di gestione dei contatti come http://jru.jabberstudio.org/ per " "rimuoverlo" -#: ../src/common/connection.py:182 -#: ../src/common/zeroconf/connection_zeroconf.py:196 +#: ../src/common/connection.py:244 +#: ../src/common/zeroconf/connection_zeroconf.py:203 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Connessione con l'account \"%s\" persa" -#: ../src/common/connection.py:183 +#: ../src/common/connection.py:245 msgid "Reconnect manually." msgstr "Riconnetti manualmente." -#: ../src/common/connection.py:194 ../src/common/connection.py:221 +#: ../src/common/connection.py:256 +#, python-format +msgid "Server %s answered wrongly to register request: %s" +msgstr "" +"Il server %s ha risposto in maniera errata alla richiesta di registrazione: %" +"s" + +#. wrong answer +#: ../src/common/connection.py:264 +msgid "Invalid answer" +msgstr "Risposta non valida" + +#: ../src/common/connection.py:265 #, python-format msgid "Transport %s answered wrongly to register request: %s" msgstr "" "Il trasporto %s ha risposto in maniera errata alla richiesta di " "registrazione: %s" -#. wrong answer -#: ../src/common/connection.py:220 -msgid "Invalid answer" -msgstr "Risposta non valida" +#: ../src/common/connection.py:411 +msgid "Connection to proxy failed" +msgstr "Connessione al proxy fallita" -#: ../src/common/connection.py:416 ../src/common/connection.py:515 -#: ../src/common/connection.py:973 -#: ../src/common/zeroconf/connection_zeroconf.py:217 +#: ../src/common/connection.py:465 ../src/common/connection.py:511 +#: ../src/common/connection.py:1067 +#: ../src/common/zeroconf/connection_zeroconf.py:237 #, python-format msgid "Could not connect to \"%s\"" -msgstr "Non ci si è potuti collegare a \"%s\"" +msgstr "Non è possibile connettersi a \"%s\"" -#: ../src/common/connection.py:430 +#: ../src/common/connection.py:479 #, python-format msgid "Connected to server %s:%s with %s" msgstr "Connesso al server %s:%s con %s" -#: ../src/common/connection.py:444 -#, python-format -msgid "Security error connecting to \"%s\"" -msgstr "Errore di sicurezza nella connessione a \"%s\"" - -#: ../src/common/connection.py:445 -msgid "" -"The server's key has changed, or someone is trying to hack your connection." -msgstr "La chiave del server è cambiata, o qualcuno sta cercando di intromettersi nella connessione." - -#: ../src/common/connection.py:452 -#, python-format -msgid "Unable to check fingerprint for %s. Connection could be insecure." -msgstr "Non è possibile verificare l'impronta digitale di %s. La connessione potrebbe non essere sicura." - -#: ../src/common/connection.py:494 -#, python-format -msgid "Missing fingerprint in SSL connection to %s" -msgstr "Impronta digitale mancante nella connessione SSL a %s" - -#: ../src/common/connection.py:500 -#, python-format -msgid "Fingerprint mismatch for %s: Got %s, expected %s" -msgstr "Impronta digitale non corrispondente per %s: ottenuto %s, atteso %s" - -#: ../src/common/connection.py:516 +#: ../src/common/connection.py:512 msgid "Check your connection or try again later" msgstr "Controllare la connessione o riprovare più tardi" -#: ../src/common/connection.py:542 +#: ../src/common/connection.py:537 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Autenticazione con \"%s\" fallita" -#: ../src/common/connection.py:543 +#: ../src/common/connection.py:538 msgid "Please check your login and password for correctness." msgstr "Verificare la correttezza di login e password." -#: ../src/common/connection.py:570 +#: ../src/common/connection.py:581 msgid "Error while removing privacy list" msgstr "Errore durante la rimozione della lista privacy" -#: ../src/common/connection.py:571 +#: ../src/common/connection.py:582 #, python-format msgid "" "Privacy list %s has not been removed. It is maybe active in one of your " -"connected resources. Desactivate it and try again." -msgstr "La lista privacy %s non è stata rimossa. Potrebbe essere attiva in una delle risorse connesse. Disattivarla e riprovare." +"connected resources. Deactivate it and try again." +msgstr "" +"La lista privacy %s non è stata rimossa. Potrebbe essere attiva in una delle " +"risorse connesse. Disattivarla e riprovare." #. We didn't set a passphrase -#: ../src/common/connection.py:669 -#: ../src/common/zeroconf/connection_zeroconf.py:156 +#: ../src/common/connection.py:682 +#: ../src/common/zeroconf/connection_zeroconf.py:163 msgid "OpenPGP passphrase was not given" msgstr "Non è stata impostata la passphrase OpenPGP" -#. do not show I'm invisible! -#: ../src/common/connection.py:711 -msgid "invisible" -msgstr "invisibile" - -#: ../src/common/connection.py:712 -msgid "offline" -msgstr "offline" - -#: ../src/common/connection.py:713 -#, python-format -msgid "I'm %s" -msgstr "Sono %s" - #. we're not english #. one in locale and one en -#: ../src/common/connection.py:804 +#: ../src/common/connection.py:845 msgid "[This message is *encrypted* (See :JEP:`27`]" msgstr "[Questo messaggio è *cifrato* (vedi :JEP:`27`)]" -#: ../src/common/connection.py:860 -#: ../src/common/zeroconf/connection_zeroconf.py:397 +#: ../src/common/connection.py:916 +#: ../src/common/zeroconf/connection_zeroconf.py:423 #, python-format msgid "" "Subject: %s\n" @@ -6356,11 +6898,11 @@ msgstr "" "Oggetto: %s\n" "%s" -#: ../src/common/connection.py:999 +#: ../src/common/connection.py:1099 msgid "Not fetched because of invisible status" msgstr "Non ottenuto a causa di stato invisibile" -#: ../src/common/contacts.py:271 +#: ../src/common/contacts.py:294 msgid "Not in roster" msgstr "Non nei contatti" @@ -6377,19 +6919,19 @@ msgstr "Le potenzialità D-Bus di Gajim non possono essere usate" msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." msgstr "La dipendenza pysqlite2 (o python-pysqlite2) è mancante. Uscita..." -#: ../src/common/exceptions.py:30 +#: ../src/common/exceptions.py:39 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "" "Servizio non disponibile: Gajim non è in esecuzione, o remote_control è " "Falso." -#: ../src/common/exceptions.py:38 +#: ../src/common/exceptions.py:47 msgid "D-Bus is not present on this machine or python module is missing" msgstr "" "D-Bus non è presente su questa macchina o il relativo modulo python è " "mancante" -#: ../src/common/exceptions.py:46 +#: ../src/common/exceptions.py:55 msgid "" "Session bus is not available.\n" "Try reading http://trac.gajim.org/wiki/GajimDBus" @@ -6547,293 +7089,300 @@ msgstr "Fine settimana" msgid "Weekend!" msgstr "Fine settimana!" -#: ../src/common/helpers.py:114 +#: ../src/common/helpers.py:115 msgid "Invalid character in username." msgstr "Carattere non valido nel nome utente." -#: ../src/common/helpers.py:119 +#: ../src/common/helpers.py:120 msgid "Server address required." msgstr "Indirizzo del server richiesto." -#: ../src/common/helpers.py:124 +#: ../src/common/helpers.py:125 msgid "Invalid character in hostname." msgstr "Carattere non valido nell'hostname." -#: ../src/common/helpers.py:130 +#: ../src/common/helpers.py:131 msgid "Invalid character in resource." msgstr "Carattere non valido nella risorsa." #. GiB means gibibyte -#: ../src/common/helpers.py:170 +#: ../src/common/helpers.py:171 #, python-format msgid "%s GiB" msgstr "%s GiB" #. GB means gigabyte -#: ../src/common/helpers.py:173 +#: ../src/common/helpers.py:174 #, python-format msgid "%s GB" msgstr "%s GB" #. MiB means mibibyte -#: ../src/common/helpers.py:177 +#: ../src/common/helpers.py:178 #, python-format msgid "%s MiB" msgstr "%s MiB" #. MB means megabyte -#: ../src/common/helpers.py:180 +#: ../src/common/helpers.py:181 #, python-format msgid "%s MB" msgstr "%s MB" #. KiB means kibibyte -#: ../src/common/helpers.py:184 +#: ../src/common/helpers.py:185 #, python-format msgid "%s KiB" msgstr "%s KiB" #. KB means kilo bytes -#: ../src/common/helpers.py:187 +#: ../src/common/helpers.py:188 #, python-format msgid "%s KB" msgstr "%s KB" #. B means bytes -#: ../src/common/helpers.py:190 +#: ../src/common/helpers.py:191 #, python-format msgid "%s B" msgstr "%s B" -#: ../src/common/helpers.py:219 +#: ../src/common/helpers.py:222 msgid "_Busy" msgstr "O_ccupato" -#: ../src/common/helpers.py:221 +#: ../src/common/helpers.py:224 msgid "Busy" msgstr "Occupato" -#: ../src/common/helpers.py:224 +#: ../src/common/helpers.py:227 msgid "_Not Available" msgstr "_Non disponibile" -#: ../src/common/helpers.py:229 +#: ../src/common/helpers.py:232 msgid "_Free for Chat" msgstr "_Libero per chat" -#: ../src/common/helpers.py:231 +#: ../src/common/helpers.py:234 msgid "Free for Chat" msgstr "Libero per chat" -#: ../src/common/helpers.py:234 +#: ../src/common/helpers.py:237 msgid "_Available" msgstr "_Disponibile" -#: ../src/common/helpers.py:236 +#: ../src/common/helpers.py:239 msgid "Available" msgstr "Disponibile" -#: ../src/common/helpers.py:238 +#: ../src/common/helpers.py:241 msgid "Connecting" msgstr "Connessione in corso" -#: ../src/common/helpers.py:241 +#: ../src/common/helpers.py:244 msgid "A_way" msgstr "_Assente" -#: ../src/common/helpers.py:246 +#: ../src/common/helpers.py:249 msgid "_Offline" msgstr "_Offline" -#: ../src/common/helpers.py:248 +#: ../src/common/helpers.py:251 msgid "Offline" msgstr "Offline" -#: ../src/common/helpers.py:251 +#: ../src/common/helpers.py:254 msgid "_Invisible" msgstr "_Invisibile" -#: ../src/common/helpers.py:257 +#: ../src/common/helpers.py:260 msgid "?contact has status:Unknown" msgstr "Sconosciuto" -#: ../src/common/helpers.py:259 +#: ../src/common/helpers.py:262 msgid "?contact has status:Has errors" msgstr "Ci sono errori" -#: ../src/common/helpers.py:264 +#: ../src/common/helpers.py:267 msgid "?Subscription we already have:None" msgstr "Nessuno" -#: ../src/common/helpers.py:266 +#: ../src/common/helpers.py:269 msgid "To" msgstr "A" -#: ../src/common/helpers.py:270 +#: ../src/common/helpers.py:273 msgid "Both" msgstr "Entrambi" -#: ../src/common/helpers.py:278 +#: ../src/common/helpers.py:281 msgid "?Ask (for Subscription):None" msgstr "Nulla" -#: ../src/common/helpers.py:280 +#: ../src/common/helpers.py:283 msgid "Subscribe" msgstr "Abbonati" -#: ../src/common/helpers.py:289 +#: ../src/common/helpers.py:292 msgid "?Group Chat Contact Role:None" msgstr "Nessuno" -#: ../src/common/helpers.py:292 +#: ../src/common/helpers.py:295 msgid "Moderators" msgstr "Moderatori" -#: ../src/common/helpers.py:294 +#: ../src/common/helpers.py:297 msgid "Moderator" msgstr "Moderatore" -#: ../src/common/helpers.py:297 +#: ../src/common/helpers.py:300 msgid "Participants" msgstr "Partecipanti" -#: ../src/common/helpers.py:299 +#: ../src/common/helpers.py:302 msgid "Participant" msgstr "Participante" -#: ../src/common/helpers.py:302 +#: ../src/common/helpers.py:305 msgid "Visitors" msgstr "Visitatori" -#: ../src/common/helpers.py:304 +#: ../src/common/helpers.py:307 msgid "Visitor" msgstr "Visitatore" -#: ../src/common/helpers.py:310 +#: ../src/common/helpers.py:313 msgid "?Group Chat Contact Affiliation:None" msgstr "Nessuna" -#: ../src/common/helpers.py:312 +#: ../src/common/helpers.py:315 msgid "Owner" msgstr "Proprietario" -#: ../src/common/helpers.py:314 +#: ../src/common/helpers.py:317 msgid "Administrator" msgstr "Amministratore" -#: ../src/common/helpers.py:316 +#: ../src/common/helpers.py:319 msgid "Member" msgstr "Membro" -#: ../src/common/helpers.py:355 +#: ../src/common/helpers.py:358 msgid "is paying attention to the conversation" msgstr "sta seguendo la conversazione" -#: ../src/common/helpers.py:357 +#: ../src/common/helpers.py:360 msgid "is doing something else" msgstr "sta facendo altro" -#: ../src/common/helpers.py:359 +#: ../src/common/helpers.py:362 msgid "is composing a message..." msgstr "sta scrivendo..." #. paused means he or she was composing but has stopped for a while -#: ../src/common/helpers.py:362 +#: ../src/common/helpers.py:365 msgid "paused composing a message" msgstr "ha smesso di scrivere" -#: ../src/common/helpers.py:364 +#: ../src/common/helpers.py:367 msgid "has closed the chat window or tab" msgstr "ha chiuso la finestra o scheda di chat" -#: ../src/common/helpers.py:890 +#: ../src/common/helpers.py:913 ../src/common/helpers.py:920 #, python-format -msgid " %d unread message" -msgid_plural " %d unread messages" -msgstr[0] "Gajim - %d messaggio non letto" -msgstr[1] "Gajim - %d messaggi non letti" +msgid "%d message pending" +msgid_plural "%d messages pending" +msgstr[0] "%d messaggio in attesa" +msgstr[1] "%d messaggi in attesa" -#: ../src/common/helpers.py:896 +#: ../src/common/helpers.py:926 #, python-format -msgid " %d unread single message" -msgid_plural " %d unread single messages" -msgstr[0] "Gajim - %d messaggio singolo non letto" -msgstr[1] "Gajim - %d messaggi singoli non letti" +msgid " from room %s" +msgstr " dalla stanza %s" -#: ../src/common/helpers.py:902 +#: ../src/common/helpers.py:929 ../src/common/helpers.py:948 #, python-format -msgid " %d unread group chat message" -msgid_plural " %d unread group chat messages" -msgstr[0] "Gajim - %d messaggio in chat di gruppo non letto" -msgstr[1] "Gajim - %d messaggi in chat di gruppo non letti" +msgid " from user %s" +msgstr " dall'utente %s" -#: ../src/common/helpers.py:908 +#: ../src/common/helpers.py:931 #, python-format -msgid " %d unread private message" -msgid_plural " %d unread private messages" -msgstr[0] "Gajim - %d messaggio privato non letto" -msgstr[1] "Gajim - %d messaggi privati non letti" +msgid " from %s" +msgstr " da %s" -#: ../src/common/helpers.py:918 ../src/common/helpers.py:920 +#: ../src/common/helpers.py:938 ../src/common/helpers.py:945 +#, python-format +msgid "%d event pending" +msgid_plural "%d events pending" +msgstr[0] "%d evento in attesa" +msgstr[1] "%d eventi in attesa" + +#: ../src/common/helpers.py:978 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" #. we talk about a file -#: ../src/common/optparser.py:59 +#: ../src/common/optparser.py:60 #, python-format msgid "error: cannot open %s for reading" msgstr "errore: impossibile aprire %s per lettura" -#: ../src/common/optparser.py:179 -msgid "gtk+" -msgstr "gtk+" - -#: ../src/common/optparser.py:188 ../src/common/optparser.py:189 +#: ../src/common/optparser.py:203 ../src/common/optparser.py:204 msgid "cyan" msgstr "cyan" -#: ../src/common/optparser.py:306 +#: ../src/common/optparser.py:320 msgid "migrating logs database to indices" msgstr "Migrazione database delle cronologie agli indici" -#: ../src/common/passwords.py:92 +#: ../src/common/passwords.py:82 #, python-format msgid "Gajim account %s" msgstr "Account Gajim %s" -#: ../src/common/zeroconf/client_zeroconf.py:189 +#: ../src/common/zeroconf/client_zeroconf.py:135 +#: ../src/common/zeroconf/client_zeroconf.py:218 +msgid "Connection to host could not be established" +msgstr "La connessione non può essere stabilita." + +#: ../src/common/zeroconf/client_zeroconf.py:192 msgid "" "Connection to host could not be established: Incorrect answer from server." msgstr "" "La connessione all'host non può esser stabilita: risposta incorretta dal " "server." -#: ../src/common/zeroconf/client_zeroconf.py:205 -msgid "Connection to host could not be established" -msgstr "La connessione non può essere stabilita." - -#: ../src/common/zeroconf/client_zeroconf.py:334 +#: ../src/common/zeroconf/client_zeroconf.py:352 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" "La connessione all'host non può esser stabilita: Tempo scaduto durante " "l'invio di dati." -#: ../src/common/zeroconf/client_zeroconf.py:627 +#: ../src/common/zeroconf/client_zeroconf.py:638 msgid "Contact is offline. Your message could not be sent." msgstr "Il contatto è offline. Il tuo messaggio non può esser inviato." -#: ../src/common/zeroconf/connection_zeroconf.py:197 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 +#, python-format +msgid "" +"The host %s you configured as the ft_add_hosts_to_send advanced option is " +"not valid, so ignored." +msgstr "" +"L'host %s che hai configurato come il ft_add_hosts_to_send opzione non è " +"valida, perciò sarà ignorato." + +#: ../src/common/zeroconf/connection_zeroconf.py:204 msgid "To continue sending and receiving messages, you will need to reconnect." msgstr "" "Per continuare a mandare e ricevere messaggi, è necessario riconnettersi." -#: ../src/common/zeroconf/connection_zeroconf.py:207 +#: ../src/common/zeroconf/connection_zeroconf.py:227 msgid "Avahi error" msgstr "Errore avahi" -#: ../src/common/zeroconf/connection_zeroconf.py:207 +#: ../src/common/zeroconf/connection_zeroconf.py:227 #, python-format msgid "" "%s\n" @@ -6842,31 +7391,31 @@ msgstr "" "%s\n" "La messaggistica sulla rete locale potrebbe non funzionare correttamente." -#: ../src/common/zeroconf/connection_zeroconf.py:218 +#: ../src/common/zeroconf/connection_zeroconf.py:238 msgid "Please check if Avahi is installed." msgstr "Controllare se Avahi è installato." -#: ../src/common/zeroconf/connection_zeroconf.py:227 -#: ../src/common/zeroconf/connection_zeroconf.py:231 +#: ../src/common/zeroconf/connection_zeroconf.py:247 +#: ../src/common/zeroconf/connection_zeroconf.py:251 msgid "Could not start local service" msgstr "Impossibile avviare il servizio locale" -#: ../src/common/zeroconf/connection_zeroconf.py:228 +#: ../src/common/zeroconf/connection_zeroconf.py:248 #, python-format msgid "Unable to bind to port %d." msgstr "Impossibile collegarsi alla porta %d." -#: ../src/common/zeroconf/connection_zeroconf.py:232 -#: ../src/common/zeroconf/connection_zeroconf.py:325 +#: ../src/common/zeroconf/connection_zeroconf.py:252 +#: ../src/common/zeroconf/connection_zeroconf.py:347 msgid "Please check if avahi-daemon is running." msgstr "Controllare se avahi-daemon è in esecuzione." -#: ../src/common/zeroconf/connection_zeroconf.py:324 +#: ../src/common/zeroconf/connection_zeroconf.py:346 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Impossibile cambiare lo stato dell'account \"%s\"" -#: ../src/common/zeroconf/connection_zeroconf.py:341 +#: ../src/common/zeroconf/connection_zeroconf.py:363 msgid "" "You are not connected or not visible to others. Your message could not be " "sent." @@ -6875,14 +7424,509 @@ msgstr "" "essere inviato." #. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:353 +#: ../src/common/zeroconf/connection_zeroconf.py:375 msgid "[This message is encrypted]" msgstr "[Questo messaggio è cifrato]" -#: ../src/common/zeroconf/zeroconf.py:180 -#, python-format -msgid "Error while adding service. %s" -msgstr "Errore durante la creazione del servizio. %s" +#~ msgid "%s does not appear to be a valid JID" +#~ msgstr "%s non sembra essere un JID valido" + +#~ msgid "Blocked Contacts" +#~ msgstr "Contatti bloccati" + +#~ msgid "In_vite" +#~ msgstr "In_vita" + +#~ msgid "Invite Friends !" +#~ msgstr "Invita amici!" + +#~ msgid "MUC server" +#~ msgstr "Server MUC" + +#~ msgid "Please select a MUC server." +#~ msgstr "Selezionare un server MUC." + +#~ msgid "" +#~ "You are going to begin a Multi-User Chat.\n" +#~ "Select the contacts you want to invite" +#~ msgstr "" +#~ "Stai per iniziare una chat di gruppo.\n" +#~ "Scegli i contatti che vuoi invitare" + +#~ msgid "List of possible features in Gajim:" +#~ msgstr "Lista delle possibili funzioni extra di Gajim:" + +#, fuzzy +#~ msgid "Features" +#~ msgstr "Servizi del server" + +#~ msgid "Please wait while retrieving search form..." +#~ msgstr "Attendere durante il recupero dei campi di ricerca..." + +#~ msgid "_Add contact" +#~ msgstr "_Aggiungi contatto" + +#~ msgid "Select the account with which you want to synchronise" +#~ msgstr "Seleziona l'account con cui vuoi effettuare la sincronizzazione" + +#~ msgid "Select the contacts you want to synchronise" +#~ msgstr "Seleziona i contatti che vuoi sincronizzare" + +#~ msgid "Synchronise : select contacts" +#~ msgstr "Sincronizzazione: scegli i contatti" + +#~ msgid "PyOpenSSL" +#~ msgstr "PyOpenSSL" + +#~ msgid "" +#~ "A library used to validate server certificates to ensure a secure " +#~ "connection." +#~ msgstr "" +#~ "Una libreria usata per validare i certificati del server per assicurare " +#~ "una connessione sicura." + +#~ msgid "Requires python-pyopenssl." +#~ msgstr "Richiede python-pyopenssl." + +#~ msgid "Bonjour / Zeroconf" +#~ msgstr "Bonjour/Zeroconf" + +#~ msgid "Serverless chatting with autodetected clients in a local network." +#~ msgstr "" +#~ "Sistema di chat senza server con i client rilevati automaticamente nella " +#~ "rete locale." + +#~ msgid "Requires python-avahi." +#~ msgstr "Richiede python-avahi." + +#~ msgid "Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." +#~ msgstr "Richiede pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." + +#~ msgid "gajim-remote" +#~ msgstr "gajim-remote" + +#~ msgid "A script to controle gajim via commandline." +#~ msgstr "Uno script per controllare gajim dalla riga di comando." + +#~ msgid "Requires python-dbus." +#~ msgstr "Richiede python-dbus." + +#~ msgid "Feature not available under Windows." +#~ msgstr "Caratteristica non disponibile sotto Windows." + +#~ msgid "OpenGPG" +#~ msgstr "OpenGPG" + +#~ msgid "Encrypting chatmessages with gpg keys." +#~ msgstr "Cifratura dei messaggi di chat con le chiavi gpg." + +#~ msgid "Requires gpg and python-GnuPGInterface." +#~ msgstr "Richiede gpg e python-GnuPGInterface" + +#~ msgid "network-manager" +#~ msgstr "Gestore connessione" + +#~ msgid "Autodetection of network status." +#~ msgstr "Riconoscimento automatico dello stato della connessione." + +#~ msgid "Requires gnome-network-manager and python-dbus." +#~ msgstr "Richiede gnome-network-manager e python-dbus." + +#~ msgid "Session Management" +#~ msgstr "Gestore sessioni" + +#~ msgid "Gajim session is stored on logout and restored on login." +#~ msgstr "" +#~ "La sessione di Gajim viene salvata alla chiusura e ripristinata all'avvio." + +#~ msgid "Requires python-gnome2." +#~ msgstr "Richiede python-gnome2." + +#~ msgid "gnome-keyring" +#~ msgstr "Gestore portachiavi" + +#~ msgid "Passwords can be stored securely and not just in plaintext." +#~ msgstr "" +#~ "Le password possono essere salvate in modo sicuro e non in un semplice " +#~ "file di testo." + +#~ msgid "Requires gnome-keyring and python-gnome2-desktop." +#~ msgstr "Richiede gnome-keyring e python-gnome2-desktop." + +#~ msgid "SRV" +#~ msgstr "SRV" + +#~ msgid "Ability to connect to servers which is using SRV records." +#~ msgstr "Possibilità di connettersi ai server che usano record SRV." + +#~ msgid "Requires dnsutils." +#~ msgstr "Richiede dnsutils." + +#~ msgid "Requires nslookup to use SRV records." +#~ msgstr "Richiede nslookup per usare i record SRV." + +#~ msgid "Spell Checker" +#~ msgstr "Correttore ortografico" + +#~ msgid "Spellchecking of composed messages." +#~ msgstr "Correzione ortografica dei messaggi." + +#~ msgid "" +#~ "Requires python-gnome2-extras or compilation of gtkspell module from " +#~ "Gajim sources." +#~ msgstr "" +#~ "Richiede python-gnome2-extras o la compilazione del modulo gtkspell dai " +#~ "sorgenti di Gajim." + +#~ msgid "Notification-daemon" +#~ msgstr "Demone delle notifiche" + +#~ msgid "Passive popups notifying for new events." +#~ msgstr "Popup passivi che notificano nuovi eventi." + +#~ msgid "" +#~ "Requires python-notify or instead python-dbus in conjunction with " +#~ "notification-daemon." +#~ msgstr "Richiede python-notify, oppure python-dbus e notification-daemon." + +#~ msgid "Trayicon" +#~ msgstr "Icona nell'area di notifica" + +#~ msgid "A icon in systemtray reflecting the current presence." +#~ msgstr "Un'icona nell'area di notifica che riflette lo stato attuale." + +#~ msgid "" +#~ "Requires python-gnome2-extras or compiled trayicon module from Gajim " +#~ "sources." +#~ msgstr "" +#~ "Richiede python-gnome2-extras oppure la compilazione del modulo trayicon " +#~ "dai sorgenti di Gajim." + +#~ msgid "Requires PyGTK >= 2.10." +#~ msgstr "Richiede PyGTK >= 2.10." + +#~ msgid "Idle" +#~ msgstr "Inattivatore" + +#~ msgid "Ability to measure idle time, in order to set auto status." +#~ msgstr "" +#~ "Possibilità di misurare il tempo di inattività, per poter cambiare lo " +#~ "stato automaticamente." + +#~ msgid "Requires compilation of the idle module from Gajim sources." +#~ msgstr "Richiede la compilazione del modulo idle dai sorgenti di Gajim." + +#~ msgid "LaTeX" +#~ msgstr "LaTeX" + +#~ msgid "Transform LaTeX espressions between $$ $$." +#~ msgstr "Trasforma le espressioni LaTeX comprese in $$ $$." + +#~ msgid "" +#~ "Requires texlive-latex-base, dvips and imagemagick. You have to set " +#~ "'use_latex' to True in the Advanced Configuration Editor." +#~ msgstr "" +#~ "Richiede texlive-latex-base, dvips e imagemagick. Devi impostare " +#~ "'use_latex' su Attivato nell'Editor di configurazione avanzata." + +#~ msgid "End to end encryption" +#~ msgstr "Attiva cifratura end-to-end" + +#~ msgid "Encrypting chatmessages." +#~ msgstr "Cifratura dei messaggi di chat." + +#~ msgid "Requires python-crypto." +#~ msgstr "Richiede python-crypto." + +#, fuzzy +#~ msgid "RST Generator" +#~ msgstr "Generatore RST" + +#~ msgid "" +#~ "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" +#~ "docs/ref/rst/restructuredtext.html)." +#~ msgstr "" +#~ "Genera output XHTML a partire da codice RST (vedi http://docutils." +#~ "sourceforge.net/docs/ref/rst/restructuredtext.html)." + +#~ msgid "Requires python-docutils." +#~ msgstr "Richiede python-docutils." + +#~ msgid "Feature" +#~ msgstr "Funzione" + +#~ msgid "- messages will be logged" +#~ msgstr "- i messaggi saranno registrati" + +#~ msgid "- messages will not be logged" +#~ msgstr "- i messaggi non saranno registrati" + +#~ msgid "Verify the remote client's identity" +#~ msgstr "Verifica l'identità del client remoto" + +#~ msgid "" +#~ "You've begun an encrypted session with %s, but it can't be guaranteed " +#~ "that you're talking directly to the person you think you are.\n" +#~ "\n" +#~ "You should speak with them directly (in person or on the phone) and " +#~ "confirm that their Short Authentication String is identical to this one: %" +#~ "s" +#~ msgstr "" +#~ "Hai iniziato una sessione cifrata con %s, ma non è possibile garantire " +#~ "che stai parlando direttamente con la persona che pensi sia in realtà.\n" +#~ "\n" +#~ "Dovresti parlarci direttamente (di persona o al telefono) e confermare " +#~ "che la sua stringa di autenticazione sia identica a questa: %s" + +#~ msgid "Waiting for results" +#~ msgstr "Ricerca in corso" + +#~ msgid "Error in received dataform" +#~ msgstr "Errore nella ricezione dei dati" + +#~ msgid "No result" +#~ msgstr "Nessun risultato" + +#~ msgid "Error while adding service. %s" +#~ msgstr "Errore durante la creazione del servizio. %s" + +#~ msgid "_Add Contact" +#~ msgstr "_Aggiungi contatto" + +#~ msgid "Interface Customization" +#~ msgstr "Personalizzazione dell'interfaccia" + +#~ msgid "Also known as iChat style" +#~ msgstr "Conosciuto anche come stile iChat" + +#~ msgid "Chat" +#~ msgstr "Chat" + +#~ msgid "E_very 5 minutes" +#~ msgstr "_Ogni 5 minuti" + +#~ msgid "" +#~ "Gajim will automatically show new events by popping up the relevant window" +#~ msgstr "" +#~ "Gajim mostrerà automaticamente i nuovi eventi sollevando la finestra " +#~ "relativa" + +#~ msgid "" +#~ "Gajim will notify you for new events via a popup in the bottom right of " +#~ "the screen" +#~ msgstr "" +#~ "Gajim notificherà i nuovi eventi tramite popup nell'angolo in fondo a " +#~ "destra dello schermo" + +#~ msgid "" +#~ "Gajim will notify you via a popup window in the bottom right of the " +#~ "screen about contacts that just signed in" +#~ msgstr "" +#~ "Gajim notificherà tramite popup nell'angolo in fondo a destra dello " +#~ "schermo quando un contatto si connette" + +#~ msgid "" +#~ "Gajim will only change the icon of the contact that triggered the new " +#~ "event" +#~ msgstr "" +#~ "Gajim cambierà solamente l'icona del contatto fonte del nuovo evento" + +#~ msgid "" +#~ "If checked, Gajim will remember the roster and chat window positions in " +#~ "the screen and the sizes of them next time you run it" +#~ msgstr "" +#~ "Se marcato, Gajim manterrà le posizioni delle finestre di chat e della " +#~ "lista contatti sullo schermo la prossima volta che verrà eseguito" + +#~ msgid "On every _message" +#~ msgstr "In tutti i _messaggi" + +#~ msgid "Outgoing Chat state noti_fications:" +#~ msgstr "Noti_fiche dello stato di chat in uscita" + +#~ msgid "Print time:" +#~ msgstr "Scrivi ora:" + +#~ msgid "Save _position and size for roster and chat windows" +#~ msgstr "" +#~ "Salva _posizione e dimensione delle finestre di chat e lista contatti" + +#~ msgid "Show only in _roster" +#~ msgstr "Mostra solo nella lista _contatti" + +#~ msgid "Use t_rayicon (aka. notification area icon)" +#~ msgstr "Usa _icona nell'area di notifica (vassoio di sistema)" + +#~ msgid "" +#~ "When a new event (message, file transfer request etc..) is received, the " +#~ "following methods may be used to inform you about it. Please note that " +#~ "events about new messages only occur if it is a new message from a " +#~ "contact you are not already chatting with" +#~ msgstr "" +#~ "Quando un nuovo evento (messaggio, richiesta di trasferimento file, " +#~ "ecc...) viene ricevuto, i seguenti metodi possono venire usati per " +#~ "informarti di ciò. Notare che gli eventi per i nuovi messaggi avverranno " +#~ "solo se si tratta di un nuovo messaggio da un contatto con cui non si sta " +#~ "già chattando" + +#~ msgid "_Never" +#~ msgstr "_Mai" + +#~ msgid "_Notify me about it" +#~ msgstr "_Notifica" + +#~ msgid "_Pop it up" +#~ msgstr "_Mostra" + +#~ msgid "Add _Contact" +#~ msgstr "Aggiungi _contatto" + +#~ msgid "_Send Single Message" +#~ msgstr "_Invia messaggio singolo" + +#~ msgid "_Filter:" +#~ msgstr "_Filtro:" + +#~ msgid "Every %s _minutes" +#~ msgstr "Ogni %s _minuti" + +#~ msgid "_Discover Services..." +#~ msgstr "_Ricerca servizi..." + +#~ msgid "_Retype Password:" +#~ msgstr "_Ripetere password:" + +#~ msgid "_Use proxy" +#~ msgstr "_Usa proxy" + +#~ msgid "Accounts" +#~ msgstr "Account" + +#~ msgid "" +#~ "If checked, all local contacts that use a Bonjour compatible chat client " +#~ "(like iChat, Trillian or Gaim) will be shown in roster. You don't need to " +#~ "be connected to a jabber server for it to work.\n" +#~ "This is only available if python-avahi is installed and avahi-daemon is " +#~ "running." +#~ msgstr "" +#~ "Se selezionato, tutti i contatti locali che usano un client chat " +#~ "compatibile con Bonjour (es. IChat, Trillian or Gaim) saranno visibili " +#~ "nella lista contatti. Non è necessario essere connesso a un server jabber " +#~ "affinché funzioni.\n" +#~ "Questo è possibile solo se python-avahi è installato e avahi-daemon è in " +#~ "esecuzione." + +#~ msgid "" +#~ "If you have 2 or more accounts and this is checked, Gajim will list all " +#~ "contacts as if you had one account" +#~ msgstr "" +#~ "Se marcato e se sono presenti 2 o più account, Gajim mostrerà tutti i " +#~ "contatti come se ci fosse un unico account" + +#~ msgid "_Enable link-local messaging" +#~ msgstr "_Abilita la messaggistica sulla rete locale" + +#~ msgid "_Modify" +#~ msgstr "_Modifica" + +#~ msgid "2003-12-13T18:30:02Z" +#~ msgstr "2003-12-13T18:30:02Z" + +#~ msgid "Romeo and Juliet" +#~ msgstr "Romeo e Giulietta" + +#~ msgid "Old stories" +#~ msgstr "Vecchie storie" + +#~ msgid "Soliloquy" +#~ msgstr "Soliloquio" + +#~ msgid "_Compact View Alt+C" +#~ msgstr "_Vista compatta Alt+C" + +#~ msgid "_Remove from Roster" +#~ msgstr "_Elimina dai contatti" + +#~ msgid "" +#~ "If that is not your language for which you want to highlight misspelled " +#~ "words, then please set your $LANG as appropriate. Eg. for French do " +#~ "export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to " +#~ "make it global in /etc/profile.\n" +#~ "\n" +#~ "Highlighting misspelled words feature will not be used" +#~ msgstr "" +#~ "Se questa non è la lingua per cui si vogliono evidenziare le parole " +#~ "scorrette, impostare $LANG in maniera appropriata. Per esempio, per " +#~ "l'italiano eseguire \"export LANG=it_IT\" o \"export LANG=it_IT.UTF-8\" " +#~ "in ~/.bash_profile o, per rendere la modifica globale, in /etc/profile.\n" +#~ "\n" +#~ "Non verrà usata la caratteristica di evidenziatura parole scorrette" + +#~ msgid "You must enter a password for the new account." +#~ msgstr "È necessario inserire una password per il nuovo account." + +#~ msgid "Private Chat" +#~ msgstr "Chat privata" + +#~ msgid "Group Chat" +#~ msgstr "Chat di gruppo" + +#~ msgid "Drop %s in group %s" +#~ msgstr "Sposta %s nel gruppo %s" + +#~ msgid "Make %s and %s metacontacts" +#~ msgstr "Rendi %s e %s metacontatti" + +#~ msgid "Hides the buttons in two persons chat window." +#~ msgstr "Nasconde i pulsanti nella finestra di chat a due persone" + +#~ msgid "Security error connecting to \"%s\"" +#~ msgstr "Errore di sicurezza nella connessione a \"%s\"" + +#~ msgid "" +#~ "The server's key has changed, or someone is trying to hack your " +#~ "connection." +#~ msgstr "" +#~ "La chiave del server è cambiata, o qualcuno sta cercando di intromettersi " +#~ "nella connessione." + +#~ msgid "Unable to check fingerprint for %s. Connection could be insecure." +#~ msgstr "" +#~ "Non è possibile verificare l'impronta digitale di %s. La connessione " +#~ "potrebbe non essere sicura." + +#~ msgid "Missing fingerprint in SSL connection to %s" +#~ msgstr "Impronta digitale mancante nella connessione SSL a %s" + +#~ msgid "Fingerprint mismatch for %s: Got %s, expected %s" +#~ msgstr "Impronta digitale non corrispondente per %s: ottenuto %s, atteso %s" + +#~ msgid "invisible" +#~ msgstr "invisibile" + +#~ msgid "offline" +#~ msgstr "offline" + +#~ msgid "I'm %s" +#~ msgstr "Sono %s" + +#~ msgid " %d unread single message" +#~ msgid_plural " %d unread single messages" +#~ msgstr[0] "Gajim - %d messaggio singolo non letto" +#~ msgstr[1] "Gajim - %d messaggi singoli non letti" + +#~ msgid " %d unread group chat message" +#~ msgid_plural " %d unread group chat messages" +#~ msgstr[0] "Gajim - %d messaggio in chat di gruppo non letto" +#~ msgstr[1] "Gajim - %d messaggi in chat di gruppo non letti" + +#~ msgid " %d unread private message" +#~ msgid_plural " %d unread private messages" +#~ msgstr[0] "Gajim - %d messaggio privato non letto" +#~ msgstr[1] "Gajim - %d messaggi privati non letti" + +#~ msgid "gtk+" +#~ msgstr "gtk+" #~ msgid "A_fter nickname:" #~ msgstr "_Dopo il nickname:" @@ -6917,9 +7961,6 @@ msgstr "Errore durante la creazione del servizio. %s" #~ msgid "Role: " #~ msgstr "Ruolo: " -#~ msgid "Affiliation: " -#~ msgstr "Affiliazione: " - #~ msgid "" #~ "Sound to play when any MUC message arrives. (This setting is taken into " #~ "account only if notify_on_all_muc_messages is True)" @@ -6976,10 +8017,6 @@ msgstr "Errore durante la creazione del servizio. %s" #~ msgid "_Join New Room..." #~ msgstr "_Entra in nuova stanza..." -#~ msgid "Usage: /%s, sets the groupchat window to compact mode." -#~ msgstr "" -#~ "Uso: /%s, imposta la modalità compatta nella finestra chat di gruppo" - #~ msgid "Delete Message of the Day" #~ msgstr "Elimina messaggio del giorno" @@ -6995,9 +8032,6 @@ msgstr "Errore durante la creazione del servizio. %s" #~ msgid "_XML Console..." #~ msgstr "Console _XML..." -#~ msgid "Choose Avatar" -#~ msgstr "Scegli avatar" - #~ msgid "Use compact view when you open a chat window" #~ msgstr "Usa vista compatta quando si apre una finestra di chat" @@ -7061,18 +8095,12 @@ msgstr "Errore durante la creazione del servizio. %s" #~ "Leggere il file AUTHORS per la lista completa, comprendente anche gli " #~ "sviluppatori non più attivi" -#~ msgid "From %s" -#~ msgstr "Da %s" - #~ msgid "To %s" #~ msgstr "A %s" #~ msgid "You have been invited to the %(room_jid)s room by %(contact_jid)s" #~ msgstr "Sei stato invitato nella stanza %(room_jid)s da %(contact_jid)s" -#~ msgid "Browsing %s" -#~ msgstr "Consultazione %s" - #~ msgid "" #~ "Animated\n" #~ "Static" @@ -7145,9 +8173,6 @@ msgstr "Errore durante la creazione del servizio. %s" #~ "installato pysqlite3, per migrare i log al nuovo database, leggere: " #~ "http://trac.gajim.org/wiki/MigrateLogToDot9DB Uscita..." -#~ msgid "Image is too big" -#~ msgstr "L'immagine è troppo grande" - #~ msgid "" #~ "Image for emoticon has to be less than or equal to 24 pixels in width and " #~ "24 in height." @@ -7269,15 +8294,9 @@ msgstr "Errore durante la creazione del servizio. %s" #~ msgid "Allow controlling Gajim via D-Bus service." #~ msgstr "Permettere il controllo di Gajim attraverso il servizio D-Bus." -#~ msgid "Error:" -#~ msgstr "Errore:" - #~ msgid "Service" #~ msgstr "Servizio" -#~ msgid "Node" -#~ msgstr "Nodo" - #~ msgid "" #~ "Your new account has been created and added to your gajim configuration.\n" #~ "You can set advanced account options using \"Edit->Accounts\" in the main " @@ -7358,9 +8377,6 @@ msgstr "Errore durante la creazione del servizio. %s" #~ "possibile cambiare modalità premendo Alt-C. NOTA: L'ultimo stato in cui " #~ "viene lasciata una finestra/scheda non è permanente" -#~ msgid "Join _Group Chat..." -#~ msgstr "Entra in chat di _gruppo..." - #~ msgid "Show roster window on Gajim startup" #~ msgstr "Mostra la finestra dei contatti all'avvio di Gajim" diff --git a/po/lt.po b/po/lt.po new file mode 100644 index 000000000..860a96392 --- /dev/null +++ b/po/lt.po @@ -0,0 +1,7655 @@ +# Lithuanian translations for Gajim - A Jabber Instant Messager package. +# Copyright (C) 2006 THE Gajim - A Jabber Instant Messager'S COPYRIGHT HOLDER +# This file is distributed under the same license as the Gajim - A Jabber Instant Messager package. +# Mantas Zimnickas , 2007. +# +#: ../src/gajim-remote.py:212 ../src/gajim-remote.py:219 +#: ../src/gajim-remote.py:245 ../src/gajim-remote.py:246 +#: ../src/gajim-remote.py:252 ../src/gajim-remote.py:253 +#: ../src/gajim-remote.py:254 ../src/gajim-remote.py:255 +msgid "" +msgstr "" +"Project-Id-Version: Gajim - A Jabber Instant Messager 0.11.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-12 09:53+0200\n" +"PO-Revision-Date: 2007-01-21 15:27+1100\n" +"Last-Translator: Mantas Zimnickas \n" +"Language-Team: Lithuanian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../data/gajim.desktop.in.in.h:1 +msgid "A GTK+ Jabber client" +msgstr "GTK+ Jabber klientas" + +#: ../data/gajim.desktop.in.in.h:2 +msgid "Gajim Instant Messenger" +msgstr "Gajim Greitųjų žinučių programa" + +#: ../data/gajim.desktop.in.in.h:3 +msgid "Jabber IM Client" +msgstr "Jabber IM Klientas" + +#: ../data/glade/account_context_menu.glade.h:1 +#: ../data/glade/roster_window.glade.h:8 +#, fuzzy +msgid "Join _Group Chat..." +msgstr "Prisijungti prie pokalbio grupėje" + +#: ../data/glade/account_context_menu.glade.h:2 +msgid "_Add Contact..." +msgstr "_Įtraukti asmenį..." + +#: ../data/glade/account_context_menu.glade.h:3 +#: ../data/glade/roster_window.glade.h:15 +msgid "_Discover Services" +msgstr "_Ieškoti Paslaugų" + +#: ../data/glade/account_context_menu.glade.h:4 +msgid "_Execute Command..." +msgstr "_Vykdyti komandą..." + +#: ../data/glade/account_context_menu.glade.h:5 +#, fuzzy +msgid "_Modify Account" +msgstr "Keisti Prieigą" + +#: ../data/glade/account_context_menu.glade.h:6 +msgid "_Open Gmail Inbox" +msgstr "_Atidaryti Gmail paštą" + +#: ../data/glade/account_context_menu.glade.h:7 +#: ../data/glade/roster_window.glade.h:22 +#, fuzzy +msgid "_Start Chat..." +msgstr "_Pradėti pokalbį" + +#: ../data/glade/account_context_menu.glade.h:8 +#: ../data/glade/zeroconf_context_menu.glade.h:2 +msgid "_Status" +msgstr "_Būklė" + +#: ../data/glade/account_creation_wizard_window.glade.h:1 +#, fuzzy +msgid "" +"Connecting to server\n" +"\n" +"Please wait..." +msgstr "" +"Prieiga kuriama\n" +"\n" +"Prašome palaukti..." + +#: ../data/glade/account_creation_wizard_window.glade.h:4 +msgid "Please choose one of the options below:" +msgstr "Prašome pasirinkti vieną iš variantų žemiau:" + +#: ../data/glade/account_creation_wizard_window.glade.h:5 +msgid "Please fill in the data for your new account" +msgstr "Prašome užpildyti naujos Jūsų prieigos duomenis" + +#: ../data/glade/account_creation_wizard_window.glade.h:6 +msgid "Please select a server" +msgstr "" + +#: ../data/glade/account_creation_wizard_window.glade.h:7 +msgid "Click to see features (like MSN, ICQ transports) of jabber servers" +msgstr "Jabber serverių paslaugų sąrašas (tokių, kaip: MSN, ICQ pernašos)" + +#: ../data/glade/account_creation_wizard_window.glade.h:8 +msgid "Connect when I press Finish" +msgstr "Prisijungti, kai paspausiu Baigti" + +#: ../data/glade/account_creation_wizard_window.glade.h:9 +msgid "Gajim: Account Creation Wizard" +msgstr "Gajim: Prieigos kūrimo vedlys" + +#: ../data/glade/account_creation_wizard_window.glade.h:10 +#, fuzzy +msgid "I already have an account I want to _use" +msgstr "Jau turiu prieigą, kurią noriu naudoti" + +#: ../data/glade/account_creation_wizard_window.glade.h:11 +msgid "I want to _register for a new account" +msgstr "Noriu už_registruoti naują prieigą" + +#: ../data/glade/account_creation_wizard_window.glade.h:12 +#: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/accounts_window.glade.h:22 +msgid "If checked, Gajim will remember the password for this account" +msgstr "Jei pažymėta, Gajim prisimins šios prieigos slaptažodį" + +#: ../data/glade/account_creation_wizard_window.glade.h:13 +#: ../data/glade/account_modification_window.glade.h:26 +#: ../data/glade/accounts_window.glade.h:32 +msgid "Manage..." +msgstr "Valdyti..." + +#: ../data/glade/account_creation_wizard_window.glade.h:14 +#, fuzzy +msgid "Prox_y:" +msgstr "Proksis:" + +#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/accounts_window.glade.h:48 +msgid "Save pass_word" +msgstr "Išsaugoti _slaptažodį" + +#: ../data/glade/account_creation_wizard_window.glade.h:16 +msgid "Servers Features" +msgstr "Serverio teikiamos paslaugos" + +#: ../data/glade/account_creation_wizard_window.glade.h:17 +msgid "Set my profile when I connect" +msgstr "Nustatyti mano profilį, kai prisijungsiu" + +#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/accounts_window.glade.h:53 +msgid "Use custom hostname/port" +msgstr "Naudoti parinktą serverio adresą/prievadą" + +#: ../data/glade/account_creation_wizard_window.glade.h:19 +msgid "" +"You need to have an account in order to connect\n" +"to the Jabber network." +msgstr "" +"Kad prisijungtumėte privalote turėti prieigą\n" +"Jabber tinkle." + +#: ../data/glade/account_creation_wizard_window.glade.h:21 +msgid "Your JID:" +msgstr "Jūsų JID:" + +#: ../data/glade/account_creation_wizard_window.glade.h:22 +#: ../data/glade/roster_window.glade.h:13 +msgid "_Advanced" +msgstr "_Papildomas" + +#: ../data/glade/account_creation_wizard_window.glade.h:23 +msgid "_Finish" +msgstr "_Baigti" + +#: ../data/glade/account_creation_wizard_window.glade.h:24 +#, fuzzy +msgid "_Hostname:" +msgstr "Serverio adresas: " + +#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_modification_window.glade.h:50 +#: ../data/glade/accounts_window.glade.h:58 +msgid "_Password:" +msgstr "_Slaptažodis:" + +#: ../data/glade/account_creation_wizard_window.glade.h:26 +#: ../data/glade/manage_proxies_window.glade.h:11 +msgid "_Port:" +msgstr "_Portas:" + +#: ../data/glade/account_creation_wizard_window.glade.h:27 +msgid "_Server:" +msgstr "_Serveris:" + +#: ../data/glade/account_creation_wizard_window.glade.h:28 +#: ../data/glade/manage_proxies_window.glade.h:12 +msgid "_Username:" +msgstr "_Naudotojo vardas:" + +#: ../data/glade/account_modification_window.glade.h:1 +#: ../data/glade/accounts_window.glade.h:1 +#: ../data/glade/preferences_window.glade.h:8 +msgid "Miscellaneous" +msgstr "Įvairūs" + +#: ../data/glade/account_modification_window.glade.h:2 +#: ../data/glade/accounts_window.glade.h:2 +#: ../data/glade/zeroconf_properties_window.glade.h:1 +msgid "OpenPGP" +msgstr "OpenPGP" + +#: ../data/glade/account_modification_window.glade.h:3 +#: ../data/glade/accounts_window.glade.h:3 +#: ../data/glade/zeroconf_properties_window.glade.h:2 +msgid "Personal Information" +msgstr "Asmeninė informacija" + +#: ../data/glade/account_modification_window.glade.h:4 +#: ../data/glade/accounts_window.glade.h:4 +msgid "Account" +msgstr "Prieiga" + +#: ../data/glade/account_modification_window.glade.h:5 +msgid "Account Modification" +msgstr "Prieigos keitimas" + +#: ../data/glade/account_modification_window.glade.h:6 +#: ../data/glade/accounts_window.glade.h:5 +#, fuzzy +msgid "Administration operations" +msgstr "Administrator List" + +#: ../data/glade/account_modification_window.glade.h:7 +#: ../data/glade/accounts_window.glade.h:6 +msgid "Auto-reconnect when connection is lost" +msgstr "Automatiškai bandyti prisijungti, kai prarandamas ryšys" + +#: ../data/glade/account_modification_window.glade.h:8 +#: ../data/glade/accounts_window.glade.h:7 +#: ../data/glade/zeroconf_properties_window.glade.h:3 +msgid "C_onnect on Gajim startup" +msgstr "_Prisijungti, kai Gajim pasileis" + +#: ../data/glade/account_modification_window.glade.h:9 +#: ../data/glade/accounts_window.glade.h:8 +msgid "Chan_ge Password" +msgstr "_Keisti slaptažodį" + +#: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/accounts_window.glade.h:9 +msgid "" +"Check this so Gajim will connect in port 5223 where legacy servers are " +"expected to have SSL capabilities. Note that Gajim uses TLS encryption by " +"default if broadcasted by the server, and with this option enabled TLS will " +"be disabled" +msgstr "" +"Jei pažymėsite, Gajim jungsis prie 5223 porto, kur tikimasi, kad serveriai " +"turi SSL galimybes. Gajim, pagal nutylėjimą naudoja TLS šifravimą jei " +"serveris užklausia ir jei ši parinktis yra aktyvi, TLS bus deaktyvuotas" + +#: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/accounts_window.glade.h:10 +#: ../data/glade/zeroconf_properties_window.glade.h:4 +msgid "Choose _Key..." +msgstr "Pasirinkite _Raktą..." + +#: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/accounts_window.glade.h:11 +msgid "Click to change account's password" +msgstr "Spauskite, kad pakeisti prieigos slaptažodį" + +#: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/accounts_window.glade.h:12 +msgid "Click to request authorization to all contacts of another account" +msgstr "" + +#: ../data/glade/account_modification_window.glade.h:14 +#: ../data/glade/accounts_window.glade.h:13 +msgid "Connection" +msgstr "Prisijungimas" + +#: ../data/glade/account_modification_window.glade.h:15 +#: ../data/glade/accounts_window.glade.h:15 +msgid "Edit Personal Information..." +msgstr "Keisti asmeninę informaciją..." + +#. No configured account +#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/accounts_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:6 ../src/notify.py:471 +#: ../src/notify.py:493 ../src/notify.py:505 ../src/common/helpers.py:964 +#: ../src/common/helpers.py:976 +msgid "Gajim" +msgstr "Gajim" + +#. General group cannot be changed +#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/accounts_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:45 +#: ../data/glade/zeroconf_properties_window.glade.h:7 +#: ../src/roster_window.py:359 ../src/roster_window.py:624 +#: ../src/roster_window.py:1360 ../src/roster_window.py:1728 +#: ../src/roster_window.py:2112 ../src/roster_window.py:2628 +#: ../src/roster_window.py:2746 ../src/common/contacts.py:309 +msgid "General" +msgstr "Bendros parinktys" + +#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/accounts_window.glade.h:20 +msgid "Hostname: " +msgstr "Serverio adresas: " + +#: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/accounts_window.glade.h:21 +msgid "" +"If checked, Gajim will also broadcast some more IPs except from just your " +"IP, so file transfer has higher chances of working." +msgstr "" +"Jei pažymėta, Gajim siųs užklausimą į kelis IP išskyrus Jūsų IP, tokiu būdu " +"pagerės bylos siuntimas." + +#: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/accounts_window.glade.h:23 +msgid "" +"If checked, Gajim will send keep-alive packets to prevent connection timeout " +"which results in disconnection" +msgstr "" +"Jei pažymėta, Gajim siuntinės „aš-gyvas“ paketus, kad nebūtų prarastas " +"ryšys, dėl ko gali įvyksta savaiminiai atsijungimai" + +#: ../data/glade/account_modification_window.glade.h:22 +#: ../data/glade/accounts_window.glade.h:24 +#: ../data/glade/zeroconf_properties_window.glade.h:8 +msgid "" +"If checked, Gajim will store the password in ~/.gajim/config with 'read' " +"permission only for you" +msgstr "" +"Jei pažymėta, Gajim saugos slaptažodį faile ~/.gajim/config su 'tik-" +"skaitymui' teisėmis, tik Jums" + +#: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/accounts_window.glade.h:25 +#: ../data/glade/zeroconf_properties_window.glade.h:9 +msgid "" +"If checked, Gajim, when launched, will automatically connect to jabber using " +"this account" +msgstr "" +"Jei pažymėta, po pasileidimo Gajim automatiškai jungsis prie jabber " +"naudodamas šią prieigą" + +#: ../data/glade/account_modification_window.glade.h:24 +#: ../data/glade/accounts_window.glade.h:26 +#: ../data/glade/zeroconf_properties_window.glade.h:10 +msgid "" +"If checked, any change to the global status (handled by the combobox at the " +"bottom of the roster window) will change the status of this account " +"accordingly" +msgstr "" +"Jei pažymėta, bet koks globalus būklės pakeitimas (įvykdytas iš sąrašo, " +"pagrindinio lango apačioje) įtakos ir šios prieigos būklę accordingly" + +#: ../data/glade/account_modification_window.glade.h:25 +#: ../data/glade/accounts_window.glade.h:29 +msgid "Information about you, as stored in the server" +msgstr "Informacija apie jus, kur yra išsaugota serveryje" + +#: ../data/glade/account_modification_window.glade.h:27 +#: ../data/glade/accounts_window.glade.h:34 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1524 +#: ../src/config.py:2010 +msgid "No key selected" +msgstr "Raktas nepasirinktas" + +#. None means no proxy profile selected +#. GPG Key +#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/accounts_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:32 ../src/config.py:1110 +#: ../src/config.py:1181 ../src/config.py:1430 ../src/config.py:1435 +#: ../src/config.py:1906 ../src/config.py:1993 ../src/config.py:2009 +#: ../src/config.py:3109 ../src/config.py:3155 ../src/dialogs.py:286 +#: ../src/dialogs.py:288 ../src/roster_window.py:1832 +#: ../src/roster_window.py:1839 ../src/roster_window.py:1846 +msgid "None" +msgstr "Joks" + +#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/accounts_window.glade.h:37 +#: ../data/glade/profile_window.glade.h:26 +#: ../data/glade/zeroconf_properties_window.glade.h:17 +msgid "Personal Information" +msgstr "Asmeninė informacija" + +#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/accounts_window.glade.h:38 +msgid "Port: " +msgstr "Prievadas: " + +#: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/accounts_window.glade.h:39 +msgid "Priori_ty:" +msgstr "_Prioritetas:" + +#: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/accounts_window.glade.h:40 +msgid "" +"Priority is used in Jabber to determine who gets the events from the jabber " +"server when two or more clients are connected using the same account; The " +"client with the highest priority gets the events" +msgstr "" +"Prioritetas, Jabber'yje naudojamas, kad nustatyti, kas turi gauti pranešimus " +"iš jabber serverio, kai du ar daugiau klientų yra prisijungę prie tos pačios " +"prieigos; Klientas, turintis aukščiausią prioritetą gaus pranešimus" + +#: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/accounts_window.glade.h:41 +msgid "Priority will change automatically according to your status." +msgstr "Prioritetas keisis automatiškai, priklausomai nuo jūsų būklės." + +#: ../data/glade/account_modification_window.glade.h:35 +#: ../data/glade/accounts_window.glade.h:42 +msgid "Proxy:" +msgstr "Proksis:" + +#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/accounts_window.glade.h:44 +msgid "Resour_ce:" +msgstr "Šal_tinis:" + +#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/accounts_window.glade.h:45 +msgid "" +"Resource is sent to the Jabber server in order to separate the same JID in " +"two or more parts depending on the number of the clients connected in the " +"same server with the same account. So you might be connected in the same " +"account with resource 'Home' and 'Work' at the same time. The resource which " +"has the highest priority will get the events. (see below)" +msgstr "" +"Šaltinis siunčiamas į Jabber serverį, tam, kad būtų atskirti JID, kai yra " +"prisijungę du ar daugiau klientų tuo pačiu metu, tame pačiame serveryje ir " +"prie tos pačios prieigos. Jūs galite būti prisijungę prie tos pačios " +"prieigos su šaltiniu 'Namai' ir 'Darbas', tuo pačiu metu. Šaltinis, kuris " +"turi didžiausią prioritetą gaus visus pranešimus. (žiūrėkite žemiau)" + +#: ../data/glade/account_modification_window.glade.h:38 +#: ../data/glade/accounts_window.glade.h:46 +#: ../data/glade/zeroconf_properties_window.glade.h:18 +msgid "Save _passphrase (insecure)" +msgstr "Išsaugoti _slaptafrazę (nesaugu)" + +#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/accounts_window.glade.h:47 +#: ../data/glade/zeroconf_properties_window.glade.h:19 +msgid "Save conversation _logs for all contacts" +msgstr "Saugoti visų asmenų pokalbių žurnalus" + +#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/accounts_window.glade.h:49 +msgid "Send keep-alive packets" +msgstr "Siųsti „aš-gyvas“ paketus" + +#: ../data/glade/account_modification_window.glade.h:42 +#: ../data/glade/accounts_window.glade.h:50 +#: ../data/glade/zeroconf_properties_window.glade.h:20 +msgid "Synch_ronize account status with global status" +msgstr "Sinchronizuoti prieigos būklę su globalia būkle" + +#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/accounts_window.glade.h:51 +#, fuzzy +msgid "Synchronise contacts" +msgstr "Rodyti _Atsijungusius Asmenis" + +#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/accounts_window.glade.h:52 +msgid "Use _SSL (legacy)" +msgstr "Naudoti _SSL (legacy)" + +#: ../data/glade/account_modification_window.glade.h:46 +#: ../data/glade/accounts_window.glade.h:55 +msgid "Use file transfer proxies" +msgstr "Naudoti failų siuntimo proksius" + +#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/accounts_window.glade.h:56 +msgid "_Adjust to status" +msgstr "_Nustatyti būklei" + +#: ../data/glade/account_modification_window.glade.h:48 +#: ../data/glade/accounts_window.glade.h:57 +msgid "_Jabber ID:" +msgstr "_Jabber ID:" + +#: ../data/glade/account_modification_window.glade.h:49 +msgid "_Name:" +msgstr "_Pavadinimas:" + +#: ../data/glade/accounts_window.glade.h:14 +#: ../data/glade/profile_window.glade.h:11 +#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/zeroconf_information_window.glade.h:2 +#: ../data/glade/zeroconf_properties_window.glade.h:5 +msgid "E-Mail:" +msgstr "El. paštas:" + +#. XML Console enable checkbutton +#: ../data/glade/accounts_window.glade.h:16 +#: ../data/glade/xml_console_window.glade.h:4 +msgid "Enable" +msgstr "Įjungti" + +#: ../data/glade/accounts_window.glade.h:17 +#: ../data/glade/zeroconf_information_window.glade.h:3 +#: ../data/glade/zeroconf_properties_window.glade.h:6 +msgid "First Name:" +msgstr "Vardas:" + +#: ../data/glade/accounts_window.glade.h:27 +#: ../data/glade/zeroconf_properties_window.glade.h:11 +msgid "" +"If the default port that is used for incoming messages is unfitting for your " +"setup you can select another one here.\n" +"You might consider to change possible firewall settings." +msgstr "" +"Jei prievadas, pagal nutylėjimą, kuris naudojamas įeinančioms žinutėms " +"neatitinka jūsų nustatymų, čia galite pasirinkti kitą.\n" +"Turėtumėte pakeisti leistinus ugniasienės nustatymus." + +#: ../data/glade/accounts_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/zeroconf_information_window.glade.h:4 +#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:453 +msgid "Jabber ID:" +msgstr "Jabber ID:" + +#: ../data/glade/accounts_window.glade.h:31 +#: ../data/glade/zeroconf_information_window.glade.h:5 +#: ../data/glade/zeroconf_properties_window.glade.h:14 +msgid "Last Name:" +msgstr "Pavardė:" + +#: ../data/glade/accounts_window.glade.h:33 +msgid "Mer_ge accounts" +msgstr "Apjun_gti prieigas" + +#. Rename +#: ../data/glade/accounts_window.glade.h:43 ../src/roster_window.py:2698 +msgid "Re_name" +msgstr "Pe_rvadinti" + +#: ../data/glade/accounts_window.glade.h:54 +#: ../data/glade/zeroconf_properties_window.glade.h:21 +msgid "Use custom port:" +msgstr "Use custom port:" + +#: ../data/glade/accounts_window.glade.h:59 +msgid "gtk-add" +msgstr "" + +#: ../data/glade/accounts_window.glade.h:60 +msgid "gtk-close" +msgstr "" + +#: ../data/glade/accounts_window.glade.h:61 +msgid "gtk-remove" +msgstr "" + +#: ../data/glade/add_new_contact_window.glade.h:1 +msgid "A_ccount:" +msgstr "_Prieiga:" + +#: ../data/glade/add_new_contact_window.glade.h:2 +msgid "A_llow this contact to view my status" +msgstr "Leisti šiam asmeniui matyti mano būklę" + +#: ../data/glade/add_new_contact_window.glade.h:3 +msgid "Add New Contact" +msgstr "Prijungti naują asmenį" + +#: ../data/glade/add_new_contact_window.glade.h:4 +msgid "I would like to add you to my contact list." +msgstr "Norėšiau jus įtraukti į savo kontaktų sąrašą." + +#: ../data/glade/add_new_contact_window.glade.h:5 +msgid "" +"You have to register with this transport\n" +"to be able to add a contact from this\n" +"protocol. Click on register button to\n" +"proceed." +msgstr "" +"Turite užsiregistruoti naudojant šią pernašą,\n" +"tam, kad galėtumėtte prijungti asmenis iš šio\n" +"protokolo. Jei norite tęsti, spustelkite ant mygtuko\n" +"registruoti." + +#: ../data/glade/add_new_contact_window.glade.h:9 +msgid "" +"You must be connected to the transport to be able\n" +"to add a contact from this protocol." +msgstr "" +"Kad galėtumėte pridėti asmenį iš šio protokolo, turite\n" +"būti prisijungęs prie perlaidos." + +#: ../data/glade/add_new_contact_window.glade.h:11 +msgid "_Group:" +msgstr "_Grupė:" + +#: ../data/glade/add_new_contact_window.glade.h:12 +msgid "_Nickname:" +msgstr "_Slapyvardis:" + +#: ../data/glade/add_new_contact_window.glade.h:13 +msgid "_Protocol:" +msgstr "_Protokolas:" + +#: ../data/glade/add_new_contact_window.glade.h:14 +msgid "_Register" +msgstr "_Registracija" + +#: ../data/glade/add_new_contact_window.glade.h:15 +msgid "_User ID:" +msgstr "_Naudotojo ID:" + +#: ../data/glade/adhoc_commands_window.glade.h:1 +msgid "An error has occurred:" +msgstr "Įvyko klaida:" + +#: ../data/glade/adhoc_commands_window.glade.h:2 +msgid "Choose command to execute:" +msgstr "Pasirinktie komandą vykdymui:" + +#: ../data/glade/adhoc_commands_window.glade.h:3 +msgid "Ad-hoc Commands - Gajim" +msgstr "Ad-hoc Komandos - Gajim" + +#: ../data/glade/adhoc_commands_window.glade.h:4 +msgid "Check once more" +msgstr "Patikrinti dar kartą" + +#: ../data/glade/adhoc_commands_window.glade.h:5 +msgid "Error description..." +msgstr "Klaidos aprašymas..." + +#: ../data/glade/adhoc_commands_window.glade.h:6 +msgid "Please wait while retrieving command list..." +msgstr "Prašome luktelti, kol atsisiųs komandų sąrašas..." + +#: ../data/glade/adhoc_commands_window.glade.h:7 +msgid "Please wait while the command is sending..." +msgstr "Prašome luktelti, kol siunčiama komanda..." + +#: ../data/glade/adhoc_commands_window.glade.h:8 +msgid "Please wait..." +msgstr "Prašome palaukti..." + +#: ../data/glade/adhoc_commands_window.glade.h:9 +msgid "This jabber entity does not expose any commands." +msgstr "Ši jabber esybė nepateikė jokių komando." + +#: ../data/glade/advanced_configuration_window.glade.h:1 +msgid "Description" +msgstr "Aprašymas" + +#: ../data/glade/advanced_configuration_window.glade.h:2 +msgid "NOTE: You should restart Gajim for some settings to take effect" +msgstr "" +"PASTABA: Kad įsigaliotų tam tikri nustatymai turite perkrauti Gajim" + +#: ../data/glade/advanced_configuration_window.glade.h:3 +msgid "Advanced Configuration Editor" +msgstr "Išplėstinis konfigūracijos redaktorius" + +#: ../data/glade/advanced_configuration_window.glade.h:4 +msgid "Filter:" +msgstr "Filtras:" + +#: ../data/glade/advanced_menuitem_menu.glade.h:1 +msgid "Delete MOTD" +msgstr "Trinti MOTD" + +#: ../data/glade/advanced_menuitem_menu.glade.h:2 +msgid "Deletes Message of the Day" +msgstr "Ištrins dienos žinutę" + +#: ../data/glade/advanced_menuitem_menu.glade.h:3 +#, fuzzy +msgid "Edit _Privacy Lists..." +msgstr "_Privatūs sąrašai" + +#: ../data/glade/advanced_menuitem_menu.glade.h:4 +msgid "Sends a message to users currently connected to this server" +msgstr "Bus išsiųstos žinutės naudotojams, prisijungusiems prie šio serverio" + +#: ../data/glade/advanced_menuitem_menu.glade.h:5 +#, fuzzy +msgid "Set MOTD..." +msgstr "Nustatyti MOTD" + +#: ../data/glade/advanced_menuitem_menu.glade.h:6 +msgid "Sets Message of the Day" +msgstr "Nustatyti dienos žinutę" + +#: ../data/glade/advanced_menuitem_menu.glade.h:7 +msgid "Show _XML Console" +msgstr "Rodyti _XML konsolę" + +#: ../data/glade/advanced_menuitem_menu.glade.h:8 +#, fuzzy +msgid "Update MOTD..." +msgstr "Atnaujinti MOTD" + +#: ../data/glade/advanced_menuitem_menu.glade.h:9 +msgid "Updates Message of the Day" +msgstr "Atnaujinti dienos žinutę" + +#: ../data/glade/advanced_menuitem_menu.glade.h:10 +msgid "_Administrator" +msgstr "_Administratorius" + +#: ../data/glade/advanced_menuitem_menu.glade.h:11 +#, fuzzy +msgid "_Send Server Message..." +msgstr "_Siųsti žinutę serveriui" + +#: ../data/glade/advanced_notifications_window.glade.h:1 +msgid " a window/tab opened with that contact " +msgstr " atidarytas langas/žymė su šiuo asmeniu " + +#: ../data/glade/advanced_notifications_window.glade.h:2 +msgid "Actions" +msgstr "Veiksmai" + +#: ../data/glade/advanced_notifications_window.glade.h:3 +msgid "Conditions" +msgstr "Sąlygos" + +#: ../data/glade/advanced_notifications_window.glade.h:4 +#: ../data/glade/preferences_window.glade.h:12 +msgid "Sounds" +msgstr "Garsai" + +#: ../data/glade/advanced_notifications_window.glade.h:5 +msgid "Advanced Actions" +msgstr "Išplėstiniai veiksmai" + +#: ../data/glade/advanced_notifications_window.glade.h:6 +msgid "Advanced Notifications Control" +msgstr "Išplėstinis pranešimų valdymas" + +#: ../data/glade/advanced_notifications_window.glade.h:7 +msgid "All statuses" +msgstr "Visos būklės" + +#: ../data/glade/advanced_notifications_window.glade.h:8 +#: ../src/common/commands.py:91 ../src/common/helpers.py:246 +msgid "Away" +msgstr "Manęs nėra" + +#: ../data/glade/advanced_notifications_window.glade.h:9 +msgid "Busy " +msgstr "Užsiėmęs " + +#: ../data/glade/advanced_notifications_window.glade.h:10 +msgid "Don't have " +msgstr "Neturiu " + +#: ../data/glade/advanced_notifications_window.glade.h:11 +msgid "Have " +msgstr "Turiu " + +#: ../data/glade/advanced_notifications_window.glade.h:12 +#: ../src/common/helpers.py:256 +msgid "Invisible" +msgstr "Nematomas" + +#: ../data/glade/advanced_notifications_window.glade.h:13 +msgid "Launch a command" +msgstr "Paleisti komandą" + +#: ../data/glade/advanced_notifications_window.glade.h:14 +#: ../src/common/helpers.py:229 +msgid "Not Available" +msgstr "Esu išėjęs" + +#: ../data/glade/advanced_notifications_window.glade.h:15 +msgid "One or more special statuses..." +msgstr "Viena ar daugiau specialių būklių..." + +#: ../data/glade/advanced_notifications_window.glade.h:16 +msgid "Online / Free For Chat" +msgstr "Prisijungęs / Laisvas susirašinėti" + +#: ../data/glade/advanced_notifications_window.glade.h:17 +msgid "Play a sound" +msgstr "Groti garsą" + +#: ../data/glade/advanced_notifications_window.glade.h:18 +msgid "" +"Receive a Message\n" +"Contact Disconnected \n" +"Contact Change Status \n" +"Group Chat Message Highlight \n" +"Group Chat Message Received \n" +"File Transfer Request \n" +"File Transfer Started \n" +"File Transfer Finished" +msgstr "" +"Atsiųsti žinutę\n" +"Asmuo atsijungė \n" +"Asmuo pakeitė būklę \n" +"Paryškinta žinutė grupės pokalbyje \n" +"Gauta žinutė grupės pokalbyje \n" +"Failo atsisiuntimo užklausimas \n" +"Failo siuntimas pradėtas \n" +"Failo siuntimas baigtas" + +#: ../data/glade/advanced_notifications_window.glade.h:26 +msgid "When " +msgstr "Kai " + +#: ../data/glade/advanced_notifications_window.glade.h:27 +msgid "" +"_Activate window manager's UrgencyHint to make chat window in taskbar flash" +msgstr "" +"_Aktyvuoti langų tvarkyklės UrgencyHint, kad pokalbio langas mirksėtų " +"užduočių juostoje" + +#: ../data/glade/advanced_notifications_window.glade.h:28 +msgid "_Disable auto opening chat window" +msgstr "_Padaryti, kad pokalbių langas automatiškai neiššoktu" + +#: ../data/glade/advanced_notifications_window.glade.h:29 +msgid "_Disable existing popup window" +msgstr "_Uždrausti esančius iššokstančius (pop-up) langus" + +#: ../data/glade/advanced_notifications_window.glade.h:30 +msgid "_Disable existing sound for this event" +msgstr "_Uždrausti esmą garsą šiam įvykiui" + +#: ../data/glade/advanced_notifications_window.glade.h:31 +msgid "_Disable showing event in roster" +msgstr "_Uždrausti įvykių rodyma kantaktų sąraše" + +#: ../data/glade/advanced_notifications_window.glade.h:32 +msgid "_Disable showing event in systray" +msgstr "_Uždrausti įvykių rodyma sistemos dėkle" + +#: ../data/glade/advanced_notifications_window.glade.h:33 +msgid "_Inform me with a popup window" +msgstr "_Informuok mane su iššokstančiu langu" + +#: ../data/glade/advanced_notifications_window.glade.h:34 +msgid "_Open chat window with user" +msgstr "_Atidaryti pokalbio langą su šiuo naudotoju" + +#: ../data/glade/advanced_notifications_window.glade.h:35 +msgid "_Show event in roster" +msgstr "_Rodyti įvykį kontaktų sąraše" + +#: ../data/glade/advanced_notifications_window.glade.h:36 +msgid "_Show event in systray" +msgstr "_Rodyti įvykį sistemos dėkle" + +#: ../data/glade/advanced_notifications_window.glade.h:37 +msgid "and I " +msgstr "ir aš " + +#: ../data/glade/advanced_notifications_window.glade.h:38 +msgid "" +"contact(s)\n" +"group(s)\n" +"everybody" +msgstr "" +"asmuo(nys)\n" +"grupė(s)\n" +"visi" + +#: ../data/glade/advanced_notifications_window.glade.h:41 +msgid "for " +msgstr "dėl " + +#: ../data/glade/advanced_notifications_window.glade.h:42 +msgid "when I'm in" +msgstr "kai būsiu" + +#: ../data/glade/atom_entry_window.glade.h:1 +msgid "Entry:" +msgstr "Įrašas:" + +#: ../data/glade/atom_entry_window.glade.h:2 +msgid "Feed name:" +msgstr "Kanalo pavadinimas:" + +#: ../data/glade/atom_entry_window.glade.h:3 +msgid "Last modified:" +msgstr "Paskutinį kartą keista:" + +#: ../data/glade/atom_entry_window.glade.h:4 +msgid "New entry received" +msgstr "Gautas naujas įrašas" + +#: ../data/glade/atom_entry_window.glade.h:5 +msgid "You have received new entry:" +msgstr "Jūs gavote naują įrašą:" + +#: ../data/glade/change_password_dialog.glade.h:1 +msgid "Change Password" +msgstr "Keisti slaptažodį" + +#: ../data/glade/change_password_dialog.glade.h:2 +msgid "Enter it again for confirmation:" +msgstr "Įveskite jį dar kartą, dėl patvirtinimo:" + +#: ../data/glade/change_password_dialog.glade.h:3 +msgid "Enter new password:" +msgstr "Įveskite naują slaptažodį:" + +#: ../data/glade/change_status_message_dialog.glade.h:1 +msgid "Type your new status message" +msgstr "Įveskite naują būklės žinutę" + +#: ../data/glade/change_status_message_dialog.glade.h:2 +msgid "Preset messages:" +msgstr "Nustatytos žinutės:" + +#: ../data/glade/change_status_message_dialog.glade.h:3 +msgid "Save as Preset..." +msgstr "Išsaugoti kaip nustatytą..." + +#: ../data/glade/chat_context_menu.glade.h:1 +msgid "Join _Group Chat" +msgstr "Prisijungti prie pokalbio grupėje" + +#: ../data/glade/chat_context_menu.glade.h:2 +#: ../data/glade/roster_contact_context_menu.glade.h:12 +#, fuzzy +msgid "_Add to Roster..." +msgstr "Įtr_aukti į kontaktų sąrašą" + +#: ../data/glade/chat_context_menu.glade.h:3 +msgid "_Copy JID/Email Address" +msgstr "_Kopijuoti JID/El. pašto adresą" + +#: ../data/glade/chat_context_menu.glade.h:4 +msgid "_Copy Link Location" +msgstr "_Kopijuoti nuorodos adresą" + +#: ../data/glade/chat_context_menu.glade.h:5 +msgid "_Open Email Composer" +msgstr "_Atidaryti el. pašto programą" + +#: ../data/glade/chat_context_menu.glade.h:6 +msgid "_Open Link in Browser" +msgstr "_Atverti nuorodą naršyklėje" + +#: ../data/glade/chat_context_menu.glade.h:7 +#: ../data/glade/subscription_request_popup_menu.glade.h:1 +#: ../data/glade/systray_context_menu.glade.h:7 +msgid "_Start Chat" +msgstr "_Pradėti pokalbį" + +#: ../data/glade/chat_control_popup_menu.glade.h:1 +msgid "Click to see past conversations with this contact" +msgstr "Spauskite, kad pamatytumėte buvusius pokalbius su šiuo asmeniu" + +#: ../data/glade/chat_control_popup_menu.glade.h:2 +msgid "Invite _Friends" +msgstr "" + +#: ../data/glade/chat_control_popup_menu.glade.h:3 +#: ../data/glade/gc_occupants_menu.glade.h:3 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:4 +msgid "Send _File" +msgstr "Siųsti _Failą" + +#: ../data/glade/chat_control_popup_menu.glade.h:4 +#, fuzzy +msgid "Toggle End to End Encryption" +msgstr "Įjungti Open_PGP kodavimą" + +#: ../data/glade/chat_control_popup_menu.glade.h:5 +msgid "Toggle Open_PGP Encryption" +msgstr "Įjungti Open_PGP kodavimą" + +#: ../data/glade/chat_control_popup_menu.glade.h:6 +#: ../data/glade/gc_occupants_menu.glade.h:4 +msgid "_Add to Roster" +msgstr "Įtr_aukti į kontaktų sąrašą" + +#: ../data/glade/chat_control_popup_menu.glade.h:7 +#: ../data/glade/gc_control_popup_menu.glade.h:7 +#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:6 +#: ../src/roster_window.py:2567 +msgid "_History" +msgstr "_Istorija" + +#: ../data/glade/data_form_window.glade.h:1 +msgid "Fill in the form." +msgstr "Užpildykite formą." + +#: ../data/glade/data_form_window.glade.h:2 +msgid "Room Configuration" +msgstr "Kambario nustatymai" + +#: ../data/glade/edit_groups_dialog.glade.h:1 +msgid "Edit Groups" +msgstr "Keisti grupę" + +#: ../data/glade/filetransfers.glade.h:1 +msgid "A list of active, completed and stopped file transfers" +msgstr "Sąrašas aktyvių, baigtų ar sustabdytų failų siuntimų" + +#: ../data/glade/filetransfers.glade.h:2 +msgid "Cancel file transfer" +msgstr "Atšaukti failo siuntimą" + +#: ../data/glade/filetransfers.glade.h:3 +msgid "Cancels the selected file transfer" +msgstr "Atšaukti pažymėtų failų siuntimą" + +#: ../data/glade/filetransfers.glade.h:4 +msgid "Cancels the selected file transfer and removes incomplete file" +msgstr "Atšaukti pažymėtų failų siuntimą ir ištrinti nepilnus failus" + +#: ../data/glade/filetransfers.glade.h:5 +msgid "Clean _up" +msgstr "_Išvalyti" + +#: ../data/glade/filetransfers.glade.h:6 +msgid "File Transfers" +msgstr "Failų siuntimai" + +#: ../data/glade/filetransfers.glade.h:7 +msgid "Hides the window" +msgstr "Slėpti langą" + +#: ../data/glade/filetransfers.glade.h:8 +msgid "Remove file transfer from the list." +msgstr "Pašalinti failo siuntimą iš sąrašo." + +#: ../data/glade/filetransfers.glade.h:9 +msgid "Removes completed, cancelled and failed file transfers from the list" +msgstr "Pašalinti užbaigtus, atšauktus ir lūžusius failų siuntimus iš sąrašo" + +#: ../data/glade/filetransfers.glade.h:10 +msgid "Shows a list of file transfers between you and others" +msgstr "Rodyti failų siuntimų sąrašą tarp jūsų ir kitų" + +#: ../data/glade/filetransfers.glade.h:11 +msgid "" +"This action removes single file transfer from the list. If the transfer is " +"active, it is first stopped and then removed" +msgstr "" +"Šis veiksmas pašalins vieną failo siuntimą iš sąrašo. Jei failo siuntimas " +"yra aktyvus, jis iš pradžių bus sustabdytas ir tada ištrintas" + +#: ../data/glade/filetransfers.glade.h:12 +msgid "When a file transfer is complete show a popup notification" +msgstr "Rodyti pranešimą iššokstančiame lange, kai failo siuntimas baigsis " + +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:774 +msgid "_Continue" +msgstr "_Tęsti" + +#: ../data/glade/filetransfers.glade.h:14 +msgid "_Notify me when a file transfer is complete" +msgstr "_Pranešti, kai failo siuntimas bus baigtas" + +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:186 +msgid "_Open Containing Folder" +msgstr "_Atidaryti katalogą, kuriame yra failas" + +#: ../data/glade/filetransfers.glade.h:16 +msgid "_Pause" +msgstr "_Pauzė" + +#: ../data/glade/filetransfers.glade.h:17 +msgid "file transfers list" +msgstr "failų siuntimų sąrašas" + +#: ../data/glade/gajim_themes_window.glade.h:1 +msgid "Chatstate Tab Colors" +msgstr "Pokalbių būklės žymių spalvos" + +#: ../data/glade/gajim_themes_window.glade.h:2 +msgid "" +"Account row\n" +"Group row\n" +"Contact row\n" +"Chat Banner" +msgstr "" +"Prieigos eilutė\n" +"Grupės eilutė\n" +"Asmens eilutė\n" +"Pokalbio paveiksliukas" + +#: ../data/glade/gajim_themes_window.glade.h:6 +msgid "Bold" +msgstr "Paryškintas" + +#: ../data/glade/gajim_themes_window.glade.h:7 +msgid "Composing" +msgstr "Kuriama" + +#: ../data/glade/gajim_themes_window.glade.h:8 +msgid "Font style:" +msgstr "Šrifto stilius:" + +#: ../data/glade/gajim_themes_window.glade.h:9 +msgid "Gajim Themes Customization" +msgstr "Gajim temų keitimas" + +#: ../data/glade/gajim_themes_window.glade.h:10 +msgid "Gone" +msgstr "Dingo" + +#: ../data/glade/gajim_themes_window.glade.h:11 +msgid "Inactive" +msgstr "Neaktyvus" + +#: ../data/glade/gajim_themes_window.glade.h:12 +msgid "Italic" +msgstr "Pasviręs" + +#: ../data/glade/gajim_themes_window.glade.h:13 +msgid "" +"MUC\n" +"Messages" +msgstr "" +"MUC\n" +"Žinutės" + +#: ../data/glade/gajim_themes_window.glade.h:15 +msgid "" +"MUC Directed\n" +"Messages" +msgstr "" +"MUC skirtos\n" +"Žinutės" + +#: ../data/glade/gajim_themes_window.glade.h:17 +msgid "Paused" +msgstr "sustabdytas" + +#: ../data/glade/gajim_themes_window.glade.h:18 +msgid "Text _color:" +msgstr "Teksto _spalva:" + +#: ../data/glade/gajim_themes_window.glade.h:19 +msgid "Text _font:" +msgstr "Teksto šri_ftas:" + +#: ../data/glade/gajim_themes_window.glade.h:20 +msgid "_Background:" +msgstr "_Fonas:" + +#: ../data/glade/gc_control_popup_menu.glade.h:1 +#, fuzzy +msgid "Change _Nickname..." +msgstr "Keisti _slapyvardį" + +#: ../data/glade/gc_control_popup_menu.glade.h:2 +#, fuzzy +msgid "Change _Subject..." +msgstr "Keisti _temą" + +#: ../data/glade/gc_control_popup_menu.glade.h:3 +msgid "Click to see past conversation in this room" +msgstr "Spauskite, kad pamatytumėte buvusius pokalbius šiame kambaryje" + +#: ../data/glade/gc_control_popup_menu.glade.h:4 +#, fuzzy +msgid "Configure _Room..." +msgstr "Keisti kambario nustatymus" + +#: ../data/glade/gc_control_popup_menu.glade.h:5 +#, fuzzy +msgid "_Bookmark" +msgstr "Žy_mėti šį kambarį" + +#: ../data/glade/gc_control_popup_menu.glade.h:6 +msgid "_Destroy Room" +msgstr "" + +#: ../data/glade/gc_control_popup_menu.glade.h:8 +#, fuzzy +msgid "_Manage Room" +msgstr "Žymių valdymas" + +#: ../data/glade/gc_control_popup_menu.glade.h:9 +msgid "_Minimize on close" +msgstr "" + +#: ../data/glade/gc_occupants_menu.glade.h:1 +msgid "Mo_derator" +msgstr "Mo_deratorius" + +#: ../data/glade/gc_occupants_menu.glade.h:2 +#, fuzzy +msgid "Occupant Actions" +msgstr "_Valdytojo Veiksmai" + +#: ../data/glade/gc_occupants_menu.glade.h:5 +msgid "_Admin" +msgstr "_Adminas" + +#: ../data/glade/gc_occupants_menu.glade.h:6 +msgid "_Ban" +msgstr "_Banas" + +#: ../data/glade/gc_occupants_menu.glade.h:8 +msgid "_Kick" +msgstr "_Išspirti" + +#: ../data/glade/gc_occupants_menu.glade.h:9 +msgid "_Member" +msgstr "_Dalyvis" + +#: ../data/glade/gc_occupants_menu.glade.h:10 +msgid "_Owner" +msgstr "_Savininkas" + +#: ../data/glade/gc_occupants_menu.glade.h:11 +msgid "_Send Private Message" +msgstr "_Siųsti privačią žinutę" + +#: ../data/glade/gc_occupants_menu.glade.h:12 +msgid "_Voice" +msgstr "_Balsas" + +#: ../data/glade/groups_post_window.glade.h:1 +msgid "Create new post" +msgstr "Kurti naują pranešimą" + +#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:271 +msgid "From" +msgstr "Nuo" + +#. holds subject +#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:142 +#: ../src/history_manager.py:173 +msgid "Subject" +msgstr "Tema" + +#: ../data/glade/history_manager.glade.h:1 +msgid "" +"Welcome to Gajim History Logs Manager\n" +"\n" +"You can select logs from the left and/or search database from below.\n" +"\n" +"WARNING:\n" +"If you plan to do massive deletions, please make sure Gajim is not running. " +"Generally avoid deletions with contacts you currently chat with." +msgstr "" +"Gajim istorijos žurnalų valdymas\n" +"\n" +"Galite pasirinkti žurnalą kairėje ir/arba žemiau ieškoti duomenų bazę.\n" +"\n" +"ĮSPĖJIMAS:\n" +"Jei planuojate daryti daug trynimų, įsitikinkite, kad Gajim yra išjungtas. " +"Stengitės netrinti iš asmenų su kuriais dabar bendraujate." + +#: ../data/glade/history_manager.glade.h:7 +msgid "Delete" +msgstr "Trinti" + +#: ../data/glade/history_manager.glade.h:8 +msgid "Export" +msgstr "Eksportuoti" + +#: ../data/glade/history_manager.glade.h:9 +msgid "Gajim History Logs Manager" +msgstr "Gajim Istorijos Žurnalų Valdymas" + +#: ../data/glade/history_manager.glade.h:10 +msgid "_Search Database" +msgstr "_Paieška duomenų bazėje" + +#: ../data/glade/history_window.glade.h:1 +#, fuzzy +msgid "History Viewer" +msgstr "Taisyklių sąrašas" + +#: ../data/glade/history_window.glade.h:2 +#, fuzzy +msgid "JID Selection" +msgstr "Aprašymas" + +#: ../data/glade/history_window.glade.h:3 +msgid "Build custom query" +msgstr "Kurti kitokią užklausą" + +#: ../data/glade/history_window.glade.h:4 ../src/history_window.py:199 +msgid "Conversation History" +msgstr "Pokalbio istorija" + +#: ../data/glade/history_window.glade.h:5 +msgid "" +"Enter a contact jid or MUC jid here to view its history.\n" +"If a contact is connected you can even enter his nick name.\n" +msgstr "" + +#: ../data/glade/history_window.glade.h:8 +msgid "Query Builder..." +msgstr "Užklasų kūrimas..." + +#: ../data/glade/history_window.glade.h:9 +msgid "Search" +msgstr "Ieškoti" + +#: ../data/glade/history_window.glade.h:10 +#: ../data/glade/zeroconf_information_window.glade.h:10 +msgid "_Log conversation history" +msgstr "_Registruoti pokalbio istoriją" + +#: ../data/glade/history_window.glade.h:11 ../src/disco.py:1172 +msgid "_Search" +msgstr "_Ieškoti" + +#: ../data/glade/invitation_received_dialog.glade.h:1 +msgid "Accept" +msgstr "Priimti" + +#: ../data/glade/invitation_received_dialog.glade.h:2 +#: ../data/glade/privacy_list_window.glade.h:8 +msgid "Deny" +msgstr "Atmesti" + +#: ../data/glade/invitation_received_dialog.glade.h:3 +msgid "Invitation Received" +msgstr "Gautas pakvietimas" + +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1265 +msgid "Join Group Chat" +msgstr "Prisijungti prie pokalbio grupėje" + +#: ../data/glade/join_groupchat_window.glade.h:2 +msgid "Join this room automatically when I connect" +msgstr "Prisijungti prie šio kambario automatiškai." + +#: ../data/glade/join_groupchat_window.glade.h:3 +#: ../data/glade/manage_bookmarks_window.glade.h:5 +#: ../data/glade/profile_window.glade.h:24 +#: ../data/glade/vcard_information_window.glade.h:31 +msgid "Nickname:" +msgstr "Slapyvardis:" + +#: ../data/glade/join_groupchat_window.glade.h:4 +#: ../data/glade/manage_bookmarks_window.glade.h:6 +msgid "Password:" +msgstr "Slaptažodis:" + +#: ../data/glade/join_groupchat_window.glade.h:5 +msgid "Recently:" +msgstr "Nesenai:" + +#: ../data/glade/join_groupchat_window.glade.h:6 +#: ../data/glade/manage_bookmarks_window.glade.h:8 +msgid "Room:" +msgstr "Kambarys:" + +#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1160 +#: ../src/disco.py:1615 +msgid "_Join" +msgstr "_Jungtis" + +#: ../data/glade/manage_accounts_window.glade.h:1 +msgid "Manage Accounts" +msgstr "Prieigų valdymas" + +#: ../data/glade/manage_bookmarks_window.glade.h:1 +msgid "Auto join" +msgstr "Automatinis prsijungimas" + +#: ../data/glade/manage_bookmarks_window.glade.h:2 +msgid "If checked, Gajim will join this group chat on startup" +msgstr "Jei pažymėta, Gajim, startuodamas jungsis prie šio pokalbio grupėje" + +#: ../data/glade/manage_bookmarks_window.glade.h:3 +msgid "Manage Bookmarks" +msgstr "Žymių valdymas" + +#: ../data/glade/manage_bookmarks_window.glade.h:4 +msgid "Minimize on Auto Join" +msgstr "" + +#: ../data/glade/manage_bookmarks_window.glade.h:7 +msgid "Print status:" +msgstr "Rodyti būklę:" + +#: ../data/glade/manage_bookmarks_window.glade.h:9 +msgid "Server:" +msgstr "Serveris:" + +#: ../data/glade/manage_bookmarks_window.glade.h:10 +msgid "Title:" +msgstr "Antraštė:" + +#: ../data/glade/manage_proxies_window.glade.h:1 +msgid "Properties" +msgstr "Savybės" + +#: ../data/glade/manage_proxies_window.glade.h:2 +msgid "Settings" +msgstr "Nustatymai" + +#: ../data/glade/manage_proxies_window.glade.h:3 +#, fuzzy +msgid "" +"HTTP Connect\n" +"SOCKS5" +msgstr "HTTP jungimąsis" + +#: ../data/glade/manage_proxies_window.glade.h:5 +msgid "Manage Proxy Profiles" +msgstr "Proxi profilių valdymas" + +#: ../data/glade/manage_proxies_window.glade.h:6 +#: ../data/glade/profile_window.glade.h:23 +#: ../data/glade/vcard_information_window.glade.h:30 +msgid "Name:" +msgstr "Pavadinimas:" + +#: ../data/glade/manage_proxies_window.glade.h:7 +msgid "Pass_word:" +msgstr "_Slaptažodis:" + +#: ../data/glade/manage_proxies_window.glade.h:8 +msgid "Type:" +msgstr "Tipas:" + +#: ../data/glade/manage_proxies_window.glade.h:9 +msgid "Use authentication" +msgstr "Naudoti autentifikaciją" + +#: ../data/glade/manage_proxies_window.glade.h:10 +msgid "_Host:" +msgstr "_Hostas:" + +#: ../data/glade/message_window.glade.h:1 +msgid "Click to insert an emoticon (Alt+M)" +msgstr "Įterpti emocijų paveiksliuką (Alt+M)" + +#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1213 +msgid "OpenPGP Encryption" +msgstr "OpenPGP Šifravimas" + +#. 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:4 +#: ../data/glade/roster_window.glade.h:12 +#: ../data/glade/subscription_request_window.glade.h:6 +msgid "_Actions" +msgstr "_Veiksmai" + +#. 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:6 +#: ../data/glade/xml_console_window.glade.h:11 +#: ../src/filetransfers_window.py:243 +msgid "_Send" +msgstr "_Siųsti" + +#: ../data/glade/passphrase_dialog.glade.h:1 +msgid "Passphrase" +msgstr "Slapta frazė" + +#: ../data/glade/preferences_window.glade.h:1 +msgid "Advanced Configuration Editor" +msgstr "Išplėstinis konfigūracijos redaktorius" + +#: ../data/glade/preferences_window.glade.h:2 +msgid "Applications" +msgstr "Programos" + +#: ../data/glade/preferences_window.glade.h:3 +#, fuzzy +msgid "Chat Appearance" +msgstr "Edit a rule" + +#. a header for custom browser/client/file manager. so translate sth like: Custom Settings +#: ../data/glade/preferences_window.glade.h:5 +msgid "Custom" +msgstr "Kitaip" + +#: ../data/glade/preferences_window.glade.h:6 +msgid "Format of a line" +msgstr "Eilutės formatas" + +#: ../data/glade/preferences_window.glade.h:7 +msgid "GMail Options" +msgstr "GMail nustatymai" + +#: ../data/glade/preferences_window.glade.h:9 +msgid "Preset Status Messages" +msgstr "Nustatytosios būklės žinutės" + +#: ../data/glade/preferences_window.glade.h:10 +#, fuzzy +msgid "Privacy" +msgstr "Privatus Sąrašas" + +#: ../data/glade/preferences_window.glade.h:11 +msgid "Roster Appearance" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:13 +#, fuzzy +msgid "Themes" +msgstr "Savybės" + +#: ../data/glade/preferences_window.glade.h:14 +msgid "Visual Notifications" +msgstr "Vizualinis informavimas" + +#: ../data/glade/preferences_window.glade.h:15 +msgid "Advanced" +msgstr "Išplėstinis" + +#: ../data/glade/preferences_window.glade.h:16 +msgid "" +"All chat states\n" +"Composing only\n" +"Disabled" +msgstr "" +"Visos pokalbių būklės\n" +"Tik rąšant\n" +"Uždrausta" + +#: ../data/glade/preferences_window.glade.h:19 +msgid "Allow _OS information to be sent" +msgstr "Leisti siųsti informaciją apie _OS" + +#: ../data/glade/preferences_window.glade.h:20 +msgid "Allow popup/notifications when I'm _away/na/busy/invisible" +msgstr "" +"Leisti pop-up/informavimą, kai esu _nuėjęs/nepasiekamas/užimtas/namatomas" + +#: ../data/glade/preferences_window.glade.h:21 +msgid "Always check to see if Gajim is the _default Jabber client on startup" +msgstr "Startuojant visada tikrinti ar Gajim yra pagrindinis Jabber klientas" + +#: ../data/glade/preferences_window.glade.h:22 +msgid "" +"An example: If you have enabled status message for away, Gajim won't ask you " +"anymore for a status message when you change your status to away; it will " +"use the default one set here" +msgstr "" +"Pavyzdys: Jei esate nustatęs žinutę būklei - nuėjęs, Gajim daugiau neklaus " +"kokią žinutę naudoti, kai nustatoma būklė - nuėjęs; bus naudojama " +"standartinė arba čia nustatyta žinutė" + +#: ../data/glade/preferences_window.glade.h:23 +msgid "Ask status message when I:" +msgstr "Prašyti įvesti būklės žinutę, kai aš:" + +#: ../data/glade/preferences_window.glade.h:24 +msgid "Auto _away after:" +msgstr "Automatiškai keisti būklė į nuėjęs, po:" + +#: ../data/glade/preferences_window.glade.h:25 +msgid "Auto _not available after:" +msgstr "Automatiškai keisti būklę į nepasiekamas, po:" + +#: ../data/glade/preferences_window.glade.h:26 +msgid "" +"Autodetect on every Gajim startup\n" +"Always use GNOME default applications\n" +"Always use KDE default applications\n" +"Always use XFCE4 default applications\n" +"Custom" +msgstr "" +"Automatiškai aptikti, startuojant Gajim\n" +"Visada naudoti GNOME programas pagal nutylėjimą\n" +"Visada naudoti KDĘ programas pagal nutylėjimą\n" +"Visada naudoti XFCE4 programas pagal nutylėjimą\n" +"Kita" + +#: ../data/glade/preferences_window.glade.h:31 +msgid "" +"Check this option, only if someone you don't have in the roster spams/annoys " +"you. Use with caution, because it blocks all messages from any contact that " +"is not in the roster" +msgstr "" +"Pažymėkite šį laukelį, tik jei kas nors, kas nėra jūsų kantaktų sąraše rašo " +"jums nepageidaujamas žinutes. Naudokite atsargiai, nes šis dalykas blokuos " +"vias žinutes, siunčiamas iš žmonių, kurie nėra Jūsų kontaktų sąraše." + +#: ../data/glade/preferences_window.glade.h:32 +msgid "Configure color and font of the interface" +msgstr "Nustatyti sąsajos spalvą ir šriftą" + +#: ../data/glade/preferences_window.glade.h:33 +msgid "Default Status Messages" +msgstr "Būklės žinutė, pagal nutylėjimą" + +#: ../data/glade/preferences_window.glade.h:34 +msgid "" +"Determined by sender\n" +"Chat message\n" +"Single message" +msgstr "" +"Aptinkamas pagal siuntėją\n" +"Pokalbio žinutė\n" +"Atskira žinutė" + +#: ../data/glade/preferences_window.glade.h:37 +msgid "Display _extra email details" +msgstr "Rodyti papildomus _el. pašto duomenis" + +#: ../data/glade/preferences_window.glade.h:38 +msgid "Display a_vatars of contacts in roster" +msgstr "Rodyti asmenų _paveiksliukus kontaktų sąraše" + +#: ../data/glade/preferences_window.glade.h:39 +msgid "Display status _messages of contacts in roster" +msgstr "Rodyti asmenų _būklės žinutes kontaktų sąraše" + +#: ../data/glade/preferences_window.glade.h:40 +msgid "Emoticons:" +msgstr "Rožiukai:" + +#: ../data/glade/preferences_window.glade.h:41 +msgid "Events" +msgstr "Įvykiai" + +#: ../data/glade/preferences_window.glade.h:42 +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 " +"display in chat windows." +msgstr "" +"Gajim gali išsiųsti ir parsisiųsti meta-informaciją, susijusią su pokalbiu, " +"kurį galite turėti su kokiu nors asmeniu. Čia jūs galite nurodyti kokią " +"koduotę rodyti pokalbių languose." + +#: ../data/glade/preferences_window.glade.h:43 +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 " +"send to the other party." +msgstr "" +"Gajim gali išsiųsti ir parsisiųsti meta-informaciją, susijusią su pokalbiu, " +"kurį galite turėti su kokiu nors asmeniu. Čia jūs galite nurodyti kokią " +"koduotę išsiųsti kitai šaliai." + +#: ../data/glade/preferences_window.glade.h:44 +msgid "" +"Gajim will notify you via a popup window in the bottom right of the screen " +"about contacts that just signed out" +msgstr "" +"Gajim rodys pranešimus apie ką tik atsijungusius asmenis iššokančiame " +"langelyje, dešiniajame apatiniame ekrano kampe" + +#: ../data/glade/preferences_window.glade.h:46 +#, fuzzy +msgid "Hides buttons in chatwindows to " +msgstr "Hides the buttons in group chat window." + +#: ../data/glade/preferences_window.glade.h:47 +msgid "" +"If checked, Gajim will also include information about the sender of the new " +"emails" +msgstr "" +"Jei pažymėsite, Gajim taip pat įtrauks informaciją apie naujo laiško siuntėją" + +#: ../data/glade/preferences_window.glade.h:48 +msgid "" +"If checked, Gajim will display avatars of contacts in roster window and in " +"group chats" +msgstr "" +"Jei pažymėta, Gajim rodys asmens paveiksliuką kontaktų sąraše ir pokalbio " +"lange" + +#: ../data/glade/preferences_window.glade.h:49 +msgid "" +"If checked, Gajim will display status messages of contacts under the contact " +"name in roster window and in group chats" +msgstr "" +"Jei pažymėta, Gajim rodys žiničių būkles žemiau kontaktinio asmens vardo, " +"kontaktų sąraše ir pokalbių grupėse" + +#: ../data/glade/preferences_window.glade.h:50 +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, " +"etc...)" +msgstr "" +"Jei pažymėta, Gajim naudos specifinius protokolo būklės paveiksliukus. " +"(pvz.: asmuo iš MSN protokolo turės atitinkamą MSN paveiksliuką būklei " +"„prisijungęs“, „nuėjęs“, „užimtas“ atvaizduoti... )" + +#: ../data/glade/preferences_window.glade.h:51 +msgid "" +"If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " +"animated or static graphical emoticons" +msgstr "" +"Jei neišjungtas, Gajim automatiškai pakeis tekstines šypsenėles tokias kaip " +"':)', į atitinkamus animuotus arba statinius paveiksliukus „rožiukus“" + +#: ../data/glade/preferences_window.glade.h:52 +msgid "Ignore rich content in incoming messages" +msgstr "Ignoruoti formatuotą turinį ateinančioms žinutėms" + +#: ../data/glade/preferences_window.glade.h:53 +msgid "Ma_nage..." +msgstr "Val_dyti..." + +#: ../data/glade/preferences_window.glade.h:54 +msgid "" +"Never\n" +"Always\n" +"Per account\n" +"Per type" +msgstr "" +"Niekada\n" +"Visada\n" +"Kiekvienam asmeniui\n" +"Kiekvienam tipui" + +#: ../data/glade/preferences_window.glade.h:58 +#, fuzzy +msgid "Notify me about contacts that sign _in" +msgstr "Pranešk man apie asmenius, kurie: " + +#: ../data/glade/preferences_window.glade.h:59 +#, fuzzy +msgid "Notify me about contacts that sign _out" +msgstr "Pranešk man apie asmenius, kurie: " + +#: ../data/glade/preferences_window.glade.h:60 +msgid "Notify on new _GMail email" +msgstr "Pranešk apie naujus _GMail laiškus" + +#: ../data/glade/preferences_window.glade.h:61 +msgid "Play _sounds" +msgstr "Groti _garsus" + +#: ../data/glade/preferences_window.glade.h:62 +msgid "" +"Pop it up\n" +"Notify me about it\n" +"Show only in roster" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:65 +msgid "Preferences" +msgstr "Parinktys" + +#: ../data/glade/preferences_window.glade.h:66 +#, fuzzy +msgid "Privacy" +msgstr "Privatus sąrašas" + +#: ../data/glade/preferences_window.glade.h:67 +msgid "Set status message to reflect currently playing _music track" +msgstr "Nustatyti būklės žinutę, atspindinčią grojamą _muzikinį takelį" + +#: ../data/glade/preferences_window.glade.h:68 +msgid "Sign _in" +msgstr "Pr_isijungti" + +#: ../data/glade/preferences_window.glade.h:69 +msgid "Sign _out" +msgstr "_Atsijungti" + +#: ../data/glade/preferences_window.glade.h:70 +msgid "" +"Some messages may include rich content (formatting, colors etc). If checked, " +"Gajim will just display the raw message text." +msgstr "" +"Kai kurios žinutės gali turėti formatuotą turinį (pastorinimai, spalvos ir " +"pan.). Jei pažymėsite, Gajim rodys tiesiog tekstą, be jokių formatavimų." + +#: ../data/glade/preferences_window.glade.h:71 +msgid "Status" +msgstr "Būklė" + +#: ../data/glade/preferences_window.glade.h:72 +#, fuzzy +msgid "Status _iconset:" +msgstr "Būklės p_iktogramų rinkinys, pagal nutylėjimą:" + +#: ../data/glade/preferences_window.glade.h:73 +msgid "T_heme:" +msgstr "_Tema:" + +#: ../data/glade/preferences_window.glade.h:74 +msgid "The auto away status message" +msgstr "Automatinio nuėjimo būklės pranešimas" + +#: ../data/glade/preferences_window.glade.h:75 +msgid "The auto not available status message" +msgstr "Automatinio nebuvimo būklės žinutė" + +#: ../data/glade/preferences_window.glade.h:76 +msgid "Treat all incoming messages as:" +msgstr "Laikyti visas įeinančias žinutes kaip:" + +#: ../data/glade/preferences_window.glade.h:77 +msgid "Use _transports iconsets" +msgstr "Naudoti _pernašos paveiksliukus" + +#: ../data/glade/preferences_window.glade.h:78 +#, fuzzy +msgid "Use only one message _window:" +msgstr "Vienas žinučių langas:" + +#: ../data/glade/preferences_window.glade.h:79 +msgid "Use system _default" +msgstr "Naudoti sisteminius nustatymus" + +#: ../data/glade/preferences_window.glade.h:80 +#, fuzzy +msgid "When new event is received:" +msgstr "Naujam įvykiui ivykus" + +#: ../data/glade/preferences_window.glade.h:81 +msgid "" +"Works for Rhythmbox and Muine players. For more players, please visit http://" +"trac.gajim.org/wiki/GajimAndMusicPlayer" +msgstr "" +"Veikia su Thythmbox ir Muine grotuvais. Dėl informacijos apie kitus grotuvus " +"apsilankykite svetainėje: http://trac.gajim.org/wiki/GajimAndMusicPlayer" + +#: ../data/glade/preferences_window.glade.h:82 +msgid "_Advanced Notifications Control..." +msgstr "_Išplėstinis Pranešimų Valdymas..." + +#: ../data/glade/preferences_window.glade.h:83 +msgid "_Browser:" +msgstr "_Naršyklė:" + +#: ../data/glade/preferences_window.glade.h:84 +#, fuzzy +msgid "_Display chat state notifications:" +msgstr "Rodyti _pokalbio būklės pranešimus:" + +#: ../data/glade/preferences_window.glade.h:85 +msgid "_File manager:" +msgstr "_Failų menedžeris:" + +#: ../data/glade/preferences_window.glade.h:86 +msgid "_Font:" +msgstr "Šri_ftas:" + +#: ../data/glade/preferences_window.glade.h:87 +msgid "_Highlight misspelled words" +msgstr "Žymėti žodžius su _gramatine klaida" + +#: ../data/glade/preferences_window.glade.h:88 +msgid "_Ignore events from contacts not in the roster" +msgstr "_Ignoruoti įvykius nuo asmenų nesančių kontaktų sąraše" + +#: ../data/glade/preferences_window.glade.h:89 +msgid "_Incoming message:" +msgstr "Į_einanti žinutė:" + +#: ../data/glade/preferences_window.glade.h:90 +msgid "_Log status changes of contacts" +msgstr "_Registruoti asmenų būklės pakitimus" + +#: ../data/glade/preferences_window.glade.h:91 +msgid "_Mail client:" +msgstr "_El. pašto programa:" + +#: ../data/glade/preferences_window.glade.h:92 +#, fuzzy +msgid "_Make message windows compact" +msgstr "Vienas žinučių langas:" + +#: ../data/glade/preferences_window.glade.h:93 +msgid "_Open..." +msgstr "_Atidaryti..." + +#: ../data/glade/preferences_window.glade.h:94 +msgid "_Outgoing message:" +msgstr "_Išeinanti žinutė:" + +#: ../data/glade/preferences_window.glade.h:95 +msgid "_Player:" +msgstr "_Grotuvas:" + +#: ../data/glade/preferences_window.glade.h:96 +msgid "_Reset to Default Colors" +msgstr "_Grąžinti buvusias spalvas pagal nutylėjimą" + +#: ../data/glade/preferences_window.glade.h:97 +#, fuzzy +msgid "_Send chat state notifications:" +msgstr "Rodyti _pokalbio būklės pranešimus:" + +#: ../data/glade/preferences_window.glade.h:98 +msgid "_Sort contacts by status" +msgstr "_Rūšiuoti kontaktus pagal būklę" + +#: ../data/glade/preferences_window.glade.h:99 +msgid "_Status message:" +msgstr "_Būklės pranešimas:" + +#: ../data/glade/preferences_window.glade.h:100 +msgid "_URL:" +msgstr "_URL:" + +#: ../data/glade/preferences_window.glade.h:101 +msgid "minutes" +msgstr "minutės" + +#: ../data/glade/privacy_lists_window.glade.h:1 +msgid "Privacy Lists:" +msgstr "Privatūs Sąrašai:" + +#: ../data/glade/privacy_list_window.glade.h:1 +msgid "Add / Edit a rule" +msgstr "Pridėti / Keisti taisyklę" + +#: ../data/glade/privacy_list_window.glade.h:2 +msgid "List of rules" +msgstr "Taisyklių sąrašas" + +#: ../data/glade/privacy_list_window.glade.h:3 +msgid "Privacy List" +msgstr "Privatus Sąrašas" + +#: ../data/glade/privacy_list_window.glade.h:4 +msgid "Active for this session" +msgstr "Aktyvus šiai sesijai" + +#: ../data/glade/privacy_list_window.glade.h:5 +msgid "Active on each startup" +msgstr "Aktyvus kiekvieno paleidimo metu" + +#: ../data/glade/privacy_list_window.glade.h:6 +msgid "All" +msgstr "Visi" + +#: ../data/glade/privacy_list_window.glade.h:7 +msgid "Allow" +msgstr "Leisti" + +#: ../data/glade/privacy_list_window.glade.h:9 +msgid "JabberID" +msgstr "JabberID" + +#: ../data/glade/privacy_list_window.glade.h:10 +msgid "Order:" +msgstr "Tvarka:" + +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2104 +msgid "Privacy List" +msgstr "Privatus sąrašas" + +#: ../data/glade/privacy_list_window.glade.h:12 +msgid "all by subscription" +msgstr "visus pagal užsisakymą" + +#: ../data/glade/privacy_list_window.glade.h:13 +msgid "all in the group" +msgstr "visus grupėje" + +#: ../data/glade/privacy_list_window.glade.h:14 +msgid "" +"none\n" +"both\n" +"from\n" +"to" +msgstr "" +"joks\n" +"abu\n" +"nuo\n" +"kam" + +#: ../data/glade/privacy_list_window.glade.h:18 +msgid "to send me messages" +msgstr "žinučių siuntimui" + +#: ../data/glade/privacy_list_window.glade.h:19 +msgid "to send me queries" +msgstr "užklausimų siuntimui" + +#: ../data/glade/privacy_list_window.glade.h:20 +msgid "to send me status" +msgstr "informavimui mane, apie būklę" + +#: ../data/glade/privacy_list_window.glade.h:21 +msgid "to view my status" +msgstr "mano būklės peržiūrai" + +#. "About" is the text of a tab of vcard window +#: ../data/glade/profile_window.glade.h:2 +#: ../data/glade/vcard_information_window.glade.h:2 +msgid "About" +msgstr "Apie" + +#: ../data/glade/profile_window.glade.h:3 +#: ../data/glade/vcard_information_window.glade.h:3 +msgid "Address" +msgstr "Adresas" + +#: ../data/glade/profile_window.glade.h:4 +msgid "Avatar:" +msgstr "Atvaizdas:" + +#: ../data/glade/profile_window.glade.h:5 +#: ../data/glade/vcard_information_window.glade.h:6 +msgid "Birthday:" +msgstr "Gimtadienis:" + +#: ../data/glade/profile_window.glade.h:6 +#: ../data/glade/vcard_information_window.glade.h:7 +msgid "City:" +msgstr "Miestas:" + +#: ../data/glade/profile_window.glade.h:7 +msgid "Click to set your avatar" +msgstr "Spauskia čia, kad įkeltum savo atvaizdą" + +#: ../data/glade/profile_window.glade.h:8 +#: ../data/glade/vcard_information_window.glade.h:10 +msgid "Company:" +msgstr "Kompanija:" + +#: ../data/glade/profile_window.glade.h:9 +#: ../data/glade/vcard_information_window.glade.h:14 +msgid "Country:" +msgstr "Šalis:" + +#: ../data/glade/profile_window.glade.h:10 +#: ../data/glade/vcard_information_window.glade.h:15 +msgid "Department:" +msgstr "Skyrius:" + +#: ../data/glade/profile_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:17 +msgid "Extra Address:" +msgstr "Papildomas adresas:" + +#. Family Name +#: ../data/glade/profile_window.glade.h:14 +#: ../data/glade/vcard_information_window.glade.h:19 +msgid "Family:" +msgstr "Pavardė:" + +#. Do NOT change sequence. Just translate YYYY and MM and DD (from Year, Month, Day accordingly) +#: ../data/glade/profile_window.glade.h:16 +#: ../data/glade/vcard_information_window.glade.h:21 +msgid "Format: YYYY-MM-DD" +msgstr "Formatas: YYYY-MM-DD" + +#: ../data/glade/profile_window.glade.h:17 +#: ../data/glade/vcard_information_window.glade.h:22 +#, fuzzy +msgid "Full Name" +msgstr "Name" + +#. Given Name +#: ../data/glade/profile_window.glade.h:19 +#: ../data/glade/vcard_information_window.glade.h:24 +msgid "Given:" +msgstr "Vardas:" + +#: ../data/glade/profile_window.glade.h:20 +#: ../data/glade/vcard_information_window.glade.h:25 +msgid "Homepage:" +msgstr "Asmeninė svetainė:" + +#. Middle Name +#: ../data/glade/profile_window.glade.h:22 +#: ../data/glade/vcard_information_window.glade.h:28 +msgid "Middle:" +msgstr "Antras vardas:" + +#: ../data/glade/profile_window.glade.h:25 +#: ../data/glade/vcard_information_window.glade.h:34 +msgid "Personal Info" +msgstr "Asmeninė Informacija" + +#: ../data/glade/profile_window.glade.h:27 +#: ../data/glade/vcard_information_window.glade.h:35 +msgid "Phone No.:" +msgstr "Tel. Nr.:" + +#: ../data/glade/profile_window.glade.h:28 +#: ../data/glade/vcard_information_window.glade.h:36 +msgid "Position:" +msgstr "Padėtis:" + +#: ../data/glade/profile_window.glade.h:29 +#: ../data/glade/vcard_information_window.glade.h:37 +msgid "Postal Code:" +msgstr "Pašto kodas:" + +#. Prefix in Name +#: ../data/glade/profile_window.glade.h:31 +#: ../data/glade/vcard_information_window.glade.h:39 +msgid "Prefix:" +msgstr "Kreipinys:" + +#: ../data/glade/profile_window.glade.h:32 +#: ../data/glade/vcard_information_window.glade.h:41 ../src/vcard.py:302 +msgid "Role:" +msgstr "Funkcija:" + +#: ../data/glade/profile_window.glade.h:33 +#: ../data/glade/vcard_information_window.glade.h:42 +msgid "State:" +msgstr "Valstija:" + +#: ../data/glade/profile_window.glade.h:34 +#: ../data/glade/vcard_information_window.glade.h:44 +msgid "Street:" +msgstr "Gatvė:" + +#. Suffix in Name +#: ../data/glade/profile_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:48 +msgid "Suffix:" +msgstr "Vardo sufiksas:" + +#: ../data/glade/profile_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:50 +msgid "Work" +msgstr "Darbas" + +#: ../data/glade/remove_account_window.glade.h:1 +msgid "What do you want to do?" +msgstr "Ką norėtumėte veikti?" + +#: ../data/glade/remove_account_window.glade.h:2 +msgid "Remove account _only from Gajim" +msgstr "Pašalinti prieigą, _tik iš Gajim" + +#: ../data/glade/remove_account_window.glade.h:3 +msgid "Remove account from Gajim and from _server" +msgstr "Pašalinti prieigą ir iš Gajim ir iš _serverio" + +#. Remove +#. Remove group +#. Remove +#: ../data/glade/remove_account_window.glade.h:4 +#: ../data/glade/roster_contact_context_menu.glade.h:18 +#: ../src/roster_window.py:2524 ../src/roster_window.py:2734 +#: ../src/roster_window.py:2870 +msgid "_Remove" +msgstr "_Trinti" + +#: ../data/glade/roster_contact_context_menu.glade.h:1 +msgid "A_sk to see his/her status" +msgstr "Siųsti užklausimą, kad galėtumėte matyti jo/jos būklę" + +#: ../data/glade/roster_contact_context_menu.glade.h:2 +#, fuzzy +msgid "Add Special _Notification..." +msgstr "Add Special _Notification" + +#: ../data/glade/roster_contact_context_menu.glade.h:3 +#, fuzzy +msgid "Assign Open_PGP Key..." +msgstr "Priskirti Open_PGP Raktą" + +#: ../data/glade/roster_contact_context_menu.glade.h:4 +#, fuzzy +msgid "Edit _Groups..." +msgstr "Redaguoti _Grupes" + +#. Execute Command +#: ../data/glade/roster_contact_context_menu.glade.h:5 +#: ../src/roster_window.py:2827 +msgid "Execute Command..." +msgstr "Vykdyti Komandą..." + +#. Invite to Groupchat +#: ../data/glade/roster_contact_context_menu.glade.h:6 +#: ../src/roster_window.py:2440 +msgid "In_vite to" +msgstr "Pak_viesti į" + +#. Send Custom Status +#: ../data/glade/roster_contact_context_menu.glade.h:7 +#: ../src/roster_window.py:2664 ../src/roster_window.py:2798 +#, fuzzy +msgid "Send Cus_tom Status" +msgstr "Sends custom XML" + +#: ../data/glade/roster_contact_context_menu.glade.h:8 +msgid "Send Single _Message..." +msgstr "Siųsti ži_nutę..." + +#: ../data/glade/roster_contact_context_menu.glade.h:9 +#, fuzzy +msgid "Send _File..." +msgstr "Siųsti _Failą" + +#: ../data/glade/roster_contact_context_menu.glade.h:10 +msgid "Set Custom _Avatar..." +msgstr "" + +#: ../data/glade/roster_contact_context_menu.glade.h:11 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:5 +msgid "Start _Chat" +msgstr "Pradėti _Pokalbį" + +#: ../data/glade/roster_contact_context_menu.glade.h:13 +msgid "_Allow him/her to see my status" +msgstr "_Leisti jam/jai matyti mano būklę" + +#: ../data/glade/roster_contact_context_menu.glade.h:14 +#: ../src/roster_window.py:2514 ../src/roster_window.py:2725 +msgid "_Block" +msgstr "" + +#: ../data/glade/roster_contact_context_menu.glade.h:15 +msgid "_Forbid him/her to see my status" +msgstr "_Drausti jam/jai matyti mano būklę" + +#: ../data/glade/roster_contact_context_menu.glade.h:17 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:7 +#, fuzzy +msgid "_Manage Contact" +msgstr "Rename Contact" + +#: ../data/glade/roster_contact_context_menu.glade.h:19 +#, fuzzy +msgid "_Rename..." +msgstr "_Pervadinti" + +#: ../data/glade/roster_contact_context_menu.glade.h:20 +msgid "_Subscription" +msgstr "_Sutikimas" + +#: ../data/glade/roster_contact_context_menu.glade.h:21 +#: ../src/roster_window.py:2508 ../src/roster_window.py:2719 +msgid "_Unblock" +msgstr "" + +#: ../data/glade/roster_window.glade.h:1 +msgid "A_ccounts" +msgstr "P_rieigos" + +#: ../data/glade/roster_window.glade.h:2 +#, fuzzy +msgid "Add _Contact..." +msgstr "_Įtraukti asmenį..." + +#: ../data/glade/roster_window.glade.h:3 +#, fuzzy +msgid "Fea_tures" +msgstr "Serverio teikiamos paslaugos" + +#: ../data/glade/roster_window.glade.h:4 +msgid "File _Transfers" +msgstr "Failų _Siuntimai" + +#: ../data/glade/roster_window.glade.h:5 +msgid "Frequently Asked Questions (online)" +msgstr "Dažniausiai Užduodami Klausimai (prisijungus)" + +#: ../data/glade/roster_window.glade.h:7 +msgid "Help online" +msgstr "Pagalba tinkle" + +#: ../data/glade/roster_window.glade.h:9 +msgid "Profile, A_vatar" +msgstr "Profilis, At_vaizdas" + +#: ../data/glade/roster_window.glade.h:10 +msgid "Show Trans_ports" +msgstr "Rodyti _Pernašas" + +#: ../data/glade/roster_window.glade.h:11 +msgid "Show _Offline Contacts" +msgstr "Rodyti _Atsijungusius Asmenis" + +#: ../data/glade/roster_window.glade.h:14 +msgid "_Contents" +msgstr "_Turinys" + +#: ../data/glade/roster_window.glade.h:16 ../src/disco.py:1348 +msgid "_Edit" +msgstr "_Redaguoti" + +#: ../data/glade/roster_window.glade.h:17 +msgid "_FAQ" +msgstr "_DUK" + +#: ../data/glade/roster_window.glade.h:18 +msgid "_Help" +msgstr "_Pagalba" + +#: ../data/glade/roster_window.glade.h:19 +msgid "_Preferences" +msgstr "_Nustatymai" + +#: ../data/glade/roster_window.glade.h:20 +msgid "_Quit" +msgstr "_Išjungti" + +#: ../data/glade/roster_window.glade.h:21 +#, fuzzy +msgid "_Send Single Message..." +msgstr "Siųsti ži_nutę..." + +#: ../data/glade/roster_window.glade.h:23 +msgid "_View" +msgstr "_Rodinys" + +#: ../data/glade/service_discovery_window.glade.h:1 +msgid "G_o" +msgstr "_Eik" + +#: ../data/glade/service_discovery_window.glade.h:2 +msgid "_Address:" +msgstr "_Adresas:" + +#: ../data/glade/service_registration_window.glade.h:1 +msgid "Register to" +msgstr "Registruotis prie" + +#: ../data/glade/service_registration_window.glade.h:2 +msgid "_Cancel" +msgstr "_Atšaukti" + +#: ../data/glade/service_registration_window.glade.h:3 +msgid "_OK" +msgstr "_OK" + +#: ../data/glade/single_message_window.glade.h:1 +msgid "0" +msgstr "0" + +#: ../data/glade/single_message_window.glade.h:2 +msgid "From:" +msgstr "Nuo:" + +#: ../data/glade/single_message_window.glade.h:3 +msgid "Reply to this message" +msgstr "Atsakyti šiai žinutei" + +#: ../data/glade/single_message_window.glade.h:4 +msgid "Sen_d" +msgstr "_Siųsti" + +#: ../data/glade/single_message_window.glade.h:5 +msgid "Send message" +msgstr "Siųsti žinutę" + +#: ../data/glade/single_message_window.glade.h:6 +msgid "Send message and close window" +msgstr "Išsiųsti žinutę ir uždaryti langą" + +#: ../data/glade/single_message_window.glade.h:7 +msgid "Subject:" +msgstr "Tema:" + +#: ../data/glade/single_message_window.glade.h:8 +msgid "To:" +msgstr "Kam:" + +#: ../data/glade/single_message_window.glade.h:9 +msgid "_Reply" +msgstr "_Atsakyti" + +#: ../data/glade/single_message_window.glade.h:10 +msgid "_Send & Close" +msgstr "_Išsiųsti " + +#: ../data/glade/subscription_request_window.glade.h:1 +msgid "Au_thorize" +msgstr "Au_torizuoti" + +#: ../data/glade/subscription_request_window.glade.h:2 +msgid "Authorize contact so he or she can know when you're connected" +msgstr "Autorizuoti asmenį, kad jis arba ji žinotu kada esate prisijungęs" + +#: ../data/glade/subscription_request_window.glade.h:3 +msgid "" +"Deny authorization from contact so he or she cannot know when you're " +"connected" +msgstr "" +"Drausti autorizacija šiam asmeniui, jis arba ji negalės matyti ar esate " +"prisijungęs" + +#: ../data/glade/subscription_request_window.glade.h:4 +msgid "Subscription Request" +msgstr "Sutikimo užklausimas" + +#: ../data/glade/subscription_request_window.glade.h:7 +msgid "_Deny" +msgstr "_Drausti" + +#: ../data/glade/systray_context_menu.glade.h:1 +msgid "Mute Sounds" +msgstr "Išjungti Garsus" + +#: ../data/glade/systray_context_menu.glade.h:2 +msgid "Send Single _Message" +msgstr "Siųsti Vieną Ži_nutę" + +#: ../data/glade/systray_context_menu.glade.h:3 +msgid "Show All Pending _Events" +msgstr "Rodyti Visus Laukiančius Į_vykius" + +#: ../data/glade/systray_context_menu.glade.h:4 +msgid "Show _Roster" +msgstr "Rodyk _Kontaktų Sąrašą" + +#: ../data/glade/systray_context_menu.glade.h:5 +msgid "Sta_tus" +msgstr "_Būklė" + +#: ../data/glade/systray_context_menu.glade.h:6 +msgid "_Group Chat" +msgstr "Pokalbiai _Grupėje" + +#. Given Name +#: ../data/glade/vcard_information_window.glade.h:5 +msgid "Ask:" +msgstr "Klausti:" + +#: ../data/glade/vcard_information_window.glade.h:8 +msgid "Client:" +msgstr "Klientas:" + +#: ../data/glade/vcard_information_window.glade.h:9 +msgid "Comments" +msgstr "Komentarai" + +#: ../data/glade/vcard_information_window.glade.h:11 +#, fuzzy +msgid "Configured avatar:" +msgstr "Keisti kambario nustatymus" + +#: ../data/glade/vcard_information_window.glade.h:12 +#: ../data/glade/zeroconf_information_window.glade.h:1 +msgid "Contact" +msgstr "Asmuo" + +#: ../data/glade/vcard_information_window.glade.h:13 +msgid "Contact Information" +msgstr "Asmens Informacija" + +#: ../data/glade/vcard_information_window.glade.h:29 +msgid "More" +msgstr "Daugiau" + +#: ../data/glade/vcard_information_window.glade.h:33 +msgid "OS:" +msgstr "OS:" + +#: ../data/glade/vcard_information_window.glade.h:40 +#: ../data/glade/zeroconf_information_window.glade.h:8 +msgid "Resource:" +msgstr "Šaltinis:" + +#: ../data/glade/vcard_information_window.glade.h:43 +#: ../data/glade/zeroconf_information_window.glade.h:9 +msgid "Status:" +msgstr "Būklė:" + +#. Family Name +#: ../data/glade/vcard_information_window.glade.h:46 +msgid "Subscription:" +msgstr "Sutikimas:" + +#: ../data/glade/vcard_information_window.glade.h:49 +#, fuzzy +msgid "User avatar:" +msgstr "Atvaizdas:" + +#: ../data/glade/xml_console_window.glade.h:1 +msgid "Jabber Traffic" +msgstr "Jabber Srautas" + +#: ../data/glade/xml_console_window.glade.h:2 +msgid "XML Input" +msgstr "XML Įvestis" + +#. Info/Query make the "IQ" initials. So translate like this 'YourLang/YourLang (Info/Query)'. Thanks (it's a tooltip so width is not a problem) +#: ../data/glade/xml_console_window.glade.h:6 +msgid "Info/Query" +msgstr "Informacija/Užklausa" + +#. Info/Query: all(?) jabber xml start with , sends action to the current group chat. Use third " +"person. (e.g. /%s explodes.)" +msgstr "" +"Usage: /%s , sends action to the current group chat. Use third " +"person. (e.g. /%s explodes.)" + +#: ../src/chat_control.py:1286 +#, python-format +msgid "Usage: /%s, sends a ping to the contact" +msgstr "" + +#: ../src/chat_control.py:1289 +#, fuzzy, python-format +msgid "Usage: /%s, send the message to the contact" +msgstr "Usage: /%s, hide the chat buttons." + +#: ../src/chat_control.py:1292 ../src/groupchat_control.py:1473 +#, python-format +msgid "No help info for /%s" +msgstr "No help info for /%s" + +#: ../src/chat_control.py:1430 ../src/chat_control.py:1456 +msgid "Encryption enabled" +msgstr "Encryption enabled" + +#: ../src/chat_control.py:1435 +msgid "Session WILL be logged" +msgstr "" + +#: ../src/chat_control.py:1437 +msgid "Session WILL NOT be logged" +msgstr "" + +#: ../src/chat_control.py:1444 +#, fuzzy +msgid "The following message was NOT encrypted" +msgstr "[This message is encrypted]" + +#: ../src/chat_control.py:1448 ../src/chat_control.py:1461 +#: ../src/chat_control.py:2090 +msgid "Encryption disabled" +msgstr "Encryption disabled" + +#. add_to_roster_menuitem +#: ../src/chat_control.py:1618 ../src/conversation_textview.py:562 +#: ../src/dialogs.py:674 ../src/gajim.py:894 ../src/gajim.py:895 +#: ../src/gajim.py:1364 ../src/roster_window.py:345 +#: ../src/roster_window.py:429 ../src/roster_window.py:1790 +#: ../src/roster_window.py:1800 ../src/roster_window.py:2039 +#: ../src/roster_window.py:2277 ../src/roster_window.py:3125 +#: ../src/roster_window.py:3332 ../src/roster_window.py:4692 +#: ../src/roster_window.py:4694 ../src/common/contacts.py:84 +#: ../src/common/helpers.py:44 ../src/common/helpers.py:258 +msgid "Not in Roster" +msgstr "Not in Roster" + +#. %s is being replaced in the code with JID +#: ../src/chat_control.py:1762 +#, python-format +msgid "You just received a new message from \"%s\"" +msgstr "You just received a new message from \"%s\"" + +#: ../src/chat_control.py:1763 +msgid "" +"If you close this tab and you have history disabled, this message will be " +"lost." +msgstr "" +"If you close this tab and you have history disabled, this message will be " +"lost." + +#: ../src/config.py:122 ../src/config.py:544 +msgid "Disabled" +msgstr "Disabled" + +#: ../src/config.py:288 +msgid "Active" +msgstr "Active" + +#: ../src/config.py:296 +msgid "Event" +msgstr "Event" + +#: ../src/config.py:617 ../src/dialogs.py:958 +#, python-format +msgid "Dictionary for lang %s not available" +msgstr "Dictionary for lang %s not available" + +#: ../src/config.py:618 +#, python-format +msgid "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option." +msgstr "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option." + +#: ../src/config.py:969 +msgid "status message title" +msgstr "status message title" + +#: ../src/config.py:969 +msgid "status message text" +msgstr "status message text" + +#: ../src/config.py:1005 +msgid "First Message Received" +msgstr "First Message Received" + +#: ../src/config.py:1006 +msgid "Next Message Received" +msgstr "Next Message Received" + +#: ../src/config.py:1007 +msgid "Contact Connected" +msgstr "Contact Connected" + +#: ../src/config.py:1008 +msgid "Contact Disconnected" +msgstr "Contact Disconnected" + +#: ../src/config.py:1009 +msgid "Message Sent" +msgstr "Message Sent" + +#: ../src/config.py:1010 +msgid "Group Chat Message Highlight" +msgstr "Group Chat Message Highlight" + +#: ../src/config.py:1011 +msgid "Group Chat Message Received" +msgstr "Group Chat Message Received" + +#: ../src/config.py:1018 +msgid "GMail Email Received" +msgstr "GMail E-mail Received" + +#. Name column +#: ../src/config.py:1287 ../src/dialogs.py:1397 ../src/dialogs.py:1461 +#: ../src/disco.py:736 ../src/disco.py:1559 ../src/disco.py:1805 +#: ../src/history_window.py:108 +msgid "Name" +msgstr "Name" + +#: ../src/config.py:1395 ../src/common/config.py:375 +msgid "Be right back." +msgstr "Be right back." + +#: ../src/config.py:1399 +msgid "Relogin now?" +msgstr "Relogin now?" + +#: ../src/config.py:1400 +msgid "If you want all the changes to apply instantly, you must relogin." +msgstr "If you want all the changes to apply instantly, you must relogin." + +#: ../src/config.py:1495 ../src/config.py:1594 +msgid "OpenPGP is not usable in this computer" +msgstr "OpenPGP is not usable in this computer" + +#: ../src/config.py:1630 ../src/config.py:1674 +msgid "Unread events" +msgstr "Unread events" + +#: ../src/config.py:1631 +msgid "Read all pending events before removing this account." +msgstr "Read all pending events before removing this account." + +#: ../src/config.py:1660 +#, python-format +msgid "You have opened chat in account %s" +msgstr "You have opened chat in account %s" + +#: ../src/config.py:1661 +msgid "All chat and groupchat windows will be closed. Do you want to continue?" +msgstr "" +"All chat and groupchat windows will be closed. Do you want to continue?" + +#: ../src/config.py:1670 +msgid "You are currently connected to the server" +msgstr "You are currently connected to the server" + +#: ../src/config.py:1671 +msgid "To change the account name, you must be disconnected." +msgstr "To change the account name, you must be disconnected." + +#: ../src/config.py:1675 +msgid "To change the account name, you must read all pending events." +msgstr "To change the account name, you must read all pending events." + +#: ../src/config.py:1681 +msgid "Account Name Already Used" +msgstr "Account Name Already Used" + +#: ../src/config.py:1682 +msgid "" +"This name is already used by another of your accounts. Please choose another " +"name." +msgstr "" +"This name is already used by another of your accounts. Please choose another " +"name." + +#: ../src/config.py:1686 ../src/config.py:1690 +msgid "Invalid account name" +msgstr "Invalid account name" + +#: ../src/config.py:1687 +msgid "Account name cannot be empty." +msgstr "Account name cannot be empty." + +#: ../src/config.py:1691 +msgid "Account name cannot contain spaces." +msgstr "Account name cannot contain spaces." + +#: ../src/config.py:1755 +#, fuzzy +msgid "Rename Account" +msgstr "Prieigų valdymas" + +#: ../src/config.py:1756 +#, fuzzy, python-format +msgid "Enter a new name for account %s" +msgstr "Enter a new name for group %s" + +#: ../src/config.py:1774 ../src/config.py:1782 ../src/config.py:1822 +#: ../src/config.py:3048 +msgid "Invalid Jabber ID" +msgstr "Invalid Jabber ID" + +#: ../src/config.py:1783 +msgid "A Jabber ID must be in the form \"user@servername\"." +msgstr "A Jabber ID must be in the form \"user@servername\"." + +#: ../src/config.py:1968 ../src/config.py:3119 +msgid "Invalid entry" +msgstr "Invalid entry" + +#: ../src/config.py:1969 ../src/config.py:3120 +msgid "Custom port must be a port number." +msgstr "Custom port must be a port number." + +#: ../src/config.py:1990 +msgid "Failed to get secret keys" +msgstr "Failed to get secret keys" + +#: ../src/config.py:1991 +msgid "There was a problem retrieving your OpenPGP secret keys." +msgstr "There was a problem retrieving your OpenPGP secret keys." + +#: ../src/config.py:1994 +msgid "OpenPGP Key Selection" +msgstr "OpenPGP Key Selection" + +#: ../src/config.py:1995 +msgid "Choose your OpenPGP key" +msgstr "Choose your OpenPGP key" + +#: ../src/config.py:2052 +msgid "No such account available" +msgstr "No such account available" + +#: ../src/config.py:2053 +msgid "You must create your account before editing your personal information." +msgstr "You must create your account before editing your personal information." + +#: ../src/config.py:2060 ../src/dialogs.py:1244 ../src/dialogs.py:1385 +#: ../src/dialogs.py:1565 ../src/disco.py:420 ../src/profile_window.py:325 +msgid "You are not connected to the server" +msgstr "You are not connected to the server" + +#: ../src/config.py:2061 +msgid "Without a connection, you can not edit your personal information." +msgstr "Without a connection, you can not edit your personal information." + +#: ../src/config.py:2065 +msgid "Your server doesn't support Vcard" +msgstr "Your server doesn't support Vcard" + +#: ../src/config.py:2066 +msgid "Your server can't save your personal information." +msgstr "Your server can't save your personal information." + +#: ../src/config.py:2097 +msgid "Account Local already exists." +msgstr "Account Local already exists." + +#: ../src/config.py:2098 +msgid "Please rename or remove it before enabling link-local messaging." +msgstr "Please rename or remove it before enabling link-local messaging." + +#: ../src/config.py:2274 +#, python-format +msgid "Edit %s" +msgstr "Edit %s" + +#: ../src/config.py:2276 +#, python-format +msgid "Register to %s" +msgstr "Register to %s" + +#. list at the beginning +#: ../src/config.py:2312 +msgid "Ban List" +msgstr "Ban List" + +#: ../src/config.py:2313 +msgid "Member List" +msgstr "Member List" + +#: ../src/config.py:2314 +msgid "Owner List" +msgstr "Owner List" + +#: ../src/config.py:2315 +msgid "Administrator List" +msgstr "Administrator List" + +#. Address column +#. holds JID (who said this) +#: ../src/config.py:2364 ../src/disco.py:743 ../src/history_manager.py:155 +msgid "JID" +msgstr "JID" + +#: ../src/config.py:2372 +msgid "Reason" +msgstr "Reason" + +#: ../src/config.py:2377 +msgid "Nick" +msgstr "Nick" + +#: ../src/config.py:2381 +msgid "Role" +msgstr "Role" + +#: ../src/config.py:2406 +msgid "Banning..." +msgstr "Banning..." + +#. You can move '\n' before user@domain if that line is TOO BIG +#: ../src/config.py:2408 +msgid "" +"Whom do you want to ban?\n" +"\n" +msgstr "" +"Whom do you want to ban?\n" +"\n" + +#: ../src/config.py:2410 +msgid "Adding Member..." +msgstr "Adding Member..." + +#: ../src/config.py:2411 +msgid "" +"Whom do you want to make a member?\n" +"\n" +msgstr "" +"Whom do you want to make a member?\n" +"\n" + +#: ../src/config.py:2413 +msgid "Adding Owner..." +msgstr "Adding Owner..." + +#: ../src/config.py:2414 +msgid "" +"Whom do you want to make an owner?\n" +"\n" +msgstr "" +"Whom do you want to make an owner?\n" +"\n" + +#: ../src/config.py:2416 +msgid "Adding Administrator..." +msgstr "Adding Administrator..." + +#: ../src/config.py:2417 +msgid "" +"Whom do you want to make an administrator?\n" +"\n" +msgstr "" +"Whom do you want to make an administrator?\n" +"\n" + +#: ../src/config.py:2418 +msgid "" +"Can be one of the following:\n" +"1. user@domain/resource (only that resource matches).\n" +"2. user@domain (any resource matches).\n" +"3. domain/resource (only that resource matches).\n" +"4. domain (the domain itself matches, as does any user@domain,\n" +"domain/resource, or address containing a subdomain." +msgstr "" +"Can be one of the following:\n" +"1. user@domain/resource (only that resource matches).\n" +"2. user@domain (any resource matches).\n" +"3. domain/resource (only that resource matches).\n" +"4. domain (the domain itself matches, as does any user@domain,\n" +"domain/resource, or address containing a subdomain." + +#: ../src/config.py:2522 +#, python-format +msgid "Removing %s account" +msgstr "Removing %s account" + +#: ../src/config.py:2539 ../src/gajim.py:1307 ../src/roster_window.py:3391 +msgid "Password Required" +msgstr "Password Required" + +#: ../src/config.py:2540 ../src/roster_window.py:3387 +#, python-format +msgid "Enter your password for account %s" +msgstr "Enter your password for account %s" + +#: ../src/config.py:2541 ../src/roster_window.py:3392 +msgid "Save password" +msgstr "Save password" + +#: ../src/config.py:2555 +#, python-format +msgid "Account \"%s\" is connected to the server" +msgstr "Account \"%s\" is connected to the server" + +#: ../src/config.py:2556 +msgid "If you remove it, the connection will be lost." +msgstr "If you remove it, the connection will be lost." + +#: ../src/config.py:2649 +msgid "Default" +msgstr "Default" + +#: ../src/config.py:2649 +msgid "?print_status:All" +msgstr "All" + +#: ../src/config.py:2650 +msgid "Enter and leave only" +msgstr "Enter and leave only" + +#: ../src/config.py:2651 +msgid "?print_status:None" +msgstr "None" + +#: ../src/config.py:2720 +msgid "New Group Chat" +msgstr "New Group Chat" + +#: ../src/config.py:2753 +msgid "This bookmark has invalid data" +msgstr "This bookmark has invalid data" + +#: ../src/config.py:2754 +msgid "" +"Please be sure to fill out server and room fields or remove this bookmark." +msgstr "" +"Please be sure to fill out server and room fields or remove this bookmark." + +#: ../src/config.py:3031 +msgid "Invalid username" +msgstr "Invalid username" + +#: ../src/config.py:3033 +msgid "You must provide a username to configure this account." +msgstr "You must provide a username to configure this account." + +#: ../src/config.py:3059 +msgid "Duplicate Jabber ID" +msgstr "Duplicate Jabber ID" + +#: ../src/config.py:3060 +msgid "This account is already configured in Gajim." +msgstr "This account is already configured in Gajim." + +#: ../src/config.py:3077 +msgid "Account has been added successfully" +msgstr "Account has been added successfully" + +#: ../src/config.py:3078 ../src/config.py:3223 +msgid "" +"You can set advanced account options by pressing the Advanced button, or " +"later by choosing the Accounts menuitem under the Edit menu from the main " +"window." +msgstr "" +"You can set advanced account options by pressing the Advanced button, or " +"later by choosing the Accounts menuitem under the Edit menu from the main " +"window." + +#: ../src/config.py:3095 +#, fuzzy +msgid "Invalid server" +msgstr "Invalid username" + +#: ../src/config.py:3096 +#, fuzzy +msgid "Please provide a server on which you want to register." +msgstr "Please specify the new nickname you want to use:" + +#: ../src/config.py:3202 ../src/config.py:3241 +msgid "An error occurred during account creation" +msgstr "An error occurred during account creation" + +#: ../src/config.py:3222 +msgid "Your new account has been created successfully" +msgstr "Your new account has been successfully created" + +#: ../src/config.py:3327 +msgid "Account name is in use" +msgstr "Account name is in use" + +#: ../src/config.py:3328 +msgid "You already have an account using this name." +msgstr "You already have an account using this name." + +#: ../src/conversation_textview.py:337 +msgid "" +"Text below this line is what has been said since the last time you paid " +"attention to this group chat" +msgstr "" +"Text below this line is what has been said since the last time you paid " +"attention to this group chat" + +#: ../src/conversation_textview.py:409 +#, python-format +msgid "_Actions for \"%s\"" +msgstr "_Actions for \"%s\"" + +#: ../src/conversation_textview.py:421 +msgid "Read _Wikipedia Article" +msgstr "Read _Wikipedia Article" + +#: ../src/conversation_textview.py:426 +msgid "Look it up in _Dictionary" +msgstr "Look it up in _Dictionary" + +#. we must have %s in the url if not WIKTIONARY +#: ../src/conversation_textview.py:442 +#, python-format +msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" +msgstr "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" + +#. we must have %s in the url +#: ../src/conversation_textview.py:455 +#, python-format +msgid "Web Search URL is missing an \"%s\"" +msgstr "Web Search URL is missing an \"%s\"" + +#: ../src/conversation_textview.py:458 +msgid "Web _Search for it" +msgstr "Web _Search for it" + +#: ../src/conversation_textview.py:464 +msgid "Open as _Link" +msgstr "Open as _Link" + +#: ../src/conversation_textview.py:929 +msgid "Yesterday" +msgstr "Yesterday" + +#. the number is >= 2 +#. %i is day in year (1-365), %d (1-31) we want %i +#: ../src/conversation_textview.py:933 +#, python-format +msgid "%i days ago" +msgstr "%i days ago" + +#. if we have subject, show it too! +#: ../src/conversation_textview.py:967 +#, python-format +msgid "Subject: %s\n" +msgstr "Subject: %s\n" + +#: ../src/dialogs.py:64 +#, python-format +msgid "Contact name: %s" +msgstr "Contact name: %s" + +#: ../src/dialogs.py:66 +#, python-format +msgid "Jabber ID: %s" +msgstr "Jabber ID: %s" + +#: ../src/dialogs.py:216 +msgid "Group" +msgstr "Group" + +#: ../src/dialogs.py:223 +msgid "In the group" +msgstr "In the group" + +#: ../src/dialogs.py:274 +msgid "KeyID" +msgstr "KeyID" + +#: ../src/dialogs.py:277 +msgid "Contact name" +msgstr "Contact name" + +#: ../src/dialogs.py:323 +#, python-format +msgid "%s Status Message" +msgstr "%s Status Message" + +#: ../src/dialogs.py:325 +msgid "Status Message" +msgstr "Status Message" + +#: ../src/dialogs.py:425 +msgid "Save as Preset Status Message" +msgstr "Save as Preset Status Message" + +#: ../src/dialogs.py:426 +msgid "Please type a name for this status message" +msgstr "Please type a name for this status message" + +#: ../src/dialogs.py:437 +#, fuzzy +msgid "Overwrite Status Message?" +msgstr "Status Message" + +#: ../src/dialogs.py:438 +#, fuzzy +msgid "" +"This name is already used. Do you want to overwrite this status message?" +msgstr "" +"This name is already used by another of your accounts. Please choose another " +"name." + +#: ../src/dialogs.py:454 +msgid "AIM Address:" +msgstr "AIM Address:" + +#: ../src/dialogs.py:455 +msgid "GG Number:" +msgstr "GG Number:" + +#: ../src/dialogs.py:456 +msgid "ICQ Number:" +msgstr "ICQ Number:" + +#: ../src/dialogs.py:457 +msgid "MSN Address:" +msgstr "MSN Address:" + +#: ../src/dialogs.py:458 +msgid "Yahoo! Address:" +msgstr "Yahoo! Address:" + +#: ../src/dialogs.py:495 +#, python-format +msgid "Please fill in the data of the contact you want to add in account %s" +msgstr "Please fill in the data of the contact you want to add in account %s" + +#: ../src/dialogs.py:497 +msgid "Please fill in the data of the contact you want to add" +msgstr "Please fill in the data of the contact you want to add" + +#: ../src/dialogs.py:654 ../src/dialogs.py:660 +msgid "Invalid User ID" +msgstr "Invalid User ID" + +#: ../src/dialogs.py:661 +msgid "The user ID must not contain a resource." +msgstr "The user ID must not contain a resource." + +#: ../src/dialogs.py:675 +msgid "Contact already in roster" +msgstr "Contact already in roster" + +#: ../src/dialogs.py:676 +msgid "This contact is already listed in your roster." +msgstr "This contact is already listed in your roster." + +#: ../src/dialogs.py:712 +msgid "User ID:" +msgstr "User ID:" + +#: ../src/dialogs.py:774 +msgid "A GTK+ jabber client" +msgstr "A GTK+ jabber client" + +#: ../src/dialogs.py:775 +msgid "GTK+ Version:" +msgstr "GTK+ Version:" + +#: ../src/dialogs.py:776 +msgid "PyGTK Version:" +msgstr "PyGTK Version:" + +#: ../src/dialogs.py:790 +msgid "Current Developers:" +msgstr "Current Developers:" + +#: ../src/dialogs.py:792 +msgid "Past Developers:" +msgstr "Past Developers:" + +#: ../src/dialogs.py:802 +msgid "THANKS:" +msgstr "THANKS:" + +#. remove one english sentence +#. and add it manually as translatable +#: ../src/dialogs.py:808 +msgid "Last but not least, we would like to thank all the package maintainers." +msgstr "" +"Last but not least, we would like to thank all the package maintainers." + +#. here you write your name in the form Name FamilyName +#: ../src/dialogs.py:821 +msgid "translator-credits" +msgstr "Jeff Bailes " + +#: ../src/dialogs.py:951 +#, python-format +msgid "Unable to bind to port %s." +msgstr "Unable to bind to port %s." + +#: ../src/dialogs.py:952 +msgid "" +"Maybe you have another running instance of Gajim. File Transfer will be " +"cancelled." +msgstr "" +"Maybe you have another running instance of Gajim. File Transfer will be " +"cancelled." + +#: ../src/dialogs.py:959 +#, fuzzy, python-format +msgid "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option.\n" +"\n" +"Highlighting misspelled words feature will not be used" +msgstr "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option." + +#: ../src/dialogs.py:1173 +#, python-format +msgid "Subscription request for account %s from %s" +msgstr "Subscription request for account %s from %s" + +#: ../src/dialogs.py:1176 +#, python-format +msgid "Subscription request from %s" +msgstr "Subscription request from %s" + +#: ../src/dialogs.py:1237 ../src/roster_window.py:763 +#, python-format +msgid "You are already in group chat %s" +msgstr "You are already in group chat %s" + +#: ../src/dialogs.py:1245 +msgid "You can not join a group chat unless you are connected." +msgstr "You can not join a group chat unless you are connected." + +#: ../src/dialogs.py:1263 +#, python-format +msgid "Join Group Chat with account %s" +msgstr "Join Group Chat with account %s" + +#: ../src/dialogs.py:1333 ../src/dialogs.py:1339 +#: ../src/groupchat_control.py:1643 +msgid "Invalid group chat Jabber ID" +msgstr "Invalid group chat Jabber ID" + +#: ../src/dialogs.py:1334 ../src/dialogs.py:1340 +#: ../src/groupchat_control.py:1644 +msgid "The group chat Jabber ID has not allowed characters." +msgstr "The group chat Jabber ID has invalid characters." + +#: ../src/dialogs.py:1346 +msgid "This is not a group chat" +msgstr "This is not a group chat" + +#: ../src/dialogs.py:1347 +#, python-format +msgid "%s is not the name of a group chat." +msgstr "%s is not the name of a group chat." + +#: ../src/dialogs.py:1386 +#, fuzzy +msgid "Without a connection, you can not synchronise your contacts." +msgstr "Without a connection, you can not change your password." + +#: ../src/dialogs.py:1400 +msgid "Server" +msgstr "Server" + +#: ../src/dialogs.py:1433 +#, fuzzy +msgid "This account is not connected to the server" +msgstr "Account \"%s\" is connected to the server" + +#: ../src/dialogs.py:1434 +#, fuzzy +msgid "You cannot synchronize with an account unless it is connected." +msgstr "You can not join a group chat unless you are connected." + +#: ../src/dialogs.py:1458 +msgid "Synchronise" +msgstr "" + +#: ../src/dialogs.py:1516 +#, python-format +msgid "Start Chat with account %s" +msgstr "Start Chat with account %s" + +#: ../src/dialogs.py:1518 +msgid "Start Chat" +msgstr "Start Chat" + +#: ../src/dialogs.py:1519 +msgid "" +"Fill in the nickname or the Jabber ID of the contact you would like\n" +"to send a chat message to:" +msgstr "" +"Fill in the nickname or the Jabber ID of the contact you would like\n" +"to send a chat message to:" + +#. if offline or connecting +#: ../src/dialogs.py:1544 ../src/dialogs.py:1891 ../src/dialogs.py:2027 +msgid "Connection not available" +msgstr "Connection not available" + +#: ../src/dialogs.py:1545 ../src/dialogs.py:1892 ../src/dialogs.py:2028 +#, python-format +msgid "Please make sure you are connected with \"%s\"." +msgstr "Please make sure you are connected with \"%s\"." + +#: ../src/dialogs.py:1554 ../src/dialogs.py:1557 +msgid "Invalid JID" +msgstr "Invalid JID" + +#: ../src/dialogs.py:1557 +#, python-format +msgid "Unable to parse \"%s\"." +msgstr "Unable to parse \"%s\"." + +#: ../src/dialogs.py:1566 +msgid "Without a connection, you can not change your password." +msgstr "Without a connection, you can not change your password." + +#: ../src/dialogs.py:1584 +msgid "Invalid password" +msgstr "Invalid password" + +#: ../src/dialogs.py:1585 +msgid "You must enter a password." +msgstr "You must enter a password." + +#: ../src/dialogs.py:1589 +msgid "Passwords do not match" +msgstr "Passwords do not match" + +#: ../src/dialogs.py:1590 +msgid "The passwords typed in both fields must be identical." +msgstr "The passwords typed in both fields must be identical." + +#. img to display +#. default value +#: ../src/dialogs.py:1632 ../src/notify.py:219 ../src/notify.py:429 +msgid "Contact Signed In" +msgstr "Contact Signed In" + +#: ../src/dialogs.py:1634 ../src/notify.py:227 ../src/notify.py:431 +msgid "Contact Signed Out" +msgstr "Contact Signed Out" + +#. chat message +#: ../src/dialogs.py:1636 ../src/notify.py:250 ../src/notify.py:433 +msgid "New Message" +msgstr "New Message" + +#. single message +#: ../src/dialogs.py:1636 ../src/notify.py:231 ../src/notify.py:433 +msgid "New Single Message" +msgstr "New Single Message" + +#. private message +#: ../src/dialogs.py:1637 ../src/notify.py:238 ../src/notify.py:434 +msgid "New Private Message" +msgstr "New Private Message" + +#: ../src/dialogs.py:1637 ../src/gajim.py:1460 ../src/notify.py:442 +msgid "New E-mail" +msgstr "New E-mail" + +#: ../src/dialogs.py:1639 ../src/gajim.py:1668 ../src/notify.py:436 +msgid "File Transfer Request" +msgstr "File Transfer Request" + +#: ../src/dialogs.py:1641 ../src/gajim.py:1432 ../src/gajim.py:1644 +#: ../src/notify.py:438 +msgid "File Transfer Error" +msgstr "File Transfer Error" + +#: ../src/dialogs.py:1643 ../src/gajim.py:1707 ../src/gajim.py:1729 +#: ../src/gajim.py:1746 ../src/notify.py:440 +msgid "File Transfer Completed" +msgstr "File Transfer Completed" + +#: ../src/dialogs.py:1644 ../src/gajim.py:1710 ../src/notify.py:440 +msgid "File Transfer Stopped" +msgstr "File Transfer Stopped" + +#: ../src/dialogs.py:1646 ../src/gajim.py:1328 ../src/notify.py:444 +msgid "Groupchat Invitation" +msgstr "Groupchat Invitation" + +#: ../src/dialogs.py:1648 ../src/notify.py:211 ../src/notify.py:446 +msgid "Contact Changed Status" +msgstr "Contact Changed Status" + +#: ../src/dialogs.py:1821 +#, python-format +msgid "Single Message using account %s" +msgstr "Single Message using account %s" + +#: ../src/dialogs.py:1823 +#, python-format +msgid "Single Message in account %s" +msgstr "Single Message in account %s" + +#: ../src/dialogs.py:1825 +msgid "Single Message" +msgstr "Single Message" + +#. prepare UI for Sending +#: ../src/dialogs.py:1828 +#, python-format +msgid "Send %s" +msgstr "Send %s" + +#. prepare UI for Receiving +#: ../src/dialogs.py:1851 +#, python-format +msgid "Received %s" +msgstr "Received %s" + +#. we create a new blank window to send and we preset RE: and to jid +#: ../src/dialogs.py:1928 +#, python-format +msgid "RE: %s" +msgstr "RE: %s" + +#: ../src/dialogs.py:1929 +#, python-format +msgid "%s wrote:\n" +msgstr "%s wrote:\n" + +#: ../src/dialogs.py:1973 +#, python-format +msgid "XML Console for %s" +msgstr "XML Console for %s" + +#: ../src/dialogs.py:1975 +msgid "XML Console" +msgstr "XML Console" + +#: ../src/dialogs.py:2098 +#, python-format +msgid "Privacy List %s" +msgstr "Privacy List %s" + +#: ../src/dialogs.py:2102 +#, python-format +msgid "Privacy List for %s" +msgstr "Privacy List for %s" + +#: ../src/dialogs.py:2158 +#, python-format +msgid "Order: %s, action: %s, type: %s, value: %s" +msgstr "Order: %s, action: %s, type: %s, value: %s" + +#: ../src/dialogs.py:2161 +#, python-format +msgid "Order: %s, action: %s" +msgstr "Order: %s, action: %s" + +#: ../src/dialogs.py:2203 +msgid "Edit a rule" +msgstr "Edit a rule" + +#: ../src/dialogs.py:2290 +msgid "Add a rule" +msgstr "Add a rule" + +#: ../src/dialogs.py:2386 +#, python-format +msgid "Privacy Lists for %s" +msgstr "Privacy Lists for %s" + +#: ../src/dialogs.py:2388 +msgid "Privacy Lists" +msgstr "Privacy Lists" + +#: ../src/dialogs.py:2458 +msgid "Invalid List Name" +msgstr "Invalid List Name" + +#: ../src/dialogs.py:2459 +msgid "You must enter a name to create a privacy list." +msgstr "You must enter a name to create a privacy list." + +#: ../src/dialogs.py:2496 +#, fuzzy +msgid "$Contact has invited you to join a discussion" +msgstr "$Contact has invited you to group chat %(room_jid)s" + +#: ../src/dialogs.py:2498 +#, python-format +msgid "$Contact has invited you to group chat %(room_jid)s" +msgstr "$Contact has invited you to group chat %(room_jid)s" + +#. only if not None and not '' +#: ../src/dialogs.py:2510 +#, python-format +msgid "Comment: %s" +msgstr "Comment: %s" + +#: ../src/dialogs.py:2576 +msgid "Choose Sound" +msgstr "Choose Sound" + +#: ../src/dialogs.py:2586 ../src/dialogs.py:2634 +msgid "All files" +msgstr "All files" + +#: ../src/dialogs.py:2591 +msgid "Wav Sounds" +msgstr "Wav Sounds" + +#: ../src/dialogs.py:2624 +msgid "Choose Image" +msgstr "Choose Image" + +#: ../src/dialogs.py:2639 +msgid "Images" +msgstr "Images" + +#: ../src/dialogs.py:2703 +#, python-format +msgid "When %s becomes:" +msgstr "When %s becomes:" + +#: ../src/dialogs.py:2705 +#, python-format +msgid "Adding Special Notification for %s" +msgstr "Adding Special Notification for %s" + +#. # means number +#: ../src/dialogs.py:2776 +msgid "#" +msgstr "#" + +#: ../src/dialogs.py:2782 +msgid "Condition" +msgstr "Condition" + +#: ../src/dialogs.py:2900 +msgid "when I am " +msgstr "when I am " + +#: ../src/disco.py:104 +msgid "Others" +msgstr "Others" + +#: ../src/disco.py:105 ../src/disco.py:106 ../src/disco.py:1345 +#: ../src/gajim.py:644 ../src/roster_window.py:282 ../src/roster_window.py:342 +#: ../src/roster_window.py:382 ../src/roster_window.py:490 +#: ../src/roster_window.py:522 ../src/roster_window.py:524 +#: ../src/roster_window.py:4688 ../src/roster_window.py:4690 +#: ../src/common/contacts.py:290 ../src/common/contacts.py:305 +#: ../src/common/helpers.py:44 +msgid "Transports" +msgstr "Transports" + +#. conference is a category for listing mostly groupchats in service discovery +#: ../src/disco.py:108 +msgid "Conference" +msgstr "Conference" + +#: ../src/disco.py:421 +msgid "Without a connection, you can not browse available services" +msgstr "Without a connection, you can not browse available services" + +#: ../src/disco.py:495 +#, python-format +msgid "Service Discovery using account %s" +msgstr "Service Discovery using account %s" + +#: ../src/disco.py:497 +msgid "Service Discovery" +msgstr "Service Discovery" + +#: ../src/disco.py:637 +msgid "The service could not be found" +msgstr "The service could not be found" + +#: ../src/disco.py:638 +msgid "" +"There is no service at the address you entered, or it is not responding. " +"Check the address and try again." +msgstr "" +"There is no service at the address you entered, or it is not responding. " +"Check the address and try again." + +#: ../src/disco.py:642 ../src/disco.py:923 +msgid "The service is not browsable" +msgstr "The service is not browsable" + +#: ../src/disco.py:643 +msgid "This type of service does not contain any items to browse." +msgstr "This type of service does not contain any items to browse." + +#: ../src/disco.py:723 +#, python-format +msgid "Browsing %s using account %s" +msgstr "Browsing %s using account %s" + +#: ../src/disco.py:762 +msgid "_Browse" +msgstr "_Browse" + +#: ../src/disco.py:924 +msgid "This service does not contain any items to browse." +msgstr "This service does not contain any items to browse." + +#: ../src/disco.py:1142 +#, fuzzy +msgid "_Execute Command" +msgstr "_Vykdyti komandą..." + +#: ../src/disco.py:1152 ../src/disco.py:1350 +msgid "Re_gister" +msgstr "Re_gister" + +#: ../src/disco.py:1387 +#, python-format +msgid "Scanning %d / %d.." +msgstr "Scanning %d / %d.." + +#. Users column +#: ../src/disco.py:1569 +msgid "Users" +msgstr "Users" + +#. Description column +#: ../src/disco.py:1577 +msgid "Description" +msgstr "Description" + +#. Id column +#: ../src/disco.py:1585 +msgid "Id" +msgstr "Id" + +#: ../src/disco.py:1814 +msgid "Subscribed" +msgstr "Subscribed" + +#: ../src/disco.py:1822 +#, fuzzy +msgid "Node" +msgstr "Joks" + +#: ../src/disco.py:1879 +msgid "New post" +msgstr "New post" + +#: ../src/disco.py:1885 +msgid "_Subscribe" +msgstr "_Subscribe" + +#: ../src/disco.py:1891 +msgid "_Unsubscribe" +msgstr "_Unsubscribe" + +#: ../src/filetransfers_window.py:72 +msgid "File" +msgstr "File" + +#: ../src/filetransfers_window.py:87 +msgid "Time" +msgstr "Time" + +#: ../src/filetransfers_window.py:99 +msgid "Progress" +msgstr "Progress" + +#: ../src/filetransfers_window.py:159 ../src/filetransfers_window.py:213 +#, python-format +msgid "Filename: %s" +msgstr "Filename: %s" + +#: ../src/filetransfers_window.py:160 ../src/filetransfers_window.py:288 +#, python-format +msgid "Size: %s" +msgstr "Size: %s" + +#. You is a reply of who sent a file +#. You is a reply of who received a file +#: ../src/filetransfers_window.py:169 ../src/filetransfers_window.py:179 +#: ../src/history_manager.py:463 +msgid "You" +msgstr "You" + +#: ../src/filetransfers_window.py:170 +#, python-format +msgid "Sender: %s" +msgstr "Sender: %s" + +#: ../src/filetransfers_window.py:171 ../src/filetransfers_window.py:577 +#: ../src/tooltips.py:586 +msgid "Recipient: " +msgstr "Recipient: " + +#: ../src/filetransfers_window.py:182 +#, python-format +msgid "Saved in: %s" +msgstr "Saved in: %s" + +#: ../src/filetransfers_window.py:184 +msgid "File transfer completed" +msgstr "File transfer completed" + +#: ../src/filetransfers_window.py:198 ../src/filetransfers_window.py:204 +msgid "File transfer cancelled" +msgstr "File transfer cancelled" + +#: ../src/filetransfers_window.py:198 ../src/filetransfers_window.py:205 +msgid "Connection with peer cannot be established." +msgstr "Connection with peer cannot be established." + +#: ../src/filetransfers_window.py:214 +#, python-format +msgid "Recipient: %s" +msgstr "Recipient: %s" + +#: ../src/filetransfers_window.py:216 +#, python-format +msgid "Error message: %s" +msgstr "Error message: %s" + +#: ../src/filetransfers_window.py:217 +msgid "File transfer stopped by the contact at the other end" +msgstr "File transfer stopped by the contact at the other end" + +#: ../src/filetransfers_window.py:234 +msgid "Choose File to Send..." +msgstr "Choose File to Send..." + +#: ../src/filetransfers_window.py:253 +msgid "Gajim cannot access this file" +msgstr "Gajim cannot access this file" + +#: ../src/filetransfers_window.py:254 +msgid "This file is being used by another process." +msgstr "This file is being used by another process." + +#: ../src/filetransfers_window.py:286 +#, python-format +msgid "File: %s" +msgstr "File: %s" + +#: ../src/filetransfers_window.py:291 +#, python-format +msgid "Type: %s" +msgstr "Type: %s" + +#: ../src/filetransfers_window.py:293 +#, python-format +msgid "Description: %s" +msgstr "Description: %s" + +#: ../src/filetransfers_window.py:294 +#, python-format +msgid "%s wants to send you a file:" +msgstr "%s wants to send you a file:" + +#: ../src/filetransfers_window.py:308 ../src/gtkgui_helpers.py:767 +#, python-format +msgid "Cannot overwrite existing file \"%s\"" +msgstr "Cannot overwrite existing file \"%s\"" + +#: ../src/filetransfers_window.py:309 ../src/gtkgui_helpers.py:769 +msgid "" +"A file with this name already exists and you do not have permission to " +"overwrite it." +msgstr "" +"A file with this name already exists and you do not have permission to " +"overwrite it." + +#: ../src/filetransfers_window.py:316 ../src/gtkgui_helpers.py:773 +msgid "This file already exists" +msgstr "This file already exists" + +#: ../src/filetransfers_window.py:316 ../src/gtkgui_helpers.py:773 +msgid "What do you want to do?" +msgstr "What do you want to do?" + +#: ../src/filetransfers_window.py:328 ../src/gtkgui_helpers.py:783 +#, python-format +msgid "Directory \"%s\" is not writable" +msgstr "Directory \"%s\" is not writable" + +#: ../src/filetransfers_window.py:328 ../src/gtkgui_helpers.py:784 +msgid "You do not have permission to create files in this directory." +msgstr "You do not have permission to create files in this directory." + +#: ../src/filetransfers_window.py:338 +msgid "Save File as..." +msgstr "Save File as..." + +#. 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:419 +#, python-format +msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" +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:508 +#, python-format +msgid "(%(filesize_unit)s/s)" +msgstr "(%(filesize_unit)s/s)" + +#: ../src/filetransfers_window.py:547 ../src/filetransfers_window.py:550 +msgid "Invalid File" +msgstr "Invalid File" + +#: ../src/filetransfers_window.py:547 +msgid "File: " +msgstr "File: " + +#: ../src/filetransfers_window.py:551 +msgid "It is not possible to send empty files" +msgstr "It is not possible to send empty files" + +#: ../src/filetransfers_window.py:573 ../src/tooltips.py:576 +msgid "Name: " +msgstr "Name: " + +#: ../src/filetransfers_window.py:575 ../src/tooltips.py:580 +msgid "Sender: " +msgstr "Sender: " + +#: ../src/filetransfers_window.py:763 +msgid "Pause" +msgstr "Pause" + +#: ../src/gajim.py:50 +#, python-format +msgid "%s is not a valid loglevel" +msgstr "" + +#: ../src/gajim.py:143 +msgid "Gajim needs X server to run. Quiting..." +msgstr "Gajim needs X server to run. Quiting..." + +#: ../src/gajim.py:147 +#, fuzzy +msgid "Gajim needs PyGTK 2.8 or above" +msgstr "Gajim needs PyGTK 2.6 or above" + +#: ../src/gajim.py:148 +#, fuzzy +msgid "Gajim needs PyGTK 2.8 or above to run. Quiting..." +msgstr "Gajim needs PyGTK 2.6 or above to run. Quiting..." + +#: ../src/gajim.py:150 +#, fuzzy +msgid "Gajim needs GTK 2.8 or above" +msgstr "Gajim needs GTK 2.6 or above" + +#: ../src/gajim.py:151 +#, fuzzy +msgid "Gajim needs GTK 2.8 or above to run. Quiting..." +msgstr "Gajim needs GTK 2.6 or above to run. Quiting..." + +#: ../src/gajim.py:156 +msgid "GTK+ runtime is missing libglade support" +msgstr "GTK+ runtime is missing libglade support" + +#: ../src/gajim.py:158 +#, python-format +msgid "" +"Please remove your current GTK+ runtime and install the latest stable " +"version from %s" +msgstr "" +"Please remove your current GTK+ runtime and install the latest stable " +"version from %s" + +#: ../src/gajim.py:160 +msgid "" +"Please make sure that GTK+ and PyGTK have libglade support in your system." +msgstr "" +"Please make sure that GTK+ and PyGTK have libglade support in your system." + +#: ../src/gajim.py:165 +msgid "Gajim needs PySQLite2 to run" +msgstr "Gajim needs PySQLite2 to run" + +#: ../src/gajim.py:173 +msgid "Gajim needs pywin32 to run" +msgstr "Gajim needs pywin32 to run" + +#: ../src/gajim.py:174 +#, python-format +msgid "" +"Please make sure that Pywin32 is installed on your system. You can get it at " +"%s" +msgstr "" +"Please make sure that Pywin32 is installed on your system. You can get it at " +"%s" + +#. set the icon to all newly opened wind +#: ../src/gajim.py:317 +msgid "Gajim is already running" +msgstr "Gajim is already running" + +#: ../src/gajim.py:318 +msgid "" +"Another instance of Gajim seems to be running\n" +"Run anyway?" +msgstr "" +"Another instance of Gajim seems to be running\n" +"Run anyway?" + +#: ../src/gajim.py:341 ../src/common/connection_handlers.py:900 +#: ../src/common/connection_handlers.py:1601 +#: ../src/common/connection_handlers.py:1629 +#: ../src/common/connection_handlers.py:1639 +#: ../src/common/connection_handlers.py:1658 +#: ../src/common/connection_handlers.py:1889 +#: ../src/common/connection_handlers.py:2001 ../src/common/connection.py:925 +msgid "Disk Write Error" +msgstr "" + +#: ../src/gajim.py:434 +msgid "Do you accept this request?" +msgstr "Do you accept this request?" + +#: ../src/gajim.py:437 +#, python-format +msgid "HTTP (%s) Authorization for %s (id: %s)" +msgstr "HTTP (%s) Authorisation for %s (id: %s)" + +#: ../src/gajim.py:484 ../src/notify.py:448 +msgid "Connection Failed" +msgstr "Connection Failed" + +#: ../src/gajim.py:817 +#, python-format +msgid "Subject: %s" +msgstr "Subject: %s" + +#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) +#: ../src/gajim.py:864 ../src/gajim.py:877 +#, python-format +msgid "error while sending %s ( %s )" +msgstr "error while sending %s ( %s )" + +#: ../src/gajim.py:910 +msgid "Authorization accepted" +msgstr "Authorisation accepted" + +#: ../src/gajim.py:911 +#, python-format +msgid "The contact \"%s\" has authorized you to see his or her status." +msgstr "The contact \"%s\" has authorised you to see his or her status." + +#: ../src/gajim.py:919 +#, python-format +msgid "Contact \"%s\" removed subscription from you" +msgstr "Contact \"%s\" removed subscription from you" + +#: ../src/gajim.py:920 +msgid "You will always see him or her as offline." +msgstr "You will always see him or her as offline." + +#: ../src/gajim.py:964 +#, python-format +msgid "Contact with \"%s\" cannot be established" +msgstr "Contact with \"%s\" cannot be established" + +#: ../src/gajim.py:965 ../src/common/connection.py:466 +msgid "Check your connection or try again later." +msgstr "Check your connection or try again later." + +#: ../src/gajim.py:1136 ../src/roster_window.py:1348 +#, python-format +msgid "%s is now %s (%s)" +msgstr "%s is now %s (%s)" + +#. No status message +#: ../src/gajim.py:1139 ../src/groupchat_control.py:1101 +#: ../src/roster_window.py:1351 +#, python-format +msgid "%s is now %s" +msgstr "%s is now %s" + +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/gajim.py:1259 ../src/groupchat_control.py:913 +msgid "Any occupant is allowed to see your full JID" +msgstr "" + +#: ../src/gajim.py:1261 +msgid "Room now shows unavailable member" +msgstr "" + +#: ../src/gajim.py:1263 +msgid "room now does not show unavailable members" +msgstr "" + +#: ../src/gajim.py:1266 +msgid "A non-privacy-related room configuration change has occurred" +msgstr "" + +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#: ../src/gajim.py:1269 +msgid "Room logging is now enabled" +msgstr "" + +#: ../src/gajim.py:1271 +msgid "Room logging is now disabled" +msgstr "" + +#: ../src/gajim.py:1273 +msgid "Room is now non-anonymous" +msgstr "" + +#: ../src/gajim.py:1275 +msgid "Room is now semi-anonymous" +msgstr "" + +#: ../src/gajim.py:1277 +msgid "Room is now fully-anonymous" +msgstr "" + +#: ../src/gajim.py:1308 +#, fuzzy, python-format +msgid "A Password is required to join the room %s. Please type it" +msgstr "A password is required to join this group chat." + +#: ../src/gajim.py:1338 +msgid "Your passphrase is incorrect" +msgstr "Your passphrase is incorrect" + +#: ../src/gajim.py:1339 +msgid "You are currently connected without your OpenPGP key." +msgstr "You are currently connected without your OpenPGP key." + +#: ../src/gajim.py:1443 +#, python-format +msgid "New mail on %(gmail_mail_address)s" +msgstr "New mail on %(gmail_mail_address)s" + +#: ../src/gajim.py:1445 +#, python-format +msgid "You have %d new mail conversation" +msgid_plural "You have %d new mail conversations" +msgstr[0] "You have %d new mail conversation" +msgstr[1] "You have %d new mail conversations" + +#. FIXME: emulate Gtalk client popups. find out what they parse and how +#. they decide what to show +#. each message has a 'From', 'Subject' and 'Snippet' field +#: ../src/gajim.py:1454 +#, python-format +msgid "" +"\n" +"From: %(from_address)s" +msgstr "" +"\n" +"From: %(from_address)s" + +#: ../src/gajim.py:1665 +#, python-format +msgid "%s wants to send you a file." +msgstr "%s wants to send you a file." + +#: ../src/gajim.py:1730 +#, python-format +msgid "You successfully received %(filename)s from %(name)s." +msgstr "You successfully received %(filename)s from %(name)s." + +#. ft stopped +#: ../src/gajim.py:1734 +#, python-format +msgid "File transfer of %(filename)s from %(name)s stopped." +msgstr "File transfer of %(filename)s from %(name)s stopped." + +#: ../src/gajim.py:1747 +#, python-format +msgid "You successfully sent %(filename)s to %(name)s." +msgstr "You successfully sent %(filename)s to %(name)s." + +#. ft stopped +#: ../src/gajim.py:1751 +#, python-format +msgid "File transfer of %(filename)s to %(name)s stopped." +msgstr "File transfer of %(filename)s to %(name)s stopped." + +#: ../src/gajim.py:1846 +msgid "Session negotiation cancelled" +msgstr "" + +#: ../src/gajim.py:1847 +#, python-format +msgid "The client at %s cancelled the session negotiation." +msgstr "" + +#: ../src/gajim.py:1887 ../src/gajim.py:1928 +msgid "Confirm these session options" +msgstr "" + +#: ../src/gajim.py:1888 +#, python-format +msgid "" +"The remote client wants to negotiate an session with these features:\n" +"\n" +"\t%s\n" +"\n" +"\tAre these options acceptable?" +msgstr "" + +#: ../src/gajim.py:1929 +#, python-format +msgid "" +"The remote client selected these options:\n" +"\n" +"%s\n" +"\n" +"Continue with the session?" +msgstr "" + +#: ../src/gajim.py:2041 +msgid "Username Conflict" +msgstr "Username Conflict" + +#: ../src/gajim.py:2042 +msgid "Please type a new username for your local account" +msgstr "Please type a new username for your local account" + +#: ../src/gajim.py:2059 +msgid "Ping?" +msgstr "" + +#: ../src/gajim.py:2067 +#, python-format +msgid "Pong! (%s s.)" +msgstr "" + +#: ../src/gajim.py:2073 +msgid "Error." +msgstr "" + +#: ../src/gajim.py:2098 +#, fuzzy +msgid "Resource Conflict" +msgstr "Username Conflict" + +#: ../src/gajim.py:2099 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" +msgstr "" + +#. it is good to notify the user +#. in case he or she cannot see the output of the console +#: ../src/gajim.py:2461 +msgid "Could not save your settings and preferences" +msgstr "Could not save your settings and preferences" + +#. sorted alphanum +#: ../src/gajim.py:2596 ../src/common/config.py:86 ../src/common/config.py:395 +#: ../src/common/optparser.py:194 ../src/common/optparser.py:412 +#: ../src/common/optparser.py:446 +#, fuzzy +msgid "default" +msgstr "Default" + +#: ../src/gajim.py:2683 +msgid "Network Manager support not available" +msgstr "Network Manager support not available" + +#: ../src/gajim.py:2784 +msgid "Session Management support not available (missing gnome.ui module)" +msgstr "Session Management support not available (missing gnome.ui module)" + +#: ../src/gajim-remote.py:65 +msgid "Shows a help on specific command" +msgstr "Shows a help on specific command" + +#. User gets help for the command, specified by this parameter +#: ../src/gajim-remote.py:68 +msgid "command" +msgstr "command" + +#: ../src/gajim-remote.py:69 +msgid "show help on command" +msgstr "show help on command" + +#: ../src/gajim-remote.py:73 +msgid "Shows or hides the roster window" +msgstr "Shows or hides the roster window" + +#: ../src/gajim-remote.py:77 +msgid "Pops up a window with the next pending event" +msgstr "Pops up a window with the next pending event" + +#: ../src/gajim-remote.py:81 +msgid "" +"Prints a list of all contacts in the roster. Each contact appears on a " +"separate line" +msgstr "" +"Prints a list of all contacts in the roster. Each contact appears on a " +"separate line" + +#: ../src/gajim-remote.py:84 ../src/gajim-remote.py:99 +#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:122 +#: ../src/gajim-remote.py:136 ../src/gajim-remote.py:145 +#: ../src/gajim-remote.py:166 ../src/gajim-remote.py:196 +#: ../src/gajim-remote.py:205 ../src/gajim-remote.py:212 +#: ../src/gajim-remote.py:219 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:246 ../src/gajim-remote.py:255 +msgid "account" +msgstr "account" + +#: ../src/gajim-remote.py:84 +msgid "show only contacts of the given account" +msgstr "show only contacts of the given account" + +#: ../src/gajim-remote.py:90 +msgid "Prints a list of registered accounts" +msgstr "Prints a list of registered accounts" + +#: ../src/gajim-remote.py:94 +msgid "Changes the status of account or accounts" +msgstr "Changes the status of account or accounts" + +#. offline, online, chat, away, xa, dnd, invisible should not be translated +#: ../src/gajim-remote.py:97 +msgid "status" +msgstr "status" + +#: ../src/gajim-remote.py:97 +msgid "one of: offline, online, chat, away, xa, dnd, invisible " +msgstr "one of: offline, online, chat, away, xa, dnd, invisible " + +#: ../src/gajim-remote.py:98 ../src/gajim-remote.py:119 +#: ../src/gajim-remote.py:133 ../src/gajim-remote.py:144 +msgid "message" +msgstr "message" + +#: ../src/gajim-remote.py:98 +msgid "status message" +msgstr "status message" + +#: ../src/gajim-remote.py:99 +msgid "" +"change status of account \"account\". If not specified, try to change status " +"of all accounts that have \"sync with global status\" option set" +msgstr "" +"change status of account \"account\". If not specified, try to change status " +"of all accounts that have \"sync with global status\" option set" + +#: ../src/gajim-remote.py:105 +msgid "Shows the chat dialog so that you can send messages to a contact" +msgstr "Shows the chat dialogue so that you can send messages to a contact" + +#: ../src/gajim-remote.py:107 +msgid "JID of the contact that you want to chat with" +msgstr "JID of the contact that you want to chat with" + +#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:196 +msgid "if specified, contact is taken from the contact list of this account" +msgstr "if specified, contact is taken from the contact list of this account" + +#: ../src/gajim-remote.py:114 +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 " +"key', just set 'OpenPGP key' to ''." +msgstr "" +"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 " +"key', just set 'OpenPGP key' to ''." + +#: ../src/gajim-remote.py:118 ../src/gajim-remote.py:131 +msgid "JID of the contact that will receive the message" +msgstr "JID of the contact that will receive the message" + +#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:144 +msgid "message contents" +msgstr "message contents" + +#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 +msgid "pgp key" +msgstr "pgp key" + +#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 +msgid "if specified, the message will be encrypted using this public key" +msgstr "if specified, the message will be encrypted using this public key" + +#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:136 +#: ../src/gajim-remote.py:145 +msgid "if specified, the message will be sent using this account" +msgstr "if specified, the message will be sent using this account" + +#: ../src/gajim-remote.py:127 +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 " +"key', just set 'OpenPGP key' to ''." +msgstr "" +"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 " +"key', just set 'OpenPGP key' to ''." + +#: ../src/gajim-remote.py:132 +msgid "subject" +msgstr "subject" + +#: ../src/gajim-remote.py:132 +msgid "message subject" +msgstr "message subject" + +#: ../src/gajim-remote.py:141 +msgid "Sends new message to a groupchat you've joined." +msgstr "" + +#: ../src/gajim-remote.py:143 +#, fuzzy +msgid "JID of the room that will receive the message" +msgstr "JID of the contact that will receive the message" + +#: ../src/gajim-remote.py:150 +msgid "Gets detailed info on a contact" +msgstr "Gets detailed info on a contact" + +#: ../src/gajim-remote.py:152 ../src/gajim-remote.py:165 +#: ../src/gajim-remote.py:195 ../src/gajim-remote.py:204 +msgid "JID of the contact" +msgstr "JID of the contact" + +#: ../src/gajim-remote.py:156 +msgid "Gets detailed info on a account" +msgstr "Gets detailed info on a account" + +#: ../src/gajim-remote.py:158 +msgid "Name of the account" +msgstr "Name of the account" + +#: ../src/gajim-remote.py:162 +msgid "Sends file to a contact" +msgstr "Sends file to a contact" + +#: ../src/gajim-remote.py:164 +msgid "file" +msgstr "file" + +#: ../src/gajim-remote.py:164 +msgid "File path" +msgstr "File path" + +#: ../src/gajim-remote.py:166 +msgid "if specified, file will be sent using this account" +msgstr "if specified, file will be sent using this account" + +#: ../src/gajim-remote.py:171 +msgid "Lists all preferences and their values" +msgstr "Lists all preferences and their values" + +#: ../src/gajim-remote.py:175 +msgid "Sets value of 'key' to 'value'." +msgstr "Sets value of 'key' to 'value'." + +#: ../src/gajim-remote.py:177 +msgid "key=value" +msgstr "key=value" + +#: ../src/gajim-remote.py:177 +msgid "'key' is the name of the preference, 'value' is the value to set it to" +msgstr "'key' is the name of the preference, 'value' is the value to set it to" + +#: ../src/gajim-remote.py:182 +msgid "Deletes a preference item" +msgstr "Deletes a preference item" + +#: ../src/gajim-remote.py:184 +msgid "key" +msgstr "key" + +#: ../src/gajim-remote.py:184 +msgid "name of the preference to be deleted" +msgstr "name of the preference to be deleted" + +#: ../src/gajim-remote.py:188 +msgid "Writes the current state of Gajim preferences to the .config file" +msgstr "Writes the current state of Gajim preferences to the .config file" + +#: ../src/gajim-remote.py:193 +msgid "Removes contact from roster" +msgstr "Removes contact from roster" + +#: ../src/gajim-remote.py:202 +msgid "Adds contact to roster" +msgstr "Adds contact to roster" + +#: ../src/gajim-remote.py:204 +msgid "jid" +msgstr "jid" + +#: ../src/gajim-remote.py:205 +msgid "Adds new contact to this account" +msgstr "Adds new contact to this account" + +#: ../src/gajim-remote.py:210 +msgid "Returns current status (the global one unless account is specified)" +msgstr "Returns current status (the global one unless account is specified)" + +#: ../src/gajim-remote.py:217 +msgid "" +"Returns current status message(the global one unless account is specified)" +msgstr "" +"Returns current status message(the global one unless account is specified)" + +#: ../src/gajim-remote.py:224 +msgid "Returns number of unread messages" +msgstr "Returns number of unread messages" + +#: ../src/gajim-remote.py:228 +msgid "Opens 'Start Chat' dialog" +msgstr "Opens 'Start Chat' dialogue" + +#: ../src/gajim-remote.py:230 +msgid "Starts chat, using this account" +msgstr "Starts chat, using this account" + +#: ../src/gajim-remote.py:234 +msgid "Sends custom XML" +msgstr "Sends custom XML" + +#: ../src/gajim-remote.py:236 +msgid "XML to send" +msgstr "XML to send" + +#: ../src/gajim-remote.py:237 +msgid "" +"Account in which the xml will be sent; if not specified, xml will be sent to " +"all accounts" +msgstr "" +"Account in which the xml will be sent; if not specified, xml will be sent to " +"all accounts" + +#: ../src/gajim-remote.py:243 +msgid "Handle a xmpp:/ uri" +msgstr "Handle a xmpp:/ uri" + +#: ../src/gajim-remote.py:245 +msgid "uri" +msgstr "uri" + +#: ../src/gajim-remote.py:250 +msgid "Join a MUC room" +msgstr "Join a MUC room" + +#: ../src/gajim-remote.py:252 +msgid "room" +msgstr "room" + +#: ../src/gajim-remote.py:253 +msgid "nick" +msgstr "nick" + +#: ../src/gajim-remote.py:254 +msgid "password" +msgstr "password" + +#: ../src/gajim-remote.py:277 +msgid "Missing argument \"contact_jid\"" +msgstr "Missing argument \"contact_jid\"" + +#: ../src/gajim-remote.py:296 +#, python-format +msgid "" +"'%s' is not in your roster.\n" +"Please specify account for sending the message." +msgstr "" +"'%s' is not in your roster.\n" +"Please specify account for sending the message." + +#: ../src/gajim-remote.py:299 +msgid "You have no active account" +msgstr "You have no active account" + +#: ../src/gajim-remote.py:363 +#, python-format +msgid "" +"Usage: %s %s %s \n" +"\t %s" +msgstr "" +"Usage: %s %s %s \n" +"\t %s" + +#: ../src/gajim-remote.py:366 +msgid "Arguments:" +msgstr "Arguments:" + +#: ../src/gajim-remote.py:370 +#, python-format +msgid "%s not found" +msgstr "%s not found" + +#: ../src/gajim-remote.py:374 +#, python-format +msgid "" +"Usage: %s command [arguments]\n" +"Command is one of:\n" +msgstr "" +"Usage: %s command [arguments]\n" +"Command is one of:\n" + +#: ../src/gajim-remote.py:447 +#, python-format +msgid "" +"Too many arguments. \n" +"Type \"%s help %s\" for more info" +msgstr "" +"Too many arguments. \n" +"Type \"%s help %s\" for more info" + +#: ../src/gajim-remote.py:451 +#, python-format +msgid "" +"Argument \"%s\" is not specified. \n" +"Type \"%s help %s\" for more info" +msgstr "" +"Argument \"%s\" is not specified. \n" +"Type \"%s help %s\" for more info" + +#: ../src/gajim-remote.py:469 +msgid "Wrong uri" +msgstr "Wrong uri" + +#: ../src/gajim_themes_window.py:62 +msgid "Theme" +msgstr "Theme" + +#: ../src/gajim_themes_window.py:100 +#, fuzzy +msgid "You cannot make changes to the default theme" +msgstr "You cannot delete your current theme" + +#: ../src/gajim_themes_window.py:101 +msgid "Please create a clean new theme with your desired name." +msgstr "" + +#. don't confuse translators +#: ../src/gajim_themes_window.py:175 +msgid "theme name" +msgstr "theme name" + +#: ../src/gajim_themes_window.py:192 +msgid "You cannot delete your current theme" +msgstr "You cannot delete your current theme" + +#: ../src/gajim_themes_window.py:193 +msgid "Please first choose another for your current theme." +msgstr "Please first choose another for your current theme." + +#: ../src/groupchat_control.py:134 +msgid "Sending private message failed" +msgstr "Sending private message failed" + +#. in second %s code replaces with nickname +#: ../src/groupchat_control.py:136 +#, python-format +msgid "You are no longer in group chat \"%s\" or \"%s\" has left." +msgstr "You are no longer in group chat \"%s\" or \"%s\" has left." + +#: ../src/groupchat_control.py:342 +msgid "Insert Nickname" +msgstr "Insert Nickname" + +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/groupchat_control.py:916 +msgid "Room logging is enabled" +msgstr "" + +#: ../src/groupchat_control.py:918 +#, fuzzy +msgid "A new room has been created" +msgstr "Your new account has been successfully created" + +#: ../src/groupchat_control.py:921 +msgid "The server has assigned or modified your roomnick" +msgstr "" + +#. do not print 'kicked by None' +#: ../src/groupchat_control.py:927 +#, python-format +msgid "%(nick)s has been kicked: %(reason)s" +msgstr "%(nick)s has been kicked: %(reason)s" + +#: ../src/groupchat_control.py:931 +#, python-format +msgid "%(nick)s has been kicked by %(who)s: %(reason)s" +msgstr "%(nick)s has been kicked by %(who)s: %(reason)s" + +#. do not print 'banned by None' +#: ../src/groupchat_control.py:938 +#, python-format +msgid "%(nick)s has been banned: %(reason)s" +msgstr "%(nick)s has been banned: %(reason)s" + +#: ../src/groupchat_control.py:942 +#, python-format +msgid "%(nick)s has been banned by %(who)s: %(reason)s" +msgstr "%(nick)s has been banned by %(who)s: %(reason)s" + +#. Someone changed his or her nick +#. We changed our nick +#: ../src/groupchat_control.py:949 +#, python-format +msgid "You are now known as %s" +msgstr "You are now known as %s" + +#: ../src/groupchat_control.py:951 +#, python-format +msgid "%s is now known as %s" +msgstr "%s is now known as %s" + +#: ../src/groupchat_control.py:984 ../src/groupchat_control.py:988 +#: ../src/groupchat_control.py:993 +#, fuzzy, python-format +msgid "%(nick)s has been removed from the room (%(reason)s)" +msgstr "%(nick)s has been kicked by %(who)s: %(reason)s" + +#: ../src/groupchat_control.py:985 +#, fuzzy +msgid "affiliation changed" +msgstr "Affiliation:" + +#: ../src/groupchat_control.py:990 +msgid "room configuration changed to members-only" +msgstr "" + +#: ../src/groupchat_control.py:995 +msgid "system shutdown" +msgstr "" + +#: ../src/groupchat_control.py:1094 +#, python-format +msgid "%s has left" +msgstr "%s has left" + +#: ../src/groupchat_control.py:1099 +#, python-format +msgid "%s has joined the group chat" +msgstr "%s has joined the group chat" + +#. Invalid Nickname +#. invalid char +#: ../src/groupchat_control.py:1212 ../src/groupchat_control.py:1491 +#, fuzzy +msgid "Invalid nickname" +msgstr "Invalid username" + +#: ../src/groupchat_control.py:1213 ../src/groupchat_control.py:1492 +#, fuzzy +msgid "The nickname has not allowed characters." +msgstr "The group chat Jabber ID has invalid characters." + +#: ../src/groupchat_control.py:1236 ../src/groupchat_control.py:1254 +#: ../src/groupchat_control.py:1338 ../src/groupchat_control.py:1355 +#, python-format +msgid "Nickname not found: %s" +msgstr "Nickname not found: %s" + +#: ../src/groupchat_control.py:1270 +msgid "This group chat has no subject" +msgstr "This group chat has no subject" + +#: ../src/groupchat_control.py:1281 +#, python-format +msgid "Invited %(contact_jid)s to %(room_jid)s." +msgstr "Invited %(contact_jid)s to %(room_jid)s." + +#: ../src/groupchat_control.py:1418 +#, python-format +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. Does " +"NOT support spaces in nickname." +msgstr "" +"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. Does " +"NOT support spaces in nickname." + +#: ../src/groupchat_control.py:1425 +#, python-format +msgid "" +"Usage: /%s , opens a private chat window with the specified " +"occupant." +msgstr "" +"Usage: /%s , opens a private chat window with the specified " +"occupant." + +#: ../src/groupchat_control.py:1431 +#, python-format +msgid "" +"Usage: /%s [reason], closes the current window or tab, displaying reason if " +"specified." +msgstr "" +"Usage: /%s [reason], closes the current window or tab, displaying reason if " +"specified." + +#: ../src/groupchat_control.py:1437 +#, python-format +msgid "" +"Usage: /%s [reason], invites JID to the current group chat, optionally " +"providing a reason." +msgstr "" +"Usage: /%s [reason], invites JID to the current group chat, optionally " +"providing a reason." + +#: ../src/groupchat_control.py:1441 +#, python-format +msgid "" +"Usage: /%s @[/nickname], offers to join room@server optionally " +"using specified nickname." +msgstr "" +"Usage: /%s @[/nickname], offers to join room@server optionally " +"using specified nickname." + +#: ../src/groupchat_control.py:1445 +#, python-format +msgid "" +"Usage: /%s [reason], removes the occupant specified by nickname " +"from the group chat and optionally displays a reason. Does NOT support " +"spaces in nickname." +msgstr "" +"Usage: /%s [reason], removes the occupant specified by nickname " +"from the group chat and optionally displays a reason. Does NOT support " +"spaces in nickname." + +#: ../src/groupchat_control.py:1454 +#, python-format +msgid "" +"Usage: /%s [message], opens a private message window and sends " +"message to the occupant specified by nickname." +msgstr "" +"Usage: /%s [message], opens a private message window and sends " +"message to the occupant specified by nickname." + +#: ../src/groupchat_control.py:1459 +#, python-format +msgid "Usage: /%s , changes your nickname in current group chat." +msgstr "Usage: /%s , changes your nickname in current group chat." + +#: ../src/groupchat_control.py:1463 +#, python-format +msgid "Usage: /%s , display the names of group chat occupants." +msgstr "Usage: /%s , display the names of group chat occupants." + +#: ../src/groupchat_control.py:1467 +#, python-format +msgid "Usage: /%s [topic], displays or updates the current group chat topic." +msgstr "Usage: /%s [topic], displays or updates the current group chat topic." + +#: ../src/groupchat_control.py:1470 +#, python-format +msgid "" +"Usage: /%s , sends a message without looking for other commands." +msgstr "" +"Usage: /%s , sends a message without looking for other commands." + +#: ../src/groupchat_control.py:1565 +#, python-format +msgid "Are you sure you want to leave group chat \"%s\"?" +msgstr "Are you sure you want to leave group chat \"%s\"?" + +#: ../src/groupchat_control.py:1567 +msgid "" +"If you close this window, you will be disconnected from this group chat." +msgstr "" +"If you close this window, you will be disconnected from this group chat." + +#: ../src/groupchat_control.py:1571 ../src/roster_window.py:4836 +msgid "Do _not ask me again" +msgstr "Do _not ask me again" + +#: ../src/groupchat_control.py:1605 +msgid "Changing Subject" +msgstr "Changing Subject" + +#: ../src/groupchat_control.py:1606 +msgid "Please specify the new subject:" +msgstr "Please specify the new subject:" + +#: ../src/groupchat_control.py:1615 +msgid "Changing Nickname" +msgstr "Changing Nickname" + +#: ../src/groupchat_control.py:1616 +msgid "Please specify the new nickname you want to use:" +msgstr "Please specify the new nickname you want to use:" + +#. Ask for a reason +#: ../src/groupchat_control.py:1631 +#, fuzzy, python-format +msgid "Destroying %s" +msgstr "Description: %s" + +#: ../src/groupchat_control.py:1632 +msgid "" +"You are going to definitively destroy this room.\n" +"You may specify a reason below:" +msgstr "" + +#: ../src/groupchat_control.py:1634 +msgid "You may also enter an alternate venue:" +msgstr "" + +#: ../src/groupchat_control.py:1665 +msgid "Bookmark already set" +msgstr "Bookmark already set" + +#: ../src/groupchat_control.py:1666 +#, python-format +msgid "Group Chat \"%s\" is already in your bookmarks." +msgstr "Group Chat \"%s\" is already in your bookmarks." + +#: ../src/groupchat_control.py:1675 +msgid "Bookmark has been added successfully" +msgstr "Bookmark has been added successfully" + +#: ../src/groupchat_control.py:1676 +msgid "You can manage your bookmarks via Actions menu in your roster." +msgstr "You can manage your bookmarks via Actions menu in your roster." + +#. ask for reason +#: ../src/groupchat_control.py:1828 +#, python-format +msgid "Kicking %s" +msgstr "Kicking %s" + +#: ../src/groupchat_control.py:1829 ../src/groupchat_control.py:2129 +msgid "You may specify a reason below:" +msgstr "You may specify a reason below:" + +#. ask for reason +#: ../src/groupchat_control.py:2128 +#, python-format +msgid "Banning %s" +msgstr "Banning %s" + +#: ../src/gtkexcepthook.py:41 +msgid "A programming error has been detected" +msgstr "A programming error has been detected" + +#: ../src/gtkexcepthook.py:42 +msgid "" +"It probably is not fatal, but should be reported to the developers " +"nonetheless." +msgstr "" +"It is probably not fatal, but should be reported to the developers " +"nonetheless." + +#: ../src/gtkexcepthook.py:48 +msgid "_Report Bug" +msgstr "_Report Bug" + +#: ../src/gtkexcepthook.py:71 +msgid "Details" +msgstr "Details" + +#. we talk about file +#: ../src/gtkgui_helpers.py:157 ../src/gtkgui_helpers.py:172 +#, python-format +msgid "Error: cannot open %s for reading" +msgstr "Error: cannot open %s for reading" + +#: ../src/gtkgui_helpers.py:337 +msgid "Error reading file:" +msgstr "Error reading file:" + +#: ../src/gtkgui_helpers.py:340 +msgid "Error parsing file:" +msgstr "Error parsing file:" + +#. do not traceback (could be a permission problem) +#. we talk about a file here +#: ../src/gtkgui_helpers.py:377 +#, python-format +msgid "Could not write to %s. Session Management support will not work" +msgstr "Could not write to %s. Session Management support will not work" + +#. xmpp: is currently handled by another program, so ask the user +#: ../src/gtkgui_helpers.py:711 +msgid "Gajim is not the default Jabber client" +msgstr "Gajim is not the default Jabber client" + +#: ../src/gtkgui_helpers.py:712 +msgid "Would you like to make Gajim the default Jabber client?" +msgstr "Would you like to make Gajim the default Jabber client?" + +#: ../src/gtkgui_helpers.py:713 +msgid "Always check to see if Gajim is the default Jabber client on startup" +msgstr "Always check to see if Gajim is the default Jabber client on startup" + +#: ../src/gtkgui_helpers.py:812 +msgid "Extension not supported" +msgstr "Extension not supported" + +#: ../src/gtkgui_helpers.py:813 +#, python-format +msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" +msgstr "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" + +#: ../src/gtkgui_helpers.py:822 +msgid "Save Image as..." +msgstr "Save Image as..." + +#: ../src/history_manager.py:68 +msgid "Cannot find history logs database" +msgstr "Cannot find history logs database" + +#. holds jid +#: ../src/history_manager.py:108 +msgid "Contacts" +msgstr "Contacts" + +#. holds time +#: ../src/history_manager.py:121 ../src/history_manager.py:161 +#: ../src/history_window.py:116 +msgid "Date" +msgstr "Date" + +#. holds nickname +#: ../src/history_manager.py:127 ../src/history_manager.py:179 +msgid "Nickname" +msgstr "Nickname" + +#. holds message +#: ../src/history_manager.py:135 ../src/history_manager.py:167 +#: ../src/history_window.py:124 +msgid "Message" +msgstr "Message" + +#: ../src/history_manager.py:187 +msgid "" +"Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " +"RUNNING)" +msgstr "" +"Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " +"RUNNING)" + +#: ../src/history_manager.py:189 +msgid "" +"Normally allocated database size will not be freed, it will just become " +"reusable. If you really want to reduce database filesize, click YES, else " +"click NO.\n" +"\n" +"In case you click YES, please wait..." +msgstr "" +"Normally allocated database size will not be freed, it will just become " +"reusable. If you really want to reduce database filesize, click YES, " +"otherwise click NO.\n" +"\n" +"In case you click YES, please wait..." + +#: ../src/history_manager.py:401 +msgid "Exporting History Logs..." +msgstr "Exporting History Logs..." + +#: ../src/history_manager.py:476 +#, python-format +msgid "%(who)s on %(time)s said: %(message)s\n" +msgstr "%(who)s on %(time)s said: %(message)s\n" + +#: ../src/history_manager.py:514 +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] "Do you really want to delete the logs of the selected contact?" +msgstr[1] "Do you really want to delete the logs of the selected contacts?" + +#: ../src/history_manager.py:518 ../src/history_manager.py:554 +msgid "This is an irreversible operation." +msgstr "This is an irreversible operation." + +#: ../src/history_manager.py:551 +msgid "Do you really want to delete the selected message?" +msgid_plural "Do you really want to delete the selected messages?" +msgstr[0] "Do you really want to delete the selected message?" +msgstr[1] "Do you really want to delete the selected messages?" + +#: ../src/history_window.py:185 ../src/history_window.py:187 +#, python-format +msgid "Conversation History with %s" +msgstr "Conversation History with %s" + +#: ../src/history_window.py:332 +#, python-format +msgid "%(nick)s is now %(status)s: %(status_msg)s" +msgstr "%(nick)s is now %(status)s: %(status_msg)s" + +#: ../src/history_window.py:336 ../src/notify.py:206 +#, python-format +msgid "%(nick)s is now %(status)s" +msgstr "%(nick)s is now %(status)s" + +#: ../src/history_window.py:342 +#, python-format +msgid "Status is now: %(status)s: %(status_msg)s" +msgstr "Status is now: %(status)s: %(status_msg)s" + +#: ../src/history_window.py:345 +#, python-format +msgid "Status is now: %(status)s" +msgstr "Status is now: %(status)s" + +#: ../src/htmltextview.py:583 ../src/htmltextview.py:594 +#, fuzzy +msgid "Timeout loading image" +msgstr "Could not load image" + +#: ../src/htmltextview.py:604 +msgid "Image is too big" +msgstr "" + +#: ../src/message_window.py:288 +msgid "Chats" +msgstr "Chats" + +#: ../src/message_window.py:290 +msgid "Group Chats" +msgstr "Group Chats" + +#: ../src/message_window.py:292 +msgid "Private Chats" +msgstr "Private Chats" + +#: ../src/message_window.py:294 +msgid "Messages" +msgstr "Messages" + +#: ../src/message_window.py:295 +#, python-format +msgid "%s - Gajim" +msgstr "%s - Gajim" + +#: ../src/notify.py:204 +#, python-format +msgid "%(nick)s Changed Status" +msgstr "%(nick)s Changed Status" + +#: ../src/notify.py:214 +#, python-format +msgid "%(nickname)s Signed In" +msgstr "%(nickname)s Signed In" + +#: ../src/notify.py:222 +#, python-format +msgid "%(nickname)s Signed Out" +msgstr "%(nickname)s Signed Out" + +#: ../src/notify.py:234 +#, python-format +msgid "New Single Message from %(nickname)s" +msgstr "New Single Message from %(nickname)s" + +#: ../src/notify.py:242 +#, python-format +msgid "New Private Message from group chat %s" +msgstr "New Private Message from group chat %s" + +#: ../src/notify.py:244 +#, python-format +msgid "%(nickname)s: %(message)s" +msgstr "%(nickname)s: %(message)s" + +#: ../src/notify.py:247 +#, fuzzy, python-format +msgid "Messaged by %(nickname)s" +msgstr "New Message from %(nickname)s" + +#: ../src/notify.py:253 +#, python-format +msgid "New Message from %(nickname)s" +msgstr "New Message from %(nickname)s" + +#: ../src/profile_window.py:72 +msgid "Retrieving profile..." +msgstr "Retrieving profile..." + +#: ../src/profile_window.py:123 ../src/roster_window.py:1882 +#, fuzzy +msgid "File is empty" +msgstr "File path" + +#: ../src/profile_window.py:126 ../src/roster_window.py:1885 +#, fuzzy +msgid "File does not exist" +msgstr "Such group chat does not exist." + +#. keep identation +#. unknown format +#: ../src/profile_window.py:140 ../src/profile_window.py:156 +#: ../src/roster_window.py:1887 ../src/roster_window.py:1898 +msgid "Could not load image" +msgstr "Could not load image" + +#: ../src/profile_window.py:257 +msgid "Information received" +msgstr "Information received" + +#: ../src/profile_window.py:326 +msgid "Without a connection you can not publish your contact information." +msgstr "Without a connection you can not publish your contact information." + +#: ../src/profile_window.py:338 +msgid "Sending profile..." +msgstr "Sending profile..." + +#: ../src/profile_window.py:353 +msgid "Information NOT published" +msgstr "Information NOT published" + +#: ../src/profile_window.py:360 +msgid "vCard publication failed" +msgstr "vCard publication failed" + +#: ../src/profile_window.py:361 +msgid "" +"There was an error while publishing your personal information, try again " +"later." +msgstr "" +"There was an error while publishing your personal information, try again " +"later." + +#: ../src/roster_window.py:182 ../src/roster_window.py:237 +msgid "Merged accounts" +msgstr "Apjungtos prieigos" + +#: ../src/roster_window.py:357 ../src/roster_window.py:622 +#: ../src/roster_window.py:2110 ../src/common/contacts.py:307 +#: ../src/common/helpers.py:44 +msgid "Observers" +msgstr "Observers" + +#. Make special context menu if group is Groupchats +#: ../src/roster_window.py:441 ../src/roster_window.py:446 +#: ../src/roster_window.py:1935 ../src/roster_window.py:1938 +#: ../src/roster_window.py:2607 ../src/roster_window.py:2610 +#: ../src/roster_window.py:2635 ../src/roster_window.py:4696 +#: ../src/roster_window.py:4698 ../src/common/commands.py:194 +#: ../src/common/contacts.py:97 ../src/common/helpers.py:44 +msgid "Groupchats" +msgstr "Groupchats" + +#: ../src/roster_window.py:771 ../src/roster_window.py:3952 +msgid "You cannot join a group chat while you are invisible" +msgstr "You cannot join a group chat while you are invisible" + +#. new chat +#. single message +#. for chat_with +#. for single message +#. join gc +#: ../src/roster_window.py:984 ../src/roster_window.py:994 +#: ../src/roster_window.py:1003 ../src/systray.py:207 ../src/systray.py:212 +#: ../src/systray.py:218 +#, python-format +msgid "using account %s" +msgstr "using account %s" + +#. add +#: ../src/roster_window.py:1010 +#, python-format +msgid "to %s account" +msgstr "to %s account" + +#. disco +#: ../src/roster_window.py:1015 +#, python-format +msgid "using %s account" +msgstr "using %s account" + +#: ../src/roster_window.py:1096 +msgid "_Manage Bookmarks..." +msgstr "_Manage Bookmarks..." + +#. profile, avatar +#: ../src/roster_window.py:1115 +#, python-format +msgid "of account %s" +msgstr "of account %s" + +#: ../src/roster_window.py:1155 +#, python-format +msgid "for account %s" +msgstr "for account %s" + +#. History manager +#: ../src/roster_window.py:1176 +msgid "History Manager" +msgstr "History Manager" + +#: ../src/roster_window.py:1185 +msgid "_Join New Group Chat" +msgstr "_Join New Group Chat" + +#: ../src/roster_window.py:1544 ../src/roster_window.py:4150 +#: ../src/roster_window.py:4157 +msgid "You have unread messages" +msgstr "You have unread messages" + +#: ../src/roster_window.py:1545 +msgid "You must read them before removing this transport." +msgstr "You must read them before removing this transport." + +#: ../src/roster_window.py:1548 +#, python-format +msgid "Transport \"%s\" will be removed" +msgstr "Transport \"%s\" will be removed" + +#: ../src/roster_window.py:1549 +msgid "" +"You will no longer be able to send and receive messages from contacts using " +"this transport." +msgstr "" +"You will no longer be able to send and receive messages from contacts using " +"this transport." + +#: ../src/roster_window.py:1552 +msgid "Transports will be removed" +msgstr "Transports will be removed" + +#: ../src/roster_window.py:1557 +#, python-format +msgid "" +"You will no longer be able to send and receive messages to contacts from " +"these transports:%s" +msgstr "" +"You will no longer be able to send and receive messages to contacts from " +"these transports:%s" + +#. it's jid +#: ../src/roster_window.py:1723 +msgid "Rename Contact" +msgstr "Rename Contact" + +#: ../src/roster_window.py:1724 +#, python-format +msgid "Enter a new nickname for contact %s" +msgstr "Enter a new nickname for contact %s" + +#: ../src/roster_window.py:1731 +msgid "Rename Group" +msgstr "Rename Group" + +#: ../src/roster_window.py:1732 +#, python-format +msgid "Enter a new name for group %s" +msgstr "Enter a new name for group %s" + +#: ../src/roster_window.py:1807 +msgid "Remove Group" +msgstr "Remove Group" + +#: ../src/roster_window.py:1808 +#, python-format +msgid "Do you want to remove group %s from the roster?" +msgstr "Do you want to remove group %s from the roster?" + +#: ../src/roster_window.py:1809 +msgid "Remove also all contacts in this group from your roster" +msgstr "Remove also all contacts in this group from your roster" + +#: ../src/roster_window.py:1840 +msgid "Assign OpenPGP Key" +msgstr "Assign OpenPGP Key" + +#: ../src/roster_window.py:1841 +msgid "Select a key to apply to the contact" +msgstr "Select a key to apply to the contact" + +#: ../src/roster_window.py:2156 +#, fuzzy +msgid "_New Group Chat" +msgstr "New Group Chat" + +#: ../src/roster_window.py:2298 +msgid "I would like to add you to my roster" +msgstr "I would like to add you to my roster" + +#. Send Group Message +#: ../src/roster_window.py:2432 ../src/roster_window.py:2644 +msgid "Send Group M_essage" +msgstr "Send Group M_essage" + +#: ../src/roster_window.py:2451 +msgid "_New group chat" +msgstr "_New group chat" + +#. Manage Transport submenu +#: ../src/roster_window.py:2489 +#, fuzzy +msgid "_Manage Contacts" +msgstr "Rename Contact" + +#: ../src/roster_window.py:2550 +msgid "_Maximize" +msgstr "" + +#: ../src/roster_window.py:2557 +#, fuzzy +msgid "_Disconnect" +msgstr "Contact Disconnected" + +#: ../src/roster_window.py:2636 +msgid "_Maximize All" +msgstr "" + +#: ../src/roster_window.py:2652 +msgid "To all users" +msgstr "Visiems" + +#: ../src/roster_window.py:2655 +msgid "To all online users" +msgstr "Visiems prisijungusiems" + +#. Log Off +#: ../src/roster_window.py:2772 +#, fuzzy +msgid "_Log off" +msgstr "_Atsijungti" + +#. Log on +#: ../src/roster_window.py:2778 +msgid "_Log on" +msgstr "_Prisijungti" + +#. Send single message +#: ../src/roster_window.py:2790 +#, fuzzy +msgid "Send Single Message" +msgstr "_Siųsti vieną žinutę" + +#. Manage Transport submenu +#: ../src/roster_window.py:2837 +#, fuzzy +msgid "_Manage Transport" +msgstr "Transports" + +#. Modify Transport +#: ../src/roster_window.py:2845 +#, fuzzy +msgid "_Modify Transport" +msgstr "Rodyti _Pernašas" + +#. Information +#: ../src/roster_window.py:2882 +#, fuzzy +msgid "_Information" +msgstr "Asmens Informacija" + +#: ../src/roster_window.py:2959 ../src/roster_window.py:3033 +msgid "_Change Status Message" +msgstr "_Keisti Būklės Žinutę" + +#: ../src/roster_window.py:3105 +msgid "Authorization has been sent" +msgstr "Authorisation has been sent" + +#: ../src/roster_window.py:3106 +#, python-format +msgid "Now \"%s\" will know your status." +msgstr "Dabar \"%s\" žinos apie jūsų būklę." + +#: ../src/roster_window.py:3126 +msgid "Subscription request has been sent" +msgstr "Subscription request has been sent" + +#: ../src/roster_window.py:3127 +#, python-format +msgid "If \"%s\" accepts this request you will know his or her status." +msgstr "If \"%s\" accepts this request you will know his or her status." + +#: ../src/roster_window.py:3139 +msgid "Authorization has been removed" +msgstr "Authorisation has been removed" + +#: ../src/roster_window.py:3140 +#, python-format +msgid "Now \"%s\" will always see you as offline." +msgstr "Now \"%s\" will always see you as offline." + +#: ../src/roster_window.py:3338 +#, python-format +msgid "Contact \"%s\" will be removed from your roster" +msgstr "Contact \"%s\" will be removed from your roster" + +#: ../src/roster_window.py:3342 +msgid "" +"By removing this contact you also remove authorization resulting in him or " +"her always seeing you as offline." +msgstr "" +"By removing this contact you also remove authorisation resulting in him or " +"her always seeing you as offline." + +#: ../src/roster_window.py:3347 +msgid "" +"By removing this contact you also by default remove authorization resulting " +"in him or her always seeing you as offline." +msgstr "" +"By removing this contact you also by default remove authorisation resulting " +"in him or her always seeing you as offline." + +#: ../src/roster_window.py:3350 +msgid "I want this contact to know my status after removal" +msgstr "I want this contact to know my status after removal" + +#. several contact to remove at the same time +#: ../src/roster_window.py:3354 +msgid "Contacts will be removed from your roster" +msgstr "Contacts will be removed from your roster" + +#: ../src/roster_window.py:3358 +#, python-format +msgid "" +"By removing these contacts:%s\n" +"you also remove authorization resulting in them always seeing you as offline." +msgstr "" +"By removing these contacts:%s\n" +"you also remove authorisation resulting in them always seeing you as offline." + +#: ../src/roster_window.py:3390 +#, fuzzy +msgid "" +"Gnome Keyring is installed but not correctly started (environment variable " +"probably not correctly set)" +msgstr "" +"Gnomekeyring is installed but not correctly started (environment variable " +"probably not correctly set)" + +#: ../src/roster_window.py:3417 +msgid "GPG is not usable" +msgstr "" + +#. %s is the account name here +#: ../src/roster_window.py:3417 ../src/common/connection.py:684 +#: ../src/common/zeroconf/connection_zeroconf.py:165 +#, python-format +msgid "You will be connected to %s without OpenPGP." +msgstr "You will be connected to %s without OpenPGP." + +#: ../src/roster_window.py:3434 +msgid "Passphrase Required" +msgstr "Passphrase Required" + +#: ../src/roster_window.py:3435 +#, python-format +msgid "Enter GPG key passphrase for account %s." +msgstr "Enter GPG key passphrase for account %s." + +#: ../src/roster_window.py:3440 +msgid "Save passphrase" +msgstr "Save passphrase" + +#: ../src/roster_window.py:3448 +msgid "Wrong Passphrase" +msgstr "Wrong Passphrase" + +#: ../src/roster_window.py:3449 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "Please retype your GPG passphrase or press Cancel." + +#: ../src/roster_window.py:3532 ../src/roster_window.py:3609 +msgid "You are participating in one or more group chats" +msgstr "You are participating in one or more group chats" + +#: ../src/roster_window.py:3533 ../src/roster_window.py:3610 +msgid "" +"Changing your status to invisible will result in disconnection from those " +"group chats. Are you sure you want to go invisible?" +msgstr "" +"Changing your status to invisible will result in disconnection from those " +"group chats. Are you sure you want to go invisible?" + +#: ../src/roster_window.py:3567 +msgid "No account available" +msgstr "No account available" + +#: ../src/roster_window.py:3568 +msgid "You must create an account before you can chat with other contacts." +msgstr "You must create an account before you can chat with other contacts." + +#: ../src/roster_window.py:3696 +#, python-format +msgid "\"%(title)s\" by %(artist)s" +msgstr "\"%(title)s\" by %(artist)s" + +#: ../src/roster_window.py:4151 ../src/roster_window.py:4158 +msgid "" +"Messages will only be available for reading them later if you have history " +"enabled." +msgstr "" +"Messages will only be available for reading them later if you have history " +"enabled." + +#: ../src/roster_window.py:4782 +msgid "Metacontacts storage not supported by your server" +msgstr "Metacontacts storage not supported by your server" + +#: ../src/roster_window.py:4784 +#, fuzzy +msgid "" +"Your server does not support storing metacontacts information. So those " +"information will not be saved on next reconnection." +msgstr "" +"Your server does not support storing metacontacts information. So those " +"information will not be save on next reconnection." + +#: ../src/roster_window.py:4830 +msgid "" +"You are about to create a metacontact. Are you sure you want to continue?" +msgstr "" +"You are about to create a metacontact. Are you sure you want to continue?" + +#: ../src/roster_window.py:4832 +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 "" +"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." + +#: ../src/roster_window.py:4930 +#, fuzzy, python-format +msgid "Do you want to send that file to %s:" +msgid_plural "Do you want to send those files to %s:" +msgstr[0] "%s wants to send you a file:" +msgstr[1] "%s wants to send you a file:" + +#: ../src/roster_window.py:5212 +msgid "Change Status Message..." +msgstr "Change Status Message..." + +#: ../src/systray.py:164 +msgid "_Change Status Message..." +msgstr "_Change Status Message..." + +#: ../src/systray.py:249 +msgid "Hide this menu" +msgstr "Hide this menu" + +#: ../src/tooltips.py:310 ../src/tooltips.py:503 +msgid "Jabber ID: " +msgstr "Jabber ID: " + +#: ../src/tooltips.py:313 ../src/tooltips.py:507 +msgid "Resource: " +msgstr "Resource: " + +#: ../src/tooltips.py:318 +#, python-format +msgid "%(owner_or_admin_or_member)s of this group chat" +msgstr "%(owner_or_admin_or_member)s of this group chat" + +#: ../src/tooltips.py:416 +msgid " [blocked]" +msgstr "" + +#: ../src/tooltips.py:420 +msgid " [minimized]" +msgstr "" + +#: ../src/tooltips.py:435 ../src/tooltips.py:623 +msgid "Status: " +msgstr "Status: " + +#: ../src/tooltips.py:465 +#, python-format +msgid "Last status: %s" +msgstr "Last status: %s" + +#: ../src/tooltips.py:467 +#, python-format +msgid " since %s" +msgstr " since %s" + +#: ../src/tooltips.py:485 +#, fuzzy +msgid "Connected" +msgstr "Prisijungimas" + +#: ../src/tooltips.py:487 +#, fuzzy +msgid "Disconnected" +msgstr "Contact Disconnected" + +#. ('both' is the normal sub so we don't show it) +#: ../src/tooltips.py:514 +msgid "Subscription: " +msgstr "Subscription: " + +#: ../src/tooltips.py:524 +msgid "OpenPGP: " +msgstr "OpenPGP: " + +#: ../src/tooltips.py:579 +msgid "Download" +msgstr "Download" + +#: ../src/tooltips.py:585 +msgid "Upload" +msgstr "Upload" + +#: ../src/tooltips.py:592 +msgid "Type: " +msgstr "Type: " + +#: ../src/tooltips.py:598 +msgid "Transferred: " +msgstr "Transferred: " + +#: ../src/tooltips.py:601 ../src/tooltips.py:622 +msgid "Not started" +msgstr "Not started" + +#: ../src/tooltips.py:605 +msgid "Stopped" +msgstr "Stopped" + +#: ../src/tooltips.py:607 ../src/tooltips.py:610 +msgid "Completed" +msgstr "Completed" + +#: ../src/tooltips.py:614 +msgid "?transfer status:Paused" +msgstr "Paused" + +#. stalled is not paused. it is like 'frozen' it stopped alone +#: ../src/tooltips.py:618 +msgid "Stalled" +msgstr "Stalled" + +#: ../src/tooltips.py:620 +msgid "Transferring" +msgstr "Transferring" + +#: ../src/tooltips.py:652 +msgid "This service has not yet responded with detailed information" +msgstr "This service has not yet responded with detailed information" + +#: ../src/tooltips.py:655 +msgid "" +"This service could not respond with detailed information.\n" +"It is most likely legacy or broken" +msgstr "" +"This service could not respond with detailed information.\n" +"It is most likely legacy or broken" + +#: ../src/vcard.py:240 +msgid "?Client:Unknown" +msgstr "Unknown" + +#: ../src/vcard.py:242 +msgid "?OS:Unknown" +msgstr "Unknown" + +#: ../src/vcard.py:267 ../src/vcard.py:277 ../src/vcard.py:467 +#, python-format +msgid "since %s" +msgstr "since %s" + +#: ../src/vcard.py:306 +msgid "Affiliation:" +msgstr "Affiliation:" + +#: ../src/vcard.py:314 +msgid "" +"This contact is interested in your presence information, but you are not " +"interested in his/her presence" +msgstr "" +"This contact is interested in your presence information, but you are not " +"interested in his/her presence" + +#: ../src/vcard.py:316 +msgid "" +"You are interested in the contact's presence information, but he/she is not " +"interested in yours" +msgstr "" +"You are interested in the contact's presence information, but he/she is not " +"interested in yours" + +#: ../src/vcard.py:318 +msgid "You and the contact are interested in each other's presence information" +msgstr "" +"You and the contact are interested in each other's presence information" + +#. None +#: ../src/vcard.py:320 +msgid "" +"You are not interested in the contact's presence, and neither he/she is " +"interested in yours" +msgstr "" +"You are not interested in the contact's presence, and neither he/she is " +"interested in yours" + +#: ../src/vcard.py:328 +msgid "You are waiting contact's answer about your subscription request" +msgstr "You are waiting contact's answer about your subscription request" + +#: ../src/vcard.py:332 ../src/vcard.py:369 ../src/vcard.py:492 +msgid " resource with priority " +msgstr " resource with priority " + +#: ../src/common/check_paths.py:33 +msgid "creating logs database" +msgstr "creating logs database" + +#: ../src/common/check_paths.py:96 ../src/common/check_paths.py:107 +#: ../src/common/check_paths.py:114 +#, python-format +msgid "%s is a file but it should be a directory" +msgstr "%s is a file but it should be a directory" + +#: ../src/common/check_paths.py:97 ../src/common/check_paths.py:108 +#: ../src/common/check_paths.py:115 ../src/common/check_paths.py:123 +msgid "Gajim will now exit" +msgstr "Gajim will now exit" + +#: ../src/common/check_paths.py:122 +#, python-format +msgid "%s is a directory but should be a file" +msgstr "%s is a directory but should be a file" + +#: ../src/common/check_paths.py:138 +#, python-format +msgid "creating %s directory" +msgstr "creating %s directory" + +#: ../src/common/commands.py:69 +msgid "Change status information" +msgstr "Change status information" + +#: ../src/common/commands.py:82 +msgid "Change status" +msgstr "Change status" + +#: ../src/common/commands.py:83 +msgid "Set the presence type and description" +msgstr "Set the presence type and description" + +#: ../src/common/commands.py:89 +msgid "Free for chat" +msgstr "Free for chat" + +#: ../src/common/commands.py:90 +msgid "Online" +msgstr "Online" + +#: ../src/common/commands.py:92 +msgid "Extended away" +msgstr "Extended away" + +#: ../src/common/commands.py:93 +msgid "Do not disturb" +msgstr "Do not disturb" + +#: ../src/common/commands.py:94 +msgid "Offline - disconnect" +msgstr "Offline - disconnect" + +#: ../src/common/commands.py:99 +msgid "Presence description:" +msgstr "Presence description:" + +#: ../src/common/commands.py:134 +msgid "The status has been changed." +msgstr "The status has been changed." + +#: ../src/common/commands.py:179 +#, python-format +msgid "%(nickname)s on %(room_jid)s" +msgstr "%(nickname)s on %(room_jid)s" + +#: ../src/common/commands.py:183 +msgid "You have not joined a groupchat." +msgstr "You have not joined a groupchat." + +#: ../src/common/commands.py:189 +msgid "Leave Groupchats" +msgstr "Leave Groupchats" + +#: ../src/common/commands.py:190 +msgid "Choose the groupchats you want to leave" +msgstr "Choose the groupchats you want to leave" + +#: ../src/common/commands.py:230 +#, fuzzy +msgid "You left the following groupchats:" +msgstr "You left the following groupchats:" + +#: ../src/common/commands.py:242 +#, fuzzy +msgid "Forward unread messages" +msgstr " %d unread message" + +#: ../src/common/commands.py:262 +msgid "All unread messages have been forwarded." +msgstr "" + +#: ../src/common/config.py:58 +msgid "Use D-Bus and Notification-Daemon to show notifications" +msgstr "Use D-Bus and Notification-Daemon to show notifications" + +#: ../src/common/config.py:63 +msgid "Time in minutes, after which your status changes to away." +msgstr "Time in minutes, after which your status changes to away." + +#: ../src/common/config.py:64 +msgid "Away as a result of being idle" +msgstr "Away as a result of being idle" + +#: ../src/common/config.py:66 +msgid "Time in minutes, after which your status changes to not available." +msgstr "Time in minutes, after which your status changes to not available." + +#: ../src/common/config.py:67 +msgid "Not available as a result of being idle" +msgstr "Not available as a result of being idle" + +#: ../src/common/config.py:85 +msgid "" +"List (space separated) of rows (accounts and groups) that are collapsed." +msgstr "" +"List (space separated) of rows (accounts and groups) that are collapsed." + +#: ../src/common/config.py:90 +msgid "Enable link-local/zeroconf messaging" +msgstr "Enable link-local/zeroconf messaging" + +#: ../src/common/config.py:93 +msgid "Language used by speller" +msgstr "Language used by speller" + +#: ../src/common/config.py:94 +msgid "" +"'always' - print time for every message.\n" +"'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" +"'never' - never print time." +msgstr "" +"'always' - print time for every message.\n" +"'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" +"'never' - never print time." + +#: ../src/common/config.py:95 +msgid "" +"Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " +"to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " +"This is used only if print_time is 'sometimes'." +msgstr "" +"Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " +"to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " +"This is used only if print_time is 'sometimes'." + +#: ../src/common/config.py:98 +msgid "Treat * / _ pairs as possible formatting characters." +msgstr "Treat * / _ pairs as possible formatting characters." + +#: ../src/common/config.py:99 +msgid "" +"If True, do not remove */_ . So *abc* will be bold but with * * not removed." +msgstr "" +"If True, do not remove */_ . So *abc* will be bold but with * * not removed." + +#: ../src/common/config.py:102 +msgid "" +"Uses ReStructured text markup to send HTML, plus ascii formatting if " +"selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" +"restructuredtext.html (If you want to use this, install docutils)" +msgstr "" +"Uses ReStructured text markup to send HTML, plus ascii formatting if " +"selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" +"restructuredtext.html (If you want to use this, install docutils)" + +#: ../src/common/config.py:111 +msgid "" +"Character to add after nickname when using nick completion (tab) in group " +"chat." +msgstr "" +"Character to add after nickname when using nick completion (tab) in group " +"chat." + +#: ../src/common/config.py:112 +msgid "" +"Character to propose to add after desired nickname when desired nickname is " +"used by someone else in group chat." +msgstr "" +"Character to propose to add after desired nickname when desired nickname is " +"used by someone else in group chat." + +#: ../src/common/config.py:135 +msgid "" +"This option let you customize timestamp that is printed in conversation. For " +"exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " +"strftime for full documentation: http://docs.python.org/lib/module-time.html" +msgstr "" +"This option let you customize timestamp that is printed in conversation. For " +"exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " +"strftime for full documentation: http://docs.python.org/lib/module-time.html" + +#: ../src/common/config.py:136 +msgid "Characters that are printed before the nickname in conversations" +msgstr "Characters that are printed before the nickname in conversations" + +#: ../src/common/config.py:137 +msgid "Characters that are printed after the nickname in conversations" +msgstr "Characters that are printed after the nickname in conversations" + +#: ../src/common/config.py:144 +msgid "Add * and [n] in roster title?" +msgstr "Add * and [n] in roster title?" + +#: ../src/common/config.py:145 +msgid "" +"How many lines to remember from previous conversation when a chat tab/window " +"is reopened." +msgstr "" +"How many lines to remember from previous conversation when a chat tab/window " +"is reopened." + +#: ../src/common/config.py:146 +msgid "How many minutes should last lines from previous conversation last." +msgstr "How many minutes should last lines from previous conversation last." + +#: ../src/common/config.py:147 +msgid "" +"Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " +"Client default behaviour)." +msgstr "" +"Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " +"Client default behaviour)." + +#: ../src/common/config.py:149 +msgid "How many lines to store for Ctrl+KeyUP." +msgstr "How many lines to store for Ctrl+KeyUP." + +#: ../src/common/config.py:152 +#, python-format +msgid "" +"Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' " +"which means use wiktionary." +msgstr "" +"Either custom URL with %s in it where %s is the word/phrase or 'WIKTIONARY' " +"which means use wiktionary." + +#: ../src/common/config.py:155 +msgid "If checked, Gajim can be controlled remotely using gajim-remote." +msgstr "If ticked, Gajim can be controlled remotely using gajim-remote." + +#: ../src/common/config.py:156 +msgid "" +"If True, listen to D-Bus signals from NetworkManager and change the status " +"of accounts (provided they do not have listen_to_network_manager set to " +"False and they sync with global status) based upon the status of the network " +"connection." +msgstr "" +"If True, listen to D-Bus signals from NetworkManager and change the status " +"of accounts (provided they do not have listen_to_network_manager set to " +"False and they sync with global status) based upon the status of the network " +"connection." + +#: ../src/common/config.py:157 +msgid "" +"Sent chat state notifications. Can be one of all, composing_only, disabled." +msgstr "" +"Sent chat state notifications. Can be one of all, composing_only, disabled." + +#: ../src/common/config.py:158 +msgid "" +"Displayed chat state notifications in chat windows. Can be one of all, " +"composing_only, disabled." +msgstr "" +"Displayed chat state notifications in chat windows. Can be one of all, " +"composing_only, disabled." + +#: ../src/common/config.py:160 +msgid "" +"When not printing time for every message (print_time==sometimes), print it " +"every x minutes." +msgstr "" +"When not printing time for every message (print_time==sometimes), print it " +"every x minutes." + +#: ../src/common/config.py:161 +msgid "Ask before closing a group chat tab/window." +msgstr "Ask before closing a group chat tab/window." + +#: ../src/common/config.py:162 +msgid "" +"Always ask before closing group chat tab/window in this space separated list " +"of group chat jids." +msgstr "" +"Always ask before closing group chat tab/window in this space separated list " +"of group chat jids." + +#: ../src/common/config.py:163 +msgid "" +"Never ask before closing group chat tab/window in this space separated list " +"of group chat jids." +msgstr "" +"Never ask before closing group chat tab/window in this space separated list " +"of group chat jids." + +#: ../src/common/config.py:166 +#, fuzzy +msgid "" +"Comma separated list of hosts that we send, in addition of local interfaces, " +"for File Transfer in case of address translation/port forwarding." +msgstr "" +"Overrides the host we send for File Transfer in case of address translation/" +"port forwarding." + +#: ../src/common/config.py:168 +msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." +msgstr "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." + +#: ../src/common/config.py:170 +msgid "Notify of events in the system trayicon." +msgstr "Notify of events in the system trayicon." + +#: ../src/common/config.py:176 +msgid "Show tab when only one conversation?" +msgstr "Show tab when only one conversation?" + +#: ../src/common/config.py:177 +msgid "Show tabbed notebook border in chat windows?" +msgstr "Show tabbed notebook border in chat windows?" + +#: ../src/common/config.py:178 +msgid "Show close button in tab?" +msgstr "Show close button in tab?" + +#: ../src/common/config.py:179 +msgid "" +"When negotiating an encrypted session, should Gajim assume you want your " +"messages to be logged?" +msgstr "" + +#: ../src/common/config.py:188 +msgid "Preview new messages in notification popup?" +msgstr "" + +#: ../src/common/config.py:193 +msgid "" +"A semicolon-separated list of words that will be highlighted in group chats." +msgstr "" +"A semicolon-separated list of words that will be highlighted in group chats." + +#: ../src/common/config.py:194 +msgid "" +"If True, quits Gajim when X button of Window Manager is clicked. This " +"setting is taken into account only if trayicon is used." +msgstr "" +"If True, quits Gajim when X button of Window Manager is clicked. This " +"setting is taken into account only if trayicon is used." + +#: ../src/common/config.py:195 +msgid "" +"If True, Gajim will check if it's the default jabber client on each startup." +msgstr "" +"If True, Gajim will check if it's the default jabber client on each startup." + +#: ../src/common/config.py:196 +msgid "" +"If True, Gajim will display an icon on each tab containing unread messages. " +"Depending on the theme, this icon may be animated." +msgstr "" +"If True, Gajim will display an icon on each tab containing unread messages. " +"Depending on the theme, this icon may be animated." + +#: ../src/common/config.py:197 +msgid "" +"If True, Gajim will display the status message, if not empty, for every " +"contact under the contact name in roster window." +msgstr "" +"If True, Gajim will display the status message, if not empty, for every " +"contact under the contact name in roster window." + +#: ../src/common/config.py:199 +msgid "" +"If True, Gajim will ask for avatar each contact that did not have an avatar " +"last time or has one cached that is too old." +msgstr "" +"If True, Gajim will ask for avatar each contact that did not have an avatar " +"last time or has one cached that is too old." + +#: ../src/common/config.py:200 +msgid "" +"If False, Gajim will no longer print status line in chats when a contact " +"changes his or her status and/or his or her status message." +msgstr "" +"If False, Gajim will no longer print status line in chats when a contact " +"changes his or her status and/or status message." + +#: ../src/common/config.py:201 +msgid "" +"can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " +"longer print status line in groupchats when a member changes his or her " +"status and/or his or her status message. If \"all\" Gajim will print all " +"status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " +"group chat." +msgstr "" +"can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " +"longer print status line in groupchats when a member changes his or her " +"status and/or his or her status message. If \"all\" Gajim will print all " +"status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " +"group chat." + +#: ../src/common/config.py:203 +msgid "Background color of contacts when they just signed in." +msgstr "Background colour of contacts when they just signed in." + +#: ../src/common/config.py:204 +msgid "Background color of contacts when they just signed out." +msgstr "Background colour of contacts when they just signed out." + +#: ../src/common/config.py:206 +msgid "" +"If True, restored messages will use a smaller font than the default one." +msgstr "" +"If True, restored messages will use a smaller font than the default one." + +#: ../src/common/config.py:207 +msgid "Don't show avatar for the transport itself." +msgstr "Don't show avatar for the transport itself." + +#: ../src/common/config.py:208 +msgid "Don't show roster in the system taskbar." +msgstr "Don't show roster in the system taskbar." + +#: ../src/common/config.py:209 +msgid "" +"If True and installed GTK+ and PyGTK versions are at least 2.8, make the " +"window flash (the default behaviour in most Window Managers) when holding " +"pending events." +msgstr "" +"If True and installed GTK+ and PyGTK versions are at least 2.8, make the " +"window flash (the default behaviour in most Window Managers) when holding " +"pending events." + +#: ../src/common/config.py:211 +msgid "" +"Jabberd1.4 does not like sha info when one join a password protected group " +"chat. Turn this option to False to stop sending sha info in group chat " +"presences." +msgstr "" +"Jabberd1.4 does not like sha info when one join a password protected group " +"chat. Turn this option to False to stop sending sha info in group chat " +"presences." + +#. always, never, peracct, pertype should not be translated +#: ../src/common/config.py:214 +msgid "" +"Controls the window where new messages are placed.\n" +"'always' - All messages are sent to a single window.\n" +"'never' - All messages get their own window.\n" +"'peracct' - Messages for each account are sent to a specific window.\n" +"'pertype' - Each message type (e.g., chats vs. groupchats) are sent to a " +"specific window. Note, changing this option requires restarting Gajim before " +"the changes will take effect." +msgstr "" +"Controls the window where new messages are placed.\n" +"'always' - All messages are sent to a single window.\n" +"'never' - All messages get their own window.\n" +"'peracct' - Messages for each account are sent to a specific window.\n" +"'pertype' - Each message type (e.g., chats vs. groupchats) are sent to a " +"specific window. Note, changing this option requires restarting Gajim before " +"the changes will take effect." + +#: ../src/common/config.py:215 +msgid "If False, you will no longer see the avatar in the chat window." +msgstr "If False, you will no longer see the avatar in the chat window." + +#: ../src/common/config.py:216 +msgid "If True, pressing the escape key closes a tab/window." +msgstr "If True, pressing the escape key closes a tab/window." + +#: ../src/common/config.py:217 +#, fuzzy +msgid "Hides the buttons in chat windows." +msgstr "Hides the buttons in group chat window." + +#: ../src/common/config.py:218 +msgid "Hides the banner in a group chat window" +msgstr "Hides the banner in a group chat window" + +#: ../src/common/config.py:219 +msgid "Hides the banner in two persons chat window" +msgstr "Hides the banner in two persons chat window" + +#: ../src/common/config.py:220 +msgid "Hides the group chat occupants list in group chat window." +msgstr "Hides the group chat occupants list in group chat window." + +#: ../src/common/config.py:221 +msgid "" +"In a chat, show the nickname at the beginning of a line only when it's not " +"the same person talking than in previous message." +msgstr "" +"In a chat, show the nickname at the beginning of a line only when it's not " +"the same person talking than in previous message." + +#: ../src/common/config.py:222 +msgid "Indentation when using merge consecutive nickname." +msgstr "Indentation when using merge consecutive nickname." + +#: ../src/common/config.py:223 +#, fuzzy +msgid "Smooth scroll message in conversation window" +msgstr "Išsiųsti žinutę ir uždaryti langą" + +#: ../src/common/config.py:224 +msgid "List of colors that will be used to color nicknames in group chats." +msgstr "List of colours that will be used to colour nicknames in group chats." + +#: ../src/common/config.py:225 +msgid "Ctrl-Tab go to next composing tab when none is unread." +msgstr "Ctrl-Tab go to next composing tab when none is unread." + +#: ../src/common/config.py:226 +msgid "" +"Should we show the confirm metacontacts creation dialog or not? Empty string " +"means we never show the dialog." +msgstr "" +"Should we show the confirm metacontacts creation dialogue or not? Empty " +"string means we never show the dialogue." + +#: ../src/common/config.py:227 +msgid "" +"If True, you will be able to set a negative priority to your account in " +"account modification window. BE CAREFUL, when you are logged in with a " +"negative priority, you will NOT receive any message from your server." +msgstr "" +"If True, you will be able to set a negative priority to your account in " +"account modification window. BE CAREFUL, when you are logged in with a " +"negative priority, you will NOT receive any message from your server." + +#: ../src/common/config.py:228 +msgid "" +"If True, Gajim will use Gnome Keyring (if available) to store account " +"passwords." +msgstr "" +"If True, Gajim will use Gnome Keyring (if available) to store account " +"passwords." + +#: ../src/common/config.py:229 +msgid "" +"If True, Gajim will show number of online and total contacts in account and " +"group rows." +msgstr "" +"If True, Gajim will show number of online and total contacts in account and " +"group rows." + +#: ../src/common/config.py:230 +msgid "" +"Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " +"as if they were of this type" +msgstr "" +"Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " +"as if they were of this type" + +#: ../src/common/config.py:231 +msgid "" +"If True, Gajim will scroll and select the contact who sent you the last " +"message, if chat window is not already opened." +msgstr "" + +#: ../src/common/config.py:232 +msgid "" +"If True, Gajim will convert string between $$ and $$ to an image using dvips " +"and convert before insterting it in chat window." +msgstr "" + +#: ../src/common/config.py:233 +msgid "Time of inactivity needed before the change status window closes down." +msgstr "" + +#: ../src/common/config.py:234 +msgid "" +"Maximum number of lines that are printed in conversations. Oldest lines are " +"cleared." +msgstr "" + +#: ../src/common/config.py:245 +msgid "" +"Priority will change automatically according to your status. Priorities are " +"defined in autopriority_* options." +msgstr "" +"Priority will change automatically according to your status. Priorities are " +"defined in autopriority_* options." + +#. yes, no, ask +#: ../src/common/config.py:275 +msgid "Jabberd2 workaround" +msgstr "Jabberd2 workaround" + +#: ../src/common/config.py:279 +msgid "" +"If checked, Gajim will use your IP and proxies defined in " +"file_transfer_proxies option for file transfer." +msgstr "" +"If ticked, Gajim will use your IP and proxies defined in " +"file_transfer_proxies option for file transfer." + +#: ../src/common/config.py:338 +msgid "Is OpenPGP enabled for this contact?" +msgstr "Is OpenPGP enabled for this contact?" + +#: ../src/common/config.py:339 ../src/common/config.py:342 +msgid "Language for which we want to check misspelled words" +msgstr "Language for which we want to check misspelt words" + +#: ../src/common/config.py:348 +msgid "all or space separated status" +msgstr "all or space separated status" + +#: ../src/common/config.py:349 +msgid "'yes', 'no', or 'both'" +msgstr "'yes', 'no', or 'both'" + +#: ../src/common/config.py:350 ../src/common/config.py:352 +#: ../src/common/config.py:353 ../src/common/config.py:356 +#: ../src/common/config.py:357 +msgid "'yes', 'no' or ''" +msgstr "'yes', 'no' or ''" + +#: ../src/common/config.py:363 +msgid "Sleeping" +msgstr "Sleeping" + +#: ../src/common/config.py:364 +msgid "Back soon" +msgstr "Back soon" + +#: ../src/common/config.py:364 +msgid "Back in some minutes." +msgstr "Back in some minutes." + +#: ../src/common/config.py:365 +msgid "Eating" +msgstr "Eating" + +#: ../src/common/config.py:365 +msgid "I'm eating, so leave me a message." +msgstr "I'm eating, so leave me a message." + +#: ../src/common/config.py:366 +msgid "Movie" +msgstr "Movie" + +#: ../src/common/config.py:366 +msgid "I'm watching a movie." +msgstr "I'm watching a movie." + +#: ../src/common/config.py:367 +msgid "Working" +msgstr "Working" + +#: ../src/common/config.py:367 +msgid "I'm working." +msgstr "I'm working." + +#: ../src/common/config.py:368 +msgid "Phone" +msgstr "Phone" + +#: ../src/common/config.py:368 +msgid "I'm on the phone." +msgstr "I'm on the phone." + +#: ../src/common/config.py:369 +msgid "Out" +msgstr "Out" + +#: ../src/common/config.py:369 +msgid "I'm out enjoying life." +msgstr "I'm out enjoying life." + +#: ../src/common/config.py:373 +msgid "I'm available." +msgstr "I'm available." + +#: ../src/common/config.py:374 +msgid "I'm free for chat." +msgstr "I'm free for chat." + +#: ../src/common/config.py:376 +msgid "I'm not available." +msgstr "I'm not available." + +#: ../src/common/config.py:377 +msgid "Do not disturb." +msgstr "Do not disturb." + +#: ../src/common/config.py:378 ../src/common/config.py:379 +msgid "Bye!" +msgstr "Bye!" + +#: ../src/common/config.py:388 +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 "" +"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." + +#: ../src/common/config.py:389 +msgid "Sound to play when any MUC message arrives." +msgstr "Sound to play when any MUC message arrives." + +#: ../src/common/config.py:398 ../src/common/optparser.py:208 +msgid "green" +msgstr "green" + +#: ../src/common/config.py:402 ../src/common/optparser.py:194 +msgid "grocery" +msgstr "grocery" + +#: ../src/common/config.py:406 +msgid "human" +msgstr "human" + +#: ../src/common/config.py:410 +msgid "marine" +msgstr "marine" + +#: ../src/common/connection_handlers.py:56 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:44 +msgid "Unable to load idle module" +msgstr "Unable to load idle module" + +#: ../src/common/connection_handlers.py:184 +#: ../src/common/connection_handlers.py:219 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 +msgid "Wrong host" +msgstr "Wrong host" + +#: ../src/common/connection_handlers.py:184 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 +#, fuzzy, python-format +msgid "" +"The host %s you configured as the ft_add_hosts_to_send advanced option is " +"not valid, so ignored." +msgstr "" +"The host you configured as the ft_override_host_to_send advanced option is " +"not valid, so ignored." + +#: ../src/common/connection_handlers.py:220 +msgid "Invalid local address? :-O" +msgstr "" + +#: ../src/common/connection_handlers.py:612 +#, python-format +msgid "Registration information for transport %s has not arrived in time" +msgstr "Registration information for transport %s has not arrived in time" + +#: ../src/common/connection_handlers.py:1776 +#, python-format +msgid "Nickname not allowed: %s" +msgstr "Nickname not allowed: %s" + +#. we are banned +#. group chat does not exist +#: ../src/common/connection_handlers.py:1846 +#: ../src/common/connection_handlers.py:1849 +#: ../src/common/connection_handlers.py:1852 +#: ../src/common/connection_handlers.py:1855 +#: ../src/common/connection_handlers.py:1859 +#: ../src/common/connection_handlers.py:1868 +msgid "Unable to join group chat" +msgstr "Unable to join group chat" + +#: ../src/common/connection_handlers.py:1847 +#, fuzzy, python-format +msgid "You are banned from group chat %s." +msgstr "You are banned from this group chat." + +#: ../src/common/connection_handlers.py:1850 +#, fuzzy, python-format +msgid "Group chat %s does not exist." +msgstr "Such group chat does not exist." + +#: ../src/common/connection_handlers.py:1853 +msgid "Group chat creation is restricted." +msgstr "Group chat creation is restricted." + +#: ../src/common/connection_handlers.py:1856 +#, fuzzy, python-format +msgid "Your registered nickname must be used in group chat %s." +msgstr "Your registered nickname must be used." + +#: ../src/common/connection_handlers.py:1860 +#, fuzzy, python-format +msgid "You are not in the members list in groupchat %s." +msgstr "You are not in the members list." + +#: ../src/common/connection_handlers.py:1869 +#, 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 "" +"Your desired nickname is in use or registered by another occupant.\n" +"Please specify another nickname below:" + +#. Room has been destroyed. see +#. http://www.xmpp.org/extensions/xep-0045.html#destroyroom +#: ../src/common/connection_handlers.py:1900 +#, fuzzy +msgid "Room has been destroyed" +msgstr "Authorisation has been removed" + +#: ../src/common/connection_handlers.py:1907 +#, python-format +msgid "You can join this room instead: %s" +msgstr "" + +#: ../src/common/connection_handlers.py:1934 +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:1955 +#, python-format +msgid "we are now subscribed to %s" +msgstr "we are now subscribed to %s" + +#: ../src/common/connection_handlers.py:1957 +#, python-format +msgid "unsubscribe request from %s" +msgstr "unsubscribe request from %s" + +#: ../src/common/connection_handlers.py:1959 +#, python-format +msgid "we are now unsubscribed from %s" +msgstr "we are now unsubscribed from %s" + +#: ../src/common/connection_handlers.py:2081 +#, python-format +msgid "" +"JID %s is not RFC compliant. It will not be added to your roster. Use roster " +"management tools such as http://jru.jabberstudio.org/ to remove it" +msgstr "" +"JID %s is not RFC compliant. It will not be added to your roster. Use roster " +"management tools such as http://jru.jabberstudio.org/ to remove it" + +#: ../src/common/connection.py:244 +#: ../src/common/zeroconf/connection_zeroconf.py:203 +#, python-format +msgid "Connection with account \"%s\" has been lost" +msgstr "Connection with account \"%s\" has been lost" + +#: ../src/common/connection.py:245 +msgid "Reconnect manually." +msgstr "Reconnect manually." + +#: ../src/common/connection.py:256 +#, fuzzy, python-format +msgid "Server %s answered wrongly to register request: %s" +msgstr "Transport %s answered wrongly to register request: %s" + +#. wrong answer +#: ../src/common/connection.py:264 +msgid "Invalid answer" +msgstr "Invalid answer" + +#: ../src/common/connection.py:265 +#, python-format +msgid "Transport %s answered wrongly to register request: %s" +msgstr "Transport %s answered wrongly to register request: %s" + +#: ../src/common/connection.py:411 +#, fuzzy +msgid "Connection to proxy failed" +msgstr "Connection Failed" + +#: ../src/common/connection.py:465 ../src/common/connection.py:511 +#: ../src/common/connection.py:1067 +#: ../src/common/zeroconf/connection_zeroconf.py:237 +#, python-format +msgid "Could not connect to \"%s\"" +msgstr "Could not connect to \"%s\"" + +#: ../src/common/connection.py:479 +#, python-format +msgid "Connected to server %s:%s with %s" +msgstr "Connected to server %s:%s with %s" + +#: ../src/common/connection.py:512 +msgid "Check your connection or try again later" +msgstr "Check your connection or try again later" + +#: ../src/common/connection.py:537 +#, python-format +msgid "Authentication failed with \"%s\"" +msgstr "Authentication failed with \"%s\"" + +#: ../src/common/connection.py:538 +msgid "Please check your login and password for correctness." +msgstr "Please check your login and password for correctness." + +#: ../src/common/connection.py:581 +msgid "Error while removing privacy list" +msgstr "Error while removing privacy list" + +#: ../src/common/connection.py:582 +#, 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 "" +"Privacy list %s has not been removed. It is maybe active in one of your " +"connected resources. Deactivate it and try again." + +#. We didn't set a passphrase +#: ../src/common/connection.py:682 +#: ../src/common/zeroconf/connection_zeroconf.py:163 +msgid "OpenPGP passphrase was not given" +msgstr "OpenPGP passphrase was not given" + +#. we're not english +#. one in locale and one en +#: ../src/common/connection.py:845 +msgid "[This message is *encrypted* (See :JEP:`27`]" +msgstr "[This message is *encrypted* (See :JEP:`27`]" + +#: ../src/common/connection.py:916 +#: ../src/common/zeroconf/connection_zeroconf.py:423 +#, python-format +msgid "" +"Subject: %s\n" +"%s" +msgstr "" +"Subject: %s\n" +"%s" + +#: ../src/common/connection.py:1099 +msgid "Not fetched because of invisible status" +msgstr "Not fetched because of invisible status" + +#: ../src/common/contacts.py:294 +msgid "Not in roster" +msgstr "Not in roster" + +#. only say that to non Windows users +#: ../src/common/dbus_support.py:33 +msgid "D-Bus python bindings are missing in this computer" +msgstr "D-Bus python bindings are missing in this computer" + +#: ../src/common/dbus_support.py:34 +msgid "D-Bus capabilities of Gajim cannot be used" +msgstr "D-Bus capabilities of Gajim cannot be used" + +#: ../src/common/exceptions.py:22 +msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." +msgstr "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." + +#: ../src/common/exceptions.py:39 +msgid "Service not available: Gajim is not running, or remote_control is False" +msgstr "" +"Service not available: Gajim is not running, or remote_control is False" + +#: ../src/common/exceptions.py:47 +msgid "D-Bus is not present on this machine or python module is missing" +msgstr "D-Bus is not present on this machine or python module is missing" + +#: ../src/common/exceptions.py:55 +msgid "" +"Session bus is not available.\n" +"Try reading http://trac.gajim.org/wiki/GajimDBus" +msgstr "" +"Session bus is not available.\n" +"Try reading http://trac.gajim.org/wiki/GajimDBus" + +#: ../src/common/fuzzyclock.py:42 +msgid "one" +msgstr "one" + +#: ../src/common/fuzzyclock.py:42 +msgid "two" +msgstr "two" + +#: ../src/common/fuzzyclock.py:42 +msgid "three" +msgstr "three" + +#: ../src/common/fuzzyclock.py:42 +msgid "four" +msgstr "four" + +#: ../src/common/fuzzyclock.py:42 +msgid "five" +msgstr "five" + +#: ../src/common/fuzzyclock.py:42 +msgid "six" +msgstr "six" + +#: ../src/common/fuzzyclock.py:43 +msgid "seven" +msgstr "seven" + +#: ../src/common/fuzzyclock.py:43 +msgid "eight" +msgstr "eight" + +#: ../src/common/fuzzyclock.py:43 +msgid "nine" +msgstr "nine" + +#: ../src/common/fuzzyclock.py:43 +msgid "ten" +msgstr "ten" + +#: ../src/common/fuzzyclock.py:43 +msgid "eleven" +msgstr "eleven" + +#: ../src/common/fuzzyclock.py:44 +msgid "twelve" +msgstr "twelve" + +#. Strings to use for the output. %0 will be replaced with the preceding hour (e.g. "x PAST %0"), %1 with the coming hour (e.g. "x TO %1). ''' +#. A "singular-form". It is used when talking about hour 0 +#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 +msgid "$0 o'clock" +msgstr "$0 o'clock" + +#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 +msgid "five past $0" +msgstr "five past $0" + +#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 +msgid "ten past $0" +msgstr "ten past $0" + +#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 +msgid "quarter past $0" +msgstr "quarter past $0" + +#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 +msgid "twenty past $0" +msgstr "twenty past $0" + +#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 +msgid "twenty five past $0" +msgstr "twenty five past $0" + +#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 +msgid "half past $0" +msgstr "half past $0" + +#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 +msgid "twenty five to $1" +msgstr "twenty five to $1" + +#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 +msgid "twenty to $1" +msgstr "twenty to $1" + +#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 +msgid "quarter to $1" +msgstr "quarter to $1" + +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +msgid "ten to $1" +msgstr "ten to $1" + +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +msgid "five to $1" +msgstr "five to $1" + +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:61 +msgid "$1 o'clock" +msgstr "$1 o'clock" + +#: ../src/common/fuzzyclock.py:64 +msgid "Night" +msgstr "Night" + +#: ../src/common/fuzzyclock.py:64 +msgid "Early morning" +msgstr "Early morning" + +#: ../src/common/fuzzyclock.py:64 +msgid "Morning" +msgstr "Morning" + +#: ../src/common/fuzzyclock.py:64 +msgid "Almost noon" +msgstr "Almost noon" + +#: ../src/common/fuzzyclock.py:65 +msgid "Noon" +msgstr "Noon" + +#: ../src/common/fuzzyclock.py:65 +msgid "Afternoon" +msgstr "Afternoon" + +#: ../src/common/fuzzyclock.py:65 +msgid "Evening" +msgstr "Evening" + +#: ../src/common/fuzzyclock.py:65 +msgid "Late evening" +msgstr "Late evening" + +#: ../src/common/fuzzyclock.py:67 +msgid "Start of week" +msgstr "Start of week" + +#: ../src/common/fuzzyclock.py:67 +msgid "Middle of week" +msgstr "Middle of week" + +#: ../src/common/fuzzyclock.py:67 +msgid "End of week" +msgstr "End of week" + +#: ../src/common/fuzzyclock.py:68 +msgid "Weekend!" +msgstr "Weekend!" + +#: ../src/common/helpers.py:115 +msgid "Invalid character in username." +msgstr "Invalid character in username." + +#: ../src/common/helpers.py:120 +msgid "Server address required." +msgstr "Server address required." + +#: ../src/common/helpers.py:125 +msgid "Invalid character in hostname." +msgstr "Invalid character in hostname." + +#: ../src/common/helpers.py:131 +msgid "Invalid character in resource." +msgstr "Invalid character in resource." + +#. GiB means gibibyte +#: ../src/common/helpers.py:171 +#, python-format +msgid "%s GiB" +msgstr "%s GiB" + +#. GB means gigabyte +#: ../src/common/helpers.py:174 +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#. MiB means mibibyte +#: ../src/common/helpers.py:178 +#, python-format +msgid "%s MiB" +msgstr "%s MiB" + +#. MB means megabyte +#: ../src/common/helpers.py:181 +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#. KiB means kibibyte +#: ../src/common/helpers.py:185 +#, python-format +msgid "%s KiB" +msgstr "%s KiB" + +#. KB means kilo bytes +#: ../src/common/helpers.py:188 +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#. B means bytes +#: ../src/common/helpers.py:191 +#, python-format +msgid "%s B" +msgstr "%s B" + +#: ../src/common/helpers.py:222 +msgid "_Busy" +msgstr "_Užimtas" + +#: ../src/common/helpers.py:224 +msgid "Busy" +msgstr "Užimtas" + +#: ../src/common/helpers.py:227 +msgid "_Not Available" +msgstr "_Nepasiekiamas" + +#: ../src/common/helpers.py:232 +msgid "_Free for Chat" +msgstr "_Laisvas Pokalbiams" + +#: ../src/common/helpers.py:234 +msgid "Free for Chat" +msgstr "Laisvas Pokalbiams" + +#: ../src/common/helpers.py:237 +msgid "_Available" +msgstr "_Prisijungęs" + +#: ../src/common/helpers.py:239 +msgid "Available" +msgstr "Prisijungęs" + +#: ../src/common/helpers.py:241 +msgid "Connecting" +msgstr "Jungiamasi" + +#: ../src/common/helpers.py:244 +msgid "A_way" +msgstr "_Nuėjęs" + +#: ../src/common/helpers.py:249 +msgid "_Offline" +msgstr "A_tsijungęs" + +#: ../src/common/helpers.py:251 +msgid "Offline" +msgstr "Atsijungęs" + +#: ../src/common/helpers.py:254 +msgid "_Invisible" +msgstr "N_ematomas" + +#: ../src/common/helpers.py:260 +msgid "?contact has status:Unknown" +msgstr "Būklė nežinoma" + +#: ../src/common/helpers.py:262 +msgid "?contact has status:Has errors" +msgstr "Būklė klaidinga" + +#: ../src/common/helpers.py:267 +msgid "?Subscription we already have:None" +msgstr "Joks" + +#: ../src/common/helpers.py:269 +msgid "To" +msgstr "Kam" + +#: ../src/common/helpers.py:273 +msgid "Both" +msgstr "Abu" + +#: ../src/common/helpers.py:281 +msgid "?Ask (for Subscription):None" +msgstr "Joks" + +#: ../src/common/helpers.py:283 +msgid "Subscribe" +msgstr "Subscribe" + +#: ../src/common/helpers.py:292 +msgid "?Group Chat Contact Role:None" +msgstr "None" + +#: ../src/common/helpers.py:295 +msgid "Moderators" +msgstr "Moderators" + +#: ../src/common/helpers.py:297 +msgid "Moderator" +msgstr "Moderator" + +#: ../src/common/helpers.py:300 +msgid "Participants" +msgstr "Participants" + +#: ../src/common/helpers.py:302 +msgid "Participant" +msgstr "Participant" + +#: ../src/common/helpers.py:305 +msgid "Visitors" +msgstr "Visitors" + +#: ../src/common/helpers.py:307 +msgid "Visitor" +msgstr "Visitor" + +#: ../src/common/helpers.py:313 +msgid "?Group Chat Contact Affiliation:None" +msgstr "None" + +#: ../src/common/helpers.py:315 +msgid "Owner" +msgstr "Owner" + +#: ../src/common/helpers.py:317 +msgid "Administrator" +msgstr "Administrator" + +#: ../src/common/helpers.py:319 +msgid "Member" +msgstr "Member" + +#: ../src/common/helpers.py:358 +msgid "is paying attention to the conversation" +msgstr "is paying attention to the conversation" + +#: ../src/common/helpers.py:360 +msgid "is doing something else" +msgstr "is doing something else" + +#: ../src/common/helpers.py:362 +msgid "is composing a message..." +msgstr "is composing a message..." + +#. paused means he or she was composing but has stopped for a while +#: ../src/common/helpers.py:365 +msgid "paused composing a message" +msgstr "paused composing a message" + +#: ../src/common/helpers.py:367 +msgid "has closed the chat window or tab" +msgstr "has closed the chat window or tab" + +#: ../src/common/helpers.py:913 ../src/common/helpers.py:920 +#, fuzzy, python-format +msgid "%d message pending" +msgid_plural "%d messages pending" +msgstr[0] "Siųsti žinutę" +msgstr[1] "Siųsti žinutę" + +#: ../src/common/helpers.py:926 +#, python-format +msgid " from room %s" +msgstr "" + +#: ../src/common/helpers.py:929 ../src/common/helpers.py:948 +#, python-format +msgid " from user %s" +msgstr "" + +#: ../src/common/helpers.py:931 +#, python-format +msgid " from %s" +msgstr "" + +#: ../src/common/helpers.py:938 ../src/common/helpers.py:945 +#, python-format +msgid "%d event pending" +msgid_plural "%d events pending" +msgstr[0] "" +msgstr[1] "" + +#: ../src/common/helpers.py:978 +#, python-format +msgid "Gajim - %s" +msgstr "Gajim - %s" + +#. we talk about a file +#: ../src/common/optparser.py:60 +#, python-format +msgid "error: cannot open %s for reading" +msgstr "error: cannot open %s for reading" + +#: ../src/common/optparser.py:203 ../src/common/optparser.py:204 +msgid "cyan" +msgstr "cyan" + +#: ../src/common/optparser.py:320 +msgid "migrating logs database to indices" +msgstr "migrating logs database to indices" + +#: ../src/common/passwords.py:82 +#, python-format +msgid "Gajim account %s" +msgstr "Gajim account %s" + +#: ../src/common/zeroconf/client_zeroconf.py:135 +#: ../src/common/zeroconf/client_zeroconf.py:218 +msgid "Connection to host could not be established" +msgstr "Connection to host could not be established" + +#: ../src/common/zeroconf/client_zeroconf.py:192 +msgid "" +"Connection to host could not be established: Incorrect answer from server." +msgstr "" +"Connection to host could not be established: Incorrect answer from server." + +#: ../src/common/zeroconf/client_zeroconf.py:352 +msgid "" +"Connection to host could not be established: Timeout while sending data." +msgstr "" +"Connection to host could not be established: Timeout while sending data." + +#: ../src/common/zeroconf/client_zeroconf.py:638 +msgid "Contact is offline. Your message could not be sent." +msgstr "Contact is offline. Your message could not be sent." + +#: ../src/common/zeroconf/connection_zeroconf.py:204 +msgid "To continue sending and receiving messages, you will need to reconnect." +msgstr "" +"To continue sending and receiving messages, you will need to reconnect." + +#: ../src/common/zeroconf/connection_zeroconf.py:227 +msgid "Avahi error" +msgstr "Avahi error" + +#: ../src/common/zeroconf/connection_zeroconf.py:227 +#, python-format +msgid "" +"%s\n" +"Link-local messaging might not work properly." +msgstr "" +"%s\n" +"Link-local messaging might not work properly." + +#: ../src/common/zeroconf/connection_zeroconf.py:238 +msgid "Please check if Avahi is installed." +msgstr "Please check if Avahi is installed." + +#: ../src/common/zeroconf/connection_zeroconf.py:247 +#: ../src/common/zeroconf/connection_zeroconf.py:251 +msgid "Could not start local service" +msgstr "Could not start local service" + +#: ../src/common/zeroconf/connection_zeroconf.py:248 +#, python-format +msgid "Unable to bind to port %d." +msgstr "Unable to bind to port %d." + +#: ../src/common/zeroconf/connection_zeroconf.py:252 +#: ../src/common/zeroconf/connection_zeroconf.py:347 +msgid "Please check if avahi-daemon is running." +msgstr "Please check if avahi-daemon is running." + +#: ../src/common/zeroconf/connection_zeroconf.py:346 +#, python-format +msgid "Could not change status of account \"%s\"" +msgstr "Could not change status of account \"%s\"" + +#: ../src/common/zeroconf/connection_zeroconf.py:363 +msgid "" +"You are not connected or not visible to others. Your message could not be " +"sent." +msgstr "" +"You are not connected or not visible to others. Your message could not be " +"sent." + +#. we're not english +#: ../src/common/zeroconf/connection_zeroconf.py:375 +msgid "[This message is encrypted]" +msgstr "[This message is encrypted]" + +#~ msgid "_Discover Services..." +#~ msgstr "_Ieškoti paslaugų..." + +#~ msgid "_Retype Password:" +#~ msgstr "_Pakartokite slaptažodį:" + +#~ msgid "_Use proxy" +#~ msgstr "_Naudoti proksi" + +#~ msgid "Accounts" +#~ msgstr "Prieiga" + +#~ msgid "" +#~ "If checked, all local contacts that use a Bonjour compatible chat client " +#~ "(like iChat, Trillian or Gaim) will be shown in roster. You don't need to " +#~ "be connected to a jabber server for it to work.\n" +#~ "This is only available if python-avahi is installed and avahi-daemon is " +#~ "running." +#~ msgstr "" +#~ "Jei pažymėta, visi lokalūs asmenys, kurie naudoja pokalbių programas, " +#~ "palaikančias Bonjour (tokias kaip: iChat, Trillian ar Gaim) bus rodomi " +#~ "asmenų sąraše. Jums nereikia būti prisijungusiam prie jabber serverio, " +#~ "kad tai veiktų.\n" +#~ "Tai veikia, tik tuo atveju, jei python-avahi yra įdiegtas ir avahi-deamon " +#~ "yra paleistas." + +#~ msgid "" +#~ "If you have 2 or more accounts and this is checked, Gajim will list all " +#~ "contacts as if you had one account" +#~ msgstr "" +#~ "Jei jūs turite kelias prieigas ir ši žymė yra pažymėta, Gajim pateiks " +#~ "visų asmenų sąrašą taip, lyg jie visi priklausytų vienai prieigai" + +#~ msgid "_Enable link-local messaging" +#~ msgstr "Įjungti lokalūjį pokalbių r_ežimą" + +#~ msgid "_Modify" +#~ msgstr "_Keisti" + +#~ msgid "_Compact View Alt+C" +#~ msgstr "_Kompaktiška išvaizda Alt+C" + +#~ msgid "Interface Customization" +#~ msgstr "Išvaizdos keitimas" + +#~ msgid "Also known as iChat style" +#~ msgstr "Taip pat žinomas, kaip iChat stilius" + +#~ msgid "Chat" +#~ msgstr "Pokalbis" + +#~ msgid "E_very 5 minutes" +#~ msgstr "_Kas 5 minutes" + +#~ msgid "" +#~ "Gajim will automatically show new events by popping up the relative window" +#~ msgstr "Gajim automatiškai rodys naujus įvykius iššokančiame langelyje." + +#~ msgid "" +#~ "Gajim will notify you for new events via a popup in the bottom right of " +#~ "the screen" +#~ msgstr "" +#~ "Gajim praneš apie naujus įvykius iššokančiame langelyje, kuris pasirodys " +#~ "dešiniajame apatiniame ekrano kampe" + +#~ msgid "" +#~ "Gajim will notify you via a popup window in the bottom right of the " +#~ "screen about contacts that just signed in" +#~ msgstr "" +#~ "Gajim rodys pranešimus apie ką tik prisijungusius asmenis iššokančiame " +#~ "langelyje, dešiniajame apatiniame ekrano kampe" + +#~ msgid "" +#~ "Gajim will only change the icon of the contact that triggered the new " +#~ "event" +#~ msgstr "Gajim keis tik tų asmenų piktogramas, kurie atliko naują įvykį" + +#~ msgid "" +#~ "If checked, Gajim will remember the roster and chat window positions in " +#~ "the screen and the sizes of them next time you run it" +#~ msgstr "" +#~ "Jei pažymėta, Gajim atsimins kontaktų sąrašo ir pokalbių lango pozicijas " +#~ "ir dydžius ekrane sekančio paleidimo metu" + +#~ msgid "On every _message" +#~ msgstr "_Kiekvienai žinutei" + +#~ msgid "Outgoing Chat state noti_fications:" +#~ msgstr "Išeinančių pokalbių būklės pranešimai:" + +#~ msgid "Print time:" +#~ msgstr "Spausdinimo laikas:" + +#~ msgid "Save _position and size for roster and chat windows" +#~ msgstr "Įsiminti kontakų sąrašo ir pokalbių langų pozicijas ir dydžius" + +#~ msgid "Show only in _roster" +#~ msgstr "Rodyti tik kontaktų _sąrašą" + +#~ msgid "Use t_rayicon (aka. notification area icon)" +#~ msgstr "Naudoti piktogramą trėjuje (pranešimų panelės piktograma)" + +#~ msgid "" +#~ "When a new event (message, file transfer request etc..) is received, the " +#~ "following methods may be used to inform you about it. Please note that " +#~ "events about new messages only occur if it is a new message from a " +#~ "contact you are not already chatting with" +#~ msgstr "" +#~ "Naujam įvykiui ivykus (atėjus žinutei, failui ir pan.), sekantys būdai " +#~ "gali būti naudojami jums informuoti apie tai. Pastaba: naujų žinučių " +#~ "įvykiai pasirodys tik jei tai bus nauja žinutė nuo kurio nors asmens, su " +#~ "kuriuo jūs dar nebuvote pradėjęs pokalbio" + +#~ msgid "_Never" +#~ msgstr "_Niekada" + +#~ msgid "_Notify me about it" +#~ msgstr "_Pranešti man apie tai" + +#~ msgid "_Pop it up" +#~ msgstr "_Rodyk" + +#~ msgid "_Remove from Roster" +#~ msgstr "Ša_linti iš Kontaktų Sąrašo" + +#~ msgid "Add _Contact" +#~ msgstr "Įtraukti _Asmenį" + +#~ msgid "_Filter:" +#~ msgstr "_Filtras:" + +#~ msgid "" +#~ "If that is not your language for which you want to highlight misspelled " +#~ "words, then please set your $LANG as appropriate. Eg. for French do " +#~ "export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to " +#~ "make it global in /etc/profile.\n" +#~ "\n" +#~ "Highlighting misspelled words feature will not be used" +#~ msgstr "" +#~ "If that is not your language for which you want to highlight misspelt " +#~ "words, then please set your $LANG as appropriate. Eg. for French do " +#~ "export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to " +#~ "make it global in /etc/profile.\n" +#~ "\n" +#~ "Highlighting misspelt words feature will not be used" + +#~ msgid "Every %s _minutes" +#~ msgstr "Every %s _minutes" + +#~ msgid "You must enter a password for the new account." +#~ msgstr "You must enter a password for the new account." + +#~ msgid "%s does not appear to be a valid JID" +#~ msgstr "%s does not appear to be a valid JID" + +#~ msgid "Drop %s in group %s" +#~ msgstr "Drop %s in group %s" + +#~ msgid "Make %s and %s metacontacts" +#~ msgstr "Make %s and %s metacontacts" + +#~ msgid "Hides the buttons in two persons chat window." +#~ msgstr "Hides the buttons in two persons chat window." + +#~ msgid " %d unread single message" +#~ msgid_plural " %d unread single messages" +#~ msgstr[0] " %d unread single message" +#~ msgstr[1] " %d unread single messages" + +#~ msgid " %d unread group chat message" +#~ msgid_plural " %d unread group chat messages" +#~ msgstr[0] " %d unread group chat message" +#~ msgstr[1] " %d unread group chat messages" + +#~ msgid " %d unread private message" +#~ msgid_plural " %d unread private messages" +#~ msgstr[0] " %d unread private message" +#~ msgstr[1] " %d unread private messages" + +#~ msgid "Error while adding service. %s" +#~ msgstr "Error while adding service. %s" + +#~ msgid "gtk+" +#~ msgstr "gtk+" + +#~ msgid "Private Chat" +#~ msgstr "Private Chat" + +#~ msgid "Group Chat" +#~ msgstr "Group Chat" + +#~ msgid "invisible" +#~ msgstr "invisible" + +#~ msgid "offline" +#~ msgstr "offline" + +#~ msgid "I'm %s" +#~ msgstr "I'm %s" + +#~ msgid "2003-12-13T18:30:02Z" +#~ msgstr "2003-12-13T18:30:02Z" + +#~ msgid "Romeo and Juliet" +#~ msgstr "Romeo and Juliet" + +#~ msgid "Old stories" +#~ msgstr "Old stories" + +#~ msgid "Soliloquy" +#~ msgstr "Soliloquy" + +#~ msgid "A_fter nickname:" +#~ msgstr "A_fter nickname:" + +#~ msgid "B_efore nickname:" +#~ msgstr "B_efore nickname:" + +#~ msgid "_After time:" +#~ msgstr "_After time:" + +#~ msgid "_Before time:" +#~ msgstr "_Before time:" + +#~ msgid "_Publish" +#~ msgstr "_Publish" + +#~ msgid "_Retrieve" +#~ msgstr "_Retrieve" + +#~ msgid "Information published" +#~ msgstr "Information published" + +#~ msgid "Without a connection, you can not get your contact information." +#~ msgstr "Without a connection, you can not get your contact information." + +#~ msgid "This is result of query." +#~ msgstr "This is result of query." + +#~ msgid "Edit items on the list" +#~ msgstr "Edit items on the list" diff --git a/po/pl.po b/po/pl.po index 39fab72d4..930265fa1 100644 --- a/po/pl.po +++ b/po/pl.po @@ -5,18 +5,17 @@ # Automatically generated, 2005. # # -#: ../src/chat_control.py:1182 ../src/gajim-remote.py:203 -#: ../src/gajim-remote.py:210 ../src/gajim-remote.py:236 -#: ../src/gajim-remote.py:237 ../src/gajim-remote.py:243 -#: ../src/gajim-remote.py:244 ../src/gajim-remote.py:245 -#: ../src/gajim-remote.py:246 +#: ../src/gajim-remote.py:217 ../src/gajim-remote.py:224 +#: ../src/gajim-remote.py:250 ../src/gajim-remote.py:251 +#: ../src/gajim-remote.py:257 ../src/gajim-remote.py:258 +#: ../src/gajim-remote.py:259 ../src/gajim-remote.py:260 msgid "" msgstr "" "Project-Id-Version: gajim 2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-05-02 20:42+0200\n" +"POT-Creation-Date: 2007-11-07 14:56+0100\n" "PO-Revision-Date: 2006-11-08 09:01+0100\n" -"Last-Translator: Maciej Chojnacki \n" +"Last-Translator: Maciej Chojnacki \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -37,36 +36,36 @@ msgid "Jabber IM Client" msgstr "Klient komunikatora Jabber" #: ../data/glade/account_context_menu.glade.h:1 -msgid "Send Single _Message..." -msgstr "Wyślij _wiadomość..." +#: ../data/glade/roster_window.glade.h:8 +msgid "Join _Group Chat..." +msgstr "Dołącz do _pokoju" #: ../data/glade/account_context_menu.glade.h:2 msgid "_Add Contact..." msgstr "Dod_aj kontakt..." #: ../data/glade/account_context_menu.glade.h:3 -msgid "_Discover Services..." -msgstr "_Wyszukuj usługi..." +#: ../data/glade/roster_window.glade.h:15 +msgid "_Discover Services" +msgstr "_Wyszukuj usługi" #: ../data/glade/account_context_menu.glade.h:4 msgid "_Execute Command..." msgstr "_Wykonaj komendę" #: ../data/glade/account_context_menu.glade.h:5 -#: ../data/glade/roster_window.glade.h:16 -#: ../data/glade/systray_context_menu.glade.h:6 -msgid "_Group Chat" -msgstr "_Pokój" +msgid "_Modify Account" +msgstr "_Modyfikuj konto" #: ../data/glade/account_context_menu.glade.h:6 -#: ../data/glade/zeroconf_context_menu.glade.h:1 -msgid "_Modify Account..." -msgstr "_Modyfikuj konto..." - -#: ../data/glade/account_context_menu.glade.h:7 msgid "_Open Gmail Inbox" msgstr "_Otwórz skrzynkę Gmail" +#: ../data/glade/account_context_menu.glade.h:7 +#: ../data/glade/roster_window.glade.h:23 +msgid "_Start Chat..." +msgstr "_Rozpocznij rozmowę" + #: ../data/glade/account_context_menu.glade.h:8 #: ../data/glade/zeroconf_context_menu.glade.h:2 msgid "_Status" @@ -74,11 +73,11 @@ msgstr "_Status" #: ../data/glade/account_creation_wizard_window.glade.h:1 msgid "" -"Account is being created\n" +"Connecting to server\n" "\n" "Please wait..." msgstr "" -"Konto jest tworzone\n" +"Łączenie z serwerem\n" "\n" "proszę czekać..." @@ -91,50 +90,67 @@ msgid "Please fill in the data for your new account" msgstr "Wpisz dane do swojego nowego konta" #: ../data/glade/account_creation_wizard_window.glade.h:6 +msgid "Please select a server" +msgstr "Wybierz serwer" + +#: ../data/glade/account_creation_wizard_window.glade.h:7 msgid "Click to see features (like MSN, ICQ transports) of jabber servers" msgstr "" "Kliknij by zobaczyć możliwości serwerów jabbera (np. transporty MSN czy ICQ)" -#: ../data/glade/account_creation_wizard_window.glade.h:7 +#: ../data/glade/account_creation_wizard_window.glade.h:8 msgid "Connect when I press Finish" msgstr "Połącz po wciśnięciu przycisku Zakończ" -#: ../data/glade/account_creation_wizard_window.glade.h:8 +#: ../data/glade/account_creation_wizard_window.glade.h:9 msgid "Gajim: Account Creation Wizard" msgstr "Gajim: Kreator Konta" -#: ../data/glade/account_creation_wizard_window.glade.h:9 -msgid "I already have an account I want to use" -msgstr "Mam już konto i chcę z niego korzystać" - #: ../data/glade/account_creation_wizard_window.glade.h:10 +msgid "I already have an account I want to _use" +msgstr "_Mam już konto i chcę z niego korzystać" + +#: ../data/glade/account_creation_wizard_window.glade.h:11 msgid "I want to _register for a new account" msgstr "Chcę za_rejestrować nowe konto Jabbera" -#: ../data/glade/account_creation_wizard_window.glade.h:11 +#: ../data/glade/account_creation_wizard_window.glade.h:12 #: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/accounts_window.glade.h:23 msgid "If checked, Gajim will remember the password for this account" msgstr "Włączenie tej opcji spowoduje zapamiętanie hasła dla tego konta" -#: ../data/glade/account_creation_wizard_window.glade.h:12 -#: ../data/glade/manage_proxies_window.glade.h:7 -msgid "Pass_word:" -msgstr "_Hasło:" - #: ../data/glade/account_creation_wizard_window.glade.h:13 +#: ../data/glade/account_modification_window.glade.h:26 +#: ../data/glade/accounts_window.glade.h:32 +msgid "Manage..." +msgstr "Zarządzaj..." + +#: ../data/glade/account_creation_wizard_window.glade.h:14 +msgid "Prox_y:" +msgstr "_Pośrednik:" + +#: ../data/glade/account_creation_wizard_window.glade.h:15 #: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/accounts_window.glade.h:47 msgid "Save pass_word" msgstr "Zapisz _hasło" -#: ../data/glade/account_creation_wizard_window.glade.h:14 +#: ../data/glade/account_creation_wizard_window.glade.h:16 msgid "Servers Features" msgstr "Możliwości serwerów" -#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_creation_wizard_window.glade.h:17 msgid "Set my profile when I connect" msgstr "Ustaw profil po połączeniu" -#: ../data/glade/account_creation_wizard_window.glade.h:16 +#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/accounts_window.glade.h:53 +msgid "Use custom hostname/port" +msgstr "Użyj własnej nazwy hosta/portu" + +#: ../data/glade/account_creation_wizard_window.glade.h:19 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." @@ -142,67 +158,63 @@ msgstr "" "Musisz posiadać konto aby połączyć się\n" " z siecią Jabber." -#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_creation_wizard_window.glade.h:21 msgid "Your JID:" msgstr "Twój JID:" -#: ../data/glade/account_creation_wizard_window.glade.h:19 -#: ../data/glade/roster_window.glade.h:11 +#: ../data/glade/account_creation_wizard_window.glade.h:22 +#: ../data/glade/roster_window.glade.h:13 msgid "_Advanced" msgstr "Z_aawansowane" -#: ../data/glade/account_creation_wizard_window.glade.h:20 +#: ../data/glade/account_creation_wizard_window.glade.h:23 msgid "_Finish" msgstr "_Zakończ" -#: ../data/glade/account_creation_wizard_window.glade.h:21 -#: ../data/glade/manage_proxies_window.glade.h:10 -msgid "_Host:" -msgstr "_Host:" +#: ../data/glade/account_creation_wizard_window.glade.h:24 +msgid "_Hostname:" +msgstr "_Nazwa hosta: " -#: ../data/glade/account_creation_wizard_window.glade.h:22 +#: ../data/glade/account_creation_wizard_window.glade.h:25 #: ../data/glade/account_modification_window.glade.h:50 +#: ../data/glade/accounts_window.glade.h:58 msgid "_Password:" msgstr "_Hasło:" -#: ../data/glade/account_creation_wizard_window.glade.h:23 +#: ../data/glade/account_creation_wizard_window.glade.h:26 #: ../data/glade/manage_proxies_window.glade.h:11 msgid "_Port:" msgstr "_Port:" -#: ../data/glade/account_creation_wizard_window.glade.h:24 -msgid "_Retype Password:" -msgstr "_Powtórz hasło:" - -#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_creation_wizard_window.glade.h:27 msgid "_Server:" msgstr "_Serwer:" -#: ../data/glade/account_creation_wizard_window.glade.h:26 -msgid "_Use proxy" -msgstr "_Korzystaj z pośrednika" - -#: ../data/glade/account_creation_wizard_window.glade.h:27 +#: ../data/glade/account_creation_wizard_window.glade.h:28 #: ../data/glade/manage_proxies_window.glade.h:12 msgid "_Username:" msgstr "_Nazwa użytkownika:" #: ../data/glade/account_modification_window.glade.h:1 +#: ../data/glade/accounts_window.glade.h:1 #: ../data/glade/preferences_window.glade.h:8 msgid "Miscellaneous" msgstr "Różne" #: ../data/glade/account_modification_window.glade.h:2 +#: ../data/glade/accounts_window.glade.h:2 #: ../data/glade/zeroconf_properties_window.glade.h:1 msgid "OpenPGP" msgstr "OpenPGP" #: ../data/glade/account_modification_window.glade.h:3 +#: ../data/glade/accounts_window.glade.h:3 #: ../data/glade/zeroconf_properties_window.glade.h:2 msgid "Personal Information" msgstr "Informacje o sobie" #: ../data/glade/account_modification_window.glade.h:4 +#: ../data/glade/accounts_window.glade.h:4 msgid "Account" msgstr "Konto" @@ -211,23 +223,28 @@ msgid "Account Modification" msgstr "Modyfikacja konta" #: ../data/glade/account_modification_window.glade.h:6 +#: ../data/glade/accounts_window.glade.h:5 msgid "Administration operations" msgstr "Operacje administracyjne" #: ../data/glade/account_modification_window.glade.h:7 +#: ../data/glade/accounts_window.glade.h:6 msgid "Auto-reconnect when connection is lost" msgstr "Automatyczne połącz po zerwaniu połączenia" #: ../data/glade/account_modification_window.glade.h:8 +#: ../data/glade/accounts_window.glade.h:7 #: ../data/glade/zeroconf_properties_window.glade.h:3 msgid "C_onnect on Gajim startup" msgstr "P_ołącz przy starcie programu" #: ../data/glade/account_modification_window.glade.h:9 +#: ../data/glade/accounts_window.glade.h:8 msgid "Chan_ge Password" msgstr "Z_mień hasło" #: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/accounts_window.glade.h:9 msgid "" "Check this so Gajim will connect in port 5223 where legacy servers are " "expected to have SSL capabilities. Note that Gajim uses TLS encryption by " @@ -239,47 +256,60 @@ msgstr "" "tylko serwer daje taką możliwość. Ta opcja wyłącza TLS" #: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/accounts_window.glade.h:10 #: ../data/glade/zeroconf_properties_window.glade.h:4 msgid "Choose _Key..." msgstr "Wybierz _klucz..." #: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/accounts_window.glade.h:11 msgid "Click to change account's password" msgstr "Kliknij, aby zmienić hasło dla konta" #: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/accounts_window.glade.h:12 msgid "Click to request authorization to all contacts of another account" -msgstr "Kliknij aby poprosić o autoryzację od wszystkich kontaktów z innego konta" +msgstr "" +"Kliknij aby poprosić o autoryzację od wszystkich kontaktów z innego konta" #: ../data/glade/account_modification_window.glade.h:14 +#: ../data/glade/accounts_window.glade.h:13 msgid "Connection" msgstr "Połączenie" #: ../data/glade/account_modification_window.glade.h:15 +#: ../data/glade/accounts_window.glade.h:15 msgid "Edit Personal Information..." msgstr "Zmień informacje o sobie..." +#. No configured account #: ../data/glade/account_modification_window.glade.h:16 -#: ../data/glade/roster_window.glade.h:5 ../src/notify.py:458 -#: ../src/notify.py:480 ../src/notify.py:492 ../src/common/helpers.py:914 +#: ../data/glade/accounts_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:6 ../src/notify.py:476 +#: ../src/notify.py:498 ../src/notify.py:510 ../src/common/helpers.py:982 +#: ../src/common/helpers.py:994 msgid "Gajim" msgstr "Gajim" +#. General group cannot be changed #: ../data/glade/account_modification_window.glade.h:17 -#: ../data/glade/preferences_window.glade.h:51 +#: ../data/glade/accounts_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:45 #: ../data/glade/zeroconf_properties_window.glade.h:7 -#: ../src/roster_window.py:348 ../src/roster_window.py:573 -#: ../src/roster_window.py:1254 ../src/roster_window.py:1613 -#: ../src/roster_window.py:2341 ../src/roster_window.py:2383 -#: ../src/roster_window.py:2420 ../src/common/contacts.py:284 +#: ../src/roster_window.py:365 ../src/roster_window.py:630 +#: ../src/roster_window.py:1366 ../src/roster_window.py:1733 +#: ../src/roster_window.py:2117 ../src/roster_window.py:2627 +#: ../src/roster_window.py:2745 ../src/common/contacts.py:314 msgid "General" msgstr "Ogólne" #: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/accounts_window.glade.h:20 msgid "Hostname: " msgstr "Nazwa hosta: " #: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/accounts_window.glade.h:21 msgid "" "If checked, Gajim will also broadcast some more IPs except from just your " "IP, so file transfer has higher chances of working." @@ -288,6 +318,7 @@ msgstr "" "Twoim, tak aby przesyłanie plików przebiegało sprawniej." #: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/accounts_window.glade.h:24 msgid "" "If checked, Gajim will send keep-alive packets to prevent connection timeout " "which results in disconnection" @@ -305,6 +336,7 @@ msgstr "" "z prawem do odczytu tylko dla ciebie" #: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/accounts_window.glade.h:25 #: ../data/glade/zeroconf_properties_window.glade.h:9 msgid "" "If checked, Gajim, when launched, will automatically connect to jabber using " @@ -314,6 +346,7 @@ msgstr "" "wykorzystaniem tego konta" #: ../data/glade/account_modification_window.glade.h:24 +#: ../data/glade/accounts_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:10 msgid "" "If checked, any change to the global status (handled by the combobox at the " @@ -324,46 +357,49 @@ msgstr "" "menu na dole okna listy kontaktów) wpłynie odpowiednio na status tego konta" #: ../data/glade/account_modification_window.glade.h:25 +#: ../data/glade/accounts_window.glade.h:29 msgid "Information about you, as stored in the server" msgstr "Informacje o Tobie, takie jakie są przechowywane na serwerze" -#: ../data/glade/account_modification_window.glade.h:26 -msgid "Manage..." -msgstr "Zarządzaj..." - #: ../data/glade/account_modification_window.glade.h:27 -#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1623 -#: ../src/config.py:3301 +#: ../data/glade/accounts_window.glade.h:34 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1526 +#: ../src/config.py:2002 msgid "No key selected" msgstr "Nie wybrano żadnego klucza" #. None means no proxy profile selected #. GPG Key #: ../data/glade/account_modification_window.glade.h:29 -#: ../data/glade/vcard_information_window.glade.h:32 ../src/config.py:1196 -#: ../src/config.py:1201 ../src/config.py:1385 ../src/config.py:1613 -#: ../src/config.py:1622 ../src/config.py:1682 ../src/config.py:1756 -#: ../src/config.py:3291 ../src/config.py:3300 ../src/dialogs.py:281 -#: ../src/dialogs.py:283 ../src/roster_window.py:1717 -#: ../src/roster_window.py:1724 ../src/roster_window.py:1731 +#: ../data/glade/accounts_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:32 ../src/config.py:1115 +#: ../src/config.py:1186 ../src/config.py:1435 ../src/config.py:1440 +#: ../src/config.py:1900 ../src/config.py:1987 ../src/config.py:2001 +#: ../src/config.py:3083 ../src/config.py:3129 ../src/dialogs.py:342 +#: ../src/dialogs.py:344 ../src/roster_window.py:1837 +#: ../src/roster_window.py:1844 ../src/roster_window.py:1851 msgid "None" msgstr "Żaden" #: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/accounts_window.glade.h:37 #: ../data/glade/profile_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:17 msgid "Personal Information" msgstr "Informacje osobiste" #: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/accounts_window.glade.h:38 msgid "Port: " msgstr "Port: " #: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/accounts_window.glade.h:39 msgid "Priori_ty:" msgstr "Priory_tet:" #: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/accounts_window.glade.h:40 msgid "" "Priority is used in Jabber to determine who gets the events from the jabber " "server when two or more clients are connected using the same account; The " @@ -374,18 +410,22 @@ msgstr "" "który ma wyższy priorytet, będzie odbierał wiadomości" #: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/accounts_window.glade.h:41 msgid "Priority will change automatically according to your status." msgstr "Priorytet ulegnie zmianie automatycznie, stosownie do twojego statusu." #: ../data/glade/account_modification_window.glade.h:35 +#: ../data/glade/accounts_window.glade.h:42 msgid "Proxy:" msgstr "Pośrednik:" #: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/accounts_window.glade.h:44 msgid "Resour_ce:" msgstr "Za_sób: " #: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/accounts_window.glade.h:45 msgid "" "Resource is sent to the Jabber server in order to separate the same JID in " "two or more parts depending on the number of the clients connected in the " @@ -405,41 +445,46 @@ msgid "Save _passphrase (insecure)" msgstr "Zapisz _hasło (nie jest to bezpieczne)" #: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/accounts_window.glade.h:46 #: ../data/glade/zeroconf_properties_window.glade.h:19 msgid "Save conversation _logs for all contacts" msgstr "Zapisz _logi rozmów dla wszystkich kontaktów" #: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/accounts_window.glade.h:48 msgid "Send keep-alive packets" msgstr "Wysyłaj pakiety podtrzymujące" #: ../data/glade/account_modification_window.glade.h:42 +#: ../data/glade/accounts_window.glade.h:49 #: ../data/glade/zeroconf_properties_window.glade.h:20 msgid "Synch_ronize account status with global status" msgstr "Synch_ronizuj status konta z globalnym statusem" #: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/accounts_window.glade.h:50 +#: ../data/glade/synchronise_contacts_dialog.glade.h:2 #: ../data/glade/synchronise_select_account_dialog.glade.h:2 msgid "Synchronise contacts" msgstr "Synchronizuj kontakty" #: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/accounts_window.glade.h:52 msgid "Use _SSL (legacy)" msgstr "Korzystaj z _SSL" -#: ../data/glade/account_modification_window.glade.h:45 -msgid "Use custom hostname/port" -msgstr "Użyj własnej nazwy hosta/portu" - #: ../data/glade/account_modification_window.glade.h:46 +#: ../data/glade/accounts_window.glade.h:55 msgid "Use file transfer proxies" msgstr "Używaj serwerów proxy do przesyłania plików" #: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/accounts_window.glade.h:56 msgid "_Adjust to status" msgstr "_Dostosuj do statusu" #: ../data/glade/account_modification_window.glade.h:48 +#: ../data/glade/accounts_window.glade.h:57 msgid "_Jabber ID:" msgstr "_Jabber ID:" @@ -447,47 +492,85 @@ msgstr "_Jabber ID:" msgid "_Name:" msgstr "_Nazwa: " -#: ../data/glade/accounts_window.glade.h:1 -msgid "Accounts" -msgstr "Konta" +#: ../data/glade/accounts_window.glade.h:14 +#: ../data/glade/profile_window.glade.h:11 +#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/zeroconf_information_window.glade.h:2 +#: ../data/glade/zeroconf_properties_window.glade.h:5 +msgid "E-Mail:" +msgstr "Adres e-mail:" -#: ../data/glade/accounts_window.glade.h:2 -msgid "" -"If checked, all local contacts that use a Bonjour compatible chat client " -"(like iChat, Trillian or Gaim) will be shown in roster. You don't need to be " -"connected to a jabber server for it to work.\n" -"This is only available if python-avahi is installed and avahi-daemon is " -"running." +#. XML Console enable checkbutton +#: ../data/glade/accounts_window.glade.h:16 +#: ../data/glade/xml_console_window.glade.h:4 +msgid "Enable" +msgstr "Włącz" + +#: ../data/glade/accounts_window.glade.h:17 +#: ../data/glade/zeroconf_information_window.glade.h:3 +#: ../data/glade/zeroconf_properties_window.glade.h:6 +msgid "First Name:" +msgstr "Imię:" + +#: ../data/glade/accounts_window.glade.h:22 +msgid "If checked, Gajim will get the password from a GPG agent like seahorse" msgstr "" -"Jeżeli opcja ta zostanie uaktywniona, znajdujące się w twojej sieci lokalnej " -"kontakty używające klienta wykorzystującego technologię Bonjour (jak iChat, " -"Trillian czy Gaim) pojawią się na rosterze. Nie musisz łączyć się z serwerem " -"Jabbera, by z nimi rozmawiać." +"Zaznaczenie tej opcji spowoduje pobieranie hasła z agenta GPG, np. Seahorse" -#: ../data/glade/accounts_window.glade.h:4 +#: ../data/glade/accounts_window.glade.h:27 +#: ../data/glade/zeroconf_properties_window.glade.h:11 msgid "" -"If you have 2 or more accounts and this is checked, Gajim will list all " -"contacts as if you had one account" +"If the default port that is used for incoming messages is unfitting for your " +"setup you can select another one here.\n" +"You might consider to change possible firewall settings." msgstr "" -"Jeśli masz dwa konta lub więcej, to dzięki tej opcji Gajim pokaże wszystkie " -"kontakty w taki sposób, jakby było to jedno konto" +"Jeżeli domyślny port, na którym przyjmowane są nadchodzące wiadomości nie " +"odpowiada ci, możesz wskazać numer portu, jakiego chcesz używać.\n" +"Konieczna stać się może ponowna konfiguracja firewalla." -#: ../data/glade/accounts_window.glade.h:5 +#: ../data/glade/accounts_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/zeroconf_information_window.glade.h:4 +#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:509 +msgid "Jabber ID:" +msgstr "Jabber ID:" + +#: ../data/glade/accounts_window.glade.h:31 +#: ../data/glade/zeroconf_information_window.glade.h:5 +#: ../data/glade/zeroconf_properties_window.glade.h:14 +msgid "Last Name:" +msgstr "Nazwisko:" + +#: ../data/glade/accounts_window.glade.h:33 msgid "Mer_ge accounts" msgstr "_Połącz konta" -#: ../data/glade/accounts_window.glade.h:6 -msgid "_Enable link-local messaging" -msgstr "_Uaktywnij przesyłanie wiadomości do adresów link-local" +#. Rename +#: ../data/glade/accounts_window.glade.h:43 ../src/roster_window.py:2697 +msgid "Re_name" +msgstr "_Zmień nazwę" -#: ../data/glade/accounts_window.glade.h:7 -msgid "_Modify" -msgstr "_Edytuj" +#: ../data/glade/accounts_window.glade.h:51 +msgid "Use GPG _Agent" +msgstr "Użyj _Agenta GPG" -#: ../data/glade/accounts_window.glade.h:8 -#: ../data/glade/remove_account_window.glade.h:4 -msgid "_Remove" -msgstr "_Usuń" +#: ../data/glade/accounts_window.glade.h:54 +#: ../data/glade/zeroconf_properties_window.glade.h:21 +msgid "Use custom port:" +msgstr "Użyj innego portu:" + +#: ../data/glade/accounts_window.glade.h:59 +msgid "gtk-add" +msgstr "gtk-add" + +#: ../data/glade/accounts_window.glade.h:60 +#: ../data/glade/features_window.glade.h:4 +msgid "gtk-close" +msgstr "gtk-close" + +#: ../data/glade/accounts_window.glade.h:61 +msgid "gtk-remove" +msgstr "gtk-remove" #: ../data/glade/add_new_contact_window.glade.h:1 msgid "A_ccount:" @@ -582,6 +665,7 @@ msgid "This jabber entity does not expose any commands." msgstr "Ten obiekt Jabbera nie udostępnia żadnych komend." #: ../data/glade/advanced_configuration_window.glade.h:1 +#: ../data/glade/features_window.glade.h:1 msgid "Description" msgstr "Opis" @@ -608,48 +692,40 @@ msgid "Deletes Message of the Day" msgstr "Usuwa Wiadomość Dnia" #: ../data/glade/advanced_menuitem_menu.glade.h:3 +msgid "Edit _Privacy Lists..." +msgstr "_Edytuj listy prywatności" + +#: ../data/glade/advanced_menuitem_menu.glade.h:4 msgid "Sends a message to users currently connected to this server" msgstr "Wysyła wiadomość do użytkowników aktualnie połączonych z tym serwerem" -#: ../data/glade/advanced_menuitem_menu.glade.h:4 -msgid "Set MOTD" +#: ../data/glade/advanced_menuitem_menu.glade.h:5 +msgid "Set MOTD..." msgstr "Ustaw MOTD" -#: ../data/glade/advanced_menuitem_menu.glade.h:5 +#: ../data/glade/advanced_menuitem_menu.glade.h:6 msgid "Sets Message of the Day" msgstr "Ustawia Wiadomość Dnia" -#: ../data/glade/advanced_menuitem_menu.glade.h:6 +#: ../data/glade/advanced_menuitem_menu.glade.h:7 msgid "Show _XML Console" msgstr "Konsola _XML" -#: ../data/glade/advanced_menuitem_menu.glade.h:7 -msgid "Update MOTD" -msgstr "Uaktualnij MOTD" - #: ../data/glade/advanced_menuitem_menu.glade.h:8 +msgid "Update MOTD..." +msgstr "Uaktualnij MOTD..." + +#: ../data/glade/advanced_menuitem_menu.glade.h:9 msgid "Updates Message of the Day" msgstr "Uaktualnia Wiadomość Dnia" -#: ../data/glade/advanced_menuitem_menu.glade.h:9 +#: ../data/glade/advanced_menuitem_menu.glade.h:10 msgid "_Administrator" msgstr "_Administrator" -#: ../data/glade/advanced_menuitem_menu.glade.h:10 -msgid "_Blocked Contacts" -msgstr "_Kontakty zablokowane" - #: ../data/glade/advanced_menuitem_menu.glade.h:11 -msgid "_Privacy Lists" -msgstr "_Listy prywatności" - -#: ../data/glade/advanced_menuitem_menu.glade.h:12 -msgid "_Send Server Message" -msgstr "_Wyślij wiadomość do serwera" - -#: ../data/glade/advanced_menuitem_menu.glade.h:13 -msgid "_Send Single Message" -msgstr "_Wyślij wiadomość" +msgid "_Send Server Message..." +msgstr "_Wyślij wiadomość do serwera..." #: ../data/glade/advanced_notifications_window.glade.h:1 msgid " a window/tab opened with that contact " @@ -664,7 +740,7 @@ msgid "Conditions" msgstr "Warunki" #: ../data/glade/advanced_notifications_window.glade.h:4 -#: ../data/glade/preferences_window.glade.h:10 +#: ../data/glade/preferences_window.glade.h:12 msgid "Sounds" msgstr "Dźwięki" @@ -681,7 +757,7 @@ msgid "All statuses" msgstr "Dowolny status" #: ../data/glade/advanced_notifications_window.glade.h:8 -#: ../src/common/commands.py:91 ../src/common/helpers.py:243 +#: ../src/common/commands.py:96 ../src/common/helpers.py:251 msgid "Away" msgstr "Zaraz wracam" @@ -698,7 +774,7 @@ msgid "Have " msgstr "rozmawiam " #: ../data/glade/advanced_notifications_window.glade.h:12 -#: ../src/common/helpers.py:253 +#: ../src/common/helpers.py:261 msgid "Invisible" msgstr "Niewidoczny" @@ -707,7 +783,7 @@ msgid "Launch a command" msgstr "Wykonaj komendę" #: ../data/glade/advanced_notifications_window.glade.h:14 -#: ../src/common/helpers.py:226 +#: ../src/common/helpers.py:234 msgid "Not Available" msgstr "Nieobecny" @@ -830,6 +906,10 @@ msgstr "Odebrano nowy wpis" msgid "You have received new entry:" msgstr "Otrzymałeś nowy artykuł:" +#: ../data/glade/blocked_contacts_window.glade.h:1 +msgid "Blocked Contacts" +msgstr "Kontakty zablokowane" + #: ../data/glade/change_password_dialog.glade.h:1 msgid "Change Password" msgstr "Zmień hasło" @@ -859,11 +939,9 @@ msgid "Join _Group Chat" msgstr "Dołącz do _pokoju" #: ../data/glade/chat_context_menu.glade.h:2 -#: ../data/glade/chat_control_popup_menu.glade.h:4 -#: ../data/glade/gc_occupants_menu.glade.h:2 -#: ../data/glade/roster_contact_context_menu.glade.h:11 -msgid "_Add to Roster" -msgstr "Dod_aj do listy kontaktów" +#: ../data/glade/roster_contact_context_menu.glade.h:12 +msgid "_Add to Roster..." +msgstr "Dod_aj do listy kontaktów..." #: ../data/glade/chat_context_menu.glade.h:3 msgid "_Copy JID/Email Address" @@ -882,7 +960,6 @@ msgid "_Open Link in Browser" msgstr "_Otwórz Link w przeglądarce" #: ../data/glade/chat_context_menu.glade.h:7 -#: ../data/glade/roster_window.glade.h:20 #: ../data/glade/subscription_request_popup_menu.glade.h:1 #: ../data/glade/systray_context_menu.glade.h:7 msgid "_Start Chat" @@ -893,28 +970,62 @@ msgid "Click to see past conversations with this contact" msgstr "Kliknij by zobaczyć poprzednie rozmowy z tym kontaktem" #: ../data/glade/chat_control_popup_menu.glade.h:2 -#: ../data/glade/roster_contact_context_menu.glade.h:8 +msgid "Invite _Contacts" +msgstr "Zaproś kontakty" + +#: ../data/glade/chat_control_popup_menu.glade.h:3 +#: ../data/glade/gc_occupants_menu.glade.h:3 #: ../data/glade/zeroconf_contact_context_menu.glade.h:4 msgid "Send _File" msgstr "Wyślij _plik" -#: ../data/glade/chat_control_popup_menu.glade.h:3 +#: ../data/glade/chat_control_popup_menu.glade.h:4 +msgid "Toggle End to End Encryption" +msgstr "Włącz/wyłącz _szyfrowanie połączenia" + +#: ../data/glade/chat_control_popup_menu.glade.h:5 msgid "Toggle Open_PGP Encryption" msgstr "Włącz/wyłącz szyfrowanie Open_PGP" -#: ../data/glade/chat_control_popup_menu.glade.h:5 -#: ../data/glade/gc_control_popup_menu.glade.h:6 -msgid "_Compact View Alt+C" -msgstr "Widok _zwarty Alt+C" - #: ../data/glade/chat_control_popup_menu.glade.h:6 -#: ../data/glade/gc_control_popup_menu.glade.h:8 -#: ../data/glade/gc_occupants_menu.glade.h:5 -#: ../data/glade/roster_contact_context_menu.glade.h:15 +#: ../data/glade/gc_occupants_menu.glade.h:4 +msgid "_Add to Roster" +msgstr "Dod_aj do listy kontaktów" + +#: ../data/glade/chat_control_popup_menu.glade.h:7 +#: ../data/glade/gc_control_popup_menu.glade.h:7 +#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/roster_window.glade.h:19 #: ../data/glade/zeroconf_contact_context_menu.glade.h:6 +#: ../src/roster_window.py:2566 msgid "_History" msgstr "_Historia" +#: ../data/glade/chat_to_muc_window.glade.h:1 +msgid "In_vite" +msgstr "_Zaproś" + +#: ../data/glade/chat_to_muc_window.glade.h:2 +msgid "Invite Friends !" +msgstr "Zaproś przyjaciół!" + +#: ../data/glade/chat_to_muc_window.glade.h:3 +msgid "MUC server" +msgstr "Serwer MUC" + +#: ../data/glade/chat_to_muc_window.glade.h:4 +msgid "Please select a MUC server." +msgstr "Proszę wybrać serwer MUC." + +#: ../data/glade/chat_to_muc_window.glade.h:5 +msgid "" +"You are going to begin a Multi-User Chat.\n" +"Select the contacts you want to invite" +msgstr "" +"Zamierzasz rozpocząć czat.\n" +"Wybierz kontakty, które chcesz do niego zaprosić" + #: ../data/glade/data_form_window.glade.h:1 msgid "Fill in the form." msgstr "Wypełnij formularz." @@ -927,6 +1038,14 @@ msgstr "Konfiguracja pokoju" msgid "Edit Groups" msgstr "Edytuj Grupy" +#: ../data/glade/features_window.glade.h:2 +msgid "List of possible features in Gajim:" +msgstr "Lista możliwych funkcjonalności Gajima:" + +#: ../data/glade/features_window.glade.h:3 +msgid "Features" +msgstr "Możliwości programu" + #: ../data/glade/filetransfers.glade.h:1 msgid "A list of active, completed and stopped file transfers" msgstr "Lista aktywnych, ukończonych i zatrzymanych transferów plików" @@ -979,7 +1098,7 @@ msgstr "" msgid "When a file transfer is complete show a popup notification" msgstr "Gdy plik w całości zostanie przesłany, wyświetl okno powiadomienia" -#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:761 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:777 msgid "_Continue" msgstr "_Kontynuuj" @@ -987,7 +1106,7 @@ msgstr "_Kontynuuj" msgid "_Notify me when a file transfer is complete" msgstr "_Powiadom mnie gdy przesyłanie pliku dobiegnie końca" -#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:188 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:191 msgid "_Open Containing Folder" msgstr "_Otwórz katalog zawierający ten plik" @@ -1076,62 +1195,70 @@ msgid "_Background:" msgstr "_Tło:" #: ../data/glade/gc_control_popup_menu.glade.h:1 -msgid "Change _Nickname" -msgstr "Zmień pseudo_nim" +msgid "Change _Nickname..." +msgstr "Zmień pseudo_nim..." #: ../data/glade/gc_control_popup_menu.glade.h:2 -msgid "Change _Subject" -msgstr "Zmień _temat" +msgid "Change _Subject..." +msgstr "Zmień _temat..." #: ../data/glade/gc_control_popup_menu.glade.h:3 msgid "Click to see past conversation in this room" msgstr "Kliknij by zobaczyć poprzednie rozmowy w tym pokoju" #: ../data/glade/gc_control_popup_menu.glade.h:4 -msgid "Configure _Room" -msgstr "Konfiguruj _pokój" +msgid "Configure _Room..." +msgstr "Konfiguruj _pokój..." #: ../data/glade/gc_control_popup_menu.glade.h:5 -msgid "_Bookmark This Room" +msgid "_Bookmark" msgstr "Dodaj _zakładkę dla tego pokoju" -#: ../data/glade/gc_control_popup_menu.glade.h:7 -msgid "_Destroy room" +#: ../data/glade/gc_control_popup_menu.glade.h:6 +msgid "_Destroy Room" msgstr "_Zlikwiduj pokój" +#: ../data/glade/gc_control_popup_menu.glade.h:8 +msgid "_Manage Room" +msgstr "Zarządzaj pokojem" + +#: ../data/glade/gc_control_popup_menu.glade.h:9 +msgid "_Minimize on close" +msgstr "_Minimalizuj przy zamknięciu" + #: ../data/glade/gc_occupants_menu.glade.h:1 msgid "Mo_derator" msgstr "Mo_derator" -#: ../data/glade/gc_occupants_menu.glade.h:3 +#: ../data/glade/gc_occupants_menu.glade.h:2 +msgid "Occupant Actions" +msgstr "Działania użytk_ownika" + +#: ../data/glade/gc_occupants_menu.glade.h:5 msgid "_Admin" msgstr "_Administrator" -#: ../data/glade/gc_occupants_menu.glade.h:4 +#: ../data/glade/gc_occupants_menu.glade.h:6 msgid "_Ban" msgstr "Za_banuj" -#: ../data/glade/gc_occupants_menu.glade.h:6 +#: ../data/glade/gc_occupants_menu.glade.h:8 msgid "_Kick" msgstr "Wy_rzuć" -#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/gc_occupants_menu.glade.h:9 msgid "_Member" msgstr "_Uczestnik" -#: ../data/glade/gc_occupants_menu.glade.h:8 -msgid "_Occupant Actions" -msgstr "Działania użytk_ownika" - -#: ../data/glade/gc_occupants_menu.glade.h:9 +#: ../data/glade/gc_occupants_menu.glade.h:10 msgid "_Owner" msgstr "_Właściciel" -#: ../data/glade/gc_occupants_menu.glade.h:10 +#: ../data/glade/gc_occupants_menu.glade.h:11 msgid "_Send Private Message" msgstr "_Wyślij prywatną wiadomość" -#: ../data/glade/gc_occupants_menu.glade.h:11 +#: ../data/glade/gc_occupants_menu.glade.h:12 msgid "_Voice" msgstr "_Głos" @@ -1139,13 +1266,13 @@ msgstr "_Głos" msgid "Create new post" msgstr "Utwórz nowy wpis" -#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:268 +#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:276 msgid "From" msgstr "Od" #. holds subject -#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:142 -#: ../src/history_manager.py:173 +#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:147 +#: ../src/history_manager.py:178 msgid "Subject" msgstr "Temat" @@ -1186,32 +1313,54 @@ msgid "_Search Database" msgstr "_Szukaj w bazie" #: ../data/glade/history_window.glade.h:1 -msgid "Build custom query" -msgstr "Stwórz własne zapytanie" +msgid "History Viewer" +msgstr "Przeglądanie historii" #: ../data/glade/history_window.glade.h:2 +msgid "JID Selection" +msgstr "Wybór JID-a" + +#: ../data/glade/history_window.glade.h:3 +msgid "" +"Choose the chatlog you want to view. \n" +"Enter the jid of a groupchat or a contact here. For online accounts you can " +"even enter a a contact's nickname." +msgstr "" +"Wybierz katalog, który chcesz przejrzeć. \n" +"Tu wpisz JID czatu lub kontaktu. Jeżeli kontakt jest online, możesz podać " +"sam nick." + +#: ../data/glade/history_window.glade.h:5 ../src/history_window.py:224 msgid "Conversation History" msgstr "Historia rozmowy" -#: ../data/glade/history_window.glade.h:3 -msgid "Query Builder..." -msgstr "Kreator zapytań..." +#: ../data/glade/history_window.glade.h:6 +msgid "" +"Current History\n" +"All Chat Histories" +msgstr "" +"Bieżąca historia\n" +"Wszystkie historie rozmów" -#: ../data/glade/history_window.glade.h:4 +#: ../data/glade/history_window.glade.h:8 #: ../data/glade/search_window.glade.h:2 msgid "Search" msgstr "Szukaj" -#: ../data/glade/history_window.glade.h:5 +#: ../data/glade/history_window.glade.h:9 #: ../data/glade/zeroconf_information_window.glade.h:10 msgid "_Log conversation history" msgstr "_Zapisuj historię rozmowy" -#: ../data/glade/history_window.glade.h:6 -#: ../data/glade/search_window.glade.h:3 ../src/disco.py:1177 +#: ../data/glade/history_window.glade.h:10 +#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1181 msgid "_Search" msgstr "_Szukaj" +#: ../data/glade/history_window.glade.h:11 +msgid "in" +msgstr "w" + #: ../data/glade/invitation_received_dialog.glade.h:1 msgid "Accept" msgstr "Akceptuj" @@ -1225,7 +1374,7 @@ msgstr "Odmów" msgid "Invitation Received" msgstr "Zaproszenie Odebrane" -#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1208 +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1381 msgid "Join Group Chat" msgstr "Dołącz do pokoju" @@ -1234,14 +1383,14 @@ msgid "Join this room automatically when I connect" msgstr "Automatycznie dołącz do tego pokoju po uzyskaniu połączenia" #: ../data/glade/join_groupchat_window.glade.h:3 -#: ../data/glade/manage_bookmarks_window.glade.h:4 +#: ../data/glade/manage_bookmarks_window.glade.h:5 #: ../data/glade/profile_window.glade.h:24 #: ../data/glade/vcard_information_window.glade.h:31 msgid "Nickname:" msgstr "Pseudonim:" #: ../data/glade/join_groupchat_window.glade.h:4 -#: ../data/glade/manage_bookmarks_window.glade.h:5 +#: ../data/glade/manage_bookmarks_window.glade.h:6 msgid "Password:" msgstr "Hasło:" @@ -1250,12 +1399,12 @@ msgid "Recently:" msgstr "Ostatnio:" #: ../data/glade/join_groupchat_window.glade.h:6 -#: ../data/glade/manage_bookmarks_window.glade.h:7 +#: ../data/glade/manage_bookmarks_window.glade.h:8 msgid "Room:" msgstr "Pokój:" -#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1165 -#: ../src/disco.py:1615 +#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1169 +#: ../src/disco.py:1624 msgid "_Join" msgstr "_Dołącz" @@ -1275,15 +1424,19 @@ msgstr "Zaznaczenie spowoduje łączenie z tym pokojem przy starcie programu" msgid "Manage Bookmarks" msgstr "Zarządzaj zakładkami" -#: ../data/glade/manage_bookmarks_window.glade.h:6 +#: ../data/glade/manage_bookmarks_window.glade.h:4 +msgid "Minimize on Auto Join" +msgstr "Minimalizuj po automatycznym wejściu" + +#: ../data/glade/manage_bookmarks_window.glade.h:7 msgid "Print status:" msgstr "Wyświetlaj status:" -#: ../data/glade/manage_bookmarks_window.glade.h:8 +#: ../data/glade/manage_bookmarks_window.glade.h:9 msgid "Server:" msgstr "Serwer:" -#: ../data/glade/manage_bookmarks_window.glade.h:9 +#: ../data/glade/manage_bookmarks_window.glade.h:10 msgid "Title:" msgstr "Tytuł:" @@ -1299,7 +1452,8 @@ msgstr "Ustawienia" msgid "" "HTTP Connect\n" "SOCKS5" -msgstr "Połączenie HTTP\n" +msgstr "" +"Połączenie HTTP\n" "SOCKS5" #: ../data/glade/manage_proxies_window.glade.h:5 @@ -1312,6 +1466,10 @@ msgstr "Zarządzaj profilami pośrednika" msgid "Name:" msgstr "Nazwa:" +#: ../data/glade/manage_proxies_window.glade.h:7 +msgid "Pass_word:" +msgstr "_Hasło:" + #: ../data/glade/manage_proxies_window.glade.h:8 msgid "Type:" msgstr "Typ:" @@ -1320,17 +1478,21 @@ msgstr "Typ:" msgid "Use authentication" msgstr "Używaj autoryzacji" +#: ../data/glade/manage_proxies_window.glade.h:10 +msgid "_Host:" +msgstr "_Host:" + #: ../data/glade/message_window.glade.h:1 msgid "Click to insert an emoticon (Alt+M)" msgstr "Kliknij by wstawić emotikon (Alt+E)" -#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1125 +#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1268 msgid "OpenPGP Encryption" msgstr "Szyfrowanie OpenPGP" #. 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:4 -#: ../data/glade/roster_window.glade.h:10 +#: ../data/glade/roster_window.glade.h:12 #: ../data/glade/subscription_request_window.glade.h:6 msgid "_Actions" msgstr "_Działania" @@ -1338,7 +1500,7 @@ msgstr "_Działania" #. 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:6 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:245 +#: ../src/filetransfers_window.py:248 msgid "_Send" msgstr "_Wyślij" @@ -1354,36 +1516,48 @@ msgstr "Edytor zaawansowanych konfiguracji" msgid "Applications" msgstr "Aplikacje" +#: ../data/glade/preferences_window.glade.h:3 +msgid "Chat Appearance" +msgstr "Tożsamość na czacie" + #. a header for custom browser/client/file manager. so translate sth like: Custom Settings -#: ../data/glade/preferences_window.glade.h:4 +#: ../data/glade/preferences_window.glade.h:5 msgid "Custom" msgstr "Własne" -#: ../data/glade/preferences_window.glade.h:5 +#: ../data/glade/preferences_window.glade.h:6 msgid "Format of a line" msgstr "Format linii" -#: ../data/glade/preferences_window.glade.h:6 +#: ../data/glade/preferences_window.glade.h:7 msgid "GMail Options" msgstr "Opcje konta Gmail" -#: ../data/glade/preferences_window.glade.h:7 -msgid "Interface Customization" -msgstr "Własne ustawienia interfejsu" - #: ../data/glade/preferences_window.glade.h:9 msgid "Preset Status Messages" msgstr "Zapisane opisy" +#: ../data/glade/preferences_window.glade.h:10 +msgid "Privacy" +msgstr "

    Prywatność" + #: ../data/glade/preferences_window.glade.h:11 +msgid "Roster Appearance" +msgstr "Tożsamość na rosterze" + +#: ../data/glade/preferences_window.glade.h:13 +msgid "Themes" +msgstr "Tematy" + +#: ../data/glade/preferences_window.glade.h:14 msgid "Visual Notifications" msgstr "Powiadomienia wizualne" -#: ../data/glade/preferences_window.glade.h:12 +#: ../data/glade/preferences_window.glade.h:15 msgid "Advanced" msgstr "Zaawansowane" -#: ../data/glade/preferences_window.glade.h:13 +#: ../data/glade/preferences_window.glade.h:16 msgid "" "All chat states\n" "Composing only\n" @@ -1393,26 +1567,22 @@ msgstr "" "Tylko dotyczące pisania\n" "Wyłączone" -#: ../data/glade/preferences_window.glade.h:16 +#: ../data/glade/preferences_window.glade.h:19 msgid "Allow _OS information to be sent" msgstr "Zezwól na wysyłanie informacji o systemie _operacyjnym" -#: ../data/glade/preferences_window.glade.h:17 +#: ../data/glade/preferences_window.glade.h:20 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "" "Pokazuj powiadomienia gdy mam status _zaraz wracam/nieobecny/zajęty/" "niewidoczny" -#: ../data/glade/preferences_window.glade.h:18 -msgid "Also known as iChat style" -msgstr "Znany także jako styl iChat" - -#: ../data/glade/preferences_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:21 msgid "Always check to see if Gajim is the _default Jabber client on startup" msgstr "" "Przy starcie zawsze sprawdzaj czy Gajim jest _domyślnym_ klientem Jabbera" -#: ../data/glade/preferences_window.glade.h:20 +#: ../data/glade/preferences_window.glade.h:22 msgid "" "An example: If you have enabled status message for away, Gajim won't ask you " "anymore for a status message when you change your status to away; it will " @@ -1422,19 +1592,19 @@ msgstr "" "zapamięta go i nie będzie prosił o jego zmianę po ponownym ustawieniu " "takiego stanu" -#: ../data/glade/preferences_window.glade.h:21 +#: ../data/glade/preferences_window.glade.h:23 msgid "Ask status message when I:" msgstr "Pytaj o opis przy zmianie statusu na:" -#: ../data/glade/preferences_window.glade.h:22 +#: ../data/glade/preferences_window.glade.h:24 msgid "Auto _away after:" msgstr "Automatyczny status '_Zaraz wracam' po:" -#: ../data/glade/preferences_window.glade.h:23 +#: ../data/glade/preferences_window.glade.h:25 msgid "Auto _not available after:" msgstr "Automatyczny status '_Nieobecny' po:" -#: ../data/glade/preferences_window.glade.h:24 +#: ../data/glade/preferences_window.glade.h:26 msgid "" "Autodetect on every Gajim startup\n" "Always use GNOME default applications\n" @@ -1448,11 +1618,7 @@ msgstr "" "Zawsze używaj domyślnych aplikacji XFCE4\n" "Własne" -#: ../data/glade/preferences_window.glade.h:29 -msgid "Chat" -msgstr "Rozmowa" - -#: ../data/glade/preferences_window.glade.h:30 +#: ../data/glade/preferences_window.glade.h:31 msgid "" "Check this option, only if someone you don't have in the roster spams/annoys " "you. Use with caution, because it blocks all messages from any contact that " @@ -1462,18 +1628,14 @@ msgstr "" "wiadomościami. Stosuj ją ostrożnie, ponieważ powoduje ona blokowanie " "wszystkich wiadomości od osób, których nie masz na liście kontaktów" -#: ../data/glade/preferences_window.glade.h:31 +#: ../data/glade/preferences_window.glade.h:32 msgid "Configure color and font of the interface" msgstr "Konfiguruj kolor i czcionkę interfejsu" -#: ../data/glade/preferences_window.glade.h:32 +#: ../data/glade/preferences_window.glade.h:33 msgid "Default Status Messages" msgstr "Domyślne stany opisowe" -#: ../data/glade/preferences_window.glade.h:33 -msgid "Default status _iconset:" -msgstr "Domyślny zestaw ikon _statusu:" - #: ../data/glade/preferences_window.glade.h:34 msgid "" "Determined by sender\n" @@ -1497,22 +1659,14 @@ msgid "Display status _messages of contacts in roster" msgstr "Wyświetlaj _opisy statusu kontaktu na liście kontaktów" #: ../data/glade/preferences_window.glade.h:40 -msgid "Displayed Chat state noti_fications:" -msgstr "Rodzaj wyświetlanych _powiadomień podczas rozmowy:" - -#: ../data/glade/preferences_window.glade.h:41 -msgid "E_very 5 minutes" -msgstr "Co 5 _minut" - -#: ../data/glade/preferences_window.glade.h:42 msgid "Emoticons:" msgstr "Emotikony:" -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:41 msgid "Events" msgstr "Zdarzenia" -#: ../data/glade/preferences_window.glade.h:44 +#: ../data/glade/preferences_window.glade.h:42 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 " @@ -1522,7 +1676,7 @@ msgstr "" "W tym miejscu możesz zdecydować, które z tych danych chcesz wyświetlać w " "oknie rozmowy." -#: ../data/glade/preferences_window.glade.h:45 +#: ../data/glade/preferences_window.glade.h:43 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 " @@ -1531,30 +1685,7 @@ msgstr "" "Gajim może wysyłać i odbierać meta-infomacje związane z prowadzoną rozmową. " "W tym miejscu możesz zdecydować, jakie dane chcesz wysyłać do rozmówcy." -#: ../data/glade/preferences_window.glade.h:46 -msgid "" -"Gajim will automatically show new events by popping up the relevant window" -msgstr "" -"Gajim automatycznie wyświetli nową wiadomość w nowym oknie lub w nowej " -"karcie otwartego okna rozmowy" - -#: ../data/glade/preferences_window.glade.h:47 -msgid "" -"Gajim will notify you for new events via a popup in the bottom right of the " -"screen" -msgstr "" -"Gajim powiadomi Cię o nadejściu nowej wiadomości wyświetlając okienko w " -"prawym dolnym rogu ekranu" - -#: ../data/glade/preferences_window.glade.h:48 -msgid "" -"Gajim will notify you via a popup window in the bottom right of the screen " -"about contacts that just signed in" -msgstr "" -"Gajim powiadomi automatycznie przy pomocy okna w prawym dolnym rogu o " -"kontaktach, które zmieniają status na Dostępny" - -#: ../data/glade/preferences_window.glade.h:49 +#: ../data/glade/preferences_window.glade.h:44 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1562,12 +1693,11 @@ msgstr "" "Gajim powiadomi automatycznie przy pomocy okna w prawym dolnym rogu o " "kontaktach które zmieniają status na Rozłączony" -#: ../data/glade/preferences_window.glade.h:50 -msgid "" -"Gajim will only change the icon of the contact that triggered the new event" -msgstr "Gajim zmieni jedynie ikonę kontaktu, który przysłał nową wiadomość" +#: ../data/glade/preferences_window.glade.h:46 +msgid "Hides buttons in chatwindows to " +msgstr "Ukrywa przyciski w oknie czatu " -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:47 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" @@ -1575,7 +1705,7 @@ msgstr "" "Jeżeli opcja ta zostanie uaktywniona, Gajim będzie również wyświetlał " "informacje o nadawcach nowej poczty w twojej skrzynce" -#: ../data/glade/preferences_window.glade.h:53 +#: ../data/glade/preferences_window.glade.h:48 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1583,7 +1713,7 @@ msgstr "" "Zaznaczenie tej opcji spowoduje wyświetlanie awatarów w oknie listy " "kontaktów (roster oraz okno czatu)" -#: ../data/glade/preferences_window.glade.h:54 +#: ../data/glade/preferences_window.glade.h:49 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -1591,15 +1721,7 @@ msgstr "" "Jeśli jest zaznaczone, Gajim będzie wyświetlał opis statusu kontaktu pod " "jego nazwą na liście kontaktów" -#: ../data/glade/preferences_window.glade.h:55 -msgid "" -"If checked, Gajim will remember the roster and chat window positions in the " -"screen and the sizes of them next time you run it" -msgstr "" -"Zaznaczenie tej opcji spowoduje zapamiętanie położenia głównego okna " -"programu na ekranie oraz jego rozmiaru" - -#: ../data/glade/preferences_window.glade.h:56 +#: ../data/glade/preferences_window.glade.h:50 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, " @@ -1609,7 +1731,7 @@ msgstr "" "transportu, np. kontakt z MSN będzie miał odpowiednie ikony statusu " "dostępny, zaraz wracam, zajęty, itd" -#: ../data/glade/preferences_window.glade.h:57 +#: ../data/glade/preferences_window.glade.h:51 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" @@ -1617,15 +1739,15 @@ msgstr "" "Zaznaczenie tej opcji spowoduje zastąpienie emotikon tekstowych jak ':)' " "emotikonami graficznymi" -#: ../data/glade/preferences_window.glade.h:58 +#: ../data/glade/preferences_window.glade.h:52 msgid "Ignore rich content in incoming messages" msgstr "Ignoruj wzbogaconą treść w wiadomościach" -#: ../data/glade/preferences_window.glade.h:59 +#: ../data/glade/preferences_window.glade.h:53 msgid "Ma_nage..." msgstr "Za_rządzaj..." -#: ../data/glade/preferences_window.glade.h:60 +#: ../data/glade/preferences_window.glade.h:54 msgid "" "Never\n" "Always\n" @@ -1637,59 +1759,53 @@ msgstr "" "Według konta\n" "Według typu" -#: ../data/glade/preferences_window.glade.h:64 -msgid "Notify me about contacts that: " -msgstr "Powiadom mnie o kontaktach zmieniających status na: " +#: ../data/glade/preferences_window.glade.h:58 +msgid "Notify me about contacts that sign _in" +msgstr "Powiadom mnie o kontaktach, które się _logują" -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:59 +msgid "Notify me about contacts that sign _out" +msgstr "Powiadom mnie o kontaktach, które się _wylogowują " + +#: ../data/glade/preferences_window.glade.h:60 msgid "Notify on new _GMail email" msgstr "Powiadamiaj o nowej poczcie na koncie _Gmail" -#: ../data/glade/preferences_window.glade.h:66 -msgid "On every _message" -msgstr "W każdej _wiadomości" - -#: ../data/glade/preferences_window.glade.h:67 -msgid "One message _window:" -msgstr "Grupuj okna:" - -#: ../data/glade/preferences_window.glade.h:68 -msgid "Outgoing Chat state noti_fications:" -msgstr "Wysyłanie powiadomienia o stanie _rozmowy:" - -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:61 msgid "Play _sounds" msgstr "Odtwórz _dźwięk" -#: ../data/glade/preferences_window.glade.h:70 +#: ../data/glade/preferences_window.glade.h:62 +msgid "" +"Pop it up\n" +"Notify me about it\n" +"Show only in roster" +msgstr "" +"Otwórz okno\n" +"Powiadom mnie o tym\n" +"Pokaż tylko w rosterze" + +#: ../data/glade/preferences_window.glade.h:65 msgid "Preferences" msgstr "Ustawienia" -#: ../data/glade/preferences_window.glade.h:71 -msgid "Print time:" -msgstr "Wyświetlaj czas:" +#: ../data/glade/preferences_window.glade.h:66 +msgid "Privacy" +msgstr "Prywatność" -#: ../data/glade/preferences_window.glade.h:72 -msgid "Save _position and size for roster and chat windows" -msgstr "Zapisz _pozycję i rozmiar okna kontaktów i okna rozmowy" - -#: ../data/glade/preferences_window.glade.h:73 +#: ../data/glade/preferences_window.glade.h:67 msgid "Set status message to reflect currently playing _music track" msgstr "Wyświetlaj informacje o odtwarzanej _muzyce w statusie opisowym" -#: ../data/glade/preferences_window.glade.h:74 -msgid "Show only in _roster" -msgstr "Pokaż tylko _listę kontaktów" - -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:68 msgid "Sign _in" msgstr "_Połączony" -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:69 msgid "Sign _out" msgstr "R_ozłączony" -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:70 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." @@ -1698,54 +1814,47 @@ msgstr "" "formatowanie. Jeżeli ta opcja jest aktywna, Gajim będzie ignorował te " "dodatki i wyświetlał czysty tekst." -#: ../data/glade/preferences_window.glade.h:78 +#: ../data/glade/preferences_window.glade.h:71 msgid "Status" msgstr "Status" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:72 +msgid "Status _iconset:" +msgstr "Zestaw ikon _statusu:" + +#: ../data/glade/preferences_window.glade.h:73 msgid "T_heme:" msgstr "_Motyw:" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:74 msgid "The auto away status message" msgstr "Automatyczny status \"Zaraz wracam\"" -#: ../data/glade/preferences_window.glade.h:81 +#: ../data/glade/preferences_window.glade.h:75 msgid "The auto not available status message" msgstr "Automatyczny status \"Nieobecny\"" -#: ../data/glade/preferences_window.glade.h:82 +#: ../data/glade/preferences_window.glade.h:76 msgid "Treat all incoming messages as:" msgstr "Traktuj wszystkie otrzymane wiadomości jako:" -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:77 msgid "Use _transports iconsets" msgstr "Używaj zestawów ikon _transportów" -#: ../data/glade/preferences_window.glade.h:84 +#: ../data/glade/preferences_window.glade.h:78 +msgid "Use only one message _window:" +msgstr "_Grupuj okna:" + +#: ../data/glade/preferences_window.glade.h:79 msgid "Use system _default" msgstr "Użyj _domyślnej dla systemu" -#: ../data/glade/preferences_window.glade.h:85 -msgid "Use t_rayicon (aka. notification area icon)" -msgstr "_Ikona w obszarze powiadamiania" - -#: ../data/glade/preferences_window.glade.h:86 -msgid "" -"When a new event (message, file transfer request etc..) is received, the " -"following methods may be used to inform you about it. Please note that " -"events about new messages only occur if it is a new message from a contact " -"you are not already chatting with" -msgstr "" -"Kiedy pojawi się nowe zdarzenie (wiadomość, prośba o przesłanie pliku itp.), " -"możesz zostać o tym powiadomiony na takie sposoby. UWAGA: Nowa wiadomość " -"pojawia się jeśli nie pochodzi od osoby, z którą aktualnie rozmawiasz" - -#: ../data/glade/preferences_window.glade.h:87 -msgid "When new event is received" +#: ../data/glade/preferences_window.glade.h:80 +msgid "When new event is received:" msgstr "Gdy odebrane zostanie nowe zdarzenie" -#: ../data/glade/preferences_window.glade.h:88 +#: ../data/glade/preferences_window.glade.h:81 msgid "" "Works for Rhythmbox and Muine players. For more players, please visit http://" "trac.gajim.org/wiki/GajimAndMusicPlayer" @@ -1754,86 +1863,90 @@ msgstr "" "obsłudze innego oprogramowania, odwiedź stronę http://trac.gajim.org/wiki/" "GajimAndMusicPlayer" -#: ../data/glade/preferences_window.glade.h:89 +#: ../data/glade/preferences_window.glade.h:82 msgid "_Advanced Notifications Control..." msgstr "_Edytor zaawansowanych ustawień" -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:83 msgid "_Browser:" msgstr "Prze_glądarka:" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:84 +msgid "_Display chat state notifications:" +msgstr "Wyświetlaj informacje stanie kontaktu:" + +#: ../data/glade/preferences_window.glade.h:85 msgid "_File manager:" msgstr "Menadżer _plików:" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:86 msgid "_Font:" msgstr "_Czcionka:" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:87 msgid "_Highlight misspelled words" msgstr "Podś_wietlaj błędy w pisowni" -#: ../data/glade/preferences_window.glade.h:94 +#: ../data/glade/preferences_window.glade.h:88 msgid "_Ignore events from contacts not in the roster" msgstr "_Ignoruj wiadomości od osób spoza listy kontaktów" -#: ../data/glade/preferences_window.glade.h:95 +#: ../data/glade/preferences_window.glade.h:89 msgid "_Incoming message:" msgstr "Wiadomość _otrzymana:" -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:90 msgid "_Log status changes of contacts" msgstr "_Zapisuj w logach zmiany statusów kontaktów" -#: ../data/glade/preferences_window.glade.h:97 +#: ../data/glade/preferences_window.glade.h:91 msgid "_Mail client:" msgstr "Klient _poczty:" -#: ../data/glade/preferences_window.glade.h:98 -msgid "_Never" -msgstr "_Nigdy" +#: ../data/glade/preferences_window.glade.h:92 +msgid "_Make message windows compact" +msgstr "_Ukrywaj przyciski w oknach rozmowy" -#: ../data/glade/preferences_window.glade.h:99 -msgid "_Notify me about it" -msgstr "Powia_dom mnie o tym" - -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:93 msgid "_Open..." msgstr "_Otwórz..." -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:94 msgid "_Outgoing message:" msgstr "Wysłana wiadomość :" -#: ../data/glade/preferences_window.glade.h:102 +#: ../data/glade/preferences_window.glade.h:95 msgid "_Player:" msgstr "_Program odtwarzający dźwięk:" -#: ../data/glade/preferences_window.glade.h:103 -msgid "_Pop it up" -msgstr "_Wyświetl" - -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:96 msgid "_Reset to Default Colors" msgstr "Wróć do kolorów _domyślnych" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:97 +msgid "_Send chat state notifications:" +msgstr "Rodzaje powiadomień wysyłanych podczas rozmowy:" + +#: ../data/glade/preferences_window.glade.h:98 msgid "_Sort contacts by status" msgstr "Sortuj kontakty według statusu" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:99 msgid "_Status message:" msgstr "_Informacja o statusie:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:100 msgid "_URL:" msgstr "_URL:" -#: ../data/glade/preferences_window.glade.h:108 +#: ../data/glade/preferences_window.glade.h:101 msgid "minutes" msgstr "minutach" +#: ../data/glade/privacy_lists_window.glade.h:1 +msgid "Privacy Lists:" +msgstr "Listy prywatności" + #: ../data/glade/privacy_list_window.glade.h:1 msgid "Add / Edit a rule" msgstr "Dodaj / Edytuj regułę" @@ -1870,7 +1983,7 @@ msgstr "JID" msgid "Order:" msgstr "Kolejność:" -#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2052 +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2248 msgid "Privacy List" msgstr "Lista prywatności" @@ -1910,10 +2023,6 @@ msgstr "wysyłać mi status" msgid "to view my status" msgstr "widzieć mój status" -#: ../data/glade/privacy_lists_window.glade.h:1 -msgid "Privacy Lists:" -msgstr "Listy prywatności" - #. "About" is the text of a tab of vcard window #: ../data/glade/profile_window.glade.h:2 #: ../data/glade/vcard_information_window.glade.h:2 @@ -1944,66 +2053,59 @@ msgid "Click to set your avatar" msgstr "Kliknij aby ustawić avatar" #: ../data/glade/profile_window.glade.h:8 -#: ../data/glade/vcard_information_window.glade.h:11 +#: ../data/glade/vcard_information_window.glade.h:10 msgid "Company:" msgstr "Firma:" #: ../data/glade/profile_window.glade.h:9 -#: ../data/glade/vcard_information_window.glade.h:15 +#: ../data/glade/vcard_information_window.glade.h:14 msgid "Country:" msgstr "Kraj:" #: ../data/glade/profile_window.glade.h:10 -#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/vcard_information_window.glade.h:15 msgid "Department:" msgstr "Dział:" -#: ../data/glade/profile_window.glade.h:11 -#: ../data/glade/vcard_information_window.glade.h:17 -#: ../data/glade/zeroconf_information_window.glade.h:2 -#: ../data/glade/zeroconf_properties_window.glade.h:5 -msgid "E-Mail:" -msgstr "Adres e-mail:" - #: ../data/glade/profile_window.glade.h:12 -#: ../data/glade/vcard_information_window.glade.h:18 +#: ../data/glade/vcard_information_window.glade.h:17 msgid "Extra Address:" msgstr "Dodatkowy adres:" #. Family Name #: ../data/glade/profile_window.glade.h:14 -#: ../data/glade/vcard_information_window.glade.h:20 +#: ../data/glade/vcard_information_window.glade.h:19 msgid "Family:" msgstr "Nazwisko:" #. Do NOT change sequence. Just translate YYYY and MM and DD (from Year, Month, Day accordingly) #: ../data/glade/profile_window.glade.h:16 -#: ../data/glade/vcard_information_window.glade.h:22 +#: ../data/glade/vcard_information_window.glade.h:21 msgid "Format: YYYY-MM-DD" msgstr "Format: RRRR-MM-DD" +#: ../data/glade/profile_window.glade.h:17 +#: ../data/glade/vcard_information_window.glade.h:22 +msgid "Full Name" +msgstr "Imię i nazwisko" + #. Given Name -#: ../data/glade/profile_window.glade.h:18 +#: ../data/glade/profile_window.glade.h:19 #: ../data/glade/vcard_information_window.glade.h:24 msgid "Given:" msgstr "Imię:" -#: ../data/glade/profile_window.glade.h:19 +#: ../data/glade/profile_window.glade.h:20 #: ../data/glade/vcard_information_window.glade.h:25 msgid "Homepage:" msgstr "Strona domowa:" #. Middle Name -#: ../data/glade/profile_window.glade.h:21 +#: ../data/glade/profile_window.glade.h:22 #: ../data/glade/vcard_information_window.glade.h:28 msgid "Middle:" msgstr "Drugie imię:" -#: ../data/glade/profile_window.glade.h:22 -#: ../data/glade/vcard_information_window.glade.h:29 -msgid "More" -msgstr "Więcej" - #: ../data/glade/profile_window.glade.h:25 #: ../data/glade/vcard_information_window.glade.h:34 msgid "Personal Info" @@ -2031,7 +2133,7 @@ msgid "Prefix:" msgstr "Prefiks:" #: ../data/glade/profile_window.glade.h:32 -#: ../data/glade/vcard_information_window.glade.h:41 ../src/vcard.py:381 +#: ../data/glade/vcard_information_window.glade.h:41 ../src/vcard.py:307 msgid "Role:" msgstr "Funkcja:" @@ -2068,82 +2170,95 @@ msgstr "Usuń konto _tylko z Gajima" msgid "Remove account from Gajim and from _server" msgstr "Usuń konto z Gajima i z _serwera" +#. Remove +#. Remove group +#. Remove +#: ../data/glade/remove_account_window.glade.h:4 +#: ../data/glade/roster_contact_context_menu.glade.h:18 +#: ../src/roster_window.py:2523 ../src/roster_window.py:2733 +#: ../src/roster_window.py:2869 +msgid "_Remove" +msgstr "_Usuń" + #: ../data/glade/roster_contact_context_menu.glade.h:1 msgid "A_sk to see his/her status" msgstr "Poproś o to, żeby móc widzieć jego/jej _status" #: ../data/glade/roster_contact_context_menu.glade.h:2 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:1 -msgid "Add Special _Notification" -msgstr "Dodaj powiadomienia _specjalne" +msgid "Add Special _Notification..." +msgstr "Dodaj powiadomienia _specjalne..." #: ../data/glade/roster_contact_context_menu.glade.h:3 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:2 -msgid "Assign Open_PGP Key" -msgstr "Przypisz klucz Open_PGP" +msgid "Assign Open_PGP Key..." +msgstr "Przypisz klucz Open_PGP..." #: ../data/glade/roster_contact_context_menu.glade.h:4 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:3 -#: ../src/roster_window.py:2293 -msgid "Edit _Groups" -msgstr "Modyfikuj _grupy" +msgid "Edit _Groups..." +msgstr "Modyfikuj _grupy..." +#. Execute Command #: ../data/glade/roster_contact_context_menu.glade.h:5 -#: ../src/roster_window.py:2481 +#: ../src/roster_window.py:2826 msgid "Execute Command..." msgstr "Wykonaj komendę..." +#. Invite to Groupchat #: ../data/glade/roster_contact_context_menu.glade.h:6 -#: ../src/roster_window.py:2251 +#: ../src/roster_window.py:2439 msgid "In_vite to" msgstr "_Zaproś do" +#. Send Custom Status #: ../data/glade/roster_contact_context_menu.glade.h:7 -#: ../data/glade/systray_context_menu.glade.h:2 -msgid "Send Single _Message" -msgstr "Wyślij _wiadomość" +#: ../src/roster_window.py:2663 ../src/roster_window.py:2797 +msgid "Send Cus_tom Status" +msgstr "Wyślij odrębny status" + +#: ../data/glade/roster_contact_context_menu.glade.h:8 +msgid "Send Single _Message..." +msgstr "Wyślij _wiadomość..." #: ../data/glade/roster_contact_context_menu.glade.h:9 -msgid "Send cus_tom status" -msgstr "Wyślij _odrębny status" +msgid "Send _File..." +msgstr "Wyślij _plik..." #: ../data/glade/roster_contact_context_menu.glade.h:10 +msgid "Set Custom _Avatar..." +msgstr "Ustaw własny _avatar..." + +#: ../data/glade/roster_contact_context_menu.glade.h:11 #: ../data/glade/zeroconf_contact_context_menu.glade.h:5 msgid "Start _Chat" msgstr "Rozpocznij _rozmowę" -#: ../data/glade/roster_contact_context_menu.glade.h:12 +#: ../data/glade/roster_contact_context_menu.glade.h:13 msgid "_Allow him/her to see my status" msgstr "_Pozwól mu/jej widzieć swój status" -#: ../data/glade/roster_contact_context_menu.glade.h:13 -#: ../src/roster_window.py:2317 ../src/roster_window.py:2428 +#: ../data/glade/roster_contact_context_menu.glade.h:14 +#: ../src/roster_window.py:2513 ../src/roster_window.py:2724 msgid "_Block" msgstr "_Zablokuj" -#: ../data/glade/roster_contact_context_menu.glade.h:14 +#: ../data/glade/roster_contact_context_menu.glade.h:15 msgid "_Forbid him/her to see my status" msgstr "_Zabroń mu/jej widzieć twój status" -#. Remove group -#: ../data/glade/roster_contact_context_menu.glade.h:16 -#: ../src/roster_window.py:2245 ../src/roster_window.py:2354 -#: ../src/roster_window.py:2502 -msgid "_Remove from Roster" -msgstr "_Usuń z listy kontaktów" - #: ../data/glade/roster_contact_context_menu.glade.h:17 #: ../data/glade/zeroconf_contact_context_menu.glade.h:7 -#: ../src/roster_window.py:2490 -msgid "_Rename" -msgstr "_Zmień nazwę" +msgid "_Manage Contact" +msgstr "_Modyfikuj dane kontaktu" -#: ../data/glade/roster_contact_context_menu.glade.h:18 +#: ../data/glade/roster_contact_context_menu.glade.h:19 +msgid "_Rename..." +msgstr "_Zmień nazwę..." + +#: ../data/glade/roster_contact_context_menu.glade.h:20 msgid "_Subscription" msgstr "_Autoryzacja" -#: ../data/glade/roster_contact_context_menu.glade.h:19 -#: ../src/roster_window.py:2311 ../src/roster_window.py:2422 +#: ../data/glade/roster_contact_context_menu.glade.h:21 +#: ../src/roster_window.py:2507 ../src/roster_window.py:2718 msgid "_Unblock" msgstr "_Cofnij blokadę" @@ -2152,63 +2267,66 @@ msgid "A_ccounts" msgstr "_Konta" #: ../data/glade/roster_window.glade.h:2 -msgid "Add _Contact" -msgstr "Dodaj _kontakt" +msgid "Add _Contact..." +msgstr "Dod_aj kontakt..." #: ../data/glade/roster_window.glade.h:3 +msgid "Fea_tures" +msgstr "_Możliwości serwerów" + +#: ../data/glade/roster_window.glade.h:4 msgid "File _Transfers" msgstr "_Przesyłanie plików" -#: ../data/glade/roster_window.glade.h:4 +#: ../data/glade/roster_window.glade.h:5 msgid "Frequently Asked Questions (online)" msgstr "Najczęściej Zadawane Pytania (w sieci)" -#: ../data/glade/roster_window.glade.h:6 +#: ../data/glade/roster_window.glade.h:7 msgid "Help online" msgstr "Pomoc w sieci" -#: ../data/glade/roster_window.glade.h:7 +#: ../data/glade/roster_window.glade.h:9 msgid "Profile, A_vatar" msgstr "Profil, _Awatar" -#: ../data/glade/roster_window.glade.h:8 +#: ../data/glade/roster_window.glade.h:10 msgid "Show Trans_ports" msgstr "Pokaż _transporty" -#: ../data/glade/roster_window.glade.h:9 +#: ../data/glade/roster_window.glade.h:11 msgid "Show _Offline Contacts" msgstr "Pokaż kontakty niep_ołączone" -#: ../data/glade/roster_window.glade.h:12 +#: ../data/glade/roster_window.glade.h:14 msgid "_Contents" msgstr "_Zawartość" -#: ../data/glade/roster_window.glade.h:13 -msgid "_Discover Services" -msgstr "_Wyszukuj usługi" - -#: ../data/glade/roster_window.glade.h:14 ../src/disco.py:1353 -#: ../src/roster_window.py:2473 +#: ../data/glade/roster_window.glade.h:16 ../src/disco.py:1357 msgid "_Edit" msgstr "_Edycja" -#: ../data/glade/roster_window.glade.h:15 +#: ../data/glade/roster_window.glade.h:17 msgid "_FAQ" msgstr "_FAQ" -#: ../data/glade/roster_window.glade.h:17 +#: ../data/glade/roster_window.glade.h:18 msgid "_Help" msgstr "_Pomoc" -#: ../data/glade/roster_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:20 msgid "_Preferences" msgstr "_Ustawienia" -#: ../data/glade/roster_window.glade.h:19 +#: ../data/glade/roster_window.glade.h:21 msgid "_Quit" msgstr "_Zakończ" -#: ../data/glade/roster_window.glade.h:21 +#: ../data/glade/roster_window.glade.h:22 +msgid "_Send Single Message..." +msgstr "Wyślij _wiadomość..." + +#: ../data/glade/roster_window.glade.h:24 msgid "_View" msgstr "_Widok" @@ -2216,6 +2334,15 @@ msgstr "_Widok" msgid "Please wait while retrieving search form..." msgstr "Proszę czekać, trwa pobieranie formularza wyszukiwania..." +#: ../data/glade/search_window.glade.h:3 +msgid "_Add contact" +msgstr "Dodaj _kontakt" + +#. Information +#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:2881 +msgid "_Information" +msgstr "Informacje o kontakcie" + #: ../data/glade/service_discovery_window.glade.h:1 msgid "G_o" msgstr "I_dź" @@ -2224,10 +2351,6 @@ msgstr "I_dź" msgid "_Address:" msgstr "_Adres:" -#: ../data/glade/service_discovery_window.glade.h:3 -msgid "_Filter:" -msgstr "_Filtr:" - #: ../data/glade/service_registration_window.glade.h:1 msgid "Register to" msgstr "Zarejestruj w" @@ -2304,6 +2427,11 @@ msgstr "Prośba o autoryzację" msgid "_Deny" msgstr "O_dmów" +#: ../data/glade/synchronise_contacts_dialog.glade.h:1 +#, fuzzy +msgid "Select the account with which to synchronise" +msgstr "Wskaż konto, z którym chcesz zsynchronizować kontakty" + #: ../data/glade/synchronise_select_account_dialog.glade.h:1 msgid "Select the account with which you want to synchronise" msgstr "Wskaż konto, z którym chcesz zsynchronizować kontakty" @@ -2320,6 +2448,10 @@ msgstr "Synchronizacja: wybierz kontakty" msgid "Mute Sounds" msgstr "Wyłącz dźwięki" +#: ../data/glade/systray_context_menu.glade.h:2 +msgid "Send Single _Message" +msgstr "Wyślij _wiadomość" + #: ../data/glade/systray_context_menu.glade.h:3 msgid "Show All Pending _Events" msgstr "Pokaż wszystkie oczekujące _zdarzenia" @@ -2332,41 +2464,39 @@ msgstr "Pokaż _listę kontaktów" msgid "Sta_tus" msgstr "Sta_tus" +#: ../data/glade/systray_context_menu.glade.h:6 +msgid "_Group Chat" +msgstr "_Pokój" + #. Given Name #: ../data/glade/vcard_information_window.glade.h:5 msgid "Ask:" msgstr "Pytaj:" #: ../data/glade/vcard_information_window.glade.h:8 -msgid "Click to force avatar" -msgstr "Kliknij aby ustawić avatar" - -#: ../data/glade/vcard_information_window.glade.h:9 msgid "Client:" msgstr "Klient:" -#: ../data/glade/vcard_information_window.glade.h:10 +#: ../data/glade/vcard_information_window.glade.h:9 msgid "Comments" msgstr "Komentarze" -#: ../data/glade/vcard_information_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:11 msgid "Configured avatar:" msgstr "Ustawiony avatar:" -#: ../data/glade/vcard_information_window.glade.h:13 +#: ../data/glade/vcard_information_window.glade.h:12 #: ../data/glade/zeroconf_information_window.glade.h:1 msgid "Contact" msgstr "Kontakt" -#: ../data/glade/vcard_information_window.glade.h:14 +#: ../data/glade/vcard_information_window.glade.h:13 msgid "Contact Information" msgstr "Informacje o kontakcie" -#: ../data/glade/vcard_information_window.glade.h:26 -#: ../data/glade/zeroconf_information_window.glade.h:4 -#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:416 -msgid "Jabber ID:" -msgstr "Jabber ID:" +#: ../data/glade/vcard_information_window.glade.h:29 +msgid "More" +msgstr "Więcej" #: ../data/glade/vcard_information_window.glade.h:33 msgid "OS:" @@ -2399,11 +2529,6 @@ msgstr "Jabber Traffic" msgid "XML Input" msgstr "Wejście XML" -#. XML Console enable checkbutton -#: ../data/glade/xml_console_window.glade.h:4 -msgid "Enable" -msgstr "Włącz" - #. Info/Query make the "IQ" initials. So translate like this 'YourLang/YourLang (Info/Query)'. Thanks (it's a tooltip so width is not a problem) #: ../data/glade/xml_console_window.glade.h:6 msgid "Info/Query" @@ -2422,15 +2547,29 @@ msgstr "Wiado_mość" msgid "_Presence" msgstr "_Obecność" -#: ../data/glade/zeroconf_information_window.glade.h:3 -#: ../data/glade/zeroconf_properties_window.glade.h:6 -msgid "First Name:" -msgstr "Imię:" +#: ../data/glade/zeroconf_contact_context_menu.glade.h:1 +msgid "Add Special _Notification" +msgstr "Dodaj powiadomienia _specjalne" -#: ../data/glade/zeroconf_information_window.glade.h:5 -#: ../data/glade/zeroconf_properties_window.glade.h:14 -msgid "Last Name:" -msgstr "Nazwisko:" +#: ../data/glade/zeroconf_contact_context_menu.glade.h:2 +msgid "Assign Open_PGP Key" +msgstr "Przypisz klucz Open_PGP" + +#. Edit Groups +#: ../data/glade/zeroconf_contact_context_menu.glade.h:3 +#: ../src/roster_window.py:2496 +msgid "Edit _Groups" +msgstr "Modyfikuj _grupy" + +#. Rename +#: ../data/glade/zeroconf_contact_context_menu.glade.h:8 +#: ../src/roster_window.py:2853 +msgid "_Rename" +msgstr "_Zmień nazwę" + +#: ../data/glade/zeroconf_context_menu.glade.h:1 +msgid "_Modify Account..." +msgstr "_Modyfikuj konto..." #: ../data/glade/zeroconf_information_window.glade.h:6 msgid "Local jid:" @@ -2440,266 +2579,275 @@ msgstr "Lokalny JID:" msgid "Personal" msgstr "Informacje osobiste" -#: ../data/glade/zeroconf_properties_window.glade.h:11 -msgid "" -"If the default port that is used for incoming messages is unfitting for your " -"setup you can select another one here.\n" -"You might consider to change possible firewall settings." -msgstr "" -"Jeżeli domyślny port, na którym przyjmowane są nadchodzące wiadomości nie " -"odpowiada ci, możesz wskazać numer portu, jakiego chcesz używać.\n" -"Konieczna stać się może ponowna konfiguracja firewalla." - #: ../data/glade/zeroconf_properties_window.glade.h:15 msgid "Modify Account" msgstr "Modyfikuj konto" -#: ../data/glade/zeroconf_properties_window.glade.h:21 -msgid "Use custom port:" -msgstr "Użyj innego portu:" - #. For i18n -#: ../src/advanced.py:51 +#: ../src/advanced.py:56 msgid "Activated" msgstr "Aktywny" -#: ../src/advanced.py:51 +#: ../src/advanced.py:56 msgid "Deactivated" msgstr "Nieaktywny" -#: ../src/advanced.py:53 +#: ../src/advanced.py:58 msgid "Boolean" msgstr "Zmienna logiczna" -#: ../src/advanced.py:54 +#: ../src/advanced.py:59 msgid "Integer" msgstr "Liczba całkowita" -#: ../src/advanced.py:55 +#: ../src/advanced.py:60 msgid "Text" msgstr "Tekst" -#: ../src/advanced.py:56 +#: ../src/advanced.py:61 msgid "Color" msgstr "Kolor" -#: ../src/advanced.py:65 +#: ../src/advanced.py:70 msgid "Preference Name" msgstr "Nazwa opcji" -#: ../src/advanced.py:71 +#: ../src/advanced.py:76 msgid "Value" msgstr "Wartość" -#: ../src/advanced.py:79 +#: ../src/advanced.py:84 msgid "Type" msgstr "Typ" #. we talk about option description in advanced configuration editor -#: ../src/advanced.py:136 +#: ../src/advanced.py:140 msgid "(None)" msgstr "(Brak)" #. we talk about password -#: ../src/advanced.py:239 +#: ../src/advanced.py:243 msgid "Hidden" msgstr "Ukryte" #. 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) +#. LANG=$(for i in *.po; do j=${i/.po/}; echo -n "_('"$j"')":" '"$j"', " ; done) #. echo "{_('en'):'en'",$LANG"}" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "English" msgstr "angielski" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Belarusian" msgstr "bułgarski" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Bulgarian" msgstr "bułgarski" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Breton" msgstr "bretoński" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Czech" msgstr "czeski" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "German" msgstr "niemiecki" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Greek" msgstr "grecki" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "British" msgstr "brytyjski" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Esperanto" msgstr "esperanto" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Spanish" msgstr "hiszpański" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Basque" msgstr "baskijski" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "French" msgstr "francuski" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Croatian" msgstr "chorwacki" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Italian" msgstr "włoski" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Norwegian (b)" msgstr "norweski (b)" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Dutch" msgstr "holenderski" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Norwegian" msgstr "norweski" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Polish" msgstr "polski" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Portuguese" msgstr "portugalski" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Brazilian Portuguese" msgstr "portugalski (Brazylia)" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Russian" msgstr "rosyjski" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Serbian" msgstr "serbski" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Slovak" msgstr "słowacki" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Swedish" msgstr "szwedzki" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Chinese (Ch)" msgstr "chiński (Ch)" -#: ../src/chat_control.py:212 ../src/dialogs.py:1706 -msgid "" -"If that is not your language for which you want to highlight misspelled " -"words, then please set your $LANG as appropriate. Eg. for French do export " -"LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to make it " -"global in /etc/profile.\n" -"\n" -"Highlighting misspelled words feature will not be used" -msgstr "" -"Jeśli podświetlanie błędów w pisowni działa dla niewłaściwego języka, to " -"ustaw odpowiednio zmienną środowiskową $LANG. Np. dla języka polskiego wpisz " -"export LANG=pl_PL do pliku ~/.bash_profile lub globalnie do pliku in /etc/" -"profile.\n" -"\n" -"Podświedlanie błędów w pisowni nie będzie używane" - -#: ../src/chat_control.py:251 +#: ../src/chat_control.py:314 msgid "Spelling language" msgstr "Wybierz słownik" #. we are not connected -#: ../src/chat_control.py:274 ../src/chat_control.py:480 +#: ../src/chat_control.py:337 ../src/chat_control.py:560 msgid "A connection is not available" msgstr "Połączenie jest niemożliwe" -#: ../src/chat_control.py:275 ../src/chat_control.py:481 +#: ../src/chat_control.py:338 ../src/chat_control.py:561 msgid "Your message can not be sent until you are connected." msgstr "Nie możesz wysłać wiadomości dopóki nie będziesz połączony." -#: ../src/chat_control.py:1050 +#: ../src/chat_control.py:1187 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s z pokoju %(room_name)s" #. we talk about a contact here -#: ../src/chat_control.py:1139 +#: ../src/chat_control.py:1282 #, python-format msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" msgstr "" "Ani %s nie przesyła swojego klucza OpenPGP, ani Ty nie przypisałeś mu " "żadnego klucza" -#: ../src/chat_control.py:1173 ../src/groupchat_control.py:1276 +#: ../src/chat_control.py:1325 ../src/groupchat_control.py:1433 +#, python-format +msgid "No such command: /%s (if you want to send this, prefix it with /say)" +msgstr "" +"Nie ma takiego polecenia: /%s (jeśli chcesz je wysłać, poprzedź je znakami: /" +"say)" + +#: ../src/chat_control.py:1332 ../src/groupchat_control.py:1456 #, python-format msgid "Commands: %s" msgstr "Polecenia: %s" -#: ../src/chat_control.py:1176 ../src/groupchat_control.py:1290 +#: ../src/chat_control.py:1335 ../src/groupchat_control.py:1470 #, python-format msgid "Usage: /%s, clears the text window." msgstr "Użycie: /%s czyście okno tekstowe." -#: ../src/chat_control.py:1179 ../src/groupchat_control.py:1295 +#: ../src/chat_control.py:1338 ../src/groupchat_control.py:1475 #, python-format msgid "Usage: /%s, hide the chat buttons." msgstr "Użycie: /%s ukrywa przyciski czatu." -#: ../src/chat_control.py:1184 ../src/groupchat_control.py:1334 +#: ../src/chat_control.py:1341 ../src/groupchat_control.py:1491 +#, python-format +msgid "" +"Usage: /%s , sends action to the current group chat. Use third " +"person. (e.g. /%s explodes.)" +msgstr "" +"Użycie: /%s wysyła działanie do aktualnego pokoju. Używaj w " +"trzeciej osobie (np. /%s eksploduje.)" + +#: ../src/chat_control.py:1345 +#, python-format +msgid "Usage: /%s, sends a ping to the contact" +msgstr "Uzycie: /%s, wysyła sygnał ping do kontaktu" + +#: ../src/chat_control.py:1348 +#, python-format +msgid "Usage: /%s, send the message to the contact" +msgstr "Użycie: /%s wysyła wiadomość do kontaktu" + +#: ../src/chat_control.py:1351 ../src/groupchat_control.py:1514 #, python-format msgid "No help info for /%s" msgstr "Brak informacji o pomocy dla /%s" -#: ../src/chat_control.py:1314 +#: ../src/chat_control.py:1489 ../src/chat_control.py:1515 msgid "Encryption enabled" msgstr "Szyfrowanie włączone" -#: ../src/chat_control.py:1319 +#: ../src/chat_control.py:1494 +msgid "Session WILL be logged" +msgstr "Sesja BĘDZIE logowana" + +#: ../src/chat_control.py:1496 +msgid "Session WILL NOT be logged" +msgstr "Sesja NIE BĘDZIE logowana" + +#: ../src/chat_control.py:1503 +msgid "The following message was NOT encrypted" +msgstr "Ta wiadomość NIE została jest zaszyfrowana" + +#: ../src/chat_control.py:1507 ../src/chat_control.py:1520 +#: ../src/chat_control.py:2166 msgid "Encryption disabled" msgstr "Szyfrowanie wyłączone" #. add_to_roster_menuitem -#: ../src/chat_control.py:1463 ../src/conversation_textview.py:501 -#: ../src/dialogs.py:629 ../src/gajim.py:853 ../src/gajim.py:854 -#: ../src/gajim.py:1199 ../src/roster_window.py:334 -#: ../src/roster_window.py:414 ../src/roster_window.py:1675 -#: ../src/roster_window.py:1685 ../src/roster_window.py:1864 -#: ../src/roster_window.py:2088 ../src/roster_window.py:2745 -#: ../src/roster_window.py:2949 ../src/roster_window.py:4234 -#: ../src/roster_window.py:4236 ../src/common/contacts.py:73 -#: ../src/common/helpers.py:43 ../src/common/helpers.py:255 +#: ../src/chat_control.py:1683 ../src/conversation_textview.py:701 +#: ../src/dialogs.py:730 ../src/gajim.py:904 ../src/gajim.py:905 +#: ../src/gajim.py:1393 ../src/gajim.py:1644 ../src/roster_window.py:351 +#: ../src/roster_window.py:435 ../src/roster_window.py:1795 +#: ../src/roster_window.py:1805 ../src/roster_window.py:2044 +#: ../src/roster_window.py:2276 ../src/roster_window.py:3124 +#: ../src/roster_window.py:3363 ../src/roster_window.py:4734 +#: ../src/roster_window.py:4736 ../src/common/contacts.py:89 +#: ../src/common/helpers.py:49 ../src/common/helpers.py:263 msgid "Not in Roster" msgstr "spoza listy kontaktów" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:1607 +#: ../src/chat_control.py:1836 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Właśnie otrzymałeś nową wiadomość od \"%s\"" -#: ../src/chat_control.py:1608 +#: ../src/chat_control.py:1837 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." @@ -2707,29 +2855,24 @@ msgstr "" "Jeśli zamkniesz tę kartę, a nie masz uaktywnionej opcji historii, to " "utracisz tę wiadomość." -#: ../src/config.py:139 ../src/config.py:588 +#: ../src/config.py:127 ../src/config.py:549 msgid "Disabled" msgstr "Wyłączone" -#: ../src/config.py:233 -#, python-format -msgid "Every %s _minutes" -msgstr "Co %s _minut" - -#: ../src/config.py:353 +#: ../src/config.py:293 msgid "Active" msgstr "Aktywny" -#: ../src/config.py:361 +#: ../src/config.py:301 msgid "Event" msgstr "Zdarzenie" -#: ../src/config.py:684 ../src/gajim.py:2309 +#: ../src/config.py:622 ../src/dialogs.py:1014 #, python-format msgid "Dictionary for lang %s not available" msgstr "Brak słownika dla tego języka (%s)" -#: ../src/config.py:685 ../src/gajim.py:2310 +#: ../src/config.py:623 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -2738,248 +2881,253 @@ msgstr "" "Musisz zainstalować słownik %s aby aktywować sprawdzanie pisowni lub wybrać " "inny język korzystać z opcji speller_langugage." -#: ../src/config.py:1008 +#: ../src/config.py:974 msgid "status message title" msgstr "nagłówek informacji o statusie" -#: ../src/config.py:1008 +#: ../src/config.py:974 msgid "status message text" msgstr "treść informacji o statusie" -#: ../src/config.py:1044 +#: ../src/config.py:1010 msgid "First Message Received" msgstr "Otrzymano pierwszą wiadomość" -#: ../src/config.py:1045 +#: ../src/config.py:1011 msgid "Next Message Received" msgstr "Otrzymałeś nową wiadomość" -#: ../src/config.py:1046 +#: ../src/config.py:1012 msgid "Contact Connected" msgstr "Kontakt połączył się" -#: ../src/config.py:1047 +#: ../src/config.py:1013 msgid "Contact Disconnected" msgstr "Kontakt rozłączył się" -#: ../src/config.py:1048 +#: ../src/config.py:1014 msgid "Message Sent" msgstr "Wiadomość została wysłana" -#: ../src/config.py:1049 +#: ../src/config.py:1015 msgid "Group Chat Message Highlight" msgstr "Podświetlenie wiadomości z czatu" -#: ../src/config.py:1050 +#: ../src/config.py:1016 msgid "Group Chat Message Received" msgstr "Otrzymano wiadomość na czacie" -#: ../src/config.py:1057 +#: ../src/config.py:1023 msgid "GMail Email Received" msgstr "Nowa poczta na koncie Gmail" -#: ../src/config.py:1260 -msgid "OpenPGP is not usable in this computer" -msgstr "Nie można używać OpenPGP na tym komputerze" +#. Name column +#: ../src/config.py:1292 ../src/dialogs.py:1513 ../src/dialogs.py:1577 +#: ../src/disco.py:742 ../src/disco.py:1568 ../src/disco.py:1814 +#: ../src/history_window.py:113 +msgid "Name" +msgstr "Nazwa" -#: ../src/config.py:1306 -msgid "You are currently connected to the server" -msgstr "Jesteś połączony z serwerem" - -#: ../src/config.py:1307 -msgid "To change the account name, you must be disconnected." -msgstr "Aby zmienić nazwę konta, musisz być rozłączony." - -#: ../src/config.py:1310 ../src/config.py:1916 -msgid "Unread events" -msgstr "Nieprzeczytane wiadomości" - -#: ../src/config.py:1311 -msgid "To change the account name, you must read all pending events." -msgstr "" -"Aby zmienić nazwę konta, musisz przeczytać wszystkie zaległe wiadomości." - -#: ../src/config.py:1315 -msgid "Account Name Already Used" -msgstr "Konto o takiej nazwie już istnieje" - -#: ../src/config.py:1316 -msgid "" -"This name is already used by another of your accounts. Please choose another " -"name." -msgstr "Posiadasz już konto o tej nazwie. Zmień nazwę konta na unikalną." - -#: ../src/config.py:1320 ../src/config.py:1324 -msgid "Invalid account name" -msgstr "Niepoprawna nazwa konta" - -#: ../src/config.py:1321 -msgid "Account name cannot be empty." -msgstr "Nazwa konta nie może być pusta." - -#: ../src/config.py:1325 -msgid "Account name cannot contain spaces." -msgstr "Nazwa konta nie może zawierać spacji." - -#: ../src/config.py:1333 ../src/config.py:1339 ../src/config.py:1349 -#: ../src/config.py:2900 -msgid "Invalid Jabber ID" -msgstr "Niepoprawny Jabber ID" - -#: ../src/config.py:1340 -msgid "A Jabber ID must be in the form \"user@servername\"." -msgstr "Jabber ID musi być postaci \"użytkownik@nazwaserwera\"." - -#: ../src/config.py:1399 -msgid "Invalid entry" -msgstr "Niepoprawny wpis" - -#: ../src/config.py:1400 -msgid "Custom port must be a port number." -msgstr "Wybrany port musi być numerem portu." - -#: ../src/config.py:1528 ../src/common/config.py:368 +#: ../src/config.py:1400 ../src/common/config.py:379 msgid "Be right back." msgstr "Zaraz wracam." -#: ../src/config.py:1538 +#: ../src/config.py:1404 msgid "Relogin now?" msgstr "Czy zalogować się ponownie?" -#: ../src/config.py:1539 +#: ../src/config.py:1405 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "" "Jeżeli chcesz by wszelkie zmiany odniosły natychmiastowy skutek, musisz " "zalogować się ponownie." -#: ../src/config.py:1565 -msgid "No such account available" -msgstr "Takie konto nie jest dostępne" +#: ../src/config.py:1500 ../src/config.py:1591 +msgid "OpenPGP is not usable in this computer" +msgstr "Nie można używać OpenPGP na tym komputerze" -#: ../src/config.py:1566 -msgid "You must create your account before editing your personal information." -msgstr "Musisz najpierw stworzyć konto by móc edytować informacje o sobie." +#: ../src/config.py:1627 ../src/config.py:1668 +msgid "Unread events" +msgstr "Nieprzeczytane wiadomości" -#: ../src/config.py:1573 ../src/dialogs.py:1190 ../src/dialogs.py:1326 -#: ../src/dialogs.py:1506 ../src/disco.py:420 ../src/profile_window.py:325 -msgid "You are not connected to the server" -msgstr "Nie jesteś połączony z serwerem" - -#: ../src/config.py:1574 -msgid "Without a connection, you can not edit your personal information." -msgstr "Musisz być połączony, aby móc zmieniać informacje o sobie." - -#: ../src/config.py:1578 -msgid "Your server doesn't support Vcard" -msgstr "Twój serwer nie akceptuje Vcard" - -#: ../src/config.py:1579 -msgid "Your server can't save your personal information." -msgstr "Twój serwer nie potrafi zapisać informacji osobistych." - -#: ../src/config.py:1610 ../src/config.py:3288 -msgid "Failed to get secret keys" -msgstr "Pobieranie kluczy prywatnych nie powiodło się" - -#: ../src/config.py:1611 ../src/config.py:3289 -msgid "There was a problem retrieving your OpenPGP secret keys." -msgstr "" -"Wystąpił problem w trakcie odzyskiwania Twoich kluczy prywatnych OpenPGP." - -#: ../src/config.py:1614 ../src/config.py:3292 -msgid "OpenPGP Key Selection" -msgstr "Wybór klucza OpenPGP" - -#: ../src/config.py:1615 ../src/config.py:3293 -msgid "Choose your OpenPGP key" -msgstr "Wybierz klucz OpenPGP" - -#. Name column -#: ../src/config.py:1850 ../src/dialogs.py:1338 ../src/dialogs.py:1402 -#: ../src/disco.py:741 ../src/disco.py:1564 ../src/disco.py:1802 -#: ../src/history_window.py:78 -msgid "Name" -msgstr "Nazwa" - -#: ../src/config.py:1853 ../src/dialogs.py:1341 -msgid "Server" -msgstr "Serwer" - -#: ../src/config.py:1917 +#: ../src/config.py:1628 msgid "Read all pending events before removing this account." msgstr "" "Przejrzyj wszystkie niepotwierdzone zdarzenia przed usunięciem tego konta." -#: ../src/config.py:1954 +#: ../src/config.py:1654 #, python-format msgid "You have opened chat in account %s" msgstr "Masz otwarte okno rozmowy na koncie %s" -#: ../src/config.py:1955 +#: ../src/config.py:1655 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "" "Wszystkie otwarte zakładki rozmów i czatów zostaną zamknięte. Kontynuować?" -#: ../src/config.py:2014 +#: ../src/config.py:1664 +msgid "You are currently connected to the server" +msgstr "Jesteś połączony z serwerem" + +#: ../src/config.py:1665 +msgid "To change the account name, you must be disconnected." +msgstr "Aby zmienić nazwę konta, musisz być rozłączony." + +#: ../src/config.py:1669 +msgid "To change the account name, you must read all pending events." +msgstr "" +"Aby zmienić nazwę konta, musisz przeczytać wszystkie zaległe wiadomości." + +#: ../src/config.py:1675 +msgid "Account Name Already Used" +msgstr "Konto o takiej nazwie już istnieje" + +#: ../src/config.py:1676 +msgid "" +"This name is already used by another of your accounts. Please choose another " +"name." +msgstr "Posiadasz już konto o tej nazwie. Zmień nazwę konta na unikalną." + +#: ../src/config.py:1680 ../src/config.py:1684 +msgid "Invalid account name" +msgstr "Niepoprawna nazwa konta" + +#: ../src/config.py:1681 +msgid "Account name cannot be empty." +msgstr "Nazwa konta nie może być pusta." + +#: ../src/config.py:1685 +msgid "Account name cannot contain spaces." +msgstr "Nazwa konta nie może zawierać spacji." + +#: ../src/config.py:1749 +msgid "Rename Account" +msgstr "Zmień nazwę konta" + +#: ../src/config.py:1750 +#, python-format +msgid "Enter a new name for account %s" +msgstr "Wpisz nową nazwę dla kontaktu %s." + +#: ../src/config.py:1768 ../src/config.py:1776 ../src/config.py:1816 +#: ../src/config.py:3022 +msgid "Invalid Jabber ID" +msgstr "Niepoprawny Jabber ID" + +#: ../src/config.py:1777 +msgid "A Jabber ID must be in the form \"user@servername\"." +msgstr "Jabber ID musi być postaci \"użytkownik@nazwaserwera\"." + +#: ../src/config.py:1962 ../src/config.py:3093 +msgid "Invalid entry" +msgstr "Niepoprawny wpis" + +#: ../src/config.py:1963 ../src/config.py:3094 +msgid "Custom port must be a port number." +msgstr "Wybrany port musi być numerem portu." + +#: ../src/config.py:1984 +msgid "Failed to get secret keys" +msgstr "Pobieranie kluczy prywatnych nie powiodło się" + +#: ../src/config.py:1985 +msgid "There was a problem retrieving your OpenPGP secret keys." +msgstr "" +"Wystąpił problem w trakcie odzyskiwania Twoich kluczy prywatnych OpenPGP." + +#: ../src/config.py:1988 +msgid "OpenPGP Key Selection" +msgstr "Wybór klucza OpenPGP" + +#: ../src/config.py:1989 +msgid "Choose your OpenPGP key" +msgstr "Wybierz klucz OpenPGP" + +#: ../src/config.py:2029 +msgid "No such account available" +msgstr "Takie konto nie jest dostępne" + +#: ../src/config.py:2030 +msgid "You must create your account before editing your personal information." +msgstr "Musisz najpierw stworzyć konto by móc edytować informacje o sobie." + +#: ../src/config.py:2037 ../src/dialogs.py:1360 ../src/dialogs.py:1501 +#: ../src/dialogs.py:1681 ../src/disco.py:426 ../src/profile_window.py:306 +msgid "You are not connected to the server" +msgstr "Nie jesteś połączony z serwerem" + +#: ../src/config.py:2038 +msgid "Without a connection, you can not edit your personal information." +msgstr "Musisz być połączony, aby móc zmieniać informacje o sobie." + +#: ../src/config.py:2042 +msgid "Your server doesn't support Vcard" +msgstr "Twój serwer nie akceptuje Vcard" + +#: ../src/config.py:2043 +msgid "Your server can't save your personal information." +msgstr "Twój serwer nie potrafi zapisać informacji osobistych." + +#: ../src/config.py:2074 msgid "Account Local already exists." msgstr "Konto o takiej nazwie już istnieje." -#: ../src/config.py:2015 +#: ../src/config.py:2075 msgid "Please rename or remove it before enabling link-local messaging." msgstr "" "Proszę go zmienić lub usunąć przed uaktywnieniem komunikacji link-local." -#: ../src/config.py:2111 +#: ../src/config.py:2251 #, python-format msgid "Edit %s" msgstr "Modyfikuj %s" -#: ../src/config.py:2113 +#: ../src/config.py:2253 #, python-format msgid "Register to %s" msgstr "Zarejestruj na %s" #. list at the beginning -#: ../src/config.py:2179 +#: ../src/config.py:2289 msgid "Ban List" msgstr "Lista kontaktów zablokowanych" -#: ../src/config.py:2180 +#: ../src/config.py:2290 msgid "Member List" msgstr "_Lista uczestników" -#: ../src/config.py:2181 +#: ../src/config.py:2291 msgid "Owner List" msgstr "_Lista właścicieli" -#: ../src/config.py:2182 +#: ../src/config.py:2292 msgid "Administrator List" msgstr "_Administratorzy" #. Address column #. holds JID (who said this) -#: ../src/config.py:2231 ../src/disco.py:748 ../src/history_manager.py:155 +#: ../src/config.py:2341 ../src/disco.py:749 ../src/history_manager.py:160 msgid "JID" msgstr "JID" -#: ../src/config.py:2239 +#: ../src/config.py:2349 msgid "Reason" msgstr "Powód" -#: ../src/config.py:2244 +#: ../src/config.py:2354 msgid "Nick" msgstr "Nick" -#: ../src/config.py:2248 +#: ../src/config.py:2358 msgid "Role" msgstr "Funkcja:" -#: ../src/config.py:2273 +#: ../src/config.py:2383 msgid "Banning..." msgstr "Blokuję użytkownika..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2275 +#: ../src/config.py:2385 msgid "" "Whom do you want to ban?\n" "\n" @@ -2987,11 +3135,11 @@ msgstr "" "Którego użytkownika chcesz zablokować?\n" "\n" -#: ../src/config.py:2277 +#: ../src/config.py:2387 msgid "Adding Member..." msgstr "Dodaję członka..." -#: ../src/config.py:2278 +#: ../src/config.py:2388 msgid "" "Whom do you want to make a member?\n" "\n" @@ -2999,11 +3147,11 @@ msgstr "" "Status którego użytkownika chcesz zmienić?\n" "\n" -#: ../src/config.py:2280 +#: ../src/config.py:2390 msgid "Adding Owner..." msgstr "Dodaję właściciela..." -#: ../src/config.py:2281 +#: ../src/config.py:2391 msgid "" "Whom do you want to make an owner?\n" "\n" @@ -3011,11 +3159,11 @@ msgstr "" "Którego użytkownika chcesz uczynić właścicielem pokoju?\n" "\n" -#: ../src/config.py:2283 +#: ../src/config.py:2393 msgid "Adding Administrator..." msgstr "Dodaję administratora..." -#: ../src/config.py:2284 +#: ../src/config.py:2394 msgid "" "Whom do you want to make an administrator?\n" "\n" @@ -3023,7 +3171,7 @@ msgstr "" "Którego użytkownika chcesz uczynić administratorem?\n" "\n" -#: ../src/config.py:2285 +#: ../src/config.py:2395 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" @@ -3039,99 +3187,83 @@ msgstr "" "4. domena (dotyczy domeny a także dowolnego adresu typu użytkownik@domena,\n" "domena/zasób lub adresu zawierającego subdomenę)." -#: ../src/config.py:2389 +#: ../src/config.py:2499 #, python-format msgid "Removing %s account" msgstr "Usuwanie konta %s" -#: ../src/config.py:2406 ../src/roster_window.py:3008 +#: ../src/config.py:2514 ../src/gajim.py:1336 ../src/roster_window.py:3426 msgid "Password Required" msgstr "Wymagane hasło" -#: ../src/config.py:2407 ../src/roster_window.py:3004 +#: ../src/config.py:2515 ../src/roster_window.py:3422 #, python-format msgid "Enter your password for account %s" msgstr "Wpisz hasło dla konta %s" -#: ../src/config.py:2408 ../src/roster_window.py:3009 +#: ../src/config.py:2516 ../src/roster_window.py:3427 msgid "Save password" msgstr "Zapisz hasło" -#: ../src/config.py:2422 +#: ../src/config.py:2529 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Konto \"%s\" jest połączone z serwerem." -#: ../src/config.py:2423 +#: ../src/config.py:2530 msgid "If you remove it, the connection will be lost." msgstr "Jeśli to usuniesz, połączenie zostanie zerwane." -#: ../src/config.py:2508 +#: ../src/config.py:2623 msgid "Default" msgstr "Domyślny" -#: ../src/config.py:2508 +#: ../src/config.py:2623 msgid "?print_status:All" msgstr "?print_status:Wszystkie" -#: ../src/config.py:2509 +#: ../src/config.py:2624 msgid "Enter and leave only" msgstr "Jedynie wejdź i wyjdź" -#: ../src/config.py:2510 +#: ../src/config.py:2625 msgid "?print_status:None" msgstr "?print_status:Żaden" -#: ../src/config.py:2578 +#: ../src/config.py:2694 msgid "New Group Chat" msgstr "Nowa rozmowa grupowa" -#: ../src/config.py:2611 +#: ../src/config.py:2727 msgid "This bookmark has invalid data" msgstr "Ta zakładka zawiera niepoprawne dane" -#: ../src/config.py:2612 +#: ../src/config.py:2728 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "Upewnij się, że wypełniłeś pola serwer i pokój lub usuń tę zakładkę." -#: ../src/config.py:2875 +#: ../src/config.py:3005 msgid "Invalid username" msgstr "Niepoprawna nazwa użytkownika" -#: ../src/config.py:2876 +#: ../src/config.py:3007 msgid "You must provide a username to configure this account." msgstr "Musisz wpisać nazwę użytkownika aby skonfigurować to konto." -#: ../src/config.py:2886 ../src/dialogs.py:1525 -msgid "Invalid password" -msgstr "Niepoprawne hasło" - -#: ../src/config.py:2887 -msgid "You must enter a password for the new account." -msgstr "Musisz wpisać hasło dla nowego konta." - -#: ../src/config.py:2891 ../src/dialogs.py:1530 -msgid "Passwords do not match" -msgstr "Hasła nie zgadzają się" - -#: ../src/config.py:2892 ../src/dialogs.py:1531 -msgid "The passwords typed in both fields must be identical." -msgstr "Hasła wpisane w obydwu polach muszą być identyczne." - -#: ../src/config.py:2911 +#: ../src/config.py:3033 msgid "Duplicate Jabber ID" msgstr "Taki Jabber ID już istnieje!" -#: ../src/config.py:2912 +#: ../src/config.py:3034 msgid "This account is already configured in Gajim." msgstr "Konto o takiej nazwie jest już skonfigurowane." -#: ../src/config.py:2929 +#: ../src/config.py:3051 msgid "Account has been added successfully" msgstr "Konto zostało pomyślnie dodane" -#: ../src/config.py:2930 ../src/config.py:2965 +#: ../src/config.py:3052 ../src/config.py:3197 msgid "" "You can set advanced account options by pressing the Advanced button, or " "later by choosing the Accounts menuitem under the Edit menu from the main " @@ -3140,23 +3272,31 @@ msgstr "" "Możesz ustawić opcje zaawansowane wciskając przycisk Zaawansowane lub " "później wybierając pozycję Konta z menu Edycja w głównym oknie programu." -#: ../src/config.py:2964 -msgid "Your new account has been created successfully" -msgstr "Twoje konto zostało założone" +#: ../src/config.py:3069 +msgid "Invalid server" +msgstr "Niepoprawna nazwa serwera" -#: ../src/config.py:2982 +#: ../src/config.py:3070 +msgid "Please provide a server on which you want to register." +msgstr "Wpisz adres serwera, na którym chcesz się zarejestrować." + +#: ../src/config.py:3176 ../src/config.py:3215 msgid "An error occurred during account creation" msgstr "Wystąpił błąd w trakcie tworzenia konta" -#: ../src/config.py:3040 +#: ../src/config.py:3196 +msgid "Your new account has been created successfully" +msgstr "Twoje konto zostało założone" + +#: ../src/config.py:3299 msgid "Account name is in use" msgstr "Nazwa konta jest już zajęta" -#: ../src/config.py:3041 +#: ../src/config.py:3300 msgid "You already have an account using this name." msgstr "Masz już konto o takiej nazwie." -#: ../src/conversation_textview.py:279 +#: ../src/conversation_textview.py:450 msgid "" "Text below this line is what has been said since the last time you paid " "attention to this group chat" @@ -3164,191 +3304,200 @@ msgstr "" "Tekst poniżej tej linii zawiera to, co zostało napisane w tym pokoju od " "momentu gdy ostatni raz zwracałeś/zwracałaś na niego uwagę" -#: ../src/conversation_textview.py:348 +#: ../src/conversation_textview.py:548 #, python-format msgid "_Actions for \"%s\"" msgstr "_Działania dla wyrażenia \"%s\"" -#: ../src/conversation_textview.py:360 +#: ../src/conversation_textview.py:560 msgid "Read _Wikipedia Article" msgstr "Przeczytaj artykuł w _Wikipedii" -#: ../src/conversation_textview.py:365 +#: ../src/conversation_textview.py:565 msgid "Look it up in _Dictionary" msgstr "Szukaj w _słowniku" #. we must have %s in the url if not WIKTIONARY -#: ../src/conversation_textview.py:381 +#: ../src/conversation_textview.py:581 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "W URL-u słownika brakuje \"%s\" i nie jest to WIKTIONARY" #. we must have %s in the url -#: ../src/conversation_textview.py:394 +#: ../src/conversation_textview.py:594 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "W URL-u Przeszukiwania Sieci brakuje \"%s\"" -#: ../src/conversation_textview.py:397 +#: ../src/conversation_textview.py:597 msgid "Web _Search for it" msgstr "Szukaj w _Internecie" -#: ../src/conversation_textview.py:403 +#: ../src/conversation_textview.py:603 msgid "Open as _Link" msgstr "Otwórz jako _odnośnik" -#: ../src/conversation_textview.py:848 +#: ../src/conversation_textview.py:1069 msgid "Yesterday" msgstr "Wczoraj" #. the number is >= 2 #. %i is day in year (1-365), %d (1-31) we want %i -#: ../src/conversation_textview.py:852 +#: ../src/conversation_textview.py:1073 #, python-format msgid "%i days ago" msgstr "%i dni temu" #. if we have subject, show it too! -#: ../src/conversation_textview.py:886 +#: ../src/conversation_textview.py:1107 #, python-format msgid "Subject: %s\n" msgstr "Temat: %s\n" -#: ../src/dialogs.py:59 +#: ../src/dialogs.py:71 #, python-format msgid "Contact name: %s" msgstr "Nazwa kontaktu: %s" -#: ../src/dialogs.py:61 +#: ../src/dialogs.py:73 #, python-format msgid "Jabber ID: %s" msgstr "JID : %s" -#: ../src/dialogs.py:211 +#: ../src/dialogs.py:223 msgid "Group" msgstr "Grupa" -#: ../src/dialogs.py:218 +#: ../src/dialogs.py:230 msgid "In the group" msgstr "W grupie" -#: ../src/dialogs.py:269 +#: ../src/dialogs.py:330 msgid "KeyID" msgstr "Identyfikator klucza" -#: ../src/dialogs.py:272 +#: ../src/dialogs.py:333 msgid "Contact name" msgstr "Nazwa kontaktu" -#: ../src/dialogs.py:318 +#: ../src/dialogs.py:379 #, python-format msgid "%s Status Message" msgstr "Informacja o statusie %s" -#: ../src/dialogs.py:320 +#: ../src/dialogs.py:381 msgid "Status Message" msgstr "Opis statusu" -#: ../src/dialogs.py:395 +#: ../src/dialogs.py:481 msgid "Save as Preset Status Message" msgstr "Szablony opisów" -#: ../src/dialogs.py:396 +#: ../src/dialogs.py:482 msgid "Please type a name for this status message" msgstr "Podaj nazwę dla tego szablonu" -#: ../src/dialogs.py:417 +#: ../src/dialogs.py:493 +msgid "Overwrite Status Message?" +msgstr "Zmienić opis statusu?" + +#: ../src/dialogs.py:494 +msgid "" +"This name is already used. Do you want to overwrite this status message?" +msgstr "Status o tej nazwie jest w użyciu. Czy chcesz go zmienić?" + +#: ../src/dialogs.py:510 msgid "AIM Address:" msgstr "_Adres AIM:" -#: ../src/dialogs.py:418 +#: ../src/dialogs.py:511 msgid "GG Number:" msgstr "Numer GG:" -#: ../src/dialogs.py:419 +#: ../src/dialogs.py:512 msgid "ICQ Number:" msgstr "Numer ICQ:" -#: ../src/dialogs.py:420 +#: ../src/dialogs.py:513 msgid "MSN Address:" msgstr "_Adres MSN:" -#: ../src/dialogs.py:421 +#: ../src/dialogs.py:514 msgid "Yahoo! Address:" msgstr "Adres _Yahoo:" -#: ../src/dialogs.py:457 +#: ../src/dialogs.py:551 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" msgstr "Wypełnij informacje o kontakcie, który chcesz dodać do konta %s" -#: ../src/dialogs.py:459 +#: ../src/dialogs.py:553 msgid "Please fill in the data of the contact you want to add" msgstr "Wypełnij informacje o kontakcie, który chcesz dodać" -#: ../src/dialogs.py:609 ../src/dialogs.py:615 +#: ../src/dialogs.py:710 ../src/dialogs.py:716 msgid "Invalid User ID" msgstr "Niepoprawny identyfikator użytkownika" -#: ../src/dialogs.py:616 +#: ../src/dialogs.py:717 msgid "The user ID must not contain a resource." msgstr "ID użytkownika nie może zawierać zasobu." -#: ../src/dialogs.py:630 +#: ../src/dialogs.py:731 msgid "Contact already in roster" msgstr "Kontakt jest już na liście kontaktów" -#: ../src/dialogs.py:631 +#: ../src/dialogs.py:732 msgid "This contact is already listed in your roster." msgstr "Ten kontakt znajduje się już na twojej liście kontaktów." -#: ../src/dialogs.py:668 +#: ../src/dialogs.py:768 msgid "User ID:" msgstr "ID uzytkownika:" -#: ../src/dialogs.py:731 +#: ../src/dialogs.py:830 msgid "A GTK+ jabber client" msgstr "Klient jabbera w GTK+." -#: ../src/dialogs.py:732 +#: ../src/dialogs.py:831 msgid "GTK+ Version:" msgstr "Wersja GTK+:" -#: ../src/dialogs.py:733 +#: ../src/dialogs.py:832 msgid "PyGTK Version:" msgstr "Wersja PyGTK:" -#: ../src/dialogs.py:747 +#: ../src/dialogs.py:846 msgid "Current Developers:" msgstr "Bieżący deweloperzy:" -#: ../src/dialogs.py:749 +#: ../src/dialogs.py:848 msgid "Past Developers:" msgstr "Poprzedni deweloperzy:" -#: ../src/dialogs.py:759 +#: ../src/dialogs.py:858 msgid "THANKS:" msgstr "Podziękowania:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:765 +#: ../src/dialogs.py:864 msgid "Last but not least, we would like to thank all the package maintainers." msgstr "I wreszcie, chcielibyśmy podziękować wszystkim opiekunom pakietów." #. here you write your name in the form Name FamilyName -#: ../src/dialogs.py:778 +#: ../src/dialogs.py:877 msgid "translator-credits" msgstr "" -"Tłumaczenie na język polski: Witold Kieraś \n" -"Maciej Chojnacki " +"Tłumaczenie na język polski: Witold Kieraś\n" +"Maciej Chojnacki " -#: ../src/dialogs.py:908 +#: ../src/dialogs.py:1007 #, python-format msgid "Unable to bind to port %s." msgstr "Nie można podłączyć się do portu %s." -#: ../src/dialogs.py:909 +#: ../src/dialogs.py:1008 msgid "" "Maybe you have another running instance of Gajim. File Transfer will be " "cancelled." @@ -3356,75 +3505,92 @@ msgstr "" "Być może masz już uruchomioną inną kopię Gajima. Przesyłanie plików zostanie " "anulowane." -#: ../src/dialogs.py:1120 +#: ../src/dialogs.py:1015 +#, python-format +msgid "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option.\n" +"\n" +"Highlighting misspelled words feature will not be used" +msgstr "" +"Musisz zainstalować słownik %s aby aktywować sprawdzanie pisowni lub wybrać " +"inny język korzystać z opcji speller_langugage.\n" +"Do tego czasu podświetlanie błędnie wpisanych słów nie będzie działało" + +#: ../src/dialogs.py:1289 #, python-format msgid "Subscription request for account %s from %s" msgstr "Prośba o autoryzację dla konta %s od %s" -#: ../src/dialogs.py:1123 +#: ../src/dialogs.py:1292 #, python-format msgid "Subscription request from %s" msgstr "Prośba o autoryzację od %s" -#: ../src/dialogs.py:1183 ../src/roster_window.py:705 +#: ../src/dialogs.py:1353 ../src/roster_window.py:769 #, python-format msgid "You are already in group chat %s" msgstr "Już jesteś w pokoju %s" -#: ../src/dialogs.py:1191 +#: ../src/dialogs.py:1361 msgid "You can not join a group chat unless you are connected." msgstr "Nie możesz dołączyć do pokoju gdy nie jesteś połączony." -#: ../src/dialogs.py:1206 +#: ../src/dialogs.py:1379 #, python-format msgid "Join Group Chat with account %s" msgstr "Dołącz do pokoju z konta %s" -#: ../src/dialogs.py:1274 ../src/dialogs.py:1280 -#: ../src/groupchat_control.py:1475 +#: ../src/dialogs.py:1449 ../src/dialogs.py:1455 +#: ../src/groupchat_control.py:1683 msgid "Invalid group chat Jabber ID" msgstr "Niepoprawny Jabber ID" -#: ../src/dialogs.py:1275 ../src/dialogs.py:1281 -#: ../src/groupchat_control.py:1476 +#: ../src/dialogs.py:1450 ../src/dialogs.py:1456 +#: ../src/groupchat_control.py:1684 msgid "The group chat Jabber ID has not allowed characters." msgstr "Używane przez ciebie Jabber ID zawiera niedozwolone znaki." -#: ../src/dialogs.py:1287 +#: ../src/dialogs.py:1462 msgid "This is not a group chat" msgstr "To nie jest czat" -#: ../src/dialogs.py:1288 +#: ../src/dialogs.py:1463 #, python-format msgid "%s is not the name of a group chat." msgstr "%s nie jest nazwą czatu." -#: ../src/dialogs.py:1327 +#: ../src/dialogs.py:1502 msgid "Without a connection, you can not synchronise your contacts." msgstr "Nie możesz zsynchronizować kontaktów przy niektywnym połączeniu." -#: ../src/dialogs.py:1374 +#: ../src/dialogs.py:1516 +msgid "Server" +msgstr "Serwer" + +#: ../src/dialogs.py:1549 msgid "This account is not connected to the server" msgstr "To konto nie jest połączone z serwerem" -#: ../src/dialogs.py:1375 +#: ../src/dialogs.py:1550 msgid "You cannot synchronize with an account unless it is connected." -msgstr "Nie możesz synchronizować kontaktów z kontem, które nie jest połączone." +msgstr "" +"Nie możesz synchronizować kontaktów z kontem, które nie jest połączone." -#: ../src/dialogs.py:1399 +#: ../src/dialogs.py:1574 msgid "Synchronise" msgstr "Synchronizuj" -#: ../src/dialogs.py:1457 +#: ../src/dialogs.py:1632 #, python-format msgid "Start Chat with account %s" msgstr "Rozpocznij rozmowę z konta %s" -#: ../src/dialogs.py:1459 +#: ../src/dialogs.py:1634 msgid "Start Chat" msgstr "Rozpocznij rozmowę" -#: ../src/dialogs.py:1460 +#: ../src/dialogs.py:1635 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" @@ -3433,283 +3599,290 @@ msgstr "" "wysłać wiadomość:" #. if offline or connecting -#: ../src/dialogs.py:1485 ../src/dialogs.py:1844 ../src/dialogs.py:1975 +#: ../src/dialogs.py:1660 ../src/dialogs.py:2030 ../src/dialogs.py:2171 msgid "Connection not available" msgstr "Połączenie jest niedostępne" -#: ../src/dialogs.py:1486 ../src/dialogs.py:1845 ../src/dialogs.py:1976 +#: ../src/dialogs.py:1661 ../src/dialogs.py:2031 ../src/dialogs.py:2172 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Sprawdź, czy jesteś połączony z \"%s\"." -#: ../src/dialogs.py:1495 ../src/dialogs.py:1498 +#: ../src/dialogs.py:1670 ../src/dialogs.py:1673 msgid "Invalid JID" msgstr "Niepoprawny JID" -#: ../src/dialogs.py:1498 +#: ../src/dialogs.py:1673 #, python-format msgid "Unable to parse \"%s\"." msgstr "Nie można sparsować \"%s\"." -#: ../src/dialogs.py:1507 +#: ../src/dialogs.py:1682 msgid "Without a connection, you can not change your password." msgstr "Nie możesz zmienić hasła, jeśli nie jesteś połączony." -#: ../src/dialogs.py:1526 +#: ../src/dialogs.py:1700 +msgid "Invalid password" +msgstr "Niepoprawne hasło" + +#: ../src/dialogs.py:1701 msgid "You must enter a password." msgstr "Musisz wpisać hasło." +#: ../src/dialogs.py:1705 +msgid "Passwords do not match" +msgstr "Hasła nie zgadzają się" + +#: ../src/dialogs.py:1706 +msgid "The passwords typed in both fields must be identical." +msgstr "Hasła wpisane w obydwu polach muszą być identyczne." + #. img to display #. default value -#: ../src/dialogs.py:1573 ../src/notify.py:212 ../src/notify.py:416 +#: ../src/dialogs.py:1748 ../src/notify.py:224 ../src/notify.py:434 msgid "Contact Signed In" msgstr "Kontakt połączył się" -#: ../src/dialogs.py:1575 ../src/notify.py:220 ../src/notify.py:418 +#: ../src/dialogs.py:1750 ../src/notify.py:232 ../src/notify.py:436 msgid "Contact Signed Out" msgstr "Kontakt rozłączył się" #. chat message -#: ../src/dialogs.py:1577 ../src/notify.py:239 ../src/notify.py:420 +#: ../src/dialogs.py:1752 ../src/notify.py:255 ../src/notify.py:438 msgid "New Message" msgstr "Nowa wiadomość" #. single message -#: ../src/dialogs.py:1577 ../src/notify.py:224 ../src/notify.py:420 +#: ../src/dialogs.py:1752 ../src/notify.py:236 ../src/notify.py:438 msgid "New Single Message" msgstr "Nowa wiadomość" #. private message -#: ../src/dialogs.py:1578 ../src/notify.py:231 ../src/notify.py:421 +#: ../src/dialogs.py:1753 ../src/notify.py:243 ../src/notify.py:439 msgid "New Private Message" msgstr "Wyślij prywatną wiadomość" -#: ../src/dialogs.py:1578 ../src/gajim.py:1294 ../src/notify.py:429 +#: ../src/dialogs.py:1753 ../src/gajim.py:1489 ../src/notify.py:447 msgid "New E-mail" msgstr "Nowy adres e-mail" -#: ../src/dialogs.py:1580 ../src/gajim.py:1447 ../src/notify.py:423 +#: ../src/dialogs.py:1755 ../src/gajim.py:1664 ../src/notify.py:441 msgid "File Transfer Request" msgstr "Pytanie o przysłanie pliku" -#: ../src/dialogs.py:1582 ../src/gajim.py:1266 ../src/gajim.py:1423 -#: ../src/notify.py:425 +#: ../src/dialogs.py:1757 ../src/gajim.py:1461 ../src/gajim.py:1631 +#: ../src/notify.py:443 msgid "File Transfer Error" msgstr "Błąd przesyłania pliku" -#: ../src/dialogs.py:1584 ../src/gajim.py:1486 ../src/gajim.py:1508 -#: ../src/gajim.py:1525 ../src/notify.py:427 +#: ../src/dialogs.py:1759 ../src/gajim.py:1703 ../src/gajim.py:1725 +#: ../src/gajim.py:1742 ../src/notify.py:445 msgid "File Transfer Completed" msgstr "Zakończono przesyłanie pliku" -#: ../src/dialogs.py:1585 ../src/gajim.py:1489 ../src/notify.py:427 +#: ../src/dialogs.py:1760 ../src/gajim.py:1706 ../src/notify.py:445 msgid "File Transfer Stopped" msgstr "Przesyłanie pliku zatrzymane" -#: ../src/dialogs.py:1587 ../src/gajim.py:1163 ../src/notify.py:431 +#: ../src/dialogs.py:1762 ../src/gajim.py:1357 ../src/notify.py:449 msgid "Groupchat Invitation" msgstr "Zaproszenie na czat" -#: ../src/dialogs.py:1589 ../src/notify.py:204 ../src/notify.py:433 +#: ../src/dialogs.py:1764 ../src/notify.py:216 ../src/notify.py:451 msgid "Contact Changed Status" msgstr "Kontakt zmienił status" -#: ../src/dialogs.py:1774 +#: ../src/dialogs.py:1949 #, python-format msgid "Single Message using account %s" msgstr "Wiadomość z konta %s" -#: ../src/dialogs.py:1776 +#: ../src/dialogs.py:1951 #, python-format msgid "Single Message in account %s" msgstr "Wiadomość z konta %s" -#: ../src/dialogs.py:1778 +#: ../src/dialogs.py:1953 msgid "Single Message" msgstr "Pojedyncza wiadomość" #. prepare UI for Sending -#: ../src/dialogs.py:1781 +#: ../src/dialogs.py:1956 #, python-format msgid "Send %s" msgstr "Wyślij %s" #. prepare UI for Receiving -#: ../src/dialogs.py:1804 +#: ../src/dialogs.py:1979 #, python-format msgid "Received %s" msgstr "Odebrane %s" +#. prepare UI for Receiving +#: ../src/dialogs.py:2002 +#, 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:1876 +#: ../src/dialogs.py:2072 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:1877 +#: ../src/dialogs.py:2073 #, python-format msgid "%s wrote:\n" msgstr "%s napisał:\n" -#: ../src/dialogs.py:1921 +#: ../src/dialogs.py:2117 #, python-format msgid "XML Console for %s" msgstr "Kosola XML dla %s" -#: ../src/dialogs.py:1923 +#: ../src/dialogs.py:2119 msgid "XML Console" msgstr "Konsola XML" -#: ../src/dialogs.py:2046 +#: ../src/dialogs.py:2242 #, python-format msgid "Privacy List %s" msgstr "Lista prywatności %s" -#: ../src/dialogs.py:2050 +#: ../src/dialogs.py:2246 #, python-format msgid "Privacy List for %s" msgstr "Lista prywatności dla %s" -#: ../src/dialogs.py:2098 +#: ../src/dialogs.py:2302 #, python-format msgid "Order: %s, action: %s, type: %s, value: %s" msgstr "Kolejność: %s, akcja: %s, typ: %s, wartość: %s" -#: ../src/dialogs.py:2101 +#: ../src/dialogs.py:2305 #, python-format msgid "Order: %s, action: %s" msgstr "Kolejność: %s, akcja: %s" -#: ../src/dialogs.py:2143 +#: ../src/dialogs.py:2347 msgid "Edit a rule" msgstr "Edytuj regułę" -#: ../src/dialogs.py:2230 +#: ../src/dialogs.py:2434 msgid "Add a rule" msgstr "Dodaj regułę" -#: ../src/dialogs.py:2319 -#, python-format -msgid "Blocked Contacts for %s" -msgstr "Kontakty zablokowane (dla %s)" - -#: ../src/dialogs.py:2321 -msgid "Blocked Contacts" -msgstr "Kontakty zablokowane" - -#: ../src/dialogs.py:2390 -msgid "Group %s" -msgstr "Grupa %" - -#: ../src/dialogs.py:2421 +#: ../src/dialogs.py:2530 #, python-format msgid "Privacy Lists for %s" msgstr "Listy prywatności dla %s" -#: ../src/dialogs.py:2423 +#: ../src/dialogs.py:2532 msgid "Privacy Lists" msgstr "Listy prywatności" -#: ../src/dialogs.py:2493 +#: ../src/dialogs.py:2602 msgid "Invalid List Name" msgstr "Niepoprawna nazwa listy" -#: ../src/dialogs.py:2494 +#: ../src/dialogs.py:2603 msgid "You must enter a name to create a privacy list." msgstr "Musisz podać nazwę nowej listy prywatności." -#. Don't translate $Contact -#: ../src/dialogs.py:2528 +#: ../src/dialogs.py:2640 +msgid "$Contact has invited you to join a discussion" +msgstr "$Contact zaprasza cię do rozmowy" + +#: ../src/dialogs.py:2642 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact zaprasza cię do pokoju %(room_jid)s" -#. only if not None and not '' -#: ../src/dialogs.py:2540 +#: ../src/dialogs.py:2655 #, python-format msgid "Comment: %s" msgstr "Komentarz: %s" -#: ../src/dialogs.py:2602 +#: ../src/dialogs.py:2721 msgid "Choose Sound" msgstr "Wybierz dźwięk" -#: ../src/dialogs.py:2612 ../src/dialogs.py:2657 +#: ../src/dialogs.py:2731 ../src/dialogs.py:2779 msgid "All files" msgstr "Wszystkie pliki" -#: ../src/dialogs.py:2617 +#: ../src/dialogs.py:2736 msgid "Wav Sounds" msgstr "Dźwięki w Wav" -#: ../src/dialogs.py:2647 +#: ../src/dialogs.py:2769 msgid "Choose Image" msgstr "Wybierz obrazek" -#: ../src/dialogs.py:2662 +#: ../src/dialogs.py:2784 msgid "Images" msgstr "Obrazki" -#: ../src/dialogs.py:2719 +#: ../src/dialogs.py:2849 #, python-format msgid "When %s becomes:" msgstr "Gdy %s ma status:" -#: ../src/dialogs.py:2721 +#: ../src/dialogs.py:2851 #, python-format msgid "Adding Special Notification for %s" msgstr "Dodaję specjalne powiadomienia dla %s" #. # means number -#: ../src/dialogs.py:2792 +#: ../src/dialogs.py:2922 msgid "#" msgstr "Nr" -#: ../src/dialogs.py:2798 +#: ../src/dialogs.py:2928 msgid "Condition" msgstr "Warunek" -#: ../src/dialogs.py:2919 +#: ../src/dialogs.py:3046 msgid "when I am " msgstr "kiedy mam " -#: ../src/disco.py:104 +#: ../src/disco.py:110 msgid "Others" msgstr "Inni" -#: ../src/disco.py:105 ../src/disco.py:106 ../src/disco.py:1350 -#: ../src/gajim.py:607 ../src/roster_window.py:273 ../src/roster_window.py:331 -#: ../src/roster_window.py:370 ../src/roster_window.py:454 -#: ../src/roster_window.py:486 ../src/roster_window.py:488 -#: ../src/roster_window.py:4230 ../src/roster_window.py:4232 -#: ../src/common/contacts.py:267 ../src/common/contacts.py:282 -#: ../src/common/helpers.py:43 +#: ../src/disco.py:111 ../src/disco.py:112 ../src/disco.py:1354 +#: ../src/gajim.py:653 ../src/roster_window.py:288 ../src/roster_window.py:348 +#: ../src/roster_window.py:388 ../src/roster_window.py:496 +#: ../src/roster_window.py:528 ../src/roster_window.py:530 +#: ../src/roster_window.py:4730 ../src/roster_window.py:4732 +#: ../src/common/contacts.py:295 ../src/common/contacts.py:310 +#: ../src/common/helpers.py:49 msgid "Transports" msgstr "Transporty" #. conference is a category for listing mostly groupchats in service discovery -#: ../src/disco.py:108 +#: ../src/disco.py:114 msgid "Conference" msgstr "Konferencja" -#: ../src/disco.py:421 +#: ../src/disco.py:427 msgid "Without a connection, you can not browse available services" msgstr "Nie możesz przeglądać usług, jeśli nie jesteś połączony" -#: ../src/disco.py:500 +#: ../src/disco.py:501 #, python-format msgid "Service Discovery using account %s" msgstr "Przeglądanie usług przy użyciu konta %s" -#: ../src/disco.py:502 +#: ../src/disco.py:503 msgid "Service Discovery" msgstr "Przeglądanie usług" -#: ../src/disco.py:642 +#: ../src/disco.py:643 msgid "The service could not be found" msgstr "Nie można odnaleźć usługi" -#: ../src/disco.py:643 +#: ../src/disco.py:644 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." @@ -3717,210 +3890,458 @@ msgstr "" "Pod wpisanym adresem nie ma żadnych usług lub one nie odpowiadają. Sprawdź " "adres i spróbuj ponownie." -#: ../src/disco.py:647 ../src/disco.py:928 +#: ../src/disco.py:648 ../src/disco.py:929 msgid "The service is not browsable" msgstr "Tej usługi nie można przeglądać" -#: ../src/disco.py:648 +#: ../src/disco.py:649 msgid "This type of service does not contain any items to browse." msgstr "Tego typu usługa nie zawiera elementów, które można przeglądać." -#: ../src/disco.py:728 +#: ../src/disco.py:729 #, python-format msgid "Browsing %s using account %s" msgstr "Przeglądanie %s przy użyciu konta %s" -#: ../src/disco.py:767 +#: ../src/disco.py:768 msgid "_Browse" msgstr "Prze_glądaj" -#: ../src/disco.py:929 +#: ../src/disco.py:930 msgid "This service does not contain any items to browse." msgstr "Usługa nie zawiera elementów, które można przeglądać." -#: ../src/disco.py:1147 +#: ../src/disco.py:1151 msgid "_Execute Command" msgstr "_Wykonaj komendę" -#: ../src/disco.py:1157 ../src/disco.py:1355 +#: ../src/disco.py:1161 ../src/disco.py:1359 msgid "Re_gister" msgstr "Za_rejestruj" -#: ../src/disco.py:1392 +#: ../src/disco.py:1396 #, python-format msgid "Scanning %d / %d.." msgstr "Skanowanie %d / %d.." #. Users column -#: ../src/disco.py:1573 +#: ../src/disco.py:1578 msgid "Users" msgstr "Użytkownicy" #. Description column -#: ../src/disco.py:1580 +#: ../src/disco.py:1586 msgid "Description" msgstr "Opis" #. Id column -#: ../src/disco.py:1587 +#: ../src/disco.py:1594 msgid "Id" msgstr "Id" -#: ../src/disco.py:1810 +#: ../src/disco.py:1823 msgid "Subscribed" msgstr "Zasubskrybowano" -#: ../src/disco.py:1836 +#: ../src/disco.py:1831 +msgid "Node" +msgstr "Węzeł" + +#: ../src/disco.py:1888 msgid "New post" msgstr "Nowy wpis" -#: ../src/disco.py:1842 +#: ../src/disco.py:1894 msgid "_Subscribe" msgstr "_Autoryzuj" -#: ../src/disco.py:1848 +#: ../src/disco.py:1900 msgid "_Unsubscribe" msgstr "_Cofnij autoryzację" -#: ../src/filetransfers_window.py:72 +#: ../src/features_window.py:46 +msgid "PyOpenSSL" +msgstr "PyOpenSSL" + +#: ../src/features_window.py:47 +msgid "" +"A library used to validate server certificates to ensure a secure connection." +msgstr "" +"Biblioteka używana do weryfikacji certyfikatów w celu zapewnienia " +"bezpiecznego połączenia." + +#: ../src/features_window.py:48 ../src/features_window.py:49 +msgid "Requires python-pyopenssl." +msgstr "Wymaga python-pyopenssl" + +#: ../src/features_window.py:50 +msgid "Bonjour / Zeroconf" +msgstr "Bonjour / Zeroconf" + +#: ../src/features_window.py:51 +msgid "Serverless chatting with autodetected clients in a local network." +msgstr "" +"Rozmowy w sieci lokalnej, bez pośrednictwa serwera i z automatycznym " +"wykrywaniem klientów." + +#: ../src/features_window.py:52 +msgid "Requires python-avahi." +msgstr "Wymaga python-avahi." + +#: ../src/features_window.py:53 +msgid "Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." +msgstr "Wymaga pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)" + +#: ../src/features_window.py:54 +msgid "gajim-remote" +msgstr "gajim-remote" + +#: ../src/features_window.py:55 +msgid "A script to controle gajim via commandline." +msgstr "Skrypt pozwalający na sterowanie Gajimem z linii komend." + +#: ../src/features_window.py:56 +msgid "Requires python-dbus." +msgstr "Wymaga 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:97 +msgid "Feature not available under Windows." +msgstr "Funkcjonalność niedostępna dla systemu Windows." + +#: ../src/features_window.py:58 +msgid "OpenGPG" +msgstr "OpenGPG" + +#: ../src/features_window.py:59 +msgid "Encrypting chatmessages with gpg keys." +msgstr "Szyfrowanie wiadomości kluczami GPG." + +#: ../src/features_window.py:60 +msgid "Requires gpg and python-GnuPGInterface." +msgstr "Wymaga GPG oraz python-GnuPGInterface." + +#: ../src/features_window.py:62 +msgid "network-manager" +msgstr "Menedżer sieci" + +#: ../src/features_window.py:63 +msgid "Autodetection of network status." +msgstr "Automatyczne wykrywanie stanu sieci." + +#: ../src/features_window.py:64 +msgid "Requires gnome-network-manager and python-dbus." +msgstr "Wymaga gnome-network-manager oraz python-dbus." + +#: ../src/features_window.py:66 +msgid "Session Management" +msgstr "Zarządzanie sesją" + +#: ../src/features_window.py:67 +msgid "Gajim session is stored on logout and restored on login." +msgstr "" +"Sesja jest zapisywana przy wylogowaniu z serwera i przywracana przy " +"logowaniu." + +#: ../src/features_window.py:68 +msgid "Requires python-gnome2." +msgstr "Wymaga python-gnome2." + +#: ../src/features_window.py:70 +msgid "gnome-keyring" +msgstr "Baza kluczy GNOME" + +#: ../src/features_window.py:71 +msgid "Passwords can be stored securely and not just in plaintext." +msgstr "Bezpieczne przechowywanie haseł." + +#: ../src/features_window.py:72 +msgid "Requires gnome-keyring and python-gnome2-desktop." +msgstr "Wymaga gnome-keyring oraz python-gnome-desktop." + +#: ../src/features_window.py:74 +msgid "SRV" +msgstr "SRV" + +#: ../src/features_window.py:75 +msgid "Ability to connect to servers which are using SRV records." +msgstr "Możliwość połączenia z serwerami, które używają rekordów SRV." + +#: ../src/features_window.py:76 +msgid "Requires dnsutils." +msgstr "Wymaga dnsutils." + +#: ../src/features_window.py:77 +msgid "Requires nslookup to use SRV records." +msgstr "Wymaga nslookup." + +#: ../src/features_window.py:78 +msgid "Spell Checker" +msgstr "Słownik" + +#: ../src/features_window.py:79 +msgid "Spellchecking of composed messages." +msgstr "Zwraca uwagę na błędy w wysyłanych wiadomościach." + +#: ../src/features_window.py:80 +msgid "" +"Requires python-gnome2-extras or compilation of gtkspell module from Gajim " +"sources." +msgstr "Wymaga python-gnome2-extras lub kompilacji gtkspell ze źródeł Gajima." + +#: ../src/features_window.py:82 +msgid "Notification-daemon" +msgstr "Powiadamianie o zdarzeniach" + +#: ../src/features_window.py:83 +msgid "Passive popups notifying for new events." +msgstr "Wyświetla okna informujące o nowych zdarzeniach." + +#: ../src/features_window.py:84 +msgid "" +"Requires python-notify or instead python-dbus in conjunction with " +"notification-daemon." +msgstr "" +"Wymaga python-notify lub python-dbus w połączeniu z notification-daemon." + +#: ../src/features_window.py:86 +msgid "Trayicon" +msgstr "Ikona w obszarze powiadamiania" + +#: ../src/features_window.py:87 +msgid "A icon in systemtray reflecting the current presence." +msgstr "Ikona w obszarze powiadamiania odzwierciedla aktualny status." + +#: ../src/features_window.py:88 +msgid "" +"Requires python-gnome2-extras or compiled trayicon module from Gajim " +"sources." +msgstr "" +"Wymaga python-gnome2-extras lub skompilowanego modułu trayicon ze źródeł " +"Gajima." + +#: ../src/features_window.py:89 +msgid "Requires PyGTK >= 2.10." +msgstr "Wymaga PyGTK >= 2.10." + +#: ../src/features_window.py:90 +msgid "Idle" +msgstr "Stan bezczynności" + +#: ../src/features_window.py:91 +msgid "Ability to measure idle time, in order to set auto status." +msgstr "" +"Umożliwia mierzenie czasu bezczynności i odpowiednie ustawienie statusu." + +#: ../src/features_window.py:92 ../src/features_window.py:93 +msgid "Requires compilation of the idle module from Gajim sources." +msgstr "Wymaga kompilacji modułu idle ze źródeł Gajima." + +#: ../src/features_window.py:94 +msgid "LaTeX" +msgstr "LaTeX" + +#: ../src/features_window.py:95 +msgid "Transform LaTeX espressions between $$ $$." +msgstr "Przekształcanie wyrażeń jezyka LaTeX pomiędzy $$ $$." + +#: ../src/features_window.py:96 +msgid "" +"Requires texlive-latex-base, dvips and imagemagick. You have to set " +"'use_latex' to True in the Advanced Configuration Editor." +msgstr "" +"Wymaga texlive-latex-ase, dvips oraz imagemagick. Musisz ustawić zmienną " +"'use_latex' na 'True'." + +#: ../src/features_window.py:98 +msgid "End to end encryption" +msgstr "Szyfrowanie transmisji" + +#: ../src/features_window.py:99 +msgid "Encrypting chatmessages." +msgstr "Szyfrowanie wysyłanych wiadomości." + +#: ../src/features_window.py:100 ../src/features_window.py:101 +msgid "Requires python-crypto." +msgstr "Wymaga python-crypto." + +#: ../src/features_window.py:102 +msgid "RST Generator" +msgstr "Generator RST" + +#: ../src/features_window.py:103 +msgid "" +"Generate XHTML output from RST code (see http://docutils.sourceforge.net/" +"docs/ref/rst/restructuredtext.html)." +msgstr "" +"Tworzy XHTML z kodu RST (patrz http://docutils.sourceforge.net/docs/ref/rst/" +"restructuredtext.html)." + +#: ../src/features_window.py:104 ../src/features_window.py:105 +msgid "Requires python-docutils." +msgstr "Wymaga python-docutils." + +#: ../src/features_window.py:106 +msgid "libsexy" +msgstr "libsexy" + +#: ../src/features_window.py:107 +msgid "Ability to have clickable URLs in chat window." +msgstr "Dodaje możliwość wyświetlania aktywnych ('klikalnych') adresów URL." + +#: ../src/features_window.py:108 ../src/features_window.py:109 +msgid "Requires python-sexy." +msgstr "Wymaga python-sexy" + +#: ../src/features_window.py:116 ../src/common/helpers.py:244 +msgid "Available" +msgstr "Dostępny" + +#: ../src/features_window.py:123 +msgid "Feature" +msgstr "Możliwości" + +#: ../src/filetransfers_window.py:77 msgid "File" msgstr "Plik" -#: ../src/filetransfers_window.py:87 +#: ../src/filetransfers_window.py:92 msgid "Time" msgstr "Czas" -#: ../src/filetransfers_window.py:99 +#: ../src/filetransfers_window.py:104 msgid "Progress" msgstr "Postęp" -#: ../src/filetransfers_window.py:161 ../src/filetransfers_window.py:215 +#: ../src/filetransfers_window.py:164 ../src/filetransfers_window.py:218 #, python-format msgid "Filename: %s" msgstr "Nazwa pliku: %s" -#: ../src/filetransfers_window.py:162 ../src/filetransfers_window.py:290 +#: ../src/filetransfers_window.py:165 ../src/filetransfers_window.py:293 #, python-format msgid "Size: %s" msgstr "Rozmiar: %s" #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:171 ../src/filetransfers_window.py:181 -#: ../src/history_manager.py:463 +#: ../src/filetransfers_window.py:174 ../src/filetransfers_window.py:184 +#: ../src/history_manager.py:468 msgid "You" msgstr "Ty" -#: ../src/filetransfers_window.py:172 +#: ../src/filetransfers_window.py:175 #, python-format msgid "Sender: %s" msgstr "Nadawca: %s" -#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:564 -#: ../src/tooltips.py:574 +#: ../src/filetransfers_window.py:176 ../src/filetransfers_window.py:580 +#: ../src/tooltips.py:593 msgid "Recipient: " msgstr "Odbiorca: " -#: ../src/filetransfers_window.py:184 +#: ../src/filetransfers_window.py:187 #, python-format msgid "Saved in: %s" msgstr "Zapisane w: %s" -#: ../src/filetransfers_window.py:186 +#: ../src/filetransfers_window.py:189 msgid "File transfer completed" msgstr "Zakończono przesyłanie pliku" -#: ../src/filetransfers_window.py:200 ../src/filetransfers_window.py:206 +#: ../src/filetransfers_window.py:203 ../src/filetransfers_window.py:209 msgid "File transfer cancelled" msgstr "Przesyłanie pliku anulowane" -#: ../src/filetransfers_window.py:200 ../src/filetransfers_window.py:207 +#: ../src/filetransfers_window.py:203 ../src/filetransfers_window.py:210 msgid "Connection with peer cannot be established." msgstr "Nie można ustanowić połączenia z drugą stroną." -#: ../src/filetransfers_window.py:216 +#: ../src/filetransfers_window.py:219 #, python-format msgid "Recipient: %s" msgstr "Odbiorca: %s" -#: ../src/filetransfers_window.py:218 +#: ../src/filetransfers_window.py:221 #, python-format msgid "Error message: %s" msgstr "Komunikat błędu: %s" -#: ../src/filetransfers_window.py:219 +#: ../src/filetransfers_window.py:222 msgid "File transfer stopped by the contact at the other end" msgstr "Przesyłanie pliku zostało zatrzymane przez drugą osobę" -#: ../src/filetransfers_window.py:236 +#: ../src/filetransfers_window.py:239 msgid "Choose File to Send..." msgstr "Wybierz plik do wysłania..." -#: ../src/filetransfers_window.py:255 +#: ../src/filetransfers_window.py:258 msgid "Gajim cannot access this file" msgstr "Gajim nie może uzyskać dostępu do tego pliku" -#: ../src/filetransfers_window.py:256 +#: ../src/filetransfers_window.py:259 msgid "This file is being used by another process." msgstr "Ten plik jest używany przez inny proces." -#: ../src/filetransfers_window.py:288 +#: ../src/filetransfers_window.py:291 #, python-format msgid "File: %s" msgstr "Plik: %s" -#: ../src/filetransfers_window.py:293 +#: ../src/filetransfers_window.py:296 #, python-format msgid "Type: %s" msgstr "Typ: %s" -#: ../src/filetransfers_window.py:295 +#: ../src/filetransfers_window.py:298 #, python-format msgid "Description: %s" msgstr "Opis: %s" -#: ../src/filetransfers_window.py:296 +#: ../src/filetransfers_window.py:299 #, python-format msgid "%s wants to send you a file:" msgstr "%s chce przesłać Ci plik:" -#: ../src/filetransfers_window.py:310 ../src/gtkgui_helpers.py:767 +#: ../src/filetransfers_window.py:312 ../src/gtkgui_helpers.py:768 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Nie można nadpisać pliku \"%s\"" -#: ../src/filetransfers_window.py:311 ../src/gtkgui_helpers.py:769 +#: ../src/filetransfers_window.py:313 ../src/gtkgui_helpers.py:770 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "" "Istnieje już plik o tej nazwie a Ty nie masz uprawnień do jego nadpisania." -#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:773 +#: ../src/filetransfers_window.py:320 ../src/gtkgui_helpers.py:774 msgid "This file already exists" msgstr "Ten plik już istnieje" -#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:773 +#: ../src/filetransfers_window.py:320 ../src/gtkgui_helpers.py:774 msgid "What do you want to do?" msgstr "Co chcesz zrobić?" -#: ../src/filetransfers_window.py:330 ../src/gtkgui_helpers.py:783 +#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:784 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Nie masz uprawnień do zapisu w folderze \"%s\"" -#: ../src/filetransfers_window.py:330 ../src/gtkgui_helpers.py:784 +#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:785 msgid "You do not have permission to create files in this directory." msgstr "Nie masz uprawnień do tworzenia plików w tym folderze." -#: ../src/filetransfers_window.py:340 +#: ../src/filetransfers_window.py:342 msgid "Save File as..." msgstr "Zapisz obraz 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:421 +#: ../src/filetransfers_window.py:422 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -3928,418 +4349,68 @@ 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:497 +#: ../src/filetransfers_window.py:511 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/ów)" -#: ../src/filetransfers_window.py:536 ../src/filetransfers_window.py:539 +#: ../src/filetransfers_window.py:550 ../src/filetransfers_window.py:553 msgid "Invalid File" msgstr "Niepoprawny plik" -#: ../src/filetransfers_window.py:536 +#: ../src/filetransfers_window.py:550 msgid "File: " msgstr "Plik: " -#: ../src/filetransfers_window.py:540 +#: ../src/filetransfers_window.py:554 msgid "It is not possible to send empty files" msgstr "Nie można wysłać pustego pliku" -#: ../src/filetransfers_window.py:560 ../src/tooltips.py:564 +#: ../src/filetransfers_window.py:576 ../src/tooltips.py:583 msgid "Name: " msgstr "Nazwa: " -#: ../src/filetransfers_window.py:562 ../src/tooltips.py:568 +#: ../src/filetransfers_window.py:578 ../src/tooltips.py:587 msgid "Sender: " msgstr "Nadawca: " -#: ../src/filetransfers_window.py:750 +#: ../src/filetransfers_window.py:766 msgid "Pause" msgstr "Zatrzymaj" -#: ../src/gajim-remote.py:65 -msgid "Shows a help on specific command" -msgstr "Wyświetla pomoc dla wybranego polecenia" - -#. User gets help for the command, specified by this parameter -#: ../src/gajim-remote.py:68 -msgid "command" -msgstr "polecenie" - -#: ../src/gajim-remote.py:69 -msgid "show help on command" -msgstr "pokaż pomoc polecenia" - -#: ../src/gajim-remote.py:73 -msgid "Shows or hides the roster window" -msgstr "Pokazuje lub ukrywa okno listy kontaktów" - -#: ../src/gajim-remote.py:77 -msgid "Pops up a window with the next pending event" -msgstr "Pokazuje okno z następną nieprzeczytaną wiadomością" - -#: ../src/gajim-remote.py:81 -msgid "" -"Prints a list of all contacts in the roster. Each contact appears on a " -"separate line" -msgstr "" -"Wyświetla listę wszystkich kontaktów. Każdy kontakt zostanie wyświetlony w " -"osobnej linii" - -#: ../src/gajim-remote.py:84 ../src/gajim-remote.py:99 -#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:122 -#: ../src/gajim-remote.py:136 ../src/gajim-remote.py:157 -#: ../src/gajim-remote.py:187 ../src/gajim-remote.py:196 -#: ../src/gajim-remote.py:203 ../src/gajim-remote.py:210 -#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:237 -#: ../src/gajim-remote.py:246 -msgid "account" -msgstr "konto" - -#: ../src/gajim-remote.py:84 -msgid "show only contacts of the given account" -msgstr "pokaż tylko kontakty z danego konta" - -#: ../src/gajim-remote.py:90 -msgid "Prints a list of registered accounts" -msgstr "Wypisuje listę zarejestrowanych kont" - -#: ../src/gajim-remote.py:94 -msgid "Changes the status of account or accounts" -msgstr "Zmienia status kont lub kont" - -#. offline, online, chat, away, xa, dnd, invisible should not be translated -#: ../src/gajim-remote.py:97 -msgid "status" -msgstr "status" - -#: ../src/gajim-remote.py:97 -msgid "one of: offline, online, chat, away, xa, dnd, invisible " -msgstr "" -"jeden z: rozłączony, dostępny, chętny do rozmowy, zaraz wracam, nieobecny, " -"zajęty, niewidoczny " - -#: ../src/gajim-remote.py:98 ../src/gajim-remote.py:119 -#: ../src/gajim-remote.py:133 -msgid "message" -msgstr "wiadomość" - -#: ../src/gajim-remote.py:98 -msgid "status message" -msgstr "informacja o statusie" - -#: ../src/gajim-remote.py:99 -msgid "" -"change status of account \"account\". If not specified, try to change status " -"of all accounts that have \"sync with global status\" option set" -msgstr "" -"zmień status konta \"konto\". Jeśli nie jest on określony, to spróbuj " -"zmienić status wszystkich kont, które mają ustawioną opcję synchronizacji ze " -"statusem globalnym" - -#: ../src/gajim-remote.py:105 -msgid "Shows the chat dialog so that you can send messages to a contact" -msgstr "Pokazuje okno dialogowe umożliwiające wysłanie wiadomości do kontaktu" - -#: ../src/gajim-remote.py:107 -msgid "JID of the contact that you want to chat with" -msgstr "JID osoby, z którą chcesz porozmawiać" - -#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:187 -msgid "if specified, contact is taken from the contact list of this account" -msgstr "" -"jeśli jest podany, to kontakt jest pobierany z listy kontaktów tego konta" - -#: ../src/gajim-remote.py:114 -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 " -"key', just set 'OpenPGP key' to ''." -msgstr "" -"Wysyła nową wiadomość do kontaktu z listy. Zarówno klucz OpenPGP jak i konto " -"nie są wymagane. Jeśli chcesz ustawić jedynie 'konto' bez 'klucza OpenPGP', " -"to ustaw 'klucz OpenPGP' na ''." - -#: ../src/gajim-remote.py:118 ../src/gajim-remote.py:131 -msgid "JID of the contact that will receive the message" -msgstr "JID osoby, która otrzyma wiadomość" - -#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 -msgid "message contents" -msgstr "zawartość wiadomości" - -#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 -msgid "pgp key" -msgstr "klucz pgp" - -#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 -msgid "if specified, the message will be encrypted using this public key" -msgstr "" -"jeśli jest podany, to wiadomość zostanie zaszyfrowana tym kluczem publicznym" - -#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:136 -msgid "if specified, the message will be sent using this account" -msgstr "jeśli jest podane, to wiadomość zostanie wysłana z tego konta" - -#: ../src/gajim-remote.py:127 -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 " -"key', just set 'OpenPGP key' to ''." -msgstr "" -"Wysyła nową wiadomość do kontaktu z listy. Zarówno klucz OpenPGP jak i konto " -"nie są wymagane. Jeśli chcesz ustawić jedynie 'konto' bez 'klucza OpenPGP', " -"to ustaw 'klucz OpenPGP' na ''." - -#: ../src/gajim-remote.py:132 -msgid "subject" -msgstr "temat" - -#: ../src/gajim-remote.py:132 -msgid "message subject" -msgstr "temat wiadomości" - -#: ../src/gajim-remote.py:141 -msgid "Gets detailed info on a contact" -msgstr "Pobiera szczegółowe informacje o kontakcie" - -#: ../src/gajim-remote.py:143 ../src/gajim-remote.py:156 -#: ../src/gajim-remote.py:186 ../src/gajim-remote.py:195 -msgid "JID of the contact" -msgstr "JID kontaktu" - -#: ../src/gajim-remote.py:147 -msgid "Gets detailed info on a account" -msgstr "Pobiera szczegółowe informacje o koncie" - -#: ../src/gajim-remote.py:149 -msgid "Name of the account" -msgstr "Nazwa konta" - -#: ../src/gajim-remote.py:153 -msgid "Sends file to a contact" -msgstr "Wysyła plik kontaktowi" - -#: ../src/gajim-remote.py:155 -msgid "file" -msgstr "plik" - -#: ../src/gajim-remote.py:155 -msgid "File path" -msgstr "Ścieżka do pliku" - -#: ../src/gajim-remote.py:157 -msgid "if specified, file will be sent using this account" -msgstr "plik zostanie wysłany z tego konta, jeśli jest ono podane" - -#: ../src/gajim-remote.py:162 -msgid "Lists all preferences and their values" -msgstr "Wypisuje wszystkie opcje i ich wartości" - -#: ../src/gajim-remote.py:166 -msgid "Sets value of 'key' to 'value'." -msgstr "Ustawia wartość 'klucza' na 'wartość'." - -#: ../src/gajim-remote.py:168 -msgid "key=value" -msgstr "klucz=wartość" - -#: ../src/gajim-remote.py:168 -msgid "'key' is the name of the preference, 'value' is the value to set it to" -msgstr "'klucz' jest nazwą opcji, 'wartość' zaś jest jej ustawianą wartością" - -#: ../src/gajim-remote.py:173 -msgid "Deletes a preference item" -msgstr "Usuwa opcję" - -#: ../src/gajim-remote.py:175 -msgid "key" -msgstr "klucz" - -#: ../src/gajim-remote.py:175 -msgid "name of the preference to be deleted" -msgstr "nazwa opcji do usunięcia" - -#: ../src/gajim-remote.py:179 -msgid "Writes the current state of Gajim preferences to the .config file" -msgstr "Zapisuje obecny stan opcji Gajima do pliku .config" - -#: ../src/gajim-remote.py:184 -msgid "Removes contact from roster" -msgstr "Usuwa kontakt z listy kontaktów" - -#: ../src/gajim-remote.py:193 -msgid "Adds contact to roster" -msgstr "Dodaje kontakt do listy kontaktów" - -#: ../src/gajim-remote.py:195 -msgid "jid" -msgstr "jid" - -#: ../src/gajim-remote.py:196 -msgid "Adds new contact to this account" -msgstr "Dodaje nowy kontakt do tego konta" - -#: ../src/gajim-remote.py:201 -msgid "Returns current status (the global one unless account is specified)" -msgstr "Zwraca obecny status (globalny, chyba, że zostało wskazane konto)." - -#: ../src/gajim-remote.py:208 -msgid "" -"Returns current status message(the global one unless account is specified)" -msgstr "Zwraca obecny status (globalny, chyba że zostało wskazane konto)." - -#: ../src/gajim-remote.py:215 -msgid "Returns number of unread messages" -msgstr "Zwraca liczbę nieprzeczytanych wiadomości" - -#: ../src/gajim-remote.py:219 -msgid "Opens 'Start Chat' dialog" -msgstr "Otwiera okno dialogowe 'Rozpocznij rozmowę'" - -#: ../src/gajim-remote.py:221 -msgid "Starts chat, using this account" -msgstr "Rozpocznij rozmowę z tego konta" - -#: ../src/gajim-remote.py:225 -msgid "Sends custom XML" -msgstr "Wysyła własny XML" - -#: ../src/gajim-remote.py:227 -msgid "XML to send" -msgstr "XML do wysłania" - -#: ../src/gajim-remote.py:228 -msgid "" -"Account in which the xml will be sent; if not specified, xml will be sent to " -"all accounts" -msgstr "" -"Konto, na jaki zostanie wysłany XML. Jeżeli nie jest określone, Gajim wyśle " -"dane do wszystkich kont" - -#: ../src/gajim-remote.py:234 -msgid "Handle a xmpp:/ uri" -msgstr "Obsługuj URI xmpp:/" - -#: ../src/gajim-remote.py:236 -msgid "uri" -msgstr "URI" - -#: ../src/gajim-remote.py:241 -msgid "Join a MUC room" -msgstr "Dołącz do nowego pokoju" - -#: ../src/gajim-remote.py:243 -msgid "room" -msgstr "pokój" - -#: ../src/gajim-remote.py:244 -msgid "nick" -msgstr "nick" - -#: ../src/gajim-remote.py:245 -msgid "password" -msgstr "hasło" - -#: ../src/gajim-remote.py:268 -msgid "Missing argument \"contact_jid\"" -msgstr "Brak argumentu \"contact_jid\"" - -#: ../src/gajim-remote.py:287 -#, python-format -msgid "" -"'%s' is not in your roster.\n" -"Please specify account for sending the message." -msgstr "" -"'%s' nie znajduje się na twojej liście kontaktów.\n" -"Podaj konto, na które ma zostać wysłana ta wiadomość." - -#: ../src/gajim-remote.py:290 -msgid "You have no active account" -msgstr "Żadne z twoich kont nie jest aktywne" - -#: ../src/gajim-remote.py:354 -#, python-format -msgid "" -"Usage: %s %s %s \n" -"\t %s" -msgstr "" -"Użycie: %s %s %s \n" -"\t %s" - -#: ../src/gajim-remote.py:357 -msgid "Arguments:" -msgstr "Argumenty:" - -#: ../src/gajim-remote.py:361 -#, python-format -msgid "%s not found" -msgstr "Nie znaleziono %s" - -#: ../src/gajim-remote.py:365 -#, python-format -msgid "" -"Usage: %s command [arguments]\n" -"Command is one of:\n" -msgstr "" -"Użycie: polecenie %s [argument]\n" -"Gdzie polecenie to jedna z następujący fraz:\n" - -#: ../src/gajim-remote.py:438 -#, python-format -msgid "" -"Too many arguments. \n" -"Type \"%s help %s\" for more info" -msgstr "" -"Za dużo argumentów. \n" -"Wpisz \"%s·help·%s\" aby uzyskać więcej informacji" - -#: ../src/gajim-remote.py:442 -#, python-format -msgid "" -"Argument \"%s\" is not specified. \n" -"Type \"%s help %s\" for more info" -msgstr "" -"Argument \"%s\" nie jest określony. \n" -"Wpisz \"%s help %s\" aby uzyskać więcej informacji" - -#: ../src/gajim-remote.py:460 -msgid "Wrong uri" -msgstr "Błędny adres URI" - -#: ../src/gajim.py:47 +#: ../src/gajim.py:55 #, python-format msgid "%s is not a valid loglevel" msgstr "%s nie jest prawidłowym poziomem logowania" -#: ../src/gajim.py:122 +#: ../src/gajim.py:128 msgid "Gajim needs X server to run. Quiting..." msgstr "Gajim wymaga do działania serwera X. Zamykanie programu..." -#: ../src/gajim.py:126 +#: ../src/gajim.py:155 msgid "Gajim needs PyGTK 2.8 or above" msgstr "Gajim wymaga PyGTK w wersji 2.8 lub wyższej" -#: ../src/gajim.py:127 +#: ../src/gajim.py:156 msgid "Gajim needs PyGTK 2.8 or above to run. Quiting..." msgstr "" "Gajim wymaga do działania PyGTK w wersji 2.8 lub wyższej. Zamykanie " "programu..." -#: ../src/gajim.py:129 +#: ../src/gajim.py:158 msgid "Gajim needs GTK 2.8 or above" msgstr "Gajim wymaga GTK w wersji 2.8 lub wyższej" -#: ../src/gajim.py:130 +#: ../src/gajim.py:159 msgid "Gajim needs GTK 2.8 or above to run. Quiting..." msgstr "" "Gajim wymaga do działania GTK w wersji 2.8 lub wyższej. Zamykanie programu..." -#: ../src/gajim.py:135 +#: ../src/gajim.py:164 msgid "GTK+ runtime is missing libglade support" msgstr "W GTK+ brakuje wsparcia dla libglade" -#: ../src/gajim.py:137 +#: ../src/gajim.py:166 #, python-format msgid "" "Please remove your current GTK+ runtime and install the latest stable " @@ -4347,22 +4418,22 @@ msgid "" msgstr "" "Proszę usunąć obecną wersje GTK+ i zainstalować najnowszą stabilną wesję z %s" -#: ../src/gajim.py:139 +#: ../src/gajim.py:168 msgid "" "Please make sure that GTK+ and PyGTK have libglade support in your system." msgstr "" "Sprawdź, czy GTK+ oraz PyGTK posiadają w twoim systemie wsparcie dla " "libglade." -#: ../src/gajim.py:144 +#: ../src/gajim.py:173 msgid "Gajim needs PySQLite2 to run" msgstr "Gajim wymaga do działania PySQLite2" -#: ../src/gajim.py:152 +#: ../src/gajim.py:181 msgid "Gajim needs pywin32 to run" msgstr "Gajim wymaga do działania pakietu pywin32" -#: ../src/gajim.py:153 +#: ../src/gajim.py:182 #, python-format msgid "" "Please make sure that Pywin32 is installed on your system. You can get it at " @@ -4372,11 +4443,11 @@ msgstr "" "spod adresu %s" #. set the icon to all newly opened wind -#: ../src/gajim.py:300 +#: ../src/gajim.py:324 msgid "Gajim is already running" msgstr "Gajim jest już uruchomiony" -#: ../src/gajim.py:301 +#: ../src/gajim.py:325 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -4384,83 +4455,147 @@ msgstr "" "Wydaje się, że w tle działa już inna kopia Gajima.\n" "Czy mimo to chcesz uruchomić program?" -#: ../src/gajim.py:408 +#: ../src/gajim.py:348 ../src/common/connection_handlers.py:908 +#: ../src/common/connection_handlers.py:1619 +#: ../src/common/connection_handlers.py:1648 +#: ../src/common/connection_handlers.py:1658 +#: ../src/common/connection_handlers.py:1677 +#: ../src/common/connection_handlers.py:1914 +#: ../src/common/connection_handlers.py:2026 ../src/common/connection.py:933 +msgid "Disk Write Error" +msgstr "Błąd zapisu na dysk" + +#: ../src/gajim.py:441 msgid "Do you accept this request?" msgstr "Czy akceptujesz tę prośbę?" -#: ../src/gajim.py:411 +#: ../src/gajim.py:443 +#, python-format +msgid "Do you accept this request on account %s?" +msgstr "Czy akceptujesz tę prośbę na koncie %s?" + +#: ../src/gajim.py:446 #, python-format msgid "HTTP (%s) Authorization for %s (id: %s)" msgstr "Autoryzacja HTTP (%s) dla %s (id: %s)" -#: ../src/gajim.py:458 ../src/notify.py:435 +#: ../src/gajim.py:493 ../src/notify.py:453 msgid "Connection Failed" msgstr "Połączenie nie powiodło się" -#: ../src/gajim.py:778 +#: ../src/gajim.py:827 #, python-format msgid "Subject: %s" msgstr "Temat: %s" #. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) -#: ../src/gajim.py:823 ../src/gajim.py:836 +#: ../src/gajim.py:874 ../src/gajim.py:887 #, python-format msgid "error while sending %s ( %s )" msgstr "błąd przy wysyłaniu %s ( %s )" -#: ../src/gajim.py:869 +#: ../src/gajim.py:920 msgid "Authorization accepted" msgstr "Autoryzacja przyjęta" -#: ../src/gajim.py:870 +#: ../src/gajim.py:921 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "Kontakt \"%s\" udzielił Ci autoryzacji byś mógł widzieć jego status." -#: ../src/gajim.py:878 +#: ../src/gajim.py:929 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Kontakt \"%s\" cofnął Ci autoryzację" -#: ../src/gajim.py:879 +#: ../src/gajim.py:930 msgid "You will always see him or her as offline." msgstr "Zawsze będziesz widział ten kontakt jako niepołączony." -#: ../src/gajim.py:923 +#: ../src/gajim.py:974 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Nie można ustanowić połączenia z \"%s\"" -#: ../src/gajim.py:924 ../src/common/connection.py:438 +#: ../src/gajim.py:975 ../src/common/connection.py:471 msgid "Check your connection or try again later." msgstr "Sprawdź swoje połączenie lub spróbuj później." -#: ../src/gajim.py:1073 ../src/roster_window.py:1247 +#: ../src/gajim.py:1144 ../src/groupchat_control.py:991 +#, python-format +msgid "%s is now known as %s" +msgstr "%s występuje teraz jako %s" + +#: ../src/gajim.py:1160 ../src/roster_window.py:1354 #, python-format msgid "%s is now %s (%s)" msgstr "%s ma teraz status %s (%s)" #. No status message -#: ../src/gajim.py:1076 ../src/groupchat_control.py:968 -#: ../src/roster_window.py:1250 +#: ../src/gajim.py:1163 ../src/groupchat_control.py:1142 +#: ../src/roster_window.py:1357 #, python-format msgid "%s is now %s" msgstr "%s ma teraz status %s" -#: ../src/gajim.py:1173 +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/gajim.py:1284 ../src/groupchat_control.py:951 +msgid "Any occupant is allowed to see your full JID" +msgstr "Każdy uczestnik może zobaczyć twój pełny JID" + +#: ../src/gajim.py:1287 +msgid "Room now shows unavailable member" +msgstr "Lista zawiera teraz niedostępnych uczestników" + +#: ../src/gajim.py:1289 +msgid "room now does not show unavailable members" +msgstr "lista nie zawiera teraz niedostępnych użytkowników" + +#: ../src/gajim.py:1292 +msgid "A non-privacy-related room configuration change has occurred" +msgstr "Nastąpiła zmiana konfiguracji pokoju (nie powiązana z prywatnością)" + +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#: ../src/gajim.py:1295 +msgid "Room logging is now enabled" +msgstr "Logowanie rozmów prowadzonych w pokoju jest teraz włączone" + +#: ../src/gajim.py:1297 +msgid "Room logging is now disabled" +msgstr "Logowanie rozmów prowadzonych w pokoju jest teraz wyłączone" + +#: ../src/gajim.py:1299 +msgid "Room is now non-anonymous" +msgstr "Pokój nie jest już anonimowy" + +#: ../src/gajim.py:1302 +msgid "Room is now semi-anonymous" +msgstr "Pokój jest teraz quasi-anonimowy" + +#: ../src/gajim.py:1305 +msgid "Room is now fully-anonymous" +msgstr "Pokój jest teraz w pełni anonimowy" + +#: ../src/gajim.py:1337 +#, python-format +msgid "A Password is required to join the room %s. Please type it" +msgstr "Aby dołączyć do pokoju %s wymagane jest hasło. Proszę je wpisać" + +#: ../src/gajim.py:1367 msgid "Your passphrase is incorrect" msgstr "Twoje hasło jest niepoprawne" -#: ../src/gajim.py:1174 +#: ../src/gajim.py:1368 msgid "You are currently connected without your OpenPGP key." msgstr "Jesteś aktualnie połączony bez obsługi OpenPGP." -#: ../src/gajim.py:1277 +#: ../src/gajim.py:1472 #, python-format msgid "New mail on %(gmail_mail_address)s" msgstr "Nowa poczta w skrzynce %(gmail_mail_address)s" -#: ../src/gajim.py:1279 +#: ../src/gajim.py:1474 #, python-format msgid "You have %d new mail conversation" msgid_plural "You have %d new mail conversations" @@ -4471,7 +4606,7 @@ msgstr[2] "Masz %d nieprzeczytane wiadomości pocztowe" #. FIXME: emulate Gtalk client popups. find out what they parse and how #. they decide what to show #. each message has a 'From', 'Subject' and 'Snippet' field -#: ../src/gajim.py:1288 +#: ../src/gajim.py:1483 #, python-format msgid "" "\n" @@ -4480,170 +4615,634 @@ msgstr "" "\n" "Od: %(from_address)s" -#: ../src/gajim.py:1444 +#: ../src/gajim.py:1661 #, python-format msgid "%s wants to send you a file." msgstr "%s chce przesłać ci plik." -#: ../src/gajim.py:1509 +#: ../src/gajim.py:1726 #, python-format msgid "You successfully received %(filename)s from %(name)s." msgstr "Otrzymałeś plik %(filename)s od %(name)s." #. ft stopped -#: ../src/gajim.py:1513 +#: ../src/gajim.py:1730 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." -msgstr "Przesyłanie pliku %(filename)s·od·%(name)s·zostało zatrzymane." +msgstr "Przesyłanie pliku %(filename)s od %(name)s zostało zatrzymane." -#: ../src/gajim.py:1526 +#: ../src/gajim.py:1743 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Przesłałeś plik %(filename)s do %(name)s." #. ft stopped -#: ../src/gajim.py:1530 +#: ../src/gajim.py:1747 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." -msgstr "Przesyłanie pliku·%(filename)s·do·%(name)s·zostało zatrzymane." +msgstr "Przesyłanie pliku %(filename)s do %(name)s zostało zatrzymane." -#: ../src/gajim.py:1662 +#: ../src/gajim.py:1842 +msgid "Session negotiation cancelled" +msgstr "Negocjowanie sesji zostało przerwane" + +#: ../src/gajim.py:1843 +#, python-format +msgid "The client at %s cancelled the session negotiation." +msgstr "Klient na %s anulował negocjację sesji" + +#: ../src/gajim.py:1884 ../src/gajim.py:1928 +msgid "Confirm these session options" +msgstr "Potwierdź opcje sesji" + +#: ../src/gajim.py:1885 +#, python-format +msgid "" +"The remote client wants to negotiate an session with these features:\n" +"\n" +"\t\t%s\n" +"\n" +"\t\tAre these options acceptable?" +msgstr "" +"Zdalny klient chce przeprowadzić negocjację sesji z poniższymi " +"ustawieniami:\n" +"\n" +"\t\t%s\n" +"\n" +"\t\tCzy akceptujesz te ustawienia?" + +#: ../src/gajim.py:1929 +#, python-format +msgid "" +"The remote client selected these options:\n" +"\n" +"%s\n" +"\n" +"Continue with the session?" +msgstr "" +"Zdalny kilent wybrał następujące opcje:\n" +"\n" +"%s\n" +"\n" +"Kontynuować?" + +#: ../src/gajim.py:2054 msgid "Username Conflict" msgstr "Konflikt nazw użytkownika" -#: ../src/gajim.py:1663 +#: ../src/gajim.py:2055 msgid "Please type a new username for your local account" msgstr "Podaj nazwę użytkownika dla nowego konta lokalnego" -#: ../src/gajim.py:1680 +#: ../src/gajim.py:2072 msgid "Ping?" msgstr "Ping?" -#: ../src/gajim.py:1688 +#: ../src/gajim.py:2080 #, python-format msgid "Pong! (%s s.)" msgstr "Pong! (%s s.)" -#: ../src/gajim.py:1694 +#: ../src/gajim.py:2086 msgid "Error." msgstr "Błąd." +#: ../src/gajim.py:2111 +msgid "Resource Conflict" +msgstr "Konflikt zasobów" + +#: ../src/gajim.py:2112 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" +msgstr "" +"Jesteś już połączony z tym kontem przy użyciu tego samego zasobu.Proszę " +"podać nowy zasób" + #. it is good to notify the user #. in case he or she cannot see the output of the console -#: ../src/gajim.py:2048 +#: ../src/gajim.py:2474 msgid "Could not save your settings and preferences" msgstr "Nie można zapisać twoich ustawień i opcji" -#: ../src/gajim.py:2257 +#. sorted alphanum +#: ../src/gajim.py:2609 ../src/common/config.py:91 ../src/common/config.py:399 +#: ../src/common/optparser.py:205 ../src/common/optparser.py:423 +#: ../src/common/optparser.py:457 +msgid "default" +msgstr "domyślny" + +#: ../src/gajim.py:2696 msgid "Network Manager support not available" msgstr "Brak wsparcia dla Network Managera" -#: ../src/gajim.py:2336 +#: ../src/gajim.py:2800 msgid "Session Management support not available (missing gnome.ui module)" msgstr "Wsparcie dla Menadżera Sesji jest niedostępne (brak modułu gnome.ui" -#: ../src/gajim_themes_window.py:60 +#: ../src/gajim-remote.py:70 +msgid "Shows a help on specific command" +msgstr "Wyświetla pomoc dla wybranego polecenia" + +#. User gets help for the command, specified by this parameter +#: ../src/gajim-remote.py:73 +msgid "command" +msgstr "polecenie" + +#: ../src/gajim-remote.py:74 +msgid "show help on command" +msgstr "pokaż pomoc polecenia" + +#: ../src/gajim-remote.py:78 +msgid "Shows or hides the roster window" +msgstr "Pokazuje lub ukrywa okno listy kontaktów" + +#: ../src/gajim-remote.py:82 +msgid "Pops up a window with the next pending event" +msgstr "Pokazuje okno z następną nieprzeczytaną wiadomością" + +#: ../src/gajim-remote.py:86 +msgid "" +"Prints a list of all contacts in the roster. Each contact appears on a " +"separate line" +msgstr "" +"Wyświetla listę wszystkich kontaktów. Każdy kontakt zostanie wyświetlony w " +"osobnej linii" + +#: ../src/gajim-remote.py:89 ../src/gajim-remote.py:104 +#: ../src/gajim-remote.py:114 ../src/gajim-remote.py:127 +#: ../src/gajim-remote.py:141 ../src/gajim-remote.py:150 +#: ../src/gajim-remote.py:171 ../src/gajim-remote.py:201 +#: ../src/gajim-remote.py:210 ../src/gajim-remote.py:217 +#: ../src/gajim-remote.py:224 ../src/gajim-remote.py:235 +#: ../src/gajim-remote.py:251 ../src/gajim-remote.py:260 +msgid "account" +msgstr "konto" + +#: ../src/gajim-remote.py:89 +msgid "show only contacts of the given account" +msgstr "pokaż tylko kontakty z danego konta" + +#: ../src/gajim-remote.py:95 +msgid "Prints a list of registered accounts" +msgstr "Wypisuje listę zarejestrowanych kont" + +#: ../src/gajim-remote.py:99 +msgid "Changes the status of account or accounts" +msgstr "Zmienia status kont lub kont" + +#. offline, online, chat, away, xa, dnd, invisible should not be translated +#: ../src/gajim-remote.py:102 +msgid "status" +msgstr "status" + +#: ../src/gajim-remote.py:102 +msgid "one of: offline, online, chat, away, xa, dnd, invisible " +msgstr "" +"jeden z: rozłączony, dostępny, chętny do rozmowy, zaraz wracam, nieobecny, " +"zajęty, niewidoczny " + +#: ../src/gajim-remote.py:103 ../src/gajim-remote.py:124 +#: ../src/gajim-remote.py:138 ../src/gajim-remote.py:149 +msgid "message" +msgstr "wiadomość" + +#: ../src/gajim-remote.py:103 +msgid "status message" +msgstr "informacja o statusie" + +#: ../src/gajim-remote.py:104 +msgid "" +"change status of account \"account\". If not specified, try to change status " +"of all accounts that have \"sync with global status\" option set" +msgstr "" +"zmień status konta \"konto\". Jeśli nie jest on określony, to spróbuj " +"zmienić status wszystkich kont, które mają ustawioną opcję synchronizacji ze " +"statusem globalnym" + +#: ../src/gajim-remote.py:110 +msgid "Shows the chat dialog so that you can send messages to a contact" +msgstr "Pokazuje okno dialogowe umożliwiające wysłanie wiadomości do kontaktu" + +#: ../src/gajim-remote.py:112 +msgid "JID of the contact that you want to chat with" +msgstr "JID osoby, z którą chcesz porozmawiać" + +#: ../src/gajim-remote.py:114 ../src/gajim-remote.py:201 +msgid "if specified, contact is taken from the contact list of this account" +msgstr "" +"jeśli jest podany, to kontakt jest pobierany z listy kontaktów tego konta" + +#: ../src/gajim-remote.py:119 +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 " +"key', just set 'OpenPGP key' to ''." +msgstr "" +"Wysyła nową wiadomość do kontaktu z listy. Zarówno klucz OpenPGP jak i konto " +"nie są wymagane. Jeśli chcesz ustawić jedynie 'konto' bez 'klucza OpenPGP', " +"to ustaw 'klucz OpenPGP' na ''." + +#: ../src/gajim-remote.py:123 ../src/gajim-remote.py:136 +msgid "JID of the contact that will receive the message" +msgstr "JID osoby, która otrzyma wiadomość" + +#: ../src/gajim-remote.py:124 ../src/gajim-remote.py:138 +#: ../src/gajim-remote.py:149 +msgid "message contents" +msgstr "zawartość wiadomości" + +#: ../src/gajim-remote.py:125 ../src/gajim-remote.py:139 +msgid "pgp key" +msgstr "klucz pgp" + +#: ../src/gajim-remote.py:125 ../src/gajim-remote.py:139 +msgid "if specified, the message will be encrypted using this public key" +msgstr "" +"jeśli jest podany, to wiadomość zostanie zaszyfrowana tym kluczem publicznym" + +#: ../src/gajim-remote.py:127 ../src/gajim-remote.py:141 +#: ../src/gajim-remote.py:150 +msgid "if specified, the message will be sent using this account" +msgstr "jeśli jest podane, to wiadomość zostanie wysłana z tego konta" + +#: ../src/gajim-remote.py:132 +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 " +"key', just set 'OpenPGP key' to ''." +msgstr "" +"Wysyła nową wiadomość do kontaktu z listy. Zarówno klucz OpenPGP jak i konto " +"nie są wymagane. Jeśli chcesz ustawić jedynie 'konto' bez 'klucza OpenPGP', " +"to ustaw 'klucz OpenPGP' na ''." + +#: ../src/gajim-remote.py:137 +msgid "subject" +msgstr "temat" + +#: ../src/gajim-remote.py:137 +msgid "message subject" +msgstr "temat wiadomości" + +#: ../src/gajim-remote.py:146 +msgid "Sends new message to a groupchat you've joined." +msgstr "Wysyła nową wiadomość na czat, w którym uczestniczysz." + +#: ../src/gajim-remote.py:148 +msgid "JID of the room that will receive the message" +msgstr "JID pokoju, do którego zostanie wysłana wiadomość" + +#: ../src/gajim-remote.py:155 +msgid "Gets detailed info on a contact" +msgstr "Pobiera szczegółowe informacje o kontakcie" + +#: ../src/gajim-remote.py:157 ../src/gajim-remote.py:170 +#: ../src/gajim-remote.py:200 ../src/gajim-remote.py:209 +msgid "JID of the contact" +msgstr "JID kontaktu" + +#: ../src/gajim-remote.py:161 +msgid "Gets detailed info on a account" +msgstr "Pobiera szczegółowe informacje o koncie" + +#: ../src/gajim-remote.py:163 +msgid "Name of the account" +msgstr "Nazwa konta" + +#: ../src/gajim-remote.py:167 +msgid "Sends file to a contact" +msgstr "Wysyła plik kontaktowi" + +#: ../src/gajim-remote.py:169 +msgid "file" +msgstr "plik" + +#: ../src/gajim-remote.py:169 +msgid "File path" +msgstr "Ścieżka do pliku" + +#: ../src/gajim-remote.py:171 +msgid "if specified, file will be sent using this account" +msgstr "plik zostanie wysłany z tego konta, jeśli jest ono podane" + +#: ../src/gajim-remote.py:176 +msgid "Lists all preferences and their values" +msgstr "Wypisuje wszystkie opcje i ich wartości" + +#: ../src/gajim-remote.py:180 +msgid "Sets value of 'key' to 'value'." +msgstr "Ustawia wartość 'klucza' na 'wartość'." + +#: ../src/gajim-remote.py:182 +msgid "key=value" +msgstr "klucz=wartość" + +#: ../src/gajim-remote.py:182 +msgid "'key' is the name of the preference, 'value' is the value to set it to" +msgstr "'klucz' jest nazwą opcji, 'wartość' zaś jest jej ustawianą wartością" + +#: ../src/gajim-remote.py:187 +msgid "Deletes a preference item" +msgstr "Usuwa opcję" + +#: ../src/gajim-remote.py:189 +msgid "key" +msgstr "klucz" + +#: ../src/gajim-remote.py:189 +msgid "name of the preference to be deleted" +msgstr "nazwa opcji do usunięcia" + +#: ../src/gajim-remote.py:193 +msgid "Writes the current state of Gajim preferences to the .config file" +msgstr "Zapisuje obecny stan opcji Gajima do pliku .config" + +#: ../src/gajim-remote.py:198 +msgid "Removes contact from roster" +msgstr "Usuwa kontakt z listy kontaktów" + +#: ../src/gajim-remote.py:207 +msgid "Adds contact to roster" +msgstr "Dodaje kontakt do listy kontaktów" + +#: ../src/gajim-remote.py:209 +msgid "jid" +msgstr "jid" + +#: ../src/gajim-remote.py:210 +msgid "Adds new contact to this account" +msgstr "Dodaje nowy kontakt do tego konta" + +#: ../src/gajim-remote.py:215 +msgid "Returns current status (the global one unless account is specified)" +msgstr "Zwraca obecny status (globalny, chyba, że zostało wskazane konto)." + +#: ../src/gajim-remote.py:222 +msgid "" +"Returns current status message(the global one unless account is specified)" +msgstr "Zwraca obecny status (globalny, chyba że zostało wskazane konto)." + +#: ../src/gajim-remote.py:229 +msgid "Returns number of unread messages" +msgstr "Zwraca liczbę nieprzeczytanych wiadomości" + +#: ../src/gajim-remote.py:233 +msgid "Opens 'Start Chat' dialog" +msgstr "Otwiera okno dialogowe 'Rozpocznij rozmowę'" + +#: ../src/gajim-remote.py:235 +msgid "Starts chat, using this account" +msgstr "Rozpocznij rozmowę z tego konta" + +#: ../src/gajim-remote.py:239 +msgid "Sends custom XML" +msgstr "Wysyła własny XML" + +#: ../src/gajim-remote.py:241 +msgid "XML to send" +msgstr "XML do wysłania" + +#: ../src/gajim-remote.py:242 +msgid "" +"Account in which the xml will be sent; if not specified, xml will be sent to " +"all accounts" +msgstr "" +"Konto, na jaki zostanie wysłany XML. Jeżeli nie jest określone, Gajim wyśle " +"dane do wszystkich kont" + +#: ../src/gajim-remote.py:248 +msgid "Handle a xmpp:/ uri" +msgstr "Obsługuj URI xmpp:/" + +#: ../src/gajim-remote.py:250 +msgid "uri" +msgstr "URI" + +#: ../src/gajim-remote.py:255 +msgid "Join a MUC room" +msgstr "Dołącz do nowego pokoju" + +#: ../src/gajim-remote.py:257 +msgid "room" +msgstr "pokój" + +#: ../src/gajim-remote.py:258 +msgid "nick" +msgstr "nick" + +#: ../src/gajim-remote.py:259 +msgid "password" +msgstr "hasło" + +#: ../src/gajim-remote.py:282 +msgid "Missing argument \"contact_jid\"" +msgstr "Brak argumentu \"contact_jid\"" + +#: ../src/gajim-remote.py:301 +#, python-format +msgid "" +"'%s' is not in your roster.\n" +"Please specify account for sending the message." +msgstr "" +"'%s' nie znajduje się na twojej liście kontaktów.\n" +"Podaj konto, na które ma zostać wysłana ta wiadomość." + +#: ../src/gajim-remote.py:304 +msgid "You have no active account" +msgstr "Żadne z twoich kont nie jest aktywne" + +#: ../src/gajim-remote.py:368 +#, python-format +msgid "" +"Usage: %s %s %s \n" +"\t %s" +msgstr "" +"Użycie: %s %s %s \n" +"\t %s" + +#: ../src/gajim-remote.py:371 +msgid "Arguments:" +msgstr "Argumenty:" + +#: ../src/gajim-remote.py:375 +#, python-format +msgid "%s not found" +msgstr "Nie znaleziono %s" + +#: ../src/gajim-remote.py:379 +#, python-format +msgid "" +"Usage: %s command [arguments]\n" +"Command is one of:\n" +msgstr "" +"Użycie: polecenie %s [argument]\n" +"Gdzie polecenie to jedna z następujący fraz:\n" + +#: ../src/gajim-remote.py:452 +#, python-format +msgid "" +"Too many arguments. \n" +"Type \"%s help %s\" for more info" +msgstr "" +"Za dużo argumentów. \n" +"Wpisz \"%s help %s\" aby uzyskać więcej informacji" + +#: ../src/gajim-remote.py:456 +#, python-format +msgid "" +"Argument \"%s\" is not specified. \n" +"Type \"%s help %s\" for more info" +msgstr "" +"Argument \"%s\" nie jest określony. \n" +"Wpisz \"%s help %s\" aby uzyskać więcej informacji" + +#: ../src/gajim-remote.py:474 +msgid "Wrong uri" +msgstr "Błędny adres URI" + +#: ../src/gajim_themes_window.py:67 msgid "Theme" msgstr "Motyw" +#: ../src/gajim_themes_window.py:105 +msgid "You cannot make changes to the default theme" +msgstr "Nie możesz dokonywać zmian w obecnie używanym motywie" + +#: ../src/gajim_themes_window.py:106 +msgid "Please create a clean new theme with your desired name." +msgstr "Proszę utworzyć nowy temat i nadać mu nazwę." + #. don't confuse translators -#: ../src/gajim_themes_window.py:155 +#: ../src/gajim_themes_window.py:180 msgid "theme name" msgstr "nazwa motywu" -#: ../src/gajim_themes_window.py:172 +#: ../src/gajim_themes_window.py:197 msgid "You cannot delete your current theme" msgstr "Nie możesz skasować obecnie używanego motywu" -#: ../src/gajim_themes_window.py:173 +#: ../src/gajim_themes_window.py:198 msgid "Please first choose another for your current theme." msgstr "Ustaw najpierw inny motyw." -#: ../src/groupchat_control.py:122 +#: ../src/groupchat_control.py:139 msgid "Sending private message failed" msgstr "Wysyłanie prywatnej wiadomości nie powiodło się" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:124 +#: ../src/groupchat_control.py:141 #, python-format msgid "You are no longer in group chat \"%s\" or \"%s\" has left." msgstr "Nie jesteś już w pokoju \"%s\" lub \"%s\" opuścił go." -#: ../src/groupchat_control.py:322 +#: ../src/groupchat_control.py:350 msgid "Insert Nickname" msgstr "Wstaw pseudonim" +#: ../src/groupchat_control.py:878 +msgid "Really send file?" +msgstr "Na pewno wysłać ten plik?" + +#: ../src/groupchat_control.py:879 +#, python-format +msgid "If you send a file to %s, he/she will know your real Jabber ID." +msgstr "Jeżeli wyślesz plik do %s, pozna on/ona twój pełny JID." + +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/groupchat_control.py:954 +msgid "Room logging is enabled" +msgstr "Zapisywanie rozmów prowadzonych w pokoju jest włączone" + +#: ../src/groupchat_control.py:956 +msgid "A new room has been created" +msgstr "Został utworzony nowy pokój" + +#: ../src/groupchat_control.py:959 +msgid "The server has assigned or modified your roomnick" +msgstr "" +"Serwer przypisał ci lub zmodyfikował twój pseudonim używany w tym pokoju" + #. do not print 'kicked by None' -#: ../src/groupchat_control.py:850 +#: ../src/groupchat_control.py:965 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s został wyrzucony: %(reason)s" -#: ../src/groupchat_control.py:854 +#: ../src/groupchat_control.py:969 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s został wyrzucony przez %(who)s: %(reason)s" #. do not print 'banned by None' -#: ../src/groupchat_control.py:861 +#: ../src/groupchat_control.py:976 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s został zabanowany: %(reason)s" -#: ../src/groupchat_control.py:865 +#: ../src/groupchat_control.py:980 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s został zabanowany przez %(who)s: %(reason)s" -#: ../src/groupchat_control.py:873 +#: ../src/groupchat_control.py:989 #, python-format msgid "You are now known as %s" msgstr "Występujesz teraz jako %s" -#: ../src/groupchat_control.py:875 +#: ../src/groupchat_control.py:1025 ../src/groupchat_control.py:1029 +#: ../src/groupchat_control.py:1034 #, python-format -msgid "%s is now known as %s" -msgstr "%s występuje teraz jako %s" +msgid "%(nick)s has been removed from the room (%(reason)s)" +msgstr "%(nick)s został wyrzucony z pokoju: %(reason)s" -#: ../src/groupchat_control.py:961 +#: ../src/groupchat_control.py:1026 +msgid "affiliation changed" +msgstr "afiliacja została zmieniona " + +#: ../src/groupchat_control.py:1031 +msgid "room configuration changed to members-only" +msgstr "konfiguracja pokoju zmieniona na 'tylko dla członków'" + +#: ../src/groupchat_control.py:1036 +msgid "system shutdown" +msgstr "zamknięcie systemu" + +#: ../src/groupchat_control.py:1135 #, python-format msgid "%s has left" msgstr "%s wychodzi" -#: ../src/groupchat_control.py:966 +#: ../src/groupchat_control.py:1140 #, python-format msgid "%s has joined the group chat" msgstr "%s dołączył do pokoju" -#: ../src/groupchat_control.py:1088 ../src/groupchat_control.py:1106 -#: ../src/groupchat_control.py:1199 ../src/groupchat_control.py:1216 +#. Invalid Nickname +#. invalid char +#: ../src/groupchat_control.py:1253 ../src/groupchat_control.py:1532 +msgid "Invalid nickname" +msgstr "Niepoprawny pseudonim" + +#: ../src/groupchat_control.py:1254 ../src/groupchat_control.py:1533 +msgid "The nickname has not allowed characters." +msgstr "Używany przez ciebie pseudonim zawiera niedozwolone znaki." + +#: ../src/groupchat_control.py:1277 ../src/groupchat_control.py:1295 +#: ../src/groupchat_control.py:1379 ../src/groupchat_control.py:1396 #, python-format msgid "Nickname not found: %s" msgstr "Pseudonim nie został odnaleziony: %s" -#: ../src/groupchat_control.py:1122 +#: ../src/groupchat_control.py:1311 msgid "This group chat has no subject" msgstr "Ten pokój nie ma tematu" -#: ../src/groupchat_control.py:1135 +#: ../src/groupchat_control.py:1322 #, python-format msgid "Invited %(contact_jid)s to %(room_jid)s." msgstr "%(contact_jid)s zaproszony do %(room_jid)s." -#. %s is something the user wrote but it is not a jid so we inform -#: ../src/groupchat_control.py:1142 ../src/groupchat_control.py:1170 -#, python-format -msgid "%s does not appear to be a valid JID" -msgstr "%s nie wygląda na poprawny JID" - -#: ../src/groupchat_control.py:1253 -#, python-format -msgid "No such command: /%s (if you want to send this, prefix it with /say)" -msgstr "" -"Nie ma takiego polecenia: /%s (jeśli chcesz je wysłać, poprzedź je znakami: /" -"say)" - -#: ../src/groupchat_control.py:1279 +#: ../src/groupchat_control.py:1459 #, python-format msgid "" "Usage: /%s [reason], bans the JID from the group chat. The " @@ -4655,14 +5254,14 @@ msgstr "" "może zostać zmieniony o ile nie zawiera \"@\". Jeśli JID jest obecnie w " "pokoju, to zostanie z niego wyrzucony. NIE toleruje spacji w pseudonimie." -#: ../src/groupchat_control.py:1286 +#: ../src/groupchat_control.py:1466 #, python-format msgid "" "Usage: /%s , opens a private chat window with the specified " "occupant." msgstr "Użycie: /%s , otwiera okno prywatnej rozmowy z tą osobą." -#: ../src/groupchat_control.py:1292 +#: ../src/groupchat_control.py:1472 #, python-format msgid "" "Usage: /%s [reason], closes the current window or tab, displaying reason if " @@ -4671,7 +5270,7 @@ msgstr "" "Użycie: /%s [powód] zamyka aktualne okno lub kartę i wyświetla powóc, jeśli " "został podany." -#: ../src/groupchat_control.py:1298 +#: ../src/groupchat_control.py:1478 #, python-format msgid "" "Usage: /%s [reason], invites JID to the current group chat, optionally " @@ -4680,7 +5279,7 @@ msgstr "" "Użycie: /%s [powód] zaprasza JID do aktualnego pokoju, opcjonalnie " "wyświetlając powód." -#: ../src/groupchat_control.py:1302 +#: ../src/groupchat_control.py:1482 #, python-format msgid "" "Usage: /%s @[/nickname], offers to join room@server optionally " @@ -4689,7 +5288,7 @@ msgstr "" "Użycie: /%s @[/pseudonim] oferuje przyłączenie się do " "pokój@serwer opcjonalnie z wykorzystaniem podanego psedonimu." -#: ../src/groupchat_control.py:1306 +#: ../src/groupchat_control.py:1486 #, python-format msgid "" "Usage: /%s [reason], removes the occupant specified by nickname " @@ -4699,16 +5298,7 @@ msgstr "" "Użycie: /%s [powód] usuwa podaną poprzez pseudonim osobę z " "pokoju i opcjonalnie wyświetla powód. NIE wspiera spacji w pseudonimie." -#: ../src/groupchat_control.py:1311 -#, python-format -msgid "" -"Usage: /%s , sends action to the current group chat. Use third " -"person. (e.g. /%s explodes.)" -msgstr "" -"Użycie: /%s wysyła działanie do aktualnego pokoju. Używaj w " -"trzeciej osobie (np. /%s eksploduje.)" - -#: ../src/groupchat_control.py:1315 +#: ../src/groupchat_control.py:1495 #, python-format msgid "" "Usage: /%s [message], opens a private message window and sends " @@ -4717,112 +5307,114 @@ msgstr "" "Użycie: /%s [wiadomość] otwiera okno prywatnej wiadomości i " "wysyła ją do osoby o takim pseudonimie." -#: ../src/groupchat_control.py:1320 +#: ../src/groupchat_control.py:1500 #, python-format msgid "Usage: /%s , changes your nickname in current group chat." msgstr "Użycie: /%s zmienia twój pseudonim w aktualnym pokoju." -#: ../src/groupchat_control.py:1324 +#: ../src/groupchat_control.py:1504 #, python-format msgid "Usage: /%s , display the names of group chat occupants." msgstr "Użycie: /%s , wyświetla osoby obecne w danym pokoju." -#: ../src/groupchat_control.py:1328 +#: ../src/groupchat_control.py:1508 #, python-format msgid "Usage: /%s [topic], displays or updates the current group chat topic." msgstr "Użycie: /%s [temat] wyświetla lub aktualizuje temat aktualnego pokoju." -#: ../src/groupchat_control.py:1331 +#: ../src/groupchat_control.py:1511 #, python-format msgid "" "Usage: /%s , sends a message without looking for other commands." msgstr "" "Użycie: /%s wysyła wiadomość bez sprawdzania innych poleceń." -#: ../src/groupchat_control.py:1397 +#: ../src/groupchat_control.py:1606 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Czy jesteś pewien, że chcesz opuścić pokój \"%s\"?" -#: ../src/groupchat_control.py:1399 +#: ../src/groupchat_control.py:1608 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Jeśli zamkniesz to okno, połączenie z tym pokojem zostanie zerwane." -#: ../src/groupchat_control.py:1403 ../src/roster_window.py:4376 +#: ../src/groupchat_control.py:1612 ../src/roster_window.py:4877 msgid "Do _not ask me again" msgstr "_Nie pytaj mnie o to ponownie" -#: ../src/groupchat_control.py:1437 +#: ../src/groupchat_control.py:1644 msgid "Changing Subject" msgstr "Zmiana tematu" -#: ../src/groupchat_control.py:1438 +#: ../src/groupchat_control.py:1645 msgid "Please specify the new subject:" msgstr "Wpisz nowy temat:" -#: ../src/groupchat_control.py:1447 +#: ../src/groupchat_control.py:1654 msgid "Changing Nickname" msgstr "Zmiana pseudonimu" -#: ../src/groupchat_control.py:1448 +#: ../src/groupchat_control.py:1655 msgid "Please specify the new nickname you want to use:" msgstr "Wpisz nowy pseudonim, którego chcesz używać:" #. Ask for a reason -#: ../src/groupchat_control.py:1463 +#: ../src/groupchat_control.py:1670 +#, python-format msgid "Destroying %s" msgstr "Usuwam pokój %s" -#: ../src/groupchat_control.py:1464 +#: ../src/groupchat_control.py:1671 msgid "" "You are going to definitively destroy this room.\n" "You may specify a reason below:" -msgstr "Zamierzasz całkowicie usunąć ten pokój. \n" +msgstr "" +"Zamierzasz całkowicie usunąć ten pokój. \n" "Poniżej możesz podać powód swojej decyzji:" -#: ../src/groupchat_control.py:1466 +#: ../src/groupchat_control.py:1673 msgid "You may also enter an alternate venue:" msgstr "Możesz również podać alternatywne miejsce spotkań:" -#: ../src/groupchat_control.py:1496 +#: ../src/groupchat_control.py:1705 msgid "Bookmark already set" msgstr "Zakładka została już dodana" -#: ../src/groupchat_control.py:1497 +#: ../src/groupchat_control.py:1706 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Pokój \"%s\" jest już w Twoich zakładkach." -#: ../src/groupchat_control.py:1506 +#: ../src/groupchat_control.py:1715 msgid "Bookmark has been added successfully" msgstr "Zakładka została dodana" -#: ../src/groupchat_control.py:1507 +#: ../src/groupchat_control.py:1716 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "Możesz zarządzać zakładkami poprzez menu Działania w oknie kontaktów." #. ask for reason -#: ../src/groupchat_control.py:1635 +#: ../src/groupchat_control.py:1868 #, python-format msgid "Kicking %s" msgstr "Wyrzuć %s" -#: ../src/groupchat_control.py:1636 ../src/groupchat_control.py:1929 +#: ../src/groupchat_control.py:1869 ../src/groupchat_control.py:2169 msgid "You may specify a reason below:" msgstr "Podaj przyczynę:" #. ask for reason -#: ../src/groupchat_control.py:1928 +#: ../src/groupchat_control.py:2168 #, python-format msgid "Banning %s" msgstr "Zabanuj %s" -#: ../src/gtkexcepthook.py:41 +#: ../src/gtkexcepthook.py:46 msgid "A programming error has been detected" msgstr "Wykryto błąd programistyczny" -#: ../src/gtkexcepthook.py:42 +#: ../src/gtkexcepthook.py:47 msgid "" "It probably is not fatal, but should be reported to the developers " "nonetheless." @@ -4830,91 +5422,91 @@ msgstr "" "Nie jest prawdopodnie krytyczny, ale powinien zostać mimo to zgłoszony " "deweloperom." -#: ../src/gtkexcepthook.py:48 +#: ../src/gtkexcepthook.py:53 msgid "_Report Bug" msgstr "_Zgłoś Błąd" -#: ../src/gtkexcepthook.py:71 +#: ../src/gtkexcepthook.py:76 msgid "Details" msgstr "Szczegóły" #. we talk about file -#: ../src/gtkgui_helpers.py:156 ../src/gtkgui_helpers.py:171 +#: ../src/gtkgui_helpers.py:162 ../src/gtkgui_helpers.py:177 #, python-format msgid "Error: cannot open %s for reading" msgstr "błąd: nie można otworzyć %s do odczytu" -#: ../src/gtkgui_helpers.py:336 +#: ../src/gtkgui_helpers.py:342 msgid "Error reading file:" msgstr "Błąd odczytu pliku:" -#: ../src/gtkgui_helpers.py:339 +#: ../src/gtkgui_helpers.py:345 msgid "Error parsing file:" msgstr "Błąd przetwarzania pliku:" #. do not traceback (could be a permission problem) #. we talk about a file here -#: ../src/gtkgui_helpers.py:376 +#: ../src/gtkgui_helpers.py:382 #, python-format msgid "Could not write to %s. Session Management support will not work" msgstr "" "Nie można zapisywać do %s. Wsparcie dla Menadżera Sesji nie będzie działać" #. xmpp: is currently handled by another program, so ask the user -#: ../src/gtkgui_helpers.py:711 +#: ../src/gtkgui_helpers.py:714 msgid "Gajim is not the default Jabber client" msgstr "Gajim nie jest domyślnym klinetem Jabbera" -#: ../src/gtkgui_helpers.py:712 +#: ../src/gtkgui_helpers.py:715 msgid "Would you like to make Gajim the default Jabber client?" msgstr "Czy chciałbyś by Gajim stał się klientem domyślnym?" -#: ../src/gtkgui_helpers.py:713 +#: ../src/gtkgui_helpers.py:716 msgid "Always check to see if Gajim is the default Jabber client on startup" msgstr "Przy starcie sprawdzaj czy Gajim jest domyślnym klinetem Jabbera" -#: ../src/gtkgui_helpers.py:812 +#: ../src/gtkgui_helpers.py:813 msgid "Extension not supported" msgstr "Rozszerzenie nie jest obsługiwane" -#: ../src/gtkgui_helpers.py:813 +#: ../src/gtkgui_helpers.py:814 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" "Obraz nie może zostać zapisany w formacie %(type)s. Zapisać jako %" "(new_filename)s?" -#: ../src/gtkgui_helpers.py:822 +#: ../src/gtkgui_helpers.py:823 msgid "Save Image as..." msgstr "Zapisz plik jako..." -#: ../src/history_manager.py:65 +#: ../src/history_manager.py:73 msgid "Cannot find history logs database" msgstr "Nie można odnaleźć bazy danych z historią rozmów" #. holds jid -#: ../src/history_manager.py:108 +#: ../src/history_manager.py:113 msgid "Contacts" msgstr "Kontakty" #. holds time -#: ../src/history_manager.py:121 ../src/history_manager.py:161 -#: ../src/history_window.py:86 +#: ../src/history_manager.py:126 ../src/history_manager.py:166 +#: ../src/history_window.py:121 msgid "Date" msgstr "Data" #. holds nickname -#: ../src/history_manager.py:127 ../src/history_manager.py:179 +#: ../src/history_manager.py:132 ../src/history_manager.py:184 msgid "Nickname" msgstr "Pseudonim" #. holds message -#: ../src/history_manager.py:135 ../src/history_manager.py:167 -#: ../src/history_window.py:94 +#: ../src/history_manager.py:140 ../src/history_manager.py:172 +#: ../src/history_window.py:129 msgid "Message" msgstr "Wiadomość" -#: ../src/history_manager.py:187 +#: ../src/history_manager.py:192 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" @@ -4922,7 +5514,7 @@ msgstr "" "Czy chcesz wyczyścić bazę danych? (STANOWCZO ODRADZA SIĘ KORZYSTANIE Z TEJ " "OPCJI GDY GAJIM JEST URUCHOMIONY)" -#: ../src/history_manager.py:189 +#: ../src/history_manager.py:194 msgid "" "Normally allocated database size will not be freed, it will just become " "reusable. If you really want to reduce database filesize, click YES, else " @@ -4937,160 +5529,202 @@ msgstr "" "\n" "Jeżeli kliknąłeś TAK, musisz teraz poczekać..." -#: ../src/history_manager.py:401 +#: ../src/history_manager.py:406 msgid "Exporting History Logs..." msgstr "Przenoszenie logów rozmów..." -#: ../src/history_manager.py:476 +#: ../src/history_manager.py:481 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s o godzinie %(time)s napisał: %(message)s\n" -#: ../src/history_manager.py:514 +#: ../src/history_manager.py:518 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] "Czy na pewno chcesz usunąć historię rozmów wybranego kontaktu?" msgstr[1] "Czy na pewno chcesz usunąć historię rozmów wybranych kontaktów?" msgstr[2] "Czy na pewno chcesz usunąć historię rozmów wybranych kontaktów?" -#: ../src/history_manager.py:518 ../src/history_manager.py:554 +#: ../src/history_manager.py:522 ../src/history_manager.py:557 msgid "This is an irreversible operation." msgstr "Skutków tej operacji nie można będzie wycofać." -#: ../src/history_manager.py:551 +#: ../src/history_manager.py:554 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Czy na pewno chcesz usunąć wybraną wiadomość?" msgstr[1] "Czy na pewno chcesz usunąć wybrane wiadomości?" msgstr[2] "Czy na pewno chcesz usunąć wybrane wiadomości?" -#: ../src/history_window.py:103 ../src/history_window.py:105 +#: ../src/history_window.py:209 ../src/history_window.py:211 #, python-format msgid "Conversation History with %s" msgstr "Historia rozmowy z %s" -#: ../src/history_window.py:266 +#: ../src/history_window.py:342 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s jes teraz %(status)s: %(status_msg)s" -#: ../src/history_window.py:270 ../src/notify.py:199 +#: ../src/history_window.py:346 ../src/notify.py:211 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s ma teraz status %(status)s" -#: ../src/history_window.py:276 +#: ../src/history_window.py:352 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Obecny status: %(status)s: %(status_msg)s" -#: ../src/history_window.py:279 +#: ../src/history_window.py:355 #, python-format msgid "Status is now: %(status)s" msgstr "Obecny status: %(status)s" -#: ../src/htmltextview.py:710 ../src/htmltextview.py:721 +#: ../src/htmltextview.py:586 ../src/htmltextview.py:597 msgid "Timeout loading image" msgstr "Przekroczono czas ładowania obrazu" -#: ../src/htmltextview.py:731 +#: ../src/htmltextview.py:607 msgid "Image is too big" msgstr "Obraz jest za duży" -#: ../src/message_window.py:273 +#: ../src/message_window.py:350 msgid "Chats" msgstr "Rozmowy" -#: ../src/message_window.py:275 +#: ../src/message_window.py:352 msgid "Group Chats" msgstr "Czaty" -#: ../src/message_window.py:277 +#: ../src/message_window.py:354 msgid "Private Chats" msgstr "Rozmowy prywatne" -#: ../src/message_window.py:279 +#: ../src/message_window.py:356 msgid "Messages" msgstr "Wiadomości" -#: ../src/message_window.py:280 +#: ../src/message_window.py:357 #, python-format msgid "%s - Gajim" msgstr "%s - Gajim" -#: ../src/notify.py:197 +#: ../src/negotiation.py:13 +msgid "- messages will be logged" +msgstr "- wiadomości będzie logowanych" + +#: ../src/negotiation.py:15 +msgid "- messages will not be logged" +msgstr "- wiadomości nie będzie logowanych" + +#: ../src/negotiation.py:24 +msgid "OK to continue with negotiation?" +msgstr "Czy kontynuować negocjację?" + +#: ../src/negotiation.py:25 +#, python-format +msgid "" +"You've begun an encrypted session with %s, but it can't be guaranteed that " +"you're talking directly to the person you think you are.\n" +"\n" +"You should speak with them directly (in person or on the phone) and confirm " +"that their Short Authentication String is identical to this one: %s\n" +"\n" +"Would you like to continue with the encrypted session?" +msgstr "" +"Rozpocząłeś szyfrowaną sesję z %s, ale nie można zagwarantować, że " +"rozmawiasz bezpośrednio z odpowiednią osobą.\n" +"\n" +"Powienieneś(-winnaś) porozmawiać z nią w cztery osobiście lub za " +"pośrednictwem telefonu i potwierdzić, że jej SAS (Short Authentication " +"String) jest identyczny z poniższym: %s\n" +"Czy chcesz kontynuować tą sesję?" + +#: ../src/negotiation.py:31 +msgid "Yes, I verified the Short Authentication String" +msgstr "Tak, SAS został zweryfikowany." + +#: ../src/notify.py:209 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s zmienił status" -#: ../src/notify.py:207 +#: ../src/notify.py:219 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s połączył(a) się" -#: ../src/notify.py:215 +#: ../src/notify.py:227 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s rozłączył(a) się" -#: ../src/notify.py:227 +#: ../src/notify.py:239 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Nowa wiadomość od %(nickname)s" -#: ../src/notify.py:235 +#: ../src/notify.py:247 #, python-format msgid "New Private Message from group chat %s" msgstr "Nowa wiadomość prywatna z pokoju %s" -#: ../src/notify.py:236 +#: ../src/notify.py:249 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:242 +#: ../src/notify.py:252 +#, python-format +msgid "Messaged by %(nickname)s" +msgstr "Nowa wiadomość od %(nickname)s" + +#: ../src/notify.py:258 #, python-format msgid "New Message from %(nickname)s" msgstr "Nowa wiadomość od %(nickname)s" -#: ../src/profile_window.py:72 +#: ../src/profile_window.py:53 msgid "Retrieving profile..." msgstr "Pobieranie profilu..." -#: ../src/profile_window.py:127 ../src/vcard.py:135 -msgid "File is emty" +#: ../src/profile_window.py:104 ../src/roster_window.py:1887 +msgid "File is empty" msgstr "Plik jest pusty" -#: ../src/profile_window.py:130 ../src/vcard.py:138 +#: ../src/profile_window.py:107 ../src/roster_window.py:1890 msgid "File does not exist" msgstr "Plik nie istnieje." #. keep identation -#: ../src/profile_window.py:144 ../src/vcard.py:140 +#. unknown format +#: ../src/profile_window.py:121 ../src/profile_window.py:137 +#: ../src/roster_window.py:1892 ../src/roster_window.py:1903 msgid "Could not load image" msgstr "Nie można załadować obrazka." -#: ../src/profile_window.py:257 +#: ../src/profile_window.py:238 msgid "Information received" msgstr "Informacja została odebrana" -#: ../src/profile_window.py:326 +#: ../src/profile_window.py:307 msgid "Without a connection you can not publish your contact information." msgstr "Nie możesz wysłać informacji o sobie jeśli nie jesteś połączony." -#: ../src/profile_window.py:338 +#: ../src/profile_window.py:319 msgid "Sending profile..." msgstr "Wysyłanie profilu..." -#: ../src/profile_window.py:353 +#: ../src/profile_window.py:334 msgid "Information NOT published" msgstr "Informacja NIE ZOSTAŁA opublikowana" -#: ../src/profile_window.py:360 +#: ../src/profile_window.py:341 msgid "vCard publication failed" msgstr "Publikacja vCard nie powiodła się" -#: ../src/profile_window.py:361 +#: ../src/profile_window.py:342 msgid "" "There was an error while publishing your personal information, try again " "later." @@ -5098,80 +5732,93 @@ msgstr "" "W czasie publikowanie informacji o tobie wystąpił błąd, spróbuj ponownie " "później." -#: ../src/roster_window.py:173 ../src/roster_window.py:228 +#: ../src/roster_window.py:188 ../src/roster_window.py:243 msgid "Merged accounts" msgstr "Połączone konta" -#: ../src/roster_window.py:346 ../src/roster_window.py:571 -#: ../src/common/helpers.py:43 +#: ../src/roster_window.py:363 ../src/roster_window.py:628 +#: ../src/roster_window.py:2115 ../src/common/contacts.py:312 +#: ../src/common/helpers.py:49 msgid "Observers" msgstr "Obserwatorzy" -#: ../src/roster_window.py:710 ../src/roster_window.py:3526 +#. Make special context menu if group is Groupchats +#: ../src/roster_window.py:447 ../src/roster_window.py:452 +#: ../src/roster_window.py:1940 ../src/roster_window.py:1943 +#: ../src/roster_window.py:2606 ../src/roster_window.py:2609 +#: ../src/roster_window.py:2634 ../src/roster_window.py:4738 +#: ../src/roster_window.py:4740 ../src/common/commands.py:199 +#: ../src/common/contacts.py:102 ../src/common/helpers.py:49 +msgid "Groupchats" +msgstr "Pokoje" + +#: ../src/roster_window.py:777 ../src/roster_window.py:3987 msgid "You cannot join a group chat while you are invisible" msgstr "Nie możesz dołączyć do pokoju gdy jesteś niewidoczny" #. new chat +#. single message #. for chat_with #. for single message -#: ../src/roster_window.py:913 ../src/systray.py:206 ../src/systray.py:211 +#. join gc +#: ../src/roster_window.py:990 ../src/roster_window.py:1000 +#: ../src/roster_window.py:1009 ../src/systray.py:212 ../src/systray.py:217 +#: ../src/systray.py:223 #, python-format msgid "using account %s" msgstr "używając konta %s" -#. the 'manage gc bookmarks' item is shown -#. below to avoid duplicate code #. add -#: ../src/roster_window.py:938 +#: ../src/roster_window.py:1016 #, python-format msgid "to %s account" msgstr "do konta %s" #. disco -#: ../src/roster_window.py:943 +#: ../src/roster_window.py:1021 #, python-format msgid "using %s account" msgstr "używając konta %s" +#: ../src/roster_window.py:1102 +msgid "_Manage Bookmarks..." +msgstr "_Zarządzaj zakładkami..." + #. profile, avatar -#: ../src/roster_window.py:1018 +#: ../src/roster_window.py:1121 #, python-format msgid "of account %s" msgstr "dla konta %s" -#: ../src/roster_window.py:1038 -msgid "_Manage Bookmarks..." -msgstr "_Zarządzaj zakładkami..." - -#: ../src/roster_window.py:1067 +#: ../src/roster_window.py:1161 #, python-format msgid "for account %s" msgstr "dla konta %s" #. History manager -#: ../src/roster_window.py:1088 +#: ../src/roster_window.py:1182 msgid "History Manager" msgstr "Historia rozmów" -#: ../src/roster_window.py:1097 +#: ../src/roster_window.py:1191 msgid "_Join New Group Chat" msgstr "_Dołącz do pokoju" -#: ../src/roster_window.py:1429 ../src/roster_window.py:3722 -#: ../src/roster_window.py:3729 +#: ../src/roster_window.py:1549 ../src/roster_window.py:4192 +#: ../src/roster_window.py:4199 msgid "You have unread messages" msgstr "Masz nieprzeczytane wiadomości" -#: ../src/roster_window.py:1430 +#: ../src/roster_window.py:1550 msgid "You must read them before removing this transport." msgstr "Przejrzyj je wszystkie przed usunięciem tego transportu." -#: ../src/roster_window.py:1433 +#: ../src/roster_window.py:1553 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transport \"%s\" zostanie usunięty" -#: ../src/roster_window.py:1434 +#: ../src/roster_window.py:1554 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." @@ -5179,11 +5826,11 @@ msgstr "" "Nie będziesz już mógł wysyłać i odbierać wiadomości od kontaktów za pomocą " "tego transportu." -#: ../src/roster_window.py:1437 +#: ../src/roster_window.py:1557 msgid "Transports will be removed" msgstr "Transporty zostaną usunięte" -#: ../src/roster_window.py:1442 +#: ../src/roster_window.py:1562 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " @@ -5193,120 +5840,151 @@ msgstr "" "następujących transportów: %s" #. it's jid -#: ../src/roster_window.py:1608 +#: ../src/roster_window.py:1728 msgid "Rename Contact" msgstr "Zmień nazwę dla kontaktu" -#: ../src/roster_window.py:1609 +#: ../src/roster_window.py:1729 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Wpisz nazwę dla kontaktu %s." -#: ../src/roster_window.py:1616 +#: ../src/roster_window.py:1736 msgid "Rename Group" msgstr "Zmień nazwę grupy" -#: ../src/roster_window.py:1617 +#: ../src/roster_window.py:1737 #, python-format msgid "Enter a new name for group %s" msgstr "Wpisz nową nazwę dla grupy %s." -#: ../src/roster_window.py:1692 +#: ../src/roster_window.py:1812 msgid "Remove Group" msgstr "Usuń grupę" -#: ../src/roster_window.py:1693 +#: ../src/roster_window.py:1813 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Czy chcesz usunąć z rostera grupę %s?" -#: ../src/roster_window.py:1694 +#: ../src/roster_window.py:1814 msgid "Remove also all contacts in this group from your roster" msgstr "Usuń z rostera wszystkie kontakty należące do tej grupy" -#: ../src/roster_window.py:1725 +#: ../src/roster_window.py:1845 msgid "Assign OpenPGP Key" msgstr "Przypisz klucz OpenPGP" -#: ../src/roster_window.py:1726 +#: ../src/roster_window.py:1846 msgid "Select a key to apply to the contact" msgstr "Wybierz klucz, który chcesz przypisać kontaktowi" -#: ../src/roster_window.py:1966 ../src/roster_window.py:2260 -msgid "_New group chat" +#: ../src/roster_window.py:2161 +msgid "_New Group Chat" msgstr "_Nowa rozmowa grupowa" -#: ../src/roster_window.py:2111 +#: ../src/roster_window.py:2297 msgid "I would like to add you to my roster" msgstr "Chciałbym dodać Cię do listy kontaktów" -#: ../src/roster_window.py:2305 ../src/roster_window.py:2364 +#. Send Group Message +#: ../src/roster_window.py:2431 ../src/roster_window.py:2643 msgid "Send Group M_essage" msgstr "_Wyślij wiadomość grupową" -#: ../src/roster_window.py:2343 -msgid "Re_name" -msgstr "_Zmień nazwę" +#: ../src/roster_window.py:2450 +msgid "_New group chat" +msgstr "_Nowa rozmowa grupowa" -#: ../src/roster_window.py:2370 +#. Manage Transport submenu +#: ../src/roster_window.py:2488 +msgid "_Manage Contacts" +msgstr "_Zarządzaj kontaktami" + +#: ../src/roster_window.py:2549 +msgid "_Maximize" +msgstr "_Maksymalizuj" + +#: ../src/roster_window.py:2556 +msgid "_Disconnect" +msgstr "_Rozłącz" + +#: ../src/roster_window.py:2635 +msgid "_Maximize All" +msgstr "_Maksymalizuj wszystkie" + +#: ../src/roster_window.py:2651 msgid "To all users" msgstr "Do wszystkich użytkowników" -#: ../src/roster_window.py:2373 +#: ../src/roster_window.py:2654 msgid "To all online users" msgstr "Do wszystkich połączonych użytkowników" -#: ../src/roster_window.py:2393 -msgid "Send Cus_tom Status" -msgstr "Wyślij odrębny status" +#. Log Off +#: ../src/roster_window.py:2771 +msgid "_Log off" +msgstr "R_ozłącz" -#: ../src/roster_window.py:2450 +#. Log on +#: ../src/roster_window.py:2777 msgid "_Log on" msgstr "_Połącz" -#: ../src/roster_window.py:2460 -msgid "Log _off" -msgstr "R_ozłącz" +#. Send single message +#: ../src/roster_window.py:2789 +msgid "Send Single Message" +msgstr "Wyślij wiadomość" -#: ../src/roster_window.py:2582 ../src/roster_window.py:2653 +#. Manage Transport submenu +#: ../src/roster_window.py:2836 +msgid "_Manage Transport" +msgstr "_Zarządzaj transportami" + +#. Modify Transport +#: ../src/roster_window.py:2844 +msgid "_Modify Transport" +msgstr "_Modyfikuj transport" + +#: ../src/roster_window.py:2958 ../src/roster_window.py:3032 msgid "_Change Status Message" msgstr "_Zmień opis statusu" -#: ../src/roster_window.py:2725 +#: ../src/roster_window.py:3104 msgid "Authorization has been sent" msgstr "Autoryzacja została wysłana" -#: ../src/roster_window.py:2726 +#: ../src/roster_window.py:3105 #, python-format msgid "Now \"%s\" will know your status." msgstr "Teraz \"%s\" będzie znał Twój status." -#: ../src/roster_window.py:2746 +#: ../src/roster_window.py:3125 msgid "Subscription request has been sent" msgstr "Prośba o autoryzację została wysłana" -#: ../src/roster_window.py:2747 +#: ../src/roster_window.py:3126 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "" "Jeśli \"%s\" zaakceptuje tę prośbę, to będziesz mógł widzieć jego lub jej " "status." -#: ../src/roster_window.py:2759 +#: ../src/roster_window.py:3138 msgid "Authorization has been removed" msgstr "Autoryzacja została cofnięta" -#: ../src/roster_window.py:2760 +#: ../src/roster_window.py:3139 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Teraz \"%s\" zawsze będzie cię widział jako rozłączonego." -#: ../src/roster_window.py:2955 +#: ../src/roster_window.py:3373 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Kontakt \"%s\" zostanie usunięty z Twojej listy kontaktów" -#: ../src/roster_window.py:2959 +#: ../src/roster_window.py:3377 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." @@ -5314,7 +5992,7 @@ msgstr "" "Usuwając kontakt cofniesz mu również autoryzację, co spowoduje, że kontakt " "będzie zawsze widział Cię jako rozłączonego." -#: ../src/roster_window.py:2964 +#: ../src/roster_window.py:3382 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." @@ -5322,16 +6000,16 @@ msgstr "" "Usuwając kontakt usuniesz również autoryzację, co spowoduje, że kontakt " "będzie zawsze widział Cię jako rozłączonego." -#: ../src/roster_window.py:2967 +#: ../src/roster_window.py:3385 msgid "I want this contact to know my status after removal" msgstr "Chcę żeby po usunięciu ten kontakt znał mój status" #. several contact to remove at the same time -#: ../src/roster_window.py:2971 +#: ../src/roster_window.py:3389 msgid "Contacts will be removed from your roster" msgstr "Kontakty zostaną usunięte z twojej listy kontaktów" -#: ../src/roster_window.py:2975 +#: ../src/roster_window.py:3393 #, python-format msgid "" "By removing these contacts:%s\n" @@ -5341,7 +6019,7 @@ msgstr "" "cofniesz im również autoryzację, co spowoduje, że będziesz dla nich widoczny " "jako rozłączony." -#: ../src/roster_window.py:3007 +#: ../src/roster_window.py:3425 msgid "" "Gnome Keyring is installed but not correctly started (environment variable " "probably not correctly set)" @@ -5349,41 +6027,44 @@ msgstr "" "Menedżer bazy kluczy GNOME jest zainstalowany, ale ma błędną konfigurację" "(prawodpodobnie niepoprawna zmienna środowiskowa" -#. TODO: make this string translatable +#: ../src/roster_window.py:3447 +msgid "GPG is not usable" +msgstr "GPG nie nadaje się do użycia" + #. %s is the account name here -#: ../src/roster_window.py:3035 ../src/common/connection.py:707 -#: ../src/common/zeroconf/connection_zeroconf.py:164 +#: ../src/roster_window.py:3447 ../src/common/connection.py:689 +#: ../src/common/zeroconf/connection_zeroconf.py:170 #, python-format msgid "You will be connected to %s without OpenPGP." msgstr "Zostanie połączony z %s bez obsługi OpenPGP." -#: ../src/roster_window.py:3052 +#: ../src/roster_window.py:3460 msgid "Passphrase Required" msgstr "Wymagane hasło" -#: ../src/roster_window.py:3053 +#: ../src/roster_window.py:3461 #, python-format msgid "Enter GPG key passphrase for account %s." msgstr "Wpisz hasło GPG dla konta %s." -#: ../src/roster_window.py:3058 +#: ../src/roster_window.py:3466 msgid "Save passphrase" msgstr "Zapisz hasło" -#: ../src/roster_window.py:3066 +#: ../src/roster_window.py:3474 msgid "Wrong Passphrase" msgstr "Błędne hasło" -#: ../src/roster_window.py:3067 +#: ../src/roster_window.py:3475 msgid "Please retype your GPG passphrase or press Cancel." msgstr "" "Proszę ponownie wprowadzić swoje hasło GPG lub kliknąć przycisk Anuluj." -#: ../src/roster_window.py:3134 ../src/roster_window.py:3202 +#: ../src/roster_window.py:3550 ../src/roster_window.py:3628 msgid "You are participating in one or more group chats" msgstr "Znajdujesz się w jednym lub kilku pokojach" -#: ../src/roster_window.py:3135 ../src/roster_window.py:3203 +#: ../src/roster_window.py:3551 ../src/roster_window.py:3629 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" @@ -5391,20 +6072,20 @@ msgstr "" "Zmiana statusu na Niewidoczny spowoduje rozłaczeniem z tym pokojami. Czy na " "pewno chcesz stać się niewidoczny?" -#: ../src/roster_window.py:3160 +#: ../src/roster_window.py:3585 msgid "No account available" msgstr "Żadne konto nie jest dostępne" -#: ../src/roster_window.py:3161 +#: ../src/roster_window.py:3586 msgid "You must create an account before you can chat with other contacts." msgstr "Aby rozmawiać z innymi osobami musisz założyć konto Jabbera." -#: ../src/roster_window.py:3284 +#: ../src/roster_window.py:3715 #, python-format msgid "\"%(title)s\" by %(artist)s" msgstr "\"%(title)s\" w wykonaniu %(artist)s" -#: ../src/roster_window.py:3723 ../src/roster_window.py:3730 +#: ../src/roster_window.py:4193 ../src/roster_window.py:4200 msgid "" "Messages will only be available for reading them later if you have history " "enabled." @@ -5412,24 +6093,24 @@ msgstr "" "Wiadomości będą dostępne tylko do czytania, o ile masz włączoną obsługę " "historii." -#: ../src/roster_window.py:4326 +#: ../src/roster_window.py:4824 msgid "Metacontacts storage not supported by your server" msgstr "Twój serwer uniemożliwia przechowywanie metakontaktów" -#: ../src/roster_window.py:4328 +#: ../src/roster_window.py:4826 msgid "" "Your server does not support storing metacontacts information. So those " -"information will not be save on next reconnection." +"information will not be saved on next reconnection." msgstr "" "Twój serwer uniemożliwia przechowywanie metakontaktów. Informacja ta nie " "zostanie przywrócona podczas następnego połączenia." -#: ../src/roster_window.py:4370 +#: ../src/roster_window.py:4871 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Chcesz utworzyć metakontakt. Kontynuować?" -#: ../src/roster_window.py:4372 +#: ../src/roster_window.py:4873 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 " @@ -5439,129 +6120,137 @@ msgstr "" "rostera. Używa się ich przede wszystkim wtedy, gdy jedna osoba ma kilka kont " "Jabbera lub zarejestrowana jest w kilku transportach." -#: ../src/roster_window.py:4450 +#: ../src/roster_window.py:4970 +#, python-format msgid "Do you want to send that file to %s:" msgid_plural "Do you want to send those files to %s:" msgstr[0] "Czy chcesz wysłać ten plik do %s:" msgstr[1] "Czy chcesz wysłać te pliki do %s:" msgstr[2] "Czy chcesz wysłać te pliki do %s:" -#: ../src/roster_window.py:4555 -#, python-format -msgid "Drop %s in group %s" -msgstr "Usuń %s z grupy %s" - -#: ../src/roster_window.py:4562 -#, python-format -msgid "Make %s and %s metacontacts" -msgstr "Przekształć %s oraz %s w metakontakty" - -#: ../src/roster_window.py:4749 +#: ../src/roster_window.py:5253 msgid "Change Status Message..." msgstr "Zmień opis statusu..." -#: ../src/search_window.py:88 +#: ../src/search_window.py:91 msgid "Waiting for results" msgstr "Oczekiwanie na wyniki" -#: ../src/search_window.py:135 ../src/search_window.py:186 +#: ../src/search_window.py:131 ../src/search_window.py:209 msgid "Error in received dataform" msgstr "Błąd w odebranych danych" -#: ../src/search_window.py:154 +#. No result +#: ../src/search_window.py:165 ../src/search_window.py:201 msgid "No result" msgstr "Brak wyników" -#: ../src/systray.py:163 +#: ../src/systray.py:169 msgid "_Change Status Message..." msgstr "_Zmień opis statusu..." -#: ../src/systray.py:251 +#: ../src/systray.py:254 msgid "Hide this menu" msgstr "Ukryj to menu" -#: ../src/tooltips.py:309 ../src/tooltips.py:492 +#: ../src/tooltips.py:317 ../src/tooltips.py:510 msgid "Jabber ID: " msgstr "Jabber ID:" -#: ../src/tooltips.py:312 ../src/tooltips.py:496 +#: ../src/tooltips.py:320 ../src/tooltips.py:514 msgid "Resource: " msgstr "Zasoby: " -#: ../src/tooltips.py:317 +#: ../src/tooltips.py:325 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s tego pokoju" -#: ../src/tooltips.py:429 ../src/tooltips.py:611 +#: ../src/tooltips.py:423 +msgid " [blocked]" +msgstr " [zablokowany]" + +#: ../src/tooltips.py:427 +msgid " [minimized]" +msgstr " [zminimalizowany]" + +#: ../src/tooltips.py:442 ../src/tooltips.py:630 msgid "Status: " msgstr "Status: " -#: ../src/tooltips.py:460 +#: ../src/tooltips.py:472 #, python-format msgid "Last status: %s" msgstr "Ostatni status %s" -#: ../src/tooltips.py:462 +#: ../src/tooltips.py:474 #, python-format msgid " since %s" msgstr " od %s" +#: ../src/tooltips.py:492 +msgid "Connected" +msgstr "Połączony" + +#: ../src/tooltips.py:494 +msgid "Disconnected" +msgstr "Rozłączony" + #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:502 +#: ../src/tooltips.py:521 msgid "Subscription: " msgstr "Autoryzacja: " -#: ../src/tooltips.py:512 +#: ../src/tooltips.py:531 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:567 +#: ../src/tooltips.py:586 msgid "Download" msgstr "Pobieranie" -#: ../src/tooltips.py:573 +#: ../src/tooltips.py:592 msgid "Upload" msgstr "Prześlij" -#: ../src/tooltips.py:580 +#: ../src/tooltips.py:599 msgid "Type: " msgstr "Typ: " -#: ../src/tooltips.py:586 +#: ../src/tooltips.py:605 msgid "Transferred: " msgstr "Przesłane: " -#: ../src/tooltips.py:589 ../src/tooltips.py:610 +#: ../src/tooltips.py:608 ../src/tooltips.py:629 msgid "Not started" msgstr "Nie włączony" -#: ../src/tooltips.py:593 +#: ../src/tooltips.py:612 msgid "Stopped" msgstr "Zatrzymany" -#: ../src/tooltips.py:595 ../src/tooltips.py:598 +#: ../src/tooltips.py:614 ../src/tooltips.py:617 msgid "Completed" msgstr "Ukończony" -#: ../src/tooltips.py:602 +#: ../src/tooltips.py:621 msgid "?transfer status:Paused" msgstr "?status transferu:wstrzymany" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:606 +#: ../src/tooltips.py:625 msgid "Stalled" msgstr "Wygaszony" -#: ../src/tooltips.py:608 +#: ../src/tooltips.py:627 msgid "Transferring" msgstr "Przesyłanie" -#: ../src/tooltips.py:640 +#: ../src/tooltips.py:659 msgid "This service has not yet responded with detailed information" msgstr "Ta usługa nie odesłała jeszcze szczegółowych informacji" -#: ../src/tooltips.py:643 +#: ../src/tooltips.py:662 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -5569,24 +6258,24 @@ msgstr "" "Ta usługa nie była w stanie odesłać szczegółowych informacji.\n" "Prawdopodobnie została zamknięta lub jest zepsuta" -#: ../src/vcard.py:325 +#: ../src/vcard.py:245 msgid "?Client:Unknown" msgstr "?Klient: Nieznany" -#: ../src/vcard.py:327 +#: ../src/vcard.py:247 msgid "?OS:Unknown" msgstr "?System operacyjny: Nieznany" -#: ../src/vcard.py:355 ../src/vcard.py:533 +#: ../src/vcard.py:272 ../src/vcard.py:282 ../src/vcard.py:472 #, python-format msgid "since %s" msgstr "od %s" -#: ../src/vcard.py:385 +#: ../src/vcard.py:311 msgid "Affiliation:" msgstr "Afiliacja: " -#: ../src/vcard.py:393 +#: ../src/vcard.py:319 msgid "" "This contact is interested in your presence information, but you are not " "interested in his/her presence" @@ -5594,7 +6283,7 @@ msgstr "" "Ten kontakt jest zaintersowany informacjami o twoim statusie, ale ty nie " "interesujesz się jego/jej statusem." -#: ../src/vcard.py:395 +#: ../src/vcard.py:321 msgid "" "You are interested in the contact's presence information, but he/she is not " "interested in yours" @@ -5602,12 +6291,12 @@ msgstr "" "Jesteś zainteresowany informacjami o statusie tego kontaktu, ale on/ona nie " "jest zainteresowana twoim." -#: ../src/vcard.py:397 +#: ../src/vcard.py:323 msgid "You and the contact are interested in each other's presence information" msgstr "Oboje jesteście zaintersowani nawzajem swoimi informacjami o statusie" #. None -#: ../src/vcard.py:399 +#: ../src/vcard.py:325 msgid "" "You are not interested in the contact's presence, and neither he/she is " "interested in yours" @@ -5615,140 +6304,144 @@ msgstr "" "Nie jesteś zainteresowany informacjami o statusie kontaktu i on również nie " "jest zainteresowany twoim" -#: ../src/vcard.py:407 +#: ../src/vcard.py:333 msgid "You are waiting contact's answer about your subscription request" msgstr "Oczekujesz na odpowiedź kontaktu dotyczącą prośby o autoryzację" -#: ../src/vcard.py:411 ../src/vcard.py:438 ../src/vcard.py:558 +#: ../src/vcard.py:337 ../src/vcard.py:374 ../src/vcard.py:497 msgid " resource with priority " msgstr " zasób o wysokim priorytecie " -#: ../src/common/check_paths.py:33 +#: ../src/common/check_paths.py:38 msgid "creating logs database" msgstr "tworzenie bazy danych z logami" -#: ../src/common/check_paths.py:89 ../src/common/check_paths.py:100 -#: ../src/common/check_paths.py:107 +#: ../src/common/check_paths.py:101 ../src/common/check_paths.py:112 +#: ../src/common/check_paths.py:119 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s jest plikiem choć powinien być katalogiem" -#: ../src/common/check_paths.py:90 ../src/common/check_paths.py:101 -#: ../src/common/check_paths.py:108 ../src/common/check_paths.py:116 +#: ../src/common/check_paths.py:102 ../src/common/check_paths.py:113 +#: ../src/common/check_paths.py:120 ../src/common/check_paths.py:128 msgid "Gajim will now exit" msgstr "Gajim zakończy teraz działanie" -#: ../src/common/check_paths.py:115 +#: ../src/common/check_paths.py:127 #, python-format msgid "%s is a directory but should be a file" msgstr "%s jest katalogiem choć powinien być plikiem" -#: ../src/common/check_paths.py:131 +#: ../src/common/check_paths.py:143 #, python-format msgid "creating %s directory" msgstr "tworzenie katalogu %s" -#: ../src/common/commands.py:69 +#: ../src/common/commands.py:74 msgid "Change status information" msgstr "Zmień informację o statusie" -#: ../src/common/commands.py:82 +#: ../src/common/commands.py:87 msgid "Change status" msgstr "Zmień status" -#: ../src/common/commands.py:83 +#: ../src/common/commands.py:88 msgid "Set the presence type and description" msgstr "Ustaw typ widoczności i status opisowy" -#: ../src/common/commands.py:89 +#: ../src/common/commands.py:94 msgid "Free for chat" msgstr "Chętny do rozmowy" -#: ../src/common/commands.py:90 +#: ../src/common/commands.py:95 msgid "Online" msgstr "Dostępny" -#: ../src/common/commands.py:92 +#: ../src/common/commands.py:97 msgid "Extended away" msgstr "Nieobecny" -#: ../src/common/commands.py:93 +#: ../src/common/commands.py:98 msgid "Do not disturb" msgstr "Nie przeszkadzać." -#: ../src/common/commands.py:94 +#: ../src/common/commands.py:99 msgid "Offline - disconnect" msgstr "Nieobecny - rozłączony" -#: ../src/common/commands.py:99 +#: ../src/common/commands.py:104 msgid "Presence description:" msgstr "Status opisowy" -#: ../src/common/commands.py:134 +#: ../src/common/commands.py:139 msgid "The status has been changed." msgstr "Status został zmieniony." -#: ../src/common/commands.py:179 +#: ../src/common/commands.py:184 #, python-format msgid "%(nickname)s on %(room_jid)s" msgstr "%(nickname)s z pokoju %(room_jid)s" -#: ../src/common/commands.py:183 +#: ../src/common/commands.py:188 msgid "You have not joined a groupchat." msgstr "Nie dołączyłeś do pokoju." -#: ../src/common/commands.py:189 +#: ../src/common/commands.py:194 msgid "Leave Groupchats" msgstr "Opuść pokoje" -#: ../src/common/commands.py:190 +#: ../src/common/commands.py:195 msgid "Choose the groupchats you want to leave" msgstr "Wybierz pokoje, które chcesz opuścić" -#: ../src/common/commands.py:194 -msgid "Groupchats" -msgstr "Pokoje" - -#: ../src/common/commands.py:230 +#: ../src/common/commands.py:235 msgid "You left the following groupchats:" msgstr "Opuściłeś pokoje:" -#: ../src/common/config.py:56 +#: ../src/common/commands.py:247 +msgid "Forward unread messages" +msgstr "Prześlij dalej nieprzeczytane wiadomości" + +#: ../src/common/commands.py:267 +msgid "All unread messages have been forwarded." +msgstr "Wszystkie nieprzeczytane wiadomości zostały przesłane dalej." + +#: ../src/common/config.py:63 msgid "Use D-Bus and Notification-Daemon to show notifications" msgstr "Korzystaj z DBus i Demona Powiadomień aby wyświetlać powiadomienia" -#: ../src/common/config.py:61 +#: ../src/common/config.py:68 msgid "Time in minutes, after which your status changes to away." msgstr "" "Czas w minutach, po którym twój status zostanie zmieniona na Zaraz wracam." -#: ../src/common/config.py:62 +#: ../src/common/config.py:69 msgid "Away as a result of being idle" msgstr "Status Zaraz wracam z powodu bezczynności programu" -#: ../src/common/config.py:64 +#: ../src/common/config.py:71 msgid "Time in minutes, after which your status changes to not available." msgstr "" "Czas w minutach, po którym twój status zostanie zmieniony na Niedostępny." -#: ../src/common/config.py:65 +#: ../src/common/config.py:72 msgid "Not available as a result of being idle" msgstr "Status Nieobecny z powodu bezczynności programu" -#: ../src/common/config.py:83 +#: ../src/common/config.py:90 msgid "" "List (space separated) of rows (accounts and groups) that are collapsed." msgstr "Lista (oddzielona spacjami) kolumn (kont lub grup), które są zwinięte." -#: ../src/common/config.py:88 +#: ../src/common/config.py:95 msgid "Enable link-local/zeroconf messaging" msgstr "Uaktywnij komunikację link-local/zeroconf" -#: ../src/common/config.py:91 +#: ../src/common/config.py:98 msgid "Language used by speller" msgstr "Język używany przez słownik" -#: ../src/common/config.py:92 +#: ../src/common/config.py:99 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" @@ -5759,7 +6452,7 @@ msgstr "" "print_ichat_every_foo_minutes.\n" "'never' - nigdy nie wyświetlaj czasu." -#: ../src/common/config.py:93 +#: ../src/common/config.py:100 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " "to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " @@ -5770,18 +6463,18 @@ msgstr "" "najmniej dokładne. Ustawienie to brane jest pod uwagę jedynie wtedy, gdy " "opcja print_time ustawiona jest na 'sometimes'." -#: ../src/common/config.py:96 +#: ../src/common/config.py:103 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Traktuj pary znaków * / _ jako znaki formatujące." -#: ../src/common/config.py:97 +#: ../src/common/config.py:104 msgid "" "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" "Jeśli ma wartość True, to */_ nie będą usuwane. Zatem napis *abc* będzie " "pogrubiony ale bez usuniętych znaków * *." -#: ../src/common/config.py:100 +#: ../src/common/config.py:107 msgid "" "Uses ReStructured text markup to send HTML, plus ascii formatting if " "selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" @@ -5791,7 +6484,7 @@ msgstr "" "zainstalowany pakiet docutils. Wyjaśnienie składni dostępne na stronie " "http://docutils.sourceforge.net/docs/ref/rst/" -#: ../src/common/config.py:109 +#: ../src/common/config.py:116 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." @@ -5799,7 +6492,7 @@ msgstr "" "Znak dodawany do nicka przy użyciu autouzupełniania klawiszem TAB (tylko " "czat)" -#: ../src/common/config.py:110 +#: ../src/common/config.py:117 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." @@ -5807,7 +6500,7 @@ msgstr "" "Znak proponowany do dodania do nicka w sytuacji, gdy dany nick jest już " "używany przez innego uzytkownika czatu" -#: ../src/common/config.py:133 +#: ../src/common/config.py:140 msgid "" "This option let you customize timestamp that is printed in conversation. For " "exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " @@ -5818,19 +6511,19 @@ msgstr "" "minuta] \". Więcej informacji w dokumentacjy Pythona dotyczącą strftime: " "http://docs.python.org/lib/module-time.html" -#: ../src/common/config.py:134 +#: ../src/common/config.py:141 msgid "Characters that are printed before the nickname in conversations" msgstr "Znaki, które wyświetlane są podczas rozmowy przed nazwą użytkownika" -#: ../src/common/config.py:135 +#: ../src/common/config.py:142 msgid "Characters that are printed after the nickname in conversations" msgstr "Znaki, które wyświetlane są podczas rozmowy za nazwą użytkownika" -#: ../src/common/config.py:142 +#: ../src/common/config.py:149 msgid "Add * and [n] in roster title?" msgstr "Dodać * i [n] do tytułu listy kontaktów?" -#: ../src/common/config.py:143 +#: ../src/common/config.py:150 msgid "" "How many lines to remember from previous conversation when a chat tab/window " "is reopened." @@ -5838,11 +6531,11 @@ msgstr "" "Ile linii z poprzedniej rozmowy powinno zostać zapamiętanych gdy okno/karta " "rozmowy zostanie ponownie otwarta." -#: ../src/common/config.py:144 +#: ../src/common/config.py:151 msgid "How many minutes should last lines from previous conversation last." msgstr "Ile minut powinny być widoczne linie z poprzedniej rozmowy." -#: ../src/common/config.py:145 +#: ../src/common/config.py:152 msgid "" "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " "Client default behaviour)." @@ -5850,11 +6543,11 @@ msgstr "" "Kombinacja Ctrl+Enter wysyła wiadomość a Enter tworzy nową linię (domyślne " "zachowanie klienta Mirabilis ICQ)." -#: ../src/common/config.py:147 +#: ../src/common/config.py:154 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Ile przechwywać linii dla kombinacji Ctrl+KeyUP." -#: ../src/common/config.py:150 +#: ../src/common/config.py:157 #, python-format msgid "" "Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' " @@ -5863,13 +6556,13 @@ msgstr "" "Albo własny url zawierający %s, gdzie %s jest słowem/frazą, albo WIKTIONARY, " "co oznacza użycie wiktionary." -#: ../src/common/config.py:153 +#: ../src/common/config.py:160 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "" "Jeśli ta opcja jest zaznaczona, to Gajim będzie mógł być sterowany zdalnie z " "wykorzystaniem gajim-remote." -#: ../src/common/config.py:154 +#: ../src/common/config.py:161 msgid "" "If True, listen to D-Bus signals from NetworkManager and change the status " "of accounts (provided they do not have listen_to_network_manager set to " @@ -5882,14 +6575,14 @@ msgstr "" "synchronizują się ze statusem globalnym) w oparciu o status wykorzystywanego " "połączenia sieciowego." -#: ../src/common/config.py:155 +#: ../src/common/config.py:162 msgid "" "Sent chat state notifications. Can be one of all, composing_only, disabled." msgstr "" "Wysyłaj informacje o twoim statusie podczas prowadzenia rozmowy. Może " "przyjmować wartości all, composing_only, disabled." -#: ../src/common/config.py:156 +#: ../src/common/config.py:163 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." @@ -5897,7 +6590,7 @@ msgstr "" "Informacje o statusie rozmówcy wyświetlane w oknie rozmowy. Przyjmuje " "wartości all, composing_only, disabled." -#: ../src/common/config.py:158 +#: ../src/common/config.py:165 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." @@ -5906,11 +6599,11 @@ msgstr "" "(print_time==sometimes), zmienna określa co ile minut Gajim ma wyświetlać " "czas nadejścia nowej wiadomości." -#: ../src/common/config.py:159 +#: ../src/common/config.py:166 msgid "Ask before closing a group chat tab/window." msgstr "Zapytaj przed zamknięciem karty/okna rozmowy grupowej." -#: ../src/common/config.py:160 +#: ../src/common/config.py:167 msgid "" "Always ask before closing group chat tab/window in this space separated list " "of group chat jids." @@ -5919,7 +6612,7 @@ msgstr "" "na każdym z pokojów wymienionych na liście (nazwy pokojów rozdzielone " "spacją)." -#: ../src/common/config.py:161 +#: ../src/common/config.py:168 msgid "" "Never ask before closing group chat tab/window in this space separated list " "of group chat jids." @@ -5928,42 +6621,61 @@ msgstr "" "prowadzona jest na dowolnym pokoju obecnym na tej liście (nazwy pokojów " "rozdzielone spacją)." -#: ../src/common/config.py:164 +#: ../src/common/config.py:171 msgid "" "Comma separated list of hosts that we send, in addition of local interfaces, " "for File Transfer in case of address translation/port forwarding." msgstr "" -"Oddzielona przecinkami lista hostów, którą wysyłamy w celu przesyłania plików, w przypadku " -"tłumaczenia adresu/przekierowania portu." +"Oddzielona przecinkami lista hostów, którą wysyłamy w celu przesyłania " +"plików, w przypadku tłumaczenia adresu/przekierowania portu." -#: ../src/common/config.py:166 +#: ../src/common/config.py:173 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "Standard IEC mówi, że KiB = 1024 bajty, KB = 100 bajtów." -#: ../src/common/config.py:168 +#: ../src/common/config.py:175 msgid "Notify of events in the system trayicon." msgstr "Powiadamiaj o zdarzeniach za pomocą ikony w obszarze powiadamiania." -#: ../src/common/config.py:174 +#: ../src/common/config.py:181 msgid "Show tab when only one conversation?" msgstr "Czy pokazywać kartę gdy otwarta jest tylko jedna rozmowa?" -#: ../src/common/config.py:175 +#: ../src/common/config.py:182 msgid "Show tabbed notebook border in chat windows?" msgstr "Czy pokazywać rozgraniczenie kart w oknie czatu?" -#: ../src/common/config.py:176 +#: ../src/common/config.py:183 msgid "Show close button in tab?" msgstr "Czy pokazywać przycisk zamknięcia na karcie?" -#: ../src/common/config.py:189 +#: ../src/common/config.py:184 +msgid "" +"When negotiating an encrypted session, should Gajim assume you want your " +"messages to be logged?" +msgstr "" +"Czy podczas negocjowania szyfrowanej sesji Gajim ma przyjąć, że chcesz ją " +"logować?" + +#: ../src/common/config.py:185 +msgid "" +"When negotiating an encrypted session, should Gajim prefer to use public " +"keys for identification?" +msgstr "" +"Czy podczas negocjowania szyfrowanej sesji Gajim ma kluczy publicznych?" + +#: ../src/common/config.py:194 +msgid "Preview new messages in notification popup?" +msgstr "Podgląd nowych wiadomości w oknie powiadomienia?" + +#: ../src/common/config.py:199 msgid "" "A semicolon-separated list of words that will be highlighted in group chats." msgstr "" "Lista słów oddzielonych średnikami, które będą podświetlane w trakcie " "rozmowy w pokoju." -#: ../src/common/config.py:190 +#: ../src/common/config.py:200 msgid "" "If True, quits Gajim when X button of Window Manager is clicked. This " "setting is taken into account only if trayicon is used." @@ -5972,14 +6684,14 @@ msgstr "" "Menadżera Okien. Ta opcja jest brana pod uwagę tylko gdy używana jest tacka " "systemowa." -#: ../src/common/config.py:191 +#: ../src/common/config.py:201 msgid "" "If True, Gajim will check if it's the default jabber client on each startup." msgstr "" "Jeśli ma wartość True, Gajim sprawdzi przy każdym uruchomieniu czy jest " "domyślnym klientem Jabbera." -#: ../src/common/config.py:192 +#: ../src/common/config.py:202 msgid "" "If True, Gajim will display an icon on each tab containing unread messages. " "Depending on the theme, this icon may be animated." @@ -5988,7 +6700,7 @@ msgstr "" "nieprzeczytaną wiadomość. Ikona ta może być animowana, w zależności od " "motywu." -#: ../src/common/config.py:193 +#: ../src/common/config.py:203 msgid "" "If True, Gajim will display the status message, if not empty, for every " "contact under the contact name in roster window." @@ -5996,7 +6708,7 @@ msgstr "" "Jeśli ma wartość True, Gajim wyświetli opis statusu, jeśli nie jest on " "pusty, dla każdego kontaktu pod jego nazwą w oknie listy kontaktów." -#: ../src/common/config.py:195 +#: ../src/common/config.py:205 msgid "" "If True, Gajim will ask for avatar each contact that did not have an avatar " "last time or has one cached that is too old." @@ -6004,7 +6716,7 @@ msgstr "" "Jeśli ma wartość True, Gajim wyśle zapytanie o awatar każdego kontaktu, " "który ostatnio nie miał awatara lub ma zapisany jedynie stary." -#: ../src/common/config.py:196 +#: ../src/common/config.py:206 msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." @@ -6012,7 +6724,7 @@ msgstr "" "Jeśli ma wartość False, to nie będziesz informowany o zmianie statusu lub " "opisu statusu przez kontakt, z którym rozmawiasz." -#: ../src/common/config.py:197 +#: ../src/common/config.py:207 msgid "" "can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " "longer print status line in groupchats when a member changes his or her " @@ -6027,30 +6739,30 @@ msgstr "" "\"in_and_out\" nakazuje programowi wyświetlanie jedynie informacji o wejściu " "użytkownika do pokoju lub jego opuszczeniu." -#: ../src/common/config.py:199 +#: ../src/common/config.py:209 msgid "Background color of contacts when they just signed in." msgstr "Kolor tła dla logujących się kontaktów." -#: ../src/common/config.py:200 +#: ../src/common/config.py:210 msgid "Background color of contacts when they just signed out." msgstr "Kolor tła dla kontaktów w trakcie wylogowywania." -#: ../src/common/config.py:202 +#: ../src/common/config.py:212 msgid "" "If True, restored messages will use a smaller font than the default one." msgstr "" "Jeżeli opcja ustawiona jest na True, przywrócone wiadomości będą wyświetlane " "mniejszą czcionką." -#: ../src/common/config.py:203 +#: ../src/common/config.py:213 msgid "Don't show avatar for the transport itself." msgstr "Nie pokazuj awatarów transportów." -#: ../src/common/config.py:204 +#: ../src/common/config.py:214 msgid "Don't show roster in the system taskbar." msgstr "Nie pokazuj okna rostera na pasku zadań." -#: ../src/common/config.py:205 +#: ../src/common/config.py:215 msgid "" "If True and installed GTK+ and PyGTK versions are at least 2.8, make the " "window flash (the default behaviour in most Window Managers) when holding " @@ -6060,7 +6772,7 @@ msgstr "" "niższej niż 2.8, odebrane a nie przeczytane wiadomości spowodują miganie " "okna programu." -#: ../src/common/config.py:207 +#: ../src/common/config.py:217 msgid "" "Jabberd1.4 does not like sha info when one join a password protected group " "chat. Turn this option to False to stop sending sha info in group chat " @@ -6071,7 +6783,7 @@ msgstr "" "wysyłania takiej informacji." #. always, never, peracct, pertype should not be translated -#: ../src/common/config.py:210 +#: ../src/common/config.py:220 msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" @@ -6089,39 +6801,35 @@ msgstr "" "wspólne okno. Aby uaktywnić dokonane w tej opcji zmiany, trzeba ponownie " "uruchomić program." -#: ../src/common/config.py:211 +#: ../src/common/config.py:221 msgid "If False, you will no longer see the avatar in the chat window." msgstr "" "Jeżeli ustawisz tą opcję na False, Gajim nie będzie wyświetlał avatara w " "oknie rozmowy." -#: ../src/common/config.py:212 +#: ../src/common/config.py:222 msgid "If True, pressing the escape key closes a tab/window." msgstr "" "Ustawienie 'True' spowoduje zamykanie okna/karty rozmowy po naciśnięciu " "klawisza ESC." -#: ../src/common/config.py:213 -msgid "Hides the buttons in group chat window." +#: ../src/common/config.py:223 +msgid "Hides the buttons in chat windows." msgstr "Ukrywa przyciski w oknie czatu." -#: ../src/common/config.py:214 -msgid "Hides the buttons in two persons chat window." -msgstr "Ukrywa przyciski podczas rozmowy dwóch osób." - -#: ../src/common/config.py:215 +#: ../src/common/config.py:224 msgid "Hides the banner in a group chat window" msgstr "Ukrywa banner w oknie czatu" -#: ../src/common/config.py:216 +#: ../src/common/config.py:225 msgid "Hides the banner in two persons chat window" msgstr "Usuwa banner podczas rozmowy dwóch osób" -#: ../src/common/config.py:217 +#: ../src/common/config.py:226 msgid "Hides the group chat occupants list in group chat window." msgstr "Usuwa z okna rozmowy grupowej listę osób obecnych w pokoju." -#: ../src/common/config.py:218 +#: ../src/common/config.py:227 msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." @@ -6129,22 +6837,26 @@ msgstr "" "Podczas rozmowy grupowej, pokaż nazwę rozmówcy na początku linii tylko " "wówczas, gdy poprzednią wiadomość wysłała inna osoba." -#: ../src/common/config.py:219 +#: ../src/common/config.py:228 msgid "Indentation when using merge consecutive nickname." msgstr "Wcięcie stosowane przy łaczeniu tych samych nicków." -#: ../src/common/config.py:220 +#: ../src/common/config.py:229 +msgid "Smooth scroll message in conversation window" +msgstr "Płynne przewijanie w oknie rozmowy" + +#: ../src/common/config.py:230 msgid "List of colors that will be used to color nicknames in group chats." msgstr "" "Lista kolorów, które używane będą do kolorowania nicków w oknach czatu." -#: ../src/common/config.py:221 +#: ../src/common/config.py:231 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "" "Kombinacja klawiszy Ctrl-Tab przechodzi do następnej karty, o ile w żadnej z " "nich nie ma nieprzeczytanych wiadomości." -#: ../src/common/config.py:222 +#: ../src/common/config.py:232 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." @@ -6152,7 +6864,7 @@ msgstr "" "Czy program powinien potwierdzać za każdym razem utworzenie metakontaktu? " "Pusty ciąg spowoduje, że okno dialogowe nie będzie wyświetlane." -#: ../src/common/config.py:223 +#: ../src/common/config.py:233 msgid "" "If True, you will be able to set a negative priority to your account in " "account modification window. BE CAREFUL, when you are logged in with a " @@ -6163,7 +6875,7 @@ msgstr "" "ujemnym priorytetem nie będziesz otrzymywał żadnych wiadomości z twojego " "serwera." -#: ../src/common/config.py:224 +#: ../src/common/config.py:234 msgid "" "If True, Gajim will use Gnome Keyring (if available) to store account " "passwords." @@ -6171,7 +6883,7 @@ msgstr "" "Jeśli opcja ta ustawiona jest na True, do przechowywania haseł Gajim będzie " "używał Menedżera bazy kluczy GNOME." -#: ../src/common/config.py:225 +#: ../src/common/config.py:235 msgid "" "If True, Gajim will show number of online and total contacts in account and " "group rows." @@ -6180,7 +6892,7 @@ msgstr "" "połączonych kontaktów oraz ogólną liczbę kontaktów dla każdego konta oraz " "grupy" -#: ../src/common/config.py:226 +#: ../src/common/config.py:236 msgid "" "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " "as if they were of this type" @@ -6189,22 +6901,39 @@ msgstr "" "Gajim będzie traktował każdą przychodzącą wiadomość jako czat lub pojedynczą " "wiadomość" -#: ../src/common/config.py:227 +#: ../src/common/config.py:237 msgid "" "If True, Gajim will scroll and select the contact who sent you the last " "message, if chat window is not already opened." -msgstr "Jeżeli ustawiono na 'True', Gajim przewinie listę kontaktów i wybierze ten " -"kontakt, który wysłał ci ostatnią wiadomość, ale tylko wtedy gdy okno czatu nie jest " -"już otwarte." +msgstr "" +"Jeżeli ustawiono na 'True', Gajim przewinie listę kontaktów i wybierze ten " +"kontakt, który wysłał ci ostatnią wiadomość, ale tylko wtedy gdy okno czatu " +"nie jest już otwarte." -#: ../src/common/config.py:228 +#: ../src/common/config.py:238 msgid "" "If True, Gajim will convert string between $$ and $$ to an image using dvips " "and convert before insterting it in chat window." -msgstr "Jeżeli ustawiono na 'True', Gajim dokona konwersji ciągów zawartych pomiędzy " -"$$ i $$ do postaci obrazu (z wykorzystaniem dvips) przed wstawieniem ich do okna rozmowy." +msgstr "" +"Jeżeli ustawiono na 'True', Gajim dokona konwersji ciągów zawartych pomiędzy " +"$$ i $$ do postaci obrazu (z wykorzystaniem dvips) przed wstawieniem ich do " +"okna rozmowy." #: ../src/common/config.py:239 +msgid "Time of inactivity needed before the change status window closes down." +msgstr "" +"Wymagany jest okres nieaktywności zanim zamknięte zostanie okno zmiany " +"statusu." + +#: ../src/common/config.py:240 +msgid "" +"Maximum number of lines that are printed in conversations. Oldest lines are " +"cleared." +msgstr "" +"Maksymalna ilość linii, jaka jest wyświetlana podczas rozmów. Najstarsze są " +"usuwane." + +#: ../src/common/config.py:251 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." @@ -6213,11 +6942,11 @@ msgstr "" "zdefiniowane są opcjach rozpoczynających się od autopriority_*." #. yes, no, ask -#: ../src/common/config.py:268 +#: ../src/common/config.py:279 msgid "Jabberd2 workaround" msgstr "Obejście dla Jabberd2" -#: ../src/common/config.py:272 +#: ../src/common/config.py:283 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." @@ -6225,101 +6954,101 @@ msgstr "" "Jeżeli ta opcja jest aktywna, Gajim pobierze adresy serwerów proxy z klucza " "file_transfers_proxies i użyje ich podczas przesyłania plików." -#: ../src/common/config.py:331 +#: ../src/common/config.py:342 msgid "Is OpenPGP enabled for this contact?" msgstr "Czy OpenPGP jest włączone dla tego kontaktu?" -#: ../src/common/config.py:332 ../src/common/config.py:335 +#: ../src/common/config.py:343 ../src/common/config.py:346 msgid "Language for which we want to check misspelled words" msgstr "Język, którego używa słownik przy sprawdzaniu pisowni" -#: ../src/common/config.py:341 +#: ../src/common/config.py:352 msgid "all or space separated status" msgstr "all lub komunikaty stanu rozdzielone spacjami" -#: ../src/common/config.py:342 +#: ../src/common/config.py:353 msgid "'yes', 'no', or 'both'" msgstr "'yes', 'no' lub 'both'" -#: ../src/common/config.py:343 ../src/common/config.py:345 -#: ../src/common/config.py:346 ../src/common/config.py:349 -#: ../src/common/config.py:350 +#: ../src/common/config.py:354 ../src/common/config.py:356 +#: ../src/common/config.py:357 ../src/common/config.py:360 +#: ../src/common/config.py:361 msgid "'yes', 'no' or ''" msgstr "'yes', 'no' lub \"" -#: ../src/common/config.py:356 +#: ../src/common/config.py:367 msgid "Sleeping" msgstr "Śpię" -#: ../src/common/config.py:357 +#: ../src/common/config.py:368 msgid "Back soon" msgstr "Niedługo wrócę" -#: ../src/common/config.py:357 +#: ../src/common/config.py:368 msgid "Back in some minutes." msgstr "Wrócę za jakiś czas." -#: ../src/common/config.py:358 +#: ../src/common/config.py:369 msgid "Eating" msgstr "Jem" -#: ../src/common/config.py:358 +#: ../src/common/config.py:369 msgid "I'm eating, so leave me a message." msgstr "Jem. Zostaw wiadomość." -#: ../src/common/config.py:359 +#: ../src/common/config.py:370 msgid "Movie" msgstr "Film" -#: ../src/common/config.py:359 +#: ../src/common/config.py:370 msgid "I'm watching a movie." msgstr "Oglądam film." -#: ../src/common/config.py:360 +#: ../src/common/config.py:371 msgid "Working" msgstr "Praca" -#: ../src/common/config.py:360 +#: ../src/common/config.py:371 msgid "I'm working." msgstr "Pracuję." -#: ../src/common/config.py:361 +#: ../src/common/config.py:372 msgid "Phone" msgstr "Telefon" -#: ../src/common/config.py:361 +#: ../src/common/config.py:372 msgid "I'm on the phone." msgstr "Rozmawiam przez telefon." -#: ../src/common/config.py:362 +#: ../src/common/config.py:373 msgid "Out" msgstr "Wyszedłem" -#: ../src/common/config.py:362 +#: ../src/common/config.py:373 msgid "I'm out enjoying life." msgstr "Wyszedłem cieszyć się życiem." -#: ../src/common/config.py:366 +#: ../src/common/config.py:377 msgid "I'm available." msgstr "Dostępny." -#: ../src/common/config.py:367 +#: ../src/common/config.py:378 msgid "I'm free for chat." msgstr "Chętny do rozmowy." -#: ../src/common/config.py:369 +#: ../src/common/config.py:380 msgid "I'm not available." msgstr "Nieobecny." -#: ../src/common/config.py:370 +#: ../src/common/config.py:381 msgid "Do not disturb." msgstr "Nie przeszkadzać." -#: ../src/common/config.py:371 ../src/common/config.py:372 +#: ../src/common/config.py:382 ../src/common/config.py:383 msgid "Bye!" msgstr "Żegnaj!" -#: ../src/common/config.py:381 +#: ../src/common/config.py:392 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." @@ -6328,253 +7057,128 @@ msgstr "" "wyrazów ze zmiennej muc_highlight_words lub gdy wiadomość MUC zawierać " "będzie twój pseudonim." -#: ../src/common/config.py:382 +#: ../src/common/config.py:393 msgid "Sound to play when any MUC message arrives." msgstr "Dźwięk, jaki będzie odtwarzany, gdy nadejdzie wiadomość MUC." -#: ../src/common/config.py:391 ../src/common/optparser.py:195 +#: ../src/common/config.py:402 ../src/common/optparser.py:219 msgid "green" msgstr "zielony" -#: ../src/common/config.py:395 ../src/common/optparser.py:181 +#: ../src/common/config.py:406 ../src/common/optparser.py:205 msgid "grocery" msgstr "grocery" -#: ../src/common/config.py:399 +#: ../src/common/config.py:410 msgid "human" msgstr "human" -#: ../src/common/config.py:403 +#: ../src/common/config.py:414 msgid "marine" msgstr "morski" -#: ../src/common/connection.py:197 -#: ../src/common/zeroconf/connection_zeroconf.py:202 -#, python-format -msgid "Connection with account \"%s\" has been lost" -msgstr "Połączenie z kontem \"%s\"zostało zerwane." - -#: ../src/common/connection.py:198 -msgid "Reconnect manually." -msgstr "Połącz ponownie ręcznie." - -#: ../src/common/connection.py:209 ../src/common/connection.py:236 -#, python-format -msgid "Transport %s answered wrongly to register request: %s" -msgstr "" -"Transport %s udzielił nieprawidłowej odpowiedzi na żądnie rejestracji: %s" - -#. wrong answer -#: ../src/common/connection.py:235 -msgid "Invalid answer" -msgstr "Niepoprawna odpowiedź" - -#: ../src/common/connection.py:383 -msgid "Connection to proxy failed" -msgstr "Połączenie z proxy nie powiodło się" - -#: ../src/common/connection.py:437 ../src/common/connection.py:535 -#: ../src/common/connection.py:1032 -#: ../src/common/zeroconf/connection_zeroconf.py:236 -#, python-format -msgid "Could not connect to \"%s\"" -msgstr "Nie można połączyć się z \"%s\"" - -#: ../src/common/connection.py:451 -#, python-format -msgid "Connected to server %s:%s with %s" -msgstr "Połączony z serwerem %s: %s z %s" - -#: ../src/common/connection.py:464 -#, python-format -msgid "Security error connecting to \"%s\"" -msgstr "Błąd zabezpieczeń przy połączeniu z \"%s\"" - -#: ../src/common/connection.py:465 -msgid "" -"The server's key has changed, or someone is trying to hack your connection." -msgstr "" -"Zmienił się klucz twojego serwera lub ktoś próbuje podsłuchać połączenie." - -#: ../src/common/connection.py:472 -#, python-format -msgid "Unable to check fingerprint for %s. Connection could be insecure." -msgstr "" -"Nie można sprawdzić odcisku klucza %s. Połączenie może nie być bezpieczne" - -#: ../src/common/connection.py:514 -#, python-format -msgid "Missing fingerprint in SSL connection to %s" -msgstr "Brak odcisku klucza w połączeniu SSL z %s" - -#: ../src/common/connection.py:520 -#, python-format -msgid "Fingerprint mismatch for %s: Got %s, expected %s" -msgstr "Niezgodność odcisku klucza %s. Oczekiwano %s, otrzymano %s" - -#: ../src/common/connection.py:536 -msgid "Check your connection or try again later" -msgstr "Sprawdź swoje połączenie lub spróbuj później" - -#: ../src/common/connection.py:562 -#, python-format -msgid "Authentication failed with \"%s\"" -msgstr "Autoryzacja z \"%s\" nie powiodła się" - -#: ../src/common/connection.py:563 -msgid "Please check your login and password for correctness." -msgstr "Spawdź czy twój login i hasło są poprawne." - -#: ../src/common/connection.py:606 -msgid "Error while removing privacy list" -msgstr "Błąd usuwaniu listy prywatności" - -#: ../src/common/connection.py:607 -msgid "" -"Privacy list %s has not been removed. It is maybe active in one of your " -"connected resources. Deactivate it and try again." -msgstr "" -"Lista prywatności %s nie została usunięta. Prawdopodobnie jest aktywna w " -"jednym z połączonych zasobów. Wyłącz ją i spróbuj ponownie." - -#. We didn't set a passphrase -#: ../src/common/connection.py:705 -#: ../src/common/zeroconf/connection_zeroconf.py:162 -msgid "OpenPGP passphrase was not given" -msgstr "Nie podano klucza OpenPGP" - -#. we're not english -#. one in locale and one en -#: ../src/common/connection.py:862 -msgid "[This message is *encrypted* (See :JEP:`27`]" -msgstr "[Ta wiadomość jest zaszyfrowana (zobacz JEP '27']" - -#: ../src/common/connection.py:918 -#: ../src/common/zeroconf/connection_zeroconf.py:421 -#, python-format -msgid "" -"Subject: %s\n" -"%s" -msgstr "" -"Temat: %s\n" -"%s" - -#: ../src/common/connection.py:1058 -msgid "Not fetched because of invisible status" -msgstr "Nie wysłano z powodu statusu 'niewidoczny'" - -#: ../src/common/connection_handlers.py:52 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:44 +#: ../src/common/connection_handlers.py:61 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:49 msgid "Unable to load idle module" msgstr "Nie można załadować modułu idle" -#: ../src/common/connection_handlers.py:180 -#: ../src/common/connection_handlers.py:215 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 +#: ../src/common/connection_handlers.py:219 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:243 msgid "Wrong host" msgstr "Błędna nazwa hosta" -#: ../src/common/connection_handlers.py:180 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 -msgid "" -"The host %s you configured as the ft_add_hosts_to_send advanced option is " -"not valid, so ignored." -msgstr "" -"Nazwa hosta, którą określiłeś w opcji ft_add_hosts_to_send jest " -"niepoprawna, będzie więc ignorowana." - -#: ../src/common/connection_handlers.py:216 +#: ../src/common/connection_handlers.py:220 msgid "Invalid local address? :-O" msgstr "Niepoprawny adres lokalny? :-O" -#: ../src/common/connection_handlers.py:607 +#: ../src/common/connection_handlers.py:618 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Informacje rejestracyjne transportu %s nie dotarły na czas" -#: ../src/common/connection_handlers.py:1557 +#: ../src/common/connection_handlers.py:1801 #, python-format msgid "Nickname not allowed: %s" msgstr "Pseudonim jest niedozwolony: %s" -#. password required to join #. we are banned #. group chat does not exist -#: ../src/common/connection_handlers.py:1622 -#: ../src/common/connection_handlers.py:1625 -#: ../src/common/connection_handlers.py:1628 -#: ../src/common/connection_handlers.py:1631 -#: ../src/common/connection_handlers.py:1634 -#: ../src/common/connection_handlers.py:1637 -#: ../src/common/connection_handlers.py:1645 +#: ../src/common/connection_handlers.py:1871 +#: ../src/common/connection_handlers.py:1874 +#: ../src/common/connection_handlers.py:1877 +#: ../src/common/connection_handlers.py:1880 +#: ../src/common/connection_handlers.py:1884 +#: ../src/common/connection_handlers.py:1893 msgid "Unable to join group chat" msgstr "Nie można dołączyć do pokoju" -#: ../src/common/connection_handlers.py:1623 -msgid "A password is required to join this group chat." -msgstr "Aby dołączyć do tego pokoju, wymagane jest hasło." +#: ../src/common/connection_handlers.py:1872 +#, python-format +msgid "You are banned from group chat %s." +msgstr "Zostałeś zabanowany w pokoju %s." -#: ../src/common/connection_handlers.py:1626 -msgid "You are banned from this group chat." -msgstr "Zostałeś zabanowany w tym pokoju." +#: ../src/common/connection_handlers.py:1875 +#, python-format +msgid "Group chat %s does not exist." +msgstr "Pokój %s nie istnieje." -#: ../src/common/connection_handlers.py:1629 -msgid "Such group chat does not exist." -msgstr "Taki pokój nie istnieje." - -#: ../src/common/connection_handlers.py:1632 +#: ../src/common/connection_handlers.py:1878 msgid "Group chat creation is restricted." msgstr "Tworzenie pokoi jest ograniczone." -#: ../src/common/connection_handlers.py:1635 -msgid "Your registered nickname must be used." -msgstr "Twój zarejestrowany pseudonim musi być w użyciu." +#: ../src/common/connection_handlers.py:1881 +#, python-format +msgid "Your registered nickname must be used in group chat %s." +msgstr "Twój pseudonim musi być używany w pokoju %s." -#: ../src/common/connection_handlers.py:1638 -msgid "You are not in the members list." -msgstr "Nie jesteś na liście członków." +#: ../src/common/connection_handlers.py:1885 +#, python-format +msgid "You are not in the members list in groupchat %s." +msgstr "Nie jesteś na liście uczestników rozmów w pokoju %s." -#: ../src/common/connection_handlers.py:1646 +#: ../src/common/connection_handlers.py:1894 +#, python-format msgid "" -"Your desired nickname is in use or registered by another occupant.\n" +"Your desired nickname in group chat %s is in use or registered by another " +"occupant.\n" "Please specify another nickname below:" msgstr "" "Pożądany przez ciebie pseudonim jest używany lub zarejestrowany przez kogoś " -"innego.\n" +"innego w pokoju %s.\n" "Podaj inny pseudonim:" #. Room has been destroyed. see #. http://www.xmpp.org/extensions/xep-0045.html#destroyroom -#: ../src/common/connection_handlers.py:1689 +#: ../src/common/connection_handlers.py:1925 msgid "Room has been destroyed" msgstr "Pokój został usunięty" -#: ../src/common/connection_handlers.py:1696 +#: ../src/common/connection_handlers.py:1932 #, python-format msgid "You can join this room instead: %s" msgstr "W zamian możesz dołączyć do pokoju %s" -#: ../src/common/connection_handlers.py:1722 +#: ../src/common/connection_handlers.py:1959 msgid "I would like to add you to my roster." msgstr "Chciałbym dodać Cię do listy kontaktów." #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:1743 +#: ../src/common/connection_handlers.py:1980 #, python-format msgid "we are now subscribed to %s" msgstr "Zapisaliśmy się do %s" -#: ../src/common/connection_handlers.py:1745 +#: ../src/common/connection_handlers.py:1982 #, python-format msgid "unsubscribe request from %s" msgstr "Prośba o cofnięcie autoryzacji od %s" -#: ../src/common/connection_handlers.py:1747 +#: ../src/common/connection_handlers.py:1984 #, python-format msgid "we are now unsubscribed from %s" msgstr "Wypisaliśmy się z %s" -#: ../src/common/connection_handlers.py:1866 +#: ../src/common/connection_handlers.py:2106 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " @@ -6584,36 +7188,130 @@ msgstr "" "Skorzystaj z narzędzi do zarządzania listą kontaktów, takich jak http://jru." "jabberstudio.org/ aby go usunąć" -#: ../src/common/contacts.py:271 +#: ../src/common/connection.py:249 +#: ../src/common/zeroconf/connection_zeroconf.py:208 +#, python-format +msgid "Connection with account \"%s\" has been lost" +msgstr "Połączenie z kontem \"%s\"zostało zerwane." + +#: ../src/common/connection.py:250 +msgid "Reconnect manually." +msgstr "Połącz ponownie ręcznie." + +#: ../src/common/connection.py:261 +#, python-format +msgid "Server %s answered wrongly to register request: %s" +msgstr "Serwer %s udzielił nieprawidłowej odpowiedzi na żądnie rejestracji: %s" + +#. wrong answer +#: ../src/common/connection.py:269 +msgid "Invalid answer" +msgstr "Niepoprawna odpowiedź" + +#: ../src/common/connection.py:270 +#, python-format +msgid "Transport %s answered wrongly to register request: %s" +msgstr "" +"Transport %s udzielił nieprawidłowej odpowiedzi na żądnie rejestracji: %s" + +#: ../src/common/connection.py:416 +msgid "Connection to proxy failed" +msgstr "Połączenie z proxy nie powiodło się" + +#: ../src/common/connection.py:470 ../src/common/connection.py:516 +#: ../src/common/connection.py:1075 +#: ../src/common/zeroconf/connection_zeroconf.py:242 +#, python-format +msgid "Could not connect to \"%s\"" +msgstr "Nie można połączyć się z \"%s\"" + +#: ../src/common/connection.py:484 +#, python-format +msgid "Connected to server %s:%s with %s" +msgstr "Połączony z serwerem %s: %s z %s" + +#: ../src/common/connection.py:517 +msgid "Check your connection or try again later" +msgstr "Sprawdź swoje połączenie lub spróbuj później" + +#: ../src/common/connection.py:542 +#, python-format +msgid "Authentication failed with \"%s\"" +msgstr "Autoryzacja z \"%s\" nie powiodła się" + +#: ../src/common/connection.py:543 +msgid "Please check your login and password for correctness." +msgstr "Spawdź czy twój login i hasło są poprawne." + +#: ../src/common/connection.py:586 +msgid "Error while removing privacy list" +msgstr "Błąd usuwaniu listy prywatności" + +#: ../src/common/connection.py:587 +#, 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 "" +"Lista prywatności %s nie została usunięta. Prawdopodobnie jest aktywna w " +"jednym z połączonych zasobów. Wyłącz ją i spróbuj ponownie." + +#. We didn't set a passphrase +#: ../src/common/connection.py:687 +#: ../src/common/zeroconf/connection_zeroconf.py:168 +msgid "OpenPGP passphrase was not given" +msgstr "Nie podano klucza OpenPGP" + +#. we're not english +#. one in locale and one en +#: ../src/common/connection.py:850 +msgid "[This message is *encrypted* (See :JEP:`27`]" +msgstr "[Ta wiadomość jest zaszyfrowana (zobacz JEP '27']" + +#: ../src/common/connection.py:924 +#: ../src/common/zeroconf/connection_zeroconf.py:436 +#, python-format +msgid "" +"Subject: %s\n" +"%s" +msgstr "" +"Temat: %s\n" +"%s" + +#: ../src/common/connection.py:1107 +msgid "Not fetched because of invisible status" +msgstr "Nie wysłano z powodu statusu 'niewidoczny'" + +#: ../src/common/contacts.py:299 msgid "Not in roster" msgstr "Spoza listy kontaktów" #. only say that to non Windows users -#: ../src/common/dbus_support.py:33 +#: ../src/common/dbus_support.py:38 msgid "D-Bus python bindings are missing in this computer" msgstr "Na tym komputerze brakuje pythonowych dowiązań do D-Bus." -#: ../src/common/dbus_support.py:34 +#: ../src/common/dbus_support.py:39 msgid "D-Bus capabilities of Gajim cannot be used" msgstr "Nie można użyć D-Bus." -#: ../src/common/exceptions.py:22 +#: ../src/common/exceptions.py:27 msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." msgstr "" "Nie znaleziono biblioteki pysqlite2 (lub python-pysqlite2). Kończenie pracy " "programu..." -#: ../src/common/exceptions.py:30 +#: ../src/common/exceptions.py:44 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "" "Usługa nie jest dostępna. Gajim nie działa lub remote_control ma wartość " "False" -#: ../src/common/exceptions.py:38 +#: ../src/common/exceptions.py:52 msgid "D-Bus is not present on this machine or python module is missing" msgstr "D-Bus nie jest obecny na tej maszynie lub brak modułu dla pythona" -#: ../src/common/exceptions.py:46 +#: ../src/common/exceptions.py:60 msgid "" "Session bus is not available.\n" "Try reading http://trac.gajim.org/wiki/GajimDBus" @@ -6621,443 +7319,444 @@ msgstr "" "Nie znaleziono interfejsu DBus.\n" "Zapoznaj się z uwagami na stronie http://trac.gajim.org/wiki/GajimDBus" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "one" msgstr "pierwsza" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "two" msgstr "druga" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "three" msgstr "trzecia" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "four" msgstr "czwarta" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "five" msgstr "piąta" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "six" msgstr "szóstej" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "seven" msgstr "siódma" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "eight" msgstr "ósmej" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "nine" msgstr "dziewiąta" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "ten" msgstr "dziesiątej" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "eleven" msgstr "jedenasta" -#: ../src/common/fuzzyclock.py:44 +#: ../src/common/fuzzyclock.py:49 msgid "twelve" msgstr "dwunastej" #. Strings to use for the output. %0 will be replaced with the preceding hour (e.g. "x PAST %0"), %1 with the coming hour (e.g. "x TO %1). ''' #. A "singular-form". It is used when talking about hour 0 -#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 msgid "$0 o'clock" msgstr "Godzina $0" -#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 msgid "five past $0" msgstr "pięć po $0" -#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 +#: ../src/common/fuzzyclock.py:53 ../src/common/fuzzyclock.py:61 msgid "ten past $0" msgstr "dziesięć po $0" -#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 +#: ../src/common/fuzzyclock.py:53 ../src/common/fuzzyclock.py:61 msgid "quarter past $0" msgstr "kwadrans po $0" -#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 +#: ../src/common/fuzzyclock.py:54 ../src/common/fuzzyclock.py:62 msgid "twenty past $0" msgstr "dwadzieścia po $0" -#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 +#: ../src/common/fuzzyclock.py:54 ../src/common/fuzzyclock.py:62 msgid "twenty five past $0" msgstr "za pięć wpół do $0" -#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 +#: ../src/common/fuzzyclock.py:55 ../src/common/fuzzyclock.py:63 msgid "half past $0" msgstr "w pół do $1" -#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 +#: ../src/common/fuzzyclock.py:55 ../src/common/fuzzyclock.py:63 msgid "twenty five to $1" msgstr "pięć po wpół do $1" -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 +#: ../src/common/fuzzyclock.py:56 ../src/common/fuzzyclock.py:64 msgid "twenty to $1" msgstr "za dwadzieścia $1" -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 +#: ../src/common/fuzzyclock.py:56 ../src/common/fuzzyclock.py:64 msgid "quarter to $1" msgstr "za kwadrans $1" -#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +#: ../src/common/fuzzyclock.py:57 ../src/common/fuzzyclock.py:65 msgid "ten to $1" msgstr "za dziesięć $1" -#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +#: ../src/common/fuzzyclock.py:57 ../src/common/fuzzyclock.py:65 msgid "five to $1" msgstr "za pięć $1" -#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:61 +#: ../src/common/fuzzyclock.py:57 ../src/common/fuzzyclock.py:66 msgid "$1 o'clock" msgstr "godzina $1" -#: ../src/common/fuzzyclock.py:64 +#: ../src/common/fuzzyclock.py:69 msgid "Night" msgstr "Noc" -#: ../src/common/fuzzyclock.py:64 +#: ../src/common/fuzzyclock.py:69 msgid "Early morning" msgstr "Wczesny poranek" -#: ../src/common/fuzzyclock.py:64 +#: ../src/common/fuzzyclock.py:69 msgid "Morning" msgstr "rano" -#: ../src/common/fuzzyclock.py:64 +#: ../src/common/fuzzyclock.py:69 msgid "Almost noon" msgstr "Prawie południe" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:70 msgid "Noon" msgstr "w południe" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:70 msgid "Afternoon" msgstr "Popołudnie" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:70 msgid "Evening" msgstr "wieczorem" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:70 msgid "Late evening" msgstr "Późny wieczór" -#: ../src/common/fuzzyclock.py:67 +#: ../src/common/fuzzyclock.py:72 msgid "Start of week" msgstr "Początek tygodnia" -#: ../src/common/fuzzyclock.py:67 +#: ../src/common/fuzzyclock.py:72 msgid "Middle of week" msgstr "Środek tygodnia" -#: ../src/common/fuzzyclock.py:67 +#: ../src/common/fuzzyclock.py:72 msgid "End of week" msgstr "Koniec tygodnia" -#: ../src/common/fuzzyclock.py:68 +#: ../src/common/fuzzyclock.py:73 msgid "Weekend!" msgstr "Weekend!" -#: ../src/common/helpers.py:114 +#: ../src/common/helpers.py:120 msgid "Invalid character in username." msgstr "Niepoprawna litera w nazwie użytkownika." -#: ../src/common/helpers.py:119 +#: ../src/common/helpers.py:125 msgid "Server address required." msgstr "Wymagany adres serwera." -#: ../src/common/helpers.py:124 +#: ../src/common/helpers.py:130 msgid "Invalid character in hostname." msgstr "Niepoprawna litera w nazwie hosta." -#: ../src/common/helpers.py:130 +#: ../src/common/helpers.py:136 msgid "Invalid character in resource." msgstr "Niepoprawna litera w zasobach." #. GiB means gibibyte -#: ../src/common/helpers.py:170 +#: ../src/common/helpers.py:176 #, python-format msgid "%s GiB" -msgstr "%s·GiB" +msgstr "%s GiB" #. GB means gigabyte -#: ../src/common/helpers.py:173 +#: ../src/common/helpers.py:179 #, python-format msgid "%s GB" -msgstr "%s·GB" +msgstr "%s GB" #. MiB means mibibyte -#: ../src/common/helpers.py:177 +#: ../src/common/helpers.py:183 #, python-format msgid "%s MiB" -msgstr "%s·MiB" +msgstr "%s MiB" #. MB means megabyte -#: ../src/common/helpers.py:180 +#: ../src/common/helpers.py:186 #, python-format msgid "%s MB" -msgstr "%s·MB" +msgstr "%s MB" #. KiB means kibibyte -#: ../src/common/helpers.py:184 -#, python-format -msgid "%s KiB" -msgstr "%s·KiB" - -#. KB means kilo bytes -#: ../src/common/helpers.py:187 -#, python-format -msgid "%s KB" -msgstr "%s·KB" - -#. B means bytes #: ../src/common/helpers.py:190 #, python-format -msgid "%s B" -msgstr "%s·B" +msgid "%s KiB" +msgstr "%s KiB" -#: ../src/common/helpers.py:219 +#. KB means kilo bytes +#: ../src/common/helpers.py:193 +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#. B means bytes +#: ../src/common/helpers.py:196 +#, python-format +msgid "%s B" +msgstr "%s B" + +#: ../src/common/helpers.py:227 msgid "_Busy" msgstr "_Zajęty" -#: ../src/common/helpers.py:221 +#: ../src/common/helpers.py:229 msgid "Busy" msgstr "Zajęty" -#: ../src/common/helpers.py:224 +#: ../src/common/helpers.py:232 msgid "_Not Available" msgstr "Nie_obecny" -#: ../src/common/helpers.py:229 +#: ../src/common/helpers.py:237 msgid "_Free for Chat" msgstr "_Chętny do rozmowy" -#: ../src/common/helpers.py:231 +#: ../src/common/helpers.py:239 msgid "Free for Chat" msgstr "Chętny do rozmowy" -#: ../src/common/helpers.py:234 +#: ../src/common/helpers.py:242 msgid "_Available" msgstr "_Dostępny" -#: ../src/common/helpers.py:236 -msgid "Available" -msgstr "Dostępny" - -#: ../src/common/helpers.py:238 +#: ../src/common/helpers.py:246 msgid "Connecting" msgstr "Łączę się" -#: ../src/common/helpers.py:241 +#: ../src/common/helpers.py:249 msgid "A_way" msgstr "Zaraz _wracam" -#: ../src/common/helpers.py:246 +#: ../src/common/helpers.py:254 msgid "_Offline" msgstr "R_ozłączony" -#: ../src/common/helpers.py:248 +#: ../src/common/helpers.py:256 msgid "Offline" msgstr "Rozłączony" -#: ../src/common/helpers.py:251 +#: ../src/common/helpers.py:259 msgid "_Invisible" msgstr "N_iewidoczny" -#: ../src/common/helpers.py:257 +#: ../src/common/helpers.py:265 msgid "?contact has status:Unknown" msgstr "?contact ma status: Nieznany" -#: ../src/common/helpers.py:259 +#: ../src/common/helpers.py:267 msgid "?contact has status:Has errors" msgstr "?contact ma status: Wystąpiły błędy" -#: ../src/common/helpers.py:264 +#: ../src/common/helpers.py:272 msgid "?Subscription we already have:None" msgstr "?Posiadane autoryzacje: Brak" -#: ../src/common/helpers.py:266 +#: ../src/common/helpers.py:274 msgid "To" msgstr "Do" -#: ../src/common/helpers.py:270 +#: ../src/common/helpers.py:278 msgid "Both" msgstr "Obustronna" -#: ../src/common/helpers.py:278 +#: ../src/common/helpers.py:286 msgid "?Ask (for Subscription):None" msgstr "?Poproś (o autoryzację): Brak" -#: ../src/common/helpers.py:280 +#: ../src/common/helpers.py:288 msgid "Subscribe" msgstr "Autoryzuj" -#: ../src/common/helpers.py:289 +#: ../src/common/helpers.py:297 msgid "?Group Chat Contact Role:None" msgstr "?Funkcja kontaktu w pokoju: Brak" -#: ../src/common/helpers.py:292 +#: ../src/common/helpers.py:300 msgid "Moderators" msgstr "Moderatorzy" -#: ../src/common/helpers.py:294 +#: ../src/common/helpers.py:302 msgid "Moderator" msgstr "Moderator" -#: ../src/common/helpers.py:297 +#: ../src/common/helpers.py:305 msgid "Participants" msgstr "Uczestnicy" -#: ../src/common/helpers.py:299 +#: ../src/common/helpers.py:307 msgid "Participant" msgstr "Uczestnik" -#: ../src/common/helpers.py:302 +#: ../src/common/helpers.py:310 msgid "Visitors" msgstr "Goście" -#: ../src/common/helpers.py:304 +#: ../src/common/helpers.py:312 msgid "Visitor" msgstr "Gość" -#: ../src/common/helpers.py:310 +#: ../src/common/helpers.py:318 msgid "?Group Chat Contact Affiliation:None" msgstr "?Powiązanie kontaktu z czata: brak" -#: ../src/common/helpers.py:312 +#: ../src/common/helpers.py:320 msgid "Owner" msgstr "Właściciel" -#: ../src/common/helpers.py:314 +#: ../src/common/helpers.py:322 msgid "Administrator" msgstr "Administrator" -#: ../src/common/helpers.py:316 +#: ../src/common/helpers.py:324 msgid "Member" msgstr "Uczestnik" -#: ../src/common/helpers.py:355 +#: ../src/common/helpers.py:363 msgid "is paying attention to the conversation" msgstr "jest skupiony na rozmowie" -#: ../src/common/helpers.py:357 +#: ../src/common/helpers.py:365 msgid "is doing something else" msgstr "robi coś innego" -#: ../src/common/helpers.py:359 +#: ../src/common/helpers.py:367 msgid "is composing a message..." msgstr "pisze wiadomość..." #. paused means he or she was composing but has stopped for a while -#: ../src/common/helpers.py:362 +#: ../src/common/helpers.py:370 msgid "paused composing a message" msgstr "przerwał pisanie wiadomości" -#: ../src/common/helpers.py:364 +#: ../src/common/helpers.py:372 msgid "has closed the chat window or tab" msgstr "zamknął okno lub kartę rozmowy" -#: ../src/common/helpers.py:890 +#: ../src/common/helpers.py:931 ../src/common/helpers.py:938 #, python-format -msgid " %d unread message" -msgid_plural " %d unread messages" -msgstr[0] "%d nieprzeczytana wiadomość" -msgstr[1] "%d nieprzeczytane wiadomości" -msgstr[2] "Gajim - %d nieprzeczytane wiadomości" +msgid "%d message pending" +msgid_plural "%d messages pending" +msgstr[0] "%d oczekująca wiadomość" +msgstr[1] "%d oczekujące wiadomości" +msgstr[2] "%d oczekujących wiadomości" -#: ../src/common/helpers.py:896 +#: ../src/common/helpers.py:944 #, python-format -msgid " %d unread single message" -msgid_plural " %d unread single messages" -msgstr[0] "%d nieprzeczytana wiadomość" -msgstr[1] "%d nieprzeczytane wiadomości" -msgstr[2] "Gajim - %d nieprzeczytane wiadomości" +msgid " from room %s" +msgstr " z pokoju %s" -#: ../src/common/helpers.py:902 +#: ../src/common/helpers.py:947 ../src/common/helpers.py:966 #, python-format -msgid " %d unread group chat message" -msgid_plural " %d unread group chat messages" -msgstr[0] "%d nieprzeczytana wiadomość z czatu" -msgstr[1] "%d nieprzeczytane wiadomości z czatu" -msgstr[2] "Gajim - %d nieprzeczytane wiadomości" +msgid " from user %s" +msgstr " od użytkownika %s" -#: ../src/common/helpers.py:908 +#: ../src/common/helpers.py:949 #, python-format -msgid " %d unread private message" -msgid_plural " %d unread private messages" -msgstr[0] "%d nieprzeczytana wiadomość prywatna" -msgstr[1] "%d nieprzeczytane wiadomości prywatne" -msgstr[2] "Gajim - %d nieprzeczytane wiadomości" +msgid " from %s" +msgstr " od %s" -#: ../src/common/helpers.py:918 ../src/common/helpers.py:920 +#: ../src/common/helpers.py:956 ../src/common/helpers.py:963 +#, python-format +msgid "%d event pending" +msgid_plural "%d events pending" +msgstr[0] "%d oczekująca wiadomość" +msgstr[1] "%d oczekujące wiadomości" +msgstr[2] "%d oczekujących wiadomości" + +#: ../src/common/helpers.py:996 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" #. we talk about a file -#: ../src/common/optparser.py:59 +#: ../src/common/optparser.py:65 #, python-format msgid "error: cannot open %s for reading" msgstr "błąd: nie można otworzyć %s do odczytu" -#: ../src/common/optparser.py:181 -msgid "gtk+" -msgstr "gtk+" - -#: ../src/common/optparser.py:190 ../src/common/optparser.py:191 +#: ../src/common/optparser.py:214 ../src/common/optparser.py:215 msgid "cyan" msgstr "cyjan" -#: ../src/common/optparser.py:308 +#: ../src/common/optparser.py:331 msgid "migrating logs database to indices" msgstr "indeksowanie archiwum rozmów" -#: ../src/common/passwords.py:82 +#: ../src/common/passwords.py:88 #, python-format msgid "Gajim account %s" msgstr "Konto Gajim'a %s" -#: ../src/common/zeroconf/client_zeroconf.py:187 +#: ../src/common/zeroconf/client_zeroconf.py:140 +#: ../src/common/zeroconf/client_zeroconf.py:223 +msgid "Connection to host could not be established" +msgstr "Nie można ustanowić połączenia z hostem" + +#: ../src/common/zeroconf/client_zeroconf.py:197 msgid "" "Connection to host could not be established: Incorrect answer from server." msgstr "Nie można ustanowić połączenia z hostem. Nieprawidłowa odpowiedź." -#: ../src/common/zeroconf/client_zeroconf.py:215 -msgid "Connection to host could not be established" -msgstr "Nie można ustanowić połączenia z hostem" - -#: ../src/common/zeroconf/client_zeroconf.py:349 +#: ../src/common/zeroconf/client_zeroconf.py:357 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" "Nie można ustanowić połączenia z hostem. Timeout podczas wysyłania danych." -#: ../src/common/zeroconf/client_zeroconf.py:642 +#: ../src/common/zeroconf/client_zeroconf.py:643 msgid "Contact is offline. Your message could not be sent." msgstr "Kontakt jest rozłączony. Twoja wiadomość nie mogła zostać wysłana." -#: ../src/common/zeroconf/connection_zeroconf.py:203 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:243 +#, python-format +msgid "" +"The host %s you configured as the ft_add_hosts_to_send advanced option is " +"not valid, so ignored." +msgstr "" +"Nazwa hosta %s, którą określiłeś w opcji ft_add_hosts_to_send jest " +"niepoprawna, będzie więc ignorowana." + +#: ../src/common/zeroconf/connection_zeroconf.py:209 msgid "To continue sending and receiving messages, you will need to reconnect." msgstr "Aby dalej wysyłać i odbierać wiadomości musisz się ponownie połączyć." -#: ../src/common/zeroconf/connection_zeroconf.py:226 +#: ../src/common/zeroconf/connection_zeroconf.py:232 msgid "Avahi error" msgstr "Błąd Avahi" -#: ../src/common/zeroconf/connection_zeroconf.py:226 +#: ../src/common/zeroconf/connection_zeroconf.py:232 #, python-format msgid "" "%s\n" @@ -7066,31 +7765,31 @@ msgstr "" "%s\n" "Przesyłanie wiadomości między adresami link-local może nie działać poprawnie." -#: ../src/common/zeroconf/connection_zeroconf.py:237 +#: ../src/common/zeroconf/connection_zeroconf.py:243 msgid "Please check if Avahi is installed." msgstr "Proszę sprawdzić czy zainstalowano Avahi." -#: ../src/common/zeroconf/connection_zeroconf.py:246 -#: ../src/common/zeroconf/connection_zeroconf.py:250 +#: ../src/common/zeroconf/connection_zeroconf.py:252 +#: ../src/common/zeroconf/connection_zeroconf.py:256 msgid "Could not start local service" msgstr "Nie można uruchomić usługi lokalnej" -#: ../src/common/zeroconf/connection_zeroconf.py:247 +#: ../src/common/zeroconf/connection_zeroconf.py:253 #, python-format msgid "Unable to bind to port %d." msgstr "Nie można podłączyć się do portu %d." -#: ../src/common/zeroconf/connection_zeroconf.py:251 -#: ../src/common/zeroconf/connection_zeroconf.py:345 +#: ../src/common/zeroconf/connection_zeroconf.py:257 +#: ../src/common/zeroconf/connection_zeroconf.py:352 msgid "Please check if avahi-daemon is running." msgstr "Proszę sprawdzić czy uruchomiony jest demon Avahi." -#: ../src/common/zeroconf/connection_zeroconf.py:344 +#: ../src/common/zeroconf/connection_zeroconf.py:351 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Nie można zmienić statusu konta \"%s\"" -#: ../src/common/zeroconf/connection_zeroconf.py:361 +#: ../src/common/zeroconf/connection_zeroconf.py:368 msgid "" "You are not connected or not visible to others. Your message could not be " "sent." @@ -7099,15 +7798,265 @@ msgstr "" "mogła zostać wysłana." #. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:373 +#: ../src/common/zeroconf/connection_zeroconf.py:380 msgid "[This message is encrypted]" msgstr "[Ta wiadomość jest zaszyfrowana]" -#: ../src/common/zeroconf/zeroconf.py:180 +#: ../src/common/zeroconf/zeroconf_avahi.py:183 +#: ../src/common/zeroconf/zeroconf_bonjour.py:192 #, python-format msgid "Error while adding service. %s" msgstr "Błąd przy dodawaniu usługi %s" +#~ msgid "" +#~ "To continue, Gajim needs to access your stored secrets. Enter your " +#~ "passphrase" +#~ msgstr "" +#~ "Aby kontynuować, Gajim musi uzyskać dostęp do Twoich haseł. Proszę podać " +#~ "hasło główne" + +#~ msgid "Confirm Passphrase" +#~ msgstr "Potwierdź hasło" + +#~ msgid "Enter your new passphrase again for confirmation" +#~ msgstr "Wpisz ponownie nowe hasło" + +#~ msgid "Create Passphrase" +#~ msgstr "Utwórz hasło" + +#~ msgid "Passphrases did not match.\n" +#~ msgstr "Hasła nie zgadzają się.\n" + +#~ msgid "Gajim needs you to create a passphrase to encrypt stored secrets" +#~ msgstr "Proszę podać hasło główne służące do zaszyfrowania danych poufnych" + +#~ msgid "Build custom query" +#~ msgstr "Stwórz własne zapytanie" + +#~ msgid "" +#~ "Enter a contact jid or MUC jid here to view its history.\n" +#~ "If a contact is connected you can even enter his nick name.\n" +#~ msgstr "" +#~ "Wprowadź nazwę użytkownika z rostera lub czatu aby przejrzeć historię " +#~ "rozmów.\n" +#~ "Jeżeli jest połączony, możesz podać jego nazwę.\n" + +#~ msgid "Query Builder..." +#~ msgstr "Kreator zapytań..." + +#~ msgid "_Discover Services..." +#~ msgstr "_Wyszukuj usługi..." + +#~ msgid "_Retype Password:" +#~ msgstr "_Powtórz hasło:" + +#~ msgid "_Use proxy" +#~ msgstr "_Korzystaj z pośrednika" + +#~ msgid "Accounts" +#~ msgstr "Konta" + +#~ msgid "" +#~ "If checked, all local contacts that use a Bonjour compatible chat client " +#~ "(like iChat, Trillian or Gaim) will be shown in roster. You don't need to " +#~ "be connected to a jabber server for it to work.\n" +#~ "This is only available if python-avahi is installed and avahi-daemon is " +#~ "running." +#~ msgstr "" +#~ "Jeżeli opcja ta zostanie uaktywniona, znajdujące się w twojej sieci " +#~ "lokalnej kontakty używające klienta wykorzystującego technologię Bonjour " +#~ "(jak iChat, Trillian czy Gaim) pojawią się na rosterze. Nie musisz łączyć " +#~ "się z serwerem Jabbera, by z nimi rozmawiać." + +#~ msgid "" +#~ "If you have 2 or more accounts and this is checked, Gajim will list all " +#~ "contacts as if you had one account" +#~ msgstr "" +#~ "Jeśli masz dwa konta lub więcej, to dzięki tej opcji Gajim pokaże " +#~ "wszystkie kontakty w taki sposób, jakby było to jedno konto" + +#~ msgid "_Enable link-local messaging" +#~ msgstr "_Uaktywnij przesyłanie wiadomości do adresów link-local" + +#~ msgid "_Modify" +#~ msgstr "_Edytuj" + +#~ msgid "_Blocked Contacts" +#~ msgstr "_Kontakty zablokowane" + +#~ msgid "_Compact View Alt+C" +#~ msgstr "Widok _zwarty Alt+C" + +#~ msgid "Interface Customization" +#~ msgstr "Własne ustawienia interfejsu" + +#~ msgid "Also known as iChat style" +#~ msgstr "Znany także jako styl iChat" + +#~ msgid "Chat" +#~ msgstr "Rozmowa" + +#~ msgid "E_very 5 minutes" +#~ msgstr "Co 5 _minut" + +#~ msgid "" +#~ "Gajim will automatically show new events by popping up the relevant window" +#~ msgstr "" +#~ "Gajim automatycznie wyświetli nową wiadomość w nowym oknie lub w nowej " +#~ "karcie otwartego okna rozmowy" + +#~ msgid "" +#~ "Gajim will notify you for new events via a popup in the bottom right of " +#~ "the screen" +#~ msgstr "" +#~ "Gajim powiadomi Cię o nadejściu nowej wiadomości wyświetlając okienko w " +#~ "prawym dolnym rogu ekranu" + +#~ msgid "" +#~ "Gajim will notify you via a popup window in the bottom right of the " +#~ "screen about contacts that just signed in" +#~ msgstr "" +#~ "Gajim powiadomi automatycznie przy pomocy okna w prawym dolnym rogu o " +#~ "kontaktach, które zmieniają status na Dostępny" + +#~ msgid "" +#~ "Gajim will only change the icon of the contact that triggered the new " +#~ "event" +#~ msgstr "Gajim zmieni jedynie ikonę kontaktu, który przysłał nową wiadomość" + +#~ msgid "" +#~ "If checked, Gajim will remember the roster and chat window positions in " +#~ "the screen and the sizes of them next time you run it" +#~ msgstr "" +#~ "Zaznaczenie tej opcji spowoduje zapamiętanie położenia głównego okna " +#~ "programu na ekranie oraz jego rozmiaru" + +#~ msgid "On every _message" +#~ msgstr "W każdej _wiadomości" + +#~ msgid "Outgoing Chat state noti_fications:" +#~ msgstr "Wysyłanie powiadomienia o stanie _rozmowy:" + +#~ msgid "Print time:" +#~ msgstr "Wyświetlaj czas:" + +#~ msgid "Save _position and size for roster and chat windows" +#~ msgstr "Zapisz _pozycję i rozmiar okna kontaktów i okna rozmowy" + +#~ msgid "Show only in _roster" +#~ msgstr "Pokaż tylko _listę kontaktów" + +#~ msgid "Use t_rayicon (aka. notification area icon)" +#~ msgstr "_Ikona w obszarze powiadamiania" + +#~ msgid "" +#~ "When a new event (message, file transfer request etc..) is received, the " +#~ "following methods may be used to inform you about it. Please note that " +#~ "events about new messages only occur if it is a new message from a " +#~ "contact you are not already chatting with" +#~ msgstr "" +#~ "Kiedy pojawi się nowe zdarzenie (wiadomość, prośba o przesłanie pliku " +#~ "itp.), możesz zostać o tym powiadomiony na takie sposoby. UWAGA: Nowa " +#~ "wiadomość pojawia się jeśli nie pochodzi od osoby, z którą aktualnie " +#~ "rozmawiasz" + +#~ msgid "_Never" +#~ msgstr "_Nigdy" + +#~ msgid "_Notify me about it" +#~ msgstr "Powia_dom mnie o tym" + +#~ msgid "_Pop it up" +#~ msgstr "_Wyświetl" + +#~ msgid "Send cus_tom status" +#~ msgstr "Wyślij _odrębny status" + +#~ msgid "_Remove from Roster" +#~ msgstr "_Usuń z listy kontaktów" + +#~ msgid "_Filter:" +#~ msgstr "_Filtr:" + +#~ msgid "Click to force avatar" +#~ msgstr "Kliknij aby ustawić avatar" + +#~ msgid "" +#~ "If that is not your language for which you want to highlight misspelled " +#~ "words, then please set your $LANG as appropriate. Eg. for French do " +#~ "export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to " +#~ "make it global in /etc/profile.\n" +#~ "\n" +#~ "Highlighting misspelled words feature will not be used" +#~ msgstr "" +#~ "Jeśli podświetlanie błędów w pisowni działa dla niewłaściwego języka, to " +#~ "ustaw odpowiednio zmienną środowiskową $LANG. Np. dla języka polskiego " +#~ "wpisz export LANG=pl_PL do pliku ~/.bash_profile lub globalnie do pliku " +#~ "in /etc/profile.\n" +#~ "\n" +#~ "Podświedlanie błędów w pisowni nie będzie używane" + +#~ msgid "Every %s _minutes" +#~ msgstr "Co %s _minut" + +#~ msgid "You must enter a password for the new account." +#~ msgstr "Musisz wpisać hasło dla nowego konta." + +#~ msgid "Blocked Contacts for %s" +#~ msgstr "Kontakty zablokowane (dla %s)" + +#~ msgid "%s does not appear to be a valid JID" +#~ msgstr "%s nie wygląda na poprawny JID" + +#~ msgid "Drop %s in group %s" +#~ msgstr "Usuń %s z grupy %s" + +#~ msgid "Make %s and %s metacontacts" +#~ msgstr "Przekształć %s oraz %s w metakontakty" + +#~ msgid "Hides the buttons in two persons chat window." +#~ msgstr "Ukrywa przyciski podczas rozmowy dwóch osób." + +#~ msgid "Security error connecting to \"%s\"" +#~ msgstr "Błąd zabezpieczeń przy połączeniu z \"%s\"" + +#~ msgid "" +#~ "The server's key has changed, or someone is trying to hack your " +#~ "connection." +#~ msgstr "" +#~ "Zmienił się klucz twojego serwera lub ktoś próbuje podsłuchać połączenie." + +#~ msgid "Unable to check fingerprint for %s. Connection could be insecure." +#~ msgstr "" +#~ "Nie można sprawdzić odcisku klucza %s. Połączenie może nie być bezpieczne" + +#~ msgid "Missing fingerprint in SSL connection to %s" +#~ msgstr "Brak odcisku klucza w połączeniu SSL z %s" + +#~ msgid "Fingerprint mismatch for %s: Got %s, expected %s" +#~ msgstr "Niezgodność odcisku klucza %s. Oczekiwano %s, otrzymano %s" + +#~ msgid " %d unread single message" +#~ msgid_plural " %d unread single messages" +#~ msgstr[0] "%d nieprzeczytana wiadomość" +#~ msgstr[1] "%d nieprzeczytane wiadomości" +#~ msgstr[2] "Gajim - %d nieprzeczytane wiadomości" + +#~ msgid " %d unread group chat message" +#~ msgid_plural " %d unread group chat messages" +#~ msgstr[0] "%d nieprzeczytana wiadomość z czatu" +#~ msgstr[1] "%d nieprzeczytane wiadomości z czatu" +#~ msgstr[2] "Gajim - %d nieprzeczytane wiadomości" + +#~ msgid " %d unread private message" +#~ msgid_plural " %d unread private messages" +#~ msgstr[0] "%d nieprzeczytana wiadomość prywatna" +#~ msgstr[1] "%d nieprzeczytane wiadomości prywatne" +#~ msgstr[2] "Gajim - %d nieprzeczytane wiadomości" + +#~ msgid "gtk+" +#~ msgstr "gtk+" + #~ msgid "2003-12-13T18:30:02Z" #~ msgstr "2003-12-13T18:30:02Z" @@ -7177,9 +8126,6 @@ msgstr "Błąd przy dodawaniu usługi %s" #~ msgid "Role: " #~ msgstr "Funkcja: " -#~ msgid "Affiliation: " -#~ msgstr "Afiliacja: " - #~ msgid "" #~ "Sound to play when any MUC message arrives. (This setting is taken into " #~ "account only if notify_on_all_muc_messages is True)" diff --git a/po/pt_BR.po b/po/pt_BR.po index 6be0cf0d5..7a0015489 100644 --- a/po/pt_BR.po +++ b/po/pt_BR.po @@ -5,17 +5,17 @@ # # junix , 2005. # Gajim , 2007. -#: ../src/gajim-remote.py:203 ../src/gajim-remote.py:210 -#: ../src/gajim-remote.py:236 ../src/gajim-remote.py:237 -#: ../src/gajim-remote.py:243 ../src/gajim-remote.py:244 -#: ../src/gajim-remote.py:245 ../src/gajim-remote.py:246 +#: ../src/gajim-remote.py:220 ../src/gajim-remote.py:227 +#: ../src/gajim-remote.py:253 ../src/gajim-remote.py:254 +#: ../src/gajim-remote.py:260 ../src/gajim-remote.py:261 +#: ../src/gajim-remote.py:262 ../src/gajim-remote.py:263 msgid "" msgstr "" "Project-Id-Version: pt_BR\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-04-19 18:15+0200\n" -"PO-Revision-Date: 2007-04-19 12:44-0300\n" -"Last-Translator: Gajim \n" +"POT-Creation-Date: 2007-11-28 20:33+0100\n" +"PO-Revision-Date: 2007-11-28 11:55-0300\n" +"Last-Translator: Davidson Paulo \n" "Language-Team: Português Brasileiro \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -38,36 +38,36 @@ msgid "Jabber IM Client" msgstr "Cliente de IM Jabber" #: ../data/glade/account_context_menu.glade.h:1 -msgid "Send Single _Message..." -msgstr "Enviar _Mensagem Simples..." +#: ../data/glade/roster_window.glade.h:8 +msgid "Join _Group Chat..." +msgstr "_Entrar em uma Conferência..." #: ../data/glade/account_context_menu.glade.h:2 msgid "_Add Contact..." msgstr "_Adicionar Contato..." #: ../data/glade/account_context_menu.glade.h:3 -msgid "_Discover Services..." -msgstr "_Procurar Serviços..." +#: ../data/glade/roster_window.glade.h:15 +msgid "_Discover Services" +msgstr "_Descubra Serviços" #: ../data/glade/account_context_menu.glade.h:4 msgid "_Execute Command..." msgstr "_Executar Comando" #: ../data/glade/account_context_menu.glade.h:5 -#: ../data/glade/roster_window.glade.h:16 -#: ../data/glade/systray_context_menu.glade.h:6 -msgid "_Group Chat" -msgstr "_Conferência" +msgid "_Modify Account" +msgstr "_Alterar Conta" #: ../data/glade/account_context_menu.glade.h:6 -#: ../data/glade/zeroconf_context_menu.glade.h:1 -msgid "_Modify Account..." -msgstr "_Alterar Conta..." - -#: ../data/glade/account_context_menu.glade.h:7 msgid "_Open Gmail Inbox" msgstr "_Abrir Caixa de Entrada do Gmail" +#: ../data/glade/account_context_menu.glade.h:7 +#: ../data/glade/roster_window.glade.h:23 +msgid "_Start Chat..." +msgstr "_Iniciar Conversa..." + #: ../data/glade/account_context_menu.glade.h:8 #: ../data/glade/zeroconf_context_menu.glade.h:2 msgid "_Status" @@ -75,11 +75,11 @@ msgstr "_Status" #: ../data/glade/account_creation_wizard_window.glade.h:1 msgid "" -"Account is being created\n" +"Connecting to server\n" "\n" "Please wait..." msgstr "" -"Sua conta está sendo criada\n" +"Conectando ao servidor\n" "\n" "Por favor aguarde..." @@ -92,51 +92,68 @@ msgid "Please fill in the data for your new account" msgstr "Por favor preencha os dados da sua nova conta" #: ../data/glade/account_creation_wizard_window.glade.h:6 +msgid "Please select a server" +msgstr "Por favor, selecione um servidor" + +#: ../data/glade/account_creation_wizard_window.glade.h:7 msgid "Click to see features (like MSN, ICQ transports) of jabber servers" msgstr "" "Clique para ver os recursos do servidor jabber (como transportes MSN, ICQ, " "etc)" -#: ../data/glade/account_creation_wizard_window.glade.h:7 +#: ../data/glade/account_creation_wizard_window.glade.h:8 msgid "Connect when I press Finish" msgstr "Conectar quando eu clicar em Fim" -#: ../data/glade/account_creation_wizard_window.glade.h:8 +#: ../data/glade/account_creation_wizard_window.glade.h:9 msgid "Gajim: Account Creation Wizard" msgstr "Gajim: Assistente de Configuração de Conta" -#: ../data/glade/account_creation_wizard_window.glade.h:9 -msgid "I already have an account I want to use" -msgstr "Eu já tenho uma conta e quero usá-la" - #: ../data/glade/account_creation_wizard_window.glade.h:10 +msgid "I already have an account I want to _use" +msgstr "Eu já tenho uma conta e quero _usá-la" + +#: ../data/glade/account_creation_wizard_window.glade.h:11 msgid "I want to _register for a new account" msgstr "Eu quero _registrar uma nova conta" -#: ../data/glade/account_creation_wizard_window.glade.h:11 -#: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/account_creation_wizard_window.glade.h:12 +#: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/accounts_window.glade.h:23 msgid "If checked, Gajim will remember the password for this account" msgstr "Se marcado, o Gajim lembrará a senha para esta conta" -#: ../data/glade/account_creation_wizard_window.glade.h:12 -#: ../data/glade/manage_proxies_window.glade.h:7 -msgid "Pass_word:" -msgstr "_Senha:" - #: ../data/glade/account_creation_wizard_window.glade.h:13 -#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/account_modification_window.glade.h:26 +#: ../data/glade/accounts_window.glade.h:32 +msgid "Manage..." +msgstr "Gerenciar..." + +#: ../data/glade/account_creation_wizard_window.glade.h:14 +msgid "Prox_y:" +msgstr "Prox_y:" + +#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/accounts_window.glade.h:47 msgid "Save pass_word" msgstr "Salvar senha" -#: ../data/glade/account_creation_wizard_window.glade.h:14 +#: ../data/glade/account_creation_wizard_window.glade.h:16 msgid "Servers Features" msgstr "Recursos dos Servidores" -#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_creation_wizard_window.glade.h:17 msgid "Set my profile when I connect" msgstr "Configurar perfil quando eu conectar" -#: ../data/glade/account_creation_wizard_window.glade.h:16 +#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/accounts_window.glade.h:53 +msgid "Use custom hostname/port" +msgstr "Usa nome de máquina/porta customizados" + +#: ../data/glade/account_creation_wizard_window.glade.h:19 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." @@ -144,67 +161,63 @@ msgstr "" "Você precisa ter uma conta para conectar na\n" "rede Jabber." -#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_creation_wizard_window.glade.h:21 msgid "Your JID:" msgstr "Seu JID:" -#: ../data/glade/account_creation_wizard_window.glade.h:19 -#: ../data/glade/roster_window.glade.h:11 +#: ../data/glade/account_creation_wizard_window.glade.h:22 +#: ../data/glade/roster_window.glade.h:13 msgid "_Advanced" msgstr "_Avançado" -#: ../data/glade/account_creation_wizard_window.glade.h:20 +#: ../data/glade/account_creation_wizard_window.glade.h:23 msgid "_Finish" msgstr "_Concluir" -#: ../data/glade/account_creation_wizard_window.glade.h:21 -#: ../data/glade/manage_proxies_window.glade.h:10 -msgid "_Host:" -msgstr "_Computador:" +#: ../data/glade/account_creation_wizard_window.glade.h:24 +msgid "_Hostname:" +msgstr "_Nome do Computador:" -#: ../data/glade/account_creation_wizard_window.glade.h:22 -#: ../data/glade/account_modification_window.glade.h:49 +#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_modification_window.glade.h:50 +#: ../data/glade/accounts_window.glade.h:58 msgid "_Password:" msgstr "_Senha:" -#: ../data/glade/account_creation_wizard_window.glade.h:23 +#: ../data/glade/account_creation_wizard_window.glade.h:26 #: ../data/glade/manage_proxies_window.glade.h:11 msgid "_Port:" msgstr "_Porta:" -#: ../data/glade/account_creation_wizard_window.glade.h:24 -msgid "_Retype Password:" -msgstr "_Reescreva a Senha:" - -#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_creation_wizard_window.glade.h:27 msgid "_Server:" msgstr "_Servidor:" -#: ../data/glade/account_creation_wizard_window.glade.h:26 -msgid "_Use proxy" -msgstr "_Usar proxy" - -#: ../data/glade/account_creation_wizard_window.glade.h:27 +#: ../data/glade/account_creation_wizard_window.glade.h:28 #: ../data/glade/manage_proxies_window.glade.h:12 msgid "_Username:" msgstr "Nome de _usuário" #: ../data/glade/account_modification_window.glade.h:1 +#: ../data/glade/accounts_window.glade.h:1 #: ../data/glade/preferences_window.glade.h:8 msgid "Miscellaneous" msgstr "Diversos" #: ../data/glade/account_modification_window.glade.h:2 +#: ../data/glade/accounts_window.glade.h:2 #: ../data/glade/zeroconf_properties_window.glade.h:1 msgid "OpenPGP" msgstr "OpenPGP" #: ../data/glade/account_modification_window.glade.h:3 +#: ../data/glade/accounts_window.glade.h:3 #: ../data/glade/zeroconf_properties_window.glade.h:2 msgid "Personal Information" msgstr "Informações Pessoais" #: ../data/glade/account_modification_window.glade.h:4 +#: ../data/glade/accounts_window.glade.h:4 msgid "Account" msgstr "Conta" @@ -213,23 +226,28 @@ msgid "Account Modification" msgstr "Alteração da Conta" #: ../data/glade/account_modification_window.glade.h:6 +#: ../data/glade/accounts_window.glade.h:5 msgid "Administration operations" msgstr "Operações de administração" #: ../data/glade/account_modification_window.glade.h:7 +#: ../data/glade/accounts_window.glade.h:6 msgid "Auto-reconnect when connection is lost" msgstr "Reconectar automaticamente quando a conexão cair" #: ../data/glade/account_modification_window.glade.h:8 +#: ../data/glade/accounts_window.glade.h:7 #: ../data/glade/zeroconf_properties_window.glade.h:3 msgid "C_onnect on Gajim startup" msgstr "C_onectar na inicialização do Gajim" #: ../data/glade/account_modification_window.glade.h:9 +#: ../data/glade/accounts_window.glade.h:8 msgid "Chan_ge Password" msgstr "Alterar Senha" #: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/accounts_window.glade.h:9 msgid "" "Check this so Gajim will connect in port 5223 where legacy servers are " "expected to have SSL capabilities. Note that Gajim uses TLS encryption by " @@ -242,42 +260,60 @@ msgstr "" "TLS será desabilitado" #: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/accounts_window.glade.h:10 #: ../data/glade/zeroconf_properties_window.glade.h:4 msgid "Choose _Key..." msgstr "_Escolha a chave..." #: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/accounts_window.glade.h:11 msgid "Click to change account's password" msgstr "Clique para mudar a senha da conta" #: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/accounts_window.glade.h:12 +msgid "Click to request authorization to all contacts of another account" +msgstr "" +"Clique para requisitar autorização para todos os contatos de outra conta" + +#: ../data/glade/account_modification_window.glade.h:14 +#: ../data/glade/accounts_window.glade.h:13 msgid "Connection" msgstr "Conexão" -#: ../data/glade/account_modification_window.glade.h:14 +#: ../data/glade/account_modification_window.glade.h:15 +#: ../data/glade/accounts_window.glade.h:15 msgid "Edit Personal Information..." msgstr "Editar detalhes pessoais..." -#: ../data/glade/account_modification_window.glade.h:15 -#: ../data/glade/roster_window.glade.h:5 ../src/notify.py:458 -#: ../src/notify.py:480 ../src/notify.py:492 ../src/common/helpers.py:914 +#. No configured account +#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/accounts_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:6 ../src/notify.py:489 +#: ../src/notify.py:520 ../src/notify.py:532 ../src/common/helpers.py:998 +#: ../src/common/helpers.py:1010 msgid "Gajim" msgstr "Gajim" -#: ../data/glade/account_modification_window.glade.h:16 -#: ../data/glade/preferences_window.glade.h:51 +#. General group cannot be changed +#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/accounts_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:45 #: ../data/glade/zeroconf_properties_window.glade.h:7 -#: ../src/roster_window.py:347 ../src/roster_window.py:1225 -#: ../src/roster_window.py:1435 ../src/roster_window.py:2114 -#: ../src/roster_window.py:2156 ../src/common/contacts.py:284 +#: ../src/roster_window.py:372 ../src/roster_window.py:637 +#: ../src/roster_window.py:1384 ../src/roster_window.py:1760 +#: ../src/roster_window.py:2147 ../src/roster_window.py:2661 +#: ../src/roster_window.py:2779 ../src/common/contacts.py:314 msgid "General" msgstr "Geral" -#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/accounts_window.glade.h:20 msgid "Hostname: " msgstr "Nome do Computador:" -#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/accounts_window.glade.h:21 msgid "" "If checked, Gajim will also broadcast some more IPs except from just your " "IP, so file transfer has higher chances of working." @@ -286,7 +322,8 @@ msgstr "" "então a transferência de arquivo tem grandes possibilidades de executar " "corretamente." -#: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/accounts_window.glade.h:24 msgid "" "If checked, Gajim will send keep-alive packets to prevent connection timeout " "which results in disconnection" @@ -294,7 +331,7 @@ msgstr "" "Se marcado, o Gajim enviará pacotes keep-alive para prevenir timeout na " "conexão, fazendo-a cair" -#: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/account_modification_window.glade.h:22 #: ../data/glade/zeroconf_properties_window.glade.h:8 msgid "" "If checked, Gajim will store the password in ~/.gajim/config with 'read' " @@ -303,7 +340,8 @@ msgstr "" "Se checado, o Gajim gravará sua senha em ~/.gajim/config com permissão de " "'leitura' somente para você" -#: ../data/glade/account_modification_window.glade.h:22 +#: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/accounts_window.glade.h:25 #: ../data/glade/zeroconf_properties_window.glade.h:9 msgid "" "If checked, Gajim, when launched, will automatically connect to jabber using " @@ -312,7 +350,8 @@ msgstr "" "Se marcado, o Gajim, quando carregado, conectará automaticamente ao jabber " "usando esta conta" -#: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/account_modification_window.glade.h:24 +#: ../data/glade/accounts_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:10 msgid "" "If checked, any change to the global status (handled by the combobox at the " @@ -322,46 +361,50 @@ msgstr "" "Se marcada, o status deste cliente será alterado de acordo com qualquer " "mudança no status global (definido pela caixa no fundo da janela da lista)" -#: ../data/glade/account_modification_window.glade.h:24 +#: ../data/glade/account_modification_window.glade.h:25 +#: ../data/glade/accounts_window.glade.h:29 msgid "Information about you, as stored in the server" msgstr "Informações sobre você são gravadas no servidor" -#: ../data/glade/account_modification_window.glade.h:25 -msgid "Manage..." -msgstr "Gerenciar..." - -#: ../data/glade/account_modification_window.glade.h:26 -#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1623 -#: ../src/config.py:3301 +#: ../data/glade/account_modification_window.glade.h:27 +#: ../data/glade/accounts_window.glade.h:34 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1551 +#: ../src/config.py:2028 msgid "No key selected" msgstr "Nenhuma chave selecionada" #. None means no proxy profile selected #. GPG Key -#: ../data/glade/account_modification_window.glade.h:28 ../src/config.py:1196 -#: ../src/config.py:1201 ../src/config.py:1385 ../src/config.py:1613 -#: ../src/config.py:1622 ../src/config.py:1682 ../src/config.py:1756 -#: ../src/config.py:3291 ../src/config.py:3300 ../src/dialogs.py:281 -#: ../src/dialogs.py:283 ../src/roster_window.py:1539 -#: ../src/roster_window.py:1546 ../src/roster_window.py:1553 +#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/accounts_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:32 ../src/config.py:1142 +#: ../src/config.py:1213 ../src/config.py:1460 ../src/config.py:1465 +#: ../src/config.py:1926 ../src/config.py:2013 ../src/config.py:2027 +#: ../src/config.py:3109 ../src/config.py:3155 ../src/dialogs.py:344 +#: ../src/dialogs.py:346 ../src/roster_window.py:1864 +#: ../src/roster_window.py:1871 ../src/roster_window.py:1878 msgid "None" msgstr "Nenhum" -#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/accounts_window.glade.h:37 #: ../data/glade/profile_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:17 msgid "Personal Information" msgstr "Informações Pessoais" -#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/accounts_window.glade.h:38 msgid "Port: " msgstr "Porta:" -#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/accounts_window.glade.h:39 msgid "Priori_ty:" msgstr "_Prioridade" -#: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/accounts_window.glade.h:40 msgid "" "Priority is used in Jabber to determine who gets the events from the jabber " "server when two or more clients are connected using the same account; The " @@ -371,19 +414,23 @@ msgstr "" "servidor jabber quando dois ou mais clientes estão conectados usando a mesma " "conta; O cliente com a maior prioridade receberá os eventos" -#: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/accounts_window.glade.h:41 msgid "Priority will change automatically according to your status." msgstr "A prioridade será alterada automaticamente de acordo com o seu status" -#: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/account_modification_window.glade.h:35 +#: ../data/glade/accounts_window.glade.h:42 msgid "Proxy:" msgstr "Proxy:" -#: ../data/glade/account_modification_window.glade.h:35 +#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/accounts_window.glade.h:44 msgid "Resour_ce:" msgstr "Recur_so:" -#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/accounts_window.glade.h:45 msgid "" "Resource is sent to the Jabber server in order to separate the same JID in " "two or more parts depending on the number of the clients connected in the " @@ -397,95 +444,137 @@ msgstr "" "conta com o recurso 'Casa' e 'Trabalho' ao mesmo tempo. O recurso que " "possuir a maior prioridade receberá os eventos. (veja abaixo)" -#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/account_modification_window.glade.h:38 #: ../data/glade/zeroconf_properties_window.glade.h:18 msgid "Save _passphrase (insecure)" msgstr "Salvar _frase de acesso (inseguro)" -#: ../data/glade/account_modification_window.glade.h:38 +#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/accounts_window.glade.h:46 #: ../data/glade/zeroconf_properties_window.glade.h:19 msgid "Save conversation _logs for all contacts" msgstr "Salvar histórico para todos os contatos desta conta" -#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/accounts_window.glade.h:48 msgid "Send keep-alive packets" msgstr "Enviar pacotes para manter a conexão (keep-alive)" -#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/account_modification_window.glade.h:42 +#: ../data/glade/accounts_window.glade.h:49 #: ../data/glade/zeroconf_properties_window.glade.h:20 msgid "Synch_ronize account status with global status" msgstr "_Sincronizar status da conta com status global" -#: ../data/glade/account_modification_window.glade.h:42 +#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/accounts_window.glade.h:50 +#: ../data/glade/synchronise_contacts_dialog.glade.h:2 +#: ../data/glade/synchronise_select_account_dialog.glade.h:2 msgid "Synchronise contacts" msgstr "Sincronizar contatos" -#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/accounts_window.glade.h:52 msgid "Use _SSL (legacy)" msgstr "Usar _SSL (obsoleto, apenas para servidores antigos)" -#: ../data/glade/account_modification_window.glade.h:44 -msgid "Use custom hostname/port" -msgstr "Usa nome de máquina/porta customizados" - -#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/account_modification_window.glade.h:46 +#: ../data/glade/accounts_window.glade.h:55 msgid "Use file transfer proxies" msgstr "Usa proxies de transferência de arquivos" -#: ../data/glade/account_modification_window.glade.h:46 +#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/accounts_window.glade.h:56 msgid "_Adjust to status" msgstr "Ajustar para status" -#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/account_modification_window.glade.h:48 +#: ../data/glade/accounts_window.glade.h:57 msgid "_Jabber ID:" msgstr "_Jabber ID:" -#: ../data/glade/account_modification_window.glade.h:48 +#: ../data/glade/account_modification_window.glade.h:49 msgid "_Name:" msgstr "_Nome:" -#: ../data/glade/accounts_window.glade.h:1 -msgid "Accounts" -msgstr "Contas" +#: ../data/glade/accounts_window.glade.h:14 +#: ../data/glade/profile_window.glade.h:11 +#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/zeroconf_information_window.glade.h:2 +#: ../data/glade/zeroconf_properties_window.glade.h:5 +msgid "E-Mail:" +msgstr "E-Mail:" -#: ../data/glade/accounts_window.glade.h:2 +#. XML Console enable checkbutton +#: ../data/glade/accounts_window.glade.h:16 +#: ../data/glade/xml_console_window.glade.h:4 +msgid "Enable" +msgstr "Habilitar" + +#: ../data/glade/accounts_window.glade.h:17 +#: ../data/glade/zeroconf_information_window.glade.h:3 +#: ../data/glade/zeroconf_properties_window.glade.h:6 +msgid "First Name:" +msgstr "Primeiro nome:" + +#: ../data/glade/accounts_window.glade.h:22 +msgid "If checked, Gajim will get the password from a GPG agent like seahorse" +msgstr "Se marcado, o Gajim obterá a senha de um agente GPG como o Seahorse" + +#: ../data/glade/accounts_window.glade.h:27 +#: ../data/glade/zeroconf_properties_window.glade.h:11 msgid "" -"If checked, all local contacts that use a Bonjour compatible chat client " -"(like iChat, Trillian or Gaim) will be shown in roster. You don't need to be " -"connected to a jabber server for it to work.\n" -"This is only available if python-avahi is installed and avahi-daemon is " -"running." +"If the default port that is used for incoming messages is unfitting for your " +"setup you can select another one here.\n" +"You might consider to change possible firewall settings." msgstr "" -"Se marcado, todos os contatos locais que usam um cliente de chat compatível " -"com o Bonjour (como iChat, Trillian ou Gaim) serão mostrados na lista. Você " -"não precisa estar conectado a um servidor jabber para que ele funcione.\n" -" Isto só está disponível se o python-avahi estiver instalado e o serviço " -"avahi-daemon estiver rodando." +"Se a porta padrão usada para recebimento de mensagens não for adequada você " +"pode selecionar outra aqui.\n" +"Considere a possível modificação das regras do seu firewall. " -#: ../data/glade/accounts_window.glade.h:4 -msgid "" -"If you have 2 or more accounts and this is checked, Gajim will list all " -"contacts as if you had one account" -msgstr "" -"Se você tiver duas ou mais contas e isto estiver marcado, o Gajim listará " -"todos os contatos como se você tivesse somente uma única conta" +#: ../data/glade/accounts_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/zeroconf_information_window.glade.h:4 +#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:511 +msgid "Jabber ID:" +msgstr "Jabber ID:" -#: ../data/glade/accounts_window.glade.h:5 +#: ../data/glade/accounts_window.glade.h:31 +#: ../data/glade/zeroconf_information_window.glade.h:5 +#: ../data/glade/zeroconf_properties_window.glade.h:14 +msgid "Last Name:" +msgstr "Último nome:" + +#: ../data/glade/accounts_window.glade.h:33 msgid "Mer_ge accounts" msgstr "Mes_clar contas" -#: ../data/glade/accounts_window.glade.h:6 -msgid "_Enable link-local messaging" -msgstr "_Ativar mensagens \"link-local\"" +#. Rename +#: ../data/glade/accounts_window.glade.h:43 ../src/roster_window.py:2731 +msgid "Re_name" +msgstr "Re_nomear" -#: ../data/glade/accounts_window.glade.h:7 -msgid "_Modify" -msgstr "_Modificar" +#: ../data/glade/accounts_window.glade.h:51 +msgid "Use GPG _Agent" +msgstr "Usar o _Agente GPG" -#: ../data/glade/accounts_window.glade.h:8 -#: ../data/glade/remove_account_window.glade.h:4 -msgid "_Remove" -msgstr "_Remover" +#: ../data/glade/accounts_window.glade.h:54 +#: ../data/glade/zeroconf_properties_window.glade.h:21 +msgid "Use custom port:" +msgstr "Usar servidor/porta personalizado" + +#: ../data/glade/accounts_window.glade.h:59 +msgid "gtk-add" +msgstr "gtk-add" + +#: ../data/glade/accounts_window.glade.h:60 +#: ../data/glade/features_window.glade.h:4 +msgid "gtk-close" +msgstr "gtk-close" + +#: ../data/glade/accounts_window.glade.h:61 +msgid "gtk-remove" +msgstr "gtk-remove" #: ../data/glade/add_new_contact_window.glade.h:1 msgid "A_ccount:" @@ -580,6 +669,7 @@ msgid "This jabber entity does not expose any commands." msgstr "Esta entidade jabber não expõe quaisquer comandos." #: ../data/glade/advanced_configuration_window.glade.h:1 +#: ../data/glade/features_window.glade.h:1 msgid "Description" msgstr "Descrição" @@ -606,45 +696,41 @@ msgid "Deletes Message of the Day" msgstr "Excluir Mensagem do Dia" #: ../data/glade/advanced_menuitem_menu.glade.h:3 +msgid "Edit _Privacy Lists..." +msgstr "Editar Listas de _Privacidade..." + +#: ../data/glade/advanced_menuitem_menu.glade.h:4 msgid "Sends a message to users currently connected to this server" msgstr "" "Envia uma mensagem para os usuários atualmente conectados a este servidor" -#: ../data/glade/advanced_menuitem_menu.glade.h:4 -msgid "Set MOTD" -msgstr "Configurar MOTD" - #: ../data/glade/advanced_menuitem_menu.glade.h:5 +msgid "Set MOTD..." +msgstr "Definir MOTD..." + +#: ../data/glade/advanced_menuitem_menu.glade.h:6 msgid "Sets Message of the Day" msgstr "Configurar Mensagem do Dia" -#: ../data/glade/advanced_menuitem_menu.glade.h:6 +#: ../data/glade/advanced_menuitem_menu.glade.h:7 msgid "Show _XML Console" msgstr "Mostrar console _XML" -#: ../data/glade/advanced_menuitem_menu.glade.h:7 -msgid "Update MOTD" -msgstr "Atualizar MOTD" - #: ../data/glade/advanced_menuitem_menu.glade.h:8 +msgid "Update MOTD..." +msgstr "Atualizar MOTD..." + +#: ../data/glade/advanced_menuitem_menu.glade.h:9 msgid "Updates Message of the Day" msgstr "Atualizar Mensagem do Dia" -#: ../data/glade/advanced_menuitem_menu.glade.h:9 +#: ../data/glade/advanced_menuitem_menu.glade.h:10 msgid "_Administrator" msgstr "_Administrador" -#: ../data/glade/advanced_menuitem_menu.glade.h:10 -msgid "_Privacy Lists" -msgstr "_Listas de Privacidade" - #: ../data/glade/advanced_menuitem_menu.glade.h:11 -msgid "_Send Server Message" -msgstr "_Enviar Mensagem pelo Servidor" - -#: ../data/glade/advanced_menuitem_menu.glade.h:12 -msgid "_Send Single Message" -msgstr "_Enviar uma Mensagem Simples" +msgid "_Send Server Message..." +msgstr "_Enviar Mensagem de Servidor..." #: ../data/glade/advanced_notifications_window.glade.h:1 msgid " a window/tab opened with that contact " @@ -659,7 +745,7 @@ msgid "Conditions" msgstr "Condições" #: ../data/glade/advanced_notifications_window.glade.h:4 -#: ../data/glade/preferences_window.glade.h:10 +#: ../data/glade/preferences_window.glade.h:12 msgid "Sounds" msgstr "Sons" @@ -676,7 +762,7 @@ msgid "All statuses" msgstr "Totos os status" #: ../data/glade/advanced_notifications_window.glade.h:8 -#: ../src/common/commands.py:91 ../src/common/helpers.py:243 +#: ../src/common/commands.py:96 ../src/common/helpers.py:255 msgid "Away" msgstr "Afastado" @@ -693,7 +779,7 @@ msgid "Have " msgstr "Possui" #: ../data/glade/advanced_notifications_window.glade.h:12 -#: ../src/common/helpers.py:253 +#: ../src/common/helpers.py:265 msgid "Invisible" msgstr "Invisível" @@ -702,7 +788,7 @@ msgid "Launch a command" msgstr "Executar um comando" #: ../data/glade/advanced_notifications_window.glade.h:14 -#: ../src/common/helpers.py:226 +#: ../src/common/helpers.py:238 msgid "Not Available" msgstr "Não Disponível" @@ -828,6 +914,10 @@ msgstr "Novo evento recebido" msgid "You have received new entry:" msgstr "Você recebeu uma nova entrada:" +#: ../data/glade/blocked_contacts_window.glade.h:1 +msgid "Blocked Contacts" +msgstr "Contatos Bloqueados" + #: ../data/glade/change_password_dialog.glade.h:1 msgid "Change Password" msgstr "Alterar Senha" @@ -857,11 +947,9 @@ msgid "Join _Group Chat" msgstr "_Entrar em uma Conferência" #: ../data/glade/chat_context_menu.glade.h:2 -#: ../data/glade/chat_control_popup_menu.glade.h:5 -#: ../data/glade/gc_occupants_menu.glade.h:2 -#: ../data/glade/roster_contact_context_menu.glade.h:10 -msgid "_Add to Roster" -msgstr "_Adicionar à Lista" +#: ../data/glade/roster_contact_context_menu.glade.h:12 +msgid "_Add to Roster..." +msgstr "_Adicionar à Lista..." #: ../data/glade/chat_context_menu.glade.h:3 msgid "_Copy JID/Email Address" @@ -880,7 +968,6 @@ msgid "_Open Link in Browser" msgstr "_Visualizar no Navegador" #: ../data/glade/chat_context_menu.glade.h:7 -#: ../data/glade/roster_window.glade.h:20 #: ../data/glade/subscription_request_popup_menu.glade.h:1 #: ../data/glade/systray_context_menu.glade.h:7 msgid "_Start Chat" @@ -891,33 +978,62 @@ msgid "Click to see past conversations with this contact" msgstr "Clique para ver o histórico de conversas com este contato" #: ../data/glade/chat_control_popup_menu.glade.h:2 -#, fuzzy -msgid "Ping" -msgstr "Comendo" +msgid "Invite _Contacts" +msgstr "Convidar _Contatos" #: ../data/glade/chat_control_popup_menu.glade.h:3 -#: ../data/glade/roster_contact_context_menu.glade.h:8 +#: ../data/glade/gc_occupants_menu.glade.h:3 #: ../data/glade/zeroconf_contact_context_menu.glade.h:4 msgid "Send _File" msgstr "Enviar _Arquivo" #: ../data/glade/chat_control_popup_menu.glade.h:4 +msgid "Toggle End to End Encryption" +msgstr "Alternar para Criptografia End to End" + +#: ../data/glade/chat_control_popup_menu.glade.h:5 msgid "Toggle Open_PGP Encryption" msgstr "Ativar criptografia Open_PGP" #: ../data/glade/chat_control_popup_menu.glade.h:6 -#: ../data/glade/gc_control_popup_menu.glade.h:6 -msgid "_Compact View Alt+C" -msgstr "Visão _Compacta Alt+C" +#: ../data/glade/gc_occupants_menu.glade.h:4 +msgid "_Add to Roster" +msgstr "_Adicionar à Lista" #: ../data/glade/chat_control_popup_menu.glade.h:7 -#: ../data/glade/gc_control_popup_menu.glade.h:8 -#: ../data/glade/gc_occupants_menu.glade.h:5 -#: ../data/glade/roster_contact_context_menu.glade.h:13 +#: ../data/glade/gc_control_popup_menu.glade.h:7 +#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/roster_window.glade.h:19 #: ../data/glade/zeroconf_contact_context_menu.glade.h:6 +#: ../src/roster_window.py:2600 msgid "_History" msgstr "_Histórico" +#: ../data/glade/chat_to_muc_window.glade.h:1 +msgid "In_vite" +msgstr "Con_vidar" + +#: ../data/glade/chat_to_muc_window.glade.h:2 +msgid "Invite Friends !" +msgstr "Convidar Amigos!" + +#: ../data/glade/chat_to_muc_window.glade.h:3 +msgid "MUC server" +msgstr "Servidor MUC" + +#: ../data/glade/chat_to_muc_window.glade.h:4 +msgid "Please select a MUC server." +msgstr "Por favor, selecione um servidor MUC." + +#: ../data/glade/chat_to_muc_window.glade.h:5 +msgid "" +"You are going to begin a Multi-User Chat.\n" +"Select the contacts you want to invite" +msgstr "" +"Você está prestes a iniciar uma Conversa Multi-Usuário (MUC).\n" +"Selecione os contatos que você quer convidar" + #: ../data/glade/data_form_window.glade.h:1 msgid "Fill in the form." msgstr "Preencha o formulário." @@ -930,6 +1046,14 @@ msgstr "Configuração da Sala" msgid "Edit Groups" msgstr "Editar Grupos" +#: ../data/glade/features_window.glade.h:2 +msgid "List of possible features in Gajim:" +msgstr "Listas dos possíveis recursos do Gajim:" + +#: ../data/glade/features_window.glade.h:3 +msgid "Features" +msgstr "Recursos" + #: ../data/glade/filetransfers.glade.h:1 msgid "A list of active, completed and stopped file transfers" msgstr "Uma lista de transferências de arquivo ativas, completadas e paradas" @@ -985,7 +1109,7 @@ msgstr "" msgid "When a file transfer is complete show a popup notification" msgstr "Mostrar um alerta visual quanto uma transferência de arquivo terminar" -#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:761 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:790 msgid "_Continue" msgstr "_Continuar" @@ -993,7 +1117,7 @@ msgstr "_Continuar" msgid "_Notify me when a file transfer is complete" msgstr "_Notificar-me quando a transmissão do arquivo terminar" -#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:188 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:191 msgid "_Open Containing Folder" msgstr "_Abrir pasta do arquivo" @@ -1082,62 +1206,70 @@ msgid "_Background:" msgstr "Cor _de fundo" #: ../data/glade/gc_control_popup_menu.glade.h:1 -msgid "Change _Nickname" -msgstr "Mudar _Apelido" +msgid "Change _Nickname..." +msgstr "Alterar _Apelido..." #: ../data/glade/gc_control_popup_menu.glade.h:2 -msgid "Change _Subject" -msgstr "Mudar _Assunto" +msgid "Change _Subject..." +msgstr "Alterar _Assunto..." #: ../data/glade/gc_control_popup_menu.glade.h:3 msgid "Click to see past conversation in this room" msgstr "Clique para ver o histórico de conversas nesta sala" #: ../data/glade/gc_control_popup_menu.glade.h:4 -msgid "Configure _Room" -msgstr "Configurar _Sala" +msgid "Configure _Room..." +msgstr "Configurar _Sala..." #: ../data/glade/gc_control_popup_menu.glade.h:5 -msgid "_Bookmark This Room" -msgstr "Adicionar esta Sala ao _Bookmark" +msgid "_Bookmark" +msgstr "_Favoritos" -#: ../data/glade/gc_control_popup_menu.glade.h:7 -msgid "_Destroy room" -msgstr "_Excluir sala" +#: ../data/glade/gc_control_popup_menu.glade.h:6 +msgid "_Destroy Room" +msgstr "_Excluir Sala" + +#: ../data/glade/gc_control_popup_menu.glade.h:8 +msgid "_Manage Room" +msgstr "_Gerenciar Sala" + +#: ../data/glade/gc_control_popup_menu.glade.h:9 +msgid "_Minimize on close" +msgstr "_Minimizar ao fechar" #: ../data/glade/gc_occupants_menu.glade.h:1 msgid "Mo_derator" msgstr "Mo_derador" -#: ../data/glade/gc_occupants_menu.glade.h:3 +#: ../data/glade/gc_occupants_menu.glade.h:2 +msgid "Occupant Actions" +msgstr "Ações de Ocupante" + +#: ../data/glade/gc_occupants_menu.glade.h:5 msgid "_Admin" msgstr "_Administração" -#: ../data/glade/gc_occupants_menu.glade.h:4 +#: ../data/glade/gc_occupants_menu.glade.h:6 msgid "_Ban" msgstr "_Banir" -#: ../data/glade/gc_occupants_menu.glade.h:6 +#: ../data/glade/gc_occupants_menu.glade.h:8 msgid "_Kick" msgstr "_Chutar" -#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/gc_occupants_menu.glade.h:9 msgid "_Member" msgstr "_Membro" -#: ../data/glade/gc_occupants_menu.glade.h:8 -msgid "_Occupant Actions" -msgstr "Ações de _Ocupantes" - -#: ../data/glade/gc_occupants_menu.glade.h:9 +#: ../data/glade/gc_occupants_menu.glade.h:10 msgid "_Owner" msgstr "D_ono" -#: ../data/glade/gc_occupants_menu.glade.h:10 +#: ../data/glade/gc_occupants_menu.glade.h:11 msgid "_Send Private Message" msgstr "_Enviar Mensagem Privada" -#: ../data/glade/gc_occupants_menu.glade.h:11 +#: ../data/glade/gc_occupants_menu.glade.h:12 msgid "_Voice" msgstr "_Voz" @@ -1145,13 +1277,13 @@ msgstr "_Voz" msgid "Create new post" msgstr "Criar nova postagem" -#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:268 +#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:280 msgid "From" msgstr "De" #. holds subject -#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:142 -#: ../src/history_manager.py:173 +#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:147 +#: ../src/history_manager.py:178 msgid "Subject" msgstr "Assunto" @@ -1191,30 +1323,54 @@ msgid "_Search Database" msgstr "_Buscar no Bando de Dados" #: ../data/glade/history_window.glade.h:1 -msgid "Build custom query" -msgstr "Gerar consulta customizada" +msgid "History Viewer" +msgstr "Visualizador de Histórico" #: ../data/glade/history_window.glade.h:2 +msgid "JID Selection" +msgstr "Seleção de JID" + +#: ../data/glade/history_window.glade.h:3 +msgid "" +"Choose the chatlog you want to view. \n" +"Enter the jid of a groupchat or a contact here. For online accounts you can " +"even enter a a contact's nickname." +msgstr "" +"Selecione o registro de conversa que você quer ver. \n" +"Entre com o JID de uma sala ou contato aqui. Para contas online você sempre " +"entra com o apelido do contato." + +#: ../data/glade/history_window.glade.h:5 ../src/history_window.py:224 msgid "Conversation History" msgstr "Histórico de Conversação" -#: ../data/glade/history_window.glade.h:3 -msgid "Query Builder..." -msgstr "Gerador de consultas..." +#: ../data/glade/history_window.glade.h:6 +msgid "" +"Current History\n" +"All Chat Histories" +msgstr "" +"Histórico Atual\n" +"Históricos de Todas as Conversas" -#: ../data/glade/history_window.glade.h:4 +#: ../data/glade/history_window.glade.h:8 +#: ../data/glade/search_window.glade.h:2 msgid "Search" msgstr "Buscar" -#: ../data/glade/history_window.glade.h:5 +#: ../data/glade/history_window.glade.h:9 #: ../data/glade/zeroconf_information_window.glade.h:10 msgid "_Log conversation history" msgstr "_Histórico de Conversação" -#: ../data/glade/history_window.glade.h:6 ../src/disco.py:1177 +#: ../data/glade/history_window.glade.h:10 +#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1182 msgid "_Search" msgstr "_Buscar" +#: ../data/glade/history_window.glade.h:11 +msgid "in" +msgstr "em" + #: ../data/glade/invitation_received_dialog.glade.h:1 msgid "Accept" msgstr "Aceitar" @@ -1228,7 +1384,7 @@ msgstr "Negar" msgid "Invitation Received" msgstr "Convite Recebido" -#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1208 +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1385 msgid "Join Group Chat" msgstr "Ingressar numa conferência" @@ -1237,14 +1393,14 @@ msgid "Join this room automatically when I connect" msgstr "Entra nesta sala automaticamente quando eu conectar" #: ../data/glade/join_groupchat_window.glade.h:3 -#: ../data/glade/manage_bookmarks_window.glade.h:4 +#: ../data/glade/manage_bookmarks_window.glade.h:5 #: ../data/glade/profile_window.glade.h:24 -#: ../data/glade/vcard_information_window.glade.h:29 +#: ../data/glade/vcard_information_window.glade.h:31 msgid "Nickname:" msgstr "Apelido:" #: ../data/glade/join_groupchat_window.glade.h:4 -#: ../data/glade/manage_bookmarks_window.glade.h:5 +#: ../data/glade/manage_bookmarks_window.glade.h:6 msgid "Password:" msgstr "Senha:" @@ -1253,12 +1409,12 @@ msgid "Recently:" msgstr "Recentemente:" #: ../data/glade/join_groupchat_window.glade.h:6 -#: ../data/glade/manage_bookmarks_window.glade.h:7 +#: ../data/glade/manage_bookmarks_window.glade.h:8 msgid "Room:" msgstr "Sala:" -#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1165 -#: ../src/disco.py:1615 +#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1170 +#: ../src/disco.py:1625 msgid "_Join" msgstr "_Ingressar" @@ -1279,15 +1435,19 @@ msgstr "" msgid "Manage Bookmarks" msgstr "Gerenciar Bookmarks" -#: ../data/glade/manage_bookmarks_window.glade.h:6 +#: ../data/glade/manage_bookmarks_window.glade.h:4 +msgid "Minimize on Auto Join" +msgstr "Minimizar ao Entrar Automaticamente" + +#: ../data/glade/manage_bookmarks_window.glade.h:7 msgid "Print status:" msgstr "Imprimir status:" -#: ../data/glade/manage_bookmarks_window.glade.h:8 +#: ../data/glade/manage_bookmarks_window.glade.h:9 msgid "Server:" msgstr "Servidor:" -#: ../data/glade/manage_bookmarks_window.glade.h:9 +#: ../data/glade/manage_bookmarks_window.glade.h:10 msgid "Title:" msgstr "Título:" @@ -1313,10 +1473,14 @@ msgstr "Gerenciar Perfis de Proxy" #: ../data/glade/manage_proxies_window.glade.h:6 #: ../data/glade/profile_window.glade.h:23 -#: ../data/glade/vcard_information_window.glade.h:28 +#: ../data/glade/vcard_information_window.glade.h:30 msgid "Name:" msgstr "Nome:" +#: ../data/glade/manage_proxies_window.glade.h:7 +msgid "Pass_word:" +msgstr "_Senha:" + #: ../data/glade/manage_proxies_window.glade.h:8 msgid "Type:" msgstr "Tipo:" @@ -1325,17 +1489,22 @@ msgstr "Tipo:" msgid "Use authentication" msgstr "Usar autenticação" +#: ../data/glade/manage_proxies_window.glade.h:10 +msgid "_Host:" +msgstr "_Computador:" + #: ../data/glade/message_window.glade.h:1 msgid "Click to insert an emoticon (Alt+M)" msgstr "Clique para inserir um emoticon (Alt+M)" -#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1129 +#: ../data/glade/message_window.glade.h:2 ../src/chat_control2.py:1257 +#: ../src/chat_control.py:1268 msgid "OpenPGP Encryption" msgstr "Criptografia OpenPGP" #. 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:4 -#: ../data/glade/roster_window.glade.h:10 +#: ../data/glade/roster_window.glade.h:12 #: ../data/glade/subscription_request_window.glade.h:6 msgid "_Actions" msgstr "_Ações" @@ -1343,7 +1512,7 @@ msgstr "_Ações" #. 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:6 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:245 +#: ../src/filetransfers_window.py:252 msgid "_Send" msgstr "_Enviar" @@ -1359,36 +1528,48 @@ msgstr "Editor de Configurações Avançadas" msgid "Applications" msgstr "Aplicações" +#: ../data/glade/preferences_window.glade.h:3 +msgid "Chat Appearance" +msgstr "Aparência da Conversa" + #. a header for custom browser/client/file manager. so translate sth like: Custom Settings -#: ../data/glade/preferences_window.glade.h:4 +#: ../data/glade/preferences_window.glade.h:5 msgid "Custom" msgstr "Customizar" -#: ../data/glade/preferences_window.glade.h:5 +#: ../data/glade/preferences_window.glade.h:6 msgid "Format of a line" msgstr "Formato da linha" -#: ../data/glade/preferences_window.glade.h:6 +#: ../data/glade/preferences_window.glade.h:7 msgid "GMail Options" msgstr "Opções do Gmail" -#: ../data/glade/preferences_window.glade.h:7 -msgid "Interface Customization" -msgstr "Customização de interface" - #: ../data/glade/preferences_window.glade.h:9 msgid "Preset Status Messages" msgstr "Mensagens de Status Disponíveis" +#: ../data/glade/preferences_window.glade.h:10 +msgid "Privacy" +msgstr "Privacidade" + #: ../data/glade/preferences_window.glade.h:11 +msgid "Roster Appearance" +msgstr "Aparência da Lista" + +#: ../data/glade/preferences_window.glade.h:13 +msgid "Themes" +msgstr "Tema" + +#: ../data/glade/preferences_window.glade.h:14 msgid "Visual Notifications" msgstr "Notificações Visuais" -#: ../data/glade/preferences_window.glade.h:12 +#: ../data/glade/preferences_window.glade.h:15 msgid "Advanced" msgstr "Avançado" -#: ../data/glade/preferences_window.glade.h:13 +#: ../data/glade/preferences_window.glade.h:16 msgid "" "All chat states\n" "Composing only\n" @@ -1398,24 +1579,20 @@ msgstr "" "Escrevendo somente\n" "Desabilitado" -#: ../data/glade/preferences_window.glade.h:16 +#: ../data/glade/preferences_window.glade.h:19 msgid "Allow _OS information to be sent" msgstr "Permitir o envio de informações do _SO " -#: ../data/glade/preferences_window.glade.h:17 +#: ../data/glade/preferences_window.glade.h:20 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "" "Permite janela/notificação quando eu estou _afastado/NA/ocupado/invisível" -#: ../data/glade/preferences_window.glade.h:18 -msgid "Also known as iChat style" -msgstr "Conhecido também como estilo iChat" - -#: ../data/glade/preferences_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:21 msgid "Always check to see if Gajim is the _default Jabber client on startup" msgstr "Sempre verificar ao iniciar se o Gajim é o cliente Jabber padrão" -#: ../data/glade/preferences_window.glade.h:20 +#: ../data/glade/preferences_window.glade.h:22 msgid "" "An example: If you have enabled status message for away, Gajim won't ask you " "anymore for a status message when you change your status to away; it will " @@ -1425,24 +1602,25 @@ msgstr "" "Gajim não perguntará mais por uma mensagem de status quando você mudá-lo " "para afastado, ele usará o padrão definido aqui" -#: ../data/glade/preferences_window.glade.h:21 +#: ../data/glade/preferences_window.glade.h:23 msgid "Ask status message when I:" msgstr "Solicite uma mensagem de status quanto eu:" -#: ../data/glade/preferences_window.glade.h:22 +#: ../data/glade/preferences_window.glade.h:24 msgid "Auto _away after:" msgstr "Marcar como _afastado depois:" -#: ../data/glade/preferences_window.glade.h:23 +#: ../data/glade/preferences_window.glade.h:25 msgid "Auto _not available after:" msgstr "Marcar como _afastado depois:" -#: ../data/glade/preferences_window.glade.h:24 +#: ../data/glade/preferences_window.glade.h:26 +#, fuzzy msgid "" "Autodetect on every Gajim startup\n" "Always use GNOME default applications\n" "Always use KDE default applications\n" -"Always use XFCE4 default applications\n" +"Always use Xfce default applications\n" "Custom" msgstr "" "Auto-detectar ao abrir o Gajim\n" @@ -1450,11 +1628,7 @@ msgstr "" "Sempre usar aplicações no padrão KDE\n" "Personalizar" -#: ../data/glade/preferences_window.glade.h:29 -msgid "Chat" -msgstr "Conversa" - -#: ../data/glade/preferences_window.glade.h:30 +#: ../data/glade/preferences_window.glade.h:31 msgid "" "Check this option, only if someone you don't have in the roster spams/annoys " "you. Use with caution, because it blocks all messages from any contact that " @@ -1465,18 +1639,14 @@ msgstr "" "mensagens de qualquer contato que você não possuir na sua lista e queria lhe " "enviar uma mensagem" -#: ../data/glade/preferences_window.glade.h:31 +#: ../data/glade/preferences_window.glade.h:32 msgid "Configure color and font of the interface" msgstr "Configurar cores e fontes da interface" -#: ../data/glade/preferences_window.glade.h:32 +#: ../data/glade/preferences_window.glade.h:33 msgid "Default Status Messages" msgstr "Mensagens de Status Padrão" -#: ../data/glade/preferences_window.glade.h:33 -msgid "Default status _iconset:" -msgstr "_Conjunto de Ícones de status padrão:" - #: ../data/glade/preferences_window.glade.h:34 msgid "" "Determined by sender\n" @@ -1500,22 +1670,14 @@ msgid "Display status _messages of contacts in roster" msgstr "Mostrar _mensagem de status da lista de contato" #: ../data/glade/preferences_window.glade.h:40 -msgid "Displayed Chat state noti_fications:" -msgstr "Noti_ficações do status da conversa exibidas:" - -#: ../data/glade/preferences_window.glade.h:41 -msgid "E_very 5 minutes" -msgstr "De 5 _em 5 minutos" - -#: ../data/glade/preferences_window.glade.h:42 msgid "Emoticons:" msgstr "Emoticons:" -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:41 msgid "Events" msgstr "Eventos" -#: ../data/glade/preferences_window.glade.h:44 +#: ../data/glade/preferences_window.glade.h:42 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 " @@ -1525,7 +1687,7 @@ msgstr "" "que você pode ter com um contato. Aqui você pode especificar quais " "caracteres você quer para enviar a outra parte." -#: ../data/glade/preferences_window.glade.h:45 +#: ../data/glade/preferences_window.glade.h:43 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 " @@ -1535,30 +1697,7 @@ msgstr "" "você pode ter com um contato. Aqui você pode especificar quais caracteres " "você quer para enviar a outra parte." -#: ../data/glade/preferences_window.glade.h:46 -msgid "" -"Gajim will automatically show new events by popping up the relevant window" -msgstr "" -"O Gajim automaticamente mostrará novos eventos em uma janela saltando sobre " -"a janela relevante" - -#: ../data/glade/preferences_window.glade.h:47 -msgid "" -"Gajim will notify you for new events via a popup in the bottom right of the " -"screen" -msgstr "" -"Gajim notificará você de uma novo evento via uma alerta visual na lateral " -"inferior direita da tela" - -#: ../data/glade/preferences_window.glade.h:48 -msgid "" -"Gajim will notify you via a popup window in the bottom right of the screen " -"about contacts that just signed in" -msgstr "" -"Gajim notificará você através de um alerta visual na parte inferior direita " -"da tela sobre os contatos que se conectaram" - -#: ../data/glade/preferences_window.glade.h:49 +#: ../data/glade/preferences_window.glade.h:44 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1566,12 +1705,11 @@ msgstr "" "Gajim notificará você através de um alerta visual na parte inferior direita " "da tela sobre os contatos que se desconectaram" -#: ../data/glade/preferences_window.glade.h:50 -msgid "" -"Gajim will only change the icon of the contact that triggered the new event" -msgstr "Gajim mudará somente o ícone do contato que provocou o evento novo" +#: ../data/glade/preferences_window.glade.h:46 +msgid "Hides buttons in chatwindows to " +msgstr "Esconder os botões nas janelas de conversa em" -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:47 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" @@ -1579,7 +1717,7 @@ msgstr "" "Se marcado, o Gajim também incluirá informação sobre o remetente de novos " "emails" -#: ../data/glade/preferences_window.glade.h:53 +#: ../data/glade/preferences_window.glade.h:48 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1587,7 +1725,7 @@ msgstr "" "Se marcado, Gajim mostrará avatars dos contatos na janela da lista e na " "conferência" -#: ../data/glade/preferences_window.glade.h:54 +#: ../data/glade/preferences_window.glade.h:49 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -1595,15 +1733,7 @@ msgstr "" "Se marcado, Gajim indicará mensagens de status dos contatos sob o nome do " "contato na janela da lista e na conferência" -#: ../data/glade/preferences_window.glade.h:55 -msgid "" -"If checked, Gajim will remember the roster and chat window positions in the " -"screen and the sizes of them next time you run it" -msgstr "" -"Se marcado, o Gajim lembrará a posição e tamanho da janela principal na " -"próxima vez que você executa-lo" - -#: ../data/glade/preferences_window.glade.h:56 +#: ../data/glade/preferences_window.glade.h:50 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, " @@ -1613,7 +1743,7 @@ msgstr "" "exemplo, um contato do MSN terá o ícone equivalente do MSN para o status " "conectado, ausente, ocupado, etc....)" -#: ../data/glade/preferences_window.glade.h:57 +#: ../data/glade/preferences_window.glade.h:51 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" @@ -1621,15 +1751,15 @@ msgstr "" "Se habilitado, Gajim substituirá o ascii para smilies, como ':)' com a " "animação equivalente ou estático emoticons gráfico" -#: ../data/glade/preferences_window.glade.h:58 +#: ../data/glade/preferences_window.glade.h:52 msgid "Ignore rich content in incoming messages" msgstr "Ignorar conteúdo formatado nas mensagens recebidas." -#: ../data/glade/preferences_window.glade.h:59 +#: ../data/glade/preferences_window.glade.h:53 msgid "Ma_nage..." msgstr "Gere_nciar..." -#: ../data/glade/preferences_window.glade.h:60 +#: ../data/glade/preferences_window.glade.h:54 msgid "" "Never\n" "Always\n" @@ -1641,60 +1771,54 @@ msgstr "" "Por conta\n" "Por tipo" -#: ../data/glade/preferences_window.glade.h:64 -msgid "Notify me about contacts that: " -msgstr "Notifique-me sobre contatos ao: " +#: ../data/glade/preferences_window.glade.h:58 +msgid "Notify me about contacts that sign _in" +msgstr "Notifique-me sobre contatos ao _conectar" -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:59 +msgid "Notify me about contacts that sign _out" +msgstr "Notifique-me sobre contatos ao _desconectar" + +#: ../data/glade/preferences_window.glade.h:60 msgid "Notify on new _GMail email" msgstr "Notificar cada nova mensagem do _Gmail" -#: ../data/glade/preferences_window.glade.h:66 -msgid "On every _message" -msgstr "Em todas as _mensagens" - -#: ../data/glade/preferences_window.glade.h:67 -msgid "One message _window:" -msgstr "Uma _janela de mensagem" - -#: ../data/glade/preferences_window.glade.h:68 -msgid "Outgoing Chat state noti_fications:" -msgstr "Enviar noti_ficações do status da conversa:" - -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:61 msgid "Play _sounds" msgstr "Tocar _Sons" -#: ../data/glade/preferences_window.glade.h:70 +#: ../data/glade/preferences_window.glade.h:62 +msgid "" +"Pop it up\n" +"Notify me about it\n" +"Show only in roster" +msgstr "" +"Mostrar em um pop-up\n" +"Notificar-me sobre\n" +"Mostra apenas na lista" + +#: ../data/glade/preferences_window.glade.h:65 msgid "Preferences" msgstr "Preferências" -#: ../data/glade/preferences_window.glade.h:71 -msgid "Print time:" -msgstr "Imprimir tempo:" +#: ../data/glade/preferences_window.glade.h:66 +msgid "Privacy" +msgstr "Privacidade" -#: ../data/glade/preferences_window.glade.h:72 -msgid "Save _position and size for roster and chat windows" -msgstr "Salvar _posição e tamanho das janelas de conversa e lista de contatos" - -#: ../data/glade/preferences_window.glade.h:73 +#: ../data/glade/preferences_window.glade.h:67 msgid "Set status message to reflect currently playing _music track" msgstr "" "Definir a mensagem de status de acordo com a música que estiver sendo tocada." -#: ../data/glade/preferences_window.glade.h:74 -msgid "Show only in _roster" -msgstr "Mostre somente na _lista" - -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:68 msgid "Sign _in" msgstr "_Conectar" -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:69 msgid "Sign _out" msgstr "_Desconectar" -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:70 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." @@ -1702,55 +1826,47 @@ msgstr "" "Algumas mensagens podem incluir conteúdo rico (formatação, cores etc). Se " "marcado, o Gajim apenas mostrará as mensagens em texto puro." -#: ../data/glade/preferences_window.glade.h:78 +#: ../data/glade/preferences_window.glade.h:71 msgid "Status" msgstr "Status" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:72 +msgid "Status _iconset:" +msgstr "_Conjunto de ícones de status:" + +#: ../data/glade/preferences_window.glade.h:73 msgid "T_heme:" msgstr "_Tema:" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:74 msgid "The auto away status message" msgstr "A mensagem de status para o ausente automático" -#: ../data/glade/preferences_window.glade.h:81 +#: ../data/glade/preferences_window.glade.h:75 msgid "The auto not available status message" msgstr "A mensagem de status para o afastado automático" -#: ../data/glade/preferences_window.glade.h:82 +#: ../data/glade/preferences_window.glade.h:76 msgid "Treat all incoming messages as:" msgstr "Tratar todas as mensagens recebidas como:" -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:77 msgid "Use _transports iconsets" msgstr "Usar conjunto de ícones de _transportes" -#: ../data/glade/preferences_window.glade.h:84 +#: ../data/glade/preferences_window.glade.h:78 +msgid "Use only one message _window:" +msgstr "Usar apenas uma _janela de mensagem:" + +#: ../data/glade/preferences_window.glade.h:79 msgid "Use system _default" msgstr "Usar o _padrão do sistema" -#: ../data/glade/preferences_window.glade.h:85 -msgid "Use t_rayicon (aka. notification area icon)" -msgstr "Usar ícone na bandeja (também conhecido por área de notificação)" +#: ../data/glade/preferences_window.glade.h:80 +msgid "When new event is received:" +msgstr "Quando novo evento é recebido:" -#: ../data/glade/preferences_window.glade.h:86 -msgid "" -"When a new event (message, file transfer request etc..) is received, the " -"following methods may be used to inform you about it. Please note that " -"events about new messages only occur if it is a new message from a contact " -"you are not already chatting with" -msgstr "" -"Quando um evento novo (mensagem, pedido etc. de transferência de arquivo, " -"etc.) é recebido, os seguintes métodos podem ser usados para informá-lo " -"sobre ele. Por favor, note que os eventos sobre mensagens novas ocorrem " -"somente se for uma mensagem nova de um contato que você não está conversando" - -#: ../data/glade/preferences_window.glade.h:87 -msgid "When new event is received" -msgstr "Quando novo evento é recebido" - -#: ../data/glade/preferences_window.glade.h:88 +#: ../data/glade/preferences_window.glade.h:81 msgid "" "Works for Rhythmbox and Muine players. For more players, please visit http://" "trac.gajim.org/wiki/GajimAndMusicPlayer" @@ -1758,83 +1874,83 @@ msgstr "" "Funciona para os reprodutores Rhythmbox e Muine. Para mais reprodutores, por " "favor visite a página http://trac.gajim.org/wiki/GajimAndMusicPlayer" -#: ../data/glade/preferences_window.glade.h:89 +#: ../data/glade/preferences_window.glade.h:82 msgid "_Advanced Notifications Control..." msgstr "Controle _Avançado de Notificações..." -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:83 msgid "_Browser:" msgstr "_Navegar:" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:84 +msgid "_Display chat state notifications:" +msgstr "_Mostrar notificações de status de conversa:" + +#: ../data/glade/preferences_window.glade.h:85 msgid "_File manager:" msgstr "_Gerenciamento de arquivos:" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:86 msgid "_Font:" msgstr "_Fonte:" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:87 msgid "_Highlight misspelled words" msgstr "_Destacar palavras mal escritas" -#: ../data/glade/preferences_window.glade.h:94 +#: ../data/glade/preferences_window.glade.h:88 msgid "_Ignore events from contacts not in the roster" msgstr "_Ignore eventos de contatos que não estejam na minha lista" -#: ../data/glade/preferences_window.glade.h:95 +#: ../data/glade/preferences_window.glade.h:89 msgid "_Incoming message:" msgstr "Mensagem _recebida:" -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:90 msgid "_Log status changes of contacts" msgstr "_Log mudanças de status dos contatos" -#: ../data/glade/preferences_window.glade.h:97 +#: ../data/glade/preferences_window.glade.h:91 msgid "_Mail client:" msgstr "_Cliente de email:" -#: ../data/glade/preferences_window.glade.h:98 -msgid "_Never" -msgstr "_Nunca" +#: ../data/glade/preferences_window.glade.h:92 +msgid "_Make message windows compact" +msgstr "_Tornar a janela de mensagem compacta" -#: ../data/glade/preferences_window.glade.h:99 -msgid "_Notify me about it" -msgstr "_Notifique-me sobre isto" - -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:93 msgid "_Open..." msgstr "_Abrir..." -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:94 msgid "_Outgoing message:" msgstr "Mensagem _enviada:" -#: ../data/glade/preferences_window.glade.h:102 +#: ../data/glade/preferences_window.glade.h:95 msgid "_Player:" msgstr "_Tocador de som:" -#: ../data/glade/preferences_window.glade.h:103 -msgid "_Pop it up" -msgstr "_Alerta visual" - -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:96 msgid "_Reset to Default Colors" msgstr "Voltar para as Cores _Padrões" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:97 +msgid "_Send chat state notifications:" +msgstr "_Enviar notificações de status de conversa:" + +#: ../data/glade/preferences_window.glade.h:98 msgid "_Sort contacts by status" msgstr "_Ordena contatos pelo status" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:99 msgid "_Status message:" msgstr "_Mensagem de status:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:100 msgid "_URL:" msgstr "_URL:" -#: ../data/glade/preferences_window.glade.h:108 +#: ../data/glade/preferences_window.glade.h:101 msgid "minutes" msgstr "minutos" @@ -1878,7 +1994,7 @@ msgstr "Jabber ID" msgid "Order:" msgstr "Ordem:" -#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2052 +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2258 msgid "Privacy List" msgstr "Lista de Privacidade" @@ -1953,110 +2069,103 @@ msgid "Company:" msgstr "Empresa:" #: ../data/glade/profile_window.glade.h:9 -#: ../data/glade/vcard_information_window.glade.h:13 +#: ../data/glade/vcard_information_window.glade.h:14 msgid "Country:" msgstr "País:" #: ../data/glade/profile_window.glade.h:10 -#: ../data/glade/vcard_information_window.glade.h:14 +#: ../data/glade/vcard_information_window.glade.h:15 msgid "Department:" msgstr "Departamento:" -#: ../data/glade/profile_window.glade.h:11 -#: ../data/glade/vcard_information_window.glade.h:15 -#: ../data/glade/zeroconf_information_window.glade.h:2 -#: ../data/glade/zeroconf_properties_window.glade.h:5 -msgid "E-Mail:" -msgstr "E-Mail:" - #: ../data/glade/profile_window.glade.h:12 -#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/vcard_information_window.glade.h:17 msgid "Extra Address:" msgstr "Complemento:" #. Family Name #: ../data/glade/profile_window.glade.h:14 -#: ../data/glade/vcard_information_window.glade.h:18 +#: ../data/glade/vcard_information_window.glade.h:19 msgid "Family:" msgstr "Família:" #. Do NOT change sequence. Just translate YYYY and MM and DD (from Year, Month, Day accordingly) #: ../data/glade/profile_window.glade.h:16 -#: ../data/glade/vcard_information_window.glade.h:20 +#: ../data/glade/vcard_information_window.glade.h:21 msgid "Format: YYYY-MM-DD" msgstr "Formato: YYYY-MM-DD" -#. Given Name -#: ../data/glade/profile_window.glade.h:18 +#: ../data/glade/profile_window.glade.h:17 #: ../data/glade/vcard_information_window.glade.h:22 +msgid "Full Name" +msgstr "Nome Completo" + +#. Given Name +#: ../data/glade/profile_window.glade.h:19 +#: ../data/glade/vcard_information_window.glade.h:24 msgid "Given:" msgstr "Nome:" -#: ../data/glade/profile_window.glade.h:19 -#: ../data/glade/vcard_information_window.glade.h:23 +#: ../data/glade/profile_window.glade.h:20 +#: ../data/glade/vcard_information_window.glade.h:25 msgid "Homepage:" msgstr "Homepage:" #. Middle Name -#: ../data/glade/profile_window.glade.h:21 -#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/profile_window.glade.h:22 +#: ../data/glade/vcard_information_window.glade.h:28 msgid "Middle:" msgstr "Nome do meio:" -#: ../data/glade/profile_window.glade.h:22 -#: ../data/glade/vcard_information_window.glade.h:27 -msgid "More" -msgstr "Mais" - #: ../data/glade/profile_window.glade.h:25 -#: ../data/glade/vcard_information_window.glade.h:31 +#: ../data/glade/vcard_information_window.glade.h:34 msgid "Personal Info" msgstr "Informações Pessoais" #: ../data/glade/profile_window.glade.h:27 -#: ../data/glade/vcard_information_window.glade.h:32 +#: ../data/glade/vcard_information_window.glade.h:35 msgid "Phone No.:" msgstr "Telefone:" #: ../data/glade/profile_window.glade.h:28 -#: ../data/glade/vcard_information_window.glade.h:33 +#: ../data/glade/vcard_information_window.glade.h:36 msgid "Position:" msgstr "Cargo:" #: ../data/glade/profile_window.glade.h:29 -#: ../data/glade/vcard_information_window.glade.h:34 +#: ../data/glade/vcard_information_window.glade.h:37 msgid "Postal Code:" msgstr "Código Postal:" #. Prefix in Name #: ../data/glade/profile_window.glade.h:31 -#: ../data/glade/vcard_information_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:39 msgid "Prefix:" msgstr "Prefixo:" #: ../data/glade/profile_window.glade.h:32 -#: ../data/glade/vcard_information_window.glade.h:38 ../src/vcard.py:257 +#: ../data/glade/vcard_information_window.glade.h:41 ../src/vcard.py:307 msgid "Role:" msgstr "Função:" #: ../data/glade/profile_window.glade.h:33 -#: ../data/glade/vcard_information_window.glade.h:39 +#: ../data/glade/vcard_information_window.glade.h:42 msgid "State:" msgstr "Estado:" #: ../data/glade/profile_window.glade.h:34 -#: ../data/glade/vcard_information_window.glade.h:41 +#: ../data/glade/vcard_information_window.glade.h:44 msgid "Street:" msgstr "Rua:" #. Suffix in Name #: ../data/glade/profile_window.glade.h:36 -#: ../data/glade/vcard_information_window.glade.h:45 +#: ../data/glade/vcard_information_window.glade.h:48 msgid "Suffix:" msgstr "Sobrenome:" #: ../data/glade/profile_window.glade.h:37 -#: ../data/glade/vcard_information_window.glade.h:46 +#: ../data/glade/vcard_information_window.glade.h:50 msgid "Work" msgstr "Trabalho" @@ -2072,136 +2181,180 @@ msgstr "Remover conta _somente do Gajim" msgid "Remove account from Gajim and from _server" msgstr "Remover conta do Gajim e do _servidor" +#. Remove +#. Remove group +#. Remove +#: ../data/glade/remove_account_window.glade.h:4 +#: ../data/glade/roster_contact_context_menu.glade.h:18 +#: ../src/roster_window.py:2557 ../src/roster_window.py:2767 +#: ../src/roster_window.py:2903 +msgid "_Remove" +msgstr "_Remover" + #: ../data/glade/roster_contact_context_menu.glade.h:1 msgid "A_sk to see his/her status" msgstr "Pe_ça para ver o status dele/dela" #: ../data/glade/roster_contact_context_menu.glade.h:2 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:1 -msgid "Add Special _Notification" -msgstr "Adicionar Notificações Visuais" +msgid "Add Special _Notification..." +msgstr "Adicionar _Notificação Especial..." #: ../data/glade/roster_contact_context_menu.glade.h:3 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:2 -msgid "Assign Open_PGP Key" -msgstr "Atribuir chave OpenPGP" +msgid "Assign Open_PGP Key..." +msgstr "Atribuir Chave Open_PGP..." #: ../data/glade/roster_contact_context_menu.glade.h:4 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:3 -#: ../src/roster_window.py:2078 -msgid "Edit _Groups" -msgstr "Editar _Grupos" +msgid "Edit _Groups..." +msgstr "Editar _Grupos..." +#. Execute Command #: ../data/glade/roster_contact_context_menu.glade.h:5 -#: ../src/roster_window.py:2213 +#: ../src/roster_window.py:2860 msgid "Execute Command..." msgstr "Executar Comando..." +#. Invite to Groupchat #: ../data/glade/roster_contact_context_menu.glade.h:6 -#: ../src/roster_window.py:2036 +#: ../src/roster_window.py:2473 msgid "In_vite to" msgstr "Con_vidar para" +#. Send Custom Status #: ../data/glade/roster_contact_context_menu.glade.h:7 -#: ../data/glade/systray_context_menu.glade.h:2 -msgid "Send Single _Message" -msgstr "Enviar _Mensagem Simples" +#: ../src/roster_window.py:2697 ../src/roster_window.py:2831 +msgid "Send Cus_tom Status" +msgstr "Enviar Status Perso_nalizado" + +#: ../data/glade/roster_contact_context_menu.glade.h:8 +msgid "Send Single _Message..." +msgstr "Enviar _Mensagem Simples..." #: ../data/glade/roster_contact_context_menu.glade.h:9 +msgid "Send _File..." +msgstr "Enviar _Arquivo..." + +#: ../data/glade/roster_contact_context_menu.glade.h:10 +msgid "Set Custom _Avatar..." +msgstr "Definir _Avatar Personalizado..." + +#: ../data/glade/roster_contact_context_menu.glade.h:11 #: ../data/glade/zeroconf_contact_context_menu.glade.h:5 msgid "Start _Chat" msgstr "Iniciar conversa" -#: ../data/glade/roster_contact_context_menu.glade.h:11 +#: ../data/glade/roster_contact_context_menu.glade.h:13 msgid "_Allow him/her to see my status" msgstr "_Permitir que ele/ela veja meu status" -#: ../data/glade/roster_contact_context_menu.glade.h:12 +#: ../data/glade/roster_contact_context_menu.glade.h:14 +#: ../src/roster_window.py:2547 ../src/roster_window.py:2758 +msgid "_Block" +msgstr "_Bloquear" + +#: ../data/glade/roster_contact_context_menu.glade.h:15 msgid "_Forbid him/her to see my status" msgstr "_Proibir ele/ela de ver meu status" -#. Remove group -#: ../data/glade/roster_contact_context_menu.glade.h:14 -#: ../src/roster_window.py:2030 ../src/roster_window.py:2127 -#: ../src/roster_window.py:2234 -msgid "_Remove from Roster" -msgstr "_Remover da Lista" - -#: ../data/glade/roster_contact_context_menu.glade.h:15 +#: ../data/glade/roster_contact_context_menu.glade.h:17 #: ../data/glade/zeroconf_contact_context_menu.glade.h:7 -#: ../src/roster_window.py:2222 -msgid "_Rename" -msgstr "_Renomear" +msgid "_Manage Contact" +msgstr "_Gerenciar Contato" -#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/roster_contact_context_menu.glade.h:19 +msgid "_Rename..." +msgstr "_Renomear..." + +#: ../data/glade/roster_contact_context_menu.glade.h:20 msgid "_Subscription" msgstr "_Inscrição" +#: ../data/glade/roster_contact_context_menu.glade.h:21 +#: ../src/roster_window.py:2541 ../src/roster_window.py:2752 +msgid "_Unblock" +msgstr "_Desbloquear" + #: ../data/glade/roster_window.glade.h:1 msgid "A_ccounts" msgstr "_Contas" #: ../data/glade/roster_window.glade.h:2 -msgid "Add _Contact" -msgstr "Adicionar _Contato" +msgid "Add _Contact..." +msgstr "Adicionar _Contato..." #: ../data/glade/roster_window.glade.h:3 +msgid "Fea_tures" +msgstr "Re_cursos" + +#: ../data/glade/roster_window.glade.h:4 msgid "File _Transfers" msgstr "Transferência de _Arquivos" -#: ../data/glade/roster_window.glade.h:4 +#: ../data/glade/roster_window.glade.h:5 msgid "Frequently Asked Questions (online)" msgstr "Perguntas freqüentes (online)" -#: ../data/glade/roster_window.glade.h:6 +#: ../data/glade/roster_window.glade.h:7 msgid "Help online" msgstr "Ajuda online" -#: ../data/glade/roster_window.glade.h:7 +#: ../data/glade/roster_window.glade.h:9 msgid "Profile, A_vatar" msgstr "Perfil, A_vatar" -#: ../data/glade/roster_window.glade.h:8 +#: ../data/glade/roster_window.glade.h:10 msgid "Show Trans_ports" msgstr "Mostrar Trans_portes" -#: ../data/glade/roster_window.glade.h:9 +#: ../data/glade/roster_window.glade.h:11 msgid "Show _Offline Contacts" msgstr "Mostrar Contatos desc_onectados" -#: ../data/glade/roster_window.glade.h:12 +#: ../data/glade/roster_window.glade.h:14 msgid "_Contents" msgstr "_Índices" -#: ../data/glade/roster_window.glade.h:13 -msgid "_Discover Services" -msgstr "_Descubra Serviços" - -#: ../data/glade/roster_window.glade.h:14 ../src/disco.py:1353 -#: ../src/roster_window.py:2205 +#: ../data/glade/roster_window.glade.h:16 ../src/disco.py:1358 msgid "_Edit" msgstr "_Editar" -#: ../data/glade/roster_window.glade.h:15 +#: ../data/glade/roster_window.glade.h:17 msgid "_FAQ" msgstr "_FAQ" -#: ../data/glade/roster_window.glade.h:17 +#: ../data/glade/roster_window.glade.h:18 msgid "_Help" msgstr "_Ajuda" -#: ../data/glade/roster_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:20 msgid "_Preferences" msgstr "_Preferências" -#: ../data/glade/roster_window.glade.h:19 +#: ../data/glade/roster_window.glade.h:21 msgid "_Quit" msgstr "_Sair" -#: ../data/glade/roster_window.glade.h:21 +#: ../data/glade/roster_window.glade.h:22 +msgid "_Send Single Message..." +msgstr "_Enviar Mensagem Simples..." + +#: ../data/glade/roster_window.glade.h:24 msgid "_View" msgstr "_Ver" +#: ../data/glade/search_window.glade.h:1 +msgid "Please wait while retrieving search form..." +msgstr "" +"Por favor aguarde enquanto o formulário de pesquisa está sendo obtido..." + +#: ../data/glade/search_window.glade.h:3 +msgid "_Add contact" +msgstr "_Adicionar contato" + +#. Information +#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:2915 +msgid "_Information" +msgstr "_Informações" + #: ../data/glade/service_discovery_window.glade.h:1 msgid "G_o" msgstr "_Ir" @@ -2210,10 +2363,6 @@ msgstr "_Ir" msgid "_Address:" msgstr "_Endereço:" -#: ../data/glade/service_discovery_window.glade.h:3 -msgid "_Filter:" -msgstr "_Filtro:" - #: ../data/glade/service_registration_window.glade.h:1 msgid "Register to" msgstr "Registrar para" @@ -2291,10 +2440,31 @@ msgstr "Solicitação de Inscrição" msgid "_Deny" msgstr "_Negar" +#: ../data/glade/synchronise_contacts_dialog.glade.h:1 +#, fuzzy +msgid "Select the account with which to synchronise" +msgstr "Selecione a conta que você quer sincronizar" + +#: ../data/glade/synchronise_select_account_dialog.glade.h:1 +msgid "Select the account with which you want to synchronise" +msgstr "Selecione a conta que você quer sincronizar" + +#: ../data/glade/synchronise_select_contacts_dialog.glade.h:1 +msgid "Select the contacts you want to synchronise" +msgstr "Selecione os contatos que você quer sincronizar" + +#: ../data/glade/synchronise_select_contacts_dialog.glade.h:2 +msgid "Synchronise : select contacts" +msgstr "Sincronizar: selecionar contatos" + #: ../data/glade/systray_context_menu.glade.h:1 msgid "Mute Sounds" msgstr "Sons Mudos" +#: ../data/glade/systray_context_menu.glade.h:2 +msgid "Send Single _Message" +msgstr "Enviar _Mensagem Simples" + #: ../data/glade/systray_context_menu.glade.h:3 msgid "Show All Pending _Events" msgstr "Mostrar todos _Eventos Pendentes" @@ -2307,6 +2477,10 @@ msgstr "Mostre _Lista" msgid "Sta_tus" msgstr "Sta_tus" +#: ../data/glade/systray_context_menu.glade.h:6 +msgid "_Group Chat" +msgstr "_Conferência" + #. Given Name #: ../data/glade/vcard_information_window.glade.h:5 msgid "Ask:" @@ -2321,39 +2495,45 @@ msgid "Comments" msgstr "Comentários" #: ../data/glade/vcard_information_window.glade.h:11 +msgid "Configured avatar:" +msgstr "Configurar _avatar:" + +#: ../data/glade/vcard_information_window.glade.h:12 #: ../data/glade/zeroconf_information_window.glade.h:1 msgid "Contact" msgstr "Contato" -#: ../data/glade/vcard_information_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:13 msgid "Contact Information" msgstr "Informações do Contato" -#: ../data/glade/vcard_information_window.glade.h:24 -#: ../data/glade/zeroconf_information_window.glade.h:4 -#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:416 -msgid "Jabber ID:" -msgstr "Jabber ID:" +#: ../data/glade/vcard_information_window.glade.h:29 +msgid "More" +msgstr "Mais" -#: ../data/glade/vcard_information_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:33 msgid "OS:" msgstr "SO:" -#: ../data/glade/vcard_information_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:40 #: ../data/glade/zeroconf_information_window.glade.h:8 msgid "Resource:" msgstr "Recurso:" -#: ../data/glade/vcard_information_window.glade.h:40 +#: ../data/glade/vcard_information_window.glade.h:43 #: ../data/glade/zeroconf_information_window.glade.h:9 msgid "Status:" msgstr "Status:" #. Family Name -#: ../data/glade/vcard_information_window.glade.h:43 +#: ../data/glade/vcard_information_window.glade.h:46 msgid "Subscription:" msgstr "Inscrição:" +#: ../data/glade/vcard_information_window.glade.h:49 +msgid "User avatar:" +msgstr "Avatar do usuário:" + #: ../data/glade/xml_console_window.glade.h:1 msgid "Jabber Traffic" msgstr "Trafégo do Jabber" @@ -2362,11 +2542,6 @@ msgstr "Trafégo do Jabber" msgid "XML Input" msgstr "Entrada XML" -#. XML Console enable checkbutton -#: ../data/glade/xml_console_window.glade.h:4 -msgid "Enable" -msgstr "Habilitar" - #. Info/Query make the "IQ" initials. So translate like this 'YourLang/YourLang (Info/Query)'. Thanks (it's a tooltip so width is not a problem) #: ../data/glade/xml_console_window.glade.h:6 msgid "Info/Query" @@ -2385,15 +2560,29 @@ msgstr "_Mensagem" msgid "_Presence" msgstr "_Presença" -#: ../data/glade/zeroconf_information_window.glade.h:3 -#: ../data/glade/zeroconf_properties_window.glade.h:6 -msgid "First Name:" -msgstr "Primeiro nome:" +#: ../data/glade/zeroconf_contact_context_menu.glade.h:1 +msgid "Add Special _Notification" +msgstr "Adicionar Notificações Visuais" -#: ../data/glade/zeroconf_information_window.glade.h:5 -#: ../data/glade/zeroconf_properties_window.glade.h:14 -msgid "Last Name:" -msgstr "Último nome:" +#: ../data/glade/zeroconf_contact_context_menu.glade.h:2 +msgid "Assign Open_PGP Key" +msgstr "Atribuir chave OpenPGP" + +#. Edit Groups +#: ../data/glade/zeroconf_contact_context_menu.glade.h:3 +#: ../src/roster_window.py:2530 +msgid "Edit _Groups" +msgstr "Editar _Grupos" + +#. Rename +#: ../data/glade/zeroconf_contact_context_menu.glade.h:8 +#: ../src/roster_window.py:2887 +msgid "_Rename" +msgstr "_Renomear" + +#: ../data/glade/zeroconf_context_menu.glade.h:1 +msgid "_Modify Account..." +msgstr "_Alterar Conta..." #: ../data/glade/zeroconf_information_window.glade.h:6 msgid "Local jid:" @@ -2403,244 +2592,283 @@ msgstr "JID local:" msgid "Personal" msgstr "Pessoal" -#: ../data/glade/zeroconf_properties_window.glade.h:11 -msgid "" -"If the default port that is used for incoming messages is unfitting for your " -"setup you can select another one here.\n" -"You might consider to change possible firewall settings." -msgstr "" -"Se a porta padrão usada para recebimento de mensagens não for adequada você " -"pode selecionar outra aqui.\n" -"Considere a possível modificação das regras do seu firewall. " - #: ../data/glade/zeroconf_properties_window.glade.h:15 msgid "Modify Account" msgstr "Alterar Conta" -#: ../data/glade/zeroconf_properties_window.glade.h:21 -msgid "Use custom port:" -msgstr "Usar servidor/porta personalizado" - #. For i18n -#: ../src/advanced.py:51 +#: ../src/advanced.py:56 msgid "Activated" msgstr "Ativado" -#: ../src/advanced.py:51 +#: ../src/advanced.py:56 msgid "Deactivated" msgstr "Desativado" -#: ../src/advanced.py:53 +#: ../src/advanced.py:58 msgid "Boolean" msgstr "Booleano" -#: ../src/advanced.py:54 +#: ../src/advanced.py:59 msgid "Integer" msgstr "Inteiro" -#: ../src/advanced.py:55 +#: ../src/advanced.py:60 msgid "Text" msgstr "Texto" -#: ../src/advanced.py:56 +#: ../src/advanced.py:61 msgid "Color" msgstr "Cor" -#: ../src/advanced.py:65 +#: ../src/advanced.py:70 msgid "Preference Name" msgstr "Nome da preferência" -#: ../src/advanced.py:71 +#: ../src/advanced.py:76 msgid "Value" msgstr "Valor" -#: ../src/advanced.py:79 +#: ../src/advanced.py:84 msgid "Type" msgstr "Tipo" #. we talk about option description in advanced configuration editor -#: ../src/advanced.py:136 +#: ../src/advanced.py:140 msgid "(None)" msgstr "(Nada)" #. we talk about password -#: ../src/advanced.py:239 +#: ../src/advanced.py:243 msgid "Hidden" msgstr "Escondido" #. 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) +#. LANG=$(for i in *.po; do j=${i/.po/}; echo -n "_('"$j"')":" '"$j"', " ; done) #. echo "{_('en'):'en'",$LANG"}" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "English" msgstr "Inglês" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Belarusian" msgstr "Bielorusso" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Bulgarian" msgstr "Búlgaro" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Breton" msgstr "Bretão" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Czech" msgstr "Tcheco" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "German" msgstr "Alemão" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Greek" msgstr "Grego" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "British" msgstr "Inglês Britânico" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Esperanto" msgstr "Esperanto" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Spanish" msgstr "Espanhol" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Basque" msgstr "Basco" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "French" msgstr "Francês" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Croatian" msgstr "Croata" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Italian" msgstr "Italiano" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Norwegian (b)" msgstr "Norueguês (b)" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Dutch" msgstr "Holandês" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Norwegian" msgstr "Norueguês" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Polish" msgstr "Polonês" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Portuguese" msgstr "Português" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Brazilian Portuguese" msgstr "Português Brasileiro" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Russian" msgstr "Russo" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Serbian" msgstr "Sérvio" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Slovak" msgstr "Eslovaco" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Swedish" msgstr "Sueco" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Chinese (Ch)" msgstr "Chinês (Ch)" -#: ../src/chat_control.py:212 ../src/dialogs.py:1706 -msgid "" -"If that is not your language for which you want to highlight misspelled " -"words, then please set your $LANG as appropriate. Eg. for French do export " -"LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to make it " -"global in /etc/profile.\n" -"\n" -"Highlighting misspelled words feature will not be used" -msgstr "" -"Se este não for o idioma para o qual você quer destacar palavras incorretas, " -"por favor, configure a sua variável de ambiente $LANG com o valor " -"apropriado. Por exemplo, para o francês exporte LANG=fr_FR ou exporte " -"LANG=fr_FR.UTF-8 em ~/.bash_profile ou coloca-lo \n" -" globalmente em/etc/profile.\n" -"Caracteristica de destacar palavras erradas não será usada" - -#: ../src/chat_control.py:251 +#: ../src/chat_control2.py:310 ../src/chat_control.py:313 msgid "Spelling language" msgstr "Idioma do corretor ortográfico" #. we are not connected -#: ../src/chat_control.py:274 ../src/chat_control.py:480 +#: ../src/chat_control2.py:333 ../src/chat_control2.py:549 +#: ../src/chat_control.py:336 ../src/chat_control.py:559 msgid "A connection is not available" msgstr "Uma conexão não está disponível" -#: ../src/chat_control.py:275 ../src/chat_control.py:481 +#: ../src/chat_control2.py:334 ../src/chat_control2.py:550 +#: ../src/chat_control.py:337 ../src/chat_control.py:560 msgid "Your message can not be sent until you are connected." msgstr "Sua mensagem não pode ser enviada até que esteja conectado." -#: ../src/chat_control.py:1054 +#: ../src/chat_control2.py:1176 ../src/chat_control.py:1186 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s da conferência %(room_name)s" #. we talk about a contact here -#: ../src/chat_control.py:1143 +#: ../src/chat_control2.py:1271 ../src/chat_control.py:1282 #, python-format msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" msgstr "%s não tem a transmissão uma chave de OpenPGP, nem uma foi atribuída" -#: ../src/chat_control.py:1275 +#: ../src/chat_control2.py:1314 ../src/chat_control.py:1325 +#: ../src/groupchat_control.py:1433 +#, python-format +msgid "No such command: /%s (if you want to send this, prefix it with /say)" +msgstr "" +"Comando não encontrado: /%s (se você quer enviar isto, use este prefixo /say)" + +#: ../src/chat_control2.py:1321 ../src/chat_control.py:1332 +#: ../src/groupchat_control.py:1456 +#, python-format +msgid "Commands: %s" +msgstr "Comandos: %s" + +#: ../src/chat_control2.py:1324 ../src/chat_control.py:1335 +#: ../src/groupchat_control.py:1470 +#, python-format +msgid "Usage: /%s, clears the text window." +msgstr "Uso: /%s, apaga o texto da janela." + +#: ../src/chat_control2.py:1327 ../src/chat_control.py:1338 +#: ../src/groupchat_control.py:1475 +#, python-format +msgid "Usage: /%s, hide the chat buttons." +msgstr "Uso: /%s, esconde os botões do bate-papo." + +#: ../src/chat_control2.py:1330 ../src/chat_control.py:1341 +#: ../src/groupchat_control.py:1491 +#, python-format +msgid "" +"Usage: /%s , sends action to the current group chat. Use third " +"person. (e.g. /%s explodes.)" +msgstr "" +"Uso: /%s , emite a ação à sala atual. Use a terceira pessoa (por " +"exemplo: /%s explodes.)" + +#: ../src/chat_control2.py:1334 ../src/chat_control.py:1345 +#, python-format +msgid "Usage: /%s, sends a ping to the contact" +msgstr "Uso: /%s, envia um ping para o contato" + +#: ../src/chat_control2.py:1337 ../src/chat_control.py:1348 +#, python-format +msgid "Usage: /%s, send the message to the contact" +msgstr "Uso: /%s, envia a mensagem para o contato" + +#: ../src/chat_control2.py:1340 ../src/chat_control.py:1351 +#: ../src/groupchat_control.py:1514 +#, python-format +msgid "No help info for /%s" +msgstr "Sem ajuda para /%s" + +#: ../src/chat_control2.py:1478 ../src/chat_control2.py:1504 +#: ../src/chat_control.py:1489 ../src/chat_control.py:1515 msgid "Encryption enabled" msgstr "Criptografia habilitada" -#: ../src/chat_control.py:1280 +#: ../src/chat_control2.py:1483 ../src/chat_control.py:1494 +msgid "Session WILL be logged" +msgstr "A sessão SERÁ gravada" + +#: ../src/chat_control2.py:1485 ../src/chat_control.py:1496 +msgid "Session WILL NOT be logged" +msgstr "A sessão NÃO SERÁ gravada" + +#: ../src/chat_control2.py:1492 ../src/chat_control.py:1503 +msgid "The following message was NOT encrypted" +msgstr "A seguinte mensagem NÃO estava criptografada" + +#: ../src/chat_control2.py:1496 ../src/chat_control2.py:1509 +#: ../src/chat_control2.py:2155 ../src/chat_control.py:1507 +#: ../src/chat_control.py:1520 ../src/chat_control.py:2166 msgid "Encryption disabled" msgstr "Criptografia desabilitada" #. add_to_roster_menuitem -#: ../src/chat_control.py:1425 ../src/conversation_textview.py:502 -#: ../src/dialogs.py:629 ../src/gajim.py:850 ../src/gajim.py:851 -#: ../src/gajim.py:1196 ../src/roster_window.py:333 -#: ../src/roster_window.py:411 ../src/roster_window.py:1497 -#: ../src/roster_window.py:1507 ../src/roster_window.py:1686 -#: ../src/roster_window.py:1892 ../src/roster_window.py:2477 -#: ../src/roster_window.py:2678 ../src/roster_window.py:3924 -#: ../src/roster_window.py:3926 ../src/common/contacts.py:73 -#: ../src/common/helpers.py:43 ../src/common/helpers.py:255 +#: ../src/chat_control2.py:1672 ../src/chat_control.py:1683 +#: ../src/conversation_textview.py:705 ../src/dialogs.py:732 +#: ../src/gajim.py:911 ../src/gajim.py:912 ../src/gajim.py:1436 +#: ../src/gajim.py:1687 ../src/roster_window.py:358 +#: ../src/roster_window.py:442 ../src/roster_window.py:1822 +#: ../src/roster_window.py:1832 ../src/roster_window.py:2072 +#: ../src/roster_window.py:2308 ../src/roster_window.py:3158 +#: ../src/roster_window.py:3397 ../src/roster_window.py:4759 +#: ../src/roster_window.py:4761 ../src/common/contacts.py:89 +#: ../src/common/helpers.py:53 ../src/common/helpers.py:267 msgid "Not in Roster" msgstr "Fora da lista" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:1571 +#: ../src/chat_control2.py:1825 ../src/chat_control.py:1836 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Você acabou de receber uma nova mensagem de \"%s\"" -#: ../src/chat_control.py:1572 +#: ../src/chat_control2.py:1826 ../src/chat_control.py:1837 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." @@ -2648,29 +2876,32 @@ msgstr "" "Se você fechar esta aba e o histórico estiver desabilitado, esta mensagem " "será perdida." -#: ../src/config.py:139 ../src/config.py:588 +#: ../src/config.py:127 ../src/config.py:565 msgid "Disabled" msgstr "Desabilitado" -#: ../src/config.py:233 -#, python-format -msgid "Every %s _minutes" -msgstr "A cada %s _minutos" - -#: ../src/config.py:353 +#: ../src/config.py:293 msgid "Active" msgstr "Ativo" -#: ../src/config.py:361 +#: ../src/config.py:301 msgid "Event" msgstr "Evento" -#: ../src/config.py:684 ../src/gajim.py:2263 +#: ../src/config.py:407 +msgid "Always use OS/X default applications" +msgstr "Sempre usar as aplicações padrões do OS/X" + +#: ../src/config.py:408 +msgid "Custom" +msgstr "Personalizar" + +#: ../src/config.py:638 ../src/dialogs.py:1018 #, python-format msgid "Dictionary for lang %s not available" msgstr "O dicionário para o idioma %s não está disponível" -#: ../src/config.py:685 ../src/gajim.py:2264 +#: ../src/config.py:639 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -2679,71 +2910,103 @@ msgstr "" "Você precisa instalar o dicionário %s para usar a correção ortográfica ou " "selecionar outro idioma ajustando a opção 'speller_language'." -#: ../src/config.py:1008 +#: ../src/config.py:1001 msgid "status message title" msgstr "título da mensagem de status" -#: ../src/config.py:1008 +#: ../src/config.py:1001 msgid "status message text" msgstr "texto da mensagem de status" -#: ../src/config.py:1044 +#: ../src/config.py:1037 msgid "First Message Received" msgstr "Primeira Mensagem Recebida" -#: ../src/config.py:1045 +#: ../src/config.py:1038 msgid "Next Message Received" msgstr "Nova Mensagem Recebida" -#: ../src/config.py:1046 +#: ../src/config.py:1039 msgid "Contact Connected" msgstr "Contato Conectado" -#: ../src/config.py:1047 +#: ../src/config.py:1040 msgid "Contact Disconnected" msgstr "Contato Desconectou" -#: ../src/config.py:1048 +#: ../src/config.py:1041 msgid "Message Sent" msgstr "Mensagem Enviada" -#: ../src/config.py:1049 +#: ../src/config.py:1042 msgid "Group Chat Message Highlight" msgstr "Mensagem Destacada de Conferência" -#: ../src/config.py:1050 +#: ../src/config.py:1043 msgid "Group Chat Message Received" msgstr "Mensagem de Conferência Recebida" -#: ../src/config.py:1057 +#: ../src/config.py:1050 msgid "GMail Email Received" msgstr "Email do Gmail Recebido" -#: ../src/config.py:1260 +#. Name column +#: ../src/config.py:1319 ../src/dialogs.py:1517 ../src/dialogs.py:1581 +#: ../src/disco.py:743 ../src/disco.py:1569 ../src/disco.py:1815 +#: ../src/history_window.py:113 +msgid "Name" +msgstr "Nome" + +#: ../src/config.py:1425 ../src/common/config.py:393 +msgid "Be right back." +msgstr "Estou de volta." + +#: ../src/config.py:1429 +msgid "Relogin now?" +msgstr "Re-autenticar agora?" + +#: ../src/config.py:1430 +msgid "If you want all the changes to apply instantly, you must relogin." +msgstr "Se você quer aplicar todas as mudanças, deve se re-autenticar." + +#: ../src/config.py:1525 ../src/config.py:1616 msgid "OpenPGP is not usable in this computer" msgstr "OpenPGP não disponível neste computador" -#: ../src/config.py:1306 -msgid "You are currently connected to the server" -msgstr "Você está atualmente conectado ao servidor" - -#: ../src/config.py:1307 -msgid "To change the account name, you must be disconnected." -msgstr "Para mudar o nome da conta, você deve estar disconectado." - -#: ../src/config.py:1310 ../src/config.py:1916 +#: ../src/config.py:1652 ../src/config.py:1693 msgid "Unread events" msgstr "Eventos não lidos" -#: ../src/config.py:1311 +#: ../src/config.py:1653 +msgid "Read all pending events before removing this account." +msgstr "Ler todos os eventos pendentes antes de remover esta conta." + +#: ../src/config.py:1679 +#, python-format +msgid "You have opened chat in account %s" +msgstr "Você iniciou uma conversa usando a conta %s" + +#: ../src/config.py:1680 +msgid "All chat and groupchat windows will be closed. Do you want to continue?" +msgstr "Todas as janelas de conversa e conferência serão fechadas. Confirma?" + +#: ../src/config.py:1689 +msgid "You are currently connected to the server" +msgstr "Você está atualmente conectado ao servidor" + +#: ../src/config.py:1690 +msgid "To change the account name, you must be disconnected." +msgstr "Para mudar o nome da conta, você deve estar disconectado." + +#: ../src/config.py:1694 msgid "To change the account name, you must read all pending events." msgstr "Para mudar o nome da conta, você deve ler todas os eventos pendentes." -#: ../src/config.py:1315 +#: ../src/config.py:1700 msgid "Account Name Already Used" msgstr "Nome de conta já está em uso" -#: ../src/config.py:1316 +#: ../src/config.py:1701 msgid "" "This name is already used by another of your accounts. Please choose another " "name." @@ -2751,174 +3014,147 @@ msgstr "" "Este nome já está sendo usado por outra de suas contas. Por favor, escolha " "outro nome." -#: ../src/config.py:1320 ../src/config.py:1324 +#: ../src/config.py:1705 ../src/config.py:1709 msgid "Invalid account name" msgstr "Nome de conta inválido" -#: ../src/config.py:1321 +#: ../src/config.py:1706 msgid "Account name cannot be empty." msgstr "Nome da conta não pode ser vazio." -#: ../src/config.py:1325 +#: ../src/config.py:1710 msgid "Account name cannot contain spaces." msgstr "Nome da conta não pode conter espaços." -#: ../src/config.py:1333 ../src/config.py:1339 ../src/config.py:1349 -#: ../src/config.py:2900 +#: ../src/config.py:1774 +msgid "Rename Account" +msgstr "Renomear Conta" + +#: ../src/config.py:1775 +#, python-format +msgid "Enter a new name for account %s" +msgstr "Entre com um novo nome para a conta %s" + +#: ../src/config.py:1793 ../src/config.py:1801 ../src/config.py:1841 +#: ../src/config.py:3048 ../src/dataforms_widget.py:533 msgid "Invalid Jabber ID" msgstr "Jabber ID Inválido:" -#: ../src/config.py:1340 +#: ../src/config.py:1802 msgid "A Jabber ID must be in the form \"user@servername\"." msgstr "Um Jabber ID deve ter o seguinte formato \"usuário@nomedoservidor\"." -#: ../src/config.py:1399 +#: ../src/config.py:1988 ../src/config.py:3119 msgid "Invalid entry" msgstr "Entrada inválida" -#: ../src/config.py:1400 +#: ../src/config.py:1989 ../src/config.py:3120 msgid "Custom port must be a port number." msgstr "A porta do proxy deve ser um número de porta." -#: ../src/config.py:1528 ../src/common/config.py:367 -msgid "Be right back." -msgstr "Estou de volta." +#: ../src/config.py:2010 +msgid "Failed to get secret keys" +msgstr "Falha enquanto recebia as chaves secretas" -#: ../src/config.py:1538 -msgid "Relogin now?" -msgstr "Re-autenticar agora?" +#: ../src/config.py:2011 +msgid "There was a problem retrieving your OpenPGP secret keys." +msgstr "Houve um problema no recebimento de suas chaves secretas OpenPGP." -#: ../src/config.py:1539 -msgid "If you want all the changes to apply instantly, you must relogin." -msgstr "Se você quer aplicar todas as mudanças, deve se re-autenticar." +#: ../src/config.py:2014 +msgid "OpenPGP Key Selection" +msgstr "Seleção de Chave OpenPGP" -#: ../src/config.py:1565 +#: ../src/config.py:2015 +msgid "Choose your OpenPGP key" +msgstr "Escolha sua chave OpenPGP" + +#: ../src/config.py:2055 msgid "No such account available" msgstr "Conta não disponível" -#: ../src/config.py:1566 +#: ../src/config.py:2056 msgid "You must create your account before editing your personal information." msgstr "" "Você deve primeiro criar sua conta antes de editar suas informações pessoais." -#: ../src/config.py:1573 ../src/dialogs.py:1190 ../src/dialogs.py:1326 -#: ../src/dialogs.py:1506 ../src/disco.py:420 ../src/profile_window.py:323 +#: ../src/config.py:2063 ../src/dialogs.py:1364 ../src/dialogs.py:1505 +#: ../src/dialogs.py:1685 ../src/disco.py:427 ../src/profile_window.py:318 msgid "You are not connected to the server" msgstr "Você não está conectado ao servidor" -#: ../src/config.py:1574 +#: ../src/config.py:2064 msgid "Without a connection, you can not edit your personal information." msgstr "Você deve estar conectado para editar suas informações pessoais." -#: ../src/config.py:1578 +#: ../src/config.py:2068 msgid "Your server doesn't support Vcard" msgstr "Seu servidor não suporta Vcard" -#: ../src/config.py:1579 +#: ../src/config.py:2069 msgid "Your server can't save your personal information." msgstr "Seu servidor não pode salvar suas informações pessoais." -#: ../src/config.py:1610 ../src/config.py:3288 -msgid "Failed to get secret keys" -msgstr "Falha enquanto recebia as chaves secretas" - -#: ../src/config.py:1611 ../src/config.py:3289 -msgid "There was a problem retrieving your OpenPGP secret keys." -msgstr "Houve um problema no recebimento de suas chaves secretas OpenPGP." - -#: ../src/config.py:1614 ../src/config.py:3292 -msgid "OpenPGP Key Selection" -msgstr "Seleção de Chave OpenPGP" - -#: ../src/config.py:1615 ../src/config.py:3293 -msgid "Choose your OpenPGP key" -msgstr "Escolha sua chave OpenPGP" - -#. Name column -#: ../src/config.py:1850 ../src/dialogs.py:1338 ../src/dialogs.py:1402 -#: ../src/disco.py:741 ../src/disco.py:1564 ../src/disco.py:1802 -#: ../src/history_window.py:78 -msgid "Name" -msgstr "Nome" - -#: ../src/config.py:1853 ../src/dialogs.py:1341 -msgid "Server" -msgstr "Servidor" - -#: ../src/config.py:1917 -msgid "Read all pending events before removing this account." -msgstr "Ler todos os eventos pendentes antes de remover esta conta." - -#: ../src/config.py:1954 -#, python-format -msgid "You have opened chat in account %s" -msgstr "Você iniciou uma conversa usando a conta %s" - -#: ../src/config.py:1955 -msgid "All chat and groupchat windows will be closed. Do you want to continue?" -msgstr "Todas as janelas de conversa e conferência serão fechadas. Confirma?" - -#: ../src/config.py:2014 +#: ../src/config.py:2100 msgid "Account Local already exists." msgstr "Conta local já existe." -#: ../src/config.py:2015 +#: ../src/config.py:2101 msgid "Please rename or remove it before enabling link-local messaging." msgstr "" "Por favor renomeie ou remova-o antes de ativar troca de mensagens \"link-" "local\"." -#: ../src/config.py:2111 +#: ../src/config.py:2277 #, python-format msgid "Edit %s" msgstr "_Editar %s" -#: ../src/config.py:2113 +#: ../src/config.py:2279 #, python-format msgid "Register to %s" msgstr "Registro para %s" #. list at the beginning -#: ../src/config.py:2179 +#: ../src/config.py:2315 msgid "Ban List" msgstr "Lista de Banidos" -#: ../src/config.py:2180 +#: ../src/config.py:2316 msgid "Member List" msgstr "Lista de Membros" -#: ../src/config.py:2181 +#: ../src/config.py:2317 msgid "Owner List" msgstr "Lista de Donos" -#: ../src/config.py:2182 +#: ../src/config.py:2318 msgid "Administrator List" msgstr "Lista de Administradores" #. Address column #. holds JID (who said this) -#: ../src/config.py:2231 ../src/disco.py:748 ../src/history_manager.py:155 +#: ../src/config.py:2367 ../src/disco.py:750 ../src/history_manager.py:160 msgid "JID" msgstr "JID" -#: ../src/config.py:2239 +#: ../src/config.py:2375 msgid "Reason" msgstr "Razão" -#: ../src/config.py:2244 +#: ../src/config.py:2380 msgid "Nick" msgstr "Apelido" -#: ../src/config.py:2248 +#: ../src/config.py:2384 msgid "Role" msgstr "Lista" -#: ../src/config.py:2273 +#: ../src/config.py:2409 msgid "Banning..." msgstr "Banindo..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2275 +#: ../src/config.py:2411 msgid "" "Whom do you want to ban?\n" "\n" @@ -2926,11 +3162,11 @@ msgstr "" "Quem você quer banir?\n" "\n" -#: ../src/config.py:2277 +#: ../src/config.py:2413 msgid "Adding Member..." msgstr "Adicionando Membro..." -#: ../src/config.py:2278 +#: ../src/config.py:2414 msgid "" "Whom do you want to make a member?\n" "\n" @@ -2938,11 +3174,11 @@ msgstr "" "Quem você quer fazer como membro?\n" "\n" -#: ../src/config.py:2280 +#: ../src/config.py:2416 msgid "Adding Owner..." msgstr "Adicionando Proprietário..." -#: ../src/config.py:2281 +#: ../src/config.py:2417 msgid "" "Whom do you want to make an owner?\n" "\n" @@ -2950,11 +3186,11 @@ msgstr "" "Quem você quer tornar um dono?\n" "\n" -#: ../src/config.py:2283 +#: ../src/config.py:2419 msgid "Adding Administrator..." msgstr "Adicionando Administrador..." -#: ../src/config.py:2284 +#: ../src/config.py:2420 msgid "" "Whom do you want to make an administrator?\n" "\n" @@ -2962,7 +3198,7 @@ msgstr "" "Quem você quer tornar um administrador?\n" "\n" -#: ../src/config.py:2285 +#: ../src/config.py:2421 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" @@ -2978,101 +3214,85 @@ msgstr "" "4. domínio (o domínio combina por si com qualquer usuario@domínio,\n" "domínio/recurso, ou endereço contendo um subdomínio." -#: ../src/config.py:2389 +#: ../src/config.py:2525 #, python-format msgid "Removing %s account" msgstr "Removendo %s conta" -#: ../src/config.py:2406 ../src/roster_window.py:2737 +#: ../src/config.py:2540 ../src/gajim.py:1343 ../src/roster_window.py:3455 msgid "Password Required" msgstr "Senha é obrigatória" -#: ../src/config.py:2407 ../src/roster_window.py:2733 +#: ../src/config.py:2541 ../src/roster_window.py:3451 #, python-format msgid "Enter your password for account %s" msgstr "Entre com a senha para conta %s" -#: ../src/config.py:2408 ../src/roster_window.py:2738 +#: ../src/config.py:2542 ../src/roster_window.py:3456 msgid "Save password" msgstr "Salvar senha" -#: ../src/config.py:2422 +#: ../src/config.py:2555 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Conta \"%s\" está conectada ao servidor" -#: ../src/config.py:2423 +#: ../src/config.py:2556 msgid "If you remove it, the connection will be lost." msgstr "Se você remover-lo, a conexão será perdida." -#: ../src/config.py:2508 +#: ../src/config.py:2649 msgid "Default" msgstr "Padrão" -#: ../src/config.py:2508 +#: ../src/config.py:2649 msgid "?print_status:All" msgstr "?exibir_status:Todos" -#: ../src/config.py:2509 +#: ../src/config.py:2650 msgid "Enter and leave only" msgstr "Apenas entre e saia" -#: ../src/config.py:2510 +#: ../src/config.py:2651 msgid "?print_status:None" msgstr "?exibir_status:Nenhum" -#: ../src/config.py:2578 +#: ../src/config.py:2720 msgid "New Group Chat" msgstr "Nova Conferência" -#: ../src/config.py:2611 +#: ../src/config.py:2753 msgid "This bookmark has invalid data" msgstr "Bookmark tem dados inválidos" -#: ../src/config.py:2612 +#: ../src/config.py:2754 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" "Por favor, tenha certeza que preencheu os campos servidor e sala ou remova " "este bookmark" -#: ../src/config.py:2875 +#: ../src/config.py:3031 msgid "Invalid username" msgstr "Nome de usuário inválido" -#: ../src/config.py:2876 +#: ../src/config.py:3033 msgid "You must provide a username to configure this account." msgstr "Você deve entrar com um nome para configurar esta conta." -#: ../src/config.py:2886 ../src/dialogs.py:1525 -msgid "Invalid password" -msgstr "Senha Inválida" - -#: ../src/config.py:2887 -msgid "You must enter a password for the new account." -msgstr "Você deve entrar com uma senha para registrar uma nova conta." - -#: ../src/config.py:2891 ../src/dialogs.py:1530 -msgid "Passwords do not match" -msgstr "Senhas não conferem" - -#: ../src/config.py:2892 ../src/dialogs.py:1531 -msgid "The passwords typed in both fields must be identical." -msgstr "As senhas digitadas em ambos os campos devem ser idênticas." - -#: ../src/config.py:2911 +#: ../src/config.py:3059 msgid "Duplicate Jabber ID" msgstr "Jabber ID Duplicado" -#: ../src/config.py:2912 +#: ../src/config.py:3060 msgid "This account is already configured in Gajim." msgstr "Esta conta já está configurada no Gajim." -#: ../src/config.py:2929 +#: ../src/config.py:3077 msgid "Account has been added successfully" msgstr "Conta foi adicionada com sucesso" -#: ../src/config.py:2930 ../src/config.py:2965 +#: ../src/config.py:3078 ../src/config.py:3223 msgid "" "You can set advanced account options by pressing the Advanced button, or " "later by choosing the Accounts menuitem under the Edit menu from the main " @@ -3082,23 +3302,31 @@ msgstr "" "Avançado, ou mais tarde clicando em Contas no menu Editar da janela " "principal." -#: ../src/config.py:2964 -msgid "Your new account has been created successfully" -msgstr "Sua nova conta foi criada com sucesso" +#: ../src/config.py:3095 +msgid "Invalid server" +msgstr "Servidor inválido" -#: ../src/config.py:2982 +#: ../src/config.py:3096 +msgid "Please provide a server on which you want to register." +msgstr "Por favor, forneça um servidor no qual você queira se registrar." + +#: ../src/config.py:3202 ../src/config.py:3241 msgid "An error occurred during account creation" msgstr "Um erro ocorreu durante a criação da conta" -#: ../src/config.py:3040 +#: ../src/config.py:3222 +msgid "Your new account has been created successfully" +msgstr "Sua nova conta foi criada com sucesso" + +#: ../src/config.py:3325 msgid "Account name is in use" msgstr "Nome de conta em uso" -#: ../src/config.py:3041 +#: ../src/config.py:3326 msgid "You already have an account using this name." msgstr "Você já tem uma conta usando este nome." -#: ../src/conversation_textview.py:280 +#: ../src/conversation_textview.py:454 msgid "" "Text below this line is what has been said since the last time you paid " "attention to this group chat" @@ -3106,191 +3334,220 @@ msgstr "" "O texto abaixo desta linha é o que foi dito desde a última vez onde você " "prestou a atenção a conferência" -#: ../src/conversation_textview.py:349 +#: ../src/conversation_textview.py:552 #, python-format msgid "_Actions for \"%s\"" msgstr "_Ações para \"%s\"" -#: ../src/conversation_textview.py:361 +#: ../src/conversation_textview.py:564 msgid "Read _Wikipedia Article" msgstr "Ler Artigo da _Wikipedia" -#: ../src/conversation_textview.py:366 +#: ../src/conversation_textview.py:569 msgid "Look it up in _Dictionary" msgstr "Procurar no _Dicionário" #. we must have %s in the url if not WIKTIONARY -#: ../src/conversation_textview.py:382 +#: ../src/conversation_textview.py:585 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "URL do Dicionário não existe \"%s\" e isto não é WIKTIONARY" #. we must have %s in the url -#: ../src/conversation_textview.py:395 +#: ../src/conversation_textview.py:598 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "URL de Procura na Web não existe \"%s\"" -#: ../src/conversation_textview.py:398 +#: ../src/conversation_textview.py:601 msgid "Web _Search for it" msgstr "_Procura na Web por isto" -#: ../src/conversation_textview.py:404 +#: ../src/conversation_textview.py:607 msgid "Open as _Link" msgstr "Abrir como _Link" -#: ../src/conversation_textview.py:765 +#: ../src/conversation_textview.py:1073 msgid "Yesterday" msgstr "Ontem" #. the number is >= 2 #. %i is day in year (1-365), %d (1-31) we want %i -#: ../src/conversation_textview.py:769 +#: ../src/conversation_textview.py:1077 #, python-format msgid "%i days ago" msgstr "%i dias atrás" #. if we have subject, show it too! -#: ../src/conversation_textview.py:803 +#: ../src/conversation_textview.py:1111 #, python-format msgid "Subject: %s\n" msgstr "Assunto: %s\n" -#: ../src/dialogs.py:59 +#: ../src/dataforms_widget.py:537 +msgid "Jabber ID already in list" +msgstr "Jabber ID já existente na lista" + +#: ../src/dataforms_widget.py:538 +msgid "The Jabber ID you entered is already in the list. Choose another one." +msgstr "O Jabber ID que você forneceu já está na lista. Escolha outro." + +#. Default jid +#: ../src/dataforms_widget.py:549 +msgid "new@jabber.id" +msgstr "novo@jabber.id" + +#: ../src/dataforms_widget.py:552 ../src/dataforms_widget.py:554 +#, python-format +msgid "new%d@jabber.id" +msgstr "novo%d@jabber.id" + +#: ../src/dialogs.py:71 #, python-format msgid "Contact name: %s" msgstr "Nome do Contato: %s" -#: ../src/dialogs.py:61 +#: ../src/dialogs.py:73 #, python-format msgid "Jabber ID: %s" msgstr "Jabber ID: %s" -#: ../src/dialogs.py:211 +#: ../src/dialogs.py:223 msgid "Group" msgstr "Grupo" -#: ../src/dialogs.py:218 +#: ../src/dialogs.py:230 msgid "In the group" msgstr "Neste grupo" -#: ../src/dialogs.py:269 +#: ../src/dialogs.py:330 msgid "KeyID" msgstr "KeyID" -#: ../src/dialogs.py:272 +#: ../src/dialogs.py:335 msgid "Contact name" msgstr "Nome do Contato" -#: ../src/dialogs.py:318 +#: ../src/dialogs.py:381 #, python-format msgid "%s Status Message" msgstr "%s Mensagem de status" -#: ../src/dialogs.py:320 +#: ../src/dialogs.py:383 msgid "Status Message" msgstr "Mensagem de status" -#: ../src/dialogs.py:395 +#: ../src/dialogs.py:483 msgid "Save as Preset Status Message" msgstr "Salvar como a mensagem de status pré-configurada" -#: ../src/dialogs.py:396 +#: ../src/dialogs.py:484 msgid "Please type a name for this status message" msgstr "Por favor, escreva um nome para esta mensagem de status" -#: ../src/dialogs.py:417 +#: ../src/dialogs.py:495 +msgid "Overwrite Status Message?" +msgstr "Sobrescrever Mensagem de Status?" + +#: ../src/dialogs.py:496 +msgid "" +"This name is already used. Do you want to overwrite this status message?" +msgstr "" +"Este nome já está sendo usado. Você quer sobrescrever essa mensagem de " +"status?" + +#: ../src/dialogs.py:512 msgid "AIM Address:" msgstr "Endereço AIM:" -#: ../src/dialogs.py:418 +#: ../src/dialogs.py:513 msgid "GG Number:" msgstr "Número de GG:" -#: ../src/dialogs.py:419 +#: ../src/dialogs.py:514 msgid "ICQ Number:" msgstr "Número de ICQ:" -#: ../src/dialogs.py:420 +#: ../src/dialogs.py:515 msgid "MSN Address:" msgstr "Endereço MSN:" -#: ../src/dialogs.py:421 +#: ../src/dialogs.py:516 msgid "Yahoo! Address:" msgstr "Endereço Yahoo!:" -#: ../src/dialogs.py:457 +#: ../src/dialogs.py:553 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" msgstr "" "Por favor, preencha os dados do contato se você quer adicionar na conta %s" -#: ../src/dialogs.py:459 +#: ../src/dialogs.py:555 msgid "Please fill in the data of the contact you want to add" msgstr "Por favor preencha os dados do contato que você quer adicionar" -#: ../src/dialogs.py:609 ../src/dialogs.py:615 +#: ../src/dialogs.py:712 ../src/dialogs.py:718 msgid "Invalid User ID" msgstr "Inválido ID do usuário" -#: ../src/dialogs.py:616 +#: ../src/dialogs.py:719 msgid "The user ID must not contain a resource." msgstr "O ID do usuário não contém um recurso." -#: ../src/dialogs.py:630 +#: ../src/dialogs.py:733 msgid "Contact already in roster" msgstr "Contato já foi adicionado à lista" -#: ../src/dialogs.py:631 +#: ../src/dialogs.py:734 msgid "This contact is already listed in your roster." msgstr "Este contato já encontra-se em sua lista." -#: ../src/dialogs.py:668 +#: ../src/dialogs.py:770 msgid "User ID:" msgstr "ID do Usuário:" -#: ../src/dialogs.py:731 +#: ../src/dialogs.py:832 msgid "A GTK+ jabber client" msgstr "Um cliente jabber GTK+" -#: ../src/dialogs.py:732 +#: ../src/dialogs.py:833 msgid "GTK+ Version:" msgstr "Versão do GTK+:" -#: ../src/dialogs.py:733 +#: ../src/dialogs.py:834 msgid "PyGTK Version:" msgstr "Versão do PyGTK:" -#: ../src/dialogs.py:747 +#: ../src/dialogs.py:848 msgid "Current Developers:" msgstr "Desenvolvedores Atuais:" -#: ../src/dialogs.py:749 +#: ../src/dialogs.py:850 msgid "Past Developers:" msgstr "Desenvolvedores Passados:" -#: ../src/dialogs.py:759 +#: ../src/dialogs.py:860 msgid "THANKS:" msgstr "AGRADECIMENTOS:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:765 +#: ../src/dialogs.py:866 msgid "Last but not least, we would like to thank all the package maintainers." msgstr "Nós gostaríamos de agradecer todos os mantedores do pacote." #. here you write your name in the form Name FamilyName -#: ../src/dialogs.py:778 +#: ../src/dialogs.py:879 msgid "translator-credits" msgstr "" "Alfredo Jr. - Junix e Juracy Filho " -#: ../src/dialogs.py:908 +#: ../src/dialogs.py:1011 #, python-format msgid "Unable to bind to port %s." msgstr "Impossível conectar à porta %s." -#: ../src/dialogs.py:909 +#: ../src/dialogs.py:1012 msgid "" "Maybe you have another running instance of Gajim. File Transfer will be " "cancelled." @@ -3298,76 +3555,93 @@ msgstr "" "Talvez haja uma outra instância do Gajim em execução. A Transferência de " "Arquivos será cancelada." -#: ../src/dialogs.py:1120 +#: ../src/dialogs.py:1019 +#, python-format +msgid "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option.\n" +"\n" +"Highlighting misspelled words feature will not be used" +msgstr "" +"Você precisa instalar o dicionário %s para usar a correção ortográfica ou " +"selecionar outro idioma definindo a opção speller_language.\n" +"\n" +"O recurso de destacar palavras grafadas incorretamente não será usado" + +#: ../src/dialogs.py:1293 #, python-format msgid "Subscription request for account %s from %s" msgstr "Solicitação de inscrição para conta %s de %s" -#: ../src/dialogs.py:1123 +#: ../src/dialogs.py:1296 #, python-format msgid "Subscription request from %s" msgstr "Solicitação de inscrição de %s" -#: ../src/dialogs.py:1183 ../src/roster_window.py:687 +#: ../src/dialogs.py:1357 ../src/roster_window.py:776 #, python-format msgid "You are already in group chat %s" msgstr "Você já está na conferência %s" -#: ../src/dialogs.py:1191 +#: ../src/dialogs.py:1365 msgid "You can not join a group chat unless you are connected." msgstr "" "Você não pode ingressar em uma sala de conferência até que esteja conectado." -#: ../src/dialogs.py:1206 +#: ../src/dialogs.py:1383 #, python-format msgid "Join Group Chat with account %s" msgstr "Ingressar numa conferência com a conta %s" -#: ../src/dialogs.py:1274 ../src/dialogs.py:1280 -#: ../src/groupchat_control.py:1475 +#: ../src/dialogs.py:1453 ../src/dialogs.py:1459 +#: ../src/groupchat_control.py:1683 msgid "Invalid group chat Jabber ID" msgstr "Jabber ID da conferência inválido:" -#: ../src/dialogs.py:1275 ../src/dialogs.py:1281 -#: ../src/groupchat_control.py:1476 +#: ../src/dialogs.py:1454 ../src/dialogs.py:1460 +#: ../src/groupchat_control.py:1684 msgid "The group chat Jabber ID has not allowed characters." msgstr "O Jabber ID da conferência possui caracteres não permitidos." -#: ../src/dialogs.py:1287 +#: ../src/dialogs.py:1466 msgid "This is not a group chat" msgstr "Isto não é uma conferência" -#: ../src/dialogs.py:1288 +#: ../src/dialogs.py:1467 #, python-format msgid "%s is not the name of a group chat." msgstr "%s não é o nome da conferência." -#: ../src/dialogs.py:1327 +#: ../src/dialogs.py:1506 msgid "Without a connection, you can not synchronise your contacts." msgstr "Sem uma conexão, você pode não sincronizar seus contatos." -#: ../src/dialogs.py:1374 +#: ../src/dialogs.py:1520 +msgid "Server" +msgstr "Servidor" + +#: ../src/dialogs.py:1553 msgid "This account is not connected to the server" msgstr "Esta conta não está conectada ao servidor" -#: ../src/dialogs.py:1375 +#: ../src/dialogs.py:1554 msgid "You cannot synchronize with an account unless it is connected." msgstr "Você não pode sincronizar com uma conta a menos que esteja conectado." -#: ../src/dialogs.py:1399 +#: ../src/dialogs.py:1578 msgid "Synchronise" msgstr "Sincronizar" -#: ../src/dialogs.py:1457 +#: ../src/dialogs.py:1636 #, python-format msgid "Start Chat with account %s" msgstr "Iniciar uma conferência com a conta %s" -#: ../src/dialogs.py:1459 +#: ../src/dialogs.py:1638 msgid "Start Chat" msgstr "Iniciar conversa" -#: ../src/dialogs.py:1460 +#: ../src/dialogs.py:1639 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" @@ -3376,270 +3650,290 @@ msgstr "" "você quer enviar uma messagem:" #. if offline or connecting -#: ../src/dialogs.py:1485 ../src/dialogs.py:1844 ../src/dialogs.py:1975 +#: ../src/dialogs.py:1664 ../src/dialogs.py:2040 ../src/dialogs.py:2181 msgid "Connection not available" msgstr "Conexão não disponível" -#: ../src/dialogs.py:1486 ../src/dialogs.py:1845 ../src/dialogs.py:1976 +#: ../src/dialogs.py:1665 ../src/dialogs.py:2041 ../src/dialogs.py:2182 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Por favor, tenha certeza que você está conectado com \"%s\"." -#: ../src/dialogs.py:1495 ../src/dialogs.py:1498 +#: ../src/dialogs.py:1674 ../src/dialogs.py:1677 msgid "Invalid JID" msgstr "JID inválido:" -#: ../src/dialogs.py:1498 +#: ../src/dialogs.py:1677 #, python-format msgid "Unable to parse \"%s\"." msgstr "Impossível gravar o arquivo em \"%s\"." -#: ../src/dialogs.py:1507 +#: ../src/dialogs.py:1686 msgid "Without a connection, you can not change your password." msgstr "Você deve estar contectado para mudar sua senha" -#: ../src/dialogs.py:1526 +#: ../src/dialogs.py:1704 +msgid "Invalid password" +msgstr "Senha Inválida" + +#: ../src/dialogs.py:1705 msgid "You must enter a password." msgstr "Você deve entrar com uma senha." +#: ../src/dialogs.py:1709 +msgid "Passwords do not match" +msgstr "Senhas não conferem" + +#: ../src/dialogs.py:1710 +msgid "The passwords typed in both fields must be identical." +msgstr "As senhas digitadas em ambos os campos devem ser idênticas." + #. img to display #. default value -#: ../src/dialogs.py:1573 ../src/notify.py:212 ../src/notify.py:416 +#: ../src/dialogs.py:1752 ../src/notify.py:232 ../src/notify.py:447 msgid "Contact Signed In" msgstr "Contato conectou" -#: ../src/dialogs.py:1575 ../src/notify.py:220 ../src/notify.py:418 +#: ../src/dialogs.py:1754 ../src/notify.py:240 ../src/notify.py:449 msgid "Contact Signed Out" msgstr "Contato desconectou" #. chat message -#: ../src/dialogs.py:1577 ../src/notify.py:239 ../src/notify.py:420 +#: ../src/dialogs.py:1756 ../src/notify.py:263 ../src/notify.py:451 msgid "New Message" msgstr "Nova Mensagem" #. single message -#: ../src/dialogs.py:1577 ../src/notify.py:224 ../src/notify.py:420 +#: ../src/dialogs.py:1756 ../src/notify.py:244 ../src/notify.py:451 msgid "New Single Message" msgstr "Nova Mensagem" #. private message -#: ../src/dialogs.py:1578 ../src/notify.py:231 ../src/notify.py:421 +#: ../src/dialogs.py:1757 ../src/notify.py:251 ../src/notify.py:452 msgid "New Private Message" msgstr "Enviar Mensagem Privada" -#: ../src/dialogs.py:1578 ../src/gajim.py:1291 ../src/notify.py:429 +#: ../src/dialogs.py:1757 ../src/gajim.py:1532 ../src/notify.py:460 msgid "New E-mail" msgstr "Novo E-Mail" -#: ../src/dialogs.py:1580 ../src/gajim.py:1444 ../src/notify.py:423 +#: ../src/dialogs.py:1759 ../src/gajim.py:1707 ../src/notify.py:454 msgid "File Transfer Request" msgstr "Solicitação de Transferência de Arquivos" -#: ../src/dialogs.py:1582 ../src/gajim.py:1263 ../src/gajim.py:1420 -#: ../src/notify.py:425 +#: ../src/dialogs.py:1761 ../src/gajim.py:1504 ../src/gajim.py:1674 +#: ../src/notify.py:456 msgid "File Transfer Error" msgstr "Erro na Transferência de Arquivos" -#: ../src/dialogs.py:1584 ../src/gajim.py:1483 ../src/gajim.py:1505 -#: ../src/gajim.py:1522 ../src/notify.py:427 +#: ../src/dialogs.py:1763 ../src/gajim.py:1746 ../src/gajim.py:1768 +#: ../src/gajim.py:1785 ../src/notify.py:458 msgid "File Transfer Completed" msgstr "Transferência do Arquivo Completa" -#: ../src/dialogs.py:1585 ../src/gajim.py:1486 ../src/notify.py:427 +#: ../src/dialogs.py:1764 ../src/gajim.py:1749 ../src/notify.py:458 msgid "File Transfer Stopped" msgstr "Transferência do Arquivo Parada" -#: ../src/dialogs.py:1587 ../src/gajim.py:1160 ../src/notify.py:431 +#: ../src/dialogs.py:1766 ../src/gajim.py:1364 ../src/notify.py:462 msgid "Groupchat Invitation" msgstr "Convite para Conferência" -#: ../src/dialogs.py:1589 ../src/notify.py:204 ../src/notify.py:433 +#: ../src/dialogs.py:1768 ../src/notify.py:224 ../src/notify.py:464 msgid "Contact Changed Status" msgstr "O Contato Alterou seu Status" -#: ../src/dialogs.py:1774 +#: ../src/dialogs.py:1959 #, python-format msgid "Single Message using account %s" msgstr "Mensagem Simples usando conta %s" -#: ../src/dialogs.py:1776 +#: ../src/dialogs.py:1961 #, python-format msgid "Single Message in account %s" msgstr "Mensagem Simples na conta %s" -#: ../src/dialogs.py:1778 +#: ../src/dialogs.py:1963 msgid "Single Message" msgstr "Mensagem simples" #. prepare UI for Sending -#: ../src/dialogs.py:1781 +#: ../src/dialogs.py:1966 #, python-format msgid "Send %s" msgstr "Enviar %s" #. prepare UI for Receiving -#: ../src/dialogs.py:1804 +#: ../src/dialogs.py:1989 #, python-format msgid "Received %s" msgstr "Recebido %s" +#. prepare UI for Receiving +#: ../src/dialogs.py:2012 +#, python-format +msgid "Form %s" +msgstr "Formulário %s" + #. we create a new blank window to send and we preset RE: and to jid -#: ../src/dialogs.py:1876 +#: ../src/dialogs.py:2082 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:1877 +#: ../src/dialogs.py:2083 #, python-format msgid "%s wrote:\n" msgstr "%s escreveu:\n" -#: ../src/dialogs.py:1921 +#: ../src/dialogs.py:2127 #, python-format msgid "XML Console for %s" msgstr "Console XML para %s" -#: ../src/dialogs.py:1923 +#: ../src/dialogs.py:2129 msgid "XML Console" msgstr "Console XML" -#: ../src/dialogs.py:2046 +#: ../src/dialogs.py:2252 #, python-format msgid "Privacy List %s" msgstr "Lista de Privacidade %s" -#: ../src/dialogs.py:2050 +#: ../src/dialogs.py:2256 #, python-format msgid "Privacy List for %s" msgstr "Lista de Privacidade para %s" -#: ../src/dialogs.py:2098 +#: ../src/dialogs.py:2312 #, python-format msgid "Order: %s, action: %s, type: %s, value: %s" msgstr "Ordem: %s, ação: %s tipo: %s, valor: %s" -#: ../src/dialogs.py:2101 +#: ../src/dialogs.py:2315 #, python-format msgid "Order: %s, action: %s" msgstr "Ordem: %s, ação: %s" -#: ../src/dialogs.py:2143 +#: ../src/dialogs.py:2357 msgid "Edit a rule" msgstr "Editar uma regra" -#: ../src/dialogs.py:2230 +#: ../src/dialogs.py:2444 msgid "Add a rule" msgstr "Adicionar uma regra" -#: ../src/dialogs.py:2326 +#: ../src/dialogs.py:2540 #, python-format msgid "Privacy Lists for %s" msgstr "Lista de Privacidade para %s" -#: ../src/dialogs.py:2328 +#: ../src/dialogs.py:2542 msgid "Privacy Lists" msgstr "Listas de Privacidade" -#: ../src/dialogs.py:2398 +#: ../src/dialogs.py:2612 msgid "Invalid List Name" msgstr "Nome de Lista Inválido" -#: ../src/dialogs.py:2399 +#: ../src/dialogs.py:2613 msgid "You must enter a name to create a privacy list." msgstr "Você deve digitar um nome para criar uma lista de privacidade." -#. Don't translate $Contact -#: ../src/dialogs.py:2433 +#: ../src/dialogs.py:2650 +msgid "$Contact has invited you to join a discussion" +msgstr "$Contact convidou você para ingressar em uma discussão" + +#: ../src/dialogs.py:2652 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact convidou você para entrar na conferência %(room_jid)s" -#. only if not None and not '' -#: ../src/dialogs.py:2445 +#: ../src/dialogs.py:2665 #, python-format msgid "Comment: %s" msgstr "Comentário: %s" -#: ../src/dialogs.py:2507 +#: ../src/dialogs.py:2731 msgid "Choose Sound" msgstr "Escolher Som" -#: ../src/dialogs.py:2517 ../src/dialogs.py:2562 +#: ../src/dialogs.py:2741 ../src/dialogs.py:2792 msgid "All files" msgstr "Todos os arquivos" -#: ../src/dialogs.py:2522 +#: ../src/dialogs.py:2746 msgid "Wav Sounds" msgstr "Sons Wav" -#: ../src/dialogs.py:2552 +#: ../src/dialogs.py:2779 msgid "Choose Image" msgstr "Escolha imagem" -#: ../src/dialogs.py:2567 +#: ../src/dialogs.py:2797 msgid "Images" msgstr "Imagens" -#: ../src/dialogs.py:2624 +#: ../src/dialogs.py:2862 #, python-format msgid "When %s becomes:" msgstr "Quando %s chega:" -#: ../src/dialogs.py:2626 +#: ../src/dialogs.py:2864 #, python-format msgid "Adding Special Notification for %s" msgstr "Adicionando Notificação Especial para %s" #. # means number -#: ../src/dialogs.py:2697 +#: ../src/dialogs.py:2935 msgid "#" msgstr "#" -#: ../src/dialogs.py:2703 +#: ../src/dialogs.py:2941 msgid "Condition" msgstr "Condição" -#: ../src/dialogs.py:2824 +#: ../src/dialogs.py:3059 msgid "when I am " msgstr "quando eu estiver" -#: ../src/disco.py:104 +#: ../src/disco.py:111 msgid "Others" msgstr "Outros" -#: ../src/disco.py:105 ../src/disco.py:106 ../src/disco.py:1350 -#: ../src/gajim.py:604 ../src/roster_window.py:272 ../src/roster_window.py:330 -#: ../src/roster_window.py:369 ../src/roster_window.py:451 -#: ../src/roster_window.py:483 ../src/roster_window.py:485 -#: ../src/roster_window.py:3920 ../src/roster_window.py:3922 -#: ../src/common/contacts.py:267 ../src/common/contacts.py:282 -#: ../src/common/helpers.py:43 +#: ../src/disco.py:112 ../src/disco.py:113 ../src/disco.py:1355 +#: ../src/gajim.py:660 ../src/roster_window.py:295 ../src/roster_window.py:355 +#: ../src/roster_window.py:395 ../src/roster_window.py:503 +#: ../src/roster_window.py:535 ../src/roster_window.py:537 +#: ../src/roster_window.py:4755 ../src/roster_window.py:4757 +#: ../src/common/contacts.py:295 ../src/common/contacts.py:310 +#: ../src/common/helpers.py:53 msgid "Transports" msgstr "Transportes" #. conference is a category for listing mostly groupchats in service discovery -#: ../src/disco.py:108 +#: ../src/disco.py:115 msgid "Conference" msgstr "Conferência" -#: ../src/disco.py:421 +#: ../src/disco.py:428 msgid "Without a connection, you can not browse available services" msgstr "Você deve estar conectado para visualizar os serviços disponíveis" -#: ../src/disco.py:500 +#: ../src/disco.py:502 #, python-format msgid "Service Discovery using account %s" msgstr "Buscar Serviços usando conta %s" -#: ../src/disco.py:502 +#: ../src/disco.py:504 msgid "Service Discovery" msgstr "Buscar Serviços" -#: ../src/disco.py:642 +#: ../src/disco.py:644 msgid "The service could not be found" msgstr "O serviço não pode ser encontrado" -#: ../src/disco.py:643 +#: ../src/disco.py:645 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." @@ -3647,180 +3941,435 @@ msgstr "" "Não existe serviço para o endereço que você entrou, ou não está respondendo. " "Verifique o endereço e tente novamente." -#: ../src/disco.py:647 ../src/disco.py:928 +#: ../src/disco.py:649 ../src/disco.py:930 msgid "The service is not browsable" msgstr "Serviço não navegável" -#: ../src/disco.py:648 +#: ../src/disco.py:650 msgid "This type of service does not contain any items to browse." msgstr "Este tipo de serviço não contém nenhum item para navegar." -#: ../src/disco.py:728 +#: ../src/disco.py:730 #, python-format msgid "Browsing %s using account %s" msgstr "Visualizando %s usando conta %s" -#: ../src/disco.py:767 +#: ../src/disco.py:769 msgid "_Browse" msgstr "_Navegar" -#: ../src/disco.py:929 +#: ../src/disco.py:931 msgid "This service does not contain any items to browse." msgstr "Este serviço não contém nenhum item para navegar." -#: ../src/disco.py:1147 -#, fuzzy +#: ../src/disco.py:1152 msgid "_Execute Command" msgstr "_Executar Comando" -#: ../src/disco.py:1157 ../src/disco.py:1355 +#: ../src/disco.py:1162 ../src/disco.py:1360 msgid "Re_gister" msgstr "Re_gistrar" -#: ../src/disco.py:1392 +#: ../src/disco.py:1397 #, python-format msgid "Scanning %d / %d.." msgstr "Buscando %d / %d" #. Users column -#: ../src/disco.py:1573 +#: ../src/disco.py:1579 msgid "Users" msgstr "Usuários" #. Description column -#: ../src/disco.py:1580 +#: ../src/disco.py:1587 msgid "Description" msgstr "Descrição" #. Id column -#: ../src/disco.py:1587 +#: ../src/disco.py:1595 msgid "Id" msgstr "Id" -#: ../src/disco.py:1810 +#: ../src/disco.py:1824 msgid "Subscribed" msgstr "Inscrito" -#: ../src/disco.py:1836 +#: ../src/disco.py:1832 +msgid "Node" +msgstr "Nó" + +#: ../src/disco.py:1889 msgid "New post" msgstr "Nova postagem" -#: ../src/disco.py:1842 +#: ../src/disco.py:1895 msgid "_Subscribe" msgstr "_Inscrever" -#: ../src/disco.py:1848 +#: ../src/disco.py:1901 msgid "_Unsubscribe" msgstr "_Desinscrever" -#: ../src/filetransfers_window.py:72 +#: ../src/features_window.py:47 +msgid "PyOpenSSL" +msgstr "PyOpenSSL" + +#: ../src/features_window.py:48 +msgid "" +"A library used to validate server certificates to ensure a secure connection." +msgstr "" +"Uma biblioteca usada para validar os certificados do servidor para garantir " +"uma conexão segura." + +#: ../src/features_window.py:49 ../src/features_window.py:50 +msgid "Requires python-pyopenssl." +msgstr "Requer o python-pyopenssl." + +#: ../src/features_window.py:51 +msgid "Bonjour / Zeroconf" +msgstr "Bonjour / Zeroconf" + +#: ../src/features_window.py:52 +msgid "Serverless chatting with autodetected clients in a local network." +msgstr "" +"Conversa sem servidor com clientes detectados automaticamente em uma rede " +"local." + +#: ../src/features_window.py:53 +msgid "Requires python-avahi." +msgstr "Requer o python-avahi." + +#: ../src/features_window.py:54 +msgid "Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." +msgstr "Requer pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." + +#: ../src/features_window.py:55 +msgid "gajim-remote" +msgstr "gajim-remote" + +#: ../src/features_window.py:56 +msgid "A script to controle gajim via commandline." +msgstr "Um script para controlar o Gajim via linha de comando." + +#: ../src/features_window.py:57 +msgid "Requires python-dbus." +msgstr "Requer o python-dbus." + +#: ../src/features_window.py:58 ../src/features_window.py:62 +#: ../src/features_window.py:66 ../src/features_window.py:70 +#: ../src/features_window.py:74 ../src/features_window.py:82 +#: ../src/features_window.py:86 ../src/features_window.py:98 +msgid "Feature not available under Windows." +msgstr "Recurso não disponível no Windows." + +#: ../src/features_window.py:59 +msgid "OpenGPG" +msgstr "OpenGPG" + +#: ../src/features_window.py:60 +msgid "Encrypting chatmessages with gpg keys." +msgstr "Criptografando as mensagens das conversas com chaves PGP." + +#: ../src/features_window.py:61 +msgid "Requires gpg and python-GnuPGInterface." +msgstr "Requer gpg e python-GnuPGInterface." + +#: ../src/features_window.py:63 +msgid "network-manager" +msgstr "network-manager" + +#: ../src/features_window.py:64 +msgid "Autodetection of network status." +msgstr "Detecção automática do status da rede." + +#: ../src/features_window.py:65 +msgid "Requires gnome-network-manager and python-dbus." +msgstr "Requer gnome-network-manager e python-dbus." + +#: ../src/features_window.py:67 +msgid "Session Management" +msgstr "Gerenciamento de Sessão" + +#: ../src/features_window.py:68 +msgid "Gajim session is stored on logout and restored on login." +msgstr "A sessão do Gajim é armazenada no logout and restaurada no login." + +#: ../src/features_window.py:69 +msgid "Requires python-gnome2." +msgstr "Requer python-gnome2." + +#: ../src/features_window.py:71 +msgid "gnome-keyring" +msgstr "gnome-keyring" + +#: ../src/features_window.py:72 +msgid "Passwords can be stored securely and not just in plaintext." +msgstr "" +"As senhas podem ser armazenadas de maneira segura e não apenas em texto " +"plano." + +#: ../src/features_window.py:73 +msgid "Requires gnome-keyring and python-gnome2-desktop." +msgstr "Requer gnome-keyring e python-gnome2-desktop." + +#: ../src/features_window.py:75 +msgid "SRV" +msgstr "SRV" + +#: ../src/features_window.py:76 +msgid "Ability to connect to servers which are using SRV records." +msgstr "Habilidade de conectar a servidores que estão usando registros SRV." + +#: ../src/features_window.py:77 +msgid "Requires dnsutils." +msgstr "Requer dnsutils." + +#: ../src/features_window.py:78 +msgid "Requires nslookup to use SRV records." +msgstr "Requer nslookup para usar registros SRV." + +#: ../src/features_window.py:79 +msgid "Spell Checker" +msgstr "Verificador Ortográfico" + +#: ../src/features_window.py:80 +msgid "Spellchecking of composed messages." +msgstr "Verificação ortográfica das mensagens escritas." + +#: ../src/features_window.py:81 +msgid "" +"Requires python-gnome2-extras or compilation of gtkspell module from Gajim " +"sources." +msgstr "" +"Requer python-gnome2-extras ou a compilação do módulo gtkspell a partir dos " +"fontes do Gajim." + +#: ../src/features_window.py:83 +msgid "Notification-daemon" +msgstr "Notification-daemon" + +#: ../src/features_window.py:84 +msgid "Passive popups notifying for new events." +msgstr "Popups passivos notificando novos eventos." + +#: ../src/features_window.py:85 +msgid "" +"Requires python-notify or instead python-dbus in conjunction with " +"notification-daemon." +msgstr "" +"Requer python-notify ou então python-dbus em conjunto com notification-" +"daemon." + +#: ../src/features_window.py:87 +msgid "Trayicon" +msgstr "Ícone da Bandeja" + +#: ../src/features_window.py:88 +msgid "A icon in systemtray reflecting the current presence." +msgstr "Um ícone na bandeja do sistema refletindo a presença atual." + +#: ../src/features_window.py:89 +msgid "" +"Requires python-gnome2-extras or compiled trayicon module from Gajim " +"sources." +msgstr "" +"Requer python-gnome2-extras ou módulo trayicon compilado a partir dos fontes " +"do Gajim." + +#: ../src/features_window.py:90 +msgid "Requires PyGTK >= 2.10." +msgstr "Requer PyGTK >= 2.10." + +#: ../src/features_window.py:91 +msgid "Idle" +msgstr "Ocioso" + +#: ../src/features_window.py:92 +msgid "Ability to measure idle time, in order to set auto status." +msgstr "" +"Habilidade de medir o tempo de inatividade para definir o status automático." + +#: ../src/features_window.py:93 ../src/features_window.py:94 +msgid "Requires compilation of the idle module from Gajim sources." +msgstr "Requer a compilação do módulo idle a partir dos fontes do Gajim." + +#: ../src/features_window.py:95 +msgid "LaTeX" +msgstr "LaTeX" + +#: ../src/features_window.py:96 +msgid "Transform LaTeX espressions between $$ $$." +msgstr "Tranforma expressões LaTeX entre $$ $$." + +#: ../src/features_window.py:97 +msgid "" +"Requires texlive-latex-base, dvips and imagemagick. You have to set " +"'use_latex' to True in the Advanced Configuration Editor." +msgstr "" +"Requer textlive-latex-base, dvips e imagemagick. Você tem que definir a " +"opção 'use_latex' para Verdadeiro no Editor de Configurações Avançadas." + +#: ../src/features_window.py:99 +msgid "End to end encryption" +msgstr "Criptografia end to end" + +#: ../src/features_window.py:100 +msgid "Encrypting chatmessages." +msgstr "Criptografando mensagens." + +#: ../src/features_window.py:101 ../src/features_window.py:102 +msgid "Requires python-crypto." +msgstr "Requer python-crypto." + +#: ../src/features_window.py:103 +msgid "RST Generator" +msgstr "Gerador RST" + +#: ../src/features_window.py:104 +msgid "" +"Generate XHTML output from RST code (see http://docutils.sourceforge.net/" +"docs/ref/rst/restructuredtext.html)." +msgstr "" +"Gera saída XHTML a partir de código RST (veja http://docutils.sourceforge." +"net/docs/ref/rst/restructuredtext.html)." + +#: ../src/features_window.py:105 ../src/features_window.py:106 +msgid "Requires python-docutils." +msgstr "Requer python-docutils." + +#: ../src/features_window.py:107 +msgid "libsexy" +msgstr "libsexy" + +#: ../src/features_window.py:108 +msgid "Ability to have clickable URLs in chat window." +msgstr "Habilidade de ter URL's clicáveis na janela de conversa." + +#: ../src/features_window.py:109 ../src/features_window.py:110 +msgid "Requires python-sexy." +msgstr "Requer python-sexy." + +#: ../src/features_window.py:117 ../src/common/helpers.py:248 +msgid "Available" +msgstr "Disponível" + +#: ../src/features_window.py:124 +msgid "Feature" +msgstr "Recurso" + +#: ../src/filetransfers_window.py:77 msgid "File" msgstr "Arquivo" -#: ../src/filetransfers_window.py:87 +#: ../src/filetransfers_window.py:92 msgid "Time" msgstr "Tempo" -#: ../src/filetransfers_window.py:99 +#: ../src/filetransfers_window.py:104 msgid "Progress" msgstr "Progresso" -#: ../src/filetransfers_window.py:161 ../src/filetransfers_window.py:215 +#: ../src/filetransfers_window.py:164 ../src/filetransfers_window.py:218 #, python-format msgid "Filename: %s" msgstr "Nome do arquivo: %s" -#: ../src/filetransfers_window.py:162 ../src/filetransfers_window.py:290 +#: ../src/filetransfers_window.py:165 ../src/filetransfers_window.py:305 #, python-format msgid "Size: %s" msgstr "Tamanho: %s" #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:171 ../src/filetransfers_window.py:181 -#: ../src/history_manager.py:463 +#: ../src/filetransfers_window.py:174 ../src/filetransfers_window.py:184 +#: ../src/history_manager.py:468 msgid "You" msgstr "Você" -#: ../src/filetransfers_window.py:172 +#: ../src/filetransfers_window.py:175 #, python-format msgid "Sender: %s" msgstr "Remetente: %s" -#: ../src/filetransfers_window.py:173 ../src/filetransfers_window.py:564 -#: ../src/tooltips.py:575 +#: ../src/filetransfers_window.py:176 ../src/filetransfers_window.py:593 +#: ../src/tooltips.py:592 msgid "Recipient: " msgstr "Destinatário: " -#: ../src/filetransfers_window.py:184 +#: ../src/filetransfers_window.py:187 #, python-format msgid "Saved in: %s" msgstr "Salvo em: %s" -#: ../src/filetransfers_window.py:186 +#: ../src/filetransfers_window.py:189 msgid "File transfer completed" msgstr "Transferência de arquivos completa" -#: ../src/filetransfers_window.py:200 ../src/filetransfers_window.py:206 +#: ../src/filetransfers_window.py:203 ../src/filetransfers_window.py:209 msgid "File transfer cancelled" msgstr "Transferência de arquivos cancelada" -#: ../src/filetransfers_window.py:200 ../src/filetransfers_window.py:207 +#: ../src/filetransfers_window.py:203 ../src/filetransfers_window.py:210 msgid "Connection with peer cannot be established." msgstr "Conexão ponto a ponto não pode ser estabelecida." -#: ../src/filetransfers_window.py:216 +#: ../src/filetransfers_window.py:219 #, python-format msgid "Recipient: %s" msgstr "Conteúdo: %s" -#: ../src/filetransfers_window.py:218 +#: ../src/filetransfers_window.py:221 #, python-format msgid "Error message: %s" msgstr "Mensagem de erro: %s" -#: ../src/filetransfers_window.py:219 +#: ../src/filetransfers_window.py:222 msgid "File transfer stopped by the contact at the other end" msgstr "Transferência de arquivo parada pelo contato do outro lado" -#: ../src/filetransfers_window.py:236 +#: ../src/filetransfers_window.py:243 msgid "Choose File to Send..." msgstr "Escolha o Arquivo para Enviar..." -#: ../src/filetransfers_window.py:255 +#: ../src/filetransfers_window.py:259 ../src/tooltips.py:631 +#, fuzzy +msgid "Description: " +msgstr "Descrição: %s" + +#: ../src/filetransfers_window.py:270 msgid "Gajim cannot access this file" msgstr "Gajim não pode acessar este arquivo" -#: ../src/filetransfers_window.py:256 +#: ../src/filetransfers_window.py:271 msgid "This file is being used by another process." msgstr "Este arquivo está sendo usado por outro processo." -#: ../src/filetransfers_window.py:288 +#: ../src/filetransfers_window.py:303 #, python-format msgid "File: %s" msgstr "Arquivo: %s" -#: ../src/filetransfers_window.py:293 +#: ../src/filetransfers_window.py:308 #, python-format msgid "Type: %s" msgstr "Tipo: %s" -#: ../src/filetransfers_window.py:295 +#: ../src/filetransfers_window.py:310 #, python-format msgid "Description: %s" msgstr "Descrição: %s" -#: ../src/filetransfers_window.py:296 +#: ../src/filetransfers_window.py:311 #, python-format msgid "%s wants to send you a file:" msgstr "%s quer te enviar um arquivo:" -#: ../src/filetransfers_window.py:310 ../src/gtkgui_helpers.py:750 +#: ../src/filetransfers_window.py:324 ../src/gtkgui_helpers.py:773 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Não é possível sobrescrever o arquivo \"%s\"" -#: ../src/filetransfers_window.py:311 ../src/gtkgui_helpers.py:752 +#: ../src/filetransfers_window.py:325 ../src/gtkgui_helpers.py:775 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." @@ -3828,31 +4377,31 @@ msgstr "" "Um arquivo com este nome já existe e você não tem permissão para sobrescrevê-" "lo." -#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:756 +#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:779 msgid "This file already exists" msgstr "Este arquivo já existe" -#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:756 +#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:779 msgid "What do you want to do?" msgstr "O que você quer fazer?" -#: ../src/filetransfers_window.py:330 ../src/gtkgui_helpers.py:766 +#: ../src/filetransfers_window.py:344 ../src/gtkgui_helpers.py:789 #, python-format msgid "Directory \"%s\" is not writable" msgstr "O diretório \"%s\" não é gravável" -#: ../src/filetransfers_window.py:330 ../src/gtkgui_helpers.py:767 +#: ../src/filetransfers_window.py:344 ../src/gtkgui_helpers.py:790 msgid "You do not have permission to create files in this directory." msgstr "Você não tem permissão para criar este diretório" -#: ../src/filetransfers_window.py:340 +#: ../src/filetransfers_window.py:354 msgid "Save File as..." msgstr "Salvar Arquivo como..." #. 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:421 +#: ../src/filetransfers_window.py:434 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -3860,65 +4409,65 @@ 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:497 +#: ../src/filetransfers_window.py:523 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" -#: ../src/filetransfers_window.py:536 ../src/filetransfers_window.py:539 +#: ../src/filetransfers_window.py:563 ../src/filetransfers_window.py:566 msgid "Invalid File" msgstr "Arquivo inválido" -#: ../src/filetransfers_window.py:536 +#: ../src/filetransfers_window.py:563 msgid "File: " msgstr "Arquivo:" -#: ../src/filetransfers_window.py:540 +#: ../src/filetransfers_window.py:567 msgid "It is not possible to send empty files" msgstr "não é possível enviar arquivos vazios" -#: ../src/filetransfers_window.py:560 ../src/tooltips.py:565 +#: ../src/filetransfers_window.py:589 ../src/tooltips.py:582 msgid "Name: " msgstr "Nome: " -#: ../src/filetransfers_window.py:562 ../src/tooltips.py:569 +#: ../src/filetransfers_window.py:591 ../src/tooltips.py:586 msgid "Sender: " msgstr "Remetente: " -#: ../src/filetransfers_window.py:750 +#: ../src/filetransfers_window.py:779 msgid "Pause" msgstr "Pausa" -#: ../src/gajim.py:47 +#: ../src/gajim.py:56 #, python-format msgid "%s is not a valid loglevel" -msgstr "%s não é um nível de registro (loglevel) válido" +msgstr "%s não é um nível de gravação (loglevel) válido" -#: ../src/gajim.py:122 +#: ../src/gajim.py:129 msgid "Gajim needs X server to run. Quiting..." msgstr "O Gajim necessita do servidor X para rodar. Encerrando..." -#: ../src/gajim.py:126 +#: ../src/gajim.py:156 msgid "Gajim needs PyGTK 2.8 or above" msgstr "O Gajim necessita do PyGTK 2.8 ou superior" -#: ../src/gajim.py:127 +#: ../src/gajim.py:157 msgid "Gajim needs PyGTK 2.8 or above to run. Quiting..." msgstr "O Gajim necessita do PyGTK 2.8 ou superior para rodar. Encerrando..." -#: ../src/gajim.py:129 +#: ../src/gajim.py:159 msgid "Gajim needs GTK 2.8 or above" msgstr "O Gajim necessita do GTK 2.8 ou superior" -#: ../src/gajim.py:130 +#: ../src/gajim.py:160 msgid "Gajim needs GTK 2.8 or above to run. Quiting..." msgstr "O Gajim necessita do GTK 2.8 ou superior para rodar. Encerrando..." -#: ../src/gajim.py:135 +#: ../src/gajim.py:165 msgid "GTK+ runtime is missing libglade support" msgstr "Não existe suporte para libglade no GTK+ runtime" -#: ../src/gajim.py:137 +#: ../src/gajim.py:167 #, python-format msgid "" "Please remove your current GTK+ runtime and install the latest stable " @@ -3927,22 +4476,22 @@ msgstr "" "Por favor remova seu GTK+ runtime atual e instale a última versão estável de " "%s" -#: ../src/gajim.py:139 +#: ../src/gajim.py:169 msgid "" "Please make sure that GTK+ and PyGTK have libglade support in your system." msgstr "" "Por favor certifique-se de que o GTK e o PyGTK tem suporte ao libglade em " "seu sistema." -#: ../src/gajim.py:144 +#: ../src/gajim.py:174 msgid "Gajim needs PySQLite2 to run" msgstr "Gajim necessita de PySQLite2 para rodar" -#: ../src/gajim.py:152 +#: ../src/gajim.py:182 msgid "Gajim needs pywin32 to run" msgstr "O Gajim precisa do pywin32 para rodar" -#: ../src/gajim.py:153 +#: ../src/gajim.py:183 #, python-format msgid "" "Please make sure that Pywin32 is installed on your system. You can get it at " @@ -3952,11 +4501,11 @@ msgstr "" "pode obtê-lo em %s" #. set the icon to all newly opened wind -#: ../src/gajim.py:300 +#: ../src/gajim.py:328 msgid "Gajim is already running" msgstr "O Gajim já está em execução" -#: ../src/gajim.py:301 +#: ../src/gajim.py:329 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -3964,83 +4513,166 @@ msgstr "" "Outra instância do Gajim parece estar rodando\n" "Executar de qualquer forma?" -#: ../src/gajim.py:408 +#: ../src/gajim.py:352 ../src/common/connection_handlers.py:908 +#: ../src/common/connection_handlers.py:1620 +#: ../src/common/connection_handlers.py:1649 +#: ../src/common/connection_handlers.py:1659 +#: ../src/common/connection_handlers.py:1678 +#: ../src/common/connection_handlers.py:1915 +#: ../src/common/connection_handlers.py:2027 ../src/common/connection.py:939 +msgid "Disk Write Error" +msgstr "Erro de Escrita em Disco" + +#: ../src/gajim.py:448 +msgid "Do you accept this request?" +msgstr "Você aceita a solicitação?" + +#: ../src/gajim.py:450 +#, python-format +msgid "Do you accept this request on account %s?" +msgstr "Você aceita essa requisição na conta %s?" + +#: ../src/gajim.py:453 #, python-format msgid "HTTP (%s) Authorization for %s (id: %s)" msgstr "Autorização HTTP (%s) para %s (id: %s)" -#: ../src/gajim.py:409 -msgid "Do you accept this request?" -msgstr "Você aceita a solicitação?" - -#: ../src/gajim.py:455 ../src/notify.py:435 +#: ../src/gajim.py:500 ../src/notify.py:466 msgid "Connection Failed" msgstr "Falha na Conexão" -#: ../src/gajim.py:775 +#: ../src/gajim.py:834 #, python-format msgid "Subject: %s" msgstr "Assunto: %s" #. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) -#: ../src/gajim.py:820 ../src/gajim.py:833 +#: ../src/gajim.py:881 ../src/gajim.py:894 #, python-format msgid "error while sending %s ( %s )" msgstr "erro no envio %s ( %s )" -#: ../src/gajim.py:866 +#: ../src/gajim.py:927 msgid "Authorization accepted" msgstr "Autorização aceita" -#: ../src/gajim.py:867 +#: ../src/gajim.py:928 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "O contato \"%s\" autorizou você para ver seu status." -#: ../src/gajim.py:875 +#: ../src/gajim.py:936 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Contato \"%s\" removeu sua inscrição" -#: ../src/gajim.py:876 +#: ../src/gajim.py:937 msgid "You will always see him or her as offline." msgstr "Você sempre o verá como offline." -#: ../src/gajim.py:920 +#: ../src/gajim.py:981 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Contato com \"%s\" não pode ser estabelecido" -#: ../src/gajim.py:921 ../src/common/connection.py:435 +#: ../src/gajim.py:982 ../src/common/connection.py:465 msgid "Check your connection or try again later." msgstr "Verifique sua conexão ou tente novamente mais tarde." -#: ../src/gajim.py:1070 ../src/roster_window.py:1218 +#: ../src/gajim.py:1151 ../src/groupchat_control.py:991 +#, python-format +msgid "%s is now known as %s" +msgstr "%s agora é conhecido como %s" + +#: ../src/gajim.py:1167 ../src/roster_window.py:1372 #, python-format msgid "%s is now %s (%s)" msgstr "%s agora está %s (%s)" #. No status message -#: ../src/gajim.py:1073 ../src/groupchat_control.py:968 -#: ../src/roster_window.py:1221 +#: ../src/gajim.py:1170 ../src/groupchat_control.py:1142 +#: ../src/roster_window.py:1375 #, python-format msgid "%s is now %s" msgstr "%s agora está %s" -#: ../src/gajim.py:1170 +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/gajim.py:1291 ../src/groupchat_control.py:951 +msgid "Any occupant is allowed to see your full JID" +msgstr "Algum ocupante tem permissão de ver o seu JID inteiro" + +#: ../src/gajim.py:1294 +msgid "Room now shows unavailable member" +msgstr "A sala agora mostra membros indisponíveis" + +#: ../src/gajim.py:1296 +msgid "room now does not show unavailable members" +msgstr "a sala agora não mostra membros indisponíveis" + +#: ../src/gajim.py:1299 +msgid "A non-privacy-related room configuration change has occurred" +msgstr "" +"Uma modificação na configuração da sala que não tem relação com privacidade " +"ocorreu" + +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#: ../src/gajim.py:1302 +msgid "Room logging is now enabled" +msgstr "A gravação das conversas da sala está ativo agora" + +#: ../src/gajim.py:1304 +msgid "Room logging is now disabled" +msgstr "A gravação das conversas da sala está desligado agora" + +#: ../src/gajim.py:1306 +msgid "Room is now non-anonymous" +msgstr "Agora a sala é não-anônima" + +#: ../src/gajim.py:1309 +msgid "Room is now semi-anonymous" +msgstr "Agora a sala é semi-anônima" + +#: ../src/gajim.py:1312 +msgid "Room is now fully-anonymous" +msgstr "Agora a sala é totalmente anônima" + +#: ../src/gajim.py:1344 +#, python-format +msgid "A Password is required to join the room %s. Please type it" +msgstr "Uma Senha é requerida para ingressar na sala %s. Por favor, digite-a" + +#: ../src/gajim.py:1379 msgid "Your passphrase is incorrect" msgstr "Sua frase de acesso está incorreta" -#: ../src/gajim.py:1171 +#: ../src/gajim.py:1380 msgid "You are currently connected without your OpenPGP key." msgstr "Você está atualmente conectado sem sua chave OpenPGP." -#: ../src/gajim.py:1274 +#: ../src/gajim.py:1392 ../src/secrets.py:44 +msgid "Passphrase Required" +msgstr "Frase de acesso é obrigatória" + +#: ../src/gajim.py:1393 +#, python-format +msgid "Enter GPG key passphrase for account %s." +msgstr "Entre com a frase de acesso da chave GPG para conta %s" + +#: ../src/gajim.py:1405 +msgid "Wrong Passphrase" +msgstr "Frase de acesso Errada" + +#: ../src/gajim.py:1406 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "Por favor, reescreva sua frase de segurança GPG ou pressione Cancelar." + +#: ../src/gajim.py:1515 #, python-format msgid "New mail on %(gmail_mail_address)s" msgstr "Novo email em %(gmail_mail_address)s" -#: ../src/gajim.py:1276 +#: ../src/gajim.py:1517 #, python-format msgid "You have %d new mail conversation" msgid_plural "You have %d new mail conversations" @@ -4050,7 +4682,7 @@ msgstr[1] "Você tem %d novas mensagens de email" #. FIXME: emulate Gtalk client popups. find out what they parse and how #. they decide what to show #. each message has a 'From', 'Subject' and 'Snippet' field -#: ../src/gajim.py:1285 +#: ../src/gajim.py:1526 #, python-format msgid "" "\n" @@ -4059,92 +4691,154 @@ msgstr "" "\n" "De: %(from_address)s" -#: ../src/gajim.py:1441 +#: ../src/gajim.py:1704 #, python-format msgid "%s wants to send you a file." msgstr "%s quer te enviar um arquivo:" -#: ../src/gajim.py:1506 +#: ../src/gajim.py:1769 #, python-format msgid "You successfully received %(filename)s from %(name)s." msgstr "Você recebeu com sucesso %(filename)s de %(name)s." #. ft stopped -#: ../src/gajim.py:1510 +#: ../src/gajim.py:1773 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Transferência de arquivo de %(filename)s de %(name)s parou." -#: ../src/gajim.py:1523 +#: ../src/gajim.py:1786 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Você enviou com sucesso o %(filename)s a %(name)s." #. ft stopped -#: ../src/gajim.py:1527 +#: ../src/gajim.py:1790 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Transferência de arquivo de %(filename)s to %(name)s parado." -#: ../src/gajim.py:1640 +#: ../src/gajim.py:1885 +msgid "Session negotiation cancelled" +msgstr "Negociação da sessão cancelada" + +#: ../src/gajim.py:1886 +#, python-format +msgid "The client at %s cancelled the session negotiation." +msgstr "O cliente em %s cancelou a negociação da sessão." + +#: ../src/gajim.py:1927 ../src/gajim.py:1971 +msgid "Confirm these session options" +msgstr "Confirme essas opções de sessão" + +#: ../src/gajim.py:1928 +#, python-format +msgid "" +"The remote client wants to negotiate an session with these features:\n" +"\n" +"\t\t%s\n" +"\n" +"\t\tAre these options acceptable?" +msgstr "" +"O cliente remoto quer negociar uma sessão com esses recursos:\n" +"\n" +"\t\t%s\n" +"\n" +"\t\tEssas opções são aceitáveis?" + +#: ../src/gajim.py:1972 +#, python-format +msgid "" +"The remote client selected these options:\n" +"\n" +"%s\n" +"\n" +"Continue with the session?" +msgstr "" +"O cliente remoto selecionou essas opções:\n" +"\n" +"%s\n" +"\n" +"Continuar com a sessão?" + +#: ../src/gajim.py:2097 msgid "Username Conflict" msgstr "Conflito de nome de usuário" -#: ../src/gajim.py:1641 +#: ../src/gajim.py:2098 msgid "Please type a new username for your local account" msgstr "Por favor digite um novo nome de usuário para sua conta local" -#: ../src/gajim.py:1658 +#: ../src/gajim.py:2115 msgid "Ping?" -msgstr "" +msgstr "Ping?" -#: ../src/gajim.py:1666 +#: ../src/gajim.py:2123 #, python-format msgid "Pong! (%s s.)" -msgstr "" +msgstr "Pong! (%s s.)" -#: ../src/gajim.py:1672 +#: ../src/gajim.py:2129 msgid "Error." +msgstr "Erro." + +#: ../src/gajim.py:2154 +msgid "Resource Conflict" +msgstr "Conflito de Recurso" + +#: ../src/gajim.py:2155 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" msgstr "" +"Você já está conectado a essa conta com o mesmo recurso. Por favor digite um " +"novo" #. it is good to notify the user #. in case he or she cannot see the output of the console -#: ../src/gajim.py:2012 +#: ../src/gajim.py:2521 msgid "Could not save your settings and preferences" msgstr "Impossível salvar suas preferências" -#: ../src/gajim.py:2211 +#. sorted alphanum +#: ../src/gajim.py:2657 ../src/common/config.py:102 +#: ../src/common/config.py:413 ../src/common/optparser.py:206 +#: ../src/common/optparser.py:424 ../src/common/optparser.py:458 +msgid "default" +msgstr "padrão" + +#: ../src/gajim.py:2743 msgid "Network Manager support not available" msgstr "Não há suporte disponível para o Network Manager" -#: ../src/gajim.py:2290 +#: ../src/gajim.py:2848 msgid "Session Management support not available (missing gnome.ui module)" msgstr "" "Suporte de gerenciamento da sessão não disponível (faltando o módulo gnome." "ui)" -#: ../src/gajim-remote.py:65 +#: ../src/gajim-remote.py:73 msgid "Shows a help on specific command" msgstr "Mostra uma ajuda para um comando específico" #. User gets help for the command, specified by this parameter -#: ../src/gajim-remote.py:68 +#: ../src/gajim-remote.py:76 msgid "command" msgstr "comando" -#: ../src/gajim-remote.py:69 +#: ../src/gajim-remote.py:77 msgid "show help on command" msgstr "mostrar ajuda no comando" -#: ../src/gajim-remote.py:73 +#: ../src/gajim-remote.py:81 msgid "Shows or hides the roster window" msgstr "Mostrar ou esconder a janela principal" -#: ../src/gajim-remote.py:77 +#: ../src/gajim-remote.py:85 msgid "Pops up a window with the next pending event" msgstr "Exibir uma janela popup com o próximo evento pendente" -#: ../src/gajim-remote.py:81 +#: ../src/gajim-remote.py:89 msgid "" "Prints a list of all contacts in the roster. Each contact appears on a " "separate line" @@ -4152,48 +4846,48 @@ msgstr "" "Exibir uma lista de todos os contatos na lista. Cada contato aparecerá em " "uma linha separada" -#: ../src/gajim-remote.py:84 ../src/gajim-remote.py:99 -#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:122 -#: ../src/gajim-remote.py:136 ../src/gajim-remote.py:157 -#: ../src/gajim-remote.py:187 ../src/gajim-remote.py:196 -#: ../src/gajim-remote.py:203 ../src/gajim-remote.py:210 -#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:237 -#: ../src/gajim-remote.py:246 +#: ../src/gajim-remote.py:92 ../src/gajim-remote.py:107 +#: ../src/gajim-remote.py:117 ../src/gajim-remote.py:130 +#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:153 +#: ../src/gajim-remote.py:174 ../src/gajim-remote.py:204 +#: ../src/gajim-remote.py:213 ../src/gajim-remote.py:220 +#: ../src/gajim-remote.py:227 ../src/gajim-remote.py:238 +#: ../src/gajim-remote.py:254 ../src/gajim-remote.py:263 msgid "account" msgstr "conta" -#: ../src/gajim-remote.py:84 +#: ../src/gajim-remote.py:92 msgid "show only contacts of the given account" msgstr "mostrar somente os contatos desta conta" -#: ../src/gajim-remote.py:90 +#: ../src/gajim-remote.py:98 msgid "Prints a list of registered accounts" msgstr "Imprimir uma lista das contas registradas" -#: ../src/gajim-remote.py:94 +#: ../src/gajim-remote.py:102 msgid "Changes the status of account or accounts" msgstr "Mudar o status da conta ou contas" #. offline, online, chat, away, xa, dnd, invisible should not be translated -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:105 msgid "status" msgstr "status" -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:105 msgid "one of: offline, online, chat, away, xa, dnd, invisible " msgstr "" "um desses: desconectado, conectado, bate-papo, inativo, fora, np, invisível" -#: ../src/gajim-remote.py:98 ../src/gajim-remote.py:119 -#: ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:106 ../src/gajim-remote.py:127 +#: ../src/gajim-remote.py:141 ../src/gajim-remote.py:152 msgid "message" msgstr "mensagem" -#: ../src/gajim-remote.py:98 +#: ../src/gajim-remote.py:106 msgid "status message" msgstr "mensagem de status" -#: ../src/gajim-remote.py:99 +#: ../src/gajim-remote.py:107 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" @@ -4202,21 +4896,21 @@ msgstr "" "status de todas as contas existentes com a opção \"sincronizar com status " "global\" marcada" -#: ../src/gajim-remote.py:105 +#: ../src/gajim-remote.py:113 msgid "Shows the chat dialog so that you can send messages to a contact" msgstr "" "Mostrar o diálogo do bate-papo onde você pode enviar mensagens para um " "contato" -#: ../src/gajim-remote.py:107 +#: ../src/gajim-remote.py:115 msgid "JID of the contact that you want to chat with" msgstr "JID do contato que você quer conversar" -#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:187 +#: ../src/gajim-remote.py:117 ../src/gajim-remote.py:204 msgid "if specified, contact is taken from the contact list of this account" msgstr "se especificado, o contato é feito da lista de contatos desta conta" -#: ../src/gajim-remote.py:114 +#: ../src/gajim-remote.py:122 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 " @@ -4226,28 +4920,30 @@ msgstr "" "são opcionais. Se você quer configurar somente a 'conta', sem a 'chave " "OpenPGP', apenas configure a 'chave para ''." -#: ../src/gajim-remote.py:118 ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:126 ../src/gajim-remote.py:139 msgid "JID of the contact that will receive the message" msgstr "JID do contato que irá receber a mensagem" -#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:127 ../src/gajim-remote.py:141 +#: ../src/gajim-remote.py:152 msgid "message contents" msgstr "conteúdos da mensagem" -#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 +#: ../src/gajim-remote.py:128 ../src/gajim-remote.py:142 msgid "pgp key" msgstr "chave pgp" -#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 +#: ../src/gajim-remote.py:128 ../src/gajim-remote.py:142 msgid "if specified, the message will be encrypted using this public key" msgstr "" "se especificada, a mensagem será criptografada usando esta chave pública" -#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:136 +#: ../src/gajim-remote.py:130 ../src/gajim-remote.py:144 +#: ../src/gajim-remote.py:153 msgid "if specified, the message will be sent using this account" msgstr "se especificada, a mensagem será enviada usando esta conta" -#: ../src/gajim-remote.py:127 +#: ../src/gajim-remote.py:135 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 " @@ -4257,127 +4953,136 @@ msgstr "" "conta são opcionais. Se você quer configurar somente a 'conta', sem a 'chave " "OpenPGP, apenas configure a 'chave OpenPGP' para ''." -#: ../src/gajim-remote.py:132 +#: ../src/gajim-remote.py:140 msgid "subject" msgstr "assunto" -#: ../src/gajim-remote.py:132 +#: ../src/gajim-remote.py:140 msgid "message subject" msgstr "assunto da mensagem" -#: ../src/gajim-remote.py:141 +#: ../src/gajim-remote.py:149 +msgid "Sends new message to a groupchat you've joined." +msgstr "" +"Envia uma nova messagem para uma conferência em que você tiver ingressado." + +#: ../src/gajim-remote.py:151 +msgid "JID of the room that will receive the message" +msgstr "O JID do contato que receberá a mensagem" + +#: ../src/gajim-remote.py:158 msgid "Gets detailed info on a contact" msgstr "Informações detalhadas do contato" -#: ../src/gajim-remote.py:143 ../src/gajim-remote.py:156 -#: ../src/gajim-remote.py:186 ../src/gajim-remote.py:195 +#: ../src/gajim-remote.py:160 ../src/gajim-remote.py:173 +#: ../src/gajim-remote.py:203 ../src/gajim-remote.py:212 msgid "JID of the contact" msgstr "JID do contato" -#: ../src/gajim-remote.py:147 +#: ../src/gajim-remote.py:164 msgid "Gets detailed info on a account" msgstr "Informações detalhadas do contato" -#: ../src/gajim-remote.py:149 +#: ../src/gajim-remote.py:166 msgid "Name of the account" msgstr "Nome da conta" -#: ../src/gajim-remote.py:153 +#: ../src/gajim-remote.py:170 msgid "Sends file to a contact" msgstr "Enviar arquivo para um contato" -#: ../src/gajim-remote.py:155 +#: ../src/gajim-remote.py:172 msgid "file" msgstr "arquivo" -#: ../src/gajim-remote.py:155 +#: ../src/gajim-remote.py:172 msgid "File path" msgstr "Caminho do arquivo" -#: ../src/gajim-remote.py:157 +#: ../src/gajim-remote.py:174 msgid "if specified, file will be sent using this account" msgstr "se especificada, arquivo irá ser enviado usando esta conta" -#: ../src/gajim-remote.py:162 +#: ../src/gajim-remote.py:179 msgid "Lists all preferences and their values" msgstr "Lista todas as preferências e seus valores" -#: ../src/gajim-remote.py:166 +#: ../src/gajim-remote.py:183 msgid "Sets value of 'key' to 'value'." msgstr "Ajusta o valor da 'chave' ao 'valor '." -#: ../src/gajim-remote.py:168 +#: ../src/gajim-remote.py:185 msgid "key=value" msgstr "chave=valor" -#: ../src/gajim-remote.py:168 +#: ../src/gajim-remote.py:185 msgid "'key' is the name of the preference, 'value' is the value to set it to" msgstr "'chave' é o nome de preferência, 'valor' é o valor para ajustá-la" -#: ../src/gajim-remote.py:173 +#: ../src/gajim-remote.py:190 msgid "Deletes a preference item" msgstr "Deleta um item de preferência" -#: ../src/gajim-remote.py:175 +#: ../src/gajim-remote.py:192 msgid "key" msgstr "chave" -#: ../src/gajim-remote.py:175 +#: ../src/gajim-remote.py:192 msgid "name of the preference to be deleted" msgstr "nome da preferência a ser deletado" -#: ../src/gajim-remote.py:179 +#: ../src/gajim-remote.py:196 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Escreve o estado atual das preferências do Gajim em um arquivo .config" -#: ../src/gajim-remote.py:184 +#: ../src/gajim-remote.py:201 msgid "Removes contact from roster" msgstr "Remover contato da lista" -#: ../src/gajim-remote.py:193 +#: ../src/gajim-remote.py:210 msgid "Adds contact to roster" msgstr "Adicionar contato para a lista" -#: ../src/gajim-remote.py:195 +#: ../src/gajim-remote.py:212 msgid "jid" msgstr "JID" -#: ../src/gajim-remote.py:196 +#: ../src/gajim-remote.py:213 msgid "Adds new contact to this account" msgstr "Adicionar novo contato para esta conta" -#: ../src/gajim-remote.py:201 +#: ../src/gajim-remote.py:218 msgid "Returns current status (the global one unless account is specified)" msgstr "Retorna o status atual (global a menos que o cliente for especificado)" -#: ../src/gajim-remote.py:208 +#: ../src/gajim-remote.py:225 msgid "" "Returns current status message(the global one unless account is specified)" msgstr "" "Retorna a mensagem de status atual (global a menos que a conta for " "especificada)" -#: ../src/gajim-remote.py:215 +#: ../src/gajim-remote.py:232 msgid "Returns number of unread messages" msgstr "Retorna o número das mensagens não lidas" -#: ../src/gajim-remote.py:219 +#: ../src/gajim-remote.py:236 msgid "Opens 'Start Chat' dialog" msgstr "Abrir o diálogo 'Iniciar Conversa'" -#: ../src/gajim-remote.py:221 +#: ../src/gajim-remote.py:238 msgid "Starts chat, using this account" msgstr "Iniciar conversa, usando esta conta" -#: ../src/gajim-remote.py:225 +#: ../src/gajim-remote.py:242 msgid "Sends custom XML" msgstr "Envia XML personalizado" -#: ../src/gajim-remote.py:227 +#: ../src/gajim-remote.py:244 msgid "XML to send" msgstr "XML a enviar" -#: ../src/gajim-remote.py:228 +#: ../src/gajim-remote.py:245 msgid "" "Account in which the xml will be sent; if not specified, xml will be sent to " "all accounts" @@ -4385,35 +5090,35 @@ msgstr "" "A conta em que o XML será enviado; se não estiver especificado, será enviado " "para todas as contas" -#: ../src/gajim-remote.py:234 +#: ../src/gajim-remote.py:251 msgid "Handle a xmpp:/ uri" msgstr "Manipular uma URI xmpp:/" -#: ../src/gajim-remote.py:236 +#: ../src/gajim-remote.py:253 msgid "uri" msgstr "URI" -#: ../src/gajim-remote.py:241 +#: ../src/gajim-remote.py:258 msgid "Join a MUC room" msgstr "Entrar em uma sala MUC" -#: ../src/gajim-remote.py:243 +#: ../src/gajim-remote.py:260 msgid "room" msgstr "sala" -#: ../src/gajim-remote.py:244 +#: ../src/gajim-remote.py:261 msgid "nick" msgstr "apelido" -#: ../src/gajim-remote.py:245 +#: ../src/gajim-remote.py:262 msgid "password" msgstr "senha" -#: ../src/gajim-remote.py:268 +#: ../src/gajim-remote.py:285 msgid "Missing argument \"contact_jid\"" msgstr "Argumento não informado \"contact_jid\"" -#: ../src/gajim-remote.py:287 +#: ../src/gajim-remote.py:304 #, python-format msgid "" "'%s' is not in your roster.\n" @@ -4422,11 +5127,11 @@ msgstr "" "'%s' não está em sua lista.\n" "Por favor, especifique a conta para enviar a mensagem." -#: ../src/gajim-remote.py:290 +#: ../src/gajim-remote.py:307 msgid "You have no active account" msgstr "Você não tem uma conta ativa" -#: ../src/gajim-remote.py:354 +#: ../src/gajim-remote.py:371 #, python-format msgid "" "Usage: %s %s %s \n" @@ -4435,16 +5140,16 @@ msgstr "" "Uso: %s %s %s \n" "\t %s" -#: ../src/gajim-remote.py:357 +#: ../src/gajim-remote.py:374 msgid "Arguments:" msgstr "Argumentos:" -#: ../src/gajim-remote.py:361 +#: ../src/gajim-remote.py:378 #, python-format msgid "%s not found" msgstr "%s não encontrado" -#: ../src/gajim-remote.py:365 +#: ../src/gajim-remote.py:382 #, python-format msgid "" "Usage: %s command [arguments]\n" @@ -4453,7 +5158,7 @@ msgstr "" "Uso: %s comando [argumentos]\n" "Comando é um desses:\n" -#: ../src/gajim-remote.py:438 +#: ../src/gajim-remote.py:455 #, python-format msgid "" "Too many arguments. \n" @@ -4462,7 +5167,7 @@ msgstr "" "Muitos argumentos.\n" "Digite \"%s help %s\" para mais informações" -#: ../src/gajim-remote.py:442 +#: ../src/gajim-remote.py:459 #, python-format msgid "" "Argument \"%s\" is not specified. \n" @@ -4471,116 +5176,152 @@ msgstr "" "Argumento \"%s\" não está especificado. \n" "Tipo \"%s ajuda %s\" para maiores informações" -#: ../src/gajim-remote.py:460 +#: ../src/gajim-remote.py:477 msgid "Wrong uri" msgstr "URI incorreta" -#: ../src/gajim_themes_window.py:60 +#: ../src/gajim_themes_window.py:67 msgid "Theme" msgstr "Tema" +#: ../src/gajim_themes_window.py:105 +msgid "You cannot make changes to the default theme" +msgstr "Você não pode fazer alterações no tema padrão" + +#: ../src/gajim_themes_window.py:106 +msgid "Please create a clean new theme with your desired name." +msgstr "Crie um novo tema com o nome que você desejar." + #. don't confuse translators -#: ../src/gajim_themes_window.py:155 +#: ../src/gajim_themes_window.py:180 msgid "theme name" msgstr "nome do tema" -#: ../src/gajim_themes_window.py:172 +#: ../src/gajim_themes_window.py:197 msgid "You cannot delete your current theme" msgstr "Você não pode apagar o seu tema corrente" -#: ../src/gajim_themes_window.py:173 +#: ../src/gajim_themes_window.py:198 msgid "Please first choose another for your current theme." msgstr "Por favor escolha outro para seu tema corrente." -#: ../src/groupchat_control.py:122 +#: ../src/groupchat_control.py:139 msgid "Sending private message failed" msgstr "Falha ao Enviar uma mensagem privada" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:124 +#: ../src/groupchat_control.py:141 #, python-format msgid "You are no longer in group chat \"%s\" or \"%s\" has left." msgstr "Você não está mais na sala \"%s\" ou \"%s\" saiu." -#: ../src/groupchat_control.py:322 +#: ../src/groupchat_control.py:350 msgid "Insert Nickname" msgstr "Inserir Apelido" +#: ../src/groupchat_control.py:878 +msgid "Really send file?" +msgstr "Enviar o arquivo mesmo?" + +#: ../src/groupchat_control.py:879 +#, python-format +msgid "If you send a file to %s, he/she will know your real Jabber ID." +msgstr "Se você enviar um arquivo para %s, ele(a) saberá o seu Jabber ID real." + +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/groupchat_control.py:954 +msgid "Room logging is enabled" +msgstr "A gravação das conversas da sala está ligado" + +#: ../src/groupchat_control.py:956 +msgid "A new room has been created" +msgstr "Uma nova sala foi criada" + +#: ../src/groupchat_control.py:959 +msgid "The server has assigned or modified your roomnick" +msgstr "O servidor atribuiu ou modificou o apelido da sua sala" + #. do not print 'kicked by None' -#: ../src/groupchat_control.py:850 +#: ../src/groupchat_control.py:965 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s foi chutado: %(reason)s" -#: ../src/groupchat_control.py:854 +#: ../src/groupchat_control.py:969 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" msgstr "%(nick)s foi chutado por %(who)s: %(reason)s" #. do not print 'banned by None' -#: ../src/groupchat_control.py:861 +#: ../src/groupchat_control.py:976 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s foi banido: %(reason)s" -#: ../src/groupchat_control.py:865 +#: ../src/groupchat_control.py:980 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(nick)s foi banido por %(who)s: %(reason)s" -#: ../src/groupchat_control.py:873 +#: ../src/groupchat_control.py:989 #, python-format msgid "You are now known as %s" msgstr "Você agora é conhecido como %s" -#: ../src/groupchat_control.py:875 +#: ../src/groupchat_control.py:1025 ../src/groupchat_control.py:1029 +#: ../src/groupchat_control.py:1034 #, python-format -msgid "%s is now known as %s" -msgstr "%s agora é conhecido como %s" +msgid "%(nick)s has been removed from the room (%(reason)s)" +msgstr "%(nick)s foi removido da sala (%(reason)s)" -#: ../src/groupchat_control.py:961 +#: ../src/groupchat_control.py:1026 +msgid "affiliation changed" +msgstr "filiação alterada" + +#: ../src/groupchat_control.py:1031 +msgid "room configuration changed to members-only" +msgstr "a configuração da sala mudou para aceitar apenas membros" + +#: ../src/groupchat_control.py:1036 +msgid "system shutdown" +msgstr "desligamento do sistema" + +#: ../src/groupchat_control.py:1135 #, python-format msgid "%s has left" msgstr "%s saiu da sala" -#: ../src/groupchat_control.py:966 +#: ../src/groupchat_control.py:1140 #, python-format msgid "%s has joined the group chat" msgstr "%s entrou na conferência" -#: ../src/groupchat_control.py:1088 ../src/groupchat_control.py:1106 -#: ../src/groupchat_control.py:1199 ../src/groupchat_control.py:1216 +#. Invalid Nickname +#. invalid char +#: ../src/groupchat_control.py:1253 ../src/groupchat_control.py:1532 +msgid "Invalid nickname" +msgstr "Apelido inválido" + +#: ../src/groupchat_control.py:1254 ../src/groupchat_control.py:1533 +msgid "The nickname has not allowed characters." +msgstr "O apelido possui caracteres não permitidos." + +#: ../src/groupchat_control.py:1277 ../src/groupchat_control.py:1295 +#: ../src/groupchat_control.py:1379 ../src/groupchat_control.py:1396 #, python-format msgid "Nickname not found: %s" msgstr "Apelido não encontrado: %s" -#: ../src/groupchat_control.py:1122 +#: ../src/groupchat_control.py:1311 msgid "This group chat has no subject" msgstr "Esta conferência não tem assunto" -#: ../src/groupchat_control.py:1135 +#: ../src/groupchat_control.py:1322 #, python-format msgid "Invited %(contact_jid)s to %(room_jid)s." msgstr "Convidado %(contact_jid)s para %(room_jid)s." -#. %s is something the user wrote but it is not a jid so we inform -#: ../src/groupchat_control.py:1142 ../src/groupchat_control.py:1170 -#, python-format -msgid "%s does not appear to be a valid JID" -msgstr "%s não parece ser um JID válido" - -#: ../src/groupchat_control.py:1253 -#, python-format -msgid "No such command: /%s (if you want to send this, prefix it with /say)" -msgstr "" -"Comando não encontrado: /%s (se você quer enviar isto, use este prefixo /say)" - -#: ../src/groupchat_control.py:1276 -#, python-format -msgid "Commands: %s" -msgstr "Comandos: %s" - -#: ../src/groupchat_control.py:1279 +#: ../src/groupchat_control.py:1459 #, python-format msgid "" "Usage: /%s [reason], bans the JID from the group chat. The " @@ -4593,7 +5334,7 @@ msgstr "" "estiver atualmente na sala, ele/ela será chutado também. NÃO suporta " "espaços no apelido." -#: ../src/groupchat_control.py:1286 +#: ../src/groupchat_control.py:1466 #, python-format msgid "" "Usage: /%s , opens a private chat window with the specified " @@ -4602,12 +5343,7 @@ msgstr "" "Uso: /%s , abre uma janela de conferência privada com um ocupante " "específico." -#: ../src/groupchat_control.py:1290 -#, python-format -msgid "Usage: /%s, clears the text window." -msgstr "Uso: /%s, apaga o texto da janela." - -#: ../src/groupchat_control.py:1292 +#: ../src/groupchat_control.py:1472 #, python-format msgid "" "Usage: /%s [reason], closes the current window or tab, displaying reason if " @@ -4616,12 +5352,7 @@ msgstr "" "Uso: /%s [rasão], fecha a janela corrente ou a aba, mostrando a razão se " "especificada." -#: ../src/groupchat_control.py:1295 -#, python-format -msgid "Usage: /%s, hide the chat buttons." -msgstr "Uso: /%s, esconde os botões do bate-papo." - -#: ../src/groupchat_control.py:1298 +#: ../src/groupchat_control.py:1478 #, python-format msgid "" "Usage: /%s [reason], invites JID to the current group chat, optionally " @@ -4630,7 +5361,7 @@ msgstr "" "Uso: /%s [ razão ], convida JID à sala atual, fornecendo " "opcionalmente uma razão." -#: ../src/groupchat_control.py:1302 +#: ../src/groupchat_control.py:1482 #, python-format msgid "" "Usage: /%s @[/nickname], offers to join room@server optionally " @@ -4639,7 +5370,7 @@ msgstr "" "Uso: /%s @[/apelido], oferece para entrar na sala@servidor " "opcionalmente usando um apelido específico." -#: ../src/groupchat_control.py:1306 +#: ../src/groupchat_control.py:1486 #, python-format msgid "" "Usage: /%s [reason], removes the occupant specified by nickname " @@ -4649,16 +5380,7 @@ msgstr "" "Uso: /%s [razão], remove da sala o ocupante especificado pelo " "apelido e indica opcionalmente uma razão. Não suporta espaços no apelido." -#: ../src/groupchat_control.py:1311 -#, python-format -msgid "" -"Usage: /%s , sends action to the current group chat. Use third " -"person. (e.g. /%s explodes.)" -msgstr "" -"Uso: /%s , emite a ação à sala atual. Use a terceira pessoa (por " -"exemplo: /%s explodes.)" - -#: ../src/groupchat_control.py:1315 +#: ../src/groupchat_control.py:1495 #, python-format msgid "" "Usage: /%s [message], opens a private message window and sends " @@ -4667,70 +5389,65 @@ msgstr "" "Uso: /%s [mensagem], abre uma janela de mensagem privada e envia " "uma mensagem ao ocupante especificado pelo apelido." -#: ../src/groupchat_control.py:1320 +#: ../src/groupchat_control.py:1500 #, python-format msgid "Usage: /%s , changes your nickname in current group chat." msgstr "Uso: /%s , muda seu apelido na sala corrente." -#: ../src/groupchat_control.py:1324 +#: ../src/groupchat_control.py:1504 #, python-format msgid "Usage: /%s , display the names of group chat occupants." msgstr "Uso: /%s [tópico], mostra ou atualiza o tópico da sala atual." -#: ../src/groupchat_control.py:1328 +#: ../src/groupchat_control.py:1508 #, python-format msgid "Usage: /%s [topic], displays or updates the current group chat topic." msgstr "Uso: /%s [tópico], mostra ou atualiza o tópico da sala atual." -#: ../src/groupchat_control.py:1331 +#: ../src/groupchat_control.py:1511 #, python-format msgid "" "Usage: /%s , sends a message without looking for other commands." msgstr "" "Uso: /%s , envia uma mensagem sem procurar por outros comandos." -#: ../src/groupchat_control.py:1334 -#, python-format -msgid "No help info for /%s" -msgstr "Sem ajuda para /%s" - -#: ../src/groupchat_control.py:1397 +#: ../src/groupchat_control.py:1606 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Você tem certeza que quer deixar a conferência \"%s\"?" -#: ../src/groupchat_control.py:1399 +#: ../src/groupchat_control.py:1608 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Se você fechar esta janela, será desconectado desta conferência." -#: ../src/groupchat_control.py:1403 ../src/roster_window.py:4066 +#: ../src/groupchat_control.py:1612 ../src/roster_window.py:4902 msgid "Do _not ask me again" msgstr "_Não me pergunte novamente" -#: ../src/groupchat_control.py:1437 +#: ../src/groupchat_control.py:1644 msgid "Changing Subject" msgstr "Mudando Assunto" -#: ../src/groupchat_control.py:1438 +#: ../src/groupchat_control.py:1645 msgid "Please specify the new subject:" msgstr "Por favor, especifique o novo assunto:" -#: ../src/groupchat_control.py:1447 +#: ../src/groupchat_control.py:1654 msgid "Changing Nickname" msgstr "Mudando Apelido" -#: ../src/groupchat_control.py:1448 +#: ../src/groupchat_control.py:1655 msgid "Please specify the new nickname you want to use:" msgstr "Por favor, especifique o novo apelido que você quer usar:" #. Ask for a reason -#: ../src/groupchat_control.py:1463 +#: ../src/groupchat_control.py:1670 #, python-format msgid "Destroying %s" msgstr "Excluindo %s" -#: ../src/groupchat_control.py:1464 +#: ../src/groupchat_control.py:1671 msgid "" "You are going to definitively destroy this room.\n" "You may specify a reason below:" @@ -4738,139 +5455,139 @@ msgstr "" "Você está prestes a excluir definitivamente esta sala.\n" "Você deve especificar uma justificativa abaixo:" -#: ../src/groupchat_control.py:1466 +#: ../src/groupchat_control.py:1673 msgid "You may also enter an alternate venue:" msgstr "Você também pode entrar um ponto de encontro alternativo:" -#: ../src/groupchat_control.py:1496 +#: ../src/groupchat_control.py:1705 msgid "Bookmark already set" msgstr "Bookmark já configurado" -#: ../src/groupchat_control.py:1497 +#: ../src/groupchat_control.py:1706 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "A sala \"%s\" já existe nos favoritos." -#: ../src/groupchat_control.py:1506 +#: ../src/groupchat_control.py:1715 msgid "Bookmark has been added successfully" msgstr "Bookmark foi adicionado com sucesso" -#: ../src/groupchat_control.py:1507 +#: ../src/groupchat_control.py:1716 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "" "Você pode gerenciar seus bookmarks pelo menu de Ações na janela principal." #. ask for reason -#: ../src/groupchat_control.py:1635 +#: ../src/groupchat_control.py:1868 #, python-format msgid "Kicking %s" msgstr "Chutando %s" -#: ../src/groupchat_control.py:1636 ../src/groupchat_control.py:1919 +#: ../src/groupchat_control.py:1869 ../src/groupchat_control.py:2169 msgid "You may specify a reason below:" msgstr "Você deve especificar uma razão abaixo:" #. ask for reason -#: ../src/groupchat_control.py:1918 +#: ../src/groupchat_control.py:2168 #, python-format msgid "Banning %s" msgstr "Banindo %s" -#: ../src/gtkexcepthook.py:41 +#: ../src/gtkexcepthook.py:46 msgid "A programming error has been detected" msgstr "Um erro de programação foi detectado" -#: ../src/gtkexcepthook.py:42 +#: ../src/gtkexcepthook.py:47 msgid "" "It probably is not fatal, but should be reported to the developers " "nonetheless." msgstr "Não é provavelmente fatal, mas deve ser reportado aos programadores." -#: ../src/gtkexcepthook.py:48 +#: ../src/gtkexcepthook.py:53 msgid "_Report Bug" msgstr "_Reportar Erro" -#: ../src/gtkexcepthook.py:71 +#: ../src/gtkexcepthook.py:76 msgid "Details" msgstr "Detalhes" #. we talk about file -#: ../src/gtkgui_helpers.py:156 ../src/gtkgui_helpers.py:171 +#: ../src/gtkgui_helpers.py:162 ../src/gtkgui_helpers.py:177 #, python-format msgid "Error: cannot open %s for reading" msgstr "Erro: impossível abrir %s para leitura" -#: ../src/gtkgui_helpers.py:336 +#: ../src/gtkgui_helpers.py:347 msgid "Error reading file:" msgstr "Erro lendo arquivo:" -#: ../src/gtkgui_helpers.py:339 +#: ../src/gtkgui_helpers.py:350 msgid "Error parsing file:" msgstr "Erro ao analisar gramaticalmente o arquivo:" #. do not traceback (could be a permission problem) #. we talk about a file here -#: ../src/gtkgui_helpers.py:376 +#: ../src/gtkgui_helpers.py:387 #, python-format msgid "Could not write to %s. Session Management support will not work" msgstr "" "Não foi possível escrever à %s. O suporte de gerência da sessão não funciona" #. xmpp: is currently handled by another program, so ask the user -#: ../src/gtkgui_helpers.py:694 +#: ../src/gtkgui_helpers.py:719 msgid "Gajim is not the default Jabber client" msgstr "O Gajim não é o cliente Jabber padrão" -#: ../src/gtkgui_helpers.py:695 +#: ../src/gtkgui_helpers.py:720 msgid "Would you like to make Gajim the default Jabber client?" msgstr "Você gostaria de tornar o Gajim o cliente Jabber padrão?" -#: ../src/gtkgui_helpers.py:696 +#: ../src/gtkgui_helpers.py:721 msgid "Always check to see if Gajim is the default Jabber client on startup" msgstr "Sempre verificar ao iniciar se o Gajim é o cliente Jabber padrão" -#: ../src/gtkgui_helpers.py:795 +#: ../src/gtkgui_helpers.py:818 msgid "Extension not supported" msgstr "Extensão não suportada" -#: ../src/gtkgui_helpers.py:796 +#: ../src/gtkgui_helpers.py:819 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" msgstr "" "A imagem não pode ser salva no formato %(type)s. Salvar como %(new_filename)" "s?" -#: ../src/gtkgui_helpers.py:805 +#: ../src/gtkgui_helpers.py:828 msgid "Save Image as..." msgstr "Salvar Imagem como..." -#: ../src/history_manager.py:65 +#: ../src/history_manager.py:73 msgid "Cannot find history logs database" msgstr "Não foi encontrado banco de dados do histórico de logs" #. holds jid -#: ../src/history_manager.py:108 +#: ../src/history_manager.py:113 msgid "Contacts" msgstr "Contatos" #. holds time -#: ../src/history_manager.py:121 ../src/history_manager.py:161 -#: ../src/history_window.py:86 +#: ../src/history_manager.py:126 ../src/history_manager.py:166 +#: ../src/history_window.py:121 msgid "Date" msgstr "Data:" #. holds nickname -#: ../src/history_manager.py:127 ../src/history_manager.py:179 +#: ../src/history_manager.py:132 ../src/history_manager.py:184 msgid "Nickname" msgstr "Apelido" #. holds message -#: ../src/history_manager.py:135 ../src/history_manager.py:167 -#: ../src/history_window.py:94 +#: ../src/history_manager.py:140 ../src/history_manager.py:172 +#: ../src/history_window.py:129 msgid "Message" msgstr "Mensagem" -#: ../src/history_manager.py:187 +#: ../src/history_manager.py:192 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" @@ -4878,7 +5595,7 @@ msgstr "" "Você quer limpar o banco de dados? (ALTAMENTE NÃO RECOMENDADO COM O GAJIM EM " "EXECUÇÃO)" -#: ../src/history_manager.py:189 +#: ../src/history_manager.py:194 msgid "" "Normally allocated database size will not be freed, it will just become " "reusable. If you really want to reduce database filesize, click YES, else " @@ -4892,221 +5609,293 @@ msgstr "" "\n" "Se caso você clicou SIM, por favor espere... " -#: ../src/history_manager.py:401 +#: ../src/history_manager.py:406 msgid "Exporting History Logs..." msgstr "Exportando Histórico de Logs..." -#: ../src/history_manager.py:476 +#: ../src/history_manager.py:481 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s em %(time)s disse: %(message)s\n" -#: ../src/history_manager.py:514 +#: ../src/history_manager.py:518 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] "Você realmente quer deletar os logs do contato selecionado?" msgstr[1] "Você realmente quer deletar os logs dos contatos selecionados?" -#: ../src/history_manager.py:518 ../src/history_manager.py:554 +#: ../src/history_manager.py:522 ../src/history_manager.py:557 msgid "This is an irreversible operation." msgstr "Esta é uma operação irreversível." -#: ../src/history_manager.py:551 +#: ../src/history_manager.py:554 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Você realmente quer deletar a mensagem selecionada?" msgstr[1] "Você realmente quer deletar as mensagens selecionadas?" -#: ../src/history_window.py:103 ../src/history_window.py:105 +#: ../src/history_window.py:209 ../src/history_window.py:211 #, python-format msgid "Conversation History with %s" msgstr "Histórico de Conversação com %s" -#: ../src/history_window.py:266 +#: ../src/history_window.py:342 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s é agora %(status)s: %(status_msg)s" -#: ../src/history_window.py:270 ../src/notify.py:199 +#: ../src/history_window.py:346 ../src/notify.py:219 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s agora está %(status)s" -#: ../src/history_window.py:276 +#: ../src/history_window.py:352 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Status agora é: %(status)s: %(status_msg)s" -#: ../src/history_window.py:279 +#: ../src/history_window.py:355 #, python-format msgid "Status is now: %(status)s" msgstr "Status agora é: %(status)s" -#: ../src/message_window.py:278 +#: ../src/htmltextview.py:586 ../src/htmltextview.py:597 +msgid "Timeout loading image" +msgstr "Tempo esgotado ao carregar a imagem" + +#: ../src/htmltextview.py:607 +msgid "Image is too big" +msgstr "A imagem é grande demais" + +#: ../src/message_window.py:350 msgid "Chats" msgstr "Conversas" -#: ../src/message_window.py:280 +#: ../src/message_window.py:352 msgid "Group Chats" msgstr "Conferências" -#: ../src/message_window.py:282 +#: ../src/message_window.py:354 msgid "Private Chats" msgstr "ConversasPrivada" -#: ../src/message_window.py:284 +#: ../src/message_window.py:356 msgid "Messages" msgstr "Mensagens" -#: ../src/message_window.py:285 +#: ../src/message_window.py:357 #, python-format msgid "%s - Gajim" msgstr "%s - Gajim" -#: ../src/notify.py:197 +#: ../src/negotiation.py:13 +msgid "- messages will be logged" +msgstr "- as mensagens serão gravadas" + +#: ../src/negotiation.py:15 +msgid "- messages will not be logged" +msgstr "- as mensagens não serão gravadas" + +#: ../src/negotiation.py:24 +msgid "OK to continue with negotiation?" +msgstr "Tudo certo para continuar com a negociação?" + +#: ../src/negotiation.py:25 +#, python-format +msgid "" +"You've begun an encrypted session with %s, but it can't be guaranteed that " +"you're talking directly to the person you think you are.\n" +"\n" +"You should speak with them directly (in person or on the phone) and confirm " +"that their Short Authentication String is identical to this one: %s\n" +"\n" +"Would you like to continue with the encrypted session?" +msgstr "" +"Você começou uma sessão criptografada com %s, mas não há garantias de que " +"você esteja falando diretamente com a pessoa que você imagina.\n" +"\n" +"Você deve falar com eles diretamente (pessoalmente ou por telefone) e " +"confirmar que a String de Autenticação Curta deles é idêntica a esta: %s\n" +"\n" +"Você quer continuar com a sessão criptografada?" + +#: ../src/negotiation.py:31 +msgid "Yes, I verified the Short Authentication String" +msgstr "Sim, eu verifiquei a String de Verificação Curta" + +#: ../src/notify.py:217 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s Alterou seu Status" -#: ../src/notify.py:207 +#: ../src/notify.py:227 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s Conectou" -#: ../src/notify.py:215 +#: ../src/notify.py:235 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s Desconectou" -#: ../src/notify.py:227 +#: ../src/notify.py:247 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Nova Mensagem Simples de %(nickname)s" -#: ../src/notify.py:235 +#: ../src/notify.py:255 #, python-format msgid "New Private Message from group chat %s" msgstr "Nova Mensagem Privada da conferência %s" -#: ../src/notify.py:236 +#: ../src/notify.py:257 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:242 +#: ../src/notify.py:260 +#, python-format +msgid "Messaged by %(nickname)s" +msgstr "Mensagem enviada por %(nickname)s" + +#: ../src/notify.py:266 #, python-format msgid "New Message from %(nickname)s" msgstr "Nova Mensagem de %(nickname)s" -#: ../src/profile_window.py:72 +#: ../src/profile_window.py:54 msgid "Retrieving profile..." msgstr "Recuperando perfil..." +#: ../src/profile_window.py:107 ../src/roster_window.py:1914 +msgid "File is empty" +msgstr "O arquivo está vazio" + +#: ../src/profile_window.py:110 ../src/roster_window.py:1917 +msgid "File does not exist" +msgstr "O arquivo não existe" + #. keep identation -#: ../src/profile_window.py:143 +#. unknown format +#: ../src/profile_window.py:124 ../src/profile_window.py:140 +#: ../src/roster_window.py:1919 ../src/roster_window.py:1930 msgid "Could not load image" msgstr "A imagem não pode ser carregada" -#: ../src/profile_window.py:255 +#: ../src/profile_window.py:250 msgid "Information received" msgstr "Informação recebida" -#: ../src/profile_window.py:324 +#: ../src/profile_window.py:319 msgid "Without a connection you can not publish your contact information." msgstr "Você deve estar conectado para publicar suas informações de contato." -#: ../src/profile_window.py:336 +#: ../src/profile_window.py:331 msgid "Sending profile..." msgstr "Enviando perfil..." -#: ../src/profile_window.py:351 +#: ../src/profile_window.py:346 msgid "Information NOT published" msgstr "Informação NÃO publicada" -#: ../src/profile_window.py:358 +#: ../src/profile_window.py:353 msgid "vCard publication failed" msgstr "Publicação do vCard falhou" -#: ../src/profile_window.py:359 +#: ../src/profile_window.py:354 msgid "" "There was an error while publishing your personal information, try again " "later." msgstr "" "Houve um erro ao publicar sua informação pessoal, tente outra vez mais tarde." -#: ../src/roster_window.py:172 ../src/roster_window.py:227 +#: ../src/roster_window.py:194 ../src/roster_window.py:249 msgid "Merged accounts" msgstr "Juntar contas" -#: ../src/roster_window.py:345 ../src/common/helpers.py:43 +#: ../src/roster_window.py:370 ../src/roster_window.py:635 +#: ../src/roster_window.py:2145 ../src/common/contacts.py:312 +#: ../src/common/helpers.py:53 msgid "Observers" msgstr "Observadores" -#: ../src/roster_window.py:692 ../src/roster_window.py:3222 +#. Make special context menu if group is Groupchats +#: ../src/roster_window.py:454 ../src/roster_window.py:459 +#: ../src/roster_window.py:1967 ../src/roster_window.py:1970 +#: ../src/roster_window.py:2640 ../src/roster_window.py:2643 +#: ../src/roster_window.py:2668 ../src/roster_window.py:4763 +#: ../src/roster_window.py:4765 ../src/common/commands.py:199 +#: ../src/common/contacts.py:102 ../src/common/helpers.py:53 +msgid "Groupchats" +msgstr "Salas" + +#: ../src/roster_window.py:784 ../src/roster_window.py:4012 msgid "You cannot join a group chat while you are invisible" msgstr "Você não pode ingressar em uma sala enquanto estiver invisível" #. new chat +#. single message #. for chat_with #. for single message -#: ../src/roster_window.py:884 ../src/systray.py:206 ../src/systray.py:211 +#. join gc +#: ../src/roster_window.py:1005 ../src/roster_window.py:1015 +#: ../src/roster_window.py:1024 ../src/systray.py:212 ../src/systray.py:217 +#: ../src/systray.py:223 #, python-format msgid "using account %s" msgstr "usando conta %s" -#. the 'manage gc bookmarks' item is shown -#. below to avoid duplicate code #. add -#: ../src/roster_window.py:909 +#: ../src/roster_window.py:1031 #, python-format msgid "to %s account" msgstr "para %s conta" #. disco -#: ../src/roster_window.py:914 +#: ../src/roster_window.py:1036 #, python-format msgid "using %s account" msgstr "usando %s conta" +#: ../src/roster_window.py:1117 +msgid "_Manage Bookmarks..." +msgstr "_Gerenciar Favoritos..." + #. profile, avatar -#: ../src/roster_window.py:989 +#: ../src/roster_window.py:1136 #, python-format msgid "of account %s" msgstr "da conta %s" -#: ../src/roster_window.py:1009 -msgid "_Manage Bookmarks..." -msgstr "_Gerenciar Favoritos..." - -#: ../src/roster_window.py:1038 +#: ../src/roster_window.py:1176 #, python-format msgid "for account %s" msgstr "para conta %s" #. History manager -#: ../src/roster_window.py:1059 +#: ../src/roster_window.py:1200 msgid "History Manager" msgstr "Gerenciador de Histórico" -#: ../src/roster_window.py:1068 +#: ../src/roster_window.py:1209 msgid "_Join New Group Chat" msgstr "_Ingressar em uma nova Conferência" -#: ../src/roster_window.py:1397 ../src/roster_window.py:3418 -#: ../src/roster_window.py:3425 +#: ../src/roster_window.py:1576 ../src/roster_window.py:4217 +#: ../src/roster_window.py:4224 msgid "You have unread messages" msgstr "Você tem mensagens não lidas" -#: ../src/roster_window.py:1398 +#: ../src/roster_window.py:1577 msgid "You must read them before removing this transport." msgstr "Você precisa lê-los antes de remover este transporte." -#: ../src/roster_window.py:1401 +#: ../src/roster_window.py:1580 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transporte \"%s\" será removido" -#: ../src/roster_window.py:1402 +#: ../src/roster_window.py:1581 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." @@ -5114,11 +5903,11 @@ msgstr "" "Você não poderá mais enviar e receber mensagens dos contatos usando este " "transporte." -#: ../src/roster_window.py:1405 +#: ../src/roster_window.py:1584 msgid "Transports will be removed" msgstr "Os transportes serão removidos" -#: ../src/roster_window.py:1410 +#: ../src/roster_window.py:1589 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " @@ -5128,114 +5917,149 @@ msgstr "" "%s" #. it's jid -#: ../src/roster_window.py:1430 +#: ../src/roster_window.py:1755 msgid "Rename Contact" msgstr "Renomear Contato" -#: ../src/roster_window.py:1431 +#: ../src/roster_window.py:1756 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Entre com um novo apelido para o contato %s" -#: ../src/roster_window.py:1438 +#: ../src/roster_window.py:1763 msgid "Rename Group" msgstr "Renomear Grupo" -#: ../src/roster_window.py:1439 +#: ../src/roster_window.py:1764 #, python-format msgid "Enter a new name for group %s" msgstr "Entre com um novo nome para o grupo %s" -#: ../src/roster_window.py:1514 +#: ../src/roster_window.py:1839 msgid "Remove Group" msgstr "Remover Grupo" -#: ../src/roster_window.py:1515 +#: ../src/roster_window.py:1840 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Você quer remover o grupo %s da lista?" -#: ../src/roster_window.py:1516 +#: ../src/roster_window.py:1841 msgid "Remove also all contacts in this group from your roster" msgstr "Remover também todos os contatos neste grupo da sua lista" -#: ../src/roster_window.py:1547 +#: ../src/roster_window.py:1872 msgid "Assign OpenPGP Key" msgstr "Atribuir chave OpenPGP" -#: ../src/roster_window.py:1548 +#: ../src/roster_window.py:1873 msgid "Select a key to apply to the contact" msgstr "Selecione uma chave para atribuir ao contato" -#: ../src/roster_window.py:1784 ../src/roster_window.py:2045 -msgid "_New group chat" -msgstr "_Nova conferência" +#: ../src/roster_window.py:2191 +msgid "_New Group Chat" +msgstr "_Nova Conferência" -#: ../src/roster_window.py:1915 +#: ../src/roster_window.py:2331 msgid "I would like to add you to my roster" msgstr "Eu gostaria de adiciona-lo à minha lista" -#: ../src/roster_window.py:2090 ../src/roster_window.py:2137 +#. Send Group Message +#: ../src/roster_window.py:2465 ../src/roster_window.py:2677 msgid "Send Group M_essage" msgstr "Enviar M_ensagem de Grupo" -#: ../src/roster_window.py:2116 -msgid "Re_name" -msgstr "Re_nomear" +#: ../src/roster_window.py:2484 +msgid "_New group chat" +msgstr "_Nova conferência" -#: ../src/roster_window.py:2143 +#. Manage Transport submenu +#: ../src/roster_window.py:2522 +msgid "_Manage Contacts" +msgstr "_Gerenciar Contatos" + +#: ../src/roster_window.py:2583 +msgid "_Maximize" +msgstr "_Maximizar" + +#: ../src/roster_window.py:2590 +msgid "_Disconnect" +msgstr "_Desconectar" + +#: ../src/roster_window.py:2669 +msgid "_Maximize All" +msgstr "_Maximizar Tudo" + +#: ../src/roster_window.py:2685 msgid "To all users" msgstr "Para todos os usuários" -#: ../src/roster_window.py:2146 +#: ../src/roster_window.py:2688 msgid "To all online users" msgstr "Para todos os usuários conectados" -#: ../src/roster_window.py:2182 +#. Log Off +#: ../src/roster_window.py:2805 +msgid "_Log off" +msgstr "_Efetuar logoff" + +#. Log on +#: ../src/roster_window.py:2811 msgid "_Log on" msgstr "_Conectar" -#: ../src/roster_window.py:2192 -msgid "Log _off" -msgstr "_Desconectar" +#. Send single message +#: ../src/roster_window.py:2823 +msgid "Send Single Message" +msgstr "Enviar Mensagem Simples" -#: ../src/roster_window.py:2314 ../src/roster_window.py:2385 +#. Manage Transport submenu +#: ../src/roster_window.py:2870 +msgid "_Manage Transport" +msgstr "_Gerenciar Transporte" + +#. Modify Transport +#: ../src/roster_window.py:2878 +msgid "_Modify Transport" +msgstr "_Modificar Transporte" + +#: ../src/roster_window.py:2992 ../src/roster_window.py:3066 msgid "_Change Status Message" msgstr "_Mudar Mensagem de Status" -#: ../src/roster_window.py:2457 +#: ../src/roster_window.py:3138 msgid "Authorization has been sent" msgstr "Autorização foi enviada" -#: ../src/roster_window.py:2458 +#: ../src/roster_window.py:3139 #, python-format msgid "Now \"%s\" will know your status." msgstr "Agora \"%s\" saberá seu status." -#: ../src/roster_window.py:2478 +#: ../src/roster_window.py:3159 msgid "Subscription request has been sent" msgstr "Solicitação de inscrição foi enviada" -#: ../src/roster_window.py:2479 +#: ../src/roster_window.py:3160 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Se \"%s\" aceitar esta solicitação, você saberá o status dele ou dela." -#: ../src/roster_window.py:2491 +#: ../src/roster_window.py:3172 msgid "Authorization has been removed" msgstr "Autorização foi removida" -#: ../src/roster_window.py:2492 +#: ../src/roster_window.py:3173 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Agora \"%s\" você sempre o verá como offline." -#: ../src/roster_window.py:2684 +#: ../src/roster_window.py:3407 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Contato \"%s\" será removido de sua lista" -#: ../src/roster_window.py:2688 +#: ../src/roster_window.py:3411 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." @@ -5243,7 +6067,7 @@ msgstr "" "Removendo este contato, você também removerá a autorização, resultando em " "ele ou ela sempre o verá offiline." -#: ../src/roster_window.py:2693 +#: ../src/roster_window.py:3416 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." @@ -5251,16 +6075,16 @@ msgstr "" "Removendo este contato, você também, por padrão, removerá a autorização, " "resultando em ele ou ela sempre o verá offiline." -#: ../src/roster_window.py:2696 +#: ../src/roster_window.py:3419 msgid "I want this contact to know my status after removal" msgstr "Eu quero que este contato saiba meu status após a remoção" #. several contact to remove at the same time -#: ../src/roster_window.py:2700 +#: ../src/roster_window.py:3423 msgid "Contacts will be removed from your roster" msgstr "Os contatos serão removidos da sua lista" -#: ../src/roster_window.py:2704 +#: ../src/roster_window.py:3427 #, python-format msgid "" "By removing these contacts:%s\n" @@ -5270,7 +6094,7 @@ msgstr "" "você também remove a autorização fazendo com que eles sempre vejam você " "offline." -#: ../src/roster_window.py:2736 +#: ../src/roster_window.py:3454 msgid "" "Gnome Keyring is installed but not correctly started (environment variable " "probably not correctly set)" @@ -5278,40 +6102,22 @@ msgstr "" "O Gnome Keyring está instalado mas não corretamente iniciado (provavelmente " "a variável de ambiente não está definida corretamente)" -#. TODO: make this string translatable +#: ../src/roster_window.py:3473 +msgid "GPG is not usable" +msgstr "GPG não é usável" + #. %s is the account name here -#: ../src/roster_window.py:2764 ../src/common/connection.py:704 -#: ../src/common/zeroconf/connection_zeroconf.py:160 +#: ../src/roster_window.py:3474 ../src/common/connection_handlers.py:2153 +#: ../src/common/zeroconf/connection_zeroconf.py:171 #, python-format msgid "You will be connected to %s without OpenPGP." msgstr "Você será conectado ao %s sem OpenPGP." -#: ../src/roster_window.py:2781 -msgid "Passphrase Required" -msgstr "Frase de acesso é obrigatória" - -#: ../src/roster_window.py:2782 -#, python-format -msgid "Enter GPG key passphrase for account %s." -msgstr "Entre com a frase de acesso da chave GPG para conta %s" - -#: ../src/roster_window.py:2787 -msgid "Save passphrase" -msgstr "Salvar Frase de acesso" - -#: ../src/roster_window.py:2795 -msgid "Wrong Passphrase" -msgstr "Frase de acesso Errada" - -#: ../src/roster_window.py:2796 -msgid "Please retype your GPG passphrase or press Cancel." -msgstr "Por favor, reescreva sua frase de segurança GPG ou pressione Cancelar." - -#: ../src/roster_window.py:2860 ../src/roster_window.py:2920 +#: ../src/roster_window.py:3545 ../src/roster_window.py:3623 msgid "You are participating in one or more group chats" msgstr "Você está participando em uma ou mais conferências" -#: ../src/roster_window.py:2861 ../src/roster_window.py:2921 +#: ../src/roster_window.py:3546 ../src/roster_window.py:3624 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" @@ -5319,21 +6125,21 @@ msgstr "" "Mudando seu status para invisível resulta na desconexão daquelas " "conferências. Você tem certeza que quer ir invisível?" -#: ../src/roster_window.py:2878 +#: ../src/roster_window.py:3580 msgid "No account available" msgstr "Conta não disponível" -#: ../src/roster_window.py:2879 +#: ../src/roster_window.py:3581 msgid "You must create an account before you can chat with other contacts." msgstr "" "Você deve configurar uma conta antes de poder conversar com outros contatos." -#: ../src/roster_window.py:2981 +#: ../src/roster_window.py:3730 #, python-format msgid "\"%(title)s\" by %(artist)s" msgstr "\"%(title)s\" by %(artist)s" -#: ../src/roster_window.py:3419 ../src/roster_window.py:3426 +#: ../src/roster_window.py:4218 ../src/roster_window.py:4225 msgid "" "Messages will only be available for reading them later if you have history " "enabled." @@ -5341,26 +6147,25 @@ msgstr "" "Mensagem somente estará disponível para leitura mais tarde se você tiver o " "histórico habilitado." -#: ../src/roster_window.py:4016 +#: ../src/roster_window.py:4849 msgid "Metacontacts storage not supported by your server" msgstr "O armazenamento de metacontatos não é suportado pelo seu servidor." -#: ../src/roster_window.py:4018 +#: ../src/roster_window.py:4851 msgid "" "Your server does not support storing metacontacts information. So those " -"information will not be save on next reconnection." +"information will not be saved on next reconnection." msgstr "" -"O seu servidor não suporta a gravação de informação de metacontatos, " -"portanto essas informações não serão estarão disponíveis na próxima vez que " -"você se conectar." +"O seu servidor não suporta a gravação de informação de metacontatos, então " +"essas informações não estarão salvas na próxima vez que você conectar." -#: ../src/roster_window.py:4060 +#: ../src/roster_window.py:4896 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "" "Você está prestes a criar um metacontato. Tem certeza que quer continuar?" -#: ../src/roster_window.py:4062 +#: ../src/roster_window.py:4898 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 " @@ -5370,117 +6175,170 @@ msgstr "" "Geralmente isso é usado quando a mesma pessoa possui muitas contas de Jabber " "ou transportes." -#: ../src/roster_window.py:4140 -#, python-format -msgid "Do you want to send that file to %s:" +#: ../src/roster_window.py:4993 +#, fuzzy +msgid "Invalid file URI:" +msgstr "Arquivo inválido" + +#: ../src/roster_window.py:5004 +#, fuzzy, python-format +msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send those files to %s:" msgstr[0] "Você quer enviar esse arquivo para %s:" msgstr[1] "%s quer te enviar um arquivo:" -#: ../src/roster_window.py:4245 -#, python-format -msgid "Drop %s in group %s" -msgstr "Derrubar %s no grupo %s" - -#: ../src/roster_window.py:4252 -#, python-format -msgid "Make %s and %s metacontacts" -msgstr "Fazer %s e %s metacontatos" - -#: ../src/roster_window.py:4439 +#: ../src/roster_window.py:5332 msgid "Change Status Message..." msgstr "Mudar Mensagem de Status..." -#: ../src/systray.py:163 +#: ../src/search_window.py:91 +msgid "Waiting for results" +msgstr "Esperando resultados" + +#: ../src/search_window.py:131 ../src/search_window.py:209 +msgid "Error in received dataform" +msgstr "Erro no formulário de dados recebido" + +#. No result +#: ../src/search_window.py:165 ../src/search_window.py:201 +msgid "No result" +msgstr "Sem resultados" + +#: ../src/secrets.py:45 +msgid "" +"To continue, Gajim needs to access your stored secrets. Enter your passphrase" +msgstr "" +"Para continuar, o Gajim precisa acessar suas senhas armazenadas. Entre com " +"sua senha" + +#: ../src/secrets.py:89 +msgid "Confirm Passphrase" +msgstr "Confirmar Frase de Acesso" + +#: ../src/secrets.py:90 +msgid "Enter your new passphrase again for confirmation" +msgstr "Digite novamente sua nova frase de acessar para confirmação" + +#: ../src/secrets.py:95 ../src/secrets.py:107 +msgid "Create Passphrase" +msgstr "Criar Frase de Acesso" + +#: ../src/secrets.py:96 +msgid "Passphrases did not match.\n" +msgstr "Frases de acesso não conferem.\n" + +#: ../src/secrets.py:97 ../src/secrets.py:108 +msgid "Gajim needs you to create a passphrase to encrypt stored secrets" +msgstr "" +"O Gajim precisa que você crie uma frase de acesso para criptografar as " +"senhas armazenadas" + +#: ../src/systray.py:169 msgid "_Change Status Message..." msgstr "_Mudar Mensagem de Status..." -#: ../src/systray.py:251 +#: ../src/systray.py:254 msgid "Hide this menu" msgstr "Esconder este menu" -#: ../src/tooltips.py:309 ../src/tooltips.py:493 +#: ../src/tooltips.py:316 ../src/tooltips.py:509 msgid "Jabber ID: " msgstr "Jabber ID:" -#: ../src/tooltips.py:312 ../src/tooltips.py:497 +#: ../src/tooltips.py:319 ../src/tooltips.py:513 msgid "Resource: " msgstr "Recurso: " -#: ../src/tooltips.py:317 +#: ../src/tooltips.py:324 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s dessa sala" -#: ../src/tooltips.py:430 ../src/tooltips.py:612 +#: ../src/tooltips.py:422 +msgid " [blocked]" +msgstr "[bloqueado]" + +#: ../src/tooltips.py:426 +msgid " [minimized]" +msgstr "[minimizado]" + +#: ../src/tooltips.py:441 ../src/tooltips.py:629 msgid "Status: " msgstr "Status: " -#: ../src/tooltips.py:461 +#: ../src/tooltips.py:471 #, python-format msgid "Last status: %s" msgstr "Último status: %s" -#: ../src/tooltips.py:463 +#: ../src/tooltips.py:473 #, python-format msgid " since %s" msgstr "desde %s" +#: ../src/tooltips.py:491 +msgid "Connected" +msgstr "Conectado" + +#: ../src/tooltips.py:493 +msgid "Disconnected" +msgstr "Desconectado" + #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:503 +#: ../src/tooltips.py:520 msgid "Subscription: " msgstr "Inscrição: " -#: ../src/tooltips.py:513 +#: ../src/tooltips.py:530 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:568 +#: ../src/tooltips.py:585 msgid "Download" msgstr "Download" -#: ../src/tooltips.py:574 +#: ../src/tooltips.py:591 msgid "Upload" msgstr "Upload" -#: ../src/tooltips.py:581 +#: ../src/tooltips.py:598 msgid "Type: " msgstr "Tipo: " -#: ../src/tooltips.py:587 +#: ../src/tooltips.py:604 msgid "Transferred: " msgstr "Transferido: " -#: ../src/tooltips.py:590 ../src/tooltips.py:611 +#: ../src/tooltips.py:607 ../src/tooltips.py:628 msgid "Not started" msgstr "Não iniciado" -#: ../src/tooltips.py:594 +#: ../src/tooltips.py:611 msgid "Stopped" msgstr "Parado" -#: ../src/tooltips.py:596 ../src/tooltips.py:599 +#: ../src/tooltips.py:613 ../src/tooltips.py:616 msgid "Completed" msgstr "Completo" -#: ../src/tooltips.py:603 +#: ../src/tooltips.py:620 msgid "?transfer status:Paused" msgstr "?status da transferência: Parado" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:607 +#: ../src/tooltips.py:624 msgid "Stalled" msgstr "Parado" -#: ../src/tooltips.py:609 +#: ../src/tooltips.py:626 msgid "Transferring" msgstr "Transferindo" -#: ../src/tooltips.py:641 +#: ../src/tooltips.py:660 msgid "This service has not yet responded with detailed information" msgstr "Este serviço não respondeu ainda com informação detalhada" -#: ../src/tooltips.py:644 +#: ../src/tooltips.py:663 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -5488,24 +6346,24 @@ msgstr "" "Este serviço não poderia responder com informações detalhadas.\n" "É mais provável quebrado" -#: ../src/vcard.py:201 +#: ../src/vcard.py:245 msgid "?Client:Unknown" msgstr "?Cliente:Desconhecido" -#: ../src/vcard.py:203 +#: ../src/vcard.py:247 msgid "?OS:Unknown" msgstr "?SO:Desconhecido" -#: ../src/vcard.py:231 ../src/vcard.py:409 +#: ../src/vcard.py:272 ../src/vcard.py:282 ../src/vcard.py:472 #, python-format msgid "since %s" msgstr "desde %s" -#: ../src/vcard.py:261 +#: ../src/vcard.py:311 msgid "Affiliation:" msgstr "Filiação:" -#: ../src/vcard.py:269 +#: ../src/vcard.py:319 msgid "" "This contact is interested in your presence information, but you are not " "interested in his/her presence" @@ -5513,7 +6371,7 @@ msgstr "" "Este contato está interessado em sua informação de presença, mas você não " "está interessado napresença dele/dela" -#: ../src/vcard.py:271 +#: ../src/vcard.py:321 msgid "" "You are interested in the contact's presence information, but he/she is not " "interested in yours" @@ -5521,13 +6379,13 @@ msgstr "" "Você está interessado na informação da presença do contato, mas ele/ela não " "está interessado em seu" -#: ../src/vcard.py:273 +#: ../src/vcard.py:323 msgid "You and the contact are interested in each other's presence information" msgstr "" "Você e o contato estão interessados em cada outra informação da presença" #. None -#: ../src/vcard.py:275 +#: ../src/vcard.py:325 msgid "" "You are not interested in the contact's presence, and neither he/she is " "interested in yours" @@ -5535,140 +6393,144 @@ msgstr "" "Você não está interessado na presença do contato, e nenhum está interessado " "no seu" -#: ../src/vcard.py:283 +#: ../src/vcard.py:333 msgid "You are waiting contact's answer about your subscription request" msgstr "" "Você está esperando a resposta do contato sobre seu pedido da subscrição" -#: ../src/vcard.py:287 ../src/vcard.py:314 ../src/vcard.py:434 +#: ../src/vcard.py:337 ../src/vcard.py:374 ../src/vcard.py:497 msgid " resource with priority " msgstr " recurso com prioridade " -#: ../src/common/check_paths.py:33 +#: ../src/common/check_paths.py:38 msgid "creating logs database" msgstr "criando banco de dados de logs" -#: ../src/common/check_paths.py:89 ../src/common/check_paths.py:100 -#: ../src/common/check_paths.py:107 +#: ../src/common/check_paths.py:101 ../src/common/check_paths.py:112 +#: ../src/common/check_paths.py:119 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s é um arquivo, mas deveria ser um diretório" -#: ../src/common/check_paths.py:90 ../src/common/check_paths.py:101 -#: ../src/common/check_paths.py:108 ../src/common/check_paths.py:116 +#: ../src/common/check_paths.py:102 ../src/common/check_paths.py:113 +#: ../src/common/check_paths.py:120 ../src/common/check_paths.py:128 msgid "Gajim will now exit" msgstr "Gajim sairá agora" -#: ../src/common/check_paths.py:115 +#: ../src/common/check_paths.py:127 #, python-format msgid "%s is a directory but should be a file" msgstr "%s é um diretório, mas deveria ser um arquivo" -#: ../src/common/check_paths.py:131 +#: ../src/common/check_paths.py:143 #, python-format msgid "creating %s directory" msgstr "criando diretório %s" -#: ../src/common/commands.py:69 +#: ../src/common/commands.py:74 msgid "Change status information" msgstr "Alterar informação de status" -#: ../src/common/commands.py:82 +#: ../src/common/commands.py:87 msgid "Change status" msgstr "Alterar status" -#: ../src/common/commands.py:83 +#: ../src/common/commands.py:88 msgid "Set the presence type and description" msgstr "Definir o tipo e a descrição da presença" -#: ../src/common/commands.py:89 +#: ../src/common/commands.py:94 msgid "Free for chat" msgstr "Livre para conversa" -#: ../src/common/commands.py:90 +#: ../src/common/commands.py:95 msgid "Online" msgstr "Conectado" -#: ../src/common/commands.py:92 +#: ../src/common/commands.py:97 msgid "Extended away" msgstr "Muito afastado" -#: ../src/common/commands.py:93 +#: ../src/common/commands.py:98 msgid "Do not disturb" msgstr "Não perturbe" -#: ../src/common/commands.py:94 +#: ../src/common/commands.py:99 msgid "Offline - disconnect" msgstr "Desconectado" -#: ../src/common/commands.py:99 +#: ../src/common/commands.py:104 msgid "Presence description:" msgstr "Descrição da presença:" -#: ../src/common/commands.py:134 +#: ../src/common/commands.py:139 msgid "The status has been changed." msgstr "O status foi alterado." -#: ../src/common/commands.py:179 +#: ../src/common/commands.py:184 #, python-format msgid "%(nickname)s on %(room_jid)s" msgstr "%(nickname)s da sala %(room_jid)s" -#: ../src/common/commands.py:183 +#: ../src/common/commands.py:188 msgid "You have not joined a groupchat." msgstr "Você não entrou em uma sala." -#: ../src/common/commands.py:189 +#: ../src/common/commands.py:194 msgid "Leave Groupchats" msgstr "Sair das salas" -#: ../src/common/commands.py:190 +#: ../src/common/commands.py:195 msgid "Choose the groupchats you want to leave" msgstr "Selecione as salas das quais você quer sair" -#: ../src/common/commands.py:194 -msgid "Groupchats" -msgstr "Salas" - -#: ../src/common/commands.py:230 +#: ../src/common/commands.py:235 msgid "You left the following groupchats:" msgstr "Você saiu das seguintes salas:" -#: ../src/common/config.py:56 +#: ../src/common/commands.py:247 +msgid "Forward unread messages" +msgstr "Encaminhar mensagens não lidas" + +#: ../src/common/commands.py:267 +msgid "All unread messages have been forwarded." +msgstr "Todas as mensagens não lidas foram encaminhadas." + +#: ../src/common/config.py:74 msgid "Use D-Bus and Notification-Daemon to show notifications" msgstr "Usar DBus e Notification-Daemon para mostrar notificações" -#: ../src/common/config.py:61 +#: ../src/common/config.py:79 msgid "Time in minutes, after which your status changes to away." msgstr "Minutos, depois do qual seu status mudam a afastado." -#: ../src/common/config.py:62 +#: ../src/common/config.py:80 msgid "Away as a result of being idle" msgstr "Afastado em conseqüência de estar inativo" -#: ../src/common/config.py:64 +#: ../src/common/config.py:82 msgid "Time in minutes, after which your status changes to not available." msgstr "Minutos, depois do qual seu status mudam a nao disponível." -#: ../src/common/config.py:65 +#: ../src/common/config.py:83 msgid "Not available as a result of being idle" msgstr "Não disponível em conseqüência de estar inativo" -#: ../src/common/config.py:83 +#: ../src/common/config.py:101 msgid "" "List (space separated) of rows (accounts and groups) that are collapsed." msgstr "" "Lista (separada por espaços) de linhas (contas e grupos) que estão agrupados." -#: ../src/common/config.py:88 +#: ../src/common/config.py:106 msgid "Enable link-local/zeroconf messaging" msgstr "Ativar mensagens \"link-local\"/\"zeroconf\"" -#: ../src/common/config.py:91 +#: ../src/common/config.py:109 msgid "Language used by speller" msgstr "Idioma usado pelo corretor ortográfico" -#: ../src/common/config.py:92 +#: ../src/common/config.py:110 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" @@ -5678,7 +6540,7 @@ msgstr "" "'às vezes' - mostrar hora a cada print_ichat_every_foo_minutes minutos.\n" "'nunca' - nunca mostrar a hora." -#: ../src/common/config.py:93 +#: ../src/common/config.py:111 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " "to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " @@ -5688,18 +6550,18 @@ msgstr "" "varia de 1 a 4, 0 desabilita a função. 1 é relógio mais preciso, 4 é o " "menos. Isto é usado apenas se o valor de print_time for 'às vezes'." -#: ../src/common/config.py:96 +#: ../src/common/config.py:114 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Aproveite os pare * /_ como caracteres de formatação. " -#: ../src/common/config.py:97 +#: ../src/common/config.py:115 msgid "" "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" "Se verdadeiro, não remova */_. Assim * ABC * seja negrito(realce) mas com * " "* não removido." -#: ../src/common/config.py:100 +#: ../src/common/config.py:118 msgid "" "Uses ReStructured text markup to send HTML, plus ascii formatting if " "selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" @@ -5710,7 +6572,7 @@ msgstr "" "sourceforge.net/docs/ref/rst/restructuredtext.html (Se você quiser usar " "isso, instale o docutils)" -#: ../src/common/config.py:109 +#: ../src/common/config.py:127 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." @@ -5718,7 +6580,7 @@ msgstr "" "Caracter a adicionar ao apelido quando se estiver usando o recurso de " "completar apelido (tecla Tab) na conferência." -#: ../src/common/config.py:110 +#: ../src/common/config.py:128 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." @@ -5726,7 +6588,7 @@ msgstr "" "O caracter a ser proposto para adicionar ao final do apelido desejado quando " "ele já estiver sendo usado por outra pessoa na conferência." -#: ../src/common/config.py:133 +#: ../src/common/config.py:151 msgid "" "This option let you customize timestamp that is printed in conversation. For " "exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " @@ -5737,19 +6599,34 @@ msgstr "" "por strftime na documentação do Python: http://docs.python.org/lib/module-" "time.html" -#: ../src/common/config.py:134 +#: ../src/common/config.py:152 msgid "Characters that are printed before the nickname in conversations" msgstr "Os caracteres que são exibidos antes do apelido nas conversas" -#: ../src/common/config.py:135 +#: ../src/common/config.py:153 msgid "Characters that are printed after the nickname in conversations" msgstr "Os caracteres que são exibidos após o apelidos nas conversas" -#: ../src/common/config.py:142 +#: ../src/common/config.py:156 +msgid "" +"If checked, Gajim can regularly poll a Last.fm account and adjust the status " +"message to reflect recently played songs. " +"set_status_msg_from_current_music_track option must be False." +msgstr "" +"Se marcado, o Gajim pode pesquisar regularmente em uma conta do Last.fm para " +"ajustar a mensagem de status de modo a refletir as músicas tocadas " +"recentemente. A opção set_status_msg_from_current_music_track precisa ser " +"Falso." + +#: ../src/common/config.py:157 +msgid "The username used to identify the Last.fm account." +msgstr "O nome de usuário usado para identificar a conta Last.fm." + +#: ../src/common/config.py:162 msgid "Add * and [n] in roster title?" msgstr "Adicionar * e [n] no título da lista?" -#: ../src/common/config.py:143 +#: ../src/common/config.py:163 msgid "" "How many lines to remember from previous conversation when a chat tab/window " "is reopened." @@ -5757,12 +6634,12 @@ msgstr "" "Quantas linhas lembrar da conversação anterior quando uma aba/janela de bate-" "papo for reaberta." -#: ../src/common/config.py:144 +#: ../src/common/config.py:164 msgid "How many minutes should last lines from previous conversation last." msgstr "" "Quantos minutos mostrar ao exibir as últimas linhas da conversação anterior." -#: ../src/common/config.py:145 +#: ../src/common/config.py:165 msgid "" "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " "Client default behaviour)." @@ -5770,11 +6647,11 @@ msgstr "" "Enviar a mensagem com Ctrl+Enter e criar uma nova linha com Enter " "(comportamento padrão do cliente ICQ da Mirabilis)." -#: ../src/common/config.py:147 +#: ../src/common/config.py:167 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Quantas linhas armazenar com Ctrl+Acima." -#: ../src/common/config.py:150 +#: ../src/common/config.py:170 #, python-format msgid "" "Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' " @@ -5783,12 +6660,12 @@ msgstr "" "Uma ou outra URL costuma vir com %s onde %s é a palvra/frase ou ' em " "WIKTIONARY ' que significam o uso wiktionary." -#: ../src/common/config.py:153 +#: ../src/common/config.py:173 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "" "Se verificado, Gajim pode ser remotamente controlado usando gajim-remoto." -#: ../src/common/config.py:154 +#: ../src/common/config.py:174 msgid "" "If True, listen to D-Bus signals from NetworkManager and change the status " "of accounts (provided they do not have listen_to_network_manager set to " @@ -5800,14 +6677,14 @@ msgstr "" "configurado para Falso e se estiverem sincronizadas com o status global) " "baseado no status da conexão de rede." -#: ../src/common/config.py:155 +#: ../src/common/config.py:175 msgid "" "Sent chat state notifications. Can be one of all, composing_only, disabled." msgstr "" "Notificações de estado de conversa enviados. Pode ser one of all, " "composing_only, disabled." -#: ../src/common/config.py:156 +#: ../src/common/config.py:176 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." @@ -5815,7 +6692,7 @@ msgstr "" "Notificações de estado de conversa exibidos nas janelas de conversa. Pode " "ser one of all, composing_only, disabled." -#: ../src/common/config.py:158 +#: ../src/common/config.py:178 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." @@ -5823,11 +6700,11 @@ msgstr "" "Quando não estiver exibindo a hora para cada mensagem (print_time == " "simetimes), exibi-lo a cada x minutos." -#: ../src/common/config.py:159 +#: ../src/common/config.py:179 msgid "Ask before closing a group chat tab/window." msgstr "Perguntar antes de fechar um aba ou janela de conferência." -#: ../src/common/config.py:160 +#: ../src/common/config.py:180 msgid "" "Always ask before closing group chat tab/window in this space separated list " "of group chat jids." @@ -5835,7 +6712,7 @@ msgstr "" "Sempre perguntar antes de fechar um aba/janela nesta lista separada por " "espaço de JID's de conferências." -#: ../src/common/config.py:161 +#: ../src/common/config.py:181 msgid "" "Never ask before closing group chat tab/window in this space separated list " "of group chat jids." @@ -5843,7 +6720,7 @@ msgstr "" "Nunca perguntar antes de fechar uma aba/janela de conferência nesta lista " "separada por espaço de salas separadas por jids." -#: ../src/common/config.py:164 +#: ../src/common/config.py:184 msgid "" "Comma separated list of hosts that we send, in addition of local interfaces, " "for File Transfer in case of address translation/port forwarding." @@ -5852,34 +6729,54 @@ msgstr "" "interfaces locais, para Transferência de Arquivo no caso de tradução de " "endereço/encaminhamento de porta." -#: ../src/common/config.py:166 +#: ../src/common/config.py:186 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "Padrão da IEC diz que KiB = 1024 bytes e KB = 1000 bytes." -#: ../src/common/config.py:168 +#: ../src/common/config.py:188 msgid "Notify of events in the system trayicon." msgstr "Notificar os eventos no ícone da bandeja do sistema." -#: ../src/common/config.py:174 +#: ../src/common/config.py:194 msgid "Show tab when only one conversation?" msgstr "Mostrar aba quando tiver apenas uma bate papo?" -#: ../src/common/config.py:175 +#: ../src/common/config.py:195 msgid "Show tabbed notebook border in chat windows?" msgstr "Mostrar borda de caderno tabulada nas janelas de conversa?" -#: ../src/common/config.py:176 +#: ../src/common/config.py:196 msgid "Show close button in tab?" msgstr "Mostrar botão de fechar na aba?" -#: ../src/common/config.py:189 +#: ../src/common/config.py:197 +msgid "" +"When negotiating an encrypted session, should Gajim assume you want your " +"messages to be logged?" +msgstr "" +"Ao negociar uma sessão criptografada, o Gajim deve assumir que você quer que " +"suas mensagens sejam gravadas?" + +#: ../src/common/config.py:198 +msgid "" +"When negotiating an encrypted session, should Gajim prefer to use public " +"keys for identification?" +msgstr "" +"Ao negociar uma sessão criptografada o Gajim deve preferir usar chaves " +"públicas para identificação?" + +#: ../src/common/config.py:207 +msgid "Preview new messages in notification popup?" +msgstr "Pré-visualizar novas mensagens em uma janela popup?" + +#: ../src/common/config.py:212 msgid "" "A semicolon-separated list of words that will be highlighted in group chats." msgstr "" "Uma lista separada por ponto-e-vírgula das palavras que serão destacadas nas " "conferências." -#: ../src/common/config.py:190 +#: ../src/common/config.py:213 msgid "" "If True, quits Gajim when X button of Window Manager is clicked. This " "setting is taken into account only if trayicon is used." @@ -5887,13 +6784,13 @@ msgstr "" "Se verdadeiro, o Gajim sairá quando o botão sair da janela for clicado. Esta " "opção só faz sentido quando a opção trayicon está sendo usada." -#: ../src/common/config.py:191 +#: ../src/common/config.py:214 msgid "" "If True, Gajim will check if it's the default jabber client on each startup." msgstr "" "Se Verdadeiro, o Gajim verifica ao iniciar se é o cliente Jabber padrão." -#: ../src/common/config.py:192 +#: ../src/common/config.py:215 msgid "" "If True, Gajim will display an icon on each tab containing unread messages. " "Depending on the theme, this icon may be animated." @@ -5901,7 +6798,7 @@ msgstr "" "Se verdadeiro, Gajim mostrará um ícone para cada aba contendo mensagens não " "lidas. Dependendo do tema, este ícone pode ser animado." -#: ../src/common/config.py:193 +#: ../src/common/config.py:216 msgid "" "If True, Gajim will display the status message, if not empty, for every " "contact under the contact name in roster window." @@ -5909,7 +6806,7 @@ msgstr "" "Se Verdadeiro, o Gajim indicará a mensagem de status, se não estiver vazia, " "para cada contato sob o nome do contato na janela da lista." -#: ../src/common/config.py:195 +#: ../src/common/config.py:218 msgid "" "If True, Gajim will ask for avatar each contact that did not have an avatar " "last time or has one cached that is too old." @@ -5917,7 +6814,7 @@ msgstr "" "Se verdadeiro, Gajim pedirá por avatar cada contato que não teve um avatar " "ou tem um cache que é velho demais." -#: ../src/common/config.py:196 +#: ../src/common/config.py:219 msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." @@ -5925,7 +6822,7 @@ msgstr "" "Se Falso, você não verá por mais muito tempo a linha de status nas conversas " "quando um contato alterar seu status e/ou sua mensagem de status." -#: ../src/common/config.py:197 +#: ../src/common/config.py:220 msgid "" "can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " "longer print status line in groupchats when a member changes his or her " @@ -5939,29 +6836,29 @@ msgstr "" "\" o Gajim exibirá todas as mensagens de status. Se for \"in_and_out\" o " "Gajim só mostrará FOO entradas/saídas em conferências." -#: ../src/common/config.py:199 +#: ../src/common/config.py:222 msgid "Background color of contacts when they just signed in." msgstr "Cor de fundo dos contatos quando eles simplesmente conectarem." -#: ../src/common/config.py:200 +#: ../src/common/config.py:223 msgid "Background color of contacts when they just signed out." msgstr "Cor de fundo dos contatos quando eles simplesmente desconectarem." -#: ../src/common/config.py:202 +#: ../src/common/config.py:225 msgid "" "If True, restored messages will use a smaller font than the default one." msgstr "" "Se Verdadeiro, as mensagens restauradas usarão uma fonte menor que o padrão." -#: ../src/common/config.py:203 +#: ../src/common/config.py:226 msgid "Don't show avatar for the transport itself." msgstr "Não mostrar o avatar para o próprio transporte." -#: ../src/common/config.py:204 +#: ../src/common/config.py:227 msgid "Don't show roster in the system taskbar." msgstr "Não mostrar a lista na bandeja do sistema." -#: ../src/common/config.py:205 +#: ../src/common/config.py:228 msgid "" "If True and installed GTK+ and PyGTK versions are at least 2.8, make the " "window flash (the default behaviour in most Window Managers) when holding " @@ -5971,7 +6868,7 @@ msgstr "" "faz a janela piscar (o comportamento padrão na maioria dos Gerenciadores de " "Janela) quando esperam eventos pendentes." -#: ../src/common/config.py:207 +#: ../src/common/config.py:230 msgid "" "Jabberd1.4 does not like sha info when one join a password protected group " "chat. Turn this option to False to stop sending sha info in group chat " @@ -5982,7 +6879,7 @@ msgstr "" "informações sha na presenças de conferências." #. always, never, peracct, pertype should not be translated -#: ../src/common/config.py:210 +#: ../src/common/config.py:233 msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" @@ -6000,36 +6897,32 @@ msgstr "" "conferência) são enviadas para uma janela específica. Nota, esta mudança " "requer o reinício do Gajim antes que tenham efeito." -#: ../src/common/config.py:211 +#: ../src/common/config.py:234 msgid "If False, you will no longer see the avatar in the chat window." msgstr "" "Se Falso, você não verá por muito tempo o avatar na janela do bate-papo." -#: ../src/common/config.py:212 +#: ../src/common/config.py:235 msgid "If True, pressing the escape key closes a tab/window." msgstr "Se Verdadeiro, pressionando a tecla Esc fecha a aba/janela" -#: ../src/common/config.py:213 -msgid "Hides the buttons in group chat window." -msgstr "Esconder os botões na janela de conferência." +#: ../src/common/config.py:236 +msgid "Hides the buttons in chat windows." +msgstr "Esconder os botões nas janelas de conversa." -#: ../src/common/config.py:214 -msgid "Hides the buttons in two persons chat window." -msgstr "Esconder os botões na janela de conversa para duas pessoas." - -#: ../src/common/config.py:215 +#: ../src/common/config.py:237 msgid "Hides the banner in a group chat window" msgstr "Esconder o banner na janela de conferência" -#: ../src/common/config.py:216 +#: ../src/common/config.py:238 msgid "Hides the banner in two persons chat window" msgstr "Esconder o banner na janela de conversa para duas pessoas " -#: ../src/common/config.py:217 +#: ../src/common/config.py:239 msgid "Hides the group chat occupants list in group chat window." msgstr "Esconder a lista dos ocupantes da sala na janela da conferência." -#: ../src/common/config.py:218 +#: ../src/common/config.py:240 msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." @@ -6037,22 +6930,26 @@ msgstr "" "Em uma conferência, mostrar o apelido no começo da linha apenas quando a " "mensagem atual não for da mesma pessoa que mandou a última." -#: ../src/common/config.py:219 +#: ../src/common/config.py:241 msgid "Indentation when using merge consecutive nickname." msgstr "Usar identação ao mesclar apelidos consecutivos." -#: ../src/common/config.py:220 +#: ../src/common/config.py:242 +msgid "Smooth scroll message in conversation window" +msgstr "Suavizar a rolagem de mensagens na janela de conversação" + +#: ../src/common/config.py:243 msgid "List of colors that will be used to color nicknames in group chats." msgstr "" "A lista de cores que serão usadas para os apelidos nas salas de conferência." -#: ../src/common/config.py:221 +#: ../src/common/config.py:244 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "" "Quando nenhum aba tiver uma mensagem não lida, Ctrl + Tab vai para a próxima " "aba." -#: ../src/common/config.py:222 +#: ../src/common/config.py:245 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." @@ -6060,7 +6957,7 @@ msgstr "" "Devemos mostrar o diálogo de confirmação de metacontatos ou não? Uma string " "vazia significa que nós nunca devemos mostrar o diálogo." -#: ../src/common/config.py:223 +#: ../src/common/config.py:246 msgid "" "If True, you will be able to set a negative priority to your account in " "account modification window. BE CAREFUL, when you are logged in with a " @@ -6071,7 +6968,7 @@ msgstr "" "autenticado com uma prioridade negativa, você NÃO poderá receber nenhuma " "mensagem do seu servidor." -#: ../src/common/config.py:224 +#: ../src/common/config.py:247 msgid "" "If True, Gajim will use Gnome Keyring (if available) to store account " "passwords." @@ -6079,7 +6976,7 @@ msgstr "" "Se Verdadeiro, o Gajim usará o Gnome Keyring (se disponível) para armazenar " "as senhas das contas." -#: ../src/common/config.py:225 +#: ../src/common/config.py:248 msgid "" "If True, Gajim will show number of online and total contacts in account and " "group rows." @@ -6087,7 +6984,7 @@ msgstr "" "Se Verdadeiro, o Gajim mostrará o número de contatos online e do total de " "contatos nas linha de conta e grupo." -#: ../src/common/config.py:226 +#: ../src/common/config.py:249 msgid "" "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " "as if they were of this type" @@ -6095,7 +6992,7 @@ msgstr "" "Pode ser vazio, 'chat' ou 'normal'. Se for vazio, trata todas as mensagens " "recebidas como se elas fossem do tipo especificado" -#: ../src/common/config.py:227 +#: ../src/common/config.py:250 msgid "" "If True, Gajim will scroll and select the contact who sent you the last " "message, if chat window is not already opened." @@ -6103,7 +7000,37 @@ msgstr "" "Se Verdadeiro, o Gajim irá rolar e selecionar o contato que lhe enviou a " "última mensagem, se a janela de conversa ainda não estiver aberta." -#: ../src/common/config.py:238 +#: ../src/common/config.py:251 +msgid "" +"If True, Gajim will convert string between $$ and $$ to an image using dvips " +"and convert before insterting it in chat window." +msgstr "" +"Se definido como Verdadeiro o Gajim converterá strings entre $$ e $$ em uma " +"imagem usando o dvips antes de inseri-la em uma janela de conversa." + +#: ../src/common/config.py:252 +msgid "Time of inactivity needed before the change status window closes down." +msgstr "" +"O tempo de inatividade necessário antes de fechar a janela de alteração de " +"status." + +#: ../src/common/config.py:253 +msgid "" +"Maximum number of lines that are printed in conversations. Oldest lines are " +"cleared." +msgstr "" +"Número máximo de linhas que são exibidas em conversações. As linhas mais " +"antigas são apagadas." + +#: ../src/common/config.py:254 +msgid "" +"If True, notification windows from notification-daemon will be attached to " +"systray icon." +msgstr "" +"Se marcado como Verdadeiro as janelas de notificação do notification-daemon " +"serão anexadas ao ícone da bandeja do sistema." + +#: ../src/common/config.py:265 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." @@ -6112,11 +7039,11 @@ msgstr "" "prioridades são definidas nas opções autopriority_." #. yes, no, ask -#: ../src/common/config.py:267 +#: ../src/common/config.py:293 msgid "Jabberd2 workaround" msgstr "Jabberd2 rodando" -#: ../src/common/config.py:271 +#: ../src/common/config.py:297 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." @@ -6124,101 +7051,101 @@ msgstr "" "Se checado, o Gaijm usará seu IP e proxies definidos no " "file_transfer_proxies, em opções para transferência de arquivos." -#: ../src/common/config.py:330 +#: ../src/common/config.py:356 msgid "Is OpenPGP enabled for this contact?" msgstr "O OpenPGP está ativado para este contato?" -#: ../src/common/config.py:331 ../src/common/config.py:334 +#: ../src/common/config.py:357 ../src/common/config.py:360 msgid "Language for which we want to check misspelled words" msgstr "Idioma a usar na verificação ortográficas das palavras" -#: ../src/common/config.py:340 +#: ../src/common/config.py:366 msgid "all or space separated status" msgstr "todos ou lista de status separados por espaço" -#: ../src/common/config.py:341 +#: ../src/common/config.py:367 msgid "'yes', 'no', or 'both'" msgstr "'sim', 'não' ou 'ambos'" -#: ../src/common/config.py:342 ../src/common/config.py:344 -#: ../src/common/config.py:345 ../src/common/config.py:348 -#: ../src/common/config.py:349 +#: ../src/common/config.py:368 ../src/common/config.py:370 +#: ../src/common/config.py:371 ../src/common/config.py:374 +#: ../src/common/config.py:375 msgid "'yes', 'no' or ''" msgstr "'sim', 'não', ou ''" -#: ../src/common/config.py:355 +#: ../src/common/config.py:381 msgid "Sleeping" msgstr "Dormindo" -#: ../src/common/config.py:356 +#: ../src/common/config.py:382 msgid "Back soon" msgstr "Volto logo" -#: ../src/common/config.py:356 +#: ../src/common/config.py:382 msgid "Back in some minutes." msgstr "Volto em alguns minutos." -#: ../src/common/config.py:357 +#: ../src/common/config.py:383 msgid "Eating" msgstr "Comendo" -#: ../src/common/config.py:357 +#: ../src/common/config.py:383 msgid "I'm eating, so leave me a message." msgstr "Eu estou comendo, então deixe-me uma mensagem." -#: ../src/common/config.py:358 +#: ../src/common/config.py:384 msgid "Movie" msgstr "Filme" -#: ../src/common/config.py:358 +#: ../src/common/config.py:384 msgid "I'm watching a movie." msgstr "Estou assistindo um filme." -#: ../src/common/config.py:359 +#: ../src/common/config.py:385 msgid "Working" msgstr "Trabalhando" -#: ../src/common/config.py:359 +#: ../src/common/config.py:385 msgid "I'm working." msgstr "Estou trabalhando." -#: ../src/common/config.py:360 +#: ../src/common/config.py:386 msgid "Phone" msgstr "Telefone" -#: ../src/common/config.py:360 +#: ../src/common/config.py:386 msgid "I'm on the phone." msgstr "Estou no telefone." -#: ../src/common/config.py:361 +#: ../src/common/config.py:387 msgid "Out" msgstr "Estou fora" -#: ../src/common/config.py:361 +#: ../src/common/config.py:387 msgid "I'm out enjoying life." msgstr "Estou fora curtindo a vida." -#: ../src/common/config.py:365 +#: ../src/common/config.py:391 msgid "I'm available." msgstr "Estou disponível." -#: ../src/common/config.py:366 +#: ../src/common/config.py:392 msgid "I'm free for chat." msgstr "Estou livre para conversar." -#: ../src/common/config.py:368 +#: ../src/common/config.py:394 msgid "I'm not available." msgstr "Não estou disponível." -#: ../src/common/config.py:369 +#: ../src/common/config.py:395 msgid "Do not disturb." msgstr "Não perturbe." -#: ../src/common/config.py:370 ../src/common/config.py:371 +#: ../src/common/config.py:396 ../src/common/config.py:397 msgid "Bye!" msgstr "Tchau!" -#: ../src/common/config.py:380 +#: ../src/common/config.py:406 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." @@ -6226,138 +7153,128 @@ msgstr "" "Som para tocar quando uma mensagem MUC conter uma das palavras no " "muc_hightlight_words, ou quando uma mensagem MUC contiver seu apelido." -#: ../src/common/config.py:381 +#: ../src/common/config.py:407 msgid "Sound to play when any MUC message arrives." msgstr "Som a ser tocado quando qualquer mensagem MUC chegar." -#: ../src/common/config.py:390 ../src/common/optparser.py:195 +#: ../src/common/config.py:416 ../src/common/optparser.py:220 msgid "green" msgstr "verde" -#: ../src/common/config.py:394 ../src/common/optparser.py:181 +#: ../src/common/config.py:420 ../src/common/optparser.py:206 msgid "grocery" msgstr "mantimento" -#: ../src/common/config.py:398 +#: ../src/common/config.py:424 msgid "human" msgstr "humano" -#: ../src/common/config.py:402 +#: ../src/common/config.py:428 msgid "marine" msgstr "marinho" -#: ../src/common/connection_handlers.py:52 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:44 +#: ../src/common/connection_handlers.py:61 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:49 msgid "Unable to load idle module" msgstr "Incapaz de carregar o módulo inativo" -#: ../src/common/connection_handlers.py:180 -#: ../src/common/connection_handlers.py:215 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 +#: ../src/common/connection_handlers.py:219 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:243 msgid "Wrong host" msgstr "Servidor errado" -#: ../src/common/connection_handlers.py:180 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 -#, python-format -msgid "" -"The host %s you configured as the ft_add_hosts_to_send advanced option is " -"not valid, so ignored." -msgstr "" -"O computador %s que você especificou na configuração avançada " -"ft_override_host_to_send não é válido e será ignorado." - -#: ../src/common/connection_handlers.py:216 +#: ../src/common/connection_handlers.py:220 msgid "Invalid local address? :-O" msgstr "Endereço local inválido? :-O" -#: ../src/common/connection_handlers.py:607 +#: ../src/common/connection_handlers.py:618 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "A informação do registo para o transporte %s não chegou a tempo" -#: ../src/common/connection_handlers.py:1550 +#: ../src/common/connection_handlers.py:1802 #, python-format msgid "Nickname not allowed: %s" msgstr "Apelido não permitido: %s" -#. password required to join #. we are banned #. group chat does not exist -#: ../src/common/connection_handlers.py:1615 -#: ../src/common/connection_handlers.py:1618 -#: ../src/common/connection_handlers.py:1621 -#: ../src/common/connection_handlers.py:1624 -#: ../src/common/connection_handlers.py:1627 -#: ../src/common/connection_handlers.py:1630 -#: ../src/common/connection_handlers.py:1638 +#: ../src/common/connection_handlers.py:1872 +#: ../src/common/connection_handlers.py:1875 +#: ../src/common/connection_handlers.py:1878 +#: ../src/common/connection_handlers.py:1881 +#: ../src/common/connection_handlers.py:1885 +#: ../src/common/connection_handlers.py:1894 msgid "Unable to join group chat" msgstr "Impossível ingressar na sala" -#: ../src/common/connection_handlers.py:1616 -msgid "A password is required to join this group chat." -msgstr "Uma senha é requerida para entrar nesta sala." +#: ../src/common/connection_handlers.py:1873 +#, python-format +msgid "You are banned from group chat %s." +msgstr "Você está banido da sala %s." -#: ../src/common/connection_handlers.py:1619 -msgid "You are banned from this group chat." -msgstr "Você está banido desta sala." +#: ../src/common/connection_handlers.py:1876 +#, python-format +msgid "Group chat %s does not exist." +msgstr "A sala %s não existe." -#: ../src/common/connection_handlers.py:1622 -msgid "Such group chat does not exist." -msgstr "Tal sala não existe." - -#: ../src/common/connection_handlers.py:1625 +#: ../src/common/connection_handlers.py:1879 msgid "Group chat creation is restricted." msgstr "A criação de sala é restrita." -#: ../src/common/connection_handlers.py:1628 -msgid "Your registered nickname must be used." -msgstr "Seu nickname registado deve ser usado." +#: ../src/common/connection_handlers.py:1882 +#, python-format +msgid "Your registered nickname must be used in group chat %s." +msgstr "Seu nickname registado deve ser usado na sala %s." -#: ../src/common/connection_handlers.py:1631 -msgid "You are not in the members list." -msgstr "Você não está na lista de membros." +#: ../src/common/connection_handlers.py:1886 +#, python-format +msgid "You are not in the members list in groupchat %s." +msgstr "Você não está na lista de membros da sala %s." -#: ../src/common/connection_handlers.py:1639 +#: ../src/common/connection_handlers.py:1895 +#, python-format msgid "" -"Your desired nickname is in use or registered by another occupant.\n" +"Your desired nickname in group chat %s is in use or registered by another " +"occupant.\n" "Please specify another nickname below:" msgstr "" -"Seu nickname desejado está em uso ou registado por um outro usuário.\n" -" Por favor, especifique um outro nickname abaixo:" +"O apelido que você deseja usar está em uso ou registado por um outro " +"ocupante.\n" +"Por favor, especifique um outro apelido abaixo:" #. Room has been destroyed. see #. http://www.xmpp.org/extensions/xep-0045.html#destroyroom -#: ../src/common/connection_handlers.py:1682 +#: ../src/common/connection_handlers.py:1926 msgid "Room has been destroyed" msgstr "A sala foi excluída" -#: ../src/common/connection_handlers.py:1689 +#: ../src/common/connection_handlers.py:1933 #, python-format msgid "You can join this room instead: %s" msgstr "Você pode entrar nessa sala ao invés: %s" -#: ../src/common/connection_handlers.py:1715 +#: ../src/common/connection_handlers.py:1960 msgid "I would like to add you to my roster." msgstr "Eu gostaria de adiciona-lo à minha lista." #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:1736 +#: ../src/common/connection_handlers.py:1981 #, python-format msgid "we are now subscribed to %s" msgstr "nós estamos agora inscritos para %s" -#: ../src/common/connection_handlers.py:1738 +#: ../src/common/connection_handlers.py:1983 #, python-format msgid "unsubscribe request from %s" msgstr "Remoção de Inscrição solicitada por %s" -#: ../src/common/connection_handlers.py:1740 +#: ../src/common/connection_handlers.py:1985 #, python-format msgid "we are now unsubscribed from %s" msgstr "nós estamos agora sem inscrição para %s" -#: ../src/common/connection_handlers.py:1859 +#: ../src/common/connection_handlers.py:2112 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " @@ -6367,88 +7284,71 @@ msgstr "" "ferramentas de gerência da lista como http://jru.jabberstudio.org/ para " "removê-lo" -#: ../src/common/connection.py:194 -#: ../src/common/zeroconf/connection_zeroconf.py:198 +#. We didn't set a passphrase +#: ../src/common/connection_handlers.py:2151 +#: ../src/common/zeroconf/connection_zeroconf.py:169 +msgid "OpenPGP passphrase was not given" +msgstr "Palavra-chave do OpenPGP não foi recebida" + +#: ../src/common/connection.py:243 +#: ../src/common/zeroconf/connection_zeroconf.py:209 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Conexão com a conta \"%s\" foi perdida" -#: ../src/common/connection.py:195 +#: ../src/common/connection.py:244 msgid "Reconnect manually." msgstr "Reconecte manualmente." -#: ../src/common/connection.py:206 ../src/common/connection.py:233 +#: ../src/common/connection.py:255 +#, python-format +msgid "Server %s answered wrongly to register request: %s" +msgstr "O servidor %s respondeu erroneamente à requisição de registro: %s" + +#. wrong answer +#: ../src/common/connection.py:263 +msgid "Invalid answer" +msgstr "Resposta inválida" + +#: ../src/common/connection.py:264 #, python-format msgid "Transport %s answered wrongly to register request: %s" msgstr "Transporte %s respondeu errado para registar o pedido: %s" -#. wrong answer -#: ../src/common/connection.py:232 -msgid "Invalid answer" -msgstr "Resposta inválida" - -#: ../src/common/connection.py:380 +#: ../src/common/connection.py:410 msgid "Connection to proxy failed" msgstr "Falha na conexão com o proxy" -#: ../src/common/connection.py:434 ../src/common/connection.py:532 -#: ../src/common/connection.py:1003 -#: ../src/common/zeroconf/connection_zeroconf.py:219 +#: ../src/common/connection.py:464 ../src/common/connection.py:510 +#: ../src/common/connection.py:1081 +#: ../src/common/zeroconf/connection_zeroconf.py:243 #, python-format msgid "Could not connect to \"%s\"" msgstr "Impossível conectar a \"%s\"" -#: ../src/common/connection.py:448 +#: ../src/common/connection.py:478 #, python-format msgid "Connected to server %s:%s with %s" msgstr "Conectado ao servidor %s:%s com %s" -#: ../src/common/connection.py:461 -#, python-format -msgid "Security error connecting to \"%s\"" -msgstr "Erro de segurança ao conectar a \"%s\"" - -#: ../src/common/connection.py:462 -msgid "" -"The server's key has changed, or someone is trying to hack your connection." -msgstr "" -"A chave do servidor foi alterada ou alguém está tentando hackear a sua " -"conexão." - -#: ../src/common/connection.py:469 -#, python-format -msgid "Unable to check fingerprint for %s. Connection could be insecure." -msgstr "" -"Incapaz de verifica a impressão digital de %s. A conexão pode ser insegura." - #: ../src/common/connection.py:511 -#, python-format -msgid "Missing fingerprint in SSL connection to %s" -msgstr "Faltando impressão digital na conexão SSL para %s" - -#: ../src/common/connection.py:517 -#, python-format -msgid "Fingerprint mismatch for %s: Got %s, expected %s" -msgstr "Conflito de impressões digitais para %s: obtido %s, esperado %s" - -#: ../src/common/connection.py:533 msgid "Check your connection or try again later" msgstr "Verifique sua conexão ou tente novamente mais tarde" -#: ../src/common/connection.py:559 +#: ../src/common/connection.py:536 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Falha na autenticação com \"%s\"" -#: ../src/common/connection.py:560 +#: ../src/common/connection.py:538 msgid "Please check your login and password for correctness." msgstr "Por favor, verifique seu login e senha para exatidão." -#: ../src/common/connection.py:603 +#: ../src/common/connection.py:581 msgid "Error while removing privacy list" msgstr "Erro ao remover lista de privacidade" -#: ../src/common/connection.py:604 +#: ../src/common/connection.py:582 #, python-format msgid "" "Privacy list %s has not been removed. It is maybe active in one of your " @@ -6457,20 +7357,14 @@ msgstr "" "A lista de privacidade %s não foi removida. Ela pode estar ativa em um ou " "mais recursos conectados. Desative-os e tente novamente." -#. We didn't set a passphrase -#: ../src/common/connection.py:702 -#: ../src/common/zeroconf/connection_zeroconf.py:158 -msgid "OpenPGP passphrase was not given" -msgstr "Palavra-chave do OpenPGP não foi recebida" - #. we're not english #. one in locale and one en -#: ../src/common/connection.py:833 +#: ../src/common/connection.py:856 msgid "[This message is *encrypted* (See :JEP:`27`]" msgstr "[Esta mensagem está *criptografada* (Veja:JEP:'27')]" -#: ../src/common/connection.py:889 -#: ../src/common/zeroconf/connection_zeroconf.py:399 +#: ../src/common/connection.py:930 +#: ../src/common/zeroconf/connection_zeroconf.py:437 #, python-format msgid "" "Subject: %s\n" @@ -6479,39 +7373,39 @@ msgstr "" "Assunto: %s\n" "%s" -#: ../src/common/connection.py:1029 +#: ../src/common/connection.py:1113 msgid "Not fetched because of invisible status" msgstr "Não baixado por causa do status invisível" -#: ../src/common/contacts.py:271 +#: ../src/common/contacts.py:299 msgid "Not in roster" msgstr "Fora da lista" #. only say that to non Windows users -#: ../src/common/dbus_support.py:33 +#: ../src/common/dbus_support.py:41 msgid "D-Bus python bindings are missing in this computer" msgstr "Acesso ao python D-Bus foi perdido neste computador" -#: ../src/common/dbus_support.py:34 +#: ../src/common/dbus_support.py:42 msgid "D-Bus capabilities of Gajim cannot be used" msgstr "As potencialidades do D-Bus no Gajim não podem ser usadas" -#: ../src/common/exceptions.py:22 +#: ../src/common/exceptions.py:27 msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." msgstr "O pysqlite2 (ou python-pysqlite2) está faltando. Encerrando..." -#: ../src/common/exceptions.py:30 +#: ../src/common/exceptions.py:44 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "" "Serviço não disponível: o Gajim não está funcionando ou o controle remoto é " "falso" -#: ../src/common/exceptions.py:38 +#: ../src/common/exceptions.py:52 msgid "D-Bus is not present on this machine or python module is missing" msgstr "" "O D-Bus não está presente nesta máquina ou o módulo do Python está faltando" -#: ../src/common/exceptions.py:46 +#: ../src/common/exceptions.py:60 msgid "" "Session bus is not available.\n" "Try reading http://trac.gajim.org/wiki/GajimDBus" @@ -6519,443 +7413,446 @@ msgstr "" "O bus de sessão não está disponível.\n" "Veja http://trac.gajim.org/wiki/GajimDBus" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "one" msgstr "um" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "two" msgstr "dois" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "three" msgstr "três" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "four" msgstr "quatro" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "five" msgstr "cinco" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "six" msgstr "seis" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "seven" msgstr "sete" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "eight" msgstr "oito" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "nine" msgstr "nove" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "ten" msgstr "dez" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "eleven" msgstr "onze" -#: ../src/common/fuzzyclock.py:44 +#: ../src/common/fuzzyclock.py:49 msgid "twelve" msgstr "doze" #. Strings to use for the output. %0 will be replaced with the preceding hour (e.g. "x PAST %0"), %1 with the coming hour (e.g. "x TO %1). ''' #. A "singular-form". It is used when talking about hour 0 -#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 msgid "$0 o'clock" msgstr "$0 horas" -#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 msgid "five past $0" msgstr "$0 e cinco" -#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 +#: ../src/common/fuzzyclock.py:53 ../src/common/fuzzyclock.py:61 msgid "ten past $0" msgstr "$0 e dez" -#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 +#: ../src/common/fuzzyclock.py:53 ../src/common/fuzzyclock.py:61 msgid "quarter past $0" msgstr "$0 e quinze" -#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 +#: ../src/common/fuzzyclock.py:54 ../src/common/fuzzyclock.py:62 msgid "twenty past $0" msgstr "$0 e vinte" -#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 +#: ../src/common/fuzzyclock.py:54 ../src/common/fuzzyclock.py:62 msgid "twenty five past $0" msgstr "$0 e vinte e cinco" -#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 +#: ../src/common/fuzzyclock.py:55 ../src/common/fuzzyclock.py:63 msgid "half past $0" msgstr "$0 e meia" -#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 +#: ../src/common/fuzzyclock.py:55 ../src/common/fuzzyclock.py:63 msgid "twenty five to $1" msgstr "vinte e cinco para as $1" -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 +#: ../src/common/fuzzyclock.py:56 ../src/common/fuzzyclock.py:64 msgid "twenty to $1" msgstr "vinte para as $1" -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 +#: ../src/common/fuzzyclock.py:56 ../src/common/fuzzyclock.py:64 msgid "quarter to $1" msgstr "quinze para as $1" -#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +#: ../src/common/fuzzyclock.py:57 ../src/common/fuzzyclock.py:65 msgid "ten to $1" msgstr "dez para as $1" -#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +#: ../src/common/fuzzyclock.py:57 ../src/common/fuzzyclock.py:65 msgid "five to $1" msgstr "cinco para as $1" -#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:61 +#: ../src/common/fuzzyclock.py:57 ../src/common/fuzzyclock.py:66 msgid "$1 o'clock" msgstr "$1 horas" -#: ../src/common/fuzzyclock.py:64 +#: ../src/common/fuzzyclock.py:69 msgid "Night" msgstr "Noite" -#: ../src/common/fuzzyclock.py:64 +#: ../src/common/fuzzyclock.py:69 msgid "Early morning" msgstr "Madrugada" -#: ../src/common/fuzzyclock.py:64 +#: ../src/common/fuzzyclock.py:69 msgid "Morning" msgstr "Manhã" -#: ../src/common/fuzzyclock.py:64 +#: ../src/common/fuzzyclock.py:69 msgid "Almost noon" msgstr "Quase meio-dia" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:70 msgid "Noon" msgstr "Meio-dia" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:70 msgid "Afternoon" msgstr "Tarde" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:70 msgid "Evening" msgstr "Noite" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:70 msgid "Late evening" msgstr "Tarde da noite" -#: ../src/common/fuzzyclock.py:67 +#: ../src/common/fuzzyclock.py:72 msgid "Start of week" msgstr "Começo da semana" -#: ../src/common/fuzzyclock.py:67 +#: ../src/common/fuzzyclock.py:72 msgid "Middle of week" msgstr "Meio da semana" -#: ../src/common/fuzzyclock.py:67 +#: ../src/common/fuzzyclock.py:72 msgid "End of week" msgstr "Fim da semana" -#: ../src/common/fuzzyclock.py:68 +#: ../src/common/fuzzyclock.py:73 msgid "Weekend!" msgstr "Final de semana!" -#: ../src/common/helpers.py:114 +#: ../src/common/helpers.py:124 msgid "Invalid character in username." msgstr "Caracter inválido no nome do usuário" -#: ../src/common/helpers.py:119 +#: ../src/common/helpers.py:129 msgid "Server address required." msgstr "Endereço do servidor é requerido." -#: ../src/common/helpers.py:124 +#: ../src/common/helpers.py:134 msgid "Invalid character in hostname." msgstr "Caracter inválido no nome do host" -#: ../src/common/helpers.py:130 +#: ../src/common/helpers.py:140 msgid "Invalid character in resource." msgstr "Caracter inválido no recurso." #. GiB means gibibyte -#: ../src/common/helpers.py:170 +#: ../src/common/helpers.py:180 #, python-format msgid "%s GiB" msgstr "%s GiB" #. GB means gigabyte -#: ../src/common/helpers.py:173 +#: ../src/common/helpers.py:183 #, python-format msgid "%s GB" msgstr "%s GB" #. MiB means mibibyte -#: ../src/common/helpers.py:177 +#: ../src/common/helpers.py:187 #, python-format msgid "%s MiB" msgstr "%s MiB" #. MB means megabyte -#: ../src/common/helpers.py:180 +#: ../src/common/helpers.py:190 #, python-format msgid "%s MB" msgstr "%s MB" #. KiB means kibibyte -#: ../src/common/helpers.py:184 +#: ../src/common/helpers.py:194 #, python-format msgid "%s KiB" msgstr "%s KiB" #. KB means kilo bytes -#: ../src/common/helpers.py:187 +#: ../src/common/helpers.py:197 #, python-format msgid "%s KB" msgstr "%s KB" #. B means bytes -#: ../src/common/helpers.py:190 +#: ../src/common/helpers.py:200 #, python-format msgid "%s B" msgstr "%s B" -#: ../src/common/helpers.py:219 +#: ../src/common/helpers.py:231 msgid "_Busy" msgstr "_Ocupado" -#: ../src/common/helpers.py:221 +#: ../src/common/helpers.py:233 msgid "Busy" msgstr "Ocupado" -#: ../src/common/helpers.py:224 +#: ../src/common/helpers.py:236 msgid "_Not Available" msgstr "_Não Disponível" -#: ../src/common/helpers.py:229 +#: ../src/common/helpers.py:241 msgid "_Free for Chat" msgstr "Livre para _Conversa" -#: ../src/common/helpers.py:231 +#: ../src/common/helpers.py:243 msgid "Free for Chat" msgstr "Livre para Conversa" -#: ../src/common/helpers.py:234 +#: ../src/common/helpers.py:246 msgid "_Available" msgstr "Dis_ponível" -#: ../src/common/helpers.py:236 -msgid "Available" -msgstr "Disponível" - -#: ../src/common/helpers.py:238 +#: ../src/common/helpers.py:250 msgid "Connecting" msgstr "Conectando" -#: ../src/common/helpers.py:241 +#: ../src/common/helpers.py:253 msgid "A_way" msgstr "_Afastado" -#: ../src/common/helpers.py:246 +#: ../src/common/helpers.py:258 msgid "_Offline" msgstr "_Desconectado" -#: ../src/common/helpers.py:248 +#: ../src/common/helpers.py:260 msgid "Offline" msgstr "Desconectado" -#: ../src/common/helpers.py:251 +#: ../src/common/helpers.py:263 msgid "_Invisible" msgstr "_Invisível" -#: ../src/common/helpers.py:257 +#: ../src/common/helpers.py:269 msgid "?contact has status:Unknown" msgstr "?contato tem status:Desconhecido" -#: ../src/common/helpers.py:259 +#: ../src/common/helpers.py:271 msgid "?contact has status:Has errors" msgstr "?contato tem status:Com erros" -#: ../src/common/helpers.py:264 +#: ../src/common/helpers.py:276 msgid "?Subscription we already have:None" msgstr "?Inscrição existente:Nenhuma" -#: ../src/common/helpers.py:266 +#: ../src/common/helpers.py:278 msgid "To" msgstr "Para" -#: ../src/common/helpers.py:270 +#: ../src/common/helpers.py:282 msgid "Both" msgstr "Ambos" -#: ../src/common/helpers.py:278 +#: ../src/common/helpers.py:290 msgid "?Ask (for Subscription):None" msgstr "?Pergunta (para Inscrição):Nenhuma" -#: ../src/common/helpers.py:280 +#: ../src/common/helpers.py:292 msgid "Subscribe" msgstr "Inscrever" -#: ../src/common/helpers.py:289 +#: ../src/common/helpers.py:301 msgid "?Group Chat Contact Role:None" msgstr "?Regra do Contato para Conversa em Grupo:Nenhuma" -#: ../src/common/helpers.py:292 +#: ../src/common/helpers.py:304 msgid "Moderators" msgstr "Moderadores" -#: ../src/common/helpers.py:294 +#: ../src/common/helpers.py:306 msgid "Moderator" msgstr "Moderador" -#: ../src/common/helpers.py:297 +#: ../src/common/helpers.py:309 msgid "Participants" msgstr "Participantes" -#: ../src/common/helpers.py:299 +#: ../src/common/helpers.py:311 msgid "Participant" msgstr "Participante" -#: ../src/common/helpers.py:302 +#: ../src/common/helpers.py:314 msgid "Visitors" msgstr "Visitantes" -#: ../src/common/helpers.py:304 +#: ../src/common/helpers.py:316 msgid "Visitor" msgstr "Visitante" -#: ../src/common/helpers.py:310 +#: ../src/common/helpers.py:322 msgid "?Group Chat Contact Affiliation:None" msgstr "?Filiação do Contato de Conferência:Nenhuma" -#: ../src/common/helpers.py:312 +#: ../src/common/helpers.py:324 msgid "Owner" msgstr "Dono" -#: ../src/common/helpers.py:314 +#: ../src/common/helpers.py:326 msgid "Administrator" msgstr "Administrador" -#: ../src/common/helpers.py:316 +#: ../src/common/helpers.py:328 msgid "Member" msgstr "Membro" -#: ../src/common/helpers.py:355 +#: ../src/common/helpers.py:367 msgid "is paying attention to the conversation" msgstr "está prestando a atenção na conversa" -#: ../src/common/helpers.py:357 +#: ../src/common/helpers.py:369 msgid "is doing something else" msgstr "está fazendo outra coisa" -#: ../src/common/helpers.py:359 +#: ../src/common/helpers.py:371 msgid "is composing a message..." msgstr "está digitando..." #. paused means he or she was composing but has stopped for a while -#: ../src/common/helpers.py:362 +#: ../src/common/helpers.py:374 msgid "paused composing a message" msgstr "parou de digitar" -#: ../src/common/helpers.py:364 +#: ../src/common/helpers.py:376 msgid "has closed the chat window or tab" msgstr "fechou a janela de conversa ou aba" -#: ../src/common/helpers.py:890 +#: ../src/common/helpers.py:947 ../src/common/helpers.py:954 #, python-format -msgid " %d unread message" -msgid_plural " %d unread messages" -msgstr[0] "%d mensagem não lida" -msgstr[1] "%d mensagens não lidas" +msgid "%d message pending" +msgid_plural "%d messages pending" +msgstr[0] "%d mensagem pendente" +msgstr[1] "%s mensagens pendentes" -#: ../src/common/helpers.py:896 +#: ../src/common/helpers.py:960 #, python-format -msgid " %d unread single message" -msgid_plural " %d unread single messages" -msgstr[0] "%d mensagem individual não lida" -msgstr[1] "%d mensagens individuais não lidas" +msgid " from room %s" +msgstr " da sala %s" -#: ../src/common/helpers.py:902 +#: ../src/common/helpers.py:963 ../src/common/helpers.py:982 #, python-format -msgid " %d unread group chat message" -msgid_plural " %d unread group chat messages" -msgstr[0] "%d mensagem de conferência não lida" -msgstr[1] "%d mensagens de conferência não lidas" +msgid " from user %s" +msgstr " do usuário %s" -#: ../src/common/helpers.py:908 +#: ../src/common/helpers.py:965 #, python-format -msgid " %d unread private message" -msgid_plural " %d unread private messages" -msgstr[0] "%d mensagem privada não lida" -msgstr[1] "%d mensagens privadas não lidas" +msgid " from %s" +msgstr " de %s" -#: ../src/common/helpers.py:918 ../src/common/helpers.py:920 +#: ../src/common/helpers.py:972 ../src/common/helpers.py:979 +#, python-format +msgid "%d event pending" +msgid_plural "%d events pending" +msgstr[0] "%d evento pendente" +msgstr[1] "%d eventos pendentes" + +#: ../src/common/helpers.py:1012 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" #. we talk about a file -#: ../src/common/optparser.py:59 +#: ../src/common/optparser.py:65 #, python-format msgid "error: cannot open %s for reading" msgstr "erro: impossível abrir %s para leitura" -#: ../src/common/optparser.py:181 -msgid "gtk+" -msgstr "gtk+" - -#: ../src/common/optparser.py:190 ../src/common/optparser.py:191 +#: ../src/common/optparser.py:215 ../src/common/optparser.py:216 msgid "cyan" msgstr "azul celeste" -#: ../src/common/optparser.py:308 +#: ../src/common/optparser.py:332 msgid "migrating logs database to indices" msgstr "migrando base de dados de registros para índices" -#: ../src/common/passwords.py:82 +#: ../src/common/passwords.py:88 #, python-format msgid "Gajim account %s" msgstr "Conta %s do Gajim" -#: ../src/common/zeroconf/client_zeroconf.py:191 +#: ../src/common/zeroconf/client_zeroconf.py:149 +#: ../src/common/zeroconf/client_zeroconf.py:232 +msgid "Connection to host could not be established" +msgstr "A conexão ao computador não pôde ser estabelecida." + +#: ../src/common/zeroconf/client_zeroconf.py:206 msgid "" "Connection to host could not be established: Incorrect answer from server." msgstr "" "A conexão ao computador não pôde ser estabelecida: resposta incorreta do " "servidor." -#: ../src/common/zeroconf/client_zeroconf.py:207 -msgid "Connection to host could not be established" -msgstr "A conexão ao computador não pôde ser estabelecida." - -#: ../src/common/zeroconf/client_zeroconf.py:341 +#: ../src/common/zeroconf/client_zeroconf.py:366 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" "A conexão ao computador não pode ser estabelecida: tempo excedido ao " "transmitir os dados." -#: ../src/common/zeroconf/client_zeroconf.py:634 +#: ../src/common/zeroconf/client_zeroconf.py:652 msgid "Contact is offline. Your message could not be sent." msgstr "O contato está offline. Sua mensagem não pode ser enviada." -#: ../src/common/zeroconf/connection_zeroconf.py:199 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:243 +#, python-format +msgid "" +"The host %s you configured as the ft_add_hosts_to_send advanced option is " +"not valid, so ignored." +msgstr "" +"O computador %s que você especificou na configuração avançada " +"ft_override_host_to_send não é válido e será ignorado." + +#: ../src/common/zeroconf/connection_zeroconf.py:210 msgid "To continue sending and receiving messages, you will need to reconnect." msgstr "" "Para continuar enviando e recebendo mensagens, você precisará reconectar." -#: ../src/common/zeroconf/connection_zeroconf.py:209 +#: ../src/common/zeroconf/connection_zeroconf.py:233 msgid "Avahi error" msgstr "Erro do Avahi" -#: ../src/common/zeroconf/connection_zeroconf.py:209 +#: ../src/common/zeroconf/connection_zeroconf.py:233 #, python-format msgid "" "%s\n" @@ -6964,31 +7861,31 @@ msgstr "" "%s\n" "Mensagens link-local podem não funcionar adequadamente." -#: ../src/common/zeroconf/connection_zeroconf.py:220 +#: ../src/common/zeroconf/connection_zeroconf.py:244 msgid "Please check if Avahi is installed." msgstr "Por favor verifique se o Avahi está instalado." -#: ../src/common/zeroconf/connection_zeroconf.py:229 -#: ../src/common/zeroconf/connection_zeroconf.py:233 +#: ../src/common/zeroconf/connection_zeroconf.py:253 +#: ../src/common/zeroconf/connection_zeroconf.py:257 msgid "Could not start local service" msgstr "Impossível iniciar o serviço local" -#: ../src/common/zeroconf/connection_zeroconf.py:230 +#: ../src/common/zeroconf/connection_zeroconf.py:254 #, python-format msgid "Unable to bind to port %d." msgstr "Impossível conectar-se à porta %d." -#: ../src/common/zeroconf/connection_zeroconf.py:234 -#: ../src/common/zeroconf/connection_zeroconf.py:327 +#: ../src/common/zeroconf/connection_zeroconf.py:258 +#: ../src/common/zeroconf/connection_zeroconf.py:353 msgid "Please check if avahi-daemon is running." msgstr "Por favor verifique se o serviço avahi-daemon está rodando." -#: ../src/common/zeroconf/connection_zeroconf.py:326 +#: ../src/common/zeroconf/connection_zeroconf.py:352 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Impossível alterar status da conta \"%s\"" -#: ../src/common/zeroconf/connection_zeroconf.py:343 +#: ../src/common/zeroconf/connection_zeroconf.py:369 msgid "" "You are not connected or not visible to others. Your message could not be " "sent." @@ -6997,20 +7894,225 @@ msgstr "" "pode ser enviada." #. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:355 +#: ../src/common/zeroconf/connection_zeroconf.py:381 msgid "[This message is encrypted]" msgstr "[Esta mensagem está criptografada]" -#: ../src/common/zeroconf/zeroconf.py:180 +#: ../src/common/zeroconf/zeroconf_avahi.py:183 +#: ../src/common/zeroconf/zeroconf_bonjour.py:194 #, python-format msgid "Error while adding service. %s" msgstr "Erro ao adicionar serviço. %s" -#~ msgid "Select the account with which you want to synchronise" -#~ msgstr "Selecione a conta que você quer sincronizar" +#~ msgid "Save passphrase" +#~ msgstr "Salvar Frase de acesso" -#~ msgid "Select the contacts you want to synchronise" -#~ msgstr "Selecione os contatos que você quer sincronizar" +#~ msgid "_Discover Services..." +#~ msgstr "_Procurar Serviços..." -#~ msgid "Synchronise : select contacts" -#~ msgstr "Sincronizar: selecionar contatos" +#~ msgid "_Retype Password:" +#~ msgstr "_Reescreva a Senha:" + +#~ msgid "_Use proxy" +#~ msgstr "_Usar proxy" + +#~ msgid "Accounts" +#~ msgstr "Contas" + +#~ msgid "" +#~ "If checked, all local contacts that use a Bonjour compatible chat client " +#~ "(like iChat, Trillian or Gaim) will be shown in roster. You don't need to " +#~ "be connected to a jabber server for it to work.\n" +#~ "This is only available if python-avahi is installed and avahi-daemon is " +#~ "running." +#~ msgstr "" +#~ "Se marcado, todos os contatos locais que usam um cliente de chat " +#~ "compatível com o Bonjour (como iChat, Trillian ou Gaim) serão mostrados " +#~ "na lista. Você não precisa estar conectado a um servidor jabber para que " +#~ "ele funcione.\n" +#~ " Isto só está disponível se o python-avahi estiver instalado e o serviço " +#~ "avahi-daemon estiver rodando." + +#~ msgid "" +#~ "If you have 2 or more accounts and this is checked, Gajim will list all " +#~ "contacts as if you had one account" +#~ msgstr "" +#~ "Se você tiver duas ou mais contas e isto estiver marcado, o Gajim listará " +#~ "todos os contatos como se você tivesse somente uma única conta" + +#~ msgid "_Enable link-local messaging" +#~ msgstr "_Ativar mensagens \"link-local\"" + +#~ msgid "_Modify" +#~ msgstr "_Modificar" + +#~ msgid "_Compact View Alt+C" +#~ msgstr "Visão _Compacta Alt+C" + +#~ msgid "Build custom query" +#~ msgstr "Gerar consulta customizada" + +#~ msgid "Query Builder..." +#~ msgstr "Gerador de consultas..." + +#~ msgid "Interface Customization" +#~ msgstr "Customização de interface" + +#~ msgid "Also known as iChat style" +#~ msgstr "Conhecido também como estilo iChat" + +#~ msgid "Chat" +#~ msgstr "Conversa" + +#~ msgid "E_very 5 minutes" +#~ msgstr "De 5 _em 5 minutos" + +#~ msgid "" +#~ "Gajim will automatically show new events by popping up the relevant window" +#~ msgstr "" +#~ "O Gajim automaticamente mostrará novos eventos em uma janela saltando " +#~ "sobre a janela relevante" + +#~ msgid "" +#~ "Gajim will notify you for new events via a popup in the bottom right of " +#~ "the screen" +#~ msgstr "" +#~ "Gajim notificará você de uma novo evento via uma alerta visual na lateral " +#~ "inferior direita da tela" + +#~ msgid "" +#~ "Gajim will notify you via a popup window in the bottom right of the " +#~ "screen about contacts that just signed in" +#~ msgstr "" +#~ "Gajim notificará você através de um alerta visual na parte inferior " +#~ "direita da tela sobre os contatos que se conectaram" + +#~ msgid "" +#~ "Gajim will only change the icon of the contact that triggered the new " +#~ "event" +#~ msgstr "Gajim mudará somente o ícone do contato que provocou o evento novo" + +#~ msgid "" +#~ "If checked, Gajim will remember the roster and chat window positions in " +#~ "the screen and the sizes of them next time you run it" +#~ msgstr "" +#~ "Se marcado, o Gajim lembrará a posição e tamanho da janela principal na " +#~ "próxima vez que você executa-lo" + +#~ msgid "On every _message" +#~ msgstr "Em todas as _mensagens" + +#~ msgid "Outgoing Chat state noti_fications:" +#~ msgstr "Enviar noti_ficações do status da conversa:" + +#~ msgid "Print time:" +#~ msgstr "Imprimir tempo:" + +#~ msgid "Save _position and size for roster and chat windows" +#~ msgstr "" +#~ "Salvar _posição e tamanho das janelas de conversa e lista de contatos" + +#~ msgid "Show only in _roster" +#~ msgstr "Mostre somente na _lista" + +#~ msgid "Use t_rayicon (aka. notification area icon)" +#~ msgstr "Usar ícone na bandeja (também conhecido por área de notificação)" + +#~ msgid "" +#~ "When a new event (message, file transfer request etc..) is received, the " +#~ "following methods may be used to inform you about it. Please note that " +#~ "events about new messages only occur if it is a new message from a " +#~ "contact you are not already chatting with" +#~ msgstr "" +#~ "Quando um evento novo (mensagem, pedido etc. de transferência de arquivo, " +#~ "etc.) é recebido, os seguintes métodos podem ser usados para informá-lo " +#~ "sobre ele. Por favor, note que os eventos sobre mensagens novas ocorrem " +#~ "somente se for uma mensagem nova de um contato que você não está " +#~ "conversando" + +#~ msgid "_Never" +#~ msgstr "_Nunca" + +#~ msgid "_Notify me about it" +#~ msgstr "_Notifique-me sobre isto" + +#~ msgid "_Pop it up" +#~ msgstr "_Alerta visual" + +#~ msgid "_Remove from Roster" +#~ msgstr "_Remover da Lista" + +#~ msgid "_Filter:" +#~ msgstr "_Filtro:" + +#~ msgid "" +#~ "If that is not your language for which you want to highlight misspelled " +#~ "words, then please set your $LANG as appropriate. Eg. for French do " +#~ "export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to " +#~ "make it global in /etc/profile.\n" +#~ "\n" +#~ "Highlighting misspelled words feature will not be used" +#~ msgstr "" +#~ "Se este não for o idioma para o qual você quer destacar palavras " +#~ "incorretas, por favor, configure a sua variável de ambiente $LANG com o " +#~ "valor apropriado. Por exemplo, para o francês exporte LANG=fr_FR ou " +#~ "exporte LANG=fr_FR.UTF-8 em ~/.bash_profile ou coloca-lo \n" +#~ " globalmente em/etc/profile.\n" +#~ "Caracteristica de destacar palavras erradas não será usada" + +#~ msgid "Every %s _minutes" +#~ msgstr "A cada %s _minutos" + +#~ msgid "You must enter a password for the new account." +#~ msgstr "Você deve entrar com uma senha para registrar uma nova conta." + +#~ msgid "%s does not appear to be a valid JID" +#~ msgstr "%s não parece ser um JID válido" + +#~ msgid "Drop %s in group %s" +#~ msgstr "Derrubar %s no grupo %s" + +#~ msgid "Make %s and %s metacontacts" +#~ msgstr "Fazer %s e %s metacontatos" + +#~ msgid "Hides the buttons in two persons chat window." +#~ msgstr "Esconder os botões na janela de conversa para duas pessoas." + +#~ msgid "Security error connecting to \"%s\"" +#~ msgstr "Erro de segurança ao conectar a \"%s\"" + +#~ msgid "" +#~ "The server's key has changed, or someone is trying to hack your " +#~ "connection." +#~ msgstr "" +#~ "A chave do servidor foi alterada ou alguém está tentando hackear a sua " +#~ "conexão." + +#~ msgid "Unable to check fingerprint for %s. Connection could be insecure." +#~ msgstr "" +#~ "Incapaz de verifica a impressão digital de %s. A conexão pode ser " +#~ "insegura." + +#~ msgid "Missing fingerprint in SSL connection to %s" +#~ msgstr "Faltando impressão digital na conexão SSL para %s" + +#~ msgid "Fingerprint mismatch for %s: Got %s, expected %s" +#~ msgstr "Conflito de impressões digitais para %s: obtido %s, esperado %s" + +#~ msgid " %d unread single message" +#~ msgid_plural " %d unread single messages" +#~ msgstr[0] "%d mensagem individual não lida" +#~ msgstr[1] "%d mensagens individuais não lidas" + +#~ msgid " %d unread group chat message" +#~ msgid_plural " %d unread group chat messages" +#~ msgstr[0] "%d mensagem de conferência não lida" +#~ msgstr[1] "%d mensagens de conferência não lidas" + +#~ msgid " %d unread private message" +#~ msgid_plural " %d unread private messages" +#~ msgstr[0] "%d mensagem privada não lida" +#~ msgstr[1] "%d mensagens privadas não lidas" + +#~ msgid "gtk+" +#~ msgstr "gtk+" diff --git a/po/ru.po b/po/ru.po index 3fc70b80d..bbd428766 100644 --- a/po/ru.po +++ b/po/ru.po @@ -6,23 +6,27 @@ # This file is distributed under the same license as the gajim package. # # -#: ../src/gajim-remote.py:202 ../src/gajim-remote.py:209 # , 2005. # , 2005. # Yakov Bezrukov , 2005, 2006, 2007. # Yakov Bezrukov , 2005. +#: ../src/gajim-remote.py:220 ../src/gajim-remote.py:227 +#: ../src/gajim-remote.py:253 ../src/gajim-remote.py:254 +#: ../src/gajim-remote.py:260 ../src/gajim-remote.py:261 +#: ../src/gajim-remote.py:262 ../src/gajim-remote.py:263 msgid "" msgstr "" "Project-Id-Version: ru\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-12-18 09:32+0100\n" -"PO-Revision-Date: 2007-07-08 21:53+0700\n" -"Last-Translator: Yakov Bezrukov \n" +"POT-Creation-Date: 2007-12-05 23:47+0100\n" +"PO-Revision-Date: 2007-12-05 18:32+0300\n" +"Last-Translator: Fomin Denis, Oleg N. Stadnik. \n" "Language-Team: Русский \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" +"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: KBabel 1.11.4\n" #: ../data/gajim.desktop.in.in.h:1 @@ -35,39 +39,39 @@ msgstr "Клиент для мгновенных сообщений Gajim" #: ../data/gajim.desktop.in.in.h:3 msgid "Jabber IM Client" -msgstr "Jabber-клиент на GTK+" +msgstr "Jabber клиент для мгновенных сообщений" #: ../data/glade/account_context_menu.glade.h:1 -msgid "Send Single _Message..." -msgstr "Отправить одиночное _сообщение..." +#: ../data/glade/roster_window.glade.h:8 +msgid "Join _Group Chat..." +msgstr "Войти в _комнату" #: ../data/glade/account_context_menu.glade.h:2 msgid "_Add Contact..." msgstr "_Добавить контакт..." #: ../data/glade/account_context_menu.glade.h:3 -msgid "_Discover Services..." -msgstr "_Просмотреть сервисы..." +#: ../data/glade/roster_window.glade.h:15 +msgid "_Discover Services" +msgstr "_Просмотреть сервисы" #: ../data/glade/account_context_menu.glade.h:4 msgid "_Execute Command..." msgstr "В_ыполнить команду..." #: ../data/glade/account_context_menu.glade.h:5 -#: ../data/glade/roster_window.glade.h:16 -#: ../data/glade/systray_context_menu.glade.h:6 -msgid "_Group Chat" -msgstr "_Комната" +msgid "_Modify Account" +msgstr "Редактировать учетную запись" #: ../data/glade/account_context_menu.glade.h:6 -#: ../data/glade/zeroconf_context_menu.glade.h:1 -msgid "_Modify Account..." -msgstr "_Изменить учетную запись..." - -#: ../data/glade/account_context_menu.glade.h:7 msgid "_Open Gmail Inbox" msgstr "_Открыть Gmail" +#: ../data/glade/account_context_menu.glade.h:7 +#: ../data/glade/roster_window.glade.h:23 +msgid "_Start Chat..." +msgstr "Начать беседу" + #: ../data/glade/account_context_menu.glade.h:8 #: ../data/glade/zeroconf_context_menu.glade.h:2 msgid "_Status" @@ -75,11 +79,11 @@ msgstr "_Статус" #: ../data/glade/account_creation_wizard_window.glade.h:1 msgid "" -"Account is being created\n" +"Connecting to server\n" "\n" "Please wait..." msgstr "" -"Была создана учетная запись \n" +"Соединение с сервером \n" "\n" "Пожалуйста подождите..." @@ -92,51 +96,74 @@ msgid "Please fill in the data for your new account" msgstr "Пожалуйста, заполните данные для вашей новой учетной записи" #: ../data/glade/account_creation_wizard_window.glade.h:6 +msgid "Please select a server" +msgstr "Пожалуйста выберите сервер" + +#: ../data/glade/account_creation_wizard_window.glade.h:7 +msgid "" +"Add this certificate to the list of trusted certificates.\n" +"SHA1 fingerprint of the certificate:\n" +msgstr "" + +#: ../data/glade/account_creation_wizard_window.glade.h:10 msgid "Click to see features (like MSN, ICQ transports) of jabber servers" msgstr "" "Щелкните, чтобы просмотреть сервисы предоставляемые jabber сервером " "(например, MSN, ICQ транспорты)" -#: ../data/glade/account_creation_wizard_window.glade.h:7 +#: ../data/glade/account_creation_wizard_window.glade.h:11 msgid "Connect when I press Finish" -msgstr "Подключиться, когда я нажму \"Завершить\"" +msgstr "Подключиться, когда я нажму \"Закончить\"" -#: ../data/glade/account_creation_wizard_window.glade.h:8 +#: ../data/glade/account_creation_wizard_window.glade.h:12 msgid "Gajim: Account Creation Wizard" msgstr "Gajim: мастер создания учетной записи" -#: ../data/glade/account_creation_wizard_window.glade.h:9 -msgid "I already have an account I want to use" +#: ../data/glade/account_creation_wizard_window.glade.h:13 +msgid "I already have an account I want to _use" msgstr "У меня уже есть учетная запись, которую я хочу использовать" -#: ../data/glade/account_creation_wizard_window.glade.h:10 +#: ../data/glade/account_creation_wizard_window.glade.h:14 msgid "I want to _register for a new account" msgstr "Я хочу _зарегистрировать новую учетную запись" -#: ../data/glade/account_creation_wizard_window.glade.h:11 -#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/accounts_window.glade.h:23 msgid "If checked, Gajim will remember the password for this account" msgstr "Если отмечено, то Gajim запомнит пароль учетной записи" -#: ../data/glade/account_creation_wizard_window.glade.h:12 -#: ../data/glade/manage_proxies_window.glade.h:6 -msgid "Pass_word:" -msgstr "П_ароль" +#: ../data/glade/account_creation_wizard_window.glade.h:16 +#: ../data/glade/account_modification_window.glade.h:26 +#: ../data/glade/accounts_window.glade.h:32 +msgid "Manage..." +msgstr "Управление..." -#: ../data/glade/account_creation_wizard_window.glade.h:13 -#: ../data/glade/account_modification_window.glade.h:38 +#: ../data/glade/account_creation_wizard_window.glade.h:17 +msgid "Prox_y:" +msgstr "Прокси:" + +#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/accounts_window.glade.h:47 msgid "Save pass_word" msgstr "Сохранить _пароль" -#: ../data/glade/account_creation_wizard_window.glade.h:14 +#: ../data/glade/account_creation_wizard_window.glade.h:19 msgid "Servers Features" msgstr "Параметры сервера" -#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_creation_wizard_window.glade.h:20 msgid "Set my profile when I connect" msgstr "Настроить мой профиль после соединения" -#: ../data/glade/account_creation_wizard_window.glade.h:16 +#: ../data/glade/account_creation_wizard_window.glade.h:21 +#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/accounts_window.glade.h:53 +msgid "Use custom hostname/port" +msgstr "Использовать пользовательские хост/порт" + +#: ../data/glade/account_creation_wizard_window.glade.h:22 msgid "" "You need to have an account in order to connect\n" "to the Jabber network." @@ -144,67 +171,63 @@ msgstr "" "Необходимо создать учетную запись для присоединения \n" "к сети Jabber." -#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_creation_wizard_window.glade.h:24 msgid "Your JID:" msgstr "Ваш JID:" -#: ../data/glade/account_creation_wizard_window.glade.h:19 -#: ../data/glade/roster_window.glade.h:11 +#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/roster_window.glade.h:13 msgid "_Advanced" msgstr "_Дополнительно" -#: ../data/glade/account_creation_wizard_window.glade.h:20 +#: ../data/glade/account_creation_wizard_window.glade.h:26 msgid "_Finish" msgstr "_Закончить" -#: ../data/glade/account_creation_wizard_window.glade.h:21 -#: ../data/glade/manage_proxies_window.glade.h:9 -msgid "_Host:" -msgstr "_Хост:" +#: ../data/glade/account_creation_wizard_window.glade.h:27 +msgid "_Hostname:" +msgstr "Хост: " -#: ../data/glade/account_creation_wizard_window.glade.h:22 -#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/account_creation_wizard_window.glade.h:28 +#: ../data/glade/account_modification_window.glade.h:50 +#: ../data/glade/accounts_window.glade.h:58 msgid "_Password:" msgstr "_Пароль:" -#: ../data/glade/account_creation_wizard_window.glade.h:23 -#: ../data/glade/manage_proxies_window.glade.h:10 +#: ../data/glade/account_creation_wizard_window.glade.h:29 +#: ../data/glade/manage_proxies_window.glade.h:11 msgid "_Port:" msgstr "_Порт:" -#: ../data/glade/account_creation_wizard_window.glade.h:24 -msgid "_Retype Password:" -msgstr "_Пароль для проверки:" - -#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_creation_wizard_window.glade.h:30 msgid "_Server:" msgstr "_Сервер:" -#: ../data/glade/account_creation_wizard_window.glade.h:26 -msgid "_Use proxy" -msgstr "_Использовать прокси" - -#: ../data/glade/account_creation_wizard_window.glade.h:27 -#: ../data/glade/manage_proxies_window.glade.h:11 +#: ../data/glade/account_creation_wizard_window.glade.h:31 +#: ../data/glade/manage_proxies_window.glade.h:12 msgid "_Username:" msgstr "_Имя пользователя:" #: ../data/glade/account_modification_window.glade.h:1 +#: ../data/glade/accounts_window.glade.h:1 #: ../data/glade/preferences_window.glade.h:8 msgid "Miscellaneous" msgstr "Прочее" #: ../data/glade/account_modification_window.glade.h:2 +#: ../data/glade/accounts_window.glade.h:2 #: ../data/glade/zeroconf_properties_window.glade.h:1 msgid "OpenPGP" msgstr "OpenPGP" #: ../data/glade/account_modification_window.glade.h:3 +#: ../data/glade/accounts_window.glade.h:3 #: ../data/glade/zeroconf_properties_window.glade.h:2 msgid "Personal Information" msgstr "Личная информация" #: ../data/glade/account_modification_window.glade.h:4 +#: ../data/glade/accounts_window.glade.h:4 msgid "Account" msgstr "Учетные записи" @@ -213,19 +236,28 @@ msgid "Account Modification" msgstr "Изменение учетной записи" #: ../data/glade/account_modification_window.glade.h:6 -msgid "Autoreconnect when connection is lost" -msgstr "Автоподключение при разрыве связи" +#: ../data/glade/accounts_window.glade.h:5 +msgid "Administration operations" +msgstr "Административные операции" #: ../data/glade/account_modification_window.glade.h:7 +#: ../data/glade/accounts_window.glade.h:6 +msgid "Auto-reconnect when connection is lost" +msgstr "Автоподключение при разрыве связи" + +#: ../data/glade/account_modification_window.glade.h:8 +#: ../data/glade/accounts_window.glade.h:7 #: ../data/glade/zeroconf_properties_window.glade.h:3 msgid "C_onnect on Gajim startup" msgstr "_Соединяться при запуске Gajim" -#: ../data/glade/account_modification_window.glade.h:8 +#: ../data/glade/account_modification_window.glade.h:9 +#: ../data/glade/accounts_window.glade.h:8 msgid "Chan_ge Password" msgstr "И_зменить пароль" -#: ../data/glade/account_modification_window.glade.h:9 +#: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/accounts_window.glade.h:9 msgid "" "Check this so Gajim will connect in port 5223 where legacy servers are " "expected to have SSL capabilities. Note that Gajim uses TLS encryption by " @@ -237,44 +269,60 @@ msgstr "" "TLS шифрование по умолчанию, если сервер предоставляет такую возможность, с " "этой же опцией TLS отключается" -#: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/accounts_window.glade.h:10 #: ../data/glade/zeroconf_properties_window.glade.h:4 msgid "Choose _Key..." msgstr "Выбрать _ключ..." -#: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/accounts_window.glade.h:11 msgid "Click to change account's password" msgstr "Щелкните для изменения пароля" -#: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/accounts_window.glade.h:12 +msgid "Click to request authorization to all contacts of another account" +msgstr "Щелкните чтобы запросить авторизацию у всех контактов другого аккаунта" + +#: ../data/glade/account_modification_window.glade.h:14 +#: ../data/glade/accounts_window.glade.h:13 msgid "Connection" msgstr "Соединение" -#: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/account_modification_window.glade.h:15 +#: ../data/glade/accounts_window.glade.h:15 msgid "Edit Personal Information..." msgstr "Редактировать личную информацию..." -#: ../data/glade/account_modification_window.glade.h:14 -#: ../data/glade/roster_window.glade.h:5 ../src/notify.py:453 -#: ../src/notify.py:475 ../src/notify.py:487 ../src/common/helpers.py:905 +#. No configured account +#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/accounts_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:6 ../src/notify.py:489 +#: ../src/notify.py:520 ../src/notify.py:532 ../src/common/helpers.py:998 +#: ../src/common/helpers.py:1010 msgid "Gajim" msgstr "Gajim" -#. Contact is not in a group, so count it in General group -#: ../data/glade/account_modification_window.glade.h:15 -#: ../data/glade/preferences_window.glade.h:49 +#. General group cannot be changed +#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/accounts_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:45 #: ../data/glade/zeroconf_properties_window.glade.h:7 -#: ../src/roster_window.py:342 ../src/roster_window.py:1207 -#: ../src/roster_window.py:1418 ../src/roster_window.py:2029 -#: ../src/roster_window.py:2071 ../src/common/contacts.py:278 +#: ../src/roster_window.py:372 ../src/roster_window.py:637 +#: ../src/roster_window.py:1384 ../src/roster_window.py:1760 +#: ../src/roster_window.py:2147 ../src/roster_window.py:2661 +#: ../src/roster_window.py:2779 ../src/common/contacts.py:314 msgid "General" msgstr "Общие" -#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/accounts_window.glade.h:20 msgid "Hostname: " msgstr "Хост: " -#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/accounts_window.glade.h:21 msgid "" "If checked, Gajim will also broadcast some more IPs except from just your " "IP, so file transfer has higher chances of working." @@ -282,15 +330,16 @@ msgstr "" "Если отмечено, Gajim будет передавать еще несколько IP адресов в дополнение " "к вашему, так что передача файла имеет больше шансов на успех." -#: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/accounts_window.glade.h:24 msgid "" -"If checked, Gajim will send keep-alive packets so it prevents connection " -"timeout which results in disconnection" +"If checked, Gajim will send keep-alive packets to prevent connection timeout " +"which results in disconnection" msgstr "" "Если отмечено, то Gajim будет пинговать сервер, чтобы избежать разрыва " "соединения по таймауту" -#: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/account_modification_window.glade.h:22 #: ../data/glade/zeroconf_properties_window.glade.h:8 msgid "" "If checked, Gajim will store the password in ~/.gajim/config with 'read' " @@ -299,7 +348,8 @@ msgstr "" "Если отмечено, то Gajim сохранит пароль в ~/.gajim/config с доступом на " "чтение только для вас" -#: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/accounts_window.glade.h:25 #: ../data/glade/zeroconf_properties_window.glade.h:9 msgid "" "If checked, Gajim, when launched, will automatically connect to jabber using " @@ -308,7 +358,8 @@ msgstr "" "Если отмечено, Gajim, после запуска, будет автоматически подсоединяться к " "jabber серверу с использованием этой учетной записи" -#: ../data/glade/account_modification_window.glade.h:22 +#: ../data/glade/account_modification_window.glade.h:24 +#: ../data/glade/accounts_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:10 msgid "" "If checked, any change to the global status (handled by the combobox at the " @@ -319,44 +370,50 @@ msgstr "" "выпадающего списка внизу окна ростера) повлекут за собой изменение статуса " "этой учетной записи" -#: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/account_modification_window.glade.h:25 +#: ../data/glade/accounts_window.glade.h:29 msgid "Information about you, as stored in the server" msgstr "Информация о вас, сохраненная на сервере" -#: ../data/glade/account_modification_window.glade.h:24 -msgid "Manage..." -msgstr "Управление..." - -#: ../data/glade/account_modification_window.glade.h:25 -#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1643 -#: ../src/config.py:3436 +#: ../data/glade/account_modification_window.glade.h:27 +#: ../data/glade/accounts_window.glade.h:34 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1548 +#: ../src/config.py:2025 msgid "No key selected" msgstr "Не выбран ключ" #. None means no proxy profile selected -#: ../data/glade/account_modification_window.glade.h:27 ../src/config.py:1225 -#: ../src/config.py:1230 ../src/config.py:1414 ../src/config.py:1633 -#: ../src/config.py:1642 ../src/config.py:1701 ../src/config.py:1775 -#: ../src/config.py:2646 ../src/config.py:3426 ../src/config.py:3435 -#: ../src/dialogs.py:281 ../src/dialogs.py:283 +#. GPG Key +#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/accounts_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:32 ../src/config.py:1142 +#: ../src/config.py:1213 ../src/config.py:1456 ../src/config.py:1461 +#: ../src/config.py:1923 ../src/config.py:2010 ../src/config.py:2024 +#: ../src/config.py:3114 ../src/config.py:3172 ../src/dialogs.py:344 +#: ../src/dialogs.py:346 ../src/roster_window.py:1864 +#: ../src/roster_window.py:1871 ../src/roster_window.py:1878 msgid "None" msgstr "Нет" -#: ../data/glade/account_modification_window.glade.h:28 -#: ../data/glade/profile_window.glade.h:25 +#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/accounts_window.glade.h:37 +#: ../data/glade/profile_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:17 msgid "Personal Information" msgstr "Личная информация" -#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/accounts_window.glade.h:38 msgid "Port: " msgstr "Порт: " -#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/accounts_window.glade.h:39 msgid "Priori_ty:" msgstr "Приори_тет:" -#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/accounts_window.glade.h:40 msgid "" "Priority is used in Jabber to determine who gets the events from the jabber " "server when two or more clients are connected using the same account; The " @@ -367,19 +424,23 @@ msgstr "" "той же учетной записью. Клиент с наибольшим приоритетом будет получать " "события" -#: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/accounts_window.glade.h:41 msgid "Priority will change automatically according to your status." msgstr "Изменять приоритет автоматически в соответствии со статусом." -#: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/account_modification_window.glade.h:35 +#: ../data/glade/accounts_window.glade.h:42 msgid "Proxy:" msgstr "Прокси:" -#: ../data/glade/account_modification_window.glade.h:34 -msgid "Resour_ce: " +#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/accounts_window.glade.h:44 +msgid "Resour_ce:" msgstr "Ресу_рс: " -#: ../data/glade/account_modification_window.glade.h:35 +#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/accounts_window.glade.h:45 msgid "" "Resource is sent to the Jabber server in order to separate the same JID in " "two or more parts depending on the number of the clients connected in the " @@ -394,88 +455,137 @@ msgstr "" "одновременно. Ресурс, который имеет больший приоритет будет получать все " "события. (См. ниже)" -#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/account_modification_window.glade.h:38 #: ../data/glade/zeroconf_properties_window.glade.h:18 msgid "Save _passphrase (insecure)" msgstr "Сохранить _парольную фразу (небезопасно)" -#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/accounts_window.glade.h:46 #: ../data/glade/zeroconf_properties_window.glade.h:19 msgid "Save conversation _logs for all contacts" msgstr "_Сохранять историю для всех контактов" -#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/accounts_window.glade.h:48 msgid "Send keep-alive packets" msgstr "Отправить пинг" -#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/account_modification_window.glade.h:42 +#: ../data/glade/accounts_window.glade.h:49 #: ../data/glade/zeroconf_properties_window.glade.h:20 msgid "Synch_ronize account status with global status" msgstr "Син_хронизировать статус учетной записи с глобальным статусом" -#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/accounts_window.glade.h:50 +#: ../data/glade/synchronise_contacts_dialog.glade.h:2 +#: ../data/glade/synchronise_select_account_dialog.glade.h:2 +msgid "Synchronise contacts" +msgstr "Объединить контакты" + +#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/accounts_window.glade.h:52 msgid "Use _SSL (legacy)" msgstr "Использовать _SSL (устарело)" -#: ../data/glade/account_modification_window.glade.h:42 -msgid "Use custom hostname/port" -msgstr "Использовать пользовательские хост/порт" - -#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/account_modification_window.glade.h:46 +#: ../data/glade/accounts_window.glade.h:55 msgid "Use file transfer proxies" msgstr "Использовать прокси для передачи файла" -#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/accounts_window.glade.h:56 msgid "_Adjust to status" msgstr "В зависимости от статуса" -#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/account_modification_window.glade.h:48 +#: ../data/glade/accounts_window.glade.h:57 msgid "_Jabber ID:" msgstr "_Jabber ID:" -#: ../data/glade/account_modification_window.glade.h:46 -msgid "_Name: " +#: ../data/glade/account_modification_window.glade.h:49 +msgid "_Name:" msgstr "_Имя: " -#: ../data/glade/accounts_window.glade.h:1 -msgid "Accounts" -msgstr "Учетные записи" +#: ../data/glade/accounts_window.glade.h:14 +#: ../data/glade/profile_window.glade.h:11 +#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/zeroconf_information_window.glade.h:2 +#: ../data/glade/zeroconf_properties_window.glade.h:5 +msgid "E-Mail:" +msgstr "Почта:" -#: ../data/glade/accounts_window.glade.h:2 +#. XML Console enable checkbutton +#: ../data/glade/accounts_window.glade.h:16 +#: ../data/glade/xml_console_window.glade.h:4 +msgid "Enable" +msgstr "Включить" + +#: ../data/glade/accounts_window.glade.h:17 +#: ../data/glade/zeroconf_information_window.glade.h:3 +#: ../data/glade/zeroconf_properties_window.glade.h:6 +msgid "First Name:" +msgstr "Имя:" + +#: ../data/glade/accounts_window.glade.h:22 +msgid "If checked, Gajim will get the password from a GPG agent like seahorse" +msgstr "Если отмечено, то Gajim запомнит пароль учетной записи" + +#: ../data/glade/accounts_window.glade.h:27 +#: ../data/glade/zeroconf_properties_window.glade.h:11 msgid "" -"If checked, all local contacts that use a Bonjour compatible chat client " -"(like iChat, Trillian or Gaim) will be shown in roster. You don't need to be " -"connected to a jabber server for it to work.\n" -"This is only available if python-avahi is installed and avahi-daemon is " -"running." +"If the default port that is used for incoming messages is unfitting for your " +"setup you can select another one here.\n" +"You might consider to change possible firewall settings." msgstr "" -"Если отмечено, то все локальные контакты, которые используют Bonjour-совместимый клиент (напр. iChat, Trillian или Gaim) будут показаны в ростере. Для этого не нужно подключаться к jabber-серверу.\n" -"Доступно только в том случае, когда установлен python-avahi и запущен avahi-daemon." +"Если порт по умолчанию, который используется для входящих сообщения вас не " +"устраивает, вы можете выбрать другой.\n" +"Так же возможно придется изменить некоторые настройки брандмауэра." -#: ../data/glade/accounts_window.glade.h:4 -msgid "" -"If you have 2 or more accounts and it is checked, Gajim will list all " -"contacts as if you had one account" -msgstr "" -"Если у вас 2 и более учетных записей, то, отметив здесь, вы заставите Gajim " -"показывать вместе контакты из всех учетных записей" +#: ../data/glade/accounts_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/zeroconf_information_window.glade.h:4 +#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:511 +msgid "Jabber ID:" +msgstr "Jabber ID:" -#: ../data/glade/accounts_window.glade.h:5 +#: ../data/glade/accounts_window.glade.h:31 +#: ../data/glade/zeroconf_information_window.glade.h:5 +#: ../data/glade/zeroconf_properties_window.glade.h:14 +msgid "Last Name:" +msgstr "Фамилия:" + +#: ../data/glade/accounts_window.glade.h:33 msgid "Mer_ge accounts" msgstr "_Объединить учетные записи" -#: ../data/glade/accounts_window.glade.h:6 -msgid "_Enable link-local messaging" -msgstr "_Включить локальный обмен сообщениями" +#. Rename +#: ../data/glade/accounts_window.glade.h:43 ../src/roster_window.py:2731 +msgid "Re_name" +msgstr "П_ереименовать" -#: ../data/glade/accounts_window.glade.h:7 -msgid "_Modify" -msgstr "_Изменить" +#: ../data/glade/accounts_window.glade.h:51 +msgid "Use GPG _Agent" +msgstr "Использовать GPG _Agent" -#: ../data/glade/accounts_window.glade.h:8 -#: ../data/glade/remove_account_window.glade.h:4 -msgid "_Remove" -msgstr "_Удалить" +#: ../data/glade/accounts_window.glade.h:54 +#: ../data/glade/zeroconf_properties_window.glade.h:21 +msgid "Use custom port:" +msgstr "Другой порт" + +#: ../data/glade/accounts_window.glade.h:59 +msgid "gtk-add" +msgstr "gtk-add" + +#: ../data/glade/accounts_window.glade.h:60 +#: ../data/glade/features_window.glade.h:4 +msgid "gtk-close" +msgstr "gtk-close" + +#: ../data/glade/accounts_window.glade.h:61 +msgid "gtk-remove" +msgstr "gtk-remove" #: ../data/glade/add_new_contact_window.glade.h:1 msgid "A_ccount:" @@ -495,7 +605,7 @@ msgstr "Вы не возражаете, если я добавлю Вас в к #: ../data/glade/add_new_contact_window.glade.h:5 msgid "" -"You have to register to this transport\n" +"You have to register with this transport\n" "to be able to add a contact from this\n" "protocol. Click on register button to\n" "proceed." @@ -534,7 +644,7 @@ msgid "_User ID:" msgstr "ID пользователя:" #: ../data/glade/adhoc_commands_window.glade.h:1 -msgid "An error has occured:" +msgid "An error has occurred:" msgstr "Произошла ошибка:" #: ../data/glade/adhoc_commands_window.glade.h:2 @@ -570,12 +680,15 @@ msgid "This jabber entity does not expose any commands." msgstr "" #: ../data/glade/advanced_configuration_window.glade.h:1 +#: ../data/glade/features_window.glade.h:1 msgid "Description" msgstr "Описание" #: ../data/glade/advanced_configuration_window.glade.h:2 -msgid "NOTE: You should restart gajim for some setting to take effect" -msgstr "ПРИМЕЧАНИЕ: Вы должны перезапустить gajim, чтобы некоторые настройки вступили в силу" +msgid "NOTE: You should restart Gajim for some settings to take effect" +msgstr "" +"ПРИМЕЧАНИЕ: Вы должны перезапустить Gajim, чтобы некоторые настройки " +"вступили в силу" #: ../data/glade/advanced_configuration_window.glade.h:3 msgid "Advanced Configuration Editor" @@ -594,48 +707,45 @@ msgid "Deletes Message of the Day" msgstr "Удаляет сообщение дня." #: ../data/glade/advanced_menuitem_menu.glade.h:3 -msgid "Sends a message to currently connected users to this server" -msgstr "Отправляет сообщение пользователям подсоединенным к серверу в данный момент" +msgid "Edit _Privacy Lists..." +msgstr "Редактировать _списки доступа..." #: ../data/glade/advanced_menuitem_menu.glade.h:4 -msgid "Set MOTD" -msgstr "Установить собщение дня" +msgid "Sends a message to users currently connected to this server" +msgstr "" +"Отправляет сообщение пользователям подсоединенным к серверу в данный момент" #: ../data/glade/advanced_menuitem_menu.glade.h:5 +msgid "Set MOTD..." +msgstr "Установить собщение дня" + +#: ../data/glade/advanced_menuitem_menu.glade.h:6 msgid "Sets Message of the Day" msgstr "Устанавливает сообщение дня" -#: ../data/glade/advanced_menuitem_menu.glade.h:6 +#: ../data/glade/advanced_menuitem_menu.glade.h:7 msgid "Show _XML Console" msgstr "Показать консоль _XML" -#: ../data/glade/advanced_menuitem_menu.glade.h:7 -msgid "Update MOTD" -msgstr "Обновить MOTD" - #: ../data/glade/advanced_menuitem_menu.glade.h:8 -msgid "Updates Message of the Day" -msgstr "Обновляет фортунку" +msgid "Update MOTD..." +msgstr "Обновить собщение дня" #: ../data/glade/advanced_menuitem_menu.glade.h:9 +msgid "Updates Message of the Day" +msgstr "Обновляет сообщение дня" + +#: ../data/glade/advanced_menuitem_menu.glade.h:10 msgid "_Administrator" msgstr "_Администрирование" -#: ../data/glade/advanced_menuitem_menu.glade.h:10 -msgid "_Privacy Lists" -msgstr "_Списки доступа" - #: ../data/glade/advanced_menuitem_menu.glade.h:11 -msgid "_Send Server Message" +msgid "_Send Server Message..." msgstr "_Отправить сообщение сервера" -#: ../data/glade/advanced_menuitem_menu.glade.h:12 -msgid "_Send Single Message" -msgstr "О_тправить одиночное сообщение" - #: ../data/glade/advanced_notifications_window.glade.h:1 msgid " a window/tab opened with that contact " -msgstr " с этим контактом уже открыты окно или вкладка" +msgstr " с этим контактом открытых окон/вкладок" #: ../data/glade/advanced_notifications_window.glade.h:2 msgid "Actions" @@ -646,7 +756,7 @@ msgid "Conditions" msgstr "Условия" #: ../data/glade/advanced_notifications_window.glade.h:4 -#: ../data/glade/preferences_window.glade.h:10 +#: ../data/glade/preferences_window.glade.h:12 msgid "Sounds" msgstr "Звуки" @@ -663,7 +773,7 @@ msgid "All statuses" msgstr "Все статусы" #: ../data/glade/advanced_notifications_window.glade.h:8 -#: ../src/common/helpers.py:234 +#: ../src/common/commands.py:96 ../src/common/helpers.py:255 msgid "Away" msgstr "Ушел" @@ -673,14 +783,14 @@ msgstr "Занят " #: ../data/glade/advanced_notifications_window.glade.h:10 msgid "Don't have " -msgstr "Не имеет " +msgstr "Нет " #: ../data/glade/advanced_notifications_window.glade.h:11 msgid "Have " -msgstr "Имеет " +msgstr "Есть " #: ../data/glade/advanced_notifications_window.glade.h:12 -#: ../src/common/helpers.py:244 +#: ../src/common/helpers.py:265 msgid "Invisible" msgstr "Невидимка" @@ -689,7 +799,7 @@ msgid "Launch a command" msgstr "Выполнить команду" #: ../data/glade/advanced_notifications_window.glade.h:14 -#: ../src/common/helpers.py:217 +#: ../src/common/helpers.py:238 msgid "Not Available" msgstr "Недоступен" @@ -708,17 +818,15 @@ msgstr "Проигрывать звук" #: ../data/glade/advanced_notifications_window.glade.h:18 msgid "" "Receive a Message\n" -"Contact Connected \n" "Contact Disconnected \n" "Contact Change Status \n" "Group Chat Message Highlight \n" "Group Chat Message Received \n" -"File Transfert Resquest \n" -"File Transfert Started \n" -"File Transfert Finished" +"File Transfer Request \n" +"File Transfer Started \n" +"File Transfer Finished" msgstr "" "Получено сообщение\n" -"Контакт подключился\n" "Контакт отключился\n" "Контакт сменил статус\n" "Упоминание в комнате\n" @@ -727,55 +835,58 @@ msgstr "" "Начата передача файла\n" "Завершена передача файла" -#: ../data/glade/advanced_notifications_window.glade.h:27 +#: ../data/glade/advanced_notifications_window.glade.h:26 msgid "When " msgstr "Когда " +#: ../data/glade/advanced_notifications_window.glade.h:27 +msgid "" +"_Activate window manager's UrgencyHint to make chat window in taskbar flash" +msgstr "" +"_Активировать функцию оконного менеджера \"UrgencyHint\", чтобы окно чата " +"мигало на панели" + #: ../data/glade/advanced_notifications_window.glade.h:28 -msgid "_Activate window manager's UrgencyHint to make chat window in taskbar flash" -msgstr "_Активировать функцию оконного менеджера \"UrgencyHint\", чтобы окно беседы мигало на панели" +msgid "_Disable auto opening chat window" +msgstr "_Отключить автоматическое открытие окна чата" #: ../data/glade/advanced_notifications_window.glade.h:29 -msgid "_Disable auto opening chat window" -msgstr "_Отключить автоматическое открытие окна беседы" +msgid "_Disable existing popup window" +msgstr "_Отключить все всплывающие окна" #: ../data/glade/advanced_notifications_window.glade.h:30 -msgid "_Disable existing popup window" -msgstr "_Отключиться все всплывающие окна" - -#: ../data/glade/advanced_notifications_window.glade.h:31 msgid "_Disable existing sound for this event" msgstr "_Отключить звуки для этого события" -#: ../data/glade/advanced_notifications_window.glade.h:32 +#: ../data/glade/advanced_notifications_window.glade.h:31 msgid "_Disable showing event in roster" msgstr "_Отключить показ события в ростере" -#: ../data/glade/advanced_notifications_window.glade.h:33 +#: ../data/glade/advanced_notifications_window.glade.h:32 msgid "_Disable showing event in systray" msgstr "_Отключить показ события в системном лотке" -#: ../data/glade/advanced_notifications_window.glade.h:34 +#: ../data/glade/advanced_notifications_window.glade.h:33 msgid "_Inform me with a popup window" msgstr "_Сообщить с помощью всплывающего окна" -#: ../data/glade/advanced_notifications_window.glade.h:35 +#: ../data/glade/advanced_notifications_window.glade.h:34 msgid "_Open chat window with user" -msgstr "_Открыть окно беседы с контактом" +msgstr "_Открыть окно чата с контактом" -#: ../data/glade/advanced_notifications_window.glade.h:36 +#: ../data/glade/advanced_notifications_window.glade.h:35 msgid "_Show event in roster" msgstr "_Показывать событие в ростере" -#: ../data/glade/advanced_notifications_window.glade.h:37 +#: ../data/glade/advanced_notifications_window.glade.h:36 msgid "_Show event in systray" -msgstr "_Показывать событие в лотке" +msgstr "_Показывать событие в системном лотке" + +#: ../data/glade/advanced_notifications_window.glade.h:37 +msgid "and I " +msgstr "и у меня" #: ../data/glade/advanced_notifications_window.glade.h:38 -msgid "and I " -msgstr "и я" - -#: ../data/glade/advanced_notifications_window.glade.h:39 msgid "" "contact(s)\n" "group(s)\n" @@ -785,50 +896,38 @@ msgstr "" "группа(ы)\n" "все" -#: ../data/glade/advanced_notifications_window.glade.h:42 +#: ../data/glade/advanced_notifications_window.glade.h:41 msgid "for " msgstr "для " -#: ../data/glade/advanced_notifications_window.glade.h:43 +#: ../data/glade/advanced_notifications_window.glade.h:42 msgid "when I'm in" msgstr "Когда я в " #: ../data/glade/atom_entry_window.glade.h:1 -msgid "2003-12-13T18:30:02Z" -msgstr "2003-12-13T18:30:02Z" - -#: ../data/glade/atom_entry_window.glade.h:2 -msgid "Romeo and Juliet" -msgstr "Иван и Марья" - -#: ../data/glade/atom_entry_window.glade.h:3 msgid "Entry:" msgstr "Запись:" -#: ../data/glade/atom_entry_window.glade.h:4 +#: ../data/glade/atom_entry_window.glade.h:2 msgid "Feed name:" msgstr "Название ленты:" -#: ../data/glade/atom_entry_window.glade.h:5 +#: ../data/glade/atom_entry_window.glade.h:3 msgid "Last modified:" msgstr "Последнее изменение:" -#: ../data/glade/atom_entry_window.glade.h:6 +#: ../data/glade/atom_entry_window.glade.h:4 msgid "New entry received" msgstr "Получена новая запись" -#: ../data/glade/atom_entry_window.glade.h:7 -msgid "Old stories" -msgstr "Старые записи" - -#: ../data/glade/atom_entry_window.glade.h:8 -msgid "Soliloquy" -msgstr "Монолог" - -#: ../data/glade/atom_entry_window.glade.h:9 +#: ../data/glade/atom_entry_window.glade.h:5 msgid "You have received new entry:" msgstr "Получена новая запись:" +#: ../data/glade/blocked_contacts_window.glade.h:1 +msgid "Blocked Contacts" +msgstr "Заблокированне контакты" + #: ../data/glade/change_password_dialog.glade.h:1 msgid "Change Password" msgstr "Изменить пароль" @@ -858,10 +957,8 @@ msgid "Join _Group Chat" msgstr "Войти в _комнату" #: ../data/glade/chat_context_menu.glade.h:2 -#: ../data/glade/chat_control_popup_menu.glade.h:4 -#: ../data/glade/gc_occupants_menu.glade.h:2 -#: ../data/glade/roster_contact_context_menu.glade.h:10 -msgid "_Add to Roster" +#: ../data/glade/roster_contact_context_menu.glade.h:12 +msgid "_Add to Roster..." msgstr "Добавить в ростер" #: ../data/glade/chat_context_menu.glade.h:3 @@ -881,7 +978,6 @@ msgid "_Open Link in Browser" msgstr "_Просмотреть ссылку в браузере" #: ../data/glade/chat_context_menu.glade.h:7 -#: ../data/glade/roster_window.glade.h:20 #: ../data/glade/subscription_request_popup_menu.glade.h:1 #: ../data/glade/systray_context_menu.glade.h:7 msgid "_Start Chat" @@ -892,28 +988,63 @@ msgid "Click to see past conversations with this contact" msgstr "Щелкните для просмотра последних бесед с этим человеком" #: ../data/glade/chat_control_popup_menu.glade.h:2 -#: ../data/glade/roster_contact_context_menu.glade.h:8 +msgid "Invite _Contacts" +msgstr "Пригласить _участников" + +#: ../data/glade/chat_control_popup_menu.glade.h:3 +#: ../data/glade/gc_occupants_menu.glade.h:3 #: ../data/glade/zeroconf_contact_context_menu.glade.h:4 msgid "Send _File" msgstr "Отправить _файл" -#: ../data/glade/chat_control_popup_menu.glade.h:3 -msgid "Toggle Open_PGP Encryption" +#: ../data/glade/chat_control_popup_menu.glade.h:4 +#, fuzzy +msgid "Toggle End to End Encryption" msgstr "Включить Open_PGP шифрование" #: ../data/glade/chat_control_popup_menu.glade.h:5 -#: ../data/glade/gc_control_popup_menu.glade.h:6 -msgid "_Compact View Alt+C" -msgstr "_Компактный вид Alt-C" +msgid "Toggle Open_PGP Encryption" +msgstr "Включить Open_PGP шифрование" #: ../data/glade/chat_control_popup_menu.glade.h:6 +#: ../data/glade/gc_occupants_menu.glade.h:4 +msgid "_Add to Roster" +msgstr "Добавить в ростер" + +#: ../data/glade/chat_control_popup_menu.glade.h:7 #: ../data/glade/gc_control_popup_menu.glade.h:7 -#: ../data/glade/gc_occupants_menu.glade.h:5 -#: ../data/glade/roster_contact_context_menu.glade.h:13 +#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/roster_window.glade.h:19 #: ../data/glade/zeroconf_contact_context_menu.glade.h:6 +#: ../src/roster_window.py:2600 msgid "_History" msgstr "_История" +#: ../data/glade/chat_to_muc_window.glade.h:1 +msgid "In_vite" +msgstr "_Пригласить" + +#: ../data/glade/chat_to_muc_window.glade.h:2 +msgid "Invite Friends !" +msgstr "Пригласить Друзей !" + +#: ../data/glade/chat_to_muc_window.glade.h:3 +msgid "MUC server" +msgstr "MUC сервер" + +#: ../data/glade/chat_to_muc_window.glade.h:4 +msgid "Please select a MUC server." +msgstr "Пожалуйста выберите сервер" + +#: ../data/glade/chat_to_muc_window.glade.h:5 +msgid "" +"You are going to begin a Multi-User Chat.\n" +"Select the contacts you want to invite" +msgstr "" +"Вы хотите начать чат(Multi-User Chat).\n" +"Выберите контакты которых вы хотите пригласить" + #: ../data/glade/data_form_window.glade.h:1 msgid "Fill in the form." msgstr "Заполните форму." @@ -926,6 +1057,14 @@ msgstr "Настройки комнаты" msgid "Edit Groups" msgstr "Редактировать группы" +#: ../data/glade/features_window.glade.h:2 +msgid "List of possible features in Gajim:" +msgstr "Список возможных функций Gajim:" + +#: ../data/glade/features_window.glade.h:3 +msgid "Features" +msgstr "Возможности" + #: ../data/glade/filetransfers.glade.h:1 msgid "A list of active, completed and stopped file transfers" msgstr "Список активных, завершенных и остановленных передач файлов" @@ -959,11 +1098,11 @@ msgid "Remove file transfer from the list." msgstr "Удалить передачу из списка." #: ../data/glade/filetransfers.glade.h:9 -msgid "Removes completed, canceled and failed file transfers from the list" +msgid "Removes completed, cancelled and failed file transfers from the list" msgstr "Удаляет завершеные, отмененные и неудачные передачи из списка" #: ../data/glade/filetransfers.glade.h:10 -msgid "Shows a list of file transfers between you and other" +msgid "Shows a list of file transfers between you and others" msgstr "Показывает список передач между вами и остальными" #: ../data/glade/filetransfers.glade.h:11 @@ -978,7 +1117,7 @@ msgstr "" msgid "When a file transfer is complete show a popup notification" msgstr "Показать уведомление по окончании загрузки" -#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:769 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:792 msgid "_Continue" msgstr "_Продолжить" @@ -986,7 +1125,7 @@ msgstr "_Продолжить" msgid "_Notify me when a file transfer is complete" msgstr "_Уведомить меня, когда передача файлов закончится" -#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:190 +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:191 msgid "_Open Containing Folder" msgstr "_Открыть папку с принятым файлом" @@ -1012,7 +1151,7 @@ msgstr "" "Учетная запись\n" "Группа\n" "Контакт\n" -"Заголовок окна беседы" +"Баннер в окне чата" #: ../data/glade/gajim_themes_window.glade.h:6 msgid "Bold" @@ -1073,11 +1212,11 @@ msgid "_Background:" msgstr "Цвет _фона" #: ../data/glade/gc_control_popup_menu.glade.h:1 -msgid "Change _Nickname" +msgid "Change _Nickname..." msgstr "Изменить _ник" #: ../data/glade/gc_control_popup_menu.glade.h:2 -msgid "Change _Subject" +msgid "Change _Subject..." msgstr "Изменить _тему" #: ../data/glade/gc_control_popup_menu.glade.h:3 @@ -1085,46 +1224,58 @@ msgid "Click to see past conversation in this room" msgstr "Щелкните для просмотра бесед в этой комнате" #: ../data/glade/gc_control_popup_menu.glade.h:4 -msgid "Configure _Room" +msgid "Configure _Room..." msgstr "Настроить _комнату" #: ../data/glade/gc_control_popup_menu.glade.h:5 -msgid "_Bookmark This Room" +msgid "_Bookmark" msgstr "Добавить эту комнату в _закладки" +#: ../data/glade/gc_control_popup_menu.glade.h:6 +msgid "_Destroy Room" +msgstr "Уничтожить комнату" + +#: ../data/glade/gc_control_popup_menu.glade.h:8 +msgid "_Manage Room" +msgstr "_Управление комнатой" + +#: ../data/glade/gc_control_popup_menu.glade.h:9 +msgid "_Minimize on close" +msgstr "Сворачивать при закрытии" + #: ../data/glade/gc_occupants_menu.glade.h:1 msgid "Mo_derator" msgstr "_Модератор" -#: ../data/glade/gc_occupants_menu.glade.h:3 +#: ../data/glade/gc_occupants_menu.glade.h:2 +msgid "Occupant Actions" +msgstr "_Действия над посетителем" + +#: ../data/glade/gc_occupants_menu.glade.h:5 msgid "_Admin" msgstr "_Админ" -#: ../data/glade/gc_occupants_menu.glade.h:4 +#: ../data/glade/gc_occupants_menu.glade.h:6 msgid "_Ban" msgstr "_Забанить" -#: ../data/glade/gc_occupants_menu.glade.h:6 +#: ../data/glade/gc_occupants_menu.glade.h:8 msgid "_Kick" msgstr "_Выгнать" -#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/gc_occupants_menu.glade.h:9 msgid "_Member" msgstr "_Участник" -#: ../data/glade/gc_occupants_menu.glade.h:8 -msgid "_Occupant Actions" -msgstr "_Действия над посетителем" - -#: ../data/glade/gc_occupants_menu.glade.h:9 +#: ../data/glade/gc_occupants_menu.glade.h:10 msgid "_Owner" msgstr "_Владелец" -#: ../data/glade/gc_occupants_menu.glade.h:10 +#: ../data/glade/gc_occupants_menu.glade.h:11 msgid "_Send Private Message" msgstr "_Отправить личное сообщение" -#: ../data/glade/gc_occupants_menu.glade.h:11 +#: ../data/glade/gc_occupants_menu.glade.h:12 msgid "_Voice" msgstr "_Право говорить" @@ -1132,72 +1283,110 @@ msgstr "_Право говорить" msgid "Create new post" msgstr "Создать новое сообщение" -#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:259 +#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:280 msgid "From" msgstr "От" #. holds subject -#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:141 -#: ../src/history_manager.py:172 +#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:147 +#: ../src/history_manager.py:178 msgid "Subject" msgstr "Тема" #: ../data/glade/history_manager.glade.h:1 msgid "" -"Welcome to Gajim History Logs Manager\n" -"\n" -"You can select logs from the left and/or search database from below.\n" -"\n" "WARNING:\n" "If you plan to do massive deletions, please make sure Gajim is not running. " "Generally avoid deletions with contacts you currently chat with." msgstr "" -"Добро пожаловать в менеджер истории Gajim'а\n" -"\n" -"Вы можете выбрать логи в левом поле и/или искать в базе данных в форме " -"внизу. \n" -"\n" "ВНИМАНИЕ:\n" "Если вы собираетесь устроить массовую чистку, пожалуйста удостоверьтесь что " "Gajim не запущен. Избегайте удалений из логов контактов с которыми вы " "разговариваете в этот момент." -#: ../data/glade/history_manager.glade.h:7 +#: ../data/glade/history_manager.glade.h:3 +msgid "Welcome to Gajim History Logs Manager" +msgstr "Добро пожаловать в менеджер истории Gajim'а" + +#: ../data/glade/history_manager.glade.h:4 msgid "Delete" msgstr "Удалить" -#: ../data/glade/history_manager.glade.h:8 +#: ../data/glade/history_manager.glade.h:5 msgid "Export" msgstr "Экспорт" -#: ../data/glade/history_manager.glade.h:9 +#: ../data/glade/history_manager.glade.h:6 msgid "Gajim History Logs Manager" msgstr "Менеджер истории Gajim'а" +#: ../data/glade/history_manager.glade.h:7 +msgid "" +"This log manager is not intended for log viewing. If you are looking for " +"such functionality, use the history window instead.\n" +"\n" +"Use this program to delete or export logs. You can select logs from the left " +"and/or search database from below." +msgstr "" +"Этот менеджер истории не предназначен для просмотра. Если вы хотите " +"просмативать историю с большим количеством функций, используйте окно " +"истории.\n" +"\n" +"Используйте эту программу для удаления или экспорта истории. Вы можете " +"выбрать лог слева или воспользоваться поиском в базе." + #: ../data/glade/history_manager.glade.h:10 msgid "_Search Database" msgstr "_Поиск в базе данных" #: ../data/glade/history_window.glade.h:1 -msgid "Build custom query" -msgstr "Составить свой запрос" +msgid "History Viewer" +msgstr "Менеджер истории" #: ../data/glade/history_window.glade.h:2 +msgid "JID Selection" +msgstr "Выбор JID" + +#: ../data/glade/history_window.glade.h:3 +msgid "" +"Choose the chatlog you want to view. \n" +"Enter the jid of a groupchat or a contact here. For online accounts you can " +"even enter a a contact's nickname." +msgstr "" +"Выберите лог чата который хотите посмотреть. \n" +"Введите jid чата или контакта. Для онлайн контактов можете ввести ники." + +#: ../data/glade/history_window.glade.h:5 ../src/history_window.py:224 msgid "Conversation History" msgstr "История" -#: ../data/glade/history_window.glade.h:3 -msgid "Query Builder..." -msgstr "Редактор запросов..." +#: ../data/glade/history_window.glade.h:6 +msgid "" +"Current History\n" +"All Chat Histories" +msgstr "" +"Текущая история\n" +"История всех чатов" -#: ../data/glade/history_window.glade.h:4 +#: ../data/glade/history_window.glade.h:8 +#: ../data/glade/search_window.glade.h:2 msgid "Search" msgstr "Поиск" -#: ../data/glade/history_window.glade.h:5 +#: ../data/glade/history_window.glade.h:9 +#: ../data/glade/zeroconf_information_window.glade.h:10 +msgid "_Log conversation history" +msgstr "_История сообщения" + +#: ../data/glade/history_window.glade.h:10 +#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1182 msgid "_Search" msgstr "_Поиск" +#: ../data/glade/history_window.glade.h:11 +msgid "in" +msgstr "в" + #: ../data/glade/invitation_received_dialog.glade.h:1 msgid "Accept" msgstr "Принять" @@ -1211,33 +1400,37 @@ msgstr "Отклонить" msgid "Invitation Received" msgstr "Получено приглашение" -#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1146 +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1385 msgid "Join Group Chat" msgstr "Войти в комнату" #: ../data/glade/join_groupchat_window.glade.h:2 -#: ../data/glade/manage_bookmarks_window.glade.h:4 -#: ../data/glade/profile_window.glade.h:23 -#: ../data/glade/vcard_information_window.glade.h:29 -msgid "Nickname:" -msgstr "Ник:" +msgid "Join this room automatically when I connect" +msgstr "Автовход в комнату при подключении" #: ../data/glade/join_groupchat_window.glade.h:3 #: ../data/glade/manage_bookmarks_window.glade.h:5 +#: ../data/glade/profile_window.glade.h:24 +#: ../data/glade/vcard_information_window.glade.h:31 +msgid "Nickname:" +msgstr "Ник:" + +#: ../data/glade/join_groupchat_window.glade.h:4 +#: ../data/glade/manage_bookmarks_window.glade.h:6 msgid "Password:" msgstr "Пароль:" -#: ../data/glade/join_groupchat_window.glade.h:4 +#: ../data/glade/join_groupchat_window.glade.h:5 msgid "Recently:" msgstr "Недавно:" -#: ../data/glade/join_groupchat_window.glade.h:5 -#: ../data/glade/manage_bookmarks_window.glade.h:7 +#: ../data/glade/join_groupchat_window.glade.h:6 +#: ../data/glade/manage_bookmarks_window.glade.h:8 msgid "Room:" msgstr "Комната:" -#: ../data/glade/join_groupchat_window.glade.h:6 ../src/disco.py:1151 -#: ../src/disco.py:1518 +#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1170 +#: ../src/disco.py:1591 msgid "_Join" msgstr "_Присоединиться" @@ -1257,15 +1450,19 @@ msgstr "Если отмечено, то Gajim будет входить в ко msgid "Manage Bookmarks" msgstr "Управление закладками" -#: ../data/glade/manage_bookmarks_window.glade.h:6 +#: ../data/glade/manage_bookmarks_window.glade.h:4 +msgid "Minimize on Auto Join" +msgstr "Сворачивать при авто входе" + +#: ../data/glade/manage_bookmarks_window.glade.h:7 msgid "Print status:" msgstr "Показывать статус:" -#: ../data/glade/manage_bookmarks_window.glade.h:8 +#: ../data/glade/manage_bookmarks_window.glade.h:9 msgid "Server:" msgstr "Сервер:" -#: ../data/glade/manage_bookmarks_window.glade.h:9 +#: ../data/glade/manage_bookmarks_window.glade.h:10 msgid "Title:" msgstr "Заголовок:" @@ -1278,38 +1475,51 @@ msgid "Settings" msgstr "Натройки" #: ../data/glade/manage_proxies_window.glade.h:3 -msgid "HTTP Connect" -msgstr "HTTP Соединение" +msgid "" +"HTTP Connect\n" +"SOCKS5" +msgstr "" +"HTTP Соединение\n" +"SOCKS5" -#: ../data/glade/manage_proxies_window.glade.h:4 +#: ../data/glade/manage_proxies_window.glade.h:5 msgid "Manage Proxy Profiles" msgstr "Управление профилями прокси" -#: ../data/glade/manage_proxies_window.glade.h:5 -#: ../data/glade/profile_window.glade.h:22 -#: ../data/glade/vcard_information_window.glade.h:28 +#: ../data/glade/manage_proxies_window.glade.h:6 +#: ../data/glade/profile_window.glade.h:23 +#: ../data/glade/vcard_information_window.glade.h:30 msgid "Name:" msgstr "Имя:" #: ../data/glade/manage_proxies_window.glade.h:7 +msgid "Pass_word:" +msgstr "П_ароль" + +#: ../data/glade/manage_proxies_window.glade.h:8 msgid "Type:" msgstr "Тип:" -#: ../data/glade/manage_proxies_window.glade.h:8 +#: ../data/glade/manage_proxies_window.glade.h:9 msgid "Use authentication" msgstr "Использовать аутентификацию" +#: ../data/glade/manage_proxies_window.glade.h:10 +msgid "_Host:" +msgstr "_Хост:" + #: ../data/glade/message_window.glade.h:1 msgid "Click to insert an emoticon (Alt+M)" msgstr "Щелкните, чтобы вставить смайлик (Alt+M)" -#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1104 +#: ../data/glade/message_window.glade.h:2 ../src/chat_control2.py:1257 +#: ../src/chat_control.py:1271 msgid "OpenPGP Encryption" msgstr "Шифрование OpenPGP" #. 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:4 -#: ../data/glade/roster_window.glade.h:10 +#: ../data/glade/roster_window.glade.h:12 #: ../data/glade/subscription_request_window.glade.h:6 msgid "_Actions" msgstr "_Действия" @@ -1317,7 +1527,7 @@ 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:6 #: ../data/glade/xml_console_window.glade.h:11 -#: ../src/filetransfers_window.py:253 +#: ../src/filetransfers_window.py:252 msgid "_Send" msgstr "_Отправить" @@ -1327,46 +1537,54 @@ msgstr "Парольная фраза" #: ../data/glade/preferences_window.glade.h:1 msgid "Advanced Configuration Editor" -msgstr "Редактор настроек" +msgstr "Расширенный редактор настроек" #: ../data/glade/preferences_window.glade.h:2 msgid "Applications" msgstr "Приложения" +#: ../data/glade/preferences_window.glade.h:3 +msgid "Chat Appearance" +msgstr "Настройки окна чата" + #. a header for custom browser/client/file manager. so translate sth like: Custom Settings -#: ../data/glade/preferences_window.glade.h:4 +#: ../data/glade/preferences_window.glade.h:5 msgid "Custom" msgstr "Пользовательские настройки" -#: ../data/glade/preferences_window.glade.h:5 +#: ../data/glade/preferences_window.glade.h:6 msgid "Format of a line" msgstr "Формат строки" -#: ../data/glade/preferences_window.glade.h:6 +#: ../data/glade/preferences_window.glade.h:7 msgid "GMail Options" msgstr "Настройки GMail" -#: ../data/glade/preferences_window.glade.h:7 -msgid "Interface Customization" -msgstr "Настройка интерфейса" - #: ../data/glade/preferences_window.glade.h:9 msgid "Preset Status Messages" msgstr "Предустановленные сообщения о статусе" +#: ../data/glade/preferences_window.glade.h:10 +msgid "Privacy" +msgstr "Уведомления" + #: ../data/glade/preferences_window.glade.h:11 +msgid "Roster Appearance" +msgstr "Настройки ростера" + +#: ../data/glade/preferences_window.glade.h:13 +msgid "Themes" +msgstr "Настройки интерфейса" + +#: ../data/glade/preferences_window.glade.h:14 msgid "Visual Notifications" msgstr "Уведомления" -#: ../data/glade/preferences_window.glade.h:12 -msgid "A_fter nickname:" -msgstr "П_осле ника:" - -#: ../data/glade/preferences_window.glade.h:13 +#: ../data/glade/preferences_window.glade.h:15 msgid "Advanced" -msgstr "Расширенный" +msgstr "Расширенные" -#: ../data/glade/preferences_window.glade.h:14 +#: ../data/glade/preferences_window.glade.h:16 msgid "" "All chat states\n" "Composing only\n" @@ -1376,43 +1594,48 @@ msgstr "" "Только печать\n" "Отключено " -#: ../data/glade/preferences_window.glade.h:17 +#: ../data/glade/preferences_window.glade.h:19 msgid "Allow _OS information to be sent" msgstr "Отсылать информацию об _ОС" -#: ../data/glade/preferences_window.glade.h:18 +#: ../data/glade/preferences_window.glade.h:20 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "Позволять уведомления в режиме _ушел/недоступен/занят/невидимка" -#: ../data/glade/preferences_window.glade.h:19 -msgid "Also known as iChat style" -msgstr "В стиле iChat" +#: ../data/glade/preferences_window.glade.h:21 +msgid "Always check to see if Gajim is the _default Jabber client on startup" +msgstr "" +"Всегда проверять при запуске, является ли Gajim jabber-клиентом по-умолчанию" -#: ../data/glade/preferences_window.glade.h:20 +#: ../data/glade/preferences_window.glade.h:22 msgid "" "An example: If you have enabled status message for away, Gajim won't ask you " "anymore for a status message when you change your status to away; it will " "use the default one set here" -msgstr "Пример: если вы включили статусные сообщения для режима \"Отошел\", Gajim вас больше не будет спрашивать о статусом сообщении, когда вы смените статус на \"Отошел\", поскольку будет использовать значение по-умолчанию, которое установлено здесь" +msgstr "" +"Пример: если вы включили статусные сообщения для режима \"Отошел\", Gajim " +"вас больше не будет спрашивать о статусом сообщении, когда вы смените статус " +"на \"Отошел\", поскольку будет использовать значение по-умолчанию, которое " +"установлено здесь" -#: ../data/glade/preferences_window.glade.h:21 +#: ../data/glade/preferences_window.glade.h:23 msgid "Ask status message when I:" msgstr "Запрашивать сообщение о статусе, когда я: " -#: ../data/glade/preferences_window.glade.h:22 +#: ../data/glade/preferences_window.glade.h:24 msgid "Auto _away after:" msgstr "Авто-_отошел после:" -#: ../data/glade/preferences_window.glade.h:23 +#: ../data/glade/preferences_window.glade.h:25 msgid "Auto _not available after:" msgstr "Авто-_недоступен после:" -#: ../data/glade/preferences_window.glade.h:24 +#: ../data/glade/preferences_window.glade.h:26 msgid "" "Autodetect on every Gajim startup\n" "Always use GNOME default applications\n" "Always use KDE default applications\n" -"Always use XFCE4 default applications\n" +"Always use Xfce default applications\n" "Custom" msgstr "" "Определять автоматически при каждом запуске Gajim\n" @@ -1421,23 +1644,15 @@ msgstr "" "Всегда использовать приложения XFCE4 по умолчанию\n" "Другое" -#: ../data/glade/preferences_window.glade.h:29 -msgid "B_efore nickname:" -msgstr "_До ника:" - -#: ../data/glade/preferences_window.glade.h:30 ../src/chat_control.py:844 -msgid "Chat" -msgstr "Чат" - #: ../data/glade/preferences_window.glade.h:31 msgid "" "Check this option, only if someone you don't have in the roster spams/annoys " -"you. Use with caution, cause it blocks all messages from any contact that is " -"not in the roster" +"you. Use with caution, because it blocks all messages from any contact that " +"is not in the roster" msgstr "" "Отметьте эту опцию, только если кто-то не из вашего ростера спамит/достает " "вас. Используйте с осторожностью, потому что это заблокирует все сообщения " -"от контактов не из вашего ротера." +"от контактов не из вашего роcтера." #: ../data/glade/preferences_window.glade.h:32 msgid "Configure color and font of the interface" @@ -1448,28 +1663,26 @@ msgid "Default Status Messages" msgstr "Автоматические статусные сообщения" #: ../data/glade/preferences_window.glade.h:34 -msgid "Default status _iconset:" -msgstr "Тема статусных _иконок:" +msgid "" +"Determined by sender\n" +"Chat message\n" +"Single message" +msgstr "" +"Определяется отправителем\n" +"Сообщение чата\n" +"Одиночное сообщение" -#: ../data/glade/preferences_window.glade.h:35 +#: ../data/glade/preferences_window.glade.h:37 msgid "Display _extra email details" msgstr "Отображать _дополнительные данные о почте" -#: ../data/glade/preferences_window.glade.h:36 -msgid "Display a_vatars of contacts in roster" -msgstr "Показавать а_ватары для контактов в ростере" - -#: ../data/glade/preferences_window.glade.h:37 -msgid "Display status _messages of contacts in roster" -msgstr "Показать _сообщения о статусе контакта в ростере" - #: ../data/glade/preferences_window.glade.h:38 -msgid "Displayed Chat state noti_fications:" -msgstr "Отображать уведомления со_стоянии беседы:" +msgid "Display a_vatars of contacts in roster" +msgstr "Показывать а_ватары для контактов в ростере" #: ../data/glade/preferences_window.glade.h:39 -msgid "E_very 5 minutes" -msgstr "Каждые 5 _минут" +msgid "Display status _messages of contacts in roster" +msgstr "Показывать _сообщения о статусе контакта в ростере" #: ../data/glade/preferences_window.glade.h:40 msgid "Emoticons:" @@ -1486,7 +1699,8 @@ msgid "" "display in chat windows." msgstr "" "Gajim может отсылать и получать метаданные относящиеся к беседе с контактом. " -"Здесь вы можете указать какие состояние беседы вы хотели бы видеть в окне беседы." +"Здесь вы можете указать, какие состояние чата вы хотели бы видеть в окне " +"чата." #: ../data/glade/preferences_window.glade.h:43 msgid "" @@ -1495,32 +1709,10 @@ msgid "" "send to the other party." msgstr "" "Gajim может отсылать и получать метаданные, относящиеся к беседе с " -"контактом. Здесь вы можете указать, какие состояния беседы клиент будет " +"контактом. Здесь вы можете указать, какие состояния чата Gajim будет " "отсылать вашему респонденту." #: ../data/glade/preferences_window.glade.h:44 -msgid "Gajim will automatically show new events by poping up the relative window" -msgstr "" -"Gajim будет автоматически показывать новые события, поднимая соответствующее " -"окно." - -#: ../data/glade/preferences_window.glade.h:45 -msgid "" -"Gajim will notify you for new events via a popup in the bottom right of the " -"screen" -msgstr "" -"Gajim будет уведомлять вас о новых событиях с помощью сообщения в правом " -"нижнем углу экрана" - -#: ../data/glade/preferences_window.glade.h:46 -msgid "" -"Gajim will notify you via a popup window in the bottom right of the screen " -"about contacts that just signed in" -msgstr "" -"Gajim будет уведомлять вас о присоединившемся контакте с помощью сообщения в " -"правом нижнем углу экрана" - -#: ../data/glade/preferences_window.glade.h:47 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1528,17 +1720,18 @@ msgstr "" "Gajim будет уведомлять вас об отсоединившемся контакте с помощью сообщения в " "правом нижнем углу экрана" -#: ../data/glade/preferences_window.glade.h:48 -msgid "Gajim will only change the icon of the contact that triggered the new event" -msgstr "Gajim будет лишь менять иконку у контакта, от которого пришло новое сообщение" +#: ../data/glade/preferences_window.glade.h:46 +msgid "Hides buttons in chatwindows to " +msgstr "Скрывает кнопки окна комнаты." -#: ../data/glade/preferences_window.glade.h:50 +#: ../data/glade/preferences_window.glade.h:47 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" -msgstr "Если отмечено, то Gajim будет включать информацию об отправителе новых писем." +msgstr "" +"Если отмечено, то Gajim будет включать информацию об отправителе новых писем." -#: ../data/glade/preferences_window.glade.h:51 +#: ../data/glade/preferences_window.glade.h:48 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1546,7 +1739,7 @@ msgstr "" "Если отмечено, то Gajim будет показывать аватары контактов в окне ростера и " "в окнах комнат" -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:49 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -1554,13 +1747,7 @@ msgstr "" "Если отмечено, то Gajim будет отображать сообщение о статусе контакта под " "его именем в окне ростера и в окнах комнат" -#: ../data/glade/preferences_window.glade.h:53 -msgid "" -"If checked, Gajim will remember the roster and chat window positions in the " -"screen and the sizes of them next time you run it" -msgstr "Если отмечено, то Gajim запомнит позицию и размер окна ростера" - -#: ../data/glade/preferences_window.glade.h:54 +#: ../data/glade/preferences_window.glade.h:50 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, " @@ -1570,7 +1757,7 @@ msgstr "" "(например, контакты из MSN будут иметь соответствующие иконки msn для " "статусов \"в сети\", \"ушёл\", \"занят\" и т.д.)" -#: ../data/glade/preferences_window.glade.h:55 +#: ../data/glade/preferences_window.glade.h:51 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" @@ -1579,15 +1766,15 @@ msgstr "" "анимированным эквивалентом. Выберите \"Отключены\", чтобы этого не " "происходило." -#: ../data/glade/preferences_window.glade.h:56 +#: ../data/glade/preferences_window.glade.h:52 msgid "Ignore rich content in incoming messages" msgstr "Игнорировать форматирование во входящих сообщениях" -#: ../data/glade/preferences_window.glade.h:57 +#: ../data/glade/preferences_window.glade.h:53 msgid "Ma_nage..." msgstr "_Управление..." -#: ../data/glade/preferences_window.glade.h:58 +#: ../data/glade/preferences_window.glade.h:54 msgid "" "Never\n" "Always\n" @@ -1599,59 +1786,53 @@ msgstr "" "По учетной записи\n" "По типу" -#: ../data/glade/preferences_window.glade.h:62 -msgid "Notify me about contacts that: " -msgstr "Уведомлять о контактах, которые: " +#: ../data/glade/preferences_window.glade.h:58 +msgid "Notify me about contacts that sign _in" +msgstr "Уведомлять о контактах, которые вошли: " -#: ../data/glade/preferences_window.glade.h:63 +#: ../data/glade/preferences_window.glade.h:59 +msgid "Notify me about contacts that sign _out" +msgstr "Уведомлять о контактах, которые вышли: " + +#: ../data/glade/preferences_window.glade.h:60 msgid "Notify on new _GMail email" msgstr "Сообщать о новых письмах в _Gmail" -#: ../data/glade/preferences_window.glade.h:64 -msgid "On every _message" -msgstr "В _каждой строке" - -#: ../data/glade/preferences_window.glade.h:65 -msgid "One message _window:" -msgstr "Одно _окно сообщения:" - -#: ../data/glade/preferences_window.glade.h:66 -msgid "Outgoing Chat state noti_fications:" -msgstr "Исходящие у_ведомления о состоянии беседы:" - -#: ../data/glade/preferences_window.glade.h:67 +#: ../data/glade/preferences_window.glade.h:61 msgid "Play _sounds" msgstr "Проигрывать _звук" -#: ../data/glade/preferences_window.glade.h:68 +#: ../data/glade/preferences_window.glade.h:62 +msgid "" +"Pop it up\n" +"Notify me about it\n" +"Show only in roster" +msgstr "" +"Показать всплывающее окно\n" +"Сообщить мне об этом\n" +"Показать в ростере" + +#: ../data/glade/preferences_window.glade.h:65 msgid "Preferences" msgstr "Настройки" -#: ../data/glade/preferences_window.glade.h:69 -msgid "Print time:" -msgstr "Выводить время:" +#: ../data/glade/preferences_window.glade.h:66 +msgid "Privacy" +msgstr "Личные" -#: ../data/glade/preferences_window.glade.h:70 -msgid "Save _position and size for roster and chat windows" -msgstr "Сохранить _положение и размер ростера и окон бесед" - -#: ../data/glade/preferences_window.glade.h:71 +#: ../data/glade/preferences_window.glade.h:67 msgid "Set status message to reflect currently playing _music track" msgstr "Отображать в статусном сообщении название проигрываемого трека" -#: ../data/glade/preferences_window.glade.h:72 -msgid "Show only in _roster" -msgstr "Показывать только в _ростере" - -#: ../data/glade/preferences_window.glade.h:73 +#: ../data/glade/preferences_window.glade.h:68 msgid "Sign _in" -msgstr "В_ошли" +msgstr "В_ошел" -#: ../data/glade/preferences_window.glade.h:74 +#: ../data/glade/preferences_window.glade.h:69 msgid "Sign _out" -msgstr "В_ышли" +msgstr "В_ышел" -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:70 msgid "" "Some messages may include rich content (formatting, colors etc). If checked, " "Gajim will just display the raw message text." @@ -1659,51 +1840,47 @@ msgstr "" "Некоторые сообщения могут содержать форматирование (цвет, шрифт и т.д.). " "Если отмечено, Gajim будет отображать только их текст, без форматирования." -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:71 msgid "Status" msgstr "Статус" -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:72 +msgid "Status _iconset:" +msgstr "Тема статусных _иконок:" + +#: ../data/glade/preferences_window.glade.h:73 msgid "T_heme:" msgstr "_Тема:" -#: ../data/glade/preferences_window.glade.h:78 +#: ../data/glade/preferences_window.glade.h:74 msgid "The auto away status message" msgstr "Сообщение о статусе для авто-отошел" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:75 msgid "The auto not available status message" msgstr "Сообщение о статусе для авто-недоступен" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:76 +msgid "Treat all incoming messages as:" +msgstr "Входящее сообщение:" + +#: ../data/glade/preferences_window.glade.h:77 msgid "Use _transports iconsets" msgstr "Использовать иконки _транспортов" -#: ../data/glade/preferences_window.glade.h:81 +#: ../data/glade/preferences_window.glade.h:78 +msgid "Use only one message _window:" +msgstr "Только одно окно:" + +#: ../data/glade/preferences_window.glade.h:79 msgid "Use system _default" msgstr "Использовать системный шрифт" -#: ../data/glade/preferences_window.glade.h:82 -msgid "Use t_rayicon (aka. notification area icon)" -msgstr "Иконка в _трее (или в области уведомления)" +#: ../data/glade/preferences_window.glade.h:80 +msgid "When new event is received:" +msgstr "Когда получено новое сообытие:" -#: ../data/glade/preferences_window.glade.h:83 -msgid "" -"When a new event (message, file transfer request etc..) is received, the " -"following methods may be used to inform you about it. Please note that " -"events about new messages only occur if it is a new message from a contact " -"you are not already chatting with" -msgstr "" -"Когда происходит новое событие (приходит сообщение, запрос на передачу файла " -"и т.д.) могут быть использованы следующие способы сообщения об этом. Учтите " -"что событие соответствующее новому сообщению, не происходит если вы уже " -"беседуете с контактом" - -#: ../data/glade/preferences_window.glade.h:84 -msgid "When new event is received" -msgstr "Когда получено новое сообытие" - -#: ../data/glade/preferences_window.glade.h:85 +#: ../data/glade/preferences_window.glade.h:81 msgid "" "Works for Rhythmbox and Muine players. For more players, please visit http://" "trac.gajim.org/wiki/GajimAndMusicPlayer" @@ -1711,91 +1888,83 @@ msgstr "" "Работает с проигрывателями Rhythmbox и Muine. О других проигрывателях см. " "http://trac.gajim.org/wiki/GajimAndMusicPlayer" -#: ../data/glade/preferences_window.glade.h:86 +#: ../data/glade/preferences_window.glade.h:82 msgid "_Advanced Notifications Control..." msgstr "_Дополнительные настройки уведомлений..." -#: ../data/glade/preferences_window.glade.h:87 -msgid "_After time:" -msgstr "_После времени:" - -#: ../data/glade/preferences_window.glade.h:88 -msgid "_Before time:" -msgstr "_До времени:" - -#: ../data/glade/preferences_window.glade.h:89 +#: ../data/glade/preferences_window.glade.h:83 msgid "_Browser:" msgstr "_Браузер:" -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:84 +msgid "_Display chat state notifications:" +msgstr "Отображать уведомления о состоянии чата:" + +#: ../data/glade/preferences_window.glade.h:85 msgid "_File manager:" msgstr "_Менеджер файлов:" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:86 msgid "_Font:" msgstr "Шри_фт:" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:87 msgid "_Highlight misspelled words" msgstr "Выделять _слова с опечатками" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:88 msgid "_Ignore events from contacts not in the roster" msgstr "_Игнорировать события от контактов не из ростера" -#: ../data/glade/preferences_window.glade.h:94 +#: ../data/glade/preferences_window.glade.h:89 msgid "_Incoming message:" msgstr "_Входящее сообщение:" -#: ../data/glade/preferences_window.glade.h:95 +#: ../data/glade/preferences_window.glade.h:90 msgid "_Log status changes of contacts" -msgstr "_Записывать изменения статуса контактов" +msgstr "_Записывать в лог изменения статусов контактов" -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:91 msgid "_Mail client:" msgstr "_Почтовый клиент:" -#: ../data/glade/preferences_window.glade.h:97 -msgid "_Never" -msgstr "_Никогда" +#: ../data/glade/preferences_window.glade.h:92 +msgid "_Make message windows compact" +msgstr "Компактное окно сообщений" -#: ../data/glade/preferences_window.glade.h:98 -msgid "_Notify me about it" -msgstr "_Сообщать об этом" - -#: ../data/glade/preferences_window.glade.h:99 +#: ../data/glade/preferences_window.glade.h:93 msgid "_Open..." msgstr "_Открыть..." -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:94 msgid "_Outgoing message:" msgstr "_Исходящее сообщение:" -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:95 msgid "_Player:" msgstr "_Проигрыватель:" -#: ../data/glade/preferences_window.glade.h:102 -msgid "_Pop it up" -msgstr "_Вывести окно" - -#: ../data/glade/preferences_window.glade.h:103 +#: ../data/glade/preferences_window.glade.h:96 msgid "_Reset to Default Colors" msgstr "_Вернуться к цветам по умолчанию" -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:97 +msgid "_Send chat state notifications:" +msgstr "Отправлять уведомления о состоянии чата:" + +#: ../data/glade/preferences_window.glade.h:98 msgid "_Sort contacts by status" msgstr "_Сортировать контакты по статусу" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:99 msgid "_Status message:" msgstr "_Сообщение о статусе:" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:100 msgid "_URL:" msgstr "_URL:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:101 msgid "minutes" msgstr "минут" @@ -1839,7 +2008,7 @@ msgstr "JabberID" msgid "Order:" msgstr "Номер:" -#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:1841 +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2258 msgid "Privacy List" msgstr "Список доступа" @@ -1892,7 +2061,7 @@ msgstr "Адрес" #: ../data/glade/profile_window.glade.h:4 msgid "Avatar:" -msgstr "Аватара:" +msgstr "Аватар:" #: ../data/glade/profile_window.glade.h:5 #: ../data/glade/vcard_information_window.glade.h:6 @@ -1905,126 +2074,115 @@ msgid "City:" msgstr "Город:" #: ../data/glade/profile_window.glade.h:7 +msgid "Click to set your avatar" +msgstr "Установить свою аватару" + +#: ../data/glade/profile_window.glade.h:8 #: ../data/glade/vcard_information_window.glade.h:10 msgid "Company:" msgstr "Компания:" -#: ../data/glade/profile_window.glade.h:8 -#: ../data/glade/vcard_information_window.glade.h:13 +#: ../data/glade/profile_window.glade.h:9 +#: ../data/glade/vcard_information_window.glade.h:14 msgid "Country:" msgstr "Страна:" -#: ../data/glade/profile_window.glade.h:9 -#: ../data/glade/vcard_information_window.glade.h:14 +#: ../data/glade/profile_window.glade.h:10 +#: ../data/glade/vcard_information_window.glade.h:15 msgid "Department:" msgstr "Отделение:" -#: ../data/glade/profile_window.glade.h:10 -#: ../data/glade/vcard_information_window.glade.h:15 -#: ../data/glade/zeroconf_information_window.glade.h:2 -#: ../data/glade/zeroconf_properties_window.glade.h:5 -msgid "E-Mail:" -msgstr "Почта:" - -#: ../data/glade/profile_window.glade.h:11 -#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/profile_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:17 msgid "Extra Address:" msgstr "Дополнительный адрес:" #. Family Name -#: ../data/glade/profile_window.glade.h:13 -#: ../data/glade/vcard_information_window.glade.h:18 +#: ../data/glade/profile_window.glade.h:14 +#: ../data/glade/vcard_information_window.glade.h:19 msgid "Family:" msgstr "Фамилия:" #. Do NOT change sequence. Just translate YYYY and MM and DD (from Year, Month, Day accordingly) -#: ../data/glade/profile_window.glade.h:15 -#: ../data/glade/vcard_information_window.glade.h:20 +#: ../data/glade/profile_window.glade.h:16 +#: ../data/glade/vcard_information_window.glade.h:21 msgid "Format: YYYY-MM-DD" msgstr "Формат: YYYY-MM-DD" -#. Given Name #: ../data/glade/profile_window.glade.h:17 #: ../data/glade/vcard_information_window.glade.h:22 +msgid "Full Name" +msgstr "Имя" + +#. Given Name +#: ../data/glade/profile_window.glade.h:19 +#: ../data/glade/vcard_information_window.glade.h:24 msgid "Given:" msgstr "Имя:" -#: ../data/glade/profile_window.glade.h:18 -#: ../data/glade/vcard_information_window.glade.h:23 +#: ../data/glade/profile_window.glade.h:20 +#: ../data/glade/vcard_information_window.glade.h:25 msgid "Homepage:" msgstr "Веб-страница:" #. Middle Name -#: ../data/glade/profile_window.glade.h:20 -#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/profile_window.glade.h:22 +#: ../data/glade/vcard_information_window.glade.h:28 msgid "Middle:" msgstr "Отчество:" -#: ../data/glade/profile_window.glade.h:21 -#: ../data/glade/vcard_information_window.glade.h:27 -msgid "More" -msgstr "Еще" - -#: ../data/glade/profile_window.glade.h:24 -#: ../data/glade/vcard_information_window.glade.h:31 +#: ../data/glade/profile_window.glade.h:25 +#: ../data/glade/vcard_information_window.glade.h:34 msgid "Personal Info" msgstr "Личная информация" -#: ../data/glade/profile_window.glade.h:26 -#: ../data/glade/vcard_information_window.glade.h:32 +#: ../data/glade/profile_window.glade.h:27 +#: ../data/glade/vcard_information_window.glade.h:35 msgid "Phone No.:" msgstr "Телефон:" -#: ../data/glade/profile_window.glade.h:27 -#: ../data/glade/vcard_information_window.glade.h:33 +#: ../data/glade/profile_window.glade.h:28 +#: ../data/glade/vcard_information_window.glade.h:36 msgid "Position:" msgstr "Должность:" -#: ../data/glade/profile_window.glade.h:28 -#: ../data/glade/vcard_information_window.glade.h:34 +#: ../data/glade/profile_window.glade.h:29 +#: ../data/glade/vcard_information_window.glade.h:37 msgid "Postal Code:" msgstr "Индекс:" #. Prefix in Name -#: ../data/glade/profile_window.glade.h:30 -#: ../data/glade/vcard_information_window.glade.h:36 +#: ../data/glade/profile_window.glade.h:31 +#: ../data/glade/vcard_information_window.glade.h:39 msgid "Prefix:" msgstr "Префикс:" -#: ../data/glade/profile_window.glade.h:31 -#: ../data/glade/vcard_information_window.glade.h:38 ../src/vcard.py:273 +#: ../data/glade/profile_window.glade.h:32 +#: ../data/glade/vcard_information_window.glade.h:41 ../src/vcard.py:307 msgid "Role:" msgstr "Обязанности:" -#: ../data/glade/profile_window.glade.h:32 -#: ../data/glade/vcard_information_window.glade.h:39 +#: ../data/glade/profile_window.glade.h:33 +#: ../data/glade/vcard_information_window.glade.h:42 msgid "State:" msgstr "Штат:" -#: ../data/glade/profile_window.glade.h:33 -#: ../data/glade/vcard_information_window.glade.h:41 +#: ../data/glade/profile_window.glade.h:34 +#: ../data/glade/vcard_information_window.glade.h:44 msgid "Street:" msgstr "Улица:" #. Suffix in Name -#: ../data/glade/profile_window.glade.h:35 -#: ../data/glade/vcard_information_window.glade.h:45 +#: ../data/glade/profile_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:48 msgid "Suffix:" msgstr "Суффикс:" -#: ../data/glade/profile_window.glade.h:36 -#: ../data/glade/vcard_information_window.glade.h:46 +#: ../data/glade/profile_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:50 msgid "Work" msgstr "Работа" -#: ../data/glade/profile_window.glade.h:37 -msgid "_Publish" -msgstr "_Опубликовать" - -#: ../data/glade/profile_window.glade.h:38 -msgid "_Retrieve" -msgstr "_Получить" - #: ../data/glade/remove_account_window.glade.h:1 msgid "What do you want to do?" msgstr "Что вы хотите сделать?" @@ -2037,136 +2195,179 @@ msgstr "Удалит учетную запись _только из Gajim" msgid "Remove account from Gajim and from _server" msgstr "Удалить учетную запись из Gajim и с _сервера" +#. Remove +#. Remove group +#. Remove +#: ../data/glade/remove_account_window.glade.h:4 +#: ../data/glade/roster_contact_context_menu.glade.h:18 +#: ../src/roster_window.py:2557 ../src/roster_window.py:2767 +#: ../src/roster_window.py:2903 +msgid "_Remove" +msgstr "_Удалить" + #: ../data/glade/roster_contact_context_menu.glade.h:1 msgid "A_sk to see his/her status" msgstr "Попросить возможность видеть его или её статус" #: ../data/glade/roster_contact_context_menu.glade.h:2 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:1 -msgid "Add Special _Notification" +msgid "Add Special _Notification..." msgstr "Добавить специальное _уведомление" #: ../data/glade/roster_contact_context_menu.glade.h:3 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:2 -msgid "Assign Open_PGP Key" +msgid "Assign Open_PGP Key..." msgstr "Назначить OpenPGP ключ" #: ../data/glade/roster_contact_context_menu.glade.h:4 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:3 -#: ../src/roster_window.py:1993 -msgid "Edit _Groups" +msgid "Edit _Groups..." msgstr "Редактировать группы" +#. Execute Command #: ../data/glade/roster_contact_context_menu.glade.h:5 -#: ../src/roster_window.py:2128 +#: ../src/roster_window.py:2860 msgid "Execute Command..." msgstr "Выполнить команду..." +#. Invite to Groupchat #: ../data/glade/roster_contact_context_menu.glade.h:6 -#: ../src/roster_window.py:1951 +#: ../src/roster_window.py:2473 msgid "In_vite to" msgstr "_Пригласить в" +#. Send Custom Status #: ../data/glade/roster_contact_context_menu.glade.h:7 -#: ../data/glade/systray_context_menu.glade.h:2 -msgid "Send Single _Message" -msgstr "Отправить _сообщение" +#: ../src/roster_window.py:2697 ../src/roster_window.py:2831 +msgid "Send Cus_tom Status" +msgstr "Установить статус" + +#: ../data/glade/roster_contact_context_menu.glade.h:8 +msgid "Send Single _Message..." +msgstr "Отправить одиночное _сообщение..." #: ../data/glade/roster_contact_context_menu.glade.h:9 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:5 -msgid "Start _Chat" -msgstr "Начать _чат" +msgid "Send _File..." +msgstr "Отправить _файл..." + +#: ../data/glade/roster_contact_context_menu.glade.h:10 +msgid "Set Custom _Avatar..." +msgstr "Установить _аватар..." #: ../data/glade/roster_contact_context_menu.glade.h:11 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:5 +msgid "Start _Chat" +msgstr "Начать _беседу" + +#: ../data/glade/roster_contact_context_menu.glade.h:13 msgid "_Allow him/her to see my status" msgstr "Позволить ему или ей видеть мой статус" -#: ../data/glade/roster_contact_context_menu.glade.h:12 +#: ../data/glade/roster_contact_context_menu.glade.h:14 +#: ../src/roster_window.py:2547 ../src/roster_window.py:2758 +msgid "_Block" +msgstr "_Блокировать" + +#: ../data/glade/roster_contact_context_menu.glade.h:15 msgid "_Forbid him/her to see my status" msgstr "Запретить ему или ей видеть мой статус" -#. Remove group -#: ../data/glade/roster_contact_context_menu.glade.h:14 -#: ../src/roster_window.py:1945 ../src/roster_window.py:2042 -#: ../src/roster_window.py:2149 -msgid "_Remove from Roster" -msgstr "_Удалить из ростера" - -#: ../data/glade/roster_contact_context_menu.glade.h:15 +#: ../data/glade/roster_contact_context_menu.glade.h:17 #: ../data/glade/zeroconf_contact_context_menu.glade.h:7 -#: ../src/roster_window.py:2137 -msgid "_Rename" +msgid "_Manage Contact" +msgstr "Управление контактом" + +#: ../data/glade/roster_contact_context_menu.glade.h:19 +msgid "_Rename..." msgstr "П_ереименовать" -#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/roster_contact_context_menu.glade.h:20 msgid "_Subscription" msgstr "_Подписка" +#: ../data/glade/roster_contact_context_menu.glade.h:21 +#: ../src/roster_window.py:2541 ../src/roster_window.py:2752 +msgid "_Unblock" +msgstr "_Разблокировать" + #: ../data/glade/roster_window.glade.h:1 msgid "A_ccounts" msgstr "Учётные записи" #: ../data/glade/roster_window.glade.h:2 -msgid "Add _Contact" -msgstr "Добавить _контакт" +msgid "Add _Contact..." +msgstr "_Добавить контакт..." #: ../data/glade/roster_window.glade.h:3 +msgid "Fea_tures" +msgstr "Возможности" + +#: ../data/glade/roster_window.glade.h:4 msgid "File _Transfers" msgstr "_Передачи" -#: ../data/glade/roster_window.glade.h:4 +#: ../data/glade/roster_window.glade.h:5 msgid "Frequently Asked Questions (online)" -msgstr "Часто задаваемые вопросы (в сети)" +msgstr "Часто задаваемые вопросы (онлайн)" -#: ../data/glade/roster_window.glade.h:6 +#: ../data/glade/roster_window.glade.h:7 msgid "Help online" msgstr "Помощь онлайн" -#: ../data/glade/roster_window.glade.h:7 +#: ../data/glade/roster_window.glade.h:9 msgid "Profile, A_vatar" -msgstr "Профиль и аватара" +msgstr "Профиль и аватар" -#: ../data/glade/roster_window.glade.h:8 +#: ../data/glade/roster_window.glade.h:10 msgid "Show Trans_ports" msgstr "Показать транспорты" -#: ../data/glade/roster_window.glade.h:9 +#: ../data/glade/roster_window.glade.h:11 msgid "Show _Offline Contacts" msgstr "Показать _отключенных" -#: ../data/glade/roster_window.glade.h:12 +#: ../data/glade/roster_window.glade.h:14 msgid "_Contents" msgstr "_Содержание" -#: ../data/glade/roster_window.glade.h:13 -msgid "_Discover Services" -msgstr "_Просмотреть сервисы" - -#: ../data/glade/roster_window.glade.h:14 ../src/disco.py:1256 -#: ../src/roster_window.py:2120 +#: ../data/glade/roster_window.glade.h:16 ../src/disco.py:1324 msgid "_Edit" msgstr "_Правка" -#: ../data/glade/roster_window.glade.h:15 +#: ../data/glade/roster_window.glade.h:17 msgid "_FAQ" msgstr "_ЧаВО" -#: ../data/glade/roster_window.glade.h:17 +#: ../data/glade/roster_window.glade.h:18 msgid "_Help" msgstr "_Помощь" -#: ../data/glade/roster_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:20 msgid "_Preferences" msgstr "_Настройки" -#: ../data/glade/roster_window.glade.h:19 +#: ../data/glade/roster_window.glade.h:21 msgid "_Quit" msgstr "_Выйти" -#: ../data/glade/roster_window.glade.h:21 +#: ../data/glade/roster_window.glade.h:22 +msgid "_Send Single Message..." +msgstr "Отправить одиночное _сообщение..." + +#: ../data/glade/roster_window.glade.h:24 msgid "_View" msgstr "_Вид" +#: ../data/glade/search_window.glade.h:1 +msgid "Please wait while retrieving search form..." +msgstr "Получаю форму поиска. Подождите..." + +#: ../data/glade/search_window.glade.h:3 +msgid "_Add contact" +msgstr "Добавить _контакт" + +#. Information +#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:2915 +msgid "_Information" +msgstr "Информация о контакте" + #: ../data/glade/service_discovery_window.glade.h:1 msgid "G_o" msgstr "_Вперед" @@ -2175,10 +2376,6 @@ msgstr "_Вперед" msgid "_Address:" msgstr "_Адрес:" -#: ../data/glade/service_discovery_window.glade.h:3 -msgid "_Filter:" -msgstr "_Фильтр:" - #: ../data/glade/service_registration_window.glade.h:1 msgid "Register to" msgstr "Зарегистрировать в" @@ -2236,11 +2433,13 @@ msgid "Au_thorize" msgstr "А_вторизовать" #: ../data/glade/subscription_request_window.glade.h:2 -msgid "Authorize contact so he can know when you're connected" +msgid "Authorize contact so he or she can know when you're connected" msgstr "Авторизовать контакт (он будет видеть ваш статус)" #: ../data/glade/subscription_request_window.glade.h:3 -msgid "Deny authorization from contact so he cannot know when you're connected" +msgid "" +"Deny authorization from contact so he or she cannot know when you're " +"connected" msgstr "Отклонить авторизацию от контакта (Он не сможет видеть ваш статус)" #: ../data/glade/subscription_request_window.glade.h:4 @@ -2251,10 +2450,32 @@ msgstr "Запрос подписки" msgid "_Deny" msgstr "_Отклонить" +#: ../data/glade/synchronise_contacts_dialog.glade.h:1 +#, fuzzy +msgid "Select the account with which to synchronise" +msgstr "Выберите аккаунт для объединения" + +#: ../data/glade/synchronise_select_account_dialog.glade.h:1 +msgid "Select the account with which you want to synchronise" +msgstr "Выберите аккаунт для объединения" + +#: ../data/glade/synchronise_select_contacts_dialog.glade.h:1 +#, fuzzy +msgid "Select the contacts you want to synchronise" +msgstr "JID контакта, с которым вы хотели бы побеседовать" + +#: ../data/glade/synchronise_select_contacts_dialog.glade.h:2 +msgid "Synchronise : select contacts" +msgstr "Синхронизация : выберите контакт" + #: ../data/glade/systray_context_menu.glade.h:1 msgid "Mute Sounds" msgstr "Выключить звук" +#: ../data/glade/systray_context_menu.glade.h:2 +msgid "Send Single _Message" +msgstr "Отправить _сообщение" + #: ../data/glade/systray_context_menu.glade.h:3 msgid "Show All Pending _Events" msgstr "Показать непросмотренные _события" @@ -2267,6 +2488,10 @@ msgstr "Показать _ростер" msgid "Sta_tus" msgstr "Ста_тус" +#: ../data/glade/systray_context_menu.glade.h:6 +msgid "_Group Chat" +msgstr "_Комната" + #. Given Name #: ../data/glade/vcard_information_window.glade.h:5 msgid "Ask:" @@ -2281,43 +2506,44 @@ msgid "Comments" msgstr "Комментарии" #: ../data/glade/vcard_information_window.glade.h:11 +msgid "Configured avatar:" +msgstr "Настроить _аватар:" + +#: ../data/glade/vcard_information_window.glade.h:12 #: ../data/glade/zeroconf_information_window.glade.h:1 msgid "Contact" msgstr "Контакт" -#: ../data/glade/vcard_information_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:13 msgid "Contact Information" msgstr "Информация о контакте" -#: ../data/glade/vcard_information_window.glade.h:24 -#: ../data/glade/zeroconf_information_window.glade.h:4 -#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:416 -msgid "Jabber ID:" -msgstr "Jabber ID:" +#: ../data/glade/vcard_information_window.glade.h:29 +msgid "More" +msgstr "Еще" -#: ../data/glade/vcard_information_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:33 msgid "OS:" msgstr "ОС:" -#: ../data/glade/vcard_information_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:40 #: ../data/glade/zeroconf_information_window.glade.h:8 msgid "Resource:" msgstr "Ресурс:" -#: ../data/glade/vcard_information_window.glade.h:40 +#: ../data/glade/vcard_information_window.glade.h:43 #: ../data/glade/zeroconf_information_window.glade.h:9 msgid "Status:" msgstr "Статус:" #. Family Name -#: ../data/glade/vcard_information_window.glade.h:43 +#: ../data/glade/vcard_information_window.glade.h:46 msgid "Subscription:" msgstr "Подписка:" -#: ../data/glade/vcard_information_window.glade.h:47 -#: ../data/glade/zeroconf_information_window.glade.h:10 -msgid "_Log conversation history" -msgstr "_История сообщения" +#: ../data/glade/vcard_information_window.glade.h:49 +msgid "User avatar:" +msgstr "Аватар:" #: ../data/glade/xml_console_window.glade.h:1 msgid "Jabber Traffic" @@ -2327,11 +2553,6 @@ msgstr "Jabber Траффик" msgid "XML Input" msgstr "XML Ввод" -#. XML Console enable checkbutton -#: ../data/glade/xml_console_window.glade.h:4 -msgid "Enable" -msgstr "Включить" - #. Info/Query make the "IQ" initials. So translate like this 'YourLang/YourLang (Info/Query)'. Thanks (it's a tooltip so width is not a problem) #: ../data/glade/xml_console_window.glade.h:6 msgid "Info/Query" @@ -2350,15 +2571,29 @@ msgstr "_Сообщение" msgid "_Presence" msgstr "_Присутствие" -#: ../data/glade/zeroconf_information_window.glade.h:3 -#: ../data/glade/zeroconf_properties_window.glade.h:6 -msgid "First Name:" -msgstr "Имя:" +#: ../data/glade/zeroconf_contact_context_menu.glade.h:1 +msgid "Add Special _Notification" +msgstr "Добавить специальное _уведомление" -#: ../data/glade/zeroconf_information_window.glade.h:5 -#: ../data/glade/zeroconf_properties_window.glade.h:14 -msgid "Last Name:" -msgstr "Фамилия:" +#: ../data/glade/zeroconf_contact_context_menu.glade.h:2 +msgid "Assign Open_PGP Key" +msgstr "Назначить OpenPGP ключ" + +#. Edit Groups +#: ../data/glade/zeroconf_contact_context_menu.glade.h:3 +#: ../src/roster_window.py:2530 +msgid "Edit _Groups" +msgstr "Редактировать группы" + +#. Rename +#: ../data/glade/zeroconf_contact_context_menu.glade.h:8 +#: ../src/roster_window.py:2887 +msgid "_Rename" +msgstr "П_ереименовать" + +#: ../data/glade/zeroconf_context_menu.glade.h:1 +msgid "_Modify Account..." +msgstr "_Изменить учетную запись..." #: ../data/glade/zeroconf_information_window.glade.h:6 msgid "Local jid:" @@ -2368,211 +2603,288 @@ msgstr "Локальный JID:" msgid "Personal" msgstr "Личная информация" -#: ../data/glade/zeroconf_properties_window.glade.h:11 -msgid "" -"If the default port that is used for incoming messages is unfitting for your " -"setup you can select another one here.\n" -"You might consider to change possible firewall settings." -msgstr "" -"Если порт по умолчанию, который используется для входящих сообщения вас не устраивает, вы можете выбрать другой.\n" -"Так же возможно придется изменить некоторые настройки брандмауэра." - #: ../data/glade/zeroconf_properties_window.glade.h:15 msgid "Modify Account" msgstr "Редактировать учетную запись" -#: ../data/glade/zeroconf_properties_window.glade.h:21 -msgid "Use custom port:" -msgstr "Другой порт" +#. For i18n +#: ../src/advanced.py:56 +#, fuzzy +msgid "Activated" +msgstr "Активен" -#: ../src/advanced.py:57 +#: ../src/advanced.py:56 +#, fuzzy +msgid "Deactivated" +msgstr "Неактивен" + +#: ../src/advanced.py:58 +msgid "Boolean" +msgstr "" + +#: ../src/advanced.py:59 +msgid "Integer" +msgstr "" + +#: ../src/advanced.py:60 +msgid "Text" +msgstr "" + +#: ../src/advanced.py:61 +msgid "Color" +msgstr "" + +#: ../src/advanced.py:70 msgid "Preference Name" msgstr "Название опции" -#: ../src/advanced.py:63 +#: ../src/advanced.py:76 msgid "Value" msgstr "Значение" -#: ../src/advanced.py:72 +#: ../src/advanced.py:84 msgid "Type" msgstr "Тип" #. we talk about option description in advanced configuration editor -#: ../src/advanced.py:128 +#: ../src/advanced.py:140 msgid "(None)" msgstr "(Нет)" #. we talk about password -#: ../src/advanced.py:227 +#: ../src/advanced.py:243 msgid "Hidden" msgstr "Скрытый" #. 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) +#. LANG=$(for i in *.po; do j=${i/.po/}; echo -n "_('"$j"')":" '"$j"', " ; done) #. echo "{_('en'):'en'",$LANG"}" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "English" msgstr "Английский" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +msgid "Belarusian" +msgstr "Беларусский" + +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Bulgarian" msgstr "Болгарский" -#: ../src/chat_control.py:52 -msgid "Briton" +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#, fuzzy +msgid "Breton" msgstr "Бриттский" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Czech" msgstr "Чешский" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "German" msgstr "Немецкий" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Greek" msgstr "Греческий" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +msgid "British" +msgstr "Британский" + +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Esperanto" msgstr "Эсперанто" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Spanish" msgstr "Испанский" -#: ../src/chat_control.py:52 -msgid "Basc" +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#, fuzzy +msgid "Basque" msgstr "Баскский" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "French" msgstr "Французский" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Croatian" msgstr "Хорватский" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Italian" msgstr "Итальянский" -#: ../src/chat_control.py:52 -msgid "Norvegian b" +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +msgid "Norwegian (b)" msgstr "Норвежский b" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Dutch" msgstr "Голландский" -#: ../src/chat_control.py:52 -msgid "Norvegian" +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +msgid "Norwegian" msgstr "Норвежский" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Polish" msgstr "Польский" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Portuguese" msgstr "Португальский" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Brazilian Portuguese" msgstr "Португальский (Бразилия)" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Russian" msgstr "Русский" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +msgid "Serbian" +msgstr "Сербский" + +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Slovak" msgstr "Словацкий" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Swedish" msgstr "Шведский" -#: ../src/chat_control.py:52 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Chinese (Ch)" msgstr "Китайский" -#: ../src/chat_control.py:201 ../src/dialogs.py:1497 -msgid "" -"If that is not your language for which you want to highlight misspelled " -"words, then please set your $LANG as appropriate. Eg. for French do export " -"LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to make it " -"global in /etc/profile.\n" -"\n" -"Highlighting misspelled words feature will not be used" -msgstr "" -"Если этот язык не является тем языком, для которого вы хотели бы видеть " -"проверку орфографии, то установите нужное значение в переменную окружения " -"$LANG. Например, для русского: export LANG=ru_RU или export LANG=ru_RU.UTF-8 " -"в ~/.bash_profile, либо же, если вы хотите сделать эту установку системной, " -"то добавьте то же самое в /etc/profile \n" -"\n" -"Выделение слов с опечатками выключено" - -#: ../src/chat_control.py:239 +#: ../src/chat_control2.py:310 ../src/chat_control.py:313 msgid "Spelling language" msgstr "Язык проверки орфографии" #. we are not connected -#: ../src/chat_control.py:262 ../src/chat_control.py:468 +#: ../src/chat_control2.py:333 ../src/chat_control2.py:549 +#: ../src/chat_control.py:336 ../src/chat_control.py:559 msgid "A connection is not available" msgstr "Подключение недоступно" -#: ../src/chat_control.py:263 ../src/chat_control.py:469 +#: ../src/chat_control2.py:334 ../src/chat_control2.py:550 +#: ../src/chat_control.py:337 ../src/chat_control.py:560 msgid "Your message can not be sent until you are connected." msgstr "Ваше сообщение не может быть отправлено, пока вы не подключитесь." -#: ../src/chat_control.py:844 -msgid "Chats" -msgstr "Чаты" - -#: ../src/chat_control.py:1030 +#: ../src/chat_control2.py:1176 ../src/chat_control.py:1186 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s из комнаты %(room_name)s" #. we talk about a contact here -#: ../src/chat_control.py:1118 +#: ../src/chat_control2.py:1271 ../src/chat_control.py:1285 #, python-format msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" msgstr "%s не выдал OpenPGP ключ или вы не присвоили ему такового" -#: ../src/chat_control.py:1254 +#: ../src/chat_control2.py:1314 ../src/chat_control.py:1328 +#: ../src/groupchat_control.py:1437 +#, python-format +msgid "No such command: /%s (if you want to send this, prefix it with /say)" +msgstr "" +"Нет такой команды: /%s (если вы хотите её просто передать, то добавьте к ней " +"префикс /say)" + +#: ../src/chat_control2.py:1321 ../src/chat_control.py:1335 +#: ../src/groupchat_control.py:1460 +#, python-format +msgid "Commands: %s" +msgstr "Команды: %s" + +#: ../src/chat_control2.py:1324 ../src/chat_control.py:1338 +#: ../src/groupchat_control.py:1474 +#, python-format +msgid "Usage: /%s, clears the text window." +msgstr "Использование: /%s, очищает текстовое окно." + +#: ../src/chat_control2.py:1327 ../src/chat_control.py:1341 +#: ../src/groupchat_control.py:1479 +#, python-format +msgid "Usage: /%s, hide the chat buttons." +msgstr "Использование: /%s, скрывает кнопки беседы." + +#: ../src/chat_control2.py:1330 ../src/chat_control.py:1344 +#: ../src/groupchat_control.py:1495 +#, python-format +msgid "" +"Usage: /%s , sends action to the current group chat. Use third " +"person. (e.g. /%s explodes.)" +msgstr "" +"Использование: /%s <действие>, совершает действие в текущей комнате. " +"Используйте третье лицо (например, «/%s взрывается».)" + +#: ../src/chat_control2.py:1334 ../src/chat_control.py:1348 +#, python-format +msgid "Usage: /%s, sends a ping to the contact" +msgstr "Использование: /%s, посылает пинг контакту" + +#: ../src/chat_control2.py:1337 ../src/chat_control.py:1351 +#, python-format +msgid "Usage: /%s, send the message to the contact" +msgstr "Использование: /%s, посылает сообщение контакту" + +#: ../src/chat_control2.py:1340 ../src/chat_control.py:1354 +#: ../src/groupchat_control.py:1518 +#, python-format +msgid "No help info for /%s" +msgstr "Нет подсказки для /%s" + +#: ../src/chat_control2.py:1478 ../src/chat_control2.py:1504 +#: ../src/chat_control.py:1492 ../src/chat_control.py:1518 msgid "Encryption enabled" msgstr "Шифрование включено" -#: ../src/chat_control.py:1259 +#: ../src/chat_control2.py:1483 ../src/chat_control.py:1497 +msgid "Session WILL be logged" +msgstr "Сессия БУДЕТ сохранена в истории" + +#: ../src/chat_control2.py:1485 ../src/chat_control.py:1499 +msgid "Session WILL NOT be logged" +msgstr "Сессия НЕ БУДЕТ сохранена в истории" + +#: ../src/chat_control2.py:1492 ../src/chat_control.py:1506 +msgid "The following message was NOT encrypted" +msgstr "Последующее сообщение НЕБЫЛО зашифровано" + +#: ../src/chat_control2.py:1496 ../src/chat_control2.py:1509 +#: ../src/chat_control2.py:2155 ../src/chat_control.py:1510 +#: ../src/chat_control.py:1523 ../src/chat_control.py:2169 msgid "Encryption disabled" msgstr "Шифрование отключено" #. add_to_roster_menuitem -#: ../src/chat_control.py:1401 ../src/conversation_textview.py:495 -#: ../src/dialogs.py:629 ../src/gajim.py:781 ../src/gajim.py:782 -#: ../src/gajim.py:1121 ../src/roster_window.py:328 -#: ../src/roster_window.py:404 ../src/roster_window.py:1638 -#: ../src/roster_window.py:1819 ../src/roster_window.py:2392 -#: ../src/roster_window.py:2596 ../src/roster_window.py:2607 -#: ../src/roster_window.py:3832 ../src/roster_window.py:3834 -#: ../src/common/contacts.py:73 ../src/common/helpers.py:42 -#: ../src/common/helpers.py:246 +#: ../src/chat_control2.py:1672 ../src/chat_control.py:1686 +#: ../src/conversation_textview.py:705 ../src/dialogs.py:732 +#: ../src/gajim.py:911 ../src/gajim.py:912 ../src/gajim.py:1440 +#: ../src/gajim.py:1691 ../src/roster_window.py:358 +#: ../src/roster_window.py:442 ../src/roster_window.py:1822 +#: ../src/roster_window.py:1832 ../src/roster_window.py:2072 +#: ../src/roster_window.py:2308 ../src/roster_window.py:3158 +#: ../src/roster_window.py:3397 ../src/roster_window.py:4759 +#: ../src/roster_window.py:4761 ../src/common/contacts.py:89 +#: ../src/common/helpers.py:53 ../src/common/helpers.py:267 msgid "Not in Roster" msgstr "Не в ростере" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:1545 +#: ../src/chat_control2.py:1825 ../src/chat_control.py:1839 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Вы получили новое сообщение от \"%s\"" -#: ../src/chat_control.py:1546 +#: ../src/chat_control2.py:1826 ../src/chat_control.py:1840 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." @@ -2580,29 +2892,33 @@ msgstr "" "Если вы закроете эту вкладку и у вас отключена функция ведения истории " "сообщений, то это сообщение будет утеряно." -#: ../src/config.py:135 ../src/config.py:594 +#: ../src/config.py:127 ../src/config.py:565 msgid "Disabled" msgstr "Отключены" -#: ../src/config.py:221 -#, python-format -msgid "Every %s _minutes" -msgstr "Каждые %s _минут" - -#: ../src/config.py:363 +#: ../src/config.py:293 msgid "Active" msgstr "Активен" -#: ../src/config.py:371 +#: ../src/config.py:301 msgid "Event" msgstr "Событие" -#: ../src/config.py:685 ../src/gajim.py:2142 +#: ../src/config.py:407 +msgid "Always use OS/X default applications" +msgstr "Всегда использовать приложения OS/X по умолчанию" + +#: ../src/config.py:408 +#, fuzzy +msgid "Custom" +msgstr "Пользовательские настройки" + +#: ../src/config.py:638 ../src/dialogs.py:1018 #, python-format msgid "Dictionary for lang %s not available" msgstr "Нет словаря для языка %s" -#: ../src/config.py:686 ../src/gajim.py:2143 +#: ../src/config.py:639 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -2611,71 +2927,106 @@ msgstr "" "Чтобы воспользоваться проверкой правописания, установите словарь для языка %" "s или выберите другой язык, исправив настройку speller_language." -#: ../src/config.py:1038 +#: ../src/config.py:1001 msgid "status message title" msgstr "заголовок сообщения сервера" -#: ../src/config.py:1038 +#: ../src/config.py:1001 msgid "status message text" msgstr "текст сообщения сервера" -#: ../src/config.py:1073 +#: ../src/config.py:1037 msgid "First Message Received" msgstr "Получено первое сообщение" -#: ../src/config.py:1074 +#: ../src/config.py:1038 msgid "Next Message Received" msgstr "Получено следующее сообщение" -#: ../src/config.py:1075 +#: ../src/config.py:1039 msgid "Contact Connected" msgstr "Контакт подключился" -#: ../src/config.py:1076 +#: ../src/config.py:1040 msgid "Contact Disconnected" msgstr "Контакт отключился" -#: ../src/config.py:1077 +#: ../src/config.py:1041 msgid "Message Sent" msgstr "Сообщение отправлено" -#: ../src/config.py:1078 +#: ../src/config.py:1042 msgid "Group Chat Message Highlight" msgstr "Вас упомянули в комнате" -#: ../src/config.py:1079 +#: ../src/config.py:1043 msgid "Group Chat Message Received" msgstr "Получено сообщение в комнате" -#: ../src/config.py:1086 +#: ../src/config.py:1050 msgid "GMail Email Received" msgstr "Получено письмо на Gmail" -#: ../src/config.py:1289 +#. Name column +#: ../src/config.py:1315 ../src/dialogs.py:1517 ../src/dialogs.py:1581 +#: ../src/disco.py:743 ../src/disco.py:1535 ../src/disco.py:1781 +#: ../src/history_window.py:113 +msgid "Name" +msgstr "Имя" + +#: ../src/config.py:1421 ../src/common/config.py:394 +msgid "Be right back." +msgstr "Скоро буду." + +#: ../src/config.py:1425 +msgid "Relogin now?" +msgstr "Переподключиться сейчас?" + +#: ../src/config.py:1426 +msgid "If you want all the changes to apply instantly, you must relogin." +msgstr "" +"Если вы хотите чтобы изменения были применены немедленно, вы должны " +"переподключиться." + +#: ../src/config.py:1522 ../src/config.py:1613 msgid "OpenPGP is not usable in this computer" msgstr "Невозможно использовать OpenPGP" -#: ../src/config.py:1335 -msgid "You are currently connected to the server" -msgstr "Вы сейчас подсоединены к серверу" - -#: ../src/config.py:1336 -msgid "To change the account name, you must be disconnected." -msgstr "Для смены имени учетной записи необходимо отключиться." - -#: ../src/config.py:1339 ../src/config.py:1931 +#: ../src/config.py:1649 ../src/config.py:1690 msgid "Unread events" msgstr "Непросмотренные события" -#: ../src/config.py:1340 -msgid "To change the account name, you must read all pending events." -msgstr "Для смены имени учетной записи необходимо просмотреть ожидающие события." +#: ../src/config.py:1650 +msgid "Read all pending events before removing this account." +msgstr "Просмотрите все ожидающие события перед удалением учетной записи." -#: ../src/config.py:1344 +#: ../src/config.py:1676 +#, python-format +msgid "You have opened chat in account %s" +msgstr "У вас есть окна чата под учётной записью %s" + +#: ../src/config.py:1677 +msgid "All chat and groupchat windows will be closed. Do you want to continue?" +msgstr "Все окна чатов и комнат будут закрыты. Продолжить?" + +#: ../src/config.py:1686 +msgid "You are currently connected to the server" +msgstr "Вы сейчас подсоединены к серверу" + +#: ../src/config.py:1687 +msgid "To change the account name, you must be disconnected." +msgstr "Для смены имени учетной записи необходимо отключиться." + +#: ../src/config.py:1691 +msgid "To change the account name, you must read all pending events." +msgstr "" +"Для смены имени учетной записи необходимо просмотреть ожидающие события." + +#: ../src/config.py:1697 msgid "Account Name Already Used" msgstr "Такое имя учетной записи уже используется" -#: ../src/config.py:1345 +#: ../src/config.py:1698 msgid "" "This name is already used by another of your accounts. Please choose another " "name." @@ -2683,175 +3034,147 @@ msgstr "" "Это имя уже используется в другой вашей учетной записи. Пожалуйста, выберите " "другое." -#: ../src/config.py:1349 ../src/config.py:1353 +#: ../src/config.py:1702 ../src/config.py:1706 msgid "Invalid account name" msgstr "Неверное имя учетной записи" -#: ../src/config.py:1350 +#: ../src/config.py:1703 msgid "Account name cannot be empty." msgstr "Имя учетной записи не может быть пустым." -#: ../src/config.py:1354 +#: ../src/config.py:1707 msgid "Account name cannot contain spaces." msgstr "Имя учетной записи не может содержать пробелы." -#: ../src/config.py:1362 ../src/config.py:1368 ../src/config.py:1378 -#: ../src/config.py:3036 +#: ../src/config.py:1771 +msgid "Rename Account" +msgstr "Переименовать учетную запись" + +#: ../src/config.py:1772 +#, python-format +msgid "Enter a new name for account %s" +msgstr "Введите новое название для учетной записи %s" + +#: ../src/config.py:1790 ../src/config.py:1798 ../src/config.py:1838 +#: ../src/config.py:3052 ../src/dataforms_widget.py:533 msgid "Invalid Jabber ID" msgstr "Неверный Jabber ID" -#: ../src/config.py:1369 +#: ../src/config.py:1799 msgid "A Jabber ID must be in the form \"user@servername\"." msgstr "Jabber ID должен иметь формат \"имя_пользователя@сервер\"." -#: ../src/config.py:1428 +#: ../src/config.py:1985 ../src/config.py:3124 msgid "Invalid entry" msgstr "Неверная запись" -#: ../src/config.py:1429 +#: ../src/config.py:1986 ../src/config.py:3125 msgid "Custom port must be a port number." msgstr "В качестве номера порта должно выступать число" -#: ../src/config.py:1555 ../src/common/config.py:363 -msgid "Be right back." -msgstr "Скоро буду." +#: ../src/config.py:2007 +msgid "Failed to get secret keys" +msgstr "Не удалось получить секретный ключ" -#: ../src/config.py:1565 -msgid "Relogin now?" -msgstr "Переподключиться сейчас?" +#: ../src/config.py:2008 +msgid "There was a problem retrieving your OpenPGP secret keys." +msgstr "Возникла проблема с получением вашего секретного ключа OpenPGP." -#: ../src/config.py:1566 -msgid "If you want all the changes to apply instantly, you must relogin." -msgstr "" -"Если вы хотите чтобы изменения были применены немедленно, вы должны " -"переподключиться." +#: ../src/config.py:2011 +msgid "OpenPGP Key Selection" +msgstr "Выбор ключа OpenPGP" -#: ../src/config.py:1592 +#: ../src/config.py:2012 +msgid "Choose your OpenPGP key" +msgstr "Выберите свой ключ OpenPGP" + +#: ../src/config.py:2052 msgid "No such account available" msgstr "Такая учетная запись недоступна" -#: ../src/config.py:1593 +#: ../src/config.py:2053 msgid "You must create your account before editing your personal information." msgstr "" "Перед редактированием личных данных необходимо сначала создать учетную " "запись." -#: ../src/config.py:1600 ../src/dialogs.py:1128 ../src/dialogs.py:1297 -#: ../src/disco.py:417 ../src/profile_window.py:307 -#: ../src/profile_window.py:373 +#: ../src/config.py:2060 ../src/dialogs.py:1364 ../src/dialogs.py:1505 +#: ../src/dialogs.py:1685 ../src/disco.py:427 ../src/profile_window.py:318 msgid "You are not connected to the server" msgstr "Вы не подключены к серверу" -#: ../src/config.py:1601 +#: ../src/config.py:2061 msgid "Without a connection, you can not edit your personal information." -msgstr "Чтобы отредактировать личную информацию, нужно подсоединиться к серверу." +msgstr "" +"Чтобы отредактировать личную информацию, нужно подсоединиться к серверу." -#: ../src/config.py:1605 +#: ../src/config.py:2065 msgid "Your server doesn't support Vcard" msgstr "Сервер не поддерживает Vcard" -#: ../src/config.py:1606 +#: ../src/config.py:2066 msgid "Your server can't save your personal information." msgstr "Ваш сервер не может хранить личную информацию." -#: ../src/config.py:1630 ../src/config.py:3423 -msgid "Failed to get secret keys" -msgstr "Не удалось получить секретный ключ" - -#: ../src/config.py:1631 ../src/config.py:3424 -msgid "There was a problem retrieving your OpenPGP secret keys." -msgstr "Возникла проблема с получением вашего секретного ключа OpenPGP." - -#: ../src/config.py:1634 ../src/config.py:3427 -msgid "OpenPGP Key Selection" -msgstr "Выбор ключа OpenPGP" - -#: ../src/config.py:1635 ../src/config.py:3428 -msgid "Choose your OpenPGP key" -msgstr "Выберите свой ключ OpenPGP" - -#. Name column -#: ../src/config.py:1865 ../src/disco.py:741 ../src/disco.py:1467 -#: ../src/disco.py:1705 ../src/history_window.py:78 -msgid "Name" -msgstr "Имя" - -#: ../src/config.py:1868 -msgid "Server" -msgstr "Сервер" - -#: ../src/config.py:1932 -msgid "Read all pending events before removing this account." -msgstr "Просмотрите все ожидающие события перед удалением учетной записи." - -#: ../src/config.py:1969 -#, python-format -msgid "You have opened chat in account %s" -msgstr "У вас есть окна чата под учётной записью %s" - -#: ../src/config.py:1970 -msgid "All chat and groupchat windows will be closed. Do you want to continue?" -msgstr "Все окна чатов и комнат будут закрыты. Продолжить?" - -#: ../src/config.py:2029 +#: ../src/config.py:2097 msgid "Account Local already exists." msgstr "Учётная запись Local уже существует." -#: ../src/config.py:2030 +#: ../src/config.py:2098 msgid "Please rename or remove it before enabling link-local messaging." msgstr "Переименуйте или удалите её, прежде чем включать локальные сообщения." -#: ../src/config.py:2262 +#: ../src/config.py:2277 #, python-format msgid "Edit %s" msgstr "Править %s" -#: ../src/config.py:2264 +#: ../src/config.py:2279 #, python-format msgid "Register to %s" msgstr "Зарегистрировать %s" -#. list at the begining -#: ../src/config.py:2336 +#. list at the beginning +#: ../src/config.py:2315 msgid "Ban List" msgstr "Черный список" -#: ../src/config.py:2337 +#: ../src/config.py:2316 msgid "Member List" msgstr "Список участников" -#: ../src/config.py:2338 +#: ../src/config.py:2317 msgid "Owner List" msgstr "Список владельцев" -#: ../src/config.py:2339 +#: ../src/config.py:2318 msgid "Administrator List" msgstr "Список администрираторов" #. Address column #. holds JID (who said this) -#: ../src/config.py:2372 ../src/disco.py:748 ../src/history_manager.py:154 +#: ../src/config.py:2367 ../src/disco.py:750 ../src/history_manager.py:160 msgid "JID" msgstr "JID" -#: ../src/config.py:2380 +#: ../src/config.py:2375 msgid "Reason" msgstr "Причина" -#: ../src/config.py:2385 +#: ../src/config.py:2380 msgid "Nick" msgstr "Ник" -#: ../src/config.py:2389 +#: ../src/config.py:2384 msgid "Role" msgstr "Обязанность" -#: ../src/config.py:2410 +#: ../src/config.py:2409 msgid "Banning..." msgstr "Баню..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2412 +#: ../src/config.py:2411 msgid "" "Whom do you want to ban?\n" "\n" @@ -2859,11 +3182,11 @@ msgstr "" "Кого вы хотите забанить?\n" "\n" -#: ../src/config.py:2414 +#: ../src/config.py:2413 msgid "Adding Member..." msgstr "Добавляю участника..." -#: ../src/config.py:2415 +#: ../src/config.py:2414 msgid "" "Whom do you want to make a member?\n" "\n" @@ -2871,23 +3194,23 @@ msgstr "" "Кого вы хотите сделать участником?\n" "\n" -#: ../src/config.py:2417 +#: ../src/config.py:2416 msgid "Adding Owner..." msgstr "Добавляю владельца..." -#: ../src/config.py:2418 +#: ../src/config.py:2417 msgid "" -"Whom do you want to make a owner?\n" +"Whom do you want to make an owner?\n" "\n" msgstr "" "Кого вы хотите сделать владельцем?\n" "\n" -#: ../src/config.py:2420 +#: ../src/config.py:2419 msgid "Adding Administrator..." msgstr "Добавляю администратора..." -#: ../src/config.py:2421 +#: ../src/config.py:2420 msgid "" "Whom do you want to make an administrator?\n" "\n" @@ -2895,7 +3218,7 @@ msgstr "" "Кого вы хотите сделать администратором?\n" "\n" -#: ../src/config.py:2422 +#: ../src/config.py:2421 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" @@ -2911,121 +3234,137 @@ msgstr "" "4. domain (сам домен, т.е. как любое сочетание user@domain,\n" "domain/resource, так и адрес, содержащий этот поддомен)" -#: ../src/config.py:2527 +#: ../src/config.py:2525 #, python-format msgid "Removing %s account" msgstr "Удаление учетной записи %s" -#: ../src/config.py:2544 ../src/roster_window.py:2665 +#: ../src/config.py:2540 ../src/gajim.py:1344 ../src/roster_window.py:3455 msgid "Password Required" msgstr "Требуется пароль" -#: ../src/config.py:2545 ../src/roster_window.py:2666 +#: ../src/config.py:2541 ../src/roster_window.py:3451 #, python-format msgid "Enter your password for account %s" msgstr "Введите пароль для учетной записи %s" -#: ../src/config.py:2546 ../src/roster_window.py:2667 +#: ../src/config.py:2542 ../src/roster_window.py:3456 msgid "Save password" msgstr "Сохранить пароль" -#: ../src/config.py:2560 +#: ../src/config.py:2555 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Учетная запись \"%s\" подключена к серверу" -#: ../src/config.py:2561 +#: ../src/config.py:2556 msgid "If you remove it, the connection will be lost." msgstr "Если вы удалите его, произойдет отключение." -#: ../src/config.py:2645 +#: ../src/config.py:2649 msgid "Default" msgstr "По умолчанию" -#: ../src/config.py:2645 +#: ../src/config.py:2649 msgid "?print_status:All" msgstr "Все" -#: ../src/config.py:2646 +#: ../src/config.py:2650 msgid "Enter and leave only" msgstr "Только приход и уход" -#: ../src/config.py:2716 +#: ../src/config.py:2651 +msgid "?print_status:None" +msgstr "" + +#: ../src/config.py:2720 msgid "New Group Chat" msgstr "Новая комната" -#: ../src/config.py:2748 +#: ../src/config.py:2753 msgid "This bookmark has invalid data" msgstr "Эта закладка содержит неверные данные" -#: ../src/config.py:2749 -msgid "Please be sure to fill out server and room fields or remove this bookmark." +#: ../src/config.py:2754 +msgid "" +"Please be sure to fill out server and room fields or remove this bookmark." msgstr "" "Пожалуйста, удостоверьтесь, что заполнены поля с именем сервера и комнаты, " "либо удалите эту закладку." -#: ../src/config.py:3011 +#: ../src/config.py:3035 msgid "Invalid username" msgstr "Неверное имя пользователя" -#: ../src/config.py:3012 +#: ../src/config.py:3037 msgid "You must provide a username to configure this account." msgstr "Для настройки учетной записи необходимо ввести имя пользователя." -#: ../src/config.py:3022 ../src/dialogs.py:1316 -msgid "Invalid password" -msgstr "Неверный пароль" - -#: ../src/config.py:3023 -msgid "You must enter a password for the new account." -msgstr "Необходимо ввести пароль для новой учетной записи." - -#: ../src/config.py:3027 ../src/dialogs.py:1321 -msgid "Passwords do not match" -msgstr "Пароли не совпадают" - -#: ../src/config.py:3028 ../src/dialogs.py:1322 -msgid "The passwords typed in both fields must be identical." -msgstr "Пароли, введенные в оба поля, должны быть одинаковы." - -#: ../src/config.py:3047 +#: ../src/config.py:3063 msgid "Duplicate Jabber ID" msgstr "Дублирующийся Jabber ID" -#: ../src/config.py:3048 +#: ../src/config.py:3064 msgid "This account is already configured in Gajim." msgstr "Этот контакт уже настроен в Gajim." -#: ../src/config.py:3065 +#: ../src/config.py:3081 msgid "Account has been added successfully" msgstr "Учетная запись успешно добавлена" -#: ../src/config.py:3066 ../src/config.py:3101 +#: ../src/config.py:3082 ../src/config.py:3255 msgid "" -"You can set advanced account options by pressing Advanced button, or later " -"by clicking in Accounts menuitem under Edit menu from the main window." +"You can set advanced account options by pressing the Advanced button, or " +"later by choosing the Accounts menuitem under the Edit menu from the main " +"window." msgstr "" "Учетная запись была успешно добавлена. \n" -"Вы можете настроить ее используя \n" -"\"Настройка->Учетные записи\" из главного окна." +" Вы можете дополнительно ее настроить используя \n" +"\"Настройка - >Учетные записи\" из главного окна." #: ../src/config.py:3100 +msgid "Invalid server" +msgstr "Неверный сервер" + +#: ../src/config.py:3101 +msgid "Please provide a server on which you want to register." +msgstr "Пожалуйста, укажите сервер на котором Вы хотите зарегистрироваться." + +#: ../src/config.py:3211 +#, python-format +msgid "" +"Security Warning\n" +"\n" +"The authenticity of the %s SSL certificate could be invalid.\n" +"SSL Error: %s\n" +"Do you still want to connect to this server?" +msgstr "" + +#: ../src/config.py:3216 ../src/gajim.py:2181 +#, python-format +msgid "" +"Add this certificate to the list of trusted certificates.\n" +"SHA1 fingerprint of the certificate:\n" +"%s" +msgstr "" + +#: ../src/config.py:3234 ../src/config.py:3273 +msgid "An error occurred during account creation" +msgstr "Произошла ошибка при создании учетной записи" + +#: ../src/config.py:3254 msgid "Your new account has been created successfully" msgstr "Ваша новая учетная запись успешно создана" -#: ../src/config.py:3118 -msgid "An error occured during account creation" -msgstr "Произошла ошибка при создании учетной записи" - -#: ../src/config.py:3176 +#: ../src/config.py:3357 msgid "Account name is in use" msgstr "Такое имя учетной записи уже используется" -#: ../src/config.py:3177 +#: ../src/config.py:3358 msgid "You already have an account using this name." msgstr "У вас уже есть учетная запись с таким именем." -#: ../src/conversation_textview.py:273 +#: ../src/conversation_textview.py:454 msgid "" "Text below this line is what has been said since the last time you paid " "attention to this group chat" @@ -3033,518 +3372,604 @@ msgstr "" "Текст под этой линией был сказан после того, как вы последний раз " "заглядывали в эту комнату" -#: ../src/conversation_textview.py:342 +#: ../src/conversation_textview.py:552 #, python-format msgid "_Actions for \"%s\"" msgstr "_Действия для \"%s\"" -#: ../src/conversation_textview.py:354 +#: ../src/conversation_textview.py:564 msgid "Read _Wikipedia Article" msgstr "Смотреть статью в _Wikipedia" -#: ../src/conversation_textview.py:359 +#: ../src/conversation_textview.py:569 msgid "Look it up in _Dictionary" msgstr "Искать в _словаре" #. we must have %s in the url if not WIKTIONARY -#: ../src/conversation_textview.py:375 +#: ../src/conversation_textview.py:585 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" msgstr "URL словаря пропущен в \"%s\" и это не WIKTIONARY" #. we must have %s in the url -#: ../src/conversation_textview.py:388 +#: ../src/conversation_textview.py:598 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "URL Web-поиска отсутствует в \"%s\"" -#: ../src/conversation_textview.py:391 +#: ../src/conversation_textview.py:601 msgid "Web _Search for it" msgstr "_Поиск по Web" -#: ../src/conversation_textview.py:397 +#: ../src/conversation_textview.py:607 msgid "Open as _Link" msgstr "Открыть как ссылку" -#: ../src/conversation_textview.py:757 +#: ../src/conversation_textview.py:1073 msgid "Yesterday" msgstr "Вчера" #. the number is >= 2 #. %i is day in year (1-365), %d (1-31) we want %i -#: ../src/conversation_textview.py:761 +#: ../src/conversation_textview.py:1077 #, python-format msgid "%i days ago" msgstr "%i дней назад" #. if we have subject, show it too! -#: ../src/conversation_textview.py:793 +#: ../src/conversation_textview.py:1111 #, python-format msgid "Subject: %s\n" msgstr "Тема: %s\n" -#: ../src/dialogs.py:59 +#: ../src/dataforms_widget.py:537 +msgid "Jabber ID already in list" +msgstr "Jabber ID уже в списке" + +#: ../src/dataforms_widget.py:538 +msgid "The Jabber ID you entered is already in the list. Choose another one." +msgstr "Jabber ID который вы ввели существует.Пожалуйста выберите другой." + +#. Default jid +#: ../src/dataforms_widget.py:549 +msgid "new@jabber.id" +msgstr "" + +#: ../src/dataforms_widget.py:552 ../src/dataforms_widget.py:554 +#, python-format +msgid "new%d@jabber.id" +msgstr "" + +#: ../src/dialogs.py:71 #, python-format msgid "Contact name: %s" msgstr "Имя контакта: %s" -#: ../src/dialogs.py:61 +#: ../src/dialogs.py:73 #, python-format msgid "Jabber ID: %s" msgstr "Jabber ID: %s" -#: ../src/dialogs.py:211 +#: ../src/dialogs.py:223 msgid "Group" msgstr "Группа" -#: ../src/dialogs.py:218 +#: ../src/dialogs.py:230 msgid "In the group" msgstr "В группе" -#: ../src/dialogs.py:269 +#: ../src/dialogs.py:330 msgid "KeyID" msgstr "KeyID" -#: ../src/dialogs.py:272 +#: ../src/dialogs.py:335 msgid "Contact name" msgstr "Имя контакта" -#: ../src/dialogs.py:318 +#: ../src/dialogs.py:381 #, python-format msgid "%s Status Message" msgstr "Сообщение о статусе %s" -#: ../src/dialogs.py:320 +#: ../src/dialogs.py:383 msgid "Status Message" msgstr "Сообщение о статусе" -#: ../src/dialogs.py:395 +#: ../src/dialogs.py:483 msgid "Save as Preset Status Message" msgstr "Сохранить установленное сообщение о статусе" -#: ../src/dialogs.py:396 +#: ../src/dialogs.py:484 msgid "Please type a name for this status message" msgstr "Введите имя для этого сообщения о статусе" -#: ../src/dialogs.py:417 +#: ../src/dialogs.py:495 +msgid "Overwrite Status Message?" +msgstr "Изменить сообщение о статусе?" + +#: ../src/dialogs.py:496 +msgid "" +"This name is already used. Do you want to overwrite this status message?" +msgstr "Это имя уже используется. Перезаписать это статусное сообщение?" + +#: ../src/dialogs.py:512 msgid "AIM Address:" msgstr "Адрес AIM:" -#: ../src/dialogs.py:418 +#: ../src/dialogs.py:513 msgid "GG Number:" msgstr "Номер GaduGadu" -#: ../src/dialogs.py:419 +#: ../src/dialogs.py:514 msgid "ICQ Number:" msgstr "Номер ICQ:" -#: ../src/dialogs.py:420 +#: ../src/dialogs.py:515 msgid "MSN Address:" msgstr "Адрес в MSN:" -#: ../src/dialogs.py:421 +#: ../src/dialogs.py:516 msgid "Yahoo! Address:" msgstr "Адрес Yahoo:" -#: ../src/dialogs.py:457 +#: ../src/dialogs.py:553 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" msgstr "" "Пожалуйста, заполните данные о контакте,\n" "который хотите добавить в ростер учетной записи %s" -#: ../src/dialogs.py:459 +#: ../src/dialogs.py:555 msgid "Please fill in the data of the contact you want to add" msgstr "Пожалуйста, заполните данные о контакте, который вы хотите добавить" -#: ../src/dialogs.py:609 ../src/dialogs.py:615 +#: ../src/dialogs.py:712 ../src/dialogs.py:718 msgid "Invalid User ID" msgstr "Неверный ID пользователя" -#: ../src/dialogs.py:616 +#: ../src/dialogs.py:719 msgid "The user ID must not contain a resource." msgstr "ID пользователя не должен содержать ресурс." -#: ../src/dialogs.py:630 +#: ../src/dialogs.py:733 msgid "Contact already in roster" msgstr "Контакт уже в ростере" -#: ../src/dialogs.py:631 +#: ../src/dialogs.py:734 msgid "This contact is already listed in your roster." msgstr "Этот контакт уже содержится в вашем ростере." -#: ../src/dialogs.py:665 +#: ../src/dialogs.py:770 msgid "User ID:" msgstr "ID пользователя:" -#: ../src/dialogs.py:728 +#: ../src/dialogs.py:832 msgid "A GTK+ jabber client" msgstr "Jabber-клиент на GTK+" -#: ../src/dialogs.py:729 +#: ../src/dialogs.py:833 msgid "GTK+ Version:" msgstr "Версия GTK+:" -#: ../src/dialogs.py:730 +#: ../src/dialogs.py:834 msgid "PyGTK Version:" msgstr "Версия PyGTK:" -#: ../src/dialogs.py:744 +#: ../src/dialogs.py:848 msgid "Current Developers:" msgstr "Разработчики:" -#: ../src/dialogs.py:746 +#: ../src/dialogs.py:850 msgid "Past Developers:" msgstr "Разработчики прошлых версий:" -#: ../src/dialogs.py:756 +#: ../src/dialogs.py:860 msgid "THANKS:" msgstr "БЛАГОДАРНОСТИ:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:762 +#: ../src/dialogs.py:866 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:776 +#: ../src/dialogs.py:879 msgid "translator-credits" msgstr "" "Яков Безруков \n" -"Александр Мыльцев " +"Александр Мыльцев \n" +"Олег Стадник \n" +"Денис Фомин " -#: ../src/dialogs.py:906 +#: ../src/dialogs.py:1011 #, python-format msgid "Unable to bind to port %s." msgstr "Не могу привязаться к порту %s." -#: ../src/dialogs.py:907 +#: ../src/dialogs.py:1012 msgid "" "Maybe you have another running instance of Gajim. File Transfer will be " -"canceled." -msgstr "Возможно, запущен ещё один экземпляр Gajim. Передача файлов будет отменена." +"cancelled." +msgstr "" +"Возможно, запущен ещё один экземпляр Gajim. Передача файлов будет отменена." -#: ../src/dialogs.py:1058 +#: ../src/dialogs.py:1019 +#, python-format +msgid "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option.\n" +"\n" +"Highlighting misspelled words feature will not be used" +msgstr "" +"Чтобы воспользоваться проверкой правописания, установите словарь для языка %" +"s или выберите другой язык, исправив настройку speller_language." + +#: ../src/dialogs.py:1293 #, python-format msgid "Subscription request for account %s from %s" msgstr "Запрос на подписку для учетной записи %s от %s" -#: ../src/dialogs.py:1061 +#: ../src/dialogs.py:1296 #, python-format msgid "Subscription request from %s" msgstr "Запрос на подписку от %s" -#: ../src/dialogs.py:1121 ../src/roster_window.py:681 +#: ../src/dialogs.py:1357 ../src/roster_window.py:776 #, python-format msgid "You are already in group chat %s" msgstr "Вы уже в комнате %s" -#: ../src/dialogs.py:1129 +#: ../src/dialogs.py:1365 msgid "You can not join a group chat unless you are connected." msgstr "Вы не можете зайти в комнату без подключения." -#: ../src/dialogs.py:1144 +#: ../src/dialogs.py:1383 #, python-format msgid "Join Group Chat with account %s" msgstr "Войти в комнату с учетной записи %s" -#: ../src/dialogs.py:1212 ../src/dialogs.py:1218 +#: ../src/dialogs.py:1453 ../src/dialogs.py:1459 +#: ../src/groupchat_control.py:1698 msgid "Invalid group chat Jabber ID" msgstr "Неверное имя комнаты" -#: ../src/dialogs.py:1213 ../src/dialogs.py:1219 +#: ../src/dialogs.py:1454 ../src/dialogs.py:1460 +#: ../src/groupchat_control.py:1699 msgid "The group chat Jabber ID has not allowed characters." msgstr "В Jabber ID комнаты или сервера содержатся недопустимые символы." -#: ../src/dialogs.py:1225 +#: ../src/dialogs.py:1466 msgid "This is not a group chat" msgstr "Это не комната" -#: ../src/dialogs.py:1226 +#: ../src/dialogs.py:1467 #, python-format msgid "%s is not the name of a group chat." msgstr "%s не является именем комнаты." -#: ../src/dialogs.py:1248 +#: ../src/dialogs.py:1506 +msgid "Without a connection, you can not synchronise your contacts." +msgstr "Чтобы объединить контакты, необходимо подсоединиться к серверу." + +#: ../src/dialogs.py:1520 +msgid "Server" +msgstr "Сервер" + +#: ../src/dialogs.py:1553 +msgid "This account is not connected to the server" +msgstr "Аккаунт не подключен к серверу" + +#: ../src/dialogs.py:1554 +#, fuzzy +msgid "You cannot synchronize with an account unless it is connected." +msgstr "Вы не можете зайти в комнату без подключения." + +#: ../src/dialogs.py:1578 +msgid "Synchronise" +msgstr "" + +#: ../src/dialogs.py:1636 #, python-format msgid "Start Chat with account %s" -msgstr "Начать беседу с учетной записью %s" +msgstr "Начать чат с учетной записью %s" -#: ../src/dialogs.py:1250 +#: ../src/dialogs.py:1638 msgid "Start Chat" -msgstr "Начать беседу" +msgstr "Начать чат" -#: ../src/dialogs.py:1251 +#: ../src/dialogs.py:1639 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" -msgstr "Введите ник или ID пользователя, которому вы хотите отправить сообщение:" +msgstr "" +"Введите ник или ID пользователя, которому вы хотите отправить сообщение:" #. if offline or connecting -#: ../src/dialogs.py:1276 ../src/dialogs.py:1635 ../src/dialogs.py:1764 +#: ../src/dialogs.py:1664 ../src/dialogs.py:2040 ../src/dialogs.py:2181 msgid "Connection not available" msgstr "Соединение невозможно" -#: ../src/dialogs.py:1277 ../src/dialogs.py:1636 ../src/dialogs.py:1765 +#: ../src/dialogs.py:1665 ../src/dialogs.py:2041 ../src/dialogs.py:2182 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Пожалуйста, удостоверьтесь, что вы подключены к \"%s\"." -#: ../src/dialogs.py:1286 ../src/dialogs.py:1289 +#: ../src/dialogs.py:1674 ../src/dialogs.py:1677 msgid "Invalid JID" msgstr "Неверный JID" -#: ../src/dialogs.py:1289 +#: ../src/dialogs.py:1677 #, python-format msgid "Unable to parse \"%s\"." msgstr "Не понимаю адреса \"%s\"." -#: ../src/dialogs.py:1298 +#: ../src/dialogs.py:1686 msgid "Without a connection, you can not change your password." msgstr "Чтобы изменить пароль, необходимо подсоединиться к серверу." -#: ../src/dialogs.py:1317 +#: ../src/dialogs.py:1704 +msgid "Invalid password" +msgstr "Неверный пароль" + +#: ../src/dialogs.py:1705 msgid "You must enter a password." msgstr "Вы должны ввести пароль." +#: ../src/dialogs.py:1709 +msgid "Passwords do not match" +msgstr "Пароли не совпадают" + +#: ../src/dialogs.py:1710 +msgid "The passwords typed in both fields must be identical." +msgstr "Пароли, введенные в оба поля, должны быть одинаковы." + #. img to display #. default value -#: ../src/dialogs.py:1364 ../src/notify.py:211 ../src/notify.py:411 +#: ../src/dialogs.py:1752 ../src/notify.py:232 ../src/notify.py:447 msgid "Contact Signed In" -msgstr "Контакт в сети" +msgstr "Контакт подключился" -#: ../src/dialogs.py:1366 ../src/notify.py:219 ../src/notify.py:413 +#: ../src/dialogs.py:1754 ../src/notify.py:240 ../src/notify.py:449 msgid "Contact Signed Out" msgstr "Контакт отключился" #. chat message -#: ../src/dialogs.py:1368 ../src/notify.py:238 ../src/notify.py:415 +#: ../src/dialogs.py:1756 ../src/notify.py:263 ../src/notify.py:451 msgid "New Message" msgstr "Новое сообщение" #. single message -#: ../src/dialogs.py:1368 ../src/notify.py:223 ../src/notify.py:415 +#: ../src/dialogs.py:1756 ../src/notify.py:244 ../src/notify.py:451 msgid "New Single Message" msgstr "Новое одиночное сообщение" #. private message -#: ../src/dialogs.py:1369 ../src/notify.py:230 ../src/notify.py:416 +#: ../src/dialogs.py:1757 ../src/notify.py:251 ../src/notify.py:452 msgid "New Private Message" msgstr "Новое личное сообщение" -#: ../src/dialogs.py:1369 ../src/gajim.py:1216 ../src/notify.py:424 +#: ../src/dialogs.py:1757 ../src/gajim.py:1536 ../src/notify.py:460 msgid "New E-mail" msgstr "Новое письмо" -#: ../src/dialogs.py:1371 ../src/gajim.py:1369 ../src/notify.py:418 +#: ../src/dialogs.py:1759 ../src/gajim.py:1711 ../src/notify.py:454 msgid "File Transfer Request" msgstr "Запрос передачи" -#: ../src/dialogs.py:1373 ../src/gajim.py:1188 ../src/gajim.py:1345 -#: ../src/notify.py:420 +#: ../src/dialogs.py:1761 ../src/gajim.py:1508 ../src/gajim.py:1678 +#: ../src/notify.py:456 msgid "File Transfer Error" msgstr "Ошибка передачи" -#: ../src/dialogs.py:1375 ../src/gajim.py:1408 ../src/gajim.py:1430 -#: ../src/gajim.py:1447 ../src/notify.py:422 +#: ../src/dialogs.py:1763 ../src/gajim.py:1750 ../src/gajim.py:1772 +#: ../src/gajim.py:1789 ../src/notify.py:458 msgid "File Transfer Completed" msgstr "Передача файла завершена" -#: ../src/dialogs.py:1376 ../src/gajim.py:1411 ../src/notify.py:422 +#: ../src/dialogs.py:1764 ../src/gajim.py:1753 ../src/notify.py:458 msgid "File Transfer Stopped" msgstr "Передача остановлена" -#: ../src/dialogs.py:1378 ../src/gajim.py:1086 ../src/notify.py:426 +#: ../src/dialogs.py:1766 ../src/gajim.py:1365 ../src/notify.py:462 msgid "Groupchat Invitation" msgstr "Приглашение в комнату" -#: ../src/dialogs.py:1380 ../src/notify.py:203 ../src/notify.py:428 +#: ../src/dialogs.py:1768 ../src/notify.py:224 ../src/notify.py:464 msgid "Contact Changed Status" -msgstr "Контакт изменил статус" +msgstr "Контакт изменит статус" -#: ../src/dialogs.py:1565 +#: ../src/dialogs.py:1959 #, python-format msgid "Single Message using account %s" msgstr "Новое сообщение с учетной записи %s" -#: ../src/dialogs.py:1567 +#: ../src/dialogs.py:1961 #, python-format msgid "Single Message in account %s" msgstr "Новое сообщение для учетной записи %s" -#: ../src/dialogs.py:1569 +#: ../src/dialogs.py:1963 msgid "Single Message" msgstr "Сообщение" #. prepare UI for Sending -#: ../src/dialogs.py:1572 +#: ../src/dialogs.py:1966 #, python-format msgid "Send %s" msgstr "Отправить %s" #. prepare UI for Receiving -#: ../src/dialogs.py:1595 +#: ../src/dialogs.py:1989 #, python-format msgid "Received %s" msgstr "Получено %s" +#. prepare UI for Receiving +#: ../src/dialogs.py:2012 +#, 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:1667 +#: ../src/dialogs.py:2082 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:1668 +#: ../src/dialogs.py:2083 #, python-format msgid "%s wrote:\n" msgstr "%s написал:\n" -#: ../src/dialogs.py:1712 +#: ../src/dialogs.py:2127 #, python-format msgid "XML Console for %s" msgstr "Консоль XML для %s" -#: ../src/dialogs.py:1714 +#: ../src/dialogs.py:2129 msgid "XML Console" msgstr "Консоль XML" -#: ../src/dialogs.py:1835 +#: ../src/dialogs.py:2252 #, python-format msgid "Privacy List %s" msgstr "Список доступа %s" -#: ../src/dialogs.py:1839 +#: ../src/dialogs.py:2256 #, python-format msgid "Privacy List for %s" msgstr "Список доступа для %s" -#: ../src/dialogs.py:1887 +#: ../src/dialogs.py:2312 #, python-format msgid "Order: %s, action: %s, type: %s, value: %s" msgstr "Номер: %s, действие: %s, тип: %s, значение: %s" -#: ../src/dialogs.py:1890 +#: ../src/dialogs.py:2315 #, python-format msgid "Order: %s, action: %s" msgstr "Номер: %s, действие: %s" -#: ../src/dialogs.py:1932 +#: ../src/dialogs.py:2357 msgid "Edit a rule" msgstr "Изменить правило" -#: ../src/dialogs.py:2019 +#: ../src/dialogs.py:2444 msgid "Add a rule" msgstr "Добавить правило" -#: ../src/dialogs.py:2115 +#: ../src/dialogs.py:2540 #, python-format msgid "Privacy Lists for %s" msgstr "Списки доступа для %s" -#: ../src/dialogs.py:2117 +#: ../src/dialogs.py:2542 msgid "Privacy Lists" msgstr "Списки доступа" -#: ../src/dialogs.py:2185 +#: ../src/dialogs.py:2612 msgid "Invalid List Name" msgstr "Недопустимое имя списка" -#: ../src/dialogs.py:2186 +#: ../src/dialogs.py:2613 msgid "You must enter a name to create a privacy list." msgstr "Необходимо ввести имя для новой учетной записи." -#. FIXME: use nickname instead of contact_jid -#: ../src/dialogs.py:2220 -#, python-format -msgid "%(contact_jid)s has invited you to group chat %(room_jid)s" +#: ../src/dialogs.py:2650 +msgid "$Contact has invited you to join a discussion" msgstr "%(contact_jid)s приглашает вас в комнату %(room_jid)s." -#. only if not None and not '' -#: ../src/dialogs.py:2226 +#: ../src/dialogs.py:2652 +#, python-format +msgid "$Contact has invited you to group chat %(room_jid)s" +msgstr "$Contact приглашает вас в комнату %(room_jid)s." + +#: ../src/dialogs.py:2665 #, python-format msgid "Comment: %s" msgstr "Комментарий: %s" -#: ../src/dialogs.py:2288 +#: ../src/dialogs.py:2731 msgid "Choose Sound" msgstr "Выберите звуковой файл" -#: ../src/dialogs.py:2298 ../src/dialogs.py:2343 +#: ../src/dialogs.py:2741 ../src/dialogs.py:2792 msgid "All files" msgstr "Все файлы" -#: ../src/dialogs.py:2303 +#: ../src/dialogs.py:2746 msgid "Wav Sounds" msgstr "В формате Wav" -#: ../src/dialogs.py:2333 +#: ../src/dialogs.py:2779 msgid "Choose Image" msgstr "Выбрать картинку" -#: ../src/dialogs.py:2348 +#: ../src/dialogs.py:2797 msgid "Images" msgstr "Картинки" -#: ../src/dialogs.py:2405 +#: ../src/dialogs.py:2862 #, python-format msgid "When %s becomes:" msgstr "Когда %s происходит:" -#: ../src/dialogs.py:2407 +#: ../src/dialogs.py:2864 #, python-format msgid "Adding Special Notification for %s" msgstr "Добавление специального уведомления для %s" #. # means number -#: ../src/dialogs.py:2478 +#: ../src/dialogs.py:2935 msgid "#" msgstr "№" -#: ../src/dialogs.py:2484 +#: ../src/dialogs.py:2941 msgid "Condition" msgstr "Условие" -#: ../src/dialogs.py:2605 +#: ../src/dialogs.py:3059 msgid "when I am " msgstr "когда я " -#: ../src/disco.py:101 +#: ../src/disco.py:111 msgid "Others" msgstr "Другие" -#: ../src/disco.py:102 ../src/disco.py:103 ../src/disco.py:1253 -#: ../src/gajim.py:539 ../src/roster_window.py:267 ../src/roster_window.py:325 -#: ../src/roster_window.py:364 ../src/roster_window.py:445 -#: ../src/roster_window.py:477 ../src/roster_window.py:479 -#: ../src/roster_window.py:3828 ../src/roster_window.py:3830 -#: ../src/common/helpers.py:42 +#: ../src/disco.py:112 ../src/disco.py:113 ../src/disco.py:1321 +#: ../src/gajim.py:660 ../src/roster_window.py:295 ../src/roster_window.py:355 +#: ../src/roster_window.py:395 ../src/roster_window.py:503 +#: ../src/roster_window.py:535 ../src/roster_window.py:537 +#: ../src/roster_window.py:4755 ../src/roster_window.py:4757 +#: ../src/common/contacts.py:295 ../src/common/contacts.py:310 +#: ../src/common/helpers.py:53 msgid "Transports" msgstr "Транспорты" #. conference is a category for listing mostly groupchats in service discovery -#: ../src/disco.py:105 +#: ../src/disco.py:115 msgid "Conference" msgstr "Комнаты" -#: ../src/disco.py:418 +#: ../src/disco.py:428 msgid "Without a connection, you can not browse available services" msgstr "Для просмотра сервисов необходимо сначала подсоединиться к серверу" -#: ../src/disco.py:497 +#: ../src/disco.py:502 #, python-format msgid "Service Discovery using account %s" msgstr "Обзор сервисов с учётной записи %s" -#: ../src/disco.py:499 +#: ../src/disco.py:504 msgid "Service Discovery" msgstr "Обзор сервисов (discovery)" -#: ../src/disco.py:642 +#: ../src/disco.py:644 msgid "The service could not be found" msgstr "Сервис не обнаружен" -#: ../src/disco.py:643 +#: ../src/disco.py:645 msgid "" "There is no service at the address you entered, or it is not responding. " "Check the address and try again." @@ -3552,205 +3977,462 @@ msgstr "" "По этому адресу сервисы отсутствуют или не отвечают. Проверьте адрес и " "попробуйте еще раз." -#: ../src/disco.py:647 ../src/disco.py:928 +#: ../src/disco.py:649 ../src/disco.py:930 msgid "The service is not browsable" msgstr "Сервис недоступен для просмотра" -#: ../src/disco.py:648 +#: ../src/disco.py:650 msgid "This type of service does not contain any items to browse." msgstr "Этот сервис не содержит ничего, что можно было бы просмотреть." -#: ../src/disco.py:728 +#: ../src/disco.py:730 #, python-format msgid "Browsing %s using account %s" msgstr "Просмотр %s с учетной записью %s" -#: ../src/disco.py:767 +#: ../src/disco.py:769 msgid "_Browse" msgstr "_Браузер" -#: ../src/disco.py:929 +#: ../src/disco.py:931 msgid "This service does not contain any items to browse." msgstr "Этот сервис не содержит ничего, что можно было бы просмотреть." -#: ../src/disco.py:1143 ../src/disco.py:1258 +#: ../src/disco.py:1152 +msgid "_Execute Command" +msgstr "В_ыполнить команду..." + +#: ../src/disco.py:1162 ../src/disco.py:1326 msgid "Re_gister" msgstr "За_регистрироваться" -#: ../src/disco.py:1295 +#: ../src/disco.py:1363 #, python-format msgid "Scanning %d / %d.." msgstr "Сканирую %d / %d.." #. Users column -#: ../src/disco.py:1476 +#: ../src/disco.py:1545 msgid "Users" msgstr "Пользователи" #. Description column -#: ../src/disco.py:1483 +#: ../src/disco.py:1553 msgid "Description" msgstr "Описание" #. Id column -#: ../src/disco.py:1490 +#: ../src/disco.py:1561 msgid "Id" msgstr "ID" -#: ../src/disco.py:1713 +#: ../src/disco.py:1790 msgid "Subscribed" msgstr "Подписка" -#: ../src/disco.py:1739 +#: ../src/disco.py:1798 +msgid "Node" +msgstr "" + +#: ../src/disco.py:1855 msgid "New post" msgstr "Новое сообщение" -#: ../src/disco.py:1745 +#: ../src/disco.py:1861 msgid "_Subscribe" msgstr "_Подписаться" -#: ../src/disco.py:1751 +#: ../src/disco.py:1867 msgid "_Unsubscribe" msgstr "_Отписаться" -#: ../src/filetransfers_window.py:72 +#: ../src/features_window.py:47 +msgid "PyOpenSSL" +msgstr "PyOpenSSL" + +#: ../src/features_window.py:48 +msgid "" +"A library used to validate server certificates to ensure a secure connection." +msgstr "" +"Библиотека используется для подтверждения действительности сертификатов " +"сервера для того, чтобы удостовериться в защищенности соединения." + +#: ../src/features_window.py:49 ../src/features_window.py:50 +msgid "Requires python-pyopenssl." +msgstr "Требует python-pyopenssl." + +#: ../src/features_window.py:51 +msgid "Bonjour / Zeroconf" +msgstr "Bonjour / Zeroconf" + +#: ../src/features_window.py:52 +msgid "Serverless chatting with autodetected clients in a local network." +msgstr "Чат в локальной сети." + +#: ../src/features_window.py:53 +msgid "Requires python-avahi." +msgstr "Требует python-avahi." + +#: ../src/features_window.py:54 +msgid "Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." +msgstr "Требует pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." + +#: ../src/features_window.py:55 +msgid "gajim-remote" +msgstr "gajim-remote" + +#: ../src/features_window.py:56 +msgid "A script to controle gajim via commandline." +msgstr "Скрипт для управления Gajim'ом через коммандную строку." + +#: ../src/features_window.py:57 +msgid "Requires python-dbus." +msgstr "Требует python-dbus." + +#: ../src/features_window.py:58 ../src/features_window.py:62 +#: ../src/features_window.py:66 ../src/features_window.py:70 +#: ../src/features_window.py:74 ../src/features_window.py:82 +#: ../src/features_window.py:86 ../src/features_window.py:98 +msgid "Feature not available under Windows." +msgstr "Эта возможность отсутствует в Windows." + +#: ../src/features_window.py:59 +msgid "OpenGPG" +msgstr "OpenGPG" + +#: ../src/features_window.py:60 +msgid "Encrypting chatmessages with gpg keys." +msgstr "Шифрование сообщений при помощи gpg ключей." + +#: ../src/features_window.py:61 +msgid "Requires gpg and python-GnuPGInterface." +msgstr "Требует gpg и python-GnuPGInterface." + +#: ../src/features_window.py:63 +msgid "network-manager" +msgstr "network-manager" + +#: ../src/features_window.py:64 +msgid "Autodetection of network status." +msgstr "Автоопределение состояния соединения с сетью." + +#: ../src/features_window.py:65 +msgid "Requires gnome-network-manager and python-dbus." +msgstr "Требует gnome-network-manager и python-dbus." + +#: ../src/features_window.py:67 +msgid "Session Management" +msgstr "Управление сеансом" + +#: ../src/features_window.py:68 +msgid "Gajim session is stored on logout and restored on login." +msgstr "" +"Сеанс Gajim сохраняется при выходе (logout) и восстанавливается при входе " +"(login)." + +#: ../src/features_window.py:69 +msgid "Requires python-gnome2." +msgstr "Требует python-gnome2." + +#: ../src/features_window.py:71 +msgid "gnome-keyring" +msgstr "gnome-keyring" + +#: ../src/features_window.py:72 +msgid "Passwords can be stored securely and not just in plaintext." +msgstr "Пароли могут храниться безопастно, а не просто открытым текстом." + +#: ../src/features_window.py:73 +msgid "Requires gnome-keyring and python-gnome2-desktop." +msgstr "Требует gnome-keyring и python-gnome2-desktop." + +#: ../src/features_window.py:75 +msgid "SRV" +msgstr "SRV" + +#: ../src/features_window.py:76 +msgid "Ability to connect to servers which are using SRV records." +msgstr "" + +#: ../src/features_window.py:77 +msgid "Requires dnsutils." +msgstr "Требует dnsutils." + +#: ../src/features_window.py:78 +msgid "Requires nslookup to use SRV records." +msgstr "" + +#: ../src/features_window.py:79 +msgid "Spell Checker" +msgstr "Проверка орфографии" + +#: ../src/features_window.py:80 +msgid "Spellchecking of composed messages." +msgstr "Проверка орфографии набираемых сообщений" + +#: ../src/features_window.py:81 +msgid "" +"Requires python-gnome2-extras or compilation of gtkspell module from Gajim " +"sources." +msgstr "" +"Требует python-gnome2-extras или скомпилированного модуля gtkspell из " +"исходных кодов Gajim." + +#: ../src/features_window.py:83 +msgid "Notification-daemon" +msgstr "" + +#: ../src/features_window.py:84 +msgid "Passive popups notifying for new events." +msgstr "Пассивные всплывающие окна для уведомления о новых событиях." + +#: ../src/features_window.py:85 +msgid "" +"Requires python-notify or instead python-dbus in conjunction with " +"notification-daemon." +msgstr "" + +#: ../src/features_window.py:87 +msgid "Trayicon" +msgstr "Иконка в системном трее" + +#: ../src/features_window.py:88 +msgid "A icon in systemtray reflecting the current presence." +msgstr "Иконка в системном лотке отображающая текущий статус." + +#: ../src/features_window.py:89 +msgid "" +"Requires python-gnome2-extras or compiled trayicon module from Gajim " +"sources." +msgstr "" +"Требует python-gnome2-extras или скомпилированного модуля trayicon из " +"исходных кодов Gajim." + +#: ../src/features_window.py:90 +msgid "Requires PyGTK >= 2.10." +msgstr "Требует PyGTK >= 2.10." + +#: ../src/features_window.py:91 +msgid "Idle" +msgstr "Время бездействия" + +#: ../src/features_window.py:92 +msgid "Ability to measure idle time, in order to set auto status." +msgstr "" + +#: ../src/features_window.py:93 ../src/features_window.py:94 +msgid "Requires compilation of the idle module from Gajim sources." +msgstr "" + +#: ../src/features_window.py:95 +msgid "LaTeX" +msgstr "LaTeX" + +#: ../src/features_window.py:96 +msgid "Transform LaTeX espressions between $$ $$." +msgstr "" + +#: ../src/features_window.py:97 +msgid "" +"Requires texlive-latex-base, dvips and imagemagick. You have to set " +"'use_latex' to True in the Advanced Configuration Editor." +msgstr "" + +#: ../src/features_window.py:99 +#, fuzzy +msgid "End to end encryption" +msgstr "Шифрование OpenPGP" + +#: ../src/features_window.py:100 +#, fuzzy +msgid "Encrypting chatmessages." +msgstr "_Входящее сообщение:" + +#: ../src/features_window.py:101 ../src/features_window.py:102 +msgid "Requires python-crypto." +msgstr "" + +#: ../src/features_window.py:103 +#, fuzzy +msgid "RST Generator" +msgstr "Общие" + +#: ../src/features_window.py:104 +msgid "" +"Generate XHTML output from RST code (see http://docutils.sourceforge.net/" +"docs/ref/rst/restructuredtext.html)." +msgstr "" + +#: ../src/features_window.py:105 ../src/features_window.py:106 +msgid "Requires python-docutils." +msgstr "Требует python-docutils." + +#: ../src/features_window.py:107 +msgid "libsexy" +msgstr "libsexy" + +#: ../src/features_window.py:108 +#, fuzzy +msgid "Ability to have clickable URLs in chat and groupchat window banners." +msgstr "Кликабельные ссылки в окне чата" + +#: ../src/features_window.py:109 ../src/features_window.py:110 +msgid "Requires python-sexy." +msgstr "Требует python-sexy." + +#: ../src/features_window.py:117 ../src/common/helpers.py:248 +msgid "Available" +msgstr "Доступен" + +#: ../src/features_window.py:124 +#, fuzzy +msgid "Feature" +msgstr "Параметры сервера" + +#: ../src/filetransfers_window.py:77 msgid "File" msgstr "Файл" -#: ../src/filetransfers_window.py:87 +#: ../src/filetransfers_window.py:92 msgid "Time" msgstr "Время" -#: ../src/filetransfers_window.py:99 +#: ../src/filetransfers_window.py:104 msgid "Progress" msgstr "Прогресс" -#: ../src/filetransfers_window.py:163 ../src/filetransfers_window.py:223 +#: ../src/filetransfers_window.py:164 ../src/filetransfers_window.py:218 #, python-format msgid "Filename: %s" msgstr "Имя файла: %s" -#: ../src/filetransfers_window.py:164 ../src/filetransfers_window.py:298 +#: ../src/filetransfers_window.py:165 ../src/filetransfers_window.py:305 #, 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:173 ../src/filetransfers_window.py:183 -#: ../src/history_manager.py:463 +#: ../src/filetransfers_window.py:174 ../src/filetransfers_window.py:184 +#: ../src/history_manager.py:468 msgid "You" msgstr "Вы" -#: ../src/filetransfers_window.py:174 +#: ../src/filetransfers_window.py:175 #, python-format msgid "Sender: %s" msgstr "Отправитель: %s" -#: ../src/filetransfers_window.py:175 ../src/filetransfers_window.py:572 -#: ../src/tooltips.py:573 +#: ../src/filetransfers_window.py:176 ../src/filetransfers_window.py:595 +#: ../src/tooltips.py:592 msgid "Recipient: " msgstr "Получатель:" -#: ../src/filetransfers_window.py:186 +#: ../src/filetransfers_window.py:187 #, python-format msgid "Saved in: %s" msgstr "Сохранено в: %s" -#: ../src/filetransfers_window.py:188 +#: ../src/filetransfers_window.py:189 msgid "File transfer completed" msgstr "Передача завершена" -#: ../src/filetransfers_window.py:204 ../src/filetransfers_window.py:212 -msgid "File transfer canceled" +#: ../src/filetransfers_window.py:203 ../src/filetransfers_window.py:209 +msgid "File transfer cancelled" msgstr "Передача отменена" -#: ../src/filetransfers_window.py:204 ../src/filetransfers_window.py:213 +#: ../src/filetransfers_window.py:203 ../src/filetransfers_window.py:210 msgid "Connection with peer cannot be established." msgstr "Соединение не может быть установлено." -#: ../src/filetransfers_window.py:224 +#: ../src/filetransfers_window.py:219 #, python-format msgid "Recipient: %s" msgstr "Получатель: %s" -#: ../src/filetransfers_window.py:226 +#: ../src/filetransfers_window.py:221 #, python-format msgid "Error message: %s" msgstr "Сообщение об ошибке: %s" -#: ../src/filetransfers_window.py:227 -msgid "File transfer stopped by the contact of the other side" +#: ../src/filetransfers_window.py:222 +msgid "File transfer stopped by the contact at the other end" msgstr "Передача файла остановлена контактом на той стороне" -#: ../src/filetransfers_window.py:244 +#: ../src/filetransfers_window.py:243 msgid "Choose File to Send..." msgstr "Выбрать файл для отправки..." -#: ../src/filetransfers_window.py:263 +#: ../src/filetransfers_window.py:259 ../src/tooltips.py:632 +msgid "Description: " +msgstr "Описание: " + +#: ../src/filetransfers_window.py:270 msgid "Gajim cannot access this file" msgstr "Нет доступа к файлу" -#: ../src/filetransfers_window.py:264 +#: ../src/filetransfers_window.py:271 msgid "This file is being used by another process." msgstr "Файл занят другим процессом." -#: ../src/filetransfers_window.py:296 +#: ../src/filetransfers_window.py:303 #, python-format msgid "File: %s" msgstr "Файл: %s" -#: ../src/filetransfers_window.py:301 +#: ../src/filetransfers_window.py:308 #, python-format msgid "Type: %s" msgstr "Тип: %s" -#: ../src/filetransfers_window.py:303 +#: ../src/filetransfers_window.py:310 #, python-format msgid "Description: %s" msgstr "Описание: %s" -#: ../src/filetransfers_window.py:304 +#: ../src/filetransfers_window.py:311 #, python-format msgid "%s wants to send you a file:" msgstr "%s хочет отправить вам файл:" -#: ../src/filetransfers_window.py:318 ../src/gtkgui_helpers.py:683 +#: ../src/filetransfers_window.py:324 ../src/gtkgui_helpers.py:773 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Не могу заместить существующий файл \"%s\"" -#: ../src/filetransfers_window.py:319 ../src/gtkgui_helpers.py:685 +#: ../src/filetransfers_window.py:325 ../src/gtkgui_helpers.py:775 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." msgstr "Этот файл уже существует, и у вас нет права его перезаписать." -#: ../src/filetransfers_window.py:326 ../src/gtkgui_helpers.py:689 +#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:779 msgid "This file already exists" msgstr "Файл уже существует" -#: ../src/filetransfers_window.py:326 ../src/gtkgui_helpers.py:689 +#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:779 msgid "What do you want to do?" msgstr "Что вы хотите сделать?" -#: ../src/filetransfers_window.py:338 ../src/gtkgui_helpers.py:699 +#. 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:346 ../src/gtkgui_helpers.py:789 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Директория \"%s\" не доступна для записи" -#: ../src/filetransfers_window.py:338 ../src/gtkgui_helpers.py:700 +#: ../src/filetransfers_window.py:346 ../src/gtkgui_helpers.py:790 msgid "You do not have permission to create files in this directory." msgstr "У вас нет права создавать файлы в этой директории." -#: ../src/filetransfers_window.py:348 +#: ../src/filetransfers_window.py:356 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:429 +#: ../src/filetransfers_window.py:436 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -3758,60 +4440,65 @@ 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:505 +#: ../src/filetransfers_window.py:525 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" -#: ../src/filetransfers_window.py:544 ../src/filetransfers_window.py:547 +#: ../src/filetransfers_window.py:565 ../src/filetransfers_window.py:568 msgid "Invalid File" msgstr "Неверный файл" -#: ../src/filetransfers_window.py:544 +#: ../src/filetransfers_window.py:565 msgid "File: " msgstr "Файл: " -#: ../src/filetransfers_window.py:548 +#: ../src/filetransfers_window.py:569 msgid "It is not possible to send empty files" msgstr "Нельзя отсылать пустые файлы" -#: ../src/filetransfers_window.py:568 ../src/tooltips.py:563 +#: ../src/filetransfers_window.py:591 ../src/tooltips.py:582 msgid "Name: " msgstr "Имя: " -#: ../src/filetransfers_window.py:570 ../src/tooltips.py:567 +#: ../src/filetransfers_window.py:593 ../src/tooltips.py:586 msgid "Sender: " msgstr "Отправитель:" -#: ../src/filetransfers_window.py:758 +#: ../src/filetransfers_window.py:781 msgid "Pause" msgstr "Пауза" -#: ../src/gajim.py:47 -msgid "Gajim needs Xserver to run. Quiting..." -msgstr "Gajim'у для запуска требуется X-сервер. Выход..." +#: ../src/gajim.py:56 +#, python-format +msgid "%s is not a valid loglevel" +msgstr "" -#: ../src/gajim.py:51 -msgid "Gajim needs PyGTK 2.6 or above" -msgstr "Gajim требуется PyGTK 2.6 или выше" +#: ../src/gajim.py:129 +msgid "Gajim needs X server to run. Quiting..." +msgstr "Gajim для запуска требуется X-сервер. Выход..." -#: ../src/gajim.py:52 -msgid "Gajim needs PyGTK 2.6 or above to run. Quiting..." -msgstr "Gajim для запуска требуется PyGTK 2.6 или выше. Выход..." +#: ../src/gajim.py:156 +msgid "Gajim needs PyGTK 2.8 or above" +msgstr "Gajim требуется PyGTK 2.8 или выше" -#: ../src/gajim.py:54 -msgid "Gajim needs GTK 2.6 or above" -msgstr "Gajim требуется GTK 2.6 или выше" +#: ../src/gajim.py:157 +msgid "Gajim needs PyGTK 2.8 or above to run. Quiting..." +msgstr "Gajim для запуска требуется PyGTK 2.8 или выше. Выход..." -#: ../src/gajim.py:55 -msgid "Gajim needs GTK 2.6 or above to run. Quiting..." -msgstr "Gajim для запуска требуется GTK 2.6 или выше. Выход..." +#: ../src/gajim.py:159 +msgid "Gajim needs GTK 2.8 or above" +msgstr "Gajim требуется GTK 2.8 или выше" -#: ../src/gajim.py:60 +#: ../src/gajim.py:160 +msgid "Gajim needs GTK 2.8 or above to run. Quiting..." +msgstr "Gajim для запуска требуется GTK 2.8 или выше. Выход..." + +#: ../src/gajim.py:165 msgid "GTK+ runtime is missing libglade support" msgstr "У GTK отсутствует поддержка libglade." -#: ../src/gajim.py:62 +#: ../src/gajim.py:167 #, python-format msgid "" "Please remove your current GTK+ runtime and install the latest stable " @@ -3820,31 +4507,34 @@ msgstr "" "Пожалуйста, удалите вашу текущую версию GTK и установите последнюю " "стабильную версию с %s" -#: ../src/gajim.py:64 -msgid "Please make sure that GTK+ and PyGTK have libglade support in your system." +#: ../src/gajim.py:169 +msgid "" +"Please make sure that GTK+ and PyGTK have libglade support in your system." msgstr "Пожалуйста, удостоверьтесь что GTK+ и PyGTK поддерживают libglade." -#: ../src/gajim.py:69 +#: ../src/gajim.py:174 msgid "Gajim needs PySQLite2 to run" msgstr "Gajim для запуска требуется PySQLite2" -#: ../src/gajim.py:77 +#: ../src/gajim.py:182 msgid "Gajim needs pywin32 to run" msgstr "Gajim для запуска требуется pywin32" -#: ../src/gajim.py:78 +#: ../src/gajim.py:183 #, python-format msgid "" "Please make sure that Pywin32 is installed on your system. You can get it at " "%s" -msgstr "Пожалуйста, удостоверьтесь что в вашей системе установлен Pywin32. Вы можете получить его на сайте: %s" +msgstr "" +"Пожалуйста, удостоверьтесь что в вашей системе установлен Pywin32. Вы можете " +"получить его на сайте: %s" #. set the icon to all newly opened wind -#: ../src/gajim.py:238 +#: ../src/gajim.py:328 msgid "Gajim is already running" msgstr "Gajim уже запущен" -#: ../src/gajim.py:239 +#: ../src/gajim.py:329 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -3852,76 +4542,173 @@ msgstr "" "По-видимому, уже запущен другой экземпляр Gajim\n" "Запустить ещё один?" -#: ../src/gajim.py:346 +#: ../src/gajim.py:352 ../src/common/connection_handlers.py:910 +#: ../src/common/connection_handlers.py:1624 +#: ../src/common/connection_handlers.py:1653 +#: ../src/common/connection_handlers.py:1663 +#: ../src/common/connection_handlers.py:1682 +#: ../src/common/connection_handlers.py:1919 +#: ../src/common/connection_handlers.py:2031 ../src/common/connection.py:1016 +msgid "Disk Write Error" +msgstr "Ошибка записи на диск" + +#: ../src/gajim.py:448 +msgid "Do you accept this request?" +msgstr "Вы принимаете этот запрос?" + +#: ../src/gajim.py:450 +#, python-format +msgid "Do you accept this request on account %s?" +msgstr "Вы принимаете запрос %s?" + +#: ../src/gajim.py:453 #, python-format msgid "HTTP (%s) Authorization for %s (id: %s)" msgstr "HTTP (%s) Авторизация для %s (id: %s)" -#: ../src/gajim.py:347 -msgid "Do you accept this request?" -msgstr "Вы принимаете этот запрос?" - -#: ../src/gajim.py:393 ../src/notify.py:430 +#: ../src/gajim.py:500 ../src/notify.py:466 msgid "Connection Failed" msgstr "Соединение разорвалось" -#: ../src/gajim.py:706 +#: ../src/gajim.py:834 #, python-format msgid "Subject: %s" msgstr "Тема: %s" #. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) -#: ../src/gajim.py:751 ../src/gajim.py:764 +#: ../src/gajim.py:881 ../src/gajim.py:894 #, python-format msgid "error while sending %s ( %s )" msgstr "ошибка при отправке %s ( %s )" -#: ../src/gajim.py:797 +#: ../src/gajim.py:927 msgid "Authorization accepted" msgstr "Авторизация принята" -#: ../src/gajim.py:798 +#: ../src/gajim.py:928 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "Контакт \"%s\" авторизовал вас, теперь вы можете видеть его статус." -#: ../src/gajim.py:806 +#: ../src/gajim.py:936 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Контакт \"%s\" отозвал подписку с вами" -#: ../src/gajim.py:807 +#: ../src/gajim.py:937 msgid "You will always see him or her as offline." msgstr "Вы всегда будете видеть его или её в оффлайне." -#: ../src/gajim.py:850 +#: ../src/gajim.py:981 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Связь с \"%s\" не может быть установлена" -#: ../src/gajim.py:851 ../src/common/connection.py:406 +#: ../src/gajim.py:982 ../src/common/connection.py:524 msgid "Check your connection or try again later." msgstr "Проверьте настройки сети или попробуйте еще раз позже." -#: ../src/gajim.py:999 ../src/roster_window.py:1197 +#: ../src/gajim.py:1152 ../src/groupchat_control.py:995 +#, python-format +msgid "%s is now known as %s" +msgstr "%s теперь известен как %s" + +#: ../src/gajim.py:1168 ../src/roster_window.py:1372 #, python-format msgid "%s is now %s (%s)" msgstr "%s %s (%s)" -#: ../src/gajim.py:1096 -msgid "Your passphrase is incorrect" -msgstr "Ваша парольная фраза неверна" +#. No status message +#: ../src/gajim.py:1171 ../src/groupchat_control.py:1146 +#: ../src/roster_window.py:1375 +#, python-format +msgid "%s is now %s" +msgstr "%s %s" -#: ../src/gajim.py:1097 +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/gajim.py:1292 ../src/groupchat_control.py:955 +msgid "Any occupant is allowed to see your full JID" +msgstr "Любой участник может увидеть ваш настоящий JID" + +#: ../src/gajim.py:1295 +msgid "Room now shows unavailable member" +msgstr "" + +#: ../src/gajim.py:1297 +msgid "room now does not show unavailable members" +msgstr "" + +#: ../src/gajim.py:1300 +msgid "A non-privacy-related room configuration change has occurred" +msgstr "" + +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#: ../src/gajim.py:1303 +msgid "Room logging is now enabled" +msgstr "Запись логов конференции включена" + +#: ../src/gajim.py:1305 +msgid "Room logging is now disabled" +msgstr "Запись логов конференции выключена" + +#: ../src/gajim.py:1307 +msgid "Room is now non-anonymous" +msgstr "Конференция не анонимна" + +#: ../src/gajim.py:1310 +msgid "Room is now semi-anonymous" +msgstr "Конференция частично анонимна" + +#: ../src/gajim.py:1313 +msgid "Room is now fully-anonymous" +msgstr "Конференция полностью анонимна" + +#: ../src/gajim.py:1345 +#, python-format +msgid "A Password is required to join the room %s. Please type it" +msgstr "Чтобы войти в комнату %s, нужен пароль." + +#: ../src/gajim.py:1379 +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 агента,но GPG агент не запущен или он " +"возвратил неверный пароль.\n" + +#: ../src/gajim.py:1381 msgid "You are currently connected without your OpenPGP key." msgstr "Вы сейчас соединены без OpenPGP ключа." -#: ../src/gajim.py:1199 +#: ../src/gajim.py:1384 +msgid "Your passphrase is incorrect" +msgstr "Ваша парольная фраза неверна" + +#: ../src/gajim.py:1396 ../src/secrets.py:44 +msgid "Passphrase Required" +msgstr "Требуется парольная фраза" + +#: ../src/gajim.py:1397 +#, python-format +msgid "Enter GPG key passphrase for account %s." +msgstr "Введите парольную фразу GPG для учетной записи %s" + +#: ../src/gajim.py:1409 +msgid "Wrong Passphrase" +msgstr "Неверная парольная фраза" + +#: ../src/gajim.py:1410 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "" +"Пожалуйста, введите парольную фразу для GPG еще раз или нажмите Отмена." + +#: ../src/gajim.py:1519 #, python-format msgid "New mail on %(gmail_mail_address)s" msgstr "Новое письмо на %(gmail_mail_address)s" -#: ../src/gajim.py:1201 +#: ../src/gajim.py:1521 #, python-format msgid "You have %d new mail conversation" msgid_plural "You have %d new mail conversations" @@ -3932,7 +4719,7 @@ msgstr[2] "У вас есть %d непрочитанных письма" #. FIXME: emulate Gtalk client popups. find out what they parse and how #. they decide what to show #. each message has a 'From', 'Subject' and 'Snippet' field -#: ../src/gajim.py:1210 +#: ../src/gajim.py:1530 #, python-format msgid "" "\n" @@ -3941,124 +4728,215 @@ msgstr "" "\n" "От: %(from_address)s" -#: ../src/gajim.py:1366 +#: ../src/gajim.py:1708 #, python-format msgid "%s wants to send you a file." msgstr "%s хочет отправить вам файл." -#: ../src/gajim.py:1431 +#: ../src/gajim.py:1773 #, python-format msgid "You successfully received %(filename)s from %(name)s." msgstr "Успешно получен файл %(filename)s от %(name)s." #. ft stopped -#: ../src/gajim.py:1435 +#: ../src/gajim.py:1777 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Передача файла %(filename)s от %(name)s приостановлена." -#: ../src/gajim.py:1448 +#: ../src/gajim.py:1790 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "%(name)s успешно получил отправленный вами файл %(filename)s." #. ft stopped -#: ../src/gajim.py:1452 +#: ../src/gajim.py:1794 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Передача файла %(filename)s к %(name)s приостановлена." -#: ../src/gajim.py:1558 +#: ../src/gajim.py:1889 +msgid "Session negotiation cancelled" +msgstr "" + +#: ../src/gajim.py:1890 +#, python-format +msgid "The client at %s cancelled the session negotiation." +msgstr "" + +#: ../src/gajim.py:1922 ../src/gajim.py:1966 +msgid "Confirm these session options" +msgstr "" + +#: ../src/gajim.py:1923 +#, python-format +msgid "" +"The remote client wants to negotiate an session with these features:\n" +"\n" +"\t\t%s\n" +"\n" +"\t\tAre these options acceptable?" +msgstr "" + +#: ../src/gajim.py:1967 +#, python-format +msgid "" +"The remote client selected these options:\n" +"\n" +"%s\n" +"\n" +"Continue with the session?" +msgstr "" + +#: ../src/gajim.py:2092 msgid "Username Conflict" msgstr "Такое имя уже есть" -#: ../src/gajim.py:1559 +#: ../src/gajim.py:2093 msgid "Please type a new username for your local account" -msgstr "Пожалуйста, введите новое имя пользователя для локальной учетной записи" +msgstr "" +"Пожалуйста, введите новое имя пользователя для локальной учетной записи" + +#: ../src/gajim.py:2110 +msgid "Ping?" +msgstr "" + +#: ../src/gajim.py:2118 +#, python-format +msgid "Pong! (%s s.)" +msgstr "" + +#: ../src/gajim.py:2124 +msgid "Error." +msgstr "" + +#: ../src/gajim.py:2149 +msgid "Resource Conflict" +msgstr "Такое имя уже есть" + +#: ../src/gajim.py:2150 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" +msgstr "" +"Вы уже подсоединены к этой учетной записи с таким же ресурсом. Введите " +"другой ресурс" + +#: ../src/gajim.py:2179 +msgid "Error verifying SSL certificate" +msgstr "" + +#: ../src/gajim.py:2180 +#, 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:2196 +msgid "SSL certificate error" +msgstr "" + +#: ../src/gajim.py:2197 +msgid "" +"It seems SSL certificate has changed or your connection is being hacked. Do " +"you still want to connect and update the fingerprintof the certificate?" +msgstr "" #. it is good to notify the user #. in case he or she cannot see the output of the console -#: ../src/gajim.py:1898 +#: ../src/gajim.py:2557 msgid "Could not save your settings and preferences" msgstr "Не могу сохранить ваши установки и настройки" -#: ../src/gajim.py:2090 +#. sorted alphanum +#: ../src/gajim.py:2693 ../src/common/config.py:102 +#: ../src/common/config.py:414 ../src/common/optparser.py:206 +#: ../src/common/optparser.py:424 ../src/common/optparser.py:458 +msgid "default" +msgstr "По_умолчанию" + +#: ../src/gajim.py:2779 msgid "Network Manager support not available" msgstr "Network Manager не используется" -#: ../src/gajim.py:2165 +#: ../src/gajim.py:2884 msgid "Session Management support not available (missing gnome.ui module)" -msgstr "Отсутствует поддержка управления сессиями (отсутствует модуль gnome.ui)" +msgstr "" +"Отсутствует поддержка управления сессиями (отсутствует модуль gnome.ui)" -#: ../src/gajim-remote.py:66 +#: ../src/gajim-remote.py:73 msgid "Shows a help on specific command" msgstr "Показывает помощь для конкретной команды" #. User gets help for the command, specified by this parameter -#: ../src/gajim-remote.py:69 +#: ../src/gajim-remote.py:76 msgid "command" msgstr "команда" -#: ../src/gajim-remote.py:70 +#: ../src/gajim-remote.py:77 msgid "show help on command" msgstr "показать помощь по команде" -#: ../src/gajim-remote.py:74 +#: ../src/gajim-remote.py:81 msgid "Shows or hides the roster window" msgstr "Скрывает или показывает окно ростера" -#: ../src/gajim-remote.py:78 -msgid "Popups a window with the next pending event" +#: ../src/gajim-remote.py:85 +msgid "Pops up a window with the next pending event" msgstr "Показывать окно со следующим непрочитанным сообщением" -#: ../src/gajim-remote.py:82 +#: ../src/gajim-remote.py:89 msgid "" -"Prints a list of all contacts in the roster. Each contact appear on a " +"Prints a list of all contacts in the roster. Each contact appears on a " "separate line" msgstr "" "Выводит список всех контактов в ростере. Каждый контакт будет в отдельной " "строке" -#: ../src/gajim-remote.py:84 ../src/gajim-remote.py:98 -#: ../src/gajim-remote.py:108 ../src/gajim-remote.py:121 -#: ../src/gajim-remote.py:135 ../src/gajim-remote.py:156 -#: ../src/gajim-remote.py:186 ../src/gajim-remote.py:195 -#: ../src/gajim-remote.py:202 ../src/gajim-remote.py:209 -#: ../src/gajim-remote.py:220 +#: ../src/gajim-remote.py:92 ../src/gajim-remote.py:107 +#: ../src/gajim-remote.py:117 ../src/gajim-remote.py:130 +#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:153 +#: ../src/gajim-remote.py:174 ../src/gajim-remote.py:204 +#: ../src/gajim-remote.py:213 ../src/gajim-remote.py:220 +#: ../src/gajim-remote.py:227 ../src/gajim-remote.py:238 +#: ../src/gajim-remote.py:254 ../src/gajim-remote.py:263 msgid "account" msgstr "Учетные записи" -#: ../src/gajim-remote.py:84 +#: ../src/gajim-remote.py:92 msgid "show only contacts of the given account" msgstr "показывать контакты только для данной учетной записи" -#: ../src/gajim-remote.py:89 +#: ../src/gajim-remote.py:98 msgid "Prints a list of registered accounts" msgstr "Показывает список зарегистрированных учетных записей" -#: ../src/gajim-remote.py:93 +#: ../src/gajim-remote.py:102 msgid "Changes the status of account or accounts" msgstr "Изменяет статус учетной записи или записей" #. offline, online, chat, away, xa, dnd, invisible should not be translated -#: ../src/gajim-remote.py:96 +#: ../src/gajim-remote.py:105 msgid "status" msgstr "статус" -#: ../src/gajim-remote.py:96 +#: ../src/gajim-remote.py:105 msgid "one of: offline, online, chat, away, xa, dnd, invisible " -msgstr "один из: отключен, в сети, чат, отошел, недоступен, не беспокоить, невидимка" +msgstr "" +"один из: отключен, в сети, чат, отошел, недоступен, не беспокоить, невидимка" -#: ../src/gajim-remote.py:97 ../src/gajim-remote.py:118 -#: ../src/gajim-remote.py:132 +#: ../src/gajim-remote.py:106 ../src/gajim-remote.py:127 +#: ../src/gajim-remote.py:141 ../src/gajim-remote.py:152 msgid "message" msgstr "сообщение" -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:106 msgid "status message" msgstr "сообщение сервера" -#: ../src/gajim-remote.py:98 +#: ../src/gajim-remote.py:107 msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" @@ -4067,19 +4945,19 @@ msgstr "" "изменить статус всех учетных записей, у которых установлена опция " "\"синхронизировать с глобальным статусом\"" -#: ../src/gajim-remote.py:104 +#: ../src/gajim-remote.py:113 msgid "Shows the chat dialog so that you can send messages to a contact" msgstr "Показывает окно беседы, чтобы вы могли отправлять сообщения контакту" -#: ../src/gajim-remote.py:106 +#: ../src/gajim-remote.py:115 msgid "JID of the contact that you want to chat with" msgstr "JID контакта, с которым вы хотели бы побеседовать" -#: ../src/gajim-remote.py:108 ../src/gajim-remote.py:186 +#: ../src/gajim-remote.py:117 ../src/gajim-remote.py:204 msgid "if specified, contact is taken from the contact list of this account" msgstr "если указано, контакт будет взят из контакт-листа этой учетной записи" -#: ../src/gajim-remote.py:113 +#: ../src/gajim-remote.py:122 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 " @@ -4089,27 +4967,31 @@ msgstr "" "учетная запись опциональны. Если вы хотите настроить лишь 'учетную запись', " "без 'OpenPGP ключа', просто установите 'OpenPGP ключ' в ''." -#: ../src/gajim-remote.py:117 ../src/gajim-remote.py:130 +#: ../src/gajim-remote.py:126 ../src/gajim-remote.py:139 msgid "JID of the contact that will receive the message" msgstr "JID контакта, который получит сообщение" -#: ../src/gajim-remote.py:118 ../src/gajim-remote.py:132 +#: ../src/gajim-remote.py:127 ../src/gajim-remote.py:141 +#: ../src/gajim-remote.py:152 msgid "message contents" msgstr "содержимое сообщения" -#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:128 ../src/gajim-remote.py:142 msgid "pgp key" msgstr "PGP ключ" -#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:128 ../src/gajim-remote.py:142 msgid "if specified, the message will be encrypted using this public key" -msgstr "если указано, сообщение будет зашифровано с использованием открытого ключа" +msgstr "" +"если указано, сообщение будет зашифровано с использованием открытого ключа" -#: ../src/gajim-remote.py:121 ../src/gajim-remote.py:135 +#: ../src/gajim-remote.py:130 ../src/gajim-remote.py:144 +#: ../src/gajim-remote.py:153 msgid "if specified, the message will be sent using this account" -msgstr "если указано, сообщение будет отправлено с использованием этой учетной записи" +msgstr "" +"если указано, сообщение будет отправлено с использованием этой учетной записи" -#: ../src/gajim-remote.py:126 +#: ../src/gajim-remote.py:135 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 " @@ -4119,138 +5001,173 @@ msgstr "" "учетная запись опциональны. Если вы хотите настроить лишь 'учетную запись', " "без 'OpenPGP ключа', просто установите 'OpenPGP ключ' в ''." -#: ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:140 msgid "subject" msgstr "тема" -#: ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:140 msgid "message subject" msgstr "тема сообщения" -#: ../src/gajim-remote.py:140 +#: ../src/gajim-remote.py:149 +msgid "Sends new message to a groupchat you've joined." +msgstr "" + +#: ../src/gajim-remote.py:151 +msgid "JID of the room that will receive the message" +msgstr "JID контакта, который получит сообщение" + +#: ../src/gajim-remote.py:158 msgid "Gets detailed info on a contact" msgstr "Получает детальную информацию о контакте" -#: ../src/gajim-remote.py:142 ../src/gajim-remote.py:155 -#: ../src/gajim-remote.py:185 ../src/gajim-remote.py:194 +#: ../src/gajim-remote.py:160 ../src/gajim-remote.py:173 +#: ../src/gajim-remote.py:203 ../src/gajim-remote.py:212 msgid "JID of the contact" msgstr "JID контакта" -#: ../src/gajim-remote.py:146 +#: ../src/gajim-remote.py:164 msgid "Gets detailed info on a account" msgstr "Получает детальную информацию о учетной записи" -#: ../src/gajim-remote.py:148 +#: ../src/gajim-remote.py:166 msgid "Name of the account" msgstr "Имя учетной записи" -#: ../src/gajim-remote.py:152 +#: ../src/gajim-remote.py:170 msgid "Sends file to a contact" msgstr "Отправляет контакту файл" -#: ../src/gajim-remote.py:154 +#: ../src/gajim-remote.py:172 msgid "file" msgstr "файл" -#: ../src/gajim-remote.py:154 +#: ../src/gajim-remote.py:172 msgid "File path" msgstr "Путь до файла" -#: ../src/gajim-remote.py:156 +#: ../src/gajim-remote.py:174 msgid "if specified, file will be sent using this account" -msgstr "если указано, файл будет отправлен с использованием этой учетной записи" +msgstr "" +"если указано, файл будет отправлен с использованием этой учетной записи" -#: ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:179 msgid "Lists all preferences and their values" msgstr "Показывает все параметры с их значениями" -#: ../src/gajim-remote.py:165 +#: ../src/gajim-remote.py:183 msgid "Sets value of 'key' to 'value'." msgstr "Присваивает 'ключу' в 'значение'" -#: ../src/gajim-remote.py:167 +#: ../src/gajim-remote.py:185 msgid "key=value" msgstr "ключ=значение" -#: ../src/gajim-remote.py:167 +#: ../src/gajim-remote.py:185 msgid "'key' is the name of the preference, 'value' is the value to set it to" -msgstr "'ключ' это название параметра, а 'значение' это то, что ему присваивают" +msgstr "" +"'ключ' это название параметра, а 'значение' это то, что ему присваивают" -#: ../src/gajim-remote.py:172 +#: ../src/gajim-remote.py:190 msgid "Deletes a preference item" msgstr "Удаляет параметр" -#: ../src/gajim-remote.py:174 +#: ../src/gajim-remote.py:192 msgid "key" msgstr "ключ" -#: ../src/gajim-remote.py:174 +#: ../src/gajim-remote.py:192 msgid "name of the preference to be deleted" msgstr "имя параметра, который нужно удалить" -#: ../src/gajim-remote.py:178 +#: ../src/gajim-remote.py:196 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Сохраняет текущее состояние настроек Gajim в файл .config" -#: ../src/gajim-remote.py:183 +#: ../src/gajim-remote.py:201 msgid "Removes contact from roster" msgstr "Удаляет контакт из ростера" -#: ../src/gajim-remote.py:192 +#: ../src/gajim-remote.py:210 msgid "Adds contact to roster" msgstr "Добавляет контакт в ростер" -#: ../src/gajim-remote.py:194 +#: ../src/gajim-remote.py:212 msgid "jid" msgstr "JID" -#: ../src/gajim-remote.py:195 +#: ../src/gajim-remote.py:213 msgid "Adds new contact to this account" msgstr "Добавляет новый контакт для данной учетной записи" -#: ../src/gajim-remote.py:200 +#: ../src/gajim-remote.py:218 msgid "Returns current status (the global one unless account is specified)" msgstr "" "Возвращает текущий статус (по умолчанию глобальный, если не указана учетная " "запись)" -#: ../src/gajim-remote.py:207 -msgid "Returns current status message(the global one unless account is specified)" +#: ../src/gajim-remote.py:225 +msgid "" +"Returns current status message(the global one unless account is specified)" msgstr "" "Возвращает текущий статус (по умолчанию глобальный, если не указана учетная " "запись)" -#: ../src/gajim-remote.py:214 -msgid "Returns number of unreaded messages" +#: ../src/gajim-remote.py:232 +msgid "Returns number of unread messages" msgstr "Возвращает количество непрочитанных сообщений" -#: ../src/gajim-remote.py:218 +#: ../src/gajim-remote.py:236 msgid "Opens 'Start Chat' dialog" msgstr "Открыть диалог «Начать беседу»" -#: ../src/gajim-remote.py:220 +#: ../src/gajim-remote.py:238 msgid "Starts chat, using this account" msgstr "Начать беседу с этой учетной записи" -#: ../src/gajim-remote.py:224 +#: ../src/gajim-remote.py:242 msgid "Sends custom XML" msgstr "Отправляет произвольный XML" -#: ../src/gajim-remote.py:226 +#: ../src/gajim-remote.py:244 msgid "XML to send" msgstr "Отправляемый XML" -#: ../src/gajim-remote.py:227 +#: ../src/gajim-remote.py:245 msgid "" "Account in which the xml will be sent; if not specified, xml will be sent to " "all accounts" msgstr "Учётная запись, из которой будет отправлен XML." -#: ../src/gajim-remote.py:249 +#: ../src/gajim-remote.py:251 +msgid "Handle a xmpp:/ uri" +msgstr "" + +#: ../src/gajim-remote.py:253 +msgid "uri" +msgstr "" + +#: ../src/gajim-remote.py:258 +msgid "Join a MUC room" +msgstr "" + +#: ../src/gajim-remote.py:260 +msgid "room" +msgstr "комната" + +#: ../src/gajim-remote.py:261 +msgid "nick" +msgstr "Ник" + +#: ../src/gajim-remote.py:262 +msgid "password" +msgstr "Пароль:" + +#: ../src/gajim-remote.py:285 msgid "Missing argument \"contact_jid\"" msgstr "Пропущен аргумент \"JID контакта\"" -#: ../src/gajim-remote.py:268 +#: ../src/gajim-remote.py:304 #, python-format msgid "" "'%s' is not in your roster.\n" @@ -4259,11 +5176,11 @@ msgstr "" "'%s' не в вашем ростере\n" "Пожалуйста, укажите учетную запись для отправки сообщения." -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:307 msgid "You have no active account" msgstr "У вас нет активной учетной записи" -#: ../src/gajim-remote.py:335 +#: ../src/gajim-remote.py:371 #, python-format msgid "" "Usage: %s %s %s \n" @@ -4272,16 +5189,16 @@ msgstr "" "Использование: %s %s %s \n" "\t %s" -#: ../src/gajim-remote.py:338 +#: ../src/gajim-remote.py:374 msgid "Arguments:" msgstr "Аргументы:" -#: ../src/gajim-remote.py:342 +#: ../src/gajim-remote.py:378 #, python-format msgid "%s not found" msgstr "%s не найден" -#: ../src/gajim-remote.py:346 +#: ../src/gajim-remote.py:382 #, python-format msgid "" "Usage: %s command [arguments]\n" @@ -4290,7 +5207,16 @@ msgstr "" "Использование: %s команда [аргумента]\n" "Команда одна из:\n" -#: ../src/gajim-remote.py:420 +#: ../src/gajim-remote.py:455 +#, python-format +msgid "" +"Too many arguments. \n" +"Type \"%s help %s\" for more info" +msgstr "" +"Много аргументов. \n" +"Наберите \"%s help %s\" для справки" + +#: ../src/gajim-remote.py:459 #, python-format msgid "" "Argument \"%s\" is not specified. \n" @@ -4299,135 +5225,152 @@ msgstr "" "Аргумент \"%s\" не задан. \n" "Наберите \"%s\" help \"%s\" для справки" -#: ../src/gajim_themes_window.py:60 +#: ../src/gajim-remote.py:477 +msgid "Wrong uri" +msgstr "Неверный хост" + +#: ../src/gajim_themes_window.py:67 msgid "Theme" msgstr "Тема" +#: ../src/gajim_themes_window.py:105 +msgid "You cannot make changes to the default theme" +msgstr "Вы не можете удалить вашу текущую тему" + +#: ../src/gajim_themes_window.py:106 +msgid "Please create a clean new theme with your desired name." +msgstr "" + #. don't confuse translators -#: ../src/gajim_themes_window.py:155 +#: ../src/gajim_themes_window.py:180 msgid "theme name" msgstr "имя тeмы" -#: ../src/gajim_themes_window.py:172 +#: ../src/gajim_themes_window.py:197 msgid "You cannot delete your current theme" msgstr "Вы не можете удалить вашу текущую тему" -#: ../src/gajim_themes_window.py:173 +#: ../src/gajim_themes_window.py:198 msgid "Please first choose another for your current theme." msgstr "Пожалуйста, выберите сначала другую тему." -#: ../src/groupchat_control.py:106 -msgid "Private Chat" -msgstr "Личная беседа" - -#: ../src/groupchat_control.py:106 -msgid "Private Chats" -msgstr "Личные беседы" - -#: ../src/groupchat_control.py:123 +#: ../src/groupchat_control.py:139 msgid "Sending private message failed" msgstr "Не удалось отправить личное сообщение" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:125 +#: ../src/groupchat_control.py:141 #, python-format msgid "You are no longer in group chat \"%s\" or \"%s\" has left." msgstr "Вы больше не находитесь в комнате \"%s\" или \"%s\" вышел." -#: ../src/groupchat_control.py:144 -msgid "Group Chat" -msgstr "Комната" - -#: ../src/groupchat_control.py:144 -msgid "Group Chats" -msgstr "Комнаты" - -#: ../src/groupchat_control.py:318 +#: ../src/groupchat_control.py:350 msgid "Insert Nickname" msgstr "Вставить ник" +#: ../src/groupchat_control.py:882 +msgid "Really send file?" +msgstr "Отправить файл?" + +#: ../src/groupchat_control.py:883 +#, python-format +msgid "If you send a file to %s, he/she will know your real Jabber ID." +msgstr "" + +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/groupchat_control.py:958 +msgid "Room logging is enabled" +msgstr "Запись логов конференции включена" + +#: ../src/groupchat_control.py:960 +msgid "A new room has been created" +msgstr "Новая комната была создана" + +#: ../src/groupchat_control.py:963 +msgid "The server has assigned or modified your roomnick" +msgstr "" + #. do not print 'kicked by None' -#: ../src/groupchat_control.py:831 +#: ../src/groupchat_control.py:969 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s выгнали из комнаты: %(reason)s" -#: ../src/groupchat_control.py:835 +#: ../src/groupchat_control.py:973 #, 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:842 +#: ../src/groupchat_control.py:980 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s запретили заходить в комнату: %(reason)s" -#: ../src/groupchat_control.py:846 +#: ../src/groupchat_control.py:984 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(who)s запретил %(nick)s заходить в комнату: %(reason)s" -#: ../src/groupchat_control.py:854 +#: ../src/groupchat_control.py:993 #, python-format msgid "You are now known as %s" msgstr "Вы теперь известны как %s" -#: ../src/groupchat_control.py:856 +#: ../src/groupchat_control.py:1029 ../src/groupchat_control.py:1033 +#: ../src/groupchat_control.py:1038 #, python-format -msgid "%s is now known as %s" -msgstr "%s теперь известен как %s" +msgid "%(nick)s has been removed from the room (%(reason)s)" +msgstr "%(nick)s выгнали из комнаты (%(reason)s)" -#: ../src/groupchat_control.py:936 +#: ../src/groupchat_control.py:1030 +msgid "affiliation changed" +msgstr "" + +#: ../src/groupchat_control.py:1035 +msgid "room configuration changed to members-only" +msgstr "" + +#: ../src/groupchat_control.py:1040 +msgid "system shutdown" +msgstr "" + +#: ../src/groupchat_control.py:1139 #, python-format msgid "%s has left" msgstr "%s ушел" -#: ../src/groupchat_control.py:941 +#: ../src/groupchat_control.py:1144 #, python-format msgid "%s has joined the group chat" msgstr "%s зашёл в комнату" -#. No status message -#: ../src/groupchat_control.py:943 ../src/roster_window.py:1200 -#, python-format -msgid "%s is now %s" -msgstr "%s %s" +#. Invalid Nickname +#. invalid char +#: ../src/groupchat_control.py:1257 ../src/groupchat_control.py:1536 +msgid "Invalid nickname" +msgstr "Неверное имя пользователя" -#: ../src/groupchat_control.py:1062 ../src/groupchat_control.py:1080 -#: ../src/groupchat_control.py:1173 ../src/groupchat_control.py:1190 +#: ../src/groupchat_control.py:1258 ../src/groupchat_control.py:1537 +msgid "The nickname has not allowed characters." +msgstr "В Jabber ID комнаты или сервера содержатся недопустимые символы." + +#: ../src/groupchat_control.py:1281 ../src/groupchat_control.py:1299 +#: ../src/groupchat_control.py:1383 ../src/groupchat_control.py:1400 #, python-format msgid "Nickname not found: %s" msgstr "Ник не обнаружен: %s" -#: ../src/groupchat_control.py:1096 +#: ../src/groupchat_control.py:1315 msgid "This group chat has no subject" msgstr "У этой комнаты нет темы" -#: ../src/groupchat_control.py:1109 +#: ../src/groupchat_control.py:1326 #, python-format msgid "Invited %(contact_jid)s to %(room_jid)s." msgstr "Пригласил %(contact_jid)s в %(room_jid)s." -#. %s is something the user wrote but it is not a jid so we inform -#: ../src/groupchat_control.py:1116 ../src/groupchat_control.py:1144 -#, python-format -msgid "%s does not appear to be a valid JID" -msgstr "%s не является нормальным JID" - -#: ../src/groupchat_control.py:1227 -#, python-format -msgid "No such command: /%s (if you want to send this, prefix it with /say)" -msgstr "" -"Нет такой команды: /%s (если вы хотите её просто передать, то добавьте к ней " -"префикс /say)" - -#: ../src/groupchat_control.py:1250 -#, python-format -msgid "Commands: %s" -msgstr "Команды: %s" - -#: ../src/groupchat_control.py:1252 +#: ../src/groupchat_control.py:1463 #, python-format msgid "" "Usage: /%s [reason], bans the JID from the group chat. The " @@ -4440,29 +5383,24 @@ msgstr "" "данный момент находится в комнате, то он/она/оно также будет выгнан. НЕ " "поддерживает пробелы в никах." -#: ../src/groupchat_control.py:1259 +#: ../src/groupchat_control.py:1470 #, python-format -msgid "Usage: /%s , opens a private chat window to the specified occupant." -msgstr "Использование: /%s <ник>, открывает окно привата с указанным посетителем." +msgid "" +"Usage: /%s , opens a private chat window with the specified " +"occupant." +msgstr "" +"Использование: /%s <ник>, открывает окно привата с указанным посетителем." -#: ../src/groupchat_control.py:1263 -#, python-format -msgid "Usage: /%s, clears the text window." -msgstr "Использование: /%s, очищает текстовое окно." - -#: ../src/groupchat_control.py:1265 +#: ../src/groupchat_control.py:1476 #, python-format msgid "" "Usage: /%s [reason], closes the current window or tab, displaying reason if " "specified." -msgstr "Использование: /%s [причина], закрывает текущее окно или вкладку, приводя причину, если она указана." +msgstr "" +"Использование: /%s [причина], закрывает текущее окно или вкладку, приводя " +"причину, если она указана." -#: ../src/groupchat_control.py:1268 -#, python-format -msgid "Usage: /%s, hide the chat buttons." -msgstr "Использование: /%s, скрывает кнопки беседы." - -#: ../src/groupchat_control.py:1271 +#: ../src/groupchat_control.py:1482 #, python-format msgid "" "Usage: /%s [reason], invites JID to the current group chat, optionally " @@ -4471,7 +5409,7 @@ msgstr "" "Использование: /%s [причина], приглашает JID в текущую комнату, с " "возможным указанием причины." -#: ../src/groupchat_control.py:1275 +#: ../src/groupchat_control.py:1486 #, python-format msgid "" "Usage: /%s @[/nickname], offers to join room@server optionally " @@ -4480,7 +5418,7 @@ msgstr "" "Использование: /%s <комната>@<сервер>[/ник], предлагает присоединиться к " "комната@сервер, с возможным указанием ника." -#: ../src/groupchat_control.py:1279 +#: ../src/groupchat_control.py:1490 #, python-format msgid "" "Usage: /%s [reason], removes the occupant specified by nickname " @@ -4490,118 +5428,126 @@ msgstr "" "Использование: /%s <ник> [причина], удаляет посетителя с указанным ником из " "комнаты с возможным указанием причины. НЕ поддерживает пробелы в нике." -#: ../src/groupchat_control.py:1284 +#: ../src/groupchat_control.py:1499 #, python-format msgid "" -"Usage: /%s , sends action to the current group chat. Use third " -"person. (e.g. /%s explodes.)" -msgstr "" -"Использование: /%s <действие>, совершает действие в текущей комнате. " -"Используйте третье лицо (например, «/%s взрывается».)" - -#: ../src/groupchat_control.py:1288 -#, python-format -msgid "" -"Usage: /%s [message], opens a private message windowand sends " +"Usage: /%s [message], opens a private message window and sends " "message to the occupant specified by nickname." msgstr "" "Использование: /%s <ник> [сообщение], открывает окно личной беседы и " "отсылает сообщение посетителю с указанным ником." -#: ../src/groupchat_control.py:1293 +#: ../src/groupchat_control.py:1504 #, python-format msgid "Usage: /%s , changes your nickname in current group chat." msgstr "Использование: /%s <ник>, меняет ваш ник в текущей комнате." -#: ../src/groupchat_control.py:1297 +#: ../src/groupchat_control.py:1508 #, python-format msgid "Usage: /%s , display the names of group chat occupants." msgstr "Использование: /%s, показывает список присутствующих в комнате." -#: ../src/groupchat_control.py:1301 +#: ../src/groupchat_control.py:1512 #, python-format msgid "Usage: /%s [topic], displays or updates the current group chat topic." -msgstr "Использование: /%s [тема], показывает или изменяет текущую тему комнаты." +msgstr "" +"Использование: /%s [тема], показывает или изменяет текущую тему комнаты." -#: ../src/groupchat_control.py:1304 +#: ../src/groupchat_control.py:1515 #, python-format -msgid "Usage: /%s , sends a message without looking for other commands." +msgid "" +"Usage: /%s , sends a message without looking for other commands." msgstr "" "Использование: /%s <сообщение>, отсылает сообщение без поиска других команд " "в нем." -#: ../src/groupchat_control.py:1307 -#, python-format -msgid "No help info for /%s" -msgstr "Нет подсказки для /%s" - -#: ../src/groupchat_control.py:1356 +#: ../src/groupchat_control.py:1621 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Вы точно хотите выйти из комнаты \"%s\"?" -#: ../src/groupchat_control.py:1358 -msgid "If you close this window, you will be disconnected from this group chat." +#: ../src/groupchat_control.py:1623 +msgid "" +"If you close this window, you will be disconnected from this group chat." msgstr "Если вы закроете это окно, то вы выйдете из этой комнаты." -#: ../src/groupchat_control.py:1362 ../src/roster_window.py:3962 +#: ../src/groupchat_control.py:1627 ../src/roster_window.py:4902 msgid "Do _not ask me again" msgstr "Не _переспрашивать" -#: ../src/groupchat_control.py:1396 +#: ../src/groupchat_control.py:1659 msgid "Changing Subject" msgstr "Изменяет тему" -#: ../src/groupchat_control.py:1397 +#: ../src/groupchat_control.py:1660 msgid "Please specify the new subject:" msgstr "Пожалуйста, введите новую тему:" -#: ../src/groupchat_control.py:1406 +#: ../src/groupchat_control.py:1669 msgid "Changing Nickname" msgstr "Изменяет ник" -#: ../src/groupchat_control.py:1407 +#: ../src/groupchat_control.py:1670 msgid "Please specify the new nickname you want to use:" msgstr "Пожалуйста, введите новый ник, который вы хотите использовать:" -#: ../src/groupchat_control.py:1432 +# смотря где вылазит меседж - нужно присмотреться +#. Ask for a reason +#: ../src/groupchat_control.py:1685 +#, fuzzy, python-format +msgid "Destroying %s" +msgstr "Удаление: %s" + +#: ../src/groupchat_control.py:1686 +msgid "" +"You are going to definitively destroy this room.\n" +"You may specify a reason below:" +msgstr "" +"Вы хотите уничтожить комнату.\n" +"Вы можете указать причину:" + +#: ../src/groupchat_control.py:1688 +msgid "You may also enter an alternate venue:" +msgstr "Альтернативная причина:" + +#: ../src/groupchat_control.py:1720 msgid "Bookmark already set" msgstr "Закладка уже установлена" -#: ../src/groupchat_control.py:1433 +#: ../src/groupchat_control.py:1721 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Комната \"%s\" уже есть в ваших закладках." -#: ../src/groupchat_control.py:1442 +#: ../src/groupchat_control.py:1730 msgid "Bookmark has been added successfully" msgstr "Закладка успешно добавлена" -#: ../src/groupchat_control.py:1443 +#: ../src/groupchat_control.py:1731 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "Вы можете управлять закладками через меню \"Действия\" в ростере." #. ask for reason -#: ../src/groupchat_control.py:1569 +#: ../src/groupchat_control.py:1883 #, python-format msgid "Kicking %s" msgstr "Кикнуть %s" -#: ../src/groupchat_control.py:1570 ../src/groupchat_control.py:1852 +#: ../src/groupchat_control.py:1884 ../src/groupchat_control.py:2184 msgid "You may specify a reason below:" msgstr "Вы можете указать причину ниже:" #. ask for reason -#: ../src/groupchat_control.py:1851 +#: ../src/groupchat_control.py:2183 #, python-format msgid "Banning %s" msgstr "Забанить %s" -#: ../src/gtkexcepthook.py:41 +#: ../src/gtkexcepthook.py:46 msgid "A programming error has been detected" msgstr "Обнаружена ошибка в программе" -#: ../src/gtkexcepthook.py:42 +#: ../src/gtkexcepthook.py:47 msgid "" "It probably is not fatal, but should be reported to the developers " "nonetheless." @@ -4609,83 +5555,98 @@ msgstr "" "Возможно это не так страшно, но все равно стоит сообщить об этом " "разработчикам." -#: ../src/gtkexcepthook.py:48 +#: ../src/gtkexcepthook.py:53 msgid "_Report Bug" msgstr "_Сообщить об ошибке" -#: ../src/gtkexcepthook.py:71 +#: ../src/gtkexcepthook.py:76 msgid "Details" msgstr "Детали" #. we talk about file -#: ../src/gtkgui_helpers.py:153 ../src/gtkgui_helpers.py:168 +#: ../src/gtkgui_helpers.py:162 ../src/gtkgui_helpers.py:177 #, python-format msgid "Error: cannot open %s for reading" msgstr "Ошибка: не могу открыть %s для чтения" -#: ../src/gtkgui_helpers.py:293 +#: ../src/gtkgui_helpers.py:347 msgid "Error reading file:" msgstr "Ошибка чтения файла:" -#: ../src/gtkgui_helpers.py:296 +#: ../src/gtkgui_helpers.py:350 msgid "Error parsing file:" msgstr "Ошибка обработки файла:" #. do not traceback (could be a permission problem) #. we talk about a file here -#: ../src/gtkgui_helpers.py:334 +#: ../src/gtkgui_helpers.py:387 #, python-format msgid "Could not write to %s. Session Management support will not work" msgstr "Не могу писать в %s. Управление сессиями будет недоступно" -#: ../src/gtkgui_helpers.py:728 +#. xmpp: is currently handled by another program, so ask the user +#: ../src/gtkgui_helpers.py:719 +msgid "Gajim is not the default Jabber client" +msgstr "Gajim не является основным jabber-клиентом" + +#: ../src/gtkgui_helpers.py:720 +msgid "Would you like to make Gajim the default Jabber client?" +msgstr "Вы хотите сделать Gajim основным jabber-клиентом?" + +#: ../src/gtkgui_helpers.py:721 +msgid "Always check to see if Gajim is the default Jabber client on startup" +msgstr "" +"Всегда проверять при запуске является ли Gajim основным jabber-клиентом" + +#: ../src/gtkgui_helpers.py:818 msgid "Extension not supported" msgstr "Расширение не поддерживается" -#: ../src/gtkgui_helpers.py:729 +#: ../src/gtkgui_helpers.py:819 #, 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:738 +#: ../src/gtkgui_helpers.py:828 msgid "Save Image as..." msgstr "Сохранить изображение как..." -#: ../src/history_manager.py:64 +#: ../src/history_manager.py:73 msgid "Cannot find history logs database" msgstr "Не могу найти базу данных истории" #. holds jid -#: ../src/history_manager.py:107 +#: ../src/history_manager.py:113 msgid "Contacts" msgstr "Контакты" #. holds time -#: ../src/history_manager.py:120 ../src/history_manager.py:160 -#: ../src/history_window.py:86 +#: ../src/history_manager.py:126 ../src/history_manager.py:166 +#: ../src/history_window.py:121 msgid "Date" msgstr "Дата" #. holds nickname -#: ../src/history_manager.py:126 ../src/history_manager.py:178 +#: ../src/history_manager.py:132 ../src/history_manager.py:184 msgid "Nickname" msgstr "Ник" #. holds message -#: ../src/history_manager.py:134 ../src/history_manager.py:166 -#: ../src/history_window.py:94 +#: ../src/history_manager.py:140 ../src/history_manager.py:172 +#: ../src/history_window.py:129 msgid "Message" msgstr "Сообщение" -#: ../src/history_manager.py:186 +#: ../src/history_manager.py:192 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" -msgstr "Вы хотите очистить базу данных? (КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ ЕСЛИ GAJIM ЗАПУЩЕН)" +msgstr "" +"Вы хотите очистить базу данных? (КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ ЕСЛИ GAJIM ЗАПУЩЕН)" -#: ../src/history_manager.py:188 +#: ../src/history_manager.py:194 msgid "" "Normally allocated database size will not be freed, it will just become " "reusable. If you really want to reduce database filesize, click YES, else " @@ -4699,235 +5660,300 @@ msgstr "" "\n" "Если вы нажали ДА, пожалуйста подождите..." -#: ../src/history_manager.py:400 +#: ../src/history_manager.py:406 msgid "Exporting History Logs..." msgstr "Экспортирую историю..." -#: ../src/history_manager.py:476 +#: ../src/history_manager.py:481 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s в %(time)s сказал: %(message)s\n" -#: ../src/history_manager.py:514 +#: ../src/history_manager.py:518 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:518 ../src/history_manager.py:554 +#: ../src/history_manager.py:522 ../src/history_manager.py:557 msgid "This is an irreversible operation." msgstr "Это необратимая операция" -#: ../src/history_manager.py:551 +#: ../src/history_manager.py:554 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:103 ../src/history_window.py:105 +#: ../src/history_window.py:209 ../src/history_window.py:211 #, python-format msgid "Conversation History with %s" msgstr "История %s" -#: ../src/history_window.py:261 +#: ../src/history_window.py:342 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s теперь %(status)s: %(status_msg)s" -#: ../src/history_window.py:265 ../src/notify.py:198 +#: ../src/history_window.py:346 ../src/notify.py:219 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s теперь %(status)s" -#: ../src/history_window.py:271 +#: ../src/history_window.py:352 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Статус установлен в: %(status)s: %(status_msg)s" -#: ../src/history_window.py:274 +#: ../src/history_window.py:355 #, python-format msgid "Status is now: %(status)s" msgstr "Статус установлен в: %(status)s" -#: ../src/message_window.py:273 +#: ../src/htmltextview.py:586 ../src/htmltextview.py:597 +msgid "Timeout loading image" +msgstr "Не могу загрузить изображение" + +#: ../src/htmltextview.py:607 +msgid "Image is too big" +msgstr "Изображение слишком большое" + +#: ../src/message_window.py:350 +msgid "Chats" +msgstr "Чаты" + +#: ../src/message_window.py:352 +msgid "Group Chats" +msgstr "Комнаты" + +#: ../src/message_window.py:354 +msgid "Private Chats" +msgstr "Личные беседы" + +#: ../src/message_window.py:356 msgid "Messages" msgstr "Сообщения" -#: ../src/message_window.py:274 +#: ../src/message_window.py:357 #, python-format msgid "%s - Gajim" msgstr "%s - Gajim" -#: ../src/notify.py:196 +#: ../src/negotiation.py:13 +msgid "- messages will be logged" +msgstr "- сообщения будут записаны в лог" + +#: ../src/negotiation.py:15 +msgid "- messages will not be logged" +msgstr "- сообщения не будут записаны в лог" + +#: ../src/negotiation.py:24 +msgid "OK to continue with negotiation?" +msgstr "" + +#: ../src/negotiation.py:25 +#, python-format +msgid "" +"You've begun an encrypted session with %s, but it can't be guaranteed that " +"you're talking directly to the person you think you are.\n" +"\n" +"You should speak with them directly (in person or on the phone) and confirm " +"that their Short Authentication String is identical to this one: %s\n" +"\n" +"Would you like to continue with the encrypted session?" +msgstr "" + +#: ../src/negotiation.py:31 +msgid "Yes, I verified the Short Authentication String" +msgstr "" + +#: ../src/notify.py:217 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s меняет статус" -#: ../src/notify.py:206 +#: ../src/notify.py:227 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s подключается" -#: ../src/notify.py:214 +#: ../src/notify.py:235 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s отключается" -#: ../src/notify.py:226 +#: ../src/notify.py:247 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Новое сообщение от %(nickname)s" -#: ../src/notify.py:234 +#: ../src/notify.py:255 #, python-format msgid "New Private Message from group chat %s" msgstr "Новое личное сообщение из комнаты %s" -#: ../src/notify.py:235 +#: ../src/notify.py:257 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:241 +#: ../src/notify.py:260 +#, python-format +msgid "Messaged by %(nickname)s" +msgstr "Новое сообщение от %(nickname)s" + +#: ../src/notify.py:266 #, python-format msgid "New Message from %(nickname)s" msgstr "Новое сообщение от %(nickname)s" -#: ../src/profile_window.py:72 ../src/profile_window.py:376 +#: ../src/profile_window.py:54 msgid "Retrieving profile..." msgstr "Получаю данные..." -#: ../src/profile_window.py:107 ../src/profile_window.py:203 -#: ../src/profile_window.py:212 ../src/profile_window.py:370 -msgid "Click to set your avatar" -msgstr "Установить свою аватару" +#: ../src/profile_window.py:107 ../src/roster_window.py:1914 +msgid "File is empty" +msgstr "Пустой файл" + +#: ../src/profile_window.py:110 ../src/roster_window.py:1917 +msgid "File does not exist" +msgstr "Файл не существует" #. keep identation -#: ../src/profile_window.py:136 +#. unknown format +#: ../src/profile_window.py:124 ../src/profile_window.py:140 +#: ../src/roster_window.py:1919 ../src/roster_window.py:1930 msgid "Could not load image" msgstr "Не могу загрузить изображение" -#: ../src/profile_window.py:238 +#: ../src/profile_window.py:250 msgid "Information received" msgstr "Информация получена" -#: ../src/profile_window.py:308 +#: ../src/profile_window.py:319 msgid "Without a connection you can not publish your contact information." msgstr "Необходимо присоединиться к серверу для обновления личной информации" -#: ../src/profile_window.py:320 +#: ../src/profile_window.py:331 msgid "Sending profile..." msgstr "Отправляю данные..." -#: ../src/profile_window.py:328 -msgid "Information published" -msgstr "Информация опубликована" - -#: ../src/profile_window.py:340 +#: ../src/profile_window.py:346 msgid "Information NOT published" msgstr "Информация НЕ опубликована" -#: ../src/profile_window.py:347 +#: ../src/profile_window.py:353 msgid "vCard publication failed" msgstr "Публикация vCard не удалась" -#: ../src/profile_window.py:348 +#: ../src/profile_window.py:354 msgid "" "There was an error while publishing your personal information, try again " "later." -msgstr "При публикации вашей личной информации произошла ошибка, попробуйте позже." +msgstr "" +"При публикации вашей личной информации произошла ошибка, попробуйте позже." -#: ../src/profile_window.py:374 -msgid "Without a connection, you can not get your contact information." -msgstr "Необходимо присоединиться к серверу для получения информации о контакте" - -#: ../src/roster_window.py:168 ../src/roster_window.py:223 +#: ../src/roster_window.py:194 ../src/roster_window.py:249 msgid "Merged accounts" msgstr "Объединенные учетные записи" -#: ../src/roster_window.py:340 ../src/common/helpers.py:42 +#: ../src/roster_window.py:370 ../src/roster_window.py:635 +#: ../src/roster_window.py:2145 ../src/common/contacts.py:312 +#: ../src/common/helpers.py:53 msgid "Observers" msgstr "Наблюдатели" -#: ../src/roster_window.py:686 ../src/roster_window.py:3133 +#. Make special context menu if group is Groupchats +#: ../src/roster_window.py:454 ../src/roster_window.py:459 +#: ../src/roster_window.py:1967 ../src/roster_window.py:1970 +#: ../src/roster_window.py:2640 ../src/roster_window.py:2643 +#: ../src/roster_window.py:2668 ../src/roster_window.py:4763 +#: ../src/roster_window.py:4765 ../src/common/commands.py:199 +#: ../src/common/contacts.py:102 ../src/common/helpers.py:53 +msgid "Groupchats" +msgstr "Комнаты" + +#: ../src/roster_window.py:784 ../src/roster_window.py:4012 msgid "You cannot join a group chat while you are invisible" msgstr "Вы не можете зайти в комнату, так как вы в режиме невидимости." #. new chat +#. single message #. for chat_with #. for single message -#: ../src/roster_window.py:878 ../src/systray.py:187 ../src/systray.py:192 +#. join gc +#: ../src/roster_window.py:1005 ../src/roster_window.py:1015 +#: ../src/roster_window.py:1024 ../src/systray.py:212 ../src/systray.py:217 +#: ../src/systray.py:223 #, python-format msgid "using account %s" msgstr "используя учетную запись %s" -#. the 'manage gc bookmarks' item is shown -#. below to avoid duplicate code #. add -#: ../src/roster_window.py:903 +#: ../src/roster_window.py:1031 #, python-format msgid "to %s account" msgstr "для учетной записи %s" #. disco -#: ../src/roster_window.py:908 +#: ../src/roster_window.py:1036 #, python-format msgid "using %s account" msgstr "учетной записи %s" +#: ../src/roster_window.py:1117 +msgid "_Manage Bookmarks..." +msgstr "Управление _закладками..." + #. profile, avatar -#: ../src/roster_window.py:983 +#: ../src/roster_window.py:1136 #, python-format msgid "of account %s" msgstr "для учетной записи %s" -#: ../src/roster_window.py:1003 -msgid "_Manage Bookmarks..." -msgstr "Управление _закладками..." - -#: ../src/roster_window.py:1032 +#: ../src/roster_window.py:1176 #, python-format msgid "for account %s" msgstr "для учетной записи %s" #. History manager -#: ../src/roster_window.py:1053 +#: ../src/roster_window.py:1200 msgid "History Manager" msgstr "Менеджер истории" -#: ../src/roster_window.py:1062 +#: ../src/roster_window.py:1209 msgid "_Join New Group Chat" msgstr "Войти в новую комнату" -#: ../src/roster_window.py:1380 ../src/roster_window.py:3326 -#: ../src/roster_window.py:3333 +#: ../src/roster_window.py:1576 ../src/roster_window.py:4217 +#: ../src/roster_window.py:4224 msgid "You have unread messages" msgstr "У вас есть непрочитанные сообщения" -#: ../src/roster_window.py:1381 +#: ../src/roster_window.py:1577 msgid "You must read them before removing this transport." msgstr "Просмотрите все ожидающие события перед удалением транспорта." -#: ../src/roster_window.py:1384 +#: ../src/roster_window.py:1580 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Транспорт \"%s\" будет удален" -#: ../src/roster_window.py:1385 +#: ../src/roster_window.py:1581 msgid "" -"You will no longer be able to send and receive messages to contacts from " +"You will no longer be able to send and receive messages from contacts using " "this transport." msgstr "" "У вас теперь не будет возможности приема и отправки сообщения контактам " "через этот транспорт." -#: ../src/roster_window.py:1388 +#: ../src/roster_window.py:1584 msgid "Transports will be removed" msgstr "Транспорты будут удалены" -#: ../src/roster_window.py:1393 +#: ../src/roster_window.py:1589 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " @@ -4937,114 +5963,150 @@ msgstr "" "транспорты:%s." #. it's jid -#: ../src/roster_window.py:1413 +#: ../src/roster_window.py:1755 msgid "Rename Contact" msgstr "Переименовать контакт" -#: ../src/roster_window.py:1414 +#: ../src/roster_window.py:1756 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Введите новый ник для контакта %s" -#: ../src/roster_window.py:1421 +#: ../src/roster_window.py:1763 msgid "Rename Group" msgstr "Переименовать группу" -#: ../src/roster_window.py:1422 +#: ../src/roster_window.py:1764 #, python-format msgid "Enter a new name for group %s" msgstr "Введите новое название для группы %s" -#: ../src/roster_window.py:1476 +#: ../src/roster_window.py:1839 msgid "Remove Group" msgstr "Удалить группу" -#: ../src/roster_window.py:1477 +#: ../src/roster_window.py:1840 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Вы точно хотите удалить группу %s из ростера?" -#: ../src/roster_window.py:1478 +#: ../src/roster_window.py:1841 msgid "Remove also all contacts in this group from your roster" msgstr "Удалить из ростера все контакты в этой группе" -#: ../src/roster_window.py:1502 +#: ../src/roster_window.py:1872 msgid "Assign OpenPGP Key" msgstr "Назначить OpenPGP ключ" -#: ../src/roster_window.py:1503 +#: ../src/roster_window.py:1873 msgid "Select a key to apply to the contact" msgstr "Выберите ключ, который будет применен к контакту" -#: ../src/roster_window.py:1784 ../src/roster_window.py:1960 -msgid "_New group chat" -msgstr "_Новая комната" +#: ../src/roster_window.py:2191 +msgid "_New Group Chat" +msgstr "В новую комнату" -#: ../src/roster_window.py:1842 +#: ../src/roster_window.py:2331 msgid "I would like to add you to my roster" msgstr "Вы не против, если я добавлю Вас к себе в ростер?" -#: ../src/roster_window.py:2005 ../src/roster_window.py:2052 +#. Send Group Message +#: ../src/roster_window.py:2465 ../src/roster_window.py:2677 msgid "Send Group M_essage" msgstr "_Отправить сообщение группе" -#: ../src/roster_window.py:2031 -msgid "Re_name" -msgstr "П_ереименовать" +#: ../src/roster_window.py:2484 +msgid "_New group chat" +msgstr "_Новая комната" -#: ../src/roster_window.py:2058 +#. Manage Transport submenu +#: ../src/roster_window.py:2522 +msgid "_Manage Contacts" +msgstr "_Управление контактами" + +#: ../src/roster_window.py:2583 +msgid "_Maximize" +msgstr "" + +#: ../src/roster_window.py:2590 +#, fuzzy +msgid "_Disconnect" +msgstr "Контакт отключился" + +#: ../src/roster_window.py:2669 +msgid "_Maximize All" +msgstr "" + +#: ../src/roster_window.py:2685 msgid "To all users" msgstr "Всем пользователям" -#: ../src/roster_window.py:2061 +#: ../src/roster_window.py:2688 msgid "To all online users" msgstr "Всем, кто подключён" -#: ../src/roster_window.py:2097 +#. Log Off +#: ../src/roster_window.py:2805 +msgid "_Log off" +msgstr "_Отключиться" + +#. Log on +#: ../src/roster_window.py:2811 msgid "_Log on" msgstr "_Соединиться" -#: ../src/roster_window.py:2107 -msgid "Log _off" -msgstr "_Отключиться" +#. Send single message +#: ../src/roster_window.py:2823 +msgid "Send Single Message" +msgstr "О_тправить одиночное сообщение" -#: ../src/roster_window.py:2229 ../src/roster_window.py:2300 +#. Manage Transport submenu +#: ../src/roster_window.py:2870 +msgid "_Manage Transport" +msgstr "_Управление транспортом" + +#. Modify Transport +#: ../src/roster_window.py:2878 +msgid "_Modify Transport" +msgstr "_Изменить транспорт" + +#: ../src/roster_window.py:2992 ../src/roster_window.py:3066 msgid "_Change Status Message" msgstr "_Изменить сообщение о статусе" -#: ../src/roster_window.py:2372 +#: ../src/roster_window.py:3138 msgid "Authorization has been sent" msgstr "Была отправлена авторизация" -#: ../src/roster_window.py:2373 +#: ../src/roster_window.py:3139 #, python-format msgid "Now \"%s\" will know your status." msgstr "Теперь \"%s\" будет знать о вашем статусе." -#: ../src/roster_window.py:2393 +#: ../src/roster_window.py:3159 msgid "Subscription request has been sent" msgstr "Был отправлен запрос на подписку " -#: ../src/roster_window.py:2394 +#: ../src/roster_window.py:3160 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Если \"%s\" примет ваш запрос, вы будете знать его или её статус" -#: ../src/roster_window.py:2406 +#: ../src/roster_window.py:3172 msgid "Authorization has been removed" msgstr "Авторизация была удалена" -#: ../src/roster_window.py:2407 +#: ../src/roster_window.py:3173 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Теперь \"%s\" всегда будет видеть вас в оффлайне." -#: ../src/roster_window.py:2615 +#: ../src/roster_window.py:3407 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Контакт \"%s\" будет удален из вашего ростера" -#: ../src/roster_window.py:2619 +#: ../src/roster_window.py:3411 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." @@ -5052,7 +6114,7 @@ msgstr "" "Удаляя контакт, вы одновременно удалите авторизацию, и этот человек больше " "не сможет видеть ваш статус." -#: ../src/roster_window.py:2624 +#: ../src/roster_window.py:3416 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." @@ -5060,16 +6122,16 @@ msgstr "" "Если вы удалите контакт, вы так же удалите и авторизацию. Вы будете видеть " "его или её всегда в оффлайне." -#: ../src/roster_window.py:2627 +#: ../src/roster_window.py:3419 msgid "I want this contact to know my status after removal" msgstr "Я хочу, чтобы этот контакт видел мой статус после удаления" #. several contact to remove at the same time -#: ../src/roster_window.py:2631 +#: ../src/roster_window.py:3423 msgid "Contacts will be removed from your roster" msgstr "Контакты будут удалены из вашего ростера" -#: ../src/roster_window.py:2635 +#: ../src/roster_window.py:3427 #, python-format msgid "" "By removing these contacts:%s\n" @@ -5079,40 +6141,28 @@ msgstr "" "Одновременно вы удалите и авторизацию, то есть они всегда будут видеть вас в " "оффлайне." -#. TODO: make this string translatable +#: ../src/roster_window.py:3454 +msgid "" +"Gnome Keyring is installed but not correctly started (environment variable " +"probably not correctly set)" +msgstr "" + +#: ../src/roster_window.py:3473 +msgid "GPG is not usable" +msgstr "" + #. %s is the account name here -#: ../src/roster_window.py:2693 ../src/common/connection.py:587 -#: ../src/common/zeroconf/connection_zeroconf.py:158 +#: ../src/roster_window.py:3474 ../src/common/connection_handlers.py:2157 +#: ../src/common/zeroconf/connection_zeroconf.py:170 #, python-format msgid "You will be connected to %s without OpenPGP." msgstr "Вы будете подключены к %s без использования OpenPGP." -#: ../src/roster_window.py:2710 -msgid "Passphrase Required" -msgstr "Требуется парольная фраза" - -#: ../src/roster_window.py:2711 -#, python-format -msgid "Enter GPG key passphrase for account %s." -msgstr "Введите парольную фразу GPG для учетной записи %s" - -#: ../src/roster_window.py:2716 -msgid "Save passphrase" -msgstr "Сохранить парольную фразу (небезопасно)" - -#: ../src/roster_window.py:2724 -msgid "Wrong Passphrase" -msgstr "Неверная парольная фраза" - -#: ../src/roster_window.py:2725 -msgid "Please retype your GPG passphrase or press Cancel." -msgstr "Пожалуйста, введите парольную фразу для GPG еще раз или нажмите Отмена." - -#: ../src/roster_window.py:2782 ../src/roster_window.py:2842 +#: ../src/roster_window.py:3545 ../src/roster_window.py:3623 msgid "You are participating in one or more group chats" msgstr "Вы находитесь в одной или более комнатах" -#: ../src/roster_window.py:2783 ../src/roster_window.py:2843 +#: ../src/roster_window.py:3546 ../src/roster_window.py:3624 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" @@ -5120,20 +6170,21 @@ msgstr "" "Переход в состояние невидимости приведет к выходу из этих комнат. Вы точно " "хотите стать невидимым?" -#: ../src/roster_window.py:2800 +#: ../src/roster_window.py:3580 msgid "No account available" msgstr "Нет доступной учетной записи" -#: ../src/roster_window.py:2801 +#: ../src/roster_window.py:3581 msgid "You must create an account before you can chat with other contacts." -msgstr "Для начала беседы с другими людьми прежде необходимо создать учетную запись." +msgstr "" +"Для начала беседы с другими людьми прежде необходимо создать учетную запись." -#: ../src/roster_window.py:2899 +#: ../src/roster_window.py:3730 #, python-format msgid "\"%(title)s\" by %(artist)s" msgstr "%(artist)s \"%(title)s\"" -#: ../src/roster_window.py:3327 ../src/roster_window.py:3334 +#: ../src/roster_window.py:4218 ../src/roster_window.py:4225 msgid "" "Messages will only be available for reading them later if you have history " "enabled." @@ -5141,133 +6192,193 @@ msgstr "" "Сообщения будут доступны для чтения позже если у вас активирована опция " "истории." -#: ../src/roster_window.py:3912 +#: ../src/roster_window.py:4849 msgid "Metacontacts storage not supported by your server" msgstr "Сервер не умеет хранить метаконтакты" -#: ../src/roster_window.py:3914 +#: ../src/roster_window.py:4851 msgid "" "Your server does not support storing metacontacts information. So those " -"information will not be save on next reconnection." +"information will not be saved on next reconnection." msgstr "" "Ваш сервер не умеет хранить данные о метаконтактах. Они будут утеряны при " "следующем подключении." -#: ../src/roster_window.py:3956 -msgid "You are about to create a metacontact. Are you sure you want to continue?" +#: ../src/roster_window.py:4896 +msgid "" +"You are about to create a metacontact. Are you sure you want to continue?" msgstr "Вы хотите создать метаконтакт?" -#: ../src/roster_window.py:3958 +#: ../src/roster_window.py:4898 msgid "" -"Metacontacts are a way to regroup several contacts in one line. Generaly it " +"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 "Метаконтакты это метод группировки нескольких контактов в одну запись. Обычно это используется когда один и тот же человек имеет несколько аккаунтов в Jabber или на транспортах." +msgstr "" +"Метаконтакты это метод группировки нескольких контактов в одну запись. " +"Обычно это используется когда один и тот же человек имеет несколько " +"аккаунтов в Jabber или на транспортах." -#: ../src/roster_window.py:4125 -#, python-format -msgid "Drop %s in group %s" -msgstr "Сбросить %s в группе %s" +#: ../src/roster_window.py:4993 +msgid "Invalid file URI:" +msgstr "Неверный файл:" -#: ../src/roster_window.py:4132 -#, python-format -msgid "Make %s and %s metacontacts" -msgstr "Сделать %s и %s метаконтактами" +#: ../src/roster_window.py:5004 +#, fuzzy, python-format +msgid "Do you want to send this file to %s:" +msgid_plural "Do you want to send those files to %s:" +msgstr[0] "%s хочет отправить вам файл:" +msgstr[1] "%s хочет отправить вам файл:" +msgstr[2] "%s хочет отправить вам файл:" -#: ../src/roster_window.py:4319 +#: ../src/roster_window.py:5332 msgid "Change Status Message..." msgstr "Изменить сообщение о статусе..." -#: ../src/systray.py:144 +#: ../src/search_window.py:91 +msgid "Waiting for results" +msgstr "" + +#: ../src/search_window.py:131 ../src/search_window.py:209 +msgid "Error in received dataform" +msgstr "" + +#. No result +#: ../src/search_window.py:165 ../src/search_window.py:201 +msgid "No result" +msgstr "" + +#: ../src/secrets.py:45 +msgid "" +"To continue, Gajim needs to access your stored secrets. Enter your passphrase" +msgstr "" + +#: ../src/secrets.py:89 +msgid "Confirm Passphrase" +msgstr "Подтверждение парольной фразы" + +#: ../src/secrets.py:90 +msgid "Enter your new passphrase again for confirmation" +msgstr "Введите снова для подтверждения" + +#: ../src/secrets.py:95 ../src/secrets.py:107 +msgid "Create Passphrase" +msgstr "Создать парольную фразу" + +#: ../src/secrets.py:96 +msgid "Passphrases did not match.\n" +msgstr "Пароли не совпадают.\n" + +#: ../src/secrets.py:97 ../src/secrets.py:108 +msgid "Gajim needs you to create a passphrase to encrypt stored secrets" +msgstr "" + +#: ../src/systray.py:169 msgid "_Change Status Message..." msgstr "_Изменить сообщение о статусе..." -#: ../src/systray.py:234 +#: ../src/systray.py:254 msgid "Hide this menu" msgstr "Скрыть это меню" -#: ../src/tooltips.py:309 ../src/tooltips.py:492 +#: ../src/tooltips.py:316 ../src/tooltips.py:509 msgid "Jabber ID: " msgstr "Jabber ID: " -#: ../src/tooltips.py:312 ../src/tooltips.py:496 +#: ../src/tooltips.py:319 ../src/tooltips.py:513 msgid "Resource: " msgstr "Ресурс: " -#: ../src/tooltips.py:317 +#: ../src/tooltips.py:324 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s этой комнаты" -#: ../src/tooltips.py:430 ../src/tooltips.py:610 +#: ../src/tooltips.py:422 +msgid " [blocked]" +msgstr "" + +#: ../src/tooltips.py:426 +msgid " [minimized]" +msgstr "" + +#: ../src/tooltips.py:441 ../src/tooltips.py:629 msgid "Status: " msgstr "Статус: " -#: ../src/tooltips.py:461 +#: ../src/tooltips.py:471 #, python-format msgid "Last status: %s" msgstr "Последний статус: %s" -#: ../src/tooltips.py:463 +#: ../src/tooltips.py:473 #, python-format msgid " since %s" msgstr " с %s" +#: ../src/tooltips.py:491 +msgid "Connected" +msgstr "Соединение" + +#: ../src/tooltips.py:493 +msgid "Disconnected" +msgstr "Контакт отключился" + #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:502 +#: ../src/tooltips.py:520 msgid "Subscription: " msgstr "Подписка: " -#: ../src/tooltips.py:512 +#: ../src/tooltips.py:530 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:566 +#: ../src/tooltips.py:585 msgid "Download" msgstr "Загрузить" -#: ../src/tooltips.py:572 +#: ../src/tooltips.py:591 msgid "Upload" msgstr "Upload" -#: ../src/tooltips.py:579 +#: ../src/tooltips.py:598 msgid "Type: " msgstr "Тип: " -#: ../src/tooltips.py:585 +#: ../src/tooltips.py:604 msgid "Transferred: " msgstr "Передано: " -#: ../src/tooltips.py:588 ../src/tooltips.py:609 +#: ../src/tooltips.py:607 ../src/tooltips.py:628 msgid "Not started" msgstr "Не начато" -#: ../src/tooltips.py:592 +#: ../src/tooltips.py:611 msgid "Stopped" msgstr "Остановлено" -#: ../src/tooltips.py:594 ../src/tooltips.py:597 +#: ../src/tooltips.py:613 ../src/tooltips.py:616 msgid "Completed" msgstr "Завершено" -#: ../src/tooltips.py:601 +#: ../src/tooltips.py:620 msgid "?transfer status:Paused" msgstr "Приостановлено" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:605 +#: ../src/tooltips.py:624 msgid "Stalled" msgstr "Ожидание" -#: ../src/tooltips.py:607 +#: ../src/tooltips.py:626 msgid "Transferring" msgstr "Передается" -#: ../src/tooltips.py:639 +#: ../src/tooltips.py:662 msgid "This service has not yet responded with detailed information" msgstr "Этот сервис еще не сообщил информацию о себе" -#: ../src/tooltips.py:642 +#: ../src/tooltips.py:665 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -5275,24 +6386,24 @@ msgstr "" "Этот сервис не может предоставить информацию о себе . \n" "Похоже что он или неверно настроен или сломан" -#: ../src/vcard.py:217 +#: ../src/vcard.py:245 msgid "?Client:Unknown" msgstr "Неизвестен" -#: ../src/vcard.py:219 +#: ../src/vcard.py:247 msgid "?OS:Unknown" msgstr "Неизвестна" -#: ../src/vcard.py:247 ../src/vcard.py:449 +#: ../src/vcard.py:272 ../src/vcard.py:282 ../src/vcard.py:472 #, python-format msgid "since %s" msgstr "с %s" -#: ../src/vcard.py:277 +#: ../src/vcard.py:311 msgid "Affiliation:" msgstr "Ранг:" -#: ../src/vcard.py:285 +#: ../src/vcard.py:319 msgid "" "This contact is interested in your presence information, but you are not " "interested in his/her presence" @@ -5300,7 +6411,7 @@ msgstr "" "Этот контакт хочет знать о вашем присутствии, но вам информация о его или её " "присутствии не интересна" -#: ../src/vcard.py:287 +#: ../src/vcard.py:321 msgid "" "You are interested in the contact's presence information, but he/she is not " "interested in yours" @@ -5308,83 +6419,155 @@ msgstr "" "Вам хочется получать информацию о присутствии контакта, но он или она не " "заинтересована в вашей." -#: ../src/vcard.py:289 +#: ../src/vcard.py:323 msgid "You and the contact are interested in each other's presence information" msgstr "Вы и контакт оба желаете знать о присутствии друг друга" #. None -#: ../src/vcard.py:291 +#: ../src/vcard.py:325 msgid "" "You are not interested in the contact's presence, and neither he/she is " "interested in yours" msgstr "Ни вы, ни ваш контакт не желаете знать о присутствии друг друга" -#: ../src/vcard.py:299 +#: ../src/vcard.py:333 msgid "You are waiting contact's answer about your subscription request" msgstr "Вы ожидаете ответа контакта на запрос на подписку" -#: ../src/vcard.py:311 ../src/vcard.py:338 ../src/vcard.py:482 +#: ../src/vcard.py:337 ../src/vcard.py:374 ../src/vcard.py:497 msgid " resource with priority " msgstr " ресурс с приоритетом " -#: ../src/common/check_paths.py:33 +#: ../src/common/check_paths.py:38 msgid "creating logs database" msgstr "создается БД истории" -#: ../src/common/check_paths.py:89 ../src/common/check_paths.py:100 -#: ../src/common/check_paths.py:107 +#: ../src/common/check_paths.py:101 ../src/common/check_paths.py:112 +#: ../src/common/check_paths.py:119 #, python-format -msgid "%s is file but it should be a directory" +msgid "%s is a file but it should be a directory" msgstr "%s должен быть директорией, а не файлом" -#: ../src/common/check_paths.py:90 ../src/common/check_paths.py:101 -#: ../src/common/check_paths.py:108 ../src/common/check_paths.py:116 +#: ../src/common/check_paths.py:102 ../src/common/check_paths.py:113 +#: ../src/common/check_paths.py:120 ../src/common/check_paths.py:128 msgid "Gajim will now exit" msgstr "Закончить работу" -#: ../src/common/check_paths.py:115 +#: ../src/common/check_paths.py:127 #, python-format -msgid "%s is directory but should be file" +msgid "%s is a directory but should be a file" msgstr "%s должен быть файлом, а не директорией" -#: ../src/common/check_paths.py:131 +#: ../src/common/check_paths.py:143 #, python-format msgid "creating %s directory" msgstr "создается директория %s" -#: ../src/common/config.py:55 +#: ../src/common/commands.py:74 +msgid "Change status information" +msgstr "Изменить информацию о статусе" + +#: ../src/common/commands.py:87 +msgid "Change status" +msgstr "Контакт изменит статус" + +#: ../src/common/commands.py:88 +msgid "Set the presence type and description" +msgstr "Установка статуса и статусного сообщения" + +#: ../src/common/commands.py:94 +msgid "Free for chat" +msgstr "Готов поболтать" + +#: ../src/common/commands.py:95 +msgid "Online" +msgstr "В сети" + +#: ../src/common/commands.py:97 +msgid "Extended away" +msgstr "" + +#: ../src/common/commands.py:98 +msgid "Do not disturb" +msgstr "Не беспокоить." + +#: ../src/common/commands.py:99 +msgid "Offline - disconnect" +msgstr "" + +#: ../src/common/commands.py:104 +#, fuzzy +msgid "Presence description:" +msgstr "Описание ошибки..." + +#: ../src/common/commands.py:139 +msgid "The status has been changed." +msgstr "Статус изменён." + +#: ../src/common/commands.py:170 ../src/common/commands.py:194 +msgid "Leave Groupchats" +msgstr "Покинуть конференции" + +#: ../src/common/commands.py:184 +#, python-format +msgid "%(nickname)s on %(room_jid)s" +msgstr "%(nickname)s из комнаты %(room_jid)s" + +#: ../src/common/commands.py:188 +msgid "You have not joined a groupchat." +msgstr "Вы не вошли в комнату." + +#: ../src/common/commands.py:195 +msgid "Choose the groupchats you want to leave" +msgstr "Выберите конференции которые вы хотите покинуть" + +#: ../src/common/commands.py:235 +msgid "You left the following groupchats:" +msgstr "Вы покинули следующие комнаты:" + +#: ../src/common/commands.py:247 +msgid "Forward unread messages" +msgstr "Переслать непрочитанные сообщения" + +#: ../src/common/commands.py:267 +msgid "All unread messages have been forwarded." +msgstr "Все непрочитанные сообщения отправлены." + +#: ../src/common/config.py:74 msgid "Use D-Bus and Notification-Daemon to show notifications" msgstr "Использовать DBus и Notification Daemon для показа уведомлений" -#: ../src/common/config.py:60 +#: ../src/common/config.py:79 msgid "Time in minutes, after which your status changes to away." msgstr "Время в минутах, после которого ваш статус изменится на Отошел." -#: ../src/common/config.py:61 +#: ../src/common/config.py:80 msgid "Away as a result of being idle" msgstr "Автостатус 'Отошел' из-за бездействия пользователя." -#: ../src/common/config.py:63 +#: ../src/common/config.py:82 msgid "Time in minutes, after which your status changes to not available." msgstr "Время в минутах, после которого ваш статус изменится на Недоступен." -#: ../src/common/config.py:64 +#: ../src/common/config.py:83 msgid "Not available as a result of being idle" msgstr "Автостатус 'Недоступен' из-за бездействия пользователя." -#: ../src/common/config.py:82 -msgid "List (space separated) of rows (accounts and groups) that are collapsed." -msgstr "Список (через пробел) строк (учётных записей и групп), которые свёрнуты." +#: ../src/common/config.py:101 +msgid "" +"List (space separated) of rows (accounts and groups) that are collapsed." +msgstr "" +"Список (через пробел) строк (учётных записей и групп), которые свёрнуты." -#: ../src/common/config.py:87 +#: ../src/common/config.py:106 msgid "Enable link-local/zeroconf messaging" msgstr "" -#: ../src/common/config.py:90 +#: ../src/common/config.py:109 msgid "Language used by speller" msgstr "Язык, используемый при проверке правописания" -#: ../src/common/config.py:91 +#: ../src/common/config.py:110 msgid "" "'always' - print time for every message.\n" "'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" @@ -5394,46 +6577,87 @@ msgstr "" "\"иногда\" - печатать время каждые несколько минут.\n" "\"никогда\" - не печатать время." -#: ../src/common/config.py:92 +#: ../src/common/config.py:111 msgid "" "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " -"to disable fuzzyclock. 1 is the most precise clock, 4 the less precise one. " +"to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " "This is used only if print_time is 'sometimes'." -msgstr "Печатать время в беседе как в неточных часах. Степень неточности может быть от 1 до 4, 0 отключает эту функцию. 1 самые точные часы, 4 самые неточные. Используется только если режим печати времени установлен на \"иногда\"." +msgstr "" +"Печатать время в беседе как в неточных часах. Степень неточности может быть " +"от 1 до 4, 0 отключает эту функцию. 1 самые точные часы, 4 самые неточные. " +"Используется только если режим печати времени установлен на \"иногда\"." -#: ../src/common/config.py:95 +#: ../src/common/config.py:114 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Обрабатывать пары * / _ как возможные форматирующие символы." -#: ../src/common/config.py:96 -msgid "If True, do not remove */_ . So *abc* will be bold but with * * not removed." +#: ../src/common/config.py:115 +msgid "" +"If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" "Если True, то не будут удаляться */_. Так что *фыва* будет написано " "полужирным шрифтом, но * * удалены не будут" -#: ../src/common/config.py:99 +#: ../src/common/config.py:118 msgid "" -"Uses ReStructured text markup for HTML, plus ascii formatting if selected. " -"(If you want to use this, install docutils)" +"Uses ReStructured text markup to send HTML, plus ascii formatting if " +"selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" +"restructuredtext.html (If you want to use this, install docutils)" msgstr "" -#: ../src/common/config.py:108 +#: ../src/common/config.py:127 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." -msgstr "Символ, который нужно добавлять к нику, когда используется дополнение (tab) в комнате." +msgstr "" +"Символ, который нужно добавлять к нику, когда используется дополнение (tab) " +"в комнате." -#: ../src/common/config.py:109 +#: ../src/common/config.py:128 msgid "" "Character to propose to add after desired nickname when desired nickname is " "used by someone else in group chat." -msgstr "Символ, который будет добавляться после ника, когда желаемый ник уже занят кем-нибудь в комнате." +msgstr "" +"Символ, который будет добавляться после ника, когда желаемый ник уже занят " +"кем-нибудь в комнате." -#: ../src/common/config.py:142 +#: ../src/common/config.py:151 +msgid "" +"This option let you customize timestamp that is printed in conversation. For " +"exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " +"strftime for full documentation: http://docs.python.org/lib/module-time.html" +msgstr "" +"Эта опция позволяет настроить отпечаток времени, который печатается в чатах. " +"К примеру \"[%H:%M]\" будет показано как \"[чч:мм]\". Смотрите дополнительно " +"документацию python к strftime (http://docs.python.org/lib/module-time.html)" + +#: ../src/common/config.py:152 +msgid "Characters that are printed before the nickname in conversations" +msgstr "Символы, которые будут отображаться перед никами в чате" + +#: ../src/common/config.py:153 +msgid "Characters that are printed after the nickname in conversations" +msgstr "Символы, которые будут отображаться после ников в чате" + +#: ../src/common/config.py:156 +msgid "" +"If checked, Gajim can regularly poll a Last.fm account and adjust the status " +"message to reflect recently played songs. " +"set_status_msg_from_current_music_track option must be False." +msgstr "" +"Если включено, Gajim будет проверять аккаунт на Last.fm и менять ваш статус " +"на имя проигрываемого трека. set_status_msg_from_current_music_track опция " +"должна быть False." + +#: ../src/common/config.py:157 +msgid "The username used to identify the Last.fm account." +msgstr "Имя пользователя на Last.fm." + +#: ../src/common/config.py:161 msgid "Add * and [n] in roster title?" msgstr "Добавлять * и [n] в окно ростера?" -#: ../src/common/config.py:143 +#: ../src/common/config.py:162 msgid "" "How many lines to remember from previous conversation when a chat tab/window " "is reopened." @@ -5441,11 +6665,11 @@ msgstr "" "Сколько строк из предыдущей беседы выводить, когда вкладка/окно открываются " "вновь." -#: ../src/common/config.py:144 +#: ../src/common/config.py:163 msgid "How many minutes should last lines from previous conversation last." msgstr "Сколько минут должны оставаться последние строки из предыдущей беседы." -#: ../src/common/config.py:145 +#: ../src/common/config.py:164 msgid "" "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " "Client default behaviour)." @@ -5453,11 +6677,11 @@ msgstr "" "Оправлять сообщения по Ctrl+Enter и Enter создает новую строку (как в " "Mirabilis ICQ)" -#: ../src/common/config.py:147 +#: ../src/common/config.py:166 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Сколько строк хранить для Ctrl+Стрелка вверх" -#: ../src/common/config.py:150 +#: ../src/common/config.py:169 #, python-format msgid "" "Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' " @@ -5466,49 +6690,61 @@ msgstr "" "Введите свою ссылку с %s, в которой %s подменяет слово/фразу или " "'WIKTIONARY', что значит: \"использовать wiktionary\"." -#: ../src/common/config.py:153 +#: ../src/common/config.py:172 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "" "Если отмечено, то Gajim'ом можно будет управлять удаленно с использованием " "gajim-remote." -#: ../src/common/config.py:154 +#: ../src/common/config.py:173 msgid "" "If True, listen to D-Bus signals from NetworkManager and change the status " "of accounts (provided they do not have listen_to_network_manager set to " "False and they sync with global status) based upon the status of the network " "connection." msgstr "" +"Если True, тогда \"слушать\" сообщения от NetworkManager по D-Bus и изменять " +"статус аккаунтов в зависимости от состояния сетевого соединения (необходимо " +"чтобы аккаунты не имели установленной в False опции " +"listen_to_network_manager и они должны синхронизировать свой статус с " +"глобальным)" -#: ../src/common/config.py:155 -msgid "Sent chat state notifications. Can be one of all, composing_only, disabled." -msgstr "Отсылать уведомления о состоянии беседы. Может быть одним из \"все\", \"только написание\", \"отключено\"." +#: ../src/common/config.py:174 +msgid "" +"Sent chat state notifications. Can be one of all, composing_only, disabled." +msgstr "" +"Отсылать уведомления о состоянии беседы. Может быть одним из \"все\", " +"\"только печать\", \"отключено\"." -#: ../src/common/config.py:156 +#: ../src/common/config.py:175 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." -msgstr "Отображать состояния беседы в окне беседы. Может быть одним из \"все\", \"только написание\", \"отключено\"." +msgstr "" +"Отображать состояния беседы в окне беседы. Может быть одним из \"все\", " +"\"только написание\", \"отключено\"." -#: ../src/common/config.py:158 +#: ../src/common/config.py:177 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." -msgstr "Есди отключена печать времени для каждого сообщения, то печатать его каждые X минут." +msgstr "" +"Есди отключена печать времени для каждого сообщения, то печатать его каждые " +"X минут." -#: ../src/common/config.py:159 +#: ../src/common/config.py:178 msgid "Ask before closing a group chat tab/window." msgstr "Спрашивать перед закрытием окна/вкладки комнаты." -#: ../src/common/config.py:160 +#: ../src/common/config.py:179 msgid "" "Always ask before closing group chat tab/window in this space separated list " "of group chat jids." msgstr "" -"Всегда спрашивать перед закрытием окна/вкладки комнаты из этом списка. " +"Всегда спрашивать перед закрытием окна/вкладки комнаты из этого списка. " "Комнаты в списке разделяются пробелом." -#: ../src/common/config.py:161 +#: ../src/common/config.py:180 msgid "" "Never ask before closing group chat tab/window in this space separated list " "of group chat jids." @@ -5516,39 +6752,61 @@ msgstr "" "Никогда не спрашивать перед закрытием окна/вкладки комнаты из этого списка. " "Комнаты в списке разделяются пробелом." -#: ../src/common/config.py:164 +#: ../src/common/config.py:183 msgid "" -"Overrides the host we send for File Transfer in case of address translation/" -"port forwarding." +"Comma separated list of hosts that we send, in addition of local interfaces, " +"for File Transfer in case of address translation/port forwarding." msgstr "" "Указвает имя хоста, которое мы отсылаем при передаче файлов, в случае если " "мы за NAT или используется проброс портов." -#: ../src/common/config.py:166 +#: ../src/common/config.py:185 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." -msgstr "IEC утверждает что KiB = 1024 байт, KB = 1000 байт" +msgstr "IEC стандарт утверждает, что KiB = 1024 байт, KB = 1000 байт" -#: ../src/common/config.py:168 +#: ../src/common/config.py:187 msgid "Notify of events in the system trayicon." msgstr "Уведомлять о событиях в системном лотке." -#: ../src/common/config.py:174 +#: ../src/common/config.py:193 msgid "Show tab when only one conversation?" -msgstr "Показывать вкладку при одной беседе?" +msgstr "Показывать вкладку при одном чат-окне?" -#: ../src/common/config.py:175 +#: ../src/common/config.py:194 msgid "Show tabbed notebook border in chat windows?" -msgstr "Показывать границу вкладки в окне беседы?" +msgstr "Показывать границу вкладки в окне чата?" -#: ../src/common/config.py:176 +#: ../src/common/config.py:195 msgid "Show close button in tab?" msgstr "Показывать кнопку закрытия на вкладке?" -#: ../src/common/config.py:189 -msgid "A semicolon-separated list of words that will be highlighted in group chats." -msgstr "Список слов (через точку с запятой), которые будут подсвечиваться в комнатах." +#: ../src/common/config.py:196 +msgid "" +"When negotiating an encrypted session, should Gajim assume you want your " +"messages to be logged?" +msgstr "" +"Когда устанавливается зашифрованная сессия, дожен ли Gajim предположить, " +"что Вы хотите сохранить историю сообщений?" -#: ../src/common/config.py:190 +#: ../src/common/config.py:197 +msgid "" +"When negotiating an encrypted session, should Gajim prefer to use public " +"keys for identification?" +msgstr "" +"Когда устанавливается зашифрованная сессия, дожен ли Gajim предпочитать " +"использовать открытый ключ для идентификации?" + +#: ../src/common/config.py:206 +msgid "Preview new messages in notification popup?" +msgstr "Предпросмотр новых сообщений во всплывающем окне?" + +#: ../src/common/config.py:211 +msgid "" +"A semicolon-separated list of words that will be highlighted in group chats." +msgstr "" +"Список слов (через точку с запятой), которые будут подсвечиваться в комнатах." + +#: ../src/common/config.py:212 msgid "" "If True, quits Gajim when X button of Window Manager is clicked. This " "setting is taken into account only if trayicon is used." @@ -5556,11 +6814,14 @@ msgstr "" "Если True, то Gajim будет завершаться при нажатии на кнопку закрытия окна. " "Эта опция учитывается только если используется иконка для трея." -#: ../src/common/config.py:191 -msgid "If True, Gajim registers for xmpp:// on each startup." -msgstr "Если True, то Gajim будет регистрировать xmpp:// при каждом запуске" +#: ../src/common/config.py:213 +msgid "" +"If True, Gajim will check if it's the default jabber client on each startup." +msgstr "" +"Если True, то Gajim будет проверять при запуске,является ли он jabber-" +"клиентом по умолчанию." -#: ../src/common/config.py:192 +#: ../src/common/config.py:214 msgid "" "If True, Gajim will display an icon on each tab containing unread messages. " "Depending on the theme, this icon may be animated." @@ -5568,7 +6829,7 @@ msgstr "" "Если True, то Gajim иконку на каждой вкладке, которая содержит непрочитанные " "сообщения. В зависимости от темы, она может быть анимированной." -#: ../src/common/config.py:193 +#: ../src/common/config.py:215 msgid "" "If True, Gajim will display the status message, if not empty, for every " "contact under the contact name in roster window." @@ -5576,7 +6837,7 @@ msgstr "" "Если True, то Gajim будет отображать сообщение о статусе, если оно не " "пустое, для каждого контакта под именем контакта в окне ростера" -#: ../src/common/config.py:195 +#: ../src/common/config.py:217 msgid "" "If True, Gajim will ask for avatar each contact that did not have an avatar " "last time or has one cached that is too old." @@ -5584,44 +6845,52 @@ msgstr "" "Если True, то Gajim будет запрашивать аватару для каждого контакта, у " "которого её не было в последний раз или она уже слишком старая." -#: ../src/common/config.py:196 +#: ../src/common/config.py:218 msgid "" "If False, Gajim will no longer print status line in chats when a contact " "changes his or her status and/or his or her status message." msgstr "" -"Если отключено, то Gajim больше не будет показывать статусную строку в окне беседы, " -"когда контакт меняет его или её статус и/или сообщение о статусе." +"Если отключено, то Gajim больше не будет показывать статусную строку в окне " +"беседы, когда контакт меняет его или её статус и/или сообщение о статусе." -#: ../src/common/config.py:197 +#: ../src/common/config.py:219 msgid "" "can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " "longer print status line in groupchats when a member changes his or her " "status and/or his or her status message. If \"all\" Gajim will print all " -"status messages. If \"in_and_out\", gajim will only print FOO enters/leaves " +"status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " "group chat." -msgstr "может быть \"нет\", \"все\" или \"вход и выход\". Если установлено \"нет\", то Gajim больше не будет выводить сообщения о статусе в комнатах когда участник или участница меняет свой статус или сообщение о статусе. Если установлено в \"все\", то Gajim будет выводить все сообщения о статусе. Если установлено в \"вход и выход\", то Gajim будет выводить сообщение только когда кто-то входит или выходит из комнаты." +msgstr "" +"может быть \"none\", \"all\" или \"in_and_out\". Если установлено \"none\", " +"то Gajim больше не будет выводить сообщения о статусе в комнатах когда " +"участник меняет свой статус или сообщение о статусе. Если установлено в \"all" +"\", то Gajim будет выводить все сообщения о статусе. Если установлено в " +"\"in_and_out\", то Gajim будет выводить сообщение только когда кто-то входит " +"или выходит из комнаты." -#: ../src/common/config.py:199 +#: ../src/common/config.py:221 msgid "Background color of contacts when they just signed in." msgstr "Фоновый цвет контакта, который только что вошел." -#: ../src/common/config.py:200 +#: ../src/common/config.py:222 msgid "Background color of contacts when they just signed out." msgstr "Фоновый цвет контакта, который только что вышел." -#: ../src/common/config.py:202 -msgid "If True, restored messages will use a smaller font than the default one." -msgstr "Если установлено, то восстановленные сообщения будут иметь меньший шрифт." +#: ../src/common/config.py:224 +msgid "" +"If True, restored messages will use a smaller font than the default one." +msgstr "" +"Если установлено, то восстановленные сообщения будут иметь меньший шрифт." -#: ../src/common/config.py:203 +#: ../src/common/config.py:225 msgid "Don't show avatar for the transport itself." msgstr "Не показывать аватар для транспорта." -#: ../src/common/config.py:204 +#: ../src/common/config.py:226 msgid "Don't show roster in the system taskbar." msgstr "Не показывать ростер в панели задач." -#: ../src/common/config.py:205 +#: ../src/common/config.py:227 msgid "" "If True and installed GTK+ and PyGTK versions are at least 2.8, make the " "window flash (the default behaviour in most Window Managers) when holding " @@ -5631,7 +6900,7 @@ msgstr "" "(поведение по умолчанию для большинства менеджеров окон) когда присутствуют " "не просмотренные события." -#: ../src/common/config.py:207 +#: ../src/common/config.py:229 msgid "" "Jabberd1.4 does not like sha info when one join a password protected group " "chat. Turn this option to False to stop sending sha info in group chat " @@ -5642,7 +6911,7 @@ msgstr "" "информации для комнат" #. always, never, peracct, pertype should not be translated -#: ../src/common/config.py:210 +#: ../src/common/config.py:232 msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" @@ -5660,77 +6929,153 @@ msgstr "" "свое окно. Заметьте, что при изменении этого параметра требуется перезапуск " "Gajim, чтобы изменения вступили в силу." -#: ../src/common/config.py:211 +#: ../src/common/config.py:233 msgid "If False, you will no longer see the avatar in the chat window." msgstr "Если False, вы больше не будете видеть аватары в окне беседы." -#: ../src/common/config.py:212 +#: ../src/common/config.py:234 msgid "If True, pressing the escape key closes a tab/window." msgstr "Если True, то нажатие клавиши Escape будет закрывать вкладку/окно." -#: ../src/common/config.py:213 -msgid "Hides the buttons in group chat window." -msgstr "Скрывает кнопки окна комнаты." +#: ../src/common/config.py:235 +msgid "Hides the buttons in chat windows." +msgstr "Скрывает кнопки в окнах чата." -#: ../src/common/config.py:214 -msgid "Hides the buttons in two persons chat window." -msgstr "Скрывает кнопки в окне беседы." - -#: ../src/common/config.py:215 +#: ../src/common/config.py:236 msgid "Hides the banner in a group chat window" msgstr "Скрывает баннер в окне комнаты" -#: ../src/common/config.py:216 +#: ../src/common/config.py:237 msgid "Hides the banner in two persons chat window" -msgstr "Скрывает баннер в окне беседы" +msgstr "Скрывает баннер в окне чата" -#: ../src/common/config.py:217 +#: ../src/common/config.py:238 msgid "Hides the group chat occupants list in group chat window." msgstr "Скрывает список посетителей в окне комнаты." -#: ../src/common/config.py:218 +#: ../src/common/config.py:239 msgid "" "In a chat, show the nickname at the beginning of a line only when it's not " "the same person talking than in previous message." -msgstr "При беседе, показывать ник в начале строки только тогда, когда его произносит участник отличный от того, кто сказал предыдущее." +msgstr "" +"Показывать ник в начале строки в чате только если предыдущее сообщение было " +"написано другим участником." -#: ../src/common/config.py:219 -msgid "Indentation when using merge consecutive nickame." +#: ../src/common/config.py:240 +msgid "Indentation when using merge consecutive nickname." msgstr "" -#: ../src/common/config.py:220 +#: ../src/common/config.py:241 +msgid "Smooth scroll message in conversation window" +msgstr "Плавно прокручивать сообщения в окне чата" + +#: ../src/common/config.py:242 msgid "List of colors that will be used to color nicknames in group chats." -msgstr "Список цветов, которые будут использоваться для раскраски ников в комнатах." +msgstr "" +"Список цветов, которые будут использоваться для раскраски ников в комнатах." -#: ../src/common/config.py:221 +#: ../src/common/config.py:243 msgid "Ctrl-Tab go to next composing tab when none is unread." -msgstr "Использовать Ctrl-Tab чтобы перейти к следующей вкладке с составляемым сообщением, когда нет непрочитанных сообщений." +msgstr "" +"Использовать Ctrl-Tab чтобы перейти к следующей вкладке с составляемым " +"сообщением, когда нет непрочитанных сообщений." -#: ../src/common/config.py:222 +#: ../src/common/config.py:244 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." -msgstr "А нам надо показывать диалог подтверждения о создании метаконтакта? Если тут пустая строка, то сообщение не будет показываться вообще." +msgstr "" +"А нам надо показывать диалог подтверждения о создании метаконтакта? Если тут " +"пустая строка, то сообщение не будет показываться вообще." -#: ../src/common/config.py:223 +#: ../src/common/config.py:245 msgid "" "If True, you will be able to set a negative priority to your account in " -"account modification window. BE CAREFULL, when you are logged in with a " +"account modification window. BE CAREFUL, when you are logged in with a " "negative priority, you will NOT receive any message from your server." -msgstr "Если установлено, то у вас появится возможность назначить для аккаунта приоритет меньше нуля в окне настройки аккаунта. БУДЬТЕ ОСТОРОЖНЫ, если вы подключитесь еще раз с отрицательным приоритетом, то вы НЕ получите никаких сообщений от сервера." +msgstr "" +"Если установлено, то у вас появится возможность назначить для аккаунта " +"приоритет меньше нуля в окне настройки аккаунта. БУДЬТЕ ОСТОРОЖНЫ, если вы " +"подключитесь еще раз с отрицательным приоритетом, то вы НЕ получите никаких " +"сообщений от сервера." -#: ../src/common/config.py:234 +#: ../src/common/config.py:246 +msgid "" +"If True, Gajim will use Gnome Keyring (if available) to store account " +"passwords." +msgstr "" +"Если активно, Gajim будет использовать (если возможно) Gnome Keyring для " +"хранения паролей учетных записей." + +#: ../src/common/config.py:247 +msgid "" +"If True, Gajim will show number of online and total contacts in account and " +"group rows." +msgstr "" +"Если активно, Gajim будет показывать количество контактов онлайн/всего в " +"строках с названием аккаунта и групп." + +#: ../src/common/config.py:248 +msgid "" +"Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " +"as if they were of this type" +msgstr "" +"Может быть пусто, 'chat' или 'normal'. Если не пусто - обрабатывать все " +"входящие сообщения так, как будто бы они были этого типа." + +#: ../src/common/config.py:249 +msgid "" +"If True, Gajim will scroll and select the contact who sent you the last " +"message, if chat window is not already opened." +msgstr "" +"Если активно, Gajim прокрутит ростер и выделит контакт, который написал Вам " +"сообщение последним, если окно чата еще небыло открыто." + +#: ../src/common/config.py:250 +msgid "" +"If True, Gajim will convert string between $$ and $$ to an image using dvips " +"and convert before insterting it in chat window." +msgstr "" +"Если активно, Gajim будет конвертировать строку между $$ и $$ в изображение, " +"используя dvips и конвертировать до вставки его в чат-окно." + +#: ../src/common/config.py:251 +msgid "Time of inactivity needed before the change status window closes down." +msgstr "Время не активности прежде чем окно изменения статуса закроется." + +#: ../src/common/config.py:252 +msgid "" +"Maximum number of lines that are printed in conversations. Oldest lines are " +"cleared." +msgstr "Максимальное количество строк в окне.Старые строки будут удалены." + +#: ../src/common/config.py:253 +msgid "" +"If True, notification windows from notification-daemon will be attached to " +"systray icon." +msgstr "" +"Если активно, окно уведомления от notification-daemon будет присоединено к " +"системному трею." + +#: ../src/common/config.py:264 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." msgstr "" +"Приоритет будет изменятся автоматически согласно вашему статусу.Приоритеты " +"для статусов задаются в пункте autopriority_* ." + +#: ../src/common/config.py:276 +msgid "" +"If disabled, don't sign presences with GPG key, even if GPG is configured." +msgstr "" #. yes, no, ask -#: ../src/common/config.py:263 +#: ../src/common/config.py:294 msgid "Jabberd2 workaround" msgstr "Костыль для jabberd2" -#: ../src/common/config.py:267 +#: ../src/common/config.py:298 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." @@ -5738,101 +7083,101 @@ msgstr "" "Если отмечено, Gajim будет использовать ваш IP и прокси, определенные в " "параметре file_transfer_proxies для передачи файлов" -#: ../src/common/config.py:326 +#: ../src/common/config.py:357 msgid "Is OpenPGP enabled for this contact?" msgstr "Используется ли для этого контакта OpenPGP" -#: ../src/common/config.py:327 ../src/common/config.py:330 +#: ../src/common/config.py:358 ../src/common/config.py:361 msgid "Language for which we want to check misspelled words" msgstr "Язык, который используется при проверке правописания" -#: ../src/common/config.py:336 +#: ../src/common/config.py:367 msgid "all or space separated status" msgstr "все или статусы, разделенные пробелом" -#: ../src/common/config.py:337 +#: ../src/common/config.py:368 msgid "'yes', 'no', or 'both'" msgstr "\"да\", \"нет\" или \"оба\"" -#: ../src/common/config.py:338 ../src/common/config.py:340 -#: ../src/common/config.py:341 ../src/common/config.py:344 -#: ../src/common/config.py:345 +#: ../src/common/config.py:369 ../src/common/config.py:371 +#: ../src/common/config.py:372 ../src/common/config.py:375 +#: ../src/common/config.py:376 msgid "'yes', 'no' or ''" msgstr "\"да\", \"нет\" или \"\"" -#: ../src/common/config.py:351 +#: ../src/common/config.py:382 msgid "Sleeping" msgstr "Сплю" -#: ../src/common/config.py:352 +#: ../src/common/config.py:383 msgid "Back soon" msgstr "Скоро буду" -#: ../src/common/config.py:352 +#: ../src/common/config.py:383 msgid "Back in some minutes." msgstr "Вернусь через несколько минут" -#: ../src/common/config.py:353 +#: ../src/common/config.py:384 msgid "Eating" msgstr "Ем" -#: ../src/common/config.py:353 +#: ../src/common/config.py:384 msgid "I'm eating, so leave me a message." msgstr "Кушаю, так что оставьте сообщение секретарю." -#: ../src/common/config.py:354 +#: ../src/common/config.py:385 msgid "Movie" msgstr "В кино" -#: ../src/common/config.py:354 +#: ../src/common/config.py:385 msgid "I'm watching a movie." msgstr "Смотрю кино" -#: ../src/common/config.py:355 +#: ../src/common/config.py:386 msgid "Working" msgstr "Работаю" -#: ../src/common/config.py:355 +#: ../src/common/config.py:386 msgid "I'm working." msgstr "Работаю" -#: ../src/common/config.py:356 +#: ../src/common/config.py:387 msgid "Phone" msgstr "Телефон" -#: ../src/common/config.py:356 +#: ../src/common/config.py:387 msgid "I'm on the phone." msgstr "Говорю по телефону" -#: ../src/common/config.py:357 +#: ../src/common/config.py:388 msgid "Out" msgstr "Вышел" -#: ../src/common/config.py:357 +#: ../src/common/config.py:388 msgid "I'm out enjoying life." msgstr "Наслаждаюсь жизнью, чего и вам желаю." -#: ../src/common/config.py:361 +#: ../src/common/config.py:392 msgid "I'm available." msgstr "Я здесь." -#: ../src/common/config.py:362 +#: ../src/common/config.py:393 msgid "I'm free for chat." msgstr "Я готов поболтать." -#: ../src/common/config.py:364 +#: ../src/common/config.py:395 msgid "I'm not available." msgstr "Меня нет." -#: ../src/common/config.py:365 +#: ../src/common/config.py:396 msgid "Do not disturb." msgstr "Не беспокоить." -#: ../src/common/config.py:366 ../src/common/config.py:367 +#: ../src/common/config.py:397 ../src/common/config.py:398 msgid "Bye!" msgstr "Пока!" -#: ../src/common/config.py:376 +#: ../src/common/config.py:407 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." @@ -5841,198 +7186,373 @@ msgstr "" "содержит слово из списка muc_highlight_words, или когда сообщение содержит " "ваш ник." -#: ../src/common/config.py:377 +#: ../src/common/config.py:408 msgid "Sound to play when any MUC message arrives." msgstr "Звук, который нужно проигрывать, когда приходит любое сообщение MUC." -#: ../src/common/config.py:386 ../src/common/optparser.py:197 +#: ../src/common/config.py:417 ../src/common/optparser.py:220 msgid "green" msgstr "зеленый" -#: ../src/common/config.py:390 ../src/common/optparser.py:183 +#: ../src/common/config.py:421 ../src/common/optparser.py:206 msgid "grocery" msgstr "овощной" -#: ../src/common/config.py:394 +#: ../src/common/config.py:425 msgid "human" msgstr "телесный" -#: ../src/common/config.py:398 +#: ../src/common/config.py:429 msgid "marine" msgstr "морской" -#: ../src/common/connection_handlers.py:52 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:44 +#: ../src/common/connection_handlers.py:61 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:49 msgid "Unable to load idle module" msgstr "Не могу загрузить модуль \"idle\"" -#: ../src/common/connection_handlers.py:177 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 +#: ../src/common/connection_handlers.py:219 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:243 msgid "Wrong host" msgstr "Неверный хост" -#: ../src/common/connection_handlers.py:177 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 -msgid "" -"The host you configured as the ft_override_host_to_send advanced option is " -"not valid, so ignored." -msgstr "" +#: ../src/common/connection_handlers.py:220 +msgid "Invalid local address? :-O" +msgstr "Неправильный локальный адрес? :-O" -#: ../src/common/connection_handlers.py:590 +#: ../src/common/connection_handlers.py:618 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Данные о регистрации для транспорта %s не пришли вовремя." -#: ../src/common/connection_handlers.py:1523 +#: ../src/common/connection_handlers.py:1806 #, python-format msgid "Nickname not allowed: %s" msgstr "Ник недопустим: %s" -#. password required to join #. we are banned #. group chat does not exist -#: ../src/common/connection_handlers.py:1585 -#: ../src/common/connection_handlers.py:1588 -#: ../src/common/connection_handlers.py:1591 -#: ../src/common/connection_handlers.py:1594 -#: ../src/common/connection_handlers.py:1597 -#: ../src/common/connection_handlers.py:1600 -#: ../src/common/connection_handlers.py:1608 +#: ../src/common/connection_handlers.py:1876 +#: ../src/common/connection_handlers.py:1879 +#: ../src/common/connection_handlers.py:1882 +#: ../src/common/connection_handlers.py:1885 +#: ../src/common/connection_handlers.py:1889 +#: ../src/common/connection_handlers.py:1898 msgid "Unable to join group chat" msgstr "Не получается войти в комнату" -#: ../src/common/connection_handlers.py:1586 -msgid "A password is required to join this group chat." -msgstr "Чтобы войти в эту комнату, нужен пароль." +#: ../src/common/connection_handlers.py:1877 +#, python-format +msgid "You are banned from group chat %s." +msgstr "Вам запрещено входить в комнату %s." -#: ../src/common/connection_handlers.py:1589 -msgid "You are banned from this group chat." -msgstr "Вам запрещено входить в эту комнату." +#: ../src/common/connection_handlers.py:1880 +#, python-format +msgid "Group chat %s does not exist." +msgstr "Комнаты %s не существует." -#: ../src/common/connection_handlers.py:1592 -msgid "Such group chat does not exist." -msgstr "Такой комнаты нет." - -#: ../src/common/connection_handlers.py:1595 +#: ../src/common/connection_handlers.py:1883 msgid "Group chat creation is restricted." msgstr "Создание комнат запрещено." -#: ../src/common/connection_handlers.py:1598 -msgid "Your registered nickname must be used." -msgstr "Требуется использовать ваш зарегистрированный ник." +#: ../src/common/connection_handlers.py:1886 +#, python-format +msgid "Your registered nickname must be used in group chat %s." +msgstr "Необходимо использовать Ваш зарегистрированный ник в комнате %s." -#: ../src/common/connection_handlers.py:1601 -msgid "You are not in the members list." -msgstr "Вас нет в списке членов комнаты." +#: ../src/common/connection_handlers.py:1890 +#, python-format +msgid "You are not in the members list in groupchat %s." +msgstr "Вас нет в списке членов комнаты %s." -#: ../src/common/connection_handlers.py:1609 +#: ../src/common/connection_handlers.py:1899 +#, python-format msgid "" -"Your desired nickname is in use or registered by another occupant.\n" +"Your desired nickname in group chat %s is in use or registered by another " +"occupant.\n" "Please specify another nickname below:" msgstr "" -"Тот ник что вы ввели уже используется или зарегистрирован другим пользователем.\n" +"Тот ник что вы ввели в комнате %s уже используется или зарегистрирован " +"другим пользователем.\n" "Пожалуйста укажите другой ник ниже:" -#: ../src/common/connection_handlers.py:1659 +#. Room has been destroyed. see +#. http://www.xmpp.org/extensions/xep-0045.html#destroyroom +#: ../src/common/connection_handlers.py:1930 +msgid "Room has been destroyed" +msgstr "Комната была удалена" + +#: ../src/common/connection_handlers.py:1937 +#, python-format +msgid "You can join this room instead: %s" +msgstr "" + +#: ../src/common/connection_handlers.py:1964 msgid "I would like to add you to my roster." msgstr "Вы не возражаете, если я добавлю Вас в свой ростер?" #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:1680 +#: ../src/common/connection_handlers.py:1985 #, python-format msgid "we are now subscribed to %s" msgstr "теперь мы подписались на %s" -#: ../src/common/connection_handlers.py:1682 +#: ../src/common/connection_handlers.py:1987 #, python-format msgid "unsubscribe request from %s" msgstr "%s хочет отменить подписку" -#: ../src/common/connection_handlers.py:1684 +#: ../src/common/connection_handlers.py:1989 #, python-format msgid "we are now unsubscribed from %s" msgstr "теперь мы отписались от %s" -#: ../src/common/connection_handlers.py:1854 +#: ../src/common/connection_handlers.py:2116 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " "management tools such as http://jru.jabberstudio.org/ to remove it" -msgstr "JID %s не соответствует RFC. Он не будет добавлен в ваш ростер. Используйте средство управления ростера, например http://jru.jabberstudio.org/ чтобы удалить его" +msgstr "" +"JID %s не соответствует RFC. Он не будет добавлен в ваш ростер. Используйте " +"средство управления ростера, например http://jru.jabberstudio.org/ чтобы " +"удалить его" -#: ../src/common/connection.py:175 -#: ../src/common/zeroconf/connection_zeroconf.py:196 +#. We didn't set a passphrase +#: ../src/common/connection_handlers.py:2155 +#: ../src/common/zeroconf/connection_zeroconf.py:168 +msgid "OpenPGP passphrase was not given" +msgstr "Не задана парольная фраза OpenPGP" + +#: ../src/common/connection.py:62 +msgid "Unable to get issuer certificate" +msgstr "" + +#: ../src/common/connection.py:63 +msgid "Unable to get certificate CRL" +msgstr "" + +#: ../src/common/connection.py:64 +msgid "Unable to decrypt certificate's signature" +msgstr "" + +#: ../src/common/connection.py:65 +msgid "Unable to decrypt CRL's signature" +msgstr "" + +#: ../src/common/connection.py:66 +#, fuzzy +msgid "Unable to decode issuer public key" +msgstr "Не могу загрузить модуль \"idle\"" + +#: ../src/common/connection.py:67 +msgid "Certificate signature failure" +msgstr "" + +#: ../src/common/connection.py:68 +msgid "CRL signature failure" +msgstr "" + +#: ../src/common/connection.py:69 +msgid "Certificate is not yet valid" +msgstr "" + +#: ../src/common/connection.py:70 +msgid "Certificate has expired" +msgstr "" + +#: ../src/common/connection.py:71 +msgid "CRL is not yet valid" +msgstr "" + +#: ../src/common/connection.py:72 +msgid "CRL has expired" +msgstr "" + +#: ../src/common/connection.py:73 +msgid "Format error in certificate's notBefore field" +msgstr "" + +#: ../src/common/connection.py:74 +msgid "Format error in certificate's notAfter field" +msgstr "" + +#: ../src/common/connection.py:75 +msgid "Format error in CRL's lastUpdate field" +msgstr "" + +#: ../src/common/connection.py:76 +msgid "Format error in CRL's nextUpdate field" +msgstr "" + +#: ../src/common/connection.py:77 +msgid "Out of memory" +msgstr "" + +#: ../src/common/connection.py:78 +msgid "Self signed certificate in certificate chain" +msgstr "" + +#: ../src/common/connection.py:79 +msgid "Unable to get local issuer certificate" +msgstr "" + +#: ../src/common/connection.py:80 ../src/common/connection.py:81 +msgid "Unable to verify the first certificate" +msgstr "" + +#: ../src/common/connection.py:82 +msgid "Certificate chain too long" +msgstr "" + +#: ../src/common/connection.py:83 +msgid "Certificate revoked" +msgstr "" + +#: ../src/common/connection.py:84 +#, fuzzy +msgid "Invalid CA certificate" +msgstr "Неверное имя пользователя" + +#: ../src/common/connection.py:85 +msgid "Path length constraint exceeded" +msgstr "" + +#: ../src/common/connection.py:86 +msgid "Unsupported certificate purpose" +msgstr "" + +#: ../src/common/connection.py:87 +msgid "Certificate not trusted" +msgstr "" + +#: ../src/common/connection.py:88 +msgid "Certificate rejected" +msgstr "" + +#: ../src/common/connection.py:89 +msgid "Subject issuer mismatch" +msgstr "" + +#: ../src/common/connection.py:90 +msgid "Authority and subject key identifier mismatch" +msgstr "" + +#: ../src/common/connection.py:91 +msgid "Authority and issuer serial number mismatch" +msgstr "" + +#: ../src/common/connection.py:92 +msgid "Key usage does not include certificate signing" +msgstr "" + +#: ../src/common/connection.py:93 +msgid "Application verification failure" +msgstr "" + +#: ../src/common/connection.py:246 +#: ../src/common/zeroconf/connection_zeroconf.py:208 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Связь с учетной записью \"%s\" была потеряна" -#: ../src/common/connection.py:176 +#: ../src/common/connection.py:247 msgid "Reconnect manually." msgstr "Переподключаться вручную." -#: ../src/common/connection.py:187 ../src/common/connection.py:214 +#: ../src/common/connection.py:258 +#, python-format +msgid "Server %s answered wrongly to register request: %s" +msgstr "Сервер %s неверно ответил на запрос о регистрации: %s" + +#: ../src/common/connection.py:291 +#, python-format +msgid "Server %s provided a different registration form" +msgstr "" + +#: ../src/common/connection.py:307 +#, python-format +msgid "Unknown SSL error: %d" +msgstr "" + +#. wrong answer +#: ../src/common/connection.py:322 +msgid "Invalid answer" +msgstr "Неверный ответ" + +#: ../src/common/connection.py:323 #, python-format msgid "Transport %s answered wrongly to register request: %s" msgstr "Транспорт %s неверно ответил на запрос о регистрации: %s" -#. wrong answer -#: ../src/common/connection.py:213 -msgid "Invalid answer" -msgstr "Неверный ответ" +#: ../src/common/connection.py:469 +msgid "Connection to proxy failed" +msgstr "Соединение с прокси разорвалось" -#: ../src/common/connection.py:405 ../src/common/connection.py:440 -#: ../src/common/connection.py:889 -#: ../src/common/zeroconf/connection_zeroconf.py:217 +#: ../src/common/connection.py:523 ../src/common/connection.py:585 +#: ../src/common/connection.py:1140 +#: ../src/common/zeroconf/connection_zeroconf.py:242 #, python-format msgid "Could not connect to \"%s\"" msgstr "Не могу соединиться с \"%s\"" -#: ../src/common/connection.py:419 +#: ../src/common/connection.py:537 #, python-format msgid "Connected to server %s:%s with %s" msgstr "Подключен к серверу %s: %s с %s" -#: ../src/common/connection.py:441 +#: ../src/common/connection.py:548 +#, python-format +msgid "The authenticity of the %s certificate could be invalid." +msgstr "" + +#: ../src/common/connection.py:551 +#, python-format +msgid "" +"\n" +"SSL Error: %s" +msgstr "" + +#: ../src/common/connection.py:553 +#, python-format +msgid "" +"\n" +"Unknown SSL error: %d" +msgstr "" + +#: ../src/common/connection.py:586 msgid "Check your connection or try again later" msgstr "Проверьте настройки сети или попробуйте еще раз позже" -#: ../src/common/connection.py:467 +#: ../src/common/connection.py:611 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Ошибка аутентификации с \"%s\"" -#: ../src/common/connection.py:468 +#: ../src/common/connection.py:613 msgid "Please check your login and password for correctness." msgstr "Пожалуйста, проверьте правильность логина и пароля." -#. We didn't set a passphrase -#: ../src/common/connection.py:585 -#: ../src/common/zeroconf/connection_zeroconf.py:156 -msgid "OpenPGP passphrase was not given" -msgstr "Не задана парольная фраза OpenPGP" +#: ../src/common/connection.py:656 +msgid "Error while removing privacy list" +msgstr "Ошибка при удалении списка приватности" -#. do not show I'm invisible! -#: ../src/common/connection.py:627 -msgid "invisible" -msgstr "невидимка" - -#: ../src/common/connection.py:628 -msgid "offline" -msgstr "отключен" - -#: ../src/common/connection.py:629 +#: ../src/common/connection.py:657 #, python-format -msgid "I'm %s" -msgstr "%s" +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 не может быть удален.Возможно он используется одним из " +"ваших активных ресурсов.Отключите ресурс и попробуйте снова." #. we're not english #. one in locale and one en -#: ../src/common/connection.py:720 +#: ../src/common/connection.py:933 msgid "[This message is *encrypted* (See :JEP:`27`]" msgstr "[Это сообщение *зашифровано*, см. :JEP:`27`]" -#: ../src/common/connection.py:776 -#: ../src/common/zeroconf/connection_zeroconf.py:397 +#: ../src/common/connection.py:1007 +#: ../src/common/zeroconf/connection_zeroconf.py:436 #, python-format msgid "" "Subject: %s\n" @@ -6041,34 +7561,38 @@ msgstr "" "Тема: %s\n" "%s" -#: ../src/common/connection.py:915 +#: ../src/common/connection.py:1172 msgid "Not fetched because of invisible status" msgstr "Нельзя получить из-за невидимости" +#: ../src/common/contacts.py:299 +msgid "Not in roster" +msgstr "Не в ростере" + #. only say that to non Windows users -#: ../src/common/dbus_support.py:33 +#: ../src/common/dbus_support.py:41 msgid "D-Bus python bindings are missing in this computer" msgstr "На компьютере не установлена библиотека D-Bus для Python" -#: ../src/common/dbus_support.py:34 +#: ../src/common/dbus_support.py:42 msgid "D-Bus capabilities of Gajim cannot be used" msgstr "Возможности работы Gajim с D-Bus не могут быть использованы" -#: ../src/common/exceptions.py:22 +#: ../src/common/exceptions.py:27 msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." msgstr "отсутствует библиотека pysqlite2 (или python-pysqlite2). Выход..." -#: ../src/common/exceptions.py:30 +#: ../src/common/exceptions.py:44 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "" "Сервис недоступен: Gajim не запущен или отключена функция удаленного " "управления" -#: ../src/common/exceptions.py:38 +#: ../src/common/exceptions.py:52 msgid "D-Bus is not present on this machine or python module is missing" msgstr "На машине отсутствует D-Bus или модуль питона для нее" -#: ../src/common/exceptions.py:46 +#: ../src/common/exceptions.py:60 msgid "" "Session bus is not available.\n" "Try reading http://trac.gajim.org/wiki/GajimDBus" @@ -6076,483 +7600,490 @@ msgstr "" "Шина D-Bus не доступна.\n" "Попробуйте прочитать http://trac.gajim.org/wiki/GajimDBus" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "one" msgstr "один" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "two" msgstr "два" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "three" msgstr "три" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "four" msgstr "четыре" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "five" msgstr "пять" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "six" msgstr "шесть" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "seven" msgstr "семь" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "eight" msgstr "восемь" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "nine" msgstr "девять" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "ten" msgstr "десять" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "eleven" msgstr "одиннадцать" -#: ../src/common/fuzzyclock.py:44 +#: ../src/common/fuzzyclock.py:49 msgid "twelve" msgstr "двенадцать" #. Strings to use for the output. %0 will be replaced with the preceding hour (e.g. "x PAST %0"), %1 with the coming hour (e.g. "x TO %1). ''' #. A "singular-form". It is used when talking about hour 0 -#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 -msgid "%0 o'clock" +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +msgid "$0 o'clock" msgstr "%0" -#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 -msgid "five past %0" +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +msgid "five past $0" msgstr "пять минут %1" -#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:56 -msgid "ten past %0" +#: ../src/common/fuzzyclock.py:53 ../src/common/fuzzyclock.py:61 +msgid "ten past $0" msgstr "десять минут %1" -#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 -msgid "quarter past %0" +#: ../src/common/fuzzyclock.py:53 ../src/common/fuzzyclock.py:61 +msgid "quarter past $0" msgstr "четверть %1" -#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:57 -msgid "twenty past %0" +#: ../src/common/fuzzyclock.py:54 ../src/common/fuzzyclock.py:62 +msgid "twenty past $0" msgstr "двадцать минут %1" -#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 -msgid "twenty five past %0" +#: ../src/common/fuzzyclock.py:54 ../src/common/fuzzyclock.py:62 +msgid "twenty five past $0" msgstr "двадцать пять минут %1" -#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:58 -msgid "half past %0" +#: ../src/common/fuzzyclock.py:55 ../src/common/fuzzyclock.py:63 +msgid "half past $0" msgstr "половина %1" -#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 -msgid "twenty five to %1" +#: ../src/common/fuzzyclock.py:55 ../src/common/fuzzyclock.py:63 +msgid "twenty five to $1" msgstr "без двадцати пяти %1" -#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:59 -msgid "twenty to %1" +#: ../src/common/fuzzyclock.py:56 ../src/common/fuzzyclock.py:64 +msgid "twenty to $1" msgstr "без двадцати %1" -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 -msgid "quarter to %1" +#: ../src/common/fuzzyclock.py:56 ../src/common/fuzzyclock.py:64 +msgid "quarter to $1" msgstr "без четверти %1" -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:60 -msgid "ten to %1" +#: ../src/common/fuzzyclock.py:57 ../src/common/fuzzyclock.py:65 +msgid "ten to $1" msgstr "без десяти %1" -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:60 -msgid "five to %1" +#: ../src/common/fuzzyclock.py:57 ../src/common/fuzzyclock.py:65 +msgid "five to $1" msgstr "без пяти %1" -#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 -msgid "%1 o'clock" +#: ../src/common/fuzzyclock.py:57 ../src/common/fuzzyclock.py:66 +msgid "$1 o'clock" msgstr "%1" -#: ../src/common/fuzzyclock.py:62 +#: ../src/common/fuzzyclock.py:69 msgid "Night" msgstr "Ночь" -#: ../src/common/fuzzyclock.py:62 +#: ../src/common/fuzzyclock.py:69 msgid "Early morning" msgstr "Раннее утро" -#: ../src/common/fuzzyclock.py:62 +#: ../src/common/fuzzyclock.py:69 msgid "Morning" msgstr "Утро" -#: ../src/common/fuzzyclock.py:62 +#: ../src/common/fuzzyclock.py:69 msgid "Almost noon" msgstr "День" -#: ../src/common/fuzzyclock.py:63 +#: ../src/common/fuzzyclock.py:70 msgid "Noon" msgstr "Полдень" -#: ../src/common/fuzzyclock.py:63 +#: ../src/common/fuzzyclock.py:70 msgid "Afternoon" msgstr "День" -#: ../src/common/fuzzyclock.py:63 +#: ../src/common/fuzzyclock.py:70 msgid "Evening" msgstr "Вечер" -#: ../src/common/fuzzyclock.py:63 +#: ../src/common/fuzzyclock.py:70 msgid "Late evening" msgstr "Поздний вечер" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:72 msgid "Start of week" msgstr "Начало недели" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:72 msgid "Middle of week" msgstr "Середина недели" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:72 msgid "End of week" msgstr "Конец недели" -#: ../src/common/fuzzyclock.py:66 +#: ../src/common/fuzzyclock.py:73 msgid "Weekend!" msgstr "Выходные!" -#: ../src/common/helpers.py:105 +#: ../src/common/helpers.py:124 msgid "Invalid character in username." msgstr "Неверный символ в имени пользователя." -#: ../src/common/helpers.py:110 +#: ../src/common/helpers.py:129 msgid "Server address required." msgstr "Требуется адрес сервера." -#: ../src/common/helpers.py:115 +#: ../src/common/helpers.py:134 msgid "Invalid character in hostname." msgstr "Неверный символ в имени сервера" -#: ../src/common/helpers.py:121 +#: ../src/common/helpers.py:140 msgid "Invalid character in resource." msgstr "Неверный символ в ресурсе" #. GiB means gibibyte -#: ../src/common/helpers.py:161 +#: ../src/common/helpers.py:180 #, python-format msgid "%s GiB" msgstr "%s GiB" #. GB means gigabyte -#: ../src/common/helpers.py:164 +#: ../src/common/helpers.py:183 #, python-format msgid "%s GB" msgstr "%s GB" #. MiB means mibibyte -#: ../src/common/helpers.py:168 +#: ../src/common/helpers.py:187 #, python-format msgid "%s MiB" msgstr "%s MiB" #. MB means megabyte -#: ../src/common/helpers.py:171 +#: ../src/common/helpers.py:190 #, python-format msgid "%s MB" msgstr "%s MB" #. KiB means kibibyte -#: ../src/common/helpers.py:175 +#: ../src/common/helpers.py:194 #, python-format msgid "%s KiB" msgstr "%s KiB" #. KB means kilo bytes -#: ../src/common/helpers.py:178 +#: ../src/common/helpers.py:197 #, python-format msgid "%s KB" msgstr "%s KB" #. B means bytes -#: ../src/common/helpers.py:181 +#: ../src/common/helpers.py:200 #, python-format msgid "%s B" msgstr "%s B" -#: ../src/common/helpers.py:210 +#: ../src/common/helpers.py:231 msgid "_Busy" msgstr "_Занят" -#: ../src/common/helpers.py:212 +#: ../src/common/helpers.py:233 msgid "Busy" msgstr "Занят" -#: ../src/common/helpers.py:215 +#: ../src/common/helpers.py:236 msgid "_Not Available" msgstr "_Недоступен" -#: ../src/common/helpers.py:220 +#: ../src/common/helpers.py:241 msgid "_Free for Chat" msgstr "_Готов поболтать" -#: ../src/common/helpers.py:222 +#: ../src/common/helpers.py:243 msgid "Free for Chat" msgstr "Готов поболтать" -#: ../src/common/helpers.py:225 +#: ../src/common/helpers.py:246 msgid "_Available" msgstr "_Доступен" -#: ../src/common/helpers.py:227 -msgid "Available" -msgstr "Доступен" - -#: ../src/common/helpers.py:229 +#: ../src/common/helpers.py:250 msgid "Connecting" msgstr "Соединяюсь" -#: ../src/common/helpers.py:232 +#: ../src/common/helpers.py:253 msgid "A_way" msgstr "_Ушел" -#: ../src/common/helpers.py:237 +#: ../src/common/helpers.py:258 msgid "_Offline" msgstr "_Отключен" -#: ../src/common/helpers.py:239 +#: ../src/common/helpers.py:260 msgid "Offline" msgstr "Отключен" -#: ../src/common/helpers.py:242 +#: ../src/common/helpers.py:263 msgid "_Invisible" msgstr "_Невидимка" -#: ../src/common/helpers.py:248 +#: ../src/common/helpers.py:269 msgid "?contact has status:Unknown" msgstr "Неизвестен" -#: ../src/common/helpers.py:250 +#: ../src/common/helpers.py:271 msgid "?contact has status:Has errors" msgstr "Ошибка" -#: ../src/common/helpers.py:255 +#: ../src/common/helpers.py:276 msgid "?Subscription we already have:None" msgstr "Нет" -#: ../src/common/helpers.py:257 +#: ../src/common/helpers.py:278 msgid "To" msgstr "К" -#: ../src/common/helpers.py:261 +#: ../src/common/helpers.py:282 msgid "Both" msgstr "Оба" -#: ../src/common/helpers.py:269 +#: ../src/common/helpers.py:290 msgid "?Ask (for Subscription):None" msgstr "Нет" -#: ../src/common/helpers.py:271 +#: ../src/common/helpers.py:292 msgid "Subscribe" msgstr "Подписаться" -#: ../src/common/helpers.py:280 +#: ../src/common/helpers.py:301 msgid "?Group Chat Contact Role:None" msgstr "Отсутствует" -#: ../src/common/helpers.py:283 +#: ../src/common/helpers.py:304 msgid "Moderators" msgstr "Модераторы" -#: ../src/common/helpers.py:285 +#: ../src/common/helpers.py:306 msgid "Moderator" msgstr "Модератор" -#: ../src/common/helpers.py:288 +#: ../src/common/helpers.py:309 msgid "Participants" msgstr "Участники" -#: ../src/common/helpers.py:290 +#: ../src/common/helpers.py:311 msgid "Participant" msgstr "Участник" -#: ../src/common/helpers.py:293 +#: ../src/common/helpers.py:314 msgid "Visitors" msgstr "Посетители" -#: ../src/common/helpers.py:295 +#: ../src/common/helpers.py:316 msgid "Visitor" msgstr "Посетитель" -#: ../src/common/helpers.py:301 +#: ../src/common/helpers.py:322 msgid "?Group Chat Contact Affiliation:None" msgstr "Отсутствует" -#: ../src/common/helpers.py:303 +#: ../src/common/helpers.py:324 msgid "Owner" msgstr "Владелец" -#: ../src/common/helpers.py:305 +#: ../src/common/helpers.py:326 msgid "Administrator" msgstr "Администратор" -#: ../src/common/helpers.py:307 +#: ../src/common/helpers.py:328 msgid "Member" msgstr "Участник" -#: ../src/common/helpers.py:346 +#: ../src/common/helpers.py:367 msgid "is paying attention to the conversation" msgstr "читает сообщение" -#: ../src/common/helpers.py:348 +#: ../src/common/helpers.py:369 msgid "is doing something else" msgstr "занят чем-то еще" -#: ../src/common/helpers.py:350 +#: ../src/common/helpers.py:371 msgid "is composing a message..." msgstr "печатает сообщение..." -#. paused means he or she was compoing but has stopped for a while -#: ../src/common/helpers.py:353 +#. paused means he or she was composing but has stopped for a while +#: ../src/common/helpers.py:374 msgid "paused composing a message" msgstr "перестал печатать сообщение" -#: ../src/common/helpers.py:355 +#: ../src/common/helpers.py:376 msgid "has closed the chat window or tab" msgstr "закрыл окно чата или вкладку" -#: ../src/common/helpers.py:881 +#: ../src/common/helpers.py:947 ../src/common/helpers.py:954 #, python-format -msgid " %d unread message" -msgid_plural " %d unread messages" -msgstr[0] " %d непрочитанное сообщение" -msgstr[1] " %d непрочитанных сообщения" -msgstr[2] " %d непрочитанных сообщений" +msgid "%d message pending" +msgid_plural "%d messages pending" +msgstr[0] "%d пропущенное сообщение" +msgstr[1] "%d пропущенных сообщения" +msgstr[2] "%d пропущенных сообщений" -#: ../src/common/helpers.py:887 +#: ../src/common/helpers.py:960 #, python-format -msgid " %d unread single message" -msgid_plural " %d unread single messages" -msgstr[0] " %d непрочитанное одиночное сообщение" -msgstr[1] " %d непрочитанных одиночных сообщения" -msgstr[2] " %d непрочитанных одиночных сообщений" +msgid " from room %s" +msgstr " в комнате %s" -#: ../src/common/helpers.py:893 +#: ../src/common/helpers.py:963 ../src/common/helpers.py:982 #, python-format -msgid " %d unread group chat message" -msgid_plural " %d unread group chat messages" -msgstr[0] " %d непрочитанное сообщение в комнате" -msgstr[1] " %d непрочитанных сообщения в комнате" -msgstr[2] " %d непрочитанных сообщений в комнате" +msgid " from user %s" +msgstr "" -#: ../src/common/helpers.py:899 +#: ../src/common/helpers.py:965 #, python-format -msgid " %d unread private message" -msgid_plural " %d unread private messages" -msgstr[0] " %d непрочитанное личное сообщение" -msgstr[1] " %d непрочитанных личных сообщения" -msgstr[2] " %d непрочитанных личных сообщения" +msgid " from %s" +msgstr " от %s" -#: ../src/common/helpers.py:909 ../src/common/helpers.py:911 +#: ../src/common/helpers.py:972 ../src/common/helpers.py:979 +#, python-format +msgid "%d event pending" +msgid_plural "%d events pending" +msgstr[0] "%d событие пропущено" +msgstr[1] "%d события пропущено" +msgstr[2] "%d событий пропущено" + +#: ../src/common/helpers.py:1012 #, python-format msgid "Gajim - %s" msgstr "Gajim - %s" #. we talk about a file -#: ../src/common/optparser.py:60 +#: ../src/common/optparser.py:65 #, python-format msgid "error: cannot open %s for reading" msgstr "ошибка: не могу открыть %s для чтения" -#: ../src/common/optparser.py:183 -msgid "gtk+" -msgstr "gtk+" - -#: ../src/common/optparser.py:192 ../src/common/optparser.py:193 +#: ../src/common/optparser.py:215 ../src/common/optparser.py:216 msgid "cyan" msgstr "синий" -#: ../src/common/optparser.py:302 -msgid "migrating logs database to indeces" +#: ../src/common/optparser.py:332 +msgid "migrating logs database to indices" msgstr "переносим журнал на индексы" -#: ../src/common/passwords.py:86 +#: ../src/common/passwords.py:88 #, python-format msgid "Gajim account %s" msgstr "Учётная запись Gajim %s" -#: ../src/common/zeroconf/client_zeroconf.py:189 -msgid "Connection to host could not be established: Incorrect answer from server." -msgstr "Нельзя подключиться к хосту: Неверный ответ от сервера." - -#: ../src/common/zeroconf/client_zeroconf.py:205 +#: ../src/common/zeroconf/client_zeroconf.py:149 +#: ../src/common/zeroconf/client_zeroconf.py:232 msgid "Connection to host could not be established" msgstr "Не удалось соединиться с хостом" -#: ../src/common/zeroconf/client_zeroconf.py:334 -msgid "Connection to host could not be established: Timeout while sending data." +#: ../src/common/zeroconf/client_zeroconf.py:206 +msgid "" +"Connection to host could not be established: Incorrect answer from server." +msgstr "Нельзя подключиться к хосту: Неверный ответ от сервера." + +#: ../src/common/zeroconf/client_zeroconf.py:366 +msgid "" +"Connection to host could not be established: Timeout while sending data." msgstr "Не удалось соединиться с хостом: истекло время ожидания." -#: ../src/common/zeroconf/client_zeroconf.py:629 +#: ../src/common/zeroconf/client_zeroconf.py:652 msgid "Contact is offline. Your message could not be sent." msgstr "Контакт не в сети. Отправить сообщение не удалось." -#: ../src/common/zeroconf/connection_zeroconf.py:197 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:243 +#, fuzzy, 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 не " +"действителен (не правилен?), поэтому игнорируется." + +#: ../src/common/zeroconf/connection_zeroconf.py:209 msgid "To continue sending and receiving messages, you will need to reconnect." msgstr "Требуется переподключение для продолжения приема и отправки сообщений." -#: ../src/common/zeroconf/connection_zeroconf.py:207 +#: ../src/common/zeroconf/connection_zeroconf.py:232 msgid "Avahi error" msgstr "Ошибка Avahi" -#: ../src/common/zeroconf/connection_zeroconf.py:207 +#: ../src/common/zeroconf/connection_zeroconf.py:232 #, python-format msgid "" "%s\n" "Link-local messaging might not work properly." msgstr "" -#: ../src/common/zeroconf/connection_zeroconf.py:218 +#: ../src/common/zeroconf/connection_zeroconf.py:243 msgid "Please check if Avahi is installed." msgstr "Пожалуйста, удостоверьтесь что Avahi установлен." -#: ../src/common/zeroconf/connection_zeroconf.py:227 -#: ../src/common/zeroconf/connection_zeroconf.py:231 +#: ../src/common/zeroconf/connection_zeroconf.py:252 +#: ../src/common/zeroconf/connection_zeroconf.py:256 msgid "Could not start local service" msgstr "Не могу запустить локальный сервис" -#: ../src/common/zeroconf/connection_zeroconf.py:228 +#: ../src/common/zeroconf/connection_zeroconf.py:253 #, python-format msgid "Unable to bind to port %d." msgstr "Не могу использовать порт %d." -#: ../src/common/zeroconf/connection_zeroconf.py:232 -#: ../src/common/zeroconf/connection_zeroconf.py:325 +#: ../src/common/zeroconf/connection_zeroconf.py:257 +#: ../src/common/zeroconf/connection_zeroconf.py:352 msgid "Please check if avahi-daemon is running." msgstr "Пожалуйста, удостоверьтесь что демон avahi запущен." -#: ../src/common/zeroconf/connection_zeroconf.py:324 +#: ../src/common/zeroconf/connection_zeroconf.py:351 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Не могу изменить статус учётной записи \"%s\"" -#: ../src/common/zeroconf/connection_zeroconf.py:341 +#: ../src/common/zeroconf/connection_zeroconf.py:368 msgid "" "You are not connected or not visible to others. Your message could not be " "sent." -msgstr "Вы не подключены или невидимы для других. Ваше сообщение нельзы отправить." +msgstr "" +"Вы не подключены или невидимы для других. Ваше сообщение нельзы отправить." #. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:353 +#: ../src/common/zeroconf/connection_zeroconf.py:380 msgid "[This message is encrypted]" msgstr "[Это сообщение зашифровано]" -#: ../src/common/zeroconf/zeroconf.py:180 +#: ../src/common/zeroconf/zeroconf_avahi.py:183 +#: ../src/common/zeroconf/zeroconf_bonjour.py:194 #, python-format msgid "Error while adding service. %s" msgstr "Ошибка при добавлении службы. %s" +#~ msgid "Save passphrase" +#~ msgstr "Сохранить парольную фразу (небезопасно)" diff --git a/po/sr@Latn.po b/po/sr@Latn.po new file mode 100644 index 000000000..45007246e --- /dev/null +++ b/po/sr@Latn.po @@ -0,0 +1,7637 @@ +# translation of sr.po to +# Serbian translations for gajim. +# Copyright (C) 2006 RiLinux +# This file is distributed under the same license as the gajim package. +# B. Kokanovic , 2007. +# Branko Kokanovic , 2007. +# +#: ../src/gajim-remote.py:212 ../src/gajim-remote.py:219 +#: ../src/gajim-remote.py:245 ../src/gajim-remote.py:246 +#: ../src/gajim-remote.py:252 ../src/gajim-remote.py:253 +#: ../src/gajim-remote.py:254 ../src/gajim-remote.py:255 +msgid "" +msgstr "" +"Project-Id-Version: sr\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-09-12 09:53+0200\n" +"PO-Revision-Date: 2007-09-09 21:30+0200\n" +"Last-Translator: Branko Kokanovic\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" +"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: KBabel 1.11.4\n" + +#: ../data/gajim.desktop.in.in.h:1 +msgid "A GTK+ Jabber client" +msgstr "GTK+ Džaber klijent" + +#: ../data/gajim.desktop.in.in.h:2 +msgid "Gajim Instant Messenger" +msgstr "Gajim Brze Poruke" + +#: ../data/gajim.desktop.in.in.h:3 +msgid "Jabber IM Client" +msgstr "Džaber IM Klijent" + +#: ../data/glade/account_context_menu.glade.h:1 +#: ../data/glade/roster_window.glade.h:8 +#, fuzzy +msgid "Join _Group Chat..." +msgstr "Priključi se _grupnom razgovoru" + +#: ../data/glade/account_context_menu.glade.h:2 +msgid "_Add Contact..." +msgstr "_Dodaj kontakt..." + +#: ../data/glade/account_context_menu.glade.h:3 +#: ../data/glade/roster_window.glade.h:15 +msgid "_Discover Services" +msgstr "_Otkrivanje servisa" + +#: ../data/glade/account_context_menu.glade.h:4 +msgid "_Execute Command..." +msgstr "_Izvrši naredbu..." + +#: ../data/glade/account_context_menu.glade.h:5 +#, fuzzy +msgid "_Modify Account" +msgstr "Izmeni nalog" + +#: ../data/glade/account_context_menu.glade.h:6 +msgid "_Open Gmail Inbox" +msgstr "_Otvori Gmail dolaznu poštu" + +#: ../data/glade/account_context_menu.glade.h:7 +#: ../data/glade/roster_window.glade.h:22 +#, fuzzy +msgid "_Start Chat..." +msgstr "_Započni razgovor" + +#: ../data/glade/account_context_menu.glade.h:8 +#: ../data/glade/zeroconf_context_menu.glade.h:2 +msgid "_Status" +msgstr "_Status" + +#: ../data/glade/account_creation_wizard_window.glade.h:1 +#, fuzzy +msgid "" +"Connecting to server\n" +"\n" +"Please wait..." +msgstr "" +"Korisnički nalog je u procesu stvaranja\n" +"\n" +"Molimo pričekajte..." + +#: ../data/glade/account_creation_wizard_window.glade.h:4 +msgid "Please choose one of the options below:" +msgstr "Molimo odaberite jednu od opcija ispod:" + +#: ../data/glade/account_creation_wizard_window.glade.h:5 +msgid "Please fill in the data for your new account" +msgstr "Molimo popunimo podatke za Vaš novi korisnički nalog" + +#: ../data/glade/account_creation_wizard_window.glade.h:6 +msgid "Please select a server" +msgstr "" + +#: ../data/glade/account_creation_wizard_window.glade.h:7 +msgid "Click to see features (like MSN, ICQ transports) of jabber servers" +msgstr "" +"Kliknite da vidite mogućnosti (kao što su MSN, ICQ transporti) džaber " +"servera " + +#: ../data/glade/account_creation_wizard_window.glade.h:8 +msgid "Connect when I press Finish" +msgstr "Poveži se kada pritisnem Završi" + +#: ../data/glade/account_creation_wizard_window.glade.h:9 +msgid "Gajim: Account Creation Wizard" +msgstr "Gajim: čarobnjak za kreiranje naloga" + +#: ../data/glade/account_creation_wizard_window.glade.h:10 +#, fuzzy +msgid "I already have an account I want to _use" +msgstr "Već imam nalog koji želim da koristim" + +#: ../data/glade/account_creation_wizard_window.glade.h:11 +msgid "I want to _register for a new account" +msgstr "Želim da registrujem novi nalog" + +#: ../data/glade/account_creation_wizard_window.glade.h:12 +#: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/accounts_window.glade.h:22 +msgid "If checked, Gajim will remember the password for this account" +msgstr "Ako je označeno, Gajim će pamtiti lozinku za ovaj nalog" + +#: ../data/glade/account_creation_wizard_window.glade.h:13 +#: ../data/glade/account_modification_window.glade.h:26 +#: ../data/glade/accounts_window.glade.h:32 +msgid "Manage..." +msgstr "Podesi..." + +#: ../data/glade/account_creation_wizard_window.glade.h:14 +#, fuzzy +msgid "Prox_y:" +msgstr "Proksi:" + +#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../data/glade/account_modification_window.glade.h:40 +#: ../data/glade/accounts_window.glade.h:48 +msgid "Save pass_word" +msgstr "Snimi lozinku" + +#: ../data/glade/account_creation_wizard_window.glade.h:16 +msgid "Servers Features" +msgstr "Mogućnosti servera" + +#: ../data/glade/account_creation_wizard_window.glade.h:17 +msgid "Set my profile when I connect" +msgstr "Postavi moj profil pri povezivanju" + +#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_modification_window.glade.h:45 +#: ../data/glade/accounts_window.glade.h:53 +msgid "Use custom hostname/port" +msgstr "Koristi Vaše određeno ime hosta/port " + +#: ../data/glade/account_creation_wizard_window.glade.h:19 +msgid "" +"You need to have an account in order to connect\n" +"to the Jabber network." +msgstr "" +"Morate posedovati račun da biste se mogli povezati\n" +"na džaber mrežu." + +#: ../data/glade/account_creation_wizard_window.glade.h:21 +msgid "Your JID:" +msgstr "Vaš džaber ID:" + +#: ../data/glade/account_creation_wizard_window.glade.h:22 +#: ../data/glade/roster_window.glade.h:13 +msgid "_Advanced" +msgstr "_Napredno" + +#: ../data/glade/account_creation_wizard_window.glade.h:23 +msgid "_Finish" +msgstr "_Završi" + +#: ../data/glade/account_creation_wizard_window.glade.h:24 +#, fuzzy +msgid "_Hostname:" +msgstr "Ime hosta" + +#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_modification_window.glade.h:50 +#: ../data/glade/accounts_window.glade.h:58 +msgid "_Password:" +msgstr "_Lozinka:" + +#: ../data/glade/account_creation_wizard_window.glade.h:26 +#: ../data/glade/manage_proxies_window.glade.h:11 +msgid "_Port:" +msgstr "_Port:" + +#: ../data/glade/account_creation_wizard_window.glade.h:27 +msgid "_Server:" +msgstr "_Server:" + +#: ../data/glade/account_creation_wizard_window.glade.h:28 +#: ../data/glade/manage_proxies_window.glade.h:12 +msgid "_Username:" +msgstr "_Korisničko ime:" + +#: ../data/glade/account_modification_window.glade.h:1 +#: ../data/glade/accounts_window.glade.h:1 +#: ../data/glade/preferences_window.glade.h:8 +msgid "Miscellaneous" +msgstr "Ostalo" + +#: ../data/glade/account_modification_window.glade.h:2 +#: ../data/glade/accounts_window.glade.h:2 +#: ../data/glade/zeroconf_properties_window.glade.h:1 +msgid "OpenPGP" +msgstr "OpenPGP" + +#: ../data/glade/account_modification_window.glade.h:3 +#: ../data/glade/accounts_window.glade.h:3 +#: ../data/glade/zeroconf_properties_window.glade.h:2 +msgid "Personal Information" +msgstr "Lične informacije" + +#: ../data/glade/account_modification_window.glade.h:4 +#: ../data/glade/accounts_window.glade.h:4 +msgid "Account" +msgstr "Nalog" + +#: ../data/glade/account_modification_window.glade.h:5 +msgid "Account Modification" +msgstr "Izmena naloga" + +#: ../data/glade/account_modification_window.glade.h:6 +#: ../data/glade/accounts_window.glade.h:5 +#, fuzzy +msgid "Administration operations" +msgstr "Lista administratora" + +#: ../data/glade/account_modification_window.glade.h:7 +#: ../data/glade/accounts_window.glade.h:6 +msgid "Auto-reconnect when connection is lost" +msgstr "Automatsko povezivanje kada se veza izgubi" + +#: ../data/glade/account_modification_window.glade.h:8 +#: ../data/glade/accounts_window.glade.h:7 +#: ../data/glade/zeroconf_properties_window.glade.h:3 +msgid "C_onnect on Gajim startup" +msgstr "Po_veži se prilikom pokretanja Gajima" + +#: ../data/glade/account_modification_window.glade.h:9 +#: ../data/glade/accounts_window.glade.h:8 +msgid "Chan_ge Password" +msgstr "I_zmeni lozinku" + +#: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/accounts_window.glade.h:9 +msgid "" +"Check this so Gajim will connect in port 5223 where legacy servers are " +"expected to have SSL capabilities. Note that Gajim uses TLS encryption by " +"default if broadcasted by the server, and with this option enabled TLS will " +"be disabled" +msgstr "" +"Označite ovo da biste se povezali na port 5223 gde se predpostavlja da " +"stariji serveri imaju SSL mogućnosti. Primetite da Gajim koristi " +"podrazumevano TLS enkripciju akoje server traži, a sa ovo opcijom " +"omogućenom, TLS će biti isključen" + +#: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/accounts_window.glade.h:10 +#: ../data/glade/zeroconf_properties_window.glade.h:4 +msgid "Choose _Key..." +msgstr "Odaberite _Ključ" + +#: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/accounts_window.glade.h:11 +msgid "Click to change account's password" +msgstr "Kliknite za izmenu lozinke Vašeg naloga" + +#: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/accounts_window.glade.h:12 +msgid "Click to request authorization to all contacts of another account" +msgstr "" + +#: ../data/glade/account_modification_window.glade.h:14 +#: ../data/glade/accounts_window.glade.h:13 +msgid "Connection" +msgstr "Veza" + +#: ../data/glade/account_modification_window.glade.h:15 +#: ../data/glade/accounts_window.glade.h:15 +msgid "Edit Personal Information..." +msgstr "Izmeni lične informacije" + +#. No configured account +#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/accounts_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:6 ../src/notify.py:471 +#: ../src/notify.py:493 ../src/notify.py:505 ../src/common/helpers.py:964 +#: ../src/common/helpers.py:976 +msgid "Gajim" +msgstr "Gajim" + +#. General group cannot be changed +#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/accounts_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:45 +#: ../data/glade/zeroconf_properties_window.glade.h:7 +#: ../src/roster_window.py:359 ../src/roster_window.py:624 +#: ../src/roster_window.py:1360 ../src/roster_window.py:1728 +#: ../src/roster_window.py:2112 ../src/roster_window.py:2628 +#: ../src/roster_window.py:2746 ../src/common/contacts.py:309 +msgid "General" +msgstr "Opšte" + +#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/accounts_window.glade.h:20 +msgid "Hostname: " +msgstr "Ime hosta" + +#: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/accounts_window.glade.h:21 +msgid "" +"If checked, Gajim will also broadcast some more IPs except from just your " +"IP, so file transfer has higher chances of working." +msgstr "" +"Ako je ovo označeno, Gajim će odašiljati još neke IP adrese pored Vaše,tako " +"da prenos datoteka ima veće šanse da će raditi." + +#: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/accounts_window.glade.h:23 +msgid "" +"If checked, Gajim will send keep-alive packets to prevent connection timeout " +"which results in disconnection" +msgstr "" +"Ako je ovo označeno, Gajim će slati poruke da je prisutan kako bi sprečio " +"prekid veze zbog duge neaktivnosti" + +#: ../data/glade/account_modification_window.glade.h:22 +#: ../data/glade/accounts_window.glade.h:24 +#: ../data/glade/zeroconf_properties_window.glade.h:8 +msgid "" +"If checked, Gajim will store the password in ~/.gajim/config with 'read' " +"permission only for you" +msgstr "" +"Ako je ovo označeno, Gajim će čuvati lozinke u ~/.gajim/config sa 'čitaj' " +"privilegijom samo za Vas" + +#: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/accounts_window.glade.h:25 +#: ../data/glade/zeroconf_properties_window.glade.h:9 +msgid "" +"If checked, Gajim, when launched, will automatically connect to jabber using " +"this account" +msgstr "" +"Ako je ovo označeno, Gajim će se pri svakom pokretanju automatski povezati " +"na džaber koristeći ovaj nalog" + +#: ../data/glade/account_modification_window.glade.h:24 +#: ../data/glade/accounts_window.glade.h:26 +#: ../data/glade/zeroconf_properties_window.glade.h:10 +msgid "" +"If checked, any change to the global status (handled by the combobox at the " +"bottom of the roster window) will change the status of this account " +"accordingly" +msgstr "" +"Ako je ovo označeno, svaka promena globalnog statusa (koji se menja iz " +"padajućeg menija na dnu prozora kontakt liste) će promeniti i status ovog " +"naloga " + +#: ../data/glade/account_modification_window.glade.h:25 +#: ../data/glade/accounts_window.glade.h:29 +msgid "Information about you, as stored in the server" +msgstr "Informacije o Vama, kako su uskladištene na serveru" + +#: ../data/glade/account_modification_window.glade.h:27 +#: ../data/glade/accounts_window.glade.h:34 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1524 +#: ../src/config.py:2010 +msgid "No key selected" +msgstr "Nije odabran nijedan ključ" + +#. None means no proxy profile selected +#. GPG Key +#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/accounts_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:32 ../src/config.py:1110 +#: ../src/config.py:1181 ../src/config.py:1430 ../src/config.py:1435 +#: ../src/config.py:1906 ../src/config.py:1993 ../src/config.py:2009 +#: ../src/config.py:3109 ../src/config.py:3155 ../src/dialogs.py:286 +#: ../src/dialogs.py:288 ../src/roster_window.py:1832 +#: ../src/roster_window.py:1839 ../src/roster_window.py:1846 +msgid "None" +msgstr "Ništa" + +#: ../data/glade/account_modification_window.glade.h:30 +#: ../data/glade/accounts_window.glade.h:37 +#: ../data/glade/profile_window.glade.h:26 +#: ../data/glade/zeroconf_properties_window.glade.h:17 +msgid "Personal Information" +msgstr "Lične Informacije" + +#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/accounts_window.glade.h:38 +msgid "Port: " +msgstr "Port:" + +#: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/accounts_window.glade.h:39 +msgid "Priori_ty:" +msgstr "Priori_tet" + +#: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/accounts_window.glade.h:40 +msgid "" +"Priority is used in Jabber to determine who gets the events from the jabber " +"server when two or more clients are connected using the same account; The " +"client with the highest priority gets the events" +msgstr "" +"Prioritet se u džaberu koristi da odredi ko dobija događaje sa servera u " +"slučaju da su dva ili više klijenata povezana na njega; klijent sa najvećim " +"prioritetomdobija događaje" + +#: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/accounts_window.glade.h:41 +msgid "Priority will change automatically according to your status." +msgstr "Prioritet će biti automatski promenjen prema Vašem statusu." + +#: ../data/glade/account_modification_window.glade.h:35 +#: ../data/glade/accounts_window.glade.h:42 +msgid "Proxy:" +msgstr "Proksi:" + +#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/accounts_window.glade.h:44 +msgid "Resour_ce:" +msgstr "Resur_s" + +#: ../data/glade/account_modification_window.glade.h:37 +#: ../data/glade/accounts_window.glade.h:45 +msgid "" +"Resource is sent to the Jabber server in order to separate the same JID in " +"two or more parts depending on the number of the clients connected in the " +"same server with the same account. So you might be connected in the same " +"account with resource 'Home' and 'Work' at the same time. The resource which " +"has the highest priority will get the events. (see below)" +msgstr "" +"Resurs se šalje Džaber serveru kako bi se razlikovao isti džaber ID kod 2 " +"ili više klijenata spojena u isto vreme na isti server sa istim računom. " +"Dakle, možete biti spojeni sa resursom 'Posao' ili 'Kuća', klijent sa " +"najvišim prioritetom će dobijati obaveštenja o događajima" + +#: ../data/glade/account_modification_window.glade.h:38 +#: ../data/glade/accounts_window.glade.h:46 +#: ../data/glade/zeroconf_properties_window.glade.h:18 +msgid "Save _passphrase (insecure)" +msgstr "Snimi _lozinku (nesigurno)" + +#: ../data/glade/account_modification_window.glade.h:39 +#: ../data/glade/accounts_window.glade.h:47 +#: ../data/glade/zeroconf_properties_window.glade.h:19 +msgid "Save conversation _logs for all contacts" +msgstr "Sni_mi dnevnik razgovora za sve kontakte" + +#: ../data/glade/account_modification_window.glade.h:41 +#: ../data/glade/accounts_window.glade.h:49 +msgid "Send keep-alive packets" +msgstr "Šalji podatke o živosti" + +#: ../data/glade/account_modification_window.glade.h:42 +#: ../data/glade/accounts_window.glade.h:50 +#: ../data/glade/zeroconf_properties_window.glade.h:20 +msgid "Synch_ronize account status with global status" +msgstr "Sinhroniziraj status naloga sa globalnim statusom" + +#: ../data/glade/account_modification_window.glade.h:43 +#: ../data/glade/accounts_window.glade.h:51 +#, fuzzy +msgid "Synchronise contacts" +msgstr "Prikaži kontakte koji nisu na vezi" + +#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/accounts_window.glade.h:52 +msgid "Use _SSL (legacy)" +msgstr "Koristi _SSL (zastarelo)" + +#: ../data/glade/account_modification_window.glade.h:46 +#: ../data/glade/accounts_window.glade.h:55 +msgid "Use file transfer proxies" +msgstr "Koristi proksi za prenos datoteka" + +#: ../data/glade/account_modification_window.glade.h:47 +#: ../data/glade/accounts_window.glade.h:56 +msgid "_Adjust to status" +msgstr "_Podesi prema statusu" + +#: ../data/glade/account_modification_window.glade.h:48 +#: ../data/glade/accounts_window.glade.h:57 +msgid "_Jabber ID:" +msgstr "_Džaber ID:" + +#: ../data/glade/account_modification_window.glade.h:49 +msgid "_Name:" +msgstr "_Ime:" + +#: ../data/glade/accounts_window.glade.h:14 +#: ../data/glade/profile_window.glade.h:11 +#: ../data/glade/vcard_information_window.glade.h:16 +#: ../data/glade/zeroconf_information_window.glade.h:2 +#: ../data/glade/zeroconf_properties_window.glade.h:5 +msgid "E-Mail:" +msgstr "E-mejl:" + +#. XML Console enable checkbutton +#: ../data/glade/accounts_window.glade.h:16 +#: ../data/glade/xml_console_window.glade.h:4 +msgid "Enable" +msgstr "Omogući" + +#: ../data/glade/accounts_window.glade.h:17 +#: ../data/glade/zeroconf_information_window.glade.h:3 +#: ../data/glade/zeroconf_properties_window.glade.h:6 +msgid "First Name:" +msgstr "Ime:" + +#: ../data/glade/accounts_window.glade.h:27 +#: ../data/glade/zeroconf_properties_window.glade.h:11 +msgid "" +"If the default port that is used for incoming messages is unfitting for your " +"setup you can select another one here.\n" +"You might consider to change possible firewall settings." +msgstr "" +"Ako je podrazumevani port koji se koristi za dolazne poruke neodgovarajući " +"za Vaša podešavanja, ovde možete odabrati neki drugi.\n" +"Mogli biste uzeti u obzir i mogućnost izmene podešavanja firewall-a." + +#: ../data/glade/accounts_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:26 +#: ../data/glade/zeroconf_information_window.glade.h:4 +#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:453 +msgid "Jabber ID:" +msgstr "Džaber ID:" + +#: ../data/glade/accounts_window.glade.h:31 +#: ../data/glade/zeroconf_information_window.glade.h:5 +#: ../data/glade/zeroconf_properties_window.glade.h:14 +msgid "Last Name:" +msgstr "Prezime:" + +#: ../data/glade/accounts_window.glade.h:33 +msgid "Mer_ge accounts" +msgstr "_Spoji naloge" + +#. Rename +#: ../data/glade/accounts_window.glade.h:43 ../src/roster_window.py:2698 +msgid "Re_name" +msgstr "Prei_menuj" + +#: ../data/glade/accounts_window.glade.h:54 +#: ../data/glade/zeroconf_properties_window.glade.h:21 +msgid "Use custom port:" +msgstr "Koristi svoj port:" + +#: ../data/glade/accounts_window.glade.h:59 +msgid "gtk-add" +msgstr "" + +#: ../data/glade/accounts_window.glade.h:60 +msgid "gtk-close" +msgstr "" + +#: ../data/glade/accounts_window.glade.h:61 +msgid "gtk-remove" +msgstr "" + +#: ../data/glade/add_new_contact_window.glade.h:1 +msgid "A_ccount:" +msgstr "_Nalog:" + +#: ../data/glade/add_new_contact_window.glade.h:2 +msgid "A_llow this contact to view my status" +msgstr "Dozvo_li ovom kontaktu da vidi moj status" + +#: ../data/glade/add_new_contact_window.glade.h:3 +msgid "Add New Contact" +msgstr "Dodaj novi kontakt" + +#: ../data/glade/add_new_contact_window.glade.h:4 +msgid "I would like to add you to my contact list." +msgstr "Želio bih da Vas dodam na listu mojih kontakata." + +#: ../data/glade/add_new_contact_window.glade.h:5 +msgid "" +"You have to register with this transport\n" +"to be able to add a contact from this\n" +"protocol. Click on register button to\n" +"proceed." +msgstr "" +"Morate se registrovati na ovaj transport\n" +"kako biste mogli dodati kontakte sa ovog\n" +"protokola. Kliknite na dugme za registraciju\n" +"za nastavak" + +#: ../data/glade/add_new_contact_window.glade.h:9 +msgid "" +"You must be connected to the transport to be able\n" +"to add a contact from this protocol." +msgstr "" +"Morate biti povezani na transport da biste mogli\n" +"dodavati kontakte sa ovog protokola." + +#: ../data/glade/add_new_contact_window.glade.h:11 +msgid "_Group:" +msgstr "_Grupa:" + +#: ../data/glade/add_new_contact_window.glade.h:12 +msgid "_Nickname:" +msgstr "_Nadimak:" + +#: ../data/glade/add_new_contact_window.glade.h:13 +msgid "_Protocol:" +msgstr "_Protokol:" + +#: ../data/glade/add_new_contact_window.glade.h:14 +msgid "_Register" +msgstr "_Registracija" + +#: ../data/glade/add_new_contact_window.glade.h:15 +msgid "_User ID:" +msgstr "_ID korisnika:" + +#: ../data/glade/adhoc_commands_window.glade.h:1 +msgid "An error has occurred:" +msgstr "Dogodila se greška:" + +#: ../data/glade/adhoc_commands_window.glade.h:2 +msgid "Choose command to execute:" +msgstr "Odaberite komandu za izvršenje:" + +#: ../data/glade/adhoc_commands_window.glade.h:3 +msgid "Ad-hoc Commands - Gajim" +msgstr "Ad-hok komande - Gajim" + +#: ../data/glade/adhoc_commands_window.glade.h:4 +msgid "Check once more" +msgstr "Označite još jednom" + +#: ../data/glade/adhoc_commands_window.glade.h:5 +msgid "Error description..." +msgstr "Opis greške" + +#: ../data/glade/adhoc_commands_window.glade.h:6 +msgid "Please wait while retrieving command list..." +msgstr "Molimo sačekajte dok se dobavlja lista komandi..." + +#: ../data/glade/adhoc_commands_window.glade.h:7 +msgid "Please wait while the command is sending..." +msgstr "Molimo sačekajte dok se komanda šalje..." + +#: ../data/glade/adhoc_commands_window.glade.h:8 +msgid "Please wait..." +msgstr "Molimo sačekajte..." + +#: ../data/glade/adhoc_commands_window.glade.h:9 +msgid "This jabber entity does not expose any commands." +msgstr "Ovaj džaber izvor ne izlaže nijednu komandu." + +#: ../data/glade/advanced_configuration_window.glade.h:1 +msgid "Description" +msgstr "Opis" + +#: ../data/glade/advanced_configuration_window.glade.h:2 +msgid "NOTE: You should restart Gajim for some settings to take effect" +msgstr "" +"NAPOMENA: Trebalo bi da ponovo pokrenete Gajim da bi neke izmene " +"podešavanja postale primenjene" + +#: ../data/glade/advanced_configuration_window.glade.h:3 +msgid "Advanced Configuration Editor" +msgstr "Napredna izmena konfiguracije" + +#: ../data/glade/advanced_configuration_window.glade.h:4 +msgid "Filter:" +msgstr "Filter:" + +#: ../data/glade/advanced_menuitem_menu.glade.h:1 +msgid "Delete MOTD" +msgstr "Izbriši poruku dana" + +#: ../data/glade/advanced_menuitem_menu.glade.h:2 +msgid "Deletes Message of the Day" +msgstr "Briše poruku dana" + +#: ../data/glade/advanced_menuitem_menu.glade.h:3 +#, fuzzy +msgid "Edit _Privacy Lists..." +msgstr "Liste _privatnosti" + +#: ../data/glade/advanced_menuitem_menu.glade.h:4 +msgid "Sends a message to users currently connected to this server" +msgstr "Šalje poruku trenutno povezanim korisnicima ovog servera" + +#: ../data/glade/advanced_menuitem_menu.glade.h:5 +#, fuzzy +msgid "Set MOTD..." +msgstr "Postavi poruku dana" + +#: ../data/glade/advanced_menuitem_menu.glade.h:6 +msgid "Sets Message of the Day" +msgstr "Postavlja poruku dana" + +#: ../data/glade/advanced_menuitem_menu.glade.h:7 +msgid "Show _XML Console" +msgstr "Prikaži _XML Konzolu" + +#: ../data/glade/advanced_menuitem_menu.glade.h:8 +#, fuzzy +msgid "Update MOTD..." +msgstr "Osveži poruku dana" + +#: ../data/glade/advanced_menuitem_menu.glade.h:9 +msgid "Updates Message of the Day" +msgstr "Osvežava poruku dana" + +#: ../data/glade/advanced_menuitem_menu.glade.h:10 +msgid "_Administrator" +msgstr "_Administrator" + +#: ../data/glade/advanced_menuitem_menu.glade.h:11 +#, fuzzy +msgid "_Send Server Message..." +msgstr "_Pošalji serversku poruku" + +#: ../data/glade/advanced_notifications_window.glade.h:1 +msgid " a window/tab opened with that contact " +msgstr " otvaranje prozora/jezička sa tim kontaktom " + +#: ../data/glade/advanced_notifications_window.glade.h:2 +msgid "Actions" +msgstr "Akcije" + +#: ../data/glade/advanced_notifications_window.glade.h:3 +msgid "Conditions" +msgstr "Uslovi" + +#: ../data/glade/advanced_notifications_window.glade.h:4 +#: ../data/glade/preferences_window.glade.h:12 +msgid "Sounds" +msgstr "Zvukovi" + +#: ../data/glade/advanced_notifications_window.glade.h:5 +msgid "Advanced Actions" +msgstr "Napredne Akcije" + +#: ../data/glade/advanced_notifications_window.glade.h:6 +msgid "Advanced Notifications Control" +msgstr "Napredna kontrola obaveštavanja" + +#: ../data/glade/advanced_notifications_window.glade.h:7 +msgid "All statuses" +msgstr "Svi statusi" + +#: ../data/glade/advanced_notifications_window.glade.h:8 +#: ../src/common/commands.py:91 ../src/common/helpers.py:246 +msgid "Away" +msgstr "Odsutan" + +#: ../data/glade/advanced_notifications_window.glade.h:9 +msgid "Busy " +msgstr "Zaposlen" + +#: ../data/glade/advanced_notifications_window.glade.h:10 +msgid "Don't have " +msgstr "Nemam " + +#: ../data/glade/advanced_notifications_window.glade.h:11 +msgid "Have " +msgstr "Imam " + +#: ../data/glade/advanced_notifications_window.glade.h:12 +#: ../src/common/helpers.py:256 +msgid "Invisible" +msgstr "Nevidljiv" + +#: ../data/glade/advanced_notifications_window.glade.h:13 +msgid "Launch a command" +msgstr "Pokrenite komandu" + +#: ../data/glade/advanced_notifications_window.glade.h:14 +#: ../src/common/helpers.py:229 +msgid "Not Available" +msgstr "Nedostupan" + +#: ../data/glade/advanced_notifications_window.glade.h:15 +msgid "One or more special statuses..." +msgstr "Jedan ili više posebnih statusa..." + +#: ../data/glade/advanced_notifications_window.glade.h:16 +msgid "Online / Free For Chat" +msgstr "Na vezi / Slobodan za razgovor" + +#: ../data/glade/advanced_notifications_window.glade.h:17 +msgid "Play a sound" +msgstr "Puštanje zvukove" + +#: ../data/glade/advanced_notifications_window.glade.h:18 +msgid "" +"Receive a Message\n" +"Contact Disconnected \n" +"Contact Change Status \n" +"Group Chat Message Highlight \n" +"Group Chat Message Received \n" +"File Transfer Request \n" +"File Transfer Started \n" +"File Transfer Finished" +msgstr "" +"Primljena poruka\n" +"Kontakt na vezi\n" +"Kontakt otišao sa veze\n" +"Kontakt promenio status\n" +"Obojena poruka na grupnom razgovoru\n" +"Primljena poruka sa grupnog razgovora\n" +"Zahtev za prenos datoteke\n" +"Počeo prenos datoteke\n" +"Završen prenos datoteke" + +#: ../data/glade/advanced_notifications_window.glade.h:26 +msgid "When " +msgstr "Kada " + +#: ../data/glade/advanced_notifications_window.glade.h:27 +msgid "" +"_Activate window manager's UrgencyHint to make chat window in taskbar flash" +msgstr "" +"_Aktiviranje upravnika prozora za bljeskanje prozora razgovora u panelu" + +#: ../data/glade/advanced_notifications_window.glade.h:28 +msgid "_Disable auto opening chat window" +msgstr "_Onemogući automatsko otvaranje prozora za razgovor" + +#: ../data/glade/advanced_notifications_window.glade.h:29 +msgid "_Disable existing popup window" +msgstr "_Onemogući postojeći iskačući prozor" + +#: ../data/glade/advanced_notifications_window.glade.h:30 +msgid "_Disable existing sound for this event" +msgstr "_Onemogući postojeći zvuk za ovaj događaj" + +#: ../data/glade/advanced_notifications_window.glade.h:31 +msgid "_Disable showing event in roster" +msgstr "_Onemogući prikazivanje događaja u listi kontakata" + +#: ../data/glade/advanced_notifications_window.glade.h:32 +msgid "_Disable showing event in systray" +msgstr "_Onemogući prikazivanje događaja u sistemskoj kaseti" + +#: ../data/glade/advanced_notifications_window.glade.h:33 +msgid "_Inform me with a popup window" +msgstr "_Obavesti me iskačućim prozorom" + +#: ../data/glade/advanced_notifications_window.glade.h:34 +msgid "_Open chat window with user" +msgstr "_Otvori prozor za razgovor sa korisnikom" + +#: ../data/glade/advanced_notifications_window.glade.h:35 +msgid "_Show event in roster" +msgstr "Prikaži događaj u listi kontakata" + +#: ../data/glade/advanced_notifications_window.glade.h:36 +msgid "_Show event in systray" +msgstr "Prikaži događaj u sistemskoj kaseti" + +#: ../data/glade/advanced_notifications_window.glade.h:37 +msgid "and I " +msgstr "i ja " + +#: ../data/glade/advanced_notifications_window.glade.h:38 +msgid "" +"contact(s)\n" +"group(s)\n" +"everybody" +msgstr "" +"kontakt(i)\n" +"grupa/e\n" +"svi" + +#: ../data/glade/advanced_notifications_window.glade.h:41 +msgid "for " +msgstr "za" + +#: ../data/glade/advanced_notifications_window.glade.h:42 +msgid "when I'm in" +msgstr "kada sam u" + +#: ../data/glade/atom_entry_window.glade.h:1 +msgid "Entry:" +msgstr "Unos:" + +#: ../data/glade/atom_entry_window.glade.h:2 +msgid "Feed name:" +msgstr "Ime teme:" + +#: ../data/glade/atom_entry_window.glade.h:3 +msgid "Last modified:" +msgstr "Zadnji put izmenjeno:" + +#: ../data/glade/atom_entry_window.glade.h:4 +msgid "New entry received" +msgstr "Nov događaj primljen" + +#: ../data/glade/atom_entry_window.glade.h:5 +msgid "You have received new entry:" +msgstr "Primili ste novi unos:" + +#: ../data/glade/change_password_dialog.glade.h:1 +msgid "Change Password" +msgstr "Izmeni lozinku" + +#: ../data/glade/change_password_dialog.glade.h:2 +msgid "Enter it again for confirmation:" +msgstr "Unesite ponovo kao potvrdu:" + +#: ../data/glade/change_password_dialog.glade.h:3 +msgid "Enter new password:" +msgstr "Unesite novu lozinku:" + +#: ../data/glade/change_status_message_dialog.glade.h:1 +msgid "Type your new status message" +msgstr "Upišite Vašu novu statusnu poruku" + +#: ../data/glade/change_status_message_dialog.glade.h:2 +msgid "Preset messages:" +msgstr "Već postavljene poruke:" + +#: ../data/glade/change_status_message_dialog.glade.h:3 +msgid "Save as Preset..." +msgstr "Snimi kao već postavljenu..." + +#: ../data/glade/chat_context_menu.glade.h:1 +msgid "Join _Group Chat" +msgstr "Priključi se _grupnom razgovoru" + +#: ../data/glade/chat_context_menu.glade.h:2 +#: ../data/glade/roster_contact_context_menu.glade.h:12 +#, fuzzy +msgid "_Add to Roster..." +msgstr "_Dodaj na listu kontakata" + +#: ../data/glade/chat_context_menu.glade.h:3 +msgid "_Copy JID/Email Address" +msgstr "_Kopiraj džaber ID/e-mejl adresu" + +#: ../data/glade/chat_context_menu.glade.h:4 +msgid "_Copy Link Location" +msgstr "_Kopiraj lokaciju veze" + +#: ../data/glade/chat_context_menu.glade.h:5 +msgid "_Open Email Composer" +msgstr "_Otvori sastavljač e-mejla" + +#: ../data/glade/chat_context_menu.glade.h:6 +msgid "_Open Link in Browser" +msgstr "_Otvori vezu u internet pregledaču" + +#: ../data/glade/chat_context_menu.glade.h:7 +#: ../data/glade/subscription_request_popup_menu.glade.h:1 +#: ../data/glade/systray_context_menu.glade.h:7 +msgid "_Start Chat" +msgstr "_Započni razgovor" + +#: ../data/glade/chat_control_popup_menu.glade.h:1 +msgid "Click to see past conversations with this contact" +msgstr "Kliknite za pregled prošlih razgovora sa ovim kontaktom" + +#: ../data/glade/chat_control_popup_menu.glade.h:2 +msgid "Invite _Friends" +msgstr "" + +#: ../data/glade/chat_control_popup_menu.glade.h:3 +#: ../data/glade/gc_occupants_menu.glade.h:3 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:4 +msgid "Send _File" +msgstr "Pošalji _datoteku" + +#: ../data/glade/chat_control_popup_menu.glade.h:4 +#, fuzzy +msgid "Toggle End to End Encryption" +msgstr "Uključi/isključi Open_PGP enkripciju" + +#: ../data/glade/chat_control_popup_menu.glade.h:5 +msgid "Toggle Open_PGP Encryption" +msgstr "Uključi/isključi Open_PGP enkripciju" + +#: ../data/glade/chat_control_popup_menu.glade.h:6 +#: ../data/glade/gc_occupants_menu.glade.h:4 +msgid "_Add to Roster" +msgstr "_Dodaj na listu kontakata" + +#: ../data/glade/chat_control_popup_menu.glade.h:7 +#: ../data/glade/gc_control_popup_menu.glade.h:7 +#: ../data/glade/gc_occupants_menu.glade.h:7 +#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:6 +#: ../src/roster_window.py:2567 +msgid "_History" +msgstr "_Istorijat" + +#: ../data/glade/data_form_window.glade.h:1 +msgid "Fill in the form." +msgstr "Popunite formular." + +#: ../data/glade/data_form_window.glade.h:2 +msgid "Room Configuration" +msgstr "Konfiguracija sobe" + +#: ../data/glade/edit_groups_dialog.glade.h:1 +msgid "Edit Groups" +msgstr "Izmeni grupe" + +#: ../data/glade/filetransfers.glade.h:1 +msgid "A list of active, completed and stopped file transfers" +msgstr "Lista prenosa aktivnih, završenih i zaustavljenih datoteka" + +#: ../data/glade/filetransfers.glade.h:2 +msgid "Cancel file transfer" +msgstr "Prekini prenos datoteke" + +#: ../data/glade/filetransfers.glade.h:3 +msgid "Cancels the selected file transfer" +msgstr "Prekini prenos označene datoteke" + +#: ../data/glade/filetransfers.glade.h:4 +msgid "Cancels the selected file transfer and removes incomplete file" +msgstr "Prekini prenos označene datoteke i izbriši nedovršenu datoteku" + +#: ../data/glade/filetransfers.glade.h:5 +msgid "Clean _up" +msgstr "_Počisti" + +#: ../data/glade/filetransfers.glade.h:6 +msgid "File Transfers" +msgstr "Prenosi datoteka" + +#: ../data/glade/filetransfers.glade.h:7 +msgid "Hides the window" +msgstr "Sakriva prozor" + +#: ../data/glade/filetransfers.glade.h:8 +msgid "Remove file transfer from the list." +msgstr "Ukloni prenos datoteka sa liste" + +#: ../data/glade/filetransfers.glade.h:9 +msgid "Removes completed, cancelled and failed file transfers from the list" +msgstr "Ukloni završene, prekinute i neuspele prenose datoteka iz liste" + +#: ../data/glade/filetransfers.glade.h:10 +msgid "Shows a list of file transfers between you and others" +msgstr "Prikazuje listu prenosa datoteka između Vas i ostalih" + +#: ../data/glade/filetransfers.glade.h:11 +msgid "" +"This action removes single file transfer from the list. If the transfer is " +"active, it is first stopped and then removed" +msgstr "" +"Ova akcija uklanja prenos datoteke sa liste. Ako je prenos aktivan, prvo se " +"zaustavlja, pa onda uklanja" + +#: ../data/glade/filetransfers.glade.h:12 +msgid "When a file transfer is complete show a popup notification" +msgstr "Prikaži iskačuće obaveštenje kada se završi prenos datoteke" + +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:774 +msgid "_Continue" +msgstr "_Nastavi" + +#: ../data/glade/filetransfers.glade.h:14 +msgid "_Notify me when a file transfer is complete" +msgstr "_Obavesti me kada se završi prenos datoteke" + +#: ../data/glade/filetransfers.glade.h:15 ../src/filetransfers_window.py:186 +msgid "_Open Containing Folder" +msgstr "_Otvori sadržavajuću fasciklu" + +#: ../data/glade/filetransfers.glade.h:16 +msgid "_Pause" +msgstr "_Pauziraj" + +#: ../data/glade/filetransfers.glade.h:17 +msgid "file transfers list" +msgstr "lista prenosa datoteka" + +#: ../data/glade/gajim_themes_window.glade.h:1 +msgid "Chatstate Tab Colors" +msgstr "Boje jezičaka statusa razgovora" + +#: ../data/glade/gajim_themes_window.glade.h:2 +msgid "" +"Account row\n" +"Group row\n" +"Contact row\n" +"Chat Banner" +msgstr "" +"Red naloga\n" +"Red grupa\n" +"Red kontakata\n" +"Baner razgovora" + +#: ../data/glade/gajim_themes_window.glade.h:6 +msgid "Bold" +msgstr "Podebljano" + +#: ../data/glade/gajim_themes_window.glade.h:7 +msgid "Composing" +msgstr "Sastavljanje" + +#: ../data/glade/gajim_themes_window.glade.h:8 +msgid "Font style:" +msgstr "Izgled fonta:" + +#: ../data/glade/gajim_themes_window.glade.h:9 +msgid "Gajim Themes Customization" +msgstr "Personalizacija Gajim tema" + +#: ../data/glade/gajim_themes_window.glade.h:10 +msgid "Gone" +msgstr "Otišao" + +#: ../data/glade/gajim_themes_window.glade.h:11 +msgid "Inactive" +msgstr "Neaktivno" + +#: ../data/glade/gajim_themes_window.glade.h:12 +msgid "Italic" +msgstr "Kurziv" + +#: ../data/glade/gajim_themes_window.glade.h:13 +msgid "" +"MUC\n" +"Messages" +msgstr "" +"Poruke\n" +"višekorisničkog razgovora" + +#: ../data/glade/gajim_themes_window.glade.h:15 +msgid "" +"MUC Directed\n" +"Messages" +msgstr "" +"Usmerene poruke\n" +"višekorisničkog razgovora" + +#: ../data/glade/gajim_themes_window.glade.h:17 +msgid "Paused" +msgstr "Pauzirano" + +#: ../data/glade/gajim_themes_window.glade.h:18 +msgid "Text _color:" +msgstr "Boja tekst_a:" + +#: ../data/glade/gajim_themes_window.glade.h:19 +msgid "Text _font:" +msgstr "_Font teksta:" + +#: ../data/glade/gajim_themes_window.glade.h:20 +msgid "_Background:" +msgstr "_Pozadina:" + +#: ../data/glade/gc_control_popup_menu.glade.h:1 +#, fuzzy +msgid "Change _Nickname..." +msgstr "Promeni _nadimak" + +#: ../data/glade/gc_control_popup_menu.glade.h:2 +#, fuzzy +msgid "Change _Subject..." +msgstr "Promeni _temu" + +#: ../data/glade/gc_control_popup_menu.glade.h:3 +msgid "Click to see past conversation in this room" +msgstr "Kliknite da pogledate prethodni razgovor u ovoj sobi" + +#: ../data/glade/gc_control_popup_menu.glade.h:4 +#, fuzzy +msgid "Configure _Room..." +msgstr "Podešavanja _sobe" + +#: ../data/glade/gc_control_popup_menu.glade.h:5 +#, fuzzy +msgid "_Bookmark" +msgstr "_Markiraj ovu so_bu" + +#: ../data/glade/gc_control_popup_menu.glade.h:6 +msgid "_Destroy Room" +msgstr "" + +#: ../data/glade/gc_control_popup_menu.glade.h:8 +#, fuzzy +msgid "_Manage Room" +msgstr "Podešavanje markera" + +#: ../data/glade/gc_control_popup_menu.glade.h:9 +msgid "_Minimize on close" +msgstr "" + +#: ../data/glade/gc_occupants_menu.glade.h:1 +msgid "Mo_derator" +msgstr "Mo_derator" + +#: ../data/glade/gc_occupants_menu.glade.h:2 +#, fuzzy +msgid "Occupant Actions" +msgstr "_Akcije prisutnih" + +#: ../data/glade/gc_occupants_menu.glade.h:5 +msgid "_Admin" +msgstr "_Admin" + +#: ../data/glade/gc_occupants_menu.glade.h:6 +msgid "_Ban" +msgstr "_Zabrani" + +#: ../data/glade/gc_occupants_menu.glade.h:8 +msgid "_Kick" +msgstr "_Izbaci" + +#: ../data/glade/gc_occupants_menu.glade.h:9 +msgid "_Member" +msgstr "_Član" + +#: ../data/glade/gc_occupants_menu.glade.h:10 +msgid "_Owner" +msgstr "_Vlasnik" + +#: ../data/glade/gc_occupants_menu.glade.h:11 +msgid "_Send Private Message" +msgstr "_Pošalji privatnu poruku" + +#: ../data/glade/gc_occupants_menu.glade.h:12 +msgid "_Voice" +msgstr "_Glas" + +#: ../data/glade/groups_post_window.glade.h:1 +msgid "Create new post" +msgstr "Napravi novu objavu" + +#: ../data/glade/groups_post_window.glade.h:2 ../src/common/helpers.py:271 +msgid "From" +msgstr "Od" + +#. holds subject +#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:142 +#: ../src/history_manager.py:173 +msgid "Subject" +msgstr "Tema" + +#: ../data/glade/history_manager.glade.h:1 +msgid "" +"Welcome to Gajim History Logs Manager\n" +"\n" +"You can select logs from the left and/or search database from below.\n" +"\n" +"WARNING:\n" +"If you plan to do massive deletions, please make sure Gajim is not running. " +"Generally avoid deletions with contacts you currently chat with." +msgstr "" +"Dobrodošli u Gajimov menadžer dnevnika istorijata\n" +"\n" +"Sa leve strane možete odabrati dnevnike i/ili niže pretražiti bazu " +"podataka.\n" +"\n" +"UPOZORENJE:\n" +"Ako planirate da radite veća uklanjanja, potrudite se da Gajim nije " +"pokrenut. Uopšte, izbegavakte uklanjanja vezana za kontakte sa kojima " +"trenutno razgovorate." + +#: ../data/glade/history_manager.glade.h:7 +msgid "Delete" +msgstr "Obriši" + +#: ../data/glade/history_manager.glade.h:8 +msgid "Export" +msgstr "Izvezi" + +#: ../data/glade/history_manager.glade.h:9 +msgid "Gajim History Logs Manager" +msgstr "Gajim menadžer dnevnika istorijata" + +#: ../data/glade/history_manager.glade.h:10 +msgid "_Search Database" +msgstr "_Pretraži bazu podataka" + +#: ../data/glade/history_window.glade.h:1 +#, fuzzy +msgid "History Viewer" +msgstr "Lista pravila" + +#: ../data/glade/history_window.glade.h:2 +#, fuzzy +msgid "JID Selection" +msgstr "Opis" + +#: ../data/glade/history_window.glade.h:3 +msgid "Build custom query" +msgstr "Izgradi prilagođen upit" + +#: ../data/glade/history_window.glade.h:4 ../src/history_window.py:199 +msgid "Conversation History" +msgstr "Istorijat razgovora" + +#: ../data/glade/history_window.glade.h:5 +msgid "" +"Enter a contact jid or MUC jid here to view its history.\n" +"If a contact is connected you can even enter his nick name.\n" +msgstr "" + +#: ../data/glade/history_window.glade.h:8 +msgid "Query Builder..." +msgstr "Graditelj upita..." + +#: ../data/glade/history_window.glade.h:9 +msgid "Search" +msgstr "Pretraga" + +#: ../data/glade/history_window.glade.h:10 +#: ../data/glade/zeroconf_information_window.glade.h:10 +msgid "_Log conversation history" +msgstr "_Pamti u dnevniku istorijat razgovora" + +#: ../data/glade/history_window.glade.h:11 ../src/disco.py:1172 +msgid "_Search" +msgstr "_Pretraga" + +#: ../data/glade/invitation_received_dialog.glade.h:1 +msgid "Accept" +msgstr "Prihvati" + +#: ../data/glade/invitation_received_dialog.glade.h:2 +#: ../data/glade/privacy_list_window.glade.h:8 +msgid "Deny" +msgstr "Odbij" + +#: ../data/glade/invitation_received_dialog.glade.h:3 +msgid "Invitation Received" +msgstr "Primljena pozivnica" + +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1265 +msgid "Join Group Chat" +msgstr "Pridruži se grupnom razgovoru" + +#: ../data/glade/join_groupchat_window.glade.h:2 +msgid "Join this room automatically when I connect" +msgstr "Pristupi ovoj sobi automatski kada se povežem" + +#: ../data/glade/join_groupchat_window.glade.h:3 +#: ../data/glade/manage_bookmarks_window.glade.h:5 +#: ../data/glade/profile_window.glade.h:24 +#: ../data/glade/vcard_information_window.glade.h:31 +msgid "Nickname:" +msgstr "Nadimak:" + +#: ../data/glade/join_groupchat_window.glade.h:4 +#: ../data/glade/manage_bookmarks_window.glade.h:6 +msgid "Password:" +msgstr "Lozinka:" + +#: ../data/glade/join_groupchat_window.glade.h:5 +msgid "Recently:" +msgstr "Nedavno:" + +#: ../data/glade/join_groupchat_window.glade.h:6 +#: ../data/glade/manage_bookmarks_window.glade.h:8 +msgid "Room:" +msgstr "Soba:" + +#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1160 +#: ../src/disco.py:1615 +msgid "_Join" +msgstr "_Pridruži se" + +#: ../data/glade/manage_accounts_window.glade.h:1 +msgid "Manage Accounts" +msgstr "Podešavanje naloga" + +#: ../data/glade/manage_bookmarks_window.glade.h:1 +msgid "Auto join" +msgstr "Automatsko povezivanje" + +#: ../data/glade/manage_bookmarks_window.glade.h:2 +msgid "If checked, Gajim will join this group chat on startup" +msgstr "" +"Ako je označeno, Gajim će se pridružiti ovom grupnom razgovoru pri pokretanju" + +#: ../data/glade/manage_bookmarks_window.glade.h:3 +msgid "Manage Bookmarks" +msgstr "Podešavanje markera" + +#: ../data/glade/manage_bookmarks_window.glade.h:4 +msgid "Minimize on Auto Join" +msgstr "" + +#: ../data/glade/manage_bookmarks_window.glade.h:7 +msgid "Print status:" +msgstr "Ispis statusa:" + +#: ../data/glade/manage_bookmarks_window.glade.h:9 +msgid "Server:" +msgstr "Server:" + +#: ../data/glade/manage_bookmarks_window.glade.h:10 +msgid "Title:" +msgstr "Naslov:" + +#: ../data/glade/manage_proxies_window.glade.h:1 +msgid "Properties" +msgstr "Karakteristike" + +#: ../data/glade/manage_proxies_window.glade.h:2 +msgid "Settings" +msgstr "Podešavanja" + +#: ../data/glade/manage_proxies_window.glade.h:3 +#, fuzzy +msgid "" +"HTTP Connect\n" +"SOCKS5" +msgstr "HTTP spoj" + +#: ../data/glade/manage_proxies_window.glade.h:5 +msgid "Manage Proxy Profiles" +msgstr "Podešavanje proksi profila" + +#: ../data/glade/manage_proxies_window.glade.h:6 +#: ../data/glade/profile_window.glade.h:23 +#: ../data/glade/vcard_information_window.glade.h:30 +msgid "Name:" +msgstr "Ime:" + +#: ../data/glade/manage_proxies_window.glade.h:7 +msgid "Pass_word:" +msgstr "Lozinka:" + +#: ../data/glade/manage_proxies_window.glade.h:8 +msgid "Type:" +msgstr "Vrsta:" + +#: ../data/glade/manage_proxies_window.glade.h:9 +msgid "Use authentication" +msgstr "Koristi autentikaciju" + +#: ../data/glade/manage_proxies_window.glade.h:10 +msgid "_Host:" +msgstr "_Host:" + +#: ../data/glade/message_window.glade.h:1 +msgid "Click to insert an emoticon (Alt+M)" +msgstr "Kliknite da ubacite smajli (Alt+M)" + +#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1213 +msgid "OpenPGP Encryption" +msgstr "OpenPGP enkripcija" + +#. 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:4 +#: ../data/glade/roster_window.glade.h:12 +#: ../data/glade/subscription_request_window.glade.h:6 +msgid "_Actions" +msgstr "_Akcije" + +#. 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:6 +#: ../data/glade/xml_console_window.glade.h:11 +#: ../src/filetransfers_window.py:243 +msgid "_Send" +msgstr "_Pošalji" + +#: ../data/glade/passphrase_dialog.glade.h:1 +msgid "Passphrase" +msgstr "Lozinka" + +#: ../data/glade/preferences_window.glade.h:1 +msgid "Advanced Configuration Editor" +msgstr "Napredna izmena konfiguracije" + +#: ../data/glade/preferences_window.glade.h:2 +msgid "Applications" +msgstr "Aplikacije" + +#: ../data/glade/preferences_window.glade.h:3 +#, fuzzy +msgid "Chat Appearance" +msgstr "Izmeni pravilo" + +#. a header for custom browser/client/file manager. so translate sth like: Custom Settings +#: ../data/glade/preferences_window.glade.h:5 +msgid "Custom" +msgstr "Personalni" + +#: ../data/glade/preferences_window.glade.h:6 +msgid "Format of a line" +msgstr "Format linije" + +#: ../data/glade/preferences_window.glade.h:7 +msgid "GMail Options" +msgstr "Gmail Opcije" + +#: ../data/glade/preferences_window.glade.h:9 +msgid "Preset Status Messages" +msgstr "Već postavljene statusne poruke" + +#: ../data/glade/preferences_window.glade.h:10 +#, fuzzy +msgid "Privacy" +msgstr "Lista privatnosti" + +#: ../data/glade/preferences_window.glade.h:11 +msgid "Roster Appearance" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:13 +#, fuzzy +msgid "Themes" +msgstr "Karakteristike" + +#: ../data/glade/preferences_window.glade.h:14 +msgid "Visual Notifications" +msgstr "Vizualna obaveštenja" + +#: ../data/glade/preferences_window.glade.h:15 +msgid "Advanced" +msgstr "Napredno" + +#: ../data/glade/preferences_window.glade.h:16 +msgid "" +"All chat states\n" +"Composing only\n" +"Disabled" +msgstr "" +"Stanja svih razgovora\n" +"Samo sastavljanje\n" +"Onemogućeno" + +#: ../data/glade/preferences_window.glade.h:19 +msgid "Allow _OS information to be sent" +msgstr "Dozvoli slanje podataka o OS-u" + +#: ../data/glade/preferences_window.glade.h:20 +msgid "Allow popup/notifications when I'm _away/na/busy/invisible" +msgstr "" +"Omogući iskačuće prozore/obaveštenja kada sam _odsutan/nedostupan/zaposlen/" +"nevidljiv" + +#: ../data/glade/preferences_window.glade.h:21 +msgid "Always check to see if Gajim is the _default Jabber client on startup" +msgstr "Proveri pri startu _da li je Gajim podrazumevani Džaber klijent" + +#: ../data/glade/preferences_window.glade.h:22 +msgid "" +"An example: If you have enabled status message for away, Gajim won't ask you " +"anymore for a status message when you change your status to away; it will " +"use the default one set here" +msgstr "" +"Primer: Ako ste omogućili statusnu poruku za odsutnost, Gajim Vas neće više " +"pitati za statusnu poruku kada promenite Vaš status u odsutnost, već će " +"korisiti onu postavljenu ovde" + +#: ../data/glade/preferences_window.glade.h:23 +msgid "Ask status message when I:" +msgstr "Pitaj za statusnu poruku pri:" + +#: ../data/glade/preferences_window.glade.h:24 +msgid "Auto _away after:" +msgstr "Autom_atski odsutan nakon:" + +#: ../data/glade/preferences_window.glade.h:25 +msgid "Auto _not available after:" +msgstr "Automatski _nedostupan nakon:" + +#: ../data/glade/preferences_window.glade.h:26 +msgid "" +"Autodetect on every Gajim startup\n" +"Always use GNOME default applications\n" +"Always use KDE default applications\n" +"Always use XFCE4 default applications\n" +"Custom" +msgstr "" +"Automatski prepoznaj pri svakom pokretanju Gajima\n" +"Uvek koristi predefinisane GNOM aplikacije\n" +"Uvek koristi predefinisane KDE aplikacije\n" +"Uvek koristi predefinisane HFCE4 aplikacije\n" +"Prilagođeno" + +#: ../data/glade/preferences_window.glade.h:31 +msgid "" +"Check this option, only if someone you don't have in the roster spams/annoys " +"you. Use with caution, because it blocks all messages from any contact that " +"is not in the roster" +msgstr "" +"Označite ovu opciju samo ako Vas neko van Vaše liste spamuje/uznemirava. " +"Koristite sa oprezom, blokiraće sve poruke koje dolaze od ljudi van Vaše " +"liste kontakata" + +#: ../data/glade/preferences_window.glade.h:32 +msgid "Configure color and font of the interface" +msgstr "Konfigurisanje boje i fonta interfejsa" + +#: ../data/glade/preferences_window.glade.h:33 +msgid "Default Status Messages" +msgstr "Podrazumevane statusne poruke" + +#: ../data/glade/preferences_window.glade.h:34 +msgid "" +"Determined by sender\n" +"Chat message\n" +"Single message" +msgstr "" +"Određuje pošaljilac\n" +"Poruka iz razgovora\n" +"Samostalna poruka" + +#: ../data/glade/preferences_window.glade.h:37 +msgid "Display _extra email details" +msgstr "Prikaži dodatne e-mejl detalje" + +#: ../data/glade/preferences_window.glade.h:38 +msgid "Display a_vatars of contacts in roster" +msgstr "Prikaži avatare kontakata na listi" + +#: ../data/glade/preferences_window.glade.h:39 +msgid "Display status _messages of contacts in roster" +msgstr "Prikaži statusne poruke kontakata na listi" + +#: ../data/glade/preferences_window.glade.h:40 +msgid "Emoticons:" +msgstr "Smajliji:" + +#: ../data/glade/preferences_window.glade.h:41 +msgid "Events" +msgstr "Događaji" + +#: ../data/glade/preferences_window.glade.h:42 +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 " +"display in chat windows." +msgstr "" +"Gajim može primati i slati meta-informacije vezane za razgovor koji vodite " +"sa kontaktom. Ovde možete odrediti koja stanja razgovora će se prikazivati u " +"prozorima razgovora." + +#: ../data/glade/preferences_window.glade.h:43 +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 " +"send to the other party." +msgstr "" +"Gajim može primati i slati meta-informacije vezane za razgovor koji vodite " +"sa kontaktom. Ovde možete odrediti koja stanja razgovora će se slati drugoj " +"osobi." + +#: ../data/glade/preferences_window.glade.h:44 +msgid "" +"Gajim will notify you via a popup window in the bottom right of the screen " +"about contacts that just signed out" +msgstr "" +"Gajim će Vas obavestiti o kontaktima koji su se upravo odjavili sa iskačućim " +"prozorom u donjem desnom uglu ekrana" + +#: ../data/glade/preferences_window.glade.h:46 +#, fuzzy +msgid "Hides buttons in chatwindows to " +msgstr "Sakriva dugmad u prozoru grupnog razgovora." + +#: ../data/glade/preferences_window.glade.h:47 +msgid "" +"If checked, Gajim will also include information about the sender of the new " +"emails" +msgstr "" +"Ako je označeno, Gajim će ujedno uključiti i informacije o pošiljaocu novih " +"e-mejlova" + +#: ../data/glade/preferences_window.glade.h:48 +msgid "" +"If checked, Gajim will display avatars of contacts in roster window and in " +"group chats" +msgstr "" +"Ako je označeno, Gajim će prikazivati avatare kontakata u listi kontakata i " +"u grupnim razgovorima" + +#: ../data/glade/preferences_window.glade.h:49 +msgid "" +"If checked, Gajim will display status messages of contacts under the contact " +"name in roster window and in group chats" +msgstr "" +"Ako je označeno, Gajim će prikazivati statusne poruke kontakata ispod imena " +"kontakta u listi kontakata i u grupnim razgovorima" + +#: ../data/glade/preferences_window.glade.h:50 +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, " +"etc...)" +msgstr "" +"Ako je označeno, Gajim će koristiti statusne ikone specifične za protokol. " +"(npr. kontakt sa MSN-a će imati msn ikone za svoje statuse)" + +#: ../data/glade/preferences_window.glade.h:51 +msgid "" +"If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " +"animated or static graphical emoticons" +msgstr "" +"Ako nije onemogućeno, Gajim će zameniti ascii smajlije kao npr. ':)' sa " +"ekvivalentnim animiranim ili statičnim grafičkim smajlijima" + +#: ../data/glade/preferences_window.glade.h:52 +msgid "Ignore rich content in incoming messages" +msgstr "Ignoriši bogato formatirani sadržaj u pristiglim porukama" + +#: ../data/glade/preferences_window.glade.h:53 +msgid "Ma_nage..." +msgstr "Pode_si..." + +#: ../data/glade/preferences_window.glade.h:54 +msgid "" +"Never\n" +"Always\n" +"Per account\n" +"Per type" +msgstr "" +"Nikad\n" +"Uvek\n" +"U zavisnosti od naloga\n" +"U zavisnosti od tipa" + +#: ../data/glade/preferences_window.glade.h:58 +#, fuzzy +msgid "Notify me about contacts that sign _in" +msgstr "Obavesti me o kontaktima koji:" + +#: ../data/glade/preferences_window.glade.h:59 +#, fuzzy +msgid "Notify me about contacts that sign _out" +msgstr "Obavesti me o kontaktima koji:" + +#: ../data/glade/preferences_window.glade.h:60 +msgid "Notify on new _GMail email" +msgstr "Obavesti me o novopristigloj Gmail e-mejl pošti" + +#: ../data/glade/preferences_window.glade.h:61 +msgid "Play _sounds" +msgstr "Puštaj zvukove" + +#: ../data/glade/preferences_window.glade.h:62 +msgid "" +"Pop it up\n" +"Notify me about it\n" +"Show only in roster" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:65 +msgid "Preferences" +msgstr "Podešavanja" + +#: ../data/glade/preferences_window.glade.h:66 +#, fuzzy +msgid "Privacy" +msgstr "Lista privatnosti" + +#: ../data/glade/preferences_window.glade.h:67 +msgid "Set status message to reflect currently playing _music track" +msgstr "" +"Postavi statusnu poruku da odražava ime trenutno puštene muzičke numere" + +#: ../data/glade/preferences_window.glade.h:68 +msgid "Sign _in" +msgstr "Prijavljivanju" + +#: ../data/glade/preferences_window.glade.h:69 +msgid "Sign _out" +msgstr "Odjavljivanju" + +#: ../data/glade/preferences_window.glade.h:70 +msgid "" +"Some messages may include rich content (formatting, colors etc). If checked, " +"Gajim will just display the raw message text." +msgstr "" +"Neke poruke mogu uključivati bogati sadržaj (formatiranje, boje itd.). Ako " +"je označeno, Gajim će samo prikazivati sirovi tekst poruke." + +#: ../data/glade/preferences_window.glade.h:71 +msgid "Status" +msgstr "Status" + +#: ../data/glade/preferences_window.glade.h:72 +#, fuzzy +msgid "Status _iconset:" +msgstr "Podrazumevani skup statusnih ikona" + +#: ../data/glade/preferences_window.glade.h:73 +msgid "T_heme:" +msgstr "T_ema:" + +#: ../data/glade/preferences_window.glade.h:74 +msgid "The auto away status message" +msgstr "Automatska statusna poruka odsutnosti" + +#: ../data/glade/preferences_window.glade.h:75 +msgid "The auto not available status message" +msgstr "Automatska statusna poruka nedostupnosti" + +#: ../data/glade/preferences_window.glade.h:76 +msgid "Treat all incoming messages as:" +msgstr "Tretiraj sve dolazne poruke kao:" + +#: ../data/glade/preferences_window.glade.h:77 +msgid "Use _transports iconsets" +msgstr "Koristi skup ikona za transportne kontakte" + +#: ../data/glade/preferences_window.glade.h:78 +#, fuzzy +msgid "Use only one message _window:" +msgstr "Prozor jedne _poruke:" + +#: ../data/glade/preferences_window.glade.h:79 +msgid "Use system _default" +msgstr "Koristi sistemski podrazumevano" + +#: ../data/glade/preferences_window.glade.h:80 +#, fuzzy +msgid "When new event is received:" +msgstr "Kada se primi novi događaj" + +#: ../data/glade/preferences_window.glade.h:81 +msgid "" +"Works for Rhythmbox and Muine players. For more players, please visit http://" +"trac.gajim.org/wiki/GajimAndMusicPlayer" +msgstr "" +"Radi sa Rhytmbox i Muine puštačima muzike. Za ostale, molimo posetite http://" +"trac.gajim.org/wiki/GajimAndMusicPlayer" + +#: ../data/glade/preferences_window.glade.h:82 +msgid "_Advanced Notifications Control..." +msgstr "_Napredno upravljanje obaveštenjima..." + +#: ../data/glade/preferences_window.glade.h:83 +msgid "_Browser:" +msgstr "_Internet pregledač:" + +#: ../data/glade/preferences_window.glade.h:84 +#, fuzzy +msgid "_Display chat state notifications:" +msgstr "Prikazana obaveštenja o stanju razgovora" + +#: ../data/glade/preferences_window.glade.h:85 +msgid "_File manager:" +msgstr "_Pregledač datoteka:" + +#: ../data/glade/preferences_window.glade.h:86 +msgid "_Font:" +msgstr "_Font:" + +#: ../data/glade/preferences_window.glade.h:87 +msgid "_Highlight misspelled words" +msgstr "_Oboji pogrešno napisane reči" + +#: ../data/glade/preferences_window.glade.h:88 +msgid "_Ignore events from contacts not in the roster" +msgstr "_Ignoriši događaje od kontakata koji nisu na listi" + +#: ../data/glade/preferences_window.glade.h:89 +msgid "_Incoming message:" +msgstr "_Dolazna poruka:" + +#: ../data/glade/preferences_window.glade.h:90 +msgid "_Log status changes of contacts" +msgstr "_Zapisuj u dnevnik statusne promene kontakata" + +#: ../data/glade/preferences_window.glade.h:91 +msgid "_Mail client:" +msgstr "_E-mejl klijent:" + +#: ../data/glade/preferences_window.glade.h:92 +#, fuzzy +msgid "_Make message windows compact" +msgstr "Prozor jedne _poruke:" + +#: ../data/glade/preferences_window.glade.h:93 +msgid "_Open..." +msgstr "_Otvori..." + +#: ../data/glade/preferences_window.glade.h:94 +msgid "_Outgoing message:" +msgstr "_Odlazna poruka:" + +#: ../data/glade/preferences_window.glade.h:95 +msgid "_Player:" +msgstr "_Puštač muzike:" + +#: ../data/glade/preferences_window.glade.h:96 +msgid "_Reset to Default Colors" +msgstr "_Ponovo učitaj podrazumevane boje" + +#: ../data/glade/preferences_window.glade.h:97 +#, fuzzy +msgid "_Send chat state notifications:" +msgstr "Prikazana obaveštenja o stanju razgovora" + +#: ../data/glade/preferences_window.glade.h:98 +msgid "_Sort contacts by status" +msgstr "_Sortiraj kontakte po statusu" + +#: ../data/glade/preferences_window.glade.h:99 +msgid "_Status message:" +msgstr "_Statusna poruka:" + +#: ../data/glade/preferences_window.glade.h:100 +msgid "_URL:" +msgstr "_URL:" + +#: ../data/glade/preferences_window.glade.h:101 +msgid "minutes" +msgstr "minuta" + +#: ../data/glade/privacy_lists_window.glade.h:1 +msgid "Privacy Lists:" +msgstr "Liste privatnosti:" + +#: ../data/glade/privacy_list_window.glade.h:1 +msgid "Add / Edit a rule" +msgstr "Dodaj / Izmeni pravilo" + +#: ../data/glade/privacy_list_window.glade.h:2 +msgid "List of rules" +msgstr "Lista pravila" + +#: ../data/glade/privacy_list_window.glade.h:3 +msgid "Privacy List" +msgstr "Lista privatnosti" + +#: ../data/glade/privacy_list_window.glade.h:4 +msgid "Active for this session" +msgstr "Aktivno za ovu sesiju" + +#: ../data/glade/privacy_list_window.glade.h:5 +msgid "Active on each startup" +msgstr "Aktovno po svakom pokretanju" + +#: ../data/glade/privacy_list_window.glade.h:6 +msgid "All" +msgstr "Svi" + +#: ../data/glade/privacy_list_window.glade.h:7 +msgid "Allow" +msgstr "Dozvoli" + +#: ../data/glade/privacy_list_window.glade.h:9 +msgid "JabberID" +msgstr "Džaber ID" + +#: ../data/glade/privacy_list_window.glade.h:10 +msgid "Order:" +msgstr "Poredak:" + +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2104 +msgid "Privacy List" +msgstr "Lista privatnosti" + +#: ../data/glade/privacy_list_window.glade.h:12 +msgid "all by subscription" +msgstr "sve prema pretplati" + +#: ../data/glade/privacy_list_window.glade.h:13 +msgid "all in the group" +msgstr "sve u grupi" + +#: ../data/glade/privacy_list_window.glade.h:14 +msgid "" +"none\n" +"both\n" +"from\n" +"to" +msgstr "" +"nijedna\n" +"oboje\n" +"od\n" +"za" + +#: ../data/glade/privacy_list_window.glade.h:18 +msgid "to send me messages" +msgstr "da mi šalje poruke" + +#: ../data/glade/privacy_list_window.glade.h:19 +msgid "to send me queries" +msgstr "da mi šalje upite" + +#: ../data/glade/privacy_list_window.glade.h:20 +msgid "to send me status" +msgstr "da mi pošalje status" + +#: ../data/glade/privacy_list_window.glade.h:21 +msgid "to view my status" +msgstr "da vidi moj status" + +#. "About" is the text of a tab of vcard window +#: ../data/glade/profile_window.glade.h:2 +#: ../data/glade/vcard_information_window.glade.h:2 +msgid "About" +msgstr "O" + +#: ../data/glade/profile_window.glade.h:3 +#: ../data/glade/vcard_information_window.glade.h:3 +msgid "Address" +msgstr "Adresa:" + +#: ../data/glade/profile_window.glade.h:4 +msgid "Avatar:" +msgstr "Avatar:" + +#: ../data/glade/profile_window.glade.h:5 +#: ../data/glade/vcard_information_window.glade.h:6 +msgid "Birthday:" +msgstr "Rođendan:" + +#: ../data/glade/profile_window.glade.h:6 +#: ../data/glade/vcard_information_window.glade.h:7 +msgid "City:" +msgstr "Mesto:" + +#: ../data/glade/profile_window.glade.h:7 +msgid "Click to set your avatar" +msgstr "Kliknite da biste postavili Vaš avatar" + +#: ../data/glade/profile_window.glade.h:8 +#: ../data/glade/vcard_information_window.glade.h:10 +msgid "Company:" +msgstr "Preduzeće:" + +#: ../data/glade/profile_window.glade.h:9 +#: ../data/glade/vcard_information_window.glade.h:14 +msgid "Country:" +msgstr "Država:" + +#: ../data/glade/profile_window.glade.h:10 +#: ../data/glade/vcard_information_window.glade.h:15 +msgid "Department:" +msgstr "Odsek:" + +#: ../data/glade/profile_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:17 +msgid "Extra Address:" +msgstr "Dodatna adresa:" + +#. Family Name +#: ../data/glade/profile_window.glade.h:14 +#: ../data/glade/vcard_information_window.glade.h:19 +msgid "Family:" +msgstr "Familija:" + +#. Do NOT change sequence. Just translate YYYY and MM and DD (from Year, Month, Day accordingly) +#: ../data/glade/profile_window.glade.h:16 +#: ../data/glade/vcard_information_window.glade.h:21 +msgid "Format: YYYY-MM-DD" +msgstr "Format: GGGG-MM-DD" + +#: ../data/glade/profile_window.glade.h:17 +#: ../data/glade/vcard_information_window.glade.h:22 +#, fuzzy +msgid "Full Name" +msgstr "Ime" + +#. Given Name +#: ../data/glade/profile_window.glade.h:19 +#: ../data/glade/vcard_information_window.glade.h:24 +msgid "Given:" +msgstr "Dato:" + +#: ../data/glade/profile_window.glade.h:20 +#: ../data/glade/vcard_information_window.glade.h:25 +msgid "Homepage:" +msgstr "Lična strana:" + +#. Middle Name +#: ../data/glade/profile_window.glade.h:22 +#: ../data/glade/vcard_information_window.glade.h:28 +msgid "Middle:" +msgstr "Srednje:" + +#: ../data/glade/profile_window.glade.h:25 +#: ../data/glade/vcard_information_window.glade.h:34 +msgid "Personal Info" +msgstr "Lične informacije" + +#: ../data/glade/profile_window.glade.h:27 +#: ../data/glade/vcard_information_window.glade.h:35 +msgid "Phone No.:" +msgstr "Broj telefona:" + +#: ../data/glade/profile_window.glade.h:28 +#: ../data/glade/vcard_information_window.glade.h:36 +msgid "Position:" +msgstr "Pozicija:" + +#: ../data/glade/profile_window.glade.h:29 +#: ../data/glade/vcard_information_window.glade.h:37 +msgid "Postal Code:" +msgstr "Poštanski broj:" + +#. Prefix in Name +#: ../data/glade/profile_window.glade.h:31 +#: ../data/glade/vcard_information_window.glade.h:39 +msgid "Prefix:" +msgstr "Prefiks:" + +#: ../data/glade/profile_window.glade.h:32 +#: ../data/glade/vcard_information_window.glade.h:41 ../src/vcard.py:302 +msgid "Role:" +msgstr "Uloga:" + +#: ../data/glade/profile_window.glade.h:33 +#: ../data/glade/vcard_information_window.glade.h:42 +msgid "State:" +msgstr "Država:" + +#: ../data/glade/profile_window.glade.h:34 +#: ../data/glade/vcard_information_window.glade.h:44 +msgid "Street:" +msgstr "Ulica:" + +#. Suffix in Name +#: ../data/glade/profile_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:48 +msgid "Suffix:" +msgstr "Sufiks:" + +#: ../data/glade/profile_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:50 +msgid "Work" +msgstr "Posao" + +#: ../data/glade/remove_account_window.glade.h:1 +msgid "What do you want to do?" +msgstr "Šta želite da uradite?" + +#: ../data/glade/remove_account_window.glade.h:2 +msgid "Remove account _only from Gajim" +msgstr "Ukloni nalog samo iz Gajima" + +#: ../data/glade/remove_account_window.glade.h:3 +msgid "Remove account from Gajim and from _server" +msgstr "Ukloni nalog i iz Gajima i sa servera" + +#. Remove +#. Remove group +#. Remove +#: ../data/glade/remove_account_window.glade.h:4 +#: ../data/glade/roster_contact_context_menu.glade.h:18 +#: ../src/roster_window.py:2524 ../src/roster_window.py:2734 +#: ../src/roster_window.py:2870 +msgid "_Remove" +msgstr "_Ukloni" + +#: ../data/glade/roster_contact_context_menu.glade.h:1 +msgid "A_sk to see his/her status" +msgstr "Traži njegov/njen status" + +#: ../data/glade/roster_contact_context_menu.glade.h:2 +#, fuzzy +msgid "Add Special _Notification..." +msgstr "Dodaj poseb_no obaveštenje" + +#: ../data/glade/roster_contact_context_menu.glade.h:3 +#, fuzzy +msgid "Assign Open_PGP Key..." +msgstr "Pridruži Open_PGP Ključ" + +#: ../data/glade/roster_contact_context_menu.glade.h:4 +#, fuzzy +msgid "Edit _Groups..." +msgstr "Izmeni _grupe" + +#. Execute Command +#: ../data/glade/roster_contact_context_menu.glade.h:5 +#: ../src/roster_window.py:2827 +msgid "Execute Command..." +msgstr "Izvrši naredbu..." + +#. Invite to Groupchat +#: ../data/glade/roster_contact_context_menu.glade.h:6 +#: ../src/roster_window.py:2440 +msgid "In_vite to" +msgstr "Pozo_vi u" + +#. Send Custom Status +#: ../data/glade/roster_contact_context_menu.glade.h:7 +#: ../src/roster_window.py:2664 ../src/roster_window.py:2798 +#, fuzzy +msgid "Send Cus_tom Status" +msgstr "Šalje korisnički definisan XML" + +#: ../data/glade/roster_contact_context_menu.glade.h:8 +msgid "Send Single _Message..." +msgstr "Pošalji jednu _poruku..." + +#: ../data/glade/roster_contact_context_menu.glade.h:9 +#, fuzzy +msgid "Send _File..." +msgstr "Pošalji _datoteku" + +#: ../data/glade/roster_contact_context_menu.glade.h:10 +msgid "Set Custom _Avatar..." +msgstr "" + +#: ../data/glade/roster_contact_context_menu.glade.h:11 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:5 +msgid "Start _Chat" +msgstr "Započni ra_zgovor" + +#: ../data/glade/roster_contact_context_menu.glade.h:13 +msgid "_Allow him/her to see my status" +msgstr "_Dozvoli mu/joj da vidi moj status" + +#: ../data/glade/roster_contact_context_menu.glade.h:14 +#: ../src/roster_window.py:2514 ../src/roster_window.py:2725 +msgid "_Block" +msgstr "" + +#: ../data/glade/roster_contact_context_menu.glade.h:15 +msgid "_Forbid him/her to see my status" +msgstr "_Zabrani mu/joj da vidi moj status" + +#: ../data/glade/roster_contact_context_menu.glade.h:17 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:7 +#, fuzzy +msgid "_Manage Contact" +msgstr "Preimenuj kontakt" + +#: ../data/glade/roster_contact_context_menu.glade.h:19 +#, fuzzy +msgid "_Rename..." +msgstr "_Preimenuj" + +#: ../data/glade/roster_contact_context_menu.glade.h:20 +msgid "_Subscription" +msgstr "_Pretplata" + +#: ../data/glade/roster_contact_context_menu.glade.h:21 +#: ../src/roster_window.py:2508 ../src/roster_window.py:2719 +msgid "_Unblock" +msgstr "" + +#: ../data/glade/roster_window.glade.h:1 +msgid "A_ccounts" +msgstr "Nalo_zi" + +#: ../data/glade/roster_window.glade.h:2 +#, fuzzy +msgid "Add _Contact..." +msgstr "_Dodaj kontakt..." + +#: ../data/glade/roster_window.glade.h:3 +#, fuzzy +msgid "Fea_tures" +msgstr "Mogućnosti servera" + +#: ../data/glade/roster_window.glade.h:4 +msgid "File _Transfers" +msgstr "Prenosi da_toteka" + +#: ../data/glade/roster_window.glade.h:5 +msgid "Frequently Asked Questions (online)" +msgstr "Često postavljana pitanja (internet)" + +#: ../data/glade/roster_window.glade.h:7 +msgid "Help online" +msgstr "Pomoć sa interneta" + +#: ../data/glade/roster_window.glade.h:9 +msgid "Profile, A_vatar" +msgstr "Profil, A_vatar" + +#: ../data/glade/roster_window.glade.h:10 +msgid "Show Trans_ports" +msgstr "Prikaži trans_porte" + +#: ../data/glade/roster_window.glade.h:11 +msgid "Show _Offline Contacts" +msgstr "Prikaži kontakte koji nisu na vezi" + +#: ../data/glade/roster_window.glade.h:14 +msgid "_Contents" +msgstr "_Sadržaj" + +#: ../data/glade/roster_window.glade.h:16 ../src/disco.py:1348 +msgid "_Edit" +msgstr "_Izmeni" + +#: ../data/glade/roster_window.glade.h:17 +msgid "_FAQ" +msgstr "_ČPP" + +#: ../data/glade/roster_window.glade.h:18 +msgid "_Help" +msgstr "_Pomoć" + +#: ../data/glade/roster_window.glade.h:19 +msgid "_Preferences" +msgstr "_Podešavanja" + +#: ../data/glade/roster_window.glade.h:20 +msgid "_Quit" +msgstr "_Izlaz" + +#: ../data/glade/roster_window.glade.h:21 +#, fuzzy +msgid "_Send Single Message..." +msgstr "Pošalji jednu _poruku..." + +#: ../data/glade/roster_window.glade.h:23 +msgid "_View" +msgstr "_Prikaz" + +#: ../data/glade/service_discovery_window.glade.h:1 +msgid "G_o" +msgstr "Kre_ni" + +#: ../data/glade/service_discovery_window.glade.h:2 +msgid "_Address:" +msgstr "_Adresa:" + +#: ../data/glade/service_registration_window.glade.h:1 +msgid "Register to" +msgstr "Registruj se na" + +#: ../data/glade/service_registration_window.glade.h:2 +msgid "_Cancel" +msgstr "_Odustani" + +#: ../data/glade/service_registration_window.glade.h:3 +msgid "_OK" +msgstr "_U redu" + +#: ../data/glade/single_message_window.glade.h:1 +msgid "0" +msgstr "O" + +#: ../data/glade/single_message_window.glade.h:2 +msgid "From:" +msgstr "Od:" + +#: ../data/glade/single_message_window.glade.h:3 +msgid "Reply to this message" +msgstr "Odgovori na ovu poruku" + +#: ../data/glade/single_message_window.glade.h:4 +msgid "Sen_d" +msgstr "P_ošalji" + +#: ../data/glade/single_message_window.glade.h:5 +msgid "Send message" +msgstr "Pošalji poruku" + +#: ../data/glade/single_message_window.glade.h:6 +msgid "Send message and close window" +msgstr "Pošalji poruku i zatvori prozor" + +#: ../data/glade/single_message_window.glade.h:7 +msgid "Subject:" +msgstr "Tema:" + +#: ../data/glade/single_message_window.glade.h:8 +msgid "To:" +msgstr "Za:" + +#: ../data/glade/single_message_window.glade.h:9 +msgid "_Reply" +msgstr "_Odgovor" + +#: ../data/glade/single_message_window.glade.h:10 +msgid "_Send & Close" +msgstr "_Pošalji i zatvori" + +#: ../data/glade/subscription_request_window.glade.h:1 +msgid "Au_thorize" +msgstr "_Odobri autorizaciju" + +#: ../data/glade/subscription_request_window.glade.h:2 +msgid "Authorize contact so he or she can know when you're connected" +msgstr "Autorizuj kontakt tako da on/ona može da vidi kada ste na vezi" + +#: ../data/glade/subscription_request_window.glade.h:3 +msgid "" +"Deny authorization from contact so he or she cannot know when you're " +"connected" +msgstr "" +"Odbij autorizaciju od kontakta tako da on/ona ne može da vidi kada ste na " +"vezi" + +#: ../data/glade/subscription_request_window.glade.h:4 +msgid "Subscription Request" +msgstr "Zahtev za pretplatom" + +#: ../data/glade/subscription_request_window.glade.h:7 +msgid "_Deny" +msgstr "_Odbij" + +#: ../data/glade/systray_context_menu.glade.h:1 +msgid "Mute Sounds" +msgstr "Ugasi zvukove" + +#: ../data/glade/systray_context_menu.glade.h:2 +msgid "Send Single _Message" +msgstr "Pošalji _jednu poruku" + +#: ../data/glade/systray_context_menu.glade.h:3 +msgid "Show All Pending _Events" +msgstr "Prikaži sv_e događaje na čekanju" + +#: ../data/glade/systray_context_menu.glade.h:4 +msgid "Show _Roster" +msgstr "_Prikaži listu kontakata" + +#: ../data/glade/systray_context_menu.glade.h:5 +msgid "Sta_tus" +msgstr "Sta_tus" + +#: ../data/glade/systray_context_menu.glade.h:6 +msgid "_Group Chat" +msgstr "_Grupni razgovor" + +#. Given Name +#: ../data/glade/vcard_information_window.glade.h:5 +msgid "Ask:" +msgstr "Pitaj:" + +#: ../data/glade/vcard_information_window.glade.h:8 +msgid "Client:" +msgstr "Klijent:" + +#: ../data/glade/vcard_information_window.glade.h:9 +msgid "Comments" +msgstr "Komentari" + +#: ../data/glade/vcard_information_window.glade.h:11 +#, fuzzy +msgid "Configured avatar:" +msgstr "Podešavanja _sobe" + +#: ../data/glade/vcard_information_window.glade.h:12 +#: ../data/glade/zeroconf_information_window.glade.h:1 +msgid "Contact" +msgstr "Kontakt" + +#: ../data/glade/vcard_information_window.glade.h:13 +msgid "Contact Information" +msgstr "Informacije kontakta" + +#: ../data/glade/vcard_information_window.glade.h:29 +msgid "More" +msgstr "Još" + +#: ../data/glade/vcard_information_window.glade.h:33 +msgid "OS:" +msgstr "OS:" + +#: ../data/glade/vcard_information_window.glade.h:40 +#: ../data/glade/zeroconf_information_window.glade.h:8 +msgid "Resource:" +msgstr "Resurs:" + +#: ../data/glade/vcard_information_window.glade.h:43 +#: ../data/glade/zeroconf_information_window.glade.h:9 +msgid "Status:" +msgstr "Status:" + +#. Family Name +#: ../data/glade/vcard_information_window.glade.h:46 +msgid "Subscription:" +msgstr "Pretplata:" + +#: ../data/glade/vcard_information_window.glade.h:49 +#, fuzzy +msgid "User avatar:" +msgstr "Avatar:" + +#: ../data/glade/xml_console_window.glade.h:1 +msgid "Jabber Traffic" +msgstr "Džaber saobraćaj" + +#: ../data/glade/xml_console_window.glade.h:2 +msgid "XML Input" +msgstr "XML Unos" + +#. Info/Query make the "IQ" initials. So translate like this 'YourLang/YourLang (Info/Query)'. Thanks (it's a tooltip so width is not a problem) +#: ../data/glade/xml_console_window.glade.h:6 +msgid "Info/Query" +msgstr "Info/Upit" + +#. Info/Query: all(?) jabber xml start with , sends action to the current group chat. Use third " +"person. (e.g. /%s explodes.)" +msgstr "" +"Način korišćenja: /%s , šalje akciju trenutnom grupnom razgovoru. " +"Koristite treću osobu (npr. /%s eksplodira)." + +#: ../src/chat_control.py:1286 +#, python-format +msgid "Usage: /%s, sends a ping to the contact" +msgstr "" + +#: ../src/chat_control.py:1289 +#, fuzzy, python-format +msgid "Usage: /%s, send the message to the contact" +msgstr "Način korišćenja: /%s, sakriva dugmad." + +#: ../src/chat_control.py:1292 ../src/groupchat_control.py:1473 +#, python-format +msgid "No help info for /%s" +msgstr "Nema informacija ni pomoći za /%s" + +#: ../src/chat_control.py:1430 ../src/chat_control.py:1456 +msgid "Encryption enabled" +msgstr "Enkripcija omogućena" + +#: ../src/chat_control.py:1435 +msgid "Session WILL be logged" +msgstr "" + +#: ../src/chat_control.py:1437 +msgid "Session WILL NOT be logged" +msgstr "" + +#: ../src/chat_control.py:1444 +#, fuzzy +msgid "The following message was NOT encrypted" +msgstr "[Ova poruka je šifrovana]" + +#: ../src/chat_control.py:1448 ../src/chat_control.py:1461 +#: ../src/chat_control.py:2090 +msgid "Encryption disabled" +msgstr "Enkripcija onemogućena" + +#. add_to_roster_menuitem +#: ../src/chat_control.py:1618 ../src/conversation_textview.py:562 +#: ../src/dialogs.py:674 ../src/gajim.py:894 ../src/gajim.py:895 +#: ../src/gajim.py:1364 ../src/roster_window.py:345 +#: ../src/roster_window.py:429 ../src/roster_window.py:1790 +#: ../src/roster_window.py:1800 ../src/roster_window.py:2039 +#: ../src/roster_window.py:2277 ../src/roster_window.py:3125 +#: ../src/roster_window.py:3332 ../src/roster_window.py:4692 +#: ../src/roster_window.py:4694 ../src/common/contacts.py:84 +#: ../src/common/helpers.py:44 ../src/common/helpers.py:258 +msgid "Not in Roster" +msgstr "Nije na listi kontakata" + +#. %s is being replaced in the code with JID +#: ../src/chat_control.py:1762 +#, python-format +msgid "You just received a new message from \"%s\"" +msgstr "\"%s\" Vam je upravo poslao poruku" + +#: ../src/chat_control.py:1763 +msgid "" +"If you close this tab and you have history disabled, this message will be " +"lost." +msgstr "" +"Ako zatvorite ovaj jezičak, a istorijat razgovora nije omogućen, ova poruka " +"će biti izgubljena." + +#: ../src/config.py:122 ../src/config.py:544 +msgid "Disabled" +msgstr "Onemogućeno" + +#: ../src/config.py:288 +msgid "Active" +msgstr "Aktivno" + +#: ../src/config.py:296 +msgid "Event" +msgstr "događaj" + +#: ../src/config.py:617 ../src/dialogs.py:958 +#, python-format +msgid "Dictionary for lang %s not available" +msgstr "Rečnik za jezik %s nije dostupan" + +#: ../src/config.py:618 +#, python-format +msgid "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option." +msgstr "" +"Morate instalirati %s rečnik kako biste mogli koristiti proveru pravopisa, " +"ili odaberite drugi jezik postavkom speller_language opcije." + +#: ../src/config.py:969 +msgid "status message title" +msgstr "naslov statusne poruke" + +#: ../src/config.py:969 +msgid "status message text" +msgstr "tekst statusne poruke" + +#: ../src/config.py:1005 +msgid "First Message Received" +msgstr "Primljena Prva Poruka" + +#: ../src/config.py:1006 +msgid "Next Message Received" +msgstr "Sledeća Primljena Poruka" + +#: ../src/config.py:1007 +msgid "Contact Connected" +msgstr "Kontakt Na Vezi" + +#: ../src/config.py:1008 +msgid "Contact Disconnected" +msgstr "Kontakt Otišao Sa Veze" + +#: ../src/config.py:1009 +msgid "Message Sent" +msgstr "Poruka Poslata" + +#: ../src/config.py:1010 +msgid "Group Chat Message Highlight" +msgstr "Bojenje Poruka Sa Grupnog Razgovora" + +#: ../src/config.py:1011 +msgid "Group Chat Message Received" +msgstr "Primljena Poruka Sa Grupnog Razgovora" + +#: ../src/config.py:1018 +msgid "GMail Email Received" +msgstr "Primljen Gmail e-mejl" + +#. Name column +#: ../src/config.py:1287 ../src/dialogs.py:1397 ../src/dialogs.py:1461 +#: ../src/disco.py:736 ../src/disco.py:1559 ../src/disco.py:1805 +#: ../src/history_window.py:108 +msgid "Name" +msgstr "Ime" + +#: ../src/config.py:1395 ../src/common/config.py:375 +msgid "Be right back." +msgstr "Odmah se vraćam." + +#: ../src/config.py:1399 +msgid "Relogin now?" +msgstr "Otići sa veze i povezati se odmah?" + +#: ../src/config.py:1400 +msgid "If you want all the changes to apply instantly, you must relogin." +msgstr "" +"Ako želite da se sve promene trenutno primene, morate da se ponovo povežete." + +#: ../src/config.py:1495 ../src/config.py:1594 +msgid "OpenPGP is not usable in this computer" +msgstr "OpenPGP nije moguće koristiti na ovom računaru" + +#: ../src/config.py:1630 ../src/config.py:1674 +msgid "Unread events" +msgstr "Nepročitani događaji" + +#: ../src/config.py:1631 +msgid "Read all pending events before removing this account." +msgstr "Pročitajte sve događaje na čekanju pre uklanjanja naloga." + +#: ../src/config.py:1660 +#, python-format +msgid "You have opened chat in account %s" +msgstr "Otvorili ste razgovor u računu %s" + +#: ../src/config.py:1661 +msgid "All chat and groupchat windows will be closed. Do you want to continue?" +msgstr "" +"Prozori svih razgovora i grupnih razgovora će biti zatvoreni. Želite li da " +"nastavite?" + +#: ../src/config.py:1670 +msgid "You are currently connected to the server" +msgstr "Trenutno ste spojeni na server" + +#: ../src/config.py:1671 +msgid "To change the account name, you must be disconnected." +msgstr "Za promenu imena naloga, morate otići sa veze." + +#: ../src/config.py:1675 +msgid "To change the account name, you must read all pending events." +msgstr "" +"Da biste promenili ime naloga, morate prvo pročitati sve događaje na čekanju." + +#: ../src/config.py:1681 +msgid "Account Name Already Used" +msgstr "Ime Naloga Već U Upotrebi" + +#: ../src/config.py:1682 +msgid "" +"This name is already used by another of your accounts. Please choose another " +"name." +msgstr "" +"Ovo ime već koristi jedan od Vaših naloga. Molimo Vas, odaberite drugo ime." + +#: ../src/config.py:1686 ../src/config.py:1690 +msgid "Invalid account name" +msgstr "Neispravno ime naloga" + +#: ../src/config.py:1687 +msgid "Account name cannot be empty." +msgstr "Ime naloga ne može biti prazno." + +#: ../src/config.py:1691 +msgid "Account name cannot contain spaces." +msgstr "Ime naloga ne može da sadrži beline." + +#: ../src/config.py:1755 +#, fuzzy +msgid "Rename Account" +msgstr "Podešavanje naloga" + +#: ../src/config.py:1756 +#, fuzzy, python-format +msgid "Enter a new name for account %s" +msgstr "Unesite novo ime za grupu %s" + +#: ../src/config.py:1774 ../src/config.py:1782 ../src/config.py:1822 +#: ../src/config.py:3048 +msgid "Invalid Jabber ID" +msgstr "Neispravan džaber ID" + +#: ../src/config.py:1783 +msgid "A Jabber ID must be in the form \"user@servername\"." +msgstr "Džaber ID mora biti oblika \"korisnik@server\"." + +#: ../src/config.py:1968 ../src/config.py:3119 +msgid "Invalid entry" +msgstr "Neispravan unos" + +#: ../src/config.py:1969 ../src/config.py:3120 +msgid "Custom port must be a port number." +msgstr "Vaš port mora biti broj porta." + +#: ../src/config.py:1990 +msgid "Failed to get secret keys" +msgstr "Neuspelo uzimanje tajnih ključeva" + +#: ../src/config.py:1991 +msgid "There was a problem retrieving your OpenPGP secret keys." +msgstr "Došlo je do problema u uzimanju Vaših OpenPGP tajnih ključeva." + +#: ../src/config.py:1994 +msgid "OpenPGP Key Selection" +msgstr "Odabir OpenPGP Ključeva" + +#: ../src/config.py:1995 +msgid "Choose your OpenPGP key" +msgstr "Odaberite Vaš OpenPGP ključ" + +#: ../src/config.py:2052 +msgid "No such account available" +msgstr "Nije dostupan takav nalog" + +#: ../src/config.py:2053 +msgid "You must create your account before editing your personal information." +msgstr "Morate napraviti Vaš nalog pre izmena ličnih informacija." + +#: ../src/config.py:2060 ../src/dialogs.py:1244 ../src/dialogs.py:1385 +#: ../src/dialogs.py:1565 ../src/disco.py:420 ../src/profile_window.py:325 +msgid "You are not connected to the server" +msgstr "Niste povezani na server" + +#: ../src/config.py:2061 +msgid "Without a connection, you can not edit your personal information." +msgstr "Bez veze sa serverom, nije moguća izmena ličnih informacija." + +#: ../src/config.py:2065 +msgid "Your server doesn't support Vcard" +msgstr "Vaš server ne podržava Vcard" + +#: ../src/config.py:2066 +msgid "Your server can't save your personal information." +msgstr "Vaš server ne može da sačuva Vaše lične informacije." + +#: ../src/config.py:2097 +msgid "Account Local already exists." +msgstr "Račun lokal već postoji." + +#: ../src/config.py:2098 +msgid "Please rename or remove it before enabling link-local messaging." +msgstr "Molimo Vas, preimenujte ili uklonite pre omogućavanja lokalnih poruka." + +#: ../src/config.py:2274 +#, python-format +msgid "Edit %s" +msgstr "Izmeni %s" + +#: ../src/config.py:2276 +#, python-format +msgid "Register to %s" +msgstr "Registruj se na %s" + +#. list at the beginning +#: ../src/config.py:2312 +msgid "Ban List" +msgstr "Lista zabrana" + +#: ../src/config.py:2313 +msgid "Member List" +msgstr "Lista članova" + +#: ../src/config.py:2314 +msgid "Owner List" +msgstr "Lista vlasnika" + +#: ../src/config.py:2315 +msgid "Administrator List" +msgstr "Lista administratora" + +#. Address column +#. holds JID (who said this) +#: ../src/config.py:2364 ../src/disco.py:743 ../src/history_manager.py:155 +msgid "JID" +msgstr "DŽID" + +#: ../src/config.py:2372 +msgid "Reason" +msgstr "Razlog" + +#: ../src/config.py:2377 +msgid "Nick" +msgstr "Nadimak" + +#: ../src/config.py:2381 +msgid "Role" +msgstr "Uloga" + +#: ../src/config.py:2406 +msgid "Banning..." +msgstr "Zabrana..." + +#. You can move '\n' before user@domain if that line is TOO BIG +#: ../src/config.py:2408 +msgid "" +"Whom do you want to ban?\n" +"\n" +msgstr "" +"Koga želite zabraniti?\n" +"\n" + +#: ../src/config.py:2410 +msgid "Adding Member..." +msgstr "Dodavanje člana..." + +#: ../src/config.py:2411 +msgid "" +"Whom do you want to make a member?\n" +"\n" +msgstr "" +"Koga želite da postavite članom?\n" +"\n" + +#: ../src/config.py:2413 +msgid "Adding Owner..." +msgstr "Dodavanje vlasnika..." + +#: ../src/config.py:2414 +msgid "" +"Whom do you want to make an owner?\n" +"\n" +msgstr "" +"Koga želite da postavite za vlasnika?\n" +"\n" + +#: ../src/config.py:2416 +msgid "Adding Administrator..." +msgstr "Dodavanje administratora..." + +#: ../src/config.py:2417 +msgid "" +"Whom do you want to make an administrator?\n" +"\n" +msgstr "" +"Koga želite da postavite za administratora?\n" +"\n" + +#: ../src/config.py:2418 +msgid "" +"Can be one of the following:\n" +"1. user@domain/resource (only that resource matches).\n" +"2. user@domain (any resource matches).\n" +"3. domain/resource (only that resource matches).\n" +"4. domain (the domain itself matches, as does any user@domain,\n" +"domain/resource, or address containing a subdomain." +msgstr "" +"Može biti jedno od sledećeg:\n" +"1. korisnik@domen/resurs (poklapa se samo sa tim resursom).\n" +"2. korisnik@domen (poklapa se sa bilo kojim resursom).\n" +"3. domen/resurs (poklapa se samo sa tim resursom).\n" +"4. domen (samo se domen poklapa, kao i bilo koji korisnik@domen,\n" +"domen/resurs, ili adresa koja sadrži poddomen." + +#: ../src/config.py:2522 +#, python-format +msgid "Removing %s account" +msgstr "Uklanjanje računa %s" + +#: ../src/config.py:2539 ../src/gajim.py:1307 ../src/roster_window.py:3391 +msgid "Password Required" +msgstr "Lozinka zahtevana" + +#: ../src/config.py:2540 ../src/roster_window.py:3387 +#, python-format +msgid "Enter your password for account %s" +msgstr "Unesite Vašu lozinku za račun %s" + +#: ../src/config.py:2541 ../src/roster_window.py:3392 +msgid "Save password" +msgstr "Sačuvaj lozinku" + +#: ../src/config.py:2555 +#, python-format +msgid "Account \"%s\" is connected to the server" +msgstr "Račun \"%s\" je povezan na server" + +#: ../src/config.py:2556 +msgid "If you remove it, the connection will be lost." +msgstr "Ukoliko ga uklonite, veza će biti izgubljena." + +#: ../src/config.py:2649 +msgid "Default" +msgstr "Podrazumevano" + +#: ../src/config.py:2649 +msgid "?print_status:All" +msgstr "?ispis statusa:Sve" + +#: ../src/config.py:2650 +msgid "Enter and leave only" +msgstr "Samo ući i napustiti" + +#: ../src/config.py:2651 +msgid "?print_status:None" +msgstr "?ispis statusa:Ništa" + +#: ../src/config.py:2720 +msgid "New Group Chat" +msgstr "Novi grupni razgovor" + +#: ../src/config.py:2753 +msgid "This bookmark has invalid data" +msgstr "Ovaj marker ima neispravne podatke" + +#: ../src/config.py:2754 +msgid "" +"Please be sure to fill out server and room fields or remove this bookmark." +msgstr "" +"Molimo obavezno ispunite polja servera i sobe ili uklonite ovaj marker." + +#: ../src/config.py:3031 +msgid "Invalid username" +msgstr "Neispravno korisničko ime" + +#: ../src/config.py:3033 +msgid "You must provide a username to configure this account." +msgstr "Morate upisati korisničko ime da biste konfigurisali ovaj nalog." + +#: ../src/config.py:3059 +msgid "Duplicate Jabber ID" +msgstr "Dupliraj Džaber ID" + +#: ../src/config.py:3060 +msgid "This account is already configured in Gajim." +msgstr "Ovaj nalog je već konfigurisan u Gajimu." + +#: ../src/config.py:3077 +msgid "Account has been added successfully" +msgstr "Nalog je uspešno dodat" + +#: ../src/config.py:3078 ../src/config.py:3223 +msgid "" +"You can set advanced account options by pressing the Advanced button, or " +"later by choosing the Accounts menuitem under the Edit menu from the main " +"window." +msgstr "" +"Napredna podešavanja naloga možete podesiti pritiskom na dugme Napredno, ili " +"kasnije klikom na stavku menija Nalozi pod menijem Uredi iz glavnog prozora." + +#: ../src/config.py:3095 +#, fuzzy +msgid "Invalid server" +msgstr "Neispravno korisničko ime" + +#: ../src/config.py:3096 +#, fuzzy +msgid "Please provide a server on which you want to register." +msgstr "Molimo odredite novi nadimak koji želite da koristite:" + +#: ../src/config.py:3202 ../src/config.py:3241 +msgid "An error occurred during account creation" +msgstr "Pojavila se greška pri kreiranju naloga" + +#: ../src/config.py:3222 +msgid "Your new account has been created successfully" +msgstr "Vaš novi nalog je uspešno napravljen" + +#: ../src/config.py:3327 +msgid "Account name is in use" +msgstr "Ime naloga je već upotrebljeno" + +#: ../src/config.py:3328 +msgid "You already have an account using this name." +msgstr "Već imate nalog sa tim imenom." + +#: ../src/conversation_textview.py:337 +msgid "" +"Text below this line is what has been said since the last time you paid " +"attention to this group chat" +msgstr "" +"Tekst ispod ove linije je ono što je rečeno od kada ste poslednji put " +"obratili pažnju na ovaj grupni razgovor" + +#: ../src/conversation_textview.py:409 +#, python-format +msgid "_Actions for \"%s\"" +msgstr "_Akcije za nalog \"%s\"" + +#: ../src/conversation_textview.py:421 +msgid "Read _Wikipedia Article" +msgstr "Pročitajte članak na _Vikipediji" + +#: ../src/conversation_textview.py:426 +msgid "Look it up in _Dictionary" +msgstr "Potraži u Rečniku" + +#. we must have %s in the url if not WIKTIONARY +#: ../src/conversation_textview.py:442 +#, python-format +msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" +msgstr "URL-u Rečnika nedostaje \"%s\" i nije Viki rečnik" + +#. we must have %s in the url +#: ../src/conversation_textview.py:455 +#, python-format +msgid "Web Search URL is missing an \"%s\"" +msgstr "URL-u Veb pretrage nedostaje \"%s\"" + +#: ../src/conversation_textview.py:458 +msgid "Web _Search for it" +msgstr "_Pretraži Veb" + +#: ../src/conversation_textview.py:464 +msgid "Open as _Link" +msgstr "Otvori kao _Vezu" + +#: ../src/conversation_textview.py:929 +msgid "Yesterday" +msgstr "Juče" + +#. the number is >= 2 +#. %i is day in year (1-365), %d (1-31) we want %i +#: ../src/conversation_textview.py:933 +#, python-format +msgid "%i days ago" +msgstr "Pre %i dana" + +#. if we have subject, show it too! +#: ../src/conversation_textview.py:967 +#, python-format +msgid "Subject: %s\n" +msgstr "Tema: %s\n" + +#: ../src/dialogs.py:64 +#, python-format +msgid "Contact name: %s" +msgstr "Ime kontakta: %s" + +#: ../src/dialogs.py:66 +#, python-format +msgid "Jabber ID: %s" +msgstr "Džaber ID: %s" + +#: ../src/dialogs.py:216 +msgid "Group" +msgstr "Grupa" + +#: ../src/dialogs.py:223 +msgid "In the group" +msgstr "U grupi" + +#: ../src/dialogs.py:274 +msgid "KeyID" +msgstr "ID Ključa" + +#: ../src/dialogs.py:277 +msgid "Contact name" +msgstr "Ime kontakta" + +#: ../src/dialogs.py:323 +#, python-format +msgid "%s Status Message" +msgstr "%s Statusna poruka" + +#: ../src/dialogs.py:325 +msgid "Status Message" +msgstr "Statusna poruka" + +#: ../src/dialogs.py:425 +msgid "Save as Preset Status Message" +msgstr "Snimi kao već postavljenu statusnu poruku" + +#: ../src/dialogs.py:426 +msgid "Please type a name for this status message" +msgstr "Molimo unesite ime za ovu statusnu poruku" + +#: ../src/dialogs.py:437 +msgid "Overwrite Status Message?" +msgstr "Prebriši statusnu poruku?" + +#: ../src/dialogs.py:438 +msgid "" +"This name is already used. Do you want to overwrite this status message?" +msgstr "" +"Ovo ime se već koristi. Da li želite da prebrišete ovu statusnu poruku?" + +#: ../src/dialogs.py:454 +msgid "AIM Address:" +msgstr "AIM adresa:" + +#: ../src/dialogs.py:455 +msgid "GG Number:" +msgstr "GG Broj:" + +#: ../src/dialogs.py:456 +msgid "ICQ Number:" +msgstr "ICQ Broj:" + +#: ../src/dialogs.py:457 +msgid "MSN Address:" +msgstr "MSN adresa:" + +#: ../src/dialogs.py:458 +msgid "Yahoo! Address:" +msgstr "Yahoo! adresa:" + +#: ../src/dialogs.py:495 +#, python-format +msgid "Please fill in the data of the contact you want to add in account %s" +msgstr "Molimo Vas ispunite podatke za kontakt koga želite dodati na nalog %s" + +#: ../src/dialogs.py:497 +msgid "Please fill in the data of the contact you want to add" +msgstr "Molimo Vas ispunite podatke za kontakt koga želite dodati" + +#: ../src/dialogs.py:654 ../src/dialogs.py:660 +msgid "Invalid User ID" +msgstr "Neispravan korisnički ID" + +#: ../src/dialogs.py:661 +msgid "The user ID must not contain a resource." +msgstr "ID korisnika ne sme sadržavati resurs." + +#: ../src/dialogs.py:675 +msgid "Contact already in roster" +msgstr "Kontakt je već u listi" + +#: ../src/dialogs.py:676 +msgid "This contact is already listed in your roster." +msgstr "Kontakt je već u listi kontakata." + +#: ../src/dialogs.py:712 +msgid "User ID:" +msgstr "ID korisnika:" + +#: ../src/dialogs.py:774 +msgid "A GTK+ jabber client" +msgstr "GTK+ džaber klijent" + +#: ../src/dialogs.py:775 +msgid "GTK+ Version:" +msgstr "GTK+ verzija:" + +#: ../src/dialogs.py:776 +msgid "PyGTK Version:" +msgstr "PyGTK verzija:" + +#: ../src/dialogs.py:790 +msgid "Current Developers:" +msgstr "Trenutni programeri:" + +#: ../src/dialogs.py:792 +msgid "Past Developers:" +msgstr "Prošli programeri:" + +#: ../src/dialogs.py:802 +msgid "THANKS:" +msgstr "ZAHVALNICE:" + +#. remove one english sentence +#. and add it manually as translatable +#: ../src/dialogs.py:808 +msgid "Last but not least, we would like to thank all the package maintainers." +msgstr "" +"Poslednje, ali ne i najmanje važno, želeli bismo zahvaliti svim " +"održavateljima paketa" + +#. here you write your name in the form Name FamilyName +#: ../src/dialogs.py:821 +msgid "translator-credits" +msgstr "B. Kokanović. " + +#: ../src/dialogs.py:951 +#, python-format +msgid "Unable to bind to port %s." +msgstr "Ne mogu da se povežem na port %s." + +#: ../src/dialogs.py:952 +msgid "" +"Maybe you have another running instance of Gajim. File Transfer will be " +"cancelled." +msgstr "" +"Možda već imate pokrenutu instancu Gajima. Prenos datoteka će biti prekinut." + +#: ../src/dialogs.py:959 +#, fuzzy, python-format +msgid "" +"You have to install %s dictionary to use spellchecking, or choose another " +"language by setting the speller_language option.\n" +"\n" +"Highlighting misspelled words feature will not be used" +msgstr "" +"Morate instalirati %s rečnik kako biste mogli koristiti proveru pravopisa, " +"ili odaberite drugi jezik postavkom speller_language opcije." + +#: ../src/dialogs.py:1173 +#, python-format +msgid "Subscription request for account %s from %s" +msgstr "Zahtev pretplate na račun %s od %s" + +#: ../src/dialogs.py:1176 +#, python-format +msgid "Subscription request from %s" +msgstr "Zahtev pretplate od %s" + +#: ../src/dialogs.py:1237 ../src/roster_window.py:763 +#, python-format +msgid "You are already in group chat %s" +msgstr "Već ste u grupnom razgovoru %s" + +#: ../src/dialogs.py:1245 +msgid "You can not join a group chat unless you are connected." +msgstr "Ne možete se priključiti grupnom razgovoru ako niste povezani." + +#: ../src/dialogs.py:1263 +#, python-format +msgid "Join Group Chat with account %s" +msgstr "Pridružite se grupnom razgovoru preko naloga %s" + +#: ../src/dialogs.py:1333 ../src/dialogs.py:1339 +#: ../src/groupchat_control.py:1643 +msgid "Invalid group chat Jabber ID" +msgstr "Neispravan Džaber ID grupnog razgovora" + +#: ../src/dialogs.py:1334 ../src/dialogs.py:1340 +#: ../src/groupchat_control.py:1644 +msgid "The group chat Jabber ID has not allowed characters." +msgstr "Džaber ID grupnog razgovora ima nedozvoljene znake." + +#: ../src/dialogs.py:1346 +msgid "This is not a group chat" +msgstr "Ovo nije grupni razgovor" + +#: ../src/dialogs.py:1347 +#, python-format +msgid "%s is not the name of a group chat." +msgstr "%s nije ime grupnog razgovora." + +#: ../src/dialogs.py:1386 +#, fuzzy +msgid "Without a connection, you can not synchronise your contacts." +msgstr "Bez veze nije moguća promena lozinke." + +#: ../src/dialogs.py:1400 +msgid "Server" +msgstr "Server" + +#: ../src/dialogs.py:1433 +#, fuzzy +msgid "This account is not connected to the server" +msgstr "Račun \"%s\" je povezan na server" + +#: ../src/dialogs.py:1434 +#, fuzzy +msgid "You cannot synchronize with an account unless it is connected." +msgstr "Ne možete se priključiti grupnom razgovoru ako niste povezani." + +#: ../src/dialogs.py:1458 +msgid "Synchronise" +msgstr "" + +#: ../src/dialogs.py:1516 +#, python-format +msgid "Start Chat with account %s" +msgstr "Započni razgovor sa razunom %s" + +#: ../src/dialogs.py:1518 +msgid "Start Chat" +msgstr "Započni razgovor" + +#: ../src/dialogs.py:1519 +msgid "" +"Fill in the nickname or the Jabber ID of the contact you would like\n" +"to send a chat message to:" +msgstr "" +"Ispunite džaber ID kontakta kome želite\n" +"poslati poruku:" + +#. if offline or connecting +#: ../src/dialogs.py:1544 ../src/dialogs.py:1891 ../src/dialogs.py:2027 +msgid "Connection not available" +msgstr "Veza nije dostupna" + +#: ../src/dialogs.py:1545 ../src/dialogs.py:1892 ../src/dialogs.py:2028 +#, python-format +msgid "Please make sure you are connected with \"%s\"." +msgstr "Molimo potvrdite da ste spojeni na \"%s\"." + +#: ../src/dialogs.py:1554 ../src/dialogs.py:1557 +msgid "Invalid JID" +msgstr "Neispravan džaber ID" + +#: ../src/dialogs.py:1557 +#, python-format +msgid "Unable to parse \"%s\"." +msgstr "Nije moguće razložiti \"%s\"." + +#: ../src/dialogs.py:1566 +msgid "Without a connection, you can not change your password." +msgstr "Bez veze nije moguća promena lozinke." + +#: ../src/dialogs.py:1584 +msgid "Invalid password" +msgstr "Neispravna lozinka" + +#: ../src/dialogs.py:1585 +msgid "You must enter a password." +msgstr "Morate da unesete lozinku" + +#: ../src/dialogs.py:1589 +msgid "Passwords do not match" +msgstr "Lozinke se ne poklapaju" + +#: ../src/dialogs.py:1590 +msgid "The passwords typed in both fields must be identical." +msgstr "Lozinke upisane u oba polja moraju biti identične." + +#. img to display +#. default value +#: ../src/dialogs.py:1632 ../src/notify.py:219 ../src/notify.py:429 +msgid "Contact Signed In" +msgstr "Kontakt je na vezi" + +#: ../src/dialogs.py:1634 ../src/notify.py:227 ../src/notify.py:431 +msgid "Contact Signed Out" +msgstr "Kontakt je otišao sa veze" + +#. chat message +#: ../src/dialogs.py:1636 ../src/notify.py:250 ../src/notify.py:433 +msgid "New Message" +msgstr "Nova Poruka" + +#. single message +#: ../src/dialogs.py:1636 ../src/notify.py:231 ../src/notify.py:433 +msgid "New Single Message" +msgstr "Nova Samostalna Poruka" + +#. private message +#: ../src/dialogs.py:1637 ../src/notify.py:238 ../src/notify.py:434 +msgid "New Private Message" +msgstr "Nova Privatna Poruka" + +#: ../src/dialogs.py:1637 ../src/gajim.py:1460 ../src/notify.py:442 +msgid "New E-mail" +msgstr "Novi E-mejl" + +#: ../src/dialogs.py:1639 ../src/gajim.py:1668 ../src/notify.py:436 +msgid "File Transfer Request" +msgstr "Zahtev za prenosom datoteke" + +#: ../src/dialogs.py:1641 ../src/gajim.py:1432 ../src/gajim.py:1644 +#: ../src/notify.py:438 +msgid "File Transfer Error" +msgstr "Greška pri prenosu datoteke" + +#: ../src/dialogs.py:1643 ../src/gajim.py:1707 ../src/gajim.py:1729 +#: ../src/gajim.py:1746 ../src/notify.py:440 +msgid "File Transfer Completed" +msgstr "Prenos datoteke završen" + +#: ../src/dialogs.py:1644 ../src/gajim.py:1710 ../src/notify.py:440 +msgid "File Transfer Stopped" +msgstr "Prenos datoteke zaustavljen" + +#: ../src/dialogs.py:1646 ../src/gajim.py:1328 ../src/notify.py:444 +msgid "Groupchat Invitation" +msgstr "Poziv na grupni razgovor" + +#: ../src/dialogs.py:1648 ../src/notify.py:211 ../src/notify.py:446 +msgid "Contact Changed Status" +msgstr "Kontakt promenio status" + +#: ../src/dialogs.py:1821 +#, python-format +msgid "Single Message using account %s" +msgstr "Samostalna poruka koristeći nalog %s" + +#: ../src/dialogs.py:1823 +#, python-format +msgid "Single Message in account %s" +msgstr "Samostalna poruka na nalogu %s" + +#: ../src/dialogs.py:1825 +msgid "Single Message" +msgstr "Samostalna Poruka" + +#. prepare UI for Sending +#: ../src/dialogs.py:1828 +#, python-format +msgid "Send %s" +msgstr "Poslate %s" + +#. prepare UI for Receiving +#: ../src/dialogs.py:1851 +#, python-format +msgid "Received %s" +msgstr "Primljene %s" + +#. we create a new blank window to send and we preset RE: and to jid +#: ../src/dialogs.py:1928 +#, python-format +msgid "RE: %s" +msgstr "RE: %s" + +#: ../src/dialogs.py:1929 +#, python-format +msgid "%s wrote:\n" +msgstr "%s piše:\n" + +#: ../src/dialogs.py:1973 +#, python-format +msgid "XML Console for %s" +msgstr "XML Konzola za %s" + +#: ../src/dialogs.py:1975 +msgid "XML Console" +msgstr "XML Konzola" + +#: ../src/dialogs.py:2098 +#, python-format +msgid "Privacy List %s" +msgstr "Lista privatnosti %s" + +#: ../src/dialogs.py:2102 +#, python-format +msgid "Privacy List for %s" +msgstr "Lista privatnosti za %s" + +#: ../src/dialogs.py:2158 +#, python-format +msgid "Order: %s, action: %s, type: %s, value: %s" +msgstr "Redosled: %s, akcija: %s, tip: %s, vrednost: %s" + +#: ../src/dialogs.py:2161 +#, python-format +msgid "Order: %s, action: %s" +msgstr "Redosled: %s, akcija: %s" + +#: ../src/dialogs.py:2203 +msgid "Edit a rule" +msgstr "Izmeni pravilo" + +#: ../src/dialogs.py:2290 +msgid "Add a rule" +msgstr "Dodaj pravilo" + +#: ../src/dialogs.py:2386 +#, python-format +msgid "Privacy Lists for %s" +msgstr "Lista privatnosti za %s" + +#: ../src/dialogs.py:2388 +msgid "Privacy Lists" +msgstr "Lista privatnosti" + +#: ../src/dialogs.py:2458 +msgid "Invalid List Name" +msgstr "Neispravno ime liste" + +#: ../src/dialogs.py:2459 +msgid "You must enter a name to create a privacy list." +msgstr "Morate uneti ime za kreiranje liste privatnosti" + +#: ../src/dialogs.py:2496 +#, fuzzy +msgid "$Contact has invited you to join a discussion" +msgstr "$Contact Vas je pozvao na grupni razgovor u sobu %(room_jid)s" + +#: ../src/dialogs.py:2498 +#, python-format +msgid "$Contact has invited you to group chat %(room_jid)s" +msgstr "$Contact Vas je pozvao na grupni razgovor u sobu %(room_jid)s" + +#. only if not None and not '' +#: ../src/dialogs.py:2510 +#, python-format +msgid "Comment: %s" +msgstr "Komentar: %s" + +#: ../src/dialogs.py:2576 +msgid "Choose Sound" +msgstr "Odaberite zvuk" + +#: ../src/dialogs.py:2586 ../src/dialogs.py:2634 +msgid "All files" +msgstr "Sve datoteke" + +#: ../src/dialogs.py:2591 +msgid "Wav Sounds" +msgstr "Wav Zvukovi" + +#: ../src/dialogs.py:2624 +msgid "Choose Image" +msgstr "Odaberite sliku" + +#: ../src/dialogs.py:2639 +msgid "Images" +msgstr "Slike" + +#: ../src/dialogs.py:2703 +#, python-format +msgid "When %s becomes:" +msgstr "Kad %s postane:" + +#: ../src/dialogs.py:2705 +#, python-format +msgid "Adding Special Notification for %s" +msgstr "Dodavanje posebnog obaveštenja za %s" + +#. # means number +#: ../src/dialogs.py:2776 +msgid "#" +msgstr "#" + +#: ../src/dialogs.py:2782 +msgid "Condition" +msgstr "Uslov" + +#: ../src/dialogs.py:2900 +msgid "when I am " +msgstr "kada sam " + +#: ../src/disco.py:104 +msgid "Others" +msgstr "Ostali" + +#: ../src/disco.py:105 ../src/disco.py:106 ../src/disco.py:1345 +#: ../src/gajim.py:644 ../src/roster_window.py:282 ../src/roster_window.py:342 +#: ../src/roster_window.py:382 ../src/roster_window.py:490 +#: ../src/roster_window.py:522 ../src/roster_window.py:524 +#: ../src/roster_window.py:4688 ../src/roster_window.py:4690 +#: ../src/common/contacts.py:290 ../src/common/contacts.py:305 +#: ../src/common/helpers.py:44 +msgid "Transports" +msgstr "Prenosi" + +#. conference is a category for listing mostly groupchats in service discovery +#: ../src/disco.py:108 +msgid "Conference" +msgstr "Konferencija" + +#: ../src/disco.py:421 +msgid "Without a connection, you can not browse available services" +msgstr "Bez uspostavljene veze, ne možete razgledati dostupne usluge" + +#: ../src/disco.py:495 +#, python-format +msgid "Service Discovery using account %s" +msgstr "Otkrivanje usluga sa naloga %s" + +#: ../src/disco.py:497 +msgid "Service Discovery" +msgstr "Otkrivanje Usluga" + +#: ../src/disco.py:637 +msgid "The service could not be found" +msgstr "Usluga ne može biti nađena" + +#: ../src/disco.py:638 +msgid "" +"There is no service at the address you entered, or it is not responding. " +"Check the address and try again." +msgstr "" +"Na navedenoj adresi nema usuga, ili nema odgovora. Proverite adresu i " +"pokušajte ponovo." + +#: ../src/disco.py:642 ../src/disco.py:923 +msgid "The service is not browsable" +msgstr "Usluge nisu pretražive" + +#: ../src/disco.py:643 +msgid "This type of service does not contain any items to browse." +msgstr "Ovaj tip usluge ne sadrži elemente za pretragu" + +#: ../src/disco.py:723 +#, python-format +msgid "Browsing %s using account %s" +msgstr "Pretraga %s koristeći račun %s" + +#: ../src/disco.py:762 +msgid "_Browse" +msgstr "_Pregled" + +#: ../src/disco.py:924 +msgid "This service does not contain any items to browse." +msgstr "Ova usluga ne sadrži elemente za pretragu" + +#: ../src/disco.py:1142 +#, fuzzy +msgid "_Execute Command" +msgstr "_Izvrši naredbu..." + +#: ../src/disco.py:1152 ../src/disco.py:1350 +msgid "Re_gister" +msgstr "Re_gistracija" + +#: ../src/disco.py:1387 +#, python-format +msgid "Scanning %d / %d.." +msgstr "Skeniranje %d / %d.." + +#. Users column +#: ../src/disco.py:1569 +msgid "Users" +msgstr "Korisnici" + +#. Description column +#: ../src/disco.py:1577 +msgid "Description" +msgstr "Opis" + +#. Id column +#: ../src/disco.py:1585 +msgid "Id" +msgstr "Identifikacija" + +#: ../src/disco.py:1814 +msgid "Subscribed" +msgstr "Pretplaćen" + +#: ../src/disco.py:1822 +#, fuzzy +msgid "Node" +msgstr "Ništa" + +#: ../src/disco.py:1879 +msgid "New post" +msgstr "Nova objava" + +#: ../src/disco.py:1885 +msgid "_Subscribe" +msgstr "_Pretplati se" + +#: ../src/disco.py:1891 +msgid "_Unsubscribe" +msgstr "_Ukini pretplatu" + +#: ../src/filetransfers_window.py:72 +msgid "File" +msgstr "Datoteka" + +#: ../src/filetransfers_window.py:87 +msgid "Time" +msgstr "Vreme" + +#: ../src/filetransfers_window.py:99 +msgid "Progress" +msgstr "Napredak" + +#: ../src/filetransfers_window.py:159 ../src/filetransfers_window.py:213 +#, python-format +msgid "Filename: %s" +msgstr "Ime datoteke: %s" + +#: ../src/filetransfers_window.py:160 ../src/filetransfers_window.py:288 +#, python-format +msgid "Size: %s" +msgstr "Veličina: %s" + +#. You is a reply of who sent a file +#. You is a reply of who received a file +#: ../src/filetransfers_window.py:169 ../src/filetransfers_window.py:179 +#: ../src/history_manager.py:463 +msgid "You" +msgstr "Vi" + +#: ../src/filetransfers_window.py:170 +#, python-format +msgid "Sender: %s" +msgstr "Pošaljilac: %s" + +#: ../src/filetransfers_window.py:171 ../src/filetransfers_window.py:577 +#: ../src/tooltips.py:586 +msgid "Recipient: " +msgstr "Primaoc: " + +#: ../src/filetransfers_window.py:182 +#, python-format +msgid "Saved in: %s" +msgstr "Sačuvano u: %s" + +#: ../src/filetransfers_window.py:184 +msgid "File transfer completed" +msgstr "Prenos datoteke završen" + +#: ../src/filetransfers_window.py:198 ../src/filetransfers_window.py:204 +msgid "File transfer cancelled" +msgstr "Prenos datoteke prekinut" + +#: ../src/filetransfers_window.py:198 ../src/filetransfers_window.py:205 +msgid "Connection with peer cannot be established." +msgstr "Nije moguće uspostaviti vezu sa drugom stranom." + +#: ../src/filetransfers_window.py:214 +#, python-format +msgid "Recipient: %s" +msgstr "Primaoc: %s" + +#: ../src/filetransfers_window.py:216 +#, python-format +msgid "Error message: %s" +msgstr "Poruka greške: %s" + +#: ../src/filetransfers_window.py:217 +msgid "File transfer stopped by the contact at the other end" +msgstr "Prenos datoteke je zaustavljen od kontakta sa druge strane" + +#: ../src/filetransfers_window.py:234 +msgid "Choose File to Send..." +msgstr "Odaberite datoteku za slanje..." + +#: ../src/filetransfers_window.py:253 +msgid "Gajim cannot access this file" +msgstr "Gajim ne može pristupiti ovoj datoteci" + +#: ../src/filetransfers_window.py:254 +msgid "This file is being used by another process." +msgstr "Ovu datoteku koristi neki drugi proces." + +#: ../src/filetransfers_window.py:286 +#, python-format +msgid "File: %s" +msgstr "Datoteka: %s" + +#: ../src/filetransfers_window.py:291 +#, python-format +msgid "Type: %s" +msgstr "Tip: %s" + +#: ../src/filetransfers_window.py:293 +#, python-format +msgid "Description: %s" +msgstr "Opis: %s" + +#: ../src/filetransfers_window.py:294 +#, python-format +msgid "%s wants to send you a file:" +msgstr "%s Vam želi poslati datoteku:" + +#: ../src/filetransfers_window.py:308 ../src/gtkgui_helpers.py:767 +#, python-format +msgid "Cannot overwrite existing file \"%s\"" +msgstr "Nije moguće prepisati postojeću datoteku \"%s\"" + +#: ../src/filetransfers_window.py:309 ../src/gtkgui_helpers.py:769 +msgid "" +"A file with this name already exists and you do not have permission to " +"overwrite it." +msgstr "Datoteka sa ovim imenom već postoji i nemate privilegijaprepisati je." + +#: ../src/filetransfers_window.py:316 ../src/gtkgui_helpers.py:773 +msgid "This file already exists" +msgstr "Ova datoteka već postoji" + +#: ../src/filetransfers_window.py:316 ../src/gtkgui_helpers.py:773 +msgid "What do you want to do?" +msgstr "Šta želite da uradite?" + +#: ../src/filetransfers_window.py:328 ../src/gtkgui_helpers.py:783 +#, python-format +msgid "Directory \"%s\" is not writable" +msgstr "U fasciklu \"%s\" nije moguće pisanje" + +#: ../src/filetransfers_window.py:328 ../src/gtkgui_helpers.py:784 +msgid "You do not have permission to create files in this directory." +msgstr "Nemate privilegija za pisanje u ovoj fascikli" + +#: ../src/filetransfers_window.py:338 +msgid "Save File as..." +msgstr "Snimi datoteku kao..." + +#. 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:419 +#, python-format +msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" +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:508 +#, python-format +msgid "(%(filesize_unit)s/s)" +msgstr "(%(filesize_unit)s/sek)" + +#: ../src/filetransfers_window.py:547 ../src/filetransfers_window.py:550 +msgid "Invalid File" +msgstr "Neispravna datoteka" + +#: ../src/filetransfers_window.py:547 +msgid "File: " +msgstr "Datoteka: " + +#: ../src/filetransfers_window.py:551 +msgid "It is not possible to send empty files" +msgstr "Nije moguće poslati praznu datoteku" + +#: ../src/filetransfers_window.py:573 ../src/tooltips.py:576 +msgid "Name: " +msgstr "Ime: " + +#: ../src/filetransfers_window.py:575 ../src/tooltips.py:580 +msgid "Sender: " +msgstr "Pošaljilac: " + +#: ../src/filetransfers_window.py:763 +msgid "Pause" +msgstr "Pauza" + +#: ../src/gajim.py:50 +#, python-format +msgid "%s is not a valid loglevel" +msgstr "" + +#: ../src/gajim.py:143 +msgid "Gajim needs X server to run. Quiting..." +msgstr "Gajimu treba X server da bi se pokrenuo. Završavam..." + +#: ../src/gajim.py:147 +#, fuzzy +msgid "Gajim needs PyGTK 2.8 or above" +msgstr "Gajimu treba pyGTK 2.6 ili veća verzija" + +#: ../src/gajim.py:148 +#, fuzzy +msgid "Gajim needs PyGTK 2.8 or above to run. Quiting..." +msgstr "Gajimu treba pyGTK 2.6 ili veća verzija. Završavam..." + +#: ../src/gajim.py:150 +#, fuzzy +msgid "Gajim needs GTK 2.8 or above" +msgstr "Gajimu treba pyGTK 2.6 ili veća verzija" + +#: ../src/gajim.py:151 +#, fuzzy +msgid "Gajim needs GTK 2.8 or above to run. Quiting..." +msgstr "Gajimu treba pyGTK 2.6 ili veća verzija. Završavam..." + +#: ../src/gajim.py:156 +msgid "GTK+ runtime is missing libglade support" +msgstr "GTK+ nema podršku za libglade" + +#: ../src/gajim.py:158 +#, python-format +msgid "" +"Please remove your current GTK+ runtime and install the latest stable " +"version from %s" +msgstr "" +"Molimo uklonite Vaš trenutni GTK+ i instalirajte poslednju stabilnu verziju " +"sa %s" + +#: ../src/gajim.py:160 +msgid "" +"Please make sure that GTK+ and PyGTK have libglade support in your system." +msgstr "" +"Molimo proverite da GTK+ i PyGTK imaju podršku za libglade na Vašem sistemu" + +#: ../src/gajim.py:165 +msgid "Gajim needs PySQLite2 to run" +msgstr "Gajimu treba PySQLite2 za pokretanje" + +#: ../src/gajim.py:173 +msgid "Gajim needs pywin32 to run" +msgstr "Gajimu treba pywin32 za pokretanje" + +#: ../src/gajim.py:174 +#, python-format +msgid "" +"Please make sure that Pywin32 is installed on your system. You can get it at " +"%s" +msgstr "" +"Molimo osigurajte se da je Pywin32 instaliran na Vašem sistemu. Možete ga " +"naći na %s" + +#. set the icon to all newly opened wind +#: ../src/gajim.py:317 +msgid "Gajim is already running" +msgstr "Gajim je već pokrenut" + +#: ../src/gajim.py:318 +msgid "" +"Another instance of Gajim seems to be running\n" +"Run anyway?" +msgstr "" +"Jedna instanca Gajima izgleda već radi\n" +"Svejedno želite pokrenuti?" + +#: ../src/gajim.py:341 ../src/common/connection_handlers.py:900 +#: ../src/common/connection_handlers.py:1601 +#: ../src/common/connection_handlers.py:1629 +#: ../src/common/connection_handlers.py:1639 +#: ../src/common/connection_handlers.py:1658 +#: ../src/common/connection_handlers.py:1889 +#: ../src/common/connection_handlers.py:2001 ../src/common/connection.py:925 +msgid "Disk Write Error" +msgstr "Greška pri pisanju na disk" + +#: ../src/gajim.py:434 +msgid "Do you accept this request?" +msgstr "Prihvatate li ovaj zahtev?" + +#: ../src/gajim.py:437 +#, python-format +msgid "HTTP (%s) Authorization for %s (id: %s)" +msgstr "HTTP (%s) Autorizacija za %s (id: %s)" + +#: ../src/gajim.py:484 ../src/notify.py:448 +msgid "Connection Failed" +msgstr "Veza prekinuta" + +#: ../src/gajim.py:817 +#, python-format +msgid "Subject: %s" +msgstr "Tema: %s" + +#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) +#: ../src/gajim.py:864 ../src/gajim.py:877 +#, python-format +msgid "error while sending %s ( %s )" +msgstr "greška prilikom slanja %s ( %s )" + +#: ../src/gajim.py:910 +msgid "Authorization accepted" +msgstr "Autorizacija prihvaćena" + +#: ../src/gajim.py:911 +#, python-format +msgid "The contact \"%s\" has authorized you to see his or her status." +msgstr "Kontakt \"%s\" je prihvatio da vidite njegov/njen status." + +#: ../src/gajim.py:919 +#, python-format +msgid "Contact \"%s\" removed subscription from you" +msgstr "Kontakt \"%s\" je ukinuo pretplatu na njega" + +#: ../src/gajim.py:920 +msgid "You will always see him or her as offline." +msgstr "Uvek ćete njega/nju videti kao da nije na vezi." + +#: ../src/gajim.py:964 +#, python-format +msgid "Contact with \"%s\" cannot be established" +msgstr "Kontakt sa \"%s\" se ne može uspostaviti" + +#: ../src/gajim.py:965 ../src/common/connection.py:466 +msgid "Check your connection or try again later." +msgstr "Proverite Vašu konekciju ili pokušajte kasnije." + +#: ../src/gajim.py:1136 ../src/roster_window.py:1348 +#, python-format +msgid "%s is now %s (%s)" +msgstr "%s je sada %s (%s)" + +#. No status message +#: ../src/gajim.py:1139 ../src/groupchat_control.py:1101 +#: ../src/roster_window.py:1351 +#, python-format +msgid "%s is now %s" +msgstr "%s je sada %s" + +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/gajim.py:1259 ../src/groupchat_control.py:913 +msgid "Any occupant is allowed to see your full JID" +msgstr "" + +#: ../src/gajim.py:1261 +msgid "Room now shows unavailable member" +msgstr "" + +#: ../src/gajim.py:1263 +msgid "room now does not show unavailable members" +msgstr "" + +#: ../src/gajim.py:1266 +msgid "A non-privacy-related room configuration change has occurred" +msgstr "" + +#. Can be a presence (see chg_contact_status in groupchat_contol.py) +#: ../src/gajim.py:1269 +msgid "Room logging is now enabled" +msgstr "" + +#: ../src/gajim.py:1271 +msgid "Room logging is now disabled" +msgstr "" + +#: ../src/gajim.py:1273 +msgid "Room is now non-anonymous" +msgstr "" + +#: ../src/gajim.py:1275 +msgid "Room is now semi-anonymous" +msgstr "" + +#: ../src/gajim.py:1277 +msgid "Room is now fully-anonymous" +msgstr "" + +#: ../src/gajim.py:1308 +#, fuzzy, python-format +msgid "A Password is required to join the room %s. Please type it" +msgstr "Lozinka potrebna za pridruživanje ovom grupnom razgovoru." + +#: ../src/gajim.py:1338 +msgid "Your passphrase is incorrect" +msgstr "Vaša lozinka nije tačna" + +#: ../src/gajim.py:1339 +msgid "You are currently connected without your OpenPGP key." +msgstr "Trenutno ste povezani bez OpenPGP ključa." + +#: ../src/gajim.py:1443 +#, python-format +msgid "New mail on %(gmail_mail_address)s" +msgstr "Novi e-mejl za %(gmail_mail_address)s" + +#: ../src/gajim.py:1445 +#, python-format +msgid "You have %d new mail conversation" +msgid_plural "You have %d new mail conversations" +msgstr[0] "Imate %d novi e-mejl razgovor" +msgstr[1] "Imate %d nova e-mejl razgovora" +msgstr[2] "Imate %d novih e-mejl razgovora" + +#. FIXME: emulate Gtalk client popups. find out what they parse and how +#. they decide what to show +#. each message has a 'From', 'Subject' and 'Snippet' field +#: ../src/gajim.py:1454 +#, python-format +msgid "" +"\n" +"From: %(from_address)s" +msgstr "" +"\n" +"Od: %(from_address)s" + +#: ../src/gajim.py:1665 +#, python-format +msgid "%s wants to send you a file." +msgstr "%s Vam želi poslati datoteku." + +#: ../src/gajim.py:1730 +#, python-format +msgid "You successfully received %(filename)s from %(name)s." +msgstr "Uspešno ste primili datoteku %(filename)s od kontakta %(name)s." + +#. ft stopped +#: ../src/gajim.py:1734 +#, python-format +msgid "File transfer of %(filename)s from %(name)s stopped." +msgstr "Prenos datoteke %(filename)s od kontakta %(name)s je zaustavljen." + +#: ../src/gajim.py:1747 +#, python-format +msgid "You successfully sent %(filename)s to %(name)s." +msgstr "Uspešno ste poslali datoteku %(filename)s za kontakt %(name)s" + +#. ft stopped +#: ../src/gajim.py:1751 +#, python-format +msgid "File transfer of %(filename)s to %(name)s stopped." +msgstr "Prenos %(filename)s za kontakt %(name)s je zaustavljen. " + +#: ../src/gajim.py:1846 +msgid "Session negotiation cancelled" +msgstr "" + +#: ../src/gajim.py:1847 +#, python-format +msgid "The client at %s cancelled the session negotiation." +msgstr "" + +#: ../src/gajim.py:1887 ../src/gajim.py:1928 +msgid "Confirm these session options" +msgstr "" + +#: ../src/gajim.py:1888 +#, python-format +msgid "" +"The remote client wants to negotiate an session with these features:\n" +"\n" +"\t%s\n" +"\n" +"\tAre these options acceptable?" +msgstr "" + +#: ../src/gajim.py:1929 +#, python-format +msgid "" +"The remote client selected these options:\n" +"\n" +"%s\n" +"\n" +"Continue with the session?" +msgstr "" + +#: ../src/gajim.py:2041 +msgid "Username Conflict" +msgstr "Konflikt korisničkog imena" + +#: ../src/gajim.py:2042 +msgid "Please type a new username for your local account" +msgstr "Molimo Vas unesite novo korisničko ime za Vaš lokalni nalog" + +#: ../src/gajim.py:2059 +msgid "Ping?" +msgstr "" + +#: ../src/gajim.py:2067 +#, python-format +msgid "Pong! (%s s.)" +msgstr "" + +#: ../src/gajim.py:2073 +msgid "Error." +msgstr "" + +#: ../src/gajim.py:2098 +#, fuzzy +msgid "Resource Conflict" +msgstr "Konflikt korisničkog imena" + +#: ../src/gajim.py:2099 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" +msgstr "" + +#. it is good to notify the user +#. in case he or she cannot see the output of the console +#: ../src/gajim.py:2461 +msgid "Could not save your settings and preferences" +msgstr "Nije moguće čuvanje Vaših podešavanja" + +#. sorted alphanum +#: ../src/gajim.py:2596 ../src/common/config.py:86 ../src/common/config.py:395 +#: ../src/common/optparser.py:194 ../src/common/optparser.py:412 +#: ../src/common/optparser.py:446 +msgid "default" +msgstr "podrazumevano" + +#: ../src/gajim.py:2683 +msgid "Network Manager support not available" +msgstr "Podrška za upravitelja mreže nije dostupna" + +#: ../src/gajim.py:2784 +msgid "Session Management support not available (missing gnome.ui module)" +msgstr "" +"Podrška za upravljanje sesijama nije dostupna (nedostaje gnome.ui modul)" + +#: ../src/gajim-remote.py:65 +msgid "Shows a help on specific command" +msgstr "Prikazuje pomoć za određenu naredbu" + +#. User gets help for the command, specified by this parameter +#: ../src/gajim-remote.py:68 +msgid "command" +msgstr "naredba" + +#: ../src/gajim-remote.py:69 +msgid "show help on command" +msgstr "prikaži pomoć za komandu" + +#: ../src/gajim-remote.py:73 +msgid "Shows or hides the roster window" +msgstr "Prikazuje ili skriva prozor liste kontakata " + +#: ../src/gajim-remote.py:77 +msgid "Pops up a window with the next pending event" +msgstr "Iskače prozor sa sledećim događajem na čekanju" + +#: ../src/gajim-remote.py:81 +msgid "" +"Prints a list of all contacts in the roster. Each contact appears on a " +"separate line" +msgstr "" +"Ispisuje listu svih kontakata sa liste kontakata. Svaki kontakt se " +"pojavljuje u posebnoj liniji" + +#: ../src/gajim-remote.py:84 ../src/gajim-remote.py:99 +#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:122 +#: ../src/gajim-remote.py:136 ../src/gajim-remote.py:145 +#: ../src/gajim-remote.py:166 ../src/gajim-remote.py:196 +#: ../src/gajim-remote.py:205 ../src/gajim-remote.py:212 +#: ../src/gajim-remote.py:219 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:246 ../src/gajim-remote.py:255 +msgid "account" +msgstr "nalog" + +#: ../src/gajim-remote.py:84 +msgid "show only contacts of the given account" +msgstr "prikazuje samo kontakte sa ovog naloga" + +#: ../src/gajim-remote.py:90 +msgid "Prints a list of registered accounts" +msgstr "Ispisuje listu registrovanih naloga" + +#: ../src/gajim-remote.py:94 +msgid "Changes the status of account or accounts" +msgstr "Menja status jednog ili više naloga" + +#. offline, online, chat, away, xa, dnd, invisible should not be translated +#: ../src/gajim-remote.py:97 +msgid "status" +msgstr "status" + +#: ../src/gajim-remote.py:97 +msgid "one of: offline, online, chat, away, xa, dnd, invisible " +msgstr "" +"jedno od: nije na vezi, na vezi, priča, odsutan, produženo odsutan, ne " +"uznemiravaj, nevidljiv" + +#: ../src/gajim-remote.py:98 ../src/gajim-remote.py:119 +#: ../src/gajim-remote.py:133 ../src/gajim-remote.py:144 +msgid "message" +msgstr "poruka" + +#: ../src/gajim-remote.py:98 +msgid "status message" +msgstr "statusna poruka" + +#: ../src/gajim-remote.py:99 +msgid "" +"change status of account \"account\". If not specified, try to change status " +"of all accounts that have \"sync with global status\" option set" +msgstr "" +"izmena statusa naloga \"nalog\". Ako nije određen, pokušaj promene statusa " +"svih naloga koji imaju uključenu opciju \"sinhronizacija sa globalnim " +"statusom\"" + +#: ../src/gajim-remote.py:105 +msgid "Shows the chat dialog so that you can send messages to a contact" +msgstr "Prikazuje dijalog razgovora kako biste mogli razgovarati sa kontaktom" + +#: ../src/gajim-remote.py:107 +msgid "JID of the contact that you want to chat with" +msgstr "Džaber ID kontakta sa kojim želite razgovarati" + +#: ../src/gajim-remote.py:109 ../src/gajim-remote.py:196 +msgid "if specified, contact is taken from the contact list of this account" +msgstr "ako je naznačeno, kontakt se uzima sa liste kontakata ovog naloga" + +#: ../src/gajim-remote.py:114 +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 " +"key', just set 'OpenPGP key' to ''." +msgstr "" +"Šalje novu poruku kontaktu na listi, OpenPGP ključ i nalog su opcioni. Ako " +"želite postaviti samo 'nalog', bez 'OpenPGP ključ', samo postavite 'OpenPGP " +"ključ' na ''." + +#: ../src/gajim-remote.py:118 ../src/gajim-remote.py:131 +msgid "JID of the contact that will receive the message" +msgstr "Džaber ID kontakta koji će primiti poruku" + +#: ../src/gajim-remote.py:119 ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:144 +msgid "message contents" +msgstr "sadržaj poruke" + +#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 +msgid "pgp key" +msgstr "pgp ključ" + +#: ../src/gajim-remote.py:120 ../src/gajim-remote.py:134 +msgid "if specified, the message will be encrypted using this public key" +msgstr "ako je naznačeno, poruka će biti šifrovana koristeći ovaj javni ključ" + +#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:136 +#: ../src/gajim-remote.py:145 +msgid "if specified, the message will be sent using this account" +msgstr "ako je naznačeno, poruka će biti poslata koristeći ovaj nalog" + +#: ../src/gajim-remote.py:127 +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 " +"key', just set 'OpenPGP key' to ''." +msgstr "" +"Šalje novu poruku kontaktu na listi, OpenPGP ključ i nalog su opcioni. Ako " +"želite postaviti samo 'nalog', bez 'OpenPGP ključ', samo postavite 'OpenPGP " +"ključ' na ''." + +#: ../src/gajim-remote.py:132 +msgid "subject" +msgstr "tema" + +#: ../src/gajim-remote.py:132 +msgid "message subject" +msgstr "tema poruke" + +#: ../src/gajim-remote.py:141 +msgid "Sends new message to a groupchat you've joined." +msgstr "" + +#: ../src/gajim-remote.py:143 +#, fuzzy +msgid "JID of the room that will receive the message" +msgstr "Džaber ID kontakta koji će primiti poruku" + +#: ../src/gajim-remote.py:150 +msgid "Gets detailed info on a contact" +msgstr "Daje detaljne informacije o kontaktu" + +#: ../src/gajim-remote.py:152 ../src/gajim-remote.py:165 +#: ../src/gajim-remote.py:195 ../src/gajim-remote.py:204 +msgid "JID of the contact" +msgstr "Džaber ID kontakta" + +#: ../src/gajim-remote.py:156 +msgid "Gets detailed info on a account" +msgstr "Daje detaljne informacije o nalogu" + +#: ../src/gajim-remote.py:158 +msgid "Name of the account" +msgstr "Ime naloga" + +#: ../src/gajim-remote.py:162 +msgid "Sends file to a contact" +msgstr "Šalje datoteku kontaktu" + +#: ../src/gajim-remote.py:164 +msgid "file" +msgstr "datoteka" + +#: ../src/gajim-remote.py:164 +msgid "File path" +msgstr "Putanja do datoteke" + +#: ../src/gajim-remote.py:166 +msgid "if specified, file will be sent using this account" +msgstr "ako je naznačeno, datoteka će biti poslata koriteći ovaj nalog" + +#: ../src/gajim-remote.py:171 +msgid "Lists all preferences and their values" +msgstr "Prikazuje sva podešavanja i njihove vrednosti" + +#: ../src/gajim-remote.py:175 +msgid "Sets value of 'key' to 'value'." +msgstr "Postavlja vrednost 'ključa' na 'vrednost'." + +#: ../src/gajim-remote.py:177 +msgid "key=value" +msgstr "ključ=vrednost" + +#: ../src/gajim-remote.py:177 +msgid "'key' is the name of the preference, 'value' is the value to set it to" +msgstr "" +"'ključ' je ime stavke podešavanja, 'vrednost' je vrednost na koju će se " +"stavka postaviti" + +#: ../src/gajim-remote.py:182 +msgid "Deletes a preference item" +msgstr "Briše stavku podešavanja" + +#: ../src/gajim-remote.py:184 +msgid "key" +msgstr "ključ" + +#: ../src/gajim-remote.py:184 +msgid "name of the preference to be deleted" +msgstr "ime stavke podešavanja koje će se brisati" + +#: ../src/gajim-remote.py:188 +msgid "Writes the current state of Gajim preferences to the .config file" +msgstr "Zapisuje trenutno stanje Gajim podešavanja u .config datoteku" + +#: ../src/gajim-remote.py:193 +msgid "Removes contact from roster" +msgstr "Uklanja kontakt sa liste" + +#: ../src/gajim-remote.py:202 +msgid "Adds contact to roster" +msgstr "Dodaje kontakt na listu" + +#: ../src/gajim-remote.py:204 +msgid "jid" +msgstr "džid" + +#: ../src/gajim-remote.py:205 +msgid "Adds new contact to this account" +msgstr "Dodaje novi kontakt ovom računu" + +#: ../src/gajim-remote.py:210 +msgid "Returns current status (the global one unless account is specified)" +msgstr "Vraća trenutni status (globalni ako nije naznačen nalog)" + +#: ../src/gajim-remote.py:217 +msgid "" +"Returns current status message(the global one unless account is specified)" +msgstr "Vraća trenutnu statusnu poruku (globalnu ako nije naznačen nalog)" + +#: ../src/gajim-remote.py:224 +msgid "Returns number of unread messages" +msgstr "Vraća broj nepročitanih poruka" + +#: ../src/gajim-remote.py:228 +msgid "Opens 'Start Chat' dialog" +msgstr "Otvara dijalog za započinjanje razgovora" + +#: ../src/gajim-remote.py:230 +msgid "Starts chat, using this account" +msgstr "Započinje razgovor, koristeći ovaj nalog" + +#: ../src/gajim-remote.py:234 +msgid "Sends custom XML" +msgstr "Šalje korisnički definisan XML" + +#: ../src/gajim-remote.py:236 +msgid "XML to send" +msgstr "XML za slanje" + +#: ../src/gajim-remote.py:237 +msgid "" +"Account in which the xml will be sent; if not specified, xml will be sent to " +"all accounts" +msgstr "" +"Nalog za koji će biti poslan xml ; ako nije određen, xml će biti poslat za " +"sve naloge" + +#: ../src/gajim-remote.py:243 +msgid "Handle a xmpp:/ uri" +msgstr "Rukuj sa xmpp:/ uri-jem" + +#: ../src/gajim-remote.py:245 +msgid "uri" +msgstr "uri" + +#: ../src/gajim-remote.py:250 +msgid "Join a MUC room" +msgstr "_Pridruži se novoj MUC sobi" + +#: ../src/gajim-remote.py:252 +msgid "room" +msgstr "soba" + +#: ../src/gajim-remote.py:253 +msgid "nick" +msgstr "nadimak" + +#: ../src/gajim-remote.py:254 +msgid "password" +msgstr "Lozinka" + +#: ../src/gajim-remote.py:277 +msgid "Missing argument \"contact_jid\"" +msgstr "Nedostaje argument \"contact_jid\"" + +#: ../src/gajim-remote.py:296 +#, python-format +msgid "" +"'%s' is not in your roster.\n" +"Please specify account for sending the message." +msgstr "" +"'%s' nije na Vašj listi.\n" +"Molimo odredite nalog za slanje poruke." + +#: ../src/gajim-remote.py:299 +msgid "You have no active account" +msgstr "nemate aktivnih računa" + +#: ../src/gajim-remote.py:363 +#, python-format +msgid "" +"Usage: %s %s %s \n" +"\t %s" +msgstr "" +"Korišćenje: %s %s %s \n" +"\t %s" + +#: ../src/gajim-remote.py:366 +msgid "Arguments:" +msgstr "Argumenti:" + +#: ../src/gajim-remote.py:370 +#, python-format +msgid "%s not found" +msgstr "%s nije pronađen" + +#: ../src/gajim-remote.py:374 +#, python-format +msgid "" +"Usage: %s command [arguments]\n" +"Command is one of:\n" +msgstr "" +"Korišćenje: %s naredba [argumenti]\n" +"Naredba je jedna od:\n" + +#: ../src/gajim-remote.py:447 +#, python-format +msgid "" +"Too many arguments. \n" +"Type \"%s help %s\" for more info" +msgstr "" +"Previše argumenata. \n" +"Ukucajte \"%s help %s\" za više informacija" + +#: ../src/gajim-remote.py:451 +#, python-format +msgid "" +"Argument \"%s\" is not specified. \n" +"Type \"%s help %s\" for more info" +msgstr "" +"Argument \"%s\" nije naveden. \n" +"Ukucajte \"%s help %s\" za više informacija" + +#: ../src/gajim-remote.py:469 +msgid "Wrong uri" +msgstr "Loš uri" + +#: ../src/gajim_themes_window.py:62 +msgid "Theme" +msgstr "Tema" + +#: ../src/gajim_themes_window.py:100 +#, fuzzy +msgid "You cannot make changes to the default theme" +msgstr "Ne možete izbrisati Vašu trenutnu temu" + +#: ../src/gajim_themes_window.py:101 +msgid "Please create a clean new theme with your desired name." +msgstr "" + +#. don't confuse translators +#: ../src/gajim_themes_window.py:175 +msgid "theme name" +msgstr "ime teme" + +#: ../src/gajim_themes_window.py:192 +msgid "You cannot delete your current theme" +msgstr "Ne možete izbrisati Vašu trenutnu temu" + +#: ../src/gajim_themes_window.py:193 +msgid "Please first choose another for your current theme." +msgstr "Molimo Vas da prvo odaberete neku drugu temu." + +#: ../src/groupchat_control.py:134 +msgid "Sending private message failed" +msgstr "Neuspešno slanje privatne poruke" + +#. in second %s code replaces with nickname +#: ../src/groupchat_control.py:136 +#, python-format +msgid "You are no longer in group chat \"%s\" or \"%s\" has left." +msgstr "Više niste u grupnom razgovoru \"%s\" ili je \"%s\" otišao." + +#: ../src/groupchat_control.py:342 +msgid "Insert Nickname" +msgstr "Ubaci nadimak" + +#. Can be a message (see handle_event_gc_config_change in gajim.py) +#: ../src/groupchat_control.py:916 +msgid "Room logging is enabled" +msgstr "" + +#: ../src/groupchat_control.py:918 +#, fuzzy +msgid "A new room has been created" +msgstr "Vaš novi nalog je uspešno napravljen" + +#: ../src/groupchat_control.py:921 +msgid "The server has assigned or modified your roomnick" +msgstr "" + +#. do not print 'kicked by None' +#: ../src/groupchat_control.py:927 +#, python-format +msgid "%(nick)s has been kicked: %(reason)s" +msgstr "%(nick)s je izbačen: %(reason)s" + +#: ../src/groupchat_control.py:931 +#, python-format +msgid "%(nick)s has been kicked by %(who)s: %(reason)s" +msgstr "%(nick)s je izbačen od strane %(who)s: %(reason)s" + +#. do not print 'banned by None' +#: ../src/groupchat_control.py:938 +#, python-format +msgid "%(nick)s has been banned: %(reason)s" +msgstr "%(nick)s ima zabranu: %(reason)s" + +#: ../src/groupchat_control.py:942 +#, python-format +msgid "%(nick)s has been banned by %(who)s: %(reason)s" +msgstr "%(nick)s ima zabranu od člana %(who)s: %(reason)s" + +#. Someone changed his or her nick +#. We changed our nick +#: ../src/groupchat_control.py:949 +#, python-format +msgid "You are now known as %s" +msgstr "Od sada ste poznati kao %s" + +#: ../src/groupchat_control.py:951 +#, python-format +msgid "%s is now known as %s" +msgstr "%s je od sada poznat kao %s" + +#: ../src/groupchat_control.py:984 ../src/groupchat_control.py:988 +#: ../src/groupchat_control.py:993 +#, fuzzy, python-format +msgid "%(nick)s has been removed from the room (%(reason)s)" +msgstr "%(nick)s je izbačen od strane %(who)s: %(reason)s" + +#: ../src/groupchat_control.py:985 +#, fuzzy +msgid "affiliation changed" +msgstr "Pripadnost:" + +#: ../src/groupchat_control.py:990 +msgid "room configuration changed to members-only" +msgstr "" + +#: ../src/groupchat_control.py:995 +msgid "system shutdown" +msgstr "" + +#: ../src/groupchat_control.py:1094 +#, python-format +msgid "%s has left" +msgstr "%s je otišao" + +#: ../src/groupchat_control.py:1099 +#, python-format +msgid "%s has joined the group chat" +msgstr "%s se pridružio grupnom razgovoru" + +#. Invalid Nickname +#. invalid char +#: ../src/groupchat_control.py:1212 ../src/groupchat_control.py:1491 +msgid "Invalid nickname" +msgstr "Neispravan nadimak" + +#: ../src/groupchat_control.py:1213 ../src/groupchat_control.py:1492 +msgid "The nickname has not allowed characters." +msgstr "Nadimak ima nedozvoljene znake." + +#: ../src/groupchat_control.py:1236 ../src/groupchat_control.py:1254 +#: ../src/groupchat_control.py:1338 ../src/groupchat_control.py:1355 +#, python-format +msgid "Nickname not found: %s" +msgstr "Nadimak nije pronađen: %s " + +#: ../src/groupchat_control.py:1270 +msgid "This group chat has no subject" +msgstr "Ovaj grupni razgovor nema temu" + +#: ../src/groupchat_control.py:1281 +#, python-format +msgid "Invited %(contact_jid)s to %(room_jid)s." +msgstr "Pozvali ste %(contact_jid)s u sobu %(room_jid)s" + +#: ../src/groupchat_control.py:1418 +#, python-format +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. Does " +"NOT support spaces in nickname." +msgstr "" +"Korišćenje: /%s [razlog], zabranjuje pristup DŽID-u u sobu. " +"Nadimak učesnika može biti zamenjen, ali ne i ako sadrži \"@\". Ako je " +"Džaber ID trenutno u sobi, on/ona će biti izbačen(a). Razmaci u imenima NISU " +"podržani." + +#: ../src/groupchat_control.py:1425 +#, python-format +msgid "" +"Usage: /%s , opens a private chat window with the specified " +"occupant." +msgstr "" +"Način korišćenja: /%s , otvara prozor privatnog razgovor sa " +"navedenim učesnikom" + +#: ../src/groupchat_control.py:1431 +#, python-format +msgid "" +"Usage: /%s [reason], closes the current window or tab, displaying reason if " +"specified." +msgstr "" +"Način korišćenja: /%s [razlog], zatvara trenutni prozor ili jezičak, i " +"prikazuje razlog ako je naznačen." + +#: ../src/groupchat_control.py:1437 +#, python-format +msgid "" +"Usage: /%s [reason], invites JID to the current group chat, optionally " +"providing a reason." +msgstr "" +"Način korišćenja: /%s DŽID> [razlog], poziva Džaber ID u trenutni grupni " +"razgovor, opciono dajući razlog." + +#: ../src/groupchat_control.py:1441 +#, python-format +msgid "" +"Usage: /%s @[/nickname], offers to join room@server optionally " +"using specified nickname." +msgstr "" +"Način korišćenja: /%s @[/nadimak], nudi mogućnost spajanja na " +"soba@server koristeći navedeni nadimak." + +#: ../src/groupchat_control.py:1445 +#, python-format +msgid "" +"Usage: /%s [reason], removes the occupant specified by nickname " +"from the group chat and optionally displays a reason. Does NOT support " +"spaces in nickname." +msgstr "" +"Način korišćenja: /%s [razlog], uklanja učesnika sa zadatim " +"nadimkom iz grupnog razgovora i opciono prikazuje razlog. NE podržava blanko " +"znakove u nadimku." + +#: ../src/groupchat_control.py:1454 +#, python-format +msgid "" +"Usage: /%s [message], opens a private message window and sends " +"message to the occupant specified by nickname." +msgstr "" +"Način korišćenja: /%s [poruka], otvara prozor privatne poruke i " +"šalje poruku učesniku zadatim sa nadimkom." + +#: ../src/groupchat_control.py:1459 +#, python-format +msgid "Usage: /%s , changes your nickname in current group chat." +msgstr "" +"Način korišćenja: /%s , menja Vaš nadimak u trenutnom grupnom " +"razgovoru." + +#: ../src/groupchat_control.py:1463 +#, python-format +msgid "Usage: /%s , display the names of group chat occupants." +msgstr "Način korišćenja: /%s , prikazuje imena učesnika u grupnom razgovoru." + +#: ../src/groupchat_control.py:1467 +#, python-format +msgid "Usage: /%s [topic], displays or updates the current group chat topic." +msgstr "" +"Način korišćenja: /%s [tema], prikazuje ili ažurira temu grupnog razgovora." + +#: ../src/groupchat_control.py:1470 +#, python-format +msgid "" +"Usage: /%s , sends a message without looking for other commands." +msgstr "" +"Način korišćenja: /%s , šalje poruku ne gledajući ostale komande." + +#: ../src/groupchat_control.py:1565 +#, python-format +msgid "Are you sure you want to leave group chat \"%s\"?" +msgstr "Jeste li sigurni da želite napustiti grupni razgovor \"%s\"?" + +#: ../src/groupchat_control.py:1567 +msgid "" +"If you close this window, you will be disconnected from this group chat." +msgstr "" +"Ako zatvorite ovaj prozor, bićete isključeni sa ovoh grupnog razgovora." + +#: ../src/groupchat_control.py:1571 ../src/roster_window.py:4836 +msgid "Do _not ask me again" +msgstr "_Ne pitaj me više" + +#: ../src/groupchat_control.py:1605 +msgid "Changing Subject" +msgstr "Promena Teme" + +#: ../src/groupchat_control.py:1606 +msgid "Please specify the new subject:" +msgstr "Molimo odredite novu temu:" + +#: ../src/groupchat_control.py:1615 +msgid "Changing Nickname" +msgstr "Promena nadimka" + +#: ../src/groupchat_control.py:1616 +msgid "Please specify the new nickname you want to use:" +msgstr "Molimo odredite novi nadimak koji želite da koristite:" + +#. Ask for a reason +#: ../src/groupchat_control.py:1631 +#, fuzzy, python-format +msgid "Destroying %s" +msgstr "Opis: %s" + +#: ../src/groupchat_control.py:1632 +msgid "" +"You are going to definitively destroy this room.\n" +"You may specify a reason below:" +msgstr "" + +#: ../src/groupchat_control.py:1634 +msgid "You may also enter an alternate venue:" +msgstr "" + +#: ../src/groupchat_control.py:1665 +msgid "Bookmark already set" +msgstr "Marker je već postavljen" + +#: ../src/groupchat_control.py:1666 +#, python-format +msgid "Group Chat \"%s\" is already in your bookmarks." +msgstr "Grupni razgovor \"%s\" je već markiran." + +#: ../src/groupchat_control.py:1675 +msgid "Bookmark has been added successfully" +msgstr "Marker uspešno dodat" + +#: ../src/groupchat_control.py:1676 +msgid "You can manage your bookmarks via Actions menu in your roster." +msgstr "" +"Možete upravljati Vašim markerima pomoću menija Akcije iz Vaše liste " +"kontakata." + +#. ask for reason +#: ../src/groupchat_control.py:1828 +#, python-format +msgid "Kicking %s" +msgstr "Izbacujem %s" + +#: ../src/groupchat_control.py:1829 ../src/groupchat_control.py:2129 +msgid "You may specify a reason below:" +msgstr "Možete navesti razlog ispod:" + +#. ask for reason +#: ../src/groupchat_control.py:2128 +#, python-format +msgid "Banning %s" +msgstr "Zabranjujem %s" + +#: ../src/gtkexcepthook.py:41 +msgid "A programming error has been detected" +msgstr "Programska greška je otkrivena" + +#: ../src/gtkexcepthook.py:42 +msgid "" +"It probably is not fatal, but should be reported to the developers " +"nonetheless." +msgstr "Najverovatnije nije ništa strašno, ali je ipak javite programerima." + +#: ../src/gtkexcepthook.py:48 +msgid "_Report Bug" +msgstr "_Prijavi grešku" + +#: ../src/gtkexcepthook.py:71 +msgid "Details" +msgstr "Detalji" + +#. we talk about file +#: ../src/gtkgui_helpers.py:157 ../src/gtkgui_helpers.py:172 +#, python-format +msgid "Error: cannot open %s for reading" +msgstr "Greška: nije moguće otvoriti %s za čitanje" + +#: ../src/gtkgui_helpers.py:337 +msgid "Error reading file:" +msgstr "Greška pri čitanju datoteke:" + +#: ../src/gtkgui_helpers.py:340 +msgid "Error parsing file:" +msgstr "Greška pri učitavanju datoteke" + +#. do not traceback (could be a permission problem) +#. we talk about a file here +#: ../src/gtkgui_helpers.py:377 +#, python-format +msgid "Could not write to %s. Session Management support will not work" +msgstr "Nije moguće pisati u %s. Upravljanje sesijama neće biti moguće" + +#. xmpp: is currently handled by another program, so ask the user +#: ../src/gtkgui_helpers.py:711 +msgid "Gajim is not the default Jabber client" +msgstr "Gajim nije podrazumevani Džaber klijent" + +#: ../src/gtkgui_helpers.py:712 +msgid "Would you like to make Gajim the default Jabber client?" +msgstr "Da li biste želeli da Gajim bude podrazumevani Gajim klijent?" + +#: ../src/gtkgui_helpers.py:713 +msgid "Always check to see if Gajim is the default Jabber client on startup" +msgstr "" +"Uvek proveravaj da li je Gajim podrazumevani Džaber klijent po pokretanju" + +#: ../src/gtkgui_helpers.py:812 +msgid "Extension not supported" +msgstr "Ekstenzija nije podržana" + +#: ../src/gtkgui_helpers.py:813 +#, python-format +msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" +msgstr "" +"Sliku nije moguće sačuvati u %(type)s formatu. Sačuvati kao %(new_filename)s?" + +#: ../src/gtkgui_helpers.py:822 +msgid "Save Image as..." +msgstr "Snimi sliku kao..." + +#: ../src/history_manager.py:68 +msgid "Cannot find history logs database" +msgstr "Nije moguće pronaći dnevnik istorijata baze podataka" + +#. holds jid +#: ../src/history_manager.py:108 +msgid "Contacts" +msgstr "Kontakti" + +#. holds time +#: ../src/history_manager.py:121 ../src/history_manager.py:161 +#: ../src/history_window.py:116 +msgid "Date" +msgstr "Datum" + +#. holds nickname +#: ../src/history_manager.py:127 ../src/history_manager.py:179 +msgid "Nickname" +msgstr "Nadimak" + +#. holds message +#: ../src/history_manager.py:135 ../src/history_manager.py:167 +#: ../src/history_window.py:124 +msgid "Message" +msgstr "Poruka" + +#: ../src/history_manager.py:187 +msgid "" +"Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " +"RUNNING)" +msgstr "" +"Želite li počistiti bazu podataka? (NE PREPORUČUJE SE AKO JE GAJIM POKRENUT)" + +#: ../src/history_manager.py:189 +msgid "" +"Normally allocated database size will not be freed, it will just become " +"reusable. If you really want to reduce database filesize, click YES, else " +"click NO.\n" +"\n" +"In case you click YES, please wait..." +msgstr "" +"Normalno, veličina alociranog prostora neće biti oslobođena,samo će postati " +"ponovo koristiva. Ukoliko zaista želite smanjiti veličinu baze podataka " +"pritisnite Da, inače pritisnite Ne.\n" +"\n" +"Ukoliko pritisnite Da, molimo sačekajte..." + +#: ../src/history_manager.py:401 +msgid "Exporting History Logs..." +msgstr "Izvoženje dnevnika istorijata..." + +#: ../src/history_manager.py:476 +#, python-format +msgid "%(who)s on %(time)s said: %(message)s\n" +msgstr "%(who)s u %(time)s kaže: %(message)s\n" + +#: ../src/history_manager.py:514 +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] "Da li zaista želite izbrisati dnevnik razgovora označenog kontakta?" +msgstr[1] "" +"Da li zaista želite izbrisati dnevnike razgovora označenih kontakata?" +msgstr[2] "" +"Da li zaista želite izbrisati dnevnike razgovora označenih kontakata?" + +#: ../src/history_manager.py:518 ../src/history_manager.py:554 +msgid "This is an irreversible operation." +msgstr "Ova operacija je nepovratna." + +#: ../src/history_manager.py:551 +msgid "Do you really want to delete the selected message?" +msgid_plural "Do you really want to delete the selected messages?" +msgstr[0] "Da li zaista želite da izbrišete označenu poruku?" +msgstr[1] "Da li zaista želite da izbrišete označene poruke?" +msgstr[2] "Da li zaista želite da izbrišete označene poruke?" + +#: ../src/history_window.py:185 ../src/history_window.py:187 +#, python-format +msgid "Conversation History with %s" +msgstr "Istorijat razgovora sa %s" + +#: ../src/history_window.py:332 +#, python-format +msgid "%(nick)s is now %(status)s: %(status_msg)s" +msgstr "%(nick)s je trenutno %(status)s: %(status_msg)s" + +#: ../src/history_window.py:336 ../src/notify.py:206 +#, python-format +msgid "%(nick)s is now %(status)s" +msgstr "%(nick)s je trenutno %(status)s" + +#: ../src/history_window.py:342 +#, python-format +msgid "Status is now: %(status)s: %(status_msg)s" +msgstr "Status je trenutno: %(status)s: %(status_msg)s" + +#: ../src/history_window.py:345 +#, python-format +msgid "Status is now: %(status)s" +msgstr "Status je trenutno: %(status)s" + +#: ../src/htmltextview.py:583 ../src/htmltextview.py:594 +msgid "Timeout loading image" +msgstr "Isteklo vreme za učitavanje slike" + +#: ../src/htmltextview.py:604 +msgid "Image is too big" +msgstr "Slika je prevelika" + +#: ../src/message_window.py:288 +msgid "Chats" +msgstr "Razgovori" + +#: ../src/message_window.py:290 +msgid "Group Chats" +msgstr "Grupni razgovori" + +#: ../src/message_window.py:292 +msgid "Private Chats" +msgstr "Privatni Razgovori" + +#: ../src/message_window.py:294 +msgid "Messages" +msgstr "Poruke" + +#: ../src/message_window.py:295 +#, python-format +msgid "%s - Gajim" +msgstr "%s - Gajim" + +#: ../src/notify.py:204 +#, python-format +msgid "%(nick)s Changed Status" +msgstr "%(nick)s je promenio status" + +#: ../src/notify.py:214 +#, python-format +msgid "%(nickname)s Signed In" +msgstr "%(nickname)s je na vezi" + +#: ../src/notify.py:222 +#, python-format +msgid "%(nickname)s Signed Out" +msgstr "%(nickname)s je otišao" + +#: ../src/notify.py:234 +#, python-format +msgid "New Single Message from %(nickname)s" +msgstr "Nova samostalna poruka od kontakta %(nickname)s" + +#: ../src/notify.py:242 +#, python-format +msgid "New Private Message from group chat %s" +msgstr "Nova privatna poruka sa grupnog razgovora %s" + +#: ../src/notify.py:244 +#, python-format +msgid "%(nickname)s: %(message)s" +msgstr "%(nickname)s: %(message)s" + +#: ../src/notify.py:247 +#, fuzzy, python-format +msgid "Messaged by %(nickname)s" +msgstr "Nova poruka od %(nickname)s" + +#: ../src/notify.py:253 +#, python-format +msgid "New Message from %(nickname)s" +msgstr "Nova poruka od %(nickname)s" + +#: ../src/profile_window.py:72 +msgid "Retrieving profile..." +msgstr "Dohvatanje profila..." + +#: ../src/profile_window.py:123 ../src/roster_window.py:1882 +#, fuzzy +msgid "File is empty" +msgstr "Putanja do datoteke" + +#: ../src/profile_window.py:126 ../src/roster_window.py:1885 +#, fuzzy +msgid "File does not exist" +msgstr "Ne postoji ovakav grupni razgovor." + +#. keep identation +#. unknown format +#: ../src/profile_window.py:140 ../src/profile_window.py:156 +#: ../src/roster_window.py:1887 ../src/roster_window.py:1898 +msgid "Could not load image" +msgstr "Ne mogu učitati sliku" + +#: ../src/profile_window.py:257 +msgid "Information received" +msgstr "Informacije primljene" + +#: ../src/profile_window.py:326 +msgid "Without a connection you can not publish your contact information." +msgstr "Ako niste na vezi, ne možete objaviti Baše informacije" + +#: ../src/profile_window.py:338 +msgid "Sending profile..." +msgstr "Slanje profila..." + +#: ../src/profile_window.py:353 +msgid "Information NOT published" +msgstr "Informacije NISU objavljene" + +#: ../src/profile_window.py:360 +msgid "vCard publication failed" +msgstr "Publikacija vCard neuspela" + +#: ../src/profile_window.py:361 +msgid "" +"There was an error while publishing your personal information, try again " +"later." +msgstr "" +"Nastala je greška prilikom objavljivanja Vaših ličnih informacija, pokušajte " +"ponovo kasnije." + +#: ../src/roster_window.py:182 ../src/roster_window.py:237 +msgid "Merged accounts" +msgstr "Spojeni nalozi" + +#: ../src/roster_window.py:357 ../src/roster_window.py:622 +#: ../src/roster_window.py:2110 ../src/common/contacts.py:307 +#: ../src/common/helpers.py:44 +msgid "Observers" +msgstr "Posmatrači" + +#. Make special context menu if group is Groupchats +#: ../src/roster_window.py:441 ../src/roster_window.py:446 +#: ../src/roster_window.py:1935 ../src/roster_window.py:1938 +#: ../src/roster_window.py:2607 ../src/roster_window.py:2610 +#: ../src/roster_window.py:2635 ../src/roster_window.py:4696 +#: ../src/roster_window.py:4698 ../src/common/commands.py:194 +#: ../src/common/contacts.py:97 ../src/common/helpers.py:44 +msgid "Groupchats" +msgstr "Grupni razgovori" + +#: ../src/roster_window.py:771 ../src/roster_window.py:3952 +msgid "You cannot join a group chat while you are invisible" +msgstr "Nemoguće je pristupiti grupnom razgovoru ako ste nevidljivi" + +#. new chat +#. single message +#. for chat_with +#. for single message +#. join gc +#: ../src/roster_window.py:984 ../src/roster_window.py:994 +#: ../src/roster_window.py:1003 ../src/systray.py:207 ../src/systray.py:212 +#: ../src/systray.py:218 +#, python-format +msgid "using account %s" +msgstr "koristeći račun %s" + +#. add +#: ../src/roster_window.py:1010 +#, python-format +msgid "to %s account" +msgstr "na %s nalog" + +#. disco +#: ../src/roster_window.py:1015 +#, python-format +msgid "using %s account" +msgstr "koristeći %s račun" + +#: ../src/roster_window.py:1096 +msgid "_Manage Bookmarks..." +msgstr "Upravljanje _markerima..." + +#. profile, avatar +#: ../src/roster_window.py:1115 +#, python-format +msgid "of account %s" +msgstr "naloga %s" + +#: ../src/roster_window.py:1155 +#, python-format +msgid "for account %s" +msgstr "za nalog %s" + +#. History manager +#: ../src/roster_window.py:1176 +msgid "History Manager" +msgstr "Upravnik istorijatom" + +#: ../src/roster_window.py:1185 +msgid "_Join New Group Chat" +msgstr "_Pridruživanje novom grupnom razgovoru" + +#: ../src/roster_window.py:1544 ../src/roster_window.py:4150 +#: ../src/roster_window.py:4157 +msgid "You have unread messages" +msgstr "Imate nepročitanih poruka" + +#: ../src/roster_window.py:1545 +msgid "You must read them before removing this transport." +msgstr "Morate ih pročitati pre uklanjanja ovog transporta." + +#: ../src/roster_window.py:1548 +#, python-format +msgid "Transport \"%s\" will be removed" +msgstr "Transport \"%s\" će biti uklonjen" + +#: ../src/roster_window.py:1549 +msgid "" +"You will no longer be able to send and receive messages from contacts using " +"this transport." +msgstr "" +"Nećete više biti u mogućnosti da razmenjujete poruke od kontakata sa ovog " +"transporta." + +#: ../src/roster_window.py:1552 +msgid "Transports will be removed" +msgstr "Transport će biti uklonjen" + +#: ../src/roster_window.py:1557 +#, python-format +msgid "" +"You will no longer be able to send and receive messages to contacts from " +"these transports:%s" +msgstr "" +"Nećete više biti u mogućnosti da razmenjujete poruke sa kontkatima sa ovog " +"transporta:%s" + +#. it's jid +#: ../src/roster_window.py:1723 +msgid "Rename Contact" +msgstr "Preimenuj kontakt" + +#: ../src/roster_window.py:1724 +#, python-format +msgid "Enter a new nickname for contact %s" +msgstr "Unesite novi nadimak za kontakt %s" + +#: ../src/roster_window.py:1731 +msgid "Rename Group" +msgstr "Preimenuj grupu" + +#: ../src/roster_window.py:1732 +#, python-format +msgid "Enter a new name for group %s" +msgstr "Unesite novo ime za grupu %s" + +#: ../src/roster_window.py:1807 +msgid "Remove Group" +msgstr "Ukloni grupu" + +#: ../src/roster_window.py:1808 +#, python-format +msgid "Do you want to remove group %s from the roster?" +msgstr "Želite li ukloniti grupu %s sa liste kontakata?" + +#: ../src/roster_window.py:1809 +msgid "Remove also all contacts in this group from your roster" +msgstr "Ujedno ukloni i sve kontakte iz ove grupe iz liste kontakata" + +#: ../src/roster_window.py:1840 +msgid "Assign OpenPGP Key" +msgstr "Pridruži OpenPGP Ključ" + +#: ../src/roster_window.py:1841 +msgid "Select a key to apply to the contact" +msgstr "Odaberite ključ za pridruživanje kontaktu" + +#: ../src/roster_window.py:2156 +#, fuzzy +msgid "_New Group Chat" +msgstr "Novi grupni razgovor" + +#: ../src/roster_window.py:2298 +msgid "I would like to add you to my roster" +msgstr "Želeo bih Vas dodati na moju listu kontakata" + +#. Send Group Message +#: ../src/roster_window.py:2432 ../src/roster_window.py:2644 +msgid "Send Group M_essage" +msgstr "P_ošalji grupnu poruku" + +#: ../src/roster_window.py:2451 +msgid "_New group chat" +msgstr "_Novi grupni razgovor" + +#. Manage Transport submenu +#: ../src/roster_window.py:2489 +#, fuzzy +msgid "_Manage Contacts" +msgstr "Preimenuj kontakt" + +#: ../src/roster_window.py:2550 +msgid "_Maximize" +msgstr "" + +#: ../src/roster_window.py:2557 +#, fuzzy +msgid "_Disconnect" +msgstr "Kontakt Otišao Sa Veze" + +#: ../src/roster_window.py:2636 +msgid "_Maximize All" +msgstr "" + +#: ../src/roster_window.py:2652 +msgid "To all users" +msgstr "Svim korisnicima" + +#: ../src/roster_window.py:2655 +msgid "To all online users" +msgstr "Svim korisnicima na vezi" + +#. Log Off +#: ../src/roster_window.py:2772 +#, fuzzy +msgid "_Log off" +msgstr "_Odjava" + +#. Log on +#: ../src/roster_window.py:2778 +msgid "_Log on" +msgstr "_Prijava" + +#. Send single message +#: ../src/roster_window.py:2790 +#, fuzzy +msgid "Send Single Message" +msgstr "_Pošalji jednu poruku" + +#. Manage Transport submenu +#: ../src/roster_window.py:2837 +#, fuzzy +msgid "_Manage Transport" +msgstr "Prenosi" + +#. Modify Transport +#: ../src/roster_window.py:2845 +#, fuzzy +msgid "_Modify Transport" +msgstr "Prikaži trans_porte" + +#. Information +#: ../src/roster_window.py:2882 +#, fuzzy +msgid "_Information" +msgstr "Informacije kontakta" + +#: ../src/roster_window.py:2959 ../src/roster_window.py:3033 +msgid "_Change Status Message" +msgstr "_Izmeni statusnu poruku" + +#: ../src/roster_window.py:3105 +msgid "Authorization has been sent" +msgstr "Autorizacija poslata" + +#: ../src/roster_window.py:3106 +#, python-format +msgid "Now \"%s\" will know your status." +msgstr "Sada će kontakt \"%s\" znati Vaš status." + +#: ../src/roster_window.py:3126 +msgid "Subscription request has been sent" +msgstr "Zahtev za pretplatom poslat" + +#: ../src/roster_window.py:3127 +#, python-format +msgid "If \"%s\" accepts this request you will know his or her status." +msgstr "Ako kontakt \"%s\" prihvati ovaj zahtev, znaćete njegov/njen status." + +#: ../src/roster_window.py:3139 +msgid "Authorization has been removed" +msgstr "Autorizacija uklonjena" + +#: ../src/roster_window.py:3140 +#, python-format +msgid "Now \"%s\" will always see you as offline." +msgstr "Sada će Vas kontakt \"%s\" uvek videti kao da niste na vezi." + +#: ../src/roster_window.py:3338 +#, python-format +msgid "Contact \"%s\" will be removed from your roster" +msgstr "Kontakt \"%s\" će biti uklonjen sa Vaše liste kontakata" + +#: ../src/roster_window.py:3342 +msgid "" +"By removing this contact you also remove authorization resulting in him or " +"her always seeing you as offline." +msgstr "" +"Uklanjanjem ovog kontakta ujedno uklanjate i odobrenje što znači da će Vas " +"ta osoba uvek videti kao da niste na vezi." + +#: ../src/roster_window.py:3347 +msgid "" +"By removing this contact you also by default remove authorization resulting " +"in him or her always seeing you as offline." +msgstr "" +"Uklanjanjem ovog kontakta ujedno podrazumevano uklanjate i odobrenje što " +"znači da će Vas ta osoba uvek videti kao da niste na vezi." + +#: ../src/roster_window.py:3350 +msgid "I want this contact to know my status after removal" +msgstr "Želim da ovaj kontakt zna moj status i nakon uklanjanja" + +#. several contact to remove at the same time +#: ../src/roster_window.py:3354 +msgid "Contacts will be removed from your roster" +msgstr "Kontakti će biti uklonjeni sa Vaše liste kontakata" + +#: ../src/roster_window.py:3358 +#, python-format +msgid "" +"By removing these contacts:%s\n" +"you also remove authorization resulting in them always seeing you as offline." +msgstr "" +"Uklanjanjem ovih kontakata:%s\n" +"ujedno uklanjate i odobrenje pto znači da će Vas te osobe uvek videti kao da " +"niste na vezi." + +#: ../src/roster_window.py:3390 +#, fuzzy +msgid "" +"Gnome Keyring is installed but not correctly started (environment variable " +"probably not correctly set)" +msgstr "" +"Gnomov Keyring je instaliran, ali nije korektno pokrenut (promenljive " +"okruženja verovatno nisu dobro podešene)" + +#: ../src/roster_window.py:3417 +msgid "GPG is not usable" +msgstr "" + +#. %s is the account name here +#: ../src/roster_window.py:3417 ../src/common/connection.py:684 +#: ../src/common/zeroconf/connection_zeroconf.py:165 +#, python-format +msgid "You will be connected to %s without OpenPGP." +msgstr "Povezaćete se na %s bez OpenPGP ključa." + +#: ../src/roster_window.py:3434 +msgid "Passphrase Required" +msgstr "Lozinka neophodna" + +#: ../src/roster_window.py:3435 +#, python-format +msgid "Enter GPG key passphrase for account %s." +msgstr "Unesite lozinku GPG ključa za nalog %s." + +#: ../src/roster_window.py:3440 +msgid "Save passphrase" +msgstr "Sačuvati lozinku" + +#: ../src/roster_window.py:3448 +msgid "Wrong Passphrase" +msgstr "Neispravna lozinka" + +#: ../src/roster_window.py:3449 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "Molimo ponovo ukucajte Vašu GPG lozinku ili pritisnite Odustani" + +#: ../src/roster_window.py:3532 ../src/roster_window.py:3609 +msgid "You are participating in one or more group chats" +msgstr "Učestvujete u jednom ili više grupnih razgovora" + +#: ../src/roster_window.py:3533 ../src/roster_window.py:3610 +msgid "" +"Changing your status to invisible will result in disconnection from those " +"group chats. Are you sure you want to go invisible?" +msgstr "" +"Promena Vašeg statusa u Nevidljiv će rezultovati odvezivanjem sa tih " +"grupnih razgovora. Jeste li sigurni da želite ići na nevidljivo?" + +#: ../src/roster_window.py:3567 +msgid "No account available" +msgstr "Nema dostupnih naloga" + +#: ../src/roster_window.py:3568 +msgid "You must create an account before you can chat with other contacts." +msgstr "" +"Morate kreirati nalog pre nego što možete da razgovarate sa ostalim " +"kontaktima." + +#: ../src/roster_window.py:3696 +#, python-format +msgid "\"%(title)s\" by %(artist)s" +msgstr "\"%(title)s\" od %(artist)s" + +#: ../src/roster_window.py:4151 ../src/roster_window.py:4158 +msgid "" +"Messages will only be available for reading them later if you have history " +"enabled." +msgstr "" +"Poruke će biti dostupne za čitanje i kasnije ako imate omogućen istorijat." + +#: ../src/roster_window.py:4782 +msgid "Metacontacts storage not supported by your server" +msgstr "Čuvanje pseudokontakata nije podržano od strane Vašeg servera" + +#: ../src/roster_window.py:4784 +#, fuzzy +msgid "" +"Your server does not support storing metacontacts information. So those " +"information will not be saved on next reconnection." +msgstr "" +"Vaš server ne podržava čuvanje informacija pseudokontakata. Te informacije " +"neće biti sačuvane pri sledećem povezivanju." + +#: ../src/roster_window.py:4830 +msgid "" +"You are about to create a metacontact. Are you sure you want to continue?" +msgstr "" +"Upravo ćete napraviti pseudokontkat. Jeste li sigurni da želite nastaviti?" + +#: ../src/roster_window.py:4832 +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 "" +"Pseudokontakti su način grupisanja nekoliko kontakata u jednu liniju. " +"Generalno, oni se koriste kada ista osoba ima nekoliko Džaber naloga ili " +"transportnih naloga." + +#: ../src/roster_window.py:4930 +#, fuzzy, python-format +msgid "Do you want to send that file to %s:" +msgid_plural "Do you want to send those files to %s:" +msgstr[0] "%s Vam želi poslati datoteku:" +msgstr[1] "%s Vam želi poslati datoteku:" +msgstr[2] "%s Vam želi poslati datoteku:" + +#: ../src/roster_window.py:5212 +msgid "Change Status Message..." +msgstr "Promeni statusnu poruku..." + +#: ../src/systray.py:164 +msgid "_Change Status Message..." +msgstr "_Promeni statusnu poruku..." + +#: ../src/systray.py:249 +msgid "Hide this menu" +msgstr "Sakrij ovaj meni" + +#: ../src/tooltips.py:310 ../src/tooltips.py:503 +msgid "Jabber ID: " +msgstr "Džaber ID: " + +#: ../src/tooltips.py:313 ../src/tooltips.py:507 +msgid "Resource: " +msgstr "Resurs: " + +#: ../src/tooltips.py:318 +#, python-format +msgid "%(owner_or_admin_or_member)s of this group chat" +msgstr "%(owner_or_admin_or_member)s ovog grupnog razgovora" + +#: ../src/tooltips.py:416 +msgid " [blocked]" +msgstr "" + +#: ../src/tooltips.py:420 +msgid " [minimized]" +msgstr "" + +#: ../src/tooltips.py:435 ../src/tooltips.py:623 +msgid "Status: " +msgstr "Status: " + +#: ../src/tooltips.py:465 +#, python-format +msgid "Last status: %s" +msgstr "Poslednji status: %s" + +#: ../src/tooltips.py:467 +#, python-format +msgid " since %s" +msgstr " od %s" + +#: ../src/tooltips.py:485 +#, fuzzy +msgid "Connected" +msgstr "Veza" + +#: ../src/tooltips.py:487 +#, fuzzy +msgid "Disconnected" +msgstr "Kontakt Otišao Sa Veze" + +#. ('both' is the normal sub so we don't show it) +#: ../src/tooltips.py:514 +msgid "Subscription: " +msgstr "Pretplata: " + +#: ../src/tooltips.py:524 +msgid "OpenPGP: " +msgstr "OpenPGP: " + +#: ../src/tooltips.py:579 +msgid "Download" +msgstr "Skidanje" + +#: ../src/tooltips.py:585 +msgid "Upload" +msgstr "Slanje" + +#: ../src/tooltips.py:592 +msgid "Type: " +msgstr "Tip: " + +#: ../src/tooltips.py:598 +msgid "Transferred: " +msgstr "Prenešeno: " + +#: ../src/tooltips.py:601 ../src/tooltips.py:622 +msgid "Not started" +msgstr "Nije počeo" + +#: ../src/tooltips.py:605 +msgid "Stopped" +msgstr "Zaustavljen" + +#: ../src/tooltips.py:607 ../src/tooltips.py:610 +msgid "Completed" +msgstr "Završen" + +#: ../src/tooltips.py:614 +msgid "?transfer status:Paused" +msgstr "?status prenosa:Pauziran" + +#. stalled is not paused. it is like 'frozen' it stopped alone +#: ../src/tooltips.py:618 +msgid "Stalled" +msgstr "Zastoj" + +#: ../src/tooltips.py:620 +msgid "Transferring" +msgstr "Prenos u toku" + +#: ../src/tooltips.py:652 +msgid "This service has not yet responded with detailed information" +msgstr "Ovaj servis još nije pružio detaljne informacije" + +#: ../src/tooltips.py:655 +msgid "" +"This service could not respond with detailed information.\n" +"It is most likely legacy or broken" +msgstr "" +"Ovaj servis nije mogao odgovoriti sa detaljnim informacijama.\n" +"Najverovatnije je zastareo ili u kvaru" + +#: ../src/vcard.py:240 +msgid "?Client:Unknown" +msgstr "?Klijent:Nepoznat" + +#: ../src/vcard.py:242 +msgid "?OS:Unknown" +msgstr "?OS:Nepoznat" + +#: ../src/vcard.py:267 ../src/vcard.py:277 ../src/vcard.py:467 +#, python-format +msgid "since %s" +msgstr "od %s" + +#: ../src/vcard.py:306 +msgid "Affiliation:" +msgstr "Pripadnost:" + +#: ../src/vcard.py:314 +msgid "" +"This contact is interested in your presence information, but you are not " +"interested in his/her presence" +msgstr "" +"Ovaj kontakt je zainteresovan za informacije o Vašem prisustvu, ali Vas ne " +"zanimaju informacije o njegovom/njenom prisustvu." + +#: ../src/vcard.py:316 +msgid "" +"You are interested in the contact's presence information, but he/she is not " +"interested in yours" +msgstr "" +"Vi ste zainteresovani za informacije o prisustvu nekog kontakta, ali njega/" +"nju ne zanima Vaše prisustvo" + +#: ../src/vcard.py:318 +msgid "You and the contact are interested in each other's presence information" +msgstr "" +"I Vi i Vaš kontakt ste zainteresovani za informacije o prisustvu jedan drugog" + +#. None +#: ../src/vcard.py:320 +msgid "" +"You are not interested in the contact's presence, and neither he/she is " +"interested in yours" +msgstr "" +"Ne interesuje Vas prisutnost kontakta, niti Vaša prisutnost interesuje njega/" +"nju" + +#: ../src/vcard.py:328 +msgid "You are waiting contact's answer about your subscription request" +msgstr "Čekate odgovor kontakta o Vašem zahtevu za pretplatom" + +#: ../src/vcard.py:332 ../src/vcard.py:369 ../src/vcard.py:492 +msgid " resource with priority " +msgstr " resurs sa prioritetom " + +#: ../src/common/check_paths.py:33 +msgid "creating logs database" +msgstr "kreiram bazu dnevnika" + +#: ../src/common/check_paths.py:96 ../src/common/check_paths.py:107 +#: ../src/common/check_paths.py:114 +#, python-format +msgid "%s is a file but it should be a directory" +msgstr "%s je datoteka, ali bi trebala biti fascikla" + +#: ../src/common/check_paths.py:97 ../src/common/check_paths.py:108 +#: ../src/common/check_paths.py:115 ../src/common/check_paths.py:123 +msgid "Gajim will now exit" +msgstr "Gajim će se sada završiti" + +#: ../src/common/check_paths.py:122 +#, python-format +msgid "%s is a directory but should be a file" +msgstr "%s je fascikla, ali bi trebala biti datoteka" + +#: ../src/common/check_paths.py:138 +#, python-format +msgid "creating %s directory" +msgstr "kreiram fasciklu %s" + +#: ../src/common/commands.py:69 +msgid "Change status information" +msgstr "Promena statusnih informacija" + +#: ../src/common/commands.py:82 +msgid "Change status" +msgstr "Promena statusa" + +#: ../src/common/commands.py:83 +msgid "Set the presence type and description" +msgstr "Postavite tip prisutnosti i opis" + +#: ../src/common/commands.py:89 +msgid "Free for chat" +msgstr "Slobodan za razgovor" + +#: ../src/common/commands.py:90 +msgid "Online" +msgstr "Na vezi" + +#: ../src/common/commands.py:92 +msgid "Extended away" +msgstr "Produženo odsutan" + +#: ../src/common/commands.py:93 +msgid "Do not disturb" +msgstr "Ne uznemiravaj." + +#: ../src/common/commands.py:94 +msgid "Offline - disconnect" +msgstr "Nije na vezi - nepovezan" + +#: ../src/common/commands.py:99 +msgid "Presence description:" +msgstr "opis prisutnosti:" + +#: ../src/common/commands.py:134 +msgid "The status has been changed." +msgstr "Status je promenjen." + +#: ../src/common/commands.py:179 +#, python-format +msgid "%(nickname)s on %(room_jid)s" +msgstr "%(nickname)s u sobi %(room_jid)s" + +#: ../src/common/commands.py:183 +msgid "You have not joined a groupchat." +msgstr "Pridružili ste se grupnom razgovoru" + +#: ../src/common/commands.py:189 +msgid "Leave Groupchats" +msgstr "Napusti grupne razgovore" + +#: ../src/common/commands.py:190 +msgid "Choose the groupchats you want to leave" +msgstr "Odaberite grupne razgovore koje želite napustiti" + +#: ../src/common/commands.py:230 +#, fuzzy +msgid "You left the following groupchats:" +msgstr "Napustili ste sledeće grupne razgovore:" + +#: ../src/common/commands.py:242 +#, fuzzy +msgid "Forward unread messages" +msgstr "%d nepročitana poruka" + +#: ../src/common/commands.py:262 +msgid "All unread messages have been forwarded." +msgstr "" + +#: ../src/common/config.py:58 +msgid "Use D-Bus and Notification-Daemon to show notifications" +msgstr "Koristi DBus i demon obaveštenja za prikazivanje obaveštenja" + +#: ../src/common/config.py:63 +msgid "Time in minutes, after which your status changes to away." +msgstr "Vreme u minutama, nakom koga će se Vaš status promeiti u Odsutan." + +#: ../src/common/config.py:64 +msgid "Away as a result of being idle" +msgstr "Odsutan, kao posledica mirovanja" + +#: ../src/common/config.py:66 +msgid "Time in minutes, after which your status changes to not available." +msgstr "" +"Vreme u minutama, nakom koga će se Vaš status promeiti u Nije dostupan." + +#: ../src/common/config.py:67 +msgid "Not available as a result of being idle" +msgstr "Nije dostupan, kao posledica mirovanja." + +#: ../src/common/config.py:85 +msgid "" +"List (space separated) of rows (accounts and groups) that are collapsed." +msgstr "" +"Lista (odvojena blanko znakovima) redova (naloga i grupa) koji su otvoreni." + +#: ../src/common/config.py:90 +msgid "Enable link-local/zeroconf messaging" +msgstr "Omogući lokalnu vezu/zeroconf poruke" + +#: ../src/common/config.py:93 +msgid "Language used by speller" +msgstr "Jezik koji koristi pravopis" + +#: ../src/common/config.py:94 +msgid "" +"'always' - print time for every message.\n" +"'sometimes' - print time every print_ichat_every_foo_minutes minute.\n" +"'never' - never print time." +msgstr "" +"'uvek' - ispisuj vreme za svaku poruku.\n" +"'ponekad' - ispisuj vreme svakih print_ichat_every_foo_minutes minuta.\n" +"'nikad' - nikad ne ispisuj vreme." + +#: ../src/common/config.py:95 +msgid "" +"Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " +"to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " +"This is used only if print_time is 'sometimes'." +msgstr "" +"Ispisuj vreme u razgovorima koristeći Rasplinuti Sat. Vrednost rasplinutosti " +"od 1 do 4 ili 0 za onemogućivanje nejasnog sata. 1 je najprecizniji sat, 4 " +"najneprecizniji. Ovo se koristi samo ukoliko je print_time postavnjeno na " +"'sometimes'." + +#: ../src/common/config.py:98 +msgid "Treat * / _ pairs as possible formatting characters." +msgstr "Smatraj * / _ parove kao znakove za formatiranje." + +#: ../src/common/config.py:99 +msgid "" +"If True, do not remove */_ . So *abc* will be bold but with * * not removed." +msgstr "" +"Ako je istinito, ne uklanjaj */_ . Tako će *abv* biti podebljano, ali " +"iokruženo sa * *." + +#: ../src/common/config.py:102 +msgid "" +"Uses ReStructured text markup to send HTML, plus ascii formatting if " +"selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" +"restructuredtext.html (If you want to use this, install docutils)" +msgstr "" +"Koristi ReStructured tekst markup za slanje HTML-a i ascii formatiranje ako " +"je odabrano. Za sintaksu, pogledajte http://docutils.sourceforge.net/docs/" +"ref/rst/restructuredtext.html (Ako želite da koristite ovo, instalirajte " +"docutils)" + +#: ../src/common/config.py:111 +msgid "" +"Character to add after nickname when using nick completion (tab) in group " +"chat." +msgstr "" +"Karakter za dodavanje posle nadimka kada se koristi dovršavanje nadimka " +"(tasterom tab) u grupnom razgovoru" + +#: ../src/common/config.py:112 +msgid "" +"Character to propose to add after desired nickname when desired nickname is " +"used by someone else in group chat." +msgstr "" +"Karakter koji želite dodati posle željenog nadimka ukoliko je željeni " +"nadimak u grupnom razgovoru već upotrebljen" + +#: ../src/common/config.py:135 +msgid "" +"This option let you customize timestamp that is printed in conversation. For " +"exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " +"strftime for full documentation: http://docs.python.org/lib/module-time.html" +msgstr "" +"Ova opcija Vam omogućava prilagođavanje ispisa vremena u razgovoru. Na " +"primer \"[%H:%M] \" će prikazati \"[sat:minut] \". Pogledajte python " +"dokumentaciju za strftime funkciju za puno razumevanje: http://docs.python." +"org/lib/module-time.html" + +#: ../src/common/config.py:136 +msgid "Characters that are printed before the nickname in conversations" +msgstr "Karakteri odštampani pre nadimka u razgovoru" + +#: ../src/common/config.py:137 +msgid "Characters that are printed after the nickname in conversations" +msgstr "Karakteri odštampani posle nadimka u razgovoru" + +#: ../src/common/config.py:144 +msgid "Add * and [n] in roster title?" +msgstr "Dodaj * i [n] u naslov liste kontakata?" + +#: ../src/common/config.py:145 +msgid "" +"How many lines to remember from previous conversation when a chat tab/window " +"is reopened." +msgstr "" +"Koliko linija prethodnog razgovora pamtiti kada se prozor/jezičak za " +"razgovor ponovo otvori." + +#: ../src/common/config.py:146 +msgid "How many minutes should last lines from previous conversation last." +msgstr "Koliko minuta da traju linije prethodnog razgovora." + +#: ../src/common/config.py:147 +msgid "" +"Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " +"Client default behaviour)." +msgstr "" +"Pošalji poruku sa Ctrl+Enter, a sa Enter pravi novu liniju. (Podrazumevano " +"ponašanje Miralabisovog ICQ klijenta)" + +#: ../src/common/config.py:149 +msgid "How many lines to store for Ctrl+KeyUP." +msgstr "Koliko linija sačuvati sa Ctrl+KeyUP" + +#: ../src/common/config.py:152 +#, python-format +msgid "" +"Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' " +"which means use wiktionary." +msgstr "" +"Ili Vaš specificirani URL sa %s u njemu gde je %s reč ili fraza ili 'VIKI-" +"REČNIK' što znači korišćenje viki-rečnika." + +#: ../src/common/config.py:155 +msgid "If checked, Gajim can be controlled remotely using gajim-remote." +msgstr "Ako je označeno, Gajim se može kontrolisati korišćenjem gajim-remote." + +#: ../src/common/config.py:156 +msgid "" +"If True, listen to D-Bus signals from NetworkManager and change the status " +"of accounts (provided they do not have listen_to_network_manager set to " +"False and they sync with global status) based upon the status of the network " +"connection." +msgstr "" +"Ako je istinit, osluškuj D-Bus signale iz Menadžera Mreže i promeni status " +"računa (ako nemaju listen_to_network_manager postavljen na neistinito i " +"sinhronizuj sa globalnim statusom) u zavisnosti od statusa mrežne konekcije." + +#: ../src/common/config.py:157 +msgid "" +"Sent chat state notifications. Can be one of all, composing_only, disabled." +msgstr "" +"Poslata obaveštenja o stanju razgovora. Može biti jedno od " +"'svi','samo_sastavljanje', 'onemogućeno'." + +#: ../src/common/config.py:158 +msgid "" +"Displayed chat state notifications in chat windows. Can be one of all, " +"composing_only, disabled." +msgstr "" +"Prikazana obaveštenja o stanju razgovora u prozoru za razgovor. Može biti " +"jedno od 'svi', 'samo_sastavljanje', 'onemogućeno'." + +#: ../src/common/config.py:160 +msgid "" +"When not printing time for every message (print_time==sometimes), print it " +"every x minutes." +msgstr "" +"Ako se ne ispisuje vreme za svaku poruku (print_time==ponekad), ispisati ga " +"svakih x minuta" + +#: ../src/common/config.py:161 +msgid "Ask before closing a group chat tab/window." +msgstr "Pitaj pre zatvaranja prozora/jezička grupnog razgovora." + +#: ../src/common/config.py:162 +msgid "" +"Always ask before closing group chat tab/window in this space separated list " +"of group chat jids." +msgstr "" +"Uvek pitaj pre zatvaranja jezička/prozora kada je u pitanju ova lista " +"odvojena blanko karakterima džaber ID-ova grupnih razgovora." + +#: ../src/common/config.py:163 +msgid "" +"Never ask before closing group chat tab/window in this space separated list " +"of group chat jids." +msgstr "" +"Nikad ne pitaj pre zatvaranja jezička/prozora grupnog razgovora kada je u " +"pitanju ova listaodovojena blanko znacima džaber ID-ova grupnih razgovora." + +#: ../src/common/config.py:166 +#, fuzzy +msgid "" +"Comma separated list of hosts that we send, in addition of local interfaces, " +"for File Transfer in case of address translation/port forwarding." +msgstr "" +"Prepisuje ime hosta koji šaljem za prenos datoteka u slučaju prosleđivanja " +"porta/NATovanja." + +#: ../src/common/config.py:168 +msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." +msgstr "IEC standard definiše KiB = 1024 bajtova, KB = 1000 bajtova" + +#: ../src/common/config.py:170 +msgid "Notify of events in the system trayicon." +msgstr "Obavesti me o svim događajima u ikoni sistemske kasete." + +#: ../src/common/config.py:176 +msgid "Show tab when only one conversation?" +msgstr "Prikaži jezičak iako je samo jedan razgovor?" + +#: ../src/common/config.py:177 +msgid "Show tabbed notebook border in chat windows?" +msgstr "Prikaši granicu sveske u prozorima razgovora?" + +#: ../src/common/config.py:178 +msgid "Show close button in tab?" +msgstr "Prikaši dugme za zatvaranje u jezičku?" + +#: ../src/common/config.py:179 +msgid "" +"When negotiating an encrypted session, should Gajim assume you want your " +"messages to be logged?" +msgstr "" + +#: ../src/common/config.py:188 +msgid "Preview new messages in notification popup?" +msgstr "" + +#: ../src/common/config.py:193 +msgid "" +"A semicolon-separated list of words that will be highlighted in group chats." +msgstr "" +"Lista reči odvojena blanko karakterima koje će biti obojene u grupnim " +"razgovorima" + +#: ../src/common/config.py:194 +msgid "" +"If True, quits Gajim when X button of Window Manager is clicked. This " +"setting is taken into account only if trayicon is used." +msgstr "" +"Ako je istinito, Gajim se završava kada se pritisne X dugme. Ovo podešavanje " +"se koristi samo ako je ikona sistemske kasete u upotrebi." + +#: ../src/common/config.py:195 +msgid "" +"If True, Gajim will check if it's the default jabber client on each startup." +msgstr "" +"Ako je istinito, Gajim će provaravati da li je podrazumevani Džaber klijent " +"pri svakom pokretanju." + +#: ../src/common/config.py:196 +msgid "" +"If True, Gajim will display an icon on each tab containing unread messages. " +"Depending on the theme, this icon may be animated." +msgstr "" +"Ako je istinito, Gajim će prikazivati ikonu na svakom jezičku koji sadrži " +"nepročitane poruke. U zavisnosti od teme, ikona može biti i animirana." + +#: ../src/common/config.py:197 +msgid "" +"If True, Gajim will display the status message, if not empty, for every " +"contact under the contact name in roster window." +msgstr "" +"Ako je istinito, Gajim će prikazivati statusnu poruku (ako nije prazna) za " +"svaki kontakt u listi kontakata" + +#: ../src/common/config.py:199 +msgid "" +"If True, Gajim will ask for avatar each contact that did not have an avatar " +"last time or has one cached that is too old." +msgstr "" +"Ako je istinito, Gajim će poslati upit za avatar za svaki kontakt koji " +"prošlog puta nije imao avatar ili je onaj u memoriji prestar" + +#: ../src/common/config.py:200 +msgid "" +"If False, Gajim will no longer print status line in chats when a contact " +"changes his or her status and/or his or her status message." +msgstr "" +"Ako je neistinito, više nećete videti statusnu porukuu razgovorima kada " +"kontakt promeni svoj status i/ili statusnu poruku." + +#: ../src/common/config.py:201 +msgid "" +"can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " +"longer print status line in groupchats when a member changes his or her " +"status and/or his or her status message. If \"all\" Gajim will print all " +"status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " +"group chat." +msgstr "" +"može biti \"none\", \"all\" ili \"in_and_out\". Ako je \"none\", Gajim više " +"neće ispisivati statusnu liniju u grupnim razgovorima kada član promeni svoj " +"status i/ili izmeni statusnu poruku. Ako je \"all\", Gajim će prikazivati " +"sve statusne poruke. Ako je \"in_and_out\" Gajim će prikazivati samo poruke " +"tipa taj i taj je ušao/izašao u/iz sobe." + +#: ../src/common/config.py:203 +msgid "Background color of contacts when they just signed in." +msgstr "Boja pozadine kontakta kada tek dođu na vezu." + +#: ../src/common/config.py:204 +msgid "Background color of contacts when they just signed out." +msgstr "Boja pozadine kontakta kada tek odu sa veze." + +#: ../src/common/config.py:206 +msgid "" +"If True, restored messages will use a smaller font than the default one." +msgstr "" +"Ako je istinito, vraćene poruke iz istorijata će biti manjeg fonta od " +"podrazumevanog." + +#: ../src/common/config.py:207 +msgid "Don't show avatar for the transport itself." +msgstr "Ne prikazuj avatar za sam transport." + +#: ../src/common/config.py:208 +msgid "Don't show roster in the system taskbar." +msgstr "Ne prikazuj listu kontakata u sistemskoj kaseti." + +#: ../src/common/config.py:209 +msgid "" +"If True and installed GTK+ and PyGTK versions are at least 2.8, make the " +"window flash (the default behaviour in most Window Managers) when holding " +"pending events." +msgstr "" +"Ako je istinito, i instalirane verzije GTK+ i PyGTK su barem 2.8, neka " +"prozor bljeska (podrazumevano ponašanje u većini menadžera prozora) pri " +"novim događajima." + +#: ../src/common/config.py:211 +msgid "" +"Jabberd1.4 does not like sha info when one join a password protected group " +"chat. Turn this option to False to stop sending sha info in group chat " +"presences." +msgstr "" +"Jabberd1.4 ne voli sha informacije kada neko uđe u grupni razgovor koji je " +"zaštićen lozinkom. Isključite ovu opciju da prestanete slati sha informacije " +"u grupnim razgovorima" + +#. always, never, peracct, pertype should not be translated +#: ../src/common/config.py:214 +msgid "" +"Controls the window where new messages are placed.\n" +"'always' - All messages are sent to a single window.\n" +"'never' - All messages get their own window.\n" +"'peracct' - Messages for each account are sent to a specific window.\n" +"'pertype' - Each message type (e.g., chats vs. groupchats) are sent to a " +"specific window. Note, changing this option requires restarting Gajim before " +"the changes will take effect." +msgstr "" +"Kontroliše prozor gde se smeštaju nove poruke.\n" +"'uvek' - Sve poruke se šalju u isti prozor.\n" +"'nikad' - Svaka poruka dobija svoj prozor.\n" +"'ponalogu' - Poruke za isti nalog se šalju i isti prozor.\n" +"'potipu' - Poruke istog tipa (npr., razgovori i grupni razgovori) se šalju u " +"isti prozor. Promena ove opcije zahteva da ponovo pokrenete Gajim kako bi " +"promene stupile na snagu." + +#: ../src/common/config.py:215 +msgid "If False, you will no longer see the avatar in the chat window." +msgstr "Ako nije istinito, nećete više videti avatar u prozoru razgovora." + +#: ../src/common/config.py:216 +msgid "If True, pressing the escape key closes a tab/window." +msgstr "Ako je istinito, pritisak na taster 'esc' zatvara jezičak/prozor." + +#: ../src/common/config.py:217 +#, fuzzy +msgid "Hides the buttons in chat windows." +msgstr "Sakriva dugmad u prozoru grupnog razgovora." + +#: ../src/common/config.py:218 +msgid "Hides the banner in a group chat window" +msgstr "Sakriva baner u prozoru grupnog razgovora." + +#: ../src/common/config.py:219 +msgid "Hides the banner in two persons chat window" +msgstr "Sakriva baner u prozoru razgovora dve osobe" + +#: ../src/common/config.py:220 +msgid "Hides the group chat occupants list in group chat window." +msgstr "Sakriva listu učesnika u prozoru grupnog razgovora" + +#: ../src/common/config.py:221 +msgid "" +"In a chat, show the nickname at the beginning of a line only when it's not " +"the same person talking than in previous message." +msgstr "" +"U razgovoru, prikaži nadimak na početku novog reda samo kada se ne radi o " +"istoj osobi koja je pričala i u prošloj poruci." + +#: ../src/common/config.py:222 +msgid "Indentation when using merge consecutive nickname." +msgstr "Uvlačenje pri korišćenju spajanja toka po nadimcima." + +#: ../src/common/config.py:223 +#, fuzzy +msgid "Smooth scroll message in conversation window" +msgstr "Pošalji poruku i zatvori prozor" + +#: ../src/common/config.py:224 +msgid "List of colors that will be used to color nicknames in group chats." +msgstr "" +"Lista boja koje će biti korišćene za bojenje nadimaka u grupnim razgovorima." + +#: ../src/common/config.py:225 +msgid "Ctrl-Tab go to next composing tab when none is unread." +msgstr "Ctrl-Tab ide na sledeći jezičak kada nema nepročitanih jezičaka" + +#: ../src/common/config.py:226 +msgid "" +"Should we show the confirm metacontacts creation dialog or not? Empty string " +"means we never show the dialog." +msgstr "" +"Treba li pitati za potvrdu stvaranja pseudokontakta ili ne? Prazan niz znači " +"da nikada ne prikazujemo upit." + +#: ../src/common/config.py:227 +msgid "" +"If True, you will be able to set a negative priority to your account in " +"account modification window. BE CAREFUL, when you are logged in with a " +"negative priority, you will NOT receive any message from your server." +msgstr "" +"Ako je istinito, bićete u mogućnosti postaviti negativan prioritet na Vaš " +"nalog u prozoru za izmenu podešavanja naloga. BUDITE OPREZNI, kada ste " +"povezani sa negativnim prioritetom NEĆETE primati nikakve poruke od servera." + +#: ../src/common/config.py:228 +msgid "" +"If True, Gajim will use Gnome Keyring (if available) to store account " +"passwords." +msgstr "" +"Ako je istinito, Gajim će koristiti Gnomov Keyring (ako je dostupan) za " +"skladištenje lozinki naloga." + +#: ../src/common/config.py:229 +msgid "" +"If True, Gajim will show number of online and total contacts in account and " +"group rows." +msgstr "" +"Ako je istinito, Gajim će prikazivati ukupan i broj kontakata na vezi u " +"nalogu i u grupnim redovima." + +#: ../src/common/config.py:230 +msgid "" +"Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " +"as if they were of this type" +msgstr "" +"Može biti prazno, 'chat' ili 'normal'. Ako je prazno, tretiraj sve dolazne " +"poruke kao da su ovog tipa" + +#: ../src/common/config.py:231 +msgid "" +"If True, Gajim will scroll and select the contact who sent you the last " +"message, if chat window is not already opened." +msgstr "" + +#: ../src/common/config.py:232 +msgid "" +"If True, Gajim will convert string between $$ and $$ to an image using dvips " +"and convert before insterting it in chat window." +msgstr "" + +#: ../src/common/config.py:233 +msgid "Time of inactivity needed before the change status window closes down." +msgstr "" + +#: ../src/common/config.py:234 +msgid "" +"Maximum number of lines that are printed in conversations. Oldest lines are " +"cleared." +msgstr "" + +#: ../src/common/config.py:245 +msgid "" +"Priority will change automatically according to your status. Priorities are " +"defined in autopriority_* options." +msgstr "" +"Prioritet će se automatski promeniti u zavisnosti od Vašeg statusa. " +"Prioriteti su definsani u autopriority_* podešavanjima." + +#. yes, no, ask +#: ../src/common/config.py:275 +msgid "Jabberd2 workaround" +msgstr "Jabberd2 privremeno rešenje" + +#: ../src/common/config.py:279 +msgid "" +"If checked, Gajim will use your IP and proxies defined in " +"file_transfer_proxies option for file transfer." +msgstr "" +"Ako je označeno, Gajim će koristiti Vašu IP adresu u proksi koji je " +"difinisan u file_transfer_proxies podešavanjima za prenos." + +#: ../src/common/config.py:338 +msgid "Is OpenPGP enabled for this contact?" +msgstr "Da li je OpenPGP omogućen za ovaj kontakt?" + +#: ../src/common/config.py:339 ../src/common/config.py:342 +msgid "Language for which we want to check misspelled words" +msgstr "Jezik u kome želite proveravati neispravno napisane reči" + +#: ../src/common/config.py:348 +msgid "all or space separated status" +msgstr "sve ili razmakom odvojen status" + +#: ../src/common/config.py:349 +msgid "'yes', 'no', or 'both'" +msgstr "'da', 'ne', ili 'oboje'" + +#: ../src/common/config.py:350 ../src/common/config.py:352 +#: ../src/common/config.py:353 ../src/common/config.py:356 +#: ../src/common/config.py:357 +msgid "'yes', 'no' or ''" +msgstr "'da', 'ne' ili ''" + +#: ../src/common/config.py:363 +msgid "Sleeping" +msgstr "Spavam" + +#: ../src/common/config.py:364 +msgid "Back soon" +msgstr "Vraćam se brzo" + +#: ../src/common/config.py:364 +msgid "Back in some minutes." +msgstr "Vraćam se za par minuta." + +#: ../src/common/config.py:365 +msgid "Eating" +msgstr "Jedem" + +#: ../src/common/config.py:365 +msgid "I'm eating, so leave me a message." +msgstr "Jedem, ostavite poruku." + +#: ../src/common/config.py:366 +msgid "Movie" +msgstr "Film" + +#: ../src/common/config.py:366 +msgid "I'm watching a movie." +msgstr "Gledam film." + +#: ../src/common/config.py:367 +msgid "Working" +msgstr "Radim." + +#: ../src/common/config.py:367 +msgid "I'm working." +msgstr "Radim." + +#: ../src/common/config.py:368 +msgid "Phone" +msgstr "Telefon" + +#: ../src/common/config.py:368 +msgid "I'm on the phone." +msgstr "Telefoniram." + +#: ../src/common/config.py:369 +msgid "Out" +msgstr "Napolju" + +#: ../src/common/config.py:369 +msgid "I'm out enjoying life." +msgstr "Napolju sam, uživam u životu." + +#: ../src/common/config.py:373 +msgid "I'm available." +msgstr "Dostupan sam." + +#: ../src/common/config.py:374 +msgid "I'm free for chat." +msgstr "Slobodan sam za razgovor." + +#: ../src/common/config.py:376 +msgid "I'm not available." +msgstr "Nedostupan sam." + +#: ../src/common/config.py:377 +msgid "Do not disturb." +msgstr "Ne smetaj." + +#: ../src/common/config.py:378 ../src/common/config.py:379 +msgid "Bye!" +msgstr "Pozdrav!" + +#: ../src/common/config.py:388 +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 "" +"Zvuk koji će se pustiti kada poruka grupnog razgovora sadrži neku reč iz " +"muc_highlight_words, ili kada neka poruka grupnog razgovora sadrži Vaš " +"nadimak." + +#: ../src/common/config.py:389 +msgid "Sound to play when any MUC message arrives." +msgstr "Zvuk koji će se pustiti kada stigne neka MUC poruka." + +#: ../src/common/config.py:398 ../src/common/optparser.py:208 +msgid "green" +msgstr "zelena" + +#: ../src/common/config.py:402 ../src/common/optparser.py:194 +msgid "grocery" +msgstr "namirnice" + +#: ../src/common/config.py:406 +msgid "human" +msgstr "ljudska" + +#: ../src/common/config.py:410 +msgid "marine" +msgstr "morska" + +#: ../src/common/connection_handlers.py:56 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:44 +msgid "Unable to load idle module" +msgstr "Nije moguće učitavanje modula idle" + +#: ../src/common/connection_handlers.py:184 +#: ../src/common/connection_handlers.py:219 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 +msgid "Wrong host" +msgstr "Loš host" + +#: ../src/common/connection_handlers.py:184 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:236 +#, 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 koji ste postavili kao ft_override_host_to_send napredno podešavanje " +"nije ispravan. pa je ignorisan." + +#: ../src/common/connection_handlers.py:220 +msgid "Invalid local address? :-O" +msgstr "" + +#: ../src/common/connection_handlers.py:612 +#, python-format +msgid "Registration information for transport %s has not arrived in time" +msgstr "Informacije o registraciji za transport %s nisu došle na vreme" + +#: ../src/common/connection_handlers.py:1776 +#, python-format +msgid "Nickname not allowed: %s" +msgstr "Nedozvoljen nadimak: %s " + +#. we are banned +#. group chat does not exist +#: ../src/common/connection_handlers.py:1846 +#: ../src/common/connection_handlers.py:1849 +#: ../src/common/connection_handlers.py:1852 +#: ../src/common/connection_handlers.py:1855 +#: ../src/common/connection_handlers.py:1859 +#: ../src/common/connection_handlers.py:1868 +msgid "Unable to join group chat" +msgstr "Nije moguće pridružiti se grupnom razgovoru" + +#: ../src/common/connection_handlers.py:1847 +#, fuzzy, python-format +msgid "You are banned from group chat %s." +msgstr "Zabranjen Vam je pristup ovom grupnom razgovoru." + +#: ../src/common/connection_handlers.py:1850 +#, fuzzy, python-format +msgid "Group chat %s does not exist." +msgstr "Ne postoji ovakav grupni razgovor." + +#: ../src/common/connection_handlers.py:1853 +msgid "Group chat creation is restricted." +msgstr "Stvaranje grupnih razgovora Vam nije dozvoljeno." + +#: ../src/common/connection_handlers.py:1856 +#, fuzzy, python-format +msgid "Your registered nickname must be used in group chat %s." +msgstr "Morate koristiti Vaš registrovani nadimak." + +#: ../src/common/connection_handlers.py:1860 +#, fuzzy, python-format +msgid "You are not in the members list in groupchat %s." +msgstr "Niste u listi članova." + +#: ../src/common/connection_handlers.py:1869 +#, 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 "" +"Vaš željeni nadimak je trenutno u upotrebi ili je registrovan od strane " +"nekog od učesnika.\n" +"Molimo odredite drugi nadimak ispod:" + +#. Room has been destroyed. see +#. http://www.xmpp.org/extensions/xep-0045.html#destroyroom +#: ../src/common/connection_handlers.py:1900 +#, fuzzy +msgid "Room has been destroyed" +msgstr "Autorizacija uklonjena" + +#: ../src/common/connection_handlers.py:1907 +#, python-format +msgid "You can join this room instead: %s" +msgstr "" + +#: ../src/common/connection_handlers.py:1934 +msgid "I would like to add you to my roster." +msgstr "Želeo bih da te dodam na moju listu kontakata." + +#. BE CAREFUL: no con.updateRosterItem() in a callback +#: ../src/common/connection_handlers.py:1955 +#, python-format +msgid "we are now subscribed to %s" +msgstr "sada ste pretplaćeni na %s" + +#: ../src/common/connection_handlers.py:1957 +#, python-format +msgid "unsubscribe request from %s" +msgstr "zahtev za ukidanje pretplate od kontakta %s" + +#: ../src/common/connection_handlers.py:1959 +#, python-format +msgid "we are now unsubscribed from %s" +msgstr "sada Vam je ukinuta pretplata od kontakta %s" + +#: ../src/common/connection_handlers.py:2081 +#, python-format +msgid "" +"JID %s is not RFC compliant. It will not be added to your roster. Use roster " +"management tools such as http://jru.jabberstudio.org/ to remove it" +msgstr "" +"Džaber ID %s ne poštuje RFC pravila. Neće biti dodat na Vašu listu " +"kontakata. Upotrebite alate kao što je http://jru.jabberstudio.org/ da biste " +"ga uklonili" + +#: ../src/common/connection.py:244 +#: ../src/common/zeroconf/connection_zeroconf.py:203 +#, python-format +msgid "Connection with account \"%s\" has been lost" +msgstr "Izgubljena veza sa računom \"%s\"" + +#: ../src/common/connection.py:245 +msgid "Reconnect manually." +msgstr "Ponovo se povežite ručno." + +#: ../src/common/connection.py:256 +#, fuzzy, python-format +msgid "Server %s answered wrongly to register request: %s" +msgstr "Transport %s je loše odgovorio na registraciju: %s" + +#. wrong answer +#: ../src/common/connection.py:264 +msgid "Invalid answer" +msgstr "Neispravan odgovor" + +#: ../src/common/connection.py:265 +#, python-format +msgid "Transport %s answered wrongly to register request: %s" +msgstr "Transport %s je loše odgovorio na registraciju: %s" + +#: ../src/common/connection.py:411 +#, fuzzy +msgid "Connection to proxy failed" +msgstr "Veza prekinuta" + +#: ../src/common/connection.py:465 ../src/common/connection.py:511 +#: ../src/common/connection.py:1067 +#: ../src/common/zeroconf/connection_zeroconf.py:237 +#, python-format +msgid "Could not connect to \"%s\"" +msgstr "Veza sa \"%s\" nije moguća" + +#: ../src/common/connection.py:479 +#, python-format +msgid "Connected to server %s:%s with %s" +msgstr "Povezan na server %s:%s sa %s" + +#: ../src/common/connection.py:512 +msgid "Check your connection or try again later" +msgstr "Proverite Vašu konekciju ili pokušajte kasnije" + +#: ../src/common/connection.py:537 +#, python-format +msgid "Authentication failed with \"%s\"" +msgstr "Autentikacija sa \"%s\" neuspešna" + +#: ../src/common/connection.py:538 +msgid "Please check your login and password for correctness." +msgstr "Molimo Vas da proverite Vaše korisničko ime i lozinku od grešaka." + +#: ../src/common/connection.py:581 +msgid "Error while removing privacy list" +msgstr "Greška prilikom uklanjanja liste privatnosti" + +#: ../src/common/connection.py:582 +#, 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 "" +"Lista privatnosti %s je uklonjena. Možda je aktivna u nekom od Vaših " +"povezanih resursa. Deaktivirajte je i pokušajte ponovo." + +#. We didn't set a passphrase +#: ../src/common/connection.py:682 +#: ../src/common/zeroconf/connection_zeroconf.py:163 +msgid "OpenPGP passphrase was not given" +msgstr "Lozinka za OpenPGP nije uneta" + +#. we're not english +#. one in locale and one en +#: ../src/common/connection.py:845 +msgid "[This message is *encrypted* (See :JEP:`27`]" +msgstr "[Ova poruka je *šifrovana* (Pogledajte :JEP:`27`]" + +#: ../src/common/connection.py:916 +#: ../src/common/zeroconf/connection_zeroconf.py:423 +#, python-format +msgid "" +"Subject: %s\n" +"%s" +msgstr "" +"Tema: %s\n" +"%s" + +#: ../src/common/connection.py:1099 +msgid "Not fetched because of invisible status" +msgstr "Nije dohvaćeno zbog statusa nevidljivosti" + +#: ../src/common/contacts.py:294 +msgid "Not in roster" +msgstr "Nije na listi kontakata" + +#. only say that to non Windows users +#: ../src/common/dbus_support.py:33 +msgid "D-Bus python bindings are missing in this computer" +msgstr "Na ovom računaru nedostaju python vezivanja za D-Bus" + +#: ../src/common/dbus_support.py:34 +msgid "D-Bus capabilities of Gajim cannot be used" +msgstr "D-Bus mogućnosti Gajima se ne mogu koristiti" + +#: ../src/common/exceptions.py:22 +msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." +msgstr "pysqlite2 (poznat kao python-pysqlite2) nedostaje. Izlazim..." + +#: ../src/common/exceptions.py:39 +msgid "Service not available: Gajim is not running, or remote_control is False" +msgstr "" +"Servis nije dostupan: Gajim nije pokrenut ili je stavka podešavanja " +"remote_control neistinita" + +#: ../src/common/exceptions.py:47 +msgid "D-Bus is not present on this machine or python module is missing" +msgstr "D-Bus ne postoji na ovom računaru ili nema python modula." + +#: ../src/common/exceptions.py:55 +msgid "" +"Session bus is not available.\n" +"Try reading http://trac.gajim.org/wiki/GajimDBus" +msgstr "" +"Linija sesije nije dostupna.\n" +"Pročitajte http:/trac.gajim.org/wiki/GajimDBus" + +#: ../src/common/fuzzyclock.py:42 +msgid "one" +msgstr "jedan" + +#: ../src/common/fuzzyclock.py:42 +msgid "two" +msgstr "dva" + +#: ../src/common/fuzzyclock.py:42 +msgid "three" +msgstr "tri" + +#: ../src/common/fuzzyclock.py:42 +msgid "four" +msgstr "četiri" + +#: ../src/common/fuzzyclock.py:42 +msgid "five" +msgstr "pet" + +#: ../src/common/fuzzyclock.py:42 +msgid "six" +msgstr "šest" + +#: ../src/common/fuzzyclock.py:43 +msgid "seven" +msgstr "sedam" + +#: ../src/common/fuzzyclock.py:43 +msgid "eight" +msgstr "osam" + +#: ../src/common/fuzzyclock.py:43 +msgid "nine" +msgstr "devet" + +#: ../src/common/fuzzyclock.py:43 +msgid "ten" +msgstr "deset" + +#: ../src/common/fuzzyclock.py:43 +msgid "eleven" +msgstr "jedanaest" + +#: ../src/common/fuzzyclock.py:44 +msgid "twelve" +msgstr "dvanaest" + +#. Strings to use for the output. %0 will be replaced with the preceding hour (e.g. "x PAST %0"), %1 with the coming hour (e.g. "x TO %1). ''' +#. A "singular-form". It is used when talking about hour 0 +#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 +msgid "$0 o'clock" +msgstr "$0 sati" + +#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 +msgid "five past $0" +msgstr "$0 i pet" + +#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 +msgid "ten past $0" +msgstr "$0 i deset" + +#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 +msgid "quarter past $0" +msgstr "$0 i petnaest" + +#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 +msgid "twenty past $0" +msgstr "$0 i dvadeset" + +#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 +msgid "twenty five past $0" +msgstr "$0 i dvadeset i pet" + +#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 +msgid "half past $0" +msgstr "$0 i trideset minuta" + +#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 +msgid "twenty five to $1" +msgstr "dvadeset i pet do $1" + +#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 +msgid "twenty to $1" +msgstr "dvadeset do $1" + +#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 +msgid "quarter to $1" +msgstr "petnaest minuta do $1" + +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +msgid "ten to $1" +msgstr "deset do $1" + +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +msgid "five to $1" +msgstr "pet do $1" + +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:61 +msgid "$1 o'clock" +msgstr "$1 sati" + +#: ../src/common/fuzzyclock.py:64 +msgid "Night" +msgstr "Noć" + +#: ../src/common/fuzzyclock.py:64 +msgid "Early morning" +msgstr "Rano jutro" + +#: ../src/common/fuzzyclock.py:64 +msgid "Morning" +msgstr "Jutro" + +#: ../src/common/fuzzyclock.py:64 +msgid "Almost noon" +msgstr "Skoro podne" + +#: ../src/common/fuzzyclock.py:65 +msgid "Noon" +msgstr "Podne" + +#: ../src/common/fuzzyclock.py:65 +msgid "Afternoon" +msgstr "Poslepodne" + +#: ../src/common/fuzzyclock.py:65 +msgid "Evening" +msgstr "Veče" + +#: ../src/common/fuzzyclock.py:65 +msgid "Late evening" +msgstr "Kasno veče" + +#: ../src/common/fuzzyclock.py:67 +msgid "Start of week" +msgstr "Početak nedelje" + +#: ../src/common/fuzzyclock.py:67 +msgid "Middle of week" +msgstr "Sredina nedelje" + +#: ../src/common/fuzzyclock.py:67 +msgid "End of week" +msgstr "Kraj nedelje" + +#: ../src/common/fuzzyclock.py:68 +msgid "Weekend!" +msgstr "Vikend!" + +#: ../src/common/helpers.py:115 +msgid "Invalid character in username." +msgstr "Neispravan karakter u korisničkom imenu." + +#: ../src/common/helpers.py:120 +msgid "Server address required." +msgstr "Potrebna je adresa servera." + +#: ../src/common/helpers.py:125 +msgid "Invalid character in hostname." +msgstr "Neispravan karakter u imenu hosta." + +#: ../src/common/helpers.py:131 +msgid "Invalid character in resource." +msgstr "Neispravan karakter u resursu." + +#. GiB means gibibyte +#: ../src/common/helpers.py:171 +#, python-format +msgid "%s GiB" +msgstr "%s GiB" + +#. GB means gigabyte +#: ../src/common/helpers.py:174 +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#. MiB means mibibyte +#: ../src/common/helpers.py:178 +#, python-format +msgid "%s MiB" +msgstr "%s MiB" + +#. MB means megabyte +#: ../src/common/helpers.py:181 +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#. KiB means kibibyte +#: ../src/common/helpers.py:185 +#, python-format +msgid "%s KiB" +msgstr "%s KiB" + +#. KB means kilo bytes +#: ../src/common/helpers.py:188 +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#. B means bytes +#: ../src/common/helpers.py:191 +#, python-format +msgid "%s B" +msgstr "%s B" + +#: ../src/common/helpers.py:222 +msgid "_Busy" +msgstr "_Zauzet" + +#: ../src/common/helpers.py:224 +msgid "Busy" +msgstr "Zauzet" + +#: ../src/common/helpers.py:227 +msgid "_Not Available" +msgstr "_Nedostupan" + +#: ../src/common/helpers.py:232 +msgid "_Free for Chat" +msgstr "_Slobodan za razgovor" + +#: ../src/common/helpers.py:234 +msgid "Free for Chat" +msgstr "Slobodan za razgovor" + +#: ../src/common/helpers.py:237 +msgid "_Available" +msgstr "_Dostupan" + +#: ../src/common/helpers.py:239 +msgid "Available" +msgstr "Dostupan" + +#: ../src/common/helpers.py:241 +msgid "Connecting" +msgstr "Povezivanje" + +#: ../src/common/helpers.py:244 +msgid "A_way" +msgstr "O_dsutan" + +#: ../src/common/helpers.py:249 +msgid "_Offline" +msgstr "_Nije na vezi" + +#: ../src/common/helpers.py:251 +msgid "Offline" +msgstr "Nije na vezi" + +#: ../src/common/helpers.py:254 +msgid "_Invisible" +msgstr "_Nevidljiv" + +#: ../src/common/helpers.py:260 +msgid "?contact has status:Unknown" +msgstr "?kontakt ima status:Nepoznat" + +#: ../src/common/helpers.py:262 +msgid "?contact has status:Has errors" +msgstr "?kontakt ima status:Postoje greške" + +#: ../src/common/helpers.py:267 +msgid "?Subscription we already have:None" +msgstr "?Trenutna pretplata:Nijedna" + +#: ../src/common/helpers.py:269 +msgid "To" +msgstr "Za" + +#: ../src/common/helpers.py:273 +msgid "Both" +msgstr "Oboje" + +#: ../src/common/helpers.py:281 +msgid "?Ask (for Subscription):None" +msgstr "?Pitaj (za pretplatu):Nijedna" + +#: ../src/common/helpers.py:283 +msgid "Subscribe" +msgstr "Pretplatite se" + +#: ../src/common/helpers.py:292 +msgid "?Group Chat Contact Role:None" +msgstr "?Uloga kontakta u grupnom razgovoru:Nikakva" + +#: ../src/common/helpers.py:295 +msgid "Moderators" +msgstr "Moderatori" + +#: ../src/common/helpers.py:297 +msgid "Moderator" +msgstr "Moderator" + +#: ../src/common/helpers.py:300 +msgid "Participants" +msgstr "Učesnici" + +#: ../src/common/helpers.py:302 +msgid "Participant" +msgstr "Učesnik" + +#: ../src/common/helpers.py:305 +msgid "Visitors" +msgstr "Posjetitelji" + +#: ../src/common/helpers.py:307 +msgid "Visitor" +msgstr "Posetilac" + +#: ../src/common/helpers.py:313 +msgid "?Group Chat Contact Affiliation:None" +msgstr "?Vezanost kontakta u grupnom razogovru:Nikakva" + +#: ../src/common/helpers.py:315 +msgid "Owner" +msgstr "Vlasnik" + +#: ../src/common/helpers.py:317 +msgid "Administrator" +msgstr "Administrator" + +#: ../src/common/helpers.py:319 +msgid "Member" +msgstr "Član" + +#: ../src/common/helpers.py:358 +msgid "is paying attention to the conversation" +msgstr "sluša konverzaciju" + +#: ../src/common/helpers.py:360 +msgid "is doing something else" +msgstr "radi nešto drugo" + +#: ../src/common/helpers.py:362 +msgid "is composing a message..." +msgstr "piše poruku..." + +#. paused means he or she was composing but has stopped for a while +#: ../src/common/helpers.py:365 +msgid "paused composing a message" +msgstr "pauza pri pisanju poruke" + +#: ../src/common/helpers.py:367 +msgid "has closed the chat window or tab" +msgstr "je zatvorio/zatvorila prozor ili jezičak razgovora" + +#: ../src/common/helpers.py:913 ../src/common/helpers.py:920 +#, fuzzy, python-format +msgid "%d message pending" +msgid_plural "%d messages pending" +msgstr[0] "Pošalji poruku" +msgstr[1] "Pošalji poruku" +msgstr[2] "Pošalji poruku" + +#: ../src/common/helpers.py:926 +#, python-format +msgid " from room %s" +msgstr "" + +#: ../src/common/helpers.py:929 ../src/common/helpers.py:948 +#, python-format +msgid " from user %s" +msgstr "" + +#: ../src/common/helpers.py:931 +#, python-format +msgid " from %s" +msgstr "" + +#: ../src/common/helpers.py:938 ../src/common/helpers.py:945 +#, python-format +msgid "%d event pending" +msgid_plural "%d events pending" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + +#: ../src/common/helpers.py:978 +#, python-format +msgid "Gajim - %s" +msgstr "Gajim - %s" + +#. we talk about a file +#: ../src/common/optparser.py:60 +#, python-format +msgid "error: cannot open %s for reading" +msgstr "greška: ne mogu otvoriti %s za čitanje" + +#: ../src/common/optparser.py:203 ../src/common/optparser.py:204 +msgid "cyan" +msgstr "cijan" + +#: ../src/common/optparser.py:320 +msgid "migrating logs database to indices" +msgstr "prebacujem bazu dnevnika u indekse" + +#: ../src/common/passwords.py:82 +#, python-format +msgid "Gajim account %s" +msgstr "Gajim nalog %s" + +#: ../src/common/zeroconf/client_zeroconf.py:135 +#: ../src/common/zeroconf/client_zeroconf.py:218 +msgid "Connection to host could not be established" +msgstr "Nije moguće ostvariti vezu sa hostom" + +#: ../src/common/zeroconf/client_zeroconf.py:192 +msgid "" +"Connection to host could not be established: Incorrect answer from server." +msgstr "Nije moguće ostvariti vezu sa hostom: Neispravan odgovor servera." + +#: ../src/common/zeroconf/client_zeroconf.py:352 +msgid "" +"Connection to host could not be established: Timeout while sending data." +msgstr "" +"Nije moguće ostvariti vezu sa hostom: Vreme za slanje podataka je isteklo." + +#: ../src/common/zeroconf/client_zeroconf.py:638 +msgid "Contact is offline. Your message could not be sent." +msgstr "Kontakt nije na vezi. Vašu poruku nije moguće poslati." + +#: ../src/common/zeroconf/connection_zeroconf.py:204 +msgid "To continue sending and receiving messages, you will need to reconnect." +msgstr "" +"Ako želite nastaviti sa slanjem i primanjem poruka, morate se isključiti i " +"ponovo doći na vezu." + +#: ../src/common/zeroconf/connection_zeroconf.py:227 +msgid "Avahi error" +msgstr "Avahi greška" + +#: ../src/common/zeroconf/connection_zeroconf.py:227 +#, python-format +msgid "" +"%s\n" +"Link-local messaging might not work properly." +msgstr "" +"%s\n" +"Poruke lokalne mreže možda neće raditi kako treba." + +#: ../src/common/zeroconf/connection_zeroconf.py:238 +msgid "Please check if Avahi is installed." +msgstr "Proverite da li je Avahi instaliran." + +#: ../src/common/zeroconf/connection_zeroconf.py:247 +#: ../src/common/zeroconf/connection_zeroconf.py:251 +msgid "Could not start local service" +msgstr "Nije moguće pokrenuti lokalni servis" + +#: ../src/common/zeroconf/connection_zeroconf.py:248 +#, python-format +msgid "Unable to bind to port %d." +msgstr "Ne mogu se povezati na port %d." + +#: ../src/common/zeroconf/connection_zeroconf.py:252 +#: ../src/common/zeroconf/connection_zeroconf.py:347 +msgid "Please check if avahi-daemon is running." +msgstr "Molimo proverite da li je avahi-demon pokrenut." + +#: ../src/common/zeroconf/connection_zeroconf.py:346 +#, python-format +msgid "Could not change status of account \"%s\"" +msgstr "Nije moguće promeniti status računa \"%s\"" + +#: ../src/common/zeroconf/connection_zeroconf.py:363 +msgid "" +"You are not connected or not visible to others. Your message could not be " +"sent." +msgstr "" +"Niste spojeni ili ste nevidljivi za druge. Vaša poruka ne može biti poslata." + +#. we're not english +#: ../src/common/zeroconf/connection_zeroconf.py:375 +msgid "[This message is encrypted]" +msgstr "[Ova poruka je šifrovana]" + +#~ msgid "_Discover Services..." +#~ msgstr "_Otkrivanje usluga..." + +#~ msgid "_Retype Password:" +#~ msgstr "_Ponovo ukucajte lozinku:" + +#~ msgid "_Use proxy" +#~ msgstr "_Koristi proksi" + +#~ msgid "Accounts" +#~ msgstr "Nalozi" + +#~ msgid "" +#~ "If checked, all local contacts that use a Bonjour compatible chat client " +#~ "(like iChat, Trillian or Gaim) will be shown in roster. You don't need to " +#~ "be connected to a jabber server for it to work.\n" +#~ "This is only available if python-avahi is installed and avahi-daemon is " +#~ "running." +#~ msgstr "" +#~ "Ako je označeno, svi lokalni kontakti koji koriste Bonjour kompatibilni " +#~ "klijent za razgovor (kao iChat, Trillian ili Gaim) će biti prikazani na " +#~ "listi kontakata. Ne morate biti spojeni na džaber server kako bi ovo " +#~ "radilo.\n" +#~ "Ovo je dostupno samo ako je instaliran python-avahi i avahi-demon je " +#~ "pokrenut." + +#~ msgid "" +#~ "If you have 2 or more accounts and this is checked, Gajim will list all " +#~ "contacts as if you had one account" +#~ msgstr "" +#~ "Ako imate 2 ili više naloga i ovo je označeno, Gajim će prikazivati sve " +#~ "kontakte kao da imate jedan nalog" + +#~ msgid "_Enable link-local messaging" +#~ msgstr "_Omogući poruke preko lokalne veze" + +#~ msgid "_Modify" +#~ msgstr "_Izmeni" + +#~ msgid "_Compact View Alt+C" +#~ msgstr "_Kompaktan pregled Alt+K" + +#~ msgid "Interface Customization" +#~ msgstr "Prilagođavanje interfejsa" + +#~ msgid "Also known as iChat style" +#~ msgstr "Takođe znan i kao iChat stil" + +#~ msgid "Chat" +#~ msgstr "Razgovor" + +#~ msgid "E_very 5 minutes" +#~ msgstr "Na svakih 5 minuta" + +#~ msgid "" +#~ "Gajim will automatically show new events by popping up the relative window" +#~ msgstr "" +#~ "Gajim će automatski prikazati nove događaje sa odogovarajućim iskačućim " +#~ "prozorom" + +#~ msgid "" +#~ "Gajim will notify you for new events via a popup in the bottom right of " +#~ "the screen" +#~ msgstr "" +#~ "Gajim će Vas obavestiti o novim događajima preko iskačućeg obaveštenja u " +#~ "donjem desnom uglu ekrana" + +#~ msgid "" +#~ "Gajim will notify you via a popup window in the bottom right of the " +#~ "screen about contacts that just signed in" +#~ msgstr "" +#~ "Gajim će Vas obavestiti o kontaktima koji su se upravo pojavili sa " +#~ "iskačućim prozorom u donjem desnom uglu ekrana" + +#~ msgid "" +#~ "Gajim will only change the icon of the contact that triggered the new " +#~ "event" +#~ msgstr "Gajim će samo izmeniti ikonu kontakta koji je izazvao novi događaj" + +#~ msgid "" +#~ "If checked, Gajim will remember the roster and chat window positions in " +#~ "the screen and the sizes of them next time you run it" +#~ msgstr "" +#~ "Ako je označeno, Gajim će pamtiti veličinu i poziciju prozora liste " +#~ "kontakata i prozora razgovora sledeći put kada se pokrene" + +#~ msgid "On every _message" +#~ msgstr "Na svaku poruku" + +#~ msgid "Outgoing Chat state noti_fications:" +#~ msgstr "Obaveštenja o stanju odlaznog razgovora" + +#~ msgid "Print time:" +#~ msgstr "Ispis vremena:" + +#~ msgid "Save _position and size for roster and chat windows" +#~ msgstr "Čuvaj pozicije i veličine prozora za kontakte i za razgovor" + +#~ msgid "Show only in _roster" +#~ msgstr "Prikaži samo u listi kontakata" + +#~ msgid "Use t_rayicon (aka. notification area icon)" +#~ msgstr "Koristi ikonu panel (tzv. ikonu obaveštenja)" + +#~ msgid "" +#~ "When a new event (message, file transfer request etc..) is received, the " +#~ "following methods may be used to inform you about it. Please note that " +#~ "events about new messages only occur if it is a new message from a " +#~ "contact you are not already chatting with" +#~ msgstr "" +#~ "Kada se primi novi događaj (poruka, zahtev za prenos datoteke i sl.), " +#~ "mogu se korisititi sledeće metode obaveštavanja. Imajte na umu da se " +#~ "obaveštavanja o novim porukama prikazuju samo za kontakte sa kojima " +#~ "trenutno ne razgovarate" + +#~ msgid "_Never" +#~ msgstr "_Nikada" + +#~ msgid "_Notify me about it" +#~ msgstr "_Obavesti me o tome" + +#~ msgid "_Pop it up" +#~ msgstr "_Iskoči ga" + +#~ msgid "_Remove from Roster" +#~ msgstr "_Izbriši sa liste kontakata" + +#~ msgid "Add _Contact" +#~ msgstr "Dodaj _kontakt" + +#~ msgid "_Filter:" +#~ msgstr "_Filter:" + +#~ msgid "" +#~ "If that is not your language for which you want to highlight misspelled " +#~ "words, then please set your $LANG as appropriate. Eg. for French do " +#~ "export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to " +#~ "make it global in /etc/profile.\n" +#~ "\n" +#~ "Highlighting misspelled words feature will not be used" +#~ msgstr "" +#~ "Ako ovo nije Vaš jezik za koji želite da obojite loše napisane reči, " +#~ "molimo podesite $LANG promenljivu okruženja na odgovarajuću vrednost. " +#~ "Npr. za francuski, uradite export LANG=fr_FR ili export LANG=fr_FR.UTF-8 " +#~ "u ~/.bash_profile ili, kako bi bilo globalno u /etc/profile.\n" +#~ "\n" +#~ "Mogućnost bojenja loše napisanih reči neće biti korišćena" + +#~ msgid "Every %s _minutes" +#~ msgstr "Svaka %s _minuta" + +#~ msgid "You must enter a password for the new account." +#~ msgstr "Morate uneti lozinku za novi nalog" + +#~ msgid "%s does not appear to be a valid JID" +#~ msgstr "%s ne liči da je validan Džaber ID" + +#~ msgid "Drop %s in group %s" +#~ msgstr "Spusti %s u grupu %s" + +#~ msgid "Make %s and %s metacontacts" +#~ msgstr "Napravi od %s i %s pseudokontakte" + +#~ msgid "Hides the buttons in two persons chat window." +#~ msgstr "Sakriva dugmad u prozoru razgovora dve osobe." + +#~ msgid " %d unread single message" +#~ msgid_plural " %d unread single messages" +#~ msgstr[0] "%d nepročitana samostalna poruka" +#~ msgstr[1] "%d nepročitane samostalne poruke" +#~ msgstr[2] "%d nepročitanih samostalnih poruka" + +#~ msgid " %d unread group chat message" +#~ msgid_plural " %d unread group chat messages" +#~ msgstr[0] "%d nepročitana poruka grupnog razgovora" +#~ msgstr[1] "%d nepročitane poruke grupnog razgovora" +#~ msgstr[2] "%d nepročitanih poruka grupnog razgovora" + +#~ msgid " %d unread private message" +#~ msgid_plural " %d unread private messages" +#~ msgstr[0] "%d nepročitana privatna poruka" +#~ msgstr[1] "%d nepročitane privatne poruke" +#~ msgstr[2] "%d nepročitanih privatnih poruka" + +#~ msgid "Error while adding service. %s" +#~ msgstr "Greška prilikom dodavanja servisa. %s" diff --git a/setup_osx.py b/setup_osx.py new file mode 100644 index 000000000..748c07ffb --- /dev/null +++ b/setup_osx.py @@ -0,0 +1,200 @@ +""" +Usage: + python setup_osx.py [build | dist] +""" + +from setuptools import setup +import sys, glob, os, commands, types +from os import system, unlink, symlink, getcwd, mkdir, utime +from shutil import move, copy, copytree, rmtree + +### +### Globals +### + +GTK_DIR="/Library/Frameworks/GTK+.framework/Versions/Current" +NAME = 'Gajim' +VERSION = '0.11' +DESCRIPTION = 'A full featured Jabber client' +AUTHOR = 'Gajim Development Team' +URL = 'http://www.gajim.org/' +DOWNLOAD_URL = 'http://www.gajim.org/downloads.php' +LICENSE = 'GPL' +PWD = getcwd() +APP_RS = "dist/Gajim.app/Contents/Resources" + +GAJIM_SCRIPT = \ +'#!/bin/bash \n\ +export DYLD_LIBRARY_PATH=%s/lib \n\ +export PATH=%s/bin:$PATH \n\ +export PYTHONPATH=%s/lib/python2.5/site-packages:%s/lib/python2.5/site-packages/gtk-2.0 \n\ +exec ${0}.bin \n\ +' % (GTK_DIR, GTK_DIR, GTK_DIR, GTK_DIR) + +GAJIM_REMOTE_SCRIPT = \ +'#!/bin/bash \n\ +export DYLD_LIBRARY_PATH=%s/lib \n\ +TOPDIR=${0%%/MacOS/gajim-remote} \n\ +echo "${TOPDIR}" | grep -e "^/" \n\ +[ $? -ne 0 ] && TOPDIR=`pwd`/${TOPDIR} \n\ +export RESOURCEPATH=${TOPDIR}/Resources \n\ +export PYTHONHOME=${RESOURCEPATH}/lib/python2.5 \n\ +export PYTHONPATH=${RESOURCEPATH}/lib/python2.5/lib-dynload:${RESOURCEPATH}/lib/python2.5/site-packages.zip:${PYTHONPATH} \n\ +cd ${RESOURCEPATH} \n\ +exec ${TOPDIR}/MacOS/Python ${RESOURCEPATH}/gajim-remote.py $* \n\ +' % GTK_DIR + +### +### Functions +### + +def check(ret): + if type(ret) == types.ListType: + if ret[0] != 0: + raise Exception("Command failed: " + ret[1]) + elif type(ret) == types.IntType: + if ret != 0: + raise Exception("Command failed") + return + + +def force(func): + try: + func() + except: + pass + return + + +def writeScript(filename, contents): + script = file(filename, "w+") + script.write(contents) + script.close() + system("chmod +x %s" % filename) + return + + +def cleanup(): + force(lambda:rmtree("build")) + force(lambda:rmtree("dist")) + +def stageInstall(): + check(system("make DATADIR=%s/build/inst LIBDIR=%s/build/inst prefix=%s/build/inst DOCDIR=%s/build/inst/share/doc install" % (PWD, PWD, PWD, PWD))) + force(lambda:unlink("src/osx/growl/_growl.so")) + force(lambda:unlink("src/osx/growl/_growlImage.so")) + force(lambda:unlink("src/osx/idle.so")) + force(lambda:unlink("src/osx/nsapp.so")) + force(lambda:unlink("src/osx/syncmenu.so")) + force(lambda:unlink("src/gtkspell.so")) + symlink("%s/build/inst/lib/gajim/_growl.so" % PWD, "src/osx/growl/_growl.so") + symlink("%s/build/inst/lib/gajim/_growlImage.so" % PWD, + "src/osx/growl/_growlImage.so") + symlink("%s/build/inst/lib/gajim/idle.so" % PWD, "src/osx/idle.so") + symlink("%s/build/inst/lib/gajim/nsapp.so" % PWD, "src/osx/nsapp.so") + symlink("%s/build/inst/lib/gajim/syncmenu.so" % PWD, "src/osx/syncmenu.so") + if os.path.isfile("build/inst/lib/gajim/gtkspell.so"): + symlink("%s/build/inst/lib/gajim/gtkspell.so" % PWD, "src/gtkspell.so") + return + + +def buildApp(): + sys.path.append('src') + sys.path.append(GTK_DIR + "/lib/python2.5/site-packages") + sys.path.append(GTK_DIR + "/lib/python2.5/site-packages/gtk-2.0") + OPTIONS = {'argv_emulation':True, + 'excludes':'docutils,Crypto,dbus,OpenSSL,cairo,gtk,gobject,atk,pangocairo', + 'iconfile':'data/pixmaps/gajim.icns', + 'includes':'osx,ConfigParser,compiler,UserString,history_manager', + 'plist':{'LSMinimumSystemVersion':'10.4.0', + 'NSHumanReadableCopyright':'GNU General Public License', + 'CFBundleIdentifier':'org.gajim', + 'NSMainNibFile':'Gajim', + }, + } + setup( + name = NAME, version = VERSION, description = DESCRIPTION, + author = AUTHOR, url = URL, download_url = DOWNLOAD_URL, + license = LICENSE, + app=['src/gajim.py'], + data_files=['data/nibs/Gajim.nib'], + options={'py2app': OPTIONS}, + setup_requires=['py2app'], + ) + return + + +def setupPrep(): + copy("src/osx/prep_py2app.py", APP_RS) + move("dist/Gajim.app/Contents/Resources/__boot__.py", + "dist/Gajim.app/Contents/Resources/__boot__.py.org") + new = file("dist/Gajim.app/Contents/Resources/__boot__.py", "w+") + org = file("dist/Gajim.app/Contents/Resources/__boot__.py.org") + for line in org: + new.write(line) + if (('site.addsitedir' in line) and ('Python' in line)): + new.write(" import prep_py2app\n") + new.close() + org.close() + unlink("dist/Gajim.app/Contents/Resources/__boot__.py.org") + return + + +def finishApp(): + # setup gajim dirs + copytree("build/inst/share/gajim/data", APP_RS + "/data") + copy("data/pixmaps/gajim.icns", APP_RS + "/data/pixmaps") + copytree("build/inst/locale", APP_RS + "/locale") + copytree("build/inst/share/man", APP_RS + "/man") + force(lambda:unlink("dist/Gajim.app/Contents/data")) + symlink("Resources/data", "dist/Gajim.app/Contents/data") + copy("src/gajim-remote.py", "dist/Gajim.app/Contents/Resources") + # Nuke libs that are in the framework + move("dist/Gajim.app/Contents/Frameworks/Python.framework", + "dist/Gajim.app/Contents/Python.framework") + rmtree("dist/Gajim.app/Contents/Frameworks") + mkdir("dist/Gajim.app/Contents/Frameworks") + move("dist/Gajim.app/Contents/Python.framework", + "dist/Gajim.app/Contents/Frameworks/Python.framework") + # Adjust the running of the app + move("dist/Gajim.app/Contents/MacOS/Gajim", + "dist/Gajim.app/Contents/MacOS/Gajim.bin") + writeScript("dist/Gajim.app/Contents/MacOS/Gajim", GAJIM_SCRIPT) + setupPrep() + # Setup the gajim-remote script + writeScript("dist/Gajim.app/Contents/MacOS/gajim-remote", + GAJIM_REMOTE_SCRIPT) + # Touch the top dir so Finder knows to update its idea of this bundle + utime("dist/Gajim.app", None) + return + + +def distApp(): + force(lambda:rmtree("dist/Gajim")) + force(lambda:rmtree("dist/Gajim.tar.bz2")) + mkdir("dist/Gajim") + check(system("tar -cf - -C dist Gajim.app | tar -xf - -C dist/Gajim")) + copy("README.osx", "dist/Gajim/README") + copy("TODO.osx", "dist/Gajim/TODO") + check(system("tar -C dist -jcf dist/Gajim-OSX-`date | awk '{printf(\"%s-%s-%s\", $6, $2, $3);}'`.tar.bz2 Gajim")) + rmtree("dist/Gajim") + return + + + +### +### Start +### +if ((len(sys.argv) != 2) or ((sys.argv[1] != "build") and + (sys.argv[1] != "dist"))): + print "usage: python setup_osx.py [build]" + print " or: python setup_osx.py [dist]" + sys.exit(1) +elif sys.argv[1] == "build": + sys.argv[1] = "py2app" + sys.argv.append('--use-pythonpath') + cleanup() + stageInstall() + buildApp() + finishApp() +elif sys.argv[1] == "dist": + distApp() diff --git a/setup_win32.py b/setup_win32.py index 5deffb08d..92cc7fd81 100644 --- a/setup_win32.py +++ b/setup_win32.py @@ -1,17 +1,21 @@ ## setup_win32.py (run me as python setup_win32.py py2exe -O2) ## -## Copyright (C) 2003-2006 Yann Le Boulanger +## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . from distutils.core import setup import py2exe @@ -23,14 +27,14 @@ includes = ['encodings', 'encodings.utf-8',] opts = { 'py2exe': { - 'includes': 'pango,atk,gobject,cairo,pangocairo,gtk.keysyms,encodings,encodings.*', + 'includes': 'pango,atk,gobject,cairo,pangocairo,gtk.keysyms,encodings,encodings.*,docutils.readers.*,docutils.writers.html4css1', 'dll_excludes': [ 'iconv.dll','intl.dll','libatk-1.0-0.dll', 'libgdk_pixbuf-2.0-0.dll','libgdk-win32-2.0-0.dll', 'libglib-2.0-0.dll','libgmodule-2.0-0.dll', 'libgobject-2.0-0.dll','libgthread-2.0-0.dll', 'libgtk-win32-2.0-0.dll','libpango-1.0-0.dll', - 'libpangowin32-1.0-0.dll','libcairo-2.dll', + 'libpangowin32-1.0-0.dll','libcairo-2.dll', 'libpangocairo-1.0-0.dll','libpangoft2-1.0-0.dll', ], } @@ -38,7 +42,7 @@ opts = { setup( name = 'Gajim', - version = '0.11', + version = '0.11.4', description = 'A full featured Jabber client', author = 'Gajim Development Team', url = 'http://www.gajim.org/', diff --git a/src/Makefile.am b/src/Makefile.am index 30eb995a9..27a734196 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,9 +1,10 @@ -SUBDIRS = common +SUBDIRS = common osx CLEANFILES = \ trayicon.c INCLUDES = \ $(PYTHON_INCLUDES) +export MACOSX_DEPLOYMENT_TARGET=10.4 if BUILD_GTKSPELL gtkspelllib_LTLIBRARIES = gtkspell.la diff --git a/src/adhoc_commands.py b/src/adhoc_commands.py index ecee22521..687a09bd5 100644 --- a/src/adhoc_commands.py +++ b/src/adhoc_commands.py @@ -1,17 +1,22 @@ # -*- coding: utf-8 -*- ## adhoc_commands.py ## -## Copyright (C) 2006 Yann Le Boulanger +## Copyright (C) 2006 Yann Leboulanger ## Nikos Kouremenos ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . # FIXME: think if we need caching command list. it may be wrong if there will # be entities that often change the list, it may be slow to fetch it every time @@ -286,8 +291,7 @@ class CommandWindow: self.remove_pulsing() self.sending_form_progressbar.hide() - if not self.sessionid: - self.sessionid = command.getAttr('sessionid') + self.sessionid = command.getAttr('sessionid') self.form_status = command.getAttr('status') @@ -446,7 +450,7 @@ class CommandWindow: # no commands => no commands stage # commands => command selection stage query = response.getTag('query') - if query: + if query and query.getAttr('node') == xmpp.NS_COMMANDS: items = query.getTags('item') else: items = [] diff --git a/src/advanced.py b/src/advanced.py index 54ff57275..e7d9647ff 100644 --- a/src/advanced.py +++ b/src/advanced.py @@ -1,18 +1,23 @@ ## advanced.py ## -## Copyright (C) 2005-2006 Yann Le Boulanger +## Copyright (C) 2005-2006 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005 Vincent Hanquez ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 gtkgui_helpers @@ -98,8 +103,7 @@ class AdvancedConfigurationWindow(object): 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 in ('password', - 'gpgpassword'): + if opttype == self.types['boolean'] or optname == 'password': cell.set_property('editable', False) else: cell.set_property('editable', True) @@ -234,7 +238,7 @@ class AdvancedConfigurationWindow(object): type = val[OPT_TYPE][0] type = self.types[type] # i18n value = val[OPT_VAL] - if name in ('password', 'gpgpassword'): + if name == 'password': #we talk about password value = _('Hidden') # override passwords with this string if value in self.right_true_dict: diff --git a/src/atom_window.py b/src/atom_window.py index 3bab31fdf..25836c6dc 100644 --- a/src/atom_window.py +++ b/src/atom_window.py @@ -3,19 +3,24 @@ ## For now greatly simplified, supports only simple feeds like the ## one from pubsub.com. ## -## Copyright (C) 2006-2007 Yann Le Boulanger +## Copyright (C) 2006-2007 Yann Leboulanger ## Copyright (C) 2007 Nikos Kouremenos ## Copyright (C) 2006-2007 Liori (I think) put ur self here please ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 diff --git a/src/cell_renderer_image.py b/src/cell_renderer_image.py index aaf1f8cd1..a4e8386d0 100644 --- a/src/cell_renderer_image.py +++ b/src/cell_renderer_image.py @@ -1,27 +1,32 @@ ## cell_renderer_image.py ## ## Contributors for this file: -## - Yann Le Boulanger +## - Yann Leboulanger ## - Nikos Kouremenos ## -## Copyright (C) 2003-2004 Yann Le Boulanger +## Copyright (C) 2003-2004 Yann Leboulanger ## Vincent Hanquez -## Copyright (C) 2005 Yann Le Boulanger +## Copyright (C) 2005 Yann Leboulanger ## Vincent Hanquez ## Nikos Kouremenos ## Dimitur Kirov ## Travis Shirk ## Norman Rasmussen ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 @@ -89,6 +94,8 @@ class CellRendererImage(gtk.GenericCellRenderer): if self.image.get_storage_type() == gtk.IMAGE_ANIMATION: if self.image not in self.iters: + if not isinstance(widget, gtk.TreeView): + return animation = self.image.get_animation() iter = animation.get_iter() self.iters[self.image] = iter diff --git a/src/chat_control.py b/src/chat_control.py index 9bf90ced9..3474895a4 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -1,21 +1,27 @@ ## chat_control.py ## -## Copyright (C) 2006 Yann Le Boulanger +## Copyright (C) 2006 Yann Leboulanger ## Copyright (C) 2006-2007 Nikos Kouremenos ## Copyright (C) 2006 Travis Shirk -## Copyright (C) 2006 Dimitur Kirov +## Dimitur Kirov ## Copyright (C) 2007 Lukas Petrovicky -## Copyright (C) 2007 Julien Pivotto +## Julien Pivotto +## Stephan Erb ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 os import time @@ -27,6 +33,7 @@ import message_control import dialogs import history_window import notify +import re from common import gajim from common import helpers @@ -45,21 +52,24 @@ try: except: HAS_GTK_SPELL = False - # 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) +#LANG=$(for i in *.po; do j=${i/.po/}; echo -n "_('"$j"')":" '"$j"', " ; done) #echo "{_('en'):'en'",$LANG"}" langs = {_('English'): 'en', _('Belarusian'): 'be', _('Bulgarian'): 'bg', _('Breton'): 'br', _('Czech'): 'cs', _('German'): 'de', _('Greek'): 'el', _('British'): 'en_GB', _('Esperanto'): 'eo', _('Spanish'): 'es', _('Basque'): 'eu', _('French'): 'fr', _('Croatian'): 'hr', _('Italian'): 'it', _('Norwegian (b)'): 'nb', _('Dutch'): 'nl', _('Norwegian'): 'no', _('Polish'): 'pl', _('Portuguese'): 'pt', _('Brazilian Portuguese'): 'pt_BR', _('Russian'): 'ru', _('Serbian'): 'sr', _('Slovak'): 'sk', _('Swedish'): 'sv', _('Chinese (Ch)'): 'zh_CN'} - ################################################################################ class ChatControlBase(MessageControl): '''A base class containing a banner, ConversationTextview, MessageTextView ''' + def make_href(self, match): + url_color = gajim.config.get('urlmsgcolor') + return '%s' % (match.group(), + 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') @@ -119,6 +129,9 @@ class ChatControlBase(MessageControl): event_keymod): pass # Derived should implement this rather than connecting to the event itself. + def status_url_clicked(self, widget, url): + helpers.launch_browser_mailer('url', url) + def __init__(self, type_id, parent_win, widget_name, contact, acct, resource = None): MessageControl.__init__(self, type_id, parent_win, widget_name, @@ -137,6 +150,22 @@ class ChatControlBase(MessageControl): id = widget.connect('button-press-event', self._on_banner_eventbox_button_press_event) self.handlers[id] = widget + + self.urlfinder = re.compile(r"(www\.(?!\.)|[a-z][a-z0-9+.-]*://)[^\s<>'\"]+[^!,\.\s<>\)'\"\]]") + + if gajim.HAVE_PYSEXY: + import sexy + self.banner_status_label = sexy.UrlLabel() + self.banner_status_label.connect('url_activated', self.status_url_clicked) + else: + self.banner_status_label = gtk.Label() + self.banner_status_label.set_selectable(True) + self.banner_status_label.set_alignment(0,0.5) + + banner_vbox = self.xml.get_widget('banner_vbox') + banner_vbox.pack_start(self.banner_status_label) + self.banner_status_label.show() + # Init DND self.TARGET_TYPE_URI_LIST = 80 self.dnd_list = [ ( 'text/uri-list', 0, self.TARGET_TYPE_URI_LIST ), @@ -151,6 +180,9 @@ class ChatControlBase(MessageControl): # Create textviews and connect signals self.conv_textview = ConversationTextview(self.account) + id = self.conv_textview.tv.connect('key_press_event', + self._conv_textview_key_press_event) + self.handlers[id] = self.conv_textview.tv # FIXME: DND on non editable TextView, find a better way self.drag_entered = False id = self.conv_textview.tv.connect('drag_data_received', @@ -246,13 +278,14 @@ class ChatControlBase(MessageControl): spell.set_language(lang) except (gobject.GError, RuntimeError), msg: dialogs.AspellDictError(lang) - self.style_event_id = 0 self.conv_textview.tv.show() self._paint_banner() # For JEP-0172 self.user_nick = None + self.smooth = True + def on_msg_textview_populate_popup(self, textview, menu): '''we override the default context menu and we prepend an option to switch languages''' def _on_select_dictionary(widget, lang): @@ -321,6 +354,7 @@ class ChatControlBase(MessageControl): banner_eventbox = self.xml.get_widget('banner_eventbox') banner_name_label = self.xml.get_widget('banner_name_label') self.disconnect_style_event(banner_name_label) + self.disconnect_style_event(self.banner_status_label) if bgcolor: banner_eventbox.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(bgcolor)) @@ -330,25 +364,33 @@ class ChatControlBase(MessageControl): if textcolor: banner_name_label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse(textcolor)) + self.banner_status_label.modify_fg(gtk.STATE_NORMAL, + gtk.gdk.color_parse(textcolor)) default_fg = False else: default_fg = True if default_bg or default_fg: self._on_style_set_event(banner_name_label, None, default_fg, default_bg) - + self._on_style_set_event(self.banner_status_label, None, default_fg, + default_bg) + def disconnect_style_event(self, widget): - if self.style_event_id: - widget.disconnect(self.style_event_id) - del self.handlers[self.style_event_id] - self.style_event_id = 0 + # Try to find the event_id + found = False + for id in self.handlers: + if self.handlers[id] == widget: + found = True + break + if found: + widget.disconnect(id) + del self.handlers[id] def connect_style_event(self, widget, set_fg = False, set_bg = False): self.disconnect_style_event(widget) - self.style_event_id = widget.connect('style-set', - self._on_style_set_event, set_fg, set_bg) - self.handlers[self.style_event_id] = widget - + id = widget.connect('style-set', self._on_style_set_event, set_fg, set_bg) + self.handlers[id] = widget + def _on_style_set_event(self, widget, style, *opts): '''set style of widget from style class *.Frame.Eventbox opts[0] == True -> set fg color @@ -362,7 +404,14 @@ class ChatControlBase(MessageControl): fg_color = widget.style.fg[gtk.STATE_SELECTED] widget.modify_fg(gtk.STATE_NORMAL, fg_color) self.connect_style_event(widget, opts[0], opts[1]) - + + def _conv_textview_key_press_event(self, widget, event): + if gtk.gtk_version < (2, 12, 0): + return + if event.state & (gtk.gdk.SHIFT_MASK | gtk.gdk.CONTROL_MASK): + return False + self.parent_win.notebook.emit('key_press_event', event) + def _on_keypress_event(self, widget, event): if event.state & gtk.gdk.CONTROL_MASK: # CTRL + l|L: clear conv_textview @@ -389,6 +438,7 @@ class ChatControlBase(MessageControl): event.keyval == gtk.keysyms.Page_Up: self.parent_win.notebook.emit('key_press_event', event) return True + elif event.keyval == gtk.keysyms.m and \ (event.state & gtk.gdk.MOD1_MASK): # alt + m opens emoticons menu if gajim.config.get('emoticons_theme'): @@ -402,7 +452,7 @@ class ChatControlBase(MessageControl): # get the cursor position cursor = msg_tv.get_iter_location(buf.get_iter_at_mark( buf.get_insert())) - cursor = msg_tv.buffer_to_window_coords(gtk.TEXT_WINDOW_TEXT, + cursor = msg_tv.buffer_to_window_coords(gtk.TEXT_WINDOW_TEXT, cursor.x, cursor.y) x = origin[0] + cursor[0] y = origin[1] + size[1] @@ -519,7 +569,7 @@ class ChatControlBase(MessageControl): def _on_drag_data_received(self, widget, context, x, y, selection, target_type, timestamp): - pass # Derived classes SHOULD implement this method + pass # Derived classes SHOULD implement this method def _on_drag_leave(self, widget, context, time): # FIXME: DND on non editable TextView, find a better way @@ -614,7 +664,7 @@ class ChatControlBase(MessageControl): if kind in ('incoming', 'incoming_queue'): gc_message = False - if self.type_id == message_control.TYPE_GC: + if self.type_id == message_control.TYPE_GC: gc_message = True if ((self.parent_win and (not self.parent_win.get_active_jid() or \ @@ -712,10 +762,11 @@ class ChatControlBase(MessageControl): if not jid: jid = self.contact.jid - if gajim.interface.instances['logs'].has_key(jid): - gajim.interface.instances['logs'][jid].window.present() + if gajim.interface.instances.has_key('logs'): + gajim.interface.instances['logs'].window.present() + gajim.interface.instances['logs'].open_history(jid, self.account) else: - gajim.interface.instances['logs'][jid] = \ + gajim.interface.instances['logs'] = \ history_window.HistoryWindow(jid, self.account) def on_minimize_menuitem_toggled(self, widget): @@ -795,7 +846,7 @@ class ChatControlBase(MessageControl): # but we also want to avoid window resizing so if we reach that # minimum for conversation_textview and maximum for message_textview # we set to automatic the scrollbar policy - diff_y = message_height - requisition.height + diff_y = message_height - requisition.height if diff_y != 0: if conversation_height + diff_y < min_height: if message_height + conversation_height - min_height > min_height: @@ -812,9 +863,10 @@ class ChatControlBase(MessageControl): self.msg_scrolledwindow.set_property('vscrollbar-policy', gtk.POLICY_NEVER) self.msg_scrolledwindow.set_property('height-request', -1) - - self.conv_textview.bring_scroll_to_end(diff_y - 18) - + self.conv_textview.bring_scroll_to_end(diff_y - 18, False) + else: + self.conv_textview.bring_scroll_to_end(diff_y - 18, self.smooth) + self.smooth = True # reinit the flag # enable scrollbar automatic policy for horizontal scrollbar # if message we have in message_textview is too big if requisition.width > message_width: @@ -895,6 +947,7 @@ class ChatControlBase(MessageControl): if self.sent_history_pos == 0: return self.sent_history_pos = self.sent_history_pos - 1 + self.smooth = False conv_buf.set_text(self.sent_history[self.sent_history_pos]) elif direction == 'down': if self.sent_history_pos >= size - 1: @@ -904,6 +957,7 @@ class ChatControlBase(MessageControl): return self.sent_history_pos = self.sent_history_pos + 1 + self.smooth = False conv_buf.set_text(self.sent_history[self.sent_history_pos]) def lighten_color(self, color): @@ -948,11 +1002,11 @@ class ChatControl(ChatControlBase): TYPE_ID = message_control.TYPE_CHAT old_msg_kind = None # last kind of the printed message CHAT_CMDS = ['clear', 'compact', 'help', 'me', 'ping', 'say'] - - def __init__(self, parent_win, contact, acct, resource = None): + + def __init__(self, parent_win, contact, acct, session, resource = None): ChatControlBase.__init__(self, self.TYPE_ID, parent_win, 'chat_child_vbox', contact, acct, resource) - + # for muc use: # widget = self.xml.get_widget('muc_window_actions_button') widget = self.xml.get_widget('message_window_actions_button') @@ -968,7 +1022,7 @@ class ChatControl(ChatControlBase): # it is on enter-notify and leave-notify so no need to be per jid self.show_bigger_avatar_timeout_id = None self.bigger_avatar_window = None - self.show_avatar(self.contact.resource) + self.show_avatar(self.contact.resource) # chatstate timers and state self.reset_kbd_mouse_timeout_vars() @@ -982,7 +1036,7 @@ class ChatControl(ChatControlBase): id = message_tv_buffer.connect('changed', self._on_message_tv_buffer_changed) self.handlers[id] = message_tv_buffer - + widget = self.xml.get_widget('avatar_eventbox') id = widget.connect('enter-notify-event', self.on_avatar_eventbox_enter_notify_event) @@ -1002,7 +1056,9 @@ class ChatControl(ChatControlBase): if self.contact.jid in gajim.encrypted_chats[self.account]: self.xml.get_widget('gpg_togglebutton').set_active(True) - + + self.set_session(session) + self.status_tooltip = gtk.Tooltips() self.update_ui() # restore previous conversation @@ -1045,7 +1101,7 @@ class ChatControl(ChatControlBase): menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) id = menuitem.connect('activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, - self.contact.jid, self.account, self.contact.get_shown_name() + + self.contact.jid, self.account, self.contact.get_shown_name() + \ '.jpeg') self.handlers[id] = menuitem menu.append(menuitem) @@ -1146,11 +1202,10 @@ class ChatControl(ChatControlBase): status = contact.status if status is not None: - self.status_tooltip.set_tip(banner_eventbox, status) - self.status_tooltip.enable() banner_name_label.set_ellipsize(pango.ELLIPSIZE_END) - status = helpers.reduce_chars_newlines(status, max_lines = 1) - status_escaped = gobject.markup_escape_text(status) + self.banner_status_label.set_ellipsize(pango.ELLIPSIZE_END) + status_reduced = helpers.reduce_chars_newlines(status, max_lines = 1) + status_escaped = gobject.markup_escape_text(status_reduced) font_attrs, font_attrs_small = self.get_font_attrs() st = gajim.config.get('displayed_chat_state_notifications') @@ -1179,11 +1234,23 @@ class ChatControl(ChatControlBase): # weight="heavy" size="x-large" label_text = '%s%s' % \ (font_attrs, name, font_attrs_small, acct_info) + if status_escaped: - label_text += '\n%s' %\ - (font_attrs_small, status_escaped) + if gajim.HAVE_PYSEXY: + status_text = self.urlfinder.sub(self.make_href, status_escaped) + status_text = '%s' % (font_attrs_small, status_text) + else: + status_text = '%s' % (font_attrs_small, status_escaped) + self.status_tooltip.set_tip(banner_eventbox, status) + self.banner_status_label.show() + self.banner_status_label.set_no_show_all(False) else: + status_text = '' self.status_tooltip.disable() + self.banner_status_label.hide() + self.banner_status_label.set_no_show_all(True) + + self.banner_status_label.set_markup(status_text) # setup the label that holds name and jid banner_name_label.set_markup(label_text) @@ -1231,7 +1298,11 @@ class ChatControl(ChatControlBase): message_array = [] if command == 'me': - return False # This is not really a command + if len(message_array): + return False # /me is not really a command + else: + self.get_command_help(command) + return True # do not send "/me" as message if command == 'help': if len(message_array): @@ -1295,13 +1366,13 @@ class ChatControl(ChatControlBase): contact = self.contact + encrypted = bool(self.session) and self.session.enable_encryption + keyID = '' - encrypted = False if self.xml.get_widget('gpg_togglebutton').get_active(): keyID = contact.keyID encrypted = True - chatstates_on = gajim.config.get('outgoing_chat_state_notifications') != \ 'disabled' composing_xep = contact.composing_xep @@ -1313,7 +1384,7 @@ class ChatControl(ChatControlBase): # this is here (and not in send_chatstate) # because we want it sent with REAL message # (not standlone) eg. one that has body - + if contact.our_chatstate: # We already asked for xep 85, don't ask it twice composing_xep = 'asked_once' @@ -1393,6 +1464,26 @@ class ChatControl(ChatControlBase): self.mouse_over_in_last_30_secs = False self.kbd_activity_in_last_30_secs = False + def on_cancel_session_negotiation(self): + msg = _('Session negotiation cancelled') + ChatControlBase.print_conversation_line(self, msg, 'status', '', None) + + # print esession settings to textview + def print_esession_details(self): + if self.session and self.session.enable_encryption: + msg = _('E2E encryption enabled') + ChatControlBase.print_conversation_line(self, msg, 'status', '', None) + + if self.session.loggable: + msg = _('Session WILL be logged') + else: + msg = _('Session WILL NOT be logged') + + ChatControlBase.print_conversation_line(self, msg, 'status', '', None) + else: + msg = _('E2E encryption disabled') + ChatControlBase.print_conversation_line(self, msg, 'status', '', None) + def print_conversation(self, text, frm = '', tim = None, encrypted = False, subject = None, xhtml = None): '''Print a line in the conversation: @@ -1412,18 +1503,26 @@ class ChatControl(ChatControlBase): kind = 'info' name = '' else: - ec = gajim.encrypted_chats[self.account] - if encrypted and jid not in ec: - msg = _('Encryption enabled') - ChatControlBase.print_conversation_line(self, msg, - 'status', '', tim) - ec.append(jid) - elif not encrypted and jid in ec: - msg = _('Encryption disabled') - ChatControlBase.print_conversation_line(self, msg, - 'status', '', tim) - ec.remove(jid) - self.xml.get_widget('gpg_togglebutton').set_active(encrypted) + if self.session and self.session.enable_encryption: + if not encrypted: + msg = _('The following message was NOT encrypted') + ChatControlBase.print_conversation_line(self, msg, + 'status', '', tim) + else: + # GPG encryption + ec = gajim.encrypted_chats[self.account] + if encrypted and jid not in ec: + msg = _('OpenPGP Encryption enabled') + ChatControlBase.print_conversation_line(self, msg, + 'status', '', tim) + ec.append(jid) + elif not encrypted and jid in ec: + msg = _('OpenPGP Encryption disabled') + ChatControlBase.print_conversation_line(self, msg, + 'status', '', tim) + ec.remove(jid) + self.xml.get_widget('gpg_togglebutton').set_active(encrypted) + if not frm: kind = 'incoming' name = contact.get_shown_name() @@ -1530,27 +1629,41 @@ class ChatControl(ChatControlBase): ''' xml = gtkgui_helpers.get_glade('chat_control_popup_menu.glade') menu = xml.get_widget('chat_control_popup_menu') - + history_menuitem = xml.get_widget('history_menuitem') toggle_gpg_menuitem = xml.get_widget('toggle_gpg_menuitem') + toggle_e2e_menuitem = xml.get_widget('toggle_e2e_menuitem') add_to_roster_menuitem = xml.get_widget('add_to_roster_menuitem') send_file_menuitem = xml.get_widget('send_file_menuitem') information_menuitem = xml.get_widget('information_menuitem') - + convert_to_gc_menuitem = xml.get_widget('convert_to_groupchat') + muc_icon = gajim.interface.roster.load_icon('muc_active') + if muc_icon: + convert_to_gc_menuitem.set_image(muc_icon) + + ag = gtk.accel_groups_from_object(self.parent_win.window)[0] + history_menuitem.add_accelerator('activate', ag, gtk.keysyms.h, gtk.gdk.CONTROL_MASK, + gtk.ACCEL_VISIBLE) + information_menuitem.add_accelerator('activate', ag, gtk.keysyms.i, + gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) + contact = self.parent_win.get_active_contact() jid = contact.jid - - # history_menuitem - if gajim.jid_is_transport(jid): - history_menuitem.set_sensitive(False) - + # check if gpg capabitlies or else make gpg toggle insensitive gpg_btn = self.xml.get_widget('gpg_togglebutton') isactive = gpg_btn.get_active() is_sensitive = gpg_btn.get_property('sensitive') toggle_gpg_menuitem.set_active(isactive) toggle_gpg_menuitem.set_property('sensitive', is_sensitive) - + + # TODO: check that the remote client supports e2e + if not gajim.HAVE_PYCRYPTO: + toggle_e2e_menuitem.set_sensitive(False) + else: + isactive = int(self.session != None and self.session.enable_encryption) + toggle_e2e_menuitem.set_active(isactive) + # If we don't have resource, we can't do file transfer # in transports, contact holds our info we need to disable it too if self.TYPE_ID == message_control.TYPE_PM and self.gc_contact.jid and \ @@ -1560,7 +1673,12 @@ class ChatControl(ChatControlBase): send_file_menuitem.set_sensitive(True) else: send_file_menuitem.set_sensitive(False) - + + # check if it's possible to convert to groupchat + if gajim.get_transport_name_from_jid(jid) or \ + gajim.connections[self.account].is_zeroconf: + convert_to_gc_menuitem.set_sensitive(False) + # add_to_roster_menuitem if _('Not in Roster') in contact.groups: add_to_roster_menuitem.show() @@ -1568,8 +1686,7 @@ class ChatControl(ChatControlBase): else: add_to_roster_menuitem.hide() add_to_roster_menuitem.set_no_show_all(True) - - + # connect signals id = history_menuitem.connect('activate', self._on_history_menuitem_activate) @@ -1582,13 +1699,27 @@ class ChatControl(ChatControlBase): self.handlers[id] = add_to_roster_menuitem id = toggle_gpg_menuitem.connect('activate', self._on_toggle_gpg_menuitem_activate) + id = toggle_e2e_menuitem.connect('activate', + self._on_toggle_e2e_menuitem_activate) self.handlers[id] = toggle_gpg_menuitem id = information_menuitem.connect('activate', self._on_contact_information_menuitem_activate) self.handlers[id] = information_menuitem - menu.connect('selection-done', lambda w:w.destroy()) + id = convert_to_gc_menuitem.connect('activate', + self._on_convert_to_gc_menuitem_activate) + self.handlers[id] = convert_to_gc_menuitem + menu.connect('selection-done', self.destroy_menu, history_menuitem, + information_menuitem) return menu + def destroy_menu(self, menu, history_menuitem, information_menuitem): + # destroy accelerators + ag = gtk.accel_groups_from_object(self.parent_win.window)[0] + history_menuitem.remove_accelerator(ag, gtk.keysyms.h, gtk.gdk.CONTROL_MASK) + information_menuitem.remove_accelerator(ag, gtk.keysyms.i, gtk.gdk.CONTROL_MASK) + # destroy menu + menu.destroy() + def send_chatstate(self, state, contact = None): ''' sends OUR chatstate as STANDLONE chat state message (eg. no body) to contact only if new chatstate is different from the previous one @@ -1766,15 +1897,14 @@ class ChatControl(ChatControlBase): def _on_drag_data_received(self, widget, context, x, y, selection, target_type, timestamp): - # If no resource is known, we can't send a file + if not selection.data: + return if self.TYPE_ID == message_control.TYPE_PM: c = self.gc_contact else: c = self.contact - if not c.resource: - return if target_type == self.TARGET_TYPE_URI_LIST: - if not selection.data: + if not c.resource: # If no resource is known, we can't send a file return uri = selection.data.strip() uri_splitted = uri.split() # we may have more than one file dropped @@ -1783,6 +1913,26 @@ class ChatControl(ChatControlBase): if os.path.isfile(path): # is it file? ft = gajim.interface.instances['file_transfers'] ft.send_file(self.account, c, path) + return + + # chat2muc + treeview = gajim.interface.roster.tree + model = treeview.get_model() + data = selection.data + path = treeview.get_selection().get_selected_rows()[1][0] + iter = model.get_iter(path) + type = model[iter][2] + account = model[iter][4].decode('utf-8') + if type != 'contact': # source is not a contact + return + dropped_jid = data.decode('utf-8') + + dropped_transport = gajim.get_transport_name_from_jid(dropped_jid) + c_transport = gajim.get_transport_name_from_jid(c.jid) + if dropped_transport or c_transport: + return # transport contacts cannot be invited + + dialogs.TransformChatToMUC(self.account, [c.jid], [dropped_jid]) def _on_message_tv_buffer_changed(self, textbuffer): self.kbd_activity_in_last_5_secs = True @@ -1850,12 +2000,16 @@ class ChatControl(ChatControlBase): def read_queue(self): '''read queue and print messages containted in it''' + jid = self.contact.jid jid_with_resource = jid if self.resource: jid_with_resource += '/' + self.resource events = gajim.events.get_events(self.account, jid_with_resource) + if hasattr(self, 'session') and self.session and self.session.enable_encryption: + self.print_esession_details() + # Is it a pm ? is_pm = False room_jid, nick = gajim.get_room_and_nick_from_fjid(jid) @@ -1877,6 +2031,9 @@ class ChatControl(ChatControlBase): encrypted = data[4], subject = data[1], xhtml = data[7]) if len(data) > 6 and isinstance(data[6], int): message_ids.append(data[6]) + + if len(data) > 8: + self.set_session(data[8]) if message_ids: gajim.logger.set_read_messages(message_ids) gajim.events.remove_events(self.account, jid_with_resource, @@ -1943,6 +2100,8 @@ class ChatControl(ChatControlBase): # so this line adds that window.set_events(gtk.gdk.POINTER_MOTION_MASK) window.set_app_paintable(True) + if gtk.gtk_version >= (2, 10, 0) and gtk.pygtk_version >= (2, 10, 0): + window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_TOOLTIP) window.realize() window.window.set_back_pixmap(pixmap, False) # make it transparent @@ -2000,6 +2159,31 @@ class ChatControl(ChatControlBase): tb = self.xml.get_widget('gpg_togglebutton') tb.set_active(not tb.get_active()) + def _on_convert_to_gc_menuitem_activate(self, widget): + '''user want to invite some friends to chat''' + dialogs.TransformChatToMUC(self.account, [self.contact.jid]) + + def _on_toggle_e2e_menuitem_activate(self, widget): + if self.session and self.session.enable_encryption: + self.session.terminate_e2e() + + self.print_esession_details() + + jid = str(self.session.jid) + + gajim.connections[self.account].delete_session(jid, + self.session.thread_id) + + self.set_session(gajim.connections[self.account].make_new_session(jid)) + else: + if not self.session: + fjid = self.contact.get_full_jid() + new_sess = gajim.connections[self.account].make_new_session(fjid) + self.set_session(new_sess) + + # XXX decide whether to use 4 or 3 message negotiation + self.session.negotiate_e2e(False) + def got_connected(self): ChatControlBase.got_connected(self) # Refreshing contact diff --git a/src/common/GnuPG.py b/src/common/GnuPG.py index 7d1a88e56..8870b6bd3 100644 --- a/src/common/GnuPG.py +++ b/src/common/GnuPG.py @@ -1,27 +1,32 @@ ## common/GnuPG.py ## ## Contributors for this file: -## - Yann Le Boulanger +## - Yann Leboulanger ## - Nikos Kouremenos ## -## Copyright (C) 2003-2004 Yann Le Boulanger +## Copyright (C) 2003-2004 Yann Leboulanger ## Vincent Hanquez -## Copyright (C) 2005 Yann Le Boulanger +## Copyright (C) 2005 Yann Leboulanger ## Vincent Hanquez ## Nikos Kouremenos ## Dimitur Kirov ## Travis Shirk ## Norman Rasmussen ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 os from os import tmpfile @@ -87,19 +92,36 @@ else: return str, 'GnuPG not usable' self.options.recipients = recipients # a list! - proc = self.run(['--encrypt'], create_fhs=['stdin', 'stdout', + proc = self.run(['--encrypt'], create_fhs=['stdin', 'stdout', 'status', 'stderr']) proc.handles['stdin'].write(str) - proc.handles['stdin'].close() + try: + proc.handles['stdin'].close() + except IOError: + pass output = proc.handles['stdout'].read() - proc.handles['stdout'].close() + try: + proc.handles['stdout'].close() + except IOError: + pass + + stat = proc.handles['status'] + resp = self._read_response(stat) + try: + proc.handles['status'].close() + except IOError: + pass error = proc.handles['stderr'].read() proc.handles['stderr'].close() try: proc.wait() except IOError: pass + if 'BEGIN_ENCRYPTION' in resp and 'END_ENCRYPTION' in resp: + # Encryption succeeded, even if there is output on stderr. Maybe + # verbose is on + error = '' return self._stripHeaderFooter(output), error def decrypt(self, str, keyID): diff --git a/src/common/GnuPGInterface.py b/src/common/GnuPGInterface.py index 46fca86aa..b86786bb1 100644 --- a/src/common/GnuPGInterface.py +++ b/src/common/GnuPGInterface.py @@ -213,6 +213,9 @@ 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 General Public License +## along with Gajim. If not, see . You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software diff --git a/src/common/caps.py b/src/common/caps.py index 49179db64..080c28503 100644 --- a/src/common/caps.py +++ b/src/common/caps.py @@ -1,15 +1,20 @@ ## ## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## from itertools import * import xmpp @@ -244,7 +249,7 @@ class ConnectionCaps(object): if not contact: return if not contact.caps_node: return # we didn't asked for that? if not node.startswith(contact.caps_node+'#'): return - node, ext = node.split('#') + node, ext = node.split('#', 1) if ext==contact.caps_ver: # this can be also version (like '0.9') exts=None else: diff --git a/src/common/check_paths.py b/src/common/check_paths.py index b7f06046d..aba84008c 100644 --- a/src/common/check_paths.py +++ b/src/common/check_paths.py @@ -1,17 +1,22 @@ ## -## Copyright (C) 2005-2006 Yann Le Boulanger +## Copyright (C) 2005-2006 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005-2006 Travis Shirk ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 os import sys @@ -122,7 +127,7 @@ def check_and_possibly_create_paths(): print _('%s is a directory but should be a file') % LOG_DB_PATH print _('Gajim will now exit') sys.exit() - + else: # dot_gajim doesn't exist if dot_gajim: # is '' on win9x so avoid that create_path(dot_gajim) diff --git a/src/common/commands.py b/src/common/commands.py index 802095873..2e4ad6e25 100644 --- a/src/common/commands.py +++ b/src/common/commands.py @@ -1,15 +1,20 @@ ## ## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 xmpp import helpers @@ -162,7 +167,7 @@ def find_current_groupchats(account): class LeaveGroupchatsCommand(AdHocCommand): commandnode = 'leave-groupchats' - commandname = 'Leave Groupchats' + commandname = _('Leave Groupchats') @staticmethod def isVisibleFor(samejid): @@ -288,6 +293,8 @@ class ConnectionCommands: iq = iq_obj.buildReply('result') jid = helpers.get_full_jid_from_iq(iq_obj) q = iq.getTag('query') + # buildReply don't copy the node attribute. Re-add it + q.setAttr('node', xmpp.NS_COMMANDS) for node, cmd in self.__commands.iteritems(): if cmd.isVisibleFor(self.isSameJID(jid)): @@ -299,8 +306,8 @@ class ConnectionCommands: self.connection.send(iq) - def commandQuery(self, con, iq_obj): - ''' Send disco result for query for command (JEP-0050, example 6.). + def commandInfoQuery(self, con, iq_obj): + ''' Send disco#info result for query for command (JEP-0050, example 6.). Return True if the result was sent, False if not. ''' jid = helpers.get_full_jid_from_iq(iq_obj) node = iq_obj.getTagAttr('query', 'node') @@ -323,6 +330,22 @@ class ConnectionCommands: return False + def commandItemsQuery(self, con, iq_obj): + ''' Send disco#items result for query for command. + Return True if the result was sent, False if not. ''' + jid = helpers.get_full_jid_from_iq(iq_obj) + node = iq_obj.getTagAttr('query', 'node') + + if node not in self.__commands: return False + + cmd = self.__commands[node] + if cmd.isVisibleFor(self.isSameJID(jid)): + iq = iq_obj.buildReply('result') + self.connection.send(iq) + return True + + return False + def _CommandExecuteCB(self, con, iq_obj): jid = helpers.get_full_jid_from_iq(iq_obj) diff --git a/src/common/config.py b/src/common/config.py index 5f5a8d29b..1570059ad 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -1,25 +1,32 @@ ## common/config.py ## -## Copyright (C) 2003-2006 Yann Le Boulanger +## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2004-2005 Vincent Hanquez ## Copyright (C) 2005 Dimitur Kirov -## Copyright (C) 2005 Travis Shirk -## Copyright (C) 2005 Norman Rasmussen +## Travis Shirk +## Norman Rasmussen ## Copyright (C) 2006 Stefan Bethge ## Copyright (C) 2007 Julien Pivotto +## Stephan Erb ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 sys import re import copy import defs @@ -44,6 +51,16 @@ opt_treat_incoming_messages = ['', 'chat', 'normal'] class Config: DEFAULT_ICONSET = 'dcraven' + if sys.platform == 'darwin': + DEFAULT_OPENWITH = 'open' + DEFAULT_BROWSER = 'open -a Safari' + DEFAULT_MAILAPP = 'open -a Mail' + DEFAULT_FILE_MANAGER = 'open -a Finder' + else: + DEFAULT_OPENWITH = 'gnome-open' + DEFAULT_BROWSER = 'firefox' + DEFAULT_MAILAPP = 'mozilla-thunderbird -compose' + DEFAULT_FILE_MANAGER = 'xffm' __options = { # name: [ type, default_value, help_string ] @@ -102,10 +119,10 @@ class Config: 'sounds_on': [ opt_bool, True ], # 'aplay', 'play', 'esdplay', 'artsplay' detected first time only 'soundplayer': [ opt_str, '' ], - 'openwith': [ opt_str, 'gnome-open' ], - 'custombrowser': [ opt_str, 'firefox' ], - 'custommailapp': [ opt_str, 'mozilla-thunderbird -compose' ], - 'custom_file_manager': [ opt_str, 'xffm' ], + 'openwith': [ opt_str, DEFAULT_OPENWITH ], + 'custombrowser': [ opt_str, DEFAULT_BROWSER ], + 'custommailapp': [ opt_str, DEFAULT_MAILAPP ], + 'custom_file_manager': [ opt_str, DEFAULT_FILE_MANAGER ], 'gc-hpaned-position': [opt_int, 430], 'gc_refer_to_nick_char': [opt_str, ',', _('Character to add after nickname when using nick completion (tab) in group chat.')], 'gc_proposed_nick_char': [opt_str, '_', _('Character to propose to add after desired nickname when desired nickname is used by someone else in group chat.')], @@ -127,7 +144,7 @@ class Config: 'single-msg-height': [opt_int, 280], 'roster_x-position': [ opt_int, 0 ], 'roster_y-position': [ opt_int, 0 ], - 'roster_width': [ opt_int, 150 ], + 'roster_width': [ opt_int, 200 ], 'roster_height': [ opt_int, 400 ], 'latest_disco_addresses': [ opt_str, '' ], 'recently_groupchat': [ opt_str, '' ], @@ -136,9 +153,10 @@ class Config: 'after_nickname': [ opt_str, ':', _('Characters that are printed after the nickname in conversations') ], 'send_os_info': [ opt_bool, True ], 'set_status_msg_from_current_music_track': [ opt_bool, False ], + 'set_status_msg_from_lastfm': [ opt_bool, False, _('If checked, Gajim can regularly poll a Last.fm account and adjust the status message to reflect recently played songs. set_status_msg_from_current_music_track option must be False.') ], + 'lastfm_username': [ opt_str, '', _('The username used to identify the Last.fm account.')], 'notify_on_new_gmail_email': [ opt_bool, True ], 'notify_on_new_gmail_email_extra': [ opt_bool, False ], - 'usegpg': [ opt_bool, False, '', True ], 'use_gpg_agent': [ opt_bool, False ], 'change_roster_title': [ opt_bool, True, _('Add * and [n] in roster title?')], 'restore_lines': [opt_int, 4, _('How many lines to remember from previous conversation when a chat tab/window is reopened.')], @@ -175,6 +193,8 @@ class Config: 'tabs_always_visible': [opt_bool, False, _('Show tab when only one conversation?')], 'tabs_border': [opt_bool, False, _('Show tabbed notebook border in chat windows?')], 'tabs_close_button': [opt_bool, True, _('Show close button in tab?')], + 'log_encrypted_sessions': [opt_bool, False, _('When negotiating an encrypted session, should Gajim assume you want your messages to be logged?')], + 'e2e_public_key': [opt_bool, False, _('When negotiating an encrypted session, should Gajim prefer to use public keys for identification?')], 'chat_avatar_width': [opt_int, 52], 'chat_avatar_height': [opt_int, 52], 'roster_avatar_width': [opt_int, 32], @@ -218,6 +238,7 @@ class Config: 'hide_groupchat_occupants_list': [opt_bool, False, _('Hides the group chat occupants list in group chat window.')], 'chat_merge_consecutive_nickname': [opt_bool, False, _('In a chat, show the nickname at the beginning of a line only when it\'s not the same person talking than in previous message.')], 'chat_merge_consecutive_nickname_indent': [opt_str, ' ', _('Indentation when using merge consecutive nickname.')], + 'use_smooth_scrolling': [opt_bool, True, _('Smooth scroll message in conversation window')], 'gc_nicknames_colors': [ opt_str, '#a34526:#c000ff:#0012ff:#388a99:#045723:#7c7c7c:#ff8a00:#94452d:#244b5a:#32645a', _('List of colors that will be used to color nicknames in group chats.'), True ], 'ctrl_tab_go_to_next_composing': [opt_bool, True, _('Ctrl-Tab go to next composing tab when none is unread.')], 'confirm_metacontacts': [ opt_str, '', _('Should we show the confirm metacontacts creation dialog or not? Empty string means we never show the dialog.')], @@ -235,6 +256,8 @@ class Config: 'subscribe_mood': [opt_bool, True], 'subscribe_activity': [opt_bool, True], 'subscribe_tune': [opt_bool, True], + 'attach_notifications_to_systray': [opt_bool, False, _('If True, notification windows from notification-daemon will be attached to systray icon.')], + 'use_pep': [opt_bool, False, 'temporary variable to enable pep support'], } __options_per_key = { @@ -257,14 +280,14 @@ class Config: 'active': [ opt_bool, True], 'proxy': [ opt_str, '', '', True ], 'keyid': [ opt_str, '', '', True ], + 'gpg_sign_presence': [ opt_bool, True, _('If disabled, don\'t sign presences with GPG key, even if GPG is configured.') ], 'keyname': [ opt_str, '', '', True ], 'usessl': [ opt_bool, False, '', True ], + 'ssl_fingerprint_sha1': [ opt_str, '', '', True ], 'use_srv': [ opt_bool, True, '', True ], 'use_custom_host': [ opt_bool, False, '', True ], 'custom_port': [ opt_int, 5222, '', True ], 'custom_host': [ opt_str, '', '', True ], - 'savegpgpass': [ opt_bool, False, '', True ], - 'gpgpassword': [ opt_str, '' ], 'sync_with_global_status': [ opt_bool, False, ], 'no_log_for': [ opt_str, '' ], 'minimized_gc': [ opt_str, '' ], diff --git a/src/common/configpaths.py b/src/common/configpaths.py index da41fb8d7..516d849ef 100644 --- a/src/common/configpaths.py +++ b/src/common/configpaths.py @@ -79,9 +79,9 @@ class ConfigPaths: # LOG is deprecated k = ( 'LOG', 'LOG_DB', 'VCARD', 'AVATAR', 'MY_EMOTS', - 'MY_ICONSETS' ) + 'MY_ICONSETS', 'MY_CACERTS') v = (u'logs', u'logs.db', u'vcards', u'avatars', u'emoticons', - u'iconsets') + u'iconsets', u'cacerts.pem') if os.name == 'nt': v = map(lambda x: x.capitalize(), v) @@ -102,16 +102,19 @@ class ConfigPaths: # for k, v in paths.iteritems(): # print "%s: %s" % (repr(k), repr(v)) - def init_profile(self, profile): + def init_profile(self, profile = ''): conffile = windowsify(u'config') pidfile = windowsify(u'gajim') + secretsfile = windowsify(u'secrets') if len(profile) > 0: conffile += u'.' + profile pidfile += u'.' + profile + secretsfile += u'.' + profile pidfile += u'.pid' self.add_from_root('CONFIG_FILE', conffile) self.add_from_root('PID_FILE', pidfile) + self.add_from_root('SECRETS_FILE', secretsfile) # for k, v in paths.iteritems(): # print "%s: %s" % (repr(k), repr(v)) diff --git a/src/common/connection.py b/src/common/connection.py index 393a7d741..91c89f220 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -2,26 +2,34 @@ ## ## ## Copyright (C) 2003-2004 Vincent Hanquez -## Copyright (C) 2003-2006 Yann Le Boulanger +## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos -## Copyright (C) 2005-2006 Dimitur Kirov -## Copyright (C) 2005-2006 Travis Shirk +## Dimitur Kirov +## Travis Shirk ## Copyright (C) 2007 Julien Pivotto +## Stephan Erb ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 os import random import socket +import time + try: randomsource = random.SystemRandom() except: @@ -50,39 +58,39 @@ log = logging.getLogger('gajim.c.connection') import gtkgui_helpers -ssl_error = { -2: "Unable to get issuer certificate", -3: "Unable to get certificate CRL", -4: "Unable to decrypt certificate's signature", -5: "Unable to decrypt CRL's signature", -6: "Unable to decode issuer public key", -7: "Certificate signature failure", -8: "CRL signature failure", -9: "Certificate is not yet valid", -10: "Certificate has expired", -11: "CRL is not yet valid", -12: "CRL has expired", -13: "Format error in certificate's notBefore field", -14: "Format error in certificate's notAfter field", -15: "Format error in CRL's lastUpdate field", -16: "Format error in CRL's nextUpdate field", -17: "Out of memory", -18: "Self signed certificate in certificate chain", -19: "Unable to get local issuer certificate", -20: "Unable to verify the first certificate", -21: "Unable to verify the first certificate", -22: "Certificate chain too long", -23: "Certificate revoked", -24: "Invalid CA certificate", -25: "Path length constraint exceeded", -26: "Unsupported certificate purpose", -27: "Certificate not trusted", -28: "Certificate rejected", -29: "Subject issuer mismatch", -30: "Authority and subject key identifier mismatch", -31: "Authority and issuer serial number mismatch", -32: "Key usage does not include certificate signing", -50: "Application verification failure" +ssl_error = { +2: _("Unable to get issuer certificate"), +3: _("Unable to get certificate CRL"), +4: _("Unable to decrypt certificate's signature"), +5: _("Unable to decrypt CRL's signature"), +6: _("Unable to decode issuer public key"), +7: _("Certificate signature failure"), +8: _("CRL signature failure"), +9: _("Certificate is not yet valid"), +10: _("Certificate has expired"), +11: _("CRL is not yet valid"), +12: _("CRL has expired"), +13: _("Format error in certificate's notBefore field"), +14: _("Format error in certificate's notAfter field"), +15: _("Format error in CRL's lastUpdate field"), +16: _("Format error in CRL's nextUpdate field"), +17: _("Out of memory"), +18: _("Self signed certificate in certificate chain"), +19: _("Unable to get local issuer certificate"), +20: _("Unable to verify the first certificate"), +21: _("Unable to verify the first certificate"), +22: _("Certificate chain too long"), +23: _("Certificate revoked"), +24: _("Invalid CA certificate"), +25: _("Path length constraint exceeded"), +26: _("Unsupported certificate purpose"), +27: _("Certificate not trusted"), +28: _("Certificate rejected"), +29: _("Subject issuer mismatch"), +30: _("Authority and subject key identifier mismatch"), +31: _("Authority and issuer serial number mismatch"), +32: _("Key usage does not include certificate signing"), +50: _("Application verification failure") } class Connection(ConnectionHandlers): '''Connection class''' @@ -99,6 +107,8 @@ class Connection(ConnectionHandlers): self.last_connection = None # last ClientCommon instance self.is_zeroconf = False self.gpg = None + if USE_GPG: + self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) self.status = '' self.priority = gajim.get_priority(name, 'offline') self.old_show = '' @@ -109,6 +119,7 @@ class Connection(ConnectionHandlers): 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 @@ -117,7 +128,7 @@ class Connection(ConnectionHandlers): self.last_history_line = {} 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. + # 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() @@ -131,18 +142,13 @@ class Connection(ConnectionHandlers): self.blocked_contacts = [] self.blocked_groups = [] self.pep_supported = False - # Do we continue connection when we get roster (send presence,get vcard...) + # 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} - if USE_GPG: - self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) - gajim.config.set('usegpg', True) - else: - gajim.config.set('usegpg', False) - + self.on_connect_success = None self.on_connect_failure = None self.retrycount = 0 @@ -151,7 +157,7 @@ class Connection(ConnectionHandlers): self.available_transports = {} # list of available transports on this # server {'icq': ['icq.server.com', 'icq2.server.com'], } self.vcard_supported = True - self.metacontacts_supported = True + self.private_storage_supported = True # END __init__ def put_event(self, ev): @@ -171,16 +177,15 @@ class Connection(ConnectionHandlers): self.connected = 1 self.dispatch('STATUS', 'connecting') self.retrycount += 1 - signed = self.get_signed_msg(self.status) self.on_connect_auth = self._init_roster - self.connect_and_init(self.old_show, self.status, signed) + self.connect_and_init(self.old_show, self.status, self.gpg != None) else: # reconnect succeeded self.time_to_reconnect = None self.retrycount = 0 - + # We are doing disconnect at so many places, better use one function in all - def disconnect(self, on_purpose = False): + def disconnect(self, on_purpose=False): #FIXME: set the Tune to None before disconnection per account #gajim.interface.roster._music_track_changed(None, None) self.on_purpose = on_purpose @@ -193,7 +198,7 @@ class Connection(ConnectionHandlers): self.connection.disconnect() self.last_connection = None self.connection = None - + def _disconnectedReconnCB(self): '''Called when we are disconnected''' log.debug('disconnectedReconnCB') @@ -202,8 +207,8 @@ class Connection(ConnectionHandlers): # after we auth to server self.old_show = STATUS_LIST[self.connected] self.connected = 0 - self.dispatch('STATUS', 'offline') if not self.on_purpose: + self.dispatch('STATUS', 'offline') self.disconnect() if gajim.config.get_per('accounts', self.name, 'autoreconnect'): self.connected = -1 @@ -235,7 +240,7 @@ class Connection(ConnectionHandlers): self.disconnect() self.on_purpose = False # END disconenctedReconnCB - + def _connection_lost(self): self.disconnect(on_purpose = False) self.dispatch('STATUS', 'offline') @@ -257,7 +262,63 @@ class Connection(ConnectionHandlers): return is_form = data[2] conf = data[1] - self.dispatch('NEW_ACC_CONNECTED', (conf, is_form)) + if self.new_account_form: + def _on_register_result(result): + if not common.xmpp.isResultNode(result): + self.dispatch('ACC_NOT_OK', (result.getError())) + return + if USE_GPG: + self.gpg = GnuPG.GnuPG(gajim.config.get( + 'use_gpg_agent')) + self.dispatch('ACC_OK', (self.new_account_info)) + self.new_account_info = None + self.new_account_form = None + if self.connection: + self.connection.UnregisterDisconnectHandler( + self._on_new_account) + self.disconnect(on_purpose=True) + # it's the second time we get the form, we have info user + # typed, so send them + if is_form: + #TODO: Check if form has changed + iq = common.xmpp.Iq('set', common.xmpp.NS_REGISTER, to=self._hostname) + iq.setTag('query').addChild(node=self.new_account_form) + self.connection.SendAndCallForResponse(iq, + _on_register_result) + else: + if self.new_account_form.keys().sort() != \ + conf.keys().sort(): + # requested config has changed since first connection + self.dispatch('ACC_NOT_OK', (_( + 'Server %s provided a different registration form')\ + % data[0])) + return + common.xmpp.features_nb.register(self.connection, + self._hostname, self.new_account_form, + _on_register_result) + return + try: + errnum = self.connection.Connection.ssl_errnum + except AttributeError: + errnum = -1 # we don't have an errnum + ssl_msg = '' + if errnum > 0: + if errnum in ssl_error: + ssl_msg = ssl_error[errnum] + else: + ssl_msg = _('Unknown SSL error: %d') % errnum + ssl_cert = '' + if hasattr(self.connection.Connection, 'ssl_cert_pem'): + ssl_cert = self.connection.Connection.ssl_cert_pem + ssl_fingerprint = '' + if hasattr(self.connection.Connection, 'ssl_fingerprint_sha1'): + ssl_fingerprint = \ + self.connection.Connection.ssl_fingerprint_sha1 + self.dispatch('NEW_ACC_CONNECTED', (conf, is_form, ssl_msg, + ssl_cert, ssl_fingerprint)) + self.connection.UnregisterDisconnectHandler( + self._on_new_account) + self.disconnect(on_purpose=True) return if not data[1]: # wrong answer self.dispatch('ERROR', (_('Invalid answer'), @@ -477,7 +538,6 @@ class Connection(ConnectionHandlers): con.RegisterDisconnectHandler(self._disconnectedReconnCB) log.debug(_('Connected to server %s:%s with %s') % (self._current_host['host'], self._current_host['port'], con_type)) - self._register_handlers(con, con_type) name = gajim.config.get_per('accounts', self.name, 'name') hostname = gajim.config.get_per('accounts', self.name, 'hostname') @@ -487,14 +547,31 @@ class Connection(ConnectionHandlers): except AttributeError: errnum = -1 # we don't have an errnum if errnum > 0: - # FIXME: tell the user that the certificat is untrusted, and ask him what to do - try: - log.warning("The authenticity of the "+hostname+" certificate could be unvalid.\nSSL Error: "+ssl_error[errnum]) - except KeyError: - log.warning("Unknown SSL error: %d" % errnum) + text = _('The authenticity of the %s certificate could be invalid.') %\ + hostname + if errnum in ssl_error: + text += _('\nSSL Error: %s') % ssl_error[errnum] + else: + text += _('\nUnknown SSL error: %d') % errnum + self.dispatch('SSL_ERROR', (text, con.Connection.ssl_cert_pem, + con.Connection.ssl_fingerprint_sha1)) + return True + if hasattr(con.Connection, 'ssl_fingerprint_sha1'): + saved_fingerprint = gajim.config.get_per('accounts', self.name, 'ssl_fingerprint_sha1') + if saved_fingerprint: + # Check sha1 fingerprint + if con.Connection.ssl_fingerprint_sha1 != saved_fingerprint: + self.dispatch('FINGERPRINT_ERROR', + (con.Connection.ssl_fingerprint_sha1,)) + return True + self._register_handlers(con, con_type) con.auth(name, self.password, self.server_resource, 1, self.__on_auth) - return True + + def ssl_certificate_accepted(self): + name = gajim.config.get_per('accounts', self.name, 'name') + self._register_handlers(self.connection, 'ssl') + self.connection.auth(name, self.password, self.server_resource, 1, self.__on_auth) def _register_handlers(self, con, con_type): self.peerhost = con.get_peerhost() @@ -528,13 +605,13 @@ class Connection(ConnectionHandlers): self.on_connect_auth(con) self.on_connect_auth = None else: - # Forget password if needed - if not gajim.config.get_per('accounts', self.name, 'savepass'): - self.password = None + # Forget password, it's wrong + self.password = None gajim.log.debug("Couldn't authenticate to %s" % self._hostname) self.disconnect(on_purpose = True) self.dispatch('STATUS', 'offline') - self.dispatch('ERROR', (_('Authentication failed with "%s"') % self._hostname, + self.dispatch('ERROR', (_('Authentication failed with "%s"') % \ + self._hostname, _('Please check your login and password for correctness.'))) if self.on_connect_auth: self.on_connect_auth(None) @@ -543,8 +620,8 @@ class Connection(ConnectionHandlers): def quit(self, kill_core): if kill_core and gajim.account_is_connected(self.name): - self.disconnect(on_purpose = True) - + self.disconnect(on_purpose=True) + def get_privacy_lists(self): if not self.connection: return @@ -570,7 +647,7 @@ class Connection(ConnectionHandlers): if not self.connection: return common.xmpp.features_nb.getActiveAndDefaultPrivacyLists(self.connection) - + def del_privacy_list(self, privacy_list): if not self.connection: return @@ -584,17 +661,17 @@ class Connection(ConnectionHandlers): 'again.') % privacy_list)) common.xmpp.features_nb.delPrivacyList(self.connection, privacy_list, _on_del_privacy_list_result) - + def get_privacy_list(self, title): if not self.connection: return common.xmpp.features_nb.getPrivacyList(self.connection, title) - + def set_privacy_list(self, listname, tags): if not self.connection: return common.xmpp.features_nb.setPrivacyList(self.connection, listname, tags) - + def set_active_list(self, listname): if not self.connection: return @@ -604,7 +681,7 @@ class Connection(ConnectionHandlers): if not self.connection: return common.xmpp.features_nb.setDefaultPrivacyList(self.connection, listname) - + def build_privacy_rule(self, name, action): '''Build a Privacy rule stanza for invisibility''' iq = common.xmpp.Iq('set', common.xmpp.NS_PRIVACY, xmlns = '') @@ -657,7 +734,7 @@ class Connection(ConnectionHandlers): #Get bookmarks from private namespace self.get_bookmarks() - + #Get annotations self.get_annotations() @@ -665,29 +742,37 @@ class Connection(ConnectionHandlers): self.dispatch('SIGNED_IN', ()) def test_gpg_passphrase(self, password): + 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 return signed != 'BAD_PASSPHRASE' - def get_signed_msg(self, msg): + 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 USE_GPG: + if keyID and self.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: + if 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)) - elif self.gpg.passphrase is not None or use_gpg_agent: + return None + if self.gpg.passphrase is not None or use_gpg_agent: signed = self.gpg.sign(msg, keyID) if signed == 'BAD_PASSPHRASE': + self.gpg = None signed = '' - if self.connected < 2: - self.dispatch('BAD_PASSPHRASE', ()) + self.dispatch('BAD_PASSPHRASE', ()) return signed def connect_and_auth(self): @@ -695,21 +780,22 @@ class Connection(ConnectionHandlers): self.on_connect_failure = self._connect_failure self.connect() - def connect_and_init(self, show, msg, signed): - self.continue_connect_info = [show, msg, signed] + def connect_and_init(self, show, msg, sign_msg): + self.continue_connect_info = [show, msg, sign_msg] self.on_connect_auth = self._init_roster self.connect_and_auth() def _init_roster(self, con): self.connection = con - if self.connection: - con.set_send_timeout(self.keepalives, self.send_keepalive) - self.connection.onreceive(None) - iq = common.xmpp.Iq('get', common.xmpp.NS_PRIVACY, xmlns = '') - id = self.connection.getAnID() - iq.setID(id) - self.awaiting_answers[id] = (PRIVACY_ARRIVED, ) - self.connection.send(iq) + if not self.connection: + return + self.connection.set_send_timeout(self.keepalives, self.send_keepalive) + self.connection.onreceive(None) + iq = common.xmpp.Iq('get', common.xmpp.NS_PRIVACY, xmlns = '') + id = self.connection.getAnID() + iq.setID(id) + self.awaiting_answers[id] = (PRIVACY_ARRIVED, ) + self.connection.send(iq) def send_custom_status(self, show, msg, jid): if not show in STATUS_LIST: @@ -726,7 +812,7 @@ class Connection(ConnectionHandlers): if msg: p.setStatus(msg) else: - signed = self.get_signed_msg(msg) + signed = self.get_signed_presence(msg) priority = unicode(gajim.get_priority(self.name, sshow)) p = common.xmpp.Presence(typ = None, priority = priority, show = sshow, to = jid) @@ -744,15 +830,15 @@ class Connection(ConnectionHandlers): if not msg: msg = '' keyID = gajim.config.get_per('accounts', self.name, 'keyid') - signed = '' + sign_msg = False if not auto and not show == 'offline': - signed = self.get_signed_msg(msg) + sign_msg = True self.status = msg if show != 'offline' and not self.connected: # 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.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. @@ -761,7 +847,9 @@ class Connection(ConnectionHandlers): safe_substitute({ 'hostname': socket.gethostname() }) - self.connect_and_init(show, msg, signed) + if USE_GPG: + self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) + self.connect_and_init(show, msg, sign_msg) elif show == 'offline': self.connected = 0 @@ -785,6 +873,7 @@ class Connection(ConnectionHandlers): was_invisible = self.connected == STATUS_LIST.index('invisible') self.connected = STATUS_LIST.index(show) if show == 'invisible': + signed = self.get_signed_presence(msg) self.send_invisible_presence(msg, signed) return if was_invisible and self.privacy_rules_supported: @@ -796,6 +885,7 @@ class Connection(ConnectionHandlers): 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: @@ -820,21 +910,21 @@ class Connection(ConnectionHandlers): self.connection.send(msg_iq) - 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, forward_from = None): + 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): if not self.connection: return 1 if msg and not xhtml and gajim.config.get('rst_formatting_outgoing_messages'): xhtml = create_xhtml(msg) - if not msg and chatstate is None: + if not msg and chatstate is None and form_node is None: return 2 fjid = jid if resource: fjid += '/' + resource msgtxt = msg msgenc = '' - if keyID and USE_GPG: + if keyID and self.gpg: #encrypt msgenc, error = self.gpg.encrypt(msg, [keyID]) if msgenc and not error: @@ -866,12 +956,15 @@ class Connection(ConnectionHandlers): if msgenc: msg_iq.setTag(common.xmpp.NS_ENCRYPTED + ' x').setData(msgenc) + if form_node: + msg_iq.addChild(node=form_node) + # JEP-0172: user_nickname if user_nick: msg_iq.setTag('nick', namespace = common.xmpp.NS_NICK).setData( user_nick) - # chatstates - if peer supports jep85 or jep22, send chatstates + # 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: @@ -888,16 +981,25 @@ class Connection(ConnectionHandlers): 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 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}) + 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) + self.connection.send(msg_iq) - if not forward_from: + if not forward_from and session.is_loggable(): no_log_for = gajim.config.get_per('accounts', self.name, 'no_log_for')\ .split() ji = gajim.get_jid_without_resource(jid) @@ -914,14 +1016,14 @@ class Connection(ConnectionHandlers): gajim.logger.write(kind, jid, log_msg) except exceptions.PysqliteOperationalError, e: self.dispatch('ERROR', (_('Disk Write Error'), str(e))) - self.dispatch('MSGSENT', (jid, msg, keyID)) - + self.dispatch('MSGSENT', (jid, msg, keyID)) + def send_stanza(self, stanza): ''' send a stanza untouched ''' if not self.connection: return self.connection.send(stanza) - + def ack_subscribed(self, jid): if not self.connection: return @@ -1007,21 +1109,6 @@ class Connection(ConnectionHandlers): groups = groups) def send_new_account_infos(self, form, is_form): - def _on_register_result(result): - if not common.xmpp.isResultNode(result): - self.dispatch('ACC_NOT_OK', (result.getError())) - return - if USE_GPG: - self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) - gajim.config.set('usegpg', True) - else: - gajim.config.set('usegpg', False) - gajim.connections[self.name] = self - self.dispatch('ACC_OK', (self.new_account_info)) - self.new_account_info = None - if self.connection: - self.connection.UnregisterDisconnectHandler(self._on_new_account) - self.disconnect(on_purpose=True) if is_form: # Get username and password and put them in new_account_info for field in self._data_form.iter_fields(): @@ -1029,17 +1116,14 @@ class Connection(ConnectionHandlers): self.new_account_info['name'] = field.value if field.var == 'password': self.new_account_info['password'] = field.value - iq=Iq('set', NS_REGISTER, to = self._hostname) - iq.setTag('query').addChild(node = form) - self.connection.SendAndCallForResponse(iq, _on_register_result) else: # Get username and password and put them in new_account_info if form.has_key('username'): self.new_account_info['name'] = form['username'] if form.has_key('password'): self.new_account_info['password'] = form['password'] - common.xmpp.features_nb.register(self.connection, self._hostname, - form, _on_register_result) + self.new_account_form = form + self.new_account(self.name, self.new_account_info) def new_account(self, name, config, sync = False): # If a connection already exist we cannot create a new account @@ -1204,6 +1288,20 @@ class Connection(ConnectionHandlers): p = self.add_sha(p, ptype != 'unavailable') self.connection.send(p) + def check_unique_room_id_support(self, server, instance): + if not self.connection: + return + iq = common.xmpp.Iq(typ = 'get', to = server) + iq.setAttr('id', 'unique1') + iq.addChild('unique', namespace=common.xmpp.NS_MUC_UNIQUE) + def _on_response(resp): + if not common.xmpp.isResultNode(resp): + self.dispatch('UNIQUE_ROOM_ID_UNSUPPORTED', (server, instance)) + return + self.dispatch('UNIQUE_ROOM_ID_SUPPORTED', (server, instance, + resp.getTag('unique').getData())) + self.connection.SendAndCallForResponse(iq, _on_response) + def join_gc(self, nick, room_jid, password): # FIXME: This room JID needs to be normalized; see #1364 if not self.connection: @@ -1222,10 +1320,15 @@ class Connection(ConnectionHandlers): self.connection.send(p) # last date/time in history to avoid duplicate - if not self.last_history_line.has_key(room_jid): + if not self.last_history_line.has_key(room_jid): # Not in memory, get it from DB - last_log = gajim.logger.get_last_date_that_has_logs(room_jid, - is_room = True) + last_log = None + no_log_for = gajim.config.get_per('accounts', self.name, 'no_log_for')\ + .split() + if self.name not in no_log_for and room_jid not in no_log_for: + # Do not check if we are not logging for this room + last_log = gajim.logger.get_last_date_that_has_logs(room_jid, + is_room = True) if last_log is None: last_log = 0 self.last_history_line[room_jid]= last_log @@ -1280,7 +1383,7 @@ class Connection(ConnectionHandlers): # send instantly so when we go offline, status is sent to gc before we # disconnect from jabber server self.connection.send(p) - # Save the time we quit to avoid duplicate logs AND be faster than + # Save the time we quit to avoid duplicate logs AND be faster than # get that date from DB self.last_history_line[jid] = time_time() @@ -1341,7 +1444,7 @@ class Connection(ConnectionHandlers): self.connection.send(iq) def gpg_passphrase(self, passphrase): - if USE_GPG: + if self.gpg: use_gpg_agent = gajim.config.get('use_gpg_agent') if use_gpg_agent: self.gpg.passphrase = None @@ -1349,13 +1452,13 @@ class Connection(ConnectionHandlers): self.gpg.passphrase = passphrase def ask_gpg_keys(self): - if USE_GPG: + if self.gpg: keys = self.gpg.get_keys() return keys return None def ask_gpg_secrete_keys(self): - if USE_GPG: + if self.gpg: keys = self.gpg.get_secret_keys() return keys return None @@ -1390,11 +1493,13 @@ class Connection(ConnectionHandlers): else: _on_unregister_account_connect(self.connection) - def send_invite(self, room, to, reason=''): + def send_invite(self, room, to, reason='', continue_tag=False): '''sends invitation''' message=common.xmpp.Message(to = room) c = message.addChild(name = 'x', namespace = common.xmpp.NS_MUC_USER) c = c.addChild(name = 'invite', attrs={'to' : to}) + if continue_tag: + c.addChild(name = 'continue') if reason != '': c.setTagData('reason', reason) self.connection.send(message) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 1451da0a8..6423d4154 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -2,20 +2,25 @@ ## Copyright (C) 2006 Gajim Team ## ## Contributors for this file: -## - Yann Le Boulanger +## - Yann Leboulanger ## - Nikos Kouremenos ## - Dimitur Kirov ## - Travis Shirk ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 os import base64 @@ -24,7 +29,7 @@ import socket import sys from time import (altzone, daylight, gmtime, localtime, mktime, strftime, - time as time_time, timezone, tzname) + time as time_time, timezone, tzname) from calendar import timegm import socks5 @@ -45,6 +50,8 @@ if dbus_support.supported: import dbus from music_track_listener import MusicTrackListener +from common.stanza_session import EncryptedStanzaSession + STATUS_LIST = ['offline', 'connecting', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible', 'error'] # kind of events we can wait for an answer @@ -64,8 +71,8 @@ except: class ConnectionBytestream: def __init__(self): self.files_props = {} - - def is_transfer_stoped(self, file_props): + + def is_transfer_stopped(self, file_props): if file_props.has_key('error') and file_props['error'] != 0: return True if file_props.has_key('completed') and file_props['completed']: @@ -94,7 +101,7 @@ class ConnectionBytestream: def remove_transfers_for_contact(self, contact): ''' stop all active transfer for contact ''' for file_props in self.files_props.values(): - if self.is_transfer_stoped(file_props): + if self.is_transfer_stopped(file_props): continue receiver_jid = unicode(file_props['receiver']).split('/')[0] if contact.jid == receiver_jid: @@ -182,11 +189,7 @@ class ConnectionBytestream: ft_add_hosts_to_send = map(lambda e:e.strip(), 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)) + ft_add_hosts.append(ft_host) listener = gajim.socks5queue.start_listener(port, sha_str, self._result_socks5_sid, file_props['sid']) if listener == None: @@ -212,17 +215,16 @@ class ConnectionBytestream: ostreamhost.setAttr('port', unicode(port)) ostreamhost.setAttr('host', ft_host) ostreamhost.setAttr('jid', sender) - for thehost in self.peerhost: - try: - 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) - except socket.gaierror: - self.dispatch('ERROR', (_('Wrong host'), - _('Invalid local address? :-O'))) + try: + 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) + except socket.gaierror: + self.dispatch('ERROR', (_('Wrong host'), + _('Invalid local address? :-O'))) if fast and proxyhosts != [] and gajim.config.get_per('accounts', self.name, 'use_ft_proxies'): @@ -353,7 +355,7 @@ class ConnectionBytestream: iq.setID(auth_id) query = iq.setTag('query') query.setNamespace(common.xmpp.NS_BYTESTREAM) - query.setAttr('sid', proxy['sid']) + query.setAttr('sid', proxy['sid']) activate = query.setTag('activate') activate.setData(file_props['proxy_receiver']) iq.setID(auth_id) @@ -444,7 +446,7 @@ class ConnectionBytestream: gajim.proxy65_manager.resolve_result(frm, query) try: - streamhost = query.getTag('streamhost-used') + streamhost = query.getTag('streamhost-used') except: # this bytestream result is not what we need pass id = real_id[3:] @@ -473,7 +475,10 @@ class ConnectionBytestream: raise common.xmpp.NodeProcessed if real_id[:3] == 'au_': - gajim.socks5queue.send_file(file_props, self.name) + if file.has_key('stopped') and file_props['stopped']: + self.remove_transfer(file_props) + else: + gajim.socks5queue.send_file(file_props, self.name) raise common.xmpp.NodeProcessed proxy = None @@ -495,7 +500,10 @@ class ConnectionBytestream: raise common.xmpp.NodeProcessed else: - gajim.socks5queue.send_file(file_props, self.name) + if file_props.has_key('stopped') and file_props['stopped']: + self.remove_transfer(file_props) + else: + gajim.socks5queue.send_file(file_props, self.name) if file_props.has_key('fast'): fasts = file_props['fast'] if len(fasts) > 0: @@ -657,7 +665,8 @@ class ConnectionDisco: common.xmpp.NS_DISCO, frm = to) iq.setAttr('id', id) query = iq.setTag('query') - query.setAttr('node','http://gajim.org/caps#' + gajim.version) + query.setAttr('node','http://gajim.org/caps#' + gajim.version.split('-', + 1)[0]) for f in (common.xmpp.NS_BYTESTREAM, common.xmpp.NS_SI, \ common.xmpp.NS_FILE, common.xmpp.NS_COMMANDS): feature = common.xmpp.Node('feature') @@ -709,8 +718,10 @@ class ConnectionDisco: def _DiscoverItemsGetCB(self, con, iq_obj): gajim.log.debug('DiscoverItemsGetCB') + if self.commandItemsQuery(con, iq_obj): + raise common.xmpp.NodeProcessed node = iq_obj.getTagAttr('query', 'node') - if node is None: + if node is None: result = iq_obj.buildReply('result') self.connection.send(result) raise common.xmpp.NodeProcessed @@ -723,7 +734,7 @@ class ConnectionDisco: q = iq_obj.getTag('query') node = q.getAttr('node') - if self.commandQuery(con, iq_obj): + if self.commandInfoQuery(con, iq_obj): raise common.xmpp.NodeProcessed else: @@ -736,7 +747,8 @@ class ConnectionDisco: extension = None if node and node.find('#') != -1: extension = node[node.index('#') + 1:] - client_version = 'http://gajim.org/caps#' + gajim.version + client_version = 'http://gajim.org/caps#' + gajim.version.split('-', + 1)[0] if node in (None, client_version): q.addChild('feature', attrs = {'var': common.xmpp.NS_BYTESTREAM}) @@ -745,12 +757,14 @@ class ConnectionDisco: q.addChild('feature', attrs = {'var': common.xmpp.NS_MUC}) q.addChild('feature', attrs = {'var': common.xmpp.NS_COMMANDS}) q.addChild('feature', attrs = {'var': common.xmpp.NS_DISCO_INFO}) - q.addChild('feature', attrs = {'var': common.xmpp.NS_ACTIVITY}) - q.addChild('feature', attrs = {'var': common.xmpp.NS_ACTIVITY + '+notify'}) - q.addChild('feature', attrs = {'var': common.xmpp.NS_TUNE}) - q.addChild('feature', attrs = {'var': common.xmpp.NS_TUNE + '+notify'}) - q.addChild('feature', attrs = {'var': common.xmpp.NS_MOOD}) - q.addChild('feature', attrs = {'var': common.xmpp.NS_MOOD + '+notify'}) + if gajim.config.get('use_pep'): + q.addChild('feature', attrs = {'var': common.xmpp.NS_ACTIVITY}) + q.addChild('feature', attrs = {'var': common.xmpp.NS_ACTIVITY + '+notify'}) + q.addChild('feature', attrs = {'var': common.xmpp.NS_TUNE}) + q.addChild('feature', attrs = {'var': common.xmpp.NS_TUNE + '+notify'}) + q.addChild('feature', attrs = {'var': common.xmpp.NS_MOOD}) + q.addChild('feature', attrs = {'var': common.xmpp.NS_MOOD + '+notify'}) + q.addChild('feature', attrs = {'var': common.xmpp.NS_ESESSION_INIT}) if (node is None or extension == 'cstates') and gajim.config.get('outgoing_chat_state_notifactions') != 'disabled': q.addChild('feature', attrs = {'var': common.xmpp.NS_CHATSTATES}) @@ -792,12 +806,12 @@ class ConnectionDisco: for key in i.getAttrs().keys(): attr[key] = i.getAttr(key) if attr.has_key('category') and \ - attr['category'] in ('gateway', 'headline') and \ - attr.has_key('type'): + attr['category'] in ('gateway', 'headline') and \ + attr.has_key('type'): transport_type = attr['type'] if attr.has_key('category') and \ - attr['category'] == 'conference' and \ - attr.has_key('type') and attr['type'] == 'text': + attr['category'] == 'conference' and \ + attr.has_key('type') and attr['type'] == 'text': is_muc = True identities.append(attr) elif i.getName() == 'feature': @@ -868,7 +882,7 @@ class ConnectionVcard: if len(ext): c.setAttr('ext', ' '.join(ext)) - c.setAttr('ver', gajim.version) + c.setAttr('ver', gajim.version.split('-', 1)[0]) return p def node_to_dict(self, node): @@ -1082,6 +1096,10 @@ class ConnectionVcard: tag = meta.getAttr('tag') data = {'jid': jid} order = meta.getAttr('order') + try: + order = int(order) + except: + order = 0 if order != None: data['order'] = order if meta_list.has_key(tag): @@ -1090,7 +1108,8 @@ class ConnectionVcard: meta_list[tag] = [data] self.dispatch('METACONTACTS', meta_list) else: - self.metacontacts_supported = False + if iq_obj.getErrorCode() not in ('403', '406', '404'): + self.private_storage_supported = False # We can now continue connection by requesting the roster self.connection.initRoster() elif self.awaiting_answers[id][0] == PRIVACY_ARRIVED: @@ -1207,7 +1226,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, ConnectionBytestream.__init__(self) ConnectionCommands.__init__(self) ConnectionPubSub.__init__(self) - self.gmail_url=None + self.gmail_url = None # List of IDs we are waiting answers for {id: (type_of_request, data), } self.awaiting_answers = {} # List of IDs that will produce a timeout is answer doesn't arrive @@ -1216,14 +1235,17 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, # keep the jids we auto added (transports contacts) to not send the # SUBSCRIBED event to gui self.automatically_added = [] - # keep the latest subscribed event for each jid to prevent loop when we + # keep the latest subscribed event for each jid to prevent loop when we # acknoledge presences self.subscribed_events = {} + + # keep track of sessions this connection has with other JIDs + self.sessions = {} try: idle.init() except: HAS_IDLE = False - + def build_http_auth_answer(self, iq_obj, answer): if answer == 'yes': self.connection.send(iq_obj.buildReply('result')) @@ -1245,6 +1267,33 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, self.dispatch('HTTP_AUTH', (method, url, id, iq_obj, msg)); raise common.xmpp.NodeProcessed + def _FeatureNegCB(self, con, stanza, session): + gajim.log.debug('FeatureNegCB') + feature = stanza.getTag(name='feature', namespace=common.xmpp.NS_FEATURE) + form = common.xmpp.DataForm(node=feature.getTag('x')) + + if form['FORM_TYPE'] == 'urn:xmpp:ssn': + self.dispatch('SESSION_NEG', (stanza.getFrom(), session, form)) + else: + reply = stanza.buildReply() + reply.setType('error') + + reply.addChild(feature) + reply.addChild(node=xmpp.ErrorNode('service-unavailable', typ='cancel')) + + con.send(reply) + + raise common.xmpp.NodeProcessed + + def _InitE2ECB(self, con, stanza, session): + gajim.log.debug('InitE2ECB') + init = stanza.getTag(name='init', namespace=common.xmpp.NS_ESESSION_INIT) + form = common.xmpp.DataForm(node=init.getTag('x')) + + self.dispatch('SESSION_NEG', (stanza.getFrom(), session, form)) + + raise common.xmpp.NodeProcessed + def _ErrorCB(self, con, iq_obj): gajim.log.debug('ErrorCB') if iq_obj.getQueryNS() == common.xmpp.NS_VERSION: @@ -1313,7 +1362,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if storage_tag: ns = storage_tag.getNamespace() if ns == 'storage:metacontacts': - self.metacontacts_supported = False + self.private_storage_supported = False # Private XML Storage (XEP49) is not supported by server # Continue connecting self.connection.initRoster() @@ -1321,10 +1370,10 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, def _rosterSetCB(self, con, iq_obj): gajim.log.debug('rosterSetCB') for item in iq_obj.getTag('query').getChildren(): - jid = helpers.parse_jid(item.getAttr('jid')) + jid = helpers.parse_jid(item.getAttr('jid')) name = item.getAttr('name') - sub = item.getAttr('subscription') - ask = item.getAttr('ask') + sub = item.getAttr('subscription') + ask = item.getAttr('ask') groups = [] for group in item.getTags('group'): groups.append(group.getData()) @@ -1399,7 +1448,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, qp = iq_obj.getTag('query') qp.setTagData('utc', strftime('%Y%m%dT%T', gmtime())) qp.setTagData('tz', tzname[daylight]) - qp.setTagData('display', strftime('%c', localtime())) + qp.setTagData('display', helpers.decode_string(strftime('%c', + localtime()))) self.connection.send(iq_obj) raise common.xmpp.NodeProcessed @@ -1407,7 +1457,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, gajim.log.debug('TimeRevisedCB') iq_obj = iq_obj.buildReply('result') qp = iq_obj.setTag('time', - namespace=common.xmpp.NS_TIME_REVISED) + namespace=common.xmpp.NS_TIME_REVISED) qp.setTagData('utc', strftime('%Y-%m-%dT%TZ', gmtime())) zone = -(timezone, altzone)[daylight] / 60 tzo = (zone / 60, abs(zone % 60)) @@ -1460,6 +1510,19 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, def _messageCB(self, con, msg): '''Called when we receive a message''' + frm = helpers.get_full_jid_from_iq(msg) + mtype = msg.getType() + thread_id = msg.getThread() + + if not mtype: + mtype = 'normal' + + if not mtype == 'groupchat': + session = self.get_session(frm, thread_id, mtype) + + if thread_id and not session.received_thread_id: + session.received_thread_id = True + # check if the message is pubsub#event if msg.getTag('event') is not None: self._pubsubEventCB(con, msg) @@ -1469,9 +1532,31 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, common.xmpp.NS_HTTP_AUTH: self._HttpAuthCB(con, msg) return + if msg.getTag('feature') and msg.getTag('feature').namespace == \ + common.xmpp.NS_FEATURE: + if gajim.HAVE_PYCRYPTO: + self._FeatureNegCB(con, msg, session) + return + if msg.getTag('init') and msg.getTag('init').namespace == \ + common.xmpp.NS_ESESSION_INIT: + self._InitE2ECB(con, msg, session) + + encrypted = False + tim = msg.getTimestamp() + tim = helpers.datetime_tuple(tim) + tim = localtime(timegm(tim)) + + e2e_tag = msg.getTag('c', namespace = common.xmpp.NS_STANZA_CRYPTO) + if e2e_tag: + encrypted = True + + try: + msg = session.decrypt_stanza(msg) + except: + self.dispatch('FAILED_DECRYPT', (frm, tim)) + msgtxt = msg.getBody() msghtml = msg.getXHTML() - mtype = msg.getType() subject = msg.getSubject() # if not there, it's None tim = msg.getTimestamp() tim = helpers.datetime_tuple(tim) @@ -1490,7 +1575,6 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if not no_log_for: no_log_for = '' no_log_for = no_log_for.split() - encrypted = False chatstate = None encTag = msg.getTag('x', namespace = common.xmpp.NS_ENCRYPTED) decmsg = '' @@ -1510,8 +1594,17 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, for xtag in xtags: if xtag.getNamespace() == common.xmpp.NS_CONFERENCE and not invite: room_jid = xtag.getAttr('jid') - self.dispatch('GC_INVITATION', (room_jid, frm, '', None)) + is_continued = False + if xtag.getTag('continue'): + is_continued = True + self.dispatch('GC_INVITATION', (room_jid, frm, '', None, + is_continued)) return + form_node = None + for xtag in xtags: + if xtag.getNamespace() == common.xmpp.NS_DATA: + form_node = xtag + break # chatstates - look for chatstate tags in a message if not delayed if not delayed: composing_xep = False @@ -1537,10 +1630,12 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if encTag and GnuPG.USE_GPG: #decrypt encmsg = encTag.getData() - + keyID = gajim.config.get_per('accounts', self.name, 'keyid') if keyID: decmsg = self.gpg.decrypt(encmsg, keyID) + # \x00 chars are not allowed in C (so in GTK) + decmsg = decmsg.replace('\x00', '') if decmsg: msgtxt = decmsg encrypted = True @@ -1549,7 +1644,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if not error_msg: error_msg = msgtxt msgtxt = None - if self.name not in no_log_for: + if session.is_loggable(): try: gajim.logger.write('error', frm, error_msg, tim = tim, subject = subject) @@ -1565,20 +1660,21 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if subject != None: self.dispatch('GC_SUBJECT', (frm, subject, msgtxt, has_timestamp)) else: + statusCode = msg.getStatusCode() if not msg.getTag('body'): #no # It could be a config change. See # http://www.xmpp.org/extensions/xep-0045.html#roomconfig-notify if msg.getTag('x'): - statusCode = msg.getStatusCode() if statusCode != []: self.dispatch('GC_CONFIG_CHANGE', (jid, statusCode)) return # Ignore message from room in which we are not if not self.last_history_line.has_key(jid): return - self.dispatch('GC_MSG', (frm, msgtxt, tim, has_timestamp, msghtml)) - if self.name not in no_log_for and not int(float(mktime(tim)))\ - <= self.last_history_line[jid] and msgtxt: + self.dispatch('GC_MSG', (frm, msgtxt, tim, has_timestamp, msghtml, + statusCode)) + if self.name not in no_log_for and jid not in no_log_for and not \ + int(float(mktime(tim))) <= self.last_history_line[jid] and msgtxt: try: gajim.logger.write('gc_msg', frm, msgtxt, tim = tim) except exceptions.PysqliteOperationalError, e: @@ -1587,8 +1683,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, elif mtype == 'chat': # it's type 'chat' if not msg.getTag('body') and chatstate is None: #no return - if msg.getTag('body') and self.name not in no_log_for and jid not in\ - no_log_for and msgtxt: + if msg.getTag('body') and session.is_loggable() and msgtxt: try: msg_id = gajim.logger.write('chat_msg_recv', frm, msgtxt, tim = tim, subject = subject) @@ -1601,9 +1696,13 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, reason = item.getTagData('reason') item = invite.getTag('password') password = invite.getTagData('password') - self.dispatch('GC_INVITATION',(frm, jid_from, reason, password)) + is_continued = False + if invite.getTag('invite').getTag('continue'): + is_continued = True + self.dispatch('GC_INVITATION',(frm, jid_from, reason, password, + is_continued)) return - if self.name not in no_log_for and jid not in no_log_for and msgtxt: + if session.is_loggable()and msgtxt: try: gajim.logger.write('single_msg_recv', frm, msgtxt, tim = tim, subject = subject) @@ -1614,9 +1713,87 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if treat_as: mtype = treat_as self.dispatch('MSG', (frm, msgtxt, tim, encrypted, mtype, - subject, chatstate, msg_id, composing_xep, user_nick, msghtml)) + subject, chatstate, msg_id, composing_xep, user_nick, msghtml, + session, form_node)) # END messageCB + def get_session(self, jid, thread_id, type): + '''returns an existing session between this connection and 'jid', returns a new one if none exist.''' + session = self.find_session(jid, thread_id, type) + + if session: + return session + else: + # it's possible we initiated a session with a bare JID and this is the + # first time we've seen a resource + bare_jid = gajim.get_jid_without_resource(jid) + if bare_jid != jid: + session = self.find_session(bare_jid, thread_id, type) + if session: + if not session.received_thread_id: + thread_id = session.thread_id + + self.move_session(bare_jid, thread_id, jid.split("/")[1]) + return session + + return self.make_new_session(jid, thread_id, type) + + def find_session(self, jid, thread_id, type): + try: + if type == 'chat' and not thread_id: + return self.find_null_session(jid) + else: + return self.sessions[jid][thread_id] + except KeyError: + return None + + def delete_session(self, jid, thread_id): + try: + del self.sessions[jid][thread_id] + + if not self.sessions[jid]: + del self.sessions[jid] + except KeyError: + pass + + def move_session(self, original_jid, thread_id, to_resource): + '''moves a session to another resource.''' + session = self.sessions[original_jid][thread_id] + + del self.sessions[original_jid][thread_id] + + new_jid = gajim.get_jid_without_resource(original_jid) + '/' + to_resource + session.jid = common.xmpp.JID(new_jid) + + if not new_jid in self.sessions: + self.sessions[new_jid] = {} + + self.sessions[new_jid][thread_id] = session + + def find_null_session(self, jid): + '''finds all of the sessions between us and jid that jid hasn't sent a thread_id in yet. + +returns the session that we last sent a message to.''' + + sessions_with_jid = self.sessions[jid].values() + no_threadid_sessions = filter(lambda s: not s.received_thread_id, sessions_with_jid) + + if no_threadid_sessions: + no_threadid_sessions.sort(key=lambda s: s.last_send) + return no_threadid_sessions[-1] + else: + return None + + def make_new_session(self, jid, thread_id = None, type = 'chat'): + sess = EncryptedStanzaSession(self, common.xmpp.JID(jid), thread_id, type) + + if not jid in self.sessions: + self.sessions[jid] = {} + + self.sessions[jid][sess.thread_id] = sess + + return sess + def _pubsubEventCB(self, con, msg): ''' Called when we receive with pubsub event. ''' # TODO: Logging? (actually services where logging would be useful, should @@ -1663,12 +1840,12 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, who = helpers.get_full_jid_from_iq(prs) except: if prs.getTag('error').getTag('jid-malformed'): - # wrong jid, we probably tried to change our nick in a room to a non valid - # one + # wrong jid, we probably tried to change our nick in a room to a non + # valid one who = str(prs.getFrom()) jid_stripped, resource = gajim.get_room_and_nick_from_fjid(who) self.dispatch('GC_MSG', (jid_stripped, - _('Nickname not allowed: %s') % resource, None, False, None)) + _('Nickname not allowed: %s') % resource, None, False, None, [])) return jid_stripped, resource = gajim.get_room_and_nick_from_fjid(who) timestamp = None @@ -1722,8 +1899,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, except: prio = 0 keyID = '' - if sigTag and GnuPG.USE_GPG: - #verify + if sigTag and self.gpg: + # verify sigmsg = sigTag.getData() keyID = self.gpg.verify(status, sigmsg) @@ -1827,7 +2004,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, else: if not status: status = _('I would like to add you to my roster.') - self.dispatch('SUBSCRIBE', (who, status, user_nick)) + self.dispatch('SUBSCRIBE', (jid_stripped, status, user_nick)) elif ptype == 'subscribed': if jid_stripped in self.automatically_added: self.automatically_added.remove(jid_stripped) @@ -1894,8 +2071,13 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, gajim.logger.write('status', jid_stripped, status, show) except exceptions.PysqliteOperationalError, e: self.dispatch('ERROR', (_('Disk Write Error'), str(e))) - self.dispatch('NOTIFY', (jid_stripped, show, status, resource, prio, - keyID, timestamp, contact_nickname)) + our_jid = gajim.get_jid_from_account(self.name) + if jid_stripped == our_jid and resource == self.server_resource: + # We got our own presence + self.dispatch('STATUS', show) + else: + self.dispatch('NOTIFY', (jid_stripped, show, status, resource, prio, + keyID, timestamp, contact_nickname)) # END presenceCB def _StanzaArrivedCB(self, con, obj): @@ -1993,41 +2175,62 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, # continue connection if self.connected > 1 and self.continue_connect_info: - show = self.continue_connect_info[0] msg = self.continue_connect_info[1] - signed = self.continue_connect_info[2] - self.connected = STATUS_LIST.index(show) - sshow = helpers.get_xmpp_show(show) - # send our presence - if show == 'invisible': - self.send_invisible_presence(msg, signed, True) - return - priority = gajim.get_priority(self.name, sshow) - vcard = self.get_cached_vcard(jid) - if vcard and vcard.has_key('PHOTO') and vcard['PHOTO'].has_key('SHA'): - self.vcard_sha = vcard['PHOTO']['SHA'] - p = common.xmpp.Presence(typ = None, priority = priority, show = sshow) - p = self.add_sha(p) - if msg: - p.setStatus(msg) - if signed: - p.setTag(common.xmpp.NS_SIGNED + ' x').setData(signed) + sign_msg = self.continue_connect_info[2] + signed = '' + if sign_msg: + signed = self.get_signed_presence(msg, self._send_first_presence) + if signed is None: + self.dispatch('GPG_PASSWORD_REQUIRED', + (self._send_first_presence,)) + # _send_first_presence will be called when user enter passphrase + return + self._send_first_presence(signed) - if self.connection: - self.connection.send(p) - self.priority = priority - self.dispatch('STATUS', show) - # ask our VCard - self.request_vcard(None) + def _send_first_presence(self, signed = ''): + show = self.continue_connect_info[0] + msg = self.continue_connect_info[1] + sign_msg = self.continue_connect_info[2] + if sign_msg and not signed: + signed = self.get_signed_presence(msg) + if signed is None: + self.dispatch('ERROR', (_('OpenPGP passphrase was not given'), + #%s is the account name here + _('You will be connected to %s without OpenPGP.') % self.name)) + signed = '' + self.connected = STATUS_LIST.index(show) + sshow = helpers.get_xmpp_show(show) + # send our presence + if show == 'invisible': + self.send_invisible_presence(msg, signed, True) + return + priority = gajim.get_priority(self.name, sshow) + our_jid = helpers.parse_jid(gajim.get_jid_from_account(self.name)) + vcard = self.get_cached_vcard(our_jid) + if vcard and vcard.has_key('PHOTO') and vcard['PHOTO'].has_key('SHA'): + self.vcard_sha = vcard['PHOTO']['SHA'] + p = common.xmpp.Presence(typ = None, priority = priority, show = sshow) + p = self.add_sha(p) + if msg: + p.setStatus(msg) + if signed: + p.setTag(common.xmpp.NS_SIGNED + ' x').setData(signed) - # Get bookmarks from private namespace - self.get_bookmarks() + if self.connection: + self.connection.send(p) + self.priority = priority + self.dispatch('STATUS', show) + # ask our VCard + self.request_vcard(None) - # Get annotations from private namespace - self.get_annotations() + # Get bookmarks from private namespace + self.get_bookmarks() - #Inform GUI we just signed in - self.dispatch('SIGNED_IN', ()) + # Get annotations from private namespace + self.get_annotations() + + # Inform GUI we just signed in + self.dispatch('SIGNED_IN', ()) self.continue_connect_info = None def request_gmail_notifications(self): diff --git a/src/common/contacts.py b/src/common/contacts.py index 65fe13fb7..ef02f43da 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -1,20 +1,25 @@ ## common/contacts.py ## -## Copyright (C) 2006 Yann Le Boulanger -## Copyright (C) 2006 Nikos Kouremenos +## Copyright (C) 2006 Yann Leboulanger +## Nikos Kouremenos ## Copyright (C) 2007 Lukas Petrovicky -## Copyright (C) 2007 Julien Pivotto +## Julien Pivotto +## Stephan Erb ## +## This file is part of Gajim. ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 common.gajim @@ -41,9 +46,9 @@ class Contact: # Capabilities; filled by caps.py/ConnectionCaps object # every time it gets these from presence stanzas - self.caps_node=None - self.caps_ver=None - self.caps_exts=None + self.caps_node = None + self.caps_ver = None + self.caps_exts = None # please read jep-85 http://www.jabber.org/jeps/jep-0085.html # we keep track of jep85 support with the peer by three extra states: @@ -206,6 +211,9 @@ class Contacts: if len(self._contacts[account][contact.jid]) == 0: del self._contacts[account][contact.jid] + def clear_contacts(self, account): + self._contacts[account] = {} + def remove_jid(self, account, jid): '''Removes all contacts for a given jid''' if not self._contacts.has_key(account): @@ -281,6 +289,10 @@ class Contacts: for account in accounts: our_jid = common.gajim.get_jid_from_account(account) for jid in self.get_jid_list(account): + if self.has_brother(account, jid) and not \ + self.is_big_brother(account, jid): + # count metacontacts only once + continue if jid == our_jid: continue if common.gajim.jid_is_transport(jid) and not \ @@ -300,6 +312,8 @@ class Contacts: # Transports group if common.gajim.jid_is_transport(jid): contact_groups = [_('Transports')] + if contact.is_observer(): + contact_groups = [_('Observers')] else: contact_groups = [_('General')] for group in groups: @@ -362,7 +376,7 @@ class Contacts: found = data break if found: - self._metacontacts_tags[account][tag].remove(data) + self._metacontacts_tags[account][tag].remove(found) break common.gajim.connections[account].store_metacontacts( self._metacontacts_tags[account]) @@ -374,6 +388,17 @@ class Contacts: return True return False + def is_big_brother(self, account, jid): + tag = self.get_metacontacts_tag(account, jid) + if tag: + family = self.get_metacontacts_family(account, jid) + bb_data = self.get_metacontacts_big_brother(family) + bb_jid = bb_data['jid'] + bb_account = bb_data['account'] + if bb_jid == jid and bb_account == account: + return True + return False + def get_metacontacts_jids(self, tag): '''Returns all jid for the given tag in the form {acct: [jid1, jid2],.}''' answers = {} @@ -399,48 +424,71 @@ class Contacts: answers.append(data) return answers - def _get_data_score(self, data): - '''compute thescore of a gived data - data is {'jid': jid, 'account': account, 'order': order} - order is optional - score = (max_order - order)*10000 + is_jabber*priority*10 + status''' - jid = data['jid'] - account = data['account'] - max_order = 0 - order = 0 - if data.has_key('order'): - order = data['order'] - if order: - family = self.get_metacontacts_family(account, jid) - for data_ in family: - if data_.has_key('order') and data_['order'] > max_order: - max_order = data_['order'] - contact = self.get_contact_with_highest_priority(account, jid) - score = (max_order - order)*10000 - - if common.gajim.get_transport_name_from_jid(jid) is None and \ - contact.show not in ('error', 'offline'): - score += 10 - if contact.priority > 0: - score += contact.priority * 10 - score += ['not in roster', 'error', 'offline', 'invisible', 'dnd', 'xa', - 'away', 'chat', 'online', 'requested', 'message'].index(contact.show) - if contact.show == 'offline' and contact.status: - # Offline contacts with a status message have highest score - score += 1 - return score + def compare_metacontacts(self, data1, data2): + '''compare 2 metacontacts. + Data is {'jid': jid, 'account': account, 'order': order} + order is optional''' + jid1 = data1['jid'] + jid2 = data2['jid'] + account1 = data1['account'] + account2 = data2['account'] + contact1 = self.get_contact_with_highest_priority(account1, jid1) + contact2 = self.get_contact_with_highest_priority(account2, jid2) + show_list = ['not in roster', 'error', 'offline', 'invisible', 'dnd', + 'xa', 'away', 'chat', 'online', 'requested', 'message'] + # contact can be null when we fill the roster on connection + if not contact1: + show1 = 0 + priority1 = 0 + else: + show1 = show_list.index(contact1.show) + priority1 = contact1.priority + if not contact2: + show2 = 0 + priority2 = 0 + else: + show2 = show_list.index(contact2.show) + priority2 = contact2.priority + # If only one is offline, it's always second + if show1 > 2 and show2 < 3: + return 1 + if show2 > 2 and show1 < 3: + return -1 + if 'order' in data1 and 'order' in data2: + if data1['order'] > data2['order']: + return 1 + if data1['order'] < data2['order']: + return -1 + transport1 = common.gajim.get_transport_name_from_jid(jid1) + transport2 = common.gajim.get_transport_name_from_jid(jid2) + if transport2 and not transport1: + return 1 + if transport1 and not transport2: + return -1 + if priority1 > priority2: + return 1 + if priority2 > priority1: + return -1 + if show1 > show2: + return 1 + if show2 > show1: + return -1 + if jid1 > jid2: + return 1 + if jid2 > jid1: + return -1 + # If all is the same, compare accounts, they can't be the same + if account1 > account2: + return 1 + if account2 > account1: + return -1 + return 0 def get_metacontacts_big_brother(self, family): '''which of the family will be the big brother under wich all others will be ?''' - max_score = 0 - max_data = family[0] - for data in family: - score = self._get_data_score(data) - if score > max_score: - max_score = score - max_data = data - return max_data + family.sort(cmp=self.compare_metacontacts) + return family[-1] def is_pm_from_jid(self, account, jid): '''Returns True if the given jid is a private message jid''' diff --git a/src/common/crypto.py b/src/common/crypto.py new file mode 100644 index 000000000..190685f11 --- /dev/null +++ b/src/common/crypto.py @@ -0,0 +1,86 @@ +# common crypto functions (mostly specific to XEP-0116, but useful elsewhere) + +import os +import math + +from Crypto.Hash import SHA256 + +# convert a large integer to a big-endian bitstring +def encode_mpi(n): + if n >= 256: + return encode_mpi(n / 256) + chr(n % 256) + else: + return chr(n) + +# convert a large integer to a big-endian bitstring, padded with \x00s to +# a multiple of 16 bytes +def encode_mpi_with_padding(n): + return pad_to_multiple(encode_mpi(n), 16, '\x00', True) + +# pad 'string' to a multiple of 'multiple_of' with 'char'. +# pad on the left if 'left', otherwise pad on the right. +def pad_to_multiple(string, multiple_of, char, left): + mod = len(string) % multiple_of + if mod == 0: + return string + else: + padding = (multiple_of - mod) * char + + if left: + return padding + string + else: + return string + padding + +# convert a big-endian bitstring to an integer +def decode_mpi(s): + if len(s) == 0: + return 0 + else: + return 256 * decode_mpi(s[:-1]) + ord(s[-1]) + +def sha256(string): + sh = SHA256.new() + sh.update(string) + return sh.digest() + +base28_chr = "acdefghikmopqruvwxy123456789" + +def sas_28x5(m_a, form_b): + sha = sha256(m_a + form_b + 'Short Authentication String') + lsb24 = decode_mpi(sha[-3:]) + return base28(lsb24) + +def base28(n): + if n >= 28: + return base28(n / 28) + base28_chr[n % 28] + else: + return base28_chr[n] + +def random_bytes(bytes): + return os.urandom(bytes) + +def generate_nonce(): + return random_bytes(8) + +# generate a random number between 'bottom' and 'top' +def srand(bottom, top): + # minimum number of bytes needed to represent that range + bytes = int(math.ceil(math.log(top - bottom, 256))) + + # in retrospect, this is horribly inadequate. + return (decode_mpi(random_bytes(bytes)) % (top - bottom)) + bottom + +# a faster version of (base ** exp) % mod +# taken from +def powmod(base, exp, mod): + square = base % mod + result = 1 + + while exp > 0: + if exp & 1: # exponent is odd + result = (result * square) % mod + + square = (square * square) % mod + exp /= 2 + + return result diff --git a/src/common/dataforms.py b/src/common/dataforms.py index e46fcbfc2..0b59d7471 100644 --- a/src/common/dataforms.py +++ b/src/common/dataforms.py @@ -170,7 +170,7 @@ class BooleanField(DataField): v = self.getTagData('value') if v in ('0', 'false'): return False if v in ('1', 'true'): return True - if v is None: return None + if v is None: return False # default value is False raise WrongFieldValue def fset(self, value): self.setTagData('value', value and '1' or '0') diff --git a/src/common/dbus_support.py b/src/common/dbus_support.py index 94b973c5d..71695036a 100644 --- a/src/common/dbus_support.py +++ b/src/common/dbus_support.py @@ -1,21 +1,26 @@ ## dbus_support.py ## -## Copyright (C) 2005 Yann Le Boulanger +## Copyright (C) 2005 Yann Leboulanger ## Copyright (C) 2005 Nikos Kouremenos ## Copyright (C) 2005 Dimitur Kirov ## Copyright (C) 2005 Andrew Sayman ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 os +import os, sys from common import gajim from common import exceptions @@ -23,10 +28,13 @@ from common import exceptions _GAJIM_ERROR_IFACE = 'org.gajim.dbus.Error' try: + if sys.platform == 'darwin': + import osx.dbus + osx.dbus.load(True) import dbus import dbus.service import dbus.glib - supported = True # does use have D-Bus bindings? + supported = True # does user have D-Bus bindings? except ImportError: supported = False if not os.name == 'nt': # only say that to non Windows users @@ -98,7 +106,7 @@ class SessionBus: session_bus = SessionBus() def get_interface(interface, path): - '''Returns an interface on the current SessionBus. If the interface isn't + '''Returns an interface on the current SessionBus. If the interface isn\'t running, it tries to start it first.''' if not supported: return None diff --git a/src/common/defs.py b/src/common/defs.py index d557e6912..3f776c43e 100644 --- a/src/common/defs.py +++ b/src/common/defs.py @@ -2,7 +2,7 @@ docdir = '../' datadir = '../' -version = '0.11.1.5' +version = '0.11.4.0-svn' import sys, os.path for base in ('.', 'common'): diff --git a/src/common/dh.py b/src/common/dh.py new file mode 100644 index 000000000..8dd73f669 --- /dev/null +++ b/src/common/dh.py @@ -0,0 +1,207 @@ +import string + +# This file defines a number of constants; specifically, large primes suitable for +# use with the Diffie-Hellman key exchange. +# +# These constants have been obtained from RFC2409 and RFC3526. + +generators = [ None, # one to get the right offset + 2, + 2, + None, + None, + 2, + None, + None, + None, + None, + None, + None, + None, + None, + 2, # group 14 + 2, + 2, + 2, + 2, + ] + +hex_primes = [ None, + +# group 1 +'''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 +29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD +EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 +E485B576 625E7EC6 F44C42E9 A63A3620 FFFFFFFF FFFFFFFF''', + +# group 2 +'''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 +29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD +EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 +E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED +EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381 +FFFFFFFF FFFFFFFF''', + +# XXX how do I obtain these? +None, +None, + +# group 5 +'''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 +29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD +EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 +E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED +EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D +C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F +83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D +670C354E 4ABC9804 F1746C08 CA237327 FFFFFFFF FFFFFFFF''', + +None, +None, +None, +None, +None, +None, +None, +None, + +# group 14 +'''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 +29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD +EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 +E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED +EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D +C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F +83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D +670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B +E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 +DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 +15728E5A 8AACAA68 FFFFFFFF FFFFFFFF''', + +# group 15 +'''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 +29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD +EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 +E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED +EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D +C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F +83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D +670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B +E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 +DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 +15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 +ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 +ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B +F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C +BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 +43DB5BFC E0FD108E 4B82D120 A93AD2CA FFFFFFFF FFFFFFFF''', + +# group 16 +'''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 +29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD +EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 +E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED +EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D +C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F +83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D +670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B +E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 +DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 +15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 +ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 +ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B +F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C +BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 +43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 +88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA +2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6 +287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED +1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9 +93B4EA98 8D8FDDC1 86FFFB7DC 90A6C08F 4DF435C9 34063199 +FFFFFFFF FFFFFFFF''', + +# group 17 +'''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 29024E08 +8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD EF9519B3 CD3A431B +302B0A6D F25F1437 4FE1356D 6D51C245 E485B576 625E7EC6 F44C42E9 +A637ED6B 0BFF5CB6 F406B7ED EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 +49286651 ECE45B3D C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 +FD24CF5F 83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D +670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B E39E772C +180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 DE2BCBF6 95581718 +3995497C EA956AE5 15D22618 98FA0510 15728E5A 8AAAC42D AD33170D +04507A33 A85521AB DF1CBA64 ECFB8504 58DBEF0A 8AEA7157 5D060C7D +B3970F85 A6E1E4C7 ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 +1AD2EE6B F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C +BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 43DB5BFC +E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 88719A10 BDBA5B26 +99C32718 6AF4E23C 1A946834 B6150BDA 2583E9CA 2AD44CE8 DBBBC2DB +04DE8EF9 2E8EFC14 1FBECAA6 287C5947 4E6BC05D 99B2964F A090C3A2 +233BA186 515BE7ED 1F612970 CEE2D7AF B81BDD76 2170481C D0069127 +D5B05AA9 93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492 +36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD F8FF9406 +AD9E530E E5DB382F 413001AE B06A53ED 9027D831 179727B0 865A8918 +DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B DB7F1447 E6CC254B 33205151 +2BD7AF42 6FB8F401 378CD2BF 5983CA01 C64B92EC F032EA15 D1721D03 +F482D7CE 6E74FEF6 D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F +BEC7E8F3 23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA +CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328 06A1D58B +B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C DA56C9EC 2EF29632 +387FE8D7 6E3C0468 043E8F66 3F4860EE 12BF2D5B 0B7474D6 E694F91E +6DCC4024 FFFFFFFF FFFFFFFF''', + +# group 18 +'''FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1 +29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD +EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245 +E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED +EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D +C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F +83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D +670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B +E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9 +DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510 +15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64 +ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7 +ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B +F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C +BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31 +43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7 +88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA +2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6 +287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED +1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9 +93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492 +36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD +F8FF9406 AD9E530E E5DB382F 413001AE B06A53ED 9027D831 +179727B0 865A8918 DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B +DB7F1447 E6CC254B 33205151 2BD7AF42 6FB8F401 378CD2BF +5983CA01 C64B92EC F032EA15 D1721D03 F482D7CE 6E74FEF6 +D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F BEC7E8F3 +23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA +CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328 +06A1D58B B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C +DA56C9EC 2EF29632 387FE8D7 6E3C0468 043E8F66 3F4860EE +12BF2D5B 0B7474D6 E694F91E 6DBE1159 74A3926F 12FEE5E4 +38777CB6 A932DF8C D8BEC4D0 73B931BA 3BC832B6 8D9DD300 +741FA7BF 8AFC47ED 2576F693 6BA42466 3AAB639C 5AE4F568 +3423B474 2BF1C978 238F16CB E39D652D E3FDB8BE FC848AD9 +22222E04 A4037C07 13EB57A8 1A23F0C7 3473FC64 6CEA306B +4BCBC886 2F8385DD FA9D4B7F A2C087E8 79683303 ED5BDD3A +062B3CF5 B3A278A6 6D2A13F8 3F44F82D DF310EE0 74AB6A36 +4597E899 A0255DC1 64F31CC5 0846851D F9AB4819 5DED7EA1 +B1D510BD 7EE74D73 FAF36BC3 1ECFA268 359046F4 EB879F92 +4009438B 481C6CD7 889A002E D5EE382B C9190DA6 FC026E47 +9558E447 5677E9AA 9E3050E2 765694DF C81F56E8 80B96E71 +60C980DD 98EDD3DF FFFFFFFF FFFFFFFF''' +] + +all_ascii = ''.join(map(chr, range(256))) + +def hex_to_decimal(stripee): + if not stripee: + return None + + return int(stripee.translate(all_ascii, string.whitespace), 16) + +primes = map(hex_to_decimal, hex_primes) diff --git a/src/common/events.py b/src/common/events.py index ddb7eef2e..f676ec7fc 100644 --- a/src/common/events.py +++ b/src/common/events.py @@ -1,24 +1,30 @@ ## common/events.py ## ## Contributors for this file: -## - Yann Le Boulanger +## - Yann Leboulanger ## -## Copyright (C) 2006 Yann Le Boulanger +## Copyright (C) 2006 Yann Leboulanger ## Vincent Hanquez ## Nikos Kouremenos ## Dimitur Kirov ## Travis Shirk ## Norman Rasmussen +## Copyright (C) 2007 Stephan Erb ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 time @@ -159,12 +165,22 @@ class Events: return self._get_nb_events(types = types, account = account) def get_events(self, account, jid = None, types = []): - '''if event is not specified, get all events from this jid, + '''returns all events from the given account of the form + {jid1: [], jid2: []} + if jid is given, returns all events from the given jid in a list: [] optionnaly only from given type''' if not self._events.has_key(account): return [] if not jid: - return self._events[account] + events_list = {} # list of events + for jid_ in self._events[account]: + events = [] + for ev in self._events[account][jid_]: + if not types or ev.type_ in types: + events.append(ev) + if events: + events_list[jid_] = events + return events_list if not self._events[account].has_key(jid): return [] events_list = [] # list of events diff --git a/src/common/exceptions.py b/src/common/exceptions.py index 12d674535..7b19cddc2 100644 --- a/src/common/exceptions.py +++ b/src/common/exceptions.py @@ -1,17 +1,22 @@ ## exceptions.py ## -## Copyright (C) 2005-2006 Yann Le Boulanger +## Copyright (C) 2005-2006 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## class PysqliteNotAvailable(Exception): '''sqlite2 is not installed or python bindings are missing''' @@ -54,8 +59,20 @@ class SessionBusNotPresent(Exception): def __str__(self): return _('Session bus is not available.\nTry reading http://trac.gajim.org/wiki/GajimDBus') +class NegotiationError(Exception): + '''A session negotiation failed''' + pass + +class DecryptionError(Exception): + '''A message couldn't be decrypted into usable XML''' + pass + +class Cancelled(Exception): + '''The user cancelled an operation''' + pass + class GajimGeneralException(Exception): - '''This exception ir our general exception''' + '''This exception is our general exception''' def __init__(self, text=''): Exception.__init__(self) self.text = text diff --git a/src/common/fuzzyclock.py b/src/common/fuzzyclock.py index 50d155af4..a1ed31e58 100755 --- a/src/common/fuzzyclock.py +++ b/src/common/fuzzyclock.py @@ -2,23 +2,28 @@ ## ## Contributors for this file: ## -## - Yann Le Boulanger +## - Yann Leboulanger ## - Christoph Neuroth ## ## Copyright (C) 2006 Christoph Neuroth -## Yann Le Boulanger +## Yann Leboulanger ## Dimitur Kirov ## Travis Shirk ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## ''' Python class to show a "fuzzy clock". diff --git a/src/common/gajim.py b/src/common/gajim.py index 09d837c4d..bfc7a555a 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -1,19 +1,24 @@ ## common/gajim.py ## -## Copyright (C) 2003-2006 Yann Le Boulanger +## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005-2006 Dimitur Kirov ## Copyright (C) 2005-2006 Travis Shirk ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 sys import logging @@ -72,6 +77,7 @@ VCARD_PATH = gajimpaths['VCARD'] AVATAR_PATH = gajimpaths['AVATAR'] MY_EMOTS_PATH = gajimpaths['MY_EMOTS'] MY_ICONSETS_PATH = gajimpaths['MY_ICONSETS'] +MY_CACERTS = gajimpaths['MY_CACERTS'] TMP = gajimpaths['TMP'] DATA_DIR = gajimpaths['DATA'] HOME_DIR = gajimpaths['HOME'] @@ -136,6 +142,18 @@ priority_dict = {} for status in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible'): priority_dict[status] = config.get('autopriority' + status) +HAVE_PYCRYPTO = True +try: + import Crypto +except ImportError: + HAVE_PYCRYPTO = False + +HAVE_PYSEXY = True +try: + import sexy +except ImportError: + HAVE_PYSEXY = False + def get_nick_from_jid(jid): pos = jid.find('@') return jid[:pos] diff --git a/src/common/helpers.py b/src/common/helpers.py index c768d10f8..aed9e5280 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -1,21 +1,26 @@ ## common/helpers.py ## -## Copyright (C) 2003-2006 Yann Le Boulanger +## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos -## Copyright (C) 2005 -## Dimitur Kirov +## Copyright (C) 2005 Dimitur Kirov ## Travis Shirk ## Copyright (C) 2007 Lukas Petrovicky +## Stephan Erb +## +## This file is part of Gajim. ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 re import locale @@ -25,6 +30,7 @@ import urllib import errno import select import sha +import sys from encodings.punycode import punycode_encode from encodings import idna @@ -34,6 +40,9 @@ from i18n import ngettext from xmpp_stringprep import nodeprep, resourceprep, nameprep +if sys.platform == 'darwin': + from osx import nsapp + try: import winsound # windows-only built-in module for playing wav import win32api @@ -420,6 +429,9 @@ def launch_browser_mailer(kind, uri): command = 'kfmclient exec' elif gajim.config.get('openwith') == 'exo-open': command = 'exo-open' + elif ((sys.platform == 'darwin') and + (gajim.config.get('openwith') == 'open')): + command = 'open' elif gajim.config.get('openwith') == 'custom': if kind == 'url': command = gajim.config.get('custombrowser') @@ -447,6 +459,9 @@ def launch_file_manager(path_to_open): command = 'kfmclient exec' elif gajim.config.get('openwith') == 'exo-open': command = 'exo-open' + elif ((sys.platform == 'darwin') and + (gajim.config.get('openwith') == 'open')): + command = 'open' elif gajim.config.get('openwith') == 'custom': command = gajim.config.get('custom_file_manager') if command == '': # if no app is configured @@ -469,7 +484,9 @@ def play_sound_file(path_to_soundfile): return if path_to_soundfile is None or not os.path.exists(path_to_soundfile): return - if os.name == 'nt': + if sys.platform == 'darwin': + nsapp.playFile(path_to_soundfile) + elif os.name == 'nt': try: winsound.PlaySound(path_to_soundfile, winsound.SND_FILENAME|winsound.SND_ASYNC) @@ -489,7 +506,11 @@ def get_file_path_from_dnd_dropped_uri(uri): if path.startswith('file:\\\\\\'): # windows path = path[8:] # 8 is len('file:///') elif path.startswith('file://'): # nautilus, rox - path = path[7:] # 7 is len('file://') + if sys.platform == 'darwin': + # OS/X includes hostname in file:// URI + path = re.sub('file://[^/]*', '', path) + else: + path = path[7:] # 7 is len('file://') elif path.startswith('file:'): # xffm path = path[5:] # 5 is len('file:') return path @@ -544,6 +565,19 @@ def get_global_status(): status = gajim.connections[account].status return status +def statuses_unified(): + '''testing if all statuses are the same.''' + reference = None + for account in gajim.connections: + if not gajim.config.get_per('accounts', account, + 'sync_with_global_status'): + continue + if reference == None: + reference = gajim.connections[account].connected + elif reference != gajim.connections[account].connected: + return False + return True + def get_icon_name_to_show(contact, account = None): '''Get the icon name to show in online, away, requested, ...''' if account and gajim.events.get_nb_roster_events(account, contact.jid): @@ -1050,3 +1084,11 @@ def get_iconset_path(iconset): return os.path.join(gajim.DATA_DIR, 'iconsets', iconset) elif os.path.isdir(os.path.join(gajim.MY_ICONSETS_PATH, iconset)): return os.path.join(gajim.MY_ICONSETS_PATH, iconset) + +def get_transport_path(transport): + if os.path.isdir(os.path.join(gajim.DATA_DIR, 'iconsets', 'transports', + transport)): + return os.path.join(gajim.DATA_DIR, 'iconsets', 'transports', transport) + elif os.path.isdir(os.path.join(gajim.MY_ICONSETS_PATH, 'transports', + transport)): + return os.path.join(gajim.MY_ICONSETS_PATH, 'transports', transport) diff --git a/src/common/i18n.py b/src/common/i18n.py index 8eae35621..450a73002 100644 --- a/src/common/i18n.py +++ b/src/common/i18n.py @@ -1,27 +1,32 @@ ## common/i18n.py ## -*- coding: utf-8 -*- ## Contributors for this file: -## - Yann Le Boulanger +## - Yann Leboulanger ## - Nikos Kouremenos ## -## Copyright (C) 2003-2004 Yann Le Boulanger +## Copyright (C) 2003-2004 Yann Leboulanger ## Vincent Hanquez -## Copyright (C) 2005 Yann Le Boulanger +## Copyright (C) 2005 Yann Leboulanger ## Vincent Hanquez ## Nikos Kouremenos ## Dimitur Kirov ## Travis Shirk ## Norman Rasmussen ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 locale import gettext diff --git a/src/common/logger.py b/src/common/logger.py index e5a36a8fe..489986faa 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -1,17 +1,22 @@ ## logger.py ## ## Copyright (C) 2005-2006 Nikos Kouremenos -## Copyright (C) 2005-2006 Yann Le Boulanger +## Copyright (C) 2005-2006 Yann Leboulanger ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## ''' This module allows to access the on-disk database of logs. ''' @@ -137,6 +142,9 @@ class Logger: for row in rows: # row[0] is first item of row (the only result here, the jid) self.jids_already_in.append(row[0]) + + def get_jids_in_db(self): + return self.jids_already_in def jid_is_from_pm(self, jid): '''if jid is gajim@conf/nkour it's likely a pm one, how we know @@ -181,7 +189,13 @@ class Logger: typ = constants.JID_ROOM_TYPE else: typ = constants.JID_NORMAL_TYPE - self.cur.execute('INSERT INTO jids (jid, type) VALUES (?, ?)', (jid, typ)) + try: + self.cur.execute('INSERT INTO jids (jid, type) VALUES (?, ?)', (jid, + typ)) + except sqlite.IntegrityError, e: + # Jid already in DB, maybe added by another instance. re-read DB + self.get_jids_already_in_db() + return self.get_jid_id(jid, typestr) try: self.con.commit() except sqlite.OperationalError, e: diff --git a/src/common/nslookup.py b/src/common/nslookup.py index 484dc7f1d..ae535993e 100644 --- a/src/common/nslookup.py +++ b/src/common/nslookup.py @@ -2,15 +2,20 @@ ## ## Copyright (C) 2006 Dimitur Kirov ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 sys import os diff --git a/src/common/optparser.py b/src/common/optparser.py index c5aaede3e..86a86b5d7 100644 --- a/src/common/optparser.py +++ b/src/common/optparser.py @@ -1,16 +1,22 @@ ## -## Copyright (C) 2005-2006 Yann Le Boulanger +## Copyright (C) 2005-2006 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos +## Copyright (C) 2007 Stephan Erb ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 os import locale @@ -57,9 +63,10 @@ class OptionsParser: if os.path.exists(self.__filename): #we talk about a file print _('error: cannot open %s for reading') % self.__filename - return + return False new_version = gajim.config.get('version') + new_version = new_version.split('-', 1)[0] for line in fd.readlines(): try: line = line.decode('utf-8') @@ -67,11 +74,13 @@ class OptionsParser: line = line.decode(locale.getpreferredencoding()) self.read_line(line) old_version = gajim.config.get('version') + old_version = old_version.split('-', 1)[0] self.update_config(old_version, new_version) self.old_values = {} # clean mem fd.close() + return True def write_line(self, fd, opt, parents, value): if value == None: @@ -163,6 +172,10 @@ class OptionsParser: self.update_config_to_01114() if old < [0, 11, 1, 5] and new >= [0, 11, 1, 5]: self.update_config_to_01115() + if old < [0, 11, 2, 1] and new >= [0, 11, 2, 1]: + self.update_config_to_01121() + if old < [0, 11, 2, 2] and new >= [0, 11, 2, 2]: + self.update_config_to_01122() gajim.logger.init_vars() gajim.config.set('version', new_version) @@ -476,3 +489,40 @@ class OptionsParser: pass con.close() gajim.config.set('version', '0.11.1.5') + + def update_config_to_01121(self): + # remove old unencrypted secrets file + from common.configpaths import gajimpaths + + new_file = gajimpaths['SECRETS_FILE'] + + old_file = os.path.dirname(new_file) + '/secrets' + + if os.path.exists(old_file): + os.remove(old_file) + + gajim.config.set('version', '0.11.2.1') + + def update_config_to_01122(self): + back = os.getcwd() + os.chdir(logger.LOG_DB_FOLDER) + con = sqlite.connect(logger.LOG_DB_FILE) + os.chdir(back) + cur = con.cursor() + try: + cur.executescript( + ''' + CREATE TABLE IF NOT EXISTS caps_cache ( + node TEXT, + ver TEXT, + ext TEXT, + data BLOB + ); + ''' + ) + con.commit() + except sqlite.OperationalError, e: + pass + con.close() + gajim.config.set('version', '0.11.2.2') + diff --git a/src/common/passwords.py b/src/common/passwords.py index 79d83cb16..08514bbda 100644 --- a/src/common/passwords.py +++ b/src/common/passwords.py @@ -2,15 +2,20 @@ ## Copyright (C) 2006 Gustavo J. A. M. Carneiro ## Copyright (C) 2006 Nikos Kouremenos ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## __all__ = ['get_password', 'save_password'] @@ -37,7 +42,8 @@ class SimplePasswordStorage(PasswordStorage): def save_password(self, account_name, password): gajim.config.set_per('accounts', account_name, 'password', password) - gajim.connections[account_name].password = password + if account_name in gajim.connections: + gajim.connections[account_name].password = password class GnomePasswordStorage(PasswordStorage): diff --git a/src/common/proxy65_manager.py b/src/common/proxy65_manager.py index 4dd508029..29627478f 100644 --- a/src/common/proxy65_manager.py +++ b/src/common/proxy65_manager.py @@ -4,15 +4,20 @@ ## Contributors for this file: ## - Dimitur Kirov ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 socket import struct import errno @@ -108,9 +113,8 @@ class ProxyResolver: query.setNamespace(common.xmpp.NS_BYTESTREAM) query.setAttr('sid', self.sid) - query.setTag('activate') - # activate = query.setTag('activate') - # activate.setData(self.jid + "/" + self.sid) + activate = query.setTag('activate') + activate.setData(self.jid + "/" + self.sid) if self.active_connection: self.active_connection.send(iq) @@ -253,7 +257,8 @@ class HostTester(Socks5, IdleObject): self._recv=self._sock.recv except Exception, ee: (errnum, errstr) = ee - if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): + # 56 is for freebsd + if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): # still trying to connect return # win32 needs this diff --git a/src/common/rst_xhtml_generator.py b/src/common/rst_xhtml_generator.py index 6b78828ef..978ca2b48 100644 --- a/src/common/rst_xhtml_generator.py +++ b/src/common/rst_xhtml_generator.py @@ -1,18 +1,23 @@ ## rst_xhtml_generator.py ## -## Copyright (C) 2006 Yann Le Boulanger +## Copyright (C) 2006 Yann Leboulanger ## Copyright (C) 2006 Nikos Kouremenos ## Copyright (C) 2006 Santiago Gala ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## try: from docutils import io diff --git a/src/common/sleepy.py b/src/common/sleepy.py index 4ebf7ad24..bcc5f73c3 100644 --- a/src/common/sleepy.py +++ b/src/common/sleepy.py @@ -1,26 +1,31 @@ ## common/sleepy.py ## ## Contributors for this file: -## - Yann Le Boulanger +## - Yann Leboulanger ## - Nikos Kouremenos ## -## Copyright (C) 2003-2004 Yann Le Boulanger +## Copyright (C) 2003-2004 Yann Leboulanger ## Vincent Hanquez -## Copyright (C) 2005-2006 Yann Le Boulanger +## Copyright (C) 2005-2006 Yann Leboulanger ## Nikos Kouremenos ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## from common import gajim -import os +import os, sys STATE_UNKNOWN = 'OS probably not supported' @@ -42,6 +47,8 @@ try: lastInputInfo = LASTINPUTINFO() lastInputInfo.cbSize = ctypes.sizeof(lastInputInfo) + elif sys.platform == 'darwin': + import osx.idle as idle else: # unix import idle except: diff --git a/src/common/socks5.py b/src/common/socks5.py index a4529b781..6d70266a8 100644 --- a/src/common/socks5.py +++ b/src/common/socks5.py @@ -2,28 +2,33 @@ ## common/xmpp/socks5.py ## ## Contributors for this file: -## - Yann Le Boulanger +## - Yann Leboulanger ## - Nikos Kouremenos ## - Dimitur Kirov ## -## Copyright (C) 2003-2004 Yann Le Boulanger +## Copyright (C) 2003-2004 Yann Leboulanger ## Vincent Hanquez -## Copyright (C) 2005 Yann Le Boulanger +## Copyright (C) 2005 Yann Leboulanger ## Vincent Hanquez ## Nikos Kouremenos ## Dimitur Kirov ## Travis Shirk ## Norman Rasmussen ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 socket diff --git a/src/common/stanza_session.py b/src/common/stanza_session.py new file mode 100644 index 000000000..d8625d6a7 --- /dev/null +++ b/src/common/stanza_session.py @@ -0,0 +1,910 @@ +from common import gajim + +from common import xmpp +from common import helpers +from common import exceptions + +import random +import string + +import time + +import xmpp.c14n + +import base64 + +XmlDsig = 'http://www.w3.org/2000/09/xmldsig#' + +class StanzaSession(object): + def __init__(self, conn, jid, thread_id, type): + self.conn = conn + + self.jid = jid + + self.type = type + + if thread_id: + self.received_thread_id = True + self.thread_id = thread_id + else: + self.received_thread_id = False + if type == 'normal': + self.thread_id = None + else: + self.thread_id = self.generate_thread_id() + + self.last_send = 0 + self.status = None + self.negotiated = {} + + def generate_thread_id(self): + return "".join([random.choice(string.ascii_letters) for x in xrange(0,32)]) + + def send(self, msg): + if self.thread_id: + msg.NT.thread = self.thread_id + + msg.setAttr('to', self.jid) + self.conn.send_stanza(msg) + + if isinstance(msg, xmpp.Message): + self.last_send = time.time() + + def reject_negotiation(self, body = None): + msg = xmpp.Message() + feature = msg.NT.feature + feature.setNamespace(xmpp.NS_FEATURE) + + x = xmpp.DataForm(typ='submit') + x.addChild(node=xmpp.DataField(name='FORM_TYPE', value='urn:xmpp:ssn')) + x.addChild(node=xmpp.DataField(name='accept', value='0')) + + feature.addChild(node=x) + + if body: + msg.setBody(body) + + self.send(msg) + + self.cancelled_negotiation() + + def cancelled_negotiation(self): + '''A negotiation has been cancelled, so reset this session to its default state.''' + + if hasattr(self, 'control'): + self.control.on_cancel_session_negotiation() + + self.status = None + self.negotiated = {} + + def terminate(self): + msg = xmpp.Message() + feature = msg.NT.feature + feature.setNamespace(xmpp.NS_FEATURE) + + x = xmpp.DataForm(typ='submit') + x.addChild(node=xmpp.DataField(name='FORM_TYPE', value='urn:xmpp:ssn')) + x.addChild(node=xmpp.DataField(name='terminate', value='1')) + + feature.addChild(node=x) + + self.send(msg) + + self.status = None + + def acknowledge_termination(self): + # we could send an acknowledgement message to the remote client here + self.status = None + +if gajim.HAVE_PYCRYPTO: + from Crypto.Cipher import AES + from Crypto.Hash import HMAC, SHA256 + from Crypto.PublicKey import RSA + from common import crypto + + from common import dh + import secrets + +# an encrypted stanza negotiation has several states. i've represented them +# as the following values in the 'status' +# attribute of the session object: + +# 1. None: +# default state +# 2. 'requested-e2e': +# this client has initiated an esession negotiation and is waiting +# for a response +# 3. 'responded-e2e': +# this client has responded to an esession negotiation request and +# is waiting for the initiator to identify itself and complete the +# negotiation +# 4. 'identified-alice': +# this client identified itself and is waiting for the responder to +# identify itself and complete the negotiation +# 5. 'active': +# an encrypted session has been successfully negotiated. messages +# of any of the types listed in 'encryptable_stanzas' should be +# encrypted before they're sent. + +# the transition between these states is handled in gajim.py's +# handle_session_negotiation method. + +class EncryptedStanzaSession(StanzaSession): + def __init__(self, conn, jid, thread_id, type = 'chat'): + StanzaSession.__init__(self, conn, jid, thread_id, type = 'chat') + + self.loggable = True + + self.xes = {} + self.es = {} + + self.n = 128 + + self.enable_encryption = False + + # _s denotes 'self' (ie. this client) + self._kc_s = None + + # _o denotes 'other' (ie. the client at the other end of the session) + self._kc_o = None + + # keep the encrypter updated with my latest cipher key + def set_kc_s(self, value): + self._kc_s = value + self.encrypter = self.cipher.new(self._kc_s, self.cipher.MODE_CTR, + counter=self.encryptcounter) + + def get_kc_s(self): + return self._kc_s + + # keep the decrypter updated with the other party's latest cipher key + def set_kc_o(self, value): + self._kc_o = value + self.decrypter = self.cipher.new(self._kc_o, self.cipher.MODE_CTR, + counter=self.decryptcounter) + + def get_kc_o(self): + return self._kc_o + + kc_s = property(get_kc_s, set_kc_s) + kc_o = property(get_kc_o, set_kc_o) + + def encryptcounter(self): + self.c_s = (self.c_s + 1) % (2 ** self.n) + return crypto.encode_mpi_with_padding(self.c_s) + + def decryptcounter(self): + self.c_o = (self.c_o + 1) % (2 ** self.n) + return crypto.encode_mpi_with_padding(self.c_o) + + def sign(self, string): + if self.negotiated['sign_algs'] == (XmlDsig + 'rsa-sha256'): + hash = crypto.sha256(string) + return crypto.encode_mpi(gajim.pubkey.sign(hash, '')[0]) + + def encrypt_stanza(self, stanza): + encryptable = filter(lambda x: x.getName() not in ('error', 'amp', + 'thread'), stanza.getChildren()) + + # XXX can also encrypt contents of elements in stanzas @type = + # 'error' + # (except for child elements) + + old_en_counter = self.c_s + + for element in encryptable: + stanza.delChild(element) + + plaintext = ''.join(map(str, encryptable)) + + m_compressed = self.compress(plaintext) + m_final = self.encrypt(m_compressed) + + c = stanza.NT.c + c.setNamespace('http://www.xmpp.org/extensions/xep-0200.html#ns') + c.NT.data = base64.b64encode(m_final) + + # XXX check for rekey request, handle elements + + m_content = ''.join(map(str, c.getChildren())) + c.NT.mac = base64.b64encode(self.hmac(self.km_s, m_content + \ + crypto.encode_mpi(old_en_counter))) + + return stanza + + def hmac(self, key, content): + return HMAC.new(key, content, self.hash_alg).digest() + + def generate_initiator_keys(self, k): + return (self.hmac(k, 'Initiator Cipher Key'), + self.hmac(k, 'Initiator MAC Key'), + self.hmac(k, 'Initiator SIGMA Key') ) + + def generate_responder_keys(self, k): + return (self.hmac(k, 'Responder Cipher Key'), + self.hmac(k, 'Responder MAC Key'), + self.hmac(k, 'Responder SIGMA Key') ) + + def compress(self, plaintext): + if self.compression == None: + return plaintext + + def decompress(self, compressed): + if self.compression == None: + return compressed + + def encrypt(self, encryptable): + padded = crypto.pad_to_multiple(encryptable, 16, ' ', False) + + return self.encrypter.encrypt(padded) + + def decrypt_stanza(self, stanza): + c = stanza.getTag(name='c', + namespace='http://www.xmpp.org/extensions/xep-0200.html#ns') + + stanza.delChild(c) + + # contents of , minus , minus whitespace + macable = ''.join(map(str, filter(lambda x: x.getName() != 'mac', + c.getChildren()))) + + received_mac = base64.b64decode(c.getTagData('mac')) + calculated_mac = self.hmac(self.km_o, macable + \ + crypto.encode_mpi_with_padding(self.c_o)) + + if not calculated_mac == received_mac: + raise exceptions.DecryptionError, 'bad signature' + + m_final = base64.b64decode(c.getTagData('data')) + m_compressed = self.decrypt(m_final) + plaintext = self.decompress(m_compressed) + + try: + parsed = xmpp.Node(node='' + plaintext + '') + except: + raise exceptions.DecryptionError, 'decrypted not parseable as XML' + + for child in parsed.getChildren(): + stanza.addChild(node=child) + + return stanza + + def decrypt(self, ciphertext): + return self.decrypter.decrypt(ciphertext) + + def logging_preference(self): + if gajim.config.get('log_encrypted_sessions'): + return ["may", "mustnot"] + else: + return ["mustnot", "may"] + + def get_shared_secret(self, e, y, p): + if (not 1 < e < (p - 1)): + raise exceptions.NegotiationError, "invalid DH value" + + return crypto.sha256(crypto.encode_mpi(crypto.powmod(e, y, p))) + + def c7lize_mac_id(self, form): + kids = form.getChildren() + macable = filter(lambda x: x.getVar() not in ('mac', 'identity'), kids) + return ''.join(map(lambda el: xmpp.c14n.c14n(el), macable)) + + def verify_identity(self, form, dh_i, sigmai, i_o): + m_o = base64.b64decode(form['mac']) + id_o = base64.b64decode(form['identity']) + + m_o_calculated = self.hmac(self.km_o, crypto.encode_mpi(self.c_o) + id_o) + + if m_o_calculated != m_o: + raise exceptions.NegotiationError, 'calculated m_%s differs from received m_%s' % (i_o, i_o) + + if i_o == 'a' and self.sas_algs == 'sas28x5': + # XXX not necessary if there's a verified retained secret + self.sas = crypto.sas_28x5(m_o, self.form_s) + + if self.negotiated['recv_pubkey']: + plaintext = self.decrypt(id_o) + parsed = xmpp.Node(node='' + plaintext + '') + + if self.negotiated['recv_pubkey'] == 'hash': + fingerprint = parsed.getTagData('fingerprint') + + # XXX find stored pubkey or terminate session + raise 'unimplemented' + else: + if self.negotiated['sign_algs'] == (XmlDsig + 'rsa-sha256'): + keyvalue = parsed.getTag(name='RSAKeyValue', namespace=XmlDsig) + + n, e = map(lambda x: crypto.decode_mpi(base64.b64decode( + keyvalue.getTagData(x))), ('Modulus', 'Exponent')) + eir_pubkey = RSA.construct((n,long(e))) + + pubkey_o = xmpp.c14n.c14n(keyvalue) + else: + # XXX DSA, etc. + raise 'unimplemented' + + enc_sig = parsed.getTag(name='SignatureValue', + namespace=XmlDsig).getData() + signature = (crypto.decode_mpi(base64.b64decode(enc_sig)),) + else: + mac_o = self.decrypt(id_o) + pubkey_o = '' + + c7l_form = self.c7lize_mac_id(form) + + content = self.n_s + self.n_o + crypto.encode_mpi(dh_i) + pubkey_o + + if sigmai: + self.form_o = c7l_form + content += self.form_o + else: + form_o2 = c7l_form + content += self.form_o + form_o2 + + mac_o_calculated = self.hmac(self.ks_o, content) + + if self.negotiated['recv_pubkey']: + hash = crypto.sha256(mac_o_calculated) + + if not eir_pubkey.verify(hash, signature): + raise exceptions.NegotiationError, 'public key signature verification failed!' + + elif mac_o_calculated != mac_o: + raise exceptions.NegotiationError, 'calculated mac_%s differs from received mac_%s' % (i_o, i_o) + + def make_identity(self, form, dh_i): + if self.negotiated['send_pubkey']: + if self.negotiated['sign_algs'] == (XmlDsig + 'rsa-sha256'): + pubkey = secrets.secrets().my_pubkey(self.conn.name) + fields = (pubkey.n, pubkey.e) + + cb_fields = map(lambda f: base64.b64encode(crypto.encode_mpi(f)), fields) + + pubkey_s = '%s%s' % tuple(cb_fields) + else: + pubkey_s = '' + + form_s2 = ''.join(map(lambda el: xmpp.c14n.c14n(el), form.getChildren())) + + old_c_s = self.c_s + content = self.n_o + self.n_s + crypto.encode_mpi(dh_i) + pubkey_s + self.form_s + form_s2 + + mac_s = self.hmac(self.ks_s, content) + + if self.negotiated['send_pubkey']: + signature = self.sign(mac_s) + + sign_s = '%s' % base64.b64encode(signature) + + if self.negotiated['send_pubkey'] == 'hash': + b64ed = base64.b64encode(self.hash(pubkey_s)) + pubkey_s = '%s' % b64ed + + id_s = self.encrypt(pubkey_s + sign_s) + else: + id_s = self.encrypt(mac_s) + + m_s = self.hmac(self.km_s, crypto.encode_mpi(old_c_s) + id_s) + + if self.status == 'requested-e2e' and self.sas_algs == 'sas28x5': + # we're alice; check for a retained secret + # if none exists, prompt the user with the SAS + self.sas = crypto.sas_28x5(m_s, self.form_o) + + if self.sigmai: + # XXX save retained secret? + self.check_identity(lambda : ()) + + return (xmpp.DataField(name='identity', value=base64.b64encode(id_s)), \ + xmpp.DataField(name='mac', value=base64.b64encode(m_s))) + + def negotiate_e2e(self, sigmai): + self.negotiated = {} + + request = xmpp.Message() + feature = request.NT.feature + feature.setNamespace(xmpp.NS_FEATURE) + + x = xmpp.DataForm(typ='form') + + x.addChild(node=xmpp.DataField(name='FORM_TYPE', value='urn:xmpp:ssn', typ='hidden')) + x.addChild(node=xmpp.DataField(name='accept', value='1', typ='boolean', required=True)) + + # this field is incorrectly called 'otr' in XEPs 0116 and 0217 + x.addChild(node=xmpp.DataField(name='logging', typ='list-single', options=self.logging_preference(), required=True)) + + # unsupported options: 'disabled', 'enabled' + x.addChild(node=xmpp.DataField(name='disclosure', typ='list-single', options=['never'], required=True)) + x.addChild(node=xmpp.DataField(name='security', typ='list-single', options=['e2e'], required=True)) + x.addChild(node=xmpp.DataField(name='crypt_algs', value='aes128-ctr', typ='hidden')) + x.addChild(node=xmpp.DataField(name='hash_algs', value='sha256', typ='hidden')) + x.addChild(node=xmpp.DataField(name='compress', value='none', typ='hidden')) + + # unsupported options: 'iq', 'presence' + x.addChild(node=xmpp.DataField(name='stanzas', typ='list-multi', options=['message'])) + + x.addChild(node=xmpp.DataField(name='init_pubkey', options=['none', 'key', 'hash'], typ='list-single')) + + # XXX store key, use hash + x.addChild(node=xmpp.DataField(name='resp_pubkey', options=['none', 'key'], typ='list-single')) + + x.addChild(node=xmpp.DataField(name='ver', value='1.0', typ='hidden')) + + x.addChild(node=xmpp.DataField(name='rekey_freq', value='4294967295', typ='hidden')) + + x.addChild(node=xmpp.DataField(name='sas_algs', value='sas28x5', typ='hidden')) + x.addChild(node=xmpp.DataField(name='sign_algs', value='http://www.w3.org/2000/09/xmldsig#rsa-sha256', typ='hidden')) + + self.n_s = crypto.generate_nonce() + + x.addChild(node=xmpp.DataField(name='my_nonce', value=base64.b64encode(self.n_s), typ='hidden')) + + modp_options = [ 5, 14, 2, 1 ] + + x.addChild(node=xmpp.DataField(name='modp', typ='list-single', options=map(lambda x: [ None, x ], modp_options))) + + x.addChild(node=self.make_dhfield(modp_options, sigmai)) + self.sigmai = sigmai + + self.form_s = ''.join(map(lambda el: xmpp.c14n.c14n(el), x.getChildren())) + + feature.addChild(node=x) + + self.status = 'requested-e2e' + + self.send(request) + + # 4.3 esession response (bob) + def verify_options_bob(self, form): + negotiated = {'recv_pubkey': None, 'send_pubkey': None} + not_acceptable = [] + ask_user = {} + + fixed = { 'disclosure': 'never', + 'security': 'e2e', + 'crypt_algs': 'aes128-ctr', + 'hash_algs': 'sha256', + 'compress': 'none', + 'stanzas': 'message', + 'init_pubkey': 'none', + 'resp_pubkey': 'none', + 'ver': '1.0', + 'sas_algs': 'sas28x5' } + + self.encryptable_stanzas = ['message'] + + self.sas_algs = 'sas28x5' + self.cipher = AES + self.hash_alg = SHA256 + self.compression = None + + for name, field in map(lambda name: (name, form.getField(name)), form.asDict().keys()): + options = map(lambda x: x[1], field.getOptions()) + values = field.getValues() + + if not field.getType() in ('list-single', 'list-multi'): + options = values + + if name in fixed: + if fixed[name] in options: + negotiated[name] = fixed[name] + else: + not_acceptable.append(name) + elif name == 'rekey_freq': + preferred = int(options[0]) + negotiated['rekey_freq'] = preferred + self.rekey_freq = preferred + elif name == 'logging': + my_prefs = self.logging_preference() + + if my_prefs[0] in options: # our first choice is offered, select it + pref = my_prefs[0] + negotiated['logging'] = pref + else: # see if other acceptable choices are offered + for pref in my_prefs: + if pref in options: + ask_user['logging'] = pref + break + + if not 'logging' in ask_user: + not_acceptable.append(name) + elif name == 'init_pubkey': + for x in ('key'): + if x in options: + negotiated['recv_pubkey'] = x + break + elif name == 'resp_pubkey': + for x in ('hash', 'key'): + if x in options: + negotiated['send_pubkey'] = x + break + elif name == 'sign_algs': + if (XmlDsig + 'rsa-sha256') in options: + negotiated['sign_algs'] = XmlDsig + 'rsa-sha256' + else: + # XXX some things are handled elsewhere, some things are not-implemented + pass + + return (negotiated, not_acceptable, ask_user) + + # 4.3 esession response (bob) + def respond_e2e_bob(self, form, negotiated, not_acceptable): + response = xmpp.Message() + feature = response.NT.feature + feature.setNamespace(xmpp.NS_FEATURE) + + x = xmpp.DataForm(typ='submit') + + x.addChild(node=xmpp.DataField(name='FORM_TYPE', value='urn:xmpp:ssn')) + x.addChild(node=xmpp.DataField(name='accept', value='true')) + + for name in negotiated: + # some fields are internal and should not be sent + if not name in ('send_pubkey', 'recv_pubkey'): + x.addChild(node=xmpp.DataField(name=name, value=negotiated[name])) + + self.negotiated = negotiated + + # the offset of the group we chose (need it to match up with the dhhash) + group_order = 0 + self.modp = int(form.getField('modp').getOptions()[group_order][1]) + x.addChild(node=xmpp.DataField(name='modp', value=self.modp)) + + g = dh.generators[self.modp] + p = dh.primes[self.modp] + + self.n_o = base64.b64decode(form['my_nonce']) + + dhhashes = form.getField('dhhashes').getValues() + self.negotiated['He'] = base64.b64decode(dhhashes[group_order].encode("utf8")) + + bytes = int(self.n / 8) + + self.n_s = crypto.generate_nonce() + + self.c_o = crypto.decode_mpi(crypto.random_bytes(bytes)) # n-bit random number + self.c_s = self.c_o ^ (2 ** (self.n - 1)) + + self.y = crypto.srand(2 ** (2 * self.n - 1), p - 1) + self.d = crypto.powmod(g, self.y, p) + + to_add = { 'my_nonce': self.n_s, + 'dhkeys': crypto.encode_mpi(self.d), + 'counter': crypto.encode_mpi(self.c_o), + 'nonce': self.n_o } + + for name in to_add: + b64ed = base64.b64encode(to_add[name]) + x.addChild(node=xmpp.DataField(name=name, value=b64ed)) + + self.form_o = ''.join(map(lambda el: xmpp.c14n.c14n(el), form.getChildren())) + self.form_s = ''.join(map(lambda el: xmpp.c14n.c14n(el), x.getChildren())) + + self.status = 'responded-e2e' + + feature.addChild(node=x) + + if not_acceptable: + response = xmpp.Error(response, xmpp.ERR_NOT_ACCEPTABLE) + + feature = xmpp.Node(xmpp.NS_FEATURE + ' feature') + + for f in not_acceptable: + n = xmpp.Node('field') + n['var'] = f + feature.addChild(node=n) + + response.T.error.addChild(node=feature) + + self.send(response) + + # 'Alice Accepts' + def verify_options_alice(self, form): + negotiated = {} + ask_user = {} + not_acceptable = [] + + if not form['logging'] in self.logging_preference(): + not_acceptable.append(form['logging']) + elif form['logging'] != self.logging_preference()[0]: + ask_user['logging'] = form['logging'] + else: + negotiated['logging'] = self.logging_preference()[0] + + for r,a in (('recv_pubkey', 'resp_pubkey'), ('send_pubkey', 'init_pubkey')): + negotiated[r] = None + + if a in form.asDict() and form[a] in ('key', 'hash'): + negotiated[r] = form[a] + + if 'sign_algs' in form.asDict(): + if form['sign_algs'] in (XmlDsig + 'rsa-sha256',): + negotiated['sign_algs'] = form['sign_algs'] + else: + not_acceptable.append(form['sign_algs']) + + return (negotiated, not_acceptable, ask_user) + + # 'Alice Accepts', continued + def accept_e2e_alice(self, form, negotiated): + self.encryptable_stanzas = ['message'] + self.sas_algs = 'sas28x5' + self.cipher = AES + self.hash_alg = SHA256 + self.compression = None + + self.negotiated = negotiated + + accept = xmpp.Message() + feature = accept.NT.feature + feature.setNamespace(xmpp.NS_FEATURE) + + result = xmpp.DataForm(typ='result') + + self.c_s = crypto.decode_mpi(base64.b64decode(form['counter'])) + self.c_o = self.c_s ^ (2 ** (self.n - 1)) + + self.n_o = base64.b64decode(form['my_nonce']) + + mod_p = int(form['modp']) + p = dh.primes[mod_p] + x = self.xes[mod_p] + e = self.es[mod_p] + + self.d = crypto.decode_mpi(base64.b64decode(form['dhkeys'])) + + self.k = self.get_shared_secret(self.d, x, p) + + result.addChild(node=xmpp.DataField(name='FORM_TYPE', value='urn:xmpp:ssn')) + result.addChild(node=xmpp.DataField(name='accept', value='1')) + result.addChild(node=xmpp.DataField(name='nonce', value=base64.b64encode(self.n_o))) + + self.kc_s, self.km_s, self.ks_s = self.generate_initiator_keys(self.k) + + if self.sigmai: + self.kc_o, self.km_o, self.ks_o = self.generate_responder_keys(self.k) + self.verify_identity(form, self.d, True, 'b') + else: + srses = secrets.secrets().retained_secrets(self.conn.name, self.jid.getStripped()) + rshashes = [self.hmac(self.n_s, rs) for (rs,v) in srses] + + if not rshashes: + # we've never spoken before, but we'll pretend we have + rshash_size = self.hash_alg.digest_size + rshashes.append(crypto.random_bytes(rshash_size)) + + rshashes = [base64.b64encode(rshash) for rshash in rshashes] + result.addChild(node=xmpp.DataField(name='rshashes', value=rshashes)) + result.addChild(node=xmpp.DataField(name='dhkeys', value=base64.b64encode(crypto.encode_mpi(e)))) + + self.form_o = ''.join(map(lambda el: xmpp.c14n.c14n(el), form.getChildren())) + + # MUST securely destroy K unless it will be used later to generate the final shared secret + + for datafield in self.make_identity(result, e): + result.addChild(node=datafield) + + feature.addChild(node=result) + self.send(accept) + + if self.sigmai: + self.status = 'active' + self.enable_encryption = True + else: + self.status = 'identified-alice' + + # 4.5 esession accept (bob) + def accept_e2e_bob(self, form): + response = xmpp.Message() + + init = response.NT.init + init.setNamespace(xmpp.NS_ESESSION_INIT) + + x = xmpp.DataForm(typ='result') + + for field in ('nonce', 'dhkeys', 'rshashes', 'identity', 'mac'): + assert field in form.asDict(), "alice's form didn't have a %s field" % field + + # 4.5.1 generating provisory session keys + e = crypto.decode_mpi(base64.b64decode(form['dhkeys'])) + p = dh.primes[self.modp] + + if crypto.sha256(crypto.encode_mpi(e)) != self.negotiated['He']: + raise exceptions.NegotiationError, 'SHA256(e) != He' + + k = self.get_shared_secret(e, self.y, p) + + self.kc_o, self.km_o, self.ks_o = self.generate_initiator_keys(k) + + # 4.5.2 verifying alice's identity + + self.verify_identity(form, e, False, 'a') + + # 4.5.4 generating bob's final session keys + + srs = '' + + srses = secrets.secrets().retained_secrets(self.conn.name, self.jid.getStripped()) + rshashes = [base64.b64decode(rshash) for rshash in form.getField('rshashes').getValues()] + + for (secret, verified) in srses: + if self.hmac(self.n_o, secret) in rshashes: + srs = secret + break + + # other shared secret + # (we're not using one) + oss = '' + + k = crypto.sha256(k + srs + oss) + + self.kc_s, self.km_s, self.ks_s = self.generate_responder_keys(k) + self.kc_o, self.km_o, self.ks_o = self.generate_initiator_keys(k) + + # 4.5.5 + if srs: + srshash = self.hmac(srs, 'Shared Retained Secret') + else: + srshash = crypto.random_bytes(32) + + x.addChild(node=xmpp.DataField(name='FORM_TYPE', value='urn:xmpp:ssn')) + x.addChild(node=xmpp.DataField(name='nonce', value=base64.b64encode(self.n_o))) + x.addChild(node=xmpp.DataField(name='srshash', value=base64.b64encode(srshash))) + + for datafield in self.make_identity(x, self.d): + x.addChild(node=datafield) + + init.addChild(node=x) + + self.send(response) + + self.do_retained_secret(k, srs) + + if self.negotiated['logging'] == 'mustnot': + self.loggable = False + + self.status = 'active' + self.enable_encryption = True + + if hasattr(self, 'control'): + self.control.print_esession_details() + + def final_steps_alice(self, form): + srs = '' + srses = secrets.secrets().retained_secrets(self.conn.name, self.jid.getStripped()) + + srshash = base64.b64decode(form['srshash']) + + for (secret, verified) in srses: + if self.hmac(secret, 'Shared Retained Secret') == srshash: + srs = secret + break + + oss = '' + k = crypto.sha256(self.k + srs + oss) + del self.k + + self.do_retained_secret(k, srs) + + # don't need to calculate ks_s here + + self.kc_s, self.km_s, self.ks_s = self.generate_initiator_keys(k) + self.kc_o, self.km_o, self.ks_o = self.generate_responder_keys(k) + + # 4.6.2 Verifying Bob's Identity + + self.verify_identity(form, self.d, False, 'b') +# Note: If Alice discovers an error then she SHOULD ignore any encrypted content she received in the stanza. + + if self.negotiated['logging'] == 'mustnot': + self.loggable = False + + self.status = 'active' + self.enable_encryption = True + + if hasattr(self, 'control'): + self.control.print_esession_details() + + # calculate and store the new retained secret + # prompt the user to check the remote party's identity (if necessary) + def do_retained_secret(self, k, srs): + new_srs = self.hmac(k, 'New Retained Secret') + account = self.conn.name + bjid = self.jid.getStripped() + + if srs: + if secrets.secrets().srs_verified(account, bjid, srs): + secrets.secrets().replace_srs(account, bjid, srs, new_srs, True) + else: + def _cb(verified): + secrets.secrets().replace_srs(account, bjid, srs, new_srs, verified) + + self.check_identity(_cb) + else: + def _cb(verified): + secrets.secrets().save_new_srs(account, bjid, new_srs, verified) + + self.check_identity(_cb) + + def make_dhfield(self, modp_options, sigmai): + dhs = [] + + for modp in modp_options: + p = dh.primes[modp] + g = dh.generators[modp] + + x = crypto.srand(2 ** (2 * self.n - 1), p - 1) + + # XXX this may be a source of performance issues + e = crypto.powmod(g, x, p) + + self.xes[modp] = x + self.es[modp] = e + + if sigmai: + dhs.append(base64.b64encode(crypto.encode_mpi(e))) + name = 'dhkeys' + else: + He = crypto.sha256(crypto.encode_mpi(e)) + dhs.append(base64.b64encode(He)) + name = 'dhhashes' + + return xmpp.DataField(name=name, typ='hidden', value=dhs) + + def terminate_e2e(self): + self.terminate() + + self.enable_encryption = False + + def acknowledge_termination(self): + StanzaSession.acknowledge_termination(self) + + self.enable_encryption = False + + def fail_bad_negotiation(self, reason, fields = None): + '''sends an error and cancels everything. + +if fields == None, the remote party has given us a bad cryptographic value of some kind + +otherwise, list the fields we haven't implemented''' + + err = xmpp.Error(xmpp.Message(), xmpp.ERR_FEATURE_NOT_IMPLEMENTED) + err.T.error.T.text.setData(reason) + + if fields: + feature = xmpp.Node(xmpp.NS_FEATURE + ' feature') + + for field in fields: + fn = xmpp.Node('field') + fn['var'] = field + feature.addChild(node=feature) + + err.addChild(node=feature) + + self.send(err) + + self.status = None + self.enable_encryption = False + + # this prevents the MAC check on decryption from succeeding, + # preventing falsified messages from going through. + self.km_o = '' + + def is_loggable(self): + account = self.conn.name + no_log_for = gajim.config.get_per('accounts', account, 'no_log_for') + + if not no_log_for: + no_log_for = '' + + no_log_for = no_log_for.split() + + return self.loggable and account not in no_log_for and self.jid not in no_log_for + + def cancelled_negotiation(self): + StanzaSession.cancelled_negotiation(self) + self.enable_encryption = False + + self.km_o = '' diff --git a/src/common/xmpp/c14n.py b/src/common/xmpp/c14n.py new file mode 100644 index 000000000..b58e0a1d6 --- /dev/null +++ b/src/common/xmpp/c14n.py @@ -0,0 +1,36 @@ +from simplexml import ustr + +# XML canonicalisation methods (for XEP-0116) +def c14n(node): + s = "<" + node.name + if node.namespace: + if not node.parent or node.parent.namespace != node.namespace: + s = s + ' xmlns="%s"' % node.namespace + + sorted_attrs = node.attrs.keys() + sorted_attrs.sort() + for key in sorted_attrs: + val = ustr(node.attrs[key]) + # like XMLescape() but with whitespace and without > + s = s + ' %s="%s"' % ( key, normalise_attr(val) ) + s = s + ">" + cnt = 0 + if node.kids: + for a in node.kids: + if (len(node.data)-1) >= cnt: + s = s + normalise_text(node.data[cnt]) + s = s + c14n(a) + cnt=cnt+1 + if (len(node.data)-1) >= cnt: s = s + normalise_text(node.data[cnt]) + if not node.kids and s[-1:]=='>': + s=s[:-1]+' />' + else: + s = s + "" + return s.encode('utf-8') + +def normalise_attr(val): + return val.replace('&', '&').replace('<', '<').replace('"', '"').replace('\t', ' ').replace('\n', ' ').replace('\r', ' ') + +def normalise_text(val): + return val.replace('&', '&').replace('<', '<').replace('>', '>').replace('\r', ' ') + diff --git a/src/common/xmpp/idlequeue.py b/src/common/xmpp/idlequeue.py index db0c575bd..5ee73c987 100644 --- a/src/common/xmpp/idlequeue.py +++ b/src/common/xmpp/idlequeue.py @@ -204,15 +204,15 @@ class SelectIdleQueue(IdleQueue): except select.error, e: waiting_descriptors = ((),(),()) if e[0] != 4: # interrupt - raise - for fd in waiting_descriptors[0]: - self.queue.get(fd).pollin() - self.check_time_events() - return True + raise + for fd in waiting_descriptors[0]: + q = self.queue.get(fd) + if q: + q.pollin() for fd in waiting_descriptors[1]: - self.queue.get(fd).pollout() - self.check_time_events() - return True + q = self.queue.get(fd) + if q: + q.pollout() for fd in waiting_descriptors[2]: self.queue.get(fd).pollend() self.check_time_events() diff --git a/src/common/xmpp/protocol.py b/src/common/xmpp/protocol.py index 3c160a62c..c09b9921f 100644 --- a/src/common/xmpp/protocol.py +++ b/src/common/xmpp/protocol.py @@ -48,6 +48,7 @@ NS_DISCO ='http://jabber.org/protocol/disco' NS_DISCO_INFO =NS_DISCO+'#info' NS_DISCO_ITEMS =NS_DISCO+'#items' NS_ENCRYPTED ='jabber:x:encrypted' # XEP-0027 +NS_ESESSION_INIT='http://www.xmpp.org/extensions/xep-0116.html#ns-init' # XEP-0116 NS_EVENT ='jabber:x:event' # XEP-0022 NS_FEATURE ='http://jabber.org/protocol/feature-neg' NS_FILE ='http://jabber.org/protocol/si/profile/file-transfer' # JEP-0096 @@ -66,6 +67,7 @@ NS_MUC ='http://jabber.org/protocol/muc' NS_MUC_USER =NS_MUC+'#user' NS_MUC_ADMIN =NS_MUC+'#admin' NS_MUC_OWNER =NS_MUC+'#owner' +NS_MUC_UNIQUE =NS_MUC+'#unique' NS_NICK ='http://jabber.org/protocol/nick' # XEP-0172 NS_OFFLINE ='http://www.jabber.org/jeps/jep-0030.html' # XEP-0013 NS_PHYSLOC ='http://jabber.org/protocol/physloc' # XEP-0112 @@ -86,6 +88,7 @@ NS_SESSION ='urn:ietf:params:xml:ns:xmpp-session' NS_SI ='http://jabber.org/protocol/si' # XEP-0096 NS_SI_PUB ='http://jabber.org/protocol/sipub' # XEP-0137 NS_SIGNED ='jabber:x:signed' # XEP-0027 +NS_STANZA_CRYPTO='http://www.xmpp.org/extensions/xep-0200.html#ns' # JEP-0200 NS_STANZAS ='urn:ietf:params:xml:ns:xmpp-stanzas' NS_STREAM ='http://affinix.com/jabber/stream' NS_STREAMS ='http://etherx.jabber.org/streams' diff --git a/src/common/xmpp/roster.py b/src/common/xmpp/roster.py index 86c9e8438..b90c30732 100644 --- a/src/common/xmpp/roster.py +++ b/src/common/xmpp/roster.py @@ -64,6 +64,10 @@ class Roster(PlugIn): def RosterIqHandler(self,dis,stanza): """ Subscription tracker. Used internally for setting items state in internal roster representation. """ + sender = stanza.getAttr('from') + if not sender == None and not sender.bareMatch( + self._owner.User + '@' + self._owner.Server): + return for item in stanza.getTag('query').getTags('item'): jid=item.getAttr('jid') if item.getAttr('subscription')=='remove': diff --git a/src/common/xmpp/transports_nb.py b/src/common/xmpp/transports_nb.py index c5115cc1c..c4cda4636 100644 --- a/src/common/xmpp/transports_nb.py +++ b/src/common/xmpp/transports_nb.py @@ -554,8 +554,8 @@ class NonBlockingTcp(PlugIn, IdleObject): # FIXME: This happens when we switch an already # connected socket to SSL (STARTTLS). Instead of # ignoring the error, the socket should only be - # connected to once. See #2846. - workaround = (errno.EALREADY, 10056) + # connected to once. See #2846 and #3396. + workaround = (errno.EALREADY, 10056, 56) # 10035 - winsock equivalent of EINPROGRESS if errnum not in (errno.EINPROGRESS, 10035) + workaround: @@ -745,10 +745,34 @@ class NonBlockingTLS(PlugIn): #tcpsock._sslContext = OpenSSL.SSL.Context(OpenSSL.SSL.SSLv23_METHOD) tcpsock.ssl_errnum = 0 tcpsock._sslContext.set_verify(OpenSSL.SSL.VERIFY_PEER, self._ssl_verify_callback) + cacerts = os.path.join(gajim.DATA_DIR, 'other', 'cacerts.pem') try: - tcpsock._sslContext.load_verify_locations(os.path.join(gajim.DATA_DIR, 'other', 'cacerts.pem')) + tcpsock._sslContext.load_verify_locations(cacerts) except: - log.warning(_("Unable to load SSL certificats from file %s" % os.path.abspath(os.path.join(gajim.DATA_DIR,'other','ca.crt')))) + log.warning('Unable to load SSL certificats from file %s' % \ + os.path.abspath(cacerts)) + # load users certs + if os.path.isfile(gajim.MY_CACERTS): + store = tcpsock._sslContext.get_cert_store() + f = open(gajim.MY_CACERTS) + lines = f.readlines() + i = 0 + begin = -1 + for line in lines: + if 'BEGIN CERTIFICATE' in line: + begin = i + continue + elif 'END CERTIFICATE' in line and begin > -1: + cert = ''.join(lines[begin:i+2]) + try: + X509cert = OpenSSL.crypto.load_certificate( + OpenSSL.crypto.FILETYPE_PEM, cert) + store.add_cert(X509cert) + except: + log.warning('Unable to load a certificate from file %s' % \ + gajim.MY_CACERTS) + begin = -1 + i += 1 tcpsock._sslObj = OpenSSL.SSL.Connection(tcpsock._sslContext, tcpsock._sock) tcpsock._sslObj.set_connect_state() # set to client mode @@ -788,9 +812,12 @@ class NonBlockingTLS(PlugIn): def _ssl_verify_callback(self, sslconn, cert, errnum, depth, ok): # Exceptions can't propagate up through this callback, so print them here. try: + self._owner.Connection.ssl_fingerprint_sha1 = cert.digest('sha1') if errnum == 0: return True self._owner.Connection.ssl_errnum = errnum + self._owner.Connection.ssl_cert_pem = OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_PEM, cert) return True except: log.error("Exception caught in _ssl_info_callback:", exc_info=True) diff --git a/src/common/xmpp_stringprep.py b/src/common/xmpp_stringprep.py index f0cb473c9..9ce38e16f 100644 --- a/src/common/xmpp_stringprep.py +++ b/src/common/xmpp_stringprep.py @@ -1,21 +1,26 @@ ## common/xmpp_stringprep.py ## ## Contributors for this file: -## - Yann Le Boulanger +## - Yann Leboulanger ## - Nikos Kouremenos ## ## Copyright (C) 2001-2005 Twisted Matrix Laboratories. ## Copyright (C) 2005 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 sys, warnings diff --git a/src/common/zeroconf/client_zeroconf.py b/src/common/zeroconf/client_zeroconf.py index c3de88a38..ff9308162 100644 --- a/src/common/zeroconf/client_zeroconf.py +++ b/src/common/zeroconf/client_zeroconf.py @@ -3,15 +3,20 @@ ## Copyright (C) 2006 Stefan Bethge ## 2006 Dimitur Kirov ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## from common import gajim import common.xmpp from common.xmpp.idlequeue import IdleObject @@ -74,7 +79,16 @@ class ZeroconfListener(IdleObject): def pollin(self): ''' accept a new incomming connection and notify queue''' sock = self.accept_conn() - P2PClient(sock[0], sock[1][0], sock[1][1], self.conn_holder) + ''' loop through roster to find who has connected to us''' + from_jid = None + nameinfo = socket.getnameinfo(sock[1], 0) + ipaddr = socket.gethostbyname(nameinfo[0]) + for jid in self.conn_holder.getRoster().keys(): + entry = self.conn_holder.getRoster().getItem(jid) + if (entry['address'] == ipaddr): + from_jid = jid + break; + P2PClient(sock[0], sock[1][0], sock[1][1], self.conn_holder, [], from_jid) def disconnect(self): ''' free all resources, we are not listening anymore ''' @@ -212,11 +226,11 @@ class P2PClient(IdleObject): def on_disconnect(self): if self.conn_holder: - if self.conn_holder.number_of_awaiting_messages.has_key(self.conn_holder.fd): - if self.conn_holder.number_of_awaiting_messages[self.conn_holder.fd] > 0: + if self.conn_holder.number_of_awaiting_messages.has_key(self.fd): + if self.conn_holder.number_of_awaiting_messages[self.fd] > 0: self._caller.dispatch('MSGERROR',[unicode(self.to), -1, \ _('Connection to host could not be established'), None, None]) - del self.conn_holder.number_of_awaiting_messages[self.conn_holder.fd] + del self.conn_holder.number_of_awaiting_messages[self.fd] self.conn_holder.remove_connection(self.sock_hash) if self.__dict__.has_key('Dispatcher'): self.Dispatcher.PlugOut() diff --git a/src/common/zeroconf/connection_handlers_zeroconf.py b/src/common/zeroconf/connection_handlers_zeroconf.py index eaa2f6a17..8ccc68d64 100644 --- a/src/common/zeroconf/connection_handlers_zeroconf.py +++ b/src/common/zeroconf/connection_handlers_zeroconf.py @@ -2,21 +2,26 @@ ## Copyright (C) 2006 Gajim Team ## ## Contributors for this file: -## - Yann Le Boulanger +## - Yann Leboulanger ## - Nikos Kouremenos ## - Dimitur Kirov ## - Travis Shirk ## - Stefan Bethge ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 os import time @@ -44,6 +49,8 @@ except: gajim.log.debug(_('Unable to load idle module')) HAS_IDLE = False +from common.stanza_session import EncryptedStanzaSession + class ConnectionVcard: def __init__(self): self.vcard_sha = None @@ -138,7 +145,7 @@ class ConnectionBytestream: def __init__(self): self.files_props = {} - def is_transfer_stoped(self, file_props): + def is_transfer_stopped(self, file_props): if file_props.has_key('error') and file_props['error'] != 0: return True if file_props.has_key('completed') and file_props['completed']: @@ -167,7 +174,7 @@ class ConnectionBytestream: def remove_transfers_for_contact(self, contact): ''' stop all active transfer for contact ''' for file_props in self.files_props.values(): - if self.is_transfer_stoped(file_props): + if self.is_transfer_stopped(file_props): continue receiver_jid = unicode(file_props['receiver']).split('/')[0] if contact.jid == receiver_jid: @@ -593,6 +600,7 @@ class ConnectionBytestream: 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 @@ -628,6 +636,8 @@ class ConnectionHandlersZeroconf(ConnectionVcard, ConnectionBytestream): # keep the jids we auto added (transports contacts) to not send the # SUBSCRIBED event to gui self.automatically_added = [] + # keep track of sessions this connection has with other JIDs + self.sessions = {} try: idle.init() except: @@ -635,26 +645,55 @@ class ConnectionHandlersZeroconf(ConnectionVcard, ConnectionBytestream): def _messageCB(self, ip, con, msg): '''Called when we receive a message''' - msgtxt = msg.getBody() - msghtml = msg.getXHTML() mtype = msg.getType() - subject = msg.getSubject() # if not there, it's None + thread_id = msg.getThread() tim = msg.getTimestamp() tim = helpers.datetime_tuple(tim) tim = time.localtime(timegm(tim)) frm = msg.getFrom() + if frm == None: for key in self.connection.zeroconf.contacts: if ip == self.connection.zeroconf.contacts[key][zeroconf.C_ADDRESS]: frm = key frm = unicode(frm) jid = frm + + session = self.get_session(frm, thread_id, mtype) + + if thread_id and not session.received_thread_id: + session.received_thread_id = True + + if msg.getTag('feature') and msg.getTag('feature').namespace == \ + common.xmpp.NS_FEATURE: + if gajim.HAVE_PYCRYPTO: + self._FeatureNegCB(con, msg, session) + return + if msg.getTag('init') and msg.getTag('init').namespace == \ + common.xmpp.NS_ESESSION_INIT: + self._InitE2ECB(con, msg, session) + no_log_for = gajim.config.get_per('accounts', self.name, 'no_log_for').split() encrypted = False chatstate = None + + e2e_tag = msg.getTag('c', namespace = common.xmpp.NS_STANZA_CRYPTO) + if e2e_tag: + encrypted = True + + try: + msg = session.decrypt_stanza(msg) + except: + self.dispatch('FAILED_DECRYPT', (frm, tim)) + + msgtxt = msg.getBody() + msghtml = msg.getXHTML() + subject = msg.getSubject() # if not there, it's None + encTag = msg.getTag('x', namespace = common.xmpp.NS_ENCRYPTED) decmsg = '' + form_node = msg.getTag('x', namespace = common.xmpp.NS_DATA) # invitations invite = None if not encTag: @@ -715,16 +754,122 @@ class ConnectionHandlersZeroconf(ConnectionVcard, ConnectionBytestream): msg_id = gajim.logger.write('chat_msg_recv', frm, msgtxt, tim = tim, subject = subject) self.dispatch('MSG', (frm, msgtxt, tim, encrypted, mtype, subject, - chatstate, msg_id, composing_xep, user_nick, msghtml)) + chatstate, msg_id, composing_xep, user_nick, msghtml, session, + form_node)) elif mtype == 'normal': # it's single message if self.name not in no_log_for and jid not in no_log_for and msgtxt: gajim.logger.write('single_msg_recv', frm, msgtxt, tim = tim, subject = subject) if invite: self.dispatch('MSG', (frm, msgtxt, tim, encrypted, 'normal', - subject, chatstate, msg_id, composing_xep, user_nick)) + subject, chatstate, msg_id, composing_xep, user_nick, msghtml, + session, form_node)) # END messageCB + def _FeatureNegCB(self, con, stanza, session): + gajim.log.debug('FeatureNegCB') + feature = stanza.getTag(name='feature', namespace=common.xmpp.NS_FEATURE) + form = common.xmpp.DataForm(node=feature.getTag('x')) + + if form['FORM_TYPE'] == 'urn:xmpp:ssn': + self.dispatch('SESSION_NEG', (stanza.getFrom(), session, form)) + else: + reply = stanza.buildReply() + reply.setType('error') + + reply.addChild(feature) + reply.addChild(node=xmpp.ErrorNode('service-unavailable', typ='cancel')) + + con.send(reply) + + raise common.xmpp.NodeProcessed + + def _InitE2ECB(self, con, stanza, session): + gajim.log.debug('InitE2ECB') + init = stanza.getTag(name='init', namespace=common.xmpp.NS_ESESSION_INIT) + form = common.xmpp.DataForm(node=init.getTag('x')) + + self.dispatch('SESSION_NEG', (stanza.getFrom(), session, form)) + + raise common.xmpp.NodeProcessed + + def get_session(self, jid, thread_id, type): + '''returns an existing session between this connection and 'jid', returns a new one if none exist.''' + session = self.find_session(jid, thread_id, type) + + if session: + return session + else: + # it's possible we initiated a session with a bare JID and this is the + # first time we've seen a resource + bare_jid = gajim.get_jid_without_resource(jid) + if bare_jid != jid: + session = self.find_session(bare_jid, thread_id, type) + if session: + if not session.received_thread_id: + thread_id = session.thread_id + + self.move_session(bare_jid, thread_id, jid.split("/")[1]) + return session + + return self.make_new_session(jid, thread_id, type) + + def find_session(self, jid, thread_id, type): + try: + if type == 'chat' and not thread_id: + return self.find_null_session(jid) + else: + return self.sessions[jid][thread_id] + except KeyError: + return None + + def delete_session(self, jid, thread_id): + try: + del self.sessions[jid][thread_id] + + if not self.sessions[jid]: + del self.sessions[jid] + except KeyError: + print "jid %s should have been in %s, but it wasn't. missing session?" % (repr(jid), repr(self.sessions.keys())) + + def move_session(self, original_jid, thread_id, to_resource): + '''moves a session to another resource.''' + session = self.sessions[original_jid][thread_id] + + del self.sessions[original_jid][thread_id] + + new_jid = gajim.get_jid_without_resource(original_jid) + '/' + to_resource + session.jid = common.xmpp.JID(new_jid) + + if not new_jid in self.sessions: + self.sessions[new_jid] = {} + + self.sessions[new_jid][thread_id] = session + + def find_null_session(self, jid): + '''finds all of the sessions between us and jid that jid hasn't sent a thread_id in yet. + +returns the session that we last sent a message to.''' + + sessions_with_jid = self.sessions[jid].values() + no_threadid_sessions = filter(lambda s: not s.received_thread_id, sessions_with_jid) + + if no_threadid_sessions: + no_threadid_sessions.sort(key=lambda s: s.last_send) + return no_threadid_sessions[-1] + else: + return None + + def make_new_session(self, jid, thread_id = None, type = 'chat'): + sess = EncryptedStanzaSession(self, common.xmpp.JID(jid), thread_id, type) + + if not jid in self.sessions: + self.sessions[jid] = {} + + self.sessions[jid][sess.thread_id] = sess + + return sess + def parse_data_form(self, node): dic = {} tag = node.getTag('title') diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index b218eab41..36f56a347 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -1,15 +1,15 @@ ## common/zeroconf/connection_zeroconf.py ## ## Contributors for this file: -## - Yann Le Boulanger +## - Yann Leboulanger ## - Nikos Kouremenos ## - Dimitur Kirov ## - Travis Shirk ## - Stefan Bethge ## -## Copyright (C) 2003-2004 Yann Le Boulanger +## Copyright (C) 2003-2004 Yann Leboulanger ## Vincent Hanquez -## Copyright (C) 2006 Yann Le Boulanger +## Copyright (C) 2006 Yann Leboulanger ## Vincent Hanquez ## Nikos Kouremenos ## Dimitur Kirov @@ -17,15 +17,20 @@ ## Norman Rasmussen ## Stefan Bethge ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 os @@ -57,6 +62,8 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): self.connected = 0 # offline self.connection = None self.gpg = None + if USE_GPG: + self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) self.is_zeroconf = True self.privacy_rules_supported = False self.blocked_contacts = [] @@ -82,15 +89,13 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): # Do we continue connection when we get roster (send presence,get vcard...) self.continue_connect_info = None if USE_GPG: - self.gpg = GnuPG.GnuPG() - gajim.config.set('usegpg', True) - else: - gajim.config.set('usegpg', False) + 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 @@ -135,7 +140,8 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): gajim.log.debug('reconnect') # signed = self.get_signed_msg(self.status) - self.connect(self.old_show, self.status) + self.disconnect() + self.change_status(self.old_show, self.status) def quit(self, kill_core): if kill_core and self.connected > 1: @@ -314,6 +320,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): check = self.connection.announce() else: self.connected = STATUS_LIST.index(show) + self.dispatch('SIGNED_IN', ()) # 'disconnect' elif show == 'offline' and self.connected: @@ -349,7 +356,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): def send_message(self, jid, msg, keyID, type = 'chat', subject='', chatstate = None, msg_id = None, composing_xep = None, resource = None, - user_nick = None): + user_nick = None, session=None): fjid = jid if not self.connection: @@ -410,12 +417,20 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): if chatstate is 'composing' or msgtxt: chatstate_node.addChild(name = 'composing') + if session: + session.last_send = time.time() + msg_iq.setThread(session.thread_id) + + if session.enable_encryption: + msg_iq = session.encrypt_stanza(msg_iq) + if not self.connection.send(msg_iq, msg != None): return no_log_for = gajim.config.get_per('accounts', self.name, 'no_log_for') ji = gajim.get_jid_without_resource(jid) - if self.name not in no_log_for and ji not in no_log_for: + 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: %s\n%s') % (subject, msg) diff --git a/src/common/zeroconf/roster_zeroconf.py b/src/common/zeroconf/roster_zeroconf.py index 1de058af7..2fb4123f8 100644 --- a/src/common/zeroconf/roster_zeroconf.py +++ b/src/common/zeroconf/roster_zeroconf.py @@ -2,15 +2,20 @@ ## ## Copyright (C) 2006 Stefan Bethge ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## from common.zeroconf import zeroconf diff --git a/src/common/zeroconf/zeroconf.py b/src/common/zeroconf/zeroconf.py index e34599da2..8d8e70185 100644 --- a/src/common/zeroconf/zeroconf.py +++ b/src/common/zeroconf/zeroconf.py @@ -2,15 +2,20 @@ ## ## Copyright (C) 2006 Stefan Bethge ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## C_NAME, C_DOMAIN, C_INTERFACE, C_PROTOCOL, C_HOST, \ C_ADDRESS, C_PORT, C_BARE_NAME, C_TXT = range(9) diff --git a/src/common/zeroconf/zeroconf_avahi.py b/src/common/zeroconf/zeroconf_avahi.py index 6ad768826..626d1be32 100644 --- a/src/common/zeroconf/zeroconf_avahi.py +++ b/src/common/zeroconf/zeroconf_avahi.py @@ -2,15 +2,20 @@ ## ## Copyright (C) 2006 Stefan Bethge ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## from common import gajim @@ -171,7 +176,7 @@ class Zeroconf: def service_add_fail_callback(self, err): gajim.log.debug('Error while adding service. %s' % str(err)) - if str(err) == 'Local name collision': + if 'Local name collision' in str(err): alternative_name = self.server.GetAlternativeServiceName(self.username) self.name_conflictCB(alternative_name) return @@ -179,9 +184,12 @@ class Zeroconf: self.disconnect() def server_state_changed_callback(self, state, error): + gajim.log.debug('server state changed to %s' % state) if state == self.avahi.SERVER_RUNNING: self.create_service() - elif state == self.avahi.SERVER_COLLISION: + elif state in (self.avahi.SERVER_COLLISION, + self.avahi.SERVER_REGISTERING): + self.disconnect() self.entrygroup.Reset() elif state == self.avahi.CLIENT_FAILURE: # does it ever go here? @@ -190,8 +198,11 @@ class Zeroconf: def entrygroup_state_changed_callback(self, state, error): # the name is already present, so recreate if state == self.avahi.ENTRY_GROUP_COLLISION: + gajim.log.debug('zeroconf.py: local name collision') self.service_add_fail_callback('Local name collision') elif state == self.avahi.ENTRY_GROUP_FAILURE: + self.disconnect() + self.entrygroup.Reset() gajim.log.debug('zeroconf.py: ENTRY_GROUP_FAILURE reached(that' ' should not happen)') @@ -238,8 +249,13 @@ class Zeroconf: txt['status'] = 'avail' self.txt = txt - gajim.log.debug('Publishing service %s of type %s' % (self.name, self.stype)) - self.entrygroup.AddService(self.avahi.IF_UNSPEC, self.avahi.PROTO_UNSPEC, dbus.UInt32(0), self.name, self.stype, '', '', self.port, self.avahi_txt(), reply_handler=self.service_added_callback, error_handler=self.service_add_fail_callback) + gajim.log.debug('Publishing service %s of type %s' % (self.name, + self.stype)) + self.entrygroup.AddService(self.avahi.IF_UNSPEC, + self.avahi.PROTO_UNSPEC, dbus.UInt32(0), self.name, self.stype, '', + '', dbus.UInt16(self.port), self.avahi_txt(), + reply_handler=self.service_added_callback, + error_handler=self.service_add_fail_callback) self.entrygroup.Commit(reply_handler=self.service_committed_callback, error_handler=self.entrygroup_commit_error_CB) @@ -268,8 +284,7 @@ class Zeroconf: self.entrygroup.Reset() self.entrygroup.Free() # .Free() has mem leaks - obj = self.entrygroup._obj - obj._bus = None + self.entrygroup._obj._bus = None self.entrygroup._obj = None self.entrygroup = None self.announced = False diff --git a/src/common/zeroconf/zeroconf_bonjour.py b/src/common/zeroconf/zeroconf_bonjour.py index 3b7207004..79d699ba4 100644 --- a/src/common/zeroconf/zeroconf_bonjour.py +++ b/src/common/zeroconf/zeroconf_bonjour.py @@ -2,19 +2,25 @@ ## ## Copyright (C) 2006 Stefan Bethge ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## from common import gajim import sys import select +import re from string import split from common.zeroconf.zeroconf import C_BARE_NAME, C_DOMAIN @@ -109,7 +115,8 @@ class Zeroconf: r'\064': '@', } - name, stype, protocol, domain, dummy = split(fullname, '.') + # Split on '.' but do not split on '\.' + name, stype, protocol, domain, dummy = re.split('(? +## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005 Dimitur Kirov ## Copyright (C) 2003-2005 Vincent Hanquez ## Copyright (C) 2006 Stefan Bethge +## Copyright (C) 2007 Stephan Erb ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 os, sys import common.config import common.sleepy from common.i18n import Q_ @@ -63,11 +69,12 @@ class PreferencesWindow: 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) + self.notebook = self.xml.get_widget('preferences_notebook') + self.treat_incoming_messages_combobox =\ + self.xml.get_widget('treat_incoming_messages_combobox') + self.one_window_type_combobox =\ + self.xml.get_widget('one_window_type_combobox') self.iconset_combobox = self.xml.get_widget('iconset_combobox') - self.notify_on_new_message_radiobutton = self.xml.get_widget( - 'notify_on_new_message_radiobutton') - self.popup_new_message_radiobutton = self.xml.get_widget( - 'popup_new_message_radiobutton') self.notify_on_signin_checkbutton = self.xml.get_widget( 'notify_on_signin_checkbutton') self.notify_on_signout_checkbutton = self.xml.get_widget( @@ -83,30 +90,10 @@ class PreferencesWindow: self.auto_xa_time_spinbutton = self.xml.get_widget( 'auto_xa_time_spinbutton') self.auto_xa_message_entry = self.xml.get_widget('auto_xa_message_entry') - self.trayicon_checkbutton = self.xml.get_widget('trayicon_checkbutton') - self.notebook = self.xml.get_widget('preferences_notebook') - self.one_window_type_combobox =\ - self.xml.get_widget('one_window_type_combobox') - self.treat_incoming_messages_combobox =\ - self.xml.get_widget('treat_incoming_messages_combobox') w = self.xml.get_widget('anc_hbox') - # trayicon - if gajim.interface.systray_capabilities: - st = gajim.config.get('trayicon') - self.trayicon_checkbutton.set_active(st) - else: - self.trayicon_checkbutton.set_sensitive(False) - - # Save position - st = gajim.config.get('saveposition') - self.xml.get_widget('save_position_checkbutton').set_active(st) - - # Sort contacts by show - st = gajim.config.get('sort_by_show') - self.xml.get_widget('sort_by_show_checkbutton').set_active(st) - + ### General tab ### # Display avatars in roster st = gajim.config.get('show_avatars_in_roster') self.xml.get_widget('show_avatars_in_roster_checkbutton').set_active(st) @@ -116,6 +103,10 @@ class PreferencesWindow: self.xml.get_widget('show_status_msgs_in_roster_checkbutton').set_active( st) + # Sort contacts by show + st = gajim.config.get('sort_by_show') + self.xml.get_widget('sort_by_show_checkbutton').set_active(st) + # emoticons emoticons_combobox = self.xml.get_widget('emoticons_combobox') emoticons_list = os.listdir(os.path.join(gajim.DATA_DIR, 'emoticons')) @@ -142,6 +133,44 @@ class PreferencesWindow: if not gajim.config.get('emoticons_theme'): emoticons_combobox.set_active(len(l)-1) + # Set default for treat incoming messages + choices = common.config.opt_treat_incoming_messages + type = gajim.config.get('treat_incoming_messages') + if type in choices: + self.treat_incoming_messages_combobox.set_active(choices.index(type)) + else: + self.treat_incoming_messages_combobox.set_active(0) + + # Set default for single window type + choices = common.config.opt_one_window_types + type = gajim.config.get('one_message_window') + if type in choices: + self.one_window_type_combobox.set_active(choices.index(type)) + else: + self.one_window_type_combobox.set_active(0) + + # Compact View + st = gajim.config.get('compact_view') + self.xml.get_widget('compact_view_checkbutton').set_active(st) + + # Ignore XHTML + st = gajim.config.get('ignore_incoming_xhtml') + self.xml.get_widget('xhtml_checkbutton').set_active(st) + + # use speller + if HAS_GTK_SPELL: + st = gajim.config.get('use_speller') + self.xml.get_widget('speller_checkbutton').set_active(st) + else: + self.xml.get_widget('speller_checkbutton').set_sensitive(False) + + # Themes + theme_combobox = self.xml.get_widget('theme_combobox') + cell = gtk.CellRendererText() + theme_combobox.pack_start(cell, True) + theme_combobox.add_attribute(cell, 'text', 0) + self.update_theme_list() + # iconset iconsets_list = os.listdir(os.path.join(gajim.DATA_DIR, 'iconsets')) if os.path.isdir(gajim.MY_ICONSETS_PATH): @@ -179,121 +208,11 @@ class PreferencesWindow: if gajim.config.get('iconset') == l[i]: self.iconset_combobox.set_active(i) - # Set default for single window type - choices = common.config.opt_one_window_types - type = gajim.config.get('one_message_window') - if type in choices: - self.one_window_type_combobox.set_active(choices.index(type)) - else: - self.one_window_type_combobox.set_active(0) - - # Compact View - st = gajim.config.get('compact_view') - self.xml.get_widget('compact_view_checkbutton').set_active(st) - - # Set default for treat incoming messages - choices = common.config.opt_treat_incoming_messages - type = gajim.config.get('treat_incoming_messages') - if type in choices: - self.treat_incoming_messages_combobox.set_active(choices.index(type)) - else: - self.treat_incoming_messages_combobox.set_active(0) - # Use transports iconsets st = gajim.config.get('use_transports_iconsets') self.xml.get_widget('transports_iconsets_checkbutton').set_active(st) - # Themes - theme_combobox = self.xml.get_widget('theme_combobox') - cell = gtk.CellRendererText() - theme_combobox.pack_start(cell, True) - theme_combobox.add_attribute(cell, 'text', 0) - self.update_theme_list() - - # use speller - if os.name == 'nt': - self.xml.get_widget('speller_checkbutton').set_no_show_all(True) - else: - if HAS_GTK_SPELL: - st = gajim.config.get('use_speller') - self.xml.get_widget('speller_checkbutton').set_active(st) - else: - self.xml.get_widget('speller_checkbutton').set_sensitive(False) - - # Ignore XHTML - st = gajim.config.get('ignore_incoming_xhtml') - self.xml.get_widget('xhtml_checkbutton').set_active(st) - - # Print time - st = gajim.config.get('print_ichat_every_foo_minutes') - text = _('Every %s _minutes') % st - self.xml.get_widget('time_sometimes_radiobutton').set_label(text) - - if gajim.config.get('print_time') == 'never': - self.xml.get_widget('time_never_radiobutton').set_active(True) - elif gajim.config.get('print_time') == 'sometimes': - self.xml.get_widget('time_sometimes_radiobutton').set_active(True) - else: - self.xml.get_widget('time_always_radiobutton').set_active(True) - - # Color for incoming messages - colSt = gajim.config.get('inmsgcolor') - self.xml.get_widget('incoming_msg_colorbutton').set_color( - gtk.gdk.color_parse(colSt)) - - # Color for outgoing messages - colSt = gajim.config.get('outmsgcolor') - self.xml.get_widget('outgoing_msg_colorbutton').set_color( - gtk.gdk.color_parse(colSt)) - - # Color for status messages - colSt = gajim.config.get('statusmsgcolor') - self.xml.get_widget('status_msg_colorbutton').set_color( - gtk.gdk.color_parse(colSt)) - - # Color for hyperlinks - colSt = gajim.config.get('urlmsgcolor') - self.xml.get_widget('url_msg_colorbutton').set_color( - gtk.gdk.color_parse(colSt)) - - # Font for messages - font = gajim.config.get('conversation_font') - # try to set default font for the current desktop env - fontbutton = self.xml.get_widget('conversation_fontbutton') - if font == '': - fontbutton.set_sensitive(False) - self.xml.get_widget('default_chat_font').set_active(True) - else: - fontbutton.set_font_name(font) - - # on new message - only_in_roster = True - if gajim.config.get('notify_on_new_message'): - self.xml.get_widget('notify_on_new_message_radiobutton').set_active( - True) - only_in_roster = False - if gajim.config.get('autopopup'): - self.xml.get_widget('popup_new_message_radiobutton').set_active(True) - only_in_roster = False - if only_in_roster: - self.xml.get_widget('only_in_roster_radiobutton').set_active(True) - - # notify on online statuses - st = gajim.config.get('notify_on_signin') - self.notify_on_signin_checkbutton.set_active(st) - - # notify on offline statuses - st = gajim.config.get('notify_on_signout') - self.notify_on_signout_checkbutton.set_active(st) - - # autopopupaway - st = gajim.config.get('autopopupaway') - self.auto_popup_away_checkbutton.set_active(st) - - # Ignore messages from unknown contacts - self.xml.get_widget('ignore_events_from_unknown_contacts_checkbutton').\ - set_active(gajim.config.get('ignore_unknown_contacts')) - + ### Privacy tab ### # outgoing send chat state notifications st = gajim.config.get('outgoing_chat_state_notifications') combo = self.xml.get_widget('outgoing_chat_states_combobox') @@ -314,8 +233,34 @@ class PreferencesWindow: else: # disabled combo.set_active(2) + # Ignore messages from unknown contacts + self.xml.get_widget('ignore_events_from_unknown_contacts_checkbutton').\ + set_active(gajim.config.get('ignore_unknown_contacts')) + + ### Events tab ### + # On new event + on_event_combobox = self.xml.get_widget('on_event_combobox') + if gajim.config.get('autopopup'): + on_event_combobox.set_active(0) + elif gajim.config.get('notify_on_new_message'): + on_event_combobox.set_active(1) + else: + on_event_combobox.set_active(2) + + # notify on online statuses + st = gajim.config.get('notify_on_signin') + self.notify_on_signin_checkbutton.set_active(st) + + # notify on offline statuses + st = gajim.config.get('notify_on_signout') + self.notify_on_signout_checkbutton.set_active(st) + + # autopopupaway + st = gajim.config.get('autopopupaway') + self.auto_popup_away_checkbutton.set_active(st) + # sounds - if os.name == 'nt': + if ((os.name == 'nt') or (sys.platform == 'darwin')): # if windows, player must not become visible on show_all soundplayer_hbox = self.xml.get_widget('soundplayer_hbox') soundplayer_hbox.set_no_show_all(True) @@ -362,7 +307,7 @@ class PreferencesWindow: self.fill_sound_treeview() - #Autoaway + # Autoaway st = gajim.config.get('autoaway') self.auto_away_checkbutton.set_active(st) @@ -453,18 +398,34 @@ class PreferencesWindow: 'applications_combobox') self.xml.get_widget('custom_apps_frame').hide() self.xml.get_widget('custom_apps_frame').set_no_show_all(True) + + if sys.platform == 'darwin': + self.applications_combobox.remove_text(4) + self.applications_combobox.remove_text(3) + self.applications_combobox.remove_text(2) + self.applications_combobox.remove_text(1) + self.applications_combobox.append_text( + _('Always use OS/X default applications')) + self.applications_combobox.append_text(_('Custom')) + if gajim.config.get('autodetect_browser_mailer'): self.applications_combobox.set_active(0) # else autodetect_browser_mailer is False. - # so user has 'Always Use GNOME/KDE/XFCE4' or Custom + # so user has 'Always Use GNOME/KDE/Xfce' or Custom elif gajim.config.get('openwith') == 'gnome-open': self.applications_combobox.set_active(1) elif gajim.config.get('openwith') == 'kfmclient exec': self.applications_combobox.set_active(2) elif gajim.config.get('openwith') == 'exo-open': - self.applications_combobox.set_active(3) + self.applications_combobox.set_active(3) + elif ((sys.platform == 'darwin') and + (gajim.config.get('openwith') == 'open')): + self.applications_combobox.set_active(1) elif gajim.config.get('openwith') == 'custom': - self.applications_combobox.set_active(4) + if sys.platform == 'darwin': + self.applications_combobox.set_active(2) + else: + self.applications_combobox.set_active(4) self.xml.get_widget('custom_apps_frame').show() self.xml.get_widget('custom_browser_entry').set_text( @@ -500,23 +461,23 @@ class PreferencesWindow: # PEP st = gajim.config.get('publish_mood') - self.xml.get_widget('pub_mood').set_active(st) - + self.xml.get_widget('publish_mood_checkbutton').set_active(st) + st = gajim.config.get('publish_activity') - self.xml.get_widget('pub_activity').set_active(st) - + self.xml.get_widget('publish_activity_checkbutton').set_active(st) + st = gajim.config.get('publish_tune') - self.xml.get_widget('pub_tune').set_active(st) - + self.xml.get_widget('publish_tune_checkbutton').set_active(st) + st = gajim.config.get('subscribe_mood') - self.xml.get_widget('sub_mood').set_active(st) - + self.xml.get_widget('subscribe_mood_checkbutton').set_active(st) + st = gajim.config.get('subscribe_activity') - self.xml.get_widget('sub_activity').set_active(st) - + self.xml.get_widget('subscribe_activity_checkbutton').set_active(st) + st = gajim.config.get('subscribe_tune') - self.xml.get_widget('sub_tune').set_active(st) - + self.xml.get_widget('subscribe_tune_checkbutton').set_active(st) + # Notify user of new gmail e-mail messages, # only show checkbox if user has a gtalk account frame_gmail = self.xml.get_widget('frame_gmail') @@ -535,7 +496,37 @@ class PreferencesWindow: break else: frame_gmail.hide() - + + # Color for incoming messages + colSt = gajim.config.get('inmsgcolor') + self.xml.get_widget('incoming_msg_colorbutton').set_color( + gtk.gdk.color_parse(colSt)) + + # Color for outgoing messages + colSt = gajim.config.get('outmsgcolor') + self.xml.get_widget('outgoing_msg_colorbutton').set_color( + gtk.gdk.color_parse(colSt)) + + # Color for status messages + colSt = gajim.config.get('statusmsgcolor') + self.xml.get_widget('status_msg_colorbutton').set_color( + gtk.gdk.color_parse(colSt)) + + # Color for hyperlinks + colSt = gajim.config.get('urlmsgcolor') + self.xml.get_widget('url_msg_colorbutton').set_color( + gtk.gdk.color_parse(colSt)) + + # Font for messages + font = gajim.config.get('conversation_font') + # try to set default font for the current desktop env + fontbutton = self.xml.get_widget('conversation_fontbutton') + if font == '': + fontbutton.set_sensitive(False) + self.xml.get_widget('default_chat_font').set_active(True) + else: + fontbutton.set_font_name(font) + self.xml.signal_autoconnect(self) self.sound_tree.get_model().connect('row-changed', @@ -550,6 +541,8 @@ class PreferencesWindow: self.theme_preferences = None self.notebook.set_current_page(0) + if not gajim.config.get('use_pep'): + self.notebook.remove_page(5) self.window.show_all() gtkgui_helpers.possibly_move_window_in_current_desktop(self.window) @@ -565,37 +558,21 @@ class PreferencesWindow: w.set_sensitive(widget.get_active()) gajim.interface.save_config() - def on_trayicon_checkbutton_toggled(self, widget): - if widget.get_active(): - gajim.config.set('trayicon', True) - gajim.interface.show_systray() - show = helpers.get_global_show() - gajim.interface.systray.change_status(show) - else: - gajim.config.set('trayicon', False) - if not gajim.interface.roster.window.get_property('visible'): - gajim.interface.roster.window.present() - gajim.interface.hide_systray() - # no tray, show roster! - gajim.config.set('show_roster_on_startup', True) - gajim.interface.roster.draw_roster() - gajim.interface.save_config() - - def on_pub_mood_toggled(self, widget): + def on_publish_mood_checkbutton_toggled(self, widget): if widget.get_active() == False: for account in gajim.connections: if gajim.connections[account].pep_supported: pep.user_send_mood(account, '') self.on_checkbutton_toggled(widget, 'publish_mood') - def on_pub_activity_toggled(self, widget): + def on_publish_activity_checkbutton_toggled(self, widget): if widget.get_active() == False: for account in gajim.connections: if gajim.connections[account].pep_supported: pep.user_send_activity(account, '') self.on_checkbutton_toggled(widget, 'publish_activity') - def on_pub_tune_toggled(self, widget): + def on_publish_tune_checkbutton_toggled(self, widget): if widget.get_active() == False: for account in gajim.connections: if gajim.connections[account].pep_supported: @@ -604,13 +581,13 @@ class PreferencesWindow: gajim.interface.roster.enable_syncing_status_msg_from_current_music_track( widget.get_active()) - def on_sub_mood_toggled(self, widget): + def on_subscribe_mood_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'subscribe_mood') - def on_sub_activity_toggled(self, widget): + def on_subscribe_activity_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'subscribe_activity') - def on_sub_tune_toggled(self, widget): + def on_subscribe_tune_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'subscribe_tune') def on_save_position_checkbutton_toggled(self, widget): @@ -620,13 +597,6 @@ class PreferencesWindow: self.on_checkbutton_toggled(widget, 'sort_by_show') gajim.interface.roster.draw_roster() - def on_show_status_msgs_in_roster_checkbutton_toggled(self, widget): - self.on_checkbutton_toggled(widget, 'show_status_msgs_in_roster') - gajim.interface.roster.draw_roster() - for ctl in gajim.interface.msg_win_mgr.controls(): - if ctl.type_id == message_control.TYPE_GC: - ctl.update_ui() - def on_show_avatars_in_roster_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'show_avatars_in_roster') gajim.interface.roster.draw_roster() @@ -637,7 +607,18 @@ class PreferencesWindow: message_control.TYPE_GC) + \ gajim.interface.minimized_controls[account].values(): gc_control.draw_roster() - + + def on_show_status_msgs_in_roster_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'show_status_msgs_in_roster') + gajim.interface.roster.draw_roster() + for ctl in gajim.interface.msg_win_mgr.controls(): + if ctl.type_id == message_control.TYPE_GC: + ctl.update_ui() + + def on_sort_by_show_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'sort_by_show') + gajim.interface.roster.draw_roster() + def on_emoticons_combobox_changed(self, widget): active = widget.get_active() model = widget.get_model() @@ -656,51 +637,10 @@ class PreferencesWindow: for win in gajim.interface.msg_win_mgr.windows(): win.toggle_emoticons() - def on_iconset_combobox_changed(self, widget): - model = widget.get_model() + def on_treat_incoming_messages_combobox_changed(self, widget): active = widget.get_active() - icon_string = model[active][1].decode('utf-8') - gajim.config.set('iconset', icon_string) - gajim.interface.roster.reload_jabber_state_images() - gajim.interface.save_config() - - def on_transports_iconsets_checkbutton_toggled(self, widget): - self.on_checkbutton_toggled(widget, 'use_transports_iconsets') - gajim.interface.roster.reload_jabber_state_images() - - def on_manage_theme_button_clicked(self, widget): - if self.theme_preferences is None: - self.theme_preferences = dialogs.GajimThemesWindow() - else: - self.theme_preferences.window.present() - self.theme_preferences.select_active_theme() - - def on_theme_combobox_changed(self, widget): - model = widget.get_model() - active = widget.get_active() - config_theme = model[active][0].decode('utf-8').replace(' ', '_') - - gajim.config.set('roster_theme', config_theme) - - # begin repainting themed widgets throughout - gajim.interface.roster.repaint_themed_widgets() - gajim.interface.roster.change_roster_style(None) - gajim.interface.save_config() - - def update_theme_list(self): - theme_combobox = self.xml.get_widget('theme_combobox') - model = gtk.ListStore(str) - theme_combobox.set_model(model) - i = 0 - for config_theme in gajim.config.get_per('themes'): - theme = config_theme.replace('_', ' ') - model.append([theme]) - if gajim.config.get('roster_theme') == config_theme: - theme_combobox.set_active(i) - i += 1 - - def on_open_advanced_notifications_button_clicked(self, widget): - dialogs.AdvancedNotificationsWindow() + config_type = common.config.opt_treat_incoming_messages[active] + gajim.config.set('treat_incoming_messages', config_type) def on_one_window_type_combo_changed(self, widget): active = widget.get_active() @@ -709,10 +649,16 @@ class PreferencesWindow: gajim.interface.save_config() gajim.interface.msg_win_mgr.reconfig() - def on_treat_incoming_messages_combobox_changed(self, widget): + def on_compact_view_checkbutton_toggled(self, widget): active = widget.get_active() - config_type = common.config.opt_treat_incoming_messages[active] - gajim.config.set('treat_incoming_messages', config_type) + for ctl in gajim.interface.msg_win_mgr.controls(): + ctl.chat_buttons_set_visible(active) + gajim.config.set('compact_view', active) + gajim.interface.save_config() + gajim.interface.roster.draw_roster() + + def on_xhtml_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'ignore_incoming_xhtml') def apply_speller(self): for acct in gajim.connections: @@ -737,15 +683,6 @@ class PreferencesWindow: if spell_obj: spell_obj.detach() - def on_compact_view_checkbutton_toggled(self, widget): - active = widget.get_active() - for ctl in gajim.interface.msg_win_mgr.controls(): - ctl.chat_buttons_set_visible(active) - gajim.config.set('compact_view', active) - gajim.interface.save_config() - gajim.interface.roster.draw_roster() - - def on_speller_checkbutton_toggled(self, widget): active = widget.get_active() gajim.config.set('use_speller', active) @@ -771,22 +708,111 @@ class PreferencesWindow: else: self.remove_speller() - def on_xhtml_checkbutton_toggled(self, widget): - self.on_checkbutton_toggled(widget, 'ignore_incoming_xhtml') - - def on_time_never_radiobutton_toggled(self, widget): - if widget.get_active(): - gajim.config.set('print_time', 'never') + def on_theme_combobox_changed(self, widget): + model = widget.get_model() + active = widget.get_active() + config_theme = model[active][0].decode('utf-8').replace(' ', '_') + + gajim.config.set('roster_theme', config_theme) + + # begin repainting themed widgets throughout + gajim.interface.roster.repaint_themed_widgets() + gajim.interface.roster.change_roster_style(None) gajim.interface.save_config() - def on_time_sometimes_radiobutton_toggled(self, widget): - if widget.get_active(): - gajim.config.set('print_time', 'sometimes') + def update_theme_list(self): + theme_combobox = self.xml.get_widget('theme_combobox') + model = gtk.ListStore(str) + theme_combobox.set_model(model) + i = 0 + for config_theme in gajim.config.get_per('themes'): + theme = config_theme.replace('_', ' ') + model.append([theme]) + if gajim.config.get('roster_theme') == config_theme: + theme_combobox.set_active(i) + i += 1 + + def on_manage_theme_button_clicked(self, widget): + if self.theme_preferences is None: + self.theme_preferences = dialogs.GajimThemesWindow() + else: + self.theme_preferences.window.present() + self.theme_preferences.select_active_theme() + + def on_iconset_combobox_changed(self, widget): + model = widget.get_model() + active = widget.get_active() + icon_string = model[active][1].decode('utf-8') + gajim.config.set('iconset', icon_string) + gajim.interface.roster.reload_jabber_state_images() gajim.interface.save_config() - def on_time_always_radiobutton_toggled(self, widget): - if widget.get_active(): - gajim.config.set('print_time', 'always') + def on_transports_iconsets_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'use_transports_iconsets') + gajim.interface.roster.reload_jabber_state_images() + + def on_outgoing_chat_states_combobox_changed(self, widget): + active = widget.get_active() + if active == 0: # all + gajim.config.set('outgoing_chat_state_notifications', 'all') + elif active == 1: # only composing + gajim.config.set('outgoing_chat_state_notifications', 'composing_only') + else: # disabled + gajim.config.set('outgoing_chat_state_notifications', 'disabled') + + def on_displayed_chat_states_combobox_changed(self, widget): + active = widget.get_active() + if active == 0: # all + gajim.config.set('displayed_chat_state_notifications', 'all') + elif active == 1: # only composing + gajim.config.set('displayed_chat_state_notifications', + 'composing_only') + else: # disabled + gajim.config.set('displayed_chat_state_notifications', 'disabled') + + def on_ignore_events_from_unknown_contacts_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'ignore_unknown_contacts') + + def on_on_event_combobox_changed(self, widget): + active = widget.get_active() + if active == 0: + gajim.config.set('autopopup', True) + gajim.config.set('notify_on_new_message', False) + elif active == 1: + gajim.config.set('autopopup', False) + gajim.config.set('notify_on_new_message', True) + else: + gajim.config.set('autopopup', False) + gajim.config.set('notify_on_new_message', False) + + def on_notify_on_signin_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'notify_on_signin') + + def on_notify_on_signout_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'notify_on_signout') + + def on_auto_popup_away_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'autopopupaway') + + def on_open_advanced_notifications_button_clicked(self, widget): + dialogs.AdvancedNotificationsWindow() + + def on_play_sounds_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'sounds_on', + [self.xml.get_widget('soundplayer_hbox'), + self.xml.get_widget('sounds_scrolledwindow'), + self.xml.get_widget('browse_sounds_hbox')]) + + def on_soundplayer_entry_changed(self, widget): + gajim.config.set('soundplayer', widget.get_text().decode('utf-8')) + gajim.interface.save_config() + + def on_sounds_treemodel_row_changed(self, model, path, iter): + sound_event = model[iter][3].decode('utf-8') + gajim.config.set_per('soundevents', sound_event, 'enabled', + bool(model[path][0])) + gajim.config.set_per('soundevents', sound_event, 'path', + model[iter][2].decode('utf-8')) gajim.interface.save_config() def update_text_tags(self): @@ -854,73 +880,6 @@ class PreferencesWindow: self.update_text_tags() gajim.interface.save_config() - def on_notify_on_new_message_radiobutton_toggled(self, widget): - self.on_checkbutton_toggled(widget, 'notify_on_new_message', - [self.auto_popup_away_checkbutton]) - - def on_popup_new_message_radiobutton_toggled(self, widget): - self.on_checkbutton_toggled(widget, 'autopopup', - [self.auto_popup_away_checkbutton]) - - def on_only_in_roster_radiobutton_toggled(self, widget): - if widget.get_active(): - self.auto_popup_away_checkbutton.set_sensitive(False) - - def on_notify_on_signin_checkbutton_toggled(self, widget): - self.on_checkbutton_toggled(widget, 'notify_on_signin') - - def on_notify_on_signout_checkbutton_toggled(self, widget): - self.on_checkbutton_toggled(widget, 'notify_on_signout') - - def on_auto_popup_away_checkbutton_toggled(self, widget): - self.on_checkbutton_toggled(widget, 'autopopupaway') - - def on_ignore_events_from_unknown_contacts_checkbutton_toggled(self, widget): - self.on_checkbutton_toggled(widget, 'ignore_unknown_contacts') - - def on_outgoing_chat_states_combobox_changed(self, widget): - active = widget.get_active() - if active == 0: # all - gajim.config.set('outgoing_chat_state_notifications', 'all') - elif active == 1: # only composing - gajim.config.set('outgoing_chat_state_notifications', 'composing_only') - else: # disabled - gajim.config.set('outgoing_chat_state_notifications', 'disabled') - - def on_displayed_chat_states_combobox_changed(self, widget): - active = widget.get_active() - if active == 0: # all - gajim.config.set('displayed_chat_state_notifications', 'all') - elif active == 1: # only composing - gajim.config.set('displayed_chat_state_notifications', - 'composing_only') - else: # disabled - gajim.config.set('displayed_chat_state_notifications', 'disabled') - - def on_play_sounds_checkbutton_toggled(self, widget): - self.on_checkbutton_toggled(widget, 'sounds_on', - [self.xml.get_widget('soundplayer_hbox'), - self.xml.get_widget('sounds_scrolledwindow'), - self.xml.get_widget('browse_sounds_hbox')]) - - def on_soundplayer_entry_changed(self, widget): - gajim.config.set('soundplayer', widget.get_text().decode('utf-8')) - gajim.interface.save_config() - - def on_prompt_online_status_message_checkbutton_toggled(self, widget): - self.on_checkbutton_toggled(widget, 'ask_online_status') - - def on_prompt_offline_status_message_checkbutton_toggled(self, widget): - self.on_checkbutton_toggled(widget, 'ask_offline_status') - - def on_sounds_treemodel_row_changed(self, model, path, iter): - sound_event = model[iter][3].decode('utf-8') - gajim.config.set_per('soundevents', sound_event, 'enabled', - bool(model[path][0])) - gajim.config.set_per('soundevents', sound_event, 'path', - model[iter][2].decode('utf-8')) - gajim.interface.save_config() - def on_auto_away_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'autoaway', [self.auto_away_time_spinbutton, self.auto_away_message_entry]) @@ -951,6 +910,12 @@ class PreferencesWindow: def on_auto_xa_message_entry_changed(self, widget): gajim.config.set('autoxa_message', widget.get_text().decode('utf-8')) + def on_prompt_online_status_message_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'ask_online_status') + + def on_prompt_offline_status_message_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'ask_offline_status') + def fill_default_msg_treeview(self): model = self.default_msg_tree.get_model() model.clear() @@ -1010,19 +975,30 @@ class PreferencesWindow: def on_applications_combobox_changed(self, widget): gajim.config.set('autodetect_browser_mailer', False) - if widget.get_active() == 4: - self.xml.get_widget('custom_apps_frame').show() - gajim.config.set('openwith', 'custom') - else: + if sys.platform == 'darwin': if widget.get_active() == 0: gajim.config.set('autodetect_browser_mailer', True) + self.xml.get_widget('custom_apps_frame').hide() elif widget.get_active() == 1: - gajim.config.set('openwith', 'gnome-open') + self.xml.get_widget('custom_apps_frame').hide() + gajim.config.set('openwith', 'open') elif widget.get_active() == 2: - gajim.config.set('openwith', 'kfmclient exec') - elif widget.get_active() == 3: - gajim.config.set('openwith', 'exo-open') - self.xml.get_widget('custom_apps_frame').hide() + self.xml.get_widget('custom_apps_frame').show() + gajim.config.set('openwith', 'custom') + else: + if widget.get_active() == 4: + self.xml.get_widget('custom_apps_frame').show() + gajim.config.set('openwith', 'custom') + else: + if widget.get_active() == 0: + gajim.config.set('autodetect_browser_mailer', True) + elif widget.get_active() == 1: + gajim.config.set('openwith', 'gnome-open') + elif widget.get_active() == 2: + gajim.config.set('openwith', 'kfmclient exec') + elif widget.get_active() == 3: + gajim.config.set('openwith', 'exo-open') + self.xml.get_widget('custom_apps_frame').hide() gajim.interface.save_config() def on_custom_browser_entry_changed(self, widget): @@ -1377,10 +1353,6 @@ class AccountsWindow: def on_close_button_clicked(self, widget): self.window.destroy() - def on_accounts_window_destroy(self, widget): - if gajim.interface.instances.has_key('accounts'): - del gajim.interface.instances['accounts'] - def __init__(self): self.xml = gtkgui_helpers.get_glade('accounts_window.glade') self.window = self.xml.get_widget('accounts_window') @@ -1418,8 +1390,6 @@ class AccountsWindow: st = gajim.config.get('mergeaccounts') self.xml.get_widget('merge_checkbutton').set_active(st) - import os - self.avahi_available = True try: import avahi @@ -1493,8 +1463,8 @@ class AccountsWindow: gajim.connections[gajim.ZEROCONF_ACC_NAME].update_details() return - elif self.need_relogin and gajim.connections[self.current_account].\ - connected > 0: + 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''' # first make sure connection is really closed, @@ -1605,7 +1575,8 @@ class AccountsWindow: # Personal tab gpg_key_label = self.xml.get_widget('gpg_key_label2') - if gajim.config.get('usegpg'): + if gajim.connections.has_key(gajim.ZEROCONF_ACC_NAME) and \ + gajim.connections[gajim.ZEROCONF_ACC_NAME].gpg: self.xml.get_widget('gpg_choose_button2').set_sensitive(True) self.init_account_gpg() else: @@ -1621,7 +1592,7 @@ class AccountsWindow: account = self.current_account keyid = gajim.config.get_per('accounts', account, 'keyid') keyname = gajim.config.get_per('accounts', account, 'keyname') - savegpgpass = gajim.config.get_per('accounts', account, 'savegpgpass') + use_gpg_agent = gajim.config.get('use_gpg_agent') if account == gajim.ZEROCONF_ACC_NAME: widget_name_add = '2' @@ -1630,27 +1601,19 @@ class AccountsWindow: gpg_key_label = self.xml.get_widget('gpg_key_label' + widget_name_add) gpg_name_label = self.xml.get_widget('gpg_name_label' + widget_name_add) - gpg_save_password_checkbutton = \ - self.xml.get_widget('gpg_save_password_checkbutton' + widget_name_add) - gpg_password_entry = self.xml.get_widget('gpg_password_entry' + \ - widget_name_add) + use_gpg_agent_checkbutton = self.xml.get_widget( + 'use_gpg_agent_checkbutton' + widget_name_add) - if not keyid or not gajim.config.get('usegpg'): - gpg_save_password_checkbutton.set_sensitive(False) - gpg_password_entry.set_sensitive(False) + if not keyid or not gajim.connections[account].gpg: + use_gpg_agent_checkbutton.set_sensitive(False) gpg_key_label.set_text(_('No key selected')) gpg_name_label.set_text('') return gpg_key_label.set_text(keyid) gpg_name_label.set_text(keyname) - gpg_save_password_checkbutton.set_sensitive(True) - gpg_save_password_checkbutton.set_active(savegpgpass) - - if savegpgpass: - gpg_password_entry.set_sensitive(True) - gpgpassword = gajim.config.get_per('accounts', account, 'gpgpassword') - gpg_password_entry.set_text(gpgpassword) + use_gpg_agent_checkbutton.set_sensitive(True) + use_gpg_agent_checkbutton.set_active(use_gpg_agent) def init_normal_account(self): account = self.current_account @@ -1704,7 +1667,7 @@ class AccountsWindow: # Personal tab gpg_key_label = self.xml.get_widget('gpg_key_label1') - if gajim.config.get('usegpg'): + if gajim.connections[account].gpg: self.xml.get_widget('gpg_choose_button1').set_sensitive(True) self.init_account_gpg() else: @@ -1762,10 +1725,7 @@ class AccountsWindow: win_opened = True break # Detect if we have opened windows for this account - self.dialog = None - def remove(widget, account): - if self.dialog: - self.dialog.destroy() + def remove(account): if gajim.interface.instances[account].has_key('remove_account'): gajim.interface.instances[account]['remove_account'].window.\ present() @@ -1773,13 +1733,13 @@ class AccountsWindow: gajim.interface.instances[account]['remove_account'] = \ RemoveAccountWindow(account) if win_opened: - self.dialog = dialogs.ConfirmationDialog( + dialog = dialogs.ConfirmationDialog( _('You have opened chat in account %s') % account, _('All chat and groupchat windows will be closed. Do you want to ' 'continue?'), on_response_ok = (remove, account)) else: - remove(widget, account) + remove(account) def on_rename_button_clicked(self, widget): if gajim.connections[self.current_account].connected != 0: @@ -1839,7 +1799,7 @@ class AccountsWindow: # ServiceCache object keep old property account if hasattr(gajim.connections[old_name], 'services_cache'): - gajim.connections[self.account].services_cache.account = new_name + gajim.connections[old_name].services_cache.account = new_name del gajim.interface.instances[old_name] del gajim.interface.minimized_controls[old_name] del gajim.nicks[old_name] @@ -2010,6 +1970,7 @@ class AccountsWindow: return self.on_checkbutton_toggled(widget, 'sync_with_global_status', account=self.current_account) + gajim.interface.roster.update_status_combobox() def on_use_ft_proxies_checkbutton1_toggled(self, widget): if self.ignore_events: @@ -2117,17 +2078,14 @@ class AccountsWindow: wiget_name_ext = '2' else: wiget_name_ext = '1' - checkbutton = self.xml.get_widget('gpg_save_password_checkbutton' + \ - wiget_name_ext) gpg_key_label = self.xml.get_widget('gpg_key_label' + wiget_name_ext) gpg_name_label = self.xml.get_widget('gpg_name_label' + wiget_name_ext) - gpg_password_entry = self.xml.get_widget('gpg_password_entry' + \ - wiget_name_ext) + use_gpg_agent_checkbutton = self.xml.get_widget( + 'use_gpg_agent_checkbutton' + wiget_name_ext) if keyID[0] == _('None'): gpg_key_label.set_text(_('No key selected')) gpg_name_label.set_text('') - checkbutton.set_sensitive(False) - gpg_password_entry.set_sensitive(False) + use_gpg_agent_checkbutton.set_sensitive(False) if self.option_changed('keyid', ''): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, 'keyname', '') @@ -2135,34 +2093,20 @@ class AccountsWindow: else: gpg_key_label.set_text(keyID[0]) gpg_name_label.set_text(keyID[1]) - checkbutton.set_sensitive(True) + use_gpg_agent_checkbutton.set_sensitive(True) if self.option_changed('keyid', keyID[0]): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, 'keyname', keyID[1]) gajim.config.set_per('accounts', self.current_account, 'keyid', keyID[0]) - gajim.config.set_per('accounts', self.current_account, 'savegpgpass', - False) - gajim.config.set_per('accounts', self.current_account, 'gpgpassword', '') - checkbutton.set_active(False) - gpg_password_entry.set_text('') - def on_gpg_save_password_checkbutton_toggled(self, widget): + def on_use_gpg_agent_checkbutton_toggled(self, widget): if self.current_account == gajim.ZEROCONF_ACC_NAME: wiget_name_ext = '2' else: wiget_name_ext = '1' - self.xml.get_widget('gpg_password_entry' + wiget_name_ext).set_sensitive( - widget.get_active()) - self.on_checkbutton_toggled(widget, 'savegpgpass', - account = self.current_account) - - def on_gpg_password_entry_changed(self, widget): - if self.ignore_events: - return - gajim.config.set_per('accounts', self.current_account, 'gpgpassword', - widget.get_text().decode('utf-8')) + self.on_checkbutton_toggled(widget, 'use_gpg_agent') def on_edit_details_button1_clicked(self, widget): if not gajim.interface.instances.has_key(self.current_account): @@ -2244,13 +2188,16 @@ class AccountsWindow: else: gajim.interface.roster.regroup = False gajim.interface.roster.draw_roster() - gajim.interface.roster.actions_menu_needs_rebuild = True + gajim.interface.roster.set_actions_menu_needs_rebuild() elif not gajim.config.get('enable_zeroconf') and widget.get_active(): self.xml.get_widget('zeroconf_notebook').set_sensitive(True) # enable (will create new account if not present) gajim.connections[gajim.ZEROCONF_ACC_NAME] = common.zeroconf.\ connection_zeroconf.ConnectionZeroconf(gajim.ZEROCONF_ACC_NAME) + if gajim.connections[gajim.ZEROCONF_ACC_NAME].gpg: + self.xml.get_widget('gpg_choose_button2').set_sensitive(True) + self.init_account_gpg() # update variables gajim.interface.instances[gajim.ZEROCONF_ACC_NAME] = {'infos': {}, 'disco': {}, 'gc_config': {}, 'search': {}} @@ -2276,7 +2223,7 @@ class AccountsWindow: else: gajim.interface.roster.regroup = False gajim.interface.roster.draw_roster() - gajim.interface.roster.actions_menu_needs_rebuild = True + gajim.interface.roster.set_actions_menu_needs_rebuild() gajim.interface.save_config() self.on_checkbutton_toggled(widget, 'enable_zeroconf') @@ -2641,9 +2588,7 @@ class RemoveAccountWindow: self.window.show_all() def on_remove_button_clicked(self, widget): - def remove(widget): - if self.dialog: - self.dialog.destroy() + def remove(): if gajim.connections[self.account].connected and \ not self.remove_and_unregister_radiobutton.get_active(): # change status to offline only if we will not remove this JID from @@ -2666,14 +2611,13 @@ class RemoveAccountWindow: else: self._on_remove_success(True) - self.dialog = None if gajim.connections[self.account].connected: - self.dialog = dialogs.ConfirmationDialog( + dialog = dialogs.ConfirmationDialog( _('Account "%s" is connected to the server') % self.account, _('If you remove it, the connection will be lost.'), on_response_ok = remove) else: - remove(None) + remove() def _on_remove_success(self, res): # action of unregistration has failed, we don't remove the account @@ -2706,7 +2650,7 @@ class RemoveAccountWindow: else: gajim.interface.roster.regroup = False gajim.interface.roster.draw_roster() - gajim.interface.roster.actions_menu_needs_rebuild = True + gajim.interface.roster.set_actions_menu_needs_rebuild() if gajim.interface.instances.has_key('accounts'): gajim.interface.instances['accounts'].init_accounts() self.window.destroy() @@ -2728,6 +2672,8 @@ class ManageBookmarksWindow: continue if gajim.connections[account].is_zeroconf: continue + if not gajim.connections[account].private_storage_supported: + continue iter = self.treestore.append(None, [None, account, None, None, None, None, None, None]) @@ -2900,7 +2846,7 @@ class ManageBookmarksWindow: gajim.connections[account_unicode].bookmarks.append(bmdict) gajim.connections[account_unicode].store_bookmarks() - gajim.interface.roster.actions_menu_needs_rebuild = True + gajim.interface.roster.set_actions_menu_needs_rebuild() self.window.destroy() def on_cancel_button_clicked(self, widget): @@ -3091,6 +3037,11 @@ class AccountCreationWizardWindow: self.window.show_all() def on_wizard_window_destroy(self, widget): + page = self.notebook.get_current_page() + if page in (4, 5) and self.account in gajim.connections: + # connection instance is saved in gajim.connections and we canceled the + # addition of the account + del gajim.connections[self.account] del gajim.interface.instances['account_creation_wizard'] def on_register_server_features_button_clicked(self, widget): @@ -3104,13 +3055,19 @@ class AccountCreationWizardWindow: self.window.destroy() def on_back_button_clicked(self, widget): - if self.notebook.get_current_page() in (1, 2): + cur_page = self.notebook.get_current_page() + if cur_page in (1, 2): self.notebook.set_current_page(0) self.back_button.set_sensitive(False) - elif self.notebook.get_current_page() == 3: + elif cur_page == 3: + self.xml.get_widget('form_vbox').remove(self.data_form_widget) + self.notebook.set_current_page(2) # show server page + elif cur_page == 4: + if self.account in gajim.connections: + del gajim.connections[self.account] self.notebook.set_current_page(2) self.xml.get_widget('form_vbox').remove(self.data_form_widget) - elif self.notebook.get_current_page() == 5: # finish page + elif cur_page == 6: # finish page self.forward_button.show() if self.modify: self.notebook.set_current_page(1) # Go to parameters page @@ -3193,9 +3150,10 @@ class AccountCreationWizardWindow: self.go_online_checkbutton.show() img = self.xml.get_widget('finish_image') img.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_DIALOG) - self.notebook.set_current_page(5) # show finish page + self.notebook.set_current_page(6) # show finish page self.show_vcard_checkbutton.set_active(False) elif cur_page == 2: + # We are creating a new account server = self.xml.get_widget('server_comboboxentry1').child.get_text()\ .decode('utf-8') @@ -3231,7 +3189,7 @@ class AccountCreationWizardWindow: config['custom_host'] = self.xml.get_widget( 'custom_host_entry').get_text().decode('utf-8') - self.notebook.set_current_page(4) # show creating page + self.notebook.set_current_page(5) # show creating page self.back_button.hide() self.forward_button.hide() self.update_progressbar_timeout_id = gobject.timeout_add(100, @@ -3241,6 +3199,18 @@ class AccountCreationWizardWindow: con.new_account(self.account, config) gajim.connections[self.account] = con elif cur_page == 3: + checked = self.xml.get_widget('ssl_checkbutton').get_active() + if checked: + hostname = gajim.connections[self.account].new_account_info[ + 'hostname'] + f = open(gajim.MY_CACERTS, 'a') + f.write(hostname + '\n') + f.write(self.ssl_cert + '\n\n') + f.close() + gajim.connections[self.account].new_account_info[ + 'ssl_fingerprint_sha1'] = self.ssl_fingerprint + self.notebook.set_current_page(4) # show fom page + elif cur_page == 4: if self.is_form: form = self.data_form_widget.data_form else: @@ -3249,7 +3219,7 @@ class AccountCreationWizardWindow: self.is_form) self.xml.get_widget('form_vbox').remove(self.data_form_widget) self.xml.get_widget('progressbar_label').set_markup('Account is being created\n\nPlease wait...') - self.notebook.set_current_page(4) # show creating page + self.notebook.set_current_page(5) # show creating page self.back_button.hide() self.forward_button.hide() self.update_progressbar_timeout_id = gobject.timeout_add(100, @@ -3279,13 +3249,13 @@ class AccountCreationWizardWindow: self.progressbar.pulse() return True # loop forever - def new_acc_connected(self, form, is_form): - '''connection to server succeded, present the form to the user''' + def new_acc_connected(self, form, is_form, ssl_msg, ssl_cert, + 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() self.forward_button.show() - self.notebook.set_current_page(3) # show form page self.is_form = is_form if is_form: dataform = dataforms.ExtendForm(node = form) @@ -3294,6 +3264,21 @@ class AccountCreationWizardWindow: self.data_form_widget = FakeDataForm(form) self.data_form_widget.show_all() self.xml.get_widget('form_vbox').pack_start(self.data_form_widget) + self.ssl_fingerprint = ssl_fingerprint + self.ssl_cert = ssl_cert + if ssl_msg: + # An SSL warning occured, show it + hostname = gajim.connections[self.account].new_account_info['hostname'] + self.xml.get_widget('ssl_label').set_markup(_('Security Warning' + '\n\nThe authenticity of the %s SSL certificate could be invalid.\n' + 'SSL Error: %s\n' + 'Do you still want to connect to this server?') % (hostname, + ssl_msg)) + text = _('Add this certificate to the list of trusted certificates.\nSHA1 fingerprint of the certificate:\n%s') % ssl_fingerprint + self.xml.get_widget('ssl_checkbutton').set_label(text) + self.notebook.set_current_page(3) # show SSL page + else: + self.notebook.set_current_page(4) # show form page def new_acc_not_connected(self, reason): '''Account creation failed: connection to server failed''' @@ -3309,7 +3294,7 @@ class AccountCreationWizardWindow: finish_text = '%s\n\n%s' % ( _('An error occurred during account creation') , reason) self.finish_label.set_markup(finish_text) - self.notebook.set_current_page(5) # show finish page + self.notebook.set_current_page(6) # show finish page def acc_is_ok(self, config): '''Account creation succeeded''' @@ -3332,7 +3317,7 @@ class AccountCreationWizardWindow: 'button, or later by choosing the Accounts menuitem under the Edit ' 'menu from the main window.')) self.finish_label.set_markup(finish_text) - self.notebook.set_current_page(5) # show finish page + self.notebook.set_current_page(6) # show finish page if self.update_progressbar_timeout_id is not None: gobject.source_remove(self.update_progressbar_timeout_id) @@ -3349,7 +3334,7 @@ class AccountCreationWizardWindow: finish_text = '%s\n\n%s' % (_('An error occurred during ' 'account creation') , reason) self.finish_label.set_markup(finish_text) - self.notebook.set_current_page(5) # show finish page + self.notebook.set_current_page(6) # show finish page if self.update_progressbar_timeout_id is not None: gobject.source_remove(self.update_progressbar_timeout_id) @@ -3426,8 +3411,6 @@ class AccountCreationWizardWindow: config['custom_host'] = '' config['keyname'] = '' config['keyid'] = '' - config['savegpgpass'] = False - config['gpgpassword'] = '' return config def save_account(self, login, server, savepass, password): @@ -3482,7 +3465,7 @@ class AccountCreationWizardWindow: else: gajim.interface.roster.regroup = False gajim.interface.roster.draw_roster() - gajim.interface.roster.actions_menu_needs_rebuild = True + gajim.interface.roster.set_actions_menu_needs_rebuild() gajim.interface.save_config() #---------- ZeroconfPropertiesWindow class -------------# diff --git a/src/conversation_textview.py b/src/conversation_textview.py index f4e06e1bb..53b3a68b1 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -1,22 +1,28 @@ ## conversation_textview.py ## -## Copyright (C) 2005-2006 Yann Le Boulanger +## Copyright (C) 2005-2006 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005-2006 Travis Shirk ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 +## 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 random from tempfile import gettempdir from subprocess import Popen +from threading import Timer # for smooth scrolling import gtk import pango @@ -37,6 +43,107 @@ from common.fuzzyclock import FuzzyClock from htmltextview import HtmlTextView from common.exceptions import GajimGeneralException + +def is_selection_modified(mark): + name = mark.get_name() + if name and name in ('selection_bound', 'insert'): + return True + else: + return False + +def has_focus(widget): + return widget.flags() & gtk.HAS_FOCUS == gtk.HAS_FOCUS + +class TextViewImage(gtk.Image): + + def __init__(self, anchor): + 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) + + def _get_selected(self): + parent = self.get_parent() + if not parent or not self.anchor: return False + buffer = parent.get_buffer() + position = buffer.get_iter_at_child_anchor(self.anchor) + bounds = buffer.get_selection_bounds() + if bounds and position.in_range(*bounds): + return True + else: + return False + + def get_state(self): + parent = self.get_parent() + if not parent: + return gtk.STATE_NORMAL + if self._selected: + if has_focus(parent): + return gtk.STATE_SELECTED + else: + return gtk.STATE_ACTIVE + else: + return gtk.STATE_NORMAL + + def _update_selected(self): + selected = self._get_selected() + if self._selected != selected: + self._selected = selected + self.queue_draw() + + def _do_connect(self, widget, signal, callback): + id = widget.connect(signal, callback) + def disconnect(): + widget.disconnect(id) + self._disconnect_funcs.append(disconnect) + + def _disconnect_signals(self): + for func in self._disconnect_funcs: + func() + self._disconnect_funcs = [] + + def on_parent_set(self, widget, old_parent): + parent = self.get_parent() + if not parent: + self._disconnect_signals() + return + + self._do_connect(parent, "style-set", self.do_queue_draw) + self._do_connect(parent, "focus-in-event", self.do_queue_draw) + self._do_connect(parent, "focus-out-event", self.do_queue_draw) + + textbuf = parent.get_buffer() + self._do_connect(textbuf, "mark-set", self.on_mark_set) + self._do_connect(textbuf, "mark-deleted", self.on_mark_deleted) + + def do_queue_draw(self, *args): + self.queue_draw() + return False + + def on_mark_set(self, buf, iterat, mark): + self.on_mark_modified(mark) + return False + + def on_mark_deleted(self, buf, mark): + self.on_mark_modified(mark) + return False + + def on_mark_modified(self, mark): + if is_selection_modified(mark): + self._update_selected() + + def on_expose(self, widget, event): + state = self.get_state() + if state != gtk.STATE_NORMAL: + gc = widget.get_style().base_gc[state] + area = widget.allocation + widget.window.draw_rectangle(gc, True, area.x, area.y, + area.width, area.height) + return False + + class ConversationTextview: '''Class for the conversation textview (where user reads already said messages) for chat/groupchat windows''' @@ -44,6 +151,10 @@ class ConversationTextview: path_to_file = os.path.join(gajim.DATA_DIR, 'pixmaps', 'muc_separator.png') FOCUS_OUT_LINE_PIXBUF = gtk.gdk.pixbuf_new_from_file(path_to_file) + # smooth scroll constants + MAX_SCROLL_TIME = 0.4 # seconds + 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''' @@ -62,6 +173,8 @@ class ConversationTextview: self.tv.set_left_margin(2) self.tv.set_right_margin(2) self.handlers = {} + self.images = [] + self.image_cache = {} # connect signals id = self.tv.connect('motion_notify_event', @@ -72,6 +185,11 @@ class ConversationTextview: id = self.tv.connect('button_press_event', self.on_textview_button_press_event) self.handlers[id] = self.tv + + id = self.tv.connect("expose-event", + self.on_textview_expose_event) + self.handlers[id] = self.tv + self.account = account self.change_cursor = None @@ -154,6 +272,7 @@ class ConversationTextview: self.line_tooltip = tooltips.BaseTooltip() # use it for hr too self.tv.focus_out_line_pixbuf = ConversationTextview.FOCUS_OUT_LINE_PIXBUF + self.smooth_id = None def del_handlers(self): for i in self.handlers.keys(): @@ -181,6 +300,48 @@ class ConversationTextview: return True return False + # Smooth scrolling inspired by Pidgin code + def smooth_scroll(self): + parent = self.tv.get_parent() + if not parent: + return False + vadj = parent.get_vadjustment() + max_val = vadj.upper - vadj.page_size + 1 + cur_val = vadj.get_value() + # scroll by 1/3rd of remaining distance + onethird = cur_val + ((max_val - cur_val) / 3.0) + vadj.set_value(onethird) + if max_val - onethird < 0.01: + self.smooth_id = None + self.smooth_scroll_timer.cancel() + return False + return True + + def smooth_scroll_timeout(self): + gobject.idle_add(self.do_smooth_scroll_timeout) + return + + def do_smooth_scroll_timeout(self): + if not self.smooth_id: + # we finished scrolling + return + gobject.source_remove(self.smooth_id) + self.smooth_id = None + parent = self.tv.get_parent() + if parent: + vadj = parent.get_vadjustment() + vadj.set_value(vadj.upper - vadj.page_size + 1) + + def smooth_scroll_to_end(self): + if None != self.smooth_id: # already scrolling + return False + self.smooth_id = gobject.timeout_add(self.SCROLL_DELAY, + self.smooth_scroll) + self.smooth_scroll_timer = Timer(self.MAX_SCROLL_TIME, + self.smooth_scroll_timeout) + self.smooth_scroll_timer.start() + return False + def scroll_to_end(self): parent = self.tv.get_parent() buffer = self.tv.get_buffer() @@ -192,7 +353,9 @@ class ConversationTextview: adjustment.set_value(0) return False # when called in an idle_add, just do it once - def bring_scroll_to_end(self, diff_y = 0): + def bring_scroll_to_end(self, diff_y = 0,\ + use_smooth =\ + gajim.config.get('use_smooth_scrolling')): ''' scrolls to the end of textview if end is not visible ''' buffer = self.tv.get_buffer() end_iter = buffer.get_end_iter() @@ -200,7 +363,10 @@ class ConversationTextview: visible_rect = self.tv.get_visible_rect() # scroll only if expected end is not visible if end_rect.y >= (visible_rect.y + visible_rect.height + diff_y): - gobject.idle_add(self.scroll_to_end_iter) + if use_smooth: + gobject.idle_add(self.smooth_scroll_to_end) + else: + gobject.idle_add(self.scroll_to_end_iter) def scroll_to_end_iter(self): buffer = self.tv.get_buffer() @@ -288,6 +454,32 @@ class ConversationTextview: self.line_tooltip.show_tooltip(_('Text below this line is what has ' 'been said since the last time you paid attention to this group chat'), 8, position[1] + pointer[1]) + def on_textview_expose_event(self, widget, event): + expalloc = event.area + exp_x0 = expalloc.x + exp_y0 = expalloc.y + exp_x1 = exp_x0 + expalloc.width + exp_y1 = exp_y0 + expalloc.height + + try: + tryfirst = [self.image_cache[(exp_x0, exp_y0)]] + except KeyError: + tryfirst = [] + + for image in tryfirst + self.images: + imgalloc = image.allocation + img_x0 = imgalloc.x + img_y0 = imgalloc.y + img_x1 = img_x0 + imgalloc.width + img_y1 = img_y0 + imgalloc.height + + if img_x0 <= exp_x0 and img_y0 <= exp_y0 and \ + exp_x1 <= img_x1 and exp_y1 <= img_y1: + self.image_cache[(img_x0, img_y0)] = image + widget.propagate_expose(image, event) + return True + 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''' pointer_x, pointer_y, spam = self.tv.window.get_pointer() @@ -407,7 +599,7 @@ class ConversationTextview: item.set_property('sensitive', False) else: item = gtk.MenuItem(_('Web _Search for it')) - link = search_link % self.selected_phrase + link = search_link % self.selected_phrase id = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id] = item submenu.append(item) @@ -548,6 +740,7 @@ class ConversationTextview: if event.type == gtk.gdk.BUTTON_PRESS: if event.button == 3: # right click self.make_link_menu(event, kind, href) + return True else: # we launch the correct application helpers.launch_browser_mailer(kind, href) @@ -632,7 +825,7 @@ class ConversationTextview: cwd=gettempdir()) exitcode = p.wait() - if exitcode == 0: + if exitcode == 0: p = Popen(['dvips', '-E', '-o', tmpfile + '.ps', tmpfile + '.dvi'], cwd=gettempdir()) exitcode = p.wait() @@ -670,13 +863,14 @@ class ConversationTextview: emot_ascii = possible_emot_ascii_caps end_iter = buffer.get_end_iter() anchor = buffer.create_child_anchor(end_iter) - img = gtk.Image() + img = TextViewImage(anchor) animations = gajim.interface.emoticons_animations if not emot_ascii in animations: animations[emot_ascii] = gtk.gdk.PixbufAnimation( gajim.interface.emoticons[emot_ascii]) img.set_from_animation(animations[emot_ascii]) img.show() + self.images.append(img) # add with possible animation self.tv.add_child_at_anchor(img, anchor) #FIXME: one day, somehow sync with regexp in gajim.py @@ -857,7 +1051,10 @@ class ConversationTextview: if at_the_end or kind == 'outgoing': # we are at the end or we are sending something # scroll to the end (via idle in case the scrollbar has appeared) - gobject.idle_add(self.scroll_to_end) + if gajim.config.get('use_smooth_scrolling'): + gobject.idle_add(self.smooth_scroll_to_end) + else: + gobject.idle_add(self.scroll_to_end) buffer.end_user_action() diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index 19fb91c18..95f60ab8b 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -1,42 +1,51 @@ ## dataforms.py ## -## Copyright (C) 2003-2006 Yann Le Boulanger +## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005 Dimitur Kirov ## Copyright (C) 2003-2005 Vincent Hanquez ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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. ## -""" This module contains widget that can display data form (JEP-0004). +## You should have received a copy of the GNU General Public License +## along with Gajim. If not, see . +## +''' This module contains widget that can display data form (JEP-0004). Words single and multiple refers here to types of data forms: single means these with one record of data (without element), -multiple - these which may contain more data (with element).""" +multiple - these which may contain more data (with element).''' import gtk +import gobject import gtkgui_helpers +import dialogs import common.dataforms as dataforms +from common import helpers 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. """ + ''' Create a widget. ''' gtk.Alignment.__init__(self, xscale=1.0, yscale=1.0) self._data_form = None - self.xml=gtkgui_helpers.get_glade('data_form_window.glade', 'data_form_vbox') + self.xml = gtkgui_helpers.get_glade('data_form_window.glade', + 'data_form_vbox') self.xml.signal_autoconnect(self) for name in ('instructions_label', 'instructions_hseparator', 'single_form_viewport', 'data_form_types_notebook', @@ -55,7 +64,7 @@ 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() @@ -66,14 +75,14 @@ class DataFormWidget(gtk.Alignment, object): self.build_multiple_data_form() # create appropriate description for instructions field if there isn't any - if dataform.instructions=='': + if dataform.instructions == '': self.instructions_label.set_no_show_all(True) self.instructions_label.hide() else: self.instructions_label.set_text(dataform.instructions) 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): @@ -81,20 +90,20 @@ class DataFormWidget(gtk.Alignment, object): self._data_form = None data_form = property(get_data_form, set_data_form, del_data_form, - "Data form presented in a widget") + '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 return u'' - title = property(get_title, None, None, "Data form title") + title = property(get_title, None, None, 'Data form title') def show(self): - """ Treat 'us' as one widget. """ + ''' Treat 'us' as one widget. ''' self.show_all() # "private" methods @@ -141,23 +150,27 @@ class DataFormWidget(gtk.Alignment, object): # creating model for form... fieldtypes = [] + fieldvars = [] for field in self._data_form.reported.iter_fields(): # note: we store also text-private and hidden fields, # we just do not display them. # TODO: boolean fields #elif field.type=='boolean': fieldtypes.append(bool) fieldtypes.append(str) + fieldvars.append(field.var) self.multiplemodel = gtk.ListStore(*fieldtypes) # moving all data to model for item in self._data_form.iter_records(): - # TODO: probably wrong... (.value[s]?, fields not in the same order?) - # not checking multiple-item forms... - self.multiplemodel.append([field.value for field in item.iter_fields()]) + iter = self.multiplemodel.append() + for field in item.iter_fields(): + self.multiplemodel.set_value(iter, fieldvars.index(field.var), + field.value) # constructing columns... - for field, counter in zip(self._data_form.reported.iter_fields(), itertools.count()): + for field, counter in zip(self._data_form.reported.iter_fields(), + itertools.count()): self.records_treeview.append_column( gtk.TreeViewColumn(field.label, gtk.CellRendererText(), text=counter)) @@ -226,19 +239,21 @@ class DataFormWidget(gtk.Alignment, object): def on_remove_button_clicked(self, widget): selection = self.records_treeview.get_selection() - model, rowrefs = selection.get_selected_rows() # rowref is a list of paths + model, rowrefs = selection.get_selected_rows() + # rowref is a list of paths for i in xrange(len(rowrefs)): rowrefs[i] = gtk.TreeRowReference(model, rowrefs[i]) - # rowref is a list of row references; need to convert because we will modify the model, - # paths would change + # rowref is a list of row references; need to convert because we will + # modify the model, paths would change for rowref in rowrefs: del model[rowref.get_path()] - + def on_up_button_clicked(self, widget): selection = self.records_treeview.get_selection() model, (path,) = selection.get_selected_rows() iter = model.get_iter(path) - previter = model.get_iter((path[0]-1,)) # constructing path for previous iter + # constructing path for previous iter + previter = model.get_iter((path[0]-1,)) model.swap(iter, previter) self.refresh_multiple_buttons() @@ -256,9 +271,9 @@ 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 + ''' 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.""" + forms, it is in another class.''' def __init__(self, dataform): assert isinstance(dataform, dataforms.SimpleDataForm) @@ -269,11 +284,11 @@ class SingleForm(gtk.Table, object): self.tooltips = gtk.Tooltips() def decorate_with_tooltip(widget, field): - """ Adds a tooltip containing field's description to a 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()>k.NO_WINDOW: + Returns decorated widget. ''' + if field.description != '': + if widget.flags() & gtk.NO_WINDOW: evbox = gtk.EventBox() evbox.add(widget) widget = evbox @@ -290,31 +305,32 @@ class SingleForm(gtk.Table, object): # for each field... for field in self._data_form.iter_fields(): - if field.type=='hidden': continue + if field.type == 'hidden': continue commonlabel = True commonlabelcenter = False commonwidget = True widget = None - if field.type=='boolean': + if field.type == 'boolean': commonlabelcenter = True widget = gtk.CheckButton() - widget.connect('toggled', self.on_boolean_checkbutton_toggled, field) + widget.connect('toggled', self.on_boolean_checkbutton_toggled, + field) widget.set_active(field.value) - elif field.type=='fixed': + elif field.type == 'fixed': leftattach = 1 rightattach = 2 if field.label is None: commonlabel = False leftattach = 0 - commonwidget=False + commonwidget = False widget = gtk.Label(field.value) widget.set_line_wrap(True) - self.attach(widget, leftattach, rightattach, linecounter, linecounter+1, - xoptions=gtk.FILL, yoptions=gtk.FILL) + self.attach(widget, leftattach, rightattach, linecounter, + linecounter+1, xoptions=gtk.FILL, yoptions=gtk.FILL) elif field.type == 'list-single': # TODO: What if we have radio buttons and non-required field? @@ -343,7 +359,8 @@ class SingleForm(gtk.Table, object): f.value = model[iter][1] else: f.value = '' - widget = gtkgui_helpers.create_combobox(field.options, field.value) + widget = gtkgui_helpers.create_combobox(field.options, + field.value) widget.connect('changed', on_list_single_combobox_changed, field) widget.set_sensitive(readwrite) @@ -366,7 +383,8 @@ class SingleForm(gtk.Table, object): elif field.type == 'jid-multi': commonwidget = False - xml = gtkgui_helpers.get_glade('data_form_window.glade', 'item_list_table') + xml = gtkgui_helpers.get_glade('data_form_window.glade', + 'item_list_table') widget = xml.get_widget('item_list_table') treeview = xml.get_widget('item_treeview') @@ -380,7 +398,8 @@ class SingleForm(gtk.Table, object): renderer = gtk.CellRendererText() renderer.set_property('editable', True) renderer.connect('edited', - self.on_jid_multi_cellrenderertext_edited, listmodel, field) + self.on_jid_multi_cellrenderertext_edited, treeview, listmodel, + field) treeview.append_column(gtk.TreeViewColumn(None, renderer, text=0)) @@ -423,10 +442,10 @@ class SingleForm(gtk.Table, object): textwidget = gtk.TextView() textwidget.set_wrap_mode(gtk.WRAP_WORD) - textwidget.get_buffer().connect('changed', self.on_text_multi_textbuffer_changed, - field) + textwidget.get_buffer().connect('changed', + self.on_text_multi_textbuffer_changed, field) textwidget.get_buffer().set_text(field.value) - + widget = gtk.ScrolledWindow() widget.add(textwidget) @@ -434,13 +453,15 @@ class SingleForm(gtk.Table, object): widget=decorate_with_tooltip(widget, field) self.attach(widget, 1, 2, linecounter, linecounter+1) - else:# field.type == 'text-single' or field.type is nonstandard: + else: + # field.type == 'text-single' or field.type is nonstandard: # JEP says that if we don't understand some type, we # should handle it as text-single commonlabelcenter = True if readwrite: widget = gtk.Entry() - widget.connect('changed', self.on_text_single_entry_changed, field) + widget.connect('changed', self.on_text_single_entry_changed, + field) widget.set_sensitive(readwrite) if field.value is None: field.value = u'' @@ -501,8 +522,22 @@ class SingleForm(gtk.Table, object): widget.get_start_iter(), widget.get_end_iter()) - def on_jid_multi_cellrenderertext_edited(self, cell, path, newtext, model, field): - old=model[path][0] + def on_jid_multi_cellrenderertext_edited(self, cell, path, newtext, treeview, + model, field): + old = model[path][0] + if old == newtext: + return + try: + newtext = helpers.parse_jid(newtext) + except helpers.InvalidFormat, s: + dialogs.ErrorDialog(_('Invalid Jabber ID'), str(s)) + return + if newtext in field.values: + dialogs.ErrorDialog( + _('Jabber ID already in list'), + _('The Jabber ID you entered is already in the list. Choose another one.')) + gobject.idle_add(treeview.set_cursor, path) + return model[path][0]=newtext values = field.values @@ -510,9 +545,16 @@ class SingleForm(gtk.Table, object): field.values = values def on_jid_multi_add_button_clicked(self, widget, treeview, model, field): - iter = model.insert(999999, ("new@jabber.id",)) + #Default jid + jid = _('new@jabber.id') + if jid in field.values: + i = 1 + while _('new%d@jabber.id') % i in field.values: + i += 1 + jid = _('new%d@jabber.id') % i + iter = model.insert(999999, (jid,)) treeview.set_cursor(model.get_path(iter), treeview.get_column(0), True) - field.values = field.values + ["new@jabber.id"] + field.values = field.values + [jid] def on_jid_multi_edit_button_clicked(self, widget, treeview): model, iter = treeview.get_selection().get_selected() diff --git a/src/dialogs.py b/src/dialogs.py index c264adbcd..e50b3abbd 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -1,24 +1,30 @@ # -*- coding: utf-8 -*- ## dialogs.py ## -## Copyright (C) 2003-2006 Yann Le Boulanger +## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2003-2004 Vincent Hanquez ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2005 Dimitur Kirov ## Copyright (C) 2005-2006 Travis Shirk ## Copyright (C) 2005 Norman Rasmussen ## Copyright (C) 2007 Lukas Petrovicky -## Copyright (C) 2007 Julien Pivotto +## Julien Pivotto +## Stephan Erb ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 @@ -28,6 +34,9 @@ import gtkgui_helpers import vcard import conversation_textview import message_control +import dataforms_widget + +from random import randrange try: import gtkspell @@ -43,6 +52,7 @@ from advanced import AdvancedConfigurationWindow from common import gajim from common import helpers +from common import dataforms from common.exceptions import GajimGeneralException class EditGroupsDialog: @@ -197,7 +207,7 @@ class EditGroupsDialog: for group in groups: if group not in helpers.special_groups or groups[group] > 0: group_list.append(group) - group_list.sort() + group_list.sort() for group in group_list: iter = store.append() store.set(iter, 0, group) # Group name @@ -235,22 +245,71 @@ class PassphraseDialog: passphrase = self.passphrase_entry.get_text().decode('utf-8') else: passphrase = -1 - save_passphrase_checkbutton = self.xml.\ - get_widget('save_passphrase_checkbutton') - self.window.destroy() - return passphrase, save_passphrase_checkbutton.get_active() - def __init__(self, titletext, labeltext, checkbuttontext): + if self.check: + save_passphrase_checkbutton = self.xml.\ + get_widget('save_passphrase_checkbutton') + checked = save_passphrase_checkbutton.get_active() + else: + checked = False + + self.window.destroy() + return passphrase, checked + + def __init__(self, titletext, labeltext, checkbuttontext=None, is_modal = True, + ok_handler = None, cancel_handler = None): self.xml = gtkgui_helpers.get_glade('passphrase_dialog.glade') self.window = self.xml.get_widget('passphrase_dialog') self.passphrase_entry = self.xml.get_widget('passphrase_entry') self.passphrase = -1 self.window.set_title(titletext) self.xml.get_widget('message_label').set_text(labeltext) - self.xml.get_widget('save_passphrase_checkbutton').set_label( - checkbuttontext) + + self.ok = False + + self.cancel_handler = cancel_handler + self.is_modal = is_modal + if not is_modal and ok_handler is not None: + self.ok_handler = ok_handler + okbutton = self.xml.get_widget('ok_button') + okbutton.connect('clicked', self.on_okbutton_clicked) + cancelbutton = self.xml.get_widget('cancel_button') + cancelbutton.connect('clicked', self.on_cancelbutton_clicked) + self.xml.signal_autoconnect(self) self.window.show_all() + + self.check = bool(checkbuttontext) + checkbutton = self.xml.get_widget('save_passphrase_checkbutton') + if self.check: + checkbutton.set_label(checkbuttontext) + else: + checkbutton.hide() + + def on_okbutton_clicked(self, widget): + passph = self.passphrase_entry.get_text().decode('utf-8') + + if self.check: + checked = self.xml.get_widget('save_passphrase_checkbutton').\ + get_active() + else: + checked = False + + self.ok = True + + self.window.destroy() + + if isinstance(self.ok_handler, tuple): + self.ok_handler[0](passph, checked, *self.ok_handler[1:]) + else: + self.ok_handler(passph, checked) + + def on_cancelbutton_clicked(self, widget): + self.window.destroy() + + def on_passphrase_dialog_destroy(self, widget): + if self.cancel_handler and not self.ok: + self.cancel_handler() class ChooseGPGKeyDialog: '''Class for GPG key dialog''' @@ -268,11 +327,13 @@ class ChooseGPGKeyDialog: self.keys_treeview.set_model(model) #columns renderer = gtk.CellRendererText() - self.keys_treeview.insert_column_with_attributes(-1, _('KeyID'), + col = self.keys_treeview.insert_column_with_attributes(-1, _('KeyID'), renderer, text = 0) + col.set_sort_column_id(0) renderer = gtk.CellRendererText() - self.keys_treeview.insert_column_with_attributes(-1, _('Contact name'), - renderer, text = 1) + col = self.keys_treeview.insert_column_with_attributes(-1, + _('Contact name'), renderer, text = 1) + col.set_sort_column_id(1) self.keys_treeview.set_search_column(1) self.fill_tree(secret_keys, selected) self.window.show_all() @@ -520,7 +581,7 @@ class ChangeStatusMessageDialog: def on_change_status_message_dialog_key_press_event(self, widget, event): self.countdown_enabled = False if event.keyval == gtk.keysyms.Return or \ - event.keyval == gtk.keysyms.KP_Enter: # catch CTRL+ENTER + event.keyval == gtk.keysyms.KP_Enter: # catch CTRL+ENTER if (event.state & gtk.gdk.CONTROL_MASK): self.window.response(gtk.RESPONSE_OK) # Stop the event @@ -555,14 +616,14 @@ class ChangeStatusMessageDialog: resp = dlg2.run() if resp != gtk.RESPONSE_OK: return + self.preset_messages_dict[msg_name] = msg_text else: + self.preset_messages_dict[msg_name] = msg_text iter_ = self.message_liststore.append((msg_name,)) gajim.config.add_per('statusmsg', msg_name) # select in combobox the one we just saved self.message_combobox.set_active_iter(iter_) gajim.config.set_per('statusmsg', msg_name, 'message', msg_text_1l) - self.preset_messages_dict[msg_name] = msg_text - class AddNewContactWindow: '''Class for AddNewContactWindow''' @@ -597,6 +658,7 @@ class AddNewContactWindow: return location['add_contact'] = self self.xml = gtkgui_helpers.get_glade('add_new_contact_window.glade') + self.xml.signal_autoconnect(self) self.window = self.xml.get_widget('add_new_contact_window') for w in ('account_combobox', 'account_hbox', 'account_label', 'uid_label', 'uid_entry', 'protocol_combobox', 'protocol_jid_combobox', @@ -668,7 +730,6 @@ _('Please fill in the data of the contact you want to add in account %s') %accou self.auto_authorize_checkbutton.show() liststore = gtk.ListStore(str) self.protocol_jid_combobox.set_model(liststore) - self.xml.signal_autoconnect(self) if jid: type_ = gajim.get_transport_name_from_jid(jid) if not type_: @@ -718,18 +779,17 @@ _('Please fill in the data of the contact you want to add in account %s') %accou self.group_comboboxentry.set_active(i) i += 1 + self.window.show_all() + if self.account: self.account_label.hide() self.account_hbox.hide() - self.account_label.set_no_show_all(True) - self.account_hbox.set_no_show_all(True) else: liststore = gtk.ListStore(str, str) for acct in accounts: liststore.append([acct, acct]) self.account_combobox.set_model(liststore) self.account_combobox.set_active(0) - self.window.show_all() def on_add_new_contact_window_destroy(self, widget): if self.account: @@ -820,8 +880,7 @@ _('Please fill in the data of the contact you want to add in account %s') %accou model.append([jid_]) self.protocol_jid_combobox.set_active(0) if len(self.agents[type_]) > 1: - self.protocol_jid_combobox.set_no_show_all(False) - self.protocol_jid_combobox.show_all() + self.protocol_jid_combobox.show() else: self.protocol_jid_combobox.hide() if type_ in self.uid_labels: @@ -833,8 +892,7 @@ _('Please fill in the data of the contact you want to add in account %s') %accou else: self.message_scrolledwindow.hide() if type_ in self.available_types: - self.register_hbox.set_no_show_all(False) - self.register_hbox.show_all() + self.register_hbox.show() self.auto_authorize_checkbutton.hide() self.connected_label.hide() self.subscription_table.hide() @@ -851,8 +909,7 @@ _('Please fill in the data of the contact you want to add in account %s') %accou self.add_button.set_sensitive(False) self.auto_authorize_checkbutton.hide() return - self.subscription_table.set_no_show_all(False) - self.subscription_table.show_all() + self.subscription_table.show() self.auto_authorize_checkbutton.show() self.connected_label.hide() self.add_button.set_sensitive(True) @@ -861,13 +918,14 @@ _('Please fill in the data of the contact you want to add in account %s') %accou if self.protocol_jid_combobox.get_active_text() == jid: self.register_hbox.hide() self.connected_label.hide() - self.subscription_table.set_no_show_all(False) - self.subscription_table.show_all() + self.subscription_table.show() + self.auto_authorize_checkbutton.show() self.add_button.set_sensitive(True) def transport_signed_out(self, jid): if self.protocol_jid_combobox.get_active_text() == jid: self.subscription_table.hide() + self.auto_authorize_checkbutton.hide() self.connected_label.show() self.add_button.set_sensitive(False) @@ -942,7 +1000,9 @@ class AboutDialog: artists = ['Anders Ström', 'Christophe Got', 'Dennis Craven', 'Guillaume Morin', 'Josef Vybíral', 'Membris Khan'] dlg.set_artists(artists) + gobject.idle_add(self.dorun, dlg) + def dorun(self, dlg): rep = dlg.run() dlg.destroy() @@ -1084,20 +1144,56 @@ class ConfirmationDialog(HigDialog): '''HIG compliant confirmation dialog.''' def __init__(self, pritext, sectext='', on_response_ok = None, on_response_cancel = None): + self.user_response_ok = on_response_ok + self.user_response_cancel = on_response_cancel HigDialog.__init__(self, None, gtk.MESSAGE_QUESTION, gtk.BUTTONS_OK_CANCEL, pritext, sectext, - on_response_ok, on_response_cancel) + self.on_response_ok, self.on_response_cancel) self.popup() + def on_response_ok(self, widget): + if self.user_response_ok: + if isinstance(self.user_response_ok, tuple): + self.user_response_ok[0](*self.user_response_ok[1:]) + else: + self.user_response_ok() + self.destroy() + + def on_response_cancel(self, widget): + if self.user_response_cancel: + if isinstance(self.user_response_cancel, tuple): + self.user_response_cancel[0](*self.user_response_ok[1:]) + else: + self.user_response_cancel() + self.destroy() + class NonModalConfirmationDialog(HigDialog): '''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 + self.user_response_cancel = on_response_cancel HigDialog.__init__(self, None, gtk.MESSAGE_QUESTION, gtk.BUTTONS_OK_CANCEL, pritext, sectext, - on_response_ok, on_response_cancel) + self.on_response_ok, self.on_response_cancel) self.set_modal(False) + def on_response_ok(self, widget): + if self.user_response_ok: + if isinstance(self.user_response_ok, tuple): + self.user_response_ok[0](*self.user_response_ok[1:]) + else: + self.user_response_ok() + self.destroy() + + def on_response_cancel(self, widget): + if self.user_response_cancel: + if isinstance(self.user_response_cancel, tuple): + self.user_response_cancel[0](*self.user_response_cancel[1:]) + else: + self.user_response_cancel() + self.destroy() + class WarningDialog(HigDialog): def __init__(self, pritext, sectext=''): '''HIG compliant warning dialog.''' @@ -1130,15 +1226,19 @@ class YesNoDialog(HigDialog): HigDialog.__init__( self, None, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, pritext, sectext, on_response_yes = on_response_yes, on_response_no = on_response_no) + self.set_modal(False) self.popup() class ConfirmationDialogCheck(ConfirmationDialog): '''HIG compliant confirmation dialog with checkbutton.''' def __init__(self, pritext, sectext='', checktext = '', - on_response_ok = None, on_response_cancel = None): + 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 + HigDialog.__init__(self, None, gtk.MESSAGE_QUESTION, - gtk.BUTTONS_OK_CANCEL, pritext, sectext, on_response_ok, - on_response_cancel) + gtk.BUTTONS_OK_CANCEL, pritext, sectext, self.on_response_ok, + self.on_response_cancel) self.set_default_response(gtk.RESPONSE_OK) @@ -1147,8 +1247,28 @@ class ConfirmationDialogCheck(ConfirmationDialog): self.checkbutton = gtk.CheckButton(checktext) self.vbox.pack_start(self.checkbutton, expand = False, fill = True) + self.set_modal(is_modal) self.popup() + # XXX should cancel if somebody closes the dialog + + def on_response_ok(self, widget): + if self.user_response_ok: + if isinstance(self.user_response_ok, tuple): + self.user_response_ok[0](self.is_checked(), + *self.user_response_ok[1:]) + else: + self.user_response_ok(self.is_checked()) + self.destroy() + + def on_response_cancel(self, widget): + if self.user_response_cancel: + if isinstance(self.user_response_cancel, tuple): + self.user_response_cancel[0](*self.user_response_ok[1:]) + else: + self.user_response_cancel() + self.destroy() + def is_checked(self): ''' Get active state of the checkbutton ''' return self.checkbutton.get_active() @@ -1408,6 +1528,9 @@ class JoinGroupchatWindow: if len(self._empty_required_widgets): self.xml.get_widget('join_button').set_sensitive(False) + if not gajim.connections[account].private_storage_supported: + self.xml.get_widget('auto_join_checkbutton').set_sensitive(False) + self.window.show_all() def on_join_groupchat_window_destroy(self, widget): @@ -1544,7 +1667,7 @@ class SynchroniseSelectAccountDialog: if not iter: return remote_account = model.get_value(iter, 0).decode('utf-8') - + if gajim.connections[remote_account].connected < 2: ErrorDialog(_('This account is not connected to the server'), _('You cannot synchronize with an account unless it is connected.')) @@ -1643,7 +1766,7 @@ class NewChatDialog(InputDialog): keys.sort() for jid in keys: contact = self.completion_dict[jid] - img = gajim.interface.roster.jabber_state_images['16'][contact.show] + img = gajim.interface.roster.jabber_state_images['16'][contact.show] liststore.append((img.get_pixbuf(), jid)) self.ok_handler = self.new_chat_response @@ -1825,8 +1948,11 @@ class SingleMessageWindow: singled message depending on action argument which can be 'send' or 'receive'. ''' - def __init__(self, account, to = '', action = '', from_whom = '', - subject = '', message = '', resource = ''): + # Keep a reference on windows so garbage collector don't restroy them + instances = [] + def __init__(self, account, to='', action='', from_whom='', subject='', + message='', resource='', session=None, form_node=None): + self.instances.append(self) self.account = account self.action = action @@ -1835,6 +1961,7 @@ class SingleMessageWindow: self.to = to self.from_whom = from_whom self.resource = resource + self.session = session self.xml = gtkgui_helpers.get_glade('single_message_window.glade') self.window = self.xml.get_widget('single_message_window') @@ -1856,6 +1983,18 @@ class SingleMessageWindow: self.conversation_tv_buffer = self.conversation_textview.tv.get_buffer() self.xml.get_widget('conversation_scrolledwindow').add( self.conversation_textview.tv) + + self.form_widget = None + parent_box = self.xml.get_widget('conversation_scrolledwindow').get_parent() + if form_node: + dataform = dataforms.ExtendForm(node = form_node) + self.form_widget = dataforms_widget.DataFormWidget(dataform) + self.form_widget.show_all() + parent_box.add(self.form_widget) + parent_box.child_set_property(self.form_widget, 'position', + parent_box.child_get_property(self.xml.get_widget('conversation_scrolledwindow'), 'position')) + self.action = 'form' + self.send_button = self.xml.get_widget('send_button') self.reply_button = self.xml.get_widget('reply_button') self.send_and_close_button = self.xml.get_widget('send_and_close_button') @@ -1878,7 +2017,7 @@ class SingleMessageWindow: spell1.set_language(lang) spell2.set_language(lang) except gobject.GError, msg: - dialogs.AspellDictError(lang) + AspellDictError(lang) self.prepare_widgets_for(self.action) @@ -1912,6 +2051,9 @@ class SingleMessageWindow: gajim.config.get('single-msg-height')) self.window.show_all() + def on_single_message_window_destroy(self, widget): + self.instances.remove(self) + def set_cursor_to_end(self): end_iter = self.message_tv_buffer.get_end_iter() self.message_tv_buffer.place_cursor(end_iter) @@ -1985,6 +2127,17 @@ class SingleMessageWindow: self.reply_button.grab_focus() self.cancel_button.hide() self.close_button.show() + elif action == 'form': # prepare UI for Receiving + title = _('Form %s') % title + self.send_button.show() + self.send_and_close_button.show() + self.to_label.show() + self.to_entry.show() + self.reply_button.hide() + self.from_label.hide() + self.from_entry.hide() + self.conversation_scrolledwindow.hide() + self.message_scrolledwindow.hide() self.window.set_title(title) @@ -2023,9 +2176,19 @@ class SingleMessageWindow: message) return + if self.session: + session = self.session + else: + session = gajim.connections[self.account].make_new_session(to_whom_jid) + + if self.form_widget: + form_node = self.form_widget.data_form + else: + form_node = None # FIXME: allow GPG message some day gajim.connections[self.account].send_message(to_whom_jid, message, - keyID = None, type = 'normal', subject=subject) + keyID=None, type='normal', subject=subject, session=session, + form_node=form_node) self.subject_entry.set_text('') # we sent ok, clear the subject self.message_tv_buffer.set_text('') # we sent ok, clear the textview @@ -2042,7 +2205,7 @@ class SingleMessageWindow: self.window.destroy() SingleMessageWindow(self.account, to = self.from_whom, action = 'send', from_whom = self.from_whom, subject = self.subject, - message = self.message) + message = self.message, session = self.session) def on_send_and_close_button_clicked(self, widget): self.send_single_message() @@ -2228,7 +2391,6 @@ class PrivacyListWindow: jid_entry_completion.set_model(jids_list_store) jid_entry_completion.set_popup_completion(True) self.edit_type_jabberid_entry.set_completion(jid_entry_completion) - if action == 'EDIT': self.refresh_rules() @@ -2470,101 +2632,6 @@ class PrivacyListWindow: def on_close_button_clicked(self, widget): self.window.destroy() -class BlockedContactsWindow: - '''Window that is the main window for ContactWindows;''' - def __init__(self, account): - self.account = account - self.xml = gtkgui_helpers.get_glade('blocked_contacts_window.glade') - self.window = self.xml.get_widget('blocked_contacts_window') - self.remove_button = self.xml.get_widget('remove_button') - self.contacts_treeview = self.xml.get_widget('contacts_treeview') - renderer = gtk.CellRendererText() - - self.store = gtk.ListStore(str) - self.contacts_treeview.set_model(self.store) - - column = gtk.TreeViewColumn('Contact', renderer, text=0) - self.contacts_treeview.append_column(column) - - if len(gajim.connections) > 1: - title = _('Blocked Contacts for %s') % self.account - else: - title = _('Blocked Contacts') - self.window.set_title(title) - self.window.show_all() - self.xml.signal_autoconnect(self) - gajim.connections[self.account].get_privacy_list('block') - - def on_blocked_contacts_window_destroy(self, widget): - key_name = 'blocked_contacts' - if key_name in gajim.interface.instances[self.account]: - del gajim.interface.instances[self.account][key_name] - - def on_remove_button_clicked(self, widget): - if self.contacts_treeview.get_selection().get_selected()[1] == None: - return - tags = [] - rule_selected = self.store.get_path( - self.contacts_treeview.get_selection().get_selected()[1])[0] - for i in range(0, len(self.global_rules)): - if i != rule_selected: - tags.append(self.global_rules[i]) - else: - deleted_rule = self.global_rules[i] - for rule in self.global_rules_to_append: - tags.append(rule) - gajim.connections[self.account].set_privacy_list( - 'block', tags) - gajim.connections[self.account].get_privacy_list('block') - if len(tags) == 0: - self.privacy_list_received([]) - gajim.connections[self.account].blocked_contacts = [] - gajim.connections[self.account].blocked_groups = [] - gajim.connections[self.account].blocked_list = [] - gajim.connections[self.account].set_default_list('') - gajim.connections[self.account].set_active_list('') - gajim.connections[self.account].del_privacy_list('block') - status = gajim.connections[self.account].connected - msg = gajim.connections[self.account].status - show = gajim.SHOW_LIST[gajim.connections[self.account].connected] - if deleted_rule['type'] == 'jid': - jid = deleted_rule['value'] - gajim.connections[self.account].send_custom_status(show, msg, jid) - # needed for draw_contact: - if jid in gajim.connections[self.account].blocked_contacts: - gajim.connections[self.account].blocked_contacts.remove(jid) - gajim.interface.roster.draw_contact(jid, self.account) - else: - group = deleted_rule['value'] - # needed for draw_group: - if group in gajim.connections[self.account].blocked_groups: - gajim.connections[self.account].blocked_groups.remove(group) - gajim.interface.roster.draw_group(group, self.account) - for jid in gajim.contacts.get_jid_list(self.account): - contact = gajim.contacts.get_contact_with_highest_priority( - self.account, jid) - if group in contact.groups: - gajim.connections[self.account].send_custom_status(show, msg, - contact.jid) - gajim.interface.roster.draw_contact(contact.jid, self.account) - - def privacy_list_received(self, rules): - self.store.clear() - self.global_rules = [] - self.global_rules_to_append = [] - for rule in rules: - if rule['type'] == 'jid' and rule['action'] == 'deny': - #self.global_rules[text_item] = rule - self.store.append([rule['value']]) - self.global_rules.append(rule) - elif rule['type'] == 'group' and rule['action'] == 'deny': - text_item = _('Group %s') % rule['value'] - self.store.append([text_item]) - self.global_rules.append(rule) - else: - self.global_rules_to_append.append(rule) - - 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 @@ -2688,17 +2755,21 @@ class PrivacyListsWindow: class InvitationReceivedDialog: def __init__(self, account, room_jid, contact_jid, password = None, - comment = None): + comment = None, is_continued = False): self.room_jid = room_jid self.account = account self.password = password + self.is_continued = is_continued xml = gtkgui_helpers.get_glade('invitation_received_dialog.glade') self.dialog = xml.get_widget('invitation_received_dialog') #Don't translate $Contact - pritext = _('$Contact has invited you to group chat %(room_jid)s')\ - % {'room_jid': room_jid} + if is_continued: + pritext = _('$Contact has invited you to join a discussion') + else: + pritext = _('$Contact has invited you to group chat %(room_jid)s')\ + % {'room_jid': room_jid} contact = gajim.contacts.get_first_contact_from_jid(account, contact_jid) if contact and contact.name: contact_text = '%s (%s)' % (contact.name, contact_jid) @@ -2709,6 +2780,7 @@ class InvitationReceivedDialog: label_text = '%s' % pritext if comment: # only if not None and not '' + comment = gobject.markup_escape_text(comment) sectext = _('Comment: %s') % comment label_text += '\n\n%s' % sectext @@ -2726,8 +2798,11 @@ class InvitationReceivedDialog: def on_accept_button_clicked(self, widget): self.dialog.destroy() try: - JoinGroupchatWindow(self.account, self.room_jid, - password=self.password) + if self.is_continued: + gajim.interface.roster.join_gc_room(self.account, self.room_jid, + gajim.nicks[self.account], None, is_continued=True) + else: + JoinGroupchatWindow(self.account, self.room_jid) except GajimGeneralException: pass @@ -2829,6 +2904,9 @@ class ImageChooserDialog(FileChooserDialog): on_response_ok = (on_ok, on_response_ok), on_response_cancel = on_response_cancel) + if on_response_cancel: + self.connect('destroy', on_response_cancel) + filter = gtk.FileFilter() filter.set_name(_('All files')) filter.add_pattern('*') @@ -2840,6 +2918,7 @@ class ImageChooserDialog(FileChooserDialog): filter.add_mime_type('image/jpeg') filter.add_mime_type('image/gif') filter.add_mime_type('image/tiff') + filter.add_mime_type('image/svg+xml') filter.add_mime_type('image/x-xpixmap') # xpm self.add_filter(filter) self.set_filter(filter) @@ -3394,3 +3473,134 @@ class AdvancedNotificationsWindow: def on_close_window(self, widget): self.window.destroy() + +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.''' + + self.instances.append(self) + self.account = account + self.auto_jids = jids + self.preselected_jids = preselected + + self.xml = gtkgui_helpers.get_glade('chat_to_muc_window.glade') + self.window = self.xml.get_widget('chat_to_muc_window') + + for widget_to_add in ('invite_button', 'cancel_button', + 'server_list_comboboxentry', 'guests_treeview', + 'server_and_guests_hseparator', 'server_select_label'): + self.__dict__[widget_to_add] = self.xml.get_widget(widget_to_add) + + # set comboboxentry + renderer_servers = gtk.CellRendererText() + + server_list = [] + self.servers = gtk.ListStore(str) + self.server_list_comboboxentry.set_model(self.servers) + + self.server_list_comboboxentry.set_text_column(0) + + # get the muc server of our server + if 'jabber' in gajim.connections[account].muc_jid: + server_list.append(gajim.connections[account].muc_jid['jabber']) + # add servers or recently joined groupchats + recently_groupchat = gajim.config.get('recently_groupchat').split() + for g in recently_groupchat: + server = gajim.get_server_from_jid(g) + if server not in server_list and not server.startswith('irc'): + server_list.append(server) + # add a default server + if not server_list: + server_list.append('conference.jabber.org') + + for s in server_list: + self.servers.append([s]) + + self.server_list_comboboxentry.set_active(0) + + # set treeview + # name, jid + self.store = gtk.ListStore(gtk.gdk.Pixbuf, str, str) + self.store.set_sort_column_id(1, gtk.SORT_ASCENDING) + self.guests_treeview.set_model(self.store) + + renderer1 = gtk.CellRendererText() + renderer2 = gtk.CellRendererPixbuf() + column = gtk.TreeViewColumn('Status', renderer2, pixbuf=0) + self.guests_treeview.append_column(column) + column = gtk.TreeViewColumn('Name', renderer1, text=1) + self.guests_treeview.append_column(column) + + self.guests_treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + + # set jabber id and pseudos + for account in gajim.contacts.get_accounts(): + if gajim.connections[account].is_zeroconf: + continue + for jid in gajim.contacts.get_jid_list(account): + contact = \ + gajim.contacts.get_contact_with_highest_priority(account, jid) + contact_transport = gajim.get_transport_name_from_jid(jid) + # do not add transports, zeroconf contacs, minimized groupchats + # and selfjid to list of invitable jids + if contact.jid not in self.auto_jids and contact.jid != \ + gajim.get_jid_from_account(self.account) and not contact_transport \ + and not contact.is_transport() and contact.jid not in \ + gajim.interface.minimized_controls[account]: + if contact.show not in ('offline', 'error'): + img = gajim.interface.roster.jabber_state_images['16'][ + contact.show] + name = contact.name + if name == '': + name = jid.split('@')[0] + iter = self.store.append([img.get_pixbuf(), name, jid]) + # preselect treeview rows + if self.preselected_jids and jid in self.preselected_jids: + path = self.store.get_path(iter) + self.guests_treeview.get_selection().\ + select_path(path) + + # show all + self.window.show_all() + + self.xml.signal_autoconnect(self) + + def on_chat_to_muc_window_destroy(self, widget): + self.instances.remove(self) + + def on_chat_to_muc_window_key_press_event(self, widget, event): + if event.keyval == gtk.keysyms.Escape: # ESCAPE + self.window.destroy() + + def on_invite_button_clicked(self, widget): + server = self.server_list_comboboxentry.get_active_text() + if server == '': + return + room_id = gajim.nicks[self.account] + str(randrange(9999999)) + gajim.connections[self.account].check_unique_room_id_support(server, self) + + def unique_room_id_supported(self, server, room_id): + guest_list = [] + guests = self.guests_treeview.get_selection().get_selected_rows() + for guest in guests[1]: + iter = self.store.get_iter(guest) + guest_list.append(self.store[iter][2].decode('utf-8')) + for guest in self.auto_jids: + guest_list.append(guest) + room_jid = room_id + '@' + server + gajim.automatic_rooms[self.account][room_jid] = {} + gajim.automatic_rooms[self.account][room_jid]['invities'] = guest_list + gajim.automatic_rooms[self.account][room_jid]['continue_tag'] = True + gajim.interface.roster.join_gc_room(self.account, room_jid, + gajim.nicks[self.account], None, is_continued=True) + self.window.destroy() + + def on_cancel_button_clicked(self, widget): + self.window.destroy() + + def unique_room_id_error(self, server): + self.unique_room_id_supported(server, + gajim.nicks[self.account] + str(randrange(9999999))) diff --git a/src/disco.py b/src/disco.py index 7446447e5..28ff7b2a0 100644 --- a/src/disco.py +++ b/src/disco.py @@ -1,19 +1,24 @@ # -*- coding: utf-8 -*- ## config.py ## -## Copyright (C) 2005-2006 Yann Le Boulanger +## Copyright (C) 2005-2006 Yann Leboulanger ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2005-2006 Stéphan Kochen ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## # The appearance of the treeview, and parts of the dialog, are controlled by # AgentBrowser (sub-)classes. Methods that probably should be overridden when @@ -67,6 +72,7 @@ def _gen_agent_type_info(): # Jabber server ('server', 'im'): (ToplevelAgentBrowser, 'jabber.png'), ('services', 'jabber'): (ToplevelAgentBrowser, 'jabber.png'), + ('hierarchy', 'branch'): (AgentBrowser, 'jabber.png'), # Services ('conference', 'text'): (MucBrowser, 'conference.png'), @@ -79,6 +85,7 @@ def _gen_agent_type_info(): ('pubsub', 'generic'): (PubSubBrowser, 'pubsub.png'), ('pubsub', 'service'): (PubSubBrowser, 'pubsub.png'), ('proxy', 'bytestreams'): (None, 'bytestreams.png'), # Socks5 FT proxy + ('headline', 'newmail'): (ToplevelAgentBrowser, 'mail.png'), # Transports ('conference', 'irc'): (ToplevelAgentBrowser, 'irc.png'), @@ -444,7 +451,6 @@ _('Without a connection, you can not browse available services')) self.style_event_id = 0 self.banner.realize() self.paint_banner() - self.filter_hbox = self.xml.get_widget('filter_hbox') self.action_buttonbox = self.xml.get_widget('action_buttonbox') # Address combobox @@ -954,6 +960,7 @@ _('This service does not contain any items to browse.')) 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 @@ -964,7 +971,9 @@ _('This service does not contain any items to browse.')) 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.''' - self.model[iter][2] = identities[0].get('name', '') + name = identities[0].get('name', '') + if name: + self.model[iter][2] = name def _update_error(self, iter, jid, node): '''Called when a disco#info query failed for an item.''' @@ -1195,26 +1204,6 @@ class ToplevelAgentBrowser(AgentBrowser): self.search_button = None AgentBrowser._clean_actions(self) - def cleanup(self): - self.tooltip.hide_tooltip() - AgentBrowser.cleanup(self) - - def update_theme(self): - theme = gajim.config.get('roster_theme') - bgcolor = gajim.config.get_per('themes', theme, 'groupbgcolor') - if bgcolor: - self._renderer.set_property('cell-background', bgcolor) - 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''' - model, iter = self.window.services_treeview.get_selection().get_selected() - if not iter: - return - service = model[iter][0].decode('utf-8') - adhoc_commands.CommandWindow(self.account, service) - def on_search_button_clicked(self, widget = None): '''When we want to search something: open search window''' @@ -1228,20 +1217,6 @@ class ToplevelAgentBrowser(AgentBrowser): gajim.interface.instances[self.account]['search'][service] = \ search_window.SearchWindow(self.account, service) - 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.''' - model, iter = self.window.services_treeview.get_selection().get_selected() - if not iter: - return - jid = model[iter][0].decode('utf-8') - if jid: - gajim.connections[self.account].request_register_agent_info(jid) - self.window.destroy(chain = True) - - AgentBrowser._clean_actions(self) - def cleanup(self): self.tooltip.hide_tooltip() AgentBrowser.cleanup(self) diff --git a/src/features_window.py b/src/features_window.py index f0f7c061b..eeb983a98 100644 --- a/src/features_window.py +++ b/src/features_window.py @@ -1,18 +1,25 @@ ## features_window.py ## -## Copyright (C) 2007 Yann Le Boulanger +## Copyright (C) 2007 Yann Leboulanger +## Stephan Erb ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 os +import sys import gtk import gobject import gtkgui_helpers @@ -66,7 +73,7 @@ class FeaturesWindow: _('Requires gnome-keyring and python-gnome2-desktop.'), _('Feature not available under Windows.')), _('SRV'): (self.srv_available, - _('Ability to connect to servers which is using SRV records.'), + _('Ability to connect to servers which are using SRV records.'), _('Requires dnsutils.'), _('Requires nslookup to use SRV records.')), _('Spell Checker'): (self.speller_available, @@ -89,6 +96,18 @@ class FeaturesWindow: _('Transform LaTeX espressions between $$ $$.'), _('Requires texlive-latex-base, dvips and imagemagick. You have to set \'use_latex\' to True in the Advanced Configuration Editor.'), _('Feature not available under Windows.')), + _('End to end encryption'): (self.pycrypto_available, + _('Encrypting chatmessages.'), + _('Requires python-crypto.'), + _('Requires python-crypto.')), + _('RST Generator'): (self.docutils_available, + _('Generate XHTML output from RST code (see http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html).'), + _('Requires python-docutils.'), + _('Requires python-docutils.')), + _('libsexy'): (self.pysexy_available, + _('Ability to have clickable URLs in chat and groupchat window banners.'), + _('Requires python-sexy.'), + _('Requires python-sexy.')), } # name, supported @@ -124,7 +143,7 @@ class FeaturesWindow: selection = widget.get_selection() path = selection.get_selected_rows()[1][0] available = self.model[path][1] - feature = self.model[path][0] + feature = self.model[path][0].decode('utf-8') text = self.features[feature][1] + '\n' if os.name == 'nt': text = text + self.features[feature][3] @@ -201,6 +220,12 @@ class FeaturesWindow: def notification_available(self): if os.name == 'nt': return False + elif sys.platform == 'darwin': + try: + import osx.growler + except: + return False + return True from common import dbus_support if self.dbus_available() and dbus_support.get_notifications_interface(): return True @@ -274,3 +299,18 @@ class FeaturesWindow: if exitcode == 0: return True return False + + def pycrypto_available(self): + from common import gajim + return gajim.HAVE_PYCRYPTO + + def docutils_available(self): + try: + import docutils + except: + return False + return True + + def pysexy_available(self): + from common import gajim + return gajim.HAVE_PYSEXY diff --git a/src/filetransfers_window.py b/src/filetransfers_window.py index 8de1e4a74..04253ee13 100644 --- a/src/filetransfers_window.py +++ b/src/filetransfers_window.py @@ -1,21 +1,26 @@ ## filetransfers_window.py ## -## Copyright (C) 2003-2006 Yann Le Boulanger +## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2005 ## Dimitur Kirov ## Travis Shirk ## Copyright (C) 2004-2005 Vincent Hanquez ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 @@ -128,7 +133,7 @@ class FileTransfersWindow: if file_props['tt_account'] == account: receiver_jid = unicode(file_props['receiver']).split('/')[0] if jid == receiver_jid: - if not self.is_transfer_stoped(file_props): + if not self.is_transfer_stopped(file_props): active_transfers[0].append(file_props) # 'account' is the recipient @@ -136,7 +141,7 @@ class FileTransfersWindow: if file_props['tt_account'] == account: sender_jid = unicode(file_props['sender']).split('/')[0] if jid == sender_jid: - if not self.is_transfer_stoped(file_props): + if not self.is_transfer_stopped(file_props): active_transfers[1].append(file_props) return active_transfers @@ -219,13 +224,17 @@ _('Connection with peer cannot be established.')) self.tree.get_selection().unselect_all() def show_file_send_request(self, account, contact): + + desc_entry = gtk.Entry() + def on_ok(widget): file_dir = None files_path_list = dialog.get_filenames() files_path_list = gtkgui_helpers.decode_filechooser_file_paths( files_path_list) + desc = desc_entry.get_text() for file_path in files_path_list: - if self.send_file(account, contact, file_path) and file_dir is None: + if self.send_file(account, contact, file_path, desc) and file_dir is None: file_dir = os.path.dirname(file_path) if file_dir: gajim.config.set('last_send_dir', file_dir) @@ -245,9 +254,17 @@ _('Connection with peer cannot be established.')) # FIXME: add send icon to this button (JUMP_TO) dialog.add_action_widget(btn, gtk.RESPONSE_OK) dialog.set_default_response(gtk.RESPONSE_OK) + + desc_hbox = gtk.HBox(False, 5) + desc_hbox.pack_start(gtk.Label(_('Description: ')),False,False,0) + desc_hbox.pack_start(desc_entry,True,True,0) + + dialog.vbox.pack_start(desc_hbox, False, False, 0) + btn.show() + desc_hbox.show_all() - def send_file(self, account, contact, file_path): + def send_file(self, account, contact, file_path, file_desc=''): ''' start the real transfer(upload) of the file ''' if gtkgui_helpers.file_is_locked(file_path): pritext = _('Gajim cannot access this file') @@ -263,7 +280,7 @@ _('Connection with peer cannot be established.')) resource = resource) (file_dir, file_name) = os.path.split(file_path) file_props = self.get_send_file_props(account, contact, - file_path, file_name) + file_path, file_name, file_desc) if file_props is None: return False self.add_transfer(account, contact, file_props) @@ -294,8 +311,7 @@ _('Connection with peer cannot be established.')) prim_text = _('%s wants to send you a file:') % contact.jid dialog, dialog2 = None, None - def on_response_ok(widget, account, contact, file_props): - dialog.destroy() + def on_response_ok(account, contact, file_props): def on_ok(widget, account, contact, file_props): file_path = dialog2.get_filename() @@ -324,7 +340,9 @@ _('Connection with peer cannot be established.')) file_props['offset'] = dl_size else: dirname = os.path.dirname(file_path) - if not os.access(dirname, os.W_OK): + if not os.access(dirname, os.W_OK) and os.name != 'nt': + # read-only bit is used to mark special folder under windows, + # not to mark that a folder is read-only. See ticket #3587 dialogs.ErrorDialog(_('Directory "%s" is not writable') % dirname, _('You do not have permission to create files in this directory.')) return dialog2.destroy() @@ -348,8 +366,7 @@ _('Connection with peer cannot be established.')) dialog2.connect('delete-event', lambda widget, event: on_cancel(widget, account, contact, file_props)) - def on_response_cancel(widget, account, file_props): - dialog.destroy() + def on_response_cancel(account, file_props): gajim.connections[account].send_file_rejection(file_props) dialog = dialogs.NonModalConfirmationDialog(prim_text, sec_text, @@ -471,7 +488,7 @@ _('Connection with peer cannot be established.')) if full_size == 0: percent = 0 else: - percent = round(float(transfered_size) / full_size * 100) + percent = round(float(transfered_size) / full_size * 100, 1) if iter is None: iter = self.get_iter_by_sid(typ, sid) if iter is not None: @@ -536,11 +553,12 @@ _('Connection with peer cannot be established.')) return iter iter = self.model.iter_next(iter) - def get_send_file_props(self, account, contact, file_path, file_name): + 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_props = {'file-name' : file_path, 'name' : file_name, - 'type' : 's'} + 'type' : 's', 'desc' : file_desc} if os.path.isfile(file_path): stat = os.stat(file_path) else: @@ -656,7 +674,7 @@ _('Connection with peer cannot be established.')) return True return not file_props['paused'] - def is_transfer_stoped(self, file_props): + def is_transfer_stopped(self, file_props): if file_props.has_key('error') and file_props['error'] != 0: return True if file_props.has_key('completed') and file_props['completed']: @@ -698,7 +716,7 @@ _('Connection with peer cannot be established.')) self.remove_menuitem.set_sensitive(is_row_selected) self.open_folder_menuitem.set_sensitive(is_row_selected) is_stopped = False - if self.is_transfer_stoped(file_props): + if self.is_transfer_stopped(file_props): is_stopped = True self.cancel_button.set_sensitive(not is_stopped) self.cancel_menuitem.set_sensitive(not is_stopped) @@ -752,7 +770,7 @@ _('Connection with peer cannot be established.')) iter = self.model.get_iter((i)) sid = self.model[iter][C_SID].decode('utf-8') file_props = self.files_props[sid[0]][sid[1:]] - if self.is_transfer_stoped(file_props): + if self.is_transfer_stopped(file_props): self._remove_transfer(iter, sid, file_props) i -= 1 self.tree.get_selection().unselect_all() diff --git a/src/gajim-remote.py b/src/gajim-remote.py index 91ff086a6..892375a39 100755 --- a/src/gajim-remote.py +++ b/src/gajim-remote.py @@ -1,18 +1,23 @@ #!/usr/bin/env python ## -## Copyright (C) 2005-2006 Yann Le Boulanger +## Copyright (C) 2005-2006 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005 Dimitur Kirov ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## # gajim-remote help will show you the D-BUS API of Gajim @@ -35,6 +40,9 @@ def send_error(error_message): sys.exit(1) try: + if sys.platform == 'darwin': + import osx.dbus + osx.dbus.load(False) import dbus import dbus.service import dbus.glib diff --git a/src/gajim.py b/src/gajim.py index b9e12222c..33cd8a6b4 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -2,25 +2,48 @@ ## gajim.py ## ## -## Copyright (C) 2003-2006 Yann Le Boulanger +## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos -## Copyright (C) 2005-2006 Dimitur Kirov +## Dimitur Kirov ## Copyright (C) 2005 Travis Shirk ## Copyright (C) 2007 Lukas Petrovicky -## Copyright (C) 2007 Julien Pivotto +## Julien Pivotto +## Stephan Erb ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 os + +if os.name == 'nt': + import warnings + warnings.filterwarnings(action='ignore') + +# Used to create windows installer with GTK included +# paths = os.environ['PATH'] +# list_ = paths.split(';') +# new_list = [] +# for p in list_: +# if p.find('gtk') < 0 and p.find('GTK') < 0: +# new_list.append(p) +# new_list.insert(0, 'gtk/lib') +# new_list.insert(0, 'gtk/bin') +# os.environ['PATH'] = ';'.join(new_list) +# os.environ['GTK_BASEPATH'] = 'gtk' import sys -import os import urllib import logging @@ -112,11 +135,24 @@ del config_path common.configpaths.gajimpaths.init_profile(profile) del profile +# PyGTK2.10+ only throws a warning +import warnings +warnings.filterwarnings('error', module='gtk') +try: + import gtk +except Warning, msg: + if str(msg) == 'could not open display': + print >> sys.stderr, _('Gajim needs X server to run. Quiting...') + sys.exit() +warnings.resetwarnings() + import message_control from chat_control import ChatControlBase from atom_window import AtomWindow +import negotiation + from common import exceptions from common.zeroconf import connection_zeroconf from common import dbus_support @@ -131,12 +167,6 @@ if os.name == 'posix': # dl module is Unix Only except: pass -try: - import gtk -except RuntimeError, msg: - if str(msg) == 'could not open display': - print >> sys.stderr, _('Gajim needs X server to run. Quiting...') - sys.exit() pritext = '' if gtk.pygtk_version < (2, 8, 0): pritext = _('Gajim needs PyGTK 2.8 or above') @@ -169,7 +199,7 @@ if os.name == 'nt': sectext = _('Please make sure that Pywin32 is installed on your system. You can get it at %s') % 'http://sourceforge.net/project/showfiles.php?group_id=78018' if pritext: - dlg = gtk.MessageDialog(None, + dlg = gtk.MessageDialog(None, gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, message_format = pritext) @@ -208,6 +238,7 @@ from common import socks5 from common import gajim from common import helpers from common import optparser +from common import dataforms if verbose: gajim.verbose = True del verbose @@ -280,16 +311,19 @@ def pid_alive(): if get_p(pid) in ('python.exe', 'gajim.exe'): return True return False + elif sys.platform == 'darwin': + from osx import checkPID + return checkPID(pid, 'Gajim.bin') try: if not os.path.exists('/proc'): return True # no /proc, assume Gajim is running try: - f = open('/proc/%d/cmdline'% pid) + f = open('/proc/%d/cmdline'% pid) except IOError, e: if e.errno == errno.ENOENT: return False # file/pid does not exist - raise + raise n = f.read().lower() f.close() @@ -342,6 +376,9 @@ def on_exit(): # delete pid file on normal exit if os.path.exists(pid_filename): os.remove(pid_filename) + if sys.platform == 'darwin': + import osx + osx.shutdown() import atexit atexit.register(on_exit) @@ -353,7 +390,7 @@ import profile_window import config class GlibIdleQueue(idlequeue.IdleQueue): - ''' + ''' Extends IdleQueue to use glib io_add_wath, instead of select/poll In another, `non gui' implementation of Gajim IdleQueue can be used safetly. ''' @@ -361,29 +398,29 @@ class GlibIdleQueue(idlequeue.IdleQueue): ''' this method is called at the end of class constructor. Creates a dict, which maps file/pipe/sock descriptor to glib event id''' self.events = {} - # time() is already called in glib, we just get the last value + # time() is already called in glib, we just get the last value # overrides IdleQueue.current_time() self.current_time = lambda: gobject.get_current_time() - + def add_idle(self, fd, flags): ''' this method is called when we plug a new idle object. Start listening for events from fd ''' - res = gobject.io_add_watch(fd, flags, self.process_events, + res = gobject.io_add_watch(fd, flags, self.process_events, priority=gobject.PRIORITY_LOW) # store the id of the watch, so that we can remove it on unplug self.events[fd] = res - + def remove_idle(self, fd): ''' this method is called when we unplug a new idle object. Stop listening for events from fd ''' gobject.source_remove(self.events[fd]) del(self.events[fd]) - + def process(self): self.check_time_events() - + class Interface: def handle_event_roster(self, account, data): #('ROSTER', account, array) @@ -404,7 +441,7 @@ class Interface: def handle_event_information(self, unused, data): #('INFORMATION', account, (title_text, section_text)) dialogs.InformationDialog(data[0], data[1]) - + def handle_event_ask_new_nick(self, account, data): #('ASK_NEW_NICK', account, (room_jid, title_text, prompt_text, proposed_nick)) room_jid = data[0] @@ -425,6 +462,8 @@ class Interface: gajim.connections[account].build_http_auth_answer(iq_obj, answer) sec_msg = _('Do you accept this request?') + if gajim.get_number_of_connected_accounts() > 1: + sec_msg = _('Do you accept this request on account %s?') % account if data[4]: sec_msg = data[4] + '\n' + sec_msg self.dialog = dialogs.YesNoDialog(_('HTTP (%s) Authorization for %s (id: %s)') \ @@ -444,7 +483,7 @@ class Interface: if ft.files_props['s'].has_key(sid): file_props = ft.files_props['s'][sid] file_props['error'] = -4 - self.handle_event_file_request_error(account, + self.handle_event_file_request_error(account, (jid_from, file_props, errmsg)) conn = gajim.connections[account] conn.disconnect_transfer(file_props) @@ -456,7 +495,7 @@ class Interface: sid = id[3:] if conn.files_props.has_key(sid): file_props = conn.files_props[sid] - self.handle_event_file_send_error(account, + self.handle_event_file_send_error(account, (jid_from, file_props)) conn.disconnect_transfer(file_props) return @@ -519,7 +558,7 @@ class Interface: self.edit_own_details(account) if self.remote_ctrl: self.remote_ctrl.raise_signal('AccountPresence', (status, account)) - + def edit_own_details(self, account): jid = gajim.get_jid_from_account(account) if not self.instances[account].has_key('profile'): @@ -594,7 +633,7 @@ class Interface: self.roster.add_self_contact(account) elif contact1.show in statuss: old_show = statuss.index(contact1.show) - if (resources != [''] and (len(lcontact) != 1 or + if (resources != [''] and (len(lcontact) != 1 or lcontact[0].show != 'offline')) and jid.find('@') > 0: old_show = 0 contact1 = gajim.contacts.copy_contact(contact1) @@ -685,11 +724,11 @@ class Interface: # It's maybe a GC_NOTIFY (specialy for MSN gc) self.handle_event_gc_notify(account, (jid, array[1], status_message, array[3], None, None, None, None, None, None, None, None)) - + def handle_event_msg(self, account, array): # 'MSG' (account, (jid, msg, time, encrypted, msg_type, subject, - # chatstate, msg_id, composing_xep, user_nick, xhtml)) + # chatstate, msg_id, composing_xep, user_nick, xhtml, session, form_node)) # user_nick is JEP-0172 full_jid_with_resource = array[0] @@ -704,6 +743,7 @@ class Interface: msg_id = array[7] composing_xep = array[8] xhtml = array[10] + session = array[11] if gajim.config.get('ignore_incoming_xhtml'): xhtml = None if gajim.jid_is_transport(jid): @@ -741,7 +781,7 @@ class Interface: jid_of_control = jid chat_control = self.msg_win_mgr.get_control(jid, account) - # Handle chat states + # Handle chat states contact = gajim.contacts.get_contact(account, jid, resource) if contact: if contact.composing_xep != 'XEP-0085': # We cache xep85 support @@ -757,7 +797,7 @@ class Interface: # got no valid jep85 answer, peer does not support it contact.chatstate = False elif chatstate == 'active': - # Brand new message, incoming. + # Brand new message, incoming. contact.our_chatstate = chatstate contact.chatstate = chatstate if msg_id: # Do not overwrite an existing msg_id with None @@ -774,7 +814,7 @@ class Interface: if not contact: # contact is not in the roster, create a fake one to display # notification - contact = common.contacts.Contact(jid = jid, resource = resource) + contact = common.contacts.Contact(jid = jid, resource = resource) advanced_notif_num = notify.get_advanced_notification('message_received', account, contact) @@ -783,27 +823,28 @@ class Interface: if msg_type == 'normal': if not gajim.events.get_events(account, jid, ['normal']): first = True - elif not chat_control and not gajim.events.get_events(account, + elif not chat_control and not gajim.events.get_events(account, jid_of_control, [msg_type]): # msg_type can be chat or pm first = True if pm: nickname = resource groupchat_control.on_private_message(nickname, message, array[2], - xhtml, msg_id) + xhtml, session, msg_id) else: # array: (jid, msg, time, encrypted, msg_type, subject) if encrypted: self.roster.on_message(jid, message, array[2], account, array[3], msg_type, subject, resource, msg_id, array[9], - advanced_notif_num) + advanced_notif_num, session=session, form_node=array[12]) else: # xhtml in last element self.roster.on_message(jid, message, array[2], account, array[3], msg_type, subject, resource, msg_id, array[9], - advanced_notif_num, xhtml = xhtml) + advanced_notif_num, xhtml=xhtml, session=session, + form_node=array[12]) nickname = gajim.get_name_from_jid(account, jid) - # Check and do wanted notifications + # Check and do wanted notifications msg = message if subject: msg = _('Subject: %s') % subject + '\n' + msg @@ -856,7 +897,7 @@ class Interface: msg = _('error while sending %s ( %s )') % (array[3], msg) self.roster.on_message(jid, msg, array[4], account, \ msg_type='error') - + def handle_event_msgsent(self, account, array): #('MSGSENT', account, (jid, msg, keyID)) msg = array[1] @@ -914,14 +955,14 @@ class Interface: gajim.connections[account].ack_unsubscribed(jid) if self.remote_ctrl: self.remote_ctrl.raise_signal('Unsubscribed', (account, jid)) - + def handle_event_agent_info_error(self, account, agent): #('AGENT_ERROR_INFO', account, (agent)) try: gajim.connections[account].services_cache.agent_info_error(agent) except AttributeError: return - + def handle_event_agent_items_error(self, account, agent): #('AGENT_ERROR_INFO', account, (agent)) try: @@ -978,10 +1019,11 @@ class Interface: return def handle_event_new_acc_connected(self, account, array): - #('NEW_ACC_CONNECTED', account, (infos, is_form)) + #('NEW_ACC_CONNECTED', account, (infos, is_form, ssl_msg, ssl_cert, + # ssl_fingerprint)) if self.instances.has_key('account_creation_wizard'): self.instances['account_creation_wizard'].new_acc_connected(array[0], - array[1]) + array[1], array[2], array[3], array[4]) def handle_event_new_acc_not_connected(self, account, array): #('NEW_ACC_NOT_CONNECTED', account, (reason)) @@ -1026,7 +1068,7 @@ class Interface: resource = '' if vcard.has_key('resource'): resource = vcard['resource'] - + # vcard window win = None if self.instances[account]['infos'].has_key(jid): @@ -1125,23 +1167,38 @@ class Interface: # print status in chat window and update status/GPG image if ctrl: - contact = ctrl.contact - contact.show = show - contact.status = status - uf_show = helpers.get_uf_show(show) - if status: - ctrl.print_conversation(_('%s is now %s (%s)') % (nick, uf_show, - status), 'status') + statusCode = array[9] + if '303' in statusCode: + new_nick = array[10] + ctrl.print_conversation(_('%s is now known as %s') % (nick, + new_nick), 'status') + gc_c = gajim.contacts.get_gc_contact(account, room_jid, new_nick) + c = gajim.contacts.contact_from_gc_contact(gc_c) + ctrl.gc_contact = gc_c + ctrl.contact = c + ctrl.draw_banner() + old_jid = room_jid + '/' + nick + new_jid = room_jid + '/' + new_nick + self.msg_win_mgr.change_key(old_jid, new_jid, account) else: - ctrl.print_conversation(_('%s is now %s') % (nick, uf_show), - 'status') - ctrl.parent_win.redraw_tab(ctrl) - ctrl.update_ui() + contact = ctrl.contact + contact.show = show + contact.status = status + uf_show = helpers.get_uf_show(show) + if status: + ctrl.print_conversation(_('%s is now %s (%s)') % (nick, uf_show, + status), 'status') + else: + ctrl.print_conversation(_('%s is now %s') % (nick, uf_show), + 'status') + ctrl.parent_win.redraw_tab(ctrl) + ctrl.update_ui() if self.remote_ctrl: self.remote_ctrl.raise_signal('GCPresence', (account, array)) def handle_event_gc_msg(self, account, array): - # ('GC_MSG', account, (jid, msg, time, has_timestamp, htmlmsg)) + # ('GC_MSG', account, (jid, msg, time, has_timestamp, htmlmsg, + # [status_codes])) jids = array[0].split('/', 1) room_jid = jids[0] @@ -1163,7 +1220,7 @@ class Interface: # message from someone nick = jids[1] - gc_control.on_message(nick, array[1], array[2], array[3], xhtml) + gc_control.on_message(nick, array[1], array[2], array[3], xhtml, array[5]) contact = gajim.contacts.\ get_contact_with_highest_priority(account, room_jid) @@ -1197,8 +1254,8 @@ class Interface: text = None if len(jids) > 1: text = '%s has set the subject to %s' % (jids[1], array[1]) - # Workaround for psi bug http://flyspray.psi-im.org/task/595 , to be - # deleted one day. We can receive a subject with a body that contains + # Workaround for psi bug http://flyspray.psi-im.org/task/595 , to be + # deleted one day. We can receive a subject with a body that contains # "X has set the subject to Y" ... elif array[2]: text = array[2] @@ -1212,12 +1269,25 @@ class Interface: #('GC_CONFIG', account, (jid, form)) config is a dict room_jid = array[0].split('/')[0] if room_jid in gajim.automatic_rooms[account]: - # use default configuration - gajim.connections[account].send_gc_config(room_jid, array[1]) + if gajim.automatic_rooms[account][room_jid].has_key('continue_tag'): + # We're converting chat to muc. allow participants to invite + form = dataforms.ExtendForm(node = array[1]) + for f in form.iter_fields(): + if f.var == 'muc#roomconfig_allowinvites': + f.value = True + gajim.connections[account].send_gc_config(room_jid, form) + else: + # use default configuration + gajim.connections[account].send_gc_config(room_jid, array[1]) # invite contacts + # check if it is necessary to add + continue_tag = False + if gajim.automatic_rooms[account][room_jid].has_key('continue_tag'): + continue_tag = True if gajim.automatic_rooms[account][room_jid].has_key('invities'): for jid in gajim.automatic_rooms[account][room_jid]['invities']: - gajim.connections[account].send_invite(room_jid, jid) + gajim.connections[account].send_invite(room_jid, jid, + continue_tag=continue_tag) del gajim.automatic_rooms[account][room_jid] elif not self.instances[account]['gc_config'].has_key(room_jid): self.instances[account]['gc_config'][room_jid] = \ @@ -1241,6 +1311,7 @@ class Interface: if '100' in statusCode: # Can be a presence (see chg_contact_status in groupchat_contol.py) changes.append(_('Any occupant is allowed to see your full JID')) + gc_control.is_anonymous = False if '102' in statusCode: changes.append(_('Room now shows unavailable member')) if '103' in statusCode: @@ -1255,10 +1326,13 @@ class Interface: changes.append(_('Room logging is now disabled')) if '172' in statusCode: changes.append(_('Room is now non-anonymous')) + gc_control.is_anonymous = False if '173' in statusCode: changes.append(_('Room is now semi-anonymous')) + gc_control.is_anonymous = True if '174' in statusCode: changes.append(_('Room is now fully-anonymous')) + gc_control.is_anonymous = True for change in changes: gc_control.print_conversation(change) @@ -1294,16 +1368,16 @@ class Interface: dlg.input_entry.set_visibility(False) def handle_event_gc_invitation(self, account, array): - #('GC_INVITATION', (room_jid, jid_from, reason, password)) + #('GC_INVITATION', (room_jid, jid_from, reason, password, is_continued)) jid = gajim.get_jid_without_resource(array[1]) room_jid = array[0] if helpers.allow_popup_window(account) or not self.systray_enabled: dialogs.InvitationReceivedDialog(account, room_jid, jid, array[3], - array[2]) + array[2], is_continued=array[4]) return self.add_event(account, jid, 'gc-invitation', (room_jid, array[2], - array[3])) + array[3], array[4])) if helpers.allow_showing_notification(account): path = os.path.join(gajim.DATA_DIR, 'pixmaps', 'events', @@ -1313,14 +1387,53 @@ class Interface: notify.popup(event_type, jid, account, 'gc-invitation', path, event_type, room_jid) + def forget_gpg_passphrase(self, keyid): + if self.gpg_passphrase.has_key(keyid): + del self.gpg_passphrase[keyid] + return False + def handle_event_bad_passphrase(self, account, array): + #('BAD_PASSPHRASE', account, ()) use_gpg_agent = gajim.config.get('use_gpg_agent') + sectext = '' if use_gpg_agent: - return + sectext = _('You configured Gajim to use GPG agent, but there is no ' + 'GPG agent running or it returned a wrong passphrase.\n') + sectext += _('You are currently connected without your OpenPGP key.') keyID = gajim.config.get_per('accounts', account, 'keyid') - self.roster.forget_gpg_passphrase(keyID) - dialogs.WarningDialog(_('Your passphrase is incorrect'), - _('You are currently connected without your OpenPGP key.')) + self.forget_gpg_passphrase(keyID) + dialogs.WarningDialog(_('Your passphrase is incorrect'), sectext) + + def handle_event_gpg_password_required(self, account, array): + #('GPG_PASSWORD_REQUIRED', account, (callback,)) + callback = array[0] + keyid = gajim.config.get_per('accounts', account, 'keyid') + if self.gpg_passphrase.has_key(keyid): + gajim.connections[account].gpg_passphrase(self.gpg_passphrase[keyid]) + callback() + return + password_ok = False + count = 0 + title = _('Passphrase Required') + second = _('Enter GPG key passphrase for account %s.') % account + while not password_ok and count < 3: + count += 1 + w = dialogs.PassphraseDialog(title, second, '') + passphrase, save = w.run() + if passphrase == -1: + # User pressed cancel + passphrase = None + password_ok = True + else: + password_ok = gajim.connections[account].\ + test_gpg_passphrase(passphrase) + title = _('Wrong Passphrase') + second = _('Please retype your GPG passphrase or press Cancel.') + if passphrase != None: + self.gpg_passphrase[keyid] = passphrase + gobject.timeout_add(30000, self.forget_gpg_passphrase, keyid) + gajim.connections[account].gpg_passphrase(passphrase) + callback() def handle_event_roster_info(self, account, array): #('ROSTER_INFO', account, (jid, name, sub, ask, groups)) @@ -1384,8 +1497,8 @@ class Interface: # ('BOOKMARKS', account, [{name,jid,autojoin,password,nick}, {}]) # We received a bookmark item from the server (JEP48) # Auto join GC windows if neccessary - - self.roster.actions_menu_needs_rebuild = True + + self.roster.set_actions_menu_needs_rebuild() invisible_show = gajim.SHOW_LIST.index('invisible') # do not autojoin if we are invisible if gajim.connections[account].connected == invisible_show: @@ -1429,7 +1542,7 @@ class Interface: text = i18n.ngettext('You have %d new mail conversation', 'You have %d new mail conversations', gmail_new_messages, gmail_new_messages, gmail_new_messages) - + if gajim.config.get('notify_on_new_gmail_email_extra'): for gmessage in gmail_messages_list: #FIXME: emulate Gtalk client popups. find out what they parse and how @@ -1437,7 +1550,7 @@ class Interface: # each message has a 'From', 'Subject' and 'Snippet' field text += _('\nFrom: %(from_address)s') % \ {'from_address': gmessage['From']} - + if gajim.config.get_per('soundevents', 'gmail_received', 'enabled'): helpers.play_sound('gmail_received') path = gtkgui_helpers.get_path_to_generic_or_avatar(img) @@ -1447,50 +1560,63 @@ class Interface: if self.remote_ctrl: self.remote_ctrl.raise_signal('NewGmail', (account, array)) - def save_avatar_files(self, jid, photo_decoded, puny_nick = None): - '''Save the decoded avatar to a separate file, and generate files for dbus notifications''' + 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.''' puny_jid = helpers.sanitize_filename(jid) path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) if puny_nick: path_to_file = os.path.join(path_to_file, puny_nick) # remove old avatars for typ in ('jpeg', 'png'): - path_to_original_file = path_to_file + '.' + typ + if local: + path_to_original_file = path_to_file + '_local'+ '.' + typ + else: + path_to_original_file = path_to_file + '.' + typ if os.path.isfile(path_to_original_file): os.remove(path_to_original_file) - pixbuf, typ = gtkgui_helpers.get_pixbuf_from_data(photo_decoded, - want_type = True) - if pixbuf is None: - return - if typ not in ('jpeg', 'png'): - gajim.log.debug('gtkpixbuf cannot save other than jpeg and png formats. saving %s\'avatar as png file (originaly %s)' % (jid, typ)) - typ = 'png' - path_to_original_file = path_to_file + '.' + typ + if local and photo: + pixbuf = photo + type = 'png' + extension = '_local.png' # save local avatars as png file + else: + pixbuf, typ = gtkgui_helpers.get_pixbuf_from_data(photo, want_type = True) + if pixbuf is None: + return + extension = '.' + typ + if typ not in ('jpeg', 'png'): + gajim.log.debug('gtkpixbuf cannot save other than jpeg and png formats. saving %s\'avatar as png file (originaly %s)' % (jid, typ)) + typ = 'png' + extension = '.png' + path_to_original_file = path_to_file + extension pixbuf.save(path_to_original_file, typ) # Generate and save the resized, color avatar - pixbuf = gtkgui_helpers.get_scaled_pixbuf( - gtkgui_helpers.get_pixbuf_from_data(photo_decoded), 'notification') + pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'notification') if pixbuf: - path_to_normal_file = path_to_file + '_notif_size_colored.png' + path_to_normal_file = path_to_file + '_notif_size_colored' + extension pixbuf.save(path_to_normal_file, 'png') # Generate and save the resized, black and white avatar bwbuf = gtkgui_helpers.get_scaled_pixbuf( gtkgui_helpers.make_pixbuf_grayscale(pixbuf), 'notification') if bwbuf: - path_to_bw_file = path_to_file + '_notif_size_bw.png' + path_to_bw_file = path_to_file + '_notif_size_bw' + extension bwbuf.save(path_to_bw_file, 'png') - def remove_avatar_files(self, jid, puny_nick = None): + def remove_avatar_files(self, jid, puny_nick = None, local = False): '''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: path_to_file = os.path.join(path_to_file, puny_nick) - for ext in ('.jpeg', '.png', '_notif_size_colored.png', - '_notif_size_bw.png'): + for ext in ('.jpeg', '.png'): + if local: + ext = '_local' + ext path_to_original_file = path_to_file + ext - if os.path.isfile(path_to_original_file): - os.remove(path_to_original_file) + if os.path.isfile(path_to_file + ext): + os.remove(path_to_file + ext) + if os.path.isfile(path_to_file + '_notif_size_colored' + ext): + os.remove(path_to_file + '_notif_size_colored' + ext) + if os.path.isfile(path_to_file + '_notif_size_bw' + ext): + os.remove(path_to_file + '_notif_size_bw' + ext) def add_event(self, account, jid, type_, event_args): '''add an event to the gajim.events var''' @@ -1517,11 +1643,11 @@ class Interface: if no_queue: # We didn't have a queue: we change icons if not gajim.contacts.get_contact_with_highest_priority(account, jid): # add contact to roster ("Not In The Roster") if he is not - self.roster.add_to_not_in_the_roster(account, jid) + self.roster.add_to_not_in_the_roster(account, jid) self.roster.draw_contact(jid, account) # Show contact in roster (if he is invisible for example) and select line - path = self.roster.get_path(jid, account) + path = self.roster.get_path(jid, account) self.roster.show_and_select_path(path, jid, account) def remove_first_event(self, account, jid, type_ = None): @@ -1577,7 +1703,16 @@ class Interface: def handle_event_file_request(self, account, array): jid = array[0] if jid not in gajim.contacts.get_jid_list(account): - return + keyID = '' + attached_keys = gajim.config.get_per('accounts', account, + 'attached_gpg_keys').split() + if jid in attached_keys: + keyID = attached_keys[attached_keys.index(jid) + 1] + contact = gajim.contacts.create_contact(jid = jid, name = '', + groups = [_('Not in Roster')], show = 'not in roster', status = '', + sub = 'none', keyID = keyID) + gajim.contacts.add_contact(account, contact) + self.roster.add_contact_to_roster(contact.jid, account) file_props = array[1] contact = gajim.contacts.get_first_contact_from_jid(account, jid) @@ -1602,13 +1737,13 @@ class Interface: if time.time() - self.last_ftwindow_update > 0.5: # update ft window every 500ms self.last_ftwindow_update = time.time() - self.instances['file_transfers'].set_progress(file_props['type'], + self.instances['file_transfers'].set_progress(file_props['type'], file_props['sid'], file_props['received-len']) def handle_event_file_rcv_completed(self, account, file_props): ft = self.instances['file_transfers'] if file_props['error'] == 0: - ft.set_progress(file_props['type'], file_props['sid'], + ft.set_progress(file_props['type'], file_props['sid'], file_props['received-len']) else: ft.set_status(file_props['type'], file_props['sid'], 'stop') @@ -1638,7 +1773,7 @@ class Interface: msg_type = 'file-stopped' event_type = _('File Transfer Stopped') - if event_type == '': + if event_type == '': # FIXME: ugly workaround (this can happen Gajim sent, Gaim recvs) # this should never happen but it does. see process_result() in socks5.py # who calls this func (sth is really wrong unless this func is also registered @@ -1726,7 +1861,7 @@ class Interface: '''SIGNED_IN event is emitted when we sign in, so handle it''' # block signed in notifications for 30 seconds gajim.block_signed_in_notifications[account] = True - self.roster.actions_menu_needs_rebuild = True + self.roster.set_actions_menu_needs_rebuild() if self.sleeper.getState() != common.sleepy.STATE_UNKNOWN and \ gajim.connections[account].connected in (2, 3): # we go online or free for chat, so we activate auto status @@ -1759,6 +1894,173 @@ class Interface: atom_entry, = data AtomWindow.newAtomEntry(atom_entry) + def handle_event_failed_decrypt(self, account, data): + jid, tim = data + + ctrl = self.msg_win_mgr.get_control(jid, account) + if ctrl: + ctrl.print_conversation_line('Unable to decrypt message from %s\nIt may have been tampered with.' % (jid), 'status', '', tim) + else: + print 'failed decrypt, unable to find a control to notify you in.' + + def handle_session_negotiation(self, account, data): + jid, session, form = data + + if form.getField('accept') and not form['accept'] in ('1', 'true'): + session.cancelled_negotiation() + return + + # encrypted session states. these are described in stanza_session.py + + try: + # bob responds + if form.getType() == 'form' and 'security' in form.asDict(): + def continue_with_negotiation(*args): + if len(args): + self.dialog.destroy() + + # we don't support 3-message negotiation as the responder + if 'dhkeys' in form.asDict(): + session.fail_bad_negotiation('3 message negotiation not supported when responding', ('dhkeys',)) + return + + negotiated, not_acceptable, ask_user = session.verify_options_bob(form) + + if ask_user: + def accept_nondefault_options(widget): + self.dialog.destroy() + negotiated.update(ask_user) + session.respond_e2e_bob(form, negotiated, not_acceptable) + + def reject_nondefault_options(widget): + self.dialog.destroy() + for key in ask_user.keys(): + not_acceptable.append(key) + session.respond_e2e_bob(form, negotiated, not_acceptable) + + self.dialog = dialogs.YesNoDialog(_('Confirm these session options'), + _('''The remote client wants to negotiate an session with these features: + + %s + + Are these options acceptable?''') % (negotiation.describe_features(ask_user)), + on_response_yes = accept_nondefault_options, + on_response_no = reject_nondefault_options) + else: + session.respond_e2e_bob(form, negotiated, not_acceptable) + + def ignore_negotiation(widget): + self.dialog.destroy() + return + + continue_with_negotiation() + + return + + # alice accepts + elif session.status == 'requested-e2e' and form.getType() == 'submit': + negotiated, not_acceptable, ask_user = session.verify_options_alice(form) + + if session.sigmai: + def _cb(on_success): + negotiation.show_sas_dialog(session, jid, session.sas, on_success) + + session.check_identity = _cb + + if ask_user: + def accept_nondefault_options(widget): + dialog.destroy() + + negotiated.update(ask_user) + + try: + session.accept_e2e_alice(form, negotiated) + except exceptions.NegotiationError, details: + session.fail_bad_negotiation(details) + + def reject_nondefault_options(widget): + session.reject_negotiation() + dialog.destroy() + + dialog = dialogs.YesNoDialog(_('Confirm these session options'), + _('The remote client selected these options:\n\n%s\n\nContinue with the session?') % (negotiation.describe_features(ask_user)), + on_response_yes = accept_nondefault_options, + on_response_no = reject_nondefault_options) + else: + try: + session.accept_e2e_alice(form, negotiated) + except exceptions.NegotiationError, details: + session.fail_bad_negotiation(details) + + return + elif session.status == 'responded-e2e' and form.getType() == 'result': + + def _cb(on_success): + negotiation.show_sas_dialog(session, jid, session.sas, on_success) + + session.check_identity = _cb + + try: + session.accept_e2e_bob(form) + except exceptions.NegotiationError, details: + session.fail_bad_negotiation(details) + + return + elif session.status == 'identified-alice' and form.getType() == 'result': + def _cb(on_success): + negotiation.show_sas_dialog(session, jid, session.sas, on_success) + + session.check_identity = _cb + + try: + session.final_steps_alice(form) + except exceptions.NegotiationError, details: + session.fail_bad_negotiation(details) + + return + except exceptions.Cancelled: + # user cancelled the negotiation + + session.reject_negotiation() + + return + + if form.getField('terminate') and\ + form.getField('terminate').getValue() in ('1', 'true'): + was_encrypted = session.enable_encryption + ctrl = session.control + + session.acknowledge_termination() + gajim.connections[account].delete_session(str(jid), session.thread_id) + + if ctrl: + new_sess = gajim.connections[account].make_new_session(str(jid)) + ctrl.set_session(new_sess) + + if was_encrypted: + ctrl.print_esession_details() + + return + + # non-esession negotiation. this isn't very useful, but i'm keeping it around + # to test my test suite. + if form.getType() == 'form': + ctrl = gajim.interface.msg_win_mgr.get_control(str(jid), account) + if not ctrl: + resource = jid.getResource() + contact = gajim.contacts.get_contact(account, str(jid), resource) + if not contact: + connection = gajim.connections[account] + contact = gajim.contacts.create_contact(jid = jid.getStripped(), + resource = resource, show = connection.get_status()) + self.roster.new_chat(contact, account, resource = resource) + + ctrl = gajim.interface.msg_win_mgr.get_control(str(jid), account) + + ctrl.set_session(session) + + negotiation.FeatureNegotiationWindow(account, jid, session, form) + def handle_event_privacy_lists_received(self, account, data): # ('PRIVACY_LISTS_RECEIVED', account, list) if not self.instances.has_key(account): @@ -1790,7 +2092,7 @@ class Interface: # self.store.append([text_item]) # self.global_rules.append(rule) #else: - # self.global_rules_to_append.append(rule) + # self.global_rules_to_append.append(rule) if self.instances[account].has_key('blocked_contacts'): self.instances[account]['blocked_contacts'].\ privacy_list_received(rules) @@ -1812,7 +2114,7 @@ class Interface: def handle_event_zc_name_conflict(self, account, data): dlg = dialogs.InputDialog(_('Username Conflict'), - _('Please type a new username for your local account'), + _('Please type a new username for your local account'), is_modal = True) dlg.input_entry.set_text(data) response = dlg.get_response() @@ -1877,6 +2179,56 @@ class Interface: if self.instances[account].has_key('pep_services'): self.instances[account]['pep_services'].new_service(data[0], data[1]) + def handle_event_unique_room_id_supported(self, account, data): + '''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]) + + def handle_event_unique_room_id_unsupported(self, account, data): + # ('UNIQUE_ROOM_ID_UNSUPPORTED', server, instance) + instance = data[1] + instance.unique_room_id_error(data[0]) + + def handle_event_ssl_error(self, account, data): + # ('SSL_ERROR', account, (text, cert, sha1_fingerprint)) + server = gajim.config.get_per('accounts', account, 'hostname') + def on_ok(is_checked): + if is_checked: + f = open(gajim.MY_CACERTS, 'a') + f.write(server + '\n') + f.write(data[1] + '\n\n') + f.close() + gajim.config.set_per('accounts', account, 'ssl_fingerprint_sha1', + data[2]) + gajim.connections[account].ssl_certificate_accepted() + def on_cancel(): + gajim.connections[account].disconnect(on_purpose=True) + self.handle_event_status(account, 'offline') + pritext = _('Error verifying SSL certificate') + sectext = _('There was an error verifying the SSL certificate of your jabber server: %(error)s\nDo you still want to connect to this server?') % {'error': data[0]} + checktext = _('Add this certificate to the list of trusted certificates.\nSHA1 fingerprint of the certificate:\n%s') % data[2] + dialogs.ConfirmationDialogCheck(pritext, sectext, checktext, + on_response_ok=on_ok, on_response_cancel=on_cancel) + + def handle_event_fingerprint_error(self, account, data): + # ('FINGERPRINT_ERROR', account, (fingerprint,)) + def on_yes(widget): + dialog.destroy() + gajim.config.set_per('accounts', account, 'ssl_fingerprint_sha1', + data[0]) + gajim.connections[account].ssl_certificate_accepted() + def on_no(widget): + dialog.destroy() + gajim.connections[account].disconnect(on_purpose=True) + self.handle_event_status(account, 'offline') + pritext = _('SSL certificate error') + sectext = _('It seems SSL certificate has changed or your connection is ' + 'being hacked. Do you still want to connect and update the fingerprint' + 'of the certificate?') + dialog = dialogs.YesNoDialog(pritext, sectext, on_response_yes=on_yes, + on_response_no=on_no) + def read_sleepy(self): '''Check idle status and change that status if needed''' if not self.sleeper.poll(): @@ -1941,7 +2293,7 @@ class Interface: def hide_systray(self): self.systray_enabled = False self.systray.hide_icon() - + def image_is_ok(self, image): if not os.path.exists(image): return False @@ -1954,7 +2306,7 @@ class Interface: if t != gtk.IMAGE_PIXBUF and t != gtk.IMAGE_ANIMATION: return False return True - + def make_regexps(self): # regexp meta characters are: . ^ $ * + ? { } [ ] \ | ( ) # one escapes the metachars with \ @@ -1983,10 +2335,10 @@ class Interface: r'ftp://', r'ed2k://', r'irc://', r'magnet:', r'sip:', r'www\.', r'ftp\.')) # NOTE: it's ok to catch www.gr such stuff exist! - + #FIXME: recognize xmpp: and treat it specially - - links = r'\b(%s)\S*[\w\/\=]|' % prefixes + + links = r"(www\.(?!\.)|[a-z][a-z0-9+.-]*://)[^\s<>'\"]+[^!,\.\s<>\)'\"\]]" #2nd one: at_least_one_char@at_least_one_char.at_least_one_char mail = r'\bmailto:\S*[^\s\W]|' r'\b\S+@\S+\.\S*[^\s\W]' @@ -1996,17 +2348,17 @@ class Interface: r'(?= (2, 10, 0) and gtk.gtk_version >= (2, 10, 0): gtk.link_button_set_uri_hook(self.on_launch_browser_mailer, 'url') - - self.instances = {'logs': {}} - + + self.instances = {} + for a in gajim.connections: self.instances[a] = {'infos': {}, 'disco': {}, 'gc_config': {}, 'search': {}} @@ -2429,7 +2793,7 @@ class Interface: gajim.transport_avatar[a] = {} self.roster = roster_window.RosterWindow() - + if gajim.config.get('remote_control'): try: import remote_control @@ -2465,9 +2829,12 @@ class Interface: auto=True) gajim.sleeper_state[account] = 'autoaway' - bus = dbus.SessionBus() - bus.add_signal_receiver(gnome_screensaver_ActiveChanged_cb, - 'ActiveChanged', 'org.gnome.ScreenSaver') + try: + bus = dbus.SessionBus() + bus.add_signal_receiver(gnome_screensaver_ActiveChanged_cb, + 'ActiveChanged', 'org.gnome.ScreenSaver') + except: + pass self.show_vcard_when_connect = [] @@ -2482,11 +2849,12 @@ class Interface: self.systray_enabled = False self.systray_capabilities = False - - if os.name == 'nt' and gtk.pygtk_version >= (2, 10, 0) and\ - gtk.gtk_version >= (2, 10, 0): - import statusicon - self.systray = statusicon.StatusIcon() + + if (((os.name == 'nt') or (sys.platform == 'darwin')) and + (gtk.pygtk_version >= (2, 10, 0)) and + (gtk.gtk_version >= (2, 10, 0))): + 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 @@ -2501,7 +2869,7 @@ class Interface: self.init_emoticons() self.make_regexps() - + # get instances for windows/dialogs that will show_all()/hide() self.instances['file_transfers'] = dialogs.FileTransfersWindow() @@ -2538,7 +2906,7 @@ if __name__ == '__main__': print >> sys.stderr, "Encodings: d:%s, fs:%s, p:%s" % \ (sys.getdefaultencoding(), sys.getfilesystemencoding(), locale.getpreferredencoding()) - if os.name != 'nt': + if ((os.name != 'nt') and (sys.platform != 'darwin')): # Session Management support try: import gnome.ui @@ -2550,10 +2918,10 @@ if __name__ == '__main__': gnome.program_init('gajim', gajim.version) cli = gnome.ui.master_client() cli.connect('die', die_cb) - + path_to_gajim_script = gtkgui_helpers.get_abspath_for_script( 'gajim') - + if path_to_gajim_script: argv = [path_to_gajim_script] # FIXME: remove this typeerror catch when gnome python is old and @@ -2563,8 +2931,12 @@ if __name__ == '__main__': cli.set_restart_command(argv) except AttributeError: cli.set_restart_command(len(argv), argv) - + check_paths.check_and_possibly_create_paths() + if sys.platform == 'darwin': + import osx + osx.init() + Interface() gtk.main() diff --git a/src/gajim_themes_window.py b/src/gajim_themes_window.py index 3454ee79f..eea5fb651 100644 --- a/src/gajim_themes_window.py +++ b/src/gajim_themes_window.py @@ -1,28 +1,34 @@ ## gajim_themes_window.py ## ## Contributors for this file: -## - Yann Le Boulanger +## - Yann Leboulanger ## - Nikos Kouremenos ## - Dimitur Kirov ## -## Copyright (C) 2003-2004 Yann Le Boulanger +## Copyright (C) 2003-2004 Yann Leboulanger ## Vincent Hanquez -## Copyright (C) 2005 Yann Le Boulanger +## Copyright (C) 2005 Yann Leboulanger ## Vincent Hanquez ## Nikos Kouremenos ## Dimitur Kirov ## Travis Shirk ## Norman Rasmussen +## Copyright (C) 2007 Stephan Erb ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 pango diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 1315f1442..1d975cf9c 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -1,8 +1,8 @@ ## groupchat_control.py ## -## Copyright (C) 2003-2004 Yann Le Boulanger +## Copyright (C) 2003-2004 Yann Leboulanger ## Vincent Hanquez -## Copyright (C) 2005 Yann Le Boulanger +## Copyright (C) 2005 Yann Leboulanger ## Vincent Hanquez ## Dimitur Kirov ## Travis Shirk @@ -10,17 +10,23 @@ ## Copyright (C) 2006 Travis Shirk ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2007 Julien Pivotto -## Copyright (C) 2007 Lukas Petrovicky +## Lukas Petrovicky +## Stephan Erb ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 os import time @@ -41,7 +47,7 @@ from common import helpers from chat_control import ChatControl from chat_control import ChatControlBase from conversation_textview import ConversationTextview -from common.exceptions import GajimGeneralException +from common.exceptions import GajimGeneralException #(status_image, type, nick, shown_nick) ( @@ -105,14 +111,14 @@ def tree_cell_data_func(column, renderer, model, iter, tv=None): class PrivateChatControl(ChatControl): TYPE_ID = message_control.TYPE_PM - def __init__(self, parent_win, gc_contact, contact, account): + def __init__(self, parent_win, gc_contact, contact, account, session): room_jid = contact.jid.split('/')[0] room_ctrl = gajim.interface.msg_win_mgr.get_control(room_jid, account) if gajim.interface.minimized_controls[account].has_key(room_jid): room_ctrl = gajim.interface.minimized_controls[account][room_jid] self.room_name = room_ctrl.name self.gc_contact = gc_contact - ChatControl.__init__(self, parent_win, contact, account) + ChatControl.__init__(self, parent_win, contact, account, session) self.TYPE_ID = 'pm' def send_message(self, message): @@ -153,10 +159,13 @@ class GroupchatControl(ChatControlBase): 'help', 'invite', 'join', 'kick', 'leave', 'me', 'msg', 'nick', 'part', 'names', 'say', 'topic'] - def __init__(self, parent_win, contact, acct): + def __init__(self, parent_win, contact, acct, is_continued=False): ChatControlBase.__init__(self, self.TYPE_ID, parent_win, 'muc_child_vbox', contact, acct); + self.is_continued=is_continued + self.is_anonymous = True + widget = self.xml.get_widget('muc_window_actions_button') id = widget.connect('clicked', self.on_actions_button_clicked) self.handlers[id] = widget @@ -190,7 +199,8 @@ class GroupchatControl(ChatControlBase): self.handlers[id] = widget self.room_jid = self.contact.jid - self.nick = contact.name + self.nick = contact.name.decode('utf-8') + self.new_nick = '' self.name = self.room_jid.split('@')[0] compact_view = gajim.config.get('compact_view') @@ -221,10 +231,10 @@ class GroupchatControl(ChatControlBase): # connect the menuitems to their respective functions xm = gtkgui_helpers.get_glade('gc_control_popup_menu.glade') - widget = xm.get_widget('bookmark_room_menuitem') - id = widget.connect('activate', + self.bookmark_room_menuitem = xm.get_widget('bookmark_room_menuitem') + id = self.bookmark_room_menuitem.connect('activate', self._on_bookmark_room_menuitem_activate) - self.handlers[id] = widget + self.handlers[id] = self.bookmark_room_menuitem self.change_nick_menuitem = xm.get_widget('change_nick_menuitem') id = self.change_nick_menuitem.connect('activate', @@ -246,9 +256,10 @@ class GroupchatControl(ChatControlBase): self._on_change_subject_menuitem_activate) self.handlers[id] = self.change_subject_menuitem - widget = xm.get_widget('history_menuitem') - id = widget.connect('activate', self._on_history_menuitem_activate) - self.handlers[id] = widget + self.history_menuitem = xm.get_widget('history_menuitem') + id = self.history_menuitem.connect('activate', + self._on_history_menuitem_activate) + self.handlers[id] = self.history_menuitem self.minimize_menuitem = xm.get_widget('minimize_menuitem') id = self.minimize_menuitem.connect('toggled', @@ -477,23 +488,55 @@ class GroupchatControl(ChatControlBase): 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() - text = '%s' % (font_attrs, self.room_jid) + if self.is_continued: + nicks = [] + for nick in gajim.contacts.get_nick_list(self.account, self.room_jid): + if nick != self.nick: + nicks.append(nick) + if nicks != []: + title = ', ' + title = 'Conversation with ' + title.join(nicks) + else: + title = 'Continued conversation' + text = '%s' % (font_attrs, title) + else: + text = '%s' % (font_attrs, self.room_jid) + self.name_label.set_markup(text) + if self.subject: subject = helpers.reduce_chars_newlines(self.subject, max_lines = 2) subject = gobject.markup_escape_text(subject) - text += '\n%s' % (font_attrs_small, subject) + if gajim.HAVE_PYSEXY: + subject_text = self.urlfinder.sub(self.make_href, subject) + subject_text = '%s' % (font_attrs_small, + subject_text) + else: + subject_text = '%s' % (font_attrs_small, subject) # tooltip must always hold ALL the subject self.subject_tooltip.set_tip(self.event_box, self.subject) + self.banner_status_label.show() + self.banner_status_label.set_no_show_all(False) + else: + subject_text = '' + self.subject_tooltip.disable() + self.banner_status_label.hide() + self.banner_status_label.set_no_show_all(True) - self.name_label.set_markup(text) + self.banner_status_label.set_markup(subject_text) def prepare_context_menu(self): '''sets sensitivity state for configure_room''' + ag = gtk.accel_groups_from_object(self.parent_win.window)[0] + self.history_menuitem.add_accelerator('activate', ag, gtk.keysyms.h, + gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) if self.contact.jid in gajim.config.get_per('accounts', self.account, 'minimized_gc').split(' '): self.minimize_menuitem.set_active(True) + if not gajim.connections[self.account].private_storage_supported: + self.bookmark_room_menuitem.set_sensitive(False) if gajim.gc_connected[self.account][self.room_jid]: c = gajim.contacts.get_gc_contact(self.account, self.room_jid, self.nick) @@ -515,7 +558,11 @@ class GroupchatControl(ChatControlBase): self.change_nick_menuitem.set_sensitive(False) return self.gc_popup_menu - def on_message(self, nick, msg, tim, has_timestamp = False, xhtml = None): + def on_message(self, nick, msg, tim, has_timestamp = False, xhtml = None, + status_code = []): + if '100' in status_code: + # Room is not anonymous + self.is_anonymous = False if not nick: # message from server self.print_conversation(msg, tim = tim, xhtml = xhtml) @@ -528,7 +575,7 @@ class GroupchatControl(ChatControlBase): else: self.print_conversation(msg, nick, tim, xhtml) - def on_private_message(self, nick, msg, tim, xhtml, msg_id = None): + def on_private_message(self, nick, msg, tim, xhtml, session, msg_id = None): # Do we have a queue? fjid = self.room_jid + '/' + nick no_queue = len(gajim.events.get_events(self.account, fjid)) == 0 @@ -540,7 +587,7 @@ class GroupchatControl(ChatControlBase): return event = gajim.events.create_event('pm', (msg, '', 'incoming', tim, - False, '', msg_id, xhtml)) + False, '', msg_id, xhtml, session)) gajim.events.add_event(self.account, fjid, event) autopopup = gajim.config.get('autopopup') @@ -560,7 +607,7 @@ class GroupchatControl(ChatControlBase): self.parent_win.show_title() self.parent_win.redraw_tab(self) else: - self._start_private_message(nick) + self._start_private_message(nick, session) # Scroll to line self.list_treeview.expand_row(path[0:1], False) self.list_treeview.scroll_to_cell(path) @@ -825,8 +872,20 @@ class GroupchatControl(ChatControlBase): def on_send_file(self, widget, gc_contact): '''sends a file to a contact in the room''' - gajim.interface.instances['file_transfers'].show_file_send_request( - self.account, gc_contact) + def _on_send_files(gc_c): + gajim.interface.instances['file_transfers'].show_file_send_request( + self.account, gc_c) + self_contact = gajim.contacts.get_gc_contact(self.account, self.room_jid, + self.nick) + if self.is_anonymous and gc_contact.affiliation not in ['admin', 'owner']\ + and self_contact.affiliation in ['admin', 'owner']: + prim_text = _('Really send file?') + sec_text = _('If you send a file to %s, he/she will know your real Jabber ID.') % gc_contact.name + dialog = dialogs.NonModalConfirmationDialog(prim_text, sec_text, + on_response_ok = (_on_send_files, gc_contact)) + dialog.popup() + else: + _on_send_files(gc_contact) def draw_contact(self, nick, selected=False, focus=False): iter = self.get_contact_iter(nick) @@ -928,7 +987,9 @@ class GroupchatControl(ChatControlBase): 'reason': reason } self.print_conversation(s, 'info', tim = tim) elif '303' in statusCode: # Someone changed his or her nick - if new_nick == self.nick: # We changed our nick + if new_nick == self.new_nick: # We changed our nick + self.nick = self.new_nick + self.new_nick = '' s = _('You are now known as %s') % new_nick else: s = _('%s is now known as %s') % (nick, new_nick) @@ -942,7 +1003,8 @@ class GroupchatControl(ChatControlBase): self.attention_list.remove(nick) # keep nickname color if nick in self.gc_custom_colors: - self.gc_custom_colors[new_nick] = self.gc_custom_colors[nick] + self.gc_custom_colors[new_nick] = \ + self.gc_custom_colors[nick] # rename vcard / avatar puny_jid = helpers.sanitize_filename(self.room_jid) puny_nick = helpers.sanitize_filename(nick) @@ -957,7 +1019,7 @@ class GroupchatControl(ChatControlBase): files[os.path.join(path, puny_nick + ext)] = \ os.path.join(path, puny_new_nick + ext) for old_file in files: - if os.path.exists(old_file): + if os.path.exists(old_file) and old_file != files[old_file]: if os.path.exists(files[old_file]): # Windows require this os.remove(files[old_file]) @@ -1133,6 +1195,8 @@ class GroupchatControl(ChatControlBase): if nick == self.nick: # we became online self.got_connected() self.list_treeview.expand_row((model.get_path(role_iter)), False) + if self.is_continued: + self.draw_banner_text() return iter def get_role_iter(self, role): @@ -1186,9 +1250,15 @@ class GroupchatControl(ChatControlBase): # example: /nick foo if len(message_array) and message_array[0] != self.nick: nick = message_array[0] - nick = helpers.parse_resource(nick) + try: + nick = helpers.parse_resource(nick) + except: + # Invalid Nickname + dialogs.ErrorDialog(_('Invalid nickname'), + _('The nickname has not allowed characters.')) + return True gajim.connections[self.account].join_gc(nick, self.room_jid, None) - self.nick = nick + self.new_nick = nick self.clear(self.msg_textview) else: self.get_command_help(command) @@ -1251,19 +1321,13 @@ class GroupchatControl(ChatControlBase): if len(message_array): message_array = message_array[0].split() invitee = message_array.pop(0) - if invitee.find('@') >= 0: - reason = ' '.join(message_array) - gajim.connections[self.account].send_invite(self.room_jid, - invitee, reason) - s = _('Invited %(contact_jid)s to %(room_jid)s.') % { - 'contact_jid': invitee, - 'room_jid': self.room_jid} - self.print_conversation(s, 'info') - self.clear(self.msg_textview) - else: - #%s is something the user wrote but it is not a jid so we inform - s = _('%s does not appear to be a valid JID') % invitee - self.print_conversation(s, 'info') + reason = ' '.join(message_array) + gajim.connections[self.account].send_invite(self.room_jid, invitee, reason) + s = _('Invited %(contact_jid)s to %(room_jid)s.') % { + 'contact_jid': invitee, + 'room_jid': self.room_jid} + self.print_conversation(s, 'info') + self.clear(self.msg_textview) else: self.get_command_help(command) return True @@ -1271,29 +1335,26 @@ class GroupchatControl(ChatControlBase): # example: /join room@conference.example.com/nick if len(message_array): room_jid = message_array[0] - if room_jid.find('@') >= 0: - if room_jid.find('/') >= 0: - room_jid, nick = room_jid.split('/', 1) - else: - nick = '' - # join_gc window is needed in order to provide for password entry. - if gajim.interface.instances[self.account].has_key('join_gc'): - gajim.interface.instances[self.account]['join_gc'].\ - window.present() - else: - try: - gajim.interface.instances[self.account]['join_gc'] =\ - dialogs.JoinGroupchatWindow(self.account, - room_jid = room_jid, nick = nick) - except GajimGeneralException: - pass - self.clear(self.msg_textview) - else: - #%s is something the user wrote but it is not a jid so we inform - s = _('%s does not appear to be a valid JID') % message_array[0] - self.print_conversation(s, 'info') + if room_jid.find('@') < 0: + room_jid = room_jid + '@' + gajim.get_server_from_jid(self.room_jid) else: - self.get_command_help(command) + room_jid = '@' + gajim.get_server_from_jid(self.room_jid) + if room_jid.find('/') >= 0: + room_jid, nick = room_jid.split('/', 1) + else: + nick = '' + # join_gc window is needed in order to provide for password entry. + if gajim.interface.instances[self.account].has_key('join_gc'): + gajim.interface.instances[self.account]['join_gc'].\ + window.present() + else: + try: + gajim.interface.instances[self.account]['join_gc'] =\ + dialogs.JoinGroupchatWindow(self.account, + room_jid = room_jid, nick = nick) + except GajimGeneralException: + pass + self.clear(self.msg_textview) return True elif command == 'leave' or command == 'part' or command == 'close': # Leave the room and close the tab or window @@ -1468,11 +1529,26 @@ class GroupchatControl(ChatControlBase): '''asks user for new nick and on ok it sets it on room''' def on_ok(widget): nick = instance.input_entry.get_text().decode('utf-8') - nick = helpers.parse_resource(nick) + try: + nick = helpers.parse_resource(nick) + except: + # invalid char + dialogs.ErrorDialog(_('Invalid nickname'), + _('The nickname has not allowed characters.')) + return gajim.connections[self.account].join_gc(nick, self.room_jid, None) - self.nick = nick + if gajim.gc_connected[self.account][self.room_jid]: + # We are changing nick, we will change self.nick when we receive + # presence that inform that it works + self.new_nick = nick + else: + # We are connecting, we will not get a changed nick presence so + # change it NOW. We don't already have a nick so it's harmless + self.nick = nick + def on_cancel(): + self.new_nick = '' instance = dialogs.InputDialog(title, prompt, proposed_nick, - is_modal = False, ok_handler = on_ok) + is_modal = False, ok_handler = on_ok, cancel_handler = on_cancel) def minimize(self, status='offline'): # Minimize it @@ -1496,6 +1572,8 @@ class GroupchatControl(ChatControlBase): self.contact.jid, status = self.subject) def shutdown(self, status='offline'): + # destroy banner tooltip - bug #pygtk for that! + self.subject_tooltip.destroy() gajim.connections[self.account].send_gc_status(self.nick, self.room_jid, show='offline', status=status) nick_list = gajim.contacts.get_nick_list(self.account, self.room_jid) @@ -1554,8 +1632,6 @@ class GroupchatControl(ChatControlBase): if dialog.is_checked(): # user does not want to be asked again gajim.config.set('confirm_close_muc', False) - dialog.destroy() - return retval def set_control_active(self, state): @@ -1614,18 +1690,19 @@ class GroupchatControl(ChatControlBase): if response == gtk.RESPONSE_OK: reason = instance.input_entry1.get_text().decode('utf-8') jid = instance.input_entry2.get_text().decode('utf-8') - # Test jid - try: - jid = helpers.parse_jid(jid) - except: - dialogs.ErrorDialog(_('Invalid group chat Jabber ID'), - _('The group chat Jabber ID has not allowed characters.')) - return + if jid: + # Test jid + try: + jid = helpers.parse_jid(jid) + except: + dialogs.ErrorDialog(_('Invalid group chat Jabber ID'), + _('The group chat Jabber ID has not allowed characters.')) + return else: # Abord destroy operation return gajim.connections[self.account].destroy_gc_room(self.room_jid, reason, - jid) + jid) def _on_bookmark_room_menuitem_activate(self, widget): bm = { @@ -1647,7 +1724,7 @@ class GroupchatControl(ChatControlBase): gajim.connections[self.account].bookmarks.append(bm) gajim.connections[self.account].store_bookmarks() - gajim.interface.roster.actions_menu_needs_rebuild = True + gajim.interface.roster.set_actions_menu_needs_rebuild() dialogs.InformationDialog( _('Bookmark has been added successfully'), @@ -1924,7 +2001,7 @@ class GroupchatControl(ChatControlBase): menu.show_all() menu.popup(None, None, None, event.button, event.time) - def _start_private_message(self, nick): + def _start_private_message(self, nick, session = None): gc_c = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick) nick_jid = gc_c.get_full_jid() diff --git a/src/gtkexcepthook.py b/src/gtkexcepthook.py index 7e398979d..34a1bd418 100644 --- a/src/gtkexcepthook.py +++ b/src/gtkexcepthook.py @@ -1,19 +1,24 @@ ## gtkexcepthook.py ## -## Copyright (C) 2005-2006 Yann Le Boulanger +## Copyright (C) 2005-2006 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## ## Initially written and submitted by Gustavo J. A. M. Carneiro ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 sys import os diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index 3622adc8e..c69716460 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -1,21 +1,27 @@ ## gtkgui_helpers.py ## -## Copyright (C) 2003-2006 Yann Le Boulanger +## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2004-2005 Vincent Hanquez ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005 Dimitur Kirov -## Copyright (C) 2005 Travis Shirk -## Copyright (C) 2005 Norman Rasmussen +## Travis Shirk +## Norman Rasmussen +## Copyright (C) 2007 Stephan Erb ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 xml.sax.saxutils import gtk @@ -121,7 +127,7 @@ def get_theme_font_for_option(theme, option): def get_default_font(): '''Get the desktop setting for application font - first check for GNOME, then XFCE and last KDE + first check for GNOME, then Xfce and last KDE it returns None on failure or else a string 'Font Size' ''' try: @@ -180,6 +186,8 @@ def autodetect_browser_mailer(): gajim.config.set('openwith', 'kfmclient exec') elif user_runs_xfce(): gajim.config.set('openwith', 'exo-open') + elif user_runs_osx(): + gajim.config.set('openwith', 'open') else: gajim.config.set('openwith', 'custom') @@ -195,6 +203,9 @@ def user_runs_xfce(): return True return False +def user_runs_osx(): + return sys.platform == 'darwin' + def get_running_processes(): '''returns running processes or None (if not /proc exists)''' if os.path.isdir('/proc'): @@ -605,7 +616,7 @@ def get_path_to_generic_or_avatar(generic, jid = None, suffix = None): path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + suffix filepath, extension = os.path.splitext(path_to_file) path_to_local_file = filepath + '_local' + extension - if os.path.exists(path_to_local_file): + if os.path.exists(path_to_local_file): return path_to_local_file if os.path.exists(path_to_file): return path_to_file @@ -643,12 +654,10 @@ def possibly_set_gajim_as_xmpp_handler(): else: path_to_kde_file = None - def set_gajim_as_xmpp_handler(widget = None): - if widget: + def set_gajim_as_xmpp_handler(is_checked=None): + if is_checked != None: # come from confirmation dialog - gajim.config.set('check_if_gajim_is_default', - dlg.checkbutton.get_active()) - dlg.destroy() + gajim.config.set('check_if_gajim_is_default', is_checked) path_to_gajim_script, typ = get_abspath_for_script('gajim-remote', True) if path_to_gajim_script: if typ == 'svn': @@ -711,10 +720,9 @@ Description=xmpp sectext = _('Would you like to make Gajim the default Jabber client?') checktext = _('Always check to see if Gajim is the default Jabber client ' 'on startup') - def on_cancel(widget): + def on_cancel(): gajim.config.set('check_if_gajim_is_default', - dlg.checkbutton.get_active()) - dlg.destroy() + dlg.is_checked()) dlg = dialogs.ConfirmationDialogCheck(pritext, sectext, checktext, set_gajim_as_xmpp_handler, on_cancel) if gajim.config.get('check_if_gajim_is_default'): @@ -752,9 +760,8 @@ def destroy_widget(widget): def on_avatar_save_as_menuitem_activate(widget, jid, account, default_name = ''): def on_ok(widget): - def on_ok2(widget, file_path, pixbuf): + def on_ok2(file_path, pixbuf): pixbuf.save(file_path, 'jpeg') - dialog2.destroy() dialog.destroy() file_path = dialog.get_filename() @@ -808,7 +815,7 @@ default_name = ''): if os.path.exists(file_path): os.remove(file_path) new_file_path = '.'.join(file_path.split('.')[:-1]) + '.jpeg' - dialog2 = dialogs.ConfirmationDialog(_('Extension not supported'), + dialogs.ConfirmationDialog(_('Extension not supported'), _('Image cannot be saved in %(type)s format. Save as %(new_filename)s?') % {'type': type_, 'new_filename': new_file_path}, on_response_ok = (on_ok2, new_file_path, pixbuf)) else: diff --git a/src/history_manager.py b/src/history_manager.py index 569d0e8bd..3ba50a8cb 100755 --- a/src/history_manager.py +++ b/src/history_manager.py @@ -3,22 +3,44 @@ ## ## Copyright (C) 2006-2007 Nikos Kouremenos ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## ## NOTE: some method names may match those of logger.py but that's it ## someday (TM) should have common class that abstracts db connections and helpers on it ## the same can be said for history_window.py -import sys import os + +if os.name == 'nt': + import warnings + warnings.filterwarnings(action='ignore') + +# Used to create windows installer with GTK included +# paths = os.environ['PATH'] +# list_ = paths.split(';') +# new_list = [] +# for p in list_: +# if p.find('gtk') < 0 and p.find('GTK') < 0: +# new_list.append(p) +# new_list.insert(0, 'gtk/lib') +# new_list.insert(0, 'gtk/bin') +# os.environ['PATH'] = ';'.join(new_list) +# os.environ['GTK_BASEPATH'] = 'gtk' + +import sys import signal import gtk import gobject @@ -26,7 +48,10 @@ import time import locale from common import i18n -import exceptions +import common.configpaths +common.configpaths.gajimpaths.init() +common.configpaths.gajimpaths.init_profile() +from common import exceptions import dialogs import gtkgui_helpers from common.logger import LOG_DB_PATH, constants @@ -75,7 +100,7 @@ class HistoryManager: self.logs_scrolledwindow = xml.get_widget('logs_scrolledwindow') self.search_results_scrolledwindow = xml.get_widget( 'search_results_scrolledwindow') - self.welcome_label = xml.get_widget('welcome_label') + self.welcome_vbox = xml.get_widget('welcome_vbox') self.jids_already_in = [] # holds jids that we already have in DB self.AT_LEAST_ONE_DELETION_DONE = False @@ -211,7 +236,7 @@ class HistoryManager: self.logs_liststore.clear() # clear the store - self.welcome_label.hide() + self.welcome_vbox.hide() self.search_results_scrolledwindow.hide() self.logs_scrolledwindow.show() @@ -478,9 +503,8 @@ class HistoryManager: if paths_len == 0: # nothing is selected return - def on_ok(widget, liststore, list_of_paths): + def on_ok(liststore, list_of_paths): # delete all rows from db that match jid_id - self.dialog.destroy() list_of_rowrefs = [] for path in list_of_paths: # make them treerowrefs (it's needed) list_of_rowrefs.append(gtk.TreeRowReference(liststore, path)) @@ -511,7 +535,7 @@ class HistoryManager: 'Do you really want to delete logs of the selected contact?', 'Do you really want to delete logs of the selected contacts?', paths_len) - self.dialog = dialogs.ConfirmationDialog(pri_text, + dialogs.ConfirmationDialog(pri_text, _('This is an irreversible operation.'), on_response_ok = (on_ok, liststore, list_of_paths)) @@ -520,8 +544,7 @@ class HistoryManager: if paths_len == 0: # nothing is selected return - def on_ok(widget, liststore, list_of_paths): - self.dialog.destroy() + def on_ok(liststore, list_of_paths): # delete rows from db that match log_line_id list_of_rowrefs = [] for path in list_of_paths: # make them treerowrefs (it's needed) @@ -547,7 +570,7 @@ class HistoryManager: pri_text = i18n.ngettext( 'Do you really want to delete the selected message?', 'Do you really want to delete the selected messages?', paths_len) - self.dialog = dialogs.ConfirmationDialog(pri_text, + dialogs.ConfirmationDialog(pri_text, _('This is an irreversible operation.'), on_response_ok = (on_ok, liststore, list_of_paths)) @@ -556,7 +579,7 @@ class HistoryManager: if text == '': return - self.welcome_label.hide() + self.welcome_vbox.hide() self.logs_scrolledwindow.hide() self.search_results_scrolledwindow.show() diff --git a/src/history_window.py b/src/history_window.py index 19af94b73..45d6f68c6 100644 --- a/src/history_window.py +++ b/src/history_window.py @@ -1,27 +1,33 @@ ## history_window.py ## ## Contributors for this file: -## - Yann Le Boulanger +## - Yann Leboulanger ## - Nikos Kouremenos ## -## Copyright (C) 2003-2004 Yann Le Boulanger +## Copyright (C) 2003-2004 Yann Leboulanger ## Vincent Hanquez -## Copyright (C) 2005 Yann Le Boulanger +## Copyright (C) 2005 Yann Leboulanger ## Vincent Hanquez ## Nikos Kouremenos ## Dimitur Kirov ## Travis Shirk ## Norman Rasmussen +## Copyright (C) 2007 Stephan Erb ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 @@ -40,23 +46,29 @@ constants = Constants() # contact_name, date, message, time ( +C_LOG_JID, C_CONTACT_NAME, C_UNIXTIME, C_MESSAGE, C_TIME -) = range(4) +) = range(5) class HistoryWindow: '''Class for browsing logs of conversations with contacts''' - def __init__(self, jid, account): - self.jid = jid + def __init__(self, jid = None, account = None): + if jid is None: + # Use self.jid to pass text to input_entry + self.jid = 'Enter jid or contact name here' + else: + self.jid = jid self.account = account + self.mark_days_idle_call_id = None xml = gtkgui_helpers.get_glade('history_window.glade') self.window = xml.get_widget('history_window') - + self.jid_entry = xml.get_widget('jid_entry') self.calendar = xml.get_widget('calendar') scrolledwindow = xml.get_widget('scrolledwindow') self.history_textview = conversation_textview.ConversationTextview( @@ -64,16 +76,39 @@ class HistoryWindow: scrolledwindow.add(self.history_textview.tv) self.history_buffer = self.history_textview.tv.get_buffer() self.history_buffer.create_tag('highlight', background = 'yellow') + self.checkbutton = xml.get_widget('log_history_checkbutton') + self.checkbutton.connect('toggled', self.on_log_history_checkbutton_toggled) self.query_entry = xml.get_widget('query_entry') - self.search_button = xml.get_widget('search_button') - query_builder_button = xml.get_widget('query_builder_button') - query_builder_button.hide() - query_builder_button.set_no_show_all(True) self.expander_vbox = xml.get_widget('expander_vbox') - + self.query_combobox = xml.get_widget('query_combobox') + self.query_combobox.set_active(0) self.results_treeview = xml.get_widget('results_treeview') + + # create jid dict for auto completion + self.completion_dict = {} + liststore = gtkgui_helpers.get_completion_liststore(self.jid_entry) + + # Add all jids in logs.db: + # he only info we have got to fill the dict is the JID, use it as key + db_jids = gajim.logger.get_jids_in_db() + for jid in db_jids: + self.completion_dict[jid] = None + + # Enhance contacts of online accounts with their contact reference and their name + for account in gajim.contacts.get_accounts(): + self.completion_dict.update(helpers.get_contact_dict_for_account(account)) + keys = self.completion_dict.keys() + keys.sort() + # Add icons + for jid in keys: + if gajim.logger.jid_is_room_jid(jid): + img = gajim.interface.roster.load_icon('muc_active') + else: + img = gajim.interface.roster.jabber_state_images['16']['online'] + liststore.append((img.get_pixbuf(), jid)) + # contact_name, date, message, time - model = gtk.ListStore(str, str, str, str) + model = gtk.ListStore(str, str, str, str, str) self.results_treeview.set_model(model) col = gtk.TreeViewColumn(_('Name')) self.results_treeview.append_column(col) @@ -98,43 +133,10 @@ class HistoryWindow: col.set_attributes(renderer, text = C_MESSAGE) col.set_resizable(True) - contact = gajim.contacts.get_first_contact_from_jid(account, jid) - if contact: - title = _('Conversation History with %s') % contact.get_shown_name() - else: - title = _('Conversation History with %s') % jid - self.window.set_title(title) + self.jid_entry.set_text(self.jid) xml.signal_autoconnect(self) - - # fake event so we start mark days procedure for selected month - # selected month is current month as calendar defaults to selecting - # current date - self.calendar.emit('month-changed') - - # select and show logs for last date we have logs with contact - # and if we don't have logs at all, default to today - result = gajim.logger.get_last_date_that_has_logs(self.jid, self.account) - if result is None: - date = time.localtime() - else: - tim = result - date = time.localtime(tim) - - y, m, d = date[0], date[1], date[2] - gtk_month = gtkgui_helpers.make_python_month_gtk_month(m) - self.calendar.select_month(gtk_month, y) - self.calendar.select_day(d) - self.add_lines_for_date(y, m, d) - - log = True - if self.jid in gajim.config.get_per('accounts', self.account, - 'no_log_for').split(' '): - log = False - checkbutton = xml.get_widget('log_history_checkbutton') - checkbutton.set_active(log) - checkbutton.connect('toggled', self.on_log_history_checkbutton_toggled) - + self.jid_entry.emit('activate') self.window.show_all() def on_history_window_destroy(self, widget): @@ -143,11 +145,85 @@ class HistoryWindow: # stop him! gobject.source_remove(self.mark_days_idle_call_id) self.history_textview.del_handlers() - del gajim.interface.instances['logs'][self.jid] + del gajim.interface.instances['logs'] + + def on_history_window_key_press_event(self, widget, event): + if event.keyval == gtk.keysyms.Escape: + self.window.destroy() def on_close_button_clicked(self, widget): self.window.destroy() + def on_jid_entry_activate(self, widget): + self.jid = self.jid_entry.get_text().decode('utf-8') + + if self.completion_dict.has_key(self.jid): # a full qualified jid or a contact name was entered + contact = self.completion_dict[self.jid] + if contact: # we have got additional info, jid enhanced with contact + self.jid = contact.jid + self.jid_entry.set_text(contact.get_shown_name()) + self.jids_to_search = [contact.jid] + else: + self.jids_to_search = [self.jid] + + # Try to find the corresponding account of the jid + accounts = gajim.contacts.get_accounts() + self.account = None + for account in accounts: + contact = gajim.contacts.get_first_contact_from_jid(account ,self.jid) + if contact: + self.account = account + break + if self.account is None: + # We do not know an account. This can only happen if the contact is offine, + # or if we browse a groupchat history. The account is not really needed, a dummy can + # be set. + # FIXME: This may leed to wrong self nick in the displayed history + self.account = gajim.contacts.get_accounts()[0] + self.checkbutton.set_sensitive(False) + else: + # The logging checkbutton, can only work if we have got an account. + log = True + if self.jid in gajim.config.get_per('accounts', self.account, + 'no_log_for').split(' '): + log = False + self.checkbutton.set_active(log) + self.checkbutton.set_sensitive(True) + + # select logs for last date we have logs with contact + self.calendar.set_sensitive(True) + self.calendar.emit('month-changed') + lastlog = gajim.logger.get_last_date_that_has_logs(self.jid, self.account) + + tim = lastlog + date = time.localtime(tim) + + y, m, d = date[0], date[1], date[2] + gtk_month = gtkgui_helpers.make_python_month_gtk_month(m) + self.calendar.select_month(gtk_month, y) + self.calendar.select_day(d) + + self.query_entry.set_sensitive(True) + + if contact: + title = _('Conversation History with %s') % contact.get_shown_name() + else: + title = _('Conversation History with %s') % self.jid + self.window.set_title(title) + + + else: # neither a valid jid, nor an existing contact name was entered + # we have got nothing to show or to search in + self.history_buffer.set_text('') # clear the buffer + self.query_entry.set_sensitive(False) + + self.checkbutton.set_sensitive(False) + self.calendar.set_sensitive(False) + self.calendar.clear_marks() + + title = _('Conversation History') + self.window.set_title(title) + def on_calendar_day_selected(self, widget): year, month, day = widget.get_date() # integers month = gtkgui_helpers.make_gtk_month_python_month(month) @@ -322,40 +398,75 @@ class HistoryWindow: gobject.timeout_add(200, self.set_unset_expand_on_expander, widget) else: gobject.timeout_add(200, self.set_unset_expand_on_expander, widget) - self.search_button.grab_default() self.query_entry.grab_focus() - def on_search_button_clicked(self, widget): + def on_query_entry_activate(self, widget): text = self.query_entry.get_text() model = self.results_treeview.get_model() model.clear() if text == '': return - # contact_name, time, kind, show, message, subject - results = gajim.logger.get_search_results_for_query( - self.jid, text, self.account) - #FIXME: - # add "subject: | message: " in message column if kind is single - # also do we need show at all? (we do not search on subject) - for row in results: - contact_name = row[0] - if not contact_name: - kind = row[2] - if kind == constants.KIND_CHAT_MSG_SENT: # it's us! :) - contact_name = gajim.nicks[self.account] - else: - contact = gajim.contacts.get_first_contact_from_jid(self.account, - self.jid) - if contact: - contact_name = contact.get_shown_name() + + # perform search in preselected jids. jids are preselected with the query_combobox (all, current...) + for jid in self.jids_to_search: + accounts = gajim.contacts.get_accounts() + account = None + for acc in accounts: + contact = gajim.contacts.get_first_contact_from_jid(acc ,jid) + if contact: + account = acc + break + if account is None: + # We do not know an account. This can only happen if the contact is offine, + # or if we browse a groupchat history. The account is not needed, a dummy can + # be set. + # FIXME: This may leed to wrong self nick in the displayed history + account = gajim.contacts.get_accounts()[0] + + # contact_name, time, kind, show, message, subject + results = gajim.logger.get_search_results_for_query( + jid, text, account) + #FIXME: + # add "subject: | message: " in message column if kind is single + # also do we need show at all? (we do not search on subject) + for row in results: + contact_name = row[0] + if not contact_name: + kind = row[2] + if kind == constants.KIND_CHAT_MSG_SENT: # it's us! :) + contact_name = gajim.nicks[account] else: - contact_name = self.jid - tim = row[1] - message = row[4] - local_time = time.localtime(tim) - date = time.strftime('%x', local_time) - # name, date, message, time (full unix time) - model.append((contact_name, date, message, tim)) + contact = self.completion_dict[jid] + if contact: + contact_name = contact.get_shown_name() + else: + contact_name = jid + tim = row[1] + message = row[4] + local_time = time.localtime(tim) + date = time.strftime('%x', local_time) + # jid (to which log is assigned to), name, date, message, time (full unix time) + model.append((jid, contact_name, date, message, tim)) + + def on_query_combobox_changed(self, widget): + self.jids_to_search = [] + if self.query_combobox.get_active() == 0: + # Search current contact + if self.completion_dict.has_key(self.jid): + self.query_entry.set_sensitive(True) + contact = self.completion_dict[self.jid] + if contact: + self.jids_to_search = [contact.jid] + else: + self.jids_to_search = [self.jid] + else: + # We cannot search in logs of an non-existing jid + self.query_entry.set_sensitive(False) + if self.query_combobox.get_active() == 1: + # Search all histories + self.query_entry.set_sensitive(True) + 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 @@ -370,7 +481,12 @@ class HistoryWindow: gtk_month = tim[1] month = gtkgui_helpers.make_python_month_gtk_month(gtk_month) day = tim[2] - + + # switch to belonging logfile if necessary + log_jid = model[path][C_LOG_JID] + if log_jid != self.jid: + self.open_history(log_jid, None) + # avoid reruning mark days algo if same month and year! if year != cur_year or gtk_month != cur_month: self.calendar.select_month(month, year) @@ -416,3 +532,8 @@ class HistoryWindow: gajim.config.set_per('accounts', self.account, 'no_log_for', ' '.join(no_log_for)) + def open_history(self, jid, account): + '''Simulate that the jid was entered by hand''' + self.jid_entry.set_text(jid) + self.jid_entry.emit('activate') + diff --git a/src/htmltextview.py b/src/htmltextview.py index 75fbccf0a..a274d7274 100644 --- a/src/htmltextview.py +++ b/src/htmltextview.py @@ -10,6 +10,9 @@ ### 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 General Public License +## along with Gajim. If not, see . ### ### You should have received a copy of the GNU Lesser General Public ### License along with this library; if not, write to the @@ -910,6 +913,7 @@ class HtmlTextView(gtk.TextView): self.set_wrap_mode(gtk.WRAP_CHAR) self.set_editable(False) self._changed_cursor = False + self.connect('destroy', self.__destroy_event) 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) @@ -920,6 +924,10 @@ class HtmlTextView(gtk.TextView): # end big hack build_patterns(self,gajim.config,gajim.interface) + def __destroy_event(self, widget): + if self.tooltip.timeout != 0: + self.tooltip.hide_tooltip() + def __leave_event(self, widget, event): if self._changed_cursor: window = widget.get_window(gtk.TEXT_WINDOW_TEXT) diff --git a/src/lastfm.py b/src/lastfm.py new file mode 100644 index 000000000..385407f13 --- /dev/null +++ b/src/lastfm.py @@ -0,0 +1,217 @@ +#!/bin/env python +""" +LastFM Python class +Copyright (C) 2007 Olivier Mehani + +$Id: lastfm.py 52 2007-11-03 23:19:00Z shtrom $ +Python class to handily retrieve song information from a Last.fm account. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +""" + +__version__ = '$Revision: 64 $' + +from urllib import urlopen +from xml.dom import minidom +from time import time, strftime + +class LastFM: + # Where to fetch the played song information + LASTFM_FORMAT_URL = \ + 'http://ws.audioscrobbler.com/1.0/user/%s/recenttracks.xml' + # Delay in seconds after which the last song entry is considered too old tox + # be displayed. + MAX_DELAY = 600 + + ARTIST = 0 + NAME = 1 + ALBUM = 2 + TIME = 3 + + def __init__(self, username, proxies=None): + """ + Create a new LastFM object. + + username, the Last.fm username + proxies, the list of proxies to use to connect to the Last.fm data, as + expected by urllib.urlopen() + """ + self.setUsername(username) + self._proxies = proxies + self.scrobbling = False + self.updateData() + + def __str__(self): + return 'Last.fm song tracker for user %s.%s' % (self._username, + self.formatSongTitle( + ' Last song was \"%(n)s\" by \"%(a)s\" in album \"%(b)s\".')) + + def getUsername(self): + return self._username + + def setUsername(self, username): + self._username = username + self.lastSongs = [] + + def updateData(self): + """ + Fetch the last recent tracks list and update the object accordingly. + + Return True if the last played time has changed, False otherwise. + """ + try: + xmldocument = urlopen(self.LASTFM_FORMAT_URL % self._username, + self._proxies) + xmltree = minidom.parse(xmldocument) + except: + print 'Error parsing XML from Last.fm...' + return False + + if xmltree.childNodes.length != 1: + raise Exception('XML document not formed as expected') + + recenttracks = xmltree.childNodes[0] + + tracklist = recenttracks.getElementsByTagName('track') + + # do not update if nothing more has been scrobbled since last time + if len(tracklist) > 0 and \ + int(tracklist[0].getElementsByTagName('date')[0]. + getAttribute('uts')) != self.getLastScrobbledTime(): + self.lastSongs = [] + for track in tracklist: + artistNode = track.getElementsByTagName('artist')[0] + if artistNode.firstChild: + artist = artistNode.firstChild.data + else: + artist = None + + nameNode = track.getElementsByTagName('name')[0] + if nameNode.firstChild: + name = nameNode.firstChild.data + else: + name = None + + albumNode = track.getElementsByTagName('album')[0] + if albumNode.firstChild: + album = albumNode.firstChild.data + else: + album = None + + timeNode = track.getElementsByTagName('date')[0] + self.lastSongs.append((artist, name, album, + int(timeNode.getAttribute('uts')))) + self.scrobbling = True + return True + + # if nothing has been scrobbled for too long, an update to the + # "currently" playing song should be made + if self.scrobbling and not self.lastSongIsRecent(): + self.scrobbling = False + return True + + return False + + def getLastSong(self): + """ + Return the last played song as a tuple of (ARTIST, SONG, ALBUM, TIME). + """ + if len(self.lastSongs) < 1: + return None + return self.lastSongs[0] + + def getLastScrobbledTime(self): + """ + Return the Unix time the last song was played. + """ + if len(self.lastSongs) < 1: + return 0 + return self.lastSongs[0][self.TIME] + + def timeSinceLastScrobbled(self, lst=None): + """ + Return the time in seconds since the last song has been scrobbled. + + lst, the Unix time at which a song has been scrobbled, defaults to that + of the last song + """ + if lst == None: + lst = self.getLastScrobbledTime() + return int(time()) - lst + + def lastSongIsRecent(self, delay=None): + """ + Return a boolean stating whether the last song has been played less + the specified delay earlier. + + delay, the delay to use, defaults to self.MAX_DELAY + """ + if delay == None: + delay = self.MAX_DELAY + return self.timeSinceLastScrobbled() < delay + + def getLastRecentSong(self, delay=None): + """ + Return the last *recently* played song. + + "Recently" means that the song has been played less than delay + earlier. + + delay, the delay to use, see lastSongIsRecent for the semantics + """ + self.updateData() + if self.lastSongIsRecent(delay): + return self.getLastSong() + return None + + def formatSongTitle(self, formatString='%(a)s - %(n)s', songTuple=None): + """ + Format a song tuple according to a format string. This makes use of the + basic Python string formatting operations. + + formatString, the string according to which the song should be formated: + "%(a)s" is replaced by the artist; + "%(n)s" is replaced by the name of the song; + "%(b)s" is replaced by the album; + defaults to "%s - %t". + songTuple, the tuple representing the song, defaults to the last song + """ + str = '' + if songTuple == None: + songTuple = self.getLastRecentSong() + + if songTuple != None: + dict = { + 'a': songTuple[0], + 'n': songTuple[1], + 'b': songTuple[2] + } + str = formatString % dict + + return str + +# Fallback if the script is called directly +if __name__ == '__main__': + from sys import argv + from time import sleep + if len(argv) != 2: + raise Exception('Incorrect number of arguments. Only the Last.fm username is required.') + + lfm = LastFM(argv[1]) + print lfm + while 1: + if lfm.updateData(): + print lfm.formatSongTitle() + sleep(60) diff --git a/src/lastfm_track_listener.py b/src/lastfm_track_listener.py new file mode 100644 index 000000000..fe3d28240 --- /dev/null +++ b/src/lastfm_track_listener.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +## lastfmtracklistener.py +## +## Copyright (C) 2007 Olivier Mehani +## Heavily based on music_track_listener.py: +## Copyright (C) 2006 Gustavo Carneiro +## Copyright (C) 2006 Nikos Kouremenos +## +## 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. +## +import gobject +from lastfm import LastFM + +class LastFMTrackInfo(object): + __slots__ = ['title', 'album', 'artist'] + + def __eq__(self, other): + if self.__class__ != other.__class__: + return False + return self.title == other.title and self.album == other.album and \ + self.artist == other.artist + + def __ne__(self, other): + return not self.__eq__(other) + +class LastFMTrackListener(gobject.GObject): + __gsignals__ = { + 'music-track-changed': (gobject.SIGNAL_RUN_LAST, None, (object,)), + } + + # polling period in milliseconds + INTERVAL = 60000 #LastFM.MAX_DELAY * 250 # 1/4 of LastFM's delay (in s) + + _instance = None + @classmethod + def get(cls, username): + if cls._instance is None: + cls._instance = cls(username) + else: + cls._instance._lfm.setUsername(username) + return cls._instance + + def __init__(self, username): + super(LastFMTrackListener, self).__init__() + self._lfm_user = username + self._lfm = LastFM(self._lfm_user) + self._last_playing_music = None + self._lastfm_music_track_change() + gobject.timeout_add(self.INTERVAL, self._lastfm_periodic_check) + + def _lastfm_properties_extract(self, song_tuple): + if song_tuple: + info = LastFMTrackInfo() + info.title = song_tuple[LastFM.NAME] + info.album = song_tuple[LastFM.ALBUM] + info.artist = song_tuple[LastFM.ARTIST] + return info + return None + + def _lastfm_periodic_check(self): + if self._lfm.updateData(): + self._lastfm_music_track_change() + return True + + def _lastfm_music_track_change(self): + info = self._lastfm_properties_extract( + self._lfm.getLastRecentSong()) + self._last_playing_music = info + self.emit('music-track-changed', info) + + def get_playing_track(self): + '''Return a LastFMTrackInfo for the currently playing + song, or None if no song is playing''' + return self._last_playing_music + +# here we test :) +if __name__ == '__main__': + from sys import argv + if len(argv) != 2: + raise Exception("Incorrect number of arguments. Only the Last.fm username is required.") + + def music_track_change_cb(listener, music_track_info): + if music_track_info is None: + print "Stop!" + else: + print 'Now playing: "%s" by %s' % ( + music_track_info.title, music_track_info.artist) + + listener = LastFMTrackListener.get(argv[1]) + listener.connect('music-track-changed', music_track_change_cb) + track = listener.get_playing_track() + if track is None: + print 'Now not playing anything' + else: + print 'Now playing: "%s" by %s' % (track.title, track.artist) + gobject.MainLoop().run() diff --git a/src/message_control.py b/src/message_control.py index 1bc2ac0dd..b6b584eb2 100644 --- a/src/message_control.py +++ b/src/message_control.py @@ -1,16 +1,22 @@ ## message_control.py ## ## Copyright (C) 2006 Travis Shirk +## Copyright (C) 2007 Stephan Erb ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 gtkgui_helpers from common import gajim @@ -110,14 +116,42 @@ class MessageControl: def get_specific_unread(self): return len(gajim.events.get_events(self.account, self.contact.jid)) + def set_session(self, session): + if hasattr(self, 'session') and session == self.session: + return + + was_encrypted = False + + if hasattr(self, 'session') and self.session: + if self.session.enable_encryption: + was_encrypted = True + + print "starting a new session, dropping the old one!" + gajim.connections[self.account].delete_session(self.session.jid, self.session.thread_id) + + self.session = session + + if session: + session.control = self + + if was_encrypted: + 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): '''Send the given message to the active tab. Doesn't return None if error ''' jid = self.contact.jid + + if not self.session: + fjid = self.contact.get_full_jid() + new_session = gajim.connections[self.account].make_new_session(fjid) + + self.set_session(new_session) + # Send and update history return gajim.connections[self.account].send_message(jid, message, keyID, type = type, chatstate = chatstate, msg_id = msg_id, composing_xep = composing_xep, resource = self.resource, - user_nick = user_nick) + user_nick = user_nick, session = self.session) diff --git a/src/message_textview.py b/src/message_textview.py index 1c76173a3..ba93e6cd5 100644 --- a/src/message_textview.py +++ b/src/message_textview.py @@ -1,27 +1,32 @@ ## message_textview.py ## ## Contributors for this file: -## - Yann Le Boulanger +## - Yann Leboulanger ## - Nikos Kouremenos ## -## Copyright (C) 2003-2004 Yann Le Boulanger +## Copyright (C) 2003-2004 Yann Leboulanger ## Vincent Hanquez -## Copyright (C) 2005 Yann Le Boulanger +## Copyright (C) 2005 Yann Leboulanger ## Vincent Hanquez ## Nikos Kouremenos ## Dimitur Kirov ## Travis Shirk ## Norman Rasmussen ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 diff --git a/src/message_window.py b/src/message_window.py index 65d25968c..c2ebe2769 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -1,25 +1,31 @@ ## message_window.py ## -## Copyright (C) 2003-2004 Yann Le Boulanger +## Copyright (C) 2003-2004 Yann Leboulanger ## Vincent Hanquez -## Copyright (C) 2005 Yann Le Boulanger +## Copyright (C) 2005 Yann Leboulanger ## Vincent Hanquez ## Nikos Kouremenos ## Dimitur Kirov ## Travis Shirk ## Norman Rasmussen ## Copyright (C) 2006 Travis Shirk -## Copyright (C) 2006 Geobert Quach +## Geobert Quach +## Copyright (C) 2007 Stephan Erb ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 @@ -69,6 +75,17 @@ class MessageWindow: id = self.window.connect('focus-in-event', self._on_window_focus) self.handlers[id] = self.window + keys=['h', 'i', 'Tab', + 'Tab', 'F4', 'w', + 'Right', 'Left', 'c', 'Escape'] +\ + [''+str(i) for i in xrange(10)] + accel_group = gtk.AccelGroup() + for key in keys: + keyval, mod = gtk.accelerator_parse(key) + accel_group.connect_group(keyval, mod, gtk.ACCEL_VISIBLE, + self.accel_group_func) + self.window.add_accel_group(accel_group) + # gtk+ doesn't make use of the motion notify on gtkwindow by default # so this line adds that self.window.add_events(gtk.gdk.POINTER_MOTION_MASK) @@ -240,6 +257,52 @@ class MessageWindow: elif event.keyval == gtk.keysyms.Page_Up: # CTRL + PAGE UP self.notebook.emit('key_press_event', event) + def accel_group_func(self, accel_group, acceleratable, keyval, modifier): + st = '1234567890' # alt+1 means the first tab (tab 0) + control = self.get_active_control() + if not control: + # No more control in this window + return + + # CTRL mask + if modifier & gtk.gdk.CONTROL_MASK: + if keyval == gtk.keysyms.h: + control._on_history_menuitem_activate() + elif control.type_id == message_control.TYPE_CHAT and \ + keyval == gtk.keysyms.i: + control._on_contact_information_menuitem_activate(None) + # Tab switch bindings + elif keyval == gtk.keysyms.ISO_Left_Tab: # CTRL + SHIFT + TAB + self.move_to_next_unread_tab(False) + elif keyval == gtk.keysyms.Tab: # CTRL + TAB + self.move_to_next_unread_tab(True) + elif keyval == gtk.keysyms.F4: # CTRL + F4 + self.remove_tab(control, self.CLOSE_CTRL_KEY) + elif keyval == gtk.keysyms.w: # CTRL + W + self.remove_tab(control, self.CLOSE_CTRL_KEY) + + # MOD1 (ALT) mask + elif modifier & gtk.gdk.MOD1_MASK: + # Tab switch bindings + if keyval == gtk.keysyms.Right: # ALT + RIGHT + new = self.notebook.get_current_page() + 1 + if new >= self.notebook.get_n_pages(): + new = 0 + self.notebook.set_current_page(new) + elif keyval == gtk.keysyms.Left: # ALT + LEFT + new = self.notebook.get_current_page() - 1 + if new < 0: + new = self.notebook.get_n_pages() - 1 + self.notebook.set_current_page(new) + elif chr(keyval) in st: # ALT + 1,2,3.. + self.notebook.set_current_page(st.index(chr(keyval))) + elif keyval == gtk.keysyms.c: # ALT + C toggles chat buttons + control.chat_buttons_set_visible(not control.hide_chat_buttons) + # Close tab bindings + elif keyval == gtk.keysyms.Escape and \ + gajim.config.get('escape_key_closes'): # Escape + self.remove_tab(control, self.CLOSE_ESC) + def _on_close_button_clicked(self, button, control): '''When close button is pressed: close a tab''' self.remove_tab(control, self.CLOSE_CLOSE_BUTTON) @@ -349,7 +412,6 @@ class MessageWindow: gajim.interface.msg_win_mgr._on_window_delete(self.window, None) gajim.interface.msg_win_mgr._on_window_destroy(self.window) # dnd clean up - self.notebook.disconnect(self.hid) self.notebook.drag_dest_unset() self.window.destroy() return # don't show_title, we are dead @@ -454,6 +516,20 @@ class MessageWindow: nth_child = notebook.get_nth_page(page_num) return self._widget_to_control(nth_child) + def change_key(self, old_jid, new_jid, acct): + '''Change the key of a control''' + try: + # Check if control exists + ctrl = self._controls[acct][old_jid] + except: + return + self._controls[acct][new_jid] = self._controls[acct][old_jid] + del self._controls[acct][old_jid] + if old_jid in gajim.last_message_time[acct]: + gajim.last_message_time[acct][new_jid] = \ + gajim.last_message_time[acct][old_jid] + del gajim.last_message_time[acct][old_jid] + def controls(self): for ctrl_dict in self._controls.values(): for ctrl in ctrl_dict.values(): @@ -520,49 +596,15 @@ class MessageWindow: self.show_title(control = new_ctrl) def _on_notebook_key_press(self, widget, event): - st = '1234567890' # alt+1 means the first tab (tab 0) - ctrl = self.get_active_control() - - # CTRL mask - if event.state & gtk.gdk.CONTROL_MASK: - # Tab switch bindings - if event.keyval == gtk.keysyms.ISO_Left_Tab: # CTRL + SHIFT + TAB - self.move_to_next_unread_tab(False) - elif event.keyval == gtk.keysyms.Tab: # CTRL + TAB - self.move_to_next_unread_tab(True) - elif event.keyval == gtk.keysyms.F4: # CTRL + F4 - self.remove_tab(ctrl, self.CLOSE_CTRL_KEY) - elif event.keyval == gtk.keysyms.w: # CTRL + W - self.remove_tab(ctrl, self.CLOSE_CTRL_KEY) - - # MOD1 (ALT) mask - elif event.state & gtk.gdk.MOD1_MASK: - # Tab switch bindings - if event.keyval == gtk.keysyms.Right: # ALT + RIGHT - new = self.notebook.get_current_page() + 1 - if new >= self.notebook.get_n_pages(): - new = 0 - self.notebook.set_current_page(new) - elif event.keyval == gtk.keysyms.Left: # ALT + LEFT - new = self.notebook.get_current_page() - 1 - if new < 0: - new = self.notebook.get_n_pages() - 1 - self.notebook.set_current_page(new) - elif event.string and event.string in st and \ - (event.state & gtk.gdk.MOD1_MASK): # ALT + 1,2,3.. - self.notebook.set_current_page(st.index(event.string)) - elif event.keyval == gtk.keysyms.c: # ALT + C toggles chat buttons - ctrl.chat_buttons_set_visible(not ctrl.hide_chat_buttons) - # Close tab bindings - elif event.keyval == gtk.keysyms.Escape and \ - gajim.config.get('escape_key_closes'): # Escape - self.remove_tab(ctrl, self.CLOSE_ESC) - else: - # If the active control has a message_textview pass the event to it - active_ctrl = self.get_active_control() - if isinstance(active_ctrl, ChatControlBase): - active_ctrl.msg_textview.emit('key_press_event', event) - active_ctrl.msg_textview.grab_focus() + control = self.get_active_control() + # Ctrl+PageUP / DOWN has to be handled by notebook + if event.state & gtk.gdk.CONTROL_MASK and event.keyval in ( + gtk.keysyms.Page_Down, gtk.keysyms.Page_Up): + return False + if isinstance(control, ChatControlBase): + # we forwarded it to message textview + control.msg_textview.emit('key_press_event', event) + control.msg_textview.grab_focus() def setup_tab_dnd(self, child): '''Set tab label as drag source and connect the drag_data_get signal''' @@ -781,6 +823,17 @@ class MessageWindowMgr: self._windows[key] = win return win + def change_key(self, old_jid, new_jid, acct): + win = self.get_window(old_jid, acct) + if self.mode == self.ONE_MSG_WINDOW_NEVER: + old_key = acct + old_jid + if old_jid not in self._windows: + return + new_key = acct + new_jid + self._windows[new_key] = self._windows[old_key] + del self._windows[old_key] + win.change_key(old_jid, new_jid, acct) + def _on_window_delete(self, win, event): self.save_state(self._gtk_win_to_msg_win(win)) gajim.interface.save_config() diff --git a/src/music_track_listener.py b/src/music_track_listener.py index 2b332ae5f..7a64ad4b6 100644 --- a/src/music_track_listener.py +++ b/src/music_track_listener.py @@ -4,15 +4,20 @@ ## Copyright (C) 2006 Gustavo Carneiro ## Copyright (C) 2006 Nikos Kouremenos ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 gobject if __name__ == '__main__': # install _() func before importing dbus_support @@ -46,6 +51,13 @@ class MusicTrackListener(gobject.GObject): bus = dbus.SessionBus() + ## MPRIS + bus.add_signal_receiver(self._mpris_music_track_change_cb, 'TrackChange', + 'org.freedesktop.MediaPlayer') + bus.add_signal_receiver(self._player_playing_changed_cb, 'StatusChange', + 'org.freedesktop.MediaPlayer') + + ## Muine bus.add_signal_receiver(self._muine_music_track_change_cb, 'SongChanged', 'org.gnome.Muine.Player') @@ -63,7 +75,7 @@ class MusicTrackListener(gobject.GObject): 'playingChanged', 'org.gnome.Rhythmbox.Player') bus.add_signal_receiver(self._player_playing_song_property_changed_cb, 'playingSongPropertyChanged', 'org.gnome.Rhythmbox.Player') - + ## Banshee banshee_bus = dbus.SessionBus() dubus = banshee_bus.get_object('org.freedesktop.DBus', @@ -111,6 +123,18 @@ class MusicTrackListener(gobject.GObject): if b == 'rb:stream-song-title': self.emit('music-track-changed', self._last_playing_music) + def _mpris_properties_extract(self, song): + info = MusicTrackInfo() + info.title = song['title'] + info.album = song['album'] + info.artist = song['artist'] + info.duration = int(song['length']) + return info + + def _mpris_music_track_change_cb(self, arg): + info = self._mpris_properties_extract(arg) + self.emit('music-track-changed', info) + def _muine_properties_extract(self, song_string): d = dict((x.strip() for x in s1.split(':', 1)) for s1 in \ song_string.split('\n')) @@ -136,6 +160,8 @@ class MusicTrackListener(gobject.GObject): return info def _rhythmbox_music_track_change_cb(self, uri): + if not uri: + return bus = dbus.SessionBus() rbshellobj = bus.get_object('org.gnome.Rhythmbox', '/org/gnome/Rhythmbox/Shell') @@ -233,6 +259,8 @@ class MusicTrackListener(gobject.GObject): '/org/gnome/Rhythmbox/Player'), 'org.gnome.Rhythmbox.Player') rbshell = dbus.Interface(rbshellobj, 'org.gnome.Rhythmbox.Shell') uri = player.getPlayingUri() + if not uri: + return None props = rbshell.getSongProperties(uri) info = self._rhythmbox_properties_extract(props) self._last_playing_music = info diff --git a/src/negotiation.py b/src/negotiation.py new file mode 100644 index 000000000..8cc4c9ad5 --- /dev/null +++ b/src/negotiation.py @@ -0,0 +1,87 @@ +import gtkgui_helpers +import dataforms_widget + +import dialogs + +from common import dataforms +from common import gajim +from common import xmpp + +def describe_features(features): + '''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') + +def show_sas_dialog(session, jid, sas, on_success): + def success_cb(checked): + on_success(checked) + + def failure_cb(): + session.reject_negotiation() + + dialogs.ConfirmationDialogCheck(_('''OK to continue with negotiation?'''), + _('''You've begun an encrypted session with %s, but it can't be guaranteed that you're talking directly to the person you think you are. + +You should speak with them directly (in person or on the phone) and confirm that their Short Authentication String is identical to this one: %s + +Would you like to continue with the encrypted session?''') % (jid, sas), + + _('Yes, I verified the Short Authentication String'), + on_response_ok=success_cb, on_response_cancel=failure_cb, is_modal=False) + +class FeatureNegotiationWindow: + '''FeatureNegotiotionWindow class''' + def __init__(self, account, jid, session, form): + self.account = account + self.jid = jid + self.form = form + self.session = session + + self.xml = gtkgui_helpers.get_glade('data_form_window.glade', 'data_form_window') + self.window = self.xml.get_widget('data_form_window') + + config_vbox = self.xml.get_widget('config_vbox') + dataform = dataforms.ExtendForm(node = self.form) + self.data_form_widget = dataforms_widget.DataFormWidget(dataform) + self.data_form_widget.show() + config_vbox.pack_start(self.data_form_widget) + + self.xml.signal_autoconnect(self) + self.window.show_all() + + def on_ok_button_clicked(self, widget): + acceptance = xmpp.Message(self.jid) + acceptance.setThread(self.session.thread_id) + feature = acceptance.NT.feature + feature.setNamespace(xmpp.NS_FEATURE) + + form = self.data_form_widget.data_form + form.setAttr('type', 'submit') + + feature.addChild(node=form) + + gajim.connections[self.account].send_stanza(acceptance) + + self.window.destroy() + + def on_cancel_button_clicked(self, widget): + # XXX determine whether to reveal presence + + rejection = xmpp.Message(self.jid) + rejection.setThread(self.session.thread_id) + feature = rejection.NT.feature + feature.setNamespace(xmpp.NS_FEATURE) + + x = xmpp.DataForm(typ='submit') + x.addChild(node=xmpp.DataField('FORM_TYPE', value='urn:xmpp:ssn')) + x.addChild(node=xmpp.DataField('accept', value='false', typ='boolean')) + + feature.addChild(node=x) + + # XXX optional + + gajim.connections[self.account].send_stanza(rejection) + + self.window.destroy() diff --git a/src/network_manager_listener.py b/src/network_manager_listener.py index 5c5cba42d..e6d42fee1 100644 --- a/src/network_manager_listener.py +++ b/src/network_manager_listener.py @@ -3,16 +3,22 @@ ## Copyright (C) 2006 Jeffrey C. Ollie ## Copyright (C) 2006 Stefan Bethge ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 sys from common import gajim def device_now_active(self, *args): @@ -29,23 +35,26 @@ def device_no_longer_active(self, *args): supported = False -try: - from common.dbus_support import system_bus +if sys.platform == 'darwin': + supported = True +else: + try: + from common.dbus_support import system_bus - bus = system_bus.SystemBus() + bus = system_bus.SystemBus() - if 'org.freedesktop.NetworkManager' in bus.list_names(): - supported = True - bus.add_signal_receiver(device_no_longer_active, - 'DeviceNoLongerActive', - 'org.freedesktop.NetworkManager', - 'org.freedesktop.NetworkManager', - '/org/freedesktop/NetworkManager') + if 'org.freedesktop.NetworkManager' in bus.list_names(): + supported = True + bus.add_signal_receiver(device_no_longer_active, + 'DeviceNoLongerActive', + 'org.freedesktop.NetworkManager', + 'org.freedesktop.NetworkManager', + '/org/freedesktop/NetworkManager') - bus.add_signal_receiver(device_now_active, - 'DeviceNowActive', - 'org.freedesktop.NetworkManager', - 'org.freedesktop.NetworkManager', - '/org/freedesktop/NetworkManager') -except: - pass + bus.add_signal_receiver(device_now_active, + 'DeviceNowActive', + 'org.freedesktop.NetworkManager', + 'org.freedesktop.NetworkManager', + '/org/freedesktop/NetworkManager') + except: + pass diff --git a/src/notify.py b/src/notify.py index 36555b04c..01974d688 100644 --- a/src/notify.py +++ b/src/notify.py @@ -1,21 +1,27 @@ ## notify.py ## -## Copyright (C) 2005-2006 Yann Le Boulanger +## Copyright (C) 2005-2006 Yann Leboulanger ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2005-2006 Andrew Sayman +## Copyright (C) 2007 Stephan Erb ## ## Notification daemon connection via D-Bus code: ## Copyright (C) 2005 by Sebastian Estienne ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 os import time @@ -40,6 +46,14 @@ try: except ImportError: USER_HAS_PYNOTIFY = False +USER_HAS_GROWL = True +try: + import osx.growler + osx.growler.init() +except: + USER_HAS_GROWL = False + + def get_show_in_roster(event, account, contact): '''Return True if this event must be shown in roster, else False''' if event == 'gc_message_received': @@ -191,12 +205,12 @@ def notify(event, jid, account, parameters, advanced_notif_num = None): transport_name = gajim.get_transport_name_from_jid(jid) img = None if transport_name: - img = os.path.join(gajim.DATA_DIR, 'iconsets', - 'transports', transport_name, '48x48', show_image) + img = os.path.join(helpers.get_transport_path(transport_name), + '48x48', show_image) if not img or not os.path.isfile(img): iconset = gajim.config.get('iconset') - img = os.path.join(gajim.DATA_DIR, 'iconsets', - iconset, '48x48', show_image) + img = os.path.join(helpers.get_iconset_path(iconset), '48x48', + show_image) path = gtkgui_helpers.get_path_to_generic_or_avatar(img, jid = jid, suffix = suffix) if event == 'status_change': @@ -206,7 +220,7 @@ def notify(event, jid, account, parameters, advanced_notif_num = None): {'nick': gajim.get_name_from_jid(account, jid),\ 'status': helpers.get_uf_show(gajim.SHOW_LIST[new_show])} if status_message: - text = text + " : " + status_message + text = text + " : " + status_message popup(_('Contact Changed Status'), jid, account, path_to_image = path, title = title, text = text) elif event == 'contact_connected': @@ -338,6 +352,11 @@ def popup(event_type, jid, account, msg_type = '', path_to_image = None, except gobject.GError, e: # Connection to notification-daemon failed, see #2893 gajim.log.debug(str(e)) + # try os/x growl + if USER_HAS_GROWL: + osx.growler.notify(event_type, jid, account, msg_type, path_to_image, + title, text) + return # go old style instance = dialogs.PopupNotificationWindow(event_type, jid, account, @@ -484,8 +503,17 @@ class DesktopNotification: except AttributeError: version = [0, 3, 1] # we're actually dealing with the newer version if version > [0, 3]: - if version >= [0, 3, 2]: + if gajim.interface.systray_enabled and \ + gajim.config.get('attach_notifications_to_systray'): + x, y = gajim.interface.systray.img_tray.window.get_position() + x_, y_, width, height, depth = \ + gajim.interface.systray.img_tray.window.get_geometry() + pos_x = x + (width / 2) + pos_y = y + (height / 2) + hints = {'x': pos_x, 'y': pos_y} + else: hints = {} + if version >= [0, 3, 2]: hints['urgency'] = dbus.Byte(0) # Low Urgency hints['category'] = dbus.String(ntype) self.notif.Notify( @@ -507,7 +535,7 @@ class DesktopNotification: dbus.String(self.title), dbus.String(self.text), dbus.String(''), - {}, + hints, dbus.UInt32(timeout*1000), reply_handler=self.attach_by_id, error_handler=self.notify_another_way) diff --git a/src/osx/.deps/idle_la-idle.Plo b/src/osx/.deps/idle_la-idle.Plo new file mode 100644 index 000000000..9ce06a81e --- /dev/null +++ b/src/osx/.deps/idle_la-idle.Plo @@ -0,0 +1 @@ +# dummy diff --git a/src/osx/.deps/nsapp.Plo b/src/osx/.deps/nsapp.Plo new file mode 100644 index 000000000..9ce06a81e --- /dev/null +++ b/src/osx/.deps/nsapp.Plo @@ -0,0 +1 @@ +# dummy diff --git a/src/osx/Makefile.am b/src/osx/Makefile.am new file mode 100644 index 000000000..1ccc8309a --- /dev/null +++ b/src/osx/Makefile.am @@ -0,0 +1,45 @@ +SUBDIRS = growl syncmenu + +ACLOCAL_AMFLAGS = -I ../m4 + +OBJC = gcc + +export MACOSX_DEPLOYMENT_TARGET=10.4 +INCLUDES = \ + $(PYTHON_INCLUDES) + +if BUILD_IDLE_OSX +idlelib_LTLIBRARIES = idle.la +idlelibdir = $(libdir)/gajim + +idle_la_LIBADD = $(CARBON_LIBS) + +idle_la_SOURCES = idle.c + +idle_la_LDFLAGS = \ + -module -avoid-version -Xcompiler -isysroot -Xcompiler /Developer/SDKs/MacOSX10.4u.sdk -Xcompiler -arch -Xcompiler ppc -Xcompiler -arch -Xcompiler i386 + +idle_la_CFLAGS = -Xcompiler -isysroot -Xcompiler /Developer/SDKs/MacOSX10.4u.sdk -Xcompiler -arch -Xcompiler ppc -Xcompiler -arch -Xcompiler i386 $(PYTHON_INCLUDES) +endif + +if BUILD_COCOA +nsapplib_LTLIBRARIES = nsapp.la +nsapplibdir = $(libdir)/gajim + +nsapp_la_LIBADD = $(COCOA_LIBS) + +nsapp_la_SOURCES = nsapp.m + +nsapp_la_LDFLAGS = \ + -module -avoid-version -Xcompiler -isysroot -Xcompiler /Developer/SDKs/MacOSX10.4u.sdk -Xcompiler -arch -Xcompiler ppc -Xcompiler -arch -Xcompiler i386 + +nsapp_la_CFLAGS = -Xcompiler -isysroot -Xcompiler /Developer/SDKs/MacOSX10.4u.sdk -Xcompiler -arch -Xcompiler ppc -Xcompiler -arch -Xcompiler i386 $(PYTHON_INCLUDES) + +AM_OBJCFLAGS = $(nsapp_la_CFLAGS) +endif + +DISTCLEANFILES = + +EXTRA_DIST = + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/osx/__init__.py b/src/osx/__init__.py new file mode 100644 index 000000000..ee21386cb --- /dev/null +++ b/src/osx/__init__.py @@ -0,0 +1,45 @@ +import sys, commands +from network_manager_listener import device_now_active, device_no_longer_active +import nsapp + + +if sys.platform != "darwin": + raise ImportError("System platform is not OS/X") + + +net_device_active = True + + +### +### Utility functions +### + +def checkPID(pid, procname): + out = commands.getstatusoutput("ps -wwp %d" % pid) + arr = out[1].split("\n") + if ((len(arr) == 2) and (arr[1].find(procname) >= 0)): + return True + return False + + +def init(): + nsapp.init() + nsapp.setNetworkCB(netDeviceChanged) + return + + +def shutdown(): + import dbus + dbus.shutdown() + return + + +def netDeviceChanged(): + global net_device_active + if net_device_active: + net_device_active = False + device_no_longer_active(None) + else: + net_device_active = True + device_now_active(None) + return diff --git a/src/osx/dbus.py b/src/osx/dbus.py new file mode 100644 index 000000000..41f1e83c5 --- /dev/null +++ b/src/osx/dbus.py @@ -0,0 +1,131 @@ +### +### Internal dbus management. This can go away once native gtk+ is in fink or +### macports and we can require their dbus. +### + + + +import os, sys, commands, signal + +if sys.platform != "darwin": + raise ImportError("System platform is not OS/X") + +import osx, osx.nsapp +from common.configpaths import gajimpaths + + +_GTK_BASE = "/Library/Frameworks/GTK+.framework/Versions/Current" + + +def readEnv(): + gajimpaths.add_from_root(u'dbus.env', u'dbus.env') + try: + dbus_env = file(gajimpaths[u'dbus.env'], "r") + except: + return False + try: + line1 = dbus_env.readline() + line2 = dbus_env.readline() + dbus_env.close() + except: + print "Invalid dbus.env file" + return False + return parseEnv(line1, line2) + + +def parseEnv(line1, line2): + try: + if not line1 or not line2: + return False + if (not line1.startswith("DBUS_SESSION_BUS_ADDRESS=") or + not line2.startswith("DBUS_SESSION_BUS_PID=")): + return False + arr = line2.split("=") + pid = arr[1].strip().strip('"') + if not osx.checkPID(int(pid), "dbus-daemon"): + return False + line1 = line1.strip() + loc = line1.find("=") + address = line1[loc + 1:] + address = address.strip().strip('"') + return [address, pid] + except Exception, e: + print "Invalid dbus.env file", e + return False + return None + + +def setEnv(env): + os.environ['DBUS_SESSION_BUS_ADDRESS'] = env[0] + os.environ['DBUS_SESSION_BUS_PID'] = env[1] + return + + +def writeEnv(env): + gajimpaths.add_from_root(u'dbus.env', u'dbus.env') + try: + dbus_env = file(gajimpaths[u'dbus.env'], "w+") + dbus_env.write("DBUS_SESSION_BUS_ADDRESS=\"" + env[0] + "\"\n") + dbus_env.write("DBUS_SESSION_BUS_PID=\"" + env[1] + "\"\n") + dbus_env.close() + except Exception, e: + print "Failed to write file: %s" % gajimpaths[u'dbus.env'] + print str(e) + return + + +def checkUUID(): + if os.path.exists(_GTK_BASE + "/var/lib/dbus/machine-id"): + return + ret = commands.getstatusoutput(_GTK_BASE + "/bin/dbus-uuidgen --ensure") + if ret[0] != 0: + print "Failed to initialize dbus machine UUID:", ret[1] + return + + +def load(start): + # Look for existing external session and just use it if it exists + if (('DBUS_SESSION_BUS_ADDRESS' in os.environ) and + ('DBUS_SESSION_BUS_PID' in os.environ) and + osx.checkPID(int(os.environ['DBUS_SESSION_BUS_PID']), 'dbus-daemon')): + return True + + # Look for our own internal session + env = readEnv() + if env: + # We have a valid existing dbus session, yay + setEnv(env) + return True + + # Initialize the machine's UUID if not done yet + checkUUID() + + if start: + # None found, start a new session + print "Starting new dbus session" + #cmd = os.path.join(osx.nsapp.getBundlePath(), + # "Contents/Resources/bin/dbus-launch --exit-with-session") + cmd = _GTK_BASE + "/bin/dbus-launch --exit-with-session" + ret = commands.getstatusoutput(cmd) + arr = ret[1].split("\n") + if len(arr) != 2: + print "Failed to start internal dbus session:" + print ret[1] + return + env = parseEnv(arr[0].strip(), arr[1].strip()) + if not env: + print "Failed to start internal dbus session:" + print ret[1] + return + setEnv(env) + writeEnv(env) + return True + return False + + +def shutdown(): + env = readEnv() + if not env: + return + os.kill(int(env[1]), signal.SIGINT) + return diff --git a/src/osx/growl/.deps/_growlImage.Plo b/src/osx/growl/.deps/_growlImage.Plo new file mode 100644 index 000000000..9ce06a81e --- /dev/null +++ b/src/osx/growl/.deps/_growlImage.Plo @@ -0,0 +1 @@ +# dummy diff --git a/src/osx/growl/.deps/_growl_la-_growl.Plo b/src/osx/growl/.deps/_growl_la-_growl.Plo new file mode 100644 index 000000000..9ce06a81e --- /dev/null +++ b/src/osx/growl/.deps/_growl_la-_growl.Plo @@ -0,0 +1 @@ +# dummy diff --git a/src/osx/growl/Growl.py b/src/osx/growl/Growl.py new file mode 100644 index 000000000..15e037673 --- /dev/null +++ b/src/osx/growl/Growl.py @@ -0,0 +1,247 @@ +""" +A Python module that enables posting notifications to the Growl daemon. +See for more information. +""" +__version__ = "0.7" +__author__ = "Mark Rowe " +__copyright__ = "(C) 2003 Mark Rowe . Released under the BSD license." +__contributors__ = ["Ingmar J Stein (Growl Team)", + "Rui Carmo (http://the.taoofmac.com)", + "Jeremy Rossi " + ] + +try: + import _growl +except: + _growl = False +import types +import struct +import md5 +import socket + +GROWL_UDP_PORT=9887 +GROWL_PROTOCOL_VERSION=1 +GROWL_TYPE_REGISTRATION=0 +GROWL_TYPE_NOTIFICATION=1 + +GROWL_APP_NAME="ApplicationName" +GROWL_APP_ICON="ApplicationIcon" +GROWL_NOTIFICATIONS_DEFAULT="DefaultNotifications" +GROWL_NOTIFICATIONS_ALL="AllNotifications" +GROWL_NOTIFICATIONS_USER_SET="AllowedUserNotifications" + +GROWL_NOTIFICATION_NAME="NotificationName" +GROWL_NOTIFICATION_TITLE="NotificationTitle" +GROWL_NOTIFICATION_DESCRIPTION="NotificationDescription" +GROWL_NOTIFICATION_ICON="NotificationIcon" +GROWL_NOTIFICATION_APP_ICON="NotificationAppIcon" +GROWL_NOTIFICATION_PRIORITY="NotificationPriority" + +GROWL_NOTIFICATION_STICKY="NotificationSticky" +GROWL_NOTIFICATION_CLICK_CONTEXT="NotificationClickContext" + +GROWL_APP_REGISTRATION="GrowlApplicationRegistrationNotification" +GROWL_APP_REGISTRATION_CONF="GrowlApplicationRegistrationConfirmationNotification" +GROWL_NOTIFICATION="GrowlNotification" +GROWL_SHUTDOWN="GrowlShutdown" +GROWL_PING="Honey, Mind Taking Out The Trash" +GROWL_PONG="What Do You Want From Me, Woman" +GROWL_IS_READY="Lend Me Some Sugar; I Am Your Neighbor!" + +GROWL_NOTIFICATION_CLICKED="GrowlClicked!" +GROWL_NOTIFICATION_TIMED_OUT="GrowlTimedOut!" +GROWL_KEY_CLICKED_CONTEXT="ClickedContext" + + +growlPriority = {"Very Low":-2,"Moderate":-1,"Normal":0,"High":1,"Emergency":2} + +class netgrowl: + """Builds a Growl Network Registration packet. + Defaults to emulating the command-line growlnotify utility.""" + + __notAllowed__ = [GROWL_APP_ICON, GROWL_NOTIFICATION_ICON, GROWL_NOTIFICATION_APP_ICON] + + def __init__(self, hostname, password ): + self.hostname = hostname + self.password = password + self.socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) + + def send(self, data): + self.socket.sendto(data, (self.hostname, GROWL_UDP_PORT)) + + def PostNotification(self, userInfo): + if userInfo.has_key(GROWL_NOTIFICATION_PRIORITY): + priority = userInfo[GROWL_NOTIFICATION_PRIORITY] + else: + priority = 0 + if userInfo.has_key(GROWL_NOTIFICATION_STICKY): + sticky = userInfo[GROWL_NOTIFICATION_STICKY] + else: + priority = False + data = self.encodeNotify(userInfo[GROWL_APP_NAME], + userInfo[GROWL_NOTIFICATION_NAME], + userInfo[GROWL_NOTIFICATION_TITLE], + userInfo[GROWL_NOTIFICATION_DESCRIPTION], + priority, + sticky) + return self.send(data) + + def PostRegistration(self, userInfo): + data = self.encodeRegistration(userInfo[GROWL_APP_NAME], + userInfo[GROWL_NOTIFICATIONS_ALL], + userInfo[GROWL_NOTIFICATIONS_DEFAULT]) + return self.send(data) + + def encodeRegistration(self, application, notifications, defaultNotifications): + data = struct.pack("!BBH", + GROWL_PROTOCOL_VERSION, + GROWL_TYPE_REGISTRATION, + len(application) ) + data += struct.pack("BB", + len(notifications), + len(defaultNotifications) ) + data += application + for i in notifications: + encoded = i.encode("utf-8") + data += struct.pack("!H", len(encoded)) + data += encoded + for i in defaultNotifications: + data += struct.pack("B", i) + return self.encodePassword(data) + + def encodeNotify(self, application, notification, title, description, + priority = 0, sticky = False): + + application = application.encode("utf-8") + notification = notification.encode("utf-8") + title = title.encode("utf-8") + description = description.encode("utf-8") + flags = (priority & 0x07) * 2 + if priority < 0: + flags |= 0x08 + if sticky: + flags = flags | 0x0001 + data = struct.pack("!BBHHHHH", + GROWL_PROTOCOL_VERSION, + GROWL_TYPE_NOTIFICATION, + flags, + len(notification), + len(title), + len(description), + len(application) ) + data += notification + data += title + data += description + data += application + return self.encodePassword(data) + + def encodePassword(self, data): + checksum = md5.new() + checksum.update(data) + if self.password: + checksum.update(self.password) + data += checksum.digest() + return data + +class _ImageHook(type): + def __getattribute__(self, attr): + global Image + if Image is self: + from _growlImage import Image + + return getattr(Image, attr) + +class Image(object): + __metaclass__ = _ImageHook + +class _RawImage(object): + def __init__(self, data): self.rawImageData = data + +class GrowlNotifier(object): + """ + A class that abstracts the process of registering and posting + notifications to the Growl daemon. + + You can either pass `applicationName', `notifications', + `defaultNotifications' and `applicationIcon' to the constructor + or you may define them as class-level variables in a sub-class. + + `defaultNotifications' is optional, and defaults to the value of + `notifications'. `applicationIcon' is also optional but defaults + to a pointless icon so is better to be specified. + """ + + applicationName = 'GrowlNotifier' + notifications = [] + defaultNotifications = [] + applicationIcon = None + _notifyMethod = _growl + _notify_cb = None + + def __init__(self, applicationName=None, notifications=None, defaultNotifications=None, applicationIcon=None, hostname=None, password=None, notify_cb=None): + assert(applicationName is not None, 'an application name is required') + self.applicationName = applicationName + + assert(notifications, 'a sequence of one or more notification names is required') + self.notifications = list(notifications) + if defaultNotifications is not None: + self.defaultNotifications = list(defaultNotifications) + else: + self.defaultNotifications = list(self.notifications) + + if applicationIcon is not None: + self.applicationIcon = self._checkIcon(applicationIcon) + + if hostname is not None and password is not None: + self._notifyMethod = netgrowl(hostname, password) + elif hostname is not None or password is not None: + raise KeyError, "Hostname and Password are both required for a network notification" + + if notify_cb is not None: + self._notify_cb = notify_cb + else: + self._notify_cb = self.notifyCB + + if hostname is None and password is None: + self._notifyMethod.Init(applicationName, self._notify_cb) + + def _checkIcon(self, data): + if isinstance(data, str): + return _RawImage(data) + else: + return data + + def register(self): + if self.applicationIcon is not None: + self.applicationIcon = self._checkIcon(self.applicationIcon) + + regInfo = {GROWL_APP_NAME: self.applicationName, + GROWL_NOTIFICATIONS_ALL: self.notifications, + GROWL_NOTIFICATIONS_DEFAULT: self.defaultNotifications, + GROWL_APP_ICON:self.applicationIcon, + } + self._notifyMethod.PostRegistration(regInfo) + + def notify(self, noteType, title, description, icon=None, sticky=False, priority=None, context=None): + assert noteType in self.notifications + notifyInfo = {GROWL_NOTIFICATION_NAME: noteType, + GROWL_APP_NAME: self.applicationName, + GROWL_NOTIFICATION_TITLE: title, + GROWL_NOTIFICATION_DESCRIPTION: description, + } + if sticky: + notifyInfo[GROWL_NOTIFICATION_STICKY] = 1 + + if priority is not None: + notifyInfo[GROWL_NOTIFICATION_PRIORITY] = priority + + if icon: + notifyInfo[GROWL_NOTIFICATION_ICON] = self._checkIcon(icon) + + if context: + notifyInfo[GROWL_NOTIFICATION_CLICK_CONTEXT] = context + + self._notifyMethod.PostNotification(notifyInfo) + + def notifyCB(self, userdata): + print "Got notify in pyland", userdata diff --git a/src/osx/growl/Makefile.am b/src/osx/growl/Makefile.am new file mode 100644 index 000000000..df48b58d8 --- /dev/null +++ b/src/osx/growl/Makefile.am @@ -0,0 +1,41 @@ +OBJC = gcc + +export MACOSX_DEPLOYMENT_TARGET=10.4 +INCLUDES = \ + $(PYTHON_INCLUDES) + +if BUILD_CARBON +_growllib_LTLIBRARIES = _growl.la +_growllibdir = $(libdir)/gajim + +_growl_la_LIBADD = $(CARBON_LIBS) + +_growl_la_SOURCES = _growl.c + +_growl_la_LDFLAGS = \ + -module -avoid-version -Xcompiler -isysroot -Xcompiler /Developer/SDKs/MacOSX10.4u.sdk -Xcompiler -arch -Xcompiler ppc -Xcompiler -arch -Xcompiler i386 + +_growl_la_CFLAGS = -Xcompiler -isysroot -Xcompiler /Developer/SDKs/MacOSX10.4u.sdk -Xcompiler -arch -Xcompiler ppc -Xcompiler -arch -Xcompiler i386 $(PYTHON_INCLUDES) +endif + +if BUILD_COCOA +_growlImagelib_LTLIBRARIES = _growlImage.la +_growlImagelibdir = $(libdir)/gajim + +_growlImage_la_LIBADD = $(COCOA_LIBS) + +_growlImage_la_SOURCES = _growlImage.m + +_growlImage_la_LDFLAGS = \ + -module -avoid-version -Xcompiler -isysroot -Xcompiler /Developer/SDKs/MacOSX10.4u.sdk -Xcompiler -arch -Xcompiler ppc -Xcompiler -arch -Xcompiler i386 + +_growlImage_la_CFLAGS = -Xcompiler -isysroot -Xcompiler /Developer/SDKs/MacOSX10.4u.sdk -Xcompiler -arch -Xcompiler ppc -Xcompiler -arch -Xcompiler i386 $(PYTHON_INCLUDES) + +AM_OBJCFLAGS = $(_growlImage_la_CFLAGS) +endif + +DISTCLEANFILES = + +EXTRA_DIST = + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/osx/growl/__init__.py b/src/osx/growl/__init__.py new file mode 100644 index 000000000..2f3c16e5d --- /dev/null +++ b/src/osx/growl/__init__.py @@ -0,0 +1 @@ +# No-op file that just helps python with the growl module directory. diff --git a/src/osx/growl/_growl.c b/src/osx/growl/_growl.c new file mode 100644 index 000000000..11ac07e93 --- /dev/null +++ b/src/osx/growl/_growl.c @@ -0,0 +1,239 @@ +/* + * Copyright 2004-2005 The Growl Project. + * Created by Jeremy Rossi + * Released under the BSD license. + */ + +#include +#include + +#define str(cfstr) CFStringGetCStringPtr(cfstr, kCFStringEncodingMacRoman) +#define cfstr(str) CFStringCreateWithCString(kCFAllocatorDefault, str, kCFStringEncodingMacRoman) + +static PyObject * _notify_cb = NULL; + + +static PyObject * growl_PostDictionary(CFStringRef name, PyObject *self, PyObject *args) { + int i, j; + + PyObject *inputDict; + PyObject *pKeys = NULL; + PyObject *pKey, *pValue; + + CFMutableDictionaryRef note = CFDictionaryCreateMutable(kCFAllocatorDefault, + /*capacity*/ 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + + if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &inputDict)) + goto error; + + pKeys = PyDict_Keys(inputDict); + for (i = 0; i < PyList_Size(pKeys); ++i) { + CFStringRef convertedKey; + + /* Converting the PyDict key to NSString and used for key in note */ + pKey = PyList_GetItem(pKeys, i); + if (!pKey) + // Exception already set + goto error; + pValue = PyDict_GetItem(inputDict, pKey); + if (!pValue) { + // XXX Neeed a real Error message here. + PyErr_SetString(PyExc_TypeError," "); + goto error; + } + if (PyUnicode_Check(pKey)) { + convertedKey = CFStringCreateWithBytes(kCFAllocatorDefault, + (const UInt8 *)PyUnicode_AS_DATA(pKey), + PyUnicode_GET_DATA_SIZE(pKey), + kCFStringEncodingUnicode, + false); + } else if (PyString_Check(pKey)) { + convertedKey = CFStringCreateWithCString(kCFAllocatorDefault, + PyString_AsString(pKey), + kCFStringEncodingUTF8); + } else { + PyErr_SetString(PyExc_TypeError,"The Dict keys must be strings/unicode"); + goto error; + } + + /* Converting the PyDict value to NSString or NSData based on class */ + if (PyString_Check(pValue)) { + CFStringRef convertedValue = CFStringCreateWithCString(kCFAllocatorDefault, + PyString_AS_STRING(pValue), + kCFStringEncodingUTF8); + CFDictionarySetValue(note, convertedKey, convertedValue); + CFRelease(convertedValue); + } else if (PyUnicode_Check(pValue)) { + CFStringRef convertedValue = CFStringCreateWithBytes(kCFAllocatorDefault, + (const UInt8 *)PyUnicode_AS_DATA(pValue), + PyUnicode_GET_DATA_SIZE(pValue), + kCFStringEncodingUnicode, + false); + CFDictionarySetValue(note, convertedKey, convertedValue); + CFRelease(convertedValue); + } else if (PyInt_Check(pValue)) { + long v = PyInt_AS_LONG(pValue); + CFNumberRef convertedValue = CFNumberCreate(kCFAllocatorDefault, + kCFNumberLongType, + &v); + CFDictionarySetValue(note, convertedKey, convertedValue); + CFRelease(convertedValue); + } else if (pValue == Py_None) { + CFDataRef convertedValue = CFDataCreate(kCFAllocatorDefault, NULL, 0); + CFDictionarySetValue(note, convertedKey, convertedValue); + CFRelease(convertedValue); + } else if (PyList_Check(pValue)) { + int size = PyList_Size(pValue); + CFMutableArrayRef listHolder = CFArrayCreateMutable(kCFAllocatorDefault, + size, + &kCFTypeArrayCallBacks); + for (j = 0; j < size; ++j) { + PyObject *lValue = PyList_GetItem(pValue, j); + if (PyString_Check(lValue)) { + CFStringRef convertedValue = CFStringCreateWithCString(kCFAllocatorDefault, + PyString_AS_STRING(lValue), + kCFStringEncodingUTF8); + CFArrayAppendValue(listHolder, convertedValue); + CFRelease(convertedValue); + } else if (PyUnicode_Check(lValue)) { + CFStringRef convertedValue = CFStringCreateWithBytes(kCFAllocatorDefault, + (const UInt8 *)PyUnicode_AS_DATA(lValue), + PyUnicode_GET_DATA_SIZE(lValue), + kCFStringEncodingUnicode, + false); + CFArrayAppendValue(listHolder, convertedValue); + CFRelease(convertedValue); + } else { + CFRelease(convertedKey); + PyErr_SetString(PyExc_TypeError,"The lists must only contain strings"); + goto error; + } + } + CFDictionarySetValue(note, convertedKey, listHolder); + CFRelease(listHolder); + } else if (PyObject_HasAttrString(pValue, "rawImageData")) { + PyObject *lValue = PyObject_GetAttrString(pValue, "rawImageData"); + if (!lValue) { + goto error; + } else if (PyString_Check(lValue)) { + CFDataRef convertedValue = CFDataCreate(kCFAllocatorDefault, + (const UInt8 *)PyString_AsString(lValue), + PyString_Size(lValue)); + CFDictionarySetValue(note, convertedKey, convertedValue); + CFRelease(convertedValue); + } else { + CFRelease(convertedKey); + PyErr_SetString(PyExc_TypeError, "Icon with rawImageData attribute present must ensure it is a string."); + goto error; + } + } else { + CFRelease(convertedKey); + PyErr_SetString(PyExc_TypeError, "Value is not of Str/List"); + goto error; + } + CFRelease(convertedKey); + } + + Py_BEGIN_ALLOW_THREADS + CFNotificationCenterPostNotification(CFNotificationCenterGetDistributedCenter(), + /*name*/ name, + /*object*/ NULL, + /*userInfo*/ note, + /*deliverImmediately*/ false); + CFRelease(note); + Py_END_ALLOW_THREADS + + Py_DECREF(pKeys); + + Py_INCREF(Py_None); + return Py_None; + +error: + CFRelease(note); + + Py_XDECREF(pKeys); + + return NULL; +} + +static void growl_NotifyCB(CFNotificationCenterRef center, void *observer, + CFStringRef name, const void *object, + CFDictionaryRef userInfo) +{ + CFIndex size, len; + const void * keys[1]; + const void * values[1]; + CFArrayRef arr; + CFStringRef cfstr; + CFRange cfrange; + UInt8 *buff; + int i; + PyObject * pylist; + + cfrange.location = 0; + CFDictionaryGetKeysAndValues(userInfo, keys, values); + arr = (CFArrayRef)values[0]; + size = CFArrayGetCount(arr); + pylist = PyList_New(size); + for (i=0; i < size; ++i) + { + cfstr = (CFStringRef)CFArrayGetValueAtIndex(arr, i); + cfrange.length = CFStringGetLength(cfstr); + CFStringGetBytes(cfstr, cfrange, kCFStringEncodingUnicode, 0, false, + NULL, 0, &len); + buff = (UInt8*)malloc(len); + CFStringGetBytes(cfstr, cfrange, kCFStringEncodingUnicode, 0, false, + buff, len, &len); + PyList_SetItem(pylist, i, + PyUnicode_DecodeUTF16((char*)buff, len, NULL, NULL)); + free(buff); + } + + PyObject_CallObject(_notify_cb, Py_BuildValue("(O)", pylist)); + Py_DECREF(pylist); +} + +static PyObject * growl_Init(PyObject *self, PyObject *args) +{ + char* name = NULL; + + if (!PyArg_ParseTuple(args, "sO", &name, &_notify_cb)) + return NULL; + + Py_INCREF(_notify_cb); + + char* buff = (char*)malloc(strlen(name) + 14); + strcpy(buff, name); + strcat(buff, "GrowlClicked!"); + CFStringRef cfbuff = cfstr(buff); + CFNotificationCenterAddObserver( + CFNotificationCenterGetDistributedCenter(), NULL, &growl_NotifyCB, + cfbuff, NULL, CFNotificationSuspensionBehaviorDeliverImmediately); + free(buff); + CFRelease(cfbuff); + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * growl_PostRegistration(PyObject *self, PyObject *args) { + return growl_PostDictionary(CFSTR("GrowlApplicationRegistrationNotification"), self, args); +} + +static PyObject * growl_PostNotification(PyObject *self, PyObject *args) { + return growl_PostDictionary(CFSTR("GrowlNotification"), self, args); +} + +static PyMethodDef GrowlMethods[] = { + {"Init", growl_Init, METH_VARARGS, "Initialize notifications with GrowlHelperApp"}, + {"PostNotification", growl_PostNotification, METH_VARARGS, "Send a notification to GrowlHelperApp"}, + {"PostRegistration", growl_PostRegistration, METH_VARARGS, "Send a registration to GrowlHelperApp"}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + + +PyMODINIT_FUNC init_growl(void) { + Py_InitModule("_growl", GrowlMethods); +} diff --git a/src/osx/growl/_growlImage.m b/src/osx/growl/_growlImage.m new file mode 100644 index 000000000..d4b2b72f9 --- /dev/null +++ b/src/osx/growl/_growlImage.m @@ -0,0 +1,274 @@ +/* + * Copyright 2004 Mark Rowe + * Released under the BSD license. + */ + +#include "Python.h" +#import + +typedef struct +{ + PyObject_HEAD + NSImage *theImage; +} ImageObject; + + +static PyTypeObject ImageObject_Type; + +#define ImageObject_Check(v) ((v)->ob_type == &ImageObject_Type) + +static ImageObject * +newImageObject(NSImage *img) +{ + ImageObject *self; + if (! img) + { + PyErr_SetString(PyExc_TypeError, "Invalid image."); + return NULL; + } + + self = PyObject_New(ImageObject, &ImageObject_Type); + if (! self) + return NULL; + + self->theImage = [img retain]; + return self; +} + +static void +ImageObject_dealloc(ImageObject *self) +{ + PyObject_Del(self); +} + +static PyObject * +ImageObject_getAttr(PyObject *self, PyObject *attr) +{ + char *theAttr = PyString_AsString(attr); + NSAutoreleasePool *pool = nil; + + if (strcmp(theAttr, "rawImageData") == 0) + { + pool = [[NSAutoreleasePool alloc] init]; + NSData *imageData = [((ImageObject *) self)->theImage TIFFRepresentation]; + PyObject *pyImageData = PyString_FromStringAndSize([imageData bytes], [imageData length]); + [pool release]; + return pyImageData; + } + else + return PyObject_GenericGetAttr(self, attr); +} + + +static PyObject * +ImageObject_imageFromPath(PyTypeObject *cls, PyObject *args) +{ + ImageObject *self; + char *fileName_ = NULL; + NSString *fileName = nil; + NSImage *theImage = nil; + NSAutoreleasePool *pool = nil; + + if (! PyArg_ParseTuple(args, "et:imageFromPath", + Py_FileSystemDefaultEncoding, &fileName_)) + return NULL; + + pool = [[NSAutoreleasePool alloc] init]; + + fileName = [NSString stringWithUTF8String:fileName_]; + theImage = [[[NSImage alloc] initWithContentsOfFile:fileName] autorelease]; + self = newImageObject(theImage); + + [pool release]; + return (PyObject *) self; +} + +static PyObject * +ImageObject_imageWithData(PyTypeObject *cls, PyObject *args) +{ + ImageObject *self; + char *imageData = NULL; + int imageDataSize = 0; + NSImage *theImage = nil; + NSAutoreleasePool *pool = nil; + + if (! PyArg_ParseTuple(args, "s#:imageWithData", + &imageData, &imageDataSize)) + return NULL; + + pool = [[NSAutoreleasePool alloc] init]; + + + theImage = [[[NSImage alloc] initWithData:[NSData dataWithBytes:imageData + length:imageDataSize]] autorelease]; + self = newImageObject(theImage); + + [pool release]; + return (PyObject *) self; +} + +static PyObject * +ImageObject_imageWithIconForFile(PyTypeObject *cls, PyObject *args) +{ + ImageObject *self; + char *fileName_ = NULL; + NSString *fileName = nil; + NSImage *theImage = nil; + NSAutoreleasePool *pool = nil; + + if (! PyArg_ParseTuple(args, "et:imageWithIconForFile", + Py_FileSystemDefaultEncoding, &fileName_)) + return NULL; + + pool = [[NSAutoreleasePool alloc] init]; + + fileName = [NSString stringWithUTF8String:fileName_]; + theImage = [[NSWorkspace sharedWorkspace] iconForFile:fileName]; + self = newImageObject(theImage); + + [pool release]; + return (PyObject *) self; +} + +static PyObject * +ImageObject_imageWithIconForFileType(PyTypeObject *cls, PyObject *args) +{ + ImageObject *self; + char *fileType = NULL; + NSImage *theImage = nil; + NSAutoreleasePool *pool = nil; + + if (! PyArg_ParseTuple(args, "s:imageWithIconForFileType", + &fileType)) + return NULL; + + pool = [[NSAutoreleasePool alloc] init]; + + theImage = [[NSWorkspace sharedWorkspace] iconForFileType:[NSString stringWithUTF8String:fileType]]; + self = newImageObject(theImage); + + [pool release]; + return (PyObject *) self; +} + +static PyObject * +ImageObject_imageWithIconForCurrentApplication(PyTypeObject *cls, PyObject *args) +{ + ImageObject *self; + NSAutoreleasePool *pool = nil; + + if (! PyArg_ParseTuple(args, ":imageWithIconForCurrentApplication")) + return NULL; + + pool = [[NSAutoreleasePool alloc] init]; + + self = newImageObject([NSApp applicationIconImage]); + + [pool release]; + return (PyObject *) self; +} + +static PyObject * +ImageObject_imageWithIconForApplication(PyTypeObject *cls, PyObject *args) +{ + ImageObject *self; + char *appName_ = NULL; + NSString *appName = nil; + NSString *appPath = nil; + NSImage *theImage = nil; + NSAutoreleasePool *pool = nil; + + if (! PyArg_ParseTuple(args, "et:imageWithIconForApplication", + Py_FileSystemDefaultEncoding, &appName_)) + return NULL; + + pool = [[NSAutoreleasePool alloc] init]; + + appName = [NSString stringWithUTF8String:appName_]; + appPath = [[NSWorkspace sharedWorkspace] fullPathForApplication:appName]; + if (! appPath) + { + PyErr_Format(PyExc_RuntimeError, "Application named '%s' not found", appName_); + self = NULL; + goto done; + } + theImage = [[NSWorkspace sharedWorkspace] iconForFile:appPath]; + self = newImageObject(theImage); + +done: + [pool release]; + return (PyObject *) self; +} + + +static PyMethodDef ImageObject_methods[] = { + {"imageFromPath", (PyCFunction)ImageObject_imageFromPath, METH_VARARGS | METH_CLASS}, + {"imageWithData", (PyCFunction)ImageObject_imageWithData, METH_VARARGS | METH_CLASS}, + {"imageWithIconForFile", (PyCFunction)ImageObject_imageWithIconForFile, METH_VARARGS | METH_CLASS}, + {"imageWithIconForFileType", (PyCFunction)ImageObject_imageWithIconForFileType, METH_VARARGS | METH_CLASS}, + {"imageWithIconForCurrentApplication", (PyCFunction)ImageObject_imageWithIconForCurrentApplication, METH_VARARGS | METH_CLASS}, + {"imageWithIconForApplication", (PyCFunction)ImageObject_imageWithIconForApplication, METH_VARARGS | METH_CLASS}, + {NULL, NULL} /* sentinel */ +}; + +static PyTypeObject ImageObject_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "_growlImage.Image", /*tp_name*/ + sizeof(ImageObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)ImageObject_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + ImageObject_getAttr, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_CLASS, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + ImageObject_methods, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + PyType_GenericAlloc, /*tp_alloc*/ + 0, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ +}; + +static PyMethodDef _growlImage_methods[] = { + {NULL, NULL} +}; + +PyMODINIT_FUNC +init_growlImage(void) +{ + PyObject *m; + + if (PyType_Ready(&ImageObject_Type) < 0) + return; + + m = Py_InitModule("_growlImage", _growlImage_methods); + + PyModule_AddObject(m, "Image", (PyObject *)&ImageObject_Type); +} diff --git a/src/osx/growl/setup.py b/src/osx/growl/setup.py new file mode 100644 index 000000000..5a7235dee --- /dev/null +++ b/src/osx/growl/setup.py @@ -0,0 +1,25 @@ +#!/usr/bin/python +from distutils.core import setup, Extension +import sys + +_growl = Extension('_growl', + extra_link_args = ["-framework","CoreFoundation"], + sources = ['libgrowl.c']) +_growlImage = Extension('_growlImage', + extra_link_args = ["-framework","Cocoa"], + sources = ['growlImage.m']) + +if sys.platform.startswith("darwin"): + modules = [_growl, _growlImage] +else: + modules = [] + +setup(name="py-Growl", + version="0.0.7", + description="Python bindings for posting notifications to the Growl daemon", + author="Mark Rowe", + author_email="bdash@users.sourceforge.net", + url="http://growl.info", + py_modules=["Growl"], + ext_modules = modules ) + diff --git a/src/osx/growler.py b/src/osx/growler.py new file mode 100644 index 000000000..c3ea320cf --- /dev/null +++ b/src/osx/growler.py @@ -0,0 +1,63 @@ +import sys, os +from growl.Growl import GrowlNotifier +from common import gajim, helpers + + +if sys.platform != "darwin": + raise ImportError("System platform is not OS/X") + + +GENERIC_NOTIF = _('Generic') +notifications = [ + _('Contact Signed In'), _('Contact Signed Out'), _('New Message'), + _('New Single Message'), _('New Private Message'), _('New E-mail'), + _('File Transfer Request'), _('File Transfer Error'), + _('File Transfer Completed'), _('File Transfer Stopped'), + _('Groupchat Invitation'), _('Contact Changed Status'), + _('Connection Failed'), GENERIC_NOTIF + ] + +growler = None + + + +def init(): + global growler, notifications + icon = file(os.path.join(gajim.DATA_DIR, "pixmaps", "gajim.icns"), "r") + growler = GrowlNotifier(applicationName = "Gajim", + notifications = notifications, + applicationIcon = icon.read(), + notify_cb = notifyCB) + growler.register() + return + + +def notify(event_type, jid, account, msg_type, path_to_image, title, text): + global notifications + if not event_type in notifications: + event_type = GENERIC_NOTIF + if not text: + text = gajim.get_name_from_jid(account, jid) # default value of text + text = filterString(text) + if not title: + title = event_type + title = filterString(title) + if not path_to_image: + path_to_image = os.path.abspath( + os.path.join(gajim.DATA_DIR, 'pixmaps', 'events', + 'chat_msg_recv.png')) # img to display + icon = file(path_to_image, "r") + context = [account, jid, msg_type] + growler.notify(event_type, title, text, icon.read(), False, None, + context) + return + + +def notifyCB(data): + gajim.interface.handle_event(data[0], data[1], data[2]) + + +def filterString(string): + string = string.replace(""", "'") + return string + diff --git a/src/osx/idle.c b/src/osx/idle.c new file mode 100644 index 000000000..c24c30438 --- /dev/null +++ b/src/osx/idle.c @@ -0,0 +1,174 @@ +/***** + This is a modified form of idler.c. The original copyright notice follows. + **/ + +/***************************************** + * idler.c + * + * Uses IOKit to figure out the idle time of the system. The idle time + * is stored as a property of the IOHIDSystem class; the name is + * HIDIdleTime. Stored as a 64-bit int, measured in ns. + * + * The program itself just prints to stdout the time that the computer +has + * been idle in seconds. + * + * Compile with gcc -Wall -framework IOKit -framework Carbon idler.c -o + * idler + * + * Copyright (c) 2003, Stanford University + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions +are + * met: + * Redistributions of source code must retain the above copyright +notice, + * this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright +notice, + * this list of conditions and the following disclaimer in the +documentation + * and/or other materials provided with the distribution. + * + * Neither the name of Stanford University nor the names of its +contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * 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. + */ + +#include +#include +#include + +#include +#include +#include + +#include + +/* 10^9 -- number of ns in a second */ +#define NS_SECONDS 1000000000 + + +static mach_port_t __idle_osx_master_port; +io_registry_entry_t __idle_osx_service; + + +static PyObject * idle_init(PyObject *self, PyObject *args) +{ + io_iterator_t iter; + CFMutableDictionaryRef hid_match; + + IOMasterPort(MACH_PORT_NULL, &__idle_osx_master_port); + + /* Get IOHIDSystem */ + hid_match = IOServiceMatching("IOHIDSystem"); + IOServiceGetMatchingServices(__idle_osx_master_port, hid_match, &iter); + if (iter == 0) { + printf("Error accessing IOHIDSystem\n"); + } + + __idle_osx_service = IOIteratorNext(iter); + if (__idle_osx_service == 0) { + printf("Iterator's empty!\n"); + } + + IOObjectRelease(iter); + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * idle_getIdleSec(PyObject *self, PyObject *args) +{ + CFMutableDictionaryRef properties = 0; + CFTypeRef obj = NULL; + uint64_t tHandle = 0; + + if (IORegistryEntryCreateCFProperties(__idle_osx_service, &properties, + kCFAllocatorDefault, 0) == + KERN_SUCCESS && properties != NULL) + { + obj = CFDictionaryGetValue(properties, CFSTR("HIDIdleTime")); + CFRetain(obj); + } + else + { + printf("Couldn't grab properties of system\n"); + } + + if (obj) + { + CFTypeID type = CFGetTypeID(obj); + + if (type == CFDataGetTypeID()) + { + CFDataGetBytes((CFDataRef) obj, + CFRangeMake(0, sizeof(tHandle)), + (UInt8*) &tHandle); + } + else if (type == CFNumberGetTypeID()) + { + CFNumberGetValue((CFNumberRef)obj, + kCFNumberSInt64Type, + &tHandle); + } + else + { + printf("%d: unsupported type\n", (int)type); + } + + CFRelease(obj); + + // essentially divides by 10^9 + tHandle >>= 30; + } + else + { + printf("Can't find idle time\n"); + } + + CFRelease((CFTypeRef)properties); + return Py_BuildValue("L", tHandle); +} + +static PyObject * idle_close(PyObject *self, PyObject *args) +{ + /* Release our resources */ + IOObjectRelease(__idle_osx_service); + + Py_INCREF(Py_None); + return Py_None; +} + +static PyMethodDef idleMethods[] = +{ + {"init", idle_init, METH_VARARGS, "init idle"}, + {"getIdleSec", idle_getIdleSec, METH_VARARGS, "Get idle time in seconds"}, + {"close", idle_close, METH_VARARGS, "close idle"}, + {NULL, NULL, 0, NULL} +}; + +PyMODINIT_FUNC initidle(void) +{ + (void) Py_InitModule("idle", idleMethods); +} diff --git a/src/osx/nsapp.h b/src/osx/nsapp.h new file mode 100644 index 000000000..dd86960c2 --- /dev/null +++ b/src/osx/nsapp.h @@ -0,0 +1,19 @@ +#import + + +@interface NSApplication (Gajim) + +- (void) initGajim; +- (void) initGUI; +- (BOOL) initNetNotify; +- (void) orderFrontStandardAboutPanel: (id)sender; +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; +- (BOOL) application:(NSApplication *)theApplication + openFile:(NSString *)filename; +- (void) application:(NSApplication *)sender openFiles:(NSArray *)filenames; +- (BOOL) applicationOpenUntitledFile:(NSApplication *)theApplication; +- (BOOL) applicationShouldOpenUntitledFile:(NSApplication *)sender; + ++ (void) netNotifyCB: (NSNotification*)notif; + +@end diff --git a/src/osx/nsapp.m b/src/osx/nsapp.m new file mode 100644 index 000000000..4e7b6bde4 --- /dev/null +++ b/src/osx/nsapp.m @@ -0,0 +1,239 @@ +#import "nsapp.h" +#include + +#include + +#include +#include +#include + +#include + + +#define GAJIM_POOL_ALLOC \ + NSAutoreleasePool *gajim_pool = [[NSAutoreleasePool alloc] init]; +#define GAJIM_POOL_FREE [gajim_pool release]; + + +static PyObject *netChangedCB = NULL; +static NSFileHandle* netNotifyFH = nil; +static int netNotifyToken = -1; + + +@implementation NSApplication (Gajim) + +- (void) initGUI +{ + [NSBundle loadNibNamed:@"Gajim" owner:NSApp]; +} + ++ (void) netNotifyCB: (NSNotification*) notif +{ + NSLog(@"Network changed notification"); + + if (netChangedCB) + { + PyObject_CallObject(netChangedCB, NULL); + } + + [[notif object] readInBackgroundAndNotify]; +} + +- (BOOL) initNetNotify +{ + int fd = 0; + + if (notify_register_file_descriptor( + "com.apple.system.config.network_change", &fd, 0, + &netNotifyToken) != NOTIFY_STATUS_OK) + { + return FALSE; + } + + netNotifyFH = [[NSFileHandle alloc] initWithFileDescriptor: fd]; + [[NSNotificationCenter defaultCenter] addObserver: [self class] + selector: @selector(netNotifyCB:) + name: NSFileHandleReadCompletionNotification + object: netNotifyFH]; + [netNotifyFH readInBackgroundAndNotify]; + + return TRUE; +} + +- (void) initGajim +{ + GAJIM_POOL_ALLOC + + [self initGUI]; + [self initNetNotify]; + + [NSApp setDelegate:self]; + [NSApp finishLaunching]; + + GAJIM_POOL_FREE +} + +- (void) orderFrontStandardAboutPanel: (id)sender +{ + PyRun_SimpleString("\n\ +import gobject\n\ +import dialogs\n\ +def doAbout():\n\ + dialogs.AboutDialog()\n\ + return None\n\ +gobject.idle_add(doAbout)\n\ +"); +} + +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender +{ +/* + PyRun_SimpleString("\n\ +import gajim\n\ +import gobject\n\ +def doQuit():\n\ + gajim.interface.roster.on_quit_menuitem_activate(None)\n\ + return None\n\ +gobject.idle_add(doQuit)\n\ +"); +*/ + return NSTerminateNow; +} + +- (BOOL) application:(NSApplication *)theApplication + openFile:(NSString *)filename +{ + NSLog(@"openFile"); + NSLog(filename); + return YES; +} + +- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames +{ + NSLog(@"openFiles"); + + NSEnumerator* iter = [filenames objectEnumerator]; + NSString* str; + while ((str = [iter nextObject])) + { + NSLog(str); + } + return; +} + +- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication +{ + NSLog(@"openUntitledFile"); + return YES; +} + +- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender +{ + NSLog(@"shouldOpenUntitledFile"); + return YES; +} + +@end + + +static PyObject * nsapp_init(PyObject *self, PyObject *args) +{ + [NSApp initGajim]; + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * nsapp_setNetworkCB(PyObject *self, PyObject *args) +{ + PyArg_UnpackTuple(args, "netcb", 1, 1, &netChangedCB); + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * nsapp_requestUserAttention(PyObject *self, PyObject *args) +{ + GAJIM_POOL_ALLOC + [NSApp requestUserAttention:NSInformationalRequest]; + GAJIM_POOL_FREE + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject * nsapp_playFile(PyObject *self, PyObject *args) +{ + GAJIM_POOL_ALLOC + + const char* cstr = NULL; + + if (!PyArg_ParseTuple(args, "s", &cstr)) + { + return NULL; + } + + NSSound* snd = [[NSSound alloc] initWithContentsOfFile: + [[NSString alloc] initWithUTF8String: cstr] + byReference: YES]; + if (!snd) + { + Py_INCREF(Py_None); + return Py_None; + } + + if (![snd play]) + { + Py_INCREF(Py_None); + return Py_None; + } + + GAJIM_POOL_FREE + + return Py_BuildValue("b", 1); +} + +static PyObject * nsapp_getBundlePath(PyObject *self, PyObject *args) +{ + GAJIM_POOL_ALLOC + + NSBundle* bundle = [NSBundle mainBundle]; + if (!bundle) + { + Py_INCREF(Py_None); + return Py_None; + } + + NSString* nspath = [bundle bundlePath]; + if (!nspath) + { + Py_INCREF(Py_None); + return Py_None; + } + + const char* path = [nspath UTF8String]; + PyObject* pypath = Py_BuildValue("s", path); + + GAJIM_POOL_FREE + + return pypath; +} + +static PyMethodDef nsappMethods[] = +{ + {"init", nsapp_init, METH_VARARGS, "init nsapp"}, + {"setNetworkCB", nsapp_setNetworkCB, METH_VARARGS, + "Callback to call when the network state changes"}, + {"getBundlePath", nsapp_getBundlePath, METH_VARARGS, + "Get the path to the bundle we were run from"}, + {"playFile", nsapp_playFile, METH_VARARGS, + "Play a sound file"}, + {"requestUserAttention", nsapp_requestUserAttention, METH_VARARGS, + "Sends a request for the users attention to the window manager"}, + {NULL, NULL, 0, NULL} +}; + +PyMODINIT_FUNC initnsapp(void) +{ + (void) Py_InitModule("nsapp", nsappMethods); +} diff --git a/src/osx/prep_py2app.py b/src/osx/prep_py2app.py new file mode 100644 index 000000000..dfe087d40 --- /dev/null +++ b/src/osx/prep_py2app.py @@ -0,0 +1,23 @@ +### Adjust the sys.path so that the site-packages.zip is before the lib-dynload +### so that the osx/__init__.py in the .zip is read before looking for it in the +### lib-dynload/osx dir where the .so's are. + +import sys + +py = -1 +lib_dyn = -1 +site_zip = -1 +for index in xrange(len(sys.path)): + if 'Contents/Resources' in sys.path[index]: + if sys.path[index].endswith('lib/python2.5'): + py = index + if sys.path[index].endswith('lib-dynload'): + lib_dyn = index + elif sys.path[index].endswith('site-packages.zip'): + site_zip = index +if ((lib_dyn > -1) and (site_zip > -1)): + tmp = sys.path[lib_dyn] + sys.path[lib_dyn] = sys.path[site_zip] + sys.path[site_zip] = tmp +if py > -1: + del sys.path[py] diff --git a/src/osx/setup.py b/src/osx/setup.py new file mode 100644 index 000000000..2eaeb1bb9 --- /dev/null +++ b/src/osx/setup.py @@ -0,0 +1,20 @@ +from distutils.core import setup, Extension + +setup( + name = 'Gajim', + version = '0.11', + description = 'A full featured Jabber client', + author = 'Gajim Development Team', + url = 'http://www.gajim.org/', + download_url = 'http://www.gajim.org/downloads.php', + license = 'GPL', + + ext_modules=[ + Extension('idle', ['idle.c'], + extra_compile_args=['-Wall'], + extra_link_args=['-framework', 'IOKit', '-framework', 'Carbon']), + Extension('nsapp', ['nsapp.m'], + extra_compile_args=['-Wall'], + extra_link_args=['-framework', 'AppKit', '-framework', 'Cocoa']), + ] +) diff --git a/src/osx/syncmenu/.deps/syncmenu_la-pysyncmenu.Plo b/src/osx/syncmenu/.deps/syncmenu_la-pysyncmenu.Plo new file mode 100644 index 000000000..9ce06a81e --- /dev/null +++ b/src/osx/syncmenu/.deps/syncmenu_la-pysyncmenu.Plo @@ -0,0 +1 @@ +# dummy diff --git a/src/osx/syncmenu/.deps/syncmenu_la-sync-menu.Plo b/src/osx/syncmenu/.deps/syncmenu_la-sync-menu.Plo new file mode 100644 index 000000000..9ce06a81e --- /dev/null +++ b/src/osx/syncmenu/.deps/syncmenu_la-sync-menu.Plo @@ -0,0 +1 @@ +# dummy diff --git a/src/osx/syncmenu/Makefile.am b/src/osx/syncmenu/Makefile.am new file mode 100644 index 000000000..d8ff94861 --- /dev/null +++ b/src/osx/syncmenu/Makefile.am @@ -0,0 +1,21 @@ +GTKPATH="/Library/Frameworks/GTK+.framework/Versions/Current/bin" + +export MACOSX_DEPLOYMENT_TARGET=10.4 +INCLUDES = $(PYTHON_INCLUDES) + +GTKLDFLAGS=`$(GTKPATH)/pkg-config --libs gtk+-2.0 pygobject-2.0` +GTKCFLAGS=`$(GTKPATH)/pkg-config --cflags gtk+-2.0 pygobject-2.0` + +if BUILD_COCOA +syncmenulib_LTLIBRARIES = syncmenu.la +syncmenulibdir = $(libdir)/gajim +syncmenu_la_SOURCES = sync-menu.c pysyncmenu.c +syncmenu_la_LDFLAGS = -module -avoid-version -Xcompiler -isysroot -Xcompiler /Developer/SDKs/MacOSX10.4u.sdk -Xcompiler -arch -Xcompiler ppc -Xcompiler -arch -Xcompiler i386 $(GTKLDFLAGS) +syncmenu_la_CFLAGS = -Xcompiler -isysroot -Xcompiler /Developer/SDKs/MacOSX10.4u.sdk -Xcompiler -arch -Xcompiler ppc -Xcompiler -arch -Xcompiler i386 $(GTKCFLAGS) -Wall -g $(INCLUDES) +endif + +DISTCLEANFILES = + +EXTRA_DIST = + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/osx/syncmenu/pysyncmenu.c b/src/osx/syncmenu/pysyncmenu.c new file mode 100644 index 000000000..d2e304f9f --- /dev/null +++ b/src/osx/syncmenu/pysyncmenu.c @@ -0,0 +1,55 @@ +#include +#include +#include +#include +#include "sync-menu.h" + + +PyDoc_STRVAR(pysync_menu_takeover_menu__doc__, +"Receives: a GtkMenuShell\n" +"Returns:\n"); + +static PyObject *pysync_menu_takeover_menu(PyObject *s, PyObject *args) +{ + PyObject *obj = NULL; + + if (!PyArg_ParseTuple(args, "O:GtkMenuShell", &obj)) + { + PyErr_SetString(PyExc_TypeError, "Failed to process parameter1"); + return NULL; + } + + Py_INCREF(obj); + + GtkMenuShell* menu = pyg_boxed_get(obj, GtkMenuShell); + if (!menu) + { + PyErr_SetString(PyExc_TypeError, "Failed to process parameter2"); + return NULL; + } + + sync_menu_takeover_menu(menu); + + Py_INCREF(Py_None); + return Py_None; +} + +static PyMethodDef syncmenuModuleMethods[] = +{ + {"takeover_menu", (PyCFunction)pysync_menu_takeover_menu, + METH_VARARGS, pysync_menu_takeover_menu__doc__}, + {NULL} +}; + +PyDoc_STRVAR(modsyncmenu__doc__, + "GTK+ Integration for the Mac OS X Menubar.\n"); + +void initsyncmenu(void) +{ + if (!Py_InitModule3("syncmenu", syncmenuModuleMethods, modsyncmenu__doc__)) + { + PyErr_SetString(PyExc_ImportError, + "Py_InitModule3(\"syncmenu\") failed"); + return; + } +} diff --git a/src/osx/syncmenu/setup.py b/src/osx/syncmenu/setup.py new file mode 100644 index 000000000..7b20709f9 --- /dev/null +++ b/src/osx/syncmenu/setup.py @@ -0,0 +1,27 @@ +from distutils.core import setup, Extension +import commands + + +retval, output = commands.getstatusoutput("pkg-config --cflags gtk+-2.0 pygtk-2.0") +if retval != 0: + print "Failed to find package details for gtk+-2.0" + print + print output + sys.exit(1) +cflags = output.strip().split() +retval, output = commands.getstatusoutput("pkg-config --libs gtk+-2.0 pygtk-2.0") +if retval != 0: + print "Failed to find package details for gtk+-2.0" + print + print output + sys.exit(1) +libs = output.strip().split() + + +setup(name='syncmenu', version='0.2', + author='James Newton', author_email='baron@codepunks.org', + ext_modules=[ + Extension('syncmenu', ['pysyncmenu.c', 'sync-menu.c'], + extra_link_args=libs + ['-framework', 'Carbon'], + extra_compile_args=['-Wall'] + cflags) + ]) diff --git a/src/osx/syncmenu/sync-menu.c b/src/osx/syncmenu/sync-menu.c new file mode 100644 index 000000000..f29685c29 --- /dev/null +++ b/src/osx/syncmenu/sync-menu.c @@ -0,0 +1,728 @@ +/* GTK+ Integration for the Mac OS X Menubar. + * + * Copyright (C) 2007 Pioneer Research Center USA, Inc. + * + * 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 "sync-menu.h" + + +/* TODO + * + * - Setup shortcuts, possibly transforming ctrl->cmd + * - Sync menus + * - Create on demand? (can this be done with gtk+? ie fill in menu items when the menu is opened) + * - Figure out what to do per app/window... + * - Toggle/radio items + * + */ + +#define GTK_QUARTZ_MENU_CREATOR 'GTKC' +#define GTK_QUARTZ_ITEM_WIDGET 'GWID' + + +static void sync_menu_shell (GtkMenuShell *menu_shell, + MenuRef carbon_menu, + gboolean toplevel); + + +/* + * utility functions + */ + +static GtkWidget * +find_menu_label (GtkWidget *widget) +{ + GtkWidget *label = NULL; + + if (GTK_IS_LABEL (widget)) + return widget; + + if (GTK_IS_CONTAINER (widget)) + { + GList *children; + GList *l; + + children = gtk_container_get_children (GTK_CONTAINER (widget)); + + for (l = children; l; l = l->next) + { + label = find_menu_label (l->data); + if (label) + break; + } + + g_list_free (children); + } + + return label; +} + +static const gchar * +get_menu_label_text (GtkWidget *menu_item, + GtkWidget **label) +{ + *label = find_menu_label (menu_item); + if (!*label) + return NULL; + + return gtk_label_get_text (GTK_LABEL (*label)); +} + +static gboolean +accel_find_func (GtkAccelKey *key, + GClosure *closure, + gpointer data) +{ + return (GClosure *) data == closure; +} + + +/* + * CarbonMenu functions + */ + +typedef struct +{ + MenuRef menu; +} CarbonMenu; + +static GQuark carbon_menu_quark = 0; + +static CarbonMenu * +carbon_menu_new (void) +{ + return g_slice_new0 (CarbonMenu); +} + +static void +carbon_menu_free (CarbonMenu *menu) +{ + g_slice_free (CarbonMenu, menu); +} + +static CarbonMenu * +carbon_menu_get (GtkWidget *widget) +{ + return g_object_get_qdata (G_OBJECT (widget), carbon_menu_quark); +} + +static void +carbon_menu_connect (GtkWidget *menu, + MenuRef menuRef) +{ + CarbonMenu *carbon_menu = carbon_menu_get (menu); + + if (!carbon_menu) + { + carbon_menu = carbon_menu_new (); + + g_object_set_qdata_full (G_OBJECT (menu), carbon_menu_quark, + carbon_menu, + (GDestroyNotify) carbon_menu_free); + } + + carbon_menu->menu = menuRef; +} + + +/* + * CarbonMenuItem functions + */ + +typedef struct +{ + MenuRef menu; + MenuItemIndex index; + MenuRef submenu; + GClosure *accel_closure; +} CarbonMenuItem; + +static GQuark carbon_menu_item_quark = 0; + +static CarbonMenuItem * +carbon_menu_item_new (void) +{ + return g_slice_new0 (CarbonMenuItem); +} + +static void +carbon_menu_item_free (CarbonMenuItem *menu_item) +{ + if (menu_item->accel_closure) + g_closure_unref (menu_item->accel_closure); + + g_slice_free (CarbonMenuItem, menu_item); +} + +static CarbonMenuItem * +carbon_menu_item_get (GtkWidget *widget) +{ + return g_object_get_qdata (G_OBJECT (widget), carbon_menu_item_quark); +} + +static void +carbon_menu_item_update_state (CarbonMenuItem *carbon_item, + GtkWidget *widget) +{ + gboolean sensitive; + gboolean visible; + UInt32 set_attrs = 0; + UInt32 clear_attrs = 0; + + g_object_get (widget, + "sensitive", &sensitive, + "visible", &visible, + NULL); + + if (!sensitive) + set_attrs |= kMenuItemAttrDisabled; + else + clear_attrs |= kMenuItemAttrDisabled; + + if (!visible) + set_attrs |= kMenuItemAttrHidden; + else + clear_attrs |= kMenuItemAttrHidden; + + ChangeMenuItemAttributes (carbon_item->menu, carbon_item->index, + set_attrs, clear_attrs); +} + +static void +carbon_menu_item_update_active (CarbonMenuItem *carbon_item, + GtkWidget *widget) +{ + gboolean active; + + g_object_get (widget, + "active", &active, + NULL); + + CheckMenuItem (carbon_item->menu, carbon_item->index, + active); +} + +static void +carbon_menu_item_update_submenu (CarbonMenuItem *carbon_item, + GtkWidget *widget) +{ + GtkWidget *submenu; + + submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget)); + + if (submenu) + { + GtkWidget *label = NULL; + + carbon_item->submenu = NULL; + GetMenuItemHierarchicalMenu(carbon_item->menu, carbon_item->index, + &carbon_item->submenu); + if (!carbon_item->submenu) + { + const gchar *label_text; + CFStringRef cfstr = NULL; + + label_text = get_menu_label_text (widget, &label); + if (label_text) + cfstr = CFStringCreateWithCString (NULL, label_text, + kCFStringEncodingUTF8); + CreateNewMenu (0, 0, &carbon_item->submenu); + SetMenuTitleWithCFString (carbon_item->submenu, cfstr); + SetMenuItemHierarchicalMenu (carbon_item->menu, carbon_item->index, + carbon_item->submenu); + if (cfstr) + CFRelease (cfstr); + } + + sync_menu_shell (GTK_MENU_SHELL (submenu), carbon_item->submenu, FALSE); + } + else + { + SetMenuItemHierarchicalMenu (carbon_item->menu, carbon_item->index, + NULL); + carbon_item->submenu = NULL; + } +} + +static void +carbon_menu_item_update_label (CarbonMenuItem *carbon_item, + GtkWidget *widget) +{ + GtkWidget *label; + const gchar *label_text; + CFStringRef cfstr = NULL; + + label_text = get_menu_label_text (widget, &label); + if (label_text) + cfstr = CFStringCreateWithCString (NULL, label_text, + kCFStringEncodingUTF8); + + SetMenuItemTextWithCFString (carbon_item->menu, carbon_item->index, + cfstr); + + if (cfstr) + CFRelease (cfstr); +} + +static void +carbon_menu_item_update_accelerator (CarbonMenuItem *carbon_item, + GtkWidget *widget) +{ + GtkWidget *label; + + get_menu_label_text (widget, &label); + + if (GTK_IS_ACCEL_LABEL (label) && + GTK_ACCEL_LABEL (label)->accel_closure) + { + GtkAccelKey *key; + + key = gtk_accel_group_find (GTK_ACCEL_LABEL (label)->accel_group, + accel_find_func, + GTK_ACCEL_LABEL (label)->accel_closure); + + if (key && + key->accel_key && + key->accel_flags & GTK_ACCEL_VISIBLE) + { + GdkDisplay *display = gtk_widget_get_display (widget); + GdkKeymap *keymap = gdk_keymap_get_for_display (display); + GdkKeymapKey *keys; + gint n_keys; + + if (gdk_keymap_get_entries_for_keyval (keymap, key->accel_key, + &keys, &n_keys)) + { + UInt8 modifiers = 0; + + SetMenuItemCommandKey (carbon_item->menu, carbon_item->index, + true, keys[0].keycode); + + g_free (keys); + + if (key->accel_mods) + { + if (key->accel_mods & GDK_SHIFT_MASK) + modifiers |= kMenuShiftModifier; + + if (key->accel_mods & GDK_MOD1_MASK) + modifiers |= kMenuOptionModifier; + } + + if (!(key->accel_mods & GDK_CONTROL_MASK)) + { + modifiers |= kMenuNoCommandModifier; + } + + SetMenuItemModifiers (carbon_item->menu, carbon_item->index, + modifiers); + + return; + } + } + } + + /* otherwise, clear the menu shortcut */ + SetMenuItemModifiers (carbon_item->menu, carbon_item->index, + kMenuNoModifiers | kMenuNoCommandModifier); + ChangeMenuItemAttributes (carbon_item->menu, carbon_item->index, + 0, kMenuItemAttrUseVirtualKey); + SetMenuItemCommandKey (carbon_item->menu, carbon_item->index, + false, 0); +} + +static void +carbon_menu_item_accel_changed (GtkAccelGroup *accel_group, + guint keyval, + GdkModifierType modifier, + GClosure *accel_closure, + GtkWidget *widget) +{ + CarbonMenuItem *carbon_item = carbon_menu_item_get (widget); + GtkWidget *label; + + get_menu_label_text (widget, &label); + + if (GTK_IS_ACCEL_LABEL (label) && + GTK_ACCEL_LABEL (label)->accel_closure == accel_closure) + carbon_menu_item_update_accelerator (carbon_item, widget); +} + +static void +carbon_menu_item_update_accel_closure (CarbonMenuItem *carbon_item, + GtkWidget *widget) +{ + GtkAccelGroup *group; + GtkWidget *label; + + get_menu_label_text (widget, &label); + + if (carbon_item->accel_closure) + { + group = gtk_accel_group_from_accel_closure (carbon_item->accel_closure); + if (group) + g_signal_handlers_disconnect_by_func (group, + carbon_menu_item_accel_changed, + widget); + + g_closure_unref (carbon_item->accel_closure); + carbon_item->accel_closure = NULL; + } + + if (GTK_IS_ACCEL_LABEL (label)) + carbon_item->accel_closure = GTK_ACCEL_LABEL (label)->accel_closure; + + if (carbon_item->accel_closure) + { + g_closure_ref (carbon_item->accel_closure); + + group = gtk_accel_group_from_accel_closure (carbon_item->accel_closure); + + g_signal_connect_object (group, "accel-changed", + G_CALLBACK (carbon_menu_item_accel_changed), + widget, 0); + } + + carbon_menu_item_update_accelerator (carbon_item, widget); +} + +static void +carbon_menu_item_notify (GObject *object, + GParamSpec *pspec, + CarbonMenuItem *carbon_item) +{ + if (!strcmp (pspec->name, "sensitive") || + !strcmp (pspec->name, "visible")) + { + carbon_menu_item_update_state (carbon_item, GTK_WIDGET (object)); + } + else if (!strcmp (pspec->name, "active")) + { + carbon_menu_item_update_active (carbon_item, GTK_WIDGET (object)); + } + else if (!strcmp (pspec->name, "submenu")) + { + carbon_menu_item_update_submenu (carbon_item, GTK_WIDGET (object)); + } +} + +static void +carbon_menu_item_notify_label (GObject *object, + GParamSpec *pspec, + gpointer data) +{ + CarbonMenuItem *carbon_item = carbon_menu_item_get (GTK_WIDGET (object)); + + if (!strcmp (pspec->name, "label")) + { + carbon_menu_item_update_label (carbon_item, + GTK_WIDGET (object)); + } + else if (!strcmp (pspec->name, "accel-closure")) + { + carbon_menu_item_update_accel_closure (carbon_item, + GTK_WIDGET (object)); + } +} + +static CarbonMenuItem * +carbon_menu_item_connect (GtkWidget *menu_item, + GtkWidget *label, + MenuRef menu, + MenuItemIndex index) +{ + CarbonMenuItem *carbon_item = carbon_menu_item_get (menu_item); + + if (!carbon_item) + { + carbon_item = carbon_menu_item_new (); + + g_object_set_qdata_full (G_OBJECT (menu_item), carbon_menu_item_quark, + carbon_item, + (GDestroyNotify) carbon_menu_item_free); + + g_signal_connect (menu_item, "notify", + G_CALLBACK (carbon_menu_item_notify), + carbon_item); + + if (label) + g_signal_connect_swapped (label, "notify::label", + G_CALLBACK (carbon_menu_item_notify_label), + menu_item); + } + + carbon_item->menu = menu; + carbon_item->index = index; + + return carbon_item; +} + +/* + * carbon event handler + */ + +gboolean menuitem_activate_wrapper(gpointer data) +{ + gtk_menu_item_activate((GtkMenuItem*)data); + return FALSE; +} + +static OSStatus +menu_event_handler_func (EventHandlerCallRef event_handler_call_ref, + EventRef event_ref, + void *data) +{ + UInt32 event_class = GetEventClass (event_ref); + UInt32 event_kind = GetEventKind (event_ref); + MenuRef menu_ref; + + switch (event_class) + { + case kEventClassCommand: + /* This is called when activating (is that the right GTK+ term?) + * a menu item. + */ + if (event_kind == kEventCommandProcess) + { + HICommand command; + OSStatus err; + + //g_print ("Menu: kEventClassCommand/kEventCommandProcess\n"); + + err = GetEventParameter (event_ref, kEventParamDirectObject, + typeHICommand, 0, + sizeof (command), 0, &command); + + if (err == noErr) + { + GtkWidget *widget = NULL; + + if (command.commandID == kHICommandQuit) + { + gtk_main_quit (); /* Just testing... */ + return noErr; + } + + /* Get any GtkWidget associated with the item. */ + err = GetMenuItemProperty (command.menu.menuRef, + command.menu.menuItemIndex, + GTK_QUARTZ_MENU_CREATOR, + GTK_QUARTZ_ITEM_WIDGET, + sizeof (widget), 0, &widget); + if (err == noErr && widget) + { + g_idle_add(menuitem_activate_wrapper, + (gpointer)GTK_MENU_ITEM (widget)); + return noErr; + } + } + } + break; + + case kEventClassMenu: + GetEventParameter (event_ref, + kEventParamDirectObject, + typeMenuRef, + NULL, + sizeof (menu_ref), + NULL, + &menu_ref); + + switch (event_kind) + { + case kEventMenuTargetItem: + /* This is called when an item is selected (what is the + * GTK+ term? prelight?) + */ + //g_print ("kEventClassMenu/kEventMenuTargetItem\n"); + break; + + case kEventMenuOpening: + /* Is it possible to dynamically build the menu here? We + * can at least set visibility/sensitivity. + */ + //g_print ("kEventClassMenu/kEventMenuOpening\n"); + break; + + case kEventMenuClosed: + //g_print ("kEventClassMenu/kEventMenuClosed\n"); + break; + + default: + break; + } + + break; + + default: + break; + } + + return CallNextEventHandler (event_handler_call_ref, event_ref); +} + +static void +setup_menu_event_handler (void) +{ + EventHandlerUPP menu_event_handler_upp; + EventHandlerRef menu_event_handler_ref; + const EventTypeSpec menu_events[] = { + { kEventClassCommand, kEventCommandProcess }, + { kEventClassMenu, kEventMenuTargetItem }, + { kEventClassMenu, kEventMenuOpening }, + { kEventClassMenu, kEventMenuClosed } + }; + + /* FIXME: We might have to install one per window? */ + + menu_event_handler_upp = NewEventHandlerUPP (menu_event_handler_func); + InstallEventHandler (GetApplicationEventTarget (), menu_event_handler_upp, + GetEventTypeCount (menu_events), menu_events, 0, + &menu_event_handler_ref); + +#if 0 + /* FIXME: Remove the handler with: */ + RemoveEventHandler(menu_event_handler_ref); + DisposeEventHandlerUPP(menu_event_handler_upp); +#endif +} + +static void +sync_menu_shell (GtkMenuShell *menu_shell, + MenuRef carbon_menu, + gboolean toplevel) +{ + GList *children; + GList *l; + MenuItemIndex carbon_index = 1; + + carbon_menu_connect (GTK_WIDGET (menu_shell), carbon_menu); + + children = gtk_container_get_children (GTK_CONTAINER (menu_shell)); + + UInt16 carbon_item_count = CountMenuItems(carbon_menu); + + for (l = children; l; l = l->next) + { + GtkWidget *menu_item = l->data; + CarbonMenuItem *carbon_item; + + if (GTK_IS_TEAROFF_MENU_ITEM (menu_item)) + continue; + + if (toplevel && g_object_get_data (G_OBJECT (menu_item), + "gtk-empty-menu-item")) + continue; + + GtkWidget *label = NULL; + const gchar *label_text = NULL; + + label_text = get_menu_label_text (menu_item, &label); + if (label_text && strcmp(label_text, "_SKIP_") == 0) + { + carbon_index++; + continue; + } + else if (!label_text) + label_text = ""; + + MenuItemAttributes attributes = 0; + if (GTK_IS_SEPARATOR_MENU_ITEM (menu_item)) + attributes |= kMenuItemAttrSeparator; + if (!GTK_WIDGET_IS_SENSITIVE (menu_item)) + attributes |= kMenuItemAttrDisabled; + if (!GTK_WIDGET_VISIBLE (menu_item)) + attributes |= kMenuItemAttrHidden; + + CFStringRef cfstr = CFStringCreateWithCString (NULL, label_text, + kCFStringEncodingUTF8); + if (carbon_index > carbon_item_count) + AppendMenuItemTextWithCFString(carbon_menu, cfstr, attributes, 0, + NULL); + else if (!toplevel && (carbon_index > carbon_item_count)) + InsertMenuItemTextWithCFString (carbon_menu, cfstr, + carbon_index, attributes, 0); + else + SetMenuItemTextWithCFString(carbon_menu, carbon_index, cfstr); + CFRelease (cfstr); + + MenuItemAttributes c_attributes = kMenuItemAttrSectionHeader | + kMenuItemAttrAutoDisable; + if (!(attributes & kMenuItemAttrDisabled)) + c_attributes |= kMenuItemAttrDisabled; + if (!(attributes & kMenuItemAttrSeparator)) + c_attributes |= kMenuItemAttrSeparator; + if (!(attributes & kMenuItemAttrHidden)) + c_attributes |= kMenuItemAttrHidden; + ChangeMenuItemAttributes(carbon_menu, carbon_index, + attributes, c_attributes); + SetMenuItemProperty (carbon_menu, carbon_index, + GTK_QUARTZ_MENU_CREATOR, + GTK_QUARTZ_ITEM_WIDGET, + sizeof (menu_item), &menu_item); + + carbon_item = carbon_menu_item_connect (menu_item, label, + carbon_menu, + carbon_index); + + if (GTK_IS_CHECK_MENU_ITEM (menu_item)) + carbon_menu_item_update_active (carbon_item, menu_item); + + carbon_menu_item_update_accel_closure (carbon_item, menu_item); + + if (gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item))) + carbon_menu_item_update_submenu (carbon_item, menu_item); + + carbon_index++; + } + + while (carbon_index <= carbon_item_count) + { + DeleteMenuItem (carbon_menu, carbon_index); + carbon_index++; + } + + g_list_free (children); +} + +void +sync_menu_takeover_menu (GtkMenuShell *menu_shell) +{ + static MenuRef carbon_menubar = NULL; + + g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell)); + + if (carbon_menu_quark == 0) + carbon_menu_quark = g_quark_from_static_string ("CarbonMenu"); + + if (carbon_menu_item_quark == 0) + carbon_menu_item_quark = g_quark_from_static_string ("CarbonMenuItem"); + + if (!carbon_menubar) + { + carbon_menubar = AcquireRootMenu(); + setup_menu_event_handler (); + } + + sync_menu_shell (menu_shell, carbon_menubar, TRUE); +} diff --git a/src/osx/syncmenu/sync-menu.h b/src/osx/syncmenu/sync-menu.h new file mode 100644 index 000000000..0715a31e2 --- /dev/null +++ b/src/osx/syncmenu/sync-menu.h @@ -0,0 +1,27 @@ +/* GTK+ Integration for the Mac OS X Menubar. + * + * Copyright (C) 2007 Pioneer Research Center USA, Inc. + * + * 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 + +G_BEGIN_DECLS + +void sync_menu_takeover_menu (GtkMenuShell *menu_shell); + +G_END_DECLS diff --git a/src/osx/syncmenu/test-menu.c b/src/osx/syncmenu/test-menu.c new file mode 100644 index 000000000..102ec5287 --- /dev/null +++ b/src/osx/syncmenu/test-menu.c @@ -0,0 +1,107 @@ +#include + +#include "sync-menu.h" + +GtkWidget *open_item; +GtkWidget *copy_item; + +static void +menu_item_activate_cb (GtkWidget *item, + gpointer user_data) +{ + gboolean visible; + gboolean sensitive; + + g_print ("Item activated: %s\n", (gchar *) user_data); + + g_object_get (G_OBJECT (copy_item), + "visible", &visible, + "sensitive", &sensitive, + NULL); + + if (item == open_item) { + gtk_widget_set_sensitive (copy_item, !sensitive); + /*g_object_set (G_OBJECT (copy_item), "visible", !visible, NULL);*/ + } +} + +static GtkWidget * +test_setup_menu (void) +{ + GtkWidget *menubar; + GtkWidget *menu; + GtkWidget *item; + + menubar = gtk_menu_bar_new (); + + item = gtk_menu_item_new_with_label ("File"); + gtk_menu_shell_append (GTK_MENU_SHELL (menubar), item); + menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), menu); + item = gtk_menu_item_new_with_label ("Open"); + open_item = item; + g_signal_connect (item, "activate", G_CALLBACK (menu_item_activate_cb), "open"); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + item = gtk_menu_item_new_with_label ("Quit"); + g_signal_connect (item, "activate", G_CALLBACK (menu_item_activate_cb), "quit"); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + + item = gtk_menu_item_new_with_label ("Edit"); + + gtk_menu_shell_append (GTK_MENU_SHELL (menubar), item); + menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), menu); + item = gtk_menu_item_new_with_label ("Copy"); + copy_item = item; + g_signal_connect (item, "activate", G_CALLBACK (menu_item_activate_cb), "copy"); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + item = gtk_menu_item_new_with_label ("Paste"); + g_signal_connect (item, "activate", G_CALLBACK (menu_item_activate_cb), "paste"); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + + item = gtk_menu_item_new_with_label ("Help"); + gtk_menu_shell_append (GTK_MENU_SHELL (menubar), item); + menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), menu); + item = gtk_menu_item_new_with_label ("About"); + g_signal_connect (item, "activate", G_CALLBACK (menu_item_activate_cb), "about"); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + + return menubar; +} + +int +main (int argc, char **argv) +{ + GtkWidget *window; + GtkWidget *vbox; + GtkWidget *menubar; + + gtk_init (&argc, &argv); + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); + g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER (window), vbox); + + menubar = test_setup_menu (); + gtk_box_pack_start (GTK_BOX (vbox), + menubar, + FALSE, TRUE, 0); + + gtk_box_pack_start (GTK_BOX (vbox), + gtk_label_new ("Some window content here"), + TRUE, TRUE, 0); + + gtk_widget_show_all (window); + + gtk_widget_hide (menubar); + + sync_menu_takeover_menu (GTK_MENU_SHELL (menubar)); + + gtk_main (); + + return 0; +} diff --git a/src/osx/syncmenu/test-menu.py b/src/osx/syncmenu/test-menu.py new file mode 100644 index 000000000..b9c4471c8 --- /dev/null +++ b/src/osx/syncmenu/test-menu.py @@ -0,0 +1,78 @@ +import gtk, syncmenu + + +open_item = None +copy_item = None + + +def menu_item_activate_cb(item, user_data): + global open_item, copy_item + print "Item activated: %s" % user_data + + #g_object_get (G_OBJECT (copy_item), + # "visible", &visible, + # "sensitive", &sensitive, + # NULL) + + #if (item == open_item) { + #gtk_widget_set_sensitive (copy_item, !sensitive) + #/*g_object_set (G_OBJECT (copy_item), "visible", !visible, NULL)*/ + + +def test_setup_menu(): + global open_item, copy_item + menubar = gtk.MenuBar() + + item = gtk.MenuItem("File") + menubar.append(item) + menu = gtk.Menu() + item.set_submenu(menu) + item = gtk.MenuItem("Open") + open_item = item + item.connect("activate", menu_item_activate_cb, "open") + menu.append(item) + item = gtk.MenuItem("Quit") + item.connect("activate", menu_item_activate_cb, "quit") + menu.append(item) + + item = gtk.MenuItem("Edit") + + menubar.append(item) + menu = gtk.Menu() + item.set_submenu(menu) + item = gtk.MenuItem("Copy") + copy_item = item + item.connect("activate", menu_item_activate_cb, "copy") + menu.append(item) + item = gtk.MenuItem("Paste") + item.connect("activate", menu_item_activate_cb, "paste") + menu.append(item) + + item = gtk.MenuItem("Help") + menubar.append(item) + menu = gtk.Menu() + item.set_submenu(menu) + item = gtk.MenuItem("About") + item.connect("activate", menu_item_activate_cb, "about") + menu.append(item) + + return menubar + + +window = gtk.Window(gtk.WINDOW_TOPLEVEL) +window.set_default_size(400, 300) +window.connect("destroy", gtk.main_quit, None) + +vbox = gtk.VBox(False, 0) +window.add(vbox) + +menubar = test_setup_menu() +vbox.pack_start(menubar, False, True, 0) +vbox.pack_start(gtk.Label("Some window content here"), True, True, 0) + +window.show_all() +menubar.hide() + +syncmenu.takeover_menu(menubar) + +gtk.main() diff --git a/src/profile_window.py b/src/profile_window.py index 94a4cde4f..8fa581d49 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -1,17 +1,22 @@ ## profile_window.py ## -## Copyright (C) 2003-2006 Yann Le Boulanger +## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## # THIS FILE IS FOR **OUR** PROFILE (when we edit our INFO) @@ -23,35 +28,11 @@ import os import gtkgui_helpers import dialogs +import vcard 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''' - if not isinstance(photo, dict): - return None, None, None - img_decoded = None - avatar_encoded = None - avatar_mime_type = None - if photo.has_key('BINVAL'): - img_encoded = photo['BINVAL'] - avatar_encoded = img_encoded - try: - img_decoded = base64.decodestring(img_encoded) - except: - pass - if img_decoded: - if photo.has_key('TYPE'): - avatar_mime_type = photo['TYPE'] - pixbuf = gtkgui_helpers.get_pixbuf_from_data(img_decoded) - else: - pixbuf, avatar_mime_type = gtkgui_helpers.get_pixbuf_from_data( - img_decoded, want_type=True) - else: - pixbuf = None - return pixbuf, avatar_encoded, avatar_mime_type class ProfileWindow: '''Class for our information window''' @@ -66,6 +47,7 @@ class ProfileWindow: self.account = account self.jid = gajim.get_jid_from_account(account) + self.dialog = None self.avatar_mime_type = None self.avatar_encoded = None self.message_id = self.statusbar.push(self.context_id, @@ -94,6 +76,8 @@ class ProfileWindow: if self.remove_statusbar_timeout_id is not None: gobject.source_remove(self.remove_statusbar_timeout_id) del gajim.interface.instances[self.account]['profile'] + if self.dialog: # Image chooser dialog + self.dialog.destroy() def on_profile_window_key_press_event(self, widget, event): if event.keyval == gtk.keysyms.Escape: @@ -156,6 +140,7 @@ class ProfileWindow: dialogs.ErrorDialog(_('Could not load image')) return self.dialog.destroy() + self.dialog = None button = self.xml.get_widget('PHOTO_button') image = button.get_image() image.set_from_pixbuf(pixbuf) @@ -173,10 +158,18 @@ class ProfileWindow: def on_clear(widget): self.dialog.destroy() + self.dialog = None self.on_clear_button_clicked(widget) - self.dialog = dialogs.AvatarChooserDialog(on_response_ok = on_ok, - on_response_clear = on_clear) + def on_cancel(widget): + self.dialog.destroy() + self.dialog = None + + if self.dialog: + self.dialog.present() + else: + self.dialog = dialogs.AvatarChooserDialog(on_response_ok = on_ok, + on_response_cancel = on_cancel, on_response_clear = on_clear) def on_PHOTO_button_press_event(self, widget, event): '''If right-clicked, show popup''' @@ -211,19 +204,19 @@ class ProfileWindow: except AttributeError: pass - def set_values(self, vcard): + def set_values(self, vcard_): button = self.xml.get_widget('PHOTO_button') image = button.get_image() text_button = self.xml.get_widget('NOPHOTO_button') - if not 'PHOTO' in vcard: + if not 'PHOTO' in vcard_: # set default image image.set_from_pixbuf(None) button.hide() text_button.show() - for i in vcard.keys(): + for i in vcard_.keys(): if i == 'PHOTO': pixbuf, self.avatar_encoded, self.avatar_mime_type = \ - get_avatar_pixbuf_encoded_mime(vcard[i]) + vcard.get_avatar_pixbuf_encoded_mime(vcard_[i]) if not pixbuf: image.set_from_pixbuf(None) button.hide() @@ -235,21 +228,21 @@ class ProfileWindow: text_button.hide() continue if i == 'ADR' or i == 'TEL' or i == 'EMAIL': - for entry in vcard[i]: + for entry in vcard_[i]: add_on = '_HOME' if 'WORK' in entry: add_on = '_WORK' for j in entry.keys(): self.set_value(i + add_on + '_' + j + '_entry', entry[j]) - if isinstance(vcard[i], dict): - for j in vcard[i].keys(): - self.set_value(i + '_' + j + '_entry', vcard[i][j]) + if isinstance(vcard_[i], dict): + for j in vcard_[i].keys(): + self.set_value(i + '_' + j + '_entry', vcard_[i][j]) else: if i == 'DESC': self.xml.get_widget('DESC_textview').get_buffer().set_text( - vcard[i], 0) + vcard_[i], 0) else: - self.set_value(i + '_entry', vcard[i]) + 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) @@ -262,10 +255,10 @@ class ProfileWindow: self.progressbar.set_fraction(0) self.update_progressbar_timeout_id = None - def add_to_vcard(self, vcard, entry, txt): + def add_to_vcard(self, vcard_, entry, txt): '''Add an information to the vCard dictionary''' entries = entry.split('_') - loc = vcard + loc = vcard_ if len(entries) == 3: # We need to use lists if not loc.has_key(entries[0]): loc[entries[0]] = [] @@ -278,14 +271,14 @@ class ProfileWindow: e[entries[2]] = txt else: loc[entries[0]].append({entries[1]: '', entries[2]: txt}) - return vcard + return vcard_ while len(entries) > 1: if not loc.has_key(entries[0]): loc[entries[0]] = {} loc = loc[entries[0]] del entries[0] loc[entries[0]] = txt - return vcard + return vcard_ def make_vcard(self): '''make the vCard dictionary''' @@ -296,11 +289,11 @@ class ProfileWindow: 'ORG_ORGUNIT', 'TITLE', 'ROLE', 'TEL_WORK_NUMBER', 'EMAIL_WORK_USERID', 'ADR_WORK_STREET', 'ADR_WORK_EXTADR', 'ADR_WORK_LOCALITY', 'ADR_WORK_REGION', 'ADR_WORK_PCODE', 'ADR_WORK_CTRY'] - vcard = {} + vcard_ = {} for e in entries: txt = self.xml.get_widget(e + '_entry').get_text().decode('utf-8') if txt != '': - vcard = self.add_to_vcard(vcard, e, txt) + vcard_ = self.add_to_vcard(vcard_, e, txt) # DESC textview buff = self.xml.get_widget('DESC_textview').get_buffer() @@ -308,14 +301,14 @@ class ProfileWindow: end_iter = buff.get_end_iter() txt = buff.get_text(start_iter, end_iter, 0) if txt != '': - vcard['DESC'] = txt.decode('utf-8') + vcard_['DESC'] = txt.decode('utf-8') # Avatar if self.avatar_encoded: - vcard['PHOTO'] = {'BINVAL': self.avatar_encoded} + vcard_['PHOTO'] = {'BINVAL': self.avatar_encoded} if self.avatar_mime_type: - vcard['PHOTO']['TYPE'] = self.avatar_mime_type - return vcard + vcard_['PHOTO']['TYPE'] = self.avatar_mime_type + return vcard_ def on_ok_button_clicked(self, widget): if self.update_progressbar_timeout_id: @@ -326,14 +319,14 @@ class ProfileWindow: _('Without a connection you can not publish your contact ' 'information.')) return - vcard = self.make_vcard() + vcard_ = self.make_vcard() nick = '' - if vcard.has_key('NICKNAME'): - nick = vcard['NICKNAME'] + if vcard_.has_key('NICKNAME'): + nick = vcard_['NICKNAME'] if nick == '': nick = gajim.config.get_per('accounts', self.account, 'name') gajim.nicks[self.account] = nick - gajim.connections[self.account].send_vcard(vcard) + gajim.connections[self.account].send_vcard(vcard_) self.message_id = self.statusbar.push(self.context_id, _('Sending profile...')) self.progressbar.show() diff --git a/src/remote_control.py b/src/remote_control.py index e6712e8b5..3bde37b72 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -1,21 +1,26 @@ ## remote_control.py ## -## Copyright (C) 2005-2006 Yann Le Boulanger +## Copyright (C) 2005-2006 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005-2006 Dimitur Kirov ## Copyright (C) 2005-2006 Andrew Sayman ## Copyright (C) 2007 Lukas Petrovicky ## Copyright (C) 2007 Julien Pivotto ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 gobject import os @@ -434,11 +439,11 @@ class SignalObject(dbus.service.Object): 'accounts', con.name, 'resource'))) return result - @dbus.service.method(INTERFACE, in_signature='s', out_signature='av') + @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''' - result = dbus.Array([], signature='a{sv}') + result = dbus.Array([], signature='aa{sv}') accounts = gajim.contacts.get_accounts() if len(accounts) == 0: return result diff --git a/src/roster_window.py b/src/roster_window.py index 474f07dbc..0ccc12967 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1,26 +1,33 @@ # -*- coding: utf-8 -*- ## roster_window.py ## -## Copyright (C) 2003-2006 Yann Le Boulanger +## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2005-2007 Nikos Kouremenos ## Copyright (C) 2005-2006 Dimitur Kirov ## Copyright (C) 2007 Lukas Petrovicky ## Copyright (C) 2007 Julien Pivotto +## Copyright (C) 2007 Stephan Erb ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 pango import gobject import os +import sys import time import urllib @@ -53,6 +60,12 @@ from common import dbus_support if dbus_support.supported: from music_track_listener import MusicTrackListener import dbus +from lastfm_track_listener import LastFMTrackListener + +import sys +if sys.platform == 'darwin': + from osx import syncmenu + #(icon, name, type, jid, account, editable, second pixbuf) ( @@ -272,7 +285,8 @@ class RosterWindow: if len(self.get_contact_iter(jid, account)): return if jid == gajim.get_jid_from_account(account): - self.add_self_contact(account) + if contact.resource != gajim.connections[account].server_resource: + self.add_self_contact(account) return if gajim.jid_is_transport(contact.jid): # if jid is transport, check if we wanna show it in roster @@ -332,6 +346,7 @@ class RosterWindow: model.append(i, (None, name, 'contact', jid, account, None)) self.draw_contact(jid, account) self.draw_avatar(jid, account) + self.draw_account(account) # Redraw parent to change icon self.draw_contact(big_brother_jid, big_brother_account) return @@ -390,6 +405,7 @@ class RosterWindow: self.tree.expand_row(model.get_path(iterG), False) self.draw_contact(jid, account) self.draw_avatar(jid, account) + self.draw_account(account) # put the children under this iter for data in shown_family: contacts = gajim.contacts.get_contacts(data['account'], @@ -749,13 +765,14 @@ class RosterWindow: for iter in iters: model[iter][C_SECPIXBUF] = scaled_pixbuf - def join_gc_room(self, account, room_jid, nick, password, minimize = False): + def join_gc_room(self, account, room_jid, nick, password, minimize=False, + is_continued=False): '''joins the room immediatelly''' if gajim.interface.msg_win_mgr.has_window(room_jid, account) and \ gajim.gc_connected[account][room_jid]: - win = gajim.interface.msg_win_mgr.get_window(room_jid, account) + win = gajim.interface.msg_win_mgr.get_window(room_jid, account) win.window.present() - win.set_active_tab(room_jid, account) + win.set_active_tab(room_jid, account) dialogs.ErrorDialog(_('You are already in group chat %s') % room_jid) return minimized_control_exists = False @@ -778,7 +795,7 @@ class RosterWindow: return if not minimized_control_exists and \ not gajim.interface.msg_win_mgr.has_window(room_jid, account): - self.new_room(room_jid, nick, account) + self.new_room(room_jid, nick, account, is_continued=is_continued) if not minimized_control_exists: gc_win = gajim.interface.msg_win_mgr.get_window(room_jid, account) gc_win.set_active_tab(room_jid, account) @@ -821,13 +838,6 @@ class RosterWindow: gajim.interface.instances[account]['privacy_lists'] = \ dialogs.PrivacyListsWindow(account) - def on_blocked_contacts_menuitem_activate(self, widget, account): - if gajim.interface.instances[account].has_key('blocked_contacts'): - gajim.interface.instances[account]['blocked_contacts'].window.present() - else: - gajim.interface.instances[account]['blocked_contacts'] = \ - dialogs.BlockedContactsWindow(account) - def on_set_motd_menuitem_activate(self, widget, account): server = gajim.config.get_per('accounts', account, 'hostname') server += '/announce/motd' @@ -857,10 +867,7 @@ class RosterWindow: xml = gtkgui_helpers.get_glade('advanced_menuitem_menu.glade') advanced_menuitem_menu = xml.get_widget('advanced_menuitem_menu') - send_single_message_menuitem = xml.get_widget( - 'send_single_message_menuitem') xml_console_menuitem = xml.get_widget('xml_console_menuitem') - blocked_contacts_menuitem = xml.get_widget('blocked_contacts_menuitem') privacy_lists_menuitem = xml.get_widget('privacy_lists_menuitem') administrator_menuitem = xml.get_widget('administrator_menuitem') send_server_message_menuitem = xml.get_widget( @@ -874,25 +881,18 @@ class RosterWindow: if gajim.connections[account] and gajim.connections[account].\ privacy_rules_supported: - blocked_contacts_menuitem.connect('activate', - self.on_blocked_contacts_menuitem_activate, account) privacy_lists_menuitem.connect('activate', self.on_privacy_lists_menuitem_activate, account) else: - blocked_contacts_menuitem.set_sensitive(False) privacy_lists_menuitem.set_sensitive(False) if gajim.connections[account].is_zeroconf: - send_single_message_menuitem.set_sensitive(False) administrator_menuitem.set_sensitive(False) send_server_message_menuitem.set_sensitive(False) set_motd_menuitem.set_sensitive(False) update_motd_menuitem.set_sensitive(False) delete_motd_menuitem.set_sensitive(False) else: - send_single_message_menuitem.connect('activate', - self.on_send_single_message_menuitem_activate, account) - send_server_message_menuitem.connect('activate', self.on_send_server_message_menuitem_activate, account) @@ -909,11 +909,20 @@ class RosterWindow: return advanced_menuitem_menu - def make_menu(self): - '''create the main window's menus''' - if not self.actions_menu_needs_rebuild: + def set_actions_menu_needs_rebuild(self): + self.actions_menu_needs_rebuild = True + # Force the rebuild now since the on_activates on the menu itself does + # not work with the os/x top level menubar + if sys.platform == 'darwin': + self.make_menu(force = True) + return + + def make_menu(self, force = False): + '''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') + single_message_menuitem = self.xml.get_widget('send_single_message_menuitem') join_gc_menuitem = self.xml.get_widget('join_gc_menuitem') muc_icon = self.load_icon('muc_active') if muc_icon: @@ -951,11 +960,21 @@ class RosterWindow: self.pep_services_menuitem_handler_id) self.pep_services_menuitem_handler_id = None + if self.single_message_menuitem_handler_id: + single_message_menuitem.handler_disconnect( + self.single_message_menuitem_handler_id) + self.single_message_menuitem_handler_id = None + + if self.profile_avatar_menuitem_handler_id: + profile_avatar_menuitem.handler_disconnect( + self.profile_avatar_menuitem_handler_id) + self.profile_avatar_menuitem_handler_id = None # remove the existing submenus add_new_contact_menuitem.remove_submenu() service_disco_menuitem.remove_submenu() join_gc_menuitem.remove_submenu() + single_message_menuitem.remove_submenu() new_chat_menuitem.remove_submenu() advanced_menuitem.remove_submenu() profile_avatar_menuitem.remove_submenu() @@ -972,10 +991,14 @@ class RosterWindow: join_gc_menuitem.set_submenu(gc_sub_menu) connected_accounts = gajim.get_number_of_connected_accounts() + + connected_accounts_with_private_storage = 0 + if connected_accounts > 1: # 2 or more accounts? make submenus add_sub_menu = gtk.Menu() disco_sub_menu = gtk.Menu() new_chat_sub_menu = gtk.Menu() + single_message_sub_menu = gtk.Menu() accounts_list = gajim.contacts.get_accounts() accounts_list.sort() @@ -989,21 +1012,27 @@ class RosterWindow: False) new_chat_sub_menu.append(new_chat_item) new_chat_item.connect('activate', - self.on_new_chat_menuitem_activate, account) + self.on_new_chat_menuitem_activate, account) if gajim.config.get_per('accounts', account, 'is_zeroconf'): continue + + # single message + single_message_item = gtk.MenuItem(_('using account %s') % account, + False) + single_message_sub_menu.append(single_message_item) + single_message_item.connect('activate', + self.on_send_single_message_menuitem_activate, account) # join gc + if gajim.connections[account].private_storage_supported: + connected_accounts_with_private_storage += 1 gc_item = gtk.MenuItem(_('using account %s') % account, False) gc_sub_menu.append(gc_item) gc_menuitem_menu = gtk.Menu() self.add_bookmarks_list(gc_menuitem_menu, account) gc_item.set_submenu(gc_menuitem_menu) - # the 'manage gc bookmarks' item is shown - # below to avoid duplicate code - # add add_item = gtk.MenuItem(_('to %s account') % account, False) add_sub_menu.append(add_item) @@ -1015,20 +1044,24 @@ class RosterWindow: disco_item.connect('activate', self.on_service_disco_menuitem_activate, account) - add_new_contact_menuitem.set_submenu(add_sub_menu) add_sub_menu.show_all() service_disco_menuitem.set_submenu(disco_sub_menu) disco_sub_menu.show_all() new_chat_menuitem.set_submenu(new_chat_sub_menu) new_chat_sub_menu.show_all() + single_message_menuitem.set_submenu(single_message_sub_menu) + single_message_sub_menu.show_all() gc_sub_menu.show_all() elif connected_accounts == 1: # user has only one account for account in gajim.connections: if gajim.account_is_connected(account): # THE connected account # gc + if gajim.connections[account].private_storage_supported: + connected_accounts_with_private_storage += 1 self.add_bookmarks_list(gc_sub_menu, account) + gc_sub_menu.show_all() # add if not self.add_new_contact_handler_id: self.add_new_contact_handler_id =\ @@ -1044,6 +1077,13 @@ class RosterWindow: self.new_chat_menuitem_handler_id = new_chat_menuitem.\ connect('activate', self.on_new_chat_menuitem_activate, account) + + # single message + if not self.single_message_menuitem_handler_id: + self.single_message_menuitem_handler_id = \ + single_message_menuitem.connect('activate', \ + self.on_send_single_message_menuitem_activate, account) + # new chat accel if not self.have_new_chat_accel: ag = gtk.accel_groups_from_object(self.window)[0] @@ -1056,26 +1096,39 @@ class RosterWindow: if connected_accounts == 0: # no connected accounts, make the menuitems insensitive for item in [new_chat_menuitem, join_gc_menuitem,\ - add_new_contact_menuitem, service_disco_menuitem]: + add_new_contact_menuitem, service_disco_menuitem,\ + single_message_menuitem]: item.set_sensitive(False) else: # we have one or more connected accounts for item in [new_chat_menuitem, join_gc_menuitem,\ - add_new_contact_menuitem, service_disco_menuitem]: + add_new_contact_menuitem, service_disco_menuitem,\ + single_message_menuitem]: item.set_sensitive(True) - # disable some fields if only local account is there if connected_accounts == 1: for account in gajim.connections: if gajim.account_is_connected(account) and \ gajim.connections[account].is_zeroconf: for item in [join_gc_menuitem,\ - add_new_contact_menuitem, service_disco_menuitem]: + add_new_contact_menuitem, service_disco_menuitem, + single_message_menuitem]: item.set_sensitive(False) + if connected_accounts_with_private_storage > 0: + # At least one account with private storage support # show the 'manage gc bookmarks' item 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', + self.on_manage_bookmarks_menuitem_activate) + gc_sub_menu.append(newitem) + gc_sub_menu.show_all() + connected_accounts_with_vcard = [] for account in gajim.connections: if gajim.account_is_connected(account) and \ @@ -1129,15 +1182,6 @@ class RosterWindow: profile_avatar_menuitem.set_sensitive(True) pep_services_menuitem.set_sensitive(True) - 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', - self.on_manage_bookmarks_menuitem_activate) - gc_sub_menu.append(newitem) - gc_sub_menu.show_all() - # Advanced Actions if len(gajim.connections) == 0: # user has no accounts advanced_menuitem.set_sensitive(False) @@ -1170,6 +1214,9 @@ class RosterWindow: advanced_menuitem.set_submenu(advanced_sub_menu) advanced_sub_menu.show_all() + if sys.platform == 'darwin': + syncmenu.takeover_menu(self.xml.get_widget('menubar')) + self.actions_menu_needs_rebuild = False def _add_history_manager_menuitem(self, menu): @@ -1237,10 +1284,15 @@ class RosterWindow: '''reads from db the unread messages, and fire them up''' for jid in gajim.contacts.get_jid_list(account): results = gajim.logger.get_unread_msgs_for_jid(jid) + + # XXX unread messages should probably have their session saved with them + if results: + session = gajim.connections[account].make_new_session(jid) + for result in results: tim = time.localtime(float(result[2])) self.on_message(jid, result[1], tim, account, msg_type = 'chat', - msg_id = result[0]) + msg_id = result[0], session = session) def fill_contacts_and_groups_dicts(self, array, account): '''fill gajim.contacts and gajim.groups''' @@ -1248,6 +1300,8 @@ class RosterWindow: gajim.contacts.add_account(account) if not gajim.groups.has_key(account): gajim.groups[account] = {} + # Empty contact list + gajim.contacts.clear_contacts(account) for jid in array.keys(): jids = jid.split('/') #get jid @@ -1350,6 +1404,11 @@ class RosterWindow: ctrl.print_conversation(_('%s is now %s') % (name, uf_show), 'status') + # unset custom status + if gajim.interface.status_sent_to_users.has_key(account) and \ + contact.jid in gajim.interface.status_sent_to_users[account]: + del gajim.interface.status_sent_to_users[account][contact.jid] + if not contact.groups: self.draw_group(_('General'), account) else: @@ -1468,9 +1527,10 @@ class RosterWindow: name = account_name, show = connection.get_status(), sub = '', status = connection.status, resource = connection.server_resource, - priority = connection.priority, - keyID = gajim.config.get_per('accounts', connection.name, - 'keyid')) + priority = connection.priority) + if gajim.connections[account].gpg: + contact.keyID = gajim.config.get_per('accounts', connection.name, + 'keyid') contacts.append(contact) # if we're online ... if connection.connection: @@ -1481,6 +1541,14 @@ class RosterWindow: resources = roster.getResources(jid) # ...get the contact info for our other online resources for resource in resources: + # Check if we already have this resource + found = False + for contact_ in contacts: + if contact_.resource == resource: + found = True + break + if found: + continue show = roster.getShow(jid+'/'+resource) if not show: show = 'online' @@ -1517,8 +1585,7 @@ class RosterWindow: gajim.contacts.remove_contact(account, contact) return - def remove(widget, list_): - self.dialog.destroy() + def remove(list_): for (contact, account) in list_: full_jid = contact.get_full_jid() gajim.connections[account].unsubscribe_agent(full_jid) @@ -1550,7 +1617,7 @@ class RosterWindow: jids = jids[:-1] + '.' sectext = _('You will no longer be able to send and receive messages ' 'to contacts from these transports:%s') % jids - self.dialog = dialogs.ConfirmationDialog(pritext, sectext, + dialogs.ConfirmationDialog(pritext, sectext, on_response_ok = (remove, list_)) def on_block(self, widget, iter, group_list): @@ -1564,7 +1631,7 @@ class RosterWindow: accounts.append(account) self.send_status(account, 'offline', msg, to = jid) new_rule = {'order': u'1', 'type': u'jid', 'action': u'deny', - 'value' : jid, 'child': [u'message', u'iq', u'presence-out']} + 'value' : jid, 'child': [u'message', u'iq', u'presence-out']} gajim.connections[account].blocked_list.append(new_rule) # needed for draw_contact: gajim.connections[account].blocked_contacts.append(jid) @@ -1578,8 +1645,8 @@ class RosterWindow: accounts.append(account) self.send_status(account, 'offline', msg, to=contact.jid) new_rule = {'order': u'1', 'type': u'jid', - 'action': u'deny', 'value' : contact.jid, - 'child': [u'message', u'iq', u'presence-out']} + 'action': u'deny', 'value' : contact.jid, + 'child': [u'message', u'iq', u'presence-out']} gajim.connections[account].blocked_list.append(new_rule) # needed for draw_contact: gajim.connections[account].blocked_contacts.append(contact.jid) @@ -1597,7 +1664,7 @@ class RosterWindow: self.send_status(account, 'offline', msg, to=contact.jid) self.draw_contact(contact.jid, account) new_rule = {'order': u'1', 'type': u'group', 'action': u'deny', - 'value' : group, 'child': [u'message', u'iq', u'presence-out']} + 'value' : group, 'child': [u'message', u'iq', u'presence-out']} gajim.connections[account].blocked_list.append(new_rule) for account in accounts: gajim.connections[account].set_privacy_list( @@ -1883,7 +1950,7 @@ class RosterWindow: try: pixbuf = gtk.gdk.pixbuf_new_from_file(path_to_file) if filesize > 16384: # 16 kb - # get the image at 'notification size' + # get the image at 'tooltip size' # and hope that user did not specify in ACE crazy size pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'tooltip') except gobject.GError, msg: # unknown format @@ -1891,21 +1958,14 @@ class RosterWindow: msg = str(msg) dialogs.ErrorDialog(_('Could not load image'), msg) return - puny_jid = helpers.sanitize_filename(contact.jid) - path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + '_local.png' - pixbuf.save(path_to_file, 'png') + gajim.interface.save_avatar_files(contact.jid, pixbuf, local = True) dlg.destroy() self.update_avatar_in_gui(contact.jid, account) def on_clear(widget): dlg.destroy() # Delete file: - puny_jid = helpers.sanitize_filename(contact.jid) - path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + '_local.png' - try: - os.remove(path_to_file) - except OSError: - gajim.log.debug('Cannot remove %s' % path_to_file) + gajim.interface.remove_avatar_files(contact.jid, local = True) self.update_avatar_in_gui(contact.jid, account) dlg = dialogs.AvatarChooserDialog(on_response_ok = on_ok, @@ -1917,10 +1977,11 @@ class RosterWindow: def on_history(self, widget, contact, account): '''When history menuitem is activated: call log window''' - if gajim.interface.instances['logs'].has_key(contact.jid): - gajim.interface.instances['logs'][contact.jid].window.present() + if gajim.interface.instances.has_key('logs'): + gajim.interface.instances['logs'].window.present() + gajim.interface.instances['logs'].open_history(contact.jid, account) else: - gajim.interface.instances['logs'][contact.jid] = history_window.\ + gajim.interface.instances['logs'] = history_window.\ HistoryWindow(contact.jid, account) def on_disconnect(self, widget, jid, account): @@ -1950,7 +2011,8 @@ class RosterWindow: jid += '/' + contact.resource dialogs.SingleMessageWindow(account, jid, 'send') - def on_send_file_menuitem_activate(self, widget, account, contact): + def on_send_file_menuitem_activate(self, widget, contact, account, + resource=None): gajim.interface.instances['file_transfers'].show_file_send_request( account, contact) @@ -1958,7 +2020,7 @@ class RosterWindow: dialogs.AddSpecialNotificationDialog(jid) def make_contact_menu(self, event, iter): - '''Make contact's popup menu''' + '''Make contact\'s popup menu''' model = self.tree.get_model() jid = model[iter][C_JID].decode('utf-8') tree_path = model.get_path(iter) @@ -1967,7 +2029,8 @@ class RosterWindow: contact = gajim.contacts.get_contact_with_highest_priority(account, jid) if not contact: return - + + # Zeroconf Account if gajim.config.get_per('accounts', account, 'is_zeroconf'): xml = gtkgui_helpers.get_glade('zeroconf_contact_context_menu.glade') zeroconf_contact_context_menu = xml.get_widget( @@ -1976,8 +2039,6 @@ class RosterWindow: start_chat_menuitem = xml.get_widget('start_chat_menuitem') rename_menuitem = xml.get_widget('rename_menuitem') edit_groups_menuitem = xml.get_widget('edit_groups_menuitem') - # separator has with send file, assign_openpgp_key_menuitem, etc.. - above_send_file_separator = xml.get_widget('above_send_file_separator') send_file_menuitem = xml.get_widget('send_file_menuitem') assign_openpgp_key_menuitem = xml.get_widget( 'assign_openpgp_key_menuitem') @@ -1995,7 +2056,6 @@ class RosterWindow: above_information_separator = xml.get_widget( 'above_information_separator') - # skip a separator information_menuitem = xml.get_widget('information_menuitem') history_menuitem = xml.get_widget('history_menuitem') @@ -2024,10 +2084,9 @@ class RosterWindow: if contact.resource: send_file_menuitem.connect('activate', - self.on_send_file_menuitem_activate, account, contact) - else: # if we do not have resource we cannot send file - send_file_menuitem.hide() - send_file_menuitem.set_no_show_all(True) + self.on_send_file_menuitem_activate, contact, account) + else: # if we do no have resource we cannot do much + send_file_menuitem.set_sensitive(False) rename_menuitem.connect('activate', self.on_rename, iter, tree_path) if contact.show in ('offline', 'error'): @@ -2046,18 +2105,16 @@ class RosterWindow: edit_groups_menuitem.connect('activate', self.on_edit_groups, [( contact,account)]) - if gajim.config.get('usegpg'): + if gajim.connections[account].gpg: assign_openpgp_key_menuitem.connect('activate', self.on_assign_pgp_key, contact, account) + else: + assign_openpgp_key_menuitem.set_sensitive(False) else: # contact is in group 'Not in Roster' - edit_groups_menuitem.hide() + edit_groups_menuitem.set_sensitive(False) edit_groups_menuitem.set_no_show_all(True) - # hide first of the two consecutive separators - above_send_file_separator.hide() - above_send_file_separator.set_no_show_all(True) - assign_openpgp_key_menuitem.hide() - assign_openpgp_key_menuitem.set_no_show_all(True) + assign_openpgp_key_menuitem.set_sensitive(False) # Remove many items when it's self contact row if our_jid: @@ -2098,8 +2155,6 @@ class RosterWindow: unblock_menuitem = xml.get_widget('unblock_menuitem') rename_menuitem = xml.get_widget('rename_menuitem') edit_groups_menuitem = xml.get_widget('edit_groups_menuitem') - # separator has with send file, assign_openpgp_key_menuitem, etc.. - above_send_file_separator = xml.get_widget('above_send_file_separator') send_file_menuitem = xml.get_widget('send_file_menuitem') assign_openpgp_key_menuitem = xml.get_widget( 'assign_openpgp_key_menuitem') @@ -2130,8 +2185,9 @@ class RosterWindow: jid in gajim.interface.status_sent_to_users[account]: send_custom_status_menuitem.set_image( self.load_icon(gajim.interface.status_sent_to_users[account][jid])) - else: - send_custom_status_menuitem.set_image(None) + else: + icon = gtk.image_new_from_stock(gtk.STOCK_NETWORK, gtk.ICON_SIZE_MENU) + send_custom_status_menuitem.set_image(icon) if not our_jid: # add a special img for rename menuitem @@ -2145,8 +2201,7 @@ class RosterWindow: if muc_icon: invite_menuitem.set_image(muc_icon) - above_subscription_separator = xml.get_widget( - 'above_subscription_separator') + # Subscription submenu subscription_menuitem = xml.get_widget('subscription_menuitem') send_auth_menuitem, ask_auth_menuitem, revoke_auth_menuitem =\ subscription_menuitem.get_submenu().get_children() @@ -2154,7 +2209,6 @@ class RosterWindow: remove_from_roster_menuitem = xml.get_widget( 'remove_from_roster_menuitem') - # skip a separator information_menuitem = xml.get_widget('information_menuitem') history_menuitem = xml.get_widget('history_menuitem') @@ -2169,7 +2223,7 @@ class RosterWindow: contact_transport = gajim.get_transport_name_from_jid(contact.jid) t = contact_transport or 'jabber' # transform None in 'jabber' if not gajim.connections[account].muc_jid.has_key(t): - invite_to_new_room_menuitem.set_sensitive(False) + invite_menuitem.set_sensitive(False) invite_to_submenu.append(invite_to_new_room_menuitem) rooms = [] # a list of (room_jid, account) tuple for gc_control in gajim.interface.msg_win_mgr.get_controls( @@ -2201,7 +2255,7 @@ class RosterWindow: status_menuitems.append(status_menuitem) if len(contacts) > 1: # several resources def resources_submenu(action, room_jid = None, room_account = None): - ''' Build a submenu with contact's resources. + ''' Build a submenu with contact\'s resources. room_jid and room_account are for action self.on_invite_to_room ''' sub_menu = gtk.Menu() @@ -2229,6 +2283,8 @@ class RosterWindow: start_chat_menuitem.set_submenu(resources_submenu( self.on_open_chat_window)) + send_file_menuitem.set_submenu(resources_submenu( + self.on_send_file_menuitem_activate)) execute_command_menuitem.set_submenu(resources_submenu( self.on_execute_command)) invite_to_new_room_menuitem.set_submenu(resources_submenu( @@ -2242,15 +2298,8 @@ class RosterWindow: else: # one resource start_chat_menuitem.connect('activate', self.on_open_chat_window, contact, account) - # we cannot execute commands when the resource is unknown - # TODO: that's true only if the entity is a contact, - # TODO: we need to show this also for transports - if contact.resource: - execute_command_menuitem.connect('activate', - self.on_execute_command, contact, account, contact.resource) - else: - execute_command_menuitem.hide() - execute_command_menuitem.set_no_show_all(True) + execute_command_menuitem.connect('activate', self.on_execute_command, + contact, account, contact.resource) our_jid_other_resource = None if our_jid: @@ -2268,12 +2317,11 @@ class RosterWindow: our_jid_other_resource) invite_to_submenu.append(menuitem) - if contact.resource: - send_file_menuitem.connect('activate', - self.on_send_file_menuitem_activate, account, contact) - else: # if we do not have resource we cannot send file - send_file_menuitem.hide() - send_file_menuitem.set_no_show_all(True) + if contact.resource: + send_file_menuitem.connect('activate', + self.on_send_file_menuitem_activate, contact, account) + else: # if we do not have resource we cannot send file + send_file_menuitem.set_sensitive(False) send_single_message_menuitem.connect('activate', self.on_send_single_message_menuitem_activate, account, contact) @@ -2288,16 +2336,16 @@ class RosterWindow: if _('Not in Roster') not in contact.groups: # contact is in normal group - edit_groups_menuitem.set_no_show_all(False) - assign_openpgp_key_menuitem.set_no_show_all(False) add_to_roster_menuitem.hide() add_to_roster_menuitem.set_no_show_all(True) edit_groups_menuitem.connect('activate', self.on_edit_groups, [( contact,account)]) - if gajim.config.get('usegpg'): + if gajim.connections[account].gpg: assign_openpgp_key_menuitem.connect('activate', self.on_assign_pgp_key, contact, account) + else: + assign_openpgp_key_menuitem.set_sensitive(False) if contact.sub in ('from', 'both'): send_auth_menuitem.set_sensitive(False) @@ -2319,45 +2367,39 @@ class RosterWindow: else: # contact is in group 'Not in Roster' add_to_roster_menuitem.set_no_show_all(False) - edit_groups_menuitem.hide() - edit_groups_menuitem.set_no_show_all(True) - # hide first of the two consecutive separators - above_send_file_separator.hide() - above_send_file_separator.set_no_show_all(True) - assign_openpgp_key_menuitem.hide() - assign_openpgp_key_menuitem.set_no_show_all(True) - subscription_menuitem.hide() - subscription_menuitem.set_no_show_all(True) + edit_groups_menuitem.set_sensitive(False) + assign_openpgp_key_menuitem.set_sensitive(False) + subscription_menuitem.set_sensitive(False) add_to_roster_menuitem.connect('activate', self.on_add_to_roster, contact, account) set_custom_avatar_menuitem.connect('activate', self.on_set_custom_avatar_activate, contact, account) - # Remove many items when it's self contact row + # Hide items when it's self contact row if our_jid: menuitem = xml.get_widget('manage_contact') - menuitem.set_no_show_all(True) - menuitem.hide() + menuitem.set_sensitive(False) # Unsensitive many items when account is offline if gajim.connections[account].connected < 2: for widget in [start_chat_menuitem, send_single_message_menuitem, rename_menuitem, edit_groups_menuitem, send_file_menuitem, subscription_menuitem, add_to_roster_menuitem, - remove_from_roster_menuitem, execute_command_menuitem]: + remove_from_roster_menuitem, execute_command_menuitem, + send_custom_status_menuitem]: widget.set_sensitive(False) if gajim.connections[account] and gajim.connections[account].\ privacy_rules_supported: if jid in gajim.connections[account].blocked_contacts: - block_menuitem.set_no_show_all(True) - unblock_menuitem.connect('activate', self.on_unblock, iter, None) - block_menuitem.hide() + block_menuitem.set_no_show_all(True) + unblock_menuitem.connect('activate', self.on_unblock, iter, None) + block_menuitem.hide() else: - unblock_menuitem.set_no_show_all(True) - block_menuitem.connect('activate', self.on_block, iter, None) - unblock_menuitem.hide() + unblock_menuitem.set_no_show_all(True) + block_menuitem.connect('activate', self.on_block, iter, None) + unblock_menuitem.hide() else: unblock_menuitem.set_no_show_all(True) block_menuitem.set_sensitive(False) @@ -2505,15 +2547,23 @@ class RosterWindow: item = gtk.SeparatorMenuItem() # separator menu.append(item) + # Manage Transport submenu + item = gtk.ImageMenuItem(_('_Manage Contacts')) + icon = gtk.image_new_from_stock(gtk.STOCK_PROPERTIES, gtk.ICON_SIZE_MENU) + item.set_image(icon) + manage_contacts_submenu = gtk.Menu() + item.set_submenu(manage_contacts_submenu) + menu.append(item) + # Edit Groups edit_groups_item = gtk.ImageMenuItem(_('Edit _Groups')) icon = gtk.image_new_from_stock(gtk.STOCK_EDIT, gtk.ICON_SIZE_MENU) edit_groups_item.set_image(icon) - menu.append(edit_groups_item) + manage_contacts_submenu.append(edit_groups_item) edit_groups_item.connect('activate', self.on_edit_groups, list_) item = gtk.SeparatorMenuItem() # separator - menu.append(item) + manage_contacts_submenu.append(item) # Block if is_blocked and gajim.connections[account].privacy_rules_supported: @@ -2521,22 +2571,22 @@ class RosterWindow: icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) unblock_menuitem.set_image(icon) unblock_menuitem.connect('activate', self.on_unblock, None, list_) - menu.append(unblock_menuitem) + manage_contacts_submenu.append(unblock_menuitem) else: block_menuitem = gtk.ImageMenuItem(_('_Block')) icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) block_menuitem.set_image(icon) block_menuitem.connect('activate', self.on_block, None, list_) - menu.append(block_menuitem) + manage_contacts_submenu.append(block_menuitem) if not gajim.connections[account].privacy_rules_supported: block_menuitem.set_sensitive(False) # Remove - remove_item = gtk.ImageMenuItem(_('_Remove from Roster')) + remove_item = gtk.ImageMenuItem(_('_Remove')) icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU) remove_item.set_image(icon) - menu.append(remove_item) + manage_contacts_submenu.append(remove_item) remove_item.connect('activate', self.on_req_usub, list_) # unsensitive remove if one account is not connected if one_account_offline: @@ -2565,7 +2615,17 @@ class RosterWindow: maximize_menuitem.connect('activate', self.on_groupchat_maximized, \ jid, account) menu.append(maximize_menuitem) - + + disconnect_menuitem = gtk.ImageMenuItem(_('_Disconnect')) + disconnect_icon = gtk.image_new_from_stock(gtk.STOCK_DISCONNECT, \ + gtk.ICON_SIZE_MENU) + disconnect_menuitem.set_image(disconnect_icon) + disconnect_menuitem .connect('activate', self.on_disconnect, jid, account) + menu.append(disconnect_menuitem) + + item = gtk.SeparatorMenuItem() # separator + menu.append(item) + history_menuitem = gtk.ImageMenuItem(_('_History')) history_icon = gtk.image_new_from_stock(gtk.STOCK_JUSTIFY_FILL, \ gtk.ICON_SIZE_MENU) @@ -2574,16 +2634,6 @@ class RosterWindow: contact, account) menu.append(history_menuitem) - item = gtk.SeparatorMenuItem() # separator - menu.append(item) - - disconnect_menuitem = gtk.ImageMenuItem(_('_Disconnect')) - disconnect_icon = gtk.image_new_from_stock(gtk.STOCK_DISCONNECT, \ - gtk.ICON_SIZE_MENU) - disconnect_menuitem.set_image(disconnect_icon) - disconnect_menuitem .connect('activate', self.on_disconnect, jid, account) - menu.append(disconnect_menuitem) - event_button = gtkgui_helpers.get_possible_button_event(event) menu.attach_to_widget(self.tree, None) @@ -2678,12 +2728,10 @@ class RosterWindow: if group in gajim.connections[account].blocked_groups: send_custom_status_menuitem.set_image(self.load_icon('offline')) send_custom_status_menuitem.set_sensitive(False) - elif gajim.interface.status_sent_to_groups.has_key(account) and \ - group in gajim.interface.status_sent_to_groups[account]: - send_custom_status_menuitem.set_image(self.load_icon( - gajim.interface.status_sent_to_groups[account][group])) else: - send_custom_status_menuitem.set_image(None) + icon = gtk.image_new_from_stock(gtk.STOCK_NETWORK, + gtk.ICON_SIZE_MENU) + send_custom_status_menuitem.set_image(icon) status_menuitems = gtk.Menu() send_custom_status_menuitem.set_submenu(status_menuitems) iconset = gajim.config.get('iconset') @@ -2698,8 +2746,13 @@ class RosterWindow: status_menuitem.set_image(icon) status_menuitems.append(status_menuitem) menu.append(send_custom_status_menuitem) + + # there is no singlemessage and custom status for zeroconf + if gajim.config.get_per('accounts', account, 'is_zeroconf'): + send_custom_status_menuitem.set_sensitive(False) + send_group_message_item.set_sensitive(False) - if not group in helpers.special_groups + (_('General'),): + if not group in helpers.special_groups: item = gtk.SeparatorMenuItem() # separator menu.append(item) @@ -2740,15 +2793,22 @@ class RosterWindow: block_menuitem.set_sensitive(False) # Remove group - remove_item = gtk.ImageMenuItem(_('_Remove from Roster')) + remove_item = gtk.ImageMenuItem(_('_Remove')) icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU) remove_item.set_image(icon) menu.append(remove_item) remove_item.connect('activate', self.on_remove_group_item_activated, group, account) + # unsensitive if account is not connected if gajim.connections[account].connected < 2: rename_item.set_sensitive(False) + + # General group cannot be changed + if group == _('General'): + rename_item.set_sensitive(False) + block_menuitem.set_sensitive(False) + remove_item.set_sensitive(False) event_button = gtkgui_helpers.get_possible_button_event(event) @@ -2758,7 +2818,7 @@ class RosterWindow: menu.popup(None, None, None, event_button, event.time) def make_transport_menu(self, event, iter): - '''Make transport's popup menu''' + '''Make transport\'s popup menu''' model = self.tree.get_model() jid = model[iter][C_JID].decode('utf-8') path = model.get_path(iter) @@ -2766,28 +2826,62 @@ class RosterWindow: contact = gajim.contacts.get_contact_with_highest_priority(account, jid) menu = gtk.Menu() - # Log on - item = gtk.ImageMenuItem(_('_Log on')) - icon = gtk.image_new_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_MENU) - item.set_image(icon) - menu.append(item) - show = contact.show + # Connect/Didconnect + show = contact.show if (show != 'offline' and show != 'error') or\ gajim.account_is_disconnected(account): - item.set_sensitive(False) - item.connect('activate', self.on_agent_logging, jid, None, account) - - # Log off - item = gtk.ImageMenuItem(_('Log _off')) - icon = gtk.image_new_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_MENU) + # Log Off + item = gtk.ImageMenuItem(_('_Log off')) + icon = gtk.image_new_from_stock(gtk.STOCK_DISCONNECT, gtk.ICON_SIZE_MENU) + item.connect('activate', self.on_agent_logging, jid, 'unavailable', + account) + else: + # Log on + item = gtk.ImageMenuItem(_('_Log on')) + icon = gtk.image_new_from_stock(gtk.STOCK_CONNECT, gtk.ICON_SIZE_MENU) + item.connect('activate', self.on_agent_logging, jid, None, account) item.set_image(icon) menu.append(item) - if show in ('offline', 'error') or gajim.account_is_disconnected( - account): + if show == 'error': item.set_sensitive(False) - item.connect('activate', self.on_agent_logging, jid, 'unavailable', - account) + + item = gtk.SeparatorMenuItem() # separator + menu.append(item) + + # Send single message + item = gtk.ImageMenuItem(_('Send Single Message')) + icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) + item.set_image(icon) + item.connect('activate', + self.on_send_single_message_menuitem_activate, account, contact) + menu.append(item) + # Send Custom Status + send_custom_status_menuitem = gtk.ImageMenuItem(_('Send Cus_tom Status')) + # add a special img for this menuitem + if gajim.interface.status_sent_to_users.has_key(account) and \ + jid in gajim.interface.status_sent_to_users[account]: + send_custom_status_menuitem.set_image(self.load_icon( + gajim.interface.status_sent_to_users[account][jid])) + else: + icon = gtk.image_new_from_stock(gtk.STOCK_NETWORK, + gtk.ICON_SIZE_MENU) + send_custom_status_menuitem.set_image(icon) + status_menuitems = gtk.Menu() + send_custom_status_menuitem.set_submenu(status_menuitems) + iconset = gajim.config.get('iconset') + path = os.path.join(helpers.get_iconset_path(iconset), '16x16') + for s in ['online', 'chat', 'away', 'xa', 'dnd', 'offline']: + # icon MUST be different instance for every item + state_images = self.load_iconset(path) + status_menuitem = gtk.ImageMenuItem(helpers.get_uf_show(s)) + status_menuitem.connect('activate', self.on_send_custom_status, + [(contact, account)], s) + icon = state_images[s] + status_menuitem.set_image(icon) + status_menuitems.append(status_menuitem) + menu.append(send_custom_status_menuitem) + item = gtk.SeparatorMenuItem() # separator menu.append(item) @@ -2801,11 +2895,19 @@ class RosterWindow: if gajim.account_is_disconnected(account): item.set_sensitive(False) - # Edit - item = gtk.ImageMenuItem(_('_Edit')) + # Manage Transport submenu + item = gtk.ImageMenuItem(_('_Manage Transport')) + icon = gtk.image_new_from_stock(gtk.STOCK_PROPERTIES, gtk.ICON_SIZE_MENU) + item.set_image(icon) + manage_transport_submenu = gtk.Menu() + item.set_submenu(manage_transport_submenu) + menu.append(item) + + # Modify Transport + item = gtk.ImageMenuItem(_('_Modify Transport')) icon = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, gtk.ICON_SIZE_MENU) item.set_image(icon) - menu.append(item) + manage_transport_submenu.append(item) item.connect('activate', self.on_edit_agent, contact, account) if gajim.account_is_disconnected(account): item.set_sensitive(False) @@ -2818,23 +2920,27 @@ class RosterWindow: img = gtk.Image() img.set_from_file(path_to_kbd_input_img) item.set_image(img) - menu.append(item) + manage_transport_submenu.append(item) item.connect('activate', self.on_rename, iter, path) if gajim.account_is_disconnected(account): item.set_sensitive(False) - item = gtk.SeparatorMenuItem() # sepator - menu.append(item) + item = gtk.SeparatorMenuItem() # separator + manage_transport_submenu.append(item) # Remove - item = gtk.ImageMenuItem(_('_Remove from Roster')) + item = gtk.ImageMenuItem(_('_Remove')) icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU) item.set_image(icon) - menu.append(item) + manage_transport_submenu.append(item) item.connect('activate', self.on_remove_agent, [(contact, account)]) if gajim.account_is_disconnected(account): item.set_sensitive(False) + + item = gtk.SeparatorMenuItem() # separator + menu.append(item) + # Information information_menuitem = gtk.ImageMenuItem(_('_Information')) icon = gtk.image_new_from_stock(gtk.STOCK_INFO, gtk.ICON_SIZE_MENU) information_menuitem.set_image(icon) @@ -2893,6 +2999,7 @@ class RosterWindow: account_context_menu = xml.get_widget('account_context_menu') status_menuitem = xml.get_widget('status_menuitem') + start_chat_menuitem = xml.get_widget('start_chat_menuitem') join_group_chat_menuitem = xml.get_widget('join_group_chat_menuitem') muc_icon = self.load_icon('muc_active') if muc_icon: @@ -2971,6 +3078,9 @@ class RosterWindow: contact = gajim.contacts.create_contact(jid = hostname) # Fake contact execute_command_menuitem.connect('activate', self.on_execute_command, contact, account) + + start_chat_menuitem.connect('activate', + self.on_new_chat_menuitem_activate, account) gc_sub_menu = gtk.Menu() # gc is always a submenu join_group_chat_menuitem.set_submenu(gc_sub_menu) @@ -2979,8 +3089,8 @@ class RosterWindow: # make some items insensitive if account is offline if gajim.connections[account].connected < 2: for widget in [add_contact_menuitem, service_discovery_menuitem, - join_group_chat_menuitem, - execute_command_menuitem, pep_menuitem]: + join_group_chat_menuitem, execute_command_menuitem, pep_menuitem, + start_chat_menuitem]: widget.set_sensitive(False) else: xml = gtkgui_helpers.get_glade('zeroconf_context_menu.glade') @@ -3170,7 +3280,7 @@ class RosterWindow: self.make_transport_menu(event, iters[0]) elif type_ in ('contact', 'self_contact') and len(iters) == 1: self.make_contact_menu(event, iters[0]) - elif type_ == 'contact': + elif type_ == 'contact': self.make_multiple_contact_menu(event, iters) elif type_ == 'account' and len(iters) == 1: self.make_account_menu(event, iters[0]) @@ -3195,6 +3305,21 @@ class RosterWindow: return True + def on_roster_treeview_button_release_event(self, widget, event): + try: + path, column, x, y = self.tree.get_path_at_pos(int(event.x), + int(event.y)) + except TypeError: + return False + + if event.button == 1: # Left click + if gajim.single_click and not event.state & gtk.gdk.SHIFT_MASK and \ + not event.state & gtk.gdk.CONTROL_MASK: + # Check if button has been pressed on the same row + if self.clicked_path == path: + self.on_row_activated(widget, path) + self.clicked_path = None + def on_roster_treeview_button_press_event(self, widget, event): # hide tooltip, no matter the button is pressed self.tooltip.hide_tooltip() @@ -3255,6 +3380,24 @@ class RosterWindow: type_ = model[path][C_TYPE] if gajim.single_click and not event.state & gtk.gdk.SHIFT_MASK and \ not event.state & gtk.gdk.CONTROL_MASK: + # Don't handle dubble click if we press icon of a metacontact + iter = model.get_iter(path) + if x < 27 and type_ == 'contact' and model.iter_has_child(iter): + account = model[path][C_ACCOUNT].decode('utf-8') + jid = model[path][C_JID].decode('utf-8') + # first cell in 1st column (the arrow SINGLE clicked) + iters = self.get_contact_iter(jid, account) + for iter in iters: + path = model.get_path(iter) + if (self.tree.row_expanded(path)): + self.tree.collapse_row(path) + else: + self.tree.expand_row(path, False) + return + # We just save on which row we press button, and open chat window on + # button release to be able to do DND without opening chat window + self.clicked_path = path + return self.on_row_activated(widget, path) else: if type_ == 'group' and x < 27: @@ -3278,12 +3421,11 @@ class RosterWindow: def on_req_usub(self, widget, list_): '''Remove a contact. list_ is a list of (contact, account) tuples''' - def on_ok(widget, list_): - self.dialog.destroy() + def on_ok(is_checked, list_): remove_auth = True if len(list_) == 1: contact = list_[0][0] - if contact.sub != 'to' and self.dialog.is_checked(): + if contact.sub != 'to' and is_checked: remove_auth = False for (contact, account) in list_: gajim.connections[account].unsubscribe(contact.jid, remove_auth) @@ -3305,18 +3447,22 @@ class RosterWindow: if _('Not in Roster') in contact.groups: gajim.events.remove_events(account, contact.jid) self.readd_if_needed(contact, account) + + def on_ok2(list_): + on_ok(False, list_) + if len(list_) == 1: contact = list_[0][0] account = list_[0][1] pritext = _('Contact "%s" will be removed from your roster') % \ contact.get_shown_name() if contact.sub == 'to': - self.dialog = dialogs.ConfirmationDialog(pritext, + dialogs.ConfirmationDialog(pritext, _('By removing this contact you also remove authorization ' 'resulting in him or her always seeing you as offline.'), - on_response_ok = (on_ok, list_)) + on_response_ok = (on_ok2, list_)) else: - self.dialog = dialogs.ConfirmationDialogCheck(pritext, + dialogs.ConfirmationDialogCheck(pritext, _('By removing this contact you also by default remove ' 'authorization resulting in him or her always seeing you as ' 'offline.'), @@ -3331,15 +3477,10 @@ class RosterWindow: sectext = _('By removing these contacts:%s\nyou also remove ' 'authorization resulting in them always seeing you as offline.') % \ jids - self.dialog = dialogs.ConfirmationDialog(pritext, sectext, - on_response_ok = (on_ok, list_)) + dialogs.ConfirmationDialog(pritext, sectext, + on_response_ok = (on_ok2, list_)) - def forget_gpg_passphrase(self, keyid): - if self.gpg_passphrase.has_key(keyid): - del self.gpg_passphrase[keyid] - return False - def set_connecting_state(self, account): model = self.tree.get_model() accountIter = self.get_account_iter(account) @@ -3377,61 +3518,10 @@ class RosterWindow: gajim.config.set_per('accounts', account, 'savepass', True) passwords.save_password(account, passphrase) - keyid = None - use_gpg_agent = gajim.config.get('use_gpg_agent') - # we don't need to bother with the passphrase if we use the agent - if use_gpg_agent: - save_gpg_pass = False - else: - save_gpg_pass = gajim.config.get_per('accounts', account, - 'savegpgpass') - keyid = gajim.config.get_per('accounts', account, 'keyid') - if keyid and not gajim.config.get('usegpg'): - #TODO: make this string translatable - dialog = dialogs.WarningDialog('GPG is not usable', _('You will be connected to %s without OpenPGP.') % account) - if keyid and gajim.connections[account].connected < 2 and \ - gajim.config.get('usegpg'): - - if use_gpg_agent: - self.gpg_passphrase[keyid] = None - else: - if save_gpg_pass: - passphrase = gajim.config.get_per('accounts', account, - 'gpgpassword') - else: - if self.gpg_passphrase.has_key(keyid): - passphrase = self.gpg_passphrase[keyid] - save = False - else: - password_ok = False - count = 0 - title = _('Passphrase Required') - second = _('Enter GPG key passphrase for account %s.') % \ - account - while not password_ok and count < 3: - count += 1 - w = dialogs.PassphraseDialog(title, second, - _('Save passphrase')) - passphrase, save = w.run() - if passphrase == -1: - passphrase = None - password_ok = True - else: - password_ok = gajim.connections[account].\ - test_gpg_passphrase(passphrase) - title = _('Wrong Passphrase') - second = _('Please retype your GPG passphrase or ' - 'press Cancel.') - if passphrase != None: - self.gpg_passphrase[keyid] = passphrase - gobject.timeout_add(30000, self.forget_gpg_passphrase, - keyid) - if save: - gajim.config.set_per('accounts', account, 'savegpgpass', - True) - gajim.config.set_per('accounts', account, 'gpgpassword', - passphrase) - gajim.connections[account].gpg_passphrase(passphrase) + keyid = gajim.config.get_per('accounts', account, 'keyid') + if keyid and not gajim.connections[account].gpg: + dialog = dialogs.WarningDialog(_('GPG is not usable'), + _('You will be connected to %s without OpenPGP.') % account) if gajim.account_is_connected(account): if status == 'online' and gajim.interface.sleeper.getState() != \ @@ -3465,6 +3555,8 @@ class RosterWindow: if was_invisible and status != 'offline': # We come back from invisible, join bookmarks for bm in gajim.connections[account].bookmarks: + if bm['autojoin'] not in ('1', 'true'): + continue room_jid = bm['jid'] if room_jid in gajim.gc_connected[account] and \ gajim.gc_connected[account][room_jid]: @@ -3491,24 +3583,21 @@ class RosterWindow: return False def change_status(self, widget, account, status): - def change(widget, account, status): - if self.dialog: - self.dialog.destroy() + def change(account, status): message = self.get_status_message(status) if message is None: # user pressed Cancel to change status message dialog return self.send_status(account, status, message) - self.dialog = None if status == 'invisible' and self.connected_rooms(account): - self.dialog = dialogs.ConfirmationDialog( + dialogs.ConfirmationDialog( _('You are participating in one or more group chats'), _('Changing your status to invisible will result in disconnection ' 'from those group chats. Are you sure you want to go invisible?'), on_response_ok = (change, account, status)) else: - change(None, account, status) + change(account, status) def on_send_custom_status(self, widget, contact_list, show, group=None): '''send custom status''' @@ -3543,8 +3632,9 @@ class RosterWindow: self.update_status_combobox() return status = model[active][2].decode('utf-8') - - if active == 7: # We choose change status message (7 is that) + statuses_unified = helpers.statuses_unified() + if (active == 7 and statuses_unified) or (active == 9 and not statuses_unified): + # We choose change status message (7 is that, or 9 if there is the "desync'ed" option) # do not change show, just show change status dialog status = model[self.previous_status_combobox_active][2].decode('utf-8') dlg = dialogs.ChangeStatusMessageDialog(status) @@ -3632,17 +3722,37 @@ class RosterWindow: self._music_track_changed_signal = None self._music_track_changed(None, None) + ## enable setting status msg from a Last.fm account + def enable_syncing_status_msg_from_lastfm(self, enabled): + '''if enabled is True, we start polling the Last.fm server, + and we update our status message accordinly''' + if enabled: + if self._music_track_changed_signal is None: + listener = LastFMTrackListener.get( + gajim.config.get('lastfm_username')) + self._music_track_changed_signal = listener.connect( + 'music-track-changed', self._music_track_changed) + track = listener.get_playing_track() + self._music_track_changed(listener, track) + else: + if self._music_track_changed_signal is not None: + listener = LastFMTrackListener.get( + gajim.config.get('lastfm_username')) + listener.disconnect(self._music_track_changed_signal) + self._music_track_changed_signal = None + self._music_track_changed(None, None) + def _change_awn_icon_status(self, status): if not dbus_support.supported: # do nothing if user doesn't have D-Bus bindings return - bus = dbus.SessionBus() try: + bus = dbus.SessionBus() if not 'com.google.code.Awn' in bus.list_names(): # Awn is not installed return except: - pass + return iconset = gajim.config.get('iconset') prefix = os.path.join(helpers.get_iconset_path(iconset), '32x32') if status in ('chat', 'away', 'xa', 'dnd', 'invisible', 'offline'): @@ -3659,18 +3769,18 @@ class RosterWindow: pass def _music_track_changed(self, unused_listener, music_track_info, - account=''): - from common import pep - if account == '': - accounts = gajim.connections.keys() - if music_track_info is None: - artist = '' - title = '' - source = '' - track = '' - length = '' - else: - if hasattr(music_track_info, 'paused') and \ + account=''): + if gajim.config.get('use_pep'): + from common import pep + if account == '': + accounts = gajim.connections.keys() + if music_track_info is None: + artist = '' + title = '' + source = '' + track = '' + length = '' + elif hasattr(music_track_info, 'paused') and \ music_track_info.paused == 0: artist = '' title = '' @@ -3681,30 +3791,72 @@ class RosterWindow: artist = music_track_info.artist title = music_track_info.title source = music_track_info.album - print "change (%s - %s - %s) for %s" % (artist, source, title, account) - if account == '': - print "Multi accounts" - for account in accounts: - if not gajim.config.get_per('accounts', account, - 'sync_with_global_status'): - continue - if not gajim.connections[account].pep_supported: - continue + if account == '': + print "Multi accounts" + for account in accounts: + if not gajim.config.get_per('accounts', account, + 'sync_with_global_status'): + continue + if not gajim.connections[account].pep_supported: + continue + pep.user_send_tune(account, artist, title, source) + else: + print "Single account" pep.user_send_tune(account, artist, title, source) + return + # No PEP + accounts = gajim.connections.keys() + if music_track_info is None: + status_message = '' else: - print "Single account" - pep.user_send_tune(account, artist, title, source) - + if hasattr(music_track_info, 'paused') and \ + music_track_info.paused == 0: + status_message = '' + else: + status_message = '♪ ' + _('"%(title)s" by %(artist)s') % \ + {'title': music_track_info.title, + 'artist': music_track_info.artist } + ' ♪' + for account in accounts: + if not gajim.config.get_per('accounts', account, + 'sync_with_global_status'): + continue + if gajim.connections[account].connected < gajim.SHOW_LIST.index( + 'online') or gajim.connections[account].connected > gajim.SHOW_LIST.\ + index('invisible'): + continue + current_show = gajim.SHOW_LIST[gajim.connections[account].connected] + # Keep the last status message, replacing only the current song part + current_status_message = gajim.connections[account].status + song_offset = current_status_message.find('♪') + if song_offset >= 0: + current_status_message = current_status_message[0:song_offset] + current_status_message = current_status_message.strip() + '\n' + \ + status_message + self.send_status(account, current_show, current_status_message.strip()) def update_status_combobox(self): # table to change index in connection.connected to index in combobox table = {'offline':9, 'connecting':9, 'online':0, 'chat':1, 'away':2, 'xa':3, 'dnd':4, 'invisible':5} + + # we check if there are more options in the combobox that it should + # if yes, we remove the first ones + while len(self.status_combobox.get_model()) > len(table)+2: + self.status_combobox.remove_text(0) + show = helpers.get_global_show() # temporarily block signal in order not to send status that we show # in the combobox self.combobox_callback_active = False - self.status_combobox.set_active(table[show]) + if helpers.statuses_unified(): + self.status_combobox.set_active(table[show]) + else: + uf_show = helpers.get_uf_show(show) + liststore = self.status_combobox.get_model() + liststore.prepend(['SEPARATOR', None, '', True]) + liststore.prepend([uf_show+" "+"(desync'ed)", self.jabber_state_images['16'][show], + show, False]) + self.status_combobox.set_active(0) self._change_awn_icon_status(show) self.combobox_callback_active = True if gajim.interface.systray_enabled: @@ -3734,21 +3886,27 @@ class RosterWindow: self.quit_on_next_offline -= 1 if self.quit_on_next_offline < 1: self.quit_gtkgui_interface() - if accountIter: - model[accountIter][C_SECPIXBUF] = None - if gajim.con_types.has_key(account): - gajim.con_types[account] = None - for jid in gajim.contacts.get_jid_list(account): - lcontact = gajim.contacts.get_contacts(account, jid) - lcontact_copy = [] - for contact in lcontact: - lcontact_copy.append(contact) - for contact in lcontact_copy: - self.chg_contact_status(contact, 'offline', '', account) + else: + # No need to redraw contacts if we're quitting + if accountIter: + model[accountIter][C_SECPIXBUF] = None + if gajim.con_types.has_key(account): + gajim.con_types[account] = None + for jid in gajim.contacts.get_jid_list(account): + lcontact = gajim.contacts.get_contacts(account, jid) + lcontact_copy = [] + for contact in lcontact: + lcontact_copy.append(contact) + for contact in lcontact_copy: + self.chg_contact_status(contact, 'offline', '', account) self.actions_menu_needs_rebuild = True self.update_status_combobox() + # Force the rebuild now since the on_activates on the menu itself does + # not work with the os/x top level menubar + if sys.platform == 'darwin': + self.make_menu(force = True) - def new_private_chat(self, gc_contact, account): + def new_private_chat(self, gc_contact, account, session = None): contact = gajim.contacts.contact_from_gc_contact(gc_contact) type_ = message_control.TYPE_PM fjid = gc_contact.room_jid + '/' + gc_contact.name @@ -3756,24 +3914,25 @@ class RosterWindow: if not mw: mw = gajim.interface.msg_win_mgr.create_window(contact, account, type_) - chat_control = PrivateChatControl(mw, gc_contact, contact, account) + chat_control = PrivateChatControl(mw, gc_contact, contact, account, session) mw.new_tab(chat_control) if len(gajim.events.get_events(account, fjid)): # We call this here to avoid race conditions with widget validation chat_control.read_queue() - def new_chat(self, contact, account, resource = None): + def new_chat(self, contact, account, resource = None, session = None): # Get target window, create a control, and associate it with the window type_ = message_control.TYPE_CHAT fjid = contact.jid if resource: fjid += '/' + resource + mw = gajim.interface.msg_win_mgr.get_window(fjid, account) if not mw: mw = gajim.interface.msg_win_mgr.create_window(contact, account, type_) - chat_control = ChatControl(mw, contact, account, resource) + chat_control = ChatControl(mw, contact, account, session, resource) mw.new_tab(chat_control) @@ -3804,19 +3963,20 @@ class RosterWindow: mc = mw.get_control(fjid, account) mc.user_nick = gajim.nicks[account] - def new_room(self, room_jid, nick, account): + def new_room(self, room_jid, nick, account, is_continued=False): # Get target window, create a control, and associate it with the window contact = gajim.contacts.create_contact(jid = room_jid, name = nick) mw = gajim.interface.msg_win_mgr.get_window(contact.jid, account) if not mw: mw = gajim.interface.msg_win_mgr.create_window(contact, account, - GroupchatControl.TYPE_ID) - gc_control = GroupchatControl(mw, contact, account) + GroupchatControl.TYPE_ID) + gc_control = GroupchatControl(mw, contact, account, + is_continued=is_continued) mw.new_tab(gc_control) - def on_message(self, jid, msg, tim, account, encrypted = False, - msg_type = '', subject = None, resource = '', msg_id = None, - user_nick = '', advanced_notif_num = None, xhtml = None): + def on_message(self, jid, msg, tim, account, encrypted=False, msg_type='', + subject=None, resource='', msg_id=None, user_nick='', + advanced_notif_num=None, xhtml=None, session=None, form_node=None): '''when we receive a message''' contact = None # if chat window will be for specific resource @@ -3871,9 +4031,9 @@ class RosterWindow: popup = helpers.allow_popup_window(account, advanced_notif_num) if msg_type == 'normal' and popup: # it's single message to be autopopuped - dialogs.SingleMessageWindow(account, contact.jid, - action = 'receive', from_whom = jid, subject = subject, - message = msg, resource = resource) + dialogs.SingleMessageWindow(account, contact.jid, action='receive', + from_whom=jid, subject=subject, message=msg, resource=resource, + session=session, form_node=form_node) return # We print if window is opened and it's not a single message @@ -3881,6 +4041,8 @@ class RosterWindow: typ = '' if msg_type == 'error': typ = 'status' + if session: + ctrl.set_session(session) ctrl.print_conversation(msg, typ, tim = tim, encrypted = encrypted, subject = subject, xhtml = xhtml) if msg_id: @@ -3896,12 +4058,12 @@ class RosterWindow: show_in_roster = notify.get_show_in_roster(event_type, account, contact) show_in_systray = notify.get_show_in_systray(event_type, account, contact) event = gajim.events.create_event(type_, (msg, subject, msg_type, tim, - encrypted, resource, msg_id, xhtml), show_in_roster = show_in_roster, - show_in_systray = show_in_systray) + encrypted, resource, msg_id, xhtml, session, form_node), + show_in_roster=show_in_roster, show_in_systray=show_in_systray) gajim.events.add_event(account, fjid, event) if popup: if not ctrl: - self.new_chat(contact, account, resource = resource_for_chat) + self.new_chat(contact, account, resource=resource_for_chat) if path and not self.dragging and gajim.config.get( 'scroll_roster_to_last_message'): # we curently see contact in our roster OR he @@ -3981,6 +4143,13 @@ class RosterWindow: gajim.interface.instances['file_transfers'].window.present() else: gajim.interface.instances['file_transfers'].window.show_all() + + def on_history_menuitem_activate(self, widget): + if gajim.interface.instances.has_key('logs'): + gajim.interface.instances['logs'].window.present() + else: + gajim.interface.instances['logs'] = history_window.\ + HistoryWindow() def on_show_transports_menuitem_activate(self, widget): gajim.config.set('show_transports_group', widget.get_active()) @@ -4132,8 +4301,9 @@ class RosterWindow: for ctrl in win.controls(): fjid = ctrl.get_full_jid() - if gajim.last_message_time[acct].has_key(fjid): - if time.time() - gajim.last_message_time[acct][fjid] < 2: + if gajim.last_message_time[ctrl.account].has_key(fjid): + if time.time() - gajim.last_message_time[ctrl.account][fjid]\ + < 2: recent = True break if unread: @@ -4165,8 +4335,8 @@ class RosterWindow: ft = gajim.interface.instances['file_transfers'] if event.type_ == 'normal': dialogs.SingleMessageWindow(account, jid, - action = 'receive', from_whom = jid, subject = data[1], - message = data[0], resource = data[5]) + action='receive', from_whom=jid, subject=data[1], message=data[0], + resource=data[5], session=data[8], form_node=data[9]) gajim.interface.remove_first_event(account, jid, event.type_) return True elif event.type_ == 'file-request': @@ -4203,14 +4373,14 @@ class RosterWindow: jid = jid + u'/' + resource adhoc_commands.CommandWindow(account, jid) - def on_open_chat_window(self, widget, contact, account, resource = None): + def on_open_chat_window(self, widget, contact, account, resource = None, session = None): # Get the window containing the chat fjid = contact.jid if resource: fjid += '/' + resource win = gajim.interface.msg_win_mgr.get_window(fjid, account) if not win: - self.new_chat(contact, account, resource = resource) + self.new_chat(contact, account, resource = resource, session = session) win = gajim.interface.msg_win_mgr.get_window(fjid, account) ctrl = win.get_control(fjid, account) # last message is long time ago @@ -4257,7 +4427,10 @@ class RosterWindow: jid = child_jid else: child_iter = model.iter_next(child_iter) + session = None if first_ev: + if first_ev.type_ in ('chat', 'normal'): + session = first_ev.parameters[8] fjid = jid if resource: fjid += '/' + resource @@ -4268,7 +4441,7 @@ class RosterWindow: c = gajim.contacts.get_contact_with_highest_priority(account, jid) if jid == gajim.get_jid_from_account(account): resource = c.resource - self.on_open_chat_window(widget, c, account, resource = resource) + self.on_open_chat_window(widget, c, account, 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''' @@ -4302,7 +4475,7 @@ class RosterWindow: self.tree.expand_row(pathG, False) self.draw_account(account) elif type_ == 'contact': - jid = model[iter][C_JID].decode('utf-8') + jid = model[iter][C_JID].decode('utf-8') account = model[iter][C_ACCOUNT].decode('utf-8') self.draw_contact(jid, account) @@ -4329,7 +4502,7 @@ class RosterWindow: self.collapsed_rows.append(account) self.draw_account(account) elif type_ == 'contact': - jid = model[iter][C_JID].decode('utf-8') + jid = model[iter][C_JID].decode('utf-8') account = model[iter][C_ACCOUNT].decode('utf-8') self.draw_contact(jid, account) @@ -4434,10 +4607,14 @@ class RosterWindow: # standard transport iconsets are loaded one time in init() t_path = os.path.join(gajim.DATA_DIR, 'iconsets', 'transports') folders = os.listdir(t_path) + if os.path.isdir(os.path.join(gajim.MY_ICONSETS_PATH, 'transports')): + t_path = os.path.join(gajim.MY_ICONSETS_PATH, 'transports') + folders += os.listdir(t_path) for transport in folders: if transport == '.svn': continue - folder = os.path.join(t_path, transport, '16x16') + folder = os.path.join(helpers.get_transport_path(transport), + '16x16') self.transports_state_images['opened'][transport] = \ self.load_iconset(folder, pixo, transport = True) self.transports_state_images['closed'][transport] = \ @@ -4474,6 +4651,8 @@ class RosterWindow: for account in gajim.connections: for addr in gajim.interface.instances[account]['disco']: gajim.interface.instances[account]['disco'][addr].paint_banner() + for ctrl in gajim.interface.minimized_controls[account].values(): + ctrl.repaint_themed_widgets() def on_show_offline_contacts_menuitem_activate(self, widget): '''when show offline option is changed: @@ -4758,16 +4937,15 @@ class RosterWindow: def on_drop_in_contact(self, widget, account_source, c_source, account_dest, c_dest, was_big_brother, context, etime): - if not gajim.connections[account_source].metacontacts_supported or not \ - gajim.connections[account_dest].metacontacts_supported: + if not gajim.connections[account_source].private_storage_supported or not\ + gajim.connections[account_dest].private_storage_supported: dialogs.WarningDialog(_('Metacontacts storage not supported by your ' 'server'), _('Your server does not support storing metacontacts information. ' - 'So those information will not be save on next reconnection.')) - def merge_contacts(widget = None): - if widget: # dialog has been shown - dlg.destroy() - if dlg.is_checked(): # user does not want to be asked again + 'So those information will not be saved on next reconnection.')) + def merge_contacts(is_checked=None): + if is_checked != None: # dialog has been shown + if is_checked: # user does not want to be asked again gajim.config.set('confirm_metacontacts', 'no') else: gajim.config.set('confirm_metacontacts', 'yes') @@ -4777,6 +4955,7 @@ class RosterWindow: # remove the source row self.remove_contact(c_source, account_source) # brother inherite big brother groups + old_groups = c_source.groups c_source.groups = [] for g in c_dest.groups: c_source.groups.append(g) @@ -4797,7 +4976,10 @@ class RosterWindow: self.draw_contact(_jid, _account) self.add_contact_to_roster(c_source.jid, account_source) self.draw_contact(c_dest.jid, account_dest) - + # FIXME: Why do groups have to be redrawn by hand? + for g in old_groups: + self.draw_group(g, account_source) + self.draw_account(account_source) context.finish(True, True, etime) confirm_metacontacts = gajim.config.get('confirm_metacontacts') @@ -4894,8 +5076,16 @@ class RosterWindow: uri = data.strip() uri_splitted = uri.split() # we may have more than one file dropped nb_uri = len(uri_splitted) - def _on_send_files(widget, account, jid, uris): - dialog.destroy() + # Check the URIs + bad_uris = [] + for a_uri in uri_splitted: + path = helpers.get_file_path_from_dnd_dropped_uri(a_uri) + if not os.path.isfile(path): + bad_uris.append(a_uri) + if len(bad_uris): + dialogs.ErrorDialog(_('Invalid file URI:'), '\n'.join(bad_uris)) + return + def _on_send_files(account, jid, uris): c = gajim.contacts.get_contact_with_highest_priority(account, jid) for uri in uris: path = helpers.get_file_path_from_dnd_dropped_uri(uri) @@ -4904,7 +5094,7 @@ class RosterWindow: account, c, path) # Popup dialog to confirm sending prim_text = 'Send file?' - sec_text = i18n.ngettext('Do you want to send that file to %s:', + sec_text = i18n.ngettext('Do you want to send this file to %s:', 'Do you want to send those files to %s:', nb_uri) %\ c_dest.get_shown_name() for uri in uri_splitted: @@ -4989,13 +5179,7 @@ class RosterWindow: return # Is the contact we drag a meta contact? - is_meta_contact = False - is_big_brother = False - tag = gajim.contacts.get_metacontacts_tag(account_source, jid_source) - if tag: - is_meta_contact = True - if model.iter_has_child(iter_source): - is_big_brother = True + is_big_brother = gajim.contacts.is_big_brother(account_source, jid_source) # Contact drop on group row or between two contacts if type_dest == 'group' or position == gtk.TREE_VIEW_DROP_BEFORE or \ @@ -5085,6 +5269,52 @@ class RosterWindow: self._last_selected_contact.append((jid, account)) self.draw_contact(jid, account, selected = True) + def setup_for_osx(self): + # Massage the GTK menu so it will match up to the OS/X nib style menu + # when passed to sync-menu and merged + main_menu = self.xml.get_widget('menubar') + app_item = gtk.MenuItem('Gajim') + main_menu.insert(app_item, 0) + win_item = gtk.MenuItem('Window') + main_menu.insert(win_item, 4) + actions_menu = self.xml.get_widget('actions_menu_menu') + quit_item = self.xml.get_widget('quit_menuitem') + actions_menu.remove(quit_item) + actions_menu.remove(self.xml.get_widget('separator1')) + edit_menu = self.xml.get_widget('edit_menu_menu') + #edit_menu.remove(self.xml.get_widget('preferences_menuitem')) + edit_menu.remove(self.xml.get_widget('separator2')) + help_menu = self.xml.get_widget('help_menu_menu') + about_item = self.xml.get_widget('about_menuitem') + help_menu.remove(about_item) + # Build up App menu + app_menu = gtk.Menu() + app_item.set_submenu(app_menu) + app_menu.append(about_item) + app_menu.append(gtk.MenuItem('__SKIP__')) + prefs_item = gtk.MenuItem('Preferences...') + prefs_item.connect('activate', self.on_preferences_menuitem_activate) + accels = gtk.AccelGroup() + self.xml.get_widget('roster_window').add_accel_group(accels) + prefs_item.add_accelerator('activate', accels, ord(','), + gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) + app_menu.append(prefs_item) + app_menu.append(gtk.MenuItem('__SKIP__')) + app_menu.append(gtk.MenuItem('__SKIP__')) + app_menu.append(gtk.MenuItem('__SKIP__')) + app_menu.append(gtk.MenuItem('__SKIP__')) + app_menu.append(gtk.MenuItem('__SKIP__')) + app_menu.append(gtk.MenuItem('__SKIP__')) + app_menu.append(gtk.MenuItem('__SKIP__')) + app_menu.append(quit_item) + app_menu.show_all() + # Do the merge baby! + syncmenu.takeover_menu(main_menu) + self.make_menu(force = True) + # Hide the GTK menubar itself and let the OS/X menubar do its thing + #self.xml.get_widget('menubar').hide() + return + def __init__(self): self.xml = gtkgui_helpers.get_glade('roster_window.glade') self.window = self.xml.get_widget('roster_window') @@ -5106,14 +5336,16 @@ class RosterWindow: 'closed': {}} self.last_save_dir = None - self.editing_path = None # path of row with cell in edit mode + self.editing_path = None # path of row with cell in edit mode self.add_new_contact_handler_id = False self.service_disco_handler_id = False self.new_chat_menuitem_handler_id = False + self.single_message_menuitem_handler_id = False self.profile_avatar_menuitem_handler_id = False self.pep_services_menuitem_handler_id = False self.actions_menu_needs_rebuild = True self.regroup = gajim.config.get('mergeaccounts') + self.clicked_path = None # Used remember on wich row we clicked if len(gajim.connections) < 2: # Do not merge accounts if only one exists self.regroup = False #FIXME: When list_accel_closures will be wrapped in pygtk @@ -5129,7 +5361,6 @@ class RosterWindow: self.popups_notification_height = 0 self.popup_notification_windows = [] - self.gpg_passphrase = {} #(icon, name, type, jid, account, editable, secondary_pixbuf) model = gtk.TreeStore(gtk.Image, str, str, str, str, gtk.gdk.Pixbuf) @@ -5143,13 +5374,16 @@ class RosterWindow: path = os.path.join(gajim.DATA_DIR, 'iconsets', 'transports') folders = os.listdir(path) + if os.path.isdir(os.path.join(gajim.MY_ICONSETS_PATH, 'transports')): + path = os.path.join(gajim.MY_ICONSETS_PATH, 'transports') + folders += os.listdir(path) for transport in folders: if transport == '.svn': continue - folder = os.path.join(path, transport, '32x32') + folder = os.path.join(helpers.get_transport_path(transport), '32x32') self.transports_state_images['32'][transport] = self.load_iconset( folder, transport = True) - folder = os.path.join(path, transport, '16x16') + folder = os.path.join(helpers.get_transport_path(transport), '16x16') self.transports_state_images['16'][transport] = self.load_iconset( folder, transport = True) @@ -5274,7 +5508,20 @@ class RosterWindow: self.tooltip = tooltips.RosterTooltip() self.draw_roster() - self.enable_syncing_status_msg_from_current_music_track(gajim.config.get('publish_tune')) + if gajim.config.get('use_pep'): + self.enable_syncing_status_msg_from_current_music_track(gajim.config.get('publish_tune')) + else: + ## Music Track notifications + ## FIXME: we use a timeout because changing status of + ## accounts has no effect until they are connected. + st = gajim.config.get('set_status_msg_from_current_music_track') + if st: + gobject.timeout_add(1000, + self.enable_syncing_status_msg_from_current_music_track, st) + else: + gobject.timeout_add(1000, + self.enable_syncing_status_msg_from_lastfm, + gajim.config.get('set_status_msg_from_lastfm')) if gajim.config.get('show_roster_on_startup'): self.window.show_all() @@ -5292,3 +5539,6 @@ class RosterWindow: # Create zeroconf in config file zeroconf = common.zeroconf.connection_zeroconf.ConnectionZeroconf( gajim.ZEROCONF_ACC_NAME) + + if sys.platform == 'darwin': + self.setup_for_osx() diff --git a/src/search_window.py b/src/search_window.py index ce40eb282..df7af6ce7 100644 --- a/src/search_window.py +++ b/src/search_window.py @@ -1,21 +1,26 @@ # -*- coding: utf-8 -*- ## search_window.py ## -## Copyright (C) 2007 Yann Le Boulanger +## Copyright (C) 2007 Yann Leboulanger ## -## This program is free software; you can redistribute it and/or modify +## 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 2 only. +## by the Free Software Foundation; version 3 only. ## -## This program is distributed in the hope that it will be useful, +## 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 gobject import gtk -from common import xmpp, gajim, dataforms +from common import gajim, dataforms import gtkgui_helpers import dialogs @@ -191,6 +196,11 @@ class SearchWindow: return self.dataform = dataforms.ExtendForm(node = form) + if len(self.dataform.items) == 0: + # No result + self.label.set_text(_('No result')) + self.label.show() + return self.data_form_widget.set_sensitive(True) try: diff --git a/src/secrets.py b/src/secrets.py new file mode 100644 index 000000000..a95f4cd0d --- /dev/null +++ b/src/secrets.py @@ -0,0 +1,194 @@ +from common.configpaths import gajimpaths + +from common import crypto +from common import exceptions + +import dialogs + +import os +import pickle + +import gtk + +import Crypto.Cipher.AES +import Crypto.Hash.SHA256 +import Crypto.PublicKey.RSA + +secrets_filename = gajimpaths['SECRETS_FILE'] +secrets_cache = None + +secrets_cipher = None +secrets_counter = None + +# strength of the encryption used on SECRETS_FILE +n = 256 + +class Counter: + def __init__(self, n, iv): + self.n = n + self.c = crypto.decode_mpi(iv) + + def __call__(self): + self.c = (self.c + 1) % (2 ** self.n) + return crypto.encode_mpi_with_padding(self.c) + +# return en/decrypter if it's cached, otherwise create it from the user's +# passphrase +def get_key(counter, passph=None): + global secrets_cipher, secrets_counter + + if secrets_cipher: + return secrets_cipher + + if not passph: + passph, checked = dialogs.PassphraseDialog(_('Passphrase Required'), + _('To continue, Gajim needs to access your stored secrets. Enter your passphrase') + ).run() + + if passph == -1: + raise exceptions.Cancelled + + sh = Crypto.Hash.SHA256.new() + sh.update(passph) + key = sh.digest() + + secrets_counter = counter + + secrets_cipher = Crypto.Cipher.AES.new(key, Crypto.Cipher.AES.MODE_CTR, + counter=secrets_counter) + + return secrets_cipher + +class Secrets: + def __init__(self, filename): + self.filename = filename + self.srs = {} + self.pubkeys = {} + self.privkeys = {} + + def _save(self): + global secrets_cipher, secrets_counter + + old_counter = secrets_counter.c + + # pickle doesn't appear to have problems with trailing whitespace + padded = crypto.pad_to_multiple(pickle.dumps(self), n / 8, ' ', False) + encrypted = secrets_cipher.encrypt(padded) + + f = open(secrets_filename, 'w') + f.write(crypto.encode_mpi_with_padding(old_counter) + encrypted) + f.close() + + def cancel(self): + raise exceptions.Cancelled + + def save(self): + passph1 = None + + def _cont1(passph, checked): + dialogs.PassphraseDialog(_('Confirm Passphrase'), + _('Enter your new passphrase again for confirmation'), + is_modal=False, ok_handler=(_cont2, passph), cancel_handler=self.cancel) + + def _cont2(passph, checked, passph1): + if passph != passph1: + dialogs.PassphraseDialog(_('Create Passphrase'), + _('Passphrases did not match.\n') + + _('Gajim needs you to create a passphrase to encrypt stored secrets'), + is_modal=False, ok_handler=_cont1, cancel_handler=self.cancel) + return + + counter = Counter(16, crypto.random_bytes(16)) + get_key(counter, passph1) + + self._save() + + if not os.path.exists(self.filename): + dialogs.PassphraseDialog(_('Create Passphrase'), + _('Gajim needs you to create a passphrase to encrypt stored secrets'), + is_modal=False, ok_handler=_cont1, cancel_handler=self.cancel) + else: + self._save() + + def retained_secrets(self, account, bare_jid): + try: + return self.srs[account][bare_jid] + except KeyError: + return [] + + # retained secrets are stored as a tuple of the secret and whether the user + # has verified it + def save_new_srs(self, account, jid, secret, verified): + if not account in self.srs: + self.srs[account] = {} + + if not jid in self.srs[account]: + self.srs[account][jid] = [] + + self.srs[account][jid].append((secret, verified)) + + self.save() + + def find_srs(self, account, jid, srs): + our_secrets = self.srs[account][jid] + return filter(lambda (x,y): x == srs, our_secrets)[0] + + # has the user verified this retained secret? + def srs_verified(self, account, jid, srs): + return self.find_srs(account, jid, srs)[1] + + def replace_srs(self, account, jid, old_secret, new_secret, verified): + our_secrets = self.srs[account][jid] + + idx = our_secrets.index(self.find_srs(account, jid, old_secret)) + + our_secrets[idx] = (new_secret, verified) + + self.save() + + # the public key associated with 'account' + def my_pubkey(self, account): + try: + pk = self.privkeys[account] + except KeyError: + pk = Crypto.PublicKey.RSA.generate(384, crypto.random_bytes) + + self.privkeys[account] = pk + self.save() + + return pk + +def load_secrets(filename): + f = open(filename, 'r') + + counter = Counter(16, f.read(16)) + + decrypted = get_key(counter).decrypt(f.read()) + + try: + secrets = pickle.loads(decrypted) + except: + f.close() + + global secrets_cipher + + secrets_cipher = None + + return load_secrets(filename) + else: + f.close() + + return secrets + +def secrets(): + global secrets_cache + + if secrets_cache: + return secrets_cache + + if os.path.exists(secrets_filename): + secrets_cache = load_secrets(secrets_filename) + else: + secrets_cache = Secrets(secrets_filename) + + return secrets_cache diff --git a/src/statusicon.py b/src/statusicon.py index 6610e0087..2b26fd999 100644 --- a/src/statusicon.py +++ b/src/statusicon.py @@ -3,23 +3,33 @@ ## Copyright (C) 2006 Nikos Kouremenos ## Copyright (C) 2007 Lukas Petrovicky ## -## This program is free software; you can redistribute it and/or +## 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; either version 2 ## of the License, or (at your option) any later version. ## -## This program is distributed in the hope that it will be useful, +## 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 sys import gtk import systray +import gobject from common import gajim from common import helpers +if sys.platform == 'darwin': + import osx + class StatusIcon(systray.Systray): '''Class for the notification area icon''' #FIXME: when we migrate to GTK 2.10 stick only to this class @@ -39,16 +49,18 @@ class StatusIcon(systray.Systray): self.on_status_icon_right_clicked) self.set_img() - self.status_icon.props.visible = True + self.status_icon.set_visible(True) + self.subscribe_events() def on_status_icon_right_clicked(self, widget, event_button, event_time): self.make_menu(event_button, event_time) def hide_icon(self): - self.status_icon.props.visible = False + self.status_icon.set_visible(False) + self.unsubscribe_events() def on_status_icon_left_clicked(self, widget): - self.on_left_click() + gobject.idle_add(self.on_left_click) def set_img(self): '''apart from image, we also update tooltip text here''' @@ -57,16 +69,18 @@ class StatusIcon(systray.Systray): text = helpers.get_notification_icon_tooltip_text() self.status_icon.set_tooltip(text) if gajim.events.get_nb_systray_events(): + if sys.platform == 'darwin': + osx.nsapp.requestUserAttention() state = 'event' - self.status_icon.props.blinking = True + self.status_icon.set_blinking(True) else: state = self.status - self.status_icon.props.blinking = False + self.status_icon.set_blinking(False) #FIXME: do not always use 16x16 (ask actually used size and use that) image = gajim.interface.roster.jabber_state_images['16'][state] if image.get_storage_type() == gtk.IMAGE_PIXBUF: - self.status_icon.props.pixbuf = image.get_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! #elif image.get_storage_type() == gtk.IMAGE_ANIMATION: diff --git a/src/systray.py b/src/systray.py index 84ae49877..2d6df9fd4 100644 --- a/src/systray.py +++ b/src/systray.py @@ -1,6 +1,6 @@ ## systray.py ## -## Copyright (C) 2003-2006 Yann Le Boulanger +## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2003-2004 Vincent Hanquez ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2005 Dimitur Kirov @@ -8,15 +8,20 @@ ## Copyright (C) 2005 Norman Rasmussen ## Copyright (C) 2007 Lukas Petrovicky ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 @@ -285,7 +290,8 @@ class Systray: def on_left_click(self): win = gajim.interface.roster.window # toggle visible/hidden for roster window - if win.get_property('visible'): # visible in ANY virtual desktop? + if win.get_property('visible') and win.get_property('has-toplevel-focus'): + # visible in ANY virtual desktop? # we could be in another VD right now. eg vd2 # and we want to show it in vd2 @@ -326,7 +332,12 @@ class Systray: l = ['online', 'chat', 'away', 'xa', 'dnd', 'invisible', 'SEPARATOR', 'CHANGE_STATUS_MSG_MENUITEM', 'SEPARATOR', 'offline'] index = l.index(show) - gajim.interface.roster.status_combobox.set_active(index) + 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() diff --git a/src/tooltips.py b/src/tooltips.py index d1394357d..ecc8741b8 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -3,18 +3,23 @@ ## ## Copyright (C) 2005-2006 Dimitur Kirov ## Copyright (C) 2005-2007 Nikos Kouremenos -## Copyright (C) 2005-2006 Yann Le Boulanger +## Copyright (C) 2005-2006 Yann Leboulanger ## Copyright (C) 2007 Julien Pivotto ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 @@ -26,7 +31,6 @@ import gtkgui_helpers from common import gajim from common import helpers -from common import i18n class BaseTooltip: ''' Base Tooltip class; @@ -65,6 +69,8 @@ class BaseTooltip: self.win.set_border_width(3) self.win.set_resizable(False) self.win.set_name('gtk-tooltips') + if gtk.gtk_version >= (2, 10, 0) and gtk.pygtk_version >= (2, 10, 0): + self.win.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_TOOLTIP) self.win.set_events(gtk.gdk.POINTER_MOTION_MASK) self.win.connect_after('expose_event', self.expose) @@ -90,7 +96,7 @@ class BaseTooltip: half_width = requisition.width / 2 + 1 if self.preferred_position[0] < half_width: self.preferred_position[0] = 0 - elif self.preferred_position[0] + requisition.width > \ + elif self.preferred_position[0] + requisition.width > \ self.screen.get_width() + half_width: self.preferred_position[0] = self.screen.get_width() - \ requisition.width @@ -100,7 +106,7 @@ class BaseTooltip: if self.preferred_position[1] + requisition.height > \ self.screen.get_height(): # flip tooltip up - self.preferred_position[1] -= requisition.height + \ + self.preferred_position[1] -= requisition.height + \ self.widget_height + 8 if self.preferred_position[1] < 0: self.preferred_position[1] = 0 @@ -437,8 +443,8 @@ class RosterTooltip(NotificationAreaTooltip): transport = gajim.get_transport_name_from_jid( prim_contact.jid) if transport: - file_path = os.path.join(gajim.DATA_DIR, 'iconsets', - 'transports', transport , '16x16') + file_path = os.path.join(helpers.get_transport_path(transport), + '16x16') else: iconset = gajim.config.get('iconset') if not iconset: @@ -576,7 +582,7 @@ class RosterTooltip(NotificationAreaTooltip): if property[1]: label.set_markup(property[0]) vcard_table.attach(label, 1, 2, vcard_current_row, - vcard_current_row + 1, gtk.FILL, vertical_fill, 0, 0) + vcard_current_row + 1, gtk.FILL, vertical_fill, 0, 0) label = gtk.Label() label.set_alignment(0, 0) label.set_markup(property[1]) @@ -617,7 +623,7 @@ class FileTransfersTooltip(BaseTooltip): properties.append((_('Name: '), gobject.markup_escape_text(file_name))) if file_props['type'] == 'r': - type = _('Download') + type = _('Download') actor = _('Sender: ') sender = unicode(file_props['sender']).split('/')[0] name = gajim.contacts.get_first_contact_from_jid( @@ -639,18 +645,18 @@ class FileTransfersTooltip(BaseTooltip): properties.append((_('Transferred: '), helpers.convert_bytes(transfered_len))) status = '' if not file_props.has_key('started') or not file_props['started']: - status = _('Not started') + status = _('Not started') elif file_props.has_key('connected'): if file_props.has_key('stopped') and \ file_props['stopped'] == True: status = _('Stopped') elif file_props['completed']: - status = _('Completed') + status = _('Completed') elif file_props['connected'] == False: if file_props['completed']: status = _('Completed') else: - if file_props.has_key('paused') and \ + if file_props.has_key('paused') and \ file_props['paused'] == True: status = _('?transfer status:Paused') elif file_props.has_key('stalled') and \ @@ -660,8 +666,12 @@ class FileTransfersTooltip(BaseTooltip): else: status = _('Transferring') else: - status = _('Not started') + status = _('Not started') properties.append((_('Status: '), status)) + if 'desc' in file_props: + file_desc = file_props['desc'] + properties.append((_('Description: '), gobject.markup_escape_text( + file_desc))) while properties: property = properties.pop(0) current_row += 1 @@ -669,7 +679,7 @@ class FileTransfersTooltip(BaseTooltip): label.set_alignment(0, 0) label.set_markup(property[0]) ft_table.attach(label, 1, 2, current_row, current_row + 1, - gtk.FILL, gtk.FILL, 0, 0) + gtk.FILL, gtk.FILL, 0, 0) label = gtk.Label() label.set_alignment(0, 0) label.set_line_wrap(True) diff --git a/src/vcard.py b/src/vcard.py index 3e11a3cb6..4784d9f0d 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -1,19 +1,24 @@ ## vcard.py (has VcardWindow class and a func get_avatar_pixbuf_encoded_mime) ## -## Copyright (C) 2003-2006 Yann Le Boulanger +## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2005-2006 Nikos Kouremenos ## Copyright (C) 2006 Stefan Bethge ## Copyright (C) 2007 Lukas Petrovicky ## -## 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 file is part of Gajim. ## -## This program is distributed in the hope that it will be useful, +## 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 . +## # THIS FILE IS FOR **OTHERS'** PROFILE (when we VIEW their INFO) @@ -258,18 +263,24 @@ class VcardWindow: connected_contact_list = contact_list # stats holds show and status message stats = '' - one = True # Are we adding the first line ? if connected_contact_list: + # Start with self.contact, as with resources + stats = helpers.get_uf_show(self.contact.show) + if self.contact.status: + stats += ': ' + self.contact.status + if self.contact.last_status_time: + stats += '\n' + _('since %s') % time.strftime('%c', + self.contact.last_status_time).decode( + locale.getpreferredencoding()) for c in connected_contact_list: - if not one: + if c.resource != self.contact.resource: stats += '\n' - stats += helpers.get_uf_show(c.show) - if c.status: - stats += ': ' + c.status - if c.last_status_time: - stats += '\n' + _('since %s') % time.strftime('%c', - c.last_status_time).decode(locale.getpreferredencoding()) - one = False + stats += helpers.get_uf_show(c.show) + if c.status: + stats += ': ' + c.status + if c.last_status_time: + stats += '\n' + _('since %s') % time.strftime('%c', + c.last_status_time).decode(locale.getpreferredencoding()) else: # Maybe gc_vcard ? stats = helpers.get_uf_show(self.contact.show) if self.contact.status: From e5b2db0099ea1b4a0fcf57c7d55ff26d6c692037 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 12 Dec 2007 18:54:08 +0000 Subject: [PATCH 32/32] hide pep menuitems when use_pep is not activated --- src/roster_window.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/roster_window.py b/src/roster_window.py index 0ccc12967..e7334dae2 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -933,6 +933,9 @@ class RosterWindow: profile_avatar_menuitem = self.xml.get_widget('profile_avatar_menuitem') pep_services_menuitem = self.xml.get_widget('pep_services_menuitem') + if not gajim.config.get('use_pep'): + pep_services_menuitem.set_no_show_all(True) + pep_services_menuitem.hide() # destroy old advanced menus for m in self.advanced_menus: m.destroy() @@ -3046,7 +3049,7 @@ class RosterWindow: item.connect('activate', self.change_status, account, 'offline') pep_menuitem = xml.get_widget('pep_menuitem') - if gajim.connections[account].pep_supported: + if gajim.connections[account].pep_supported and gajim.config.get('use_pep'): pep_submenu = gtk.Menu() pep_menuitem.set_submenu(pep_submenu) if gajim.config.get('publish_mood'): @@ -3056,7 +3059,8 @@ class RosterWindow: if gajim.config.get('publish_activity'): item = gtk.MenuItem('Activity') pep_submenu.append(item) - item.connect('activate', self.on_change_activity_activate, account) + item.connect('activate', self.on_change_activity_activate, + account) else: pep_menuitem.set_no_show_all(True) pep_menuitem.hide()