From b8882ba48e1157c228c627a58a9ff541dd524ac8 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sat, 8 Dec 2007 09:09:06 +0000 Subject: [PATCH 01/18] merged realtime cancellation patch --- src/chat_control.py | 9 +++++---- src/common/stanza_session.py | 15 ++++++++++----- src/gajim.py | 25 +++++++++++++------------ src/negotiation.py | 2 +- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index bfc4beb4c..d78a7f1c5 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -1464,6 +1464,9 @@ 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): @@ -2155,7 +2158,7 @@ class ChatControl(ChatControlBase): # this is reverse logic, as we are on 'activate' (before change happens) 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]) @@ -2164,9 +2167,7 @@ class ChatControl(ChatControlBase): if self.session and self.session.enable_encryption: self.session.terminate_e2e() - msg = _('Encryption disabled') - ChatControlBase.print_conversation_line(self, msg, - 'status', '', None) + self.print_esession_details() jid = str(self.session.jid) diff --git a/src/common/stanza_session.py b/src/common/stanza_session.py index 23b994fa4..d8625d6a7 100644 --- a/src/common/stanza_session.py +++ b/src/common/stanza_session.py @@ -36,7 +36,7 @@ class StanzaSession(object): 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)]) @@ -46,7 +46,7 @@ class StanzaSession(object): msg.setAttr('to', self.jid) self.conn.send_stanza(msg) - + if isinstance(msg, xmpp.Message): self.last_send = time.time() @@ -72,8 +72,7 @@ class StanzaSession(object): '''A negotiation has been cancelled, so reset this session to its default state.''' if hasattr(self, 'control'): - msg = _('Session negotiation cancelled') - self.control.print_conversation_line(self, msg, 'status', '', None) + self.control.on_cancel_session_negotiation() self.status = None self.negotiated = {} @@ -350,7 +349,7 @@ class EncryptedStanzaSession(StanzaSession): hash = crypto.sha256(mac_o_calculated) if not eir_pubkey.verify(hash, signature): - raise exceptions.NegotiationError, 'public key signature verification failed!' + 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) @@ -903,3 +902,9 @@ otherwise, list the fields we haven't implemented''' 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/gajim.py b/src/gajim.py index 51659d9cf..d268e0ae2 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -1902,8 +1902,6 @@ class Interface: jid, session, form = data if form.getField('accept') and not form['accept'] in ('1', 'true'): - dialogs.InformationDialog(_('Session negotiation cancelled'), - _('The client at %s cancelled the session negotiation.') % (jid)) session.cancelled_negotiation() return @@ -2018,23 +2016,26 @@ class Interface: except exceptions.Cancelled: # user cancelled the negotiation - session.cancelled_negotiation() + session.reject_negotiation() return - if form.getField('terminate'): - if form.getField('terminate').getValue() in ('1', 'true'): - session.acknowledge_termination() + if form.getField('terminate') and\ + form.getField('terminate').getValue() in ('1', 'true'): + was_encrypted = session.enable_encryption + ctrl = session.control - gajim.connections[account].delete_session(str(jid), session.thread_id) + session.acknowledge_termination() + gajim.connections[account].delete_session(str(jid), session.thread_id) - ctrl = gajim.interface.msg_win_mgr.get_control(str(jid), account) + if ctrl: + new_sess = gajim.connections[account].make_new_session(str(jid)) + ctrl.set_session(new_sess) - 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 + return # non-esession negotiation. this isn't very useful, but i'm keeping it around # to test my test suite. diff --git a/src/negotiation.py b/src/negotiation.py index d0473266c..8cc4c9ad5 100644 --- a/src/negotiation.py +++ b/src/negotiation.py @@ -19,7 +19,7 @@ def show_sas_dialog(session, jid, sas, on_success): on_success(checked) def failure_cb(): - session.cancelled_negotiation() + 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. From 0b48b05218d5b543a6b058dd3ae1f018e4e4efce Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Tue, 5 Feb 2008 03:09:31 +0000 Subject: [PATCH 02/18] merged trunk into session_centric branch --- TODO.pep | 13 + autogen.sh | 2 +- configure.ac | 2 +- data/Makefile.am | 8 +- data/glade/account_context_menu.glade | 14 + .../account_creation_wizard_window.glade | 2 +- data/glade/accounts_window.glade | 674 +- data/glade/change_activity_dialog.glade | 158 + data/glade/change_mood_dialog.glade | 145 + data/glade/history_manager.glade | 2 +- data/glade/manage_pep_services_window.glade | 135 + data/glade/message_window.glade | 66 +- data/glade/preferences_window.glade | 2388 +++--- data/glade/roster_window.glade | 95 +- data/glade/vcard_information_window.glade | 37 +- po/POTFILES.skip | 3 +- po/de.po | 3412 +++++--- po/fr.po | 402 +- po/ru.po | 3036 ++++--- po/sk.po | 7123 ++++++++++------- src/Makefile.am | 16 +- src/chat_control.py | 167 +- src/common/GnuPG.py | 36 +- src/common/config.py | 22 +- src/common/connection.py | 199 +- src/common/connection_handlers.py | 87 +- src/common/contacts.py | 25 +- src/common/defs.py | 2 +- src/common/gajim.py | 19 +- src/common/helpers.py | 48 +- src/common/optparser.py | 25 +- src/common/pep.py | 220 + src/common/pubsub.py | 53 + src/common/socks5.py | 2 +- src/common/stanza_session.py | 7 +- src/common/xmpp/protocol.py | 17 +- src/common/xmpp/roster.py | 6 +- src/common/xmpp/transports_nb.py | 12 +- .../zeroconf/connection_handlers_zeroconf.py | 5 +- src/common/zeroconf/connection_zeroconf.py | 81 +- src/config.py | 701 +- src/conversation_textview.py | 147 +- src/dataforms_widget.py | 2 +- src/dialogs.py | 322 +- src/disco.py | 1 - src/features_window.py | 13 +- src/gajim.py | 166 +- src/groupchat_control.py | 62 +- src/gtkgui_helpers.py | 5 + src/history_manager.py | 40 +- src/lastfm.py | 2 +- src/message_control.py | 10 +- src/message_window.py | 198 +- src/music_track_listener.py | 98 +- src/notify.py | 16 +- src/osx/.deps/idle_la-idle.Plo | 1 - src/osx/.deps/nsapp.Plo | 1 - src/osx/growl/.deps/_growlImage.Plo | 1 - src/osx/growl/.deps/_growl_la-_growl.Plo | 1 - src/osx/idle.c | 1 + .../syncmenu/.deps/syncmenu_la-pysyncmenu.Plo | 1 - .../syncmenu/.deps/syncmenu_la-sync-menu.Plo | 1 - src/remote_control.py | 9 +- src/roster_window.py | 925 ++- src/statusicon.py | 3 +- src/systray.py | 18 +- src/tooltips.py | 53 +- src/vcard.py | 3 +- 68 files changed, 13704 insertions(+), 7863 deletions(-) create mode 100644 TODO.pep create mode 100644 data/glade/change_activity_dialog.glade create mode 100644 data/glade/change_mood_dialog.glade create mode 100644 data/glade/manage_pep_services_window.glade create mode 100644 src/common/pep.py delete mode 100644 src/osx/.deps/idle_la-idle.Plo delete mode 100644 src/osx/.deps/nsapp.Plo delete mode 100644 src/osx/growl/.deps/_growlImage.Plo delete mode 100644 src/osx/growl/.deps/_growl_la-_growl.Plo delete mode 100644 src/osx/syncmenu/.deps/syncmenu_la-pysyncmenu.Plo delete mode 100644 src/osx/syncmenu/.deps/syncmenu_la-sync-menu.Plo diff --git a/TODO.pep b/TODO.pep new file mode 100644 index 000000000..cf622c632 --- /dev/null +++ b/TODO.pep @@ -0,0 +1,13 @@ +• configure access model when changing it in the combobox +• PEP in status change + +Tune use cases: +• on disconnection of an account set Tune to None + +Tooltips use cases: +• Show PEP in GC 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/autogen.sh b/autogen.sh index 97eb8bbce..be23e7424 100755 --- a/autogen.sh +++ b/autogen.sh @@ -9,7 +9,7 @@ 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 >> \ + src/*py src/common/*py src/common/zeroconf/*.py src/osx/*.py >> \ po/POTFILES.in || exit 1 if test -z `which pkg-config 2>/dev/null`;then echo "***Error: pkg-config not found***" diff --git a/configure.ac b/configure.ac index 68f3e9ada..d06f12820 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_INIT([Gajim - A Jabber Instant Messager], - [0.11.4.0-svn],[http://trac.gajim.org/],[gajim]) + [0.11.4.2-svn],[http://trac.gajim.org/],[gajim]) AC_PREREQ([2.59]) AM_INIT_AUTOMAKE([1.8]) AC_CONFIG_HEADER(config.h) diff --git a/data/Makefile.am b/data/Makefile.am index c34b2916f..7bca50fc1 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -14,7 +14,13 @@ sounds_DATA = $(srcdir)/sounds/*.wav otherdir = $(pkgdatadir)/data/other other_DATA = other/servers.xml other/cacerts.pem -man_MANS = gajim.1 gajim-remote.1 +if BUILD_REMOTE_CONTROL +OPTIONAL_MAN = gajim-remote.1 +else +OPTIONAL_MAN = +endif + +man_MANS = gajim.1 $(OPTIONAL_MAN) EXTRA_DIST = $(desktop_in_files) \ diff --git a/data/glade/account_context_menu.glade b/data/glade/account_context_menu.glade index 08bd16859..4316c5f0c 100644 --- a/data/glade/account_context_menu.glade +++ b/data/glade/account_context_menu.glade @@ -17,6 +17,20 @@ + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + _Personal Events + True + + + gtk-home + 1 + + + + True diff --git a/data/glade/account_creation_wizard_window.glade b/data/glade/account_creation_wizard_window.glade index 38997769f..6b2c246a7 100644 --- a/data/glade/account_creation_wizard_window.glade +++ b/data/glade/account_creation_wizard_window.glade @@ -117,7 +117,7 @@ to the Jabber network. True 0 - <b>Please fill in the data for your new account</b> + <b>Please fill in the data for your existing account</b> True diff --git a/data/glade/accounts_window.glade b/data/glade/accounts_window.glade index 4915193f9..8d926945e 100644 --- a/data/glade/accounts_window.glade +++ b/data/glade/accounts_window.glade @@ -51,6 +51,7 @@ GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-add True + 0 @@ -66,6 +67,7 @@ GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-remove True + 0 @@ -79,6 +81,7 @@ True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 0 @@ -138,6 +141,7 @@ False + True @@ -152,9 +156,6 @@ True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - False - @@ -175,34 +176,135 @@ 6 6 - + True + 0 + _Jabber ID: + True + + + GTK_FILL + + + + + + True + 0 + _Password: + True + + + 1 + 2 + GTK_FILL + + + + + + True + False 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) + False * - Gajim - + True + 1 - 3 - 2 - 3 + 2 + 1 + 2 GTK_EXPAND | GTK_SHRINK | GTK_FILL - + True True - * - True - + If checked, Gajim will remember the password for this account + Save pass_word + True + False + 0 + True + + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + + True + 0 + Resour_ce: + True + + + 2 + 3 + GTK_FILL + + + + + + True + 0 + Priori_ty: + True + + + 3 + 4 + GTK_FILL + + + + + + True + True + Priority will change automatically according to your status. + _Adjust to status + True + 0 + True + 1 + 2 + 3 + 4 + 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 @@ -222,6 +324,7 @@ Click to request authorization to all contacts of another account Synchronise contacts True + 0 @@ -235,6 +338,7 @@ Click to change account's password Chan_ge Password True + 0 @@ -263,140 +367,38 @@ - + 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 + 3 + + + + + + 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 - 0 - _Password: - True - - - 1 - 2 - GTK_FILL - - - - - - True - 0 - _Jabber ID: - True - - - GTK_FILL - - - - - False - @@ -405,7 +407,6 @@ tab - False False @@ -421,6 +422,7 @@ If checked, Gajim, when launched, will automatically connect to jabber using this account C_onnect on Gajim startup True + 0 True @@ -435,6 +437,7 @@ True Auto-reconnect when connection is lost True + 0 True @@ -450,6 +453,7 @@ True Save conversation _logs for all contacts True + 0 True True @@ -467,6 +471,7 @@ 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 + 0 True @@ -483,6 +488,7 @@ 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 + 0 True @@ -495,7 +501,6 @@ 1 - False @@ -507,7 +512,6 @@ tab 1 - False False @@ -517,48 +521,84 @@ 6 12 - + True - 6 - 6 + 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 + 6 + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + use HTTP_PROXY environment variable + 0 + True + + + + False + + + + + True + 6 + + + True + None + + + + + + True + True + Manage... + True + 0 + + + + False + False + 1 + + + + + False + 1 + + + + + + True - Proxy: + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>Proxy</b> + True - False - False - - - - - True - None - - - - 1 - - - - - True - True - Manage... - True - - - - False - False - 2 + label_item - - False - @@ -575,14 +615,15 @@ 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) + Check this so Gajim will ask you before sending your password over an insecure connection. + _Warn before using an insecure connection True + 0 True - + False @@ -596,6 +637,7 @@ If checked, Gajim will send keep-alive packets to prevent connection timeout which results in disconnection Send keep-alive packets True + 0 True True @@ -612,6 +654,7 @@ True Use custom hostname/port True + 0 True @@ -700,7 +743,6 @@ 2 - False @@ -711,7 +753,6 @@ tab 2 - False False @@ -766,6 +807,7 @@ True Choose _Key... True + 0 @@ -787,12 +829,14 @@ If checked, Gajim will get the password from a GPG agent like seahorse Use GPG _Agent True + 0 True False False + 1 @@ -831,6 +875,7 @@ Information about you, as stored in the server Edit Personal Information... True + 0 @@ -855,7 +900,6 @@ 3 - False @@ -866,14 +910,12 @@ tab 3 - False False 1 - False @@ -892,6 +934,7 @@ True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Enable + 0 True @@ -915,6 +958,7 @@ If checked, Gajim, when launched, will automatically connect to jabber using this account C_onnect on Gajim startup True + 0 True @@ -929,6 +973,7 @@ True Save conversation _logs for all contacts True + 0 True @@ -945,6 +990,7 @@ 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 + 0 True @@ -965,6 +1011,7 @@ You might consider to change possible firewall settings. Use custom port: True + 0 True @@ -994,9 +1041,6 @@ You might consider to change possible firewall settings. - - False - @@ -1006,7 +1050,6 @@ You might consider to change possible firewall settings. tab - False False @@ -1018,125 +1061,6 @@ You might consider to change possible firewall settings. 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 @@ -1181,6 +1105,7 @@ You might consider to change possible firewall settings. True Choose _Key... True + 0 @@ -1201,12 +1126,14 @@ You might consider to change possible firewall settings. If checked, Gajim will get the password from a GPG agent like seahorse Use GPG _Agent True + 0 True False False + 2 @@ -1215,10 +1142,128 @@ You might consider to change possible firewall settings. GTK_FILL + + + True + 0 + <b>Personal Information</b> + True + + + 2 + 1 + 2 + GTK_FILL + + + + + + True + True + + + + 1 + 2 + 2 + 3 + + + + + + True + First Name: + + + 2 + 3 + GTK_FILL + + + + + + True + True + + + + 1 + 2 + 3 + 4 + + + + + + True + Last Name: + + + 3 + 4 + GTK_FILL + + + + + + True + True + + + + 1 + 2 + 5 + 6 + + + + + + True + E-Mail: + + + 5 + 6 + GTK_FILL + + + + + + True + Jabber ID: + + + 4 + 5 + GTK_FILL + + + + + + True + True + + + + 1 + 2 + 4 + 5 + + + 1 - False @@ -1229,7 +1274,6 @@ You might consider to change possible firewall settings. tab 1 - False False @@ -1241,7 +1285,6 @@ You might consider to change possible firewall settings. 2 - False @@ -1251,6 +1294,10 @@ You might consider to change possible firewall settings. + + True + True + @@ -1261,24 +1308,14 @@ You might consider to change possible firewall settings. GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Mer_ge accounts True + 0 True - False 1 - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - False - 2 - - True @@ -1293,6 +1330,7 @@ You might consider to change possible firewall settings. GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-close True + 0 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/data/glade/change_mood_dialog.glade b/data/glade/change_mood_dialog.glade new file mode 100644 index 000000000..47122c872 --- /dev/null +++ b/data/glade/change_mood_dialog.glade @@ -0,0 +1,145 @@ + + + + + + + 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 + True + True + True + 0 + + True + + False + + + 0 + False + False + + + + + + + + + 0 + True + True + + + + + + + diff --git a/data/glade/history_manager.glade b/data/glade/history_manager.glade index 347d53d94..0ed565d08 100644 --- a/data/glade/history_manager.glade +++ b/data/glade/history_manager.glade @@ -43,7 +43,7 @@ True - + True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK diff --git a/data/glade/manage_pep_services_window.glade b/data/glade/manage_pep_services_window.glade new file mode 100644 index 000000000..a3e5e6155 --- /dev/null +++ b/data/glade/manage_pep_services_window.glade @@ -0,0 +1,135 @@ + + + + + + + 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 + True + gtk-add + True + GTK_RELIEF_NORMAL + True + -5 + + + + + + True + True + True + True + gtk-delete + True + GTK_RELIEF_NORMAL + True + -5 + + + + + + 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/data/glade/message_window.glade b/data/glade/message_window.glade index 07d39763c..f088b4e9f 100644 --- a/data/glade/message_window.glade +++ b/data/glade/message_window.glade @@ -108,15 +108,34 @@ - + True - True - 3 - GTK_POLICY_NEVER - GTK_POLICY_NEVER - GTK_SHADOW_IN + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + True + gtk-dialog-authentication + + + False + + + + + True + True + 3 + GTK_POLICY_NEVER + GTK_POLICY_NEVER + GTK_SHADOW_IN + + + + + + 1 + @@ -136,38 +155,6 @@ True 1 - - - True - OpenPGP Encryption - - - True - GTK_RELIEF_NONE - False - 0 - - - True - gtk-dialog-authentication - - - - - - - False - - - - - True - - - False - 1 - - @@ -399,6 +386,7 @@ + True 3 diff --git a/data/glade/preferences_window.glade b/data/glade/preferences_window.glade index 0bd3604fa..c4e2ebea9 100644 --- a/data/glade/preferences_window.glade +++ b/data/glade/preferences_window.glade @@ -21,7 +21,7 @@ True 12 - 6 + 12 True @@ -32,6 +32,7 @@ True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 12 @@ -75,6 +76,7 @@ True True + If checked, Gajim will sort contacts in roster window and groupcahts by their status and not by the shown name _Sort contacts by status True 0 @@ -117,15 +119,86 @@ True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 12 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - 6 + 5 2 6 6 + + + 50 + True + Detached roster with detached chats +Detached roster with single chat +Single window for everything +Detached roster with chat grouped by account +Detached roster with chat grouped by type + + + + 1 + 2 + 1 + 2 + + + + + True + If checked, Gajim will highlight spelling errors in input fields of chat windows. If no language is explicitly set via right click on the input field, the default language will be used for this contact or group chat. + _Highlight misspelled words + True + 0 + True + + + + 2 + 4 + 5 + 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 + 3 + 4 + GTK_FILL + + + + + True + Hide all buttons in chat windows + _Make message windows compact + True + 0 + True + + + + 2 + 2 + 3 + GTK_FILL + + True @@ -151,91 +224,6 @@ 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 - - - - 1 - 2 - 2 - 3 - GTK_FILL - - - - - True - Determined by sender -Chat message -Single message - - - - 1 - 2 - 1 - 2 - GTK_FILL @@ -243,23 +231,10 @@ Single message True 0 1 - Use only one message _window: + _Window behavior: True one_window_type_combobox - - 2 - 3 - GTK_FILL - - - - - True - 0 - 1 - Treat all incoming messages as: - 1 2 @@ -287,160 +262,7 @@ Single message 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 - - - - False - @@ -449,449 +271,6 @@ Single message tab - False - 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 - - - - 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 - - - - 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 - False - - - - - True - Privacy - - - tab - 1 - False False @@ -940,7 +319,6 @@ Show only in roster - False 1 @@ -995,61 +373,72 @@ Show only in roster - + True + False True + 0 + GTK_SHADOW_NONE - + True - True - 0 - + 6 + 12 - + True - 0 - 0 + 6 - + True - 2 - - - True - gtk-open - - - False - False - - - - - True - _Advanced Notifications Control... - True - - - False - False - 1 - - + True + If checked, Gajim will show a notification when a new e-mail is received via GMail + 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 + - - False - False - - + + True + <b>GMail Options</b> + True + + + label_item + + False + False 4 @@ -1082,6 +471,7 @@ Show only in roster True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 12 @@ -1221,6 +611,306 @@ Show only in roster + + 1 + + + + + 1 + + + + + True + Notifications + + + tab + 1 + False + + + + + True + 12 + 12 + + + 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 + 6 + 12 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + 2 + 6 + 6 + + + True + All chat states +Composing only +Disabled + + + 1 + 2 + + + + + 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 + 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 + All chat states +Composing only +Disabled + + + 1 + 2 + 1 + 2 + + + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>Chat state 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 + 6 + 12 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + 4 + 6 + 6 + + + True + 0 + 1 + Allow others to see your: + True + one_window_type_combobox + + + GTK_FILL + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Tune + True + 0 + True + + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + True + 0 + 1 + Receive your contact's: + True + True + one_window_type_combobox + + + 1 + 2 + GTK_FILL + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Tune + True + 0 + True + + + + 2 + 3 + GTK_FILL + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Activity + True + 0 + True + + + + 3 + 4 + GTK_FILL + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Mood + True + 0 + True + + + + 1 + 2 + GTK_FILL + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Activity + True + 0 + True + + + + 3 + 4 + 1 + 2 + GTK_FILL + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Mood + True + 0 + True + + + + 1 + 2 + 1 + 2 + GTK_FILL + + + + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>Publish and Subscribe</b> + True + + + label_item + + + False 1 @@ -1229,18 +919,17 @@ Show only in roster 2 - False - + True - Events + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Personal Events tab 2 - False False @@ -1250,273 +939,294 @@ Show only in roster 12 12 - + True - 2 - 4 - 12 - 6 + True + 0 + GTK_SHADOW_NONE - + 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 + 6 + 12 - - 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 + 2 + 4 + 12 + 6 - + True True + The auto not available status message. If empty, Gajim will not change the current status message + + + 3 + 4 + 1 + 2 + + + + + + True + True + The auto away status message. If empty, Gajim will not change the current 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 + If checked, Gajim will change status to Not Available when the computer has not been used even longer + _Not available after: + True + 0 + True + + + + 1 + 2 + GTK_FILL + + + + + + True + True + If checked, Gajim will change status to Away when the computer is unused. + _Away after: + True + 0 + True + + + + GTK_FILL + + - - - True - Default Status Messages - - - label_item - - + + + True + <b>Auto Status</b> + True + + + label_item + + False - 3 + False + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 6 + + + 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 + + + + + True + True + If enabled, Gajim will not ask for a status message. The specified default message will be used instead. + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + + + + + 1 + + + + + + + + + True + <b>Status Messages</b> + True + + + label_item + + + + + 1 @@ -1530,90 +1240,92 @@ Show only in roster 6 12 - + True - 6 + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + 2 + 6 + 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_POLICY_NEVER + GTK_POLICY_NEVER GTK_SHADOW_IN True True + 3 + GTK_WRAP_WORD - False - False - 1 + 1 + 2 + GTK_FILL + + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + False + + + + + + + + + True + 5 + GTK_BUTTONBOX_START + + + True + True + True + gtk-new + True + 0 + + + + + + True + True + True + gtk-delete + True + 0 + + + + 1 + + + + + 1 + 2 + GTK_FILL + GTK_FILL @@ -1632,13 +1344,12 @@ Show only in roster - 4 + 2 3 - False @@ -1649,7 +1360,476 @@ Show only in roster tab 3 - False + False + + + + + True + 12 + 12 + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 2 + 2 + 6 + 6 + + + + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Chat message: + + + GTK_FILL + GTK_FILL + + + + + True + True + Use system _default + True + 0 + True + + + + 1 + 2 + 1 + 2 + + + + + True + True + 0 + + + 1 + 2 + + + + + + + + + True + <b>Font</b> + True + + + label_item + + + + + False + False + + + + + True + 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 + 6 + 12 + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 3 + 3 + 6 + 6 + + + + + + + + + True + 0 + T_heme: + True + theme_combobox + + + GTK_FILL + GTK_FILL + + + + + True + True + Configure color and font of the interface + Ma_nage... + True + 0 + + + + 2 + 3 + GTK_FILL + GTK_FILL + + + + + True + + + + 1 + 2 + + + + + True + 0 + Status _iconset: + True + iconset_combobox + + + 1 + 2 + GTK_FILL + GTK_FILL + + + + + True + + + + 1 + 2 + 1 + 2 + GTK_FILL + GTK_FILL + + + + + 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 icons + True + 0 + True + + + + 1 + 3 + 2 + 3 + + + + + + + + + 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 + 1 + + + + + True + 0 + GTK_SHADOW_NONE + + + True + 6 + 12 + + + True + 3 + 4 + 12 + 6 + + + 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 highlight: + 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 + + + + + + + + + + True + <b>Chat Line Colors</b> + True + + + label_item + + + + + False + False + 2 + + + + + 4 + + + + + True + Style + + + tab + 4 False @@ -1657,7 +1837,7 @@ Show only in roster True 12 - 6 + 12 True @@ -1822,50 +2002,70 @@ Custom - + True - 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 6 12 - + True - 6 + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + 3 + 1 + 6 + 6 - + True True - Notify on new _GMail email + If checked, Gajim log GPG or E2E encrypted messages. However, when using E2E encryption the remote site has to agree on logging. If the other side has declined logging, your messages will NOT be logged. + Log _encrypted chat session True 0 True - + - False - False + 2 + 3 - + True True - If checked, Gajim will also include information about the sender of the new emails - Display _extra email details + If checked, Gajim will allow others to detect the operation system you are using + Allow _OS information to be sent True 0 True - + - False - False - 1 + 1 + 2 + + + + + True + True + If checked, Gajim will ignore incoming events from unauthorized contacts. 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 + + + + GTK_FILL @@ -1873,9 +2073,10 @@ Custom - + True - <b>GMail Options</b> + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + <b>Privacy</b> True @@ -1885,7 +2086,6 @@ Custom False - False 1 @@ -1918,27 +2118,11 @@ Custom 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 + Check on startup if Gajim is the _default Jabber client True 0 True @@ -1947,7 +2131,7 @@ Custom False False - 2 + 1 @@ -2047,8 +2231,7 @@ Custom - 4 - False + 5 @@ -2058,8 +2241,7 @@ Custom tab - 4 - False + 5 False diff --git a/data/glade/roster_window.glade b/data/glade/roster_window.glade index 625a713b2..ff908d794 100644 --- a/data/glade/roster_window.glade +++ b/data/glade/roster_window.glade @@ -193,6 +193,14 @@ + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + _Services + True + + @@ -222,6 +230,17 @@ + + + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Show _roster + True + True + + + + True @@ -344,45 +363,65 @@ - + True True - 2 - GTK_POLICY_NEVER - GTK_POLICY_AUTOMATIC + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - + True - True - False - True - - - - - - - - - - + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + 2 + GTK_POLICY_NEVER + GTK_POLICY_AUTOMATIC + + + True + True + False + True + + + + + + + + + + + + + + + + + True + + + + False + 1 + + + + False + True + + + + 1 - - - True - - - - False - 2 - - diff --git a/data/glade/vcard_information_window.glade b/data/glade/vcard_information_window.glade index 17685e322..f2754157f 100644 --- a/data/glade/vcard_information_window.glade +++ b/data/glade/vcard_information_window.glade @@ -54,6 +54,7 @@ 5 5 True + PANGO_ELLIPSIZE_END @@ -94,6 +95,7 @@ 5 5 True + PANGO_ELLIPSIZE_END 1 @@ -218,8 +220,8 @@ True 6 - - True + + True User avatar: @@ -227,17 +229,6 @@ False - - - True - None - - - False - False - 1 - - True @@ -254,7 +245,7 @@ False False - 2 + 1 @@ -265,7 +256,7 @@ False False - 3 + 2 @@ -277,11 +268,12 @@ False False - 4 + 3 + False 1 @@ -384,9 +376,6 @@ - - False - @@ -397,7 +386,6 @@ tab - False False @@ -1014,7 +1002,6 @@ 1 - False @@ -1027,7 +1014,6 @@ tab 1 - False False @@ -1459,7 +1445,6 @@ 2 - False @@ -1472,7 +1457,6 @@ tab 2 - False False @@ -1497,7 +1481,6 @@ 3 - False @@ -1510,7 +1493,6 @@ tab 3 - False False @@ -1533,7 +1515,6 @@ 4 - False @@ -1544,7 +1525,6 @@ tab 4 - False False @@ -1588,6 +1568,7 @@ + False 2 diff --git a/po/POTFILES.skip b/po/POTFILES.skip index 8b1378917..c7bedf35f 100644 --- a/po/POTFILES.skip +++ b/po/POTFILES.skip @@ -1 +1,2 @@ - +data/gajim.desktop.in +src/eggtrayicon.c diff --git a/po/de.po b/po/de.po index 2b640dfaa..d82abea7e 100644 --- a/po/de.po +++ b/po/de.po @@ -2,9 +2,10 @@ # Copyright (C) 2005 THE gajim'S COPYRIGHT HOLDER # This file is distributed under the same license as the gajim package. # Fridtjof Busse , 2005, 2006. -# Benjamin Drung , 2007. +# Benjamin Drung , 2007, 2008. # Fabian Fingerle , 2007. # Sebastian Schäfer , 2007. +# Nico Gulden , 2007 # #: ../src/gajim-remote.py:220 ../src/gajim-remote.py:227 #: ../src/gajim-remote.py:253 ../src/gajim-remote.py:254 @@ -14,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: gajim 0.11\n" "Report-Msgid-Bugs-To: \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" +"POT-Creation-Date: 2008-01-14 21:09+0100\n" +"PO-Revision-Date: 2007-12-18 00:20+0100\n" +"Last-Translator: Benjamin Drung \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -38,35 +39,40 @@ msgstr "Jabber IM-Client" #: ../data/glade/account_context_menu.glade.h:1 #: ../data/glade/roster_window.glade.h:8 msgid "Join _Group Chat..." -msgstr "_Chatraum beitreten..." +msgstr "_Chatraum beitreten ..." #: ../data/glade/account_context_menu.glade.h:2 msgid "_Add Contact..." -msgstr "Kontakt _hinzufügen..." +msgstr "Kontakt _hinzufügen ..." #: ../data/glade/account_context_menu.glade.h:3 -#: ../data/glade/roster_window.glade.h:15 +#: ../data/glade/roster_window.glade.h:16 msgid "_Discover Services" msgstr "_Dienste durchsuchen" #: ../data/glade/account_context_menu.glade.h:4 msgid "_Execute Command..." -msgstr "_Befehl ausführen..." +msgstr "_Befehl ausführen ..." #: ../data/glade/account_context_menu.glade.h:5 msgid "_Modify Account" -msgstr "Konto bearbeiten" +msgstr "Konto _bearbeiten" #: ../data/glade/account_context_menu.glade.h:6 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" +#, fuzzy +msgid "_Personal Events" +msgstr "Persönliche Details" #: ../data/glade/account_context_menu.glade.h:8 +#: ../data/glade/roster_window.glade.h:25 +msgid "_Start Chat..." +msgstr "_Chat starten ..." + +#: ../data/glade/account_context_menu.glade.h:9 #: ../data/glade/zeroconf_context_menu.glade.h:2 msgid "_Status" msgstr "_Status" @@ -83,7 +89,7 @@ msgstr "" #: ../data/glade/account_creation_wizard_window.glade.h:4 msgid "Please choose one of the options below:" -msgstr "Bitte wählen Sie eine der Optionen:" +msgstr "Bitte wählen Sie eine der Optionen aus:" #: ../data/glade/account_creation_wizard_window.glade.h:5 msgid "Please fill in the data for your new account" @@ -94,64 +100,70 @@ msgid "Please select a server" msgstr "Bitte einen Server wählen" #: ../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 "" "Klicken, um die Fähigkeiten (z.B. MSN-, ICQ-Transporte) auf Jabber-Servern " "zu sehen." -#: ../data/glade/account_creation_wizard_window.glade.h:8 +#: ../data/glade/account_creation_wizard_window.glade.h:11 msgid "Connect when I press Finish" msgstr "Verbinde, sobald ich Fertig klicke" -#: ../data/glade/account_creation_wizard_window.glade.h:9 +#: ../data/glade/account_creation_wizard_window.glade.h:12 msgid "Gajim: Account Creation Wizard" msgstr "Gajim: Kontoeinrichtungs-Assistent" -#: ../data/glade/account_creation_wizard_window.glade.h:10 +#: ../data/glade/account_creation_wizard_window.glade.h:13 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 +#: ../data/glade/account_creation_wizard_window.glade.h:14 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:12 +#: ../data/glade/account_creation_wizard_window.glade.h:15 #: ../data/glade/account_modification_window.glade.h:20 -#: ../data/glade/accounts_window.glade.h:23 +#: ../data/glade/accounts_window.glade.h:24 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:13 +#: ../data/glade/account_creation_wizard_window.glade.h:16 #: ../data/glade/account_modification_window.glade.h:26 -#: ../data/glade/accounts_window.glade.h:32 +#: ../data/glade/accounts_window.glade.h:33 msgid "Manage..." -msgstr "_Verwalten..." +msgstr "_Verwalten ..." -#: ../data/glade/account_creation_wizard_window.glade.h:14 +#: ../data/glade/account_creation_wizard_window.glade.h:17 msgid "Prox_y:" -msgstr "Proxy:" +msgstr "Prox_y:" -#: ../data/glade/account_creation_wizard_window.glade.h:15 +#: ../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 "Pass_wort speichern" -#: ../data/glade/account_creation_wizard_window.glade.h:16 +#: ../data/glade/account_creation_wizard_window.glade.h:19 msgid "Servers Features" msgstr "Fähigkeiten des Servers" -#: ../data/glade/account_creation_wizard_window.glade.h:17 +#: ../data/glade/account_creation_wizard_window.glade.h:20 msgid "Set my profile when I connect" -msgstr "Setze mein Profil, wenn ich mich verbinde" +msgstr "Mein Profil setzen, wenn ich mich verbinde" -#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../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 "Verwende benutzerdefinierten Hostnamen und Port" +msgstr "Benutzerdefinierten Rechnernamen und Port verwenden" -#: ../data/glade/account_creation_wizard_window.glade.h:19 +#: ../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." @@ -159,40 +171,39 @@ 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:21 +#: ../data/glade/account_creation_wizard_window.glade.h:24 msgid "Your JID:" msgstr "Ihre JID:" -#: ../data/glade/account_creation_wizard_window.glade.h:22 -#: ../data/glade/roster_window.glade.h:13 +#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/roster_window.glade.h:14 msgid "_Advanced" msgstr "_Erweitert" -#: ../data/glade/account_creation_wizard_window.glade.h:23 +#: ../data/glade/account_creation_wizard_window.glade.h:26 msgid "_Finish" msgstr "_Beenden" -#: ../data/glade/account_creation_wizard_window.glade.h:24 -#, fuzzy +#: ../data/glade/account_creation_wizard_window.glade.h:27 msgid "_Hostname:" -msgstr "_Hostname: " +msgstr "Rec_hnername:" -#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../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 "_Passwort:" -#: ../data/glade/account_creation_wizard_window.glade.h:26 +#: ../data/glade/account_creation_wizard_window.glade.h:29 #: ../data/glade/manage_proxies_window.glade.h:11 msgid "_Port:" msgstr "_Port:" -#: ../data/glade/account_creation_wizard_window.glade.h:27 +#: ../data/glade/account_creation_wizard_window.glade.h:30 msgid "_Server:" msgstr "_Server:" -#: ../data/glade/account_creation_wizard_window.glade.h:28 +#: ../data/glade/account_creation_wizard_window.glade.h:31 #: ../data/glade/manage_proxies_window.glade.h:12 msgid "_Username:" msgstr "_Benutzername:" @@ -216,7 +227,7 @@ msgid "Personal Information" msgstr "Persönliche Informationen" #: ../data/glade/account_modification_window.glade.h:4 -#: ../data/glade/accounts_window.glade.h:4 +#: ../data/glade/accounts_window.glade.h:5 msgid "Account" msgstr "Konto" @@ -225,28 +236,28 @@ msgid "Account Modification" msgstr "Kontoänderung" #: ../data/glade/account_modification_window.glade.h:6 -#: ../data/glade/accounts_window.glade.h:5 +#: ../data/glade/accounts_window.glade.h:6 msgid "Administration operations" msgstr "Administrative Aktionen" #: ../data/glade/account_modification_window.glade.h:7 -#: ../data/glade/accounts_window.glade.h:6 +#: ../data/glade/accounts_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:8 -#: ../data/glade/accounts_window.glade.h:7 +#: ../data/glade/accounts_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:9 -#: ../data/glade/accounts_window.glade.h:8 +#: ../data/glade/accounts_window.glade.h:9 msgid "Chan_ge Password" msgstr "Pass_wort ändern" #: ../data/glade/account_modification_window.glade.h:10 -#: ../data/glade/accounts_window.glade.h:9 +#: ../data/glade/accounts_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 " @@ -259,59 +270,60 @@ msgstr "" "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/accounts_window.glade.h:11 #: ../data/glade/zeroconf_properties_window.glade.h:4 msgid "Choose _Key..." -msgstr "_Schlüssel wählen..." +msgstr "_Schlüssel wählen ..." #: ../data/glade/account_modification_window.glade.h:12 -#: ../data/glade/accounts_window.glade.h:11 +#: ../data/glade/accounts_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:13 -#: ../data/glade/accounts_window.glade.h:12 +#: ../data/glade/accounts_window.glade.h:13 msgid "Click to request authorization to all contacts of another account" msgstr "" +"Klicken, um alle Kontakte eines anderen Kontos um Authorisierung zu fragen" #: ../data/glade/account_modification_window.glade.h:14 -#: ../data/glade/accounts_window.glade.h:13 +#: ../data/glade/accounts_window.glade.h:14 msgid "Connection" msgstr "Verbindung" #: ../data/glade/account_modification_window.glade.h:15 -#: ../data/glade/accounts_window.glade.h:15 +#: ../data/glade/accounts_window.glade.h:16 msgid "Edit Personal Information..." -msgstr "Persönliche Details bearbeiten ..." +msgstr "Persönliche Informationen bearbeiten ..." #. 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 +#: ../data/glade/accounts_window.glade.h:19 +#: ../data/glade/roster_window.glade.h:6 ../src/notify.py:491 +#: ../src/notify.py:522 ../src/notify.py:534 ../src/common/helpers.py:998 #: ../src/common/helpers.py:1010 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/accounts_window.glade.h:20 +#: ../data/glade/preferences_window.glade.h:52 #: ../data/glade/zeroconf_properties_window.glade.h:7 -#: ../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 +#: ../src/roster_window.py:373 ../src/roster_window.py:639 +#: ../src/roster_window.py:1412 ../src/roster_window.py:1791 +#: ../src/roster_window.py:2278 ../src/roster_window.py:2678 +#: ../src/roster_window.py:2805 ../src/common/contacts.py:320 msgid "General" msgstr "Allgemein" #: ../data/glade/account_modification_window.glade.h:18 -#: ../data/glade/accounts_window.glade.h:20 +#: ../data/glade/accounts_window.glade.h:21 msgid "Hostname: " msgstr "Hostname: " #: ../data/glade/account_modification_window.glade.h:19 -#: ../data/glade/accounts_window.glade.h:21 +#: ../data/glade/accounts_window.glade.h:22 msgid "" "If checked, Gajim will also broadcast some more IPs except from just your " "IP, so file transfer has higher chances of working." @@ -320,7 +332,7 @@ msgstr "" "wodurch Datentransfers eine höhere Erfolgswahrscheinlichkeit bekommen." #: ../data/glade/account_modification_window.glade.h:21 -#: ../data/glade/accounts_window.glade.h:24 +#: ../data/glade/accounts_window.glade.h:25 msgid "" "If checked, Gajim will send keep-alive packets to prevent connection timeout " "which results in disconnection" @@ -338,7 +350,7 @@ msgstr "" "nur für Sie speichern" #: ../data/glade/account_modification_window.glade.h:23 -#: ../data/glade/accounts_window.glade.h:25 +#: ../data/glade/accounts_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:9 msgid "" "If checked, Gajim, when launched, will automatically connect to jabber using " @@ -348,7 +360,7 @@ msgstr "" "Konto verbinden" #: ../data/glade/account_modification_window.glade.h:24 -#: ../data/glade/accounts_window.glade.h:26 +#: ../data/glade/accounts_window.glade.h:27 #: ../data/glade/zeroconf_properties_window.glade.h:10 msgid "" "If checked, any change to the global status (handled by the combobox at the " @@ -360,49 +372,49 @@ msgstr "" "entsprechend ändern" #: ../data/glade/account_modification_window.glade.h:25 -#: ../data/glade/accounts_window.glade.h:29 +#: ../data/glade/accounts_window.glade.h:30 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:27 -#: ../data/glade/accounts_window.glade.h:34 -#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1553 -#: ../src/config.py:2030 +#: ../data/glade/accounts_window.glade.h:35 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1614 +#: ../src/config.py:2106 ../src/config.py:3695 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: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 +#: ../data/glade/accounts_window.glade.h:37 ../src/config.py:1204 +#: ../src/config.py:1275 ../src/config.py:1522 ../src/config.py:1527 +#: ../src/config.py:2004 ../src/config.py:2091 ../src/config.py:2105 +#: ../src/config.py:3195 ../src/config.py:3263 ../src/config.py:3685 +#: ../src/config.py:3694 ../src/dialogs.py:344 ../src/dialogs.py:346 +#: ../src/roster_window.py:1895 ../src/roster_window.py:1902 +#: ../src/roster_window.py:1909 msgid "None" msgstr "Kein" #: ../data/glade/account_modification_window.glade.h:30 -#: ../data/glade/accounts_window.glade.h:37 +#: ../data/glade/accounts_window.glade.h:38 #: ../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:31 -#: ../data/glade/accounts_window.glade.h:38 +#: ../data/glade/accounts_window.glade.h:39 msgid "Port: " msgstr "Port: " #: ../data/glade/account_modification_window.glade.h:32 -#: ../data/glade/accounts_window.glade.h:39 +#: ../data/glade/accounts_window.glade.h:40 msgid "Priori_ty:" msgstr "Priori_tät:" #: ../data/glade/account_modification_window.glade.h:33 -#: ../data/glade/accounts_window.glade.h:40 +#: ../data/glade/accounts_window.glade.h:41 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 " @@ -414,19 +426,18 @@ msgstr "" "die Ereignisse" #: ../data/glade/account_modification_window.glade.h:34 -#: ../data/glade/accounts_window.glade.h:41 +#: ../data/glade/accounts_window.glade.h:42 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: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: " +msgstr "Ressour_ce:" #: ../data/glade/account_modification_window.glade.h:37 #: ../data/glade/accounts_window.glade.h:45 @@ -458,7 +469,7 @@ msgstr "Unter_haltungsverlauf für alle Kontakte dieses Kontos speichern" #: ../data/glade/account_modification_window.glade.h:41 #: ../data/glade/accounts_window.glade.h:48 msgid "Send keep-alive packets" -msgstr "Sende Keepalive-Pakete" +msgstr "Keepalive-Pakete senden" #: ../data/glade/account_modification_window.glade.h:42 #: ../data/glade/accounts_window.glade.h:49 @@ -468,9 +479,10 @@ msgstr "Konto-Status mit globalem _Status abgleichen" #: ../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 "Synchronisiere Kontakte" +msgstr "Kontakte synchronisieren" #: ../data/glade/account_modification_window.glade.h:44 #: ../data/glade/accounts_window.glade.h:52 @@ -480,12 +492,12 @@ msgstr "_SSL verwenden (veraltet)" #: ../data/glade/account_modification_window.glade.h:46 #: ../data/glade/accounts_window.glade.h:55 msgid "Use file transfer proxies" -msgstr "Verwende Datentransfer-Proxies" +msgstr "Datenübertragungs-Proxys verwenden" #: ../data/glade/account_modification_window.glade.h:47 #: ../data/glade/accounts_window.glade.h:56 msgid "_Adjust to status" -msgstr "Mit dem Status _abgleichen" +msgstr "Mit Status _abgleichen" #: ../data/glade/account_modification_window.glade.h:48 #: ../data/glade/accounts_window.glade.h:57 @@ -494,9 +506,14 @@ msgstr "_Jabber ID:" #: ../data/glade/account_modification_window.glade.h:49 msgid "_Name:" -msgstr "_Name: " +msgstr "_Name:" -#: ../data/glade/accounts_window.glade.h:14 +#: ../data/glade/accounts_window.glade.h:4 +#, fuzzy +msgid "Proxy" +msgstr "Privatsphäre" + +#: ../data/glade/accounts_window.glade.h:15 #: ../data/glade/profile_window.glade.h:11 #: ../data/glade/vcard_information_window.glade.h:16 #: ../data/glade/zeroconf_information_window.glade.h:2 @@ -505,24 +522,24 @@ msgid "E-Mail:" msgstr "E-Mail:" #. XML Console enable checkbutton -#: ../data/glade/accounts_window.glade.h:16 +#: ../data/glade/accounts_window.glade.h:17 #: ../data/glade/xml_console_window.glade.h:4 msgid "Enable" -msgstr "Einschalten" +msgstr "Aktivieren" -#: ../data/glade/accounts_window.glade.h:17 +#: ../data/glade/accounts_window.glade.h:18 #: ../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 +#: ../data/glade/accounts_window.glade.h:23 msgid "If checked, Gajim will get the password from a GPG agent like seahorse" msgstr "" "Falls aktiviert, wird Gajim das Passwort von einem GnuPG-Agent wie seahorse " "beziehen" -#: ../data/glade/accounts_window.glade.h:27 +#: ../data/glade/accounts_window.glade.h:28 #: ../data/glade/zeroconf_properties_window.glade.h:11 msgid "" "If the default port that is used for incoming messages is unfitting for your " @@ -534,31 +551,31 @@ msgstr "" "festlegen.\n" "Möglicherweise ist es von Nöten, Ihre Firewall-Einstellungen zu ändern." -#: ../data/glade/accounts_window.glade.h:30 +#: ../data/glade/accounts_window.glade.h:31 #: ../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 +#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:630 msgid "Jabber ID:" msgstr "Jabber-ID:" -#: ../data/glade/accounts_window.glade.h:31 +#: ../data/glade/accounts_window.glade.h:32 #: ../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 +#: ../data/glade/accounts_window.glade.h:34 msgid "Mer_ge accounts" msgstr "Konten _zusammenführen" #. Rename -#: ../data/glade/accounts_window.glade.h:43 ../src/roster_window.py:2727 +#: ../data/glade/accounts_window.glade.h:43 ../src/roster_window.py:2757 msgid "Re_name" msgstr "_Umbenennen" #: ../data/glade/accounts_window.glade.h:51 msgid "Use GPG _Agent" -msgstr "" +msgstr "GPG _Agent verwenden" #: ../data/glade/accounts_window.glade.h:54 #: ../data/glade/zeroconf_properties_window.glade.h:21 @@ -578,6 +595,10 @@ msgstr "" msgid "gtk-remove" msgstr "" +#: ../data/glade/accounts_window.glade.h:62 +msgid "use HTTP_PROXY environment variable" +msgstr "" + #: ../data/glade/add_new_contact_window.glade.h:1 msgid "A_ccount:" msgstr "_Konto:" @@ -644,11 +665,11 @@ msgstr "Wählen Sie den auszuführenden Befehl:" #: ../data/glade/adhoc_commands_window.glade.h:3 msgid "Ad-hoc Commands - Gajim" -msgstr "Ad-hoc Kommandos - Gajim" +msgstr "Ad-hoc Befehle - Gajim" #: ../data/glade/adhoc_commands_window.glade.h:4 msgid "Check once more" -msgstr "Nocheinmal überprüfen" +msgstr "Noch einmal überprüfen" #: ../data/glade/adhoc_commands_window.glade.h:5 msgid "Error description..." @@ -656,11 +677,11 @@ msgstr "Fehlerbeschreibung ..." #: ../data/glade/adhoc_commands_window.glade.h:6 msgid "Please wait while retrieving command list..." -msgstr "Bitte warten Sie, während die Kommandoliste empfangen wird ..." +msgstr "Bitte warten Sie, während die Befehlsliste empfangen wird ..." #: ../data/glade/adhoc_commands_window.glade.h:7 msgid "Please wait while the command is sending..." -msgstr "Bitte warten Sie, während das Kommando gesendet wird ..." +msgstr "Bitte warten Sie, während der Befehl gesendet wird ..." #: ../data/glade/adhoc_commands_window.glade.h:8 msgid "Please wait..." @@ -668,7 +689,7 @@ msgstr "Bitte warten ..." #: ../data/glade/adhoc_commands_window.glade.h:9 msgid "This jabber entity does not expose any commands." -msgstr "Diese Jabber-Instanz gibt keine Kommandos von sich." +msgstr "Diese Jabber-Instanz gibt keine Befehle von sich." #: ../data/glade/advanced_configuration_window.glade.h:1 #: ../data/glade/features_window.glade.h:1 @@ -691,16 +712,15 @@ msgstr "Filter:" #: ../data/glade/advanced_menuitem_menu.glade.h:1 msgid "Delete MOTD" -msgstr "_Lösche MOTD" +msgstr "Nachricht des Tages (MOTD) _löschen" #: ../data/glade/advanced_menuitem_menu.glade.h:2 msgid "Deletes Message of the Day" -msgstr "Löscht die Nachricht des Tages" +msgstr "Nachricht des Tages (MOTD) löschen" #: ../data/glade/advanced_menuitem_menu.glade.h:3 -#, fuzzy msgid "Edit _Privacy Lists..." -msgstr "_Privatlisten" +msgstr "_Privatlisten bearbeiten ..." #: ../data/glade/advanced_menuitem_menu.glade.h:4 msgid "Sends a message to users currently connected to this server" @@ -708,23 +728,23 @@ msgstr "Sendet eine Nachricht an momentan angemeldete Benutzer des Servers" #: ../data/glade/advanced_menuitem_menu.glade.h:5 msgid "Set MOTD..." -msgstr "_Setze MOTD" +msgstr "Nachricht des Tages (MOTD) setzen ..." #: ../data/glade/advanced_menuitem_menu.glade.h:6 msgid "Sets Message of the Day" -msgstr "Setzt Message of the Day" +msgstr "Nachricht des Tages (MOTD) setzen" #: ../data/glade/advanced_menuitem_menu.glade.h:7 msgid "Show _XML Console" -msgstr "Zeige _XML Konsole" +msgstr "_XML Konsole zeigen" #: ../data/glade/advanced_menuitem_menu.glade.h:8 msgid "Update MOTD..." -msgstr "_Aktualisiere MOTD" +msgstr "Nachricht des Tages (MOTD) _aktualisieren ..." #: ../data/glade/advanced_menuitem_menu.glade.h:9 msgid "Updates Message of the Day" -msgstr "Aktualisiert Message of the Day" +msgstr "Aktualisiert Nachricht des Tages (MOTD)" #: ../data/glade/advanced_menuitem_menu.glade.h:10 msgid "_Administrator" @@ -732,7 +752,7 @@ msgstr "_Administrator" #: ../data/glade/advanced_menuitem_menu.glade.h:11 msgid "_Send Server Message..." -msgstr "_Sende Servernachricht" +msgstr "Servernachricht _senden ..." #: ../data/glade/advanced_notifications_window.glade.h:1 msgid " a window/tab opened with that contact " @@ -747,7 +767,7 @@ msgid "Conditions" msgstr "Ereignisse" #: ../data/glade/advanced_notifications_window.glade.h:4 -#: ../data/glade/preferences_window.glade.h:12 +#: ../data/glade/preferences_window.glade.h:13 msgid "Sounds" msgstr "Klänge" @@ -761,7 +781,7 @@ msgstr "Erweiterter Benachrichtigungs-Editor" #: ../data/glade/advanced_notifications_window.glade.h:7 msgid "All statuses" -msgstr "Alle Status " +msgstr "Alle Status" #: ../data/glade/advanced_notifications_window.glade.h:8 #: ../src/common/commands.py:96 ../src/common/helpers.py:255 @@ -787,7 +807,7 @@ msgstr "Unsichtbar" #: ../data/glade/advanced_notifications_window.glade.h:13 msgid "Launch a command" -msgstr "Starte ein Kommando" +msgstr "Einen Befehl ausführen" #: ../data/glade/advanced_notifications_window.glade.h:14 #: ../src/common/helpers.py:238 @@ -800,11 +820,11 @@ msgstr "Einen oder mehr spezielle Status ..." #: ../data/glade/advanced_notifications_window.glade.h:16 msgid "Online / Free For Chat" -msgstr "Frei zum Chatten" +msgstr "Online / Frei zum Chatten" #: ../data/glade/advanced_notifications_window.glade.h:17 msgid "Play a sound" -msgstr "Klänge abspielen" +msgstr "Einen Klang abspielen" #: ../data/glade/advanced_notifications_window.glade.h:18 msgid "" @@ -950,7 +970,7 @@ msgstr "_Gruppenchat beitreten" #: ../data/glade/chat_context_menu.glade.h:2 #: ../data/glade/roster_contact_context_menu.glade.h:12 msgid "_Add to Roster..." -msgstr "Zur Kont_aktliste hinzufügen" +msgstr "Zur Kont_aktliste hinzufügen ..." #: ../data/glade/chat_context_menu.glade.h:3 msgid "_Copy JID/Email Address" @@ -979,9 +999,8 @@ 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 -#, fuzzy msgid "Invite _Contacts" -msgstr "Kontakte verwalten" +msgstr "_Kontakte einladen" #: ../data/glade/chat_control_popup_menu.glade.h:3 #: ../data/glade/gc_occupants_menu.glade.h:3 @@ -991,7 +1010,7 @@ msgstr "_Datei senden" #: ../data/glade/chat_control_popup_menu.glade.h:4 msgid "Toggle End to End Encryption" -msgstr "OpenPGP-Verschlüsselung aktivieren" +msgstr "Verschlüsselung (ESessions) aktivieren" #: ../data/glade/chat_control_popup_menu.glade.h:5 msgid "Toggle Open_PGP Encryption" @@ -1006,9 +1025,9 @@ msgstr "Zur Kont_aktliste hinzufügen" #: ../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/roster_window.glade.h:20 #: ../data/glade/zeroconf_contact_context_menu.glade.h:6 -#: ../src/roster_window.py:2596 +#: ../src/roster_window.py:2617 msgid "_History" msgstr "_Verlauf" @@ -1021,9 +1040,8 @@ msgid "Invite Friends !" msgstr "Freunde einladen !" #: ../data/glade/chat_to_muc_window.glade.h:3 -#, fuzzy msgid "MUC server" -msgstr "Beobachter" +msgstr "MUC Server" #: ../data/glade/chat_to_muc_window.glade.h:4 msgid "Please select a MUC server." @@ -1054,9 +1072,8 @@ 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" +msgstr "Features" #: ../data/glade/filetransfers.glade.h:1 msgid "A list of active, completed and stopped file transfers" @@ -1113,7 +1130,7 @@ msgstr "" 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:790 +#: ../data/glade/filetransfers.glade.h:13 ../src/filetransfers_window.py:794 msgid "_Continue" msgstr "_Fortsetzen" @@ -1211,11 +1228,11 @@ msgstr "_Hintergrund:" #: ../data/glade/gc_control_popup_menu.glade.h:1 msgid "Change _Nickname..." -msgstr "_Spitzname ändern" +msgstr "_Spitzname ändern ..." #: ../data/glade/gc_control_popup_menu.glade.h:2 msgid "Change _Subject..." -msgstr "_Thema ändern" +msgstr "_Thema ändern ..." #: ../data/glade/gc_control_popup_menu.glade.h:3 msgid "Click to see past conversation in this room" @@ -1223,7 +1240,7 @@ msgstr "Klicken, um die früheren Unterhaltungen in diesem Raum zu sehen" #: ../data/glade/gc_control_popup_menu.glade.h:4 msgid "Configure _Room..." -msgstr "_Raum einrichten" +msgstr "_Raum einrichten ..." #: ../data/glade/gc_control_popup_menu.glade.h:5 msgid "_Bookmark" @@ -1286,42 +1303,47 @@ msgid "From" msgstr "Von" #. holds subject -#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:147 -#: ../src/history_manager.py:178 +#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:164 +#: ../src/history_manager.py:195 msgid "Subject" msgstr "Betreff" #: ../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 "" -"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." -#: ../data/glade/history_manager.glade.h:7 +#: ../data/glade/history_manager.glade.h:3 +msgid "Welcome to Gajim History Logs Manager" +msgstr "Willkommen zum Gajim Verlaufsmanager" + +#: ../data/glade/history_manager.glade.h:4 msgid "Delete" msgstr "Löschen" -#: ../data/glade/history_manager.glade.h:8 +#: ../data/glade/history_manager.glade.h:5 msgid "Export" msgstr "Export" -#: ../data/glade/history_manager.glade.h:9 +#: ../data/glade/history_manager.glade.h:6 msgid "Gajim History Logs Manager" msgstr "Gajim Verlaufsmanager" +#: ../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 "" + #: ../data/glade/history_manager.glade.h:10 msgid "_Search Database" msgstr "_Suche Datenbank" @@ -1362,14 +1384,13 @@ 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 +#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1181 msgid "_Search" msgstr "_Suche" #: ../data/glade/history_window.glade.h:11 -#, fuzzy msgid "in" -msgstr "Neun" +msgstr "in" #: ../data/glade/invitation_received_dialog.glade.h:1 msgid "Accept" @@ -1384,7 +1405,7 @@ msgstr "Ablehnen" msgid "Invitation Received" msgstr "Einladung empfangen" -#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1385 +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1504 msgid "Join Group Chat" msgstr "Betrete Gruppenchat" @@ -1413,8 +1434,8 @@ msgstr "Kürzlich:" msgid "Room:" msgstr "Raum:" -#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1170 -#: ../src/disco.py:1625 +#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1169 +#: ../src/disco.py:1590 msgid "_Join" msgstr "_Betreten" @@ -1496,19 +1517,15 @@ msgstr "_Server:" 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:1268 -msgid "OpenPGP Encryption" -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:12 +#: ../data/glade/message_window.glade.h:3 +#: ../data/glade/roster_window.glade.h:13 #: ../data/glade/subscription_request_window.glade.h:6 msgid "_Actions" 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/message_window.glade.h:5 #: ../data/glade/xml_console_window.glade.h:11 #: ../src/filetransfers_window.py:252 msgid "_Send" @@ -1527,9 +1544,8 @@ msgid "Applications" msgstr "Anwendungen" #: ../data/glade/preferences_window.glade.h:3 -#, fuzzy msgid "Chat Appearance" -msgstr "Eine Regel bearbeiten" +msgstr "Chat-Aussehen" #. a header for custom browser/client/file manager. so translate sth like: Custom Settings #: ../data/glade/preferences_window.glade.h:5 @@ -1549,28 +1565,35 @@ msgid "Preset Status Messages" msgstr "Voreingestellte Status-Nachrichten" #: ../data/glade/preferences_window.glade.h:10 -#, fuzzy msgid "Privacy" -msgstr "Privatsphären-Liste" +msgstr "Privatsphäre" #: ../data/glade/preferences_window.glade.h:11 +#, fuzzy +msgid "Publish Personal Events" +msgstr "Persönliche Informationen" + +#: ../data/glade/preferences_window.glade.h:12 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 "Subscribe to Personal Events" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:15 +msgid "Themes" +msgstr "Themen" + +#: ../data/glade/preferences_window.glade.h:16 msgid "Visual Notifications" msgstr "Visuelle Benachrichtigungen" -#: ../data/glade/preferences_window.glade.h:15 +#: ../data/glade/preferences_window.glade.h:17 msgid "Advanced" msgstr "Erweitert" -#: ../data/glade/preferences_window.glade.h:16 +#: ../data/glade/preferences_window.glade.h:18 msgid "" "All chat states\n" "Composing only\n" @@ -1580,21 +1603,21 @@ msgstr "" "Nur beim Schreiben\n" "Deaktiviert" -#: ../data/glade/preferences_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:21 msgid "Allow _OS information to be sent" msgstr "Sende _Betriebssystem-Information" -#: ../data/glade/preferences_window.glade.h:20 +#: ../data/glade/preferences_window.glade.h:22 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "" "Popups/Benachrichtigungen _zulassen, wenn ich abwesend/NA/beschäftigt/" "unsichtbar bin" -#: ../data/glade/preferences_window.glade.h:21 +#: ../data/glade/preferences_window.glade.h:23 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:22 +#: ../data/glade/preferences_window.glade.h:24 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 " @@ -1605,24 +1628,24 @@ msgstr "" "Sie Ihren Status zu Abwesend ändern; es wird die hier definierte Nachricht " "verwendet." -#: ../data/glade/preferences_window.glade.h:23 +#: ../data/glade/preferences_window.glade.h:25 msgid "Ask status message when I:" msgstr "Erfrage Status-Nachricht beim: " -#: ../data/glade/preferences_window.glade.h:24 +#: ../data/glade/preferences_window.glade.h:26 msgid "Auto _away after:" msgstr "Automatisch _abwesend nach:" -#: ../data/glade/preferences_window.glade.h:25 +#: ../data/glade/preferences_window.glade.h:27 msgid "Auto _not available after:" msgstr "Automatisch _nicht verfügbar nach:" -#: ../data/glade/preferences_window.glade.h:26 +#: ../data/glade/preferences_window.glade.h:28 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 "" "Bei jedem Programmstart automatisch erkennen\n" @@ -1631,7 +1654,7 @@ msgstr "" "Immer XFCE4 Standard-Anwendungen verwenden\n" "Benutzerdefiniert" -#: ../data/glade/preferences_window.glade.h:31 +#: ../data/glade/preferences_window.glade.h:33 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 " @@ -1642,15 +1665,24 @@ msgstr "" "Vorsicht, da sie alle Nachrichten von allen Kontakten blockiert, die nicht " "in ihrer Liste sind." -#: ../data/glade/preferences_window.glade.h:32 +#: ../data/glade/preferences_window.glade.h:34 msgid "Configure color and font of the interface" msgstr "Farbe und Schriftart für die Oberfläche konfigurieren" -#: ../data/glade/preferences_window.glade.h:33 +#: ../data/glade/preferences_window.glade.h:35 msgid "Default Status Messages" msgstr "Vorgegebene Status-Nachrichten" -#: ../data/glade/preferences_window.glade.h:34 +#: ../data/glade/preferences_window.glade.h:36 +msgid "" +"Detached roster with detached chats\n" +"Detached roster with single chat\n" +"Single window for everything\n" +"Detached roster with chat grouped by account\n" +"Detached roster with chat grouped by type" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:41 msgid "" "Determined by sender\n" "Chat message\n" @@ -1660,27 +1692,27 @@ msgstr "" "Chat-Nachricht\n" "Einzelne Nachricht" -#: ../data/glade/preferences_window.glade.h:37 +#: ../data/glade/preferences_window.glade.h:44 msgid "Display _extra email details" msgstr "Zeige zusätzliche _Email-Details" -#: ../data/glade/preferences_window.glade.h:38 +#: ../data/glade/preferences_window.glade.h:45 msgid "Display a_vatars of contacts in roster" msgstr "Zeige A_vatare von Kontakten im Roster" -#: ../data/glade/preferences_window.glade.h:39 +#: ../data/glade/preferences_window.glade.h:46 msgid "Display status _messages of contacts in roster" msgstr "Zeige die Status_nachrichten von Kontakten im Roster" -#: ../data/glade/preferences_window.glade.h:40 +#: ../data/glade/preferences_window.glade.h:47 msgid "Emoticons:" msgstr "Emoticons:" -#: ../data/glade/preferences_window.glade.h:41 +#: ../data/glade/preferences_window.glade.h:48 msgid "Events" msgstr "Ereignisse" -#: ../data/glade/preferences_window.glade.h:42 +#: ../data/glade/preferences_window.glade.h:49 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1690,7 +1722,7 @@ msgstr "" "betrifft, empfangen und versenden. Hier können Sie definieren, welche " "Chatstatus Sie in Ihrem Chatfenster anzeigen möchten." -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:50 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1700,7 +1732,7 @@ msgstr "" "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 +#: ../data/glade/preferences_window.glade.h:51 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1708,11 +1740,11 @@ 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 +#: ../data/glade/preferences_window.glade.h:53 msgid "Hides buttons in chatwindows to " msgstr "Versteckt die Knöpfe im Gruppenchat-Fenster." -#: ../data/glade/preferences_window.glade.h:47 +#: ../data/glade/preferences_window.glade.h:54 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" @@ -1720,7 +1752,7 @@ msgstr "" "Wenn aktiviert, wird Gajim auch Informationen über den Absender von neuen E-" "Mails hinzufügen." -#: ../data/glade/preferences_window.glade.h:48 +#: ../data/glade/preferences_window.glade.h:55 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1728,7 +1760,7 @@ msgstr "" "Wenn aktiviert, wird Gajim einen Avatar im Roster-Fenster und in " "Gruppenchats einblenden" -#: ../data/glade/preferences_window.glade.h:49 +#: ../data/glade/preferences_window.glade.h:56 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -1736,7 +1768,7 @@ 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 +#: ../data/glade/preferences_window.glade.h:57 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, " @@ -1746,7 +1778,7 @@ msgstr "" "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 +#: ../data/glade/preferences_window.glade.h:58 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" @@ -1754,43 +1786,36 @@ msgstr "" "Wenn nicht deaktivert, wird Gajim ASCII-Smilies wie ':)' mit äquivalenten " "graphischen Emoticons ersetzen" -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:59 msgid "Ignore rich content in incoming messages" msgstr "Formatierten Inhalt in ankommenden Nachrichten ignorieren" -#: ../data/glade/preferences_window.glade.h:53 +#: ../data/glade/preferences_window.glade.h:60 msgid "Ma_nage..." -msgstr "_Verwalte..." +msgstr "_Verwalten ..." -#: ../data/glade/preferences_window.glade.h:54 -msgid "" -"Never\n" -"Always\n" -"Per account\n" -"Per type" -msgstr "" -"Niemals\n" -"Immer\n" -"Pro Account\n" -"Pro Typ" - -#: ../data/glade/preferences_window.glade.h:58 +#: ../data/glade/preferences_window.glade.h:61 msgid "Notify me about contacts that sign _in" msgstr "Über Kontakte benachrichtigen, die sich einloggen" -#: ../data/glade/preferences_window.glade.h:59 +#: ../data/glade/preferences_window.glade.h:62 msgid "Notify me about contacts that sign _out" msgstr "Über Kontakte benachrichtigen, die sich abmelden" -#: ../data/glade/preferences_window.glade.h:60 +#: ../data/glade/preferences_window.glade.h:63 msgid "Notify on new _GMail email" msgstr "Über neue _Google Mail E-Mails benachrichtigen" -#: ../data/glade/preferences_window.glade.h:61 +#: ../data/glade/preferences_window.glade.h:64 +#, fuzzy +msgid "Personal Events" +msgstr "Persönliche Details" + +#: ../data/glade/preferences_window.glade.h:65 msgid "Play _sounds" msgstr "_Klänge abspielen" -#: ../data/glade/preferences_window.glade.h:62 +#: ../data/glade/preferences_window.glade.h:66 msgid "" "Pop it up\n" "Notify me about it\n" @@ -1800,28 +1825,41 @@ msgstr "" "Benachrichtige mich darüber\n" "Nur im Roster anzeigen" -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:69 msgid "Preferences" msgstr "Einstellungen" -#: ../data/glade/preferences_window.glade.h:66 -#, fuzzy +#: ../data/glade/preferences_window.glade.h:70 msgid "Privacy" -msgstr "Privatliste" +msgstr "Privatsphäre" -#: ../data/glade/preferences_window.glade.h:67 +#: ../data/glade/preferences_window.glade.h:71 +msgid "Publish _Activity" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:72 +#, fuzzy +msgid "Publish _Mood" +msgstr "_Veröffentlichen" + +#: ../data/glade/preferences_window.glade.h:73 +#, fuzzy +msgid "Publish _Tune" +msgstr "_Veröffentlichen" + +#: ../data/glade/preferences_window.glade.h:74 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:68 +#: ../data/glade/preferences_window.glade.h:75 msgid "Sign _in" msgstr "_anmelden" -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:76 msgid "Sign _out" msgstr "a_bmelden" -#: ../data/glade/preferences_window.glade.h:70 +#: ../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." @@ -1830,47 +1868,57 @@ msgstr "" "Schriftarten etc.). Wenn aktiviert, wird Gajim nur den puren Nachrichtentext " "anzeigen." -#: ../data/glade/preferences_window.glade.h:71 +#: ../data/glade/preferences_window.glade.h:78 msgid "Status" msgstr "Status" -#: ../data/glade/preferences_window.glade.h:72 +#: ../data/glade/preferences_window.glade.h:79 msgid "Status _iconset:" msgstr "Status-S_ymbole:" -#: ../data/glade/preferences_window.glade.h:73 +#: ../data/glade/preferences_window.glade.h:80 +msgid "Subscribe to A_ctivity" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:81 +#, fuzzy +msgid "Subscribe to M_ood" +msgstr "Abonniert" + +#: ../data/glade/preferences_window.glade.h:82 +#, fuzzy +msgid "Subscribe to T_une" +msgstr "Abonnieren" + +#: ../data/glade/preferences_window.glade.h:83 msgid "T_heme:" msgstr "T_hema:" -#: ../data/glade/preferences_window.glade.h:74 +#: ../data/glade/preferences_window.glade.h:84 msgid "The auto away status message" msgstr "Automatische Statusnachricht für Abwesend" -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:85 msgid "The auto not available status message" msgstr "Automatische Statusnachricht für Nicht verfügbar" -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:86 msgid "Treat all incoming messages as:" msgstr " Behandle alle eingehenden Nachrichten als:" -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:87 msgid "Use _transports iconsets" msgstr "_Transport-Symbole verwenden" -#: ../data/glade/preferences_window.glade.h:78 -msgid "Use only one message _window:" -msgstr "Nur ein _Nachrichtenfenster:" - -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:88 msgid "Use system _default" msgstr "Benutze System-_Voreinstellung" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:89 msgid "When new event is received:" msgstr "Wenn neue Nachricht empfangen wird" -#: ../data/glade/preferences_window.glade.h:81 +#: ../data/glade/preferences_window.glade.h:90 msgid "" "Works for Rhythmbox and Muine players. For more players, please visit http://" "trac.gajim.org/wiki/GajimAndMusicPlayer" @@ -1878,83 +1926,87 @@ 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:82 +#: ../data/glade/preferences_window.glade.h:91 msgid "_Advanced Notifications Control..." -msgstr "_Erweiterter Konfigurations-Editor..." +msgstr "_Erweiterter Konfigurations-Editor ..." -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:92 msgid "_Browser:" msgstr "_Browser:" -#: ../data/glade/preferences_window.glade.h:84 +#: ../data/glade/preferences_window.glade.h:93 msgid "_Display chat state notifications:" msgstr "Zeige Benachrichtigung über Chatstatus:" -#: ../data/glade/preferences_window.glade.h:85 +#: ../data/glade/preferences_window.glade.h:94 msgid "_File manager:" msgstr "_Dateimanager:" -#: ../data/glade/preferences_window.glade.h:86 +#: ../data/glade/preferences_window.glade.h:95 msgid "_Font:" msgstr "_Schriftart:" -#: ../data/glade/preferences_window.glade.h:87 +#: ../data/glade/preferences_window.glade.h:96 msgid "_Highlight misspelled words" msgstr "Falsch geschriebene Wörter _hervorheben" -#: ../data/glade/preferences_window.glade.h:88 +#: ../data/glade/preferences_window.glade.h:97 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:89 +#: ../data/glade/preferences_window.glade.h:98 msgid "_Incoming message:" msgstr "_Eingehende Nachricht:" -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:99 msgid "_Log status changes of contacts" msgstr "_Logge die Statusveränderungen von Kontakten" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:100 msgid "_Mail client:" msgstr "_Mail-Programm:" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:101 msgid "_Make message windows compact" msgstr "Nachrichtenfenster _kompakt anzeigen" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:102 msgid "_Open..." -msgstr "Ö_ffnen..." +msgstr "Ö_ffnen ..." -#: ../data/glade/preferences_window.glade.h:94 +#: ../data/glade/preferences_window.glade.h:103 msgid "_Outgoing message:" msgstr "_Ausgehende Nachricht:" -#: ../data/glade/preferences_window.glade.h:95 +#: ../data/glade/preferences_window.glade.h:104 msgid "_Player:" msgstr "_Player:" -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:105 msgid "_Reset to Default Colors" msgstr "Auf Standard-Farben zu_rücksetzen" -#: ../data/glade/preferences_window.glade.h:97 +#: ../data/glade/preferences_window.glade.h:106 msgid "_Send chat state notifications:" msgstr "Zeige Benachrichtigung über Chatstatus:" -#: ../data/glade/preferences_window.glade.h:98 +#: ../data/glade/preferences_window.glade.h:107 msgid "_Sort contacts by status" msgstr "Kontakte nach Status _sortieren" -#: ../data/glade/preferences_window.glade.h:99 +#: ../data/glade/preferences_window.glade.h:108 msgid "_Status message:" msgstr "_Statusnachricht:" -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:109 msgid "_URL:" msgstr "_URL:" -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:110 +msgid "_Window behavior:" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:111 msgid "minutes" msgstr "Minuten" @@ -1998,7 +2050,7 @@ msgstr "Jabber-ID:" msgid "Order:" msgstr "Reihenfolge:" -#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2258 +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2377 msgid "Privacy List" msgstr "Privatliste" @@ -2122,54 +2174,54 @@ msgid "Middle:" msgstr "Mittelname" #: ../data/glade/profile_window.glade.h:25 -#: ../data/glade/vcard_information_window.glade.h:34 +#: ../data/glade/vcard_information_window.glade.h:33 msgid "Personal Info" msgstr "Persönliche Details" #: ../data/glade/profile_window.glade.h:27 -#: ../data/glade/vcard_information_window.glade.h:35 +#: ../data/glade/vcard_information_window.glade.h:34 msgid "Phone No.:" msgstr "Telefon-Nummer:" #: ../data/glade/profile_window.glade.h:28 -#: ../data/glade/vcard_information_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:35 msgid "Position:" msgstr "Position:" #: ../data/glade/profile_window.glade.h:29 -#: ../data/glade/vcard_information_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:36 msgid "Postal Code:" msgstr "Postleitzahl:" #. Prefix in Name #: ../data/glade/profile_window.glade.h:31 -#: ../data/glade/vcard_information_window.glade.h:39 +#: ../data/glade/vcard_information_window.glade.h:38 msgid "Prefix:" msgstr "Präfix" #: ../data/glade/profile_window.glade.h:32 -#: ../data/glade/vcard_information_window.glade.h:41 ../src/vcard.py:307 +#: ../data/glade/vcard_information_window.glade.h:40 ../src/vcard.py:306 msgid "Role:" msgstr "Rolle:" #: ../data/glade/profile_window.glade.h:33 -#: ../data/glade/vcard_information_window.glade.h:42 +#: ../data/glade/vcard_information_window.glade.h:41 msgid "State:" msgstr "Staat:" #: ../data/glade/profile_window.glade.h:34 -#: ../data/glade/vcard_information_window.glade.h:44 +#: ../data/glade/vcard_information_window.glade.h:43 msgid "Street:" msgstr "Straße:" #. Suffix in Name #: ../data/glade/profile_window.glade.h:36 -#: ../data/glade/vcard_information_window.glade.h:48 +#: ../data/glade/vcard_information_window.glade.h:47 msgid "Suffix:" msgstr "Suffix:" #: ../data/glade/profile_window.glade.h:37 -#: ../data/glade/vcard_information_window.glade.h:50 +#: ../data/glade/vcard_information_window.glade.h:49 msgid "Work" msgstr "Arbeit" @@ -2190,8 +2242,8 @@ msgstr "Konto _entfernen (in Gajim und auf dem Server)" #. 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 +#: ../src/roster_window.py:2574 ../src/roster_window.py:2793 +#: ../src/roster_window.py:2929 msgid "_Remove" msgstr "_Entfernen" @@ -2201,45 +2253,46 @@ msgstr "_Bitte Kontakt, seinen Status zu sehen" #: ../data/glade/roster_contact_context_menu.glade.h:2 msgid "Add Special _Notification..." -msgstr "Spezielle Be_nachrichtigung hinzufügen" +msgstr "Spezielle Be_nachrichtigung hinzufügen ..." #: ../data/glade/roster_contact_context_menu.glade.h:3 msgid "Assign Open_PGP Key..." -msgstr "Open_PGP-Schlüssel zuweisen" +msgstr "Open_PGP-Schlüssel zuweisen ..." #: ../data/glade/roster_contact_context_menu.glade.h:4 msgid "Edit _Groups..." -msgstr "_Gruppen bearbeiten" +msgstr "_Gruppen bearbeiten ..." #. Execute Command #: ../data/glade/roster_contact_context_menu.glade.h:5 -#: ../src/roster_window.py:2856 +#: ../src/roster_window.py:2872 msgid "Execute Command..." -msgstr "_Befehl ausführen..." +msgstr "_Befehl ausführen ..." #. Invite to Groupchat +#. Invite to #: ../data/glade/roster_contact_context_menu.glade.h:6 -#: ../src/roster_window.py:2469 +#: ../src/roster_window.py:2527 ../src/roster_window.py:2714 msgid "In_vite to" msgstr "_Einladen zu" #. Send Custom Status #: ../data/glade/roster_contact_context_menu.glade.h:7 -#: ../src/roster_window.py:2693 ../src/roster_window.py:2827 +#: ../src/roster_window.py:2723 ../src/roster_window.py:2839 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..." +msgstr "Einzelne _Nachricht senden ..." #: ../data/glade/roster_contact_context_menu.glade.h:9 msgid "Send _File..." -msgstr "_Datei senden" +msgstr "_Datei senden ..." #: ../data/glade/roster_contact_context_menu.glade.h:10 msgid "Set Custom _Avatar..." -msgstr "Benutzerdefinierten Avatar wählen..." +msgstr "Benutzerdefinierten Avatar wählen ..." #: ../data/glade/roster_contact_context_menu.glade.h:11 #: ../data/glade/zeroconf_contact_context_menu.glade.h:5 @@ -2251,7 +2304,8 @@ msgid "_Allow him/her to see my status" msgstr "_Erlaube Kontakt, meinen Status zu sehen" #: ../data/glade/roster_contact_context_menu.glade.h:14 -#: ../src/roster_window.py:2543 ../src/roster_window.py:2754 +#: ../src/roster_window.py:2564 ../src/roster_window.py:2784 +#: ../src/roster_window.py:2919 msgid "_Block" msgstr "_Blockieren" @@ -2266,14 +2320,15 @@ msgstr "Kontakt verwalten" #: ../data/glade/roster_contact_context_menu.glade.h:19 msgid "_Rename..." -msgstr "_Umbenennen" +msgstr "_Umbenennen ..." #: ../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 +#: ../src/roster_window.py:2558 ../src/roster_window.py:2778 +#: ../src/roster_window.py:2916 msgid "_Unblock" msgstr "Entblocken" @@ -2283,12 +2338,11 @@ msgstr "_Konten" #: ../data/glade/roster_window.glade.h:2 msgid "Add _Contact..." -msgstr "Kontakt _hinzufügen..." +msgstr "Kontakt _hinzufügen ..." #: ../data/glade/roster_window.glade.h:3 -#, fuzzy msgid "Fea_tures" -msgstr "Fähigkeiten des Servers" +msgstr "Fähigkei_ten des Servers" #: ../data/glade/roster_window.glade.h:4 msgid "File _Transfers" @@ -2314,35 +2368,44 @@ msgstr "Zeige Trans_porte" msgid "Show _Offline Contacts" msgstr "_Abgemeldete Kontakte anzeigen" -#: ../data/glade/roster_window.glade.h:14 +#: ../data/glade/roster_window.glade.h:12 +#, fuzzy +msgid "Show _roster" +msgstr "_Roster anzeigen" + +#: ../data/glade/roster_window.glade.h:15 msgid "_Contents" msgstr "In_halte" -#: ../data/glade/roster_window.glade.h:16 ../src/disco.py:1358 +#: ../data/glade/roster_window.glade.h:17 ../src/disco.py:1323 msgid "_Edit" msgstr "_Ändern" -#: ../data/glade/roster_window.glade.h:17 +#: ../data/glade/roster_window.glade.h:18 msgid "_FAQ" msgstr "_FAQ" -#: ../data/glade/roster_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:19 msgid "_Help" msgstr "_Hilfe" -#: ../data/glade/roster_window.glade.h:20 +#: ../data/glade/roster_window.glade.h:21 msgid "_Preferences" msgstr "_Einstellungen" -#: ../data/glade/roster_window.glade.h:21 +#: ../data/glade/roster_window.glade.h:22 msgid "_Quit" msgstr "_Beenden" -#: ../data/glade/roster_window.glade.h:22 +#: ../data/glade/roster_window.glade.h:23 msgid "_Send Single Message..." -msgstr "Einzelne _Nachricht senden..." +msgstr "Einzelne _Nachricht senden ..." #: ../data/glade/roster_window.glade.h:24 +msgid "_Services" +msgstr "_Dienste" + +#: ../data/glade/roster_window.glade.h:26 msgid "_View" msgstr "_Ansicht" @@ -2355,7 +2418,7 @@ msgid "_Add contact" msgstr "_Kontakt hinzufügen" #. Information -#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:2911 +#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:2941 msgid "_Information" msgstr "Informationen" @@ -2443,20 +2506,22 @@ msgstr "Abonnementanfrage" msgid "_Deny" msgstr "_Ablehnen" -#: ../data/glade/synchronise_select_account_dialog.glade.h:1 +#: ../data/glade/synchronise_contacts_dialog.glade.h:1 #, fuzzy -msgid "Select the account with which you want to synchronise" +msgid "Select the account with which to synchronise" msgstr "JID des Kontakts mit dem Sie chatten möchten" +#: ../data/glade/synchronise_select_account_dialog.glade.h:1 +msgid "Select the account with which you want to synchronise" +msgstr "Das Konto auswählen, mit dem Sie synchronisieren 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" +msgstr "Kontakte auswählen, die Sie synchronisieren möchten" #: ../data/glade/synchronise_select_contacts_dialog.glade.h:2 -#, fuzzy msgid "Synchronise : select contacts" -msgstr "Synchronisiere gewählte Kontakte" +msgstr "Synchronisieren: Kontakte auswählen" #: ../data/glade/systray_context_menu.glade.h:1 msgid "Mute Sounds" @@ -2464,7 +2529,7 @@ msgstr "_Klänge stummschalten" #: ../data/glade/systray_context_menu.glade.h:2 msgid "Send Single _Message" -msgstr "Einzelne Nachricht _senden..." +msgstr "Einzelne Nachricht _senden" #: ../data/glade/systray_context_menu.glade.h:3 msgid "Show All Pending _Events" @@ -2512,26 +2577,26 @@ msgstr "Kontakt-Information" msgid "More" msgstr "Mehr" -#: ../data/glade/vcard_information_window.glade.h:33 +#: ../data/glade/vcard_information_window.glade.h:32 msgid "OS:" msgstr "BS:" -#: ../data/glade/vcard_information_window.glade.h:40 +#: ../data/glade/vcard_information_window.glade.h:39 #: ../data/glade/zeroconf_information_window.glade.h:8 msgid "Resource:" msgstr "Ressource:" -#: ../data/glade/vcard_information_window.glade.h:43 +#: ../data/glade/vcard_information_window.glade.h:42 #: ../data/glade/zeroconf_information_window.glade.h:9 msgid "Status:" msgstr "Status:" #. Family Name -#: ../data/glade/vcard_information_window.glade.h:46 +#: ../data/glade/vcard_information_window.glade.h:45 msgid "Subscription:" msgstr "Abonnement:" -#: ../data/glade/vcard_information_window.glade.h:49 +#: ../data/glade/vcard_information_window.glade.h:48 msgid "User avatar:" msgstr "Avatar auswählen" @@ -2571,19 +2636,19 @@ msgstr "Open_PGP-Schlüssel zuweisen" #. Edit Groups #: ../data/glade/zeroconf_contact_context_menu.glade.h:3 -#: ../src/roster_window.py:2526 +#: ../src/roster_window.py:2547 msgid "Edit _Groups" msgstr "_Gruppen bearbeiten" #. Rename #: ../data/glade/zeroconf_contact_context_menu.glade.h:8 -#: ../src/roster_window.py:2883 +#: ../src/roster_window.py:2899 msgid "_Rename" msgstr "_Umbenennen" #: ../data/glade/zeroconf_context_menu.glade.h:1 msgid "_Modify Account..." -msgstr "_Konto bearbeiten..." +msgstr "_Konto bearbeiten ..." #: ../data/glade/zeroconf_information_window.glade.h:6 msgid "Local jid:" @@ -2649,153 +2714,163 @@ msgstr "Versteckt" #. #!/bin/sh #. LANG=$(for i in *.po; do j=${i/.po/}; echo -n "_('"$j"')":" '"$j"', " ; done) #. echo "{_('en'):'en'",$LANG"}" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "English" msgstr "Englisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Belarusian" msgstr "Weißrussisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Bulgarian" msgstr "Bulgarisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Breton" msgstr "Bretonisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Czech" msgstr "Tschechisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "German" msgstr "Deutsch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Greek" msgstr "Griechisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "British" msgstr "Britisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Esperanto" msgstr "Esperanto" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Spanish" msgstr "Spanisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Basque" msgstr "Baskisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "French" msgstr "Französisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Croatian" msgstr "Kroatisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Italian" msgstr "Italienisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Norwegian (b)" msgstr "Norwegisch (Bokmål)" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Dutch" msgstr "Niederländisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Norwegian" msgstr "Norwegisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Polish" msgstr "Polnisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Portuguese" msgstr "Portugiesisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Brazilian Portuguese" msgstr "Brasilianisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Russian" msgstr "Russsich" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Serbian" msgstr "Serbisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Slovak" msgstr "Slovakisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Swedish" msgstr "Schwedisch" -#: ../src/chat_control.py:60 +#: ../src/chat_control2.py:60 ../src/chat_control.py:60 msgid "Chinese (Ch)" msgstr "Chinesisch" -#: ../src/chat_control.py:313 +#: ../src/chat_control2.py:310 ../src/chat_control.py:313 msgid "Spelling language" msgstr "Sprache für die Rechtschreibprüfung" #. we are not connected +#: ../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 "Keine Verbindung verfügbar" +#: ../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 "Ihre Nachricht kann erst gesendet werden, wenn Sie verbunden sind." -#: ../src/chat_control.py:1186 +#: ../src/chat_control2.py:1176 ../src/chat_control.py:1191 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s aus Gruppenchat %(room_name)s" +#: ../src/chat_control2.py:1257 +msgid "OpenPGP Encryption" +msgstr "Open_PGP-Verschlüsselung" + #. we talk about a contact here -#: ../src/chat_control.py:1282 +#: ../src/chat_control2.py:1271 #, 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" -#: ../src/chat_control.py:1325 ../src/groupchat_control.py:1433 +#: ../src/chat_control2.py:1314 ../src/chat_control.py:1337 +#: ../src/groupchat_control.py:1458 #, 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 Befehl: /%s (wenn Sie dies senden wollen, setzen Sie /say voran)" -#: ../src/chat_control.py:1332 ../src/groupchat_control.py:1456 +#: ../src/chat_control2.py:1321 ../src/chat_control.py:1344 +#: ../src/groupchat_control.py:1481 #, python-format msgid "Commands: %s" -msgstr "Kommandos: %s" +msgstr "Befehle: %s" -#: ../src/chat_control.py:1335 ../src/groupchat_control.py:1470 +#: ../src/chat_control2.py:1324 ../src/chat_control.py:1347 +#: ../src/groupchat_control.py:1495 #, 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 +#: ../src/chat_control2.py:1327 ../src/chat_control.py:1350 +#: ../src/groupchat_control.py:1500 #, 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 +#: ../src/chat_control2.py:1330 ../src/chat_control.py:1353 +#: ../src/groupchat_control.py:1516 #, python-format msgid "" "Usage: /%s , sends action to the current group chat. Use third " @@ -2804,62 +2879,65 @@ msgstr "" "Bedienung: /%s , sendet die Aktion im aktuellen Gruppenchat. " "Verwende dritte Person, z.B. /%s explodiert)." -#: ../src/chat_control.py:1345 +#: ../src/chat_control2.py:1334 ../src/chat_control.py:1357 #, python-format msgid "Usage: /%s, sends a ping to the contact" msgstr "Bedienung: /%s, sendet einen Ping zum Kontakt" -#: ../src/chat_control.py:1348 +#: ../src/chat_control2.py:1337 ../src/chat_control.py:1360 #, 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 +#: ../src/chat_control2.py:1340 ../src/chat_control.py:1363 +#: ../src/groupchat_control.py:1539 #, 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 +#: ../src/chat_control2.py:1478 ../src/chat_control2.py:1504 msgid "Encryption enabled" msgstr "Verschlüsselung aktiviert" -#: ../src/chat_control.py:1494 +#: ../src/chat_control2.py:1483 ../src/chat_control.py:1493 msgid "Session WILL be logged" msgstr "Sitzung wird aufgezeichnet" -#: ../src/chat_control.py:1496 +#: ../src/chat_control2.py:1485 ../src/chat_control.py:1495 msgid "Session WILL NOT be logged" msgstr "Sitzung wird nicht aufgezeichnet" -#: ../src/chat_control.py:1503 +#: ../src/chat_control2.py:1492 ../src/chat_control.py:1525 +#: ../src/chat_control.py:1536 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 +#: ../src/chat_control2.py:1496 ../src/chat_control2.py:1509 +#: ../src/chat_control2.py:2155 msgid "Encryption disabled" msgstr "Verschlüsselung deaktiviert" #. add_to_roster_menuitem -#: ../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/chat_control2.py:1672 ../src/chat_control.py:1700 +#: ../src/conversation_textview.py:704 ../src/dialogs.py:851 +#: ../src/gajim.py:926 ../src/gajim.py:927 ../src/gajim.py:1466 +#: ../src/gajim.py:1717 ../src/roster_window.py:359 +#: ../src/roster_window.py:444 ../src/roster_window.py:1853 +#: ../src/roster_window.py:1863 ../src/roster_window.py:2203 +#: ../src/roster_window.py:2372 ../src/roster_window.py:3206 +#: ../src/roster_window.py:3449 ../src/roster_window.py:4897 +#: ../src/roster_window.py:4899 ../src/common/contacts.py:94 #: ../src/common/helpers.py:53 ../src/common/helpers.py:267 msgid "Not in Roster" -msgstr "Nicht in der Liste" +msgstr "Nicht in der Kontaktliste" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:1836 +#: ../src/chat_control2.py:1825 ../src/chat_control.py:1854 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Sie haben eine neue Nachricht von \"%s\"" -#: ../src/chat_control.py:1837 +#: ../src/chat_control2.py:1826 ../src/chat_control.py:1855 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." @@ -2867,33 +2945,59 @@ msgstr "" "Wenn sie das Fenster schließen und der Verlauf abgeschaltet ist, geht die " "Nachricht verloren." -#: ../src/config.py:127 ../src/config.py:565 +#: ../src/chat_control.py:1068 ../src/chat_control.py:1276 +#, fuzzy +msgid "GPG encryption enabled" +msgstr "Verschlüsselung aktiviert" + +#: ../src/chat_control.py:1271 +#, fuzzy +msgid "GPG encryption disabled" +msgstr "Verschlüsselung deaktiviert" + +#: ../src/chat_control.py:1482 +msgid "Session negotiation cancelled" +msgstr "Sitzungs-Aushandlung abgebrochen" + +#: ../src/chat_control.py:1489 +msgid "E2E encryption enabled" +msgstr "Verschlüsselung aktiviert" + +#: ../src/chat_control.py:1499 +msgid "E2E encryption disabled" +msgstr "Verschlüsselung deaktiviert" + +#: ../src/chat_control.py:1531 +#, fuzzy +msgid "The following message was encrypted" +msgstr "[Die folgende Nachricht wurde nicht verschlüsselt]" + +#: ../src/config.py:129 ../src/config.py:627 msgid "Disabled" msgstr "Deaktiviert" -#: ../src/config.py:293 +#: ../src/config.py:295 msgid "Active" msgstr "Aktiv" -#: ../src/config.py:301 +#: ../src/config.py:303 msgid "Event" msgstr "Ereignis" -#: ../src/config.py:407 +#: ../src/config.py:409 msgid "Always use OS/X default applications" msgstr "" -#: ../src/config.py:408 -#, fuzzy +#: ../src/config.py:410 msgid "Custom" -msgstr "Benutzerdefiniert" +msgstr "Benutzerdefiniert" -#: ../src/config.py:638 ../src/dialogs.py:1018 +#: ../src/config.py:700 ../src/dialogs.py:1137 #, python-format msgid "Dictionary for lang %s not available" msgstr "Wörterburch für Sprache %s nicht verfügbar" -#: ../src/config.py:639 +#: ../src/config.py:701 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -2902,105 +3006,105 @@ msgstr "" "Sie müssen das Wörterbuch %s installieren oder eine andere Sprache wählen, " "um die Rechtschreibprüfung zu nutzen." -#: ../src/config.py:1001 +#: ../src/config.py:1063 msgid "status message title" msgstr "Statusbetreff" -#: ../src/config.py:1001 +#: ../src/config.py:1063 msgid "status message text" msgstr "Statusnachricht" -#: ../src/config.py:1037 +#: ../src/config.py:1099 msgid "First Message Received" msgstr "Erste empfangene Nachricht" -#: ../src/config.py:1038 +#: ../src/config.py:1100 msgid "Next Message Received" msgstr "Nächste empfangene Nachricht" -#: ../src/config.py:1039 +#: ../src/config.py:1101 msgid "Contact Connected" msgstr "Kontakt verbunden" -#: ../src/config.py:1040 +#: ../src/config.py:1102 msgid "Contact Disconnected" msgstr "Kontakt nicht verbunden" -#: ../src/config.py:1041 +#: ../src/config.py:1103 msgid "Message Sent" msgstr "Nachricht gesendet" -#: ../src/config.py:1042 +#: ../src/config.py:1104 msgid "Group Chat Message Highlight" msgstr "Gruppenchat Nachrichten-Hervorhebung" -#: ../src/config.py:1043 +#: ../src/config.py:1105 msgid "Group Chat Message Received" msgstr "Gruppenchat-Nachricht empfangen" -#: ../src/config.py:1050 +#: ../src/config.py:1112 msgid "GMail Email Received" msgstr "E-Mail über Googlemail empfangen" #. 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/config.py:1376 ../src/dialogs.py:1636 ../src/dialogs.py:1700 +#: ../src/disco.py:742 ../src/disco.py:1534 ../src/disco.py:1780 #: ../src/history_window.py:113 msgid "Name" msgstr "Name" -#: ../src/config.py:1427 ../src/common/config.py:393 +#: ../src/config.py:1453 ../src/common/config.py:403 msgid "Be right back." msgstr "Bin gleich zurück." -#: ../src/config.py:1431 +#: ../src/config.py:1457 msgid "Relogin now?" msgstr "Jetzt neu einloggen?" -#: ../src/config.py:1432 +#: ../src/config.py:1458 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 +#: ../src/config.py:1588 ../src/config.py:1685 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 +#: ../src/config.py:1721 ../src/config.py:1762 msgid "Unread events" msgstr "Ungelesene Ereignisse" -#: ../src/config.py:1655 +#: ../src/config.py:1722 msgid "Read all pending events before removing this account." msgstr "Alle ungelesenen Ereignisse lesen, bevor der Account entfernt wird." -#: ../src/config.py:1681 +#: ../src/config.py:1748 #, python-format msgid "You have opened chat in account %s" msgstr "Sie haben mit Account %s einen Chat geöffnet" -#: ../src/config.py:1682 +#: ../src/config.py:1749 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "Alle Chatfenster werden geschlossen. Fortfahren?" -#: ../src/config.py:1691 +#: ../src/config.py:1758 msgid "You are currently connected to the server" msgstr "Sie sind mit dem Server verbunden" -#: ../src/config.py:1692 +#: ../src/config.py:1759 msgid "To change the account name, you must be disconnected." msgstr "Verbindung muss beendet werden, um Kontonamen zu ändern." -#: ../src/config.py:1696 +#: ../src/config.py:1763 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 +#: ../src/config.py:1769 msgid "Account Name Already Used" msgstr "Kontoname wird bereits verwendet" -#: ../src/config.py:1703 +#: ../src/config.py:1770 msgid "" "This name is already used by another of your accounts. Please choose another " "name." @@ -3008,149 +3112,149 @@ 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 +#: ../src/config.py:1774 ../src/config.py:1778 msgid "Invalid account name" msgstr "Ungültiger Kontoname" -#: ../src/config.py:1708 +#: ../src/config.py:1775 msgid "Account name cannot be empty." msgstr "Kontoname darf nicht leer sein." -#: ../src/config.py:1712 +#: ../src/config.py:1779 msgid "Account name cannot contain spaces." msgstr "Kontoname darf keine Leerzeichen enthalten." -#: ../src/config.py:1776 +#: ../src/config.py:1843 msgid "Rename Account" msgstr "Konto umbenennen" -#: ../src/config.py:1777 +#: ../src/config.py:1844 #, 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 +#: ../src/config.py:1862 ../src/config.py:1870 ../src/config.py:1910 +#: ../src/config.py:3133 ../src/dataforms_widget.py:533 msgid "Invalid Jabber ID" msgstr "Ungültige Jabber ID" -#: ../src/config.py:1804 +#: ../src/config.py:1871 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 +#: ../src/config.py:2066 ../src/config.py:3205 msgid "Invalid entry" msgstr "Ungültiger Eintrag" -#: ../src/config.py:1991 ../src/config.py:3122 +#: ../src/config.py:2067 ../src/config.py:3206 msgid "Custom port must be a port number." msgstr "Proxy Port muss eine Portnummer sein." -#: ../src/config.py:2012 +#: ../src/config.py:2088 ../src/config.py:3682 msgid "Failed to get secret keys" msgstr "Holen der geheimen Schlüssel fehlgeschlagen" -#: ../src/config.py:2013 +#: ../src/config.py:2089 ../src/config.py:3683 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 +#: ../src/config.py:2092 ../src/config.py:3686 msgid "OpenPGP Key Selection" msgstr "OpenPGP Schlüssel-Auswahl" -#: ../src/config.py:2017 +#: ../src/config.py:2093 ../src/config.py:3687 msgid "Choose your OpenPGP key" msgstr "Wählen Sie Ihren OpenPGP Schlüssel" -#: ../src/config.py:2057 +#: ../src/config.py:2133 msgid "No such account available" msgstr "Account nicht verfügbar" -#: ../src/config.py:2058 +#: ../src/config.py:2134 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 +#: ../src/config.py:2141 ../src/dialogs.py:1483 ../src/dialogs.py:1624 +#: ../src/dialogs.py:1804 ../src/disco.py:426 ../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 +#: ../src/config.py:2142 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 +#: ../src/config.py:2146 msgid "Your server doesn't support Vcard" msgstr "Ihr Server unterstützt vCard nicht" -#: ../src/config.py:2071 +#: ../src/config.py:2147 msgid "Your server can't save your personal information." msgstr "Ihr Server kann keine persönlichen Informationen speichern." -#: ../src/config.py:2102 +#: ../src/config.py:2178 msgid "Account Local already exists." msgstr "Ein Konto mit dem Namen 'Local' ist bereits vorhanden" -#: ../src/config.py:2103 +#: ../src/config.py:2179 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." -#: ../src/config.py:2279 +#: ../src/config.py:2358 #, python-format msgid "Edit %s" msgstr "%s ändern" -#: ../src/config.py:2281 +#: ../src/config.py:2360 #, python-format msgid "Register to %s" msgstr "Auf %s registrieren" #. list at the beginning -#: ../src/config.py:2317 +#: ../src/config.py:2396 msgid "Ban List" msgstr "Sperrliste" -#: ../src/config.py:2318 +#: ../src/config.py:2397 msgid "Member List" msgstr "Mitgliederliste" -#: ../src/config.py:2319 +#: ../src/config.py:2398 msgid "Owner List" msgstr "Besitzerliste" -#: ../src/config.py:2320 +#: ../src/config.py:2399 msgid "Administrator List" msgstr "Administratorliste" #. Address column #. holds JID (who said this) -#: ../src/config.py:2369 ../src/disco.py:750 ../src/history_manager.py:160 +#: ../src/config.py:2448 ../src/disco.py:749 ../src/history_manager.py:177 msgid "JID" msgstr "JID" -#: ../src/config.py:2377 +#: ../src/config.py:2456 msgid "Reason" msgstr "Grund" -#: ../src/config.py:2382 +#: ../src/config.py:2461 msgid "Nick" msgstr "Spitzname" -#: ../src/config.py:2386 +#: ../src/config.py:2465 msgid "Role" msgstr "Rolle" -#: ../src/config.py:2411 +#: ../src/config.py:2490 msgid "Banning..." -msgstr "Verbanne ..." +msgstr "Verbannen ..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2413 +#: ../src/config.py:2492 msgid "" "Whom do you want to ban?\n" "\n" @@ -3158,11 +3262,11 @@ msgstr "" "Wen möchten Sie verbannen?\n" "\n" -#: ../src/config.py:2415 +#: ../src/config.py:2494 msgid "Adding Member..." -msgstr "Füge Mitglied hinzu ..." +msgstr "Mitglied hinzufügen ..." -#: ../src/config.py:2416 +#: ../src/config.py:2495 msgid "" "Whom do you want to make a member?\n" "\n" @@ -3170,11 +3274,11 @@ msgstr "" "Wen möchten Sie zum Mitglied machen?\n" "\n" -#: ../src/config.py:2418 +#: ../src/config.py:2497 msgid "Adding Owner..." -msgstr "Füge Besitzer hinzu ..." +msgstr "Besitzer hinzufügen ..." -#: ../src/config.py:2419 +#: ../src/config.py:2498 msgid "" "Whom do you want to make an owner?\n" "\n" @@ -3182,11 +3286,11 @@ msgstr "" "Wen möchten Sie zum Besitzer machen?\n" "\n" -#: ../src/config.py:2421 +#: ../src/config.py:2500 msgid "Adding Administrator..." msgstr "Füge Administrator hinzu ..." -#: ../src/config.py:2422 +#: ../src/config.py:2501 msgid "" "Whom do you want to make an administrator?\n" "\n" @@ -3194,7 +3298,7 @@ msgstr "" "Wen möchten Sie zum Administrator machen?\n" "\n" -#: ../src/config.py:2423 +#: ../src/config.py:2502 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" @@ -3209,84 +3313,84 @@ msgstr "" "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:2527 +#: ../src/config.py:2606 #, python-format msgid "Removing %s account" msgstr "Entferne Konto %s" -#: ../src/config.py:2542 ../src/gajim.py:1343 ../src/roster_window.py:3451 +#: ../src/config.py:2621 ../src/gajim.py:1364 ../src/roster_window.py:3508 msgid "Password Required" msgstr "Passwort benötigt" -#: ../src/config.py:2543 ../src/roster_window.py:3447 +#: ../src/config.py:2622 ../src/roster_window.py:3503 #, python-format msgid "Enter your password for account %s" msgstr "Geben Sie ihr Passwort für %s ein" -#: ../src/config.py:2544 ../src/roster_window.py:3452 +#: ../src/config.py:2623 ../src/roster_window.py:3509 msgid "Save password" msgstr "Passwort speichern" -#: ../src/config.py:2557 +#: ../src/config.py:2636 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Konto \"%s\" ist mit Server verbunden" -#: ../src/config.py:2558 +#: ../src/config.py:2637 msgid "If you remove it, the connection will be lost." msgstr "Wenn Sie es entfernen, wird die Verbindung beendet." -#: ../src/config.py:2651 +#: ../src/config.py:2730 msgid "Default" msgstr "Standard" -#: ../src/config.py:2651 +#: ../src/config.py:2730 msgid "?print_status:All" msgstr "?print_status:Alle" -#: ../src/config.py:2652 +#: ../src/config.py:2731 msgid "Enter and leave only" msgstr "Nur betreten und verlassen" -#: ../src/config.py:2653 +#: ../src/config.py:2732 msgid "?print_status:None" msgstr "?print_status:Nichts" -#: ../src/config.py:2722 +#: ../src/config.py:2801 msgid "New Group Chat" msgstr "Neuer Gruppenchat" -#: ../src/config.py:2755 +#: ../src/config.py:2834 msgid "This bookmark has invalid data" msgstr "Dieses Lesezeichen hat ungültige Daten" -#: ../src/config.py:2756 +#: ../src/config.py:2835 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:3033 +#: ../src/config.py:3116 msgid "Invalid username" msgstr "Ungültiger Benutzername" -#: ../src/config.py:3035 +#: ../src/config.py:3118 msgid "You must provide a username to configure this account." msgstr "" "Sie müssen einen Benutzernamen angeben, um diesen Account zu konfigurieren." -#: ../src/config.py:3061 +#: ../src/config.py:3144 msgid "Duplicate Jabber ID" msgstr "Doppelte Jabber ID" -#: ../src/config.py:3062 +#: ../src/config.py:3145 msgid "This account is already configured in Gajim." msgstr "Dieser Kontakt wurde in Gajim bereits konfiguriert." -#: ../src/config.py:3079 +#: ../src/config.py:3162 msgid "Account has been added successfully" msgstr "Account wurde erfolgreich hinzugefügt" -#: ../src/config.py:3080 ../src/config.py:3225 +#: ../src/config.py:3163 ../src/config.py:3350 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 " @@ -3296,31 +3400,59 @@ msgstr "" "oder durch Klicken des Konto-Menüpunktes im Bearbeiten-Menü des " "Hauptfensters erreichen." -#: ../src/config.py:3097 +#: ../src/config.py:3181 msgid "Invalid server" msgstr "Ungültiger Server" -#: ../src/config.py:3098 +#: ../src/config.py:3182 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 +#: ../src/config.py:3233 ../src/gajim.py:2210 +#, fuzzy +msgid "Certificate Already in File" +msgstr "Kontakt bereits im Roster" + +#: ../src/config.py:3234 ../src/gajim.py:2211 +#, python-format +msgid "This certificate is already in file %s, so it's not added again." +msgstr "" + +#: ../src/config.py:3302 +#, 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:3308 ../src/gajim.py:2226 +#, python-format +msgid "" +"Add this certificate to the list of trusted certificates.\n" +"SHA1 fingerprint of the certificate:\n" +"%s" +msgstr "" + +#: ../src/config.py:3329 ../src/config.py:3368 msgid "An error occurred during account creation" msgstr "Während der Konto-Erstellung ist ein Fehler aufgetreten" -#: ../src/config.py:3224 +#: ../src/config.py:3349 msgid "Your new account has been created successfully" msgstr "Ihr neues Konto wurde erfolgreich erstellt" -#: ../src/config.py:3327 +#: ../src/config.py:3452 msgid "Account name is in use" msgstr "Kontoname ist schon vergeben" -#: ../src/config.py:3328 +#: ../src/config.py:3453 msgid "You already have an account using this name." msgstr "Sie haben bereits ein Konto mit diesem Namen." -#: ../src/conversation_textview.py:454 +#: ../src/conversation_textview.py:453 msgid "" "Text below this line is what has been said since the last time you paid " "attention to this group chat" @@ -3328,52 +3460,52 @@ msgstr "" "Text unterhalb dieser Linie stellt dar, was seit ihrem letzten Besuch in " "diesem Gruppenchat gesagt wurde" -#: ../src/conversation_textview.py:552 +#: ../src/conversation_textview.py:551 #, python-format msgid "_Actions for \"%s\"" msgstr "_Aktionen für \"%s\"" -#: ../src/conversation_textview.py:564 +#: ../src/conversation_textview.py:563 msgid "Read _Wikipedia Article" msgstr "_Wikipedia-Artikel lesen" -#: ../src/conversation_textview.py:569 +#: ../src/conversation_textview.py:568 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:585 +#: ../src/conversation_textview.py:584 #, 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:598 +#: ../src/conversation_textview.py:597 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "In Websuche URL fehlt ein \"%s\"" -#: ../src/conversation_textview.py:601 +#: ../src/conversation_textview.py:600 msgid "Web _Search for it" msgstr "Im _Internet suchen" -#: ../src/conversation_textview.py:607 +#: ../src/conversation_textview.py:606 msgid "Open as _Link" msgstr "Als _Link öffnen" -#: ../src/conversation_textview.py:1073 +#: ../src/conversation_textview.py:1072 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:1077 +#: ../src/conversation_textview.py:1076 #, python-format msgid "%i days ago" msgstr "Vor %i Tagen" #. if we have subject, show it too! -#: ../src/conversation_textview.py:1111 +#: ../src/conversation_textview.py:1110 #, python-format msgid "Subject: %s\n" msgstr "Thema: %s\n" @@ -3423,136 +3555,731 @@ msgstr "Schlüssel-ID" msgid "Contact name" msgstr "Name des Kontakts" +#: ../src/dialogs.py:374 +msgid "doing_chores" +msgstr "" + +#: ../src/dialogs.py:374 +#, fuzzy +msgid "drinking" +msgstr "Arbeiten" + +#: ../src/dialogs.py:374 +msgid "eating" +msgstr "Essen" + +#: ../src/dialogs.py:375 +msgid "excercising" +msgstr "" + +#: ../src/dialogs.py:375 +#, fuzzy +msgid "grooming" +msgstr "Raum" + +#: ../src/dialogs.py:375 +msgid "having_appointment" +msgstr "" + +#: ../src/dialogs.py:376 +#, fuzzy +msgid "inactive" +msgstr "Inaktiv" + +#: ../src/dialogs.py:376 +#, fuzzy +msgid "relaxing" +msgstr "plain" + +#: ../src/dialogs.py:376 +#, fuzzy +msgid "talking" +msgstr "Italienisch" + +#: ../src/dialogs.py:376 +#, fuzzy +msgid "traveling" +msgstr "Italienisch" + +#: ../src/dialogs.py:377 +msgid "working" +msgstr "Arbeiten" + +#: ../src/dialogs.py:378 +msgid "at_the_spa" +msgstr "" + +#: ../src/dialogs.py:378 +msgid "brushing_teeth" +msgstr "" + +#: ../src/dialogs.py:379 +msgid "buying_groceries" +msgstr "" + +#: ../src/dialogs.py:379 +#, fuzzy +msgid "cleaning" +msgstr "Abend" + +#: ../src/dialogs.py:379 +#, fuzzy +msgid "coding" +msgstr "Arbeiten" + +#: ../src/dialogs.py:380 +#, fuzzy +msgid "commuting" +msgstr "Befehl" + +#: ../src/dialogs.py:380 +#, fuzzy +msgid "cooking" +msgstr "Arbeiten" + +#: ../src/dialogs.py:380 +msgid "cycling" +msgstr "" + +#: ../src/dialogs.py:380 +msgid "day_off" +msgstr "" + #: ../src/dialogs.py:381 +msgid "doing_maintenance" +msgstr "" + +#: ../src/dialogs.py:381 +msgid "doing_the_dishes" +msgstr "" + +#: ../src/dialogs.py:382 +msgid "doing_the_laundry" +msgstr "" + +#: ../src/dialogs.py:382 +msgid "driving" +msgstr "" + +#: ../src/dialogs.py:382 +#, fuzzy +msgid "gaming" +msgstr "Essen" + +#: ../src/dialogs.py:383 +#, fuzzy +msgid "gardening" +msgstr "Morgen" + +#: ../src/dialogs.py:383 +msgid "getting_a_haircut" +msgstr "" + +#: ../src/dialogs.py:383 +#, fuzzy +msgid "going_out" +msgstr "a_bmelden" + +#: ../src/dialogs.py:384 +#, fuzzy +msgid "hanging_out" +msgstr "Thema ändern" + +#: ../src/dialogs.py:384 +msgid "having_a_beer" +msgstr "" + +#: ../src/dialogs.py:384 +msgid "having_a_snack" +msgstr "" + +#: ../src/dialogs.py:385 +msgid "having_breakfast" +msgstr "" + +#: ../src/dialogs.py:385 +msgid "having_coffee" +msgstr "" + +#: ../src/dialogs.py:386 +msgid "having_dinner" +msgstr "" + +#: ../src/dialogs.py:386 +msgid "having_lunch" +msgstr "" + +#: ../src/dialogs.py:386 +msgid "having_tea" +msgstr "" + +#: ../src/dialogs.py:387 +#, fuzzy +msgid "hiking" +msgstr "%s rausschmeißen" + +#: ../src/dialogs.py:387 +msgid "in_a_car" +msgstr "" + +#: ../src/dialogs.py:387 +msgid "in_a_meeting" +msgstr "" + +#: ../src/dialogs.py:388 +msgid "in_real_life" +msgstr "" + +#: ../src/dialogs.py:388 +msgid "jogging" +msgstr "" + +#: ../src/dialogs.py:388 +msgid "on_a_bus" +msgstr "" + +#: ../src/dialogs.py:389 +msgid "on_a_plane" +msgstr "" + +#: ../src/dialogs.py:389 +msgid "on_a_train" +msgstr "" + +#: ../src/dialogs.py:389 +msgid "on_a_trip" +msgstr "" + +#: ../src/dialogs.py:390 +msgid "on_the_phone" +msgstr "Ich telefoniere." + +#: ../src/dialogs.py:390 +#, fuzzy +msgid "on_vacation" +msgstr "Verbindung" + +#: ../src/dialogs.py:390 +#, fuzzy +msgid "other" +msgstr "Andere" + +#: ../src/dialogs.py:391 +#, fuzzy +msgid "partying" +msgstr "Essen" + +#: ../src/dialogs.py:391 +#, fuzzy +msgid "playing_sports" +msgstr "Transports" + +#: ../src/dialogs.py:391 +#, fuzzy +msgid "reading" +msgstr "Essen" + +#: ../src/dialogs.py:392 +#, fuzzy +msgid "rehearsing" +msgstr "Weißrussisch" + +#: ../src/dialogs.py:392 +#, fuzzy +msgid "running" +msgstr "Morgen" + +#: ../src/dialogs.py:392 +msgid "running_an_errand" +msgstr "" + +#: ../src/dialogs.py:393 +msgid "scheduled_holiday" +msgstr "" + +#: ../src/dialogs.py:393 +#, fuzzy +msgid "shaving" +msgstr "Essen" + +#: ../src/dialogs.py:393 +msgid "shopping" +msgstr "" + +#: ../src/dialogs.py:394 +#, fuzzy +msgid "skiing" +msgstr "Arbeiten" + +#: ../src/dialogs.py:394 +msgid "sleeping" +msgstr "Schlafen" + +#: ../src/dialogs.py:394 +msgid "socializing" +msgstr "" + +#: ../src/dialogs.py:395 +msgid "studying" +msgstr "" + +#: ../src/dialogs.py:395 +#, fuzzy +msgid "sunbathing" +msgstr "Essen" + +#: ../src/dialogs.py:395 +msgid "swimming" +msgstr "" + +#: ../src/dialogs.py:396 +msgid "taking_a_bath" +msgstr "" + +#: ../src/dialogs.py:396 +msgid "taking_a_shower" +msgstr "" + +#: ../src/dialogs.py:396 +#, fuzzy +msgid "walking" +msgstr "Essen" + +#: ../src/dialogs.py:397 +msgid "walking_the_dog" +msgstr "" + +#: ../src/dialogs.py:397 +msgid "watching_tv" +msgstr "" + +#: ../src/dialogs.py:398 +#, fuzzy +msgid "watching_a_movie" +msgstr "Ich sehe mir einen Film an." + +#: ../src/dialogs.py:398 +#, fuzzy +msgid "working_out" +msgstr "Arbeiten" + +#: ../src/dialogs.py:398 +#, fuzzy +msgid "writing" +msgstr "Essen" + +#: ../src/dialogs.py:404 +#, fuzzy +msgid "Activity" +msgstr "Aktiv" + +#: ../src/dialogs.py:454 +msgid "afraid" +msgstr "" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "amazed" +msgstr "Name" + +#: ../src/dialogs.py:454 +msgid "angry" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "annoyed" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "anxious" +msgstr "" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "aroused" +msgstr "Unterbrochen" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "ashamed" +msgstr "Unterbrochen" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "bored" +msgstr "Mehr" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "brave" +msgstr "habe " + +#: ../src/dialogs.py:454 +msgid "calm" +msgstr "" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "cold" +msgstr "Fett" + +#: ../src/dialogs.py:454 +msgid "confused" +msgstr "" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "contented" +msgstr "In_halte" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "cranky" +msgstr "cyan" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "curious" +msgstr "_Vorherige" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "depressed" +msgstr "Adresse" + +#: ../src/dialogs.py:454 +msgid "disappointed" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "disgusted" +msgstr "" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "distracted" +msgstr "Administrator" + +#: ../src/dialogs.py:454 +msgid "embarrassed" +msgstr "" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "excited" +msgstr "Deaktiviert" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "flirtatious" +msgstr "Zugehörigkeit: " + +#: ../src/dialogs.py:454 +msgid "frustrated" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "grumpy" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "guilty" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "happy" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "hot" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "humbled" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "humiliated" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "hungry" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "hurt" +msgstr "" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "impressed" +msgstr "Nachricht" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "in_awe" +msgstr "Neun" + +#: ../src/dialogs.py:454 +msgid "in_love" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "indignant" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "interested" +msgstr "" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "intoxicated" +msgstr "Aktiviert" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "invincible" +msgstr "unsichtbar" + +#: ../src/dialogs.py:454 +msgid "jealous" +msgstr "" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "lonely" +msgstr "Eins" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "mean" +msgstr "menschlich" + +#: ../src/dialogs.py:454 +msgid "moody" +msgstr "" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "nervous" +msgstr "_Vorherige" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "neutral" +msgstr "Allgemein" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "offended" +msgstr "abgemeldet" + +#: ../src/dialogs.py:454 +msgid "playful" +msgstr "" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "proud" +msgstr "Gruppe" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "relieved" +msgstr "Elf" + +#: ../src/dialogs.py:454 +msgid "remorseful" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "restless" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "sad" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "sarcastic" +msgstr "" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "serious" +msgstr "Benutzer" + +#: ../src/dialogs.py:454 +msgid "shocked" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "shy" +msgstr "" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "sick" +msgstr "Spitzname" + +#: ../src/dialogs.py:454 +msgid "sleepy" +msgstr "" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "stressed" +msgstr "Drei" + +#: ../src/dialogs.py:454 +msgid "surprised" +msgstr "" + +#: ../src/dialogs.py:454 +#, fuzzy +msgid "thirsty" +msgstr "Andere" + +#: ../src/dialogs.py:454 +msgid "worried" +msgstr "" + +#: ../src/dialogs.py:460 +msgid "Mood" +msgstr "" + +#: ../src/dialogs.py:500 #, python-format msgid "%s Status Message" msgstr "%s Status-Nachricht" -#: ../src/dialogs.py:383 +#: ../src/dialogs.py:502 msgid "Status Message" msgstr "Status-Nachricht" -#: ../src/dialogs.py:483 +#: ../src/dialogs.py:602 msgid "Save as Preset Status Message" msgstr "Als derzeitige Statusnachricht speichern" -#: ../src/dialogs.py:484 +#: ../src/dialogs.py:603 msgid "Please type a name for this status message" msgstr "Bitte geben Sie einen Namen für diese Statusnachricht ein:" -#: ../src/dialogs.py:495 +#: ../src/dialogs.py:614 msgid "Overwrite Status Message?" msgstr "Status-Nachricht überschreiben" -#: ../src/dialogs.py:496 +#: ../src/dialogs.py:615 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 +#: ../src/dialogs.py:631 msgid "AIM Address:" msgstr "AIM-Adresse" -#: ../src/dialogs.py:513 +#: ../src/dialogs.py:632 msgid "GG Number:" msgstr "GG Nummer" -#: ../src/dialogs.py:514 +#: ../src/dialogs.py:633 msgid "ICQ Number:" msgstr "ICQ-Nummer" -#: ../src/dialogs.py:515 +#: ../src/dialogs.py:634 msgid "MSN Address:" msgstr "MSN-Adresse" -#: ../src/dialogs.py:516 +#: ../src/dialogs.py:635 msgid "Yahoo! Address:" msgstr "Yahoo!-Adresse" -#: ../src/dialogs.py:553 +#: ../src/dialogs.py:672 #, 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" -#: ../src/dialogs.py:555 +#: ../src/dialogs.py:674 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:712 ../src/dialogs.py:718 +#: ../src/dialogs.py:831 ../src/dialogs.py:837 msgid "Invalid User ID" msgstr "Ungültige Benutzer ID" -#: ../src/dialogs.py:719 +#: ../src/dialogs.py:838 msgid "The user ID must not contain a resource." msgstr "Die Benutzer-ID darf keine resource enthalten." -#: ../src/dialogs.py:733 +#: ../src/dialogs.py:852 msgid "Contact already in roster" msgstr "Kontakt bereits im Roster" -#: ../src/dialogs.py:734 +#: ../src/dialogs.py:853 msgid "This contact is already listed in your roster." msgstr "Der Kontakt befindet sich bereit in Ihrem Roster." -#: ../src/dialogs.py:770 +#: ../src/dialogs.py:889 msgid "User ID:" msgstr "_Benutzer-ID:" -#: ../src/dialogs.py:832 +#: ../src/dialogs.py:951 msgid "A GTK+ jabber client" msgstr "Ein GTK+ Jabber-Client" -#: ../src/dialogs.py:833 +#: ../src/dialogs.py:952 msgid "GTK+ Version:" msgstr "GTK+-Version:" -#: ../src/dialogs.py:834 +#: ../src/dialogs.py:953 msgid "PyGTK Version:" msgstr "PyGTK-Version" -#: ../src/dialogs.py:848 +#: ../src/dialogs.py:967 msgid "Current Developers:" msgstr "Derzeitige Entwickler:" -#: ../src/dialogs.py:850 +#: ../src/dialogs.py:969 msgid "Past Developers:" msgstr "Frühere Entwickler:" -#: ../src/dialogs.py:860 +#: ../src/dialogs.py:979 msgid "THANKS:" msgstr "DANKE:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:866 +#: ../src/dialogs.py:985 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:879 +#: ../src/dialogs.py:998 msgid "translator-credits" msgstr "" "Fridtjof Busse\n" "Benjamin Drung \n" "Fabian Fingerle \n" -"Sebastian Schäfer " +"Sebastian Schäfer \n" +"Nico Gulden " -#: ../src/dialogs.py:1011 +#: ../src/dialogs.py:1130 #, python-format msgid "Unable to bind to port %s." msgstr "Konnte nicht an Port %s binden." -#: ../src/dialogs.py:1012 +#: ../src/dialogs.py:1131 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:1019 +#: ../src/dialogs.py:1138 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -3565,81 +4292,81 @@ msgstr "" "\n" "Das Hervorheben falsch geschriebener Worte wird nicht genutzt" -#: ../src/dialogs.py:1293 +#: ../src/dialogs.py:1412 #, python-format msgid "Subscription request for account %s from %s" msgstr "Abonnement-Anforderung für Konto %s von %s" -#: ../src/dialogs.py:1296 +#: ../src/dialogs.py:1415 #, python-format msgid "Subscription request from %s" msgstr "Abonnement-Anforderung von %s" -#: ../src/dialogs.py:1357 ../src/roster_window.py:776 +#: ../src/dialogs.py:1476 ../src/roster_window.py:778 #, python-format msgid "You are already in group chat %s" msgstr "Sie sind bereits im Gruppenchat %s" -#: ../src/dialogs.py:1365 +#: ../src/dialogs.py:1484 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:1383 +#: ../src/dialogs.py:1502 #, python-format msgid "Join Group Chat with account %s" msgstr "Betrete Gruppenchat mit Account %s" -#: ../src/dialogs.py:1453 ../src/dialogs.py:1459 -#: ../src/groupchat_control.py:1683 +#: ../src/dialogs.py:1572 ../src/dialogs.py:1578 +#: ../src/groupchat_control.py:1719 msgid "Invalid group chat Jabber ID" msgstr "Ungültige Jabber-ID für den Gruppenchat" -#: ../src/dialogs.py:1454 ../src/dialogs.py:1460 -#: ../src/groupchat_control.py:1684 +#: ../src/dialogs.py:1573 ../src/dialogs.py:1579 +#: ../src/groupchat_control.py:1720 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:1466 +#: ../src/dialogs.py:1585 msgid "This is not a group chat" msgstr "Das ist kein Gruppenchat" -#: ../src/dialogs.py:1467 +#: ../src/dialogs.py:1586 #, python-format msgid "%s is not the name of a group chat." msgstr "%s ist kein Name eines Gruppenchats." -#: ../src/dialogs.py:1506 +#: ../src/dialogs.py:1625 msgid "Without a connection, you can not synchronise your contacts." msgstr "Sie müssen verbunden sein, um Ihre Kontakte zu Synchronisieren." -#: ../src/dialogs.py:1520 +#: ../src/dialogs.py:1639 msgid "Server" msgstr "Server" -#: ../src/dialogs.py:1553 +#: ../src/dialogs.py:1672 msgid "This account is not connected to the server" msgstr "Konto \"%s\" ist nicht mit dem Server verbunden" -#: ../src/dialogs.py:1554 +#: ../src/dialogs.py:1673 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." -#: ../src/dialogs.py:1578 +#: ../src/dialogs.py:1697 msgid "Synchronise" msgstr "Synchronisieren" -#: ../src/dialogs.py:1636 +#: ../src/dialogs.py:1755 #, python-format msgid "Start Chat with account %s" msgstr "Starte Chat mit Account %s" -#: ../src/dialogs.py:1638 +#: ../src/dialogs.py:1757 msgid "Start Chat" msgstr "Chat starten" -#: ../src/dialogs.py:1639 +#: ../src/dialogs.py:1758 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" @@ -3648,291 +4375,291 @@ msgstr "" "an den Sie eine Chat-Nachricht schicken wollen:" #. if offline or connecting -#: ../src/dialogs.py:1664 ../src/dialogs.py:2040 ../src/dialogs.py:2181 +#: ../src/dialogs.py:1783 ../src/dialogs.py:2159 ../src/dialogs.py:2300 msgid "Connection not available" msgstr "Verbindung nicht verfügbar" -#: ../src/dialogs.py:1665 ../src/dialogs.py:2041 ../src/dialogs.py:2182 +#: ../src/dialogs.py:1784 ../src/dialogs.py:2160 ../src/dialogs.py:2301 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Vergewissern Sie sich, dass Sie mit \"%s\" verbunden sind." -#: ../src/dialogs.py:1674 ../src/dialogs.py:1677 +#: ../src/dialogs.py:1793 ../src/dialogs.py:1796 msgid "Invalid JID" msgstr "Ungültige JID" -#: ../src/dialogs.py:1677 +#: ../src/dialogs.py:1796 #, python-format msgid "Unable to parse \"%s\"." msgstr "Kann \"%s\" nicht parsen." -#: ../src/dialogs.py:1686 +#: ../src/dialogs.py:1805 msgid "Without a connection, you can not change your password." msgstr "Sie müssen verbunden sein, um Ihr Passwort zu ändern" -#: ../src/dialogs.py:1704 +#: ../src/dialogs.py:1823 msgid "Invalid password" msgstr "Ungültiges Passwort" -#: ../src/dialogs.py:1705 +#: ../src/dialogs.py:1824 msgid "You must enter a password." msgstr "Sie müssen ein Passwort eingeben." -#: ../src/dialogs.py:1709 +#: ../src/dialogs.py:1828 msgid "Passwords do not match" msgstr "Passwörter stimmen nicht überein" -#: ../src/dialogs.py:1710 +#: ../src/dialogs.py:1829 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:1752 ../src/notify.py:232 ../src/notify.py:447 +#: ../src/dialogs.py:1871 ../src/notify.py:234 ../src/notify.py:449 msgid "Contact Signed In" msgstr "Kontakt hat sich angemeldet" -#: ../src/dialogs.py:1754 ../src/notify.py:240 ../src/notify.py:449 +#: ../src/dialogs.py:1873 ../src/notify.py:242 ../src/notify.py:451 msgid "Contact Signed Out" msgstr "Kontakt hat sich abgemeldet" #. chat message -#: ../src/dialogs.py:1756 ../src/notify.py:263 ../src/notify.py:451 +#: ../src/dialogs.py:1875 ../src/notify.py:265 ../src/notify.py:453 msgid "New Message" msgstr "Neue Nachricht" #. single message -#: ../src/dialogs.py:1756 ../src/notify.py:244 ../src/notify.py:451 +#: ../src/dialogs.py:1875 ../src/notify.py:246 ../src/notify.py:453 msgid "New Single Message" msgstr "Neue einzelne Nachricht" #. private message -#: ../src/dialogs.py:1757 ../src/notify.py:251 ../src/notify.py:452 +#: ../src/dialogs.py:1876 ../src/notify.py:253 ../src/notify.py:454 msgid "New Private Message" msgstr "Neue private Nachricht" -#: ../src/dialogs.py:1757 ../src/gajim.py:1532 ../src/notify.py:460 +#: ../src/dialogs.py:1876 ../src/gajim.py:1562 ../src/notify.py:462 msgid "New E-mail" msgstr "Neue E-Mail" -#: ../src/dialogs.py:1759 ../src/gajim.py:1707 ../src/notify.py:454 +#: ../src/dialogs.py:1878 ../src/gajim.py:1737 ../src/notify.py:456 msgid "File Transfer Request" msgstr "Dateitransfer Anfrage" -#: ../src/dialogs.py:1761 ../src/gajim.py:1504 ../src/gajim.py:1674 -#: ../src/notify.py:456 +#: ../src/dialogs.py:1880 ../src/gajim.py:1534 ../src/gajim.py:1704 +#: ../src/notify.py:458 msgid "File Transfer Error" msgstr "Dateitransfer-Fehler" -#: ../src/dialogs.py:1763 ../src/gajim.py:1746 ../src/gajim.py:1768 -#: ../src/gajim.py:1785 ../src/notify.py:458 +#: ../src/dialogs.py:1882 ../src/gajim.py:1776 ../src/gajim.py:1798 +#: ../src/gajim.py:1815 ../src/notify.py:460 msgid "File Transfer Completed" msgstr "Dateitransfer beendet" -#: ../src/dialogs.py:1764 ../src/gajim.py:1749 ../src/notify.py:458 +#: ../src/dialogs.py:1883 ../src/gajim.py:1779 ../src/notify.py:460 msgid "File Transfer Stopped" msgstr "Dateitransfer gestoppt" -#: ../src/dialogs.py:1766 ../src/gajim.py:1364 ../src/notify.py:462 +#: ../src/dialogs.py:1885 ../src/gajim.py:1385 ../src/notify.py:464 msgid "Groupchat Invitation" msgstr "Gruppenchat-Einladung" -#: ../src/dialogs.py:1768 ../src/notify.py:224 ../src/notify.py:464 +#: ../src/dialogs.py:1887 ../src/notify.py:226 ../src/notify.py:466 msgid "Contact Changed Status" msgstr "Kontakt hat Status verändert" -#: ../src/dialogs.py:1959 +#: ../src/dialogs.py:2078 #, python-format msgid "Single Message using account %s" msgstr "Einzelne Nachricht mit Account %s" -#: ../src/dialogs.py:1961 +#: ../src/dialogs.py:2080 #, python-format msgid "Single Message in account %s" msgstr "Einzelne Nachricht in Account %s" -#: ../src/dialogs.py:1963 +#: ../src/dialogs.py:2082 msgid "Single Message" msgstr "Einzelne Nachricht" #. prepare UI for Sending -#: ../src/dialogs.py:1966 +#: ../src/dialogs.py:2085 #, python-format msgid "Send %s" msgstr "Sende %s" #. prepare UI for Receiving -#: ../src/dialogs.py:1989 +#: ../src/dialogs.py:2108 #, python-format msgid "Received %s" msgstr "%s empfangen" #. prepare UI for Receiving -#: ../src/dialogs.py:2012 +#: ../src/dialogs.py:2131 #, 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:2082 +#: ../src/dialogs.py:2201 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:2083 +#: ../src/dialogs.py:2202 #, python-format msgid "%s wrote:\n" msgstr "%s schrieb:\n" -#: ../src/dialogs.py:2127 +#: ../src/dialogs.py:2246 #, python-format msgid "XML Console for %s" msgstr "XML Konsole für %s" -#: ../src/dialogs.py:2129 +#: ../src/dialogs.py:2248 msgid "XML Console" msgstr "XML Konsole" -#: ../src/dialogs.py:2252 +#: ../src/dialogs.py:2371 #, python-format msgid "Privacy List %s" msgstr "Privatliste %s" -#: ../src/dialogs.py:2256 +#: ../src/dialogs.py:2375 #, python-format msgid "Privacy List for %s" msgstr "Privatsphären-Liste für %s" -#: ../src/dialogs.py:2312 +#: ../src/dialogs.py:2431 #, python-format msgid "Order: %s, action: %s, type: %s, value: %s" msgstr "Sortierung: %s, Aktion: %s, Typ: %s, Wert: %s" -#: ../src/dialogs.py:2315 +#: ../src/dialogs.py:2434 #, python-format msgid "Order: %s, action: %s" msgstr "Sortierung: %s, Aktion: %s" -#: ../src/dialogs.py:2357 +#: ../src/dialogs.py:2476 msgid "Edit a rule" msgstr "Eine Regel bearbeiten" -#: ../src/dialogs.py:2444 +#: ../src/dialogs.py:2563 msgid "Add a rule" msgstr "Eine Regel hinzufügen" -#: ../src/dialogs.py:2540 +#: ../src/dialogs.py:2659 #, python-format msgid "Privacy Lists for %s" msgstr "Privatliste für %s" -#: ../src/dialogs.py:2542 +#: ../src/dialogs.py:2661 msgid "Privacy Lists" msgstr "Privatlisten" -#: ../src/dialogs.py:2612 +#: ../src/dialogs.py:2731 msgid "Invalid List Name" msgstr "Ungültiger Listenname" -#: ../src/dialogs.py:2613 +#: ../src/dialogs.py:2732 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." -#: ../src/dialogs.py:2650 +#: ../src/dialogs.py:2769 msgid "$Contact has invited you to join a discussion" msgstr "$Contact hat Sie in den Gruppenchat %(room_jid)s eingeladen" -#: ../src/dialogs.py:2652 +#: ../src/dialogs.py:2771 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact hat Sie in den Gruppenchat %(room_jid)s eingeladen" -#: ../src/dialogs.py:2665 +#: ../src/dialogs.py:2784 #, python-format msgid "Comment: %s" msgstr "Kommentar: %s" -#: ../src/dialogs.py:2731 +#: ../src/dialogs.py:2850 msgid "Choose Sound" msgstr "Sound wählen" -#: ../src/dialogs.py:2741 ../src/dialogs.py:2792 +#: ../src/dialogs.py:2860 ../src/dialogs.py:2911 msgid "All files" msgstr "Alle Dateien" -#: ../src/dialogs.py:2746 +#: ../src/dialogs.py:2865 msgid "Wav Sounds" msgstr "Wav Dateien" -#: ../src/dialogs.py:2779 +#: ../src/dialogs.py:2898 msgid "Choose Image" msgstr "Bild auswählen" -#: ../src/dialogs.py:2797 +#: ../src/dialogs.py:2916 msgid "Images" msgstr "Bilder" -#: ../src/dialogs.py:2862 +#: ../src/dialogs.py:2981 #, python-format msgid "When %s becomes:" msgstr "Wenn %s wird:" -#: ../src/dialogs.py:2864 +#: ../src/dialogs.py:2983 #, python-format msgid "Adding Special Notification for %s" msgstr "Füge speziellen Hinweis für %s hinzu" #. # means number -#: ../src/dialogs.py:2935 +#: ../src/dialogs.py:3054 msgid "#" msgstr "Nr." -#: ../src/dialogs.py:2941 +#: ../src/dialogs.py:3060 msgid "Condition" msgstr "Bedingung" -#: ../src/dialogs.py:3059 +#: ../src/dialogs.py:3178 msgid "when I am " msgstr "wenn Ich bin " -#: ../src/disco.py:111 +#: ../src/disco.py:110 msgid "Others" msgstr "Andere" -#: ../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/disco.py:111 ../src/disco.py:112 ../src/disco.py:1320 +#: ../src/gajim.py:675 ../src/roster_window.py:295 ../src/roster_window.py:356 +#: ../src/roster_window.py:396 ../src/roster_window.py:505 +#: ../src/roster_window.py:537 ../src/roster_window.py:539 +#: ../src/roster_window.py:4893 ../src/roster_window.py:4895 +#: ../src/common/contacts.py:301 ../src/common/contacts.py:316 #: ../src/common/helpers.py:53 msgid "Transports" msgstr "Transports" #. conference is a category for listing mostly groupchats in service discovery -#: ../src/disco.py:115 +#: ../src/disco.py:114 msgid "Conference" msgstr "Konferenz" -#: ../src/disco.py:428 +#: ../src/disco.py:427 msgid "Without a connection, you can not browse available services" msgstr "Sie müssen angemeldet sein um Dienste zu durchsuchen" -#: ../src/disco.py:502 +#: ../src/disco.py:501 #, python-format msgid "Service Discovery using account %s" msgstr "Dienste durchsuchen für Konto %s" -#: ../src/disco.py:504 +#: ../src/disco.py:503 msgid "Service Discovery" msgstr "Dienste durchsuchen" -#: ../src/disco.py:644 +#: ../src/disco.py:643 msgid "The service could not be found" msgstr "Der Dienst konnte nicht gefunden werden" -#: ../src/disco.py:645 +#: ../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." @@ -3940,201 +4667,202 @@ 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:649 ../src/disco.py:930 +#: ../src/disco.py:648 ../src/disco.py:929 msgid "The service is not browsable" msgstr "Der Dienst ist nicht durchsuchbar" -#: ../src/disco.py:650 +#: ../src/disco.py:649 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." -#: ../src/disco.py:730 +#: ../src/disco.py:729 #, python-format msgid "Browsing %s using account %s" msgstr "Durchsuche %s mit Konto %s" -#: ../src/disco.py:769 +#: ../src/disco.py:768 msgid "_Browse" msgstr "_Durchsuche" -#: ../src/disco.py:931 +#: ../src/disco.py:930 msgid "This service does not contain any items to browse." msgstr "Dieser Dienst enthält keine keine durchsuchbaren Objekte." -#: ../src/disco.py:1152 +#: ../src/disco.py:1151 msgid "_Execute Command" -msgstr "_Befehl ausführen..." +msgstr "_Befehl ausführen" -#: ../src/disco.py:1162 ../src/disco.py:1360 +#: ../src/disco.py:1161 ../src/disco.py:1325 msgid "Re_gister" msgstr "Re_gistrieren" -#: ../src/disco.py:1397 +#: ../src/disco.py:1362 #, python-format msgid "Scanning %d / %d.." msgstr "Durchsuche %d / %d.." #. Users column -#: ../src/disco.py:1579 +#: ../src/disco.py:1544 msgid "Users" msgstr "Benutzer" #. Description column -#: ../src/disco.py:1587 +#: ../src/disco.py:1552 msgid "Description" msgstr "Beschreibung" #. Id column -#: ../src/disco.py:1595 +#: ../src/disco.py:1560 msgid "Id" msgstr "Id" -#: ../src/disco.py:1824 +#: ../src/disco.py:1789 msgid "Subscribed" msgstr "Abonniert" -#: ../src/disco.py:1832 +#: ../src/disco.py:1797 msgid "Node" msgstr "Node" -#: ../src/disco.py:1889 +#: ../src/disco.py:1854 msgid "New post" msgstr "Neue Nachricht" -#: ../src/disco.py:1895 +#: ../src/disco.py:1860 msgid "_Subscribe" msgstr "_Abonnieren" -#: ../src/disco.py:1901 +#: ../src/disco.py:1866 msgid "_Unsubscribe" msgstr "_Abbestellen" -#: ../src/features_window.py:47 +#: ../src/features_window.py:46 msgid "PyOpenSSL" msgstr "PyOpenSSL" -#: ../src/features_window.py:48 +#: ../src/features_window.py:47 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 +#: ../src/features_window.py:48 ../src/features_window.py:49 msgid "Requires python-pyopenssl." msgstr "Erfordert python-pyopenssl." -#: ../src/features_window.py:51 +#: ../src/features_window.py:50 msgid "Bonjour / Zeroconf" msgstr "Bonjour / Zeroconf" -#: ../src/features_window.py:52 +#: ../src/features_window.py:51 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 +#: ../src/features_window.py:52 msgid "Requires python-avahi." msgstr "Erfordert python-avahi." -#: ../src/features_window.py:54 +#: ../src/features_window.py:53 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 +#: ../src/features_window.py:54 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:55 +#, fuzzy +msgid "A script to controle Gajim via commandline." +msgstr "Ein Skript, um Gajim über die Befehlszeile zu steuern." -#: ../src/features_window.py:57 +#: ../src/features_window.py:56 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 +#: ../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 "Funktion unter Windows nicht verfügbar." -#: ../src/features_window.py:59 +#: ../src/features_window.py:58 msgid "OpenGPG" msgstr "OpenPGP: " -#: ../src/features_window.py:60 +#: ../src/features_window.py:59 msgid "Encrypting chatmessages with gpg keys." msgstr "Chat Nachrichten werden mit gpg Schlüssel verschlüsselt" -#: ../src/features_window.py:61 +#: ../src/features_window.py:60 msgid "Requires gpg and python-GnuPGInterface." msgstr "Erfordert gpg und python-GnuPGInterface." -#: ../src/features_window.py:63 +#: ../src/features_window.py:62 msgid "network-manager" msgstr "network-manager" -#: ../src/features_window.py:64 +#: ../src/features_window.py:63 msgid "Autodetection of network status." msgstr "Auto-Erkennung des Netzwerk-Status." -#: ../src/features_window.py:65 +#: ../src/features_window.py:64 msgid "Requires gnome-network-manager and python-dbus." msgstr "Erfordert gnome-network-manager und python-dbus." -#: ../src/features_window.py:67 +#: ../src/features_window.py:66 msgid "Session Management" msgstr "Sitzungsverwaltung" -#: ../src/features_window.py:68 +#: ../src/features_window.py:67 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 +#: ../src/features_window.py:68 msgid "Requires python-gnome2." msgstr "Erfordert python-gnome2." -#: ../src/features_window.py:71 +#: ../src/features_window.py:70 msgid "gnome-keyring" msgstr "gnome-keyring" -#: ../src/features_window.py:72 +#: ../src/features_window.py:71 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 +#: ../src/features_window.py:72 msgid "Requires gnome-keyring and python-gnome2-desktop." msgstr "Erfordert gnome-keyring und python-gnome2-desktop." -#: ../src/features_window.py:75 +#: ../src/features_window.py:74 msgid "SRV" msgstr "SRV" -#: ../src/features_window.py:76 +#: ../src/features_window.py:75 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 +#: ../src/features_window.py:76 msgid "Requires dnsutils." msgstr "Erfordert dnsutils." -#: ../src/features_window.py:78 +#: ../src/features_window.py:77 msgid "Requires nslookup to use SRV records." msgstr "Erfordert nslookup zur Nutzung von SRV-Einträgen." -#: ../src/features_window.py:79 +#: ../src/features_window.py:78 msgid "Spell Checker" msgstr "Rechtschreibprüfung" -#: ../src/features_window.py:80 +#: ../src/features_window.py:79 msgid "Spellchecking of composed messages." msgstr "Rechtschreibprüfung erstellter Nachrichten." -#: ../src/features_window.py:81 +#: ../src/features_window.py:80 msgid "" "Requires python-gnome2-extras or compilation of gtkspell module from Gajim " "sources." @@ -4142,15 +4870,15 @@ msgstr "" "Erfordert python-gnome2-extras oder die Kompilation des gtkspell-Moduls aus " "den Gajim-Quellen." -#: ../src/features_window.py:83 +#: ../src/features_window.py:82 msgid "Notification-daemon" msgstr "Notification-daemon" -#: ../src/features_window.py:84 +#: ../src/features_window.py:83 msgid "Passive popups notifying for new events." msgstr "Popups informieren über neue Ereignisse." -#: ../src/features_window.py:85 +#: ../src/features_window.py:84 msgid "" "Requires python-notify or instead python-dbus in conjunction with " "notification-daemon." @@ -4158,47 +4886,48 @@ msgstr "" "Erforder python-notify oder stattdessen python-dbus in Verbindung mit " "notification-daemon." -#: ../src/features_window.py:87 +#: ../src/features_window.py:86 msgid "Trayicon" msgstr "Tray-Symbol" -#: ../src/features_window.py:88 +#: ../src/features_window.py:87 msgid "A icon in systemtray reflecting the current presence." msgstr "Ein Icon im Systemtray, das den Status widerspiegelt." -#: ../src/features_window.py:89 +#: ../src/features_window.py:88 +#, fuzzy msgid "" -"Requires python-gnome2-extras or compiled trayicon module from Gajim " -"sources." +"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 +#: ../src/features_window.py:89 msgid "Requires PyGTK >= 2.10." msgstr "Erforder PyGTK >= 2.10." -#: ../src/features_window.py:91 +#: ../src/features_window.py:90 msgid "Idle" msgstr "Idle" -#: ../src/features_window.py:92 +#: ../src/features_window.py:91 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 +#: ../src/features_window.py:92 ../src/features_window.py:93 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 +#: ../src/features_window.py:94 msgid "LaTeX" msgstr "LaTeX" -#: ../src/features_window.py:96 -msgid "Transform LaTeX espressions between $$ $$." +#: ../src/features_window.py:95 +#, fuzzy +msgid "Transform LaTeX expressions between $$ $$." msgstr "LaTeX-Ausdrücke zwischen $$ $$ umwandeln." -#: ../src/features_window.py:97 +#: ../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." @@ -4206,23 +4935,23 @@ 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 +#: ../src/features_window.py:98 msgid "End to end encryption" msgstr "OpenPGP-Verschlüsselung" -#: ../src/features_window.py:100 +#: ../src/features_window.py:99 msgid "Encrypting chatmessages." msgstr "Chatnachrichten werden verschlüsselt." -#: ../src/features_window.py:101 ../src/features_window.py:102 +#: ../src/features_window.py:100 ../src/features_window.py:101 msgid "Requires python-crypto." msgstr "Erfordert python-crypto" -#: ../src/features_window.py:103 +#: ../src/features_window.py:102 msgid "RST Generator" msgstr "RST Generator" -#: ../src/features_window.py:104 +#: ../src/features_window.py:103 msgid "" "Generate XHTML output from RST code (see http://docutils.sourceforge.net/" "docs/ref/rst/restructuredtext.html)." @@ -4230,31 +4959,30 @@ 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 +#: ../src/features_window.py:104 ../src/features_window.py:105 msgid "Requires python-docutils." msgstr "Erfordert python-docutils." -#: ../src/features_window.py:107 +#: ../src/features_window.py:106 msgid "libsexy" msgstr "" -#: ../src/features_window.py:108 +#: ../src/features_window.py:107 #, fuzzy -msgid "Ability to have clickable URLs in chat window." -msgstr "Versteckt die Knöpfe im Gruppenchat-Fenster." +msgid "Ability to have clickable URLs in chat and groupchat window banners." +msgstr "Anklickbare URLs im Chat-Fenster." -#: ../src/features_window.py:109 ../src/features_window.py:110 +#: ../src/features_window.py:108 ../src/features_window.py:109 msgid "Requires python-sexy." msgstr "Erfordert python-sexy." -#: ../src/features_window.py:117 ../src/common/helpers.py:248 +#: ../src/features_window.py:116 ../src/common/helpers.py:248 msgid "Available" msgstr "Angemeldet" -#: ../src/features_window.py:124 -#, fuzzy +#: ../src/features_window.py:123 msgid "Feature" -msgstr "Fähigkeiten des Servers" +msgstr "Fähigkeit" #: ../src/filetransfers_window.py:77 msgid "File" @@ -4281,7 +5009,7 @@ 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:174 ../src/filetransfers_window.py:184 -#: ../src/history_manager.py:468 +#: ../src/history_manager.py:485 msgid "You" msgstr "Sie" @@ -4290,8 +5018,8 @@ msgstr "Sie" msgid "Sender: %s" msgstr "Gespeichert in: %s" -#: ../src/filetransfers_window.py:176 ../src/filetransfers_window.py:593 -#: ../src/tooltips.py:593 +#: ../src/filetransfers_window.py:176 ../src/filetransfers_window.py:597 +#: ../src/tooltips.py:643 msgid "Recipient: " msgstr "Empfänger: " @@ -4330,10 +5058,9 @@ msgstr "Gegenseite hat Dateitransfer gestoppt" msgid "Choose File to Send..." msgstr "Datei auswählen ..." -#: ../src/filetransfers_window.py:259 ../src/tooltips.py:632 -#, fuzzy +#: ../src/filetransfers_window.py:259 ../src/tooltips.py:683 msgid "Description: " -msgstr "Beschreibung: %s" +msgstr "Beschreibung: " #: ../src/filetransfers_window.py:270 msgid "Gajim cannot access this file" @@ -4363,12 +5090,12 @@ msgstr "Beschreibung: %s" msgid "%s wants to send you a file:" msgstr "%s möchte ihnen eine Datei senden:" -#: ../src/filetransfers_window.py:324 ../src/gtkgui_helpers.py:773 +#: ../src/filetransfers_window.py:326 ../src/gtkgui_helpers.py:773 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Kann existierende Datei \"%s\" nicht überschreiben" -#: ../src/filetransfers_window.py:325 ../src/gtkgui_helpers.py:775 +#: ../src/filetransfers_window.py:327 ../src/gtkgui_helpers.py:775 msgid "" "A file with this name already exists and you do not have permission to " "overwrite it." @@ -4376,33 +5103,35 @@ msgstr "" "Eine Datei mit diesem Namen existiert bereits und Sie haben nicht die Rechte " "sie zu überschreiben." -#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:779 +#: ../src/filetransfers_window.py:334 ../src/gtkgui_helpers.py:779 msgid "This file already exists" msgstr "Diese Datei existiert bereits" -#: ../src/filetransfers_window.py:332 ../src/gtkgui_helpers.py:779 +#: ../src/filetransfers_window.py:334 ../src/gtkgui_helpers.py:779 msgid "What do you want to do?" msgstr "Was möchten Sie tun?" -#: ../src/filetransfers_window.py:344 ../src/gtkgui_helpers.py:789 +#. 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:348 ../src/gtkgui_helpers.py:789 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Verzeichnis \"%s\" ist nicht schreibbar" -#: ../src/filetransfers_window.py:344 ../src/gtkgui_helpers.py:790 +#: ../src/filetransfers_window.py:348 ../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." -#: ../src/filetransfers_window.py:354 +#: ../src/filetransfers_window.py:358 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:434 +#: ../src/filetransfers_window.py:438 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" @@ -4410,65 +5139,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:523 +#: ../src/filetransfers_window.py:527 #, python-format msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" -#: ../src/filetransfers_window.py:563 ../src/filetransfers_window.py:566 +#: ../src/filetransfers_window.py:567 ../src/filetransfers_window.py:570 msgid "Invalid File" msgstr "Ungültige Datei" -#: ../src/filetransfers_window.py:563 +#: ../src/filetransfers_window.py:567 msgid "File: " msgstr "Datei: " -#: ../src/filetransfers_window.py:567 +#: ../src/filetransfers_window.py:571 msgid "It is not possible to send empty files" msgstr "Es nicht möglich, leere Dateien zu versenden" -#: ../src/filetransfers_window.py:589 ../src/tooltips.py:583 +#: ../src/filetransfers_window.py:593 ../src/tooltips.py:633 msgid "Name: " msgstr "Name: " -#: ../src/filetransfers_window.py:591 ../src/tooltips.py:587 +#: ../src/filetransfers_window.py:595 ../src/tooltips.py:637 msgid "Sender: " msgstr "Absender: " -#: ../src/filetransfers_window.py:779 +#: ../src/filetransfers_window.py:783 msgid "Pause" msgstr "Pause" -#: ../src/gajim.py:56 +#: ../src/gajim.py:71 #, python-format msgid "%s is not a valid loglevel" msgstr "%s ist kein gültiger Loglevel." -#: ../src/gajim.py:129 +#: ../src/gajim.py:144 msgid "Gajim needs X server to run. Quiting..." msgstr "Gajim benötigt einen laufenden X-Server. Breche ab ..." -#: ../src/gajim.py:156 +#: ../src/gajim.py:171 msgid "Gajim needs PyGTK 2.8 or above" msgstr "Gajim benötigt PyGTK 2.6 oder höher" -#: ../src/gajim.py:157 +#: ../src/gajim.py:172 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:159 +#: ../src/gajim.py:174 msgid "Gajim needs GTK 2.8 or above" msgstr "Gajim benötigt GTK 2.6 oder höher" -#: ../src/gajim.py:160 +#: ../src/gajim.py:175 msgid "Gajim needs GTK 2.8 or above to run. Quiting..." msgstr "Gajim benötigt GTK 2.6+. Breche ab ..." -#: ../src/gajim.py:165 +#: ../src/gajim.py:180 msgid "GTK+ runtime is missing libglade support" msgstr "GTK+ runtine fehlt libglade-Unterstützung" -#: ../src/gajim.py:167 +#: ../src/gajim.py:182 #, python-format msgid "" "Please remove your current GTK+ runtime and install the latest stable " @@ -4477,22 +5206,22 @@ msgstr "" "Bitte entfernen Sie Ihre derzeitige GTK+ Laufzeitumgebung und installieren " "Sie die aktuelle Version von %s" -#: ../src/gajim.py:169 +#: ../src/gajim.py:184 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:174 +#: ../src/gajim.py:189 msgid "Gajim needs PySQLite2 to run" msgstr "Gajim benötigt PySQLite2 zum Starten" -#: ../src/gajim.py:182 +#: ../src/gajim.py:197 msgid "Gajim needs pywin32 to run" msgstr "Gajim benötigt pywin32 zum Laufen" -#: ../src/gajim.py:183 +#: ../src/gajim.py:198 #, python-format msgid "" "Please make sure that Pywin32 is installed on your system. You can get it at " @@ -4502,11 +5231,11 @@ msgstr "" "können es unter folgender URL herunterladen: %s " #. set the icon to all newly opened wind -#: ../src/gajim.py:328 +#: ../src/gajim.py:342 msgid "Gajim is already running" msgstr "Gajim läuft bereits" -#: ../src/gajim.py:329 +#: ../src/gajim.py:343 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -4514,169 +5243,175 @@ msgstr "" "Eine andere Instanz von Gajim schein bereits zu laufen\n" "Trotzdem starten?" -#: ../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 +#: ../src/gajim.py:366 ../src/common/connection_handlers.py:929 +#: ../src/common/connection_handlers.py:1653 +#: ../src/common/connection_handlers.py:1682 +#: ../src/common/connection_handlers.py:1692 +#: ../src/common/connection_handlers.py:1711 +#: ../src/common/connection_handlers.py:1962 +#: ../src/common/connection_handlers.py:2074 ../src/common/connection.py:1071 msgid "Disk Write Error" msgstr "Fehler beim Schreiben auf Festplatte" -#: ../src/gajim.py:448 +#: ../src/gajim.py:462 msgid "Do you accept this request?" msgstr "Akzeptieren Sie diese Anfrage?" -#: ../src/gajim.py:450 +#: ../src/gajim.py:464 #, python-format msgid "Do you accept this request on account %s?" msgstr "Akzeptieren Sie diese Anfrage vom %s Konto?" -#: ../src/gajim.py:453 +#: ../src/gajim.py:467 #, python-format msgid "HTTP (%s) Authorization for %s (id: %s)" msgstr "HTTP (%s) Autorisierung für %s (id: %s)" -#: ../src/gajim.py:500 ../src/notify.py:466 +#: ../src/gajim.py:514 ../src/notify.py:468 msgid "Connection Failed" msgstr "Verbindung fehlgeschlagen" -#: ../src/gajim.py:834 +#: ../src/gajim.py:849 #, python-format msgid "Subject: %s" msgstr "Thema: %s" #. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) -#: ../src/gajim.py:881 ../src/gajim.py:894 +#: ../src/gajim.py:896 ../src/gajim.py:909 #, python-format msgid "error while sending %s ( %s )" msgstr "Fehler beim Senden von %s ( %s )" -#: ../src/gajim.py:927 +#: ../src/gajim.py:942 msgid "Authorization accepted" msgstr "Autorisierung akzeptiert" -#: ../src/gajim.py:928 +#: ../src/gajim.py:943 #, 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:936 +#: ../src/gajim.py:951 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Kontakt \"%s\" hat das Abonnement zurückgezogen" -#: ../src/gajim.py:937 +#: ../src/gajim.py:952 msgid "You will always see him or her as offline." msgstr "Sie werden den Kontakt ab sofort als offline sehen." -#: ../src/gajim.py:981 +#: ../src/gajim.py:996 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Kontakt mit \"%s\" konnte nicht hergestellt werden" -#: ../src/gajim.py:982 ../src/common/connection.py:465 +#: ../src/gajim.py:997 ../src/common/connection.py:562 msgid "Check your connection or try again later." msgstr "" "Überprüfen Sie die Verbindung oder versuchen Sie es später noch einmal." -#: ../src/gajim.py:1151 ../src/groupchat_control.py:991 +#: ../src/gajim.py:1172 ../src/groupchat_control.py:1016 #, python-format msgid "%s is now known as %s" msgstr "%s heißt jetzt %s" -#: ../src/gajim.py:1167 ../src/roster_window.py:1372 +#: ../src/gajim.py:1188 ../src/roster_window.py:1400 #, python-format msgid "%s is now %s (%s)" msgstr "%s ist jetzt %s (%s)" #. No status message -#: ../src/gajim.py:1170 ../src/groupchat_control.py:1142 -#: ../src/roster_window.py:1375 +#: ../src/gajim.py:1191 ../src/groupchat_control.py:1167 +#: ../src/roster_window.py:1403 #, python-format msgid "%s is now %s" msgstr "%s ist jetzt %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:1291 ../src/groupchat_control.py:951 +#: ../src/gajim.py:1312 ../src/groupchat_control.py:976 msgid "Any occupant is allowed to see your full JID" msgstr "Jeder Teilnehmer darf Ihre volle JID sehen" -#: ../src/gajim.py:1294 +#: ../src/gajim.py:1315 msgid "Room now shows unavailable member" msgstr "Raum zeigt jetzt abwesende Teilnehmer" -#: ../src/gajim.py:1296 +#: ../src/gajim.py:1317 msgid "room now does not show unavailable members" msgstr "Raum zeigt jetzt abwesende Teilnehmer nicht an" -#: ../src/gajim.py:1299 +#: ../src/gajim.py:1320 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 +#: ../src/gajim.py:1323 msgid "Room logging is now enabled" msgstr "Raum-Mitschnitt ist jetzt aktiviert" -#: ../src/gajim.py:1304 +#: ../src/gajim.py:1325 msgid "Room logging is now disabled" msgstr "Raum-Mitschnitt ist jetzt deaktiviert" -#: ../src/gajim.py:1306 +#: ../src/gajim.py:1327 msgid "Room is now non-anonymous" msgstr "Raum ist jetzt un-anonym" -#: ../src/gajim.py:1309 +#: ../src/gajim.py:1330 msgid "Room is now semi-anonymous" msgstr "Raum ist jetzt semi-anonym" -#: ../src/gajim.py:1312 +#: ../src/gajim.py:1333 msgid "Room is now fully-anonymous" msgstr "Raum ist jetzt voll anonym" -#: ../src/gajim.py:1344 +#: ../src/gajim.py:1365 #, 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:1399 +msgid "" +"You configured Gajim to use GPG agent, but there is no GPG agent running or " +"it returned a wrong passphrase.\n" +msgstr "" -#: ../src/gajim.py:1380 +#: ../src/gajim.py:1401 msgid "You are currently connected without your OpenPGP key." msgstr "Sie wurden ohne ihren GPG-Schlüssel verbunden" -#: ../src/gajim.py:1392 +#: ../src/gajim.py:1404 +msgid "Your passphrase is incorrect" +msgstr "Ihre Passphrase ist falsch" + +#: ../src/gajim.py:1421 ../src/secrets.py:44 msgid "Passphrase Required" msgstr "Passphrase benötigt" -#: ../src/gajim.py:1393 +#: ../src/gajim.py:1422 #, 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 +#: ../src/gajim.py:1434 msgid "Wrong Passphrase" msgstr "Falsche Passphrase" -#: ../src/gajim.py:1406 +#: ../src/gajim.py:1435 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 +#: ../src/gajim.py:1545 #, python-format msgid "New mail on %(gmail_mail_address)s" msgstr "Neue E-Mail auf %(gmail_mail_address)s" -#: ../src/gajim.py:1517 +#: ../src/gajim.py:1547 #, python-format msgid "You have %d new mail conversation" msgid_plural "You have %d new mail conversations" @@ -4686,7 +5421,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:1526 +#: ../src/gajim.py:1556 #, python-format msgid "" "\n" @@ -4695,47 +5430,38 @@ msgstr "" "\n" "Von: %(from_address)s" -#: ../src/gajim.py:1704 +#: ../src/gajim.py:1734 #, python-format msgid "%s wants to send you a file." msgstr "%s möchte ihnen eine Datei senden." -#: ../src/gajim.py:1769 +#: ../src/gajim.py:1799 #, 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:1773 +#: ../src/gajim.py:1803 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Dateitransfer %(filename)s von %(name)s wurde gestoppt." -#: ../src/gajim.py:1786 +#: ../src/gajim.py:1816 #, 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:1790 +#: ../src/gajim.py:1820 #, 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: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 +#: ../src/gajim.py:1946 ../src/gajim.py:1990 msgid "Confirm these session options" msgstr "Bestätigen Sie diese Sitzungs-Optionen" -#: ../src/gajim.py:1928 +#: ../src/gajim.py:1947 #, python-format msgid "" "The remote client wants to negotiate an session with these features:\n" @@ -4750,7 +5476,7 @@ msgstr "" "\n" "\t\tSind diese Einstellungen akzeptabel?" -#: ../src/gajim.py:1972 +#: ../src/gajim.py:1991 #, python-format msgid "" "The remote client selected these options:\n" @@ -4765,32 +5491,32 @@ msgstr "" "\n" "Mit der Sitzung fortfahren?" -#: ../src/gajim.py:2097 +#: ../src/gajim.py:2121 msgid "Username Conflict" msgstr "Benutzernamenkonflikt" -#: ../src/gajim.py:2098 +#: ../src/gajim.py:2122 msgid "Please type a new username for your local account" msgstr "Bitte geben Sie einen neuen Benutzernamen für Ihr lokales Konto ein" -#: ../src/gajim.py:2115 +#: ../src/gajim.py:2139 msgid "Ping?" msgstr "Ping?" -#: ../src/gajim.py:2123 +#: ../src/gajim.py:2147 #, python-format msgid "Pong! (%s s.)" msgstr "Pong! (%s s.)" -#: ../src/gajim.py:2129 +#: ../src/gajim.py:2153 msgid "Error." msgstr "Fehler:" -#: ../src/gajim.py:2154 +#: ../src/gajim.py:2178 msgid "Resource Conflict" msgstr "Resourcenkonflikt" -#: ../src/gajim.py:2155 +#: ../src/gajim.py:2179 msgid "" "You are already connected to this account with the same resource. Please " "type a new one" @@ -4798,24 +5524,46 @@ msgstr "" "Sie sind mit diesem Konto bereits mit derselben Ressource verbunden.Bitte " "geben Sie eine neue ein" +#: ../src/gajim.py:2223 +msgid "Error verifying SSL certificate" +msgstr "" + +#: ../src/gajim.py:2224 +#, 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:2244 +msgid "SSL certificate error" +msgstr "" + +#: ../src/gajim.py:2245 +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:2520 +#: ../src/gajim.py:2606 msgid "Could not save your settings and preferences" msgstr "Konnte Einstellungen nicht speichern" #. sorted alphanum -#: ../src/gajim.py:2656 ../src/common/config.py:102 -#: ../src/common/config.py:413 ../src/common/optparser.py:206 +#: ../src/gajim.py:2743 ../src/common/config.py:102 +#: ../src/common/config.py:423 ../src/common/optparser.py:206 #: ../src/common/optparser.py:424 ../src/common/optparser.py:458 msgid "default" msgstr "Standard" -#: ../src/gajim.py:2742 +#: ../src/gajim.py:2829 msgid "Network Manager support not available" msgstr "Unterstützung für Network Manager nicht verfügbar" -#: ../src/gajim.py:2847 +#: ../src/gajim.py:2934 msgid "Session Management support not available (missing gnome.ui module)" msgstr "Sitzungsmanagment-Unterstützung nicht verfügbar (Modul gnome.ui fehlt)" @@ -5206,127 +5954,126 @@ 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:139 +#: ../src/groupchat_control.py:146 msgid "Sending private message failed" msgstr "Senden privater Nachricht fehlgeschlagen" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:141 +#: ../src/groupchat_control.py:148 #, 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." -#: ../src/groupchat_control.py:350 +#: ../src/groupchat_control.py:369 msgid "Insert Nickname" msgstr "Spitzname einfügen" -#: ../src/groupchat_control.py:878 +#: ../src/groupchat_control.py:903 msgid "Really send file?" msgstr "Datei wirklich senden?" -#: ../src/groupchat_control.py:879 +#: ../src/groupchat_control.py:904 #, 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 +#: ../src/groupchat_control.py:979 msgid "Room logging is enabled" msgstr "Raum-Mitschnitt ist aktiviert" -#: ../src/groupchat_control.py:956 +#: ../src/groupchat_control.py:981 msgid "A new room has been created" msgstr "Ein neuer Raum wurde erstellt" -#: ../src/groupchat_control.py:959 +#: ../src/groupchat_control.py:984 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:965 +#: ../src/groupchat_control.py:990 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s wurde rausgeschmissen: %(reason)s" -#: ../src/groupchat_control.py:969 +#: ../src/groupchat_control.py:994 #, 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:976 +#: ../src/groupchat_control.py:1001 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s wurde gebannt: %(reason)s" -#: ../src/groupchat_control.py:980 +#: ../src/groupchat_control.py:1005 #, 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:989 +#: ../src/groupchat_control.py:1014 #, python-format msgid "You are now known as %s" msgstr "Sie heißen nun %s" -#: ../src/groupchat_control.py:1025 ../src/groupchat_control.py:1029 -#: ../src/groupchat_control.py:1034 +#: ../src/groupchat_control.py:1050 ../src/groupchat_control.py:1054 +#: ../src/groupchat_control.py:1059 #, python-format 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:1026 -#, fuzzy +#: ../src/groupchat_control.py:1051 msgid "affiliation changed" -msgstr "Zugehörigkeit: " +msgstr "Zugehörigkeit geändert: " -#: ../src/groupchat_control.py:1031 +#: ../src/groupchat_control.py:1056 msgid "room configuration changed to members-only" msgstr "Gruppenchatkonfiguration wurde auf ausschließlich Mitgleider geändert" -#: ../src/groupchat_control.py:1036 +#: ../src/groupchat_control.py:1061 msgid "system shutdown" msgstr "System wird heruntergefahren" -#: ../src/groupchat_control.py:1135 +#: ../src/groupchat_control.py:1160 #, python-format msgid "%s has left" msgstr "%s ist gegangen" -#: ../src/groupchat_control.py:1140 +#: ../src/groupchat_control.py:1165 #, python-format msgid "%s has joined the group chat" msgstr "%s hat den Gruppenchat betreten" #. Invalid Nickname #. invalid char -#: ../src/groupchat_control.py:1253 ../src/groupchat_control.py:1532 +#: ../src/groupchat_control.py:1278 ../src/groupchat_control.py:1557 msgid "Invalid nickname" msgstr "Ungültiger Benutzername" -#: ../src/groupchat_control.py:1254 ../src/groupchat_control.py:1533 +#: ../src/groupchat_control.py:1279 ../src/groupchat_control.py:1558 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 +#: ../src/groupchat_control.py:1302 ../src/groupchat_control.py:1320 +#: ../src/groupchat_control.py:1404 ../src/groupchat_control.py:1421 #, python-format msgid "Nickname not found: %s" msgstr "Spitzname nicht gefunden: %s" -#: ../src/groupchat_control.py:1311 +#: ../src/groupchat_control.py:1336 msgid "This group chat has no subject" msgstr "Dieser Gruppenchat hat kein Thema" -#: ../src/groupchat_control.py:1322 +#: ../src/groupchat_control.py:1347 #, python-format msgid "Invited %(contact_jid)s to %(room_jid)s." msgstr "%(contact_jid)s in %(room_jid)s eingeladen" -#: ../src/groupchat_control.py:1459 +#: ../src/groupchat_control.py:1484 #, python-format msgid "" "Usage: /%s [reason], bans the JID from the group chat. The " @@ -5339,7 +6086,7 @@ msgstr "" "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:1466 +#: ../src/groupchat_control.py:1491 #, python-format msgid "" "Usage: /%s , opens a private chat window with the specified " @@ -5348,7 +6095,7 @@ msgstr "" "Verwendung: /%s , öffnet ein privates Nachrichtenfenster mit dem " "Inhaber des angegebenen Spitznamens." -#: ../src/groupchat_control.py:1472 +#: ../src/groupchat_control.py:1497 #, python-format msgid "" "Usage: /%s [reason], closes the current window or tab, displaying reason if " @@ -5357,7 +6104,7 @@ msgstr "" "Bedienung: /%s [Grund], schließt das aktuelle Fenster oder Tab, mit Anzeige " "eines Grundes, falls angegeben." -#: ../src/groupchat_control.py:1478 +#: ../src/groupchat_control.py:1503 #, python-format msgid "" "Usage: /%s [reason], invites JID to the current group chat, optionally " @@ -5366,7 +6113,7 @@ msgstr "" "Bedienung: /%s [Grund], lädt die JID in den aktuellen Gruppenchat ein, " "optional mit der Angabe eines Grundes." -#: ../src/groupchat_control.py:1482 +#: ../src/groupchat_control.py:1507 #, python-format msgid "" "Usage: /%s @[/nickname], offers to join room@server optionally " @@ -5375,7 +6122,7 @@ msgstr "" "Bedienung: /%s @ [/Spitzname], bietet den Beitritt zu " "Raum@Server an, optional mit Spitznamen." -#: ../src/groupchat_control.py:1486 +#: ../src/groupchat_control.py:1511 #, python-format msgid "" "Usage: /%s [reason], removes the occupant specified by nickname " @@ -5386,7 +6133,7 @@ msgstr "" "Gruppenchats und zeigt optional einen Grund. Unterstützt KEINE Leerzeichen " "im Spitznamen." -#: ../src/groupchat_control.py:1495 +#: ../src/groupchat_control.py:1520 #, python-format msgid "" "Usage: /%s [message], opens a private message window and sends " @@ -5396,25 +6143,25 @@ msgstr "" "Nachrichtenfenster und sendet die Nachricht zum Inhaber des angegebenen " "Spitznamens." -#: ../src/groupchat_control.py:1500 +#: ../src/groupchat_control.py:1525 #, python-format msgid "Usage: /%s , changes your nickname in current group chat." msgstr "" "Bedienung: /%s , ändert den Spitznamen im aktuellen Gruppenchat." -#: ../src/groupchat_control.py:1504 +#: ../src/groupchat_control.py:1529 #, python-format msgid "Usage: /%s , display the names of group chat occupants." msgstr "Benutzung: /%s , zeigt die Namen der Gruppenchatbesucher." -#: ../src/groupchat_control.py:1508 +#: ../src/groupchat_control.py:1533 #, 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." -#: ../src/groupchat_control.py:1511 +#: ../src/groupchat_control.py:1536 #, python-format msgid "" "Usage: /%s , sends a message without looking for other commands." @@ -5422,45 +6169,45 @@ msgstr "" "Benutzung: /%s , sendet eine Nachricht ohne andere Befehle zu " "beachten." -#: ../src/groupchat_control.py:1606 +#: ../src/groupchat_control.py:1642 #, 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:1608 +#: ../src/groupchat_control.py:1644 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:1612 ../src/roster_window.py:4898 +#: ../src/groupchat_control.py:1648 ../src/roster_window.py:5040 msgid "Do _not ask me again" msgstr "_Nicht noch einmal fragen" -#: ../src/groupchat_control.py:1644 +#: ../src/groupchat_control.py:1680 msgid "Changing Subject" msgstr "Thema ändern" -#: ../src/groupchat_control.py:1645 +#: ../src/groupchat_control.py:1681 msgid "Please specify the new subject:" msgstr "Bitte bestimmen Sie ein neues Thema" -#: ../src/groupchat_control.py:1654 +#: ../src/groupchat_control.py:1690 msgid "Changing Nickname" msgstr "Spitzname ändern" -#: ../src/groupchat_control.py:1655 +#: ../src/groupchat_control.py:1691 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:1670 +#: ../src/groupchat_control.py:1706 #, python-format msgid "Destroying %s" msgstr "Zerstöre %s" -#: ../src/groupchat_control.py:1671 +#: ../src/groupchat_control.py:1707 msgid "" "You are going to definitively destroy this room.\n" "You may specify a reason below:" @@ -5468,41 +6215,41 @@ msgstr "" "Sie werden den Raum endgültig zerstören.\n" "Sie können hier einen Grund angeben:" -#: ../src/groupchat_control.py:1673 +#: ../src/groupchat_control.py:1709 msgid "You may also enter an alternate venue:" msgstr "Sie können auch einen alternativen Raum eintragen:" -#: ../src/groupchat_control.py:1705 +#: ../src/groupchat_control.py:1741 msgid "Bookmark already set" msgstr "Lesezeichen existiert schon" -#: ../src/groupchat_control.py:1706 +#: ../src/groupchat_control.py:1742 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Der Gruppenchat \"%s\" ist schon in den Lesezeichen." -#: ../src/groupchat_control.py:1715 +#: ../src/groupchat_control.py:1751 msgid "Bookmark has been added successfully" msgstr "Lesezeichen wurde erfolgreich hinzugefügt" -#: ../src/groupchat_control.py:1716 +#: ../src/groupchat_control.py:1752 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" #. ask for reason -#: ../src/groupchat_control.py:1868 +#: ../src/groupchat_control.py:1904 #, python-format msgid "Kicking %s" msgstr "%s rausschmeißen" -#: ../src/groupchat_control.py:1869 ../src/groupchat_control.py:2169 +#: ../src/groupchat_control.py:1905 ../src/groupchat_control.py:2200 msgid "You may specify a reason below:" msgstr "Sie können eine Begründung angeben:" #. ask for reason -#: ../src/groupchat_control.py:2168 +#: ../src/groupchat_control.py:2199 #, python-format msgid "Banning %s" msgstr "%s verbannen" @@ -5579,33 +6326,33 @@ msgstr "" msgid "Save Image as..." msgstr "Bild speichern unter ..." -#: ../src/history_manager.py:73 +#: ../src/history_manager.py:90 msgid "Cannot find history logs database" msgstr "Kann Verlaufs-Datenkbank nicht finden" #. holds jid -#: ../src/history_manager.py:113 +#: ../src/history_manager.py:130 msgid "Contacts" msgstr "Kontakte" #. holds time -#: ../src/history_manager.py:126 ../src/history_manager.py:166 +#: ../src/history_manager.py:143 ../src/history_manager.py:183 #: ../src/history_window.py:121 msgid "Date" msgstr "Datum" #. holds nickname -#: ../src/history_manager.py:132 ../src/history_manager.py:184 +#: ../src/history_manager.py:149 ../src/history_manager.py:201 msgid "Nickname" msgstr "Spitzname" #. holds message -#: ../src/history_manager.py:140 ../src/history_manager.py:172 +#: ../src/history_manager.py:157 ../src/history_manager.py:189 #: ../src/history_window.py:129 msgid "Message" msgstr "Nachricht" -#: ../src/history_manager.py:192 +#: ../src/history_manager.py:209 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" @@ -5613,7 +6360,7 @@ msgstr "" "Möchten Sie die Datenbank aufräumen? (NICHT EMPFOHLEN, WENN GAJIM GERADE " "LÄUFT)" -#: ../src/history_manager.py:194 +#: ../src/history_manager.py:211 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 " @@ -5627,26 +6374,26 @@ msgstr "" "\n" "Falls Sie JA klicken, warten Sie bitte einen Augenblick ..." -#: ../src/history_manager.py:406 +#: ../src/history_manager.py:423 msgid "Exporting History Logs..." msgstr "Exportiere Verlauf ..." -#: ../src/history_manager.py:481 +#: ../src/history_manager.py:498 #, 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:518 +#: ../src/history_manager.py:535 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 der ausgewählten Kontakte löschen?" -#: ../src/history_manager.py:522 ../src/history_manager.py:557 +#: ../src/history_manager.py:539 ../src/history_manager.py:574 msgid "This is an irreversible operation." msgstr "Dies ist ein unwiderruflicher Vorgang." -#: ../src/history_manager.py:554 +#: ../src/history_manager.py:571 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?" @@ -5662,7 +6409,7 @@ 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:346 ../src/notify.py:219 +#: ../src/history_window.py:346 ../src/notify.py:221 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s ist jetzt %(status)s" @@ -5685,26 +6432,26 @@ msgstr "Konnte Bild nicht laden" msgid "Image is too big" msgstr "Das Bild ist zu groß" -#: ../src/message_window.py:350 +#: ../src/message_window.py:366 msgid "Chats" msgstr "Chats" -#: ../src/message_window.py:352 +#: ../src/message_window.py:368 msgid "Group Chats" msgstr "Gruppenchat" -#: ../src/message_window.py:354 +#: ../src/message_window.py:370 msgid "Private Chats" msgstr "Private Chats" -#: ../src/message_window.py:356 +#: ../src/message_window.py:376 msgid "Messages" msgstr "Nachrichten" -#: ../src/message_window.py:357 -#, python-format -msgid "%s - Gajim" -msgstr "%s - Gajim" +#: ../src/message_window.py:380 +#, fuzzy, python-format +msgid "%s - %s" +msgstr "als %s" #: ../src/negotiation.py:13 msgid "- messages will be logged" @@ -5743,42 +6490,42 @@ msgstr "" msgid "Yes, I verified the Short Authentication String" msgstr "Ja, Ich habe den kurzen Authentifizierungs-String überprüft" -#: ../src/notify.py:217 +#: ../src/notify.py:219 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s änderte Status" -#: ../src/notify.py:227 +#: ../src/notify.py:229 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s angemeldet" -#: ../src/notify.py:235 +#: ../src/notify.py:237 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s abgemeldet" -#: ../src/notify.py:247 +#: ../src/notify.py:249 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Neue einzelne Nachricht von %(nickname)s" -#: ../src/notify.py:255 +#: ../src/notify.py:257 #, python-format msgid "New Private Message from group chat %s" msgstr "Neue private Nachricht von Gruppenchat %s" -#: ../src/notify.py:257 +#: ../src/notify.py:259 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:260 +#: ../src/notify.py:262 #, python-format msgid "Messaged by %(nickname)s" msgstr "Neue Nachricht von %(nickname)s" -#: ../src/notify.py:266 +#: ../src/notify.py:268 #, python-format msgid "New Message from %(nickname)s" msgstr "Neue Nachricht von %(nickname)s" @@ -5787,18 +6534,18 @@ msgstr "Neue Nachricht von %(nickname)s" msgid "Retrieving profile..." msgstr "Empfange Profil ..." -#: ../src/profile_window.py:107 ../src/roster_window.py:1914 +#: ../src/profile_window.py:107 ../src/roster_window.py:1947 msgid "File is empty" msgstr "Datei ist leer" -#: ../src/profile_window.py:110 ../src/roster_window.py:1917 +#: ../src/profile_window.py:110 ../src/roster_window.py:1950 msgid "File does not exist" msgstr "Datei existiert nicht" #. keep identation #. unknown format #: ../src/profile_window.py:124 ../src/profile_window.py:140 -#: ../src/roster_window.py:1919 ../src/roster_window.py:1930 +#: ../src/roster_window.py:1952 ../src/roster_window.py:1963 msgid "Could not load image" msgstr "Konnte Bild nicht laden" @@ -5835,23 +6582,23 @@ msgstr "" msgid "Merged accounts" msgstr "Alle Konten" -#: ../src/roster_window.py:370 ../src/roster_window.py:635 -#: ../src/roster_window.py:2143 ../src/common/contacts.py:312 +#: ../src/roster_window.py:371 ../src/roster_window.py:637 +#: ../src/roster_window.py:2276 ../src/common/contacts.py:318 #: ../src/common/helpers.py:53 msgid "Observers" msgstr "Beobachter" #. 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 +#: ../src/roster_window.py:456 ../src/roster_window.py:461 +#: ../src/roster_window.py:2000 ../src/roster_window.py:2003 +#: ../src/roster_window.py:2657 ../src/roster_window.py:2660 +#: ../src/roster_window.py:2685 ../src/roster_window.py:4901 +#: ../src/roster_window.py:4903 ../src/common/commands.py:199 +#: ../src/common/contacts.py:107 ../src/common/helpers.py:53 msgid "Groupchats" msgstr "Gruppenchat" -#: ../src/roster_window.py:784 ../src/roster_window.py:4008 +#: ../src/roster_window.py:786 ../src/roster_window.py:4108 msgid "You cannot join a group chat while you are invisible" msgstr "" "Sie können einem Gruppenchat nicht beitreten, wenn Sie unsichtbar sind." @@ -5861,64 +6608,65 @@ msgstr "" #. for chat_with #. for single message #. 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/roster_window.py:1016 ../src/roster_window.py:1026 +#: ../src/roster_window.py:1035 ../src/systray.py:212 ../src/systray.py:217 #: ../src/systray.py:223 #, python-format msgid "using account %s" msgstr "mit Konto %s" #. add -#: ../src/roster_window.py:1031 +#: ../src/roster_window.py:1042 #, python-format msgid "to %s account" msgstr "an Konto %s" #. disco -#: ../src/roster_window.py:1036 +#: ../src/roster_window.py:1047 #, python-format msgid "using %s account" msgstr "mit Konto %s" -#: ../src/roster_window.py:1117 +#: ../src/roster_window.py:1128 msgid "_Manage Bookmarks..." -msgstr "_Verwalte Lesezeichen..." +msgstr "Lesezeichen _verwalten ..." +#. PEP services #. profile, avatar -#: ../src/roster_window.py:1136 +#: ../src/roster_window.py:1149 ../src/roster_window.py:1155 #, python-format msgid "of account %s" msgstr "von Konto %s" -#: ../src/roster_window.py:1176 +#: ../src/roster_window.py:1204 #, python-format msgid "for account %s" msgstr "für Konto %s" #. History manager -#: ../src/roster_window.py:1200 +#: ../src/roster_window.py:1228 msgid "History Manager" msgstr "_Verlaufsmanager" -#: ../src/roster_window.py:1209 +#: ../src/roster_window.py:1237 msgid "_Join New Group Chat" msgstr "_Gruppenchat betreten" -#: ../src/roster_window.py:1576 ../src/roster_window.py:4213 -#: ../src/roster_window.py:4220 +#: ../src/roster_window.py:1607 ../src/roster_window.py:4323 +#: ../src/roster_window.py:4330 msgid "You have unread messages" msgstr "Sie haben ungelesene Nachrichten" -#: ../src/roster_window.py:1577 +#: ../src/roster_window.py:1608 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:1580 +#: ../src/roster_window.py:1611 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transport \"%s\" wird entfernt" -#: ../src/roster_window.py:1581 +#: ../src/roster_window.py:1612 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." @@ -5926,11 +6674,11 @@ msgstr "" "Sie können nun keine Nachrichten mehr mit Kontakten von diesem Transport " "austauschen." -#: ../src/roster_window.py:1584 +#: ../src/roster_window.py:1615 msgid "Transports will be removed" msgstr "Transporte werden entfernt" -#: ../src/roster_window.py:1589 +#: ../src/roster_window.py:1620 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " @@ -5940,149 +6688,135 @@ msgstr "" "austauschen:%s" #. it's jid -#: ../src/roster_window.py:1755 +#: ../src/roster_window.py:1786 msgid "Rename Contact" msgstr "Kontakt umbenennen" -#: ../src/roster_window.py:1756 +#: ../src/roster_window.py:1787 #, 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:1763 +#: ../src/roster_window.py:1794 msgid "Rename Group" msgstr "Gruppe umbenennen" -#: ../src/roster_window.py:1764 +#: ../src/roster_window.py:1795 #, 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:1839 +#: ../src/roster_window.py:1870 msgid "Remove Group" msgstr "Gruppe entfernen" -#: ../src/roster_window.py:1840 +#: ../src/roster_window.py:1871 #, 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:1841 +#: ../src/roster_window.py:1872 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:1872 +#: ../src/roster_window.py:1903 msgid "Assign OpenPGP Key" msgstr "OpenPGP-Schlüssel Zuweisen" -#: ../src/roster_window.py:1873 +#: ../src/roster_window.py:1904 msgid "Select a key to apply to the contact" msgstr "Weisen Sie dem Kontakt einen Schüssel zu" -#: ../src/roster_window.py:2189 +#: ../src/roster_window.py:2078 msgid "_New Group Chat" msgstr "Neuer Gruppenchat" -#: ../src/roster_window.py:2327 +#: ../src/roster_window.py:2395 msgid "I would like to add you to my roster" msgstr "Ich würde dich gerne in meine Liste aufnehmen" #. Send Group Message -#: ../src/roster_window.py:2461 ../src/roster_window.py:2673 +#: ../src/roster_window.py:2519 ../src/roster_window.py:2694 msgid "Send Group M_essage" msgstr "_Sende Nachricht an Gruppe" -#: ../src/roster_window.py:2480 -msgid "_New group chat" -msgstr "_Neuer Gruppenchat" - #. Manage Transport submenu -#: ../src/roster_window.py:2518 +#: ../src/roster_window.py:2539 msgid "_Manage Contacts" msgstr "Kontakte verwalten" -#: ../src/roster_window.py:2579 +#: ../src/roster_window.py:2600 msgid "_Maximize" msgstr "_Maximieren" -#: ../src/roster_window.py:2586 +#: ../src/roster_window.py:2607 msgid "_Disconnect" msgstr "_Verbindung trennen" -#: ../src/roster_window.py:2665 +#: ../src/roster_window.py:2686 msgid "_Maximize All" msgstr "Alle _maximieren" -#: ../src/roster_window.py:2681 +#: ../src/roster_window.py:2702 msgid "To all users" msgstr "An alle Benutzern" -#: ../src/roster_window.py:2684 +#: ../src/roster_window.py:2705 msgid "To all online users" msgstr "An alle angemeldeten Benutzer" -#. Log Off -#: ../src/roster_window.py:2801 -msgid "_Log off" -msgstr "_Abmelden" - -#. Log on -#: ../src/roster_window.py:2807 -msgid "_Log on" -msgstr "_Anmelden" - #. Send single message -#: ../src/roster_window.py:2819 +#: ../src/roster_window.py:2827 msgid "Send Single Message" msgstr "Sende _einzelne Nachricht" #. Manage Transport submenu -#: ../src/roster_window.py:2866 +#: ../src/roster_window.py:2882 msgid "_Manage Transport" msgstr "Transports" #. Modify Transport -#: ../src/roster_window.py:2874 +#: ../src/roster_window.py:2890 msgid "_Modify Transport" msgstr "Trans_port ändern" -#: ../src/roster_window.py:2988 ../src/roster_window.py:3062 +#: ../src/roster_window.py:3024 ../src/roster_window.py:3114 msgid "_Change Status Message" msgstr "Ändere _Statusnachricht" -#: ../src/roster_window.py:3134 +#: ../src/roster_window.py:3186 msgid "Authorization has been sent" msgstr "Autorisierung wurde erneut gesendet" -#: ../src/roster_window.py:3135 +#: ../src/roster_window.py:3187 #, python-format msgid "Now \"%s\" will know your status." msgstr "\"%s\" kennt jetzt ihren Status." -#: ../src/roster_window.py:3155 +#: ../src/roster_window.py:3207 msgid "Subscription request has been sent" msgstr "Abonnement-Anforderung wurde gesendet" -#: ../src/roster_window.py:3156 +#: ../src/roster_window.py:3208 #, 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:3168 +#: ../src/roster_window.py:3220 msgid "Authorization has been removed" msgstr "Autorisierung wurde entfernt" -#: ../src/roster_window.py:3169 +#: ../src/roster_window.py:3221 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "\"%s\" wird Sie nun immer als offline sehen." -#: ../src/roster_window.py:3403 +#: ../src/roster_window.py:3459 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Kontakt \"%s\" wird von ihrer Kontaktliste entfernt" -#: ../src/roster_window.py:3407 +#: ../src/roster_window.py:3463 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." @@ -6091,7 +6825,7 @@ msgstr "" "Ihren Status zu sehen, wodurch der Kontakt Sie nur noch als offline sehen " "wird." -#: ../src/roster_window.py:3412 +#: ../src/roster_window.py:3468 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." @@ -6100,17 +6834,17 @@ msgstr "" "die Berechtigung Ihren Status zu sehen, wodurch der Kontakt Sie nur noch als " "offline sehen wird." -#: ../src/roster_window.py:3415 +#: ../src/roster_window.py:3471 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" #. several contact to remove at the same time -#: ../src/roster_window.py:3419 +#: ../src/roster_window.py:3475 msgid "Contacts will be removed from your roster" msgstr "Kontakte werden von Ihrer Kontaktliste entfernt" -#: ../src/roster_window.py:3423 +#: ../src/roster_window.py:3479 #, python-format msgid "" "By removing these contacts:%s\n" @@ -6120,30 +6854,31 @@ msgstr "" "entziehen Sie ihnen auch die Berechtigung Ihren Status zu sehen, wodurch die " "Kontakte Sie nur noch als offline sehen werden." -#: ../src/roster_window.py:3450 +#: ../src/roster_window.py:3506 +#, fuzzy msgid "" -"Gnome Keyring is installed but not correctly started (environment variable " -"probably not correctly set)" +"Gnome Keyring is installed but not correctly started\t\t\t\t\t\t\t\t" +"(environment variable probably not correctly set)" msgstr "" "Gnome Keyring ist installiert, aber nicht korrekt gestartet " "(Umgebungsvariablen wahrscheinlich falsch gesetzt)" -#: ../src/roster_window.py:3469 +#: ../src/roster_window.py:3526 msgid "GPG is not usable" msgstr "GPG ist nicht benutzbar" #. %s is the account name here -#: ../src/roster_window.py:3470 ../src/common/connection_handlers.py:2153 -#: ../src/common/zeroconf/connection_zeroconf.py:171 +#: ../src/roster_window.py:3527 ../src/common/connection_handlers.py:2201 +#: ../src/common/zeroconf/connection_zeroconf.py:174 #, python-format msgid "You will be connected to %s without OpenPGP." msgstr "Sie werden ohne OpenPGP mit %s verbunden." -#: ../src/roster_window.py:3541 ../src/roster_window.py:3619 +#: ../src/roster_window.py:3598 ../src/roster_window.py:3676 msgid "You are participating in one or more group chats" msgstr "Sie nehmen an einem oder mehreren Gruppenchats teil" -#: ../src/roster_window.py:3542 ../src/roster_window.py:3620 +#: ../src/roster_window.py:3599 ../src/roster_window.py:3677 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" @@ -6151,33 +6886,33 @@ 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:3576 +#: ../src/roster_window.py:3633 msgid "No account available" msgstr "Kein Konto vorhanden" -#: ../src/roster_window.py:3577 +#: ../src/roster_window.py:3634 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." -#: ../src/roster_window.py:3726 +#: ../src/roster_window.py:3819 #, python-format msgid "\"%(title)s\" by %(artist)s" msgstr "\"%(title)s\" von %(artist)s" -#: ../src/roster_window.py:4214 ../src/roster_window.py:4221 +#: ../src/roster_window.py:4324 ../src/roster_window.py:4331 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:4845 +#: ../src/roster_window.py:4987 msgid "Metacontacts storage not supported by your server" msgstr "" "Das Speichern von Metakontakten wird von Ihrem Server nicht unterstützt" -#: ../src/roster_window.py:4847 +#: ../src/roster_window.py:4989 msgid "" "Your server does not support storing metacontacts information. So those " "information will not be saved on next reconnection." @@ -6186,14 +6921,14 @@ msgstr "" "Informationen. Aus diesem Grund werden diese Informationen bei der nächsten " "Neuverbindung nicht gespeichert werden." -#: ../src/roster_window.py:4892 +#: ../src/roster_window.py:5034 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:4894 +#: ../src/roster_window.py:5036 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 " @@ -6203,19 +6938,19 @@ msgstr "" "gruppieren. Normalerweise benutzt man Sie, wenn eine Person mehrere Jabber- " "oder Transport-Konten hat." -#: ../src/roster_window.py:4989 +#: ../src/roster_window.py:5131 #, fuzzy msgid "Invalid file URI:" msgstr "Ungültige Datei" -#: ../src/roster_window.py:5000 +#: ../src/roster_window.py:5142 #, 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 Dateien senden:" +msgstr[0] "Datei an %s senden:" +msgstr[1] "Dateien an %s senden:" -#: ../src/roster_window.py:5328 +#: ../src/roster_window.py:5490 msgid "Change Status Message..." msgstr "Ändere Statusnachricht ..." @@ -6232,19 +6967,48 @@ msgstr "Fehler den empfangenen Daten" msgid "No result" msgstr "Kein Ergebnis" +#: ../src/secrets.py:45 +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" + +#: ../src/secrets.py:89 +msgid "Confirm Passphrase" +msgstr "Passphrase bestätigen" + +#: ../src/secrets.py:90 +msgid "Enter your new passphrase again for confirmation" +msgstr "Passphrase zur Bestätigung erneut eingeben" + +#: ../src/secrets.py:95 ../src/secrets.py:107 +msgid "Create Passphrase" +msgstr "Passphrase erstellen" + +#: ../src/secrets.py:96 +msgid "Passphrases did not match.\n" +msgstr "Passphrasen stimmen nicht überein.\n" + +#: ../src/secrets.py:97 ../src/secrets.py:108 +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" + #: ../src/systray.py:169 msgid "_Change Status Message..." -msgstr "Ändere _Statusnachricht..." +msgstr "Ändere _Statusnachricht ..." #: ../src/systray.py:254 msgid "Hide this menu" msgstr "Versteckt dieses Menü" -#: ../src/tooltips.py:317 ../src/tooltips.py:510 +#: ../src/tooltips.py:317 ../src/tooltips.py:560 msgid "Jabber ID: " msgstr "Jabber-ID:" -#: ../src/tooltips.py:320 ../src/tooltips.py:514 +#: ../src/tooltips.py:320 ../src/tooltips.py:564 msgid "Resource: " msgstr "Ressource: " @@ -6261,83 +7025,120 @@ msgstr " [blockiert]" msgid " [minimized]" msgstr " [minimiert]" -#: ../src/tooltips.py:442 ../src/tooltips.py:630 +#: ../src/tooltips.py:442 ../src/tooltips.py:680 msgid "Status: " msgstr "Status: " -#: ../src/tooltips.py:472 +#: ../src/tooltips.py:476 #, python-format msgid "Last status: %s" msgstr "Letzter Status: %s" -#: ../src/tooltips.py:474 +#: ../src/tooltips.py:478 #, python-format msgid " since %s" msgstr " seit %s" -#: ../src/tooltips.py:492 +#: ../src/tooltips.py:496 msgid "Connected" msgstr "Verbunden" -#: ../src/tooltips.py:494 +#: ../src/tooltips.py:498 msgid "Disconnected" msgstr "Nicht verbunden" +#: ../src/tooltips.py:505 +#, fuzzy +msgid "Mood:" +msgstr "Raum:" + +#: ../src/tooltips.py:515 +#, fuzzy +msgid "Activity:" +msgstr "Aktiviert" + +#: ../src/tooltips.py:533 +#, fuzzy +msgid "Unknown Artist" +msgstr "Unbekannter Typ %s " + +#: ../src/tooltips.py:538 +#, fuzzy +msgid "Unknown Title" +msgstr "Unbekannter Typ %s " + +#: ../src/tooltips.py:543 +#, fuzzy +msgid "Unknown Source" +msgstr "Unbekannter Typ %s " + +#: ../src/tooltips.py:544 +#, fuzzy +msgid "Tune:" +msgstr "Art:" + +#: ../src/tooltips.py:544 +#, python-format +msgid "" +"\"%(title)s\" by %(artist)s\n" +"from %(source)s" +msgstr "" + #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:521 +#: ../src/tooltips.py:571 msgid "Subscription: " msgstr "Abonnement: " -#: ../src/tooltips.py:531 +#: ../src/tooltips.py:581 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:586 +#: ../src/tooltips.py:636 msgid "Download" msgstr "Download" -#: ../src/tooltips.py:592 +#: ../src/tooltips.py:642 msgid "Upload" msgstr "Upload" -#: ../src/tooltips.py:599 +#: ../src/tooltips.py:649 msgid "Type: " msgstr "Typ: " -#: ../src/tooltips.py:605 +#: ../src/tooltips.py:655 msgid "Transferred: " msgstr "Übertragen: " -#: ../src/tooltips.py:608 ../src/tooltips.py:629 +#: ../src/tooltips.py:658 ../src/tooltips.py:679 msgid "Not started" msgstr "Nicht gestartet" -#: ../src/tooltips.py:612 +#: ../src/tooltips.py:662 msgid "Stopped" msgstr "Angehalten" -#: ../src/tooltips.py:614 ../src/tooltips.py:617 +#: ../src/tooltips.py:664 ../src/tooltips.py:667 msgid "Completed" msgstr "Abgeschlossen" -#: ../src/tooltips.py:621 +#: ../src/tooltips.py:671 msgid "?transfer status:Paused" msgstr "?Transferstatus:Pausiert" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:625 +#: ../src/tooltips.py:675 msgid "Stalled" msgstr "Steht still" -#: ../src/tooltips.py:627 +#: ../src/tooltips.py:677 msgid "Transferring" msgstr "Übertrage" -#: ../src/tooltips.py:661 +#: ../src/tooltips.py:713 msgid "This service has not yet responded with detailed information" msgstr "Dieser Dienst hat nicht mit detaillierten Informationen geantwortet" -#: ../src/tooltips.py:664 +#: ../src/tooltips.py:716 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -6345,24 +7146,24 @@ msgstr "" "Dieser Dienst konnte nicht mit detaillierten Informationen antworten\n" "Er ist wahrscheinlich verwaltet oder defekt" -#: ../src/vcard.py:245 +#: ../src/vcard.py:244 msgid "?Client:Unknown" msgstr "Unbekannt" -#: ../src/vcard.py:247 +#: ../src/vcard.py:246 msgid "?OS:Unknown" msgstr "Unbekannt" -#: ../src/vcard.py:272 ../src/vcard.py:282 ../src/vcard.py:472 +#: ../src/vcard.py:271 ../src/vcard.py:281 ../src/vcard.py:471 #, python-format msgid "since %s" msgstr "seit %s" -#: ../src/vcard.py:311 +#: ../src/vcard.py:310 msgid "Affiliation:" msgstr "Zugehörigkeit: " -#: ../src/vcard.py:319 +#: ../src/vcard.py:318 msgid "" "This contact is interested in your presence information, but you are not " "interested in his/her presence" @@ -6370,7 +7171,7 @@ msgstr "" "Dieser Kontakt ist an Ihren Anwesenheitsinformationen interessiert, aber Sie " "sind nicht an seiner/ihrer Anwesenheit interessiert" -#: ../src/vcard.py:321 +#: ../src/vcard.py:320 msgid "" "You are interested in the contact's presence information, but he/she is not " "interested in yours" @@ -6378,14 +7179,14 @@ msgstr "" "Sie sind an den Anwesenheitsinformationen des Kontakts interessiert, aber er/" "sie ist nicht an ihren interessiert" -#: ../src/vcard.py:323 +#: ../src/vcard.py:322 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" #. None -#: ../src/vcard.py:325 +#: ../src/vcard.py:324 msgid "" "You are not interested in the contact's presence, and neither he/she is " "interested in yours" @@ -6393,11 +7194,11 @@ msgstr "" "Sie sind nicht an der Anwesenheit des Kontakts interessiert, und er/sie ist " "nicht interessiert an ihrer" -#: ../src/vcard.py:333 +#: ../src/vcard.py:332 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:337 ../src/vcard.py:374 ../src/vcard.py:497 +#: ../src/vcard.py:336 ../src/vcard.py:373 ../src/vcard.py:496 msgid " resource with priority " msgstr " resource mit Priorität " @@ -6466,6 +7267,10 @@ msgstr "Anwesenheitsbeschreibung:" msgid "The status has been changed." msgstr "Der Status hat sich verändert." +#: ../src/common/commands.py:170 ../src/common/commands.py:194 +msgid "Leave Groupchats" +msgstr "Verlasse Gruppenchat" + #: ../src/common/commands.py:184 #, python-format msgid "%(nickname)s on %(room_jid)s" @@ -6475,10 +7280,6 @@ msgstr "%(nickname)s aus Gruppenchat %(room_jid)s" msgid "You have not joined a groupchat." msgstr "Sie haben keinen Gruppenchat betreten." -#: ../src/common/commands.py:194 -msgid "Leave Groupchats" -msgstr "Verlasse Gruppenchat" - #: ../src/common/commands.py:195 msgid "Choose the groupchats you want to leave" msgstr "Wählen Sie den Gruppenchat, den Sie verlassen möchten" @@ -6620,11 +7421,11 @@ msgstr "" msgid "The username used to identify the Last.fm account." msgstr "" -#: ../src/common/config.py:162 +#: ../src/common/config.py:161 msgid "Add * and [n] in roster title?" msgstr "Füge * und [n] in die Kontaktleiste?" -#: ../src/common/config.py:163 +#: ../src/common/config.py:162 msgid "" "How many lines to remember from previous conversation when a chat tab/window " "is reopened." @@ -6632,12 +7433,12 @@ msgstr "" "Wie viele Zeilen von der vorherigen Unterhaltung gespeichert werden, wenn " "ein Chat Tab/Fenster wieder geöffnet wird." -#: ../src/common/config.py:164 +#: ../src/common/config.py:163 msgid "How many minutes should last lines from previous conversation last." msgstr "" "Wie viele Minuten die Zeilen vom vorherigen Chat angezeigt werden sollen." -#: ../src/common/config.py:165 +#: ../src/common/config.py:164 msgid "" "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " "Client default behaviour)." @@ -6645,11 +7446,11 @@ msgstr "" "Sende Nachricht mit Strg+Enter und mache bei Enter einen Zeilenumbruch " "(Mirabilis ICQ-Client Standardeinstellung)." -#: ../src/common/config.py:167 +#: ../src/common/config.py:166 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Wie viele Zeilen für Strg+BildAuf gespeichert werden." -#: ../src/common/config.py:170 +#: ../src/common/config.py:169 #, python-format msgid "" "Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' " @@ -6658,13 +7459,13 @@ 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:173 +#: ../src/common/config.py:172 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "" "Falls aktiviert, kann Gajim von Außerhalb mittels gajim-remote kontrolliert " "werden." -#: ../src/common/config.py:174 +#: ../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 " @@ -6676,14 +7477,14 @@ msgstr "" "auf False gesetzt und sie synchronisieren sich mit dem globalen Status) " "basierend auf dem Status der Netzwerkverbindung." -#: ../src/common/config.py:175 +#: ../src/common/config.py:174 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:176 +#: ../src/common/config.py:175 msgid "" "Displayed chat state notifications in chat windows. Can be one of all, " "composing_only, disabled." @@ -6691,7 +7492,7 @@ msgstr "" "Angezeigte Chat-Status Benachrichtigungen im Chatfenster. Kann all, " "composing_only oder disabled sein." -#: ../src/common/config.py:178 +#: ../src/common/config.py:177 msgid "" "When not printing time for every message (print_time==sometimes), print it " "every x minutes." @@ -6699,11 +7500,11 @@ msgstr "" "Wenn die Uhrzeit nicht für jede Nachricht angezeigt werden soll " "(print_time==sometimes), zeige sie alle x Minuten." -#: ../src/common/config.py:179 +#: ../src/common/config.py:178 msgid "Ask before closing a group chat tab/window." msgstr "Fragen, bevor ein Gruppenchat Tab/Fenster geschlossen wird." -#: ../src/common/config.py:180 +#: ../src/common/config.py:179 msgid "" "Always ask before closing group chat tab/window in this space separated list " "of group chat jids." @@ -6711,7 +7512,7 @@ msgstr "" "Immer fragen, bevor ein Gruppenchat-Fenster/Tab aus der Leerzeichen-" "seperierten Liste von Gruppchatnamen geschlossen wird." -#: ../src/common/config.py:181 +#: ../src/common/config.py:180 msgid "" "Never ask before closing group chat tab/window in this space separated list " "of group chat jids." @@ -6719,7 +7520,7 @@ msgstr "" "Niemals fragen, bevor ein Gruppenchat-Fenster/Tab aus der Leerzeichen-" "seperierten Liste von Gruppenchatnamen geschlossen wird." -#: ../src/common/config.py:184 +#: ../src/common/config.py:183 #, fuzzy msgid "" "Comma separated list of hosts that we send, in addition of local interfaces, " @@ -6728,27 +7529,27 @@ msgstr "" "Überschreibt den Host für Datenübertragung für den Fall von NAT/Port-" "Forwarding" -#: ../src/common/config.py:186 +#: ../src/common/config.py:185 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "IEC-Standard sagt KiB = 1024 Byte, kB = 1000 Byte." -#: ../src/common/config.py:188 +#: ../src/common/config.py:187 msgid "Notify of events in the system trayicon." msgstr "Benachrichtige über Ereignisse durch das Trayicon" -#: ../src/common/config.py:194 +#: ../src/common/config.py:193 msgid "Show tab when only one conversation?" msgstr "Tab bei einer einzelnen Unterhaltung anzeigen?" -#: ../src/common/config.py:195 +#: ../src/common/config.py:194 msgid "Show tabbed notebook border in chat windows?" msgstr "Tab-Grenze im Chat-Fenster anzeigen?" -#: ../src/common/config.py:196 +#: ../src/common/config.py:195 msgid "Show close button in tab?" msgstr "Schließen-Button im Tab anzeigen?" -#: ../src/common/config.py:197 +#: ../src/common/config.py:196 msgid "" "When negotiating an encrypted session, should Gajim assume you want your " "messages to be logged?" @@ -6756,7 +7557,7 @@ msgstr "" "Soll Gajim beim Aushandeln einer verschlüsselten Sitzung annehmen, dass Sie " "Ihre Nachricht mitschneiden wollen?" -#: ../src/common/config.py:198 +#: ../src/common/config.py:197 msgid "" "When negotiating an encrypted session, should Gajim prefer to use public " "keys for identification?" @@ -6764,19 +7565,18 @@ msgstr "" "Soll Gajim bei Aushandeln einer verschlüsselten Situng öffentliche Schlüssel " "zur Identifikation bevorzugen?" -#: ../src/common/config.py:207 -#, fuzzy +#: ../src/common/config.py:206 msgid "Preview new messages in notification popup?" -msgstr "Sende Statusbenachrichtigungen:" +msgstr "Vorschau neuer Nachrichten im Benachrichtigungs-Popup?" -#: ../src/common/config.py:212 +#: ../src/common/config.py:211 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 +#: ../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." @@ -6785,14 +7585,14 @@ msgstr "" "geklickt wird. Diese Option wird nur beachtet, wenn die Trayicon-" "Unterstützung aktiv ist." -#: ../src/common/config.py:214 +#: ../src/common/config.py:213 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 +#: ../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." @@ -6800,7 +7600,7 @@ 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 +#: ../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." @@ -6808,6 +7608,10 @@ 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:217 +msgid "Define the position of the avatar in roster. Can be left or right" +msgstr "" + #: ../src/common/config.py:218 msgid "" "If True, Gajim will ask for avatar each contact that did not have an avatar " @@ -6883,14 +7687,16 @@ msgstr "" #. always, never, peracct, pertype should not be translated #: ../src/common/config.py:233 +#, fuzzy msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" +"'always_with_roster' - Like 'always' but the messages are in a single window " +"along with the roster.\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." +"specific window." msgstr "" "Kontrolliert das Fenster in dem neue Nachrichten platziert werden.\n" "'always' - Alle Nachrichten landen in einem einzelnen Fenster.\n" @@ -6940,9 +7746,8 @@ msgstr "" "Einrückung, wenn das Zusammenführen nachfolgender Spitznamen verwendet wird." #: ../src/common/config.py:242 -#, fuzzy msgid "Smooth scroll message in conversation window" -msgstr "Nachricht senden und Fenster schließen" +msgstr "Sanftes Scrollen der Nachricht im Unterhaltungsfenster" #: ../src/common/config.py:243 msgid "List of colors that will be used to color nicknames in group chats." @@ -7030,13 +7835,13 @@ msgstr "" "Maximale Anzahl Zeilen, die in einem Gespräch angezeigt werden. Die ältesten " "Zeilen werden gelöscht." -#: ../src/common/config.py:254 +#: ../src/common/config.py:260 msgid "" "If True, notification windows from notification-daemon will be attached to " "systray icon." msgstr "" -#: ../src/common/config.py:265 +#: ../src/common/config.py:272 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." @@ -7044,12 +7849,17 @@ msgstr "" "Die Priorität wird automatisch dem Status entsprechend geändert. Prioritäten " "sind in den autopriority_* Optionen definiert." +#: ../src/common/config.py:284 +msgid "" +"If disabled, don't sign presences with GPG key, even if GPG is configured." +msgstr "" + #. yes, no, ask -#: ../src/common/config.py:293 +#: ../src/common/config.py:302 msgid "Jabberd2 workaround" msgstr "Jabberd2 Workaround" -#: ../src/common/config.py:297 +#: ../src/common/config.py:306 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." @@ -7057,101 +7867,101 @@ 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:356 +#: ../src/common/config.py:366 msgid "Is OpenPGP enabled for this contact?" msgstr "Ist OpenPGP für diesen Kontakt aktiviert?" -#: ../src/common/config.py:357 ../src/common/config.py:360 +#: ../src/common/config.py:367 ../src/common/config.py:370 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:366 +#: ../src/common/config.py:376 msgid "all or space separated status" msgstr "alle oder Leerzeichen-getrennter Status" -#: ../src/common/config.py:367 +#: ../src/common/config.py:377 msgid "'yes', 'no', or 'both'" msgstr "'ja', 'nein' oder 'beide'" -#: ../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 +#: ../src/common/config.py:378 ../src/common/config.py:380 +#: ../src/common/config.py:381 ../src/common/config.py:384 +#: ../src/common/config.py:385 msgid "'yes', 'no' or ''" msgstr "'ja, 'nein' oder ''" -#: ../src/common/config.py:381 +#: ../src/common/config.py:391 msgid "Sleeping" msgstr "Schlafen" -#: ../src/common/config.py:382 +#: ../src/common/config.py:392 msgid "Back soon" msgstr "Bin gleich wieder da" -#: ../src/common/config.py:382 +#: ../src/common/config.py:392 msgid "Back in some minutes." msgstr "Bin in ein paar Minuten zurück." -#: ../src/common/config.py:383 +#: ../src/common/config.py:393 msgid "Eating" msgstr "Essen" -#: ../src/common/config.py:383 +#: ../src/common/config.py:393 msgid "I'm eating, so leave me a message." -msgstr "Ich esse gerade, also hinterlasst eine Nachricht." +msgstr "Ich esse gerade." -#: ../src/common/config.py:384 +#: ../src/common/config.py:394 msgid "Movie" msgstr "Film" -#: ../src/common/config.py:384 +#: ../src/common/config.py:394 msgid "I'm watching a movie." msgstr "Ich sehe mir einen Film an." -#: ../src/common/config.py:385 +#: ../src/common/config.py:395 msgid "Working" msgstr "Arbeiten" -#: ../src/common/config.py:385 +#: ../src/common/config.py:395 msgid "I'm working." msgstr "Ich arbeite." -#: ../src/common/config.py:386 +#: ../src/common/config.py:396 msgid "Phone" msgstr "Telefon" -#: ../src/common/config.py:386 +#: ../src/common/config.py:396 msgid "I'm on the phone." msgstr "Ich telefoniere." -#: ../src/common/config.py:387 +#: ../src/common/config.py:397 msgid "Out" msgstr "Draußen" -#: ../src/common/config.py:387 +#: ../src/common/config.py:397 msgid "I'm out enjoying life." msgstr "Ich bin draußen und genieße das Leben." -#: ../src/common/config.py:391 +#: ../src/common/config.py:401 msgid "I'm available." msgstr "Ich bin angemeldet." -#: ../src/common/config.py:392 +#: ../src/common/config.py:402 msgid "I'm free for chat." msgstr "Ich bin frei zum Chatten." -#: ../src/common/config.py:394 +#: ../src/common/config.py:404 msgid "I'm not available." msgstr "Ich bin nicht verfügbar." -#: ../src/common/config.py:395 +#: ../src/common/config.py:405 msgid "Do not disturb." msgstr "Bitte nicht stören." -#: ../src/common/config.py:396 ../src/common/config.py:397 +#: ../src/common/config.py:406 ../src/common/config.py:407 msgid "Bye!" msgstr "Auf Wiedersehen!" -#: ../src/common/config.py:406 +#: ../src/common/config.py:416 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." @@ -7159,88 +7969,88 @@ 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:407 +#: ../src/common/config.py:417 msgid "Sound to play when any MUC message arrives." msgstr "" "Ton der beim empfangen einer Gruppenchat-Nachricht abgespielt werden soll" -#: ../src/common/config.py:416 ../src/common/optparser.py:220 +#: ../src/common/config.py:426 ../src/common/optparser.py:220 msgid "green" msgstr "grün" -#: ../src/common/config.py:420 ../src/common/optparser.py:206 +#: ../src/common/config.py:430 ../src/common/optparser.py:206 msgid "grocery" msgstr "gemüse" -#: ../src/common/config.py:424 +#: ../src/common/config.py:434 msgid "human" msgstr "menschlich" -#: ../src/common/config.py:428 +#: ../src/common/config.py:438 msgid "marine" msgstr "Marine" -#: ../src/common/connection_handlers.py:61 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:49 +#: ../src/common/connection_handlers.py:67 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:48 msgid "Unable to load idle module" msgstr "Konnte Idle-Modus nicht laden" -#: ../src/common/connection_handlers.py:219 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:243 +#: ../src/common/connection_handlers.py:225 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:242 msgid "Wrong host" msgstr "Falscher Host" -#: ../src/common/connection_handlers.py:220 +#: ../src/common/connection_handlers.py:226 msgid "Invalid local address? :-O" msgstr "Ungültige Lokale Adresse? :-O" -#: ../src/common/connection_handlers.py:618 +#: ../src/common/connection_handlers.py:624 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "" "Registrierungsinformation für Transport %s sind nicht rechtzeitig angekommen" -#: ../src/common/connection_handlers.py:1802 +#: ../src/common/connection_handlers.py:1849 #, python-format msgid "Nickname not allowed: %s" msgstr "Spitzname nicht erlaubt: %s" #. we are banned #. group chat does not exist -#: ../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 +#: ../src/common/connection_handlers.py:1919 +#: ../src/common/connection_handlers.py:1922 +#: ../src/common/connection_handlers.py:1925 +#: ../src/common/connection_handlers.py:1928 +#: ../src/common/connection_handlers.py:1932 +#: ../src/common/connection_handlers.py:1941 msgid "Unable to join group chat" msgstr "Fehler beim Betreten des Gruppenchats" -#: ../src/common/connection_handlers.py:1873 +#: ../src/common/connection_handlers.py:1920 #, python-format msgid "You are banned from group chat %s." msgstr "Sie sind von Gruppenchat %s gebannt." -#: ../src/common/connection_handlers.py:1876 +#: ../src/common/connection_handlers.py:1923 #, python-format msgid "Group chat %s does not exist." msgstr "Dieser Gruppenchat existiert nicht." -#: ../src/common/connection_handlers.py:1879 +#: ../src/common/connection_handlers.py:1926 msgid "Group chat creation is restricted." msgstr "Gruppenchaterstellung ist beschränkt." -#: ../src/common/connection_handlers.py:1882 +#: ../src/common/connection_handlers.py:1929 #, 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:1886 +#: ../src/common/connection_handlers.py:1933 #, 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:1895 +#: ../src/common/connection_handlers.py:1942 #, python-format msgid "" "Your desired nickname in group chat %s is in use or registered by another " @@ -7253,36 +8063,36 @@ msgstr "" #. Room has been destroyed. see #. http://www.xmpp.org/extensions/xep-0045.html#destroyroom -#: ../src/common/connection_handlers.py:1926 +#: ../src/common/connection_handlers.py:1973 msgid "Room has been destroyed" msgstr "Raum wurde zerstört" -#: ../src/common/connection_handlers.py:1933 +#: ../src/common/connection_handlers.py:1980 #, python-format msgid "You can join this room instead: %s" msgstr "Sie können stattdessen diesem Raum beitreten: %s" -#: ../src/common/connection_handlers.py:1960 +#: ../src/common/connection_handlers.py:2007 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:1981 +#: ../src/common/connection_handlers.py:2028 #, python-format msgid "we are now subscribed to %s" msgstr "wir haben jetzt %s abonniert" -#: ../src/common/connection_handlers.py:1983 +#: ../src/common/connection_handlers.py:2030 #, python-format msgid "unsubscribe request from %s" msgstr "Anfrage zur Kündigung des Abonnements von %s" -#: ../src/common/connection_handlers.py:1985 +#: ../src/common/connection_handlers.py:2032 #, python-format msgid "we are now unsubscribed from %s" msgstr "%s hat das Abonnement beendet" -#: ../src/common/connection_handlers.py:2112 +#: ../src/common/connection_handlers.py:2174 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " @@ -7293,72 +8103,234 @@ msgstr "" "um ihn zu entfernen" #. We didn't set a passphrase -#: ../src/common/connection_handlers.py:2151 -#: ../src/common/zeroconf/connection_zeroconf.py:169 +#: ../src/common/connection_handlers.py:2199 +#: ../src/common/zeroconf/connection_zeroconf.py:172 msgid "OpenPGP passphrase was not given" msgstr "Keine OpenPGP-Passphrase gewählt" -#: ../src/common/connection.py:243 -#: ../src/common/zeroconf/connection_zeroconf.py:209 +#: ../src/common/connection.py:59 +msgid "Unable to get issuer certificate" +msgstr "" + +#: ../src/common/connection.py:60 +msgid "Unable to get certificate CRL" +msgstr "" + +#: ../src/common/connection.py:61 +msgid "Unable to decrypt certificate's signature" +msgstr "" + +#: ../src/common/connection.py:62 +msgid "Unable to decrypt CRL's signature" +msgstr "" + +#: ../src/common/connection.py:63 +#, fuzzy +msgid "Unable to decode issuer public key" +msgstr "Konnte Idle-Modus nicht laden" + +#: ../src/common/connection.py:64 +msgid "Certificate signature failure" +msgstr "" + +#: ../src/common/connection.py:65 +msgid "CRL signature failure" +msgstr "" + +#: ../src/common/connection.py:66 +msgid "Certificate is not yet valid" +msgstr "" + +#: ../src/common/connection.py:67 +msgid "Certificate has expired" +msgstr "" + +#: ../src/common/connection.py:68 +#, fuzzy +msgid "CRL is not yet valid" +msgstr "%s ist kein gültiger Loglevel." + +#: ../src/common/connection.py:69 +msgid "CRL has expired" +msgstr "" + +#: ../src/common/connection.py:70 +msgid "Format error in certificate's notBefore field" +msgstr "" + +#: ../src/common/connection.py:71 +msgid "Format error in certificate's notAfter field" +msgstr "" + +#: ../src/common/connection.py:72 +msgid "Format error in CRL's lastUpdate field" +msgstr "" + +#: ../src/common/connection.py:73 +msgid "Format error in CRL's nextUpdate field" +msgstr "" + +#: ../src/common/connection.py:74 +msgid "Out of memory" +msgstr "" + +#: ../src/common/connection.py:75 +#, fuzzy +msgid "Self signed certificate" +msgstr "Ungültiger Benutzername" + +#: ../src/common/connection.py:76 +msgid "Self signed certificate in certificate chain" +msgstr "" + +#: ../src/common/connection.py:77 +msgid "Unable to get local issuer certificate" +msgstr "" + +#: ../src/common/connection.py:78 +msgid "Unable to verify the first certificate" +msgstr "" + +#: ../src/common/connection.py:79 +msgid "Certificate chain too long" +msgstr "" + +#: ../src/common/connection.py:80 +msgid "Certificate revoked" +msgstr "" + +#: ../src/common/connection.py:81 +#, fuzzy +msgid "Invalid CA certificate" +msgstr "Ungültiger Benutzername" + +#: ../src/common/connection.py:82 +msgid "Path length constraint exceeded" +msgstr "" + +#: ../src/common/connection.py:83 +msgid "Unsupported certificate purpose" +msgstr "" + +#: ../src/common/connection.py:84 +msgid "Certificate not trusted" +msgstr "" + +#: ../src/common/connection.py:85 +msgid "Certificate rejected" +msgstr "" + +#: ../src/common/connection.py:86 +msgid "Subject issuer mismatch" +msgstr "" + +#: ../src/common/connection.py:87 +msgid "Authority and subject key identifier mismatch" +msgstr "" + +#: ../src/common/connection.py:88 +msgid "Authority and issuer serial number mismatch" +msgstr "" + +#: ../src/common/connection.py:89 +msgid "Key usage does not include certificate signing" +msgstr "" + +#: ../src/common/connection.py:90 +msgid "Application verification failure" +msgstr "" + +#: ../src/common/connection.py:250 +#: ../src/common/zeroconf/connection_zeroconf.py:214 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Verbindung mit Konto \"%s\" abgebrochen" -#: ../src/common/connection.py:244 +#: ../src/common/connection.py:251 msgid "Reconnect manually." msgstr "Manuelle Neuverbindung." -#: ../src/common/connection.py:255 -#, fuzzy, python-format +#: ../src/common/connection.py:262 +#, python-format msgid "Server %s answered wrongly to register request: %s" +msgstr "Server %s beantwortete Registrierungsanfrage nicht korrekt: %s" + +#: ../src/common/connection.py:296 +#, python-format +msgid "Server %s provided a different registration form" msgstr "" -"Transport %s beantwortete unsere Registrierungsanfrage nicht korrekt: %s" + +#: ../src/common/connection.py:312 +#, python-format +msgid "Unknown SSL error: %d" +msgstr "Unbekannter SSL-Fehler: %d" #. wrong answer -#: ../src/common/connection.py:263 +#: ../src/common/connection.py:327 msgid "Invalid answer" msgstr "Ungültige Antwort" -#: ../src/common/connection.py:264 +#: ../src/common/connection.py:328 #, 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 +#: ../src/common/connection.py:507 msgid "Connection to proxy failed" msgstr "Verbindung mit Proxy fehlgeschlagen" -#: ../src/common/connection.py:464 ../src/common/connection.py:510 -#: ../src/common/connection.py:1080 -#: ../src/common/zeroconf/connection_zeroconf.py:243 +#: ../src/common/connection.py:561 ../src/common/connection.py:623 +#: ../src/common/connection.py:1195 +#: ../src/common/zeroconf/connection_zeroconf.py:248 #, python-format msgid "Could not connect to \"%s\"" msgstr "Konnte nicht mit %s verbinden" -#: ../src/common/connection.py:478 +#: ../src/common/connection.py:575 #, python-format msgid "Connected to server %s:%s with %s" msgstr "Verbunden mit Server %s:%s mit %s" -#: ../src/common/connection.py:511 +#: ../src/common/connection.py:586 +#, python-format +msgid "The authenticity of the %s certificate could be invalid." +msgstr "" + +#: ../src/common/connection.py:589 +#, python-format +msgid "" +"\n" +"SSL Error: %s" +msgstr "" + +#: ../src/common/connection.py:591 +#, python-format +msgid "" +"\n" +"Unknown SSL error: %d" +msgstr "" +"\n" +"Unbekannter SSL-Fehler: %d" + +#: ../src/common/connection.py:624 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:536 +#: ../src/common/connection.py:649 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Authentifizierung mit \"%s\" fehlgeschlagen" -#: ../src/common/connection.py:538 +#: ../src/common/connection.py:651 msgid "Please check your login and password for correctness." msgstr "Bitte überprüfen Sie ihren Benutzernamen und Passwort." -#: ../src/common/connection.py:581 +#: ../src/common/connection.py:694 msgid "Error while removing privacy list" msgstr "Fehler beim Entfernen der Privatliste" -#: ../src/common/connection.py:582 +#: ../src/common/connection.py:695 #, python-format msgid "" "Privacy list %s has not been removed. It is maybe active in one of your " @@ -7368,14 +8340,25 @@ msgstr "" "in einer Ihrer Verbindungen aktiv. Deaktivieren Sie diese und versuchen Sie " "es erneut." +#: ../src/common/connection.py:977 +#: ../src/common/zeroconf/connection_zeroconf.py:381 +msgid "Neither the remote presence is signed, nor a key was assigned." +msgstr "" + +#: ../src/common/connection.py:979 +#: ../src/common/zeroconf/connection_zeroconf.py:383 +#, python-format +msgid "The contact's key (%s) does not match the key assigned in Gajim." +msgstr "" + #. we're not english #. one in locale and one en -#: ../src/common/connection.py:855 +#: ../src/common/connection.py:988 msgid "[This message is *encrypted* (See :JEP:`27`]" msgstr "[Diese Nachricht ist *verschlüsselt* (Siehe: JEP:`27`)]" -#: ../src/common/connection.py:929 -#: ../src/common/zeroconf/connection_zeroconf.py:437 +#: ../src/common/connection.py:1062 +#: ../src/common/zeroconf/connection_zeroconf.py:447 #, python-format msgid "" "Subject: %s\n" @@ -7384,11 +8367,11 @@ msgstr "" "Thema: %s\n" "%s" -#: ../src/common/connection.py:1112 +#: ../src/common/connection.py:1227 msgid "Not fetched because of invisible status" msgstr "Nicht abgeholt aufgrund eines Unsichtbar-Status" -#: ../src/common/contacts.py:299 +#: ../src/common/contacts.py:305 msgid "Not in roster" msgstr "Nicht in der Kontaktliste" @@ -7758,7 +8741,7 @@ msgstr "tut etwas anderes" #: ../src/common/helpers.py:371 msgid "is composing a message..." -msgstr "schreibt im Moment" +msgstr "schreibt im Moment ..." #. paused means he or she was composing but has stopped for a while #: ../src/common/helpers.py:374 @@ -7845,7 +8828,7 @@ msgstr "" msgid "Contact is offline. Your message could not be sent." msgstr "Kontakt ist offline. Ihre Nachricht konnte nicht versendet werden." -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:243 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:242 #, python-format msgid "" "The host %s you configured as the ft_add_hosts_to_send advanced option is " @@ -7854,17 +8837,17 @@ 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:210 +#: ../src/common/zeroconf/connection_zeroconf.py:215 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 +#: ../src/common/zeroconf/connection_zeroconf.py:238 msgid "Avahi error" msgstr "Avahi-Fehler" -#: ../src/common/zeroconf/connection_zeroconf.py:233 +#: ../src/common/zeroconf/connection_zeroconf.py:238 #, python-format msgid "" "%s\n" @@ -7873,31 +8856,31 @@ msgstr "" "%s\n" "Lokaler Nachrichtenversand funktioniert eventuell nicht richtig." -#: ../src/common/zeroconf/connection_zeroconf.py:244 +#: ../src/common/zeroconf/connection_zeroconf.py:249 msgid "Please check if Avahi is installed." msgstr "Bitte überprüfen Sie, ob Avahi installiert ist." -#: ../src/common/zeroconf/connection_zeroconf.py:253 -#: ../src/common/zeroconf/connection_zeroconf.py:257 +#: ../src/common/zeroconf/connection_zeroconf.py:258 +#: ../src/common/zeroconf/connection_zeroconf.py:262 msgid "Could not start local service" msgstr "Lokaler Dienst konnte nicht gestartet werden" -#: ../src/common/zeroconf/connection_zeroconf.py:254 +#: ../src/common/zeroconf/connection_zeroconf.py:259 #, python-format msgid "Unable to bind to port %d." msgstr "Konnte nicht mit Port %d verbinden." -#: ../src/common/zeroconf/connection_zeroconf.py:258 -#: ../src/common/zeroconf/connection_zeroconf.py:353 +#: ../src/common/zeroconf/connection_zeroconf.py:263 +#: ../src/common/zeroconf/connection_zeroconf.py:358 msgid "Please check if avahi-daemon is running." msgstr "Bitte überprüfen Sie, ob avahi-daemon läuft." -#: ../src/common/zeroconf/connection_zeroconf.py:352 +#: ../src/common/zeroconf/connection_zeroconf.py:357 #, 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:369 +#: ../src/common/zeroconf/connection_zeroconf.py:374 msgid "" "You are not connected or not visible to others. Your message could not be " "sent." @@ -7906,7 +8889,7 @@ msgstr "" "konnte nicht versendet werden." #. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:381 +#: ../src/common/zeroconf/connection_zeroconf.py:391 msgid "[This message is encrypted]" msgstr "[Diese Nachricht ist verschlüsselt]" @@ -7916,40 +8899,74 @@ msgstr "[Diese Nachricht ist verschlüsselt]" msgid "Error while adding service. %s" msgstr "Fehler beim Hinzufügen des Dienstes. %s" +#~ msgid "View next message" +#~ msgstr "Zeige nächste Nachricht" + #, fuzzy -#~ msgid "Select the account with which to synchronise" -#~ msgstr "JID des Kontakts mit dem Sie chatten möchten" +#~ msgid "_Next" +#~ msgstr "Text" + +#, fuzzy +#~ msgid "_Quote" +#~ msgstr "_Beenden" + +#, fuzzy +#~ msgid "from_name" +#~ msgstr "thema_name" + +#, fuzzy +#~ msgid "to_name" +#~ msgstr "_Umbenennen" + +#~ msgid "" +#~ "Chat message \n" +#~ "Single message" +#~ msgstr "" +#~ "Chat-Nachricht\n" +#~ "Einzelne Nachricht" + +#, fuzzy +#~ msgid "Default outgoing messages type:" +#~ msgstr "_Ausgehende Nachricht:" + +#~ msgid "" +#~ "Never\n" +#~ "Always\n" +#~ "Per account\n" +#~ "Per type" +#~ msgstr "" +#~ "Niemals\n" +#~ "Immer\n" +#~ "Pro Account\n" +#~ "Pro Typ" + +#~ msgid "Use only one message _window:" +#~ msgstr "Nur ein _Nachrichtenfenster:" + +#~ msgid "OpenPGP Encryption enabled" +#~ msgstr "OpenPGP-Verschlüsselung aktiviert" + +#~ msgid "OpenPGP Encryption disabled" +#~ msgstr "OpenPGP-Verschlüsselung deaktiviert" + +#~ msgid "%s - Gajim" +#~ msgstr "%s - Gajim" + +#~ msgid "_New group chat" +#~ msgstr "_Neuer Gruppenchat" + +#~ msgid "_Log off" +#~ msgstr "_Abmelden" + +#~ msgid "_Log on" +#~ msgstr "_Anmelden" + +#~ msgid "The client at %s cancelled the session negotiation." +#~ msgstr "Der Client bei %s hat die Sitzungs-Aushandlung abgebrochen." #~ 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" @@ -8178,12 +9195,6 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ msgid "Group Chat" #~ msgstr "Gruppenchat" -#~ msgid "invisible" -#~ msgstr "unsichtbar" - -#~ msgid "offline" -#~ msgstr "abgemeldet" - #~ msgid "I'm %s" #~ msgstr "Ich bin %s" @@ -8211,9 +9222,6 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ msgid "_Before time:" #~ msgstr "_Vor der Zeit:" -#~ msgid "_Publish" -#~ msgstr "_Veröffentlichen" - #~ msgid "_Retrieve" #~ msgstr "Ab_rufen" @@ -8260,9 +9268,6 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ 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" @@ -8277,9 +9282,6 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ msgid "Since %s" #~ msgstr "Seit %s" -#~ msgid "Personal details" -#~ msgstr "Persönliche Details" - #~ msgid "Be right back" #~ msgstr "Bin gleich zurück" @@ -8328,9 +9330,6 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ 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" @@ -8477,9 +9476,6 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ msgid "Chat with" #~ msgstr "Unterhalten mit" -#~ msgid "as %s" -#~ msgstr "als %s" - #~ msgid "as " #~ msgstr "als " @@ -8531,9 +9527,6 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ msgid "_Latest" #~ msgstr "_Letzte" -#~ msgid "_Previous" -#~ msgstr "_Vorherige" - #~ msgid "Filter query too short" #~ msgstr "Filteranfrage zu kurz" @@ -8583,9 +9576,6 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ "Soll Gajim Inaktivitätsbenachrichtungen von Tabs im Fokus an andere " #~ "Fenster/Tabs senden?" -#~ msgid "Service" -#~ msgstr "Dienst" - #~ 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 " @@ -8613,9 +9603,6 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ 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" @@ -8694,6 +9681,3 @@ msgstr "Fehler beim Hinzufügen des Dienstes. %s" #~ msgid "Chan_ge" #~ msgstr "_Ändern" - -#~ msgid "Unknown type %s " -#~ msgstr "Unbekannter Typ %s " diff --git a/po/fr.po b/po/fr.po index eb9988722..fc4a2c0b8 100644 --- a/po/fr.po +++ b/po/fr.po @@ -3570,7 +3570,7 @@ msgstr "Fichier" #: ../src/filetransfers_window.py:87 msgid "Time" -msgstr "Moment" +msgstr "Durée" #: ../src/filetransfers_window.py:99 msgid "Progress" @@ -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" diff --git a/po/ru.po b/po/ru.po index bbd428766..dcfeff594 100644 --- a/po/ru.po +++ b/po/ru.po @@ -18,8 +18,8 @@ msgid "" msgstr "" "Project-Id-Version: ru\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-12-05 23:47+0100\n" -"PO-Revision-Date: 2007-12-05 18:32+0300\n" +"POT-Creation-Date: 2008-01-14 12:19+0100\n" +"PO-Revision-Date: 2008-01-13 21:36+0300\n" "Last-Translator: Fomin Denis, Oleg N. Stadnik. \n" "Language-Team: Русский \n" "MIME-Version: 1.0\n" @@ -51,7 +51,7 @@ msgid "_Add Contact..." msgstr "_Добавить контакт..." #: ../data/glade/account_context_menu.glade.h:3 -#: ../data/glade/roster_window.glade.h:15 +#: ../data/glade/roster_window.glade.h:16 msgid "_Discover Services" msgstr "_Просмотреть сервисы" @@ -61,18 +61,22 @@ msgstr "В_ыполнить команду..." #: ../data/glade/account_context_menu.glade.h:5 msgid "_Modify Account" -msgstr "Редактировать учетную запись" +msgstr "_Редактировать учетную запись" #: ../data/glade/account_context_menu.glade.h:6 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 "Начать беседу" +msgid "_Personal Events" +msgstr "_Расширенный статус" #: ../data/glade/account_context_menu.glade.h:8 +#: ../data/glade/roster_window.glade.h:25 +msgid "_Start Chat..." +msgstr "_Начать беседу" + +#: ../data/glade/account_context_menu.glade.h:9 #: ../data/glade/zeroconf_context_menu.glade.h:2 msgid "_Status" msgstr "_Статус" @@ -97,13 +101,15 @@ msgstr "Пожалуйста, заполните данные для ваше #: ../data/glade/account_creation_wizard_window.glade.h:6 msgid "Please select a server" -msgstr "Пожалуйста выберите сервер" +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 "" +"Добавить этот сертификат в список надёжных сертификатов.\n" +"Отпечаток SHA1 сертификата:\n" #: ../data/glade/account_creation_wizard_window.glade.h:10 msgid "Click to see features (like MSN, ICQ transports) of jabber servers" @@ -121,7 +127,7 @@ msgstr "Gajim: мастер создания учетной записи" #: ../data/glade/account_creation_wizard_window.glade.h:13 msgid "I already have an account I want to _use" -msgstr "У меня уже есть учетная запись, которую я хочу использовать" +msgstr "У меня уже есть учетная запись, которую я хочу _использовать" #: ../data/glade/account_creation_wizard_window.glade.h:14 msgid "I want to _register for a new account" @@ -129,19 +135,19 @@ msgstr "Я хочу _зарегистрировать новую учетную #: ../data/glade/account_creation_wizard_window.glade.h:15 #: ../data/glade/account_modification_window.glade.h:20 -#: ../data/glade/accounts_window.glade.h:23 +#: ../data/glade/accounts_window.glade.h:24 msgid "If checked, Gajim will remember the password for this account" msgstr "Если отмечено, то Gajim запомнит пароль учетной записи" #: ../data/glade/account_creation_wizard_window.glade.h:16 #: ../data/glade/account_modification_window.glade.h:26 -#: ../data/glade/accounts_window.glade.h:32 +#: ../data/glade/accounts_window.glade.h:33 msgid "Manage..." msgstr "Управление..." #: ../data/glade/account_creation_wizard_window.glade.h:17 msgid "Prox_y:" -msgstr "Прокси:" +msgstr "Про_кси:" #: ../data/glade/account_creation_wizard_window.glade.h:18 #: ../data/glade/account_modification_window.glade.h:40 @@ -176,7 +182,7 @@ msgid "Your JID:" msgstr "Ваш JID:" #: ../data/glade/account_creation_wizard_window.glade.h:25 -#: ../data/glade/roster_window.glade.h:13 +#: ../data/glade/roster_window.glade.h:14 msgid "_Advanced" msgstr "_Дополнительно" @@ -186,7 +192,7 @@ msgstr "_Закончить" #: ../data/glade/account_creation_wizard_window.glade.h:27 msgid "_Hostname:" -msgstr "Хост: " +msgstr "_Хост: " #: ../data/glade/account_creation_wizard_window.glade.h:28 #: ../data/glade/account_modification_window.glade.h:50 @@ -227,7 +233,7 @@ msgid "Personal Information" msgstr "Личная информация" #: ../data/glade/account_modification_window.glade.h:4 -#: ../data/glade/accounts_window.glade.h:4 +#: ../data/glade/accounts_window.glade.h:5 msgid "Account" msgstr "Учетные записи" @@ -236,93 +242,89 @@ msgid "Account Modification" msgstr "Изменение учетной записи" #: ../data/glade/account_modification_window.glade.h:6 -#: ../data/glade/accounts_window.glade.h:5 +#: ../data/glade/accounts_window.glade.h:6 msgid "Administration operations" msgstr "Административные операции" #: ../data/glade/account_modification_window.glade.h:7 -#: ../data/glade/accounts_window.glade.h:6 +#: ../data/glade/accounts_window.glade.h:7 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/accounts_window.glade.h:8 #: ../data/glade/zeroconf_properties_window.glade.h:3 msgid "C_onnect on Gajim startup" msgstr "_Соединяться при запуске Gajim" #: ../data/glade/account_modification_window.glade.h:9 -#: ../data/glade/accounts_window.glade.h:8 +#: ../data/glade/accounts_window.glade.h:9 msgid "Chan_ge Password" msgstr "И_зменить пароль" #: ../data/glade/account_modification_window.glade.h:10 -#: ../data/glade/accounts_window.glade.h:9 +#: ../data/glade/accounts_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 "" -"Если отмечено, то Gajim будет соединяться с портом 5223, на котором старые " -"сервера обычно ожидают подключения по SSL. Заметьте, что Gajim использует " -"TLS шифрование по умолчанию, если сервер предоставляет такую возможность, с " -"этой же опцией TLS отключается" #: ../data/glade/account_modification_window.glade.h:11 -#: ../data/glade/accounts_window.glade.h:10 +#: ../data/glade/accounts_window.glade.h:11 #: ../data/glade/zeroconf_properties_window.glade.h:4 msgid "Choose _Key..." msgstr "Выбрать _ключ..." #: ../data/glade/account_modification_window.glade.h:12 -#: ../data/glade/accounts_window.glade.h:11 +#: ../data/glade/accounts_window.glade.h:12 msgid "Click to change account's password" msgstr "Щелкните для изменения пароля" #: ../data/glade/account_modification_window.glade.h:13 -#: ../data/glade/accounts_window.glade.h:12 +#: ../data/glade/accounts_window.glade.h:13 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 +#: ../data/glade/accounts_window.glade.h:14 msgid "Connection" msgstr "Соединение" #: ../data/glade/account_modification_window.glade.h:15 -#: ../data/glade/accounts_window.glade.h:15 +#: ../data/glade/accounts_window.glade.h:16 msgid "Edit Personal Information..." msgstr "Редактировать личную информацию..." #. 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 +#: ../data/glade/accounts_window.glade.h:19 +#: ../data/glade/roster_window.glade.h:6 ../src/notify.py:491 +#: ../src/notify.py:522 ../src/notify.py:534 ../src/common/helpers.py:998 #: ../src/common/helpers.py:1010 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/accounts_window.glade.h:20 +#: ../data/glade/preferences_window.glade.h:52 #: ../data/glade/zeroconf_properties_window.glade.h:7 -#: ../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 +#: ../src/roster_window.py:373 ../src/roster_window.py:639 +#: ../src/roster_window.py:1412 ../src/roster_window.py:1791 +#: ../src/roster_window.py:2278 ../src/roster_window.py:2678 +#: ../src/roster_window.py:2805 ../src/common/contacts.py:320 msgid "General" msgstr "Общие" #: ../data/glade/account_modification_window.glade.h:18 -#: ../data/glade/accounts_window.glade.h:20 +#: ../data/glade/accounts_window.glade.h:21 msgid "Hostname: " msgstr "Хост: " #: ../data/glade/account_modification_window.glade.h:19 -#: ../data/glade/accounts_window.glade.h:21 +#: ../data/glade/accounts_window.glade.h:22 msgid "" "If checked, Gajim will also broadcast some more IPs except from just your " "IP, so file transfer has higher chances of working." @@ -331,7 +333,7 @@ msgstr "" "к вашему, так что передача файла имеет больше шансов на успех." #: ../data/glade/account_modification_window.glade.h:21 -#: ../data/glade/accounts_window.glade.h:24 +#: ../data/glade/accounts_window.glade.h:25 msgid "" "If checked, Gajim will send keep-alive packets to prevent connection timeout " "which results in disconnection" @@ -349,7 +351,7 @@ msgstr "" "чтение только для вас" #: ../data/glade/account_modification_window.glade.h:23 -#: ../data/glade/accounts_window.glade.h:25 +#: ../data/glade/accounts_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:9 msgid "" "If checked, Gajim, when launched, will automatically connect to jabber using " @@ -359,7 +361,7 @@ msgstr "" "jabber серверу с использованием этой учетной записи" #: ../data/glade/account_modification_window.glade.h:24 -#: ../data/glade/accounts_window.glade.h:26 +#: ../data/glade/accounts_window.glade.h:27 #: ../data/glade/zeroconf_properties_window.glade.h:10 msgid "" "If checked, any change to the global status (handled by the combobox at the " @@ -371,49 +373,49 @@ msgstr "" "этой учетной записи" #: ../data/glade/account_modification_window.glade.h:25 -#: ../data/glade/accounts_window.glade.h:29 +#: ../data/glade/accounts_window.glade.h:30 msgid "Information about you, as stored in the server" msgstr "Информация о вас, сохраненная на сервере" #: ../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 +#: ../data/glade/accounts_window.glade.h:35 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1614 +#: ../src/config.py:2106 ../src/config.py:3695 msgid "No key selected" msgstr "Не выбран ключ" #. 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: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 +#: ../data/glade/accounts_window.glade.h:37 ../src/config.py:1204 +#: ../src/config.py:1275 ../src/config.py:1522 ../src/config.py:1527 +#: ../src/config.py:2004 ../src/config.py:2091 ../src/config.py:2105 +#: ../src/config.py:3195 ../src/config.py:3263 ../src/config.py:3685 +#: ../src/config.py:3694 ../src/dialogs.py:344 ../src/dialogs.py:346 +#: ../src/roster_window.py:1895 ../src/roster_window.py:1902 +#: ../src/roster_window.py:1909 msgid "None" msgstr "Нет" #: ../data/glade/account_modification_window.glade.h:30 -#: ../data/glade/accounts_window.glade.h:37 +#: ../data/glade/accounts_window.glade.h:38 #: ../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:31 -#: ../data/glade/accounts_window.glade.h:38 +#: ../data/glade/accounts_window.glade.h:39 msgid "Port: " msgstr "Порт: " #: ../data/glade/account_modification_window.glade.h:32 -#: ../data/glade/accounts_window.glade.h:39 +#: ../data/glade/accounts_window.glade.h:40 msgid "Priori_ty:" msgstr "Приори_тет:" #: ../data/glade/account_modification_window.glade.h:33 -#: ../data/glade/accounts_window.glade.h:40 +#: ../data/glade/accounts_window.glade.h:41 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 " @@ -425,12 +427,11 @@ msgstr "" "события" #: ../data/glade/account_modification_window.glade.h:34 -#: ../data/glade/accounts_window.glade.h:41 +#: ../data/glade/accounts_window.glade.h:42 msgid "Priority will change automatically according to your status." msgstr "Изменять приоритет автоматически в соответствии со статусом." #: ../data/glade/account_modification_window.glade.h:35 -#: ../data/glade/accounts_window.glade.h:42 msgid "Proxy:" msgstr "Прокси:" @@ -479,7 +480,6 @@ msgstr "Син_хронизировать статус учетной запис #: ../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 "Объединить контакты" @@ -497,7 +497,7 @@ msgstr "Использовать прокси для передачи файла #: ../data/glade/account_modification_window.glade.h:47 #: ../data/glade/accounts_window.glade.h:56 msgid "_Adjust to status" -msgstr "В зависимости от статуса" +msgstr "В _зависимости от статуса" #: ../data/glade/account_modification_window.glade.h:48 #: ../data/glade/accounts_window.glade.h:57 @@ -508,7 +508,11 @@ msgstr "_Jabber ID:" msgid "_Name:" msgstr "_Имя: " -#: ../data/glade/accounts_window.glade.h:14 +#: ../data/glade/accounts_window.glade.h:4 +msgid "Proxy" +msgstr "Прокси" + +#: ../data/glade/accounts_window.glade.h:15 #: ../data/glade/profile_window.glade.h:11 #: ../data/glade/vcard_information_window.glade.h:16 #: ../data/glade/zeroconf_information_window.glade.h:2 @@ -517,22 +521,22 @@ msgid "E-Mail:" msgstr "Почта:" #. XML Console enable checkbutton -#: ../data/glade/accounts_window.glade.h:16 +#: ../data/glade/accounts_window.glade.h:17 #: ../data/glade/xml_console_window.glade.h:4 msgid "Enable" msgstr "Включить" -#: ../data/glade/accounts_window.glade.h:17 +#: ../data/glade/accounts_window.glade.h:18 #: ../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 +#: ../data/glade/accounts_window.glade.h:23 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/accounts_window.glade.h:28 #: ../data/glade/zeroconf_properties_window.glade.h:11 msgid "" "If the default port that is used for incoming messages is unfitting for your " @@ -543,25 +547,25 @@ msgstr "" "устраивает, вы можете выбрать другой.\n" "Так же возможно придется изменить некоторые настройки брандмауэра." -#: ../data/glade/accounts_window.glade.h:30 +#: ../data/glade/accounts_window.glade.h:31 #: ../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 +#: ../data/glade/zeroconf_properties_window.glade.h:13 ../src/dialogs.py:630 msgid "Jabber ID:" msgstr "Jabber ID:" -#: ../data/glade/accounts_window.glade.h:31 +#: ../data/glade/accounts_window.glade.h:32 #: ../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 +#: ../data/glade/accounts_window.glade.h:34 msgid "Mer_ge accounts" msgstr "_Объединить учетные записи" #. Rename -#: ../data/glade/accounts_window.glade.h:43 ../src/roster_window.py:2731 +#: ../data/glade/accounts_window.glade.h:43 ../src/roster_window.py:2757 msgid "Re_name" msgstr "П_ереименовать" @@ -587,13 +591,17 @@ msgstr "gtk-close" msgid "gtk-remove" msgstr "gtk-remove" +#: ../data/glade/accounts_window.glade.h:62 +msgid "use HTTP_PROXY environment variable" +msgstr "использовать переменную HTTP_PROXY" + #: ../data/glade/add_new_contact_window.glade.h:1 msgid "A_ccount:" -msgstr "Учётная запись:" +msgstr "Учётная запи_сь:" #: ../data/glade/add_new_contact_window.glade.h:2 msgid "A_llow this contact to view my status" -msgstr "Позволить ему или ей видеть мой статус" +msgstr "Позволить ему или ей видеть мой ст_атус" #: ../data/glade/add_new_contact_window.glade.h:3 msgid "Add New Contact" @@ -625,15 +633,15 @@ msgstr "" #: ../data/glade/add_new_contact_window.glade.h:11 msgid "_Group:" -msgstr "Группа:" +msgstr "_Группа:" #: ../data/glade/add_new_contact_window.glade.h:12 msgid "_Nickname:" -msgstr "Ник:" +msgstr "_Ник:" #: ../data/glade/add_new_contact_window.glade.h:13 msgid "_Protocol:" -msgstr "Протокол:" +msgstr "_Протокол:" #: ../data/glade/add_new_contact_window.glade.h:14 msgid "_Register" @@ -641,7 +649,7 @@ msgstr "За_регистрироваться" #: ../data/glade/add_new_contact_window.glade.h:15 msgid "_User ID:" -msgstr "ID пользователя:" +msgstr "_ID пользователя:" #: ../data/glade/adhoc_commands_window.glade.h:1 msgid "An error has occurred:" @@ -677,7 +685,7 @@ msgstr "Подождите..." #: ../data/glade/adhoc_commands_window.glade.h:9 msgid "This jabber entity does not expose any commands." -msgstr "" +msgstr "На этот объект нельзя подействовать какой-либо командой." #: ../data/glade/advanced_configuration_window.glade.h:1 #: ../data/glade/features_window.glade.h:1 @@ -717,7 +725,7 @@ msgstr "" #: ../data/glade/advanced_menuitem_menu.glade.h:5 msgid "Set MOTD..." -msgstr "Установить собщение дня" +msgstr "Установить сообщение дня" #: ../data/glade/advanced_menuitem_menu.glade.h:6 msgid "Sets Message of the Day" @@ -729,7 +737,7 @@ msgstr "Показать консоль _XML" #: ../data/glade/advanced_menuitem_menu.glade.h:8 msgid "Update MOTD..." -msgstr "Обновить собщение дня" +msgstr "Обновить сообщение дня" #: ../data/glade/advanced_menuitem_menu.glade.h:9 msgid "Updates Message of the Day" @@ -756,7 +764,7 @@ msgid "Conditions" msgstr "Условия" #: ../data/glade/advanced_notifications_window.glade.h:4 -#: ../data/glade/preferences_window.glade.h:12 +#: ../data/glade/preferences_window.glade.h:13 msgid "Sounds" msgstr "Звуки" @@ -926,7 +934,7 @@ msgstr "Получена новая запись:" #: ../data/glade/blocked_contacts_window.glade.h:1 msgid "Blocked Contacts" -msgstr "Заблокированне контакты" +msgstr "Заблокированые контакты" #: ../data/glade/change_password_dialog.glade.h:1 msgid "Change Password" @@ -934,7 +942,7 @@ msgstr "Изменить пароль" #: ../data/glade/change_password_dialog.glade.h:2 msgid "Enter it again for confirmation:" -msgstr "Введите опять для подтверждения:" +msgstr "Введите ещё раз для подтверждения:" #: ../data/glade/change_password_dialog.glade.h:3 msgid "Enter new password:" @@ -959,7 +967,7 @@ msgstr "Войти в _комнату" #: ../data/glade/chat_context_menu.glade.h:2 #: ../data/glade/roster_contact_context_menu.glade.h:12 msgid "_Add to Roster..." -msgstr "Добавить в ростер" +msgstr "_Добавить в ростер" #: ../data/glade/chat_context_menu.glade.h:3 msgid "_Copy JID/Email Address" @@ -981,7 +989,7 @@ msgstr "_Просмотреть ссылку в браузере" #: ../data/glade/subscription_request_popup_menu.glade.h:1 #: ../data/glade/systray_context_menu.glade.h:7 msgid "_Start Chat" -msgstr "Начать беседу" +msgstr "_Начать беседу" #: ../data/glade/chat_control_popup_menu.glade.h:1 msgid "Click to see past conversations with this contact" @@ -998,9 +1006,8 @@ msgid "Send _File" msgstr "Отправить _файл" #: ../data/glade/chat_control_popup_menu.glade.h:4 -#, fuzzy msgid "Toggle End to End Encryption" -msgstr "Включить Open_PGP шифрование" +msgstr "Включить End to End шифрование" #: ../data/glade/chat_control_popup_menu.glade.h:5 msgid "Toggle Open_PGP Encryption" @@ -1009,15 +1016,15 @@ 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 "Добавить в ростер" +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:7 #: ../data/glade/roster_contact_context_menu.glade.h:16 -#: ../data/glade/roster_window.glade.h:19 +#: ../data/glade/roster_window.glade.h:20 #: ../data/glade/zeroconf_contact_context_menu.glade.h:6 -#: ../src/roster_window.py:2600 +#: ../src/roster_window.py:2617 msgid "_History" msgstr "_История" @@ -1155,7 +1162,7 @@ msgstr "" #: ../data/glade/gajim_themes_window.glade.h:6 msgid "Bold" -msgstr "Жирный" +msgstr "Полужирный" #: ../data/glade/gajim_themes_window.glade.h:7 msgid "Composing" @@ -1233,7 +1240,7 @@ msgstr "Добавить эту комнату в _закладки" #: ../data/glade/gc_control_popup_menu.glade.h:6 msgid "_Destroy Room" -msgstr "Уничтожить комнату" +msgstr "_Уничтожить комнату" #: ../data/glade/gc_control_popup_menu.glade.h:8 msgid "_Manage Room" @@ -1241,7 +1248,7 @@ msgstr "_Управление комнатой" #: ../data/glade/gc_control_popup_menu.glade.h:9 msgid "_Minimize on close" -msgstr "Сворачивать при закрытии" +msgstr "_Сворачивать при закрытии" #: ../data/glade/gc_occupants_menu.glade.h:1 msgid "Mo_derator" @@ -1249,7 +1256,7 @@ msgstr "_Модератор" #: ../data/glade/gc_occupants_menu.glade.h:2 msgid "Occupant Actions" -msgstr "_Действия над посетителем" +msgstr "Действия над посетителем" #: ../data/glade/gc_occupants_menu.glade.h:5 msgid "_Admin" @@ -1288,8 +1295,8 @@ msgid "From" msgstr "От" #. holds subject -#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:147 -#: ../src/history_manager.py:178 +#: ../data/glade/groups_post_window.glade.h:3 ../src/history_manager.py:164 +#: ../src/history_manager.py:195 msgid "Subject" msgstr "Тема" @@ -1300,8 +1307,8 @@ msgid "" "Generally avoid deletions with contacts you currently chat with." msgstr "" "ВНИМАНИЕ:\n" -"Если вы собираетесь устроить массовую чистку, пожалуйста удостоверьтесь что " -"Gajim не запущен. Избегайте удалений из логов контактов с которыми вы " +"Если вы собираетесь устроить массовую чистку, пожалуйста, удостоверьтесь, " +"что Gajim не запущен. Избегайте удалений из логов контактов, с которыми вы " "разговариваете в этот момент." #: ../data/glade/history_manager.glade.h:3 @@ -1353,7 +1360,7 @@ msgid "" "Enter the jid of a groupchat or a contact here. For online accounts you can " "even enter a a contact's nickname." msgstr "" -"Выберите лог чата который хотите посмотреть. \n" +"Выберите лог чата, который хотите посмотреть. \n" "Введите jid чата или контакта. Для онлайн контактов можете ввести ники." #: ../data/glade/history_window.glade.h:5 ../src/history_window.py:224 @@ -1379,7 +1386,7 @@ msgid "_Log conversation history" msgstr "_История сообщения" #: ../data/glade/history_window.glade.h:10 -#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1182 +#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1181 msgid "_Search" msgstr "_Поиск" @@ -1400,7 +1407,7 @@ msgstr "Отклонить" msgid "Invitation Received" msgstr "Получено приглашение" -#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1385 +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1504 msgid "Join Group Chat" msgstr "Войти в комнату" @@ -1429,8 +1436,8 @@ msgstr "Недавно:" msgid "Room:" msgstr "Комната:" -#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1170 -#: ../src/disco.py:1591 +#: ../data/glade/join_groupchat_window.glade.h:7 ../src/disco.py:1169 +#: ../src/disco.py:1590 msgid "_Join" msgstr "_Присоединиться" @@ -1452,7 +1459,7 @@ msgstr "Управление закладками" #: ../data/glade/manage_bookmarks_window.glade.h:4 msgid "Minimize on Auto Join" -msgstr "Сворачивать при авто входе" +msgstr "Сворачивать при автовходе" #: ../data/glade/manage_bookmarks_window.glade.h:7 msgid "Print status:" @@ -1472,7 +1479,7 @@ msgstr "Свойства" #: ../data/glade/manage_proxies_window.glade.h:2 msgid "Settings" -msgstr "Натройки" +msgstr "Настройки" #: ../data/glade/manage_proxies_window.glade.h:3 msgid "" @@ -1512,20 +1519,15 @@ msgstr "_Хост:" msgid "Click to insert an emoticon (Alt+M)" msgstr "Щелкните, чтобы вставить смайлик (Alt+M)" -#: ../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:12 +#: ../data/glade/message_window.glade.h:3 +#: ../data/glade/roster_window.glade.h:13 #: ../data/glade/subscription_request_window.glade.h:6 msgid "_Actions" 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/message_window.glade.h:5 #: ../data/glade/xml_console_window.glade.h:11 #: ../src/filetransfers_window.py:252 msgid "_Send" @@ -1569,22 +1571,30 @@ msgid "Privacy" msgstr "Уведомления" #: ../data/glade/preferences_window.glade.h:11 +msgid "Publish Personal Events" +msgstr "Отправлять расширенные статусы" + +#: ../data/glade/preferences_window.glade.h:12 msgid "Roster Appearance" msgstr "Настройки ростера" -#: ../data/glade/preferences_window.glade.h:13 +#: ../data/glade/preferences_window.glade.h:14 +msgid "Subscribe to Personal Events" +msgstr "Получать расширенные статусы" + +#: ../data/glade/preferences_window.glade.h:15 msgid "Themes" msgstr "Настройки интерфейса" -#: ../data/glade/preferences_window.glade.h:14 +#: ../data/glade/preferences_window.glade.h:16 msgid "Visual Notifications" msgstr "Уведомления" -#: ../data/glade/preferences_window.glade.h:15 +#: ../data/glade/preferences_window.glade.h:17 msgid "Advanced" msgstr "Расширенные" -#: ../data/glade/preferences_window.glade.h:16 +#: ../data/glade/preferences_window.glade.h:18 msgid "" "All chat states\n" "Composing only\n" @@ -1594,20 +1604,20 @@ msgstr "" "Только печать\n" "Отключено " -#: ../data/glade/preferences_window.glade.h:19 +#: ../data/glade/preferences_window.glade.h:21 msgid "Allow _OS information to be sent" msgstr "Отсылать информацию об _ОС" -#: ../data/glade/preferences_window.glade.h:20 +#: ../data/glade/preferences_window.glade.h:22 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "Позволять уведомления в режиме _ушел/недоступен/занят/невидимка" -#: ../data/glade/preferences_window.glade.h:21 +#: ../data/glade/preferences_window.glade.h:23 msgid "Always check to see if Gajim is the _default Jabber client on startup" msgstr "" -"Всегда проверять при запуске, является ли Gajim jabber-клиентом по-умолчанию" +"_Всегда проверять при запуске, является ли Gajim jabber-клиентом по умолчанию" -#: ../data/glade/preferences_window.glade.h:22 +#: ../data/glade/preferences_window.glade.h:24 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 " @@ -1618,19 +1628,19 @@ msgstr "" "на \"Отошел\", поскольку будет использовать значение по-умолчанию, которое " "установлено здесь" -#: ../data/glade/preferences_window.glade.h:23 +#: ../data/glade/preferences_window.glade.h:25 msgid "Ask status message when I:" msgstr "Запрашивать сообщение о статусе, когда я: " -#: ../data/glade/preferences_window.glade.h:24 +#: ../data/glade/preferences_window.glade.h:26 msgid "Auto _away after:" msgstr "Авто-_отошел после:" -#: ../data/glade/preferences_window.glade.h:25 +#: ../data/glade/preferences_window.glade.h:27 msgid "Auto _not available after:" msgstr "Авто-_недоступен после:" -#: ../data/glade/preferences_window.glade.h:26 +#: ../data/glade/preferences_window.glade.h:28 msgid "" "Autodetect on every Gajim startup\n" "Always use GNOME default applications\n" @@ -1644,7 +1654,7 @@ msgstr "" "Всегда использовать приложения XFCE4 по умолчанию\n" "Другое" -#: ../data/glade/preferences_window.glade.h:31 +#: ../data/glade/preferences_window.glade.h:33 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 " @@ -1654,15 +1664,29 @@ msgstr "" "вас. Используйте с осторожностью, потому что это заблокирует все сообщения " "от контактов не из вашего роcтера." -#: ../data/glade/preferences_window.glade.h:32 +#: ../data/glade/preferences_window.glade.h:34 msgid "Configure color and font of the interface" msgstr "Настроить цвет и шрифт интерфейса" -#: ../data/glade/preferences_window.glade.h:33 +#: ../data/glade/preferences_window.glade.h:35 msgid "Default Status Messages" msgstr "Автоматические статусные сообщения" -#: ../data/glade/preferences_window.glade.h:34 +#: ../data/glade/preferences_window.glade.h:36 +msgid "" +"Detached roster with detached chats\n" +"Detached roster with single chat\n" +"Single window for everything\n" +"Detached roster with chat grouped by account\n" +"Detached roster with chat grouped by type" +msgstr "" +"Отдельно ростер и отдельно каждое окно чата\n" +"Отдельно ростер и отдельно одно окно с чатами\n" +"Всё в одном окне\n" +"Отдельно ростер и окна чатов сгрупированных по учетной записи\n" +"Отдельно ростер и окна чатов сгрупированных по типу" + +#: ../data/glade/preferences_window.glade.h:41 msgid "" "Determined by sender\n" "Chat message\n" @@ -1672,27 +1696,27 @@ msgstr "" "Сообщение чата\n" "Одиночное сообщение" -#: ../data/glade/preferences_window.glade.h:37 +#: ../data/glade/preferences_window.glade.h:44 msgid "Display _extra email details" msgstr "Отображать _дополнительные данные о почте" -#: ../data/glade/preferences_window.glade.h:38 +#: ../data/glade/preferences_window.glade.h:45 msgid "Display a_vatars of contacts in roster" msgstr "Показывать а_ватары для контактов в ростере" -#: ../data/glade/preferences_window.glade.h:39 +#: ../data/glade/preferences_window.glade.h:46 msgid "Display status _messages of contacts in roster" msgstr "Показывать _сообщения о статусе контакта в ростере" -#: ../data/glade/preferences_window.glade.h:40 +#: ../data/glade/preferences_window.glade.h:47 msgid "Emoticons:" msgstr "Смайлики:" -#: ../data/glade/preferences_window.glade.h:41 +#: ../data/glade/preferences_window.glade.h:48 msgid "Events" msgstr "События" -#: ../data/glade/preferences_window.glade.h:42 +#: ../data/glade/preferences_window.glade.h:49 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1702,7 +1726,7 @@ msgstr "" "Здесь вы можете указать, какие состояние чата вы хотели бы видеть в окне " "чата." -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:50 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1712,7 +1736,7 @@ msgstr "" "контактом. Здесь вы можете указать, какие состояния чата Gajim будет " "отсылать вашему респонденту." -#: ../data/glade/preferences_window.glade.h:44 +#: ../data/glade/preferences_window.glade.h:51 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1720,18 +1744,18 @@ msgstr "" "Gajim будет уведомлять вас об отсоединившемся контакте с помощью сообщения в " "правом нижнем углу экрана" -#: ../data/glade/preferences_window.glade.h:46 +#: ../data/glade/preferences_window.glade.h:53 msgid "Hides buttons in chatwindows to " msgstr "Скрывает кнопки окна комнаты." -#: ../data/glade/preferences_window.glade.h:47 +#: ../data/glade/preferences_window.glade.h:54 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" msgstr "" "Если отмечено, то Gajim будет включать информацию об отправителе новых писем." -#: ../data/glade/preferences_window.glade.h:48 +#: ../data/glade/preferences_window.glade.h:55 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1739,7 +1763,7 @@ msgstr "" "Если отмечено, то Gajim будет показывать аватары контактов в окне ростера и " "в окнах комнат" -#: ../data/glade/preferences_window.glade.h:49 +#: ../data/glade/preferences_window.glade.h:56 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -1747,7 +1771,7 @@ msgstr "" "Если отмечено, то Gajim будет отображать сообщение о статусе контакта под " "его именем в окне ростера и в окнах комнат" -#: ../data/glade/preferences_window.glade.h:50 +#: ../data/glade/preferences_window.glade.h:57 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, " @@ -1757,7 +1781,7 @@ msgstr "" "(например, контакты из MSN будут иметь соответствующие иконки msn для " "статусов \"в сети\", \"ушёл\", \"занят\" и т.д.)" -#: ../data/glade/preferences_window.glade.h:51 +#: ../data/glade/preferences_window.glade.h:58 msgid "" "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " "animated or static graphical emoticons" @@ -1766,43 +1790,35 @@ msgstr "" "анимированным эквивалентом. Выберите \"Отключены\", чтобы этого не " "происходило." -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:59 msgid "Ignore rich content in incoming messages" msgstr "Игнорировать форматирование во входящих сообщениях" -#: ../data/glade/preferences_window.glade.h:53 +#: ../data/glade/preferences_window.glade.h:60 msgid "Ma_nage..." msgstr "_Управление..." -#: ../data/glade/preferences_window.glade.h:54 -msgid "" -"Never\n" -"Always\n" -"Per account\n" -"Per type" -msgstr "" -"Никогда\n" -"Всегда\n" -"По учетной записи\n" -"По типу" - -#: ../data/glade/preferences_window.glade.h:58 +#: ../data/glade/preferences_window.glade.h:61 msgid "Notify me about contacts that sign _in" -msgstr "Уведомлять о контактах, которые вошли: " +msgstr "Уведомлять о контактах, которые _вошли: " -#: ../data/glade/preferences_window.glade.h:59 +#: ../data/glade/preferences_window.glade.h:62 msgid "Notify me about contacts that sign _out" -msgstr "Уведомлять о контактах, которые вышли: " +msgstr "Уведомлять о контактах, которые _вышли: " -#: ../data/glade/preferences_window.glade.h:60 +#: ../data/glade/preferences_window.glade.h:63 msgid "Notify on new _GMail email" msgstr "Сообщать о новых письмах в _Gmail" -#: ../data/glade/preferences_window.glade.h:61 +#: ../data/glade/preferences_window.glade.h:64 +msgid "Personal Events" +msgstr "Расширенные статусы" + +#: ../data/glade/preferences_window.glade.h:65 msgid "Play _sounds" msgstr "Проигрывать _звук" -#: ../data/glade/preferences_window.glade.h:62 +#: ../data/glade/preferences_window.glade.h:66 msgid "" "Pop it up\n" "Notify me about it\n" @@ -1812,27 +1828,39 @@ msgstr "" "Сообщить мне об этом\n" "Показать в ростере" -#: ../data/glade/preferences_window.glade.h:65 +#: ../data/glade/preferences_window.glade.h:69 msgid "Preferences" msgstr "Настройки" -#: ../data/glade/preferences_window.glade.h:66 +#: ../data/glade/preferences_window.glade.h:70 msgid "Privacy" msgstr "Личные" -#: ../data/glade/preferences_window.glade.h:67 -msgid "Set status message to reflect currently playing _music track" -msgstr "Отображать в статусном сообщении название проигрываемого трека" +#: ../data/glade/preferences_window.glade.h:71 +msgid "Publish _Activity" +msgstr "Отправлять сообщения об _активности" -#: ../data/glade/preferences_window.glade.h:68 +#: ../data/glade/preferences_window.glade.h:72 +msgid "Publish _Mood" +msgstr "Отправлять _настроения" + +#: ../data/glade/preferences_window.glade.h:73 +msgid "Publish _Tune" +msgstr "Отправлять прослушиваемые _треки" + +#: ../data/glade/preferences_window.glade.h:74 +msgid "Set status message to reflect currently playing _music track" +msgstr "Отображать в статусном сообщении название проигрываемого _трека" + +#: ../data/glade/preferences_window.glade.h:75 msgid "Sign _in" msgstr "В_ошел" -#: ../data/glade/preferences_window.glade.h:69 +#: ../data/glade/preferences_window.glade.h:76 msgid "Sign _out" msgstr "В_ышел" -#: ../data/glade/preferences_window.glade.h:70 +#: ../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." @@ -1840,47 +1868,55 @@ msgstr "" "Некоторые сообщения могут содержать форматирование (цвет, шрифт и т.д.). " "Если отмечено, Gajim будет отображать только их текст, без форматирования." -#: ../data/glade/preferences_window.glade.h:71 +#: ../data/glade/preferences_window.glade.h:78 msgid "Status" msgstr "Статус" -#: ../data/glade/preferences_window.glade.h:72 +#: ../data/glade/preferences_window.glade.h:79 msgid "Status _iconset:" msgstr "Тема статусных _иконок:" -#: ../data/glade/preferences_window.glade.h:73 +#: ../data/glade/preferences_window.glade.h:80 +msgid "Subscribe to A_ctivity" +msgstr "Получать сообщения об _активности" + +#: ../data/glade/preferences_window.glade.h:81 +msgid "Subscribe to M_ood" +msgstr "Получать _настроения" + +#: ../data/glade/preferences_window.glade.h:82 +msgid "Subscribe to T_une" +msgstr "Получать прослушиваемые _треки" + +#: ../data/glade/preferences_window.glade.h:83 msgid "T_heme:" msgstr "_Тема:" -#: ../data/glade/preferences_window.glade.h:74 +#: ../data/glade/preferences_window.glade.h:84 msgid "The auto away status message" msgstr "Сообщение о статусе для авто-отошел" -#: ../data/glade/preferences_window.glade.h:75 +#: ../data/glade/preferences_window.glade.h:85 msgid "The auto not available status message" msgstr "Сообщение о статусе для авто-недоступен" -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:86 msgid "Treat all incoming messages as:" msgstr "Входящее сообщение:" -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:87 msgid "Use _transports iconsets" msgstr "Использовать иконки _транспортов" -#: ../data/glade/preferences_window.glade.h:78 -msgid "Use only one message _window:" -msgstr "Только одно окно:" - -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:88 msgid "Use system _default" -msgstr "Использовать системный шрифт" +msgstr "Использовать _системный шрифт" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:89 msgid "When new event is received:" msgstr "Когда получено новое сообытие:" -#: ../data/glade/preferences_window.glade.h:81 +#: ../data/glade/preferences_window.glade.h:90 msgid "" "Works for Rhythmbox and Muine players. For more players, please visit http://" "trac.gajim.org/wiki/GajimAndMusicPlayer" @@ -1888,83 +1924,87 @@ msgstr "" "Работает с проигрывателями Rhythmbox и Muine. О других проигрывателях см. " "http://trac.gajim.org/wiki/GajimAndMusicPlayer" -#: ../data/glade/preferences_window.glade.h:82 +#: ../data/glade/preferences_window.glade.h:91 msgid "_Advanced Notifications Control..." msgstr "_Дополнительные настройки уведомлений..." -#: ../data/glade/preferences_window.glade.h:83 +#: ../data/glade/preferences_window.glade.h:92 msgid "_Browser:" msgstr "_Браузер:" -#: ../data/glade/preferences_window.glade.h:84 +#: ../data/glade/preferences_window.glade.h:93 msgid "_Display chat state notifications:" -msgstr "Отображать уведомления о состоянии чата:" +msgstr "_Отображать уведомления о состоянии чата:" -#: ../data/glade/preferences_window.glade.h:85 +#: ../data/glade/preferences_window.glade.h:94 msgid "_File manager:" msgstr "_Менеджер файлов:" -#: ../data/glade/preferences_window.glade.h:86 +#: ../data/glade/preferences_window.glade.h:95 msgid "_Font:" msgstr "Шри_фт:" -#: ../data/glade/preferences_window.glade.h:87 +#: ../data/glade/preferences_window.glade.h:96 msgid "_Highlight misspelled words" msgstr "Выделять _слова с опечатками" -#: ../data/glade/preferences_window.glade.h:88 +#: ../data/glade/preferences_window.glade.h:97 msgid "_Ignore events from contacts not in the roster" msgstr "_Игнорировать события от контактов не из ростера" -#: ../data/glade/preferences_window.glade.h:89 +#: ../data/glade/preferences_window.glade.h:98 msgid "_Incoming message:" msgstr "_Входящее сообщение:" -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:99 msgid "_Log status changes of contacts" msgstr "_Записывать в лог изменения статусов контактов" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:100 msgid "_Mail client:" msgstr "_Почтовый клиент:" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:101 msgid "_Make message windows compact" -msgstr "Компактное окно сообщений" +msgstr "_Компактное окно сообщений" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:102 msgid "_Open..." msgstr "_Открыть..." -#: ../data/glade/preferences_window.glade.h:94 +#: ../data/glade/preferences_window.glade.h:103 msgid "_Outgoing message:" msgstr "_Исходящее сообщение:" -#: ../data/glade/preferences_window.glade.h:95 +#: ../data/glade/preferences_window.glade.h:104 msgid "_Player:" msgstr "_Проигрыватель:" -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:105 msgid "_Reset to Default Colors" msgstr "_Вернуться к цветам по умолчанию" -#: ../data/glade/preferences_window.glade.h:97 +#: ../data/glade/preferences_window.glade.h:106 msgid "_Send chat state notifications:" -msgstr "Отправлять уведомления о состоянии чата:" +msgstr "_Отправлять уведомления о состоянии чата:" -#: ../data/glade/preferences_window.glade.h:98 +#: ../data/glade/preferences_window.glade.h:107 msgid "_Sort contacts by status" msgstr "_Сортировать контакты по статусу" -#: ../data/glade/preferences_window.glade.h:99 +#: ../data/glade/preferences_window.glade.h:108 msgid "_Status message:" msgstr "_Сообщение о статусе:" -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:109 msgid "_URL:" msgstr "_URL:" -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:110 +msgid "_Window behavior:" +msgstr "Поведение _окна:" + +#: ../data/glade/preferences_window.glade.h:111 msgid "minutes" msgstr "минут" @@ -1986,7 +2026,7 @@ msgstr "Список доступа" #: ../data/glade/privacy_list_window.glade.h:4 msgid "Active for this session" -msgstr "Действует в текущем сеансе" +msgstr "Действует для текущего сеанса" #: ../data/glade/privacy_list_window.glade.h:5 msgid "Active on each startup" @@ -2008,7 +2048,7 @@ msgstr "JabberID" msgid "Order:" msgstr "Номер:" -#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2258 +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2377 msgid "Privacy List" msgstr "Список доступа" @@ -2132,54 +2172,54 @@ msgid "Middle:" msgstr "Отчество:" #: ../data/glade/profile_window.glade.h:25 -#: ../data/glade/vcard_information_window.glade.h:34 +#: ../data/glade/vcard_information_window.glade.h:33 msgid "Personal Info" msgstr "Личная информация" #: ../data/glade/profile_window.glade.h:27 -#: ../data/glade/vcard_information_window.glade.h:35 +#: ../data/glade/vcard_information_window.glade.h:34 msgid "Phone No.:" msgstr "Телефон:" #: ../data/glade/profile_window.glade.h:28 -#: ../data/glade/vcard_information_window.glade.h:36 +#: ../data/glade/vcard_information_window.glade.h:35 msgid "Position:" msgstr "Должность:" #: ../data/glade/profile_window.glade.h:29 -#: ../data/glade/vcard_information_window.glade.h:37 +#: ../data/glade/vcard_information_window.glade.h:36 msgid "Postal Code:" msgstr "Индекс:" #. Prefix in Name #: ../data/glade/profile_window.glade.h:31 -#: ../data/glade/vcard_information_window.glade.h:39 +#: ../data/glade/vcard_information_window.glade.h:38 msgid "Prefix:" msgstr "Префикс:" #: ../data/glade/profile_window.glade.h:32 -#: ../data/glade/vcard_information_window.glade.h:41 ../src/vcard.py:307 +#: ../data/glade/vcard_information_window.glade.h:40 ../src/vcard.py:306 msgid "Role:" msgstr "Обязанности:" #: ../data/glade/profile_window.glade.h:33 -#: ../data/glade/vcard_information_window.glade.h:42 +#: ../data/glade/vcard_information_window.glade.h:41 msgid "State:" msgstr "Штат:" #: ../data/glade/profile_window.glade.h:34 -#: ../data/glade/vcard_information_window.glade.h:44 +#: ../data/glade/vcard_information_window.glade.h:43 msgid "Street:" msgstr "Улица:" #. Suffix in Name #: ../data/glade/profile_window.glade.h:36 -#: ../data/glade/vcard_information_window.glade.h:48 +#: ../data/glade/vcard_information_window.glade.h:47 msgid "Suffix:" msgstr "Суффикс:" #: ../data/glade/profile_window.glade.h:37 -#: ../data/glade/vcard_information_window.glade.h:50 +#: ../data/glade/vcard_information_window.glade.h:49 msgid "Work" msgstr "Работа" @@ -2200,14 +2240,14 @@ msgstr "Удалить учетную запись из Gajim и с _серве #. 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 +#: ../src/roster_window.py:2574 ../src/roster_window.py:2793 +#: ../src/roster_window.py:2929 msgid "_Remove" msgstr "_Удалить" #: ../data/glade/roster_contact_context_menu.glade.h:1 msgid "A_sk to see his/her status" -msgstr "Попросить возможность видеть его или её статус" +msgstr "_Попросить возможность видеть его или её статус" #: ../data/glade/roster_contact_context_menu.glade.h:2 msgid "Add Special _Notification..." @@ -2215,29 +2255,30 @@ msgstr "Добавить специальное _уведомление" #: ../data/glade/roster_contact_context_menu.glade.h:3 msgid "Assign Open_PGP Key..." -msgstr "Назначить OpenPGP ключ" +msgstr "Назначить Open_PGP ключ" #: ../data/glade/roster_contact_context_menu.glade.h:4 msgid "Edit _Groups..." -msgstr "Редактировать группы" +msgstr "Редактировать _группы" #. Execute Command #: ../data/glade/roster_contact_context_menu.glade.h:5 -#: ../src/roster_window.py:2860 +#: ../src/roster_window.py:2872 msgid "Execute Command..." msgstr "Выполнить команду..." #. Invite to Groupchat +#. Invite to #: ../data/glade/roster_contact_context_menu.glade.h:6 -#: ../src/roster_window.py:2473 +#: ../src/roster_window.py:2527 ../src/roster_window.py:2714 msgid "In_vite to" msgstr "_Пригласить в" #. Send Custom Status #: ../data/glade/roster_contact_context_menu.glade.h:7 -#: ../src/roster_window.py:2697 ../src/roster_window.py:2831 +#: ../src/roster_window.py:2723 ../src/roster_window.py:2839 msgid "Send Cus_tom Status" -msgstr "Установить статус" +msgstr "Установи_ть статус" #: ../data/glade/roster_contact_context_menu.glade.h:8 msgid "Send Single _Message..." @@ -2258,21 +2299,22 @@ msgstr "Начать _беседу" #: ../data/glade/roster_contact_context_menu.glade.h:13 msgid "_Allow him/her to see my status" -msgstr "Позволить ему или ей видеть мой статус" +msgstr "_Позволить ему или ей видеть мой статус" #: ../data/glade/roster_contact_context_menu.glade.h:14 -#: ../src/roster_window.py:2547 ../src/roster_window.py:2758 +#: ../src/roster_window.py:2564 ../src/roster_window.py:2784 +#: ../src/roster_window.py:2919 msgid "_Block" msgstr "_Блокировать" #: ../data/glade/roster_contact_context_menu.glade.h:15 msgid "_Forbid him/her to see my status" -msgstr "Запретить ему или ей видеть мой статус" +msgstr "_Запретить ему или ей видеть мой статус" #: ../data/glade/roster_contact_context_menu.glade.h:17 #: ../data/glade/zeroconf_contact_context_menu.glade.h:7 msgid "_Manage Contact" -msgstr "Управление контактом" +msgstr "_Управление контактом" #: ../data/glade/roster_contact_context_menu.glade.h:19 msgid "_Rename..." @@ -2283,13 +2325,14 @@ msgid "_Subscription" msgstr "_Подписка" #: ../data/glade/roster_contact_context_menu.glade.h:21 -#: ../src/roster_window.py:2541 ../src/roster_window.py:2752 +#: ../src/roster_window.py:2558 ../src/roster_window.py:2778 +#: ../src/roster_window.py:2916 msgid "_Unblock" msgstr "_Разблокировать" #: ../data/glade/roster_window.glade.h:1 msgid "A_ccounts" -msgstr "Учётные записи" +msgstr "_Учётные записи" #: ../data/glade/roster_window.glade.h:2 msgid "Add _Contact..." @@ -2297,7 +2340,7 @@ msgstr "_Добавить контакт..." #: ../data/glade/roster_window.glade.h:3 msgid "Fea_tures" -msgstr "Возможности" +msgstr "Возможнос_ти" #: ../data/glade/roster_window.glade.h:4 msgid "File _Transfers" @@ -2313,45 +2356,53 @@ msgstr "Помощь онлайн" #: ../data/glade/roster_window.glade.h:9 msgid "Profile, A_vatar" -msgstr "Профиль и аватар" +msgstr "Профиль и _аватар" #: ../data/glade/roster_window.glade.h:10 msgid "Show Trans_ports" -msgstr "Показать транспорты" +msgstr "Показать транс_порты" #: ../data/glade/roster_window.glade.h:11 msgid "Show _Offline Contacts" msgstr "Показать _отключенных" -#: ../data/glade/roster_window.glade.h:14 +#: ../data/glade/roster_window.glade.h:12 +msgid "Show _roster" +msgstr "Показать _ростер" + +#: ../data/glade/roster_window.glade.h:15 msgid "_Contents" msgstr "_Содержание" -#: ../data/glade/roster_window.glade.h:16 ../src/disco.py:1324 +#: ../data/glade/roster_window.glade.h:17 ../src/disco.py:1323 msgid "_Edit" msgstr "_Правка" -#: ../data/glade/roster_window.glade.h:17 +#: ../data/glade/roster_window.glade.h:18 msgid "_FAQ" msgstr "_ЧаВО" -#: ../data/glade/roster_window.glade.h:18 +#: ../data/glade/roster_window.glade.h:19 msgid "_Help" msgstr "_Помощь" -#: ../data/glade/roster_window.glade.h:20 +#: ../data/glade/roster_window.glade.h:21 msgid "_Preferences" msgstr "_Настройки" -#: ../data/glade/roster_window.glade.h:21 +#: ../data/glade/roster_window.glade.h:22 msgid "_Quit" msgstr "_Выйти" -#: ../data/glade/roster_window.glade.h:22 +#: ../data/glade/roster_window.glade.h:23 msgid "_Send Single Message..." msgstr "Отправить одиночное _сообщение..." #: ../data/glade/roster_window.glade.h:24 +msgid "_Services" +msgstr "_Сервисы" + +#: ../data/glade/roster_window.glade.h:26 msgid "_View" msgstr "_Вид" @@ -2364,9 +2415,9 @@ msgid "_Add contact" msgstr "Добавить _контакт" #. Information -#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:2915 +#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:2941 msgid "_Information" -msgstr "Информация о контакте" +msgstr "_Информация о контакте" #: ../data/glade/service_discovery_window.glade.h:1 msgid "G_o" @@ -2450,19 +2501,13 @@ 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 контакта, с которым вы хотели бы побеседовать" +msgstr "Расширенные статусы" #: ../data/glade/synchronise_select_contacts_dialog.glade.h:2 msgid "Synchronise : select contacts" @@ -2522,32 +2567,32 @@ msgstr "Информация о контакте" msgid "More" msgstr "Еще" -#: ../data/glade/vcard_information_window.glade.h:33 +#: ../data/glade/vcard_information_window.glade.h:32 msgid "OS:" msgstr "ОС:" -#: ../data/glade/vcard_information_window.glade.h:40 +#: ../data/glade/vcard_information_window.glade.h:39 #: ../data/glade/zeroconf_information_window.glade.h:8 msgid "Resource:" msgstr "Ресурс:" -#: ../data/glade/vcard_information_window.glade.h:43 +#: ../data/glade/vcard_information_window.glade.h:42 #: ../data/glade/zeroconf_information_window.glade.h:9 msgid "Status:" msgstr "Статус:" #. Family Name -#: ../data/glade/vcard_information_window.glade.h:46 +#: ../data/glade/vcard_information_window.glade.h:45 msgid "Subscription:" msgstr "Подписка:" -#: ../data/glade/vcard_information_window.glade.h:49 +#: ../data/glade/vcard_information_window.glade.h:48 msgid "User avatar:" msgstr "Аватар:" #: ../data/glade/xml_console_window.glade.h:1 msgid "Jabber Traffic" -msgstr "Jabber Траффик" +msgstr "Jabber Трафик" #: ../data/glade/xml_console_window.glade.h:2 msgid "XML Input" @@ -2577,17 +2622,17 @@ msgstr "Добавить специальное _уведомление" #: ../data/glade/zeroconf_contact_context_menu.glade.h:2 msgid "Assign Open_PGP Key" -msgstr "Назначить OpenPGP ключ" +msgstr "Назначить Open_PGP ключ" #. Edit Groups #: ../data/glade/zeroconf_contact_context_menu.glade.h:3 -#: ../src/roster_window.py:2530 +#: ../src/roster_window.py:2547 msgid "Edit _Groups" -msgstr "Редактировать группы" +msgstr "Редактировать _группы" #. Rename #: ../data/glade/zeroconf_contact_context_menu.glade.h:8 -#: ../src/roster_window.py:2887 +#: ../src/roster_window.py:2899 msgid "_Rename" msgstr "П_ереименовать" @@ -2624,15 +2669,15 @@ msgstr "" #: ../src/advanced.py:59 msgid "Integer" -msgstr "" +msgstr "Целое" #: ../src/advanced.py:60 msgid "Text" -msgstr "" +msgstr "Текст" #: ../src/advanced.py:61 msgid "Color" -msgstr "" +msgstr "Цвет" #: ../src/advanced.py:70 msgid "Preference Name" @@ -2661,162 +2706,156 @@ msgstr "Скрытый" #. #!/bin/sh #. LANG=$(for i in *.po; do j=${i/.po/}; echo -n "_('"$j"')":" '"$j"', " ; done) #. echo "{_('en'):'en'",$LANG"}" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "English" msgstr "Английский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Belarusian" msgstr "Беларусский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Bulgarian" msgstr "Болгарский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 #, fuzzy msgid "Breton" msgstr "Бриттский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Czech" msgstr "Чешский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "German" msgstr "Немецкий" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Greek" msgstr "Греческий" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "British" msgstr "Британский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Esperanto" msgstr "Эсперанто" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Spanish" msgstr "Испанский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 -#, fuzzy +#: ../src/chat_control.py:60 msgid "Basque" msgstr "Баскский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "French" msgstr "Французский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Croatian" msgstr "Хорватский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Italian" msgstr "Итальянский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Norwegian (b)" -msgstr "Норвежский b" +msgstr "Норвежский (букмол)" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Dutch" msgstr "Голландский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Norwegian" msgstr "Норвежский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Polish" msgstr "Польский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Portuguese" msgstr "Португальский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Brazilian Portuguese" msgstr "Португальский (Бразилия)" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Russian" msgstr "Русский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Serbian" msgstr "Сербский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Slovak" msgstr "Словацкий" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Swedish" msgstr "Шведский" -#: ../src/chat_control2.py:60 ../src/chat_control.py:60 +#: ../src/chat_control.py:60 msgid "Chinese (Ch)" msgstr "Китайский" -#: ../src/chat_control2.py:310 ../src/chat_control.py:313 +#: ../src/chat_control.py:313 msgid "Spelling language" msgstr "Язык проверки орфографии" #. we are not connected -#: ../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_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_control2.py:1176 ../src/chat_control.py:1186 +#: ../src/chat_control.py:1068 ../src/chat_control.py:1276 +msgid "GPG encryption enabled" +msgstr "GPG шифрование включено" + +#: ../src/chat_control.py:1191 #, 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_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:1271 +msgid "GPG encryption disabled" +msgstr "GPG шифрование выключено" -#: ../src/chat_control2.py:1314 ../src/chat_control.py:1328 -#: ../src/groupchat_control.py:1437 +#: ../src/chat_control.py:1337 ../src/groupchat_control.py:1458 #, 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 +#: ../src/chat_control.py:1344 ../src/groupchat_control.py:1481 #, python-format msgid "Commands: %s" msgstr "Команды: %s" -#: ../src/chat_control2.py:1324 ../src/chat_control.py:1338 -#: ../src/groupchat_control.py:1474 +#: ../src/chat_control.py:1347 ../src/groupchat_control.py:1495 #, 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 +#: ../src/chat_control.py:1350 ../src/groupchat_control.py:1500 #, 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 +#: ../src/chat_control.py:1353 ../src/groupchat_control.py:1516 #, python-format msgid "" "Usage: /%s , sends action to the current group chat. Use third " @@ -2825,66 +2864,69 @@ msgstr "" "Использование: /%s <действие>, совершает действие в текущей комнате. " "Используйте третье лицо (например, «/%s взрывается».)" -#: ../src/chat_control2.py:1334 ../src/chat_control.py:1348 +#: ../src/chat_control.py:1357 #, python-format msgid "Usage: /%s, sends a ping to the contact" msgstr "Использование: /%s, посылает пинг контакту" -#: ../src/chat_control2.py:1337 ../src/chat_control.py:1351 +#: ../src/chat_control.py:1360 #, 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 +#: ../src/chat_control.py:1363 ../src/groupchat_control.py:1539 #, 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:1482 +msgid "Session negotiation cancelled" +msgstr "" -#: ../src/chat_control2.py:1483 ../src/chat_control.py:1497 +#: ../src/chat_control.py:1489 +msgid "E2E encryption enabled" +msgstr "E2E шифрование включено" + +#: ../src/chat_control.py:1493 msgid "Session WILL be logged" msgstr "Сессия БУДЕТ сохранена в истории" -#: ../src/chat_control2.py:1485 ../src/chat_control.py:1499 +#: ../src/chat_control.py:1495 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_control.py:1499 +msgid "E2E encryption disabled" +msgstr "E2E шифрование выключено" -#: ../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 "Шифрование отключено" +#: ../src/chat_control.py:1525 ../src/chat_control.py:1536 +msgid "The following message was NOT encrypted" +msgstr "Последнее сообщение НЕ БЫЛО зашифровано" + +#: ../src/chat_control.py:1531 +msgid "The following message was encrypted" +msgstr "Последнее сообщение зашифровано" #. add_to_roster_menuitem -#: ../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/chat_control.py:1700 ../src/conversation_textview.py:704 +#: ../src/dialogs.py:851 ../src/gajim.py:926 ../src/gajim.py:927 +#: ../src/gajim.py:1466 ../src/gajim.py:1717 ../src/roster_window.py:359 +#: ../src/roster_window.py:444 ../src/roster_window.py:1853 +#: ../src/roster_window.py:1863 ../src/roster_window.py:2203 +#: ../src/roster_window.py:2372 ../src/roster_window.py:3206 +#: ../src/roster_window.py:3449 ../src/roster_window.py:4897 +#: ../src/roster_window.py:4899 ../src/common/contacts.py:94 #: ../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_control2.py:1825 ../src/chat_control.py:1839 +#: ../src/chat_control.py:1854 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Вы получили новое сообщение от \"%s\"" -#: ../src/chat_control2.py:1826 ../src/chat_control.py:1840 +#: ../src/chat_control.py:1855 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." @@ -2892,33 +2934,33 @@ msgstr "" "Если вы закроете эту вкладку и у вас отключена функция ведения истории " "сообщений, то это сообщение будет утеряно." -#: ../src/config.py:127 ../src/config.py:565 +#: ../src/config.py:129 ../src/config.py:627 msgid "Disabled" msgstr "Отключены" -#: ../src/config.py:293 +#: ../src/config.py:295 msgid "Active" msgstr "Активен" -#: ../src/config.py:301 +#: ../src/config.py:303 msgid "Event" msgstr "Событие" -#: ../src/config.py:407 +#: ../src/config.py:409 msgid "Always use OS/X default applications" msgstr "Всегда использовать приложения OS/X по умолчанию" -#: ../src/config.py:408 +#: ../src/config.py:410 #, fuzzy msgid "Custom" msgstr "Пользовательские настройки" -#: ../src/config.py:638 ../src/dialogs.py:1018 +#: ../src/config.py:700 ../src/dialogs.py:1137 #, python-format msgid "Dictionary for lang %s not available" msgstr "Нет словаря для языка %s" -#: ../src/config.py:639 +#: ../src/config.py:701 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -2927,106 +2969,106 @@ msgstr "" "Чтобы воспользоваться проверкой правописания, установите словарь для языка %" "s или выберите другой язык, исправив настройку speller_language." -#: ../src/config.py:1001 +#: ../src/config.py:1063 msgid "status message title" msgstr "заголовок сообщения сервера" -#: ../src/config.py:1001 +#: ../src/config.py:1063 msgid "status message text" msgstr "текст сообщения сервера" -#: ../src/config.py:1037 +#: ../src/config.py:1099 msgid "First Message Received" msgstr "Получено первое сообщение" -#: ../src/config.py:1038 +#: ../src/config.py:1100 msgid "Next Message Received" msgstr "Получено следующее сообщение" -#: ../src/config.py:1039 +#: ../src/config.py:1101 msgid "Contact Connected" msgstr "Контакт подключился" -#: ../src/config.py:1040 +#: ../src/config.py:1102 msgid "Contact Disconnected" msgstr "Контакт отключился" -#: ../src/config.py:1041 +#: ../src/config.py:1103 msgid "Message Sent" msgstr "Сообщение отправлено" -#: ../src/config.py:1042 +#: ../src/config.py:1104 msgid "Group Chat Message Highlight" msgstr "Вас упомянули в комнате" -#: ../src/config.py:1043 +#: ../src/config.py:1105 msgid "Group Chat Message Received" msgstr "Получено сообщение в комнате" -#: ../src/config.py:1050 +#: ../src/config.py:1112 msgid "GMail Email Received" msgstr "Получено письмо на Gmail" #. 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/config.py:1376 ../src/dialogs.py:1636 ../src/dialogs.py:1700 +#: ../src/disco.py:742 ../src/disco.py:1534 ../src/disco.py:1780 #: ../src/history_window.py:113 msgid "Name" msgstr "Имя" -#: ../src/config.py:1421 ../src/common/config.py:394 +#: ../src/config.py:1453 ../src/common/config.py:403 msgid "Be right back." msgstr "Скоро буду." -#: ../src/config.py:1425 +#: ../src/config.py:1457 msgid "Relogin now?" msgstr "Переподключиться сейчас?" -#: ../src/config.py:1426 +#: ../src/config.py:1458 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "" "Если вы хотите чтобы изменения были применены немедленно, вы должны " "переподключиться." -#: ../src/config.py:1522 ../src/config.py:1613 +#: ../src/config.py:1588 ../src/config.py:1685 msgid "OpenPGP is not usable in this computer" msgstr "Невозможно использовать OpenPGP" -#: ../src/config.py:1649 ../src/config.py:1690 +#: ../src/config.py:1721 ../src/config.py:1762 msgid "Unread events" msgstr "Непросмотренные события" -#: ../src/config.py:1650 +#: ../src/config.py:1722 msgid "Read all pending events before removing this account." msgstr "Просмотрите все ожидающие события перед удалением учетной записи." -#: ../src/config.py:1676 +#: ../src/config.py:1748 #, python-format msgid "You have opened chat in account %s" msgstr "У вас есть окна чата под учётной записью %s" -#: ../src/config.py:1677 +#: ../src/config.py:1749 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "Все окна чатов и комнат будут закрыты. Продолжить?" -#: ../src/config.py:1686 +#: ../src/config.py:1758 msgid "You are currently connected to the server" msgstr "Вы сейчас подсоединены к серверу" -#: ../src/config.py:1687 +#: ../src/config.py:1759 msgid "To change the account name, you must be disconnected." msgstr "Для смены имени учетной записи необходимо отключиться." -#: ../src/config.py:1691 +#: ../src/config.py:1763 msgid "To change the account name, you must read all pending events." msgstr "" "Для смены имени учетной записи необходимо просмотреть ожидающие события." -#: ../src/config.py:1697 +#: ../src/config.py:1769 msgid "Account Name Already Used" msgstr "Такое имя учетной записи уже используется" -#: ../src/config.py:1698 +#: ../src/config.py:1770 msgid "" "This name is already used by another of your accounts. Please choose another " "name." @@ -3034,147 +3076,147 @@ msgstr "" "Это имя уже используется в другой вашей учетной записи. Пожалуйста, выберите " "другое." -#: ../src/config.py:1702 ../src/config.py:1706 +#: ../src/config.py:1774 ../src/config.py:1778 msgid "Invalid account name" msgstr "Неверное имя учетной записи" -#: ../src/config.py:1703 +#: ../src/config.py:1775 msgid "Account name cannot be empty." msgstr "Имя учетной записи не может быть пустым." -#: ../src/config.py:1707 +#: ../src/config.py:1779 msgid "Account name cannot contain spaces." msgstr "Имя учетной записи не может содержать пробелы." -#: ../src/config.py:1771 +#: ../src/config.py:1843 msgid "Rename Account" msgstr "Переименовать учетную запись" -#: ../src/config.py:1772 +#: ../src/config.py:1844 #, 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 +#: ../src/config.py:1862 ../src/config.py:1870 ../src/config.py:1910 +#: ../src/config.py:3133 ../src/dataforms_widget.py:533 msgid "Invalid Jabber ID" msgstr "Неверный Jabber ID" -#: ../src/config.py:1799 +#: ../src/config.py:1871 msgid "A Jabber ID must be in the form \"user@servername\"." msgstr "Jabber ID должен иметь формат \"имя_пользователя@сервер\"." -#: ../src/config.py:1985 ../src/config.py:3124 +#: ../src/config.py:2066 ../src/config.py:3205 msgid "Invalid entry" msgstr "Неверная запись" -#: ../src/config.py:1986 ../src/config.py:3125 +#: ../src/config.py:2067 ../src/config.py:3206 msgid "Custom port must be a port number." msgstr "В качестве номера порта должно выступать число" -#: ../src/config.py:2007 +#: ../src/config.py:2088 ../src/config.py:3682 msgid "Failed to get secret keys" msgstr "Не удалось получить секретный ключ" -#: ../src/config.py:2008 +#: ../src/config.py:2089 ../src/config.py:3683 msgid "There was a problem retrieving your OpenPGP secret keys." msgstr "Возникла проблема с получением вашего секретного ключа OpenPGP." -#: ../src/config.py:2011 +#: ../src/config.py:2092 ../src/config.py:3686 msgid "OpenPGP Key Selection" msgstr "Выбор ключа OpenPGP" -#: ../src/config.py:2012 +#: ../src/config.py:2093 ../src/config.py:3687 msgid "Choose your OpenPGP key" msgstr "Выберите свой ключ OpenPGP" -#: ../src/config.py:2052 +#: ../src/config.py:2133 msgid "No such account available" msgstr "Такая учетная запись недоступна" -#: ../src/config.py:2053 +#: ../src/config.py:2134 msgid "You must create your account before editing your personal information." msgstr "" "Перед редактированием личных данных необходимо сначала создать учетную " "запись." -#: ../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 +#: ../src/config.py:2141 ../src/dialogs.py:1483 ../src/dialogs.py:1624 +#: ../src/dialogs.py:1804 ../src/disco.py:426 ../src/profile_window.py:318 msgid "You are not connected to the server" msgstr "Вы не подключены к серверу" -#: ../src/config.py:2061 +#: ../src/config.py:2142 msgid "Without a connection, you can not edit your personal information." msgstr "" "Чтобы отредактировать личную информацию, нужно подсоединиться к серверу." -#: ../src/config.py:2065 +#: ../src/config.py:2146 msgid "Your server doesn't support Vcard" msgstr "Сервер не поддерживает Vcard" -#: ../src/config.py:2066 +#: ../src/config.py:2147 msgid "Your server can't save your personal information." msgstr "Ваш сервер не может хранить личную информацию." -#: ../src/config.py:2097 +#: ../src/config.py:2178 msgid "Account Local already exists." msgstr "Учётная запись Local уже существует." -#: ../src/config.py:2098 +#: ../src/config.py:2179 msgid "Please rename or remove it before enabling link-local messaging." msgstr "Переименуйте или удалите её, прежде чем включать локальные сообщения." -#: ../src/config.py:2277 +#: ../src/config.py:2358 #, python-format msgid "Edit %s" msgstr "Править %s" -#: ../src/config.py:2279 +#: ../src/config.py:2360 #, python-format msgid "Register to %s" msgstr "Зарегистрировать %s" #. list at the beginning -#: ../src/config.py:2315 +#: ../src/config.py:2396 msgid "Ban List" msgstr "Черный список" -#: ../src/config.py:2316 +#: ../src/config.py:2397 msgid "Member List" msgstr "Список участников" -#: ../src/config.py:2317 +#: ../src/config.py:2398 msgid "Owner List" msgstr "Список владельцев" -#: ../src/config.py:2318 +#: ../src/config.py:2399 msgid "Administrator List" msgstr "Список администрираторов" #. Address column #. holds JID (who said this) -#: ../src/config.py:2367 ../src/disco.py:750 ../src/history_manager.py:160 +#: ../src/config.py:2448 ../src/disco.py:749 ../src/history_manager.py:177 msgid "JID" msgstr "JID" -#: ../src/config.py:2375 +#: ../src/config.py:2456 msgid "Reason" msgstr "Причина" -#: ../src/config.py:2380 +#: ../src/config.py:2461 msgid "Nick" msgstr "Ник" -#: ../src/config.py:2384 +#: ../src/config.py:2465 msgid "Role" msgstr "Обязанность" -#: ../src/config.py:2409 +#: ../src/config.py:2490 msgid "Banning..." msgstr "Баню..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2411 +#: ../src/config.py:2492 msgid "" "Whom do you want to ban?\n" "\n" @@ -3182,11 +3224,11 @@ msgstr "" "Кого вы хотите забанить?\n" "\n" -#: ../src/config.py:2413 +#: ../src/config.py:2494 msgid "Adding Member..." msgstr "Добавляю участника..." -#: ../src/config.py:2414 +#: ../src/config.py:2495 msgid "" "Whom do you want to make a member?\n" "\n" @@ -3194,11 +3236,11 @@ msgstr "" "Кого вы хотите сделать участником?\n" "\n" -#: ../src/config.py:2416 +#: ../src/config.py:2497 msgid "Adding Owner..." msgstr "Добавляю владельца..." -#: ../src/config.py:2417 +#: ../src/config.py:2498 msgid "" "Whom do you want to make an owner?\n" "\n" @@ -3206,11 +3248,11 @@ msgstr "" "Кого вы хотите сделать владельцем?\n" "\n" -#: ../src/config.py:2419 +#: ../src/config.py:2500 msgid "Adding Administrator..." msgstr "Добавляю администратора..." -#: ../src/config.py:2420 +#: ../src/config.py:2501 msgid "" "Whom do you want to make an administrator?\n" "\n" @@ -3218,7 +3260,7 @@ msgstr "" "Кого вы хотите сделать администратором?\n" "\n" -#: ../src/config.py:2421 +#: ../src/config.py:2502 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" @@ -3234,85 +3276,87 @@ msgstr "" "4. domain (сам домен, т.е. как любое сочетание user@domain,\n" "domain/resource, так и адрес, содержащий этот поддомен)" -#: ../src/config.py:2525 +#: ../src/config.py:2606 #, python-format msgid "Removing %s account" msgstr "Удаление учетной записи %s" -#: ../src/config.py:2540 ../src/gajim.py:1344 ../src/roster_window.py:3455 +#: ../src/config.py:2621 ../src/gajim.py:1364 ../src/roster_window.py:3508 msgid "Password Required" msgstr "Требуется пароль" -#: ../src/config.py:2541 ../src/roster_window.py:3451 +#: ../src/config.py:2622 ../src/roster_window.py:3503 #, python-format msgid "Enter your password for account %s" msgstr "Введите пароль для учетной записи %s" -#: ../src/config.py:2542 ../src/roster_window.py:3456 +#: ../src/config.py:2623 ../src/roster_window.py:3509 msgid "Save password" msgstr "Сохранить пароль" -#: ../src/config.py:2555 +#: ../src/config.py:2636 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Учетная запись \"%s\" подключена к серверу" -#: ../src/config.py:2556 +#: ../src/config.py:2637 msgid "If you remove it, the connection will be lost." msgstr "Если вы удалите его, произойдет отключение." -#: ../src/config.py:2649 +#: ../src/config.py:2730 +#, fuzzy msgid "Default" -msgstr "По умолчанию" +msgstr "Все" -#: ../src/config.py:2649 +#: ../src/config.py:2730 +#, fuzzy msgid "?print_status:All" msgstr "Все" -#: ../src/config.py:2650 +#: ../src/config.py:2731 msgid "Enter and leave only" msgstr "Только приход и уход" -#: ../src/config.py:2651 +#: ../src/config.py:2732 msgid "?print_status:None" msgstr "" -#: ../src/config.py:2720 +#: ../src/config.py:2801 msgid "New Group Chat" msgstr "Новая комната" -#: ../src/config.py:2753 +#: ../src/config.py:2834 msgid "This bookmark has invalid data" msgstr "Эта закладка содержит неверные данные" -#: ../src/config.py:2754 +#: ../src/config.py:2835 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" "Пожалуйста, удостоверьтесь, что заполнены поля с именем сервера и комнаты, " "либо удалите эту закладку." -#: ../src/config.py:3035 +#: ../src/config.py:3116 msgid "Invalid username" msgstr "Неверное имя пользователя" -#: ../src/config.py:3037 +#: ../src/config.py:3118 msgid "You must provide a username to configure this account." msgstr "Для настройки учетной записи необходимо ввести имя пользователя." -#: ../src/config.py:3063 +#: ../src/config.py:3144 msgid "Duplicate Jabber ID" msgstr "Дублирующийся Jabber ID" -#: ../src/config.py:3064 +#: ../src/config.py:3145 msgid "This account is already configured in Gajim." msgstr "Этот контакт уже настроен в Gajim." -#: ../src/config.py:3081 +#: ../src/config.py:3162 msgid "Account has been added successfully" msgstr "Учетная запись успешно добавлена" -#: ../src/config.py:3082 ../src/config.py:3255 +#: ../src/config.py:3163 ../src/config.py:3350 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 " @@ -3322,15 +3366,25 @@ msgstr "" " Вы можете дополнительно ее настроить используя \n" "\"Настройка - >Учетные записи\" из главного окна." -#: ../src/config.py:3100 +#: ../src/config.py:3181 msgid "Invalid server" msgstr "Неверный сервер" -#: ../src/config.py:3101 +#: ../src/config.py:3182 msgid "Please provide a server on which you want to register." msgstr "Пожалуйста, укажите сервер на котором Вы хотите зарегистрироваться." -#: ../src/config.py:3211 +#: ../src/config.py:3233 ../src/gajim.py:2210 +#, fuzzy +msgid "Certificate Already in File" +msgstr "Сертификат аннулирован" + +#: ../src/config.py:3234 ../src/gajim.py:2211 +#, python-format +msgid "This certificate is already in file %s, so it's not added again." +msgstr "Этот сертификат уже есть в файле %s, поэтому он не был добавлен." + +#: ../src/config.py:3302 #, python-format msgid "" "Security Warning\n" @@ -3339,32 +3393,40 @@ msgid "" "SSL Error: %s\n" "Do you still want to connect to this server?" msgstr "" +"Предупреждение о безопасности\n" +"\n" +"Подлинность SSL сертификата %s может быть недостоверной.\n" +"Ошибка SSL: %s\n" +"Вы хотите соединиться с этим сервером?" -#: ../src/config.py:3216 ../src/gajim.py:2181 +#: ../src/config.py:3308 ../src/gajim.py:2226 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" "SHA1 fingerprint of the certificate:\n" "%s" msgstr "" +"Добавить этот сертификат в список надёжных сертификатов.\n" +"Отпечаток SHA1 сертификата:\n" +"%s" -#: ../src/config.py:3234 ../src/config.py:3273 +#: ../src/config.py:3329 ../src/config.py:3368 msgid "An error occurred during account creation" msgstr "Произошла ошибка при создании учетной записи" -#: ../src/config.py:3254 +#: ../src/config.py:3349 msgid "Your new account has been created successfully" msgstr "Ваша новая учетная запись успешно создана" -#: ../src/config.py:3357 +#: ../src/config.py:3452 msgid "Account name is in use" msgstr "Такое имя учетной записи уже используется" -#: ../src/config.py:3358 +#: ../src/config.py:3453 msgid "You already have an account using this name." msgstr "У вас уже есть учетная запись с таким именем." -#: ../src/conversation_textview.py:454 +#: ../src/conversation_textview.py:453 msgid "" "Text below this line is what has been said since the last time you paid " "attention to this group chat" @@ -3372,52 +3434,52 @@ msgstr "" "Текст под этой линией был сказан после того, как вы последний раз " "заглядывали в эту комнату" -#: ../src/conversation_textview.py:552 +#: ../src/conversation_textview.py:551 #, python-format msgid "_Actions for \"%s\"" msgstr "_Действия для \"%s\"" -#: ../src/conversation_textview.py:564 +#: ../src/conversation_textview.py:563 msgid "Read _Wikipedia Article" msgstr "Смотреть статью в _Wikipedia" -#: ../src/conversation_textview.py:569 +#: ../src/conversation_textview.py:568 msgid "Look it up in _Dictionary" msgstr "Искать в _словаре" #. we must have %s in the url if not WIKTIONARY -#: ../src/conversation_textview.py:585 +#: ../src/conversation_textview.py:584 #, 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:598 +#: ../src/conversation_textview.py:597 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "URL Web-поиска отсутствует в \"%s\"" -#: ../src/conversation_textview.py:601 +#: ../src/conversation_textview.py:600 msgid "Web _Search for it" msgstr "_Поиск по Web" -#: ../src/conversation_textview.py:607 +#: ../src/conversation_textview.py:606 msgid "Open as _Link" -msgstr "Открыть как ссылку" +msgstr "Открыть как _ссылку" -#: ../src/conversation_textview.py:1073 +#: ../src/conversation_textview.py:1072 msgid "Yesterday" msgstr "Вчера" #. the number is >= 2 #. %i is day in year (1-365), %d (1-31) we want %i -#: ../src/conversation_textview.py:1077 +#: ../src/conversation_textview.py:1076 #, python-format msgid "%i days ago" msgstr "%i дней назад" #. if we have subject, show it too! -#: ../src/conversation_textview.py:1111 +#: ../src/conversation_textview.py:1110 #, python-format msgid "Subject: %s\n" msgstr "Тема: %s\n" @@ -3428,17 +3490,18 @@ 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 который вы ввели существует.Пожалуйста выберите другой." +msgstr "" +"Jabber ID, который вы ввели, уже существует. Пожалуйста, выберите другой." #. Default jid #: ../src/dataforms_widget.py:549 msgid "new@jabber.id" -msgstr "" +msgstr "new@jabber.id" #: ../src/dataforms_widget.py:552 ../src/dataforms_widget.py:554 #, python-format msgid "new%d@jabber.id" -msgstr "" +msgstr "new%d@jabber.id" #: ../src/dialogs.py:71 #, python-format @@ -3466,115 +3529,655 @@ msgstr "KeyID" msgid "Contact name" msgstr "Имя контакта" +#: ../src/dialogs.py:374 +msgid "doing_chores" +msgstr "работа_по_хозяйству" + +#: ../src/dialogs.py:374 +msgid "drinking" +msgstr "пью" + +#: ../src/dialogs.py:374 +msgid "eating" +msgstr "кушаю" + +#: ../src/dialogs.py:375 +msgid "excercising" +msgstr "тренировка" + +#: ../src/dialogs.py:375 +msgid "grooming" +msgstr "свадьба" + +#: ../src/dialogs.py:375 +#, fuzzy +msgid "having_appointment" +msgstr "имею назначение " + +#: ../src/dialogs.py:376 +msgid "inactive" +msgstr "неактивен" + +#: ../src/dialogs.py:376 +msgid "relaxing" +msgstr "расслабляюсь" + +#: ../src/dialogs.py:376 +msgid "talking" +msgstr "разговариваю" + +#: ../src/dialogs.py:376 +msgid "traveling" +msgstr "путешествую" + +#: ../src/dialogs.py:377 +msgid "working" +msgstr "работаю" + +#: ../src/dialogs.py:378 +msgid "at_the_spa" +msgstr "в_spa_салоне" + +#: ../src/dialogs.py:378 +msgid "brushing_teeth" +msgstr "чищу_зубы" + +#: ../src/dialogs.py:379 +msgid "buying_groceries" +msgstr "делаю_покупки" + +#: ../src/dialogs.py:379 +msgid "cleaning" +msgstr "делаю_уборку" + +#: ../src/dialogs.py:379 +msgid "coding" +msgstr "пишу_программу" + +#: ../src/dialogs.py:380 +#, fuzzy +msgid "commuting" +msgstr "команда" + +#: ../src/dialogs.py:380 +msgid "cooking" +msgstr "готовлю" + +#: ../src/dialogs.py:380 +msgid "cycling" +msgstr "на_велосипеде" + +#: ../src/dialogs.py:380 +msgid "day_off" +msgstr "выходной_день" + #: ../src/dialogs.py:381 +msgid "doing_maintenance" +msgstr "обслуживаю" + +#: ../src/dialogs.py:381 +msgid "doing_the_dishes" +msgstr "приготовление_блюд" + +#: ../src/dialogs.py:382 +msgid "doing_the_laundry" +msgstr "стираю" + +#: ../src/dialogs.py:382 +msgid "driving" +msgstr "двигаюсь" + +#: ../src/dialogs.py:382 +msgid "gaming" +msgstr "играю" + +#: ../src/dialogs.py:383 +msgid "gardening" +msgstr "работаю_в_саду" + +#: ../src/dialogs.py:383 +msgid "getting_a_haircut" +msgstr "делаю_прическу" + +#: ../src/dialogs.py:383 +msgid "going_out" +msgstr "вышел" + +#: ../src/dialogs.py:384 +msgid "hanging_out" +msgstr "тусовка" + +#: ../src/dialogs.py:384 +msgid "having_a_beer" +msgstr "пью_пиво" + +#: ../src/dialogs.py:384 +msgid "having_a_snack" +msgstr "в_закусочной" + +#: ../src/dialogs.py:385 +msgid "having_breakfast" +msgstr "завтракаю" + +#: ../src/dialogs.py:385 +msgid "having_coffee" +msgstr "пью_кофе" + +#: ../src/dialogs.py:386 +msgid "having_dinner" +msgstr "обедаю" + +#: ../src/dialogs.py:386 +msgid "having_lunch" +msgstr "ланч" + +#: ../src/dialogs.py:386 +msgid "having_tea" +msgstr "пью_чай" + +#: ../src/dialogs.py:387 +msgid "hiking" +msgstr "в_походе" + +#: ../src/dialogs.py:387 +msgid "in_a_car" +msgstr "в_машине" + +#: ../src/dialogs.py:387 +msgid "in_a_meeting" +msgstr "совещание" + +#: ../src/dialogs.py:388 +msgid "in_real_life" +msgstr "в_реальной_жизни" + +#: ../src/dialogs.py:388 +msgid "jogging" +msgstr "пробежка" + +#: ../src/dialogs.py:388 +msgid "on_a_bus" +msgstr "в_автобусе" + +#: ../src/dialogs.py:389 +msgid "on_a_plane" +msgstr "в_самолёте" + +#: ../src/dialogs.py:389 +msgid "on_a_train" +msgstr "в_поезде" + +#: ../src/dialogs.py:389 +msgid "on_a_trip" +msgstr "в_поездке" + +#: ../src/dialogs.py:390 +msgid "on_the_phone" +msgstr "говорю_по_телефону" + +#: ../src/dialogs.py:390 +msgid "on_vacation" +msgstr "в_отпуске" + +#: ../src/dialogs.py:390 +msgid "other" +msgstr "другое" + +#: ../src/dialogs.py:391 +msgid "partying" +msgstr "на_вечеринке" + +#: ../src/dialogs.py:391 +msgid "playing_sports" +msgstr "спорт" + +#: ../src/dialogs.py:391 +msgid "reading" +msgstr "читаю" + +#: ../src/dialogs.py:392 +#, fuzzy +msgid "rehearsing" +msgstr "Беларусский" + +#: ../src/dialogs.py:392 +msgid "running" +msgstr "бегу" + +#: ../src/dialogs.py:392 +msgid "running_an_errand" +msgstr "ушёл_по_поручению" + +#: ../src/dialogs.py:393 +msgid "scheduled_holiday" +msgstr "планируется_праздник" + +#: ../src/dialogs.py:393 +msgid "shaving" +msgstr "душ" + +#: ../src/dialogs.py:393 +msgid "shopping" +msgstr "покупки" + +#: ../src/dialogs.py:394 +msgid "skiing" +msgstr "катаюсь_на_лыжах" + +#: ../src/dialogs.py:394 +msgid "sleeping" +msgstr "Сплю" + +#: ../src/dialogs.py:394 +msgid "socializing" +msgstr "общаюсь" + +#: ../src/dialogs.py:395 +msgid "studying" +msgstr "учусь" + +#: ../src/dialogs.py:395 +msgid "sunbathing" +msgstr "загараю" + +#: ../src/dialogs.py:395 +msgid "swimming" +msgstr "плаваю" + +#: ../src/dialogs.py:396 +msgid "taking_a_bath" +msgstr "принимаю_ванну" + +#: ../src/dialogs.py:396 +msgid "taking_a_shower" +msgstr "принимаю_душ" + +#: ../src/dialogs.py:396 +msgid "walking" +msgstr "гуляю" + +#: ../src/dialogs.py:397 +msgid "walking_the_dog" +msgstr "гуляю_с_собакой" + +#: ../src/dialogs.py:397 +msgid "watching_tv" +msgstr "смотрю_тв" + +#: ../src/dialogs.py:398 +msgid "watching_a_movie" +msgstr "смотрю_кино" + +#: ../src/dialogs.py:398 +#, fuzzy +msgid "working_out" +msgstr "Работаю" + +#: ../src/dialogs.py:398 +msgid "writing" +msgstr "пишу" + +#: ../src/dialogs.py:404 +msgid "Activity" +msgstr "Активность" + +#: ../src/dialogs.py:454 +msgid "afraid" +msgstr "испуганный" + +#: ../src/dialogs.py:454 +msgid "amazed" +msgstr "изумлённый" + +#: ../src/dialogs.py:454 +msgid "angry" +msgstr "сердитый" + +#: ../src/dialogs.py:454 +msgid "annoyed" +msgstr "раздражённый" + +#: ../src/dialogs.py:454 +msgid "anxious" +msgstr "озабоченный" + +#: ../src/dialogs.py:454 +msgid "aroused" +msgstr "пробуждённый" + +#: ../src/dialogs.py:454 +msgid "ashamed" +msgstr "пристыженный" + +#: ../src/dialogs.py:454 +msgid "bored" +msgstr "скучающий" + +#: ../src/dialogs.py:454 +msgid "brave" +msgstr "храбрый" + +#: ../src/dialogs.py:454 +msgid "calm" +msgstr "невозмутимый" + +#: ../src/dialogs.py:454 +msgid "cold" +msgstr "неприветливый" + +#: ../src/dialogs.py:454 +msgid "confused" +msgstr "смущенный" + +#: ../src/dialogs.py:454 +msgid "contented" +msgstr "довольный" + +#: ../src/dialogs.py:454 +msgid "cranky" +msgstr "раздражённый" + +#: ../src/dialogs.py:454 +msgid "curious" +msgstr "любознательный" + +#: ../src/dialogs.py:454 +msgid "depressed" +msgstr "подавленный" + +#: ../src/dialogs.py:454 +msgid "disappointed" +msgstr "разочарованный" + +#: ../src/dialogs.py:454 +msgid "disgusted" +msgstr "чувствующий_отвращение" + +#: ../src/dialogs.py:454 +msgid "distracted" +msgstr "растерянный" + +#: ../src/dialogs.py:454 +msgid "embarrassed" +msgstr "смущенный" + +#: ../src/dialogs.py:454 +msgid "excited" +msgstr "взволнованный" + +#: ../src/dialogs.py:454 +msgid "flirtatious" +msgstr "кокетливый" + +#: ../src/dialogs.py:454 +msgid "frustrated" +msgstr "расстроенный" + +#: ../src/dialogs.py:454 +msgid "grumpy" +msgstr "сердитый" + +#: ../src/dialogs.py:454 +msgid "guilty" +msgstr "виновный" + +#: ../src/dialogs.py:454 +msgid "happy" +msgstr "счастливый" + +#: ../src/dialogs.py:454 +msgid "hot" +msgstr "страстный" + +#: ../src/dialogs.py:454 +msgid "humbled" +msgstr "униженный" + +#: ../src/dialogs.py:454 +msgid "humiliated" +msgstr "оскорблённый" + +#: ../src/dialogs.py:454 +msgid "hungry" +msgstr "голодный" + +#: ../src/dialogs.py:454 +msgid "hurt" +msgstr "вредный" + +#: ../src/dialogs.py:454 +msgid "impressed" +msgstr "впечатлённый" + +#: ../src/dialogs.py:454 +msgid "in_awe" +msgstr "испуганный" + +#: ../src/dialogs.py:454 +msgid "in_love" +msgstr "влюблённый" + +#: ../src/dialogs.py:454 +msgid "indignant" +msgstr "возмущённый" + +#: ../src/dialogs.py:454 +msgid "interested" +msgstr "заинтересованный" + +#: ../src/dialogs.py:454 +msgid "intoxicated" +msgstr "пьяный" + +#: ../src/dialogs.py:454 +msgid "invincible" +msgstr "непобедимый" + +#: ../src/dialogs.py:454 +msgid "jealous" +msgstr "ревнивый" + +#: ../src/dialogs.py:454 +msgid "lonely" +msgstr "одинокий" + +#: ../src/dialogs.py:454 +msgid "mean" +msgstr "посредственный" + +#: ../src/dialogs.py:454 +msgid "moody" +msgstr "капризный" + +#: ../src/dialogs.py:454 +msgid "nervous" +msgstr "нервоный" + +#: ../src/dialogs.py:454 +msgid "neutral" +msgstr "нейтральный" + +#: ../src/dialogs.py:454 +msgid "offended" +msgstr "обиженный" + +#: ../src/dialogs.py:454 +msgid "playful" +msgstr "игривый" + +#: ../src/dialogs.py:454 +msgid "proud" +msgstr "гордый" + +#: ../src/dialogs.py:454 +msgid "relieved" +msgstr "успокоившийся" + +#: ../src/dialogs.py:454 +msgid "remorseful" +msgstr "раскаявшийся" + +#: ../src/dialogs.py:454 +msgid "restless" +msgstr "неугомонный" + +#: ../src/dialogs.py:454 +msgid "sad" +msgstr "грустный" + +#: ../src/dialogs.py:454 +msgid "sarcastic" +msgstr "язвительный" + +#: ../src/dialogs.py:454 +msgid "serious" +msgstr "серьёзный" + +#: ../src/dialogs.py:454 +msgid "shocked" +msgstr "шокированный" + +#: ../src/dialogs.py:454 +msgid "shy" +msgstr "застенчивый" + +#: ../src/dialogs.py:454 +msgid "sick" +msgstr "больной" + +#: ../src/dialogs.py:454 +msgid "sleepy" +msgstr "сонный" + +#: ../src/dialogs.py:454 +msgid "stressed" +msgstr "напряженный" + +#: ../src/dialogs.py:454 +msgid "surprised" +msgstr "удивлённый" + +#: ../src/dialogs.py:454 +msgid "thirsty" +msgstr "жаждущий" + +#: ../src/dialogs.py:454 +msgid "worried" +msgstr "волнующийся" + +#: ../src/dialogs.py:460 +msgid "Mood" +msgstr "Настроение" + +#: ../src/dialogs.py:500 #, python-format msgid "%s Status Message" msgstr "Сообщение о статусе %s" -#: ../src/dialogs.py:383 +#: ../src/dialogs.py:502 msgid "Status Message" msgstr "Сообщение о статусе" -#: ../src/dialogs.py:483 +#: ../src/dialogs.py:602 msgid "Save as Preset Status Message" msgstr "Сохранить установленное сообщение о статусе" -#: ../src/dialogs.py:484 +#: ../src/dialogs.py:603 msgid "Please type a name for this status message" msgstr "Введите имя для этого сообщения о статусе" -#: ../src/dialogs.py:495 +#: ../src/dialogs.py:614 msgid "Overwrite Status Message?" msgstr "Изменить сообщение о статусе?" -#: ../src/dialogs.py:496 +#: ../src/dialogs.py:615 msgid "" "This name is already used. Do you want to overwrite this status message?" msgstr "Это имя уже используется. Перезаписать это статусное сообщение?" -#: ../src/dialogs.py:512 +#: ../src/dialogs.py:631 msgid "AIM Address:" msgstr "Адрес AIM:" -#: ../src/dialogs.py:513 +#: ../src/dialogs.py:632 msgid "GG Number:" msgstr "Номер GaduGadu" -#: ../src/dialogs.py:514 +#: ../src/dialogs.py:633 msgid "ICQ Number:" msgstr "Номер ICQ:" -#: ../src/dialogs.py:515 +#: ../src/dialogs.py:634 msgid "MSN Address:" msgstr "Адрес в MSN:" -#: ../src/dialogs.py:516 +#: ../src/dialogs.py:635 msgid "Yahoo! Address:" msgstr "Адрес Yahoo:" -#: ../src/dialogs.py:553 +#: ../src/dialogs.py:672 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" msgstr "" "Пожалуйста, заполните данные о контакте,\n" "который хотите добавить в ростер учетной записи %s" -#: ../src/dialogs.py:555 +#: ../src/dialogs.py:674 msgid "Please fill in the data of the contact you want to add" msgstr "Пожалуйста, заполните данные о контакте, который вы хотите добавить" -#: ../src/dialogs.py:712 ../src/dialogs.py:718 +#: ../src/dialogs.py:831 ../src/dialogs.py:837 msgid "Invalid User ID" msgstr "Неверный ID пользователя" -#: ../src/dialogs.py:719 +#: ../src/dialogs.py:838 msgid "The user ID must not contain a resource." msgstr "ID пользователя не должен содержать ресурс." -#: ../src/dialogs.py:733 +#: ../src/dialogs.py:852 msgid "Contact already in roster" msgstr "Контакт уже в ростере" -#: ../src/dialogs.py:734 +#: ../src/dialogs.py:853 msgid "This contact is already listed in your roster." msgstr "Этот контакт уже содержится в вашем ростере." -#: ../src/dialogs.py:770 +#: ../src/dialogs.py:889 msgid "User ID:" msgstr "ID пользователя:" -#: ../src/dialogs.py:832 +#: ../src/dialogs.py:951 msgid "A GTK+ jabber client" msgstr "Jabber-клиент на GTK+" -#: ../src/dialogs.py:833 +#: ../src/dialogs.py:952 msgid "GTK+ Version:" msgstr "Версия GTK+:" -#: ../src/dialogs.py:834 +#: ../src/dialogs.py:953 msgid "PyGTK Version:" msgstr "Версия PyGTK:" -#: ../src/dialogs.py:848 +#: ../src/dialogs.py:967 msgid "Current Developers:" msgstr "Разработчики:" -#: ../src/dialogs.py:850 +#: ../src/dialogs.py:969 msgid "Past Developers:" msgstr "Разработчики прошлых версий:" -#: ../src/dialogs.py:860 +#: ../src/dialogs.py:979 msgid "THANKS:" msgstr "БЛАГОДАРНОСТИ:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:866 +#: ../src/dialogs.py:985 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:879 +#: ../src/dialogs.py:998 msgid "translator-credits" msgstr "" "Яков Безруков \n" @@ -3582,19 +4185,19 @@ msgstr "" "Олег Стадник \n" "Денис Фомин " -#: ../src/dialogs.py:1011 +#: ../src/dialogs.py:1130 #, python-format msgid "Unable to bind to port %s." msgstr "Не могу привязаться к порту %s." -#: ../src/dialogs.py:1012 +#: ../src/dialogs.py:1131 msgid "" "Maybe you have another running instance of Gajim. File Transfer will be " "cancelled." msgstr "" "Возможно, запущен ещё один экземпляр Gajim. Передача файлов будет отменена." -#: ../src/dialogs.py:1019 +#: ../src/dialogs.py:1138 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -3605,80 +4208,79 @@ msgstr "" "Чтобы воспользоваться проверкой правописания, установите словарь для языка %" "s или выберите другой язык, исправив настройку speller_language." -#: ../src/dialogs.py:1293 +#: ../src/dialogs.py:1412 #, python-format msgid "Subscription request for account %s from %s" msgstr "Запрос на подписку для учетной записи %s от %s" -#: ../src/dialogs.py:1296 +#: ../src/dialogs.py:1415 #, python-format msgid "Subscription request from %s" msgstr "Запрос на подписку от %s" -#: ../src/dialogs.py:1357 ../src/roster_window.py:776 +#: ../src/dialogs.py:1476 ../src/roster_window.py:778 #, python-format msgid "You are already in group chat %s" msgstr "Вы уже в комнате %s" -#: ../src/dialogs.py:1365 +#: ../src/dialogs.py:1484 msgid "You can not join a group chat unless you are connected." msgstr "Вы не можете зайти в комнату без подключения." -#: ../src/dialogs.py:1383 +#: ../src/dialogs.py:1502 #, python-format msgid "Join Group Chat with account %s" msgstr "Войти в комнату с учетной записи %s" -#: ../src/dialogs.py:1453 ../src/dialogs.py:1459 -#: ../src/groupchat_control.py:1698 +#: ../src/dialogs.py:1572 ../src/dialogs.py:1578 +#: ../src/groupchat_control.py:1719 msgid "Invalid group chat Jabber ID" msgstr "Неверное имя комнаты" -#: ../src/dialogs.py:1454 ../src/dialogs.py:1460 -#: ../src/groupchat_control.py:1699 +#: ../src/dialogs.py:1573 ../src/dialogs.py:1579 +#: ../src/groupchat_control.py:1720 msgid "The group chat Jabber ID has not allowed characters." msgstr "В Jabber ID комнаты или сервера содержатся недопустимые символы." -#: ../src/dialogs.py:1466 +#: ../src/dialogs.py:1585 msgid "This is not a group chat" msgstr "Это не комната" -#: ../src/dialogs.py:1467 +#: ../src/dialogs.py:1586 #, python-format msgid "%s is not the name of a group chat." msgstr "%s не является именем комнаты." -#: ../src/dialogs.py:1506 +#: ../src/dialogs.py:1625 msgid "Without a connection, you can not synchronise your contacts." msgstr "Чтобы объединить контакты, необходимо подсоединиться к серверу." -#: ../src/dialogs.py:1520 +#: ../src/dialogs.py:1639 msgid "Server" msgstr "Сервер" -#: ../src/dialogs.py:1553 +#: ../src/dialogs.py:1672 msgid "This account is not connected to the server" msgstr "Аккаунт не подключен к серверу" -#: ../src/dialogs.py:1554 -#, fuzzy +#: ../src/dialogs.py:1673 msgid "You cannot synchronize with an account unless it is connected." -msgstr "Вы не можете зайти в комнату без подключения." +msgstr "Шифрование OpenPGP отключено" -#: ../src/dialogs.py:1578 +#: ../src/dialogs.py:1697 msgid "Synchronise" msgstr "" -#: ../src/dialogs.py:1636 +#: ../src/dialogs.py:1755 #, python-format msgid "Start Chat with account %s" msgstr "Начать чат с учетной записью %s" -#: ../src/dialogs.py:1638 +#: ../src/dialogs.py:1757 msgid "Start Chat" msgstr "Начать чат" -#: ../src/dialogs.py:1639 +#: ../src/dialogs.py:1758 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" @@ -3686,290 +4288,290 @@ msgstr "" "Введите ник или ID пользователя, которому вы хотите отправить сообщение:" #. if offline or connecting -#: ../src/dialogs.py:1664 ../src/dialogs.py:2040 ../src/dialogs.py:2181 +#: ../src/dialogs.py:1783 ../src/dialogs.py:2159 ../src/dialogs.py:2300 msgid "Connection not available" msgstr "Соединение невозможно" -#: ../src/dialogs.py:1665 ../src/dialogs.py:2041 ../src/dialogs.py:2182 +#: ../src/dialogs.py:1784 ../src/dialogs.py:2160 ../src/dialogs.py:2301 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "Пожалуйста, удостоверьтесь, что вы подключены к \"%s\"." -#: ../src/dialogs.py:1674 ../src/dialogs.py:1677 +#: ../src/dialogs.py:1793 ../src/dialogs.py:1796 msgid "Invalid JID" msgstr "Неверный JID" -#: ../src/dialogs.py:1677 +#: ../src/dialogs.py:1796 #, python-format msgid "Unable to parse \"%s\"." msgstr "Не понимаю адреса \"%s\"." -#: ../src/dialogs.py:1686 +#: ../src/dialogs.py:1805 msgid "Without a connection, you can not change your password." msgstr "Чтобы изменить пароль, необходимо подсоединиться к серверу." -#: ../src/dialogs.py:1704 +#: ../src/dialogs.py:1823 msgid "Invalid password" msgstr "Неверный пароль" -#: ../src/dialogs.py:1705 +#: ../src/dialogs.py:1824 msgid "You must enter a password." msgstr "Вы должны ввести пароль." -#: ../src/dialogs.py:1709 +#: ../src/dialogs.py:1828 msgid "Passwords do not match" msgstr "Пароли не совпадают" -#: ../src/dialogs.py:1710 +#: ../src/dialogs.py:1829 msgid "The passwords typed in both fields must be identical." msgstr "Пароли, введенные в оба поля, должны быть одинаковы." #. img to display #. default value -#: ../src/dialogs.py:1752 ../src/notify.py:232 ../src/notify.py:447 +#: ../src/dialogs.py:1871 ../src/notify.py:234 ../src/notify.py:449 msgid "Contact Signed In" msgstr "Контакт подключился" -#: ../src/dialogs.py:1754 ../src/notify.py:240 ../src/notify.py:449 +#: ../src/dialogs.py:1873 ../src/notify.py:242 ../src/notify.py:451 msgid "Contact Signed Out" msgstr "Контакт отключился" #. chat message -#: ../src/dialogs.py:1756 ../src/notify.py:263 ../src/notify.py:451 +#: ../src/dialogs.py:1875 ../src/notify.py:265 ../src/notify.py:453 msgid "New Message" msgstr "Новое сообщение" #. single message -#: ../src/dialogs.py:1756 ../src/notify.py:244 ../src/notify.py:451 +#: ../src/dialogs.py:1875 ../src/notify.py:246 ../src/notify.py:453 msgid "New Single Message" msgstr "Новое одиночное сообщение" #. private message -#: ../src/dialogs.py:1757 ../src/notify.py:251 ../src/notify.py:452 +#: ../src/dialogs.py:1876 ../src/notify.py:253 ../src/notify.py:454 msgid "New Private Message" msgstr "Новое личное сообщение" -#: ../src/dialogs.py:1757 ../src/gajim.py:1536 ../src/notify.py:460 +#: ../src/dialogs.py:1876 ../src/gajim.py:1562 ../src/notify.py:462 msgid "New E-mail" msgstr "Новое письмо" -#: ../src/dialogs.py:1759 ../src/gajim.py:1711 ../src/notify.py:454 +#: ../src/dialogs.py:1878 ../src/gajim.py:1737 ../src/notify.py:456 msgid "File Transfer Request" msgstr "Запрос передачи" -#: ../src/dialogs.py:1761 ../src/gajim.py:1508 ../src/gajim.py:1678 -#: ../src/notify.py:456 +#: ../src/dialogs.py:1880 ../src/gajim.py:1534 ../src/gajim.py:1704 +#: ../src/notify.py:458 msgid "File Transfer Error" msgstr "Ошибка передачи" -#: ../src/dialogs.py:1763 ../src/gajim.py:1750 ../src/gajim.py:1772 -#: ../src/gajim.py:1789 ../src/notify.py:458 +#: ../src/dialogs.py:1882 ../src/gajim.py:1776 ../src/gajim.py:1798 +#: ../src/gajim.py:1815 ../src/notify.py:460 msgid "File Transfer Completed" msgstr "Передача файла завершена" -#: ../src/dialogs.py:1764 ../src/gajim.py:1753 ../src/notify.py:458 +#: ../src/dialogs.py:1883 ../src/gajim.py:1779 ../src/notify.py:460 msgid "File Transfer Stopped" msgstr "Передача остановлена" -#: ../src/dialogs.py:1766 ../src/gajim.py:1365 ../src/notify.py:462 +#: ../src/dialogs.py:1885 ../src/gajim.py:1385 ../src/notify.py:464 msgid "Groupchat Invitation" msgstr "Приглашение в комнату" -#: ../src/dialogs.py:1768 ../src/notify.py:224 ../src/notify.py:464 +#: ../src/dialogs.py:1887 ../src/notify.py:226 ../src/notify.py:466 msgid "Contact Changed Status" msgstr "Контакт изменит статус" -#: ../src/dialogs.py:1959 +#: ../src/dialogs.py:2078 #, python-format msgid "Single Message using account %s" msgstr "Новое сообщение с учетной записи %s" -#: ../src/dialogs.py:1961 +#: ../src/dialogs.py:2080 #, python-format msgid "Single Message in account %s" msgstr "Новое сообщение для учетной записи %s" -#: ../src/dialogs.py:1963 +#: ../src/dialogs.py:2082 msgid "Single Message" msgstr "Сообщение" #. prepare UI for Sending -#: ../src/dialogs.py:1966 +#: ../src/dialogs.py:2085 #, python-format msgid "Send %s" msgstr "Отправить %s" #. prepare UI for Receiving -#: ../src/dialogs.py:1989 +#: ../src/dialogs.py:2108 #, python-format msgid "Received %s" msgstr "Получено %s" #. prepare UI for Receiving -#: ../src/dialogs.py:2012 +#: ../src/dialogs.py:2131 #, 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:2082 +#: ../src/dialogs.py:2201 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:2083 +#: ../src/dialogs.py:2202 #, python-format msgid "%s wrote:\n" msgstr "%s написал:\n" -#: ../src/dialogs.py:2127 +#: ../src/dialogs.py:2246 #, python-format msgid "XML Console for %s" msgstr "Консоль XML для %s" -#: ../src/dialogs.py:2129 +#: ../src/dialogs.py:2248 msgid "XML Console" msgstr "Консоль XML" -#: ../src/dialogs.py:2252 +#: ../src/dialogs.py:2371 #, python-format msgid "Privacy List %s" msgstr "Список доступа %s" -#: ../src/dialogs.py:2256 +#: ../src/dialogs.py:2375 #, python-format msgid "Privacy List for %s" msgstr "Список доступа для %s" -#: ../src/dialogs.py:2312 +#: ../src/dialogs.py:2431 #, python-format msgid "Order: %s, action: %s, type: %s, value: %s" msgstr "Номер: %s, действие: %s, тип: %s, значение: %s" -#: ../src/dialogs.py:2315 +#: ../src/dialogs.py:2434 #, python-format msgid "Order: %s, action: %s" msgstr "Номер: %s, действие: %s" -#: ../src/dialogs.py:2357 +#: ../src/dialogs.py:2476 msgid "Edit a rule" msgstr "Изменить правило" -#: ../src/dialogs.py:2444 +#: ../src/dialogs.py:2563 msgid "Add a rule" msgstr "Добавить правило" -#: ../src/dialogs.py:2540 +#: ../src/dialogs.py:2659 #, python-format msgid "Privacy Lists for %s" msgstr "Списки доступа для %s" -#: ../src/dialogs.py:2542 +#: ../src/dialogs.py:2661 msgid "Privacy Lists" msgstr "Списки доступа" -#: ../src/dialogs.py:2612 +#: ../src/dialogs.py:2731 msgid "Invalid List Name" msgstr "Недопустимое имя списка" -#: ../src/dialogs.py:2613 +#: ../src/dialogs.py:2732 msgid "You must enter a name to create a privacy list." msgstr "Необходимо ввести имя для новой учетной записи." -#: ../src/dialogs.py:2650 +#: ../src/dialogs.py:2769 msgid "$Contact has invited you to join a discussion" msgstr "%(contact_jid)s приглашает вас в комнату %(room_jid)s." -#: ../src/dialogs.py:2652 +#: ../src/dialogs.py:2771 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact приглашает вас в комнату %(room_jid)s." -#: ../src/dialogs.py:2665 +#: ../src/dialogs.py:2784 #, python-format msgid "Comment: %s" msgstr "Комментарий: %s" -#: ../src/dialogs.py:2731 +#: ../src/dialogs.py:2850 msgid "Choose Sound" msgstr "Выберите звуковой файл" -#: ../src/dialogs.py:2741 ../src/dialogs.py:2792 +#: ../src/dialogs.py:2860 ../src/dialogs.py:2911 msgid "All files" msgstr "Все файлы" -#: ../src/dialogs.py:2746 +#: ../src/dialogs.py:2865 msgid "Wav Sounds" msgstr "В формате Wav" -#: ../src/dialogs.py:2779 +#: ../src/dialogs.py:2898 msgid "Choose Image" msgstr "Выбрать картинку" -#: ../src/dialogs.py:2797 +#: ../src/dialogs.py:2916 msgid "Images" msgstr "Картинки" -#: ../src/dialogs.py:2862 +#: ../src/dialogs.py:2981 #, python-format msgid "When %s becomes:" msgstr "Когда %s происходит:" -#: ../src/dialogs.py:2864 +#: ../src/dialogs.py:2983 #, python-format msgid "Adding Special Notification for %s" msgstr "Добавление специального уведомления для %s" #. # means number -#: ../src/dialogs.py:2935 +#: ../src/dialogs.py:3054 msgid "#" msgstr "№" -#: ../src/dialogs.py:2941 +#: ../src/dialogs.py:3060 msgid "Condition" msgstr "Условие" -#: ../src/dialogs.py:3059 +#: ../src/dialogs.py:3178 msgid "when I am " msgstr "когда я " -#: ../src/disco.py:111 +#: ../src/disco.py:110 msgid "Others" msgstr "Другие" -#: ../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/disco.py:111 ../src/disco.py:112 ../src/disco.py:1320 +#: ../src/gajim.py:675 ../src/roster_window.py:295 ../src/roster_window.py:356 +#: ../src/roster_window.py:396 ../src/roster_window.py:505 +#: ../src/roster_window.py:537 ../src/roster_window.py:539 +#: ../src/roster_window.py:4893 ../src/roster_window.py:4895 +#: ../src/common/contacts.py:301 ../src/common/contacts.py:316 #: ../src/common/helpers.py:53 msgid "Transports" msgstr "Транспорты" #. conference is a category for listing mostly groupchats in service discovery -#: ../src/disco.py:115 +#: ../src/disco.py:114 msgid "Conference" msgstr "Комнаты" -#: ../src/disco.py:428 +#: ../src/disco.py:427 msgid "Without a connection, you can not browse available services" msgstr "Для просмотра сервисов необходимо сначала подсоединиться к серверу" -#: ../src/disco.py:502 +#: ../src/disco.py:501 #, python-format msgid "Service Discovery using account %s" msgstr "Обзор сервисов с учётной записи %s" -#: ../src/disco.py:504 +#: ../src/disco.py:503 msgid "Service Discovery" msgstr "Обзор сервисов (discovery)" -#: ../src/disco.py:644 +#: ../src/disco.py:643 msgid "The service could not be found" msgstr "Сервис не обнаружен" -#: ../src/disco.py:645 +#: ../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." @@ -3977,200 +4579,201 @@ msgstr "" "По этому адресу сервисы отсутствуют или не отвечают. Проверьте адрес и " "попробуйте еще раз." -#: ../src/disco.py:649 ../src/disco.py:930 +#: ../src/disco.py:648 ../src/disco.py:929 msgid "The service is not browsable" msgstr "Сервис недоступен для просмотра" -#: ../src/disco.py:650 +#: ../src/disco.py:649 msgid "This type of service does not contain any items to browse." msgstr "Этот сервис не содержит ничего, что можно было бы просмотреть." -#: ../src/disco.py:730 +#: ../src/disco.py:729 #, python-format msgid "Browsing %s using account %s" msgstr "Просмотр %s с учетной записью %s" -#: ../src/disco.py:769 +#: ../src/disco.py:768 msgid "_Browse" msgstr "_Браузер" -#: ../src/disco.py:931 +#: ../src/disco.py:930 msgid "This service does not contain any items to browse." msgstr "Этот сервис не содержит ничего, что можно было бы просмотреть." -#: ../src/disco.py:1152 +#: ../src/disco.py:1151 msgid "_Execute Command" msgstr "В_ыполнить команду..." -#: ../src/disco.py:1162 ../src/disco.py:1326 +#: ../src/disco.py:1161 ../src/disco.py:1325 msgid "Re_gister" msgstr "За_регистрироваться" -#: ../src/disco.py:1363 +#: ../src/disco.py:1362 #, python-format msgid "Scanning %d / %d.." msgstr "Сканирую %d / %d.." #. Users column -#: ../src/disco.py:1545 +#: ../src/disco.py:1544 msgid "Users" msgstr "Пользователи" #. Description column -#: ../src/disco.py:1553 +#: ../src/disco.py:1552 msgid "Description" msgstr "Описание" #. Id column -#: ../src/disco.py:1561 +#: ../src/disco.py:1560 msgid "Id" msgstr "ID" -#: ../src/disco.py:1790 +#: ../src/disco.py:1789 msgid "Subscribed" msgstr "Подписка" -#: ../src/disco.py:1798 +#: ../src/disco.py:1797 msgid "Node" msgstr "" -#: ../src/disco.py:1855 +#: ../src/disco.py:1854 msgid "New post" msgstr "Новое сообщение" -#: ../src/disco.py:1861 +#: ../src/disco.py:1860 msgid "_Subscribe" msgstr "_Подписаться" -#: ../src/disco.py:1867 +#: ../src/disco.py:1866 msgid "_Unsubscribe" msgstr "_Отписаться" -#: ../src/features_window.py:47 +#: ../src/features_window.py:46 msgid "PyOpenSSL" msgstr "PyOpenSSL" -#: ../src/features_window.py:48 +#: ../src/features_window.py:47 msgid "" "A library used to validate server certificates to ensure a secure connection." msgstr "" "Библиотека используется для подтверждения действительности сертификатов " "сервера для того, чтобы удостовериться в защищенности соединения." -#: ../src/features_window.py:49 ../src/features_window.py:50 +#: ../src/features_window.py:48 ../src/features_window.py:49 msgid "Requires python-pyopenssl." msgstr "Требует python-pyopenssl." -#: ../src/features_window.py:51 +#: ../src/features_window.py:50 msgid "Bonjour / Zeroconf" msgstr "Bonjour / Zeroconf" -#: ../src/features_window.py:52 +#: ../src/features_window.py:51 msgid "Serverless chatting with autodetected clients in a local network." msgstr "Чат в локальной сети." -#: ../src/features_window.py:53 +#: ../src/features_window.py:52 msgid "Requires python-avahi." msgstr "Требует python-avahi." -#: ../src/features_window.py:54 +#: ../src/features_window.py:53 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 +#: ../src/features_window.py:54 msgid "gajim-remote" msgstr "gajim-remote" -#: ../src/features_window.py:56 -msgid "A script to controle gajim via commandline." +#: ../src/features_window.py:55 +#, fuzzy +msgid "A script to controle Gajim via commandline." msgstr "Скрипт для управления Gajim'ом через коммандную строку." -#: ../src/features_window.py:57 +#: ../src/features_window.py:56 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 +#: ../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 "Эта возможность отсутствует в Windows." -#: ../src/features_window.py:59 +#: ../src/features_window.py:58 msgid "OpenGPG" msgstr "OpenGPG" -#: ../src/features_window.py:60 +#: ../src/features_window.py:59 msgid "Encrypting chatmessages with gpg keys." msgstr "Шифрование сообщений при помощи gpg ключей." -#: ../src/features_window.py:61 +#: ../src/features_window.py:60 msgid "Requires gpg and python-GnuPGInterface." msgstr "Требует gpg и python-GnuPGInterface." -#: ../src/features_window.py:63 +#: ../src/features_window.py:62 msgid "network-manager" msgstr "network-manager" -#: ../src/features_window.py:64 +#: ../src/features_window.py:63 msgid "Autodetection of network status." msgstr "Автоопределение состояния соединения с сетью." -#: ../src/features_window.py:65 +#: ../src/features_window.py:64 msgid "Requires gnome-network-manager and python-dbus." msgstr "Требует gnome-network-manager и python-dbus." -#: ../src/features_window.py:67 +#: ../src/features_window.py:66 msgid "Session Management" msgstr "Управление сеансом" -#: ../src/features_window.py:68 +#: ../src/features_window.py:67 msgid "Gajim session is stored on logout and restored on login." msgstr "" "Сеанс Gajim сохраняется при выходе (logout) и восстанавливается при входе " "(login)." -#: ../src/features_window.py:69 +#: ../src/features_window.py:68 msgid "Requires python-gnome2." msgstr "Требует python-gnome2." -#: ../src/features_window.py:71 +#: ../src/features_window.py:70 msgid "gnome-keyring" msgstr "gnome-keyring" -#: ../src/features_window.py:72 +#: ../src/features_window.py:71 msgid "Passwords can be stored securely and not just in plaintext." msgstr "Пароли могут храниться безопастно, а не просто открытым текстом." -#: ../src/features_window.py:73 +#: ../src/features_window.py:72 msgid "Requires gnome-keyring and python-gnome2-desktop." msgstr "Требует gnome-keyring и python-gnome2-desktop." -#: ../src/features_window.py:75 +#: ../src/features_window.py:74 msgid "SRV" msgstr "SRV" -#: ../src/features_window.py:76 +#: ../src/features_window.py:75 msgid "Ability to connect to servers which are using SRV records." msgstr "" -#: ../src/features_window.py:77 +#: ../src/features_window.py:76 msgid "Requires dnsutils." msgstr "Требует dnsutils." -#: ../src/features_window.py:78 +#: ../src/features_window.py:77 msgid "Requires nslookup to use SRV records." msgstr "" -#: ../src/features_window.py:79 +#: ../src/features_window.py:78 msgid "Spell Checker" msgstr "Проверка орфографии" -#: ../src/features_window.py:80 +#: ../src/features_window.py:79 msgid "Spellchecking of composed messages." msgstr "Проверка орфографии набираемых сообщений" -#: ../src/features_window.py:81 +#: ../src/features_window.py:80 msgid "" "Requires python-gnome2-extras or compilation of gtkspell module from Gajim " "sources." @@ -4178,113 +4781,112 @@ msgstr "" "Требует python-gnome2-extras или скомпилированного модуля gtkspell из " "исходных кодов Gajim." -#: ../src/features_window.py:83 +#: ../src/features_window.py:82 msgid "Notification-daemon" msgstr "" -#: ../src/features_window.py:84 +#: ../src/features_window.py:83 msgid "Passive popups notifying for new events." msgstr "Пассивные всплывающие окна для уведомления о новых событиях." -#: ../src/features_window.py:85 +#: ../src/features_window.py:84 msgid "" "Requires python-notify or instead python-dbus in conjunction with " "notification-daemon." msgstr "" -#: ../src/features_window.py:87 +#: ../src/features_window.py:86 msgid "Trayicon" msgstr "Иконка в системном трее" -#: ../src/features_window.py:88 +#: ../src/features_window.py:87 msgid "A icon in systemtray reflecting the current presence." msgstr "Иконка в системном лотке отображающая текущий статус." -#: ../src/features_window.py:89 +#: ../src/features_window.py:88 +#, fuzzy msgid "" -"Requires python-gnome2-extras or compiled trayicon module from Gajim " -"sources." +"Requires python-gnome2-extras or compiled trayicon module from Gajim sources." msgstr "" "Требует python-gnome2-extras или скомпилированного модуля trayicon из " "исходных кодов Gajim." -#: ../src/features_window.py:90 +#: ../src/features_window.py:89 msgid "Requires PyGTK >= 2.10." msgstr "Требует PyGTK >= 2.10." -#: ../src/features_window.py:91 +#: ../src/features_window.py:90 msgid "Idle" msgstr "Время бездействия" -#: ../src/features_window.py:92 +#: ../src/features_window.py:91 msgid "Ability to measure idle time, in order to set auto status." msgstr "" +"Возможность определения времени бездействия для того, чтобы установить " +"автостатус." -#: ../src/features_window.py:93 ../src/features_window.py:94 +#: ../src/features_window.py:92 ../src/features_window.py:93 msgid "Requires compilation of the idle module from Gajim sources." -msgstr "" +msgstr "Требует скомпилированного модуля idle из исходных кодов Gajim." -#: ../src/features_window.py:95 +#: ../src/features_window.py:94 msgid "LaTeX" msgstr "LaTeX" -#: ../src/features_window.py:96 -msgid "Transform LaTeX espressions between $$ $$." +#: ../src/features_window.py:95 +msgid "Transform LaTeX expressions between $$ $$." msgstr "" -#: ../src/features_window.py:97 +#: ../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 "" -#: ../src/features_window.py:99 -#, fuzzy +#: ../src/features_window.py:98 msgid "End to end encryption" -msgstr "Шифрование OpenPGP" +msgstr "End to end шифрование" -#: ../src/features_window.py:100 -#, fuzzy +#: ../src/features_window.py:99 msgid "Encrypting chatmessages." -msgstr "_Входящее сообщение:" - -#: ../src/features_window.py:101 ../src/features_window.py:102 -msgid "Requires python-crypto." msgstr "" -#: ../src/features_window.py:103 +#: ../src/features_window.py:100 ../src/features_window.py:101 +msgid "Requires python-crypto." +msgstr "Требует python-crypto." + +#: ../src/features_window.py:102 #, fuzzy msgid "RST Generator" msgstr "Общие" -#: ../src/features_window.py:104 +#: ../src/features_window.py:103 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 +#: ../src/features_window.py:104 ../src/features_window.py:105 msgid "Requires python-docutils." msgstr "Требует python-docutils." -#: ../src/features_window.py:107 +#: ../src/features_window.py:106 msgid "libsexy" msgstr "libsexy" -#: ../src/features_window.py:108 -#, fuzzy +#: ../src/features_window.py:107 msgid "Ability to have clickable URLs in chat and groupchat window banners." -msgstr "Кликабельные ссылки в окне чата" +msgstr "Кликабельные ссылки в баннере." -#: ../src/features_window.py:109 ../src/features_window.py:110 +#: ../src/features_window.py:108 ../src/features_window.py:109 msgid "Requires python-sexy." msgstr "Требует python-sexy." -#: ../src/features_window.py:117 ../src/common/helpers.py:248 +#: ../src/features_window.py:116 ../src/common/helpers.py:248 msgid "Available" msgstr "Доступен" -#: ../src/features_window.py:124 +#: ../src/features_window.py:123 #, fuzzy msgid "Feature" msgstr "Параметры сервера" @@ -4314,7 +4916,7 @@ msgstr "Размер: %s" #. You is a reply of who sent a file #. You is a reply of who received a file #: ../src/filetransfers_window.py:174 ../src/filetransfers_window.py:184 -#: ../src/history_manager.py:468 +#: ../src/history_manager.py:485 msgid "You" msgstr "Вы" @@ -4324,7 +4926,7 @@ msgid "Sender: %s" msgstr "Отправитель: %s" #: ../src/filetransfers_window.py:176 ../src/filetransfers_window.py:595 -#: ../src/tooltips.py:592 +#: ../src/tooltips.py:643 msgid "Recipient: " msgstr "Получатель:" @@ -4363,7 +4965,7 @@ msgstr "Передача файла остановлена контактом н msgid "Choose File to Send..." msgstr "Выбрать файл для отправки..." -#: ../src/filetransfers_window.py:259 ../src/tooltips.py:632 +#: ../src/filetransfers_window.py:259 ../src/tooltips.py:683 msgid "Description: " msgstr "Описание: " @@ -4457,11 +5059,11 @@ msgstr "Файл: " msgid "It is not possible to send empty files" msgstr "Нельзя отсылать пустые файлы" -#: ../src/filetransfers_window.py:591 ../src/tooltips.py:582 +#: ../src/filetransfers_window.py:591 ../src/tooltips.py:633 msgid "Name: " msgstr "Имя: " -#: ../src/filetransfers_window.py:593 ../src/tooltips.py:586 +#: ../src/filetransfers_window.py:593 ../src/tooltips.py:637 msgid "Sender: " msgstr "Отправитель:" @@ -4469,36 +5071,36 @@ msgstr "Отправитель:" msgid "Pause" msgstr "Пауза" -#: ../src/gajim.py:56 +#: ../src/gajim.py:71 #, python-format msgid "%s is not a valid loglevel" msgstr "" -#: ../src/gajim.py:129 +#: ../src/gajim.py:144 msgid "Gajim needs X server to run. Quiting..." msgstr "Gajim для запуска требуется X-сервер. Выход..." -#: ../src/gajim.py:156 +#: ../src/gajim.py:171 msgid "Gajim needs PyGTK 2.8 or above" msgstr "Gajim требуется PyGTK 2.8 или выше" -#: ../src/gajim.py:157 +#: ../src/gajim.py:172 msgid "Gajim needs PyGTK 2.8 or above to run. Quiting..." msgstr "Gajim для запуска требуется PyGTK 2.8 или выше. Выход..." -#: ../src/gajim.py:159 +#: ../src/gajim.py:174 msgid "Gajim needs GTK 2.8 or above" msgstr "Gajim требуется GTK 2.8 или выше" -#: ../src/gajim.py:160 +#: ../src/gajim.py:175 msgid "Gajim needs GTK 2.8 or above to run. Quiting..." msgstr "Gajim для запуска требуется GTK 2.8 или выше. Выход..." -#: ../src/gajim.py:165 +#: ../src/gajim.py:180 msgid "GTK+ runtime is missing libglade support" msgstr "У GTK отсутствует поддержка libglade." -#: ../src/gajim.py:167 +#: ../src/gajim.py:182 #, python-format msgid "" "Please remove your current GTK+ runtime and install the latest stable " @@ -4507,20 +5109,20 @@ msgstr "" "Пожалуйста, удалите вашу текущую версию GTK и установите последнюю " "стабильную версию с %s" -#: ../src/gajim.py:169 +#: ../src/gajim.py:184 msgid "" "Please make sure that GTK+ and PyGTK have libglade support in your system." msgstr "Пожалуйста, удостоверьтесь что GTK+ и PyGTK поддерживают libglade." -#: ../src/gajim.py:174 +#: ../src/gajim.py:189 msgid "Gajim needs PySQLite2 to run" msgstr "Gajim для запуска требуется PySQLite2" -#: ../src/gajim.py:182 +#: ../src/gajim.py:197 msgid "Gajim needs pywin32 to run" msgstr "Gajim для запуска требуется pywin32" -#: ../src/gajim.py:183 +#: ../src/gajim.py:198 #, python-format msgid "" "Please make sure that Pywin32 is installed on your system. You can get it at " @@ -4530,11 +5132,11 @@ msgstr "" "получить его на сайте: %s" #. set the icon to all newly opened wind -#: ../src/gajim.py:328 +#: ../src/gajim.py:342 msgid "Gajim is already running" msgstr "Gajim уже запущен" -#: ../src/gajim.py:329 +#: ../src/gajim.py:343 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -4542,134 +5144,134 @@ msgstr "" "По-видимому, уже запущен другой экземпляр Gajim\n" "Запустить ещё один?" -#: ../src/gajim.py:352 ../src/common/connection_handlers.py:910 -#: ../src/common/connection_handlers.py:1624 +#: ../src/gajim.py:366 ../src/common/connection_handlers.py:929 #: ../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 +#: ../src/common/connection_handlers.py:1692 +#: ../src/common/connection_handlers.py:1711 +#: ../src/common/connection_handlers.py:1962 +#: ../src/common/connection_handlers.py:2074 ../src/common/connection.py:1071 msgid "Disk Write Error" msgstr "Ошибка записи на диск" -#: ../src/gajim.py:448 +#: ../src/gajim.py:462 msgid "Do you accept this request?" msgstr "Вы принимаете этот запрос?" -#: ../src/gajim.py:450 +#: ../src/gajim.py:464 #, python-format msgid "Do you accept this request on account %s?" msgstr "Вы принимаете запрос %s?" -#: ../src/gajim.py:453 +#: ../src/gajim.py:467 #, python-format msgid "HTTP (%s) Authorization for %s (id: %s)" msgstr "HTTP (%s) Авторизация для %s (id: %s)" -#: ../src/gajim.py:500 ../src/notify.py:466 +#: ../src/gajim.py:514 ../src/notify.py:468 msgid "Connection Failed" msgstr "Соединение разорвалось" -#: ../src/gajim.py:834 +#: ../src/gajim.py:849 #, python-format msgid "Subject: %s" msgstr "Тема: %s" #. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) -#: ../src/gajim.py:881 ../src/gajim.py:894 +#: ../src/gajim.py:896 ../src/gajim.py:909 #, python-format msgid "error while sending %s ( %s )" msgstr "ошибка при отправке %s ( %s )" -#: ../src/gajim.py:927 +#: ../src/gajim.py:942 msgid "Authorization accepted" msgstr "Авторизация принята" -#: ../src/gajim.py:928 +#: ../src/gajim.py:943 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "Контакт \"%s\" авторизовал вас, теперь вы можете видеть его статус." -#: ../src/gajim.py:936 +#: ../src/gajim.py:951 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Контакт \"%s\" отозвал подписку с вами" -#: ../src/gajim.py:937 +#: ../src/gajim.py:952 msgid "You will always see him or her as offline." msgstr "Вы всегда будете видеть его или её в оффлайне." -#: ../src/gajim.py:981 +#: ../src/gajim.py:996 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Связь с \"%s\" не может быть установлена" -#: ../src/gajim.py:982 ../src/common/connection.py:524 +#: ../src/gajim.py:997 ../src/common/connection.py:562 msgid "Check your connection or try again later." msgstr "Проверьте настройки сети или попробуйте еще раз позже." -#: ../src/gajim.py:1152 ../src/groupchat_control.py:995 +#: ../src/gajim.py:1172 ../src/groupchat_control.py:1016 #, python-format msgid "%s is now known as %s" msgstr "%s теперь известен как %s" -#: ../src/gajim.py:1168 ../src/roster_window.py:1372 -#, python-format +#: ../src/gajim.py:1188 ../src/roster_window.py:1400 +#, fuzzy, python-format msgid "%s is now %s (%s)" msgstr "%s %s (%s)" #. No status message -#: ../src/gajim.py:1171 ../src/groupchat_control.py:1146 -#: ../src/roster_window.py:1375 -#, python-format +#: ../src/gajim.py:1191 ../src/groupchat_control.py:1167 +#: ../src/roster_window.py:1403 +#, fuzzy, python-format msgid "%s is now %s" msgstr "%s %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:1292 ../src/groupchat_control.py:955 +#: ../src/gajim.py:1312 ../src/groupchat_control.py:976 msgid "Any occupant is allowed to see your full JID" msgstr "Любой участник может увидеть ваш настоящий JID" -#: ../src/gajim.py:1295 +#: ../src/gajim.py:1315 msgid "Room now shows unavailable member" msgstr "" -#: ../src/gajim.py:1297 +#: ../src/gajim.py:1317 msgid "room now does not show unavailable members" msgstr "" -#: ../src/gajim.py:1300 +#: ../src/gajim.py:1320 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 +#: ../src/gajim.py:1323 msgid "Room logging is now enabled" msgstr "Запись логов конференции включена" -#: ../src/gajim.py:1305 +#: ../src/gajim.py:1325 msgid "Room logging is now disabled" msgstr "Запись логов конференции выключена" -#: ../src/gajim.py:1307 +#: ../src/gajim.py:1327 msgid "Room is now non-anonymous" msgstr "Конференция не анонимна" -#: ../src/gajim.py:1310 +#: ../src/gajim.py:1330 msgid "Room is now semi-anonymous" msgstr "Конференция частично анонимна" -#: ../src/gajim.py:1313 +#: ../src/gajim.py:1333 msgid "Room is now fully-anonymous" msgstr "Конференция полностью анонимна" -#: ../src/gajim.py:1345 +#: ../src/gajim.py:1365 #, python-format msgid "A Password is required to join the room %s. Please type it" msgstr "Чтобы войти в комнату %s, нужен пароль." -#: ../src/gajim.py:1379 +#: ../src/gajim.py:1399 msgid "" "You configured Gajim to use GPG agent, but there is no GPG agent running or " "it returned a wrong passphrase.\n" @@ -4677,38 +5279,38 @@ msgstr "" "Gajim настроен на использование GPG агента,но GPG агент не запущен или он " "возвратил неверный пароль.\n" -#: ../src/gajim.py:1381 +#: ../src/gajim.py:1401 msgid "You are currently connected without your OpenPGP key." msgstr "Вы сейчас соединены без OpenPGP ключа." -#: ../src/gajim.py:1384 +#: ../src/gajim.py:1404 msgid "Your passphrase is incorrect" msgstr "Ваша парольная фраза неверна" -#: ../src/gajim.py:1396 ../src/secrets.py:44 +#: ../src/gajim.py:1421 msgid "Passphrase Required" msgstr "Требуется парольная фраза" -#: ../src/gajim.py:1397 +#: ../src/gajim.py:1422 #, python-format msgid "Enter GPG key passphrase for account %s." msgstr "Введите парольную фразу GPG для учетной записи %s" -#: ../src/gajim.py:1409 +#: ../src/gajim.py:1434 msgid "Wrong Passphrase" msgstr "Неверная парольная фраза" -#: ../src/gajim.py:1410 +#: ../src/gajim.py:1435 msgid "Please retype your GPG passphrase or press Cancel." msgstr "" "Пожалуйста, введите парольную фразу для GPG еще раз или нажмите Отмена." -#: ../src/gajim.py:1519 +#: ../src/gajim.py:1545 #, python-format msgid "New mail on %(gmail_mail_address)s" msgstr "Новое письмо на %(gmail_mail_address)s" -#: ../src/gajim.py:1521 +#: ../src/gajim.py:1547 #, python-format msgid "You have %d new mail conversation" msgid_plural "You have %d new mail conversations" @@ -4719,7 +5321,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:1530 +#: ../src/gajim.py:1556 #, python-format msgid "" "\n" @@ -4728,47 +5330,38 @@ msgstr "" "\n" "От: %(from_address)s" -#: ../src/gajim.py:1708 +#: ../src/gajim.py:1734 #, python-format msgid "%s wants to send you a file." msgstr "%s хочет отправить вам файл." -#: ../src/gajim.py:1773 +#: ../src/gajim.py:1799 #, python-format msgid "You successfully received %(filename)s from %(name)s." msgstr "Успешно получен файл %(filename)s от %(name)s." #. ft stopped -#: ../src/gajim.py:1777 +#: ../src/gajim.py:1803 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Передача файла %(filename)s от %(name)s приостановлена." -#: ../src/gajim.py:1790 +#: ../src/gajim.py:1816 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "%(name)s успешно получил отправленный вами файл %(filename)s." #. ft stopped -#: ../src/gajim.py:1794 +#: ../src/gajim.py:1820 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Передача файла %(filename)s к %(name)s приостановлена." -#: ../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 +#: ../src/gajim.py:1946 ../src/gajim.py:1990 msgid "Confirm these session options" msgstr "" -#: ../src/gajim.py:1923 +#: ../src/gajim.py:1947 #, python-format msgid "" "The remote client wants to negotiate an session with these features:\n" @@ -4778,7 +5371,7 @@ msgid "" "\t\tAre these options acceptable?" msgstr "" -#: ../src/gajim.py:1967 +#: ../src/gajim.py:1991 #, python-format msgid "" "The remote client selected these options:\n" @@ -4788,33 +5381,33 @@ msgid "" "Continue with the session?" msgstr "" -#: ../src/gajim.py:2092 +#: ../src/gajim.py:2121 msgid "Username Conflict" msgstr "Такое имя уже есть" -#: ../src/gajim.py:2093 +#: ../src/gajim.py:2122 msgid "Please type a new username for your local account" msgstr "" "Пожалуйста, введите новое имя пользователя для локальной учетной записи" -#: ../src/gajim.py:2110 +#: ../src/gajim.py:2139 msgid "Ping?" msgstr "" -#: ../src/gajim.py:2118 +#: ../src/gajim.py:2147 #, python-format msgid "Pong! (%s s.)" msgstr "" -#: ../src/gajim.py:2124 +#: ../src/gajim.py:2153 msgid "Error." msgstr "" -#: ../src/gajim.py:2149 +#: ../src/gajim.py:2178 msgid "Resource Conflict" msgstr "Такое имя уже есть" -#: ../src/gajim.py:2150 +#: ../src/gajim.py:2179 msgid "" "You are already connected to this account with the same resource. Please " "type a new one" @@ -4822,11 +5415,11 @@ msgstr "" "Вы уже подсоединены к этой учетной записи с таким же ресурсом. Введите " "другой ресурс" -#: ../src/gajim.py:2179 +#: ../src/gajim.py:2223 msgid "Error verifying SSL certificate" -msgstr "" +msgstr "Ошибка при проверке SSL сертификата" -#: ../src/gajim.py:2180 +#: ../src/gajim.py:2224 #, python-format msgid "" "There was an error verifying the SSL certificate of your jabber server: %" @@ -4834,11 +5427,11 @@ msgid "" "Do you still want to connect to this server?" msgstr "" -#: ../src/gajim.py:2196 +#: ../src/gajim.py:2244 msgid "SSL certificate error" msgstr "" -#: ../src/gajim.py:2197 +#: ../src/gajim.py:2245 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?" @@ -4846,22 +5439,22 @@ msgstr "" #. it is good to notify the user #. in case he or she cannot see the output of the console -#: ../src/gajim.py:2557 +#: ../src/gajim.py:2606 msgid "Could not save your settings and preferences" msgstr "Не могу сохранить ваши установки и настройки" #. sorted alphanum -#: ../src/gajim.py:2693 ../src/common/config.py:102 -#: ../src/common/config.py:414 ../src/common/optparser.py:206 +#: ../src/gajim.py:2743 ../src/common/config.py:102 +#: ../src/common/config.py:423 ../src/common/optparser.py:206 #: ../src/common/optparser.py:424 ../src/common/optparser.py:458 msgid "default" msgstr "По_умолчанию" -#: ../src/gajim.py:2779 +#: ../src/gajim.py:2829 msgid "Network Manager support not available" msgstr "Network Manager не используется" -#: ../src/gajim.py:2884 +#: ../src/gajim.py:2934 msgid "Session Management support not available (missing gnome.ui module)" msgstr "" "Отсутствует поддержка управления сессиями (отсутствует модуль gnome.ui)" @@ -5254,123 +5847,123 @@ msgstr "Вы не можете удалить вашу текущую тему" msgid "Please first choose another for your current theme." msgstr "Пожалуйста, выберите сначала другую тему." -#: ../src/groupchat_control.py:139 +#: ../src/groupchat_control.py:146 msgid "Sending private message failed" msgstr "Не удалось отправить личное сообщение" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:141 +#: ../src/groupchat_control.py:148 #, python-format msgid "You are no longer in group chat \"%s\" or \"%s\" has left." msgstr "Вы больше не находитесь в комнате \"%s\" или \"%s\" вышел." -#: ../src/groupchat_control.py:350 +#: ../src/groupchat_control.py:369 msgid "Insert Nickname" msgstr "Вставить ник" -#: ../src/groupchat_control.py:882 +#: ../src/groupchat_control.py:903 msgid "Really send file?" msgstr "Отправить файл?" -#: ../src/groupchat_control.py:883 +#: ../src/groupchat_control.py:904 #, 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 +#: ../src/groupchat_control.py:979 msgid "Room logging is enabled" msgstr "Запись логов конференции включена" -#: ../src/groupchat_control.py:960 +#: ../src/groupchat_control.py:981 msgid "A new room has been created" msgstr "Новая комната была создана" -#: ../src/groupchat_control.py:963 +#: ../src/groupchat_control.py:984 msgid "The server has assigned or modified your roomnick" msgstr "" #. do not print 'kicked by None' -#: ../src/groupchat_control.py:969 +#: ../src/groupchat_control.py:990 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s выгнали из комнаты: %(reason)s" -#: ../src/groupchat_control.py:973 +#: ../src/groupchat_control.py:994 #, 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:980 +#: ../src/groupchat_control.py:1001 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s запретили заходить в комнату: %(reason)s" -#: ../src/groupchat_control.py:984 +#: ../src/groupchat_control.py:1005 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(who)s запретил %(nick)s заходить в комнату: %(reason)s" -#: ../src/groupchat_control.py:993 +#: ../src/groupchat_control.py:1014 #, python-format msgid "You are now known as %s" msgstr "Вы теперь известны как %s" -#: ../src/groupchat_control.py:1029 ../src/groupchat_control.py:1033 -#: ../src/groupchat_control.py:1038 +#: ../src/groupchat_control.py:1050 ../src/groupchat_control.py:1054 +#: ../src/groupchat_control.py:1059 #, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(nick)s выгнали из комнаты (%(reason)s)" -#: ../src/groupchat_control.py:1030 +#: ../src/groupchat_control.py:1051 msgid "affiliation changed" msgstr "" -#: ../src/groupchat_control.py:1035 +#: ../src/groupchat_control.py:1056 msgid "room configuration changed to members-only" msgstr "" -#: ../src/groupchat_control.py:1040 +#: ../src/groupchat_control.py:1061 msgid "system shutdown" msgstr "" -#: ../src/groupchat_control.py:1139 +#: ../src/groupchat_control.py:1160 #, python-format msgid "%s has left" msgstr "%s ушел" -#: ../src/groupchat_control.py:1144 +#: ../src/groupchat_control.py:1165 #, python-format msgid "%s has joined the group chat" msgstr "%s зашёл в комнату" #. Invalid Nickname #. invalid char -#: ../src/groupchat_control.py:1257 ../src/groupchat_control.py:1536 +#: ../src/groupchat_control.py:1278 ../src/groupchat_control.py:1557 msgid "Invalid nickname" msgstr "Неверное имя пользователя" -#: ../src/groupchat_control.py:1258 ../src/groupchat_control.py:1537 +#: ../src/groupchat_control.py:1279 ../src/groupchat_control.py:1558 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 +#: ../src/groupchat_control.py:1302 ../src/groupchat_control.py:1320 +#: ../src/groupchat_control.py:1404 ../src/groupchat_control.py:1421 #, python-format msgid "Nickname not found: %s" msgstr "Ник не обнаружен: %s" -#: ../src/groupchat_control.py:1315 +#: ../src/groupchat_control.py:1336 msgid "This group chat has no subject" msgstr "У этой комнаты нет темы" -#: ../src/groupchat_control.py:1326 +#: ../src/groupchat_control.py:1347 #, python-format msgid "Invited %(contact_jid)s to %(room_jid)s." msgstr "Пригласил %(contact_jid)s в %(room_jid)s." -#: ../src/groupchat_control.py:1463 +#: ../src/groupchat_control.py:1484 #, python-format msgid "" "Usage: /%s [reason], bans the JID from the group chat. The " @@ -5383,7 +5976,7 @@ msgstr "" "данный момент находится в комнате, то он/она/оно также будет выгнан. НЕ " "поддерживает пробелы в никах." -#: ../src/groupchat_control.py:1470 +#: ../src/groupchat_control.py:1491 #, python-format msgid "" "Usage: /%s , opens a private chat window with the specified " @@ -5391,7 +5984,7 @@ msgid "" msgstr "" "Использование: /%s <ник>, открывает окно привата с указанным посетителем." -#: ../src/groupchat_control.py:1476 +#: ../src/groupchat_control.py:1497 #, python-format msgid "" "Usage: /%s [reason], closes the current window or tab, displaying reason if " @@ -5400,7 +5993,7 @@ msgstr "" "Использование: /%s [причина], закрывает текущее окно или вкладку, приводя " "причину, если она указана." -#: ../src/groupchat_control.py:1482 +#: ../src/groupchat_control.py:1503 #, python-format msgid "" "Usage: /%s [reason], invites JID to the current group chat, optionally " @@ -5409,7 +6002,7 @@ msgstr "" "Использование: /%s [причина], приглашает JID в текущую комнату, с " "возможным указанием причины." -#: ../src/groupchat_control.py:1486 +#: ../src/groupchat_control.py:1507 #, python-format msgid "" "Usage: /%s @[/nickname], offers to join room@server optionally " @@ -5418,7 +6011,7 @@ msgstr "" "Использование: /%s <комната>@<сервер>[/ник], предлагает присоединиться к " "комната@сервер, с возможным указанием ника." -#: ../src/groupchat_control.py:1490 +#: ../src/groupchat_control.py:1511 #, python-format msgid "" "Usage: /%s [reason], removes the occupant specified by nickname " @@ -5428,7 +6021,7 @@ msgstr "" "Использование: /%s <ник> [причина], удаляет посетителя с указанным ником из " "комнаты с возможным указанием причины. НЕ поддерживает пробелы в нике." -#: ../src/groupchat_control.py:1499 +#: ../src/groupchat_control.py:1520 #, python-format msgid "" "Usage: /%s [message], opens a private message window and sends " @@ -5437,23 +6030,23 @@ msgstr "" "Использование: /%s <ник> [сообщение], открывает окно личной беседы и " "отсылает сообщение посетителю с указанным ником." -#: ../src/groupchat_control.py:1504 +#: ../src/groupchat_control.py:1525 #, python-format msgid "Usage: /%s , changes your nickname in current group chat." msgstr "Использование: /%s <ник>, меняет ваш ник в текущей комнате." -#: ../src/groupchat_control.py:1508 +#: ../src/groupchat_control.py:1529 #, python-format msgid "Usage: /%s , display the names of group chat occupants." msgstr "Использование: /%s, показывает список присутствующих в комнате." -#: ../src/groupchat_control.py:1512 +#: ../src/groupchat_control.py:1533 #, python-format msgid "Usage: /%s [topic], displays or updates the current group chat topic." msgstr "" "Использование: /%s [тема], показывает или изменяет текущую тему комнаты." -#: ../src/groupchat_control.py:1515 +#: ../src/groupchat_control.py:1536 #, python-format msgid "" "Usage: /%s , sends a message without looking for other commands." @@ -5461,44 +6054,44 @@ msgstr "" "Использование: /%s <сообщение>, отсылает сообщение без поиска других команд " "в нем." -#: ../src/groupchat_control.py:1621 +#: ../src/groupchat_control.py:1642 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Вы точно хотите выйти из комнаты \"%s\"?" -#: ../src/groupchat_control.py:1623 +#: ../src/groupchat_control.py:1644 msgid "" "If you close this window, you will be disconnected from this group chat." msgstr "Если вы закроете это окно, то вы выйдете из этой комнаты." -#: ../src/groupchat_control.py:1627 ../src/roster_window.py:4902 +#: ../src/groupchat_control.py:1648 ../src/roster_window.py:5040 msgid "Do _not ask me again" msgstr "Не _переспрашивать" -#: ../src/groupchat_control.py:1659 +#: ../src/groupchat_control.py:1680 msgid "Changing Subject" msgstr "Изменяет тему" -#: ../src/groupchat_control.py:1660 +#: ../src/groupchat_control.py:1681 msgid "Please specify the new subject:" msgstr "Пожалуйста, введите новую тему:" -#: ../src/groupchat_control.py:1669 +#: ../src/groupchat_control.py:1690 msgid "Changing Nickname" msgstr "Изменяет ник" -#: ../src/groupchat_control.py:1670 +#: ../src/groupchat_control.py:1691 msgid "Please specify the new nickname you want to use:" msgstr "Пожалуйста, введите новый ник, который вы хотите использовать:" # смотря где вылазит меседж - нужно присмотреться #. Ask for a reason -#: ../src/groupchat_control.py:1685 -#, fuzzy, python-format +#: ../src/groupchat_control.py:1706 +#, python-format msgid "Destroying %s" -msgstr "Удаление: %s" +msgstr "Удаление %s" -#: ../src/groupchat_control.py:1686 +#: ../src/groupchat_control.py:1707 msgid "" "You are going to definitively destroy this room.\n" "You may specify a reason below:" @@ -5506,39 +6099,39 @@ msgstr "" "Вы хотите уничтожить комнату.\n" "Вы можете указать причину:" -#: ../src/groupchat_control.py:1688 +#: ../src/groupchat_control.py:1709 msgid "You may also enter an alternate venue:" msgstr "Альтернативная причина:" -#: ../src/groupchat_control.py:1720 +#: ../src/groupchat_control.py:1741 msgid "Bookmark already set" msgstr "Закладка уже установлена" -#: ../src/groupchat_control.py:1721 +#: ../src/groupchat_control.py:1742 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Комната \"%s\" уже есть в ваших закладках." -#: ../src/groupchat_control.py:1730 +#: ../src/groupchat_control.py:1751 msgid "Bookmark has been added successfully" msgstr "Закладка успешно добавлена" -#: ../src/groupchat_control.py:1731 +#: ../src/groupchat_control.py:1752 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "Вы можете управлять закладками через меню \"Действия\" в ростере." #. ask for reason -#: ../src/groupchat_control.py:1883 +#: ../src/groupchat_control.py:1904 #, python-format msgid "Kicking %s" msgstr "Кикнуть %s" -#: ../src/groupchat_control.py:1884 ../src/groupchat_control.py:2184 +#: ../src/groupchat_control.py:1905 ../src/groupchat_control.py:2200 msgid "You may specify a reason below:" msgstr "Вы можете указать причину ниже:" #. ask for reason -#: ../src/groupchat_control.py:2183 +#: ../src/groupchat_control.py:2199 #, python-format msgid "Banning %s" msgstr "Забанить %s" @@ -5613,40 +6206,40 @@ msgstr "" msgid "Save Image as..." msgstr "Сохранить изображение как..." -#: ../src/history_manager.py:73 +#: ../src/history_manager.py:90 msgid "Cannot find history logs database" msgstr "Не могу найти базу данных истории" #. holds jid -#: ../src/history_manager.py:113 +#: ../src/history_manager.py:130 msgid "Contacts" msgstr "Контакты" #. holds time -#: ../src/history_manager.py:126 ../src/history_manager.py:166 +#: ../src/history_manager.py:143 ../src/history_manager.py:183 #: ../src/history_window.py:121 msgid "Date" msgstr "Дата" #. holds nickname -#: ../src/history_manager.py:132 ../src/history_manager.py:184 +#: ../src/history_manager.py:149 ../src/history_manager.py:201 msgid "Nickname" msgstr "Ник" #. holds message -#: ../src/history_manager.py:140 ../src/history_manager.py:172 +#: ../src/history_manager.py:157 ../src/history_manager.py:189 #: ../src/history_window.py:129 msgid "Message" msgstr "Сообщение" -#: ../src/history_manager.py:192 +#: ../src/history_manager.py:209 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" msgstr "" "Вы хотите очистить базу данных? (КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ ЕСЛИ GAJIM ЗАПУЩЕН)" -#: ../src/history_manager.py:194 +#: ../src/history_manager.py:211 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 " @@ -5660,27 +6253,27 @@ msgstr "" "\n" "Если вы нажали ДА, пожалуйста подождите..." -#: ../src/history_manager.py:406 +#: ../src/history_manager.py:423 msgid "Exporting History Logs..." msgstr "Экспортирую историю..." -#: ../src/history_manager.py:481 +#: ../src/history_manager.py:498 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s в %(time)s сказал: %(message)s\n" -#: ../src/history_manager.py:518 +#: ../src/history_manager.py:535 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:522 ../src/history_manager.py:557 +#: ../src/history_manager.py:539 ../src/history_manager.py:574 msgid "This is an irreversible operation." msgstr "Это необратимая операция" -#: ../src/history_manager.py:554 +#: ../src/history_manager.py:571 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Вы точно хотите удалить выделенное сообщение?" @@ -5697,7 +6290,7 @@ msgstr "История %s" msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s теперь %(status)s: %(status_msg)s" -#: ../src/history_window.py:346 ../src/notify.py:219 +#: ../src/history_window.py:346 ../src/notify.py:221 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s теперь %(status)s" @@ -5720,26 +6313,26 @@ msgstr "Не могу загрузить изображение" msgid "Image is too big" msgstr "Изображение слишком большое" -#: ../src/message_window.py:350 +#: ../src/message_window.py:366 msgid "Chats" msgstr "Чаты" -#: ../src/message_window.py:352 +#: ../src/message_window.py:368 msgid "Group Chats" msgstr "Комнаты" -#: ../src/message_window.py:354 +#: ../src/message_window.py:370 msgid "Private Chats" msgstr "Личные беседы" -#: ../src/message_window.py:356 +#: ../src/message_window.py:376 msgid "Messages" msgstr "Сообщения" -#: ../src/message_window.py:357 +#: ../src/message_window.py:380 #, python-format -msgid "%s - Gajim" -msgstr "%s - Gajim" +msgid "%s - %s" +msgstr "%s - %s" #: ../src/negotiation.py:13 msgid "- messages will be logged" @@ -5769,42 +6362,42 @@ msgstr "" msgid "Yes, I verified the Short Authentication String" msgstr "" -#: ../src/notify.py:217 +#: ../src/notify.py:219 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s меняет статус" -#: ../src/notify.py:227 +#: ../src/notify.py:229 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s подключается" -#: ../src/notify.py:235 +#: ../src/notify.py:237 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s отключается" -#: ../src/notify.py:247 +#: ../src/notify.py:249 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Новое сообщение от %(nickname)s" -#: ../src/notify.py:255 +#: ../src/notify.py:257 #, python-format msgid "New Private Message from group chat %s" msgstr "Новое личное сообщение из комнаты %s" -#: ../src/notify.py:257 +#: ../src/notify.py:259 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:260 +#: ../src/notify.py:262 #, python-format msgid "Messaged by %(nickname)s" msgstr "Новое сообщение от %(nickname)s" -#: ../src/notify.py:266 +#: ../src/notify.py:268 #, python-format msgid "New Message from %(nickname)s" msgstr "Новое сообщение от %(nickname)s" @@ -5813,18 +6406,18 @@ msgstr "Новое сообщение от %(nickname)s" msgid "Retrieving profile..." msgstr "Получаю данные..." -#: ../src/profile_window.py:107 ../src/roster_window.py:1914 +#: ../src/profile_window.py:107 ../src/roster_window.py:1947 msgid "File is empty" msgstr "Пустой файл" -#: ../src/profile_window.py:110 ../src/roster_window.py:1917 +#: ../src/profile_window.py:110 ../src/roster_window.py:1950 msgid "File does not exist" msgstr "Файл не существует" #. keep identation #. unknown format #: ../src/profile_window.py:124 ../src/profile_window.py:140 -#: ../src/roster_window.py:1919 ../src/roster_window.py:1930 +#: ../src/roster_window.py:1952 ../src/roster_window.py:1963 msgid "Could not load image" msgstr "Не могу загрузить изображение" @@ -5859,23 +6452,23 @@ msgstr "" msgid "Merged accounts" msgstr "Объединенные учетные записи" -#: ../src/roster_window.py:370 ../src/roster_window.py:635 -#: ../src/roster_window.py:2145 ../src/common/contacts.py:312 +#: ../src/roster_window.py:371 ../src/roster_window.py:637 +#: ../src/roster_window.py:2276 ../src/common/contacts.py:318 #: ../src/common/helpers.py:53 msgid "Observers" msgstr "Наблюдатели" #. 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 +#: ../src/roster_window.py:456 ../src/roster_window.py:461 +#: ../src/roster_window.py:2000 ../src/roster_window.py:2003 +#: ../src/roster_window.py:2657 ../src/roster_window.py:2660 +#: ../src/roster_window.py:2685 ../src/roster_window.py:4901 +#: ../src/roster_window.py:4903 ../src/common/commands.py:199 +#: ../src/common/contacts.py:107 ../src/common/helpers.py:53 msgid "Groupchats" msgstr "Комнаты" -#: ../src/roster_window.py:784 ../src/roster_window.py:4012 +#: ../src/roster_window.py:786 ../src/roster_window.py:4108 msgid "You cannot join a group chat while you are invisible" msgstr "Вы не можете зайти в комнату, так как вы в режиме невидимости." @@ -5884,64 +6477,65 @@ msgstr "Вы не можете зайти в комнату, так как вы #. for chat_with #. for single message #. 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/roster_window.py:1016 ../src/roster_window.py:1026 +#: ../src/roster_window.py:1035 ../src/systray.py:212 ../src/systray.py:217 #: ../src/systray.py:223 #, python-format msgid "using account %s" msgstr "используя учетную запись %s" #. add -#: ../src/roster_window.py:1031 +#: ../src/roster_window.py:1042 #, python-format msgid "to %s account" msgstr "для учетной записи %s" #. disco -#: ../src/roster_window.py:1036 +#: ../src/roster_window.py:1047 #, python-format msgid "using %s account" msgstr "учетной записи %s" -#: ../src/roster_window.py:1117 +#: ../src/roster_window.py:1128 msgid "_Manage Bookmarks..." msgstr "Управление _закладками..." +#. PEP services #. profile, avatar -#: ../src/roster_window.py:1136 +#: ../src/roster_window.py:1149 ../src/roster_window.py:1155 #, python-format msgid "of account %s" msgstr "для учетной записи %s" -#: ../src/roster_window.py:1176 +#: ../src/roster_window.py:1204 #, python-format msgid "for account %s" msgstr "для учетной записи %s" #. History manager -#: ../src/roster_window.py:1200 +#: ../src/roster_window.py:1228 msgid "History Manager" msgstr "Менеджер истории" -#: ../src/roster_window.py:1209 +#: ../src/roster_window.py:1237 msgid "_Join New Group Chat" -msgstr "Войти в новую комнату" +msgstr "_Войти в новую комнату" -#: ../src/roster_window.py:1576 ../src/roster_window.py:4217 -#: ../src/roster_window.py:4224 +#: ../src/roster_window.py:1607 ../src/roster_window.py:4323 +#: ../src/roster_window.py:4330 msgid "You have unread messages" msgstr "У вас есть непрочитанные сообщения" -#: ../src/roster_window.py:1577 +#: ../src/roster_window.py:1608 msgid "You must read them before removing this transport." msgstr "Просмотрите все ожидающие события перед удалением транспорта." -#: ../src/roster_window.py:1580 +#: ../src/roster_window.py:1611 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Транспорт \"%s\" будет удален" -#: ../src/roster_window.py:1581 +#: ../src/roster_window.py:1612 msgid "" "You will no longer be able to send and receive messages from contacts using " "this transport." @@ -5949,11 +6543,11 @@ msgstr "" "У вас теперь не будет возможности приема и отправки сообщения контактам " "через этот транспорт." -#: ../src/roster_window.py:1584 +#: ../src/roster_window.py:1615 msgid "Transports will be removed" msgstr "Транспорты будут удалены" -#: ../src/roster_window.py:1589 +#: ../src/roster_window.py:1620 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " @@ -5963,150 +6557,135 @@ msgstr "" "транспорты:%s." #. it's jid -#: ../src/roster_window.py:1755 +#: ../src/roster_window.py:1786 msgid "Rename Contact" msgstr "Переименовать контакт" -#: ../src/roster_window.py:1756 +#: ../src/roster_window.py:1787 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Введите новый ник для контакта %s" -#: ../src/roster_window.py:1763 +#: ../src/roster_window.py:1794 msgid "Rename Group" msgstr "Переименовать группу" -#: ../src/roster_window.py:1764 +#: ../src/roster_window.py:1795 #, python-format msgid "Enter a new name for group %s" msgstr "Введите новое название для группы %s" -#: ../src/roster_window.py:1839 +#: ../src/roster_window.py:1870 msgid "Remove Group" msgstr "Удалить группу" -#: ../src/roster_window.py:1840 +#: ../src/roster_window.py:1871 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Вы точно хотите удалить группу %s из ростера?" -#: ../src/roster_window.py:1841 +#: ../src/roster_window.py:1872 msgid "Remove also all contacts in this group from your roster" msgstr "Удалить из ростера все контакты в этой группе" -#: ../src/roster_window.py:1872 +#: ../src/roster_window.py:1903 msgid "Assign OpenPGP Key" msgstr "Назначить OpenPGP ключ" -#: ../src/roster_window.py:1873 +#: ../src/roster_window.py:1904 msgid "Select a key to apply to the contact" msgstr "Выберите ключ, который будет применен к контакту" -#: ../src/roster_window.py:2191 +#: ../src/roster_window.py:2078 msgid "_New Group Chat" -msgstr "В новую комнату" +msgstr "В _новую комнату" -#: ../src/roster_window.py:2331 +#: ../src/roster_window.py:2395 msgid "I would like to add you to my roster" msgstr "Вы не против, если я добавлю Вас к себе в ростер?" #. Send Group Message -#: ../src/roster_window.py:2465 ../src/roster_window.py:2677 +#: ../src/roster_window.py:2519 ../src/roster_window.py:2694 msgid "Send Group M_essage" msgstr "_Отправить сообщение группе" -#: ../src/roster_window.py:2484 -msgid "_New group chat" -msgstr "_Новая комната" - #. Manage Transport submenu -#: ../src/roster_window.py:2522 +#: ../src/roster_window.py:2539 msgid "_Manage Contacts" msgstr "_Управление контактами" -#: ../src/roster_window.py:2583 +#: ../src/roster_window.py:2600 msgid "_Maximize" -msgstr "" +msgstr "Развернут_ь" -#: ../src/roster_window.py:2590 -#, fuzzy +#: ../src/roster_window.py:2607 msgid "_Disconnect" -msgstr "Контакт отключился" +msgstr "_Выйти" -#: ../src/roster_window.py:2669 +#: ../src/roster_window.py:2686 msgid "_Maximize All" -msgstr "" +msgstr "_Развернуть все" -#: ../src/roster_window.py:2685 +#: ../src/roster_window.py:2702 msgid "To all users" msgstr "Всем пользователям" -#: ../src/roster_window.py:2688 +#: ../src/roster_window.py:2705 msgid "To all online users" msgstr "Всем, кто подключён" -#. Log Off -#: ../src/roster_window.py:2805 -msgid "_Log off" -msgstr "_Отключиться" - -#. Log on -#: ../src/roster_window.py:2811 -msgid "_Log on" -msgstr "_Соединиться" - #. Send single message -#: ../src/roster_window.py:2823 +#: ../src/roster_window.py:2827 msgid "Send Single Message" -msgstr "О_тправить одиночное сообщение" +msgstr "Отправить одиночное сообщение" #. Manage Transport submenu -#: ../src/roster_window.py:2870 +#: ../src/roster_window.py:2882 msgid "_Manage Transport" msgstr "_Управление транспортом" #. Modify Transport -#: ../src/roster_window.py:2878 +#: ../src/roster_window.py:2890 msgid "_Modify Transport" msgstr "_Изменить транспорт" -#: ../src/roster_window.py:2992 ../src/roster_window.py:3066 +#: ../src/roster_window.py:3024 ../src/roster_window.py:3114 msgid "_Change Status Message" msgstr "_Изменить сообщение о статусе" -#: ../src/roster_window.py:3138 +#: ../src/roster_window.py:3186 msgid "Authorization has been sent" msgstr "Была отправлена авторизация" -#: ../src/roster_window.py:3139 +#: ../src/roster_window.py:3187 #, python-format msgid "Now \"%s\" will know your status." msgstr "Теперь \"%s\" будет знать о вашем статусе." -#: ../src/roster_window.py:3159 +#: ../src/roster_window.py:3207 msgid "Subscription request has been sent" msgstr "Был отправлен запрос на подписку " -#: ../src/roster_window.py:3160 +#: ../src/roster_window.py:3208 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "Если \"%s\" примет ваш запрос, вы будете знать его или её статус" -#: ../src/roster_window.py:3172 +#: ../src/roster_window.py:3220 msgid "Authorization has been removed" msgstr "Авторизация была удалена" -#: ../src/roster_window.py:3173 +#: ../src/roster_window.py:3221 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Теперь \"%s\" всегда будет видеть вас в оффлайне." -#: ../src/roster_window.py:3407 +#: ../src/roster_window.py:3459 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Контакт \"%s\" будет удален из вашего ростера" -#: ../src/roster_window.py:3411 +#: ../src/roster_window.py:3463 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." @@ -6114,7 +6693,7 @@ msgstr "" "Удаляя контакт, вы одновременно удалите авторизацию, и этот человек больше " "не сможет видеть ваш статус." -#: ../src/roster_window.py:3416 +#: ../src/roster_window.py:3468 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." @@ -6122,16 +6701,16 @@ msgstr "" "Если вы удалите контакт, вы так же удалите и авторизацию. Вы будете видеть " "его или её всегда в оффлайне." -#: ../src/roster_window.py:3419 +#: ../src/roster_window.py:3471 msgid "I want this contact to know my status after removal" msgstr "Я хочу, чтобы этот контакт видел мой статус после удаления" #. several contact to remove at the same time -#: ../src/roster_window.py:3423 +#: ../src/roster_window.py:3475 msgid "Contacts will be removed from your roster" msgstr "Контакты будут удалены из вашего ростера" -#: ../src/roster_window.py:3427 +#: ../src/roster_window.py:3479 #, python-format msgid "" "By removing these contacts:%s\n" @@ -6141,28 +6720,28 @@ msgstr "" "Одновременно вы удалите и авторизацию, то есть они всегда будут видеть вас в " "оффлайне." -#: ../src/roster_window.py:3454 +#: ../src/roster_window.py:3506 msgid "" -"Gnome Keyring is installed but not correctly started (environment variable " -"probably not correctly set)" +"Gnome Keyring is installed but not correctly started\t\t\t\t\t\t\t\t" +"(environment variable probably not correctly set)" msgstr "" -#: ../src/roster_window.py:3473 +#: ../src/roster_window.py:3526 msgid "GPG is not usable" -msgstr "" +msgstr "GPG использовать невозможно" #. %s is the account name here -#: ../src/roster_window.py:3474 ../src/common/connection_handlers.py:2157 -#: ../src/common/zeroconf/connection_zeroconf.py:170 +#: ../src/roster_window.py:3527 ../src/common/connection_handlers.py:2201 +#: ../src/common/zeroconf/connection_zeroconf.py:174 #, python-format msgid "You will be connected to %s without OpenPGP." msgstr "Вы будете подключены к %s без использования OpenPGP." -#: ../src/roster_window.py:3545 ../src/roster_window.py:3623 +#: ../src/roster_window.py:3598 ../src/roster_window.py:3676 msgid "You are participating in one or more group chats" msgstr "Вы находитесь в одной или более комнатах" -#: ../src/roster_window.py:3546 ../src/roster_window.py:3624 +#: ../src/roster_window.py:3599 ../src/roster_window.py:3677 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" @@ -6170,21 +6749,21 @@ msgstr "" "Переход в состояние невидимости приведет к выходу из этих комнат. Вы точно " "хотите стать невидимым?" -#: ../src/roster_window.py:3580 +#: ../src/roster_window.py:3633 msgid "No account available" msgstr "Нет доступной учетной записи" -#: ../src/roster_window.py:3581 +#: ../src/roster_window.py:3634 msgid "You must create an account before you can chat with other contacts." msgstr "" "Для начала беседы с другими людьми прежде необходимо создать учетную запись." -#: ../src/roster_window.py:3730 +#: ../src/roster_window.py:3819 #, python-format msgid "\"%(title)s\" by %(artist)s" msgstr "%(artist)s \"%(title)s\"" -#: ../src/roster_window.py:4218 ../src/roster_window.py:4225 +#: ../src/roster_window.py:4324 ../src/roster_window.py:4331 msgid "" "Messages will only be available for reading them later if you have history " "enabled." @@ -6192,11 +6771,11 @@ msgstr "" "Сообщения будут доступны для чтения позже если у вас активирована опция " "истории." -#: ../src/roster_window.py:4849 +#: ../src/roster_window.py:4987 msgid "Metacontacts storage not supported by your server" msgstr "Сервер не умеет хранить метаконтакты" -#: ../src/roster_window.py:4851 +#: ../src/roster_window.py:4989 msgid "" "Your server does not support storing metacontacts information. So those " "information will not be saved on next reconnection." @@ -6204,12 +6783,12 @@ msgstr "" "Ваш сервер не умеет хранить данные о метаконтактах. Они будут утеряны при " "следующем подключении." -#: ../src/roster_window.py:4896 +#: ../src/roster_window.py:5034 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Вы хотите создать метаконтакт?" -#: ../src/roster_window.py:4898 +#: ../src/roster_window.py:5036 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 " @@ -6219,19 +6798,19 @@ msgstr "" "Обычно это используется когда один и тот же человек имеет несколько " "аккаунтов в Jabber или на транспортах." -#: ../src/roster_window.py:4993 +#: ../src/roster_window.py:5131 msgid "Invalid file URI:" msgstr "Неверный файл:" -#: ../src/roster_window.py:5004 -#, fuzzy, python-format +#: ../src/roster_window.py:5142 +#, 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 хочет отправить вам файл:" +msgstr[0] "Хотите отправить файл %s:" +msgstr[1] "Хотите отправить файлы %s:" +msgstr[2] "Хотите отправить файлы %s:" -#: ../src/roster_window.py:5332 +#: ../src/roster_window.py:5490 msgid "Change Status Message..." msgstr "Изменить сообщение о статусе..." @@ -6248,31 +6827,6 @@ msgstr "" 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 "_Изменить сообщение о статусе..." @@ -6281,104 +6835,135 @@ msgstr "_Изменить сообщение о статусе..." msgid "Hide this menu" msgstr "Скрыть это меню" -#: ../src/tooltips.py:316 ../src/tooltips.py:509 +#: ../src/tooltips.py:317 ../src/tooltips.py:560 msgid "Jabber ID: " msgstr "Jabber ID: " -#: ../src/tooltips.py:319 ../src/tooltips.py:513 +#: ../src/tooltips.py:320 ../src/tooltips.py:564 msgid "Resource: " msgstr "Ресурс: " -#: ../src/tooltips.py:324 +#: ../src/tooltips.py:325 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s этой комнаты" -#: ../src/tooltips.py:422 +#: ../src/tooltips.py:423 msgid " [blocked]" msgstr "" -#: ../src/tooltips.py:426 +#: ../src/tooltips.py:427 msgid " [minimized]" msgstr "" -#: ../src/tooltips.py:441 ../src/tooltips.py:629 +#: ../src/tooltips.py:442 ../src/tooltips.py:680 msgid "Status: " msgstr "Статус: " -#: ../src/tooltips.py:471 +#: ../src/tooltips.py:476 #, python-format msgid "Last status: %s" msgstr "Последний статус: %s" -#: ../src/tooltips.py:473 +#: ../src/tooltips.py:478 #, python-format msgid " since %s" msgstr " с %s" -#: ../src/tooltips.py:491 +#: ../src/tooltips.py:496 msgid "Connected" msgstr "Соединение" -#: ../src/tooltips.py:493 +#: ../src/tooltips.py:498 msgid "Disconnected" msgstr "Контакт отключился" +#: ../src/tooltips.py:505 +msgid "Mood:" +msgstr "Настроение:" + +#: ../src/tooltips.py:515 +msgid "Activity:" +msgstr "Активность:" + +#: ../src/tooltips.py:533 +msgid "Unknown Artist" +msgstr "" + +#: ../src/tooltips.py:538 +msgid "Unknown Title" +msgstr "" + +#: ../src/tooltips.py:543 +msgid "Unknown Source" +msgstr "" + +#: ../src/tooltips.py:544 +msgid "Tune:" +msgstr "Слушаю:" + +#: ../src/tooltips.py:544 +#, python-format +msgid "" +"\"%(title)s\" by %(artist)s\n" +"from %(source)s" +msgstr "" + #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:520 +#: ../src/tooltips.py:571 msgid "Subscription: " msgstr "Подписка: " -#: ../src/tooltips.py:530 +#: ../src/tooltips.py:581 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:585 +#: ../src/tooltips.py:636 msgid "Download" msgstr "Загрузить" -#: ../src/tooltips.py:591 +#: ../src/tooltips.py:642 msgid "Upload" msgstr "Upload" -#: ../src/tooltips.py:598 +#: ../src/tooltips.py:649 msgid "Type: " msgstr "Тип: " -#: ../src/tooltips.py:604 +#: ../src/tooltips.py:655 msgid "Transferred: " msgstr "Передано: " -#: ../src/tooltips.py:607 ../src/tooltips.py:628 +#: ../src/tooltips.py:658 ../src/tooltips.py:679 msgid "Not started" msgstr "Не начато" -#: ../src/tooltips.py:611 +#: ../src/tooltips.py:662 msgid "Stopped" msgstr "Остановлено" -#: ../src/tooltips.py:613 ../src/tooltips.py:616 +#: ../src/tooltips.py:664 ../src/tooltips.py:667 msgid "Completed" msgstr "Завершено" -#: ../src/tooltips.py:620 +#: ../src/tooltips.py:671 msgid "?transfer status:Paused" msgstr "Приостановлено" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:624 +#: ../src/tooltips.py:675 msgid "Stalled" msgstr "Ожидание" -#: ../src/tooltips.py:626 +#: ../src/tooltips.py:677 msgid "Transferring" msgstr "Передается" -#: ../src/tooltips.py:662 +#: ../src/tooltips.py:713 msgid "This service has not yet responded with detailed information" msgstr "Этот сервис еще не сообщил информацию о себе" -#: ../src/tooltips.py:665 +#: ../src/tooltips.py:716 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -6386,24 +6971,24 @@ msgstr "" "Этот сервис не может предоставить информацию о себе . \n" "Похоже что он или неверно настроен или сломан" -#: ../src/vcard.py:245 +#: ../src/vcard.py:244 msgid "?Client:Unknown" msgstr "Неизвестен" -#: ../src/vcard.py:247 +#: ../src/vcard.py:246 msgid "?OS:Unknown" msgstr "Неизвестна" -#: ../src/vcard.py:272 ../src/vcard.py:282 ../src/vcard.py:472 +#: ../src/vcard.py:271 ../src/vcard.py:281 ../src/vcard.py:471 #, python-format msgid "since %s" msgstr "с %s" -#: ../src/vcard.py:311 +#: ../src/vcard.py:310 msgid "Affiliation:" msgstr "Ранг:" -#: ../src/vcard.py:319 +#: ../src/vcard.py:318 msgid "" "This contact is interested in your presence information, but you are not " "interested in his/her presence" @@ -6411,7 +6996,7 @@ msgstr "" "Этот контакт хочет знать о вашем присутствии, но вам информация о его или её " "присутствии не интересна" -#: ../src/vcard.py:321 +#: ../src/vcard.py:320 msgid "" "You are interested in the contact's presence information, but he/she is not " "interested in yours" @@ -6419,22 +7004,22 @@ msgstr "" "Вам хочется получать информацию о присутствии контакта, но он или она не " "заинтересована в вашей." -#: ../src/vcard.py:323 +#: ../src/vcard.py:322 msgid "You and the contact are interested in each other's presence information" msgstr "Вы и контакт оба желаете знать о присутствии друг друга" #. None -#: ../src/vcard.py:325 +#: ../src/vcard.py:324 msgid "" "You are not interested in the contact's presence, and neither he/she is " "interested in yours" msgstr "Ни вы, ни ваш контакт не желаете знать о присутствии друг друга" -#: ../src/vcard.py:333 +#: ../src/vcard.py:332 msgid "You are waiting contact's answer about your subscription request" msgstr "Вы ожидаете ответа контакта на запрос на подписку" -#: ../src/vcard.py:337 ../src/vcard.py:374 ../src/vcard.py:497 +#: ../src/vcard.py:336 ../src/vcard.py:373 ../src/vcard.py:496 msgid " resource with priority " msgstr " ресурс с приоритетом " @@ -6838,6 +7423,10 @@ msgstr "" "пустое, для каждого контакта под именем контакта в окне ростера" #: ../src/common/config.py:217 +msgid "Define the position of the avatar in roster. Can be left or right" +msgstr "Определяет позицию аватар в ростере.Может быть left или right" + +#: ../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." @@ -6845,7 +7434,7 @@ msgstr "" "Если True, то Gajim будет запрашивать аватару для каждого контакта, у " "которого её не было в последний раз или она уже слишком старая." -#: ../src/common/config.py:218 +#: ../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." @@ -6853,7 +7442,7 @@ msgstr "" "Если отключено, то Gajim больше не будет показывать статусную строку в окне " "беседы, когда контакт меняет его или её статус и/или сообщение о статусе." -#: ../src/common/config.py:219 +#: ../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 " @@ -6868,29 +7457,29 @@ msgstr "" "\"in_and_out\", то Gajim будет выводить сообщение только когда кто-то входит " "или выходит из комнаты." -#: ../src/common/config.py:221 +#: ../src/common/config.py:222 msgid "Background color of contacts when they just signed in." msgstr "Фоновый цвет контакта, который только что вошел." -#: ../src/common/config.py:222 +#: ../src/common/config.py:223 msgid "Background color of contacts when they just signed out." msgstr "Фоновый цвет контакта, который только что вышел." -#: ../src/common/config.py:224 +#: ../src/common/config.py:225 msgid "" "If True, restored messages will use a smaller font than the default one." msgstr "" "Если установлено, то восстановленные сообщения будут иметь меньший шрифт." -#: ../src/common/config.py:225 +#: ../src/common/config.py:226 msgid "Don't show avatar for the transport itself." msgstr "Не показывать аватар для транспорта." -#: ../src/common/config.py:226 +#: ../src/common/config.py:227 msgid "Don't show roster in the system taskbar." msgstr "Не показывать ростер в панели задач." -#: ../src/common/config.py:227 +#: ../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 " @@ -6900,7 +7489,7 @@ msgstr "" "(поведение по умолчанию для большинства менеджеров окон) когда присутствуют " "не просмотренные события." -#: ../src/common/config.py:229 +#: ../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 " @@ -6911,49 +7500,51 @@ msgstr "" "информации для комнат" #. always, never, peracct, pertype should not be translated -#: ../src/common/config.py:232 +#: ../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" +"'always_with_roster' - Like 'always' but the messages are in a single window " +"along with the roster.\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." +"specific window." msgstr "" "Управляет окном, где помещаются новые сообщения.\n" "'always' - Все сообщения отправляются в одно окно.\n" +"'always_with_roster' - Как 'always' но сообщения в одном окне с ростером.\n" "'never' - Все сообщения приходят в свои отдельные окна.\n" "'peracct' - Сообщения для каждой учетной записи отсылаются в свои окна.\n" "'pertype' - Каждый тип сообщения (например, беседа или комната) отсылается в " "свое окно. Заметьте, что при изменении этого параметра требуется перезапуск " "Gajim, чтобы изменения вступили в силу." -#: ../src/common/config.py:233 +#: ../src/common/config.py:234 msgid "If False, you will no longer see the avatar in the chat window." msgstr "Если False, вы больше не будете видеть аватары в окне беседы." -#: ../src/common/config.py:234 +#: ../src/common/config.py:235 msgid "If True, pressing the escape key closes a tab/window." msgstr "Если True, то нажатие клавиши Escape будет закрывать вкладку/окно." -#: ../src/common/config.py:235 +#: ../src/common/config.py:236 msgid "Hides the buttons in chat windows." msgstr "Скрывает кнопки в окнах чата." -#: ../src/common/config.py:236 +#: ../src/common/config.py:237 msgid "Hides the banner in a group chat window" msgstr "Скрывает баннер в окне комнаты" -#: ../src/common/config.py:237 +#: ../src/common/config.py:238 msgid "Hides the banner in two persons chat window" msgstr "Скрывает баннер в окне чата" -#: ../src/common/config.py:238 +#: ../src/common/config.py:239 msgid "Hides the group chat occupants list in group chat window." msgstr "Скрывает список посетителей в окне комнаты." -#: ../src/common/config.py:239 +#: ../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." @@ -6961,26 +7552,26 @@ msgstr "" "Показывать ник в начале строки в чате только если предыдущее сообщение было " "написано другим участником." -#: ../src/common/config.py:240 +#: ../src/common/config.py:241 msgid "Indentation when using merge consecutive nickname." msgstr "" -#: ../src/common/config.py:241 +#: ../src/common/config.py:242 msgid "Smooth scroll message in conversation window" msgstr "Плавно прокручивать сообщения в окне чата" -#: ../src/common/config.py:242 +#: ../src/common/config.py:243 msgid "List of colors that will be used to color nicknames in group chats." msgstr "" "Список цветов, которые будут использоваться для раскраски ников в комнатах." -#: ../src/common/config.py:243 +#: ../src/common/config.py:244 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "" "Использовать Ctrl-Tab чтобы перейти к следующей вкладке с составляемым " "сообщением, когда нет непрочитанных сообщений." -#: ../src/common/config.py:244 +#: ../src/common/config.py:245 msgid "" "Should we show the confirm metacontacts creation dialog or not? Empty string " "means we never show the dialog." @@ -6988,7 +7579,7 @@ msgstr "" "А нам надо показывать диалог подтверждения о создании метаконтакта? Если тут " "пустая строка, то сообщение не будет показываться вообще." -#: ../src/common/config.py:245 +#: ../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 " @@ -6999,7 +7590,7 @@ msgstr "" "подключитесь еще раз с отрицательным приоритетом, то вы НЕ получите никаких " "сообщений от сервера." -#: ../src/common/config.py:246 +#: ../src/common/config.py:247 msgid "" "If True, Gajim will use Gnome Keyring (if available) to store account " "passwords." @@ -7007,7 +7598,7 @@ msgstr "" "Если активно, Gajim будет использовать (если возможно) Gnome Keyring для " "хранения паролей учетных записей." -#: ../src/common/config.py:247 +#: ../src/common/config.py:248 msgid "" "If True, Gajim will show number of online and total contacts in account and " "group rows." @@ -7015,7 +7606,7 @@ msgstr "" "Если активно, Gajim будет показывать количество контактов онлайн/всего в " "строках с названием аккаунта и групп." -#: ../src/common/config.py:248 +#: ../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" @@ -7023,7 +7614,7 @@ msgstr "" "Может быть пусто, 'chat' или 'normal'. Если не пусто - обрабатывать все " "входящие сообщения так, как будто бы они были этого типа." -#: ../src/common/config.py:249 +#: ../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." @@ -7031,7 +7622,7 @@ msgstr "" "Если активно, Gajim прокрутит ростер и выделит контакт, который написал Вам " "сообщение последним, если окно чата еще небыло открыто." -#: ../src/common/config.py:250 +#: ../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." @@ -7039,17 +7630,17 @@ msgstr "" "Если активно, Gajim будет конвертировать строку между $$ и $$ в изображение, " "используя dvips и конвертировать до вставки его в чат-окно." -#: ../src/common/config.py:251 +#: ../src/common/config.py:252 msgid "Time of inactivity needed before the change status window closes down." msgstr "Время не активности прежде чем окно изменения статуса закроется." -#: ../src/common/config.py:252 +#: ../src/common/config.py:253 msgid "" "Maximum number of lines that are printed in conversations. Oldest lines are " "cleared." msgstr "Максимальное количество строк в окне.Старые строки будут удалены." -#: ../src/common/config.py:253 +#: ../src/common/config.py:260 msgid "" "If True, notification windows from notification-daemon will be attached to " "systray icon." @@ -7057,7 +7648,7 @@ msgstr "" "Если активно, окно уведомления от notification-daemon будет присоединено к " "системному трею." -#: ../src/common/config.py:264 +#: ../src/common/config.py:272 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." @@ -7065,17 +7656,17 @@ msgstr "" "Приоритет будет изменятся автоматически согласно вашему статусу.Приоритеты " "для статусов задаются в пункте autopriority_* ." -#: ../src/common/config.py:276 +#: ../src/common/config.py:284 msgid "" "If disabled, don't sign presences with GPG key, even if GPG is configured." msgstr "" #. yes, no, ask -#: ../src/common/config.py:294 +#: ../src/common/config.py:302 msgid "Jabberd2 workaround" msgstr "Костыль для jabberd2" -#: ../src/common/config.py:298 +#: ../src/common/config.py:306 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." @@ -7083,101 +7674,101 @@ msgstr "" "Если отмечено, Gajim будет использовать ваш IP и прокси, определенные в " "параметре file_transfer_proxies для передачи файлов" -#: ../src/common/config.py:357 +#: ../src/common/config.py:366 msgid "Is OpenPGP enabled for this contact?" msgstr "Используется ли для этого контакта OpenPGP" -#: ../src/common/config.py:358 ../src/common/config.py:361 +#: ../src/common/config.py:367 ../src/common/config.py:370 msgid "Language for which we want to check misspelled words" msgstr "Язык, который используется при проверке правописания" -#: ../src/common/config.py:367 +#: ../src/common/config.py:376 msgid "all or space separated status" msgstr "все или статусы, разделенные пробелом" -#: ../src/common/config.py:368 +#: ../src/common/config.py:377 msgid "'yes', 'no', or 'both'" msgstr "\"да\", \"нет\" или \"оба\"" -#: ../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 +#: ../src/common/config.py:378 ../src/common/config.py:380 +#: ../src/common/config.py:381 ../src/common/config.py:384 +#: ../src/common/config.py:385 msgid "'yes', 'no' or ''" msgstr "\"да\", \"нет\" или \"\"" -#: ../src/common/config.py:382 +#: ../src/common/config.py:391 msgid "Sleeping" msgstr "Сплю" -#: ../src/common/config.py:383 +#: ../src/common/config.py:392 msgid "Back soon" msgstr "Скоро буду" -#: ../src/common/config.py:383 +#: ../src/common/config.py:392 msgid "Back in some minutes." msgstr "Вернусь через несколько минут" -#: ../src/common/config.py:384 +#: ../src/common/config.py:393 msgid "Eating" msgstr "Ем" -#: ../src/common/config.py:384 +#: ../src/common/config.py:393 msgid "I'm eating, so leave me a message." msgstr "Кушаю, так что оставьте сообщение секретарю." -#: ../src/common/config.py:385 +#: ../src/common/config.py:394 msgid "Movie" msgstr "В кино" -#: ../src/common/config.py:385 +#: ../src/common/config.py:394 msgid "I'm watching a movie." msgstr "Смотрю кино" -#: ../src/common/config.py:386 +#: ../src/common/config.py:395 msgid "Working" msgstr "Работаю" -#: ../src/common/config.py:386 +#: ../src/common/config.py:395 msgid "I'm working." msgstr "Работаю" -#: ../src/common/config.py:387 +#: ../src/common/config.py:396 msgid "Phone" msgstr "Телефон" -#: ../src/common/config.py:387 +#: ../src/common/config.py:396 msgid "I'm on the phone." msgstr "Говорю по телефону" -#: ../src/common/config.py:388 +#: ../src/common/config.py:397 msgid "Out" msgstr "Вышел" -#: ../src/common/config.py:388 +#: ../src/common/config.py:397 msgid "I'm out enjoying life." msgstr "Наслаждаюсь жизнью, чего и вам желаю." -#: ../src/common/config.py:392 +#: ../src/common/config.py:401 msgid "I'm available." msgstr "Я здесь." -#: ../src/common/config.py:393 +#: ../src/common/config.py:402 msgid "I'm free for chat." msgstr "Я готов поболтать." -#: ../src/common/config.py:395 +#: ../src/common/config.py:404 msgid "I'm not available." msgstr "Меня нет." -#: ../src/common/config.py:396 +#: ../src/common/config.py:405 msgid "Do not disturb." msgstr "Не беспокоить." -#: ../src/common/config.py:397 ../src/common/config.py:398 +#: ../src/common/config.py:406 ../src/common/config.py:407 msgid "Bye!" msgstr "Пока!" -#: ../src/common/config.py:407 +#: ../src/common/config.py:416 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." @@ -7186,128 +7777,128 @@ msgstr "" "содержит слово из списка muc_highlight_words, или когда сообщение содержит " "ваш ник." -#: ../src/common/config.py:408 +#: ../src/common/config.py:417 msgid "Sound to play when any MUC message arrives." msgstr "Звук, который нужно проигрывать, когда приходит любое сообщение MUC." -#: ../src/common/config.py:417 ../src/common/optparser.py:220 +#: ../src/common/config.py:426 ../src/common/optparser.py:220 msgid "green" msgstr "зеленый" -#: ../src/common/config.py:421 ../src/common/optparser.py:206 +#: ../src/common/config.py:430 ../src/common/optparser.py:206 msgid "grocery" msgstr "овощной" -#: ../src/common/config.py:425 +#: ../src/common/config.py:434 msgid "human" msgstr "телесный" -#: ../src/common/config.py:429 +#: ../src/common/config.py:438 msgid "marine" msgstr "морской" -#: ../src/common/connection_handlers.py:61 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:49 +#: ../src/common/connection_handlers.py:67 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:48 msgid "Unable to load idle module" msgstr "Не могу загрузить модуль \"idle\"" -#: ../src/common/connection_handlers.py:219 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:243 +#: ../src/common/connection_handlers.py:225 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:242 msgid "Wrong host" msgstr "Неверный хост" -#: ../src/common/connection_handlers.py:220 +#: ../src/common/connection_handlers.py:226 msgid "Invalid local address? :-O" msgstr "Неправильный локальный адрес? :-O" -#: ../src/common/connection_handlers.py:618 +#: ../src/common/connection_handlers.py:624 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Данные о регистрации для транспорта %s не пришли вовремя." -#: ../src/common/connection_handlers.py:1806 +#: ../src/common/connection_handlers.py:1849 #, python-format msgid "Nickname not allowed: %s" msgstr "Ник недопустим: %s" #. we are banned #. group chat does not exist -#: ../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 +#: ../src/common/connection_handlers.py:1919 +#: ../src/common/connection_handlers.py:1922 +#: ../src/common/connection_handlers.py:1925 +#: ../src/common/connection_handlers.py:1928 +#: ../src/common/connection_handlers.py:1932 +#: ../src/common/connection_handlers.py:1941 msgid "Unable to join group chat" msgstr "Не получается войти в комнату" -#: ../src/common/connection_handlers.py:1877 +#: ../src/common/connection_handlers.py:1920 #, python-format msgid "You are banned from group chat %s." msgstr "Вам запрещено входить в комнату %s." -#: ../src/common/connection_handlers.py:1880 +#: ../src/common/connection_handlers.py:1923 #, python-format msgid "Group chat %s does not exist." msgstr "Комнаты %s не существует." -#: ../src/common/connection_handlers.py:1883 +#: ../src/common/connection_handlers.py:1926 msgid "Group chat creation is restricted." msgstr "Создание комнат запрещено." -#: ../src/common/connection_handlers.py:1886 +#: ../src/common/connection_handlers.py:1929 #, python-format msgid "Your registered nickname must be used in group chat %s." msgstr "Необходимо использовать Ваш зарегистрированный ник в комнате %s." -#: ../src/common/connection_handlers.py:1890 +#: ../src/common/connection_handlers.py:1933 #, python-format msgid "You are not in the members list in groupchat %s." msgstr "Вас нет в списке членов комнаты %s." -#: ../src/common/connection_handlers.py:1899 +#: ../src/common/connection_handlers.py:1942 #, python-format msgid "" "Your desired nickname in group chat %s is in use or registered by another " "occupant.\n" "Please specify another nickname below:" msgstr "" -"Тот ник что вы ввели в комнате %s уже используется или зарегистрирован " +"Тот ник, что вы ввели в комнате %s уже используется или зарегистрирован " "другим пользователем.\n" -"Пожалуйста укажите другой ник ниже:" +"Пожалуйста, укажите другой ник ниже:" #. Room has been destroyed. see #. http://www.xmpp.org/extensions/xep-0045.html#destroyroom -#: ../src/common/connection_handlers.py:1930 +#: ../src/common/connection_handlers.py:1973 msgid "Room has been destroyed" msgstr "Комната была удалена" -#: ../src/common/connection_handlers.py:1937 +#: ../src/common/connection_handlers.py:1980 #, python-format msgid "You can join this room instead: %s" msgstr "" -#: ../src/common/connection_handlers.py:1964 +#: ../src/common/connection_handlers.py:2007 msgid "I would like to add you to my roster." msgstr "Вы не возражаете, если я добавлю Вас в свой ростер?" #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:1985 +#: ../src/common/connection_handlers.py:2028 #, python-format msgid "we are now subscribed to %s" msgstr "теперь мы подписались на %s" -#: ../src/common/connection_handlers.py:1987 +#: ../src/common/connection_handlers.py:2030 #, python-format msgid "unsubscribe request from %s" msgstr "%s хочет отменить подписку" -#: ../src/common/connection_handlers.py:1989 +#: ../src/common/connection_handlers.py:2032 #, python-format msgid "we are now unsubscribed from %s" msgstr "теперь мы отписались от %s" -#: ../src/common/connection_handlers.py:2116 +#: ../src/common/connection_handlers.py:2174 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " @@ -7318,225 +7909,233 @@ msgstr "" "удалить его" #. We didn't set a passphrase -#: ../src/common/connection_handlers.py:2155 -#: ../src/common/zeroconf/connection_zeroconf.py:168 +#: ../src/common/connection_handlers.py:2199 +#: ../src/common/zeroconf/connection_zeroconf.py:172 msgid "OpenPGP passphrase was not given" msgstr "Не задана парольная фраза OpenPGP" -#: ../src/common/connection.py:62 +#: ../src/common/connection.py:59 msgid "Unable to get issuer certificate" msgstr "" -#: ../src/common/connection.py:63 +#: ../src/common/connection.py:60 msgid "Unable to get certificate CRL" msgstr "" -#: ../src/common/connection.py:64 +#: ../src/common/connection.py:61 msgid "Unable to decrypt certificate's signature" msgstr "" -#: ../src/common/connection.py:65 +#: ../src/common/connection.py:62 msgid "Unable to decrypt CRL's signature" msgstr "" -#: ../src/common/connection.py:66 -#, fuzzy +#: ../src/common/connection.py:63 msgid "Unable to decode issuer public key" -msgstr "Не могу загрузить модуль \"idle\"" +msgstr "Выйти" -#: ../src/common/connection.py:67 +#: ../src/common/connection.py:64 msgid "Certificate signature failure" msgstr "" -#: ../src/common/connection.py:68 +#: ../src/common/connection.py:65 msgid "CRL signature failure" msgstr "" -#: ../src/common/connection.py:69 +#: ../src/common/connection.py:66 msgid "Certificate is not yet valid" msgstr "" -#: ../src/common/connection.py:70 +#: ../src/common/connection.py:67 msgid "Certificate has expired" msgstr "" -#: ../src/common/connection.py:71 +#: ../src/common/connection.py:68 msgid "CRL is not yet valid" msgstr "" -#: ../src/common/connection.py:72 +#: ../src/common/connection.py:69 msgid "CRL has expired" msgstr "" -#: ../src/common/connection.py:73 +#: ../src/common/connection.py:70 msgid "Format error in certificate's notBefore field" msgstr "" -#: ../src/common/connection.py:74 +#: ../src/common/connection.py:71 msgid "Format error in certificate's notAfter field" msgstr "" -#: ../src/common/connection.py:75 +#: ../src/common/connection.py:72 msgid "Format error in CRL's lastUpdate field" msgstr "" -#: ../src/common/connection.py:76 +#: ../src/common/connection.py:73 msgid "Format error in CRL's nextUpdate field" msgstr "" -#: ../src/common/connection.py:77 +#: ../src/common/connection.py:74 msgid "Out of memory" -msgstr "" +msgstr "Недостаточно памяти" -#: ../src/common/connection.py:78 +#: ../src/common/connection.py:75 +#, fuzzy +msgid "Self signed certificate" +msgstr "Неверное имя пользователя" + +#: ../src/common/connection.py:76 msgid "Self signed certificate in certificate chain" msgstr "" -#: ../src/common/connection.py:79 +#: ../src/common/connection.py:77 msgid "Unable to get local issuer certificate" msgstr "" -#: ../src/common/connection.py:80 ../src/common/connection.py:81 +#: ../src/common/connection.py:78 msgid "Unable to verify the first certificate" msgstr "" -#: ../src/common/connection.py:82 +#: ../src/common/connection.py:79 msgid "Certificate chain too long" msgstr "" -#: ../src/common/connection.py:83 +#: ../src/common/connection.py:80 msgid "Certificate revoked" -msgstr "" +msgstr "Сертификат аннулирован" -#: ../src/common/connection.py:84 +#: ../src/common/connection.py:81 #, fuzzy msgid "Invalid CA certificate" msgstr "Неверное имя пользователя" -#: ../src/common/connection.py:85 +#: ../src/common/connection.py:82 msgid "Path length constraint exceeded" msgstr "" -#: ../src/common/connection.py:86 +#: ../src/common/connection.py:83 msgid "Unsupported certificate purpose" msgstr "" -#: ../src/common/connection.py:87 +#: ../src/common/connection.py:84 msgid "Certificate not trusted" msgstr "" -#: ../src/common/connection.py:88 +#: ../src/common/connection.py:85 msgid "Certificate rejected" -msgstr "" +msgstr "Сертификат отклонен" -#: ../src/common/connection.py:89 +#: ../src/common/connection.py:86 msgid "Subject issuer mismatch" msgstr "" -#: ../src/common/connection.py:90 +#: ../src/common/connection.py:87 msgid "Authority and subject key identifier mismatch" msgstr "" -#: ../src/common/connection.py:91 +#: ../src/common/connection.py:88 msgid "Authority and issuer serial number mismatch" msgstr "" -#: ../src/common/connection.py:92 +#: ../src/common/connection.py:89 msgid "Key usage does not include certificate signing" msgstr "" -#: ../src/common/connection.py:93 +#: ../src/common/connection.py:90 msgid "Application verification failure" msgstr "" -#: ../src/common/connection.py:246 -#: ../src/common/zeroconf/connection_zeroconf.py:208 +#: ../src/common/connection.py:250 +#: ../src/common/zeroconf/connection_zeroconf.py:214 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Связь с учетной записью \"%s\" была потеряна" -#: ../src/common/connection.py:247 +#: ../src/common/connection.py:251 msgid "Reconnect manually." msgstr "Переподключаться вручную." -#: ../src/common/connection.py:258 +#: ../src/common/connection.py:262 #, python-format msgid "Server %s answered wrongly to register request: %s" msgstr "Сервер %s неверно ответил на запрос о регистрации: %s" -#: ../src/common/connection.py:291 +#: ../src/common/connection.py:296 #, python-format msgid "Server %s provided a different registration form" msgstr "" -#: ../src/common/connection.py:307 +#: ../src/common/connection.py:312 #, python-format msgid "Unknown SSL error: %d" -msgstr "" +msgstr "Неизвестная ошибка SSL: %d" #. wrong answer -#: ../src/common/connection.py:322 +#: ../src/common/connection.py:327 msgid "Invalid answer" msgstr "Неверный ответ" -#: ../src/common/connection.py:323 +#: ../src/common/connection.py:328 #, python-format msgid "Transport %s answered wrongly to register request: %s" msgstr "Транспорт %s неверно ответил на запрос о регистрации: %s" -#: ../src/common/connection.py:469 +#: ../src/common/connection.py:507 msgid "Connection to proxy failed" msgstr "Соединение с прокси разорвалось" -#: ../src/common/connection.py:523 ../src/common/connection.py:585 -#: ../src/common/connection.py:1140 -#: ../src/common/zeroconf/connection_zeroconf.py:242 +#: ../src/common/connection.py:561 ../src/common/connection.py:623 +#: ../src/common/connection.py:1195 +#: ../src/common/zeroconf/connection_zeroconf.py:248 #, python-format msgid "Could not connect to \"%s\"" msgstr "Не могу соединиться с \"%s\"" -#: ../src/common/connection.py:537 +#: ../src/common/connection.py:575 #, python-format msgid "Connected to server %s:%s with %s" msgstr "Подключен к серверу %s: %s с %s" -#: ../src/common/connection.py:548 +#: ../src/common/connection.py:586 #, python-format msgid "The authenticity of the %s certificate could be invalid." msgstr "" -#: ../src/common/connection.py:551 +#: ../src/common/connection.py:589 #, python-format msgid "" "\n" -"SSL Error: %s" +"SSL Error: %s" msgstr "" +"\n" +"Ошибка SSL: %s" -#: ../src/common/connection.py:553 +#: ../src/common/connection.py:591 #, python-format msgid "" "\n" "Unknown SSL error: %d" msgstr "" +"\n" +"Неизвестная ошибка SSL: %d" -#: ../src/common/connection.py:586 +#: ../src/common/connection.py:624 msgid "Check your connection or try again later" msgstr "Проверьте настройки сети или попробуйте еще раз позже" -#: ../src/common/connection.py:611 +#: ../src/common/connection.py:649 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Ошибка аутентификации с \"%s\"" -#: ../src/common/connection.py:613 +#: ../src/common/connection.py:651 msgid "Please check your login and password for correctness." msgstr "Пожалуйста, проверьте правильность логина и пароля." -#: ../src/common/connection.py:656 +#: ../src/common/connection.py:694 msgid "Error while removing privacy list" msgstr "Ошибка при удалении списка приватности" -#: ../src/common/connection.py:657 +#: ../src/common/connection.py:695 #, python-format msgid "" "Privacy list %s has not been removed. It is maybe active in one of your " @@ -7545,14 +8144,25 @@ msgstr "" "Список приватности %s не может быть удален.Возможно он используется одним из " "ваших активных ресурсов.Отключите ресурс и попробуйте снова." +#: ../src/common/connection.py:977 +#: ../src/common/zeroconf/connection_zeroconf.py:381 +msgid "Neither the remote presence is signed, nor a key was assigned." +msgstr "" + +#: ../src/common/connection.py:979 +#: ../src/common/zeroconf/connection_zeroconf.py:383 +#, python-format +msgid "The contact's key (%s) does not match the key assigned in Gajim." +msgstr "" + #. we're not english #. one in locale and one en -#: ../src/common/connection.py:933 +#: ../src/common/connection.py:988 msgid "[This message is *encrypted* (See :JEP:`27`]" msgstr "[Это сообщение *зашифровано*, см. :JEP:`27`]" -#: ../src/common/connection.py:1007 -#: ../src/common/zeroconf/connection_zeroconf.py:436 +#: ../src/common/connection.py:1062 +#: ../src/common/zeroconf/connection_zeroconf.py:447 #, python-format msgid "" "Subject: %s\n" @@ -7561,11 +8171,11 @@ msgstr "" "Тема: %s\n" "%s" -#: ../src/common/connection.py:1172 +#: ../src/common/connection.py:1227 msgid "Not fetched because of invisible status" msgstr "Нельзя получить из-за невидимости" -#: ../src/common/contacts.py:299 +#: ../src/common/contacts.py:305 msgid "Not in roster" msgstr "Не в ростере" @@ -8019,7 +8629,7 @@ msgstr "Не удалось соединиться с хостом: истекл msgid "Contact is offline. Your message could not be sent." msgstr "Контакт не в сети. Отправить сообщение не удалось." -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:243 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:242 #, fuzzy, python-format msgid "" "The host %s you configured as the ft_add_hosts_to_send advanced option is " @@ -8028,46 +8638,46 @@ msgstr "" "Хост %s, который настроен как расширеная настройка ft_add_hosts_to_send не " "действителен (не правилен?), поэтому игнорируется." -#: ../src/common/zeroconf/connection_zeroconf.py:209 +#: ../src/common/zeroconf/connection_zeroconf.py:215 msgid "To continue sending and receiving messages, you will need to reconnect." msgstr "Требуется переподключение для продолжения приема и отправки сообщений." -#: ../src/common/zeroconf/connection_zeroconf.py:232 +#: ../src/common/zeroconf/connection_zeroconf.py:238 msgid "Avahi error" msgstr "Ошибка Avahi" -#: ../src/common/zeroconf/connection_zeroconf.py:232 +#: ../src/common/zeroconf/connection_zeroconf.py:238 #, python-format msgid "" "%s\n" "Link-local messaging might not work properly." msgstr "" -#: ../src/common/zeroconf/connection_zeroconf.py:243 +#: ../src/common/zeroconf/connection_zeroconf.py:249 msgid "Please check if Avahi is installed." msgstr "Пожалуйста, удостоверьтесь что Avahi установлен." -#: ../src/common/zeroconf/connection_zeroconf.py:252 -#: ../src/common/zeroconf/connection_zeroconf.py:256 +#: ../src/common/zeroconf/connection_zeroconf.py:258 +#: ../src/common/zeroconf/connection_zeroconf.py:262 msgid "Could not start local service" msgstr "Не могу запустить локальный сервис" -#: ../src/common/zeroconf/connection_zeroconf.py:253 +#: ../src/common/zeroconf/connection_zeroconf.py:259 #, python-format msgid "Unable to bind to port %d." msgstr "Не могу использовать порт %d." -#: ../src/common/zeroconf/connection_zeroconf.py:257 -#: ../src/common/zeroconf/connection_zeroconf.py:352 +#: ../src/common/zeroconf/connection_zeroconf.py:263 +#: ../src/common/zeroconf/connection_zeroconf.py:358 msgid "Please check if avahi-daemon is running." msgstr "Пожалуйста, удостоверьтесь что демон avahi запущен." -#: ../src/common/zeroconf/connection_zeroconf.py:351 +#: ../src/common/zeroconf/connection_zeroconf.py:357 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Не могу изменить статус учётной записи \"%s\"" -#: ../src/common/zeroconf/connection_zeroconf.py:368 +#: ../src/common/zeroconf/connection_zeroconf.py:374 msgid "" "You are not connected or not visible to others. Your message could not be " "sent." @@ -8075,7 +8685,7 @@ msgstr "" "Вы не подключены или невидимы для других. Ваше сообщение нельзы отправить." #. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:380 +#: ../src/common/zeroconf/connection_zeroconf.py:391 msgid "[This message is encrypted]" msgstr "[Это сообщение зашифровано]" @@ -8085,5 +8695,51 @@ msgstr "[Это сообщение зашифровано]" msgid "Error while adding service. %s" msgstr "Ошибка при добавлении службы. %s" -#~ msgid "Save passphrase" -#~ msgstr "Сохранить парольную фразу (небезопасно)" +#~ msgid "OpenPGP Encryption" +#~ msgstr "Шифрование OpenPGP" + +#~ msgid "Confirm Passphrase" +#~ msgstr "Подтверждение парольной фразы" + +#~ msgid "Enter your new passphrase again for confirmation" +#~ msgstr "Введите снова для подтверждения" + +#~ msgid "Create Passphrase" +#~ msgstr "Создать парольную фразу" + +#~ msgid "Passphrases did not match.\n" +#~ msgstr "Пароли не совпадают.\n" + +#~ msgid "_New group chat" +#~ msgstr "_Новая комната" + +#~ msgid "" +#~ "Never\n" +#~ "Always\n" +#~ "Always (with Roster)\n" +#~ "Per account\n" +#~ "Per type" +#~ msgstr "" +#~ "Никогда\n" +#~ "Всегда\n" +#~ "Всегда (с ростером)\n" +#~ "По учетной записи\n" +#~ "По типу" + +#~ msgid "Use only one message _window:" +#~ msgstr "Только одно окно:" + +#~ msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" +#~ msgstr "%s не выдал OpenPGP ключ или вы не присвоили ему такового" + +#~ msgid "OpenPGP Encryption enabled" +#~ msgstr "Шифрование OpenPGP включено" + +#~ msgid "OpenPGP Encryption disabled" +#~ msgstr "Шифрование OpenPGP отключено" + +#~ msgid "_Log off" +#~ msgstr "_Отключиться" + +#~ msgid "_Log on" +#~ msgstr "_Соединиться" diff --git a/po/sk.po b/po/sk.po index 36ba4b5f9..dd6606469 100644 --- a/po/sk.po +++ b/po/sk.po @@ -2,22 +2,24 @@ # Copyright (c) (c) 2005 Canonical Ltd, and Rosetta Contributors 2005 # This file is distributed under the same license as the gajim package. # Juraj Michalek , 2005. +# Pavol Klacansky , 2008. # -#: ../src/gajim-remote.py:202 ../src/gajim-remote.py:209 +#: ../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\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-12-18 09:32+0100\n" -"PO-Revision-Date: 2006-12-17 16:03+0100\n" -"Last-Translator: Juraj Michalek \n" -"Language-Team: Slovak \n" +"POT-Creation-Date: 2008-01-07 13:53+0100\n" +"PO-Revision-Date: 2008-01-07 12:27+0100\n" +"Last-Translator: Pavol Klacansky \n" +"Language-Team: Slovak \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-Poedit-Country: SLOVAKIA\n" +"Plural-Forms: nplurals=3; plural= (n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" #: ../data/gajim.desktop.in.in.h:1 msgid "A GTK+ Jabber client" @@ -25,200 +27,232 @@ msgstr "GTK+ Jabber klient" #: ../data/gajim.desktop.in.in.h:2 msgid "Gajim Instant Messenger" -msgstr "Gajim Instant Messenger" +msgstr "Internetový komunikátor Gajim" #: ../data/gajim.desktop.in.in.h:3 msgid "Jabber IM Client" msgstr "Jabber IM klient" #: ../data/glade/account_context_menu.glade.h:1 -msgid "Send Single _Message..." -msgstr "Poslať krátku _správu" +#: ../data/glade/roster_window.glade.h:8 +msgid "Join _Group Chat..." +msgstr "_Pripojiť sa k diskusnej skupine..." #: ../data/glade/account_context_menu.glade.h:2 msgid "_Add Contact..." msgstr "_Pridať kontakt..." #: ../data/glade/account_context_menu.glade.h:3 -msgid "_Discover Services..." -msgstr "_Preskúmať služby..." +#: ../data/glade/roster_window.glade.h:16 +msgid "_Discover Services" +msgstr "_Preskúmať služby" #: ../data/glade/account_context_menu.glade.h:4 msgid "_Execute Command..." msgstr "_Vykonať prí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 "_Diskusná skupina" +msgid "_Modify Account" +msgstr "_Upraviť účet" #: ../data/glade/account_context_menu.glade.h:6 -#: ../data/glade/zeroconf_context_menu.glade.h:1 -msgid "_Modify Account..." -msgstr "_Upraviť účet..." - -#: ../data/glade/account_context_menu.glade.h:7 msgid "_Open Gmail Inbox" msgstr "_Otvoriť Gmail Inbox" +#: ../data/glade/account_context_menu.glade.h:7 +msgid "_Personal Events" +msgstr "" + #: ../data/glade/account_context_menu.glade.h:8 +#: ../data/glade/roster_window.glade.h:25 +msgid "_Start Chat..." +msgstr "_Začať rozhovor..." + +#: ../data/glade/account_context_menu.glade.h:9 #: ../data/glade/zeroconf_context_menu.glade.h:2 msgid "_Status" msgstr "_Stav" #: ../data/glade/account_creation_wizard_window.glade.h:1 msgid "" -"Account is being created\n" +"Connecting to server\n" "\n" "Please wait..." msgstr "" -"Účet je vytváraný\n" +"Pripájam k serveru\n" "\n" -"Prosím čakajte..." +"Prosím počkajte..." #: ../data/glade/account_creation_wizard_window.glade.h:4 msgid "Please choose one of the options below:" -msgstr "Prosím, vyberte jednu z možností:" +msgstr "Prosím, vyberte jednu z možností dole:" #: ../data/glade/account_creation_wizard_window.glade.h:5 msgid "Please fill in the data for your new account" -msgstr "Prosím, vyplňte údaje o vašom účte" +msgstr "Prosím, vyplňte údaje o vašom novom účte" #: ../data/glade/account_creation_wizard_window.glade.h:6 +msgid "Please select a server" +msgstr "Prosím, vyberte server" + +#: ../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 "" "Kliknite pre zistenie vlastností (ako MSN, ICQ transport) jabber serverov" -#: ../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 "Pripojiť, keď stlačím Dokončiť" -#: ../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: Pomocník - Tvorba účtu" -#: ../data/glade/account_creation_wizard_window.glade.h:9 -msgid "I already have an account I want to use" -msgstr "Už mám účet a chcem ho používať" +#: ../data/glade/account_creation_wizard_window.glade.h:13 +msgid "I already have an account I want to _use" +msgstr "Už mám účet a chcem ho po_užívať" -#: ../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 "Chcem si za_registrovať 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:15 +#: ../data/glade/account_modification_window.glade.h:20 +#: ../data/glade/accounts_window.glade.h:24 msgid "If checked, Gajim will remember the password for this account" msgstr "Ak je zaškrtnuté, Gajim si zapamätá heslo pre tento účet" -#: ../data/glade/account_creation_wizard_window.glade.h:12 -#: ../data/glade/manage_proxies_window.glade.h:6 -msgid "Pass_word:" -msgstr "He_slo:" +#: ../data/glade/account_creation_wizard_window.glade.h:16 +#: ../data/glade/account_modification_window.glade.h:26 +#: ../data/glade/accounts_window.glade.h:33 +msgid "Manage..." +msgstr "Spravovať..." -#: ../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 "Prox_y:" + +#: ../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 "Uložiť hes_lo" -#: ../data/glade/account_creation_wizard_window.glade.h:14 +#: ../data/glade/account_creation_wizard_window.glade.h:19 msgid "Servers Features" msgstr "Vlastnosti servera" -#: ../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 "Nastaviť môj profil, keď som pripojený(á)" +msgstr "Nastaviť môj profil, keď som pripojený" -#: ../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 "Použiť vlastné nastavenie názvu hostu/portu" + +#: ../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." msgstr "" "Potrebujete mať účet, aby ste sa mohli pripojiť\n" -"do Jabbrovskej siete." +"do siete Jabber." -#: ../data/glade/account_creation_wizard_window.glade.h:18 +#: ../data/glade/account_creation_wizard_window.glade.h:24 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:25 +#: ../data/glade/roster_window.glade.h:14 msgid "_Advanced" -msgstr "_Rozšírené" +msgstr "_Pokročilé" -#: ../data/glade/account_creation_wizard_window.glade.h:20 +#: ../data/glade/account_creation_wizard_window.glade.h:26 msgid "_Finish" msgstr "_Dokončiť" -#: ../data/glade/account_creation_wizard_window.glade.h:21 -#: ../data/glade/manage_proxies_window.glade.h:9 -msgid "_Host:" -msgstr "_Server:" +#: ../data/glade/account_creation_wizard_window.glade.h:27 +msgid "_Hostname:" +msgstr "Názov _hostu:" -#: ../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 "_Heslo:" -#: ../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 "_Port:" -#: ../data/glade/account_creation_wizard_window.glade.h:24 -msgid "_Retype Password:" -msgstr "_Zopakovať heslo:" - -#: ../data/glade/account_creation_wizard_window.glade.h:25 +#: ../data/glade/account_creation_wizard_window.glade.h:30 msgid "_Server:" msgstr "_Server:" -#: ../data/glade/account_creation_wizard_window.glade.h:26 -msgid "_Use proxy" -msgstr "_Použiť 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:31 +#: ../data/glade/manage_proxies_window.glade.h:12 msgid "_Username:" -msgstr "_Používateľské meno" +msgstr "_Používateľské meno:" #: ../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ôzne" #: ../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é informácie" #: ../data/glade/account_modification_window.glade.h:4 +#: ../data/glade/accounts_window.glade.h:5 msgid "Account" msgstr "Účet" #: ../data/glade/account_modification_window.glade.h:5 msgid "Account Modification" -msgstr "Modifikácia účtu" +msgstr "Úpravy účtu" #: ../data/glade/account_modification_window.glade.h:6 -msgid "Autoreconnect when connection is lost" -msgstr "Automatické pripojenie po strate spojenia" +#: ../data/glade/accounts_window.glade.h:6 +msgid "Administration operations" +msgstr "Administrátorské operácie" #: ../data/glade/account_modification_window.glade.h:7 -#: ../data/glade/zeroconf_properties_window.glade.h:3 -msgid "C_onnect on Gajim startup" -msgstr "_Pripojiť Gajim pri štarte" +#: ../data/glade/accounts_window.glade.h:7 +msgid "Auto-reconnect when connection is lost" +msgstr "Automaticky pripojiť, keď zlyhá spojenie" #: ../data/glade/account_modification_window.glade.h:8 -msgid "Chan_ge Password" -msgstr "Zme_niť hesla" +#: ../data/glade/accounts_window.glade.h:8 +#: ../data/glade/zeroconf_properties_window.glade.h:3 +msgid "C_onnect on Gajim startup" +msgstr "Prip_ojiť sa pri štarte Gajim" #: ../data/glade/account_modification_window.glade.h:9 +#: ../data/glade/accounts_window.glade.h:9 +msgid "Chan_ge Password" +msgstr "Zme_niť heslo" + +#: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/accounts_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 " @@ -229,44 +263,60 @@ msgstr "" "silné šifrované SSL spojenie. Gajim používa bežne TLS šifrovanie, pokiaľ je " "poskytované serverom. Pri povolení tejto vlastnosti bude TLS deaktivované." -#: ../data/glade/account_modification_window.glade.h:10 +#: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/accounts_window.glade.h:11 #: ../data/glade/zeroconf_properties_window.glade.h:4 msgid "Choose _Key..." -msgstr "Vyberte _kľúč" +msgstr "Vybrať _kľúč..." -#: ../data/glade/account_modification_window.glade.h:11 +#: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/accounts_window.glade.h:12 msgid "Click to change account's password" msgstr "Kliknite pre zmenu hesla účtu" -#: ../data/glade/account_modification_window.glade.h:12 +#: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/accounts_window.glade.h:13 +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:14 msgid "Connection" msgstr "Spojenie" -#: ../data/glade/account_modification_window.glade.h:13 +#: ../data/glade/account_modification_window.glade.h:15 +#: ../data/glade/accounts_window.glade.h:16 msgid "Edit Personal Information..." msgstr "Upraviť osobné informácie..." -#: ../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:19 +#: ../data/glade/roster_window.glade.h:6 ../src/notify.py:491 +#: ../src/notify.py:522 ../src/notify.py:534 ../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:20 +#: ../data/glade/preferences_window.glade.h:52 #: ../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:373 ../src/roster_window.py:639 +#: ../src/roster_window.py:1412 ../src/roster_window.py:1791 +#: ../src/roster_window.py:2278 ../src/roster_window.py:2678 +#: ../src/roster_window.py:2805 ../src/common/contacts.py:320 msgid "General" msgstr "Všeobecné" -#: ../data/glade/account_modification_window.glade.h:16 +#: ../data/glade/account_modification_window.glade.h:18 +#: ../data/glade/accounts_window.glade.h:21 msgid "Hostname: " -msgstr "Meno servera:" +msgstr "Názov hostu:" -#: ../data/glade/account_modification_window.glade.h:17 +#: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/accounts_window.glade.h:22 msgid "" "If checked, Gajim will also broadcast some more IPs except from just your " "IP, so file transfer has higher chances of working." @@ -274,15 +324,14 @@ msgstr "" "Ak je zaškrtnuté, Gajim bude rozosielať informácie aj na niekoľko ďalších IP " "adries okrem vašej, takže je vyššia šanca, že prenos súborov bude fungovať." -#: ../data/glade/account_modification_window.glade.h:19 +#: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/accounts_window.glade.h:25 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 "" -"Ak je zaškrtnuté, Gajim bude posielať pakety na udržanie spojenia, čím sa " -"predchádza vypršaniu platnosti spojenia, ktorého výsledkom je odpojeni" -#: ../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' " @@ -291,7 +340,8 @@ msgstr "" "Ak je zaškrtnuté, Gajim uloží heslo do ~/.gajim/config s oprávnením 'čitať' " "len pre vás" -#: ../data/glade/account_modification_window.glade.h:21 +#: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/accounts_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:9 msgid "" "If checked, Gajim, when launched, will automatically connect to jabber using " @@ -300,7 +350,8 @@ msgstr "" "Ak je zaškrtnuté, Gajim sa pri spustení automatický pripojí na jabber na " "tento účet" -#: ../data/glade/account_modification_window.glade.h:22 +#: ../data/glade/account_modification_window.glade.h:24 +#: ../data/glade/accounts_window.glade.h:27 #: ../data/glade/zeroconf_properties_window.glade.h:10 msgid "" "If checked, any change to the global status (handled by the combobox at the " @@ -310,44 +361,51 @@ msgstr "" "Ak je zaškrtnuté, každá zmena globálneho stavu (realizovaná rozbaľovacím " "menu na spodku zoznamu) spôsobí zmenu stavu aj v tomto účte" -#: ../data/glade/account_modification_window.glade.h:23 +#: ../data/glade/account_modification_window.glade.h:25 +#: ../data/glade/accounts_window.glade.h:30 msgid "Information about you, as stored in the server" msgstr "Informácie o vás sú uložené na serveri" -#: ../data/glade/account_modification_window.glade.h:24 -msgid "Manage..." -msgstr "Upraviť..." - -#: ../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:35 +#: ../data/glade/zeroconf_properties_window.glade.h:16 ../src/config.py:1614 +#: ../src/config.py:2106 ../src/config.py:3695 msgid "No key selected" msgstr "Žiadny kľúč nie je vybraný" #. 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:37 +#: ../data/glade/vcard_information_window.glade.h:32 ../src/config.py:1204 +#: ../src/config.py:1275 ../src/config.py:1522 ../src/config.py:1527 +#: ../src/config.py:2004 ../src/config.py:2091 ../src/config.py:2105 +#: ../src/config.py:3195 ../src/config.py:3263 ../src/config.py:3685 +#: ../src/config.py:3694 ../src/dialogs.py:344 ../src/dialogs.py:346 +#: ../src/roster_window.py:1895 ../src/roster_window.py:1902 +#: ../src/roster_window.py:1909 msgid "None" msgstr "Nič" -#: ../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:38 +#: ../data/glade/profile_window.glade.h:26 #: ../data/glade/zeroconf_properties_window.glade.h:17 msgid "Personal Information" msgstr "Osobné informácie" -#: ../data/glade/account_modification_window.glade.h:29 +#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/accounts_window.glade.h:39 msgid "Port: " -msgstr "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:40 msgid "Priori_ty:" msgstr "Priori_ta:" -#: ../data/glade/account_modification_window.glade.h:31 +#: ../data/glade/account_modification_window.glade.h:33 +#: ../data/glade/accounts_window.glade.h:41 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 " @@ -357,19 +415,22 @@ msgstr "" "pripojených dvaja alebo viac klientov prostredníctvom jedného účtu; Klient s " "najvyššou priritou obdrží udalosť" -#: ../data/glade/account_modification_window.glade.h:32 +#: ../data/glade/account_modification_window.glade.h:34 +#: ../data/glade/accounts_window.glade.h:42 msgid "Priority will change automatically according to your status." msgstr "Priorita sa zmení automatický podľa stavu." -#: ../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 "Zd_roj:" +#: ../data/glade/account_modification_window.glade.h:36 +#: ../data/glade/accounts_window.glade.h:44 +msgid "Resour_ce:" +msgstr "Z_droj:" -#: ../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,98 +444,152 @@ msgstr "" "so zdrojmi ako 'Doma' alebo 'V práci', v rovnakom čase. Zdroj z najvyššou " "prioritou získava udalosti (viď nižšie)" -#: ../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 "Uložiť _passfrázy (nie je bezpečné)" -#: ../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 "Uložiť _záznam z rozhovoru pre všetky účty" -#: ../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 "Poslať pakety na udržiavanie spojenia (keep-alive)" -#: ../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 "Syhch_ronizovať stav účtu s globálnym stavom" +msgstr "Synch_ronizovať stav účtu s globálnym stavom" -#: ../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_select_account_dialog.glade.h:2 +msgid "Synchronise contacts" +msgstr "Synchronizovať kontakty" + +#: ../data/glade/account_modification_window.glade.h:44 +#: ../data/glade/accounts_window.glade.h:52 msgid "Use _SSL (legacy)" msgstr "Použiť _SSL (historické dôvody)" -#: ../data/glade/account_modification_window.glade.h:42 -msgid "Use custom hostname/port" -msgstr "Použiť vlastné nastavenie server/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žiť proxy pre prenos súborov" -#: ../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 "_Upraviť stav" -#: ../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: " -msgstr "_Meno:" - -#: ../data/glade/accounts_window.glade.h:1 -msgid "Accounts" -msgstr "Účty" - -#: ../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 "" -"Ak je zaškrtnuté, všetky lokálne kontakty, ktoré používajú klienta " -"kompatibilného s Bonjour (ako iChat, Trillian alebo Gaim) budú zobrazené v " -"zozname. Nie je nutné kontaktovať Jabber server.\n" -"Toto je k dispozícii, že python-avahi je nainštalovaný a avahi-daemon beží." +#: ../data/glade/account_modification_window.glade.h:49 +msgid "_Name:" +msgstr "_Názov:" #: ../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 "" -"Ak máte dva alebo viac účtov a je zaškrtnuté, Gajim bude vypisovať všetky " -"kontakty akoby ste mali len jeden účet" +msgid "Proxy" +msgstr "Proxy" -#: ../data/glade/accounts_window.glade.h:5 +#: ../data/glade/accounts_window.glade.h:15 +#: ../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:" + +#. XML Console enable checkbutton +#: ../data/glade/accounts_window.glade.h:17 +#: ../data/glade/xml_console_window.glade.h:4 +msgid "Enable" +msgstr "Povoliť" + +#: ../data/glade/accounts_window.glade.h:18 +#: ../data/glade/zeroconf_information_window.glade.h:3 +#: ../data/glade/zeroconf_properties_window.glade.h:6 +msgid "First Name:" +msgstr "Prvé meno:" + +#: ../data/glade/accounts_window.glade.h:23 +msgid "If checked, Gajim will get the password from a GPG agent like seahorse" +msgstr "" + +#: ../data/glade/accounts_window.glade.h:28 +#: ../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 "" +"Ak vám nevyhovuje predvolený port na príjem správ, tu si môžete zvoliť " +"vlastný.\n" +"Zoberte v úvahu aj prípadné nastavenie firewallu." + +#: ../data/glade/accounts_window.glade.h:31 +#: ../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:630 +msgid "Jabber ID:" +msgstr "Jabber ID:" + +#: ../data/glade/accounts_window.glade.h:32 +#: ../data/glade/zeroconf_information_window.glade.h:5 +#: ../data/glade/zeroconf_properties_window.glade.h:14 +msgid "Last Name:" +msgstr "Posledné meno:" + +#: ../data/glade/accounts_window.glade.h:34 msgid "Mer_ge accounts" msgstr "Z_lúčiť účty" -#: ../data/glade/accounts_window.glade.h:6 -msgid "_Enable link-local messaging" -msgstr "_Povoliť link-local správy" +#. Rename +#: ../data/glade/accounts_window.glade.h:43 ../src/roster_window.py:2757 +msgid "Re_name" +msgstr "Preme_novať" -#: ../data/glade/accounts_window.glade.h:7 -msgid "_Modify" -msgstr "_Upraviť" +#: ../data/glade/accounts_window.glade.h:51 +msgid "Use GPG _Agent" +msgstr "Použit GPG _agenta" -#: ../data/glade/accounts_window.glade.h:8 -#: ../data/glade/remove_account_window.glade.h:4 -msgid "_Remove" -msgstr "_Odstrániť" +#: ../data/glade/accounts_window.glade.h:54 +#: ../data/glade/zeroconf_properties_window.glade.h:21 +msgid "Use custom port:" +msgstr "Použiť vlastný port:" + +#: ../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/accounts_window.glade.h:62 +msgid "use HTTP_PROXY environment variable" +msgstr "Použiť HTTP_PROXY premenu prostredia" #: ../data/glade/add_new_contact_window.glade.h:1 msgid "A_ccount:" -msgstr "Úč_et" +msgstr "Úč_et:" #: ../data/glade/add_new_contact_window.glade.h:2 msgid "A_llow this contact to view my status" -msgstr "P_ovoliť jemu/jej vidieť môj stav" +msgstr "P_ovoliť tomuto kontaktu vidieť môj stav" #: ../data/glade/add_new_contact_window.glade.h:3 msgid "Add New Contact" @@ -482,39 +597,35 @@ msgstr "Pridať nový kontakt" #: ../data/glade/add_new_contact_window.glade.h:4 msgid "I would like to add you to my contact list." -msgstr "Chcem si ťa pridať do môjho kontakt listu." +msgstr "Chcem si vás pridať do môjho zoznamu kontaktov." #: ../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 "" -"Je potrebné, aby ste bol(a) príhlásený(a) k tomuto transportu,\n" -"aby ste mohol(a) pridať kontakt s použitím tohoto\n" -"protokolu. Kliknite na tlačidlo registrovať, posunie vás\n" -"na ďalší krok." #: ../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 "" -"Musíte byť pripojený(á) k transportu, aby ste mohol(a)\n" +"Musíte byť pripojený k transportu, aby ste mohli\n" "pridať kontakt s použitím tohoto protokolu." #: ../data/glade/add_new_contact_window.glade.h:11 msgid "_Group:" -msgstr "_Skupina" +msgstr "_Skupina:" #: ../data/glade/add_new_contact_window.glade.h:12 msgid "_Nickname:" -msgstr "_Prezývka" +msgstr "_Prezývka:" #: ../data/glade/add_new_contact_window.glade.h:13 msgid "_Protocol:" -msgstr "_Protokol" +msgstr "_Protokol:" #: ../data/glade/add_new_contact_window.glade.h:14 msgid "_Register" @@ -525,12 +636,12 @@ msgid "_User ID:" msgstr "_Používateľské ID:" #: ../data/glade/adhoc_commands_window.glade.h:1 -msgid "An error has occured:" -msgstr "Objavila sa chyba:" +msgid "An error has occurred:" +msgstr "" #: ../data/glade/adhoc_commands_window.glade.h:2 msgid "Choose command to execute:" -msgstr "Vyberte príkaz:" +msgstr "Vyberte príkaz na vykonanie:" #: ../data/glade/adhoc_commands_window.glade.h:3 msgid "Ad-hoc Commands - Gajim" @@ -561,18 +672,17 @@ msgid "This jabber entity does not expose any commands." msgstr "Táto jabber entita neposkytuje žiadny príkaz." #: ../data/glade/advanced_configuration_window.glade.h:1 +#: ../data/glade/features_window.glade.h:1 msgid "Description" msgstr "Popis" #: ../data/glade/advanced_configuration_window.glade.h:2 -msgid "NOTE: You should restart gajim for some setting to take effect" -msgstr "" -"Poznámka: Mali by ste reštartovať Gajim, aby sa mohli zmeny " -"nastavenia aplikovať" +msgid "NOTE: You should restart Gajim for some settings to take effect" +msgstr "POZNÁMKA: Musíte reštartovať Gajim, aby boli použité zmeny" #: ../data/glade/advanced_configuration_window.glade.h:3 msgid "Advanced Configuration Editor" -msgstr "Rozšírený editor na editovanie konfigurácie" +msgstr "Editor rozšírenej konfigurácie" #: ../data/glade/advanced_configuration_window.glade.h:4 msgid "Filter:" @@ -580,55 +690,51 @@ msgstr "Filter:" #: ../data/glade/advanced_menuitem_menu.glade.h:1 msgid "Delete MOTD" -msgstr "Zmazať správu dňa (MOTD)" +msgstr "Odstrániť správu dňa" #: ../data/glade/advanced_menuitem_menu.glade.h:2 msgid "Deletes Message of the Day" -msgstr "Zmazať správy dňa" +msgstr "Odstrániť správy dňa" #: ../data/glade/advanced_menuitem_menu.glade.h:3 -msgid "Sends a message to currently connected users to this server" -msgstr "Posielať správy aktuálne pripojeným používateľom na tomto serveri" +msgid "Edit _Privacy Lists..." +msgstr "_Upraviť súkromné zoznamy..." #: ../data/glade/advanced_menuitem_menu.glade.h:4 -msgid "Set MOTD" -msgstr "Nastaviť správu dňa" +msgid "Sends a message to users currently connected to this server" +msgstr "" #: ../data/glade/advanced_menuitem_menu.glade.h:5 +msgid "Set MOTD..." +msgstr "Nastaviť správu dňa..." + +#: ../data/glade/advanced_menuitem_menu.glade.h:6 msgid "Sets Message of the Day" msgstr "Nastavovať správu dňa" -#: ../data/glade/advanced_menuitem_menu.glade.h:6 +#: ../data/glade/advanced_menuitem_menu.glade.h:7 msgid "Show _XML Console" msgstr "Zobraziť _XML konzolu" -#: ../data/glade/advanced_menuitem_menu.glade.h:7 -msgid "Update MOTD" -msgstr "Aktualizovať Správu dňa" - #: ../data/glade/advanced_menuitem_menu.glade.h:8 -msgid "Updates Message of the Day" -msgstr "Aktualizovať Správy dňa" +msgid "Update MOTD..." +msgstr "Aktualizovať správu dňa..." #: ../data/glade/advanced_menuitem_menu.glade.h:9 +msgid "Updates Message of the Day" +msgstr "Aktualizovať správy dňa" + +#: ../data/glade/advanced_menuitem_menu.glade.h:10 msgid "_Administrator" msgstr "_Administrátor" -#: ../data/glade/advanced_menuitem_menu.glade.h:10 -msgid "_Privacy Lists" -msgstr "_Súkromný zoznam" - #: ../data/glade/advanced_menuitem_menu.glade.h:11 -msgid "_Send Server Message" -msgstr "_Poslať serverovú správu" - -#: ../data/glade/advanced_menuitem_menu.glade.h:12 -msgid "_Send Single Message" -msgstr "_Poslať krátku správu" +msgid "_Send Server Message..." +msgstr "_Poslať serverovú správu..." #: ../data/glade/advanced_notifications_window.glade.h:1 msgid " a window/tab opened with that contact " -msgstr "Okno alebo záložka otvorená pre tento kontakt" +msgstr "okno/karta bola otvorená s týmto kontaktom " #: ../data/glade/advanced_notifications_window.glade.h:2 msgid "Actions" @@ -639,41 +745,41 @@ msgid "Conditions" msgstr "Podmienky" #: ../data/glade/advanced_notifications_window.glade.h:4 -#: ../data/glade/preferences_window.glade.h:10 +#: ../data/glade/preferences_window.glade.h:13 msgid "Sounds" msgstr "Zvuky" #: ../data/glade/advanced_notifications_window.glade.h:5 msgid "Advanced Actions" -msgstr "Rozšírené akcie" +msgstr "Pokročilé akcie" #: ../data/glade/advanced_notifications_window.glade.h:6 msgid "Advanced Notifications Control" -msgstr "Rozšírené nastavenie upozornení" +msgstr "Pokročilé nastavenie upozornení" #: ../data/glade/advanced_notifications_window.glade.h:7 msgid "All statuses" msgstr "Všetky stavy" #: ../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 "Preč" #: ../data/glade/advanced_notifications_window.glade.h:9 msgid "Busy " -msgstr "Zaneprázdnený(á)" +msgstr "Zaneprázdnený" #: ../data/glade/advanced_notifications_window.glade.h:10 msgid "Don't have " -msgstr "Nemá" +msgstr "Nemá " #: ../data/glade/advanced_notifications_window.glade.h:11 msgid "Have " msgstr "Má" #: ../data/glade/advanced_notifications_window.glade.h:12 -#: ../src/common/helpers.py:244 +#: ../src/common/helpers.py:265 msgid "Invisible" msgstr "Neviditeľný" @@ -682,7 +788,7 @@ msgid "Launch a command" msgstr "Vykonať príkaz" #: ../data/glade/advanced_notifications_window.glade.h:14 -#: ../src/common/helpers.py:217 +#: ../src/common/helpers.py:238 msgid "Not Available" msgstr "Neprítomný" @@ -692,7 +798,7 @@ msgstr "Jeden alebo viac špeciálnych stavov..." #: ../data/glade/advanced_notifications_window.glade.h:16 msgid "Online / Free For Chat" -msgstr "Mám čas na debatu" +msgstr "Prítomný / Mám čas na debatu" #: ../data/glade/advanced_notifications_window.glade.h:17 msgid "Play a sound" @@ -701,129 +807,115 @@ msgstr "Prehrať zvuk" #: ../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 "" -"Prijať správu\n" -"Kontakt pripojený \n" -"Kontakt odpojený \n" +"Prijatá správa\n" +"Kontakt sa odhlásil \n" "Kontakt zmenil stav \n" -"Zvýraznenie správ v diskusnej skupine \n" -"Prijatá správa do diskusnej skupiny \n" -"Požiadavka na prenos súboru \n" -"Začiatok prenosu súboru \n" -"Ukončenie prenosu súboru" +"Správa diskusnej skupiny zvýraznená \n" +"Správa diskusnej skupiny prijatá \n" +"Požiadavka k prenosu súboru \n" +"Prenos súboru začal \n" +"Prenos súboru dokončený" -#: ../data/glade/advanced_notifications_window.glade.h:27 +#: ../data/glade/advanced_notifications_window.glade.h:26 msgid "When " msgstr "Kedy" -#: ../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 "" "_Aktivovať vlastnosť urgentného upozornenia - okno v zozname úloh bude blikať" -#: ../data/glade/advanced_notifications_window.glade.h:29 +#: ../data/glade/advanced_notifications_window.glade.h:28 msgid "_Disable auto opening chat window" msgstr "_Vypnúť automatické otváranie diskusných okien" -#: ../data/glade/advanced_notifications_window.glade.h:30 +#: ../data/glade/advanced_notifications_window.glade.h:29 msgid "_Disable existing popup window" -msgstr "_Vypnúť existujúce vyskakovacie okná (popup)" +msgstr "_Vypnúť existujúce vyskakovacie okná" -#: ../data/glade/advanced_notifications_window.glade.h:31 +#: ../data/glade/advanced_notifications_window.glade.h:30 msgid "_Disable existing sound for this event" msgstr "_Vypnúť zvuky pre túto udalosť" -#: ../data/glade/advanced_notifications_window.glade.h:32 +#: ../data/glade/advanced_notifications_window.glade.h:31 msgid "_Disable showing event in roster" msgstr "_Vypnúť zobrazovanie udalostí v zozname" -#: ../data/glade/advanced_notifications_window.glade.h:33 +#: ../data/glade/advanced_notifications_window.glade.h:32 msgid "_Disable showing event in systray" msgstr "_Vypnúť zobrazovanie udalostí v oblasti systémových upozornení" -#: ../data/glade/advanced_notifications_window.glade.h:34 +#: ../data/glade/advanced_notifications_window.glade.h:33 msgid "_Inform me with a popup window" -msgstr "_Informovať ma pomocou vyskakovacieho okna (popup)" +msgstr "_Informovať ma pomocou vyskakovacieho okna" + +#: ../data/glade/advanced_notifications_window.glade.h:34 +msgid "_Open chat window with user" +msgstr "_Otvoriť okno rozhovoru s používateľom" #: ../data/glade/advanced_notifications_window.glade.h:35 -msgid "_Open chat window with user" -msgstr "_Otvoriť diskusné okno" - -#: ../data/glade/advanced_notifications_window.glade.h:36 msgid "_Show event in roster" msgstr "_Zobraziť udalosť v zozname" -#: ../data/glade/advanced_notifications_window.glade.h:37 +#: ../data/glade/advanced_notifications_window.glade.h:36 msgid "_Show event in systray" msgstr "_Zobraziť udalosť v oblasti systémových upozornení" -#: ../data/glade/advanced_notifications_window.glade.h:38 +#: ../data/glade/advanced_notifications_window.glade.h:37 msgid "and I " msgstr "a ja" -#: ../data/glade/advanced_notifications_window.glade.h:39 +#: ../data/glade/advanced_notifications_window.glade.h:38 msgid "" "contact(s)\n" "group(s)\n" "everybody" msgstr "" -"contact(s)\n" -"group(s)\n" -"everybody" +"kontakt(y)\n" +"skupina(y)\n" +"všetci" + +#: ../data/glade/advanced_notifications_window.glade.h:41 +msgid "for " +msgstr "pre " #: ../data/glade/advanced_notifications_window.glade.h:42 -msgid "for " -msgstr "pre" - -#: ../data/glade/advanced_notifications_window.glade.h:43 msgid "when I'm in" msgstr "keď som v" #: ../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 a Júlia" - -#: ../data/glade/atom_entry_window.glade.h:3 msgid "Entry:" msgstr "Záznam:" -#: ../data/glade/atom_entry_window.glade.h:4 +#: ../data/glade/atom_entry_window.glade.h:2 msgid "Feed name:" msgstr "Názov kanálu:" -#: ../data/glade/atom_entry_window.glade.h:5 +#: ../data/glade/atom_entry_window.glade.h:3 msgid "Last modified:" msgstr "Posledná zmena:" -#: ../data/glade/atom_entry_window.glade.h:6 +#: ../data/glade/atom_entry_window.glade.h:4 msgid "New entry received" msgstr "Prijatý nový záznam" -#: ../data/glade/atom_entry_window.glade.h:7 -msgid "Old stories" -msgstr "Staré príbehy" - -#: ../data/glade/atom_entry_window.glade.h:8 -msgid "Soliloquy" -msgstr "Monológ" - -#: ../data/glade/atom_entry_window.glade.h:9 +#: ../data/glade/atom_entry_window.glade.h:5 msgid "You have received new entry:" msgstr "Dostali ste novú položku:" +#: ../data/glade/blocked_contacts_window.glade.h:1 +msgid "Blocked Contacts" +msgstr "Blokované kontakty" + #: ../data/glade/change_password_dialog.glade.h:1 msgid "Change Password" msgstr "Zmeniť heslo" @@ -842,7 +934,7 @@ msgstr "Zadajte vašu novú správu o stave" #: ../data/glade/change_status_message_dialog.glade.h:2 msgid "Preset messages:" -msgstr "Prdnastavené správy" +msgstr "Prednastavené správy:" #: ../data/glade/change_status_message_dialog.glade.h:3 msgid "Save as Preset..." @@ -853,30 +945,27 @@ msgid "Join _Group Chat" msgstr "_Pripojiť sa k diskusnej skupine" #: ../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 "_Pridať do zoznamu" +#: ../data/glade/roster_contact_context_menu.glade.h:12 +msgid "_Add to Roster..." +msgstr "_Pridať do zoznamu..." #: ../data/glade/chat_context_menu.glade.h:3 msgid "_Copy JID/Email Address" -msgstr "_Skopírovať JID/E-mailovú adresu" +msgstr "_Kopírovať JID/e-mailovú adresu" #: ../data/glade/chat_context_menu.glade.h:4 msgid "_Copy Link Location" -msgstr "_Skopírovať odkaz" +msgstr "_Kopírovať odkaz" #: ../data/glade/chat_context_menu.glade.h:5 msgid "_Open Email Composer" -msgstr "_Otvoriť nový e-mail" +msgstr "" #: ../data/glade/chat_context_menu.glade.h:6 msgid "_Open Link in Browser" -msgstr "_Otvoriť vo web prehliadači" +msgstr "_Otvoriť v internetovom prehliadač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" @@ -887,28 +976,60 @@ msgid "Click to see past conversations with this contact" msgstr "Kliknite pre zobrazenie poslednej konverzácie s kontaktom" #: ../data/glade/chat_control_popup_menu.glade.h:2 -#: ../data/glade/roster_contact_context_menu.glade.h:8 +msgid "Invite _Contacts" +msgstr "Pozvať _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 "Poslať _súbor" -#: ../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 "Prepnúť na End to End šifrovanie" + +#: ../data/glade/chat_control_popup_menu.glade.h:5 msgid "Toggle Open_PGP Encryption" msgstr "Zapnúť Open_PGP šifrovanie" -#: ../data/glade/chat_control_popup_menu.glade.h:5 -#: ../data/glade/gc_control_popup_menu.glade.h:6 -msgid "_Compact View Alt+C" -msgstr "_Kompaktný pohľad Alt+C" - #: ../data/glade/chat_control_popup_menu.glade.h:6 +#: ../data/glade/gc_occupants_menu.glade.h:4 +msgid "_Add to Roster" +msgstr "_Pridať do zoznamu" + +#: ../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:20 #: ../data/glade/zeroconf_contact_context_menu.glade.h:6 +#: ../src/roster_window.py:2617 msgid "_History" msgstr "_História" +#: ../data/glade/chat_to_muc_window.glade.h:1 +msgid "In_vite" +msgstr "Poz_vať" + +#: ../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 server" + +#: ../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 "" + #: ../data/glade/data_form_window.glade.h:1 msgid "Fill in the form." msgstr "Vyplňte formulár." @@ -921,6 +1042,14 @@ msgstr "Konfigurácia miestnosti" msgid "Edit Groups" msgstr "Upraviť skupiny" +#: ../data/glade/features_window.glade.h:2 +msgid "List of possible features in Gajim:" +msgstr "Zoznam možných funkcií v Gajim:" + +#: ../data/glade/features_window.glade.h:3 +msgid "Features" +msgstr "Funkcie" + #: ../data/glade/filetransfers.glade.h:1 msgid "A list of active, completed and stopped file transfers" msgstr "Zoznam aktívnych, dokončených a zastavených prenosov súborov" @@ -939,7 +1068,7 @@ msgstr "Zrušiť prenos vybraných súborov a odstrániť nekompletné súbory" #: ../data/glade/filetransfers.glade.h:5 msgid "Clean _up" -msgstr "_Vyčistiť" +msgstr "Vyč_istiť" #: ../data/glade/filetransfers.glade.h:6 msgid "File Transfers" @@ -951,15 +1080,15 @@ msgstr "Skrývanie okien" #: ../data/glade/filetransfers.glade.h:8 msgid "Remove file transfer from the list." -msgstr "Odstrániť prenos súboru zo zoznamu" +msgstr "Odstrániť prenos súboru zo zoznamu." #: ../data/glade/filetransfers.glade.h:9 -msgid "Removes completed, canceled and failed file transfers from the list" -msgstr "Odstrániť dokončené, zrušené a neúspešné prenosy súborov zo zoznamu" +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" -msgstr "Zobraziť zoznam súborov prenesených medzi vami a ostatnými" +msgid "Shows a list of file transfers between you and others" +msgstr "" #: ../data/glade/filetransfers.glade.h:11 msgid "" @@ -971,23 +1100,23 @@ msgstr "" #: ../data/glade/filetransfers.glade.h:12 msgid "When a file transfer is complete show a popup notification" -msgstr "Keď je prenos súboru dokončené zobraziť popup upozornenie" +msgstr "Keď je prenos súboru dokončený zobraziť vyskakovacie upozornenie" -#: ../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 "_Pokračovať" #: ../data/glade/filetransfers.glade.h:14 msgid "_Notify me when a file transfer is complete" -msgstr "_Upozorni ma, keď sa dokončí prenos" +msgstr "_Upozorniť ma, keď sa dokončí prenos" -#: ../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 "_Otvoriť adresár" +msgstr "_Otvoriť priečinok s obsahom" #: ../data/glade/filetransfers.glade.h:16 msgid "_Pause" -msgstr "_Pauza" +msgstr "_Pozastaviť" #: ../data/glade/filetransfers.glade.h:17 msgid "file transfers list" @@ -995,7 +1124,7 @@ msgstr "zoznam prenosu súborov" #: ../data/glade/gajim_themes_window.glade.h:1 msgid "Chatstate Tab Colors" -msgstr "Farby záložiek diskusného okna" +msgstr "Farby kariet diskusného okna" #: ../data/glade/gajim_themes_window.glade.h:2 msgid "" @@ -1023,11 +1152,11 @@ msgstr "Štýl fontu:" #: ../data/glade/gajim_themes_window.glade.h:9 msgid "Gajim Themes Customization" -msgstr "Úprava tém Gajimu" +msgstr "Úprava tém Gajim" #: ../data/glade/gajim_themes_window.glade.h:10 msgid "Gone" -msgstr "Preč" +msgstr "Minulé" #: ../data/glade/gajim_themes_window.glade.h:11 msgid "Inactive" @@ -1050,12 +1179,12 @@ msgid "" "MUC Directed\n" "Messages" msgstr "" -"MUC\n" -"Správy" +"MUC prichádzajúce\n" +"správy" #: ../data/glade/gajim_themes_window.glade.h:17 msgid "Paused" -msgstr "Pauza" +msgstr "Pozastavené" #: ../data/glade/gajim_themes_window.glade.h:18 msgid "Text _color:" @@ -1063,65 +1192,77 @@ msgstr "Farba _textu:" #: ../data/glade/gajim_themes_window.glade.h:19 msgid "Text _font:" -msgstr "_Písmo:" +msgstr "Farba _písma:" #: ../data/glade/gajim_themes_window.glade.h:20 msgid "_Background:" msgstr "_Pozadie:" #: ../data/glade/gc_control_popup_menu.glade.h:1 -msgid "Change _Nickname" -msgstr "Zmeniť _prezývku" +msgid "Change _Nickname..." +msgstr "Zmeniť p_rezývku..." #: ../data/glade/gc_control_popup_menu.glade.h:2 -msgid "Change _Subject" -msgstr "Zrušiť _predmet" +msgid "Change _Subject..." +msgstr "Zmeniť _predmet..." #: ../data/glade/gc_control_popup_menu.glade.h:3 msgid "Click to see past conversation in this room" msgstr "Kliknite pre zobrazenie predchádzajúcej konverzácie v miestnosti" #: ../data/glade/gc_control_popup_menu.glade.h:4 -msgid "Configure _Room" -msgstr "Nastaviť _miestnosť" +msgid "Configure _Room..." +msgstr "Nastaviť _miestnosť..." #: ../data/glade/gc_control_popup_menu.glade.h:5 -msgid "_Bookmark This Room" -msgstr "_Uložiť do záložiek túto miestnosť" +msgid "_Bookmark" +msgstr "Zálož_ky" + +#: ../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 "S_pravovať miestnosť" + +#: ../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:3 +#: ../data/glade/gc_occupants_menu.glade.h:2 +msgid "Occupant Actions" +msgstr "" + +#: ../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 "_Zakázať" -#: ../data/glade/gc_occupants_menu.glade.h:6 +#: ../data/glade/gc_occupants_menu.glade.h:8 msgid "_Kick" msgstr "_Vykopnúť" -#: ../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 "_Akcie člena" - -#: ../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 "_Poslať súkromnú správu" -#: ../data/glade/gc_occupants_menu.glade.h:11 +#: ../data/glade/gc_occupants_menu.glade.h:12 msgid "_Voice" msgstr "_Hlas" @@ -1129,69 +1270,107 @@ msgstr "_Hlas" msgid "Create new post" msgstr "Vytvoriť novú správu" -#: ../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 "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:164 +#: ../src/history_manager.py:195 msgid "Subject" msgstr "Predmet" #: ../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 "" -"Víta vás Gajim - správca histórie\n" -"\n" -"Môžete si vybrať záznam z ľava, prípadne prehľadať databázu (dole).\n" -"\n" -"Poznámka: Ak máte v pláne rozsiahlejšie mazanie, prosím uistite sa, " -"že Gajim nebeží." +"UPOZORNENIE:\n" +"Ak plánujete rozsiahlejšie odstraňovanie, uistite sa prosím, že Gajim " +"nebeží. Spravidla sa vyvarujte odstraňovaniu v kontaktoch, s ktorými " +"prebieha rozhovor." -#: ../data/glade/history_manager.glade.h:7 +#: ../data/glade/history_manager.glade.h:3 +msgid "Welcome to Gajim History Logs Manager" +msgstr "Vitajte v Gajim správca histórie" + +#: ../data/glade/history_manager.glade.h:4 msgid "Delete" -msgstr "Zmazať" +msgstr "Odstrániť" -#: ../data/glade/history_manager.glade.h:8 +#: ../data/glade/history_manager.glade.h:5 msgid "Export" -msgstr "Export" +msgstr "Exportovať" -#: ../data/glade/history_manager.glade.h:9 +#: ../data/glade/history_manager.glade.h:6 msgid "Gajim History Logs Manager" msgstr "Gajim - správca histórie" +#: ../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 "" +"Tento správca záznamov nie je určený k prezeraniu záznamov. Ak hľadáte " +"lepšiu funkčnosť, použite na to určené okno histórie.\n" +"\n" +"Použite tento program k odstráneniu alebo exportovaniu záznamov. Môžete " +"vybrať záznam z ľava a/alebo dole hľadať v databáze." + #: ../data/glade/history_manager.glade.h:10 msgid "_Search Database" msgstr "_Hľadať v databáze" #: ../data/glade/history_window.glade.h:1 -msgid "Build custom query" -msgstr "Vytvoriť vlastnú požiadavku" +msgid "History Viewer" +msgstr "Prehliadač histórie" #: ../data/glade/history_window.glade.h:2 +msgid "JID Selection" +msgstr "Výber 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 "" + +#: ../data/glade/history_window.glade.h:5 ../src/history_window.py:224 msgid "Conversation History" msgstr "História konverzácie" -#: ../data/glade/history_window.glade.h:3 -msgid "Query Builder..." -msgstr "Zostaviť požiadavku..." +#: ../data/glade/history_window.glade.h:6 +msgid "" +"Current History\n" +"All Chat Histories" +msgstr "" +"Aktuálna história\n" +"História všetkých rozhovorov" -#: ../data/glade/history_window.glade.h:4 +#: ../data/glade/history_window.glade.h:8 +#: ../data/glade/search_window.glade.h:2 msgid "Search" msgstr "Hľadať" -#: ../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ória _konverzácie" + +#: ../data/glade/history_window.glade.h:10 +#: ../data/glade/search_window.glade.h:5 ../src/disco.py:1181 msgid "_Search" msgstr "_Hľadať" +#: ../data/glade/history_window.glade.h:11 +msgid "in" +msgstr "v" + #: ../data/glade/invitation_received_dialog.glade.h:1 msgid "Accept" msgstr "Prijať" @@ -1205,39 +1384,43 @@ msgstr "Zakázať" msgid "Invitation Received" msgstr "Prijaté pozvanie" -#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1146 +#: ../data/glade/join_groupchat_window.glade.h:1 ../src/dialogs.py:1504 msgid "Join Group Chat" msgstr "Pripojiť sa k diskusnej skupine" #: ../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 "Prezývka:" +msgid "Join this room automatically when I connect" +msgstr "Prihlásiť sa do miestnosti automaticky, keď sa pripojím" #: ../data/glade/join_groupchat_window.glade.h:3 #: ../data/glade/manage_bookmarks_window.glade.h:5 -msgid "Password:" -msgstr "Heslo" +#: ../data/glade/profile_window.glade.h:24 +#: ../data/glade/vcard_information_window.glade.h:31 +msgid "Nickname:" +msgstr "Prezývka:" #: ../data/glade/join_groupchat_window.glade.h:4 +#: ../data/glade/manage_bookmarks_window.glade.h:6 +msgid "Password:" +msgstr "Heslo:" + +#: ../data/glade/join_groupchat_window.glade.h:5 msgid "Recently:" msgstr "Posledné:" -#: ../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 "Miestnosť:" -#: ../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:1169 +#: ../src/disco.py:1590 msgid "_Join" msgstr "_Pripojiť" #: ../data/glade/manage_accounts_window.glade.h:1 msgid "Manage Accounts" -msgstr "Upraviť účty" +msgstr "Spravovať účty" #: ../data/glade/manage_bookmarks_window.glade.h:1 msgid "Auto join" @@ -1249,61 +1432,77 @@ msgstr "Ak je zaškrtnuté, Gajim sa pripojí do diskusnej skupiny pri štarte" #: ../data/glade/manage_bookmarks_window.glade.h:3 msgid "Manage Bookmarks" -msgstr "Upraviť záložky" +msgstr "Spravovať 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 "Minimalizovať pri automatickom pripojení" + +#: ../data/glade/manage_bookmarks_window.glade.h:7 msgid "Print status:" msgstr "Vypísať 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:" +msgstr "Titulok:" #: ../data/glade/manage_proxies_window.glade.h:1 msgid "Properties" -msgstr "Vlastnosti" +msgstr "Predvoľby" #: ../data/glade/manage_proxies_window.glade.h:2 msgid "Settings" msgstr "Nastavenia" #: ../data/glade/manage_proxies_window.glade.h:3 -msgid "HTTP Connect" -msgstr "HTTP spojenie" - -#: ../data/glade/manage_proxies_window.glade.h:4 -msgid "Manage Proxy Profiles" -msgstr "Upraviť Proxy nastavenia" +msgid "" +"HTTP Connect\n" +"SOCKS5" +msgstr "" +"HTTP pripojenie\n" +"SOCKS5" #: ../data/glade/manage_proxies_window.glade.h:5 -#: ../data/glade/profile_window.glade.h:22 -#: ../data/glade/vcard_information_window.glade.h:28 +msgid "Manage Proxy Profiles" +msgstr "Spravovať Proxy profily" + +#: ../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 "Meno:" #: ../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:" -#: ../data/glade/manage_proxies_window.glade.h:8 +#: ../data/glade/manage_proxies_window.glade.h:9 msgid "Use authentication" -msgstr "Použiť autentifikáciu" +msgstr "Použiť overenie" + +#: ../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 pre vloženie emotikonu (Alt+M)" +msgstr "Kliknite pre vloženie smajlíka (Alt+M)" -#: ../data/glade/message_window.glade.h:2 ../src/chat_control.py:1104 +#: ../data/glade/message_window.glade.h:2 msgid "OpenPGP Encryption" msgstr "OpenPGP šifrovanie" #. 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:13 #: ../data/glade/subscription_request_window.glade.h:6 msgid "_Actions" msgstr "_Akcie" @@ -1311,7 +1510,7 @@ msgstr "_Akcie" #. 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 "_Poslať" @@ -1327,40 +1526,56 @@ msgstr "Editor rozšírenej konfigurácie" msgid "Applications" msgstr "Aplikácie" +#: ../data/glade/preferences_window.glade.h:3 +msgid "Chat Appearance" +msgstr "Vzhľad rozhovoru" + #. 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 "Vlastné" -#: ../data/glade/preferences_window.glade.h:5 -msgid "Format of a line" -msgstr "Formát riadku rozhovoru" - #: ../data/glade/preferences_window.glade.h:6 -msgid "GMail Options" -msgstr "Nastavenia GMail" +msgid "Format of a line" +msgstr "Formát riadku" #: ../data/glade/preferences_window.glade.h:7 -msgid "Interface Customization" -msgstr "Úprava rozhrania" +msgid "GMail Options" +msgstr "Nastavenia GMail" #: ../data/glade/preferences_window.glade.h:9 msgid "Preset Status Messages" msgstr "Vrátiť pôvodnú správu o stave" +#: ../data/glade/preferences_window.glade.h:10 +msgid "Privacy" +msgstr "Súkromie" + #: ../data/glade/preferences_window.glade.h:11 +msgid "Publish Personal Events" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:12 +msgid "Roster Appearance" +msgstr "Vzhľad zoznamu" + +#: ../data/glade/preferences_window.glade.h:14 +msgid "Subscribe to Personal Events" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:15 +msgid "Themes" +msgstr "Témy" + +#: ../data/glade/preferences_window.glade.h:16 msgid "Visual Notifications" msgstr "Vizuálne upozornenie" -#: ../data/glade/preferences_window.glade.h:12 -msgid "A_fter nickname:" -msgstr "Po _prezývke:" - -#: ../data/glade/preferences_window.glade.h:13 +#: ../data/glade/preferences_window.glade.h:17 msgid "Advanced" -msgstr "Rozšírené" +msgstr "Pokročilé" -#: ../data/glade/preferences_window.glade.h:14 +#: ../data/glade/preferences_window.glade.h:18 msgid "" "All chat states\n" "Composing only\n" @@ -1370,124 +1585,130 @@ msgstr "" "Len pri písaní\n" "Vypnuté" -#: ../data/glade/preferences_window.glade.h:17 +#: ../data/glade/preferences_window.glade.h:21 msgid "Allow _OS information to be sent" msgstr "Povoliť _odosielanie informácie o operačnom systéme" -#: ../data/glade/preferences_window.glade.h:18 +#: ../data/glade/preferences_window.glade.h:22 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "" -"Povoliť popup/upozornenia v stavoch _preč/nedostupný/zamestnaný/neviditeľný" +"Povoliť vyskakovacie okná/upozornenia v stavoch _preč/nedostupný/zamestnaný/" +"neviditeľný" -#: ../data/glade/preferences_window.glade.h:19 -msgid "Also known as iChat style" -msgstr "Tiež známy ako iChat štýl" +#: ../data/glade/preferences_window.glade.h:23 +msgid "Always check to see if Gajim is the _default Jabber client on startup" +msgstr "" +"Vždy kontrolovať pri spustení, či je Gajim štan_dartným Jabber klientom" -#: ../data/glade/preferences_window.glade.h:20 +#: ../data/glade/preferences_window.glade.h:24 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 "" -"Príklad: Ak máte nastavenú správu pre stav Preč, Gajim nebude od nikoho " -"požadovať informáciu o stave, v prípade, váš stav nastavíte na Preč; Použije " -"predvolené nastavenie." +"Napríklad: Ak máte nastavenú správu pre stav preč, Gajim nebude od nikoho " +"požadovať informáciu o stave, v prípade, že váš stav nastavíte na preč; " +"použije sa predvolené nastavenie." -#: ../data/glade/preferences_window.glade.h:21 +#: ../data/glade/preferences_window.glade.h:25 msgid "Ask status message when I:" msgstr "Vyžiadať správu o stave, keď som:" -#: ../data/glade/preferences_window.glade.h:22 +#: ../data/glade/preferences_window.glade.h:26 msgid "Auto _away after:" msgstr "Automaticky _preč po:" -#: ../data/glade/preferences_window.glade.h:23 +#: ../data/glade/preferences_window.glade.h:27 msgid "Auto _not available after:" -msgstr "Automaticky _neprítomný(á) po:" +msgstr "Automaticky _neprítomný po:" -#: ../data/glade/preferences_window.glade.h:24 +#: ../data/glade/preferences_window.glade.h:28 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 "" -"Automaticky zistiť pri každom štarte Gajim-u\n" -"Vždy použiť aplikácie prostredia GNOME ako predvolené\n" -"Vždy použiť aplikácie prostredia KDE ako predvolené\n" -"Vždy použiť aplikácie prostredia XFCE4 ako predvolené\n" +"Automaticky zistiť pri každom štarte Gajim\n" +"Vždy použiť štandartné aplikácie GNOME\n" +"Vždy použiť štandartné aplikácie KDE\n" +"Vždy použiť štandartné aplikácie Xfce\n" "Vlastné" -#: ../data/glade/preferences_window.glade.h:29 -msgid "B_efore nickname:" -msgstr "_Pred prezývkou:" - -#: ../data/glade/preferences_window.glade.h:30 ../src/chat_control.py:844 -msgid "Chat" -msgstr "Rozhovor" - -#: ../data/glade/preferences_window.glade.h:31 +#: ../data/glade/preferences_window.glade.h:33 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 "" -"Povoľte túto možnosť len v prípade, že niekto, koho nemáte v zozname vás " -"spamuje/otravuje. Použitím tejto možnosti zablokujete všetky správy od " -"kohokoľvek, koho nemáte v zozname." - -#: ../data/glade/preferences_window.glade.h:32 -msgid "Configure color and font of the interface" -msgstr "Konfigurácia farby a písma pre vaša rozhranie" - -#: ../data/glade/preferences_window.glade.h:33 -msgid "Default Status Messages" -msgstr "Východzia správa o stave" +"Zaškrtnite túto voľbu, len ak chcete, aby ste nemali v zozname spammerov/" +"anonymov. Použije upozornenie, pretože to blokuje všetky správy od " +"hocijakých kontaktov, ktoré nie sú v zozname." #: ../data/glade/preferences_window.glade.h:34 -msgid "Default status _iconset:" -msgstr "Základná sada _ikoniek:" +msgid "Configure color and font of the interface" +msgstr "Nastavovať farbu a písmo rozhrania" #: ../data/glade/preferences_window.glade.h:35 -msgid "Display _extra email details" -msgstr "Zobraziť ďalši_e detaily o emaile" +msgid "Default Status Messages" +msgstr "Štandartná správa o stave" #: ../data/glade/preferences_window.glade.h:36 +msgid "" +"Detached roster with detached chats\n" +"Detached roster with single chat\n" +"Single window for everything\n" +"Detached roster with chat grouped by account\n" +"Detached roster with chat grouped by type" +msgstr "" +"Oddelený zoznam od oddelených rozhovorov\n" +"Oddelený zoznam od spojených rozhovorov\n" +"Spoločné okno pre všetko\n" +"Oddelený zoznam od spojených rozhovorov podľa účtu\n" +"Oddelený zoznam od spojených rozhovorov podľa typu" + +#: ../data/glade/preferences_window.glade.h:41 +msgid "" +"Determined by sender\n" +"Chat message\n" +"Single message" +msgstr "" +"Rozhodnúť podľa odosielateľa\n" +"Správu rozhovoru\n" +"Krátku správu" + +#: ../data/glade/preferences_window.glade.h:44 +msgid "Display _extra email details" +msgstr "Zobraziť ďalši_e detaily o e-maile" + +#: ../data/glade/preferences_window.glade.h:45 msgid "Display a_vatars of contacts in roster" -msgstr "Zobraziť a_vatarov zozname kontaktov" +msgstr "Zobraziť a_vatary v zozname kontaktov" -#: ../data/glade/preferences_window.glade.h:37 +#: ../data/glade/preferences_window.glade.h:46 msgid "Display status _messages of contacts in roster" -msgstr "Zobraziť stavovú _informáciu zozname kontaktov" +msgstr "Zobraziť stavovú _informáciu kontaktov v zozname kontaktov" -#: ../data/glade/preferences_window.glade.h:38 -msgid "Displayed Chat state noti_fications:" -msgstr "Zobrazený stav diskusie:" - -#: ../data/glade/preferences_window.glade.h:39 -msgid "E_very 5 minutes" -msgstr "Každých 5 _minút" - -#: ../data/glade/preferences_window.glade.h:40 +#: ../data/glade/preferences_window.glade.h:47 msgid "Emoticons:" msgstr "Emotikony:" -#: ../data/glade/preferences_window.glade.h:41 +#: ../data/glade/preferences_window.glade.h:48 msgid "Events" msgstr "Udalosti" -#: ../data/glade/preferences_window.glade.h:42 +#: ../data/glade/preferences_window.glade.h:49 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " "display in chat windows." msgstr "" "Gajim môže odoslať a prijať meta-informácie vzťahujúce sa ku konverzácii s " -"inou osobou. Tu môžete vybrať stavy, o ktorých majú byť zobrazované v " -"diskusnom okne." +"inou osobou. Tu môžete vybrať stavy, ktoré majú byť zobrazované v diskusnom " +"okne." -#: ../data/glade/preferences_window.glade.h:43 +#: ../data/glade/preferences_window.glade.h:50 msgid "" "Gajim can send and receive meta-information related to a conversation you " "may have with a contact. Here you can specify which chatstates you want to " @@ -1497,28 +1718,7 @@ msgstr "" "vašim kontaktom. Tu môžete vybrať stavy, o ktorých majú byť odosielané " "informácie druhej strane." -#: ../data/glade/preferences_window.glade.h:44 -msgid "" -"Gajim will automatically show new events by poping up the relative window" -msgstr "Gajim automaticky zobrazí novo prijaté správy v pop-up okne" - -#: ../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 vás bude upozorňovať na nové udalosti prostredníctvom popup v pravej " -"spodnej časti obrazovky" - -#: ../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 vás bude upozorňovať cez popup v pravej spodnej časti obrazovky o " -"kontaktoch, ktoré sa práve pripojili" - -#: ../data/glade/preferences_window.glade.h:47 +#: ../data/glade/preferences_window.glade.h:51 msgid "" "Gajim will notify you via a popup window in the bottom right of the screen " "about contacts that just signed out" @@ -1526,18 +1726,18 @@ msgstr "" "Gajim vás bude upozorňovať popup v pravej spodnej časti obrazovky na " "kontakty, ktoré sa práve odpojili" -#: ../data/glade/preferences_window.glade.h:48 -msgid "" -"Gajim will only change the icon of the contact that triggered the new event" -msgstr "Gajim bude len meniť ikony kontaktov, ktoré spustili novú udalosť" +#: ../data/glade/preferences_window.glade.h:53 +msgid "Hides buttons in chatwindows to " +msgstr "" -#: ../data/glade/preferences_window.glade.h:50 +#: ../data/glade/preferences_window.glade.h:54 msgid "" "If checked, Gajim will also include information about the sender of the new " "emails" -msgstr "Ak je zapnuté, Gajim pridá informácie o odosielateľovi do novej správy" +msgstr "" +"Ak je zaškrtnuté, Gajim pridá informácie o odosielateľovi do novej správy" -#: ../data/glade/preferences_window.glade.h:51 +#: ../data/glade/preferences_window.glade.h:55 msgid "" "If checked, Gajim will display avatars of contacts in roster window and in " "group chats" @@ -1545,7 +1745,7 @@ msgstr "" "Ak je zaškrtnuté, Gajim bude zobrazovať avatarov v zozname kontaktov a v " "oknách s diskusnými skupinami." -#: ../data/glade/preferences_window.glade.h:52 +#: ../data/glade/preferences_window.glade.h:56 msgid "" "If checked, Gajim will display status messages of contacts under the contact " "name in roster window and in group chats" @@ -1553,157 +1753,151 @@ msgstr "" "Ak je zaškrtnuté, Gajim bude zobrazovať správu o stave kontaktov pod menom v " "zozname kontaktov a v oknách s diskusnými skupinami" -#: ../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 "" -"Ak je zaškrtnuté, Gajim si bude pamätať pozície a veľkosť zoznamu a " -"diskusných okien na obrazovke a pri ďalšom spustení ich znova nastaví" - -#: ../data/glade/preferences_window.glade.h:54 +#: ../data/glade/preferences_window.glade.h:57 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 "" -"Ak je zaškrtnuté, Gajim bude používať ikonky špecifické pre protokol. (Napr. " -"kontakt z MSN bude mať ekvivalentné ikonky pre stavy online, preč, " +"Ak je zaškrtnuté, Gajim bude používať ikonky špecifické pre protokol. (napr. " +"kontakt z MSN bude mať ekvivalentné ikonky pre stavy prítomný, preč, " "zaneprázdnený, atď...)" -#: ../data/glade/preferences_window.glade.h:55 +#: ../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 "" -"Ak nie je zaškrtnuté, Gajim nahradí ascii emotikony ako ':)' ekvivalentným " +"Ak nie je vypnuté, Gajim nahradí ascii emotikony ako ':)' ekvivalentným " "grafickým obrázkom" -#: ../data/glade/preferences_window.glade.h:56 +#: ../data/glade/preferences_window.glade.h:59 msgid "Ignore rich content in incoming messages" msgstr "Ignorovať rozšírený obsah prichádzajúcich správ" -#: ../data/glade/preferences_window.glade.h:57 +#: ../data/glade/preferences_window.glade.h:60 msgid "Ma_nage..." -msgstr "U_praviť..." +msgstr "_Spravovať..." -#: ../data/glade/preferences_window.glade.h:58 -msgid "" -"Never\n" -"Always\n" -"Per account\n" -"Per type" -msgstr "" -"Nidy\n" -"Vždy\n" -"Podľa účtu\n" -"Podľa typu" +#: ../data/glade/preferences_window.glade.h:61 +msgid "Notify me about contacts that sign _in" +msgstr "Upozorniť ma, keď sa kontakty pr_ihlásia" #: ../data/glade/preferences_window.glade.h:62 -msgid "Notify me about contacts that: " -msgstr "Upozorni ma na kontakt, ktorý:" +msgid "Notify me about contacts that sign _out" +msgstr "Upozorniť ma, keď sa kontakty _odhlásia" #: ../data/glade/preferences_window.glade.h:63 msgid "Notify on new _GMail email" msgstr "Upozorniť keď príde na _Gmail e-mail" #: ../data/glade/preferences_window.glade.h:64 -msgid "On every _message" -msgstr "Pri každej _správe" +msgid "Personal Events" +msgstr "" #: ../data/glade/preferences_window.glade.h:65 -msgid "One message _window:" -msgstr "Jedno _okno so správou:" - -#: ../data/glade/preferences_window.glade.h:66 -msgid "Outgoing Chat state noti_fications:" -msgstr "Odchádzajúca informácia o _stave:" - -#: ../data/glade/preferences_window.glade.h:67 msgid "Play _sounds" msgstr "Prehrať _zvuky" -#: ../data/glade/preferences_window.glade.h:68 -msgid "Preferences" -msgstr "Nastavenia" +#: ../data/glade/preferences_window.glade.h:66 +msgid "" +"Pop it up\n" +"Notify me about it\n" +"Show only in roster" +msgstr "" +"Vyskakovacie okno\n" +"Upozorniť ma o tom\n" +"Zobraziť len v zozname" #: ../data/glade/preferences_window.glade.h:69 -msgid "Print time:" -msgstr "Čas tlače:" +msgid "Preferences" +msgstr "Predvoľby" #: ../data/glade/preferences_window.glade.h:70 -msgid "Save _position and size for roster and chat windows" -msgstr "Uložiť _pozíciu a veľkosť zoznamu a diskusného okna" +msgid "Privacy" +msgstr "Súkromie" #: ../data/glade/preferences_window.glade.h:71 +msgid "Publish _Activity" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:72 +msgid "Publish _Mood" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:73 +msgid "Publish _Tune" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:74 msgid "Set status message to reflect currently playing _music track" msgstr "Nastaviť stavovú správu podľa toho aká _hudba práve hrá" -#: ../data/glade/preferences_window.glade.h:72 -msgid "Show only in _roster" -msgstr "Zobraziť len v _zozname" - -#: ../data/glade/preferences_window.glade.h:73 -msgid "Sign _in" -msgstr "Prihlásiť _sa" - -#: ../data/glade/preferences_window.glade.h:74 -msgid "Sign _out" -msgstr "_Odhlásiť sa" - #: ../data/glade/preferences_window.glade.h:75 +msgid "Sign _in" +msgstr "Prihlás_il sa" + +#: ../data/glade/preferences_window.glade.h:76 +msgid "Sign _out" +msgstr "_Odhlásil sa" + +#: ../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 "" "Niektoré správy môžu obsahovať rozširujúce informácie (formátovanie, farby, " -"atď.). Ak je zaškrtnuté Gajim bude zobrazovať len jednoduchý text." +"atď.). Ak je zaškrtnuté, Gajim bude zobrazovať len jednoduchý text." -#: ../data/glade/preferences_window.glade.h:76 +#: ../data/glade/preferences_window.glade.h:78 msgid "Status" msgstr "Stav" -#: ../data/glade/preferences_window.glade.h:77 +#: ../data/glade/preferences_window.glade.h:79 +msgid "Status _iconset:" +msgstr "Zostava stavových _ikôn:" + +#: ../data/glade/preferences_window.glade.h:80 +msgid "Subscribe to A_ctivity" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:81 +msgid "Subscribe to M_ood" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:82 +msgid "Subscribe to T_une" +msgstr "" + +#: ../data/glade/preferences_window.glade.h:83 msgid "T_heme:" msgstr "_Téma:" -#: ../data/glade/preferences_window.glade.h:78 +#: ../data/glade/preferences_window.glade.h:84 msgid "The auto away status message" -msgstr "Správa pri automatickej zmene stavu na Preč" +msgstr "Správa pri automatickej zmene stavu na preč" -#: ../data/glade/preferences_window.glade.h:79 +#: ../data/glade/preferences_window.glade.h:85 msgid "The auto not available status message" -msgstr "Správa pri automatickej zmene stavu na Neprítomný(á)" +msgstr "Správa pri automatickej zmene stavu na neprítomný" -#: ../data/glade/preferences_window.glade.h:80 +#: ../data/glade/preferences_window.glade.h:86 +msgid "Treat all incoming messages as:" +msgstr "Spracovať všetky prichádzajúce správy ako:" + +#: ../data/glade/preferences_window.glade.h:87 msgid "Use _transports iconsets" -msgstr "Použiť _transportnú sadu obrázkov" +msgstr "Použiť pre_nosnú sadu obrázkov" -#: ../data/glade/preferences_window.glade.h:81 +#: ../data/glade/preferences_window.glade.h:88 msgid "Use system _default" msgstr "Použiť systémové _nastavenia" -#: ../data/glade/preferences_window.glade.h:82 -msgid "Use t_rayicon (aka. notification area icon)" -msgstr "_Ikonka v oblasti systémových upozornení" +#: ../data/glade/preferences_window.glade.h:89 +msgid "When new event is received:" +msgstr "Keď nastane nová udalosť:" -#: ../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 "" -"Keď je prijatá nová udalosť (správa, prenos súboru, atď..), nasledujúce " -"metódy môžu byť použité, aby ste bold(a) informavaný(á). Poznámka: " -"Upozornenie na nové správy sa zobrazí len v prípade, ak s kontaktom už " -"nediskutujete" - -#: ../data/glade/preferences_window.glade.h:84 -msgid "When new event is received" -msgstr "Keď je prijatá nová udalosť" - -#: ../data/glade/preferences_window.glade.h:85 +#: ../data/glade/preferences_window.glade.h:90 msgid "" "Works for Rhythmbox and Muine players. For more players, please visit http://" "trac.gajim.org/wiki/GajimAndMusicPlayer" @@ -1712,93 +1906,89 @@ msgstr "" "pre ostatné prehrávače, navštívte stranku http://trac.gajim.org/wiki/" "GajimAndMusicPlayer" -#: ../data/glade/preferences_window.glade.h:86 +#: ../data/glade/preferences_window.glade.h:91 msgid "_Advanced Notifications Control..." -msgstr "_Rozšírené nastavenie upozornení" +msgstr "_Pokročilé nastavenie upozornení..." -#: ../data/glade/preferences_window.glade.h:87 -msgid "_After time:" -msgstr "_Po čase:" - -#: ../data/glade/preferences_window.glade.h:88 -msgid "_Before time:" -msgstr "_Pred časom:" - -#: ../data/glade/preferences_window.glade.h:89 +#: ../data/glade/preferences_window.glade.h:92 msgid "_Browser:" -msgstr "_Prechádzať:" +msgstr "_Prehliadač:" -#: ../data/glade/preferences_window.glade.h:90 +#: ../data/glade/preferences_window.glade.h:93 +msgid "_Display chat state notifications:" +msgstr "Zo_braziť upozornenia o stave rozhovoru:" + +#: ../data/glade/preferences_window.glade.h:94 msgid "_File manager:" msgstr "_Správca súborov:" -#: ../data/glade/preferences_window.glade.h:91 +#: ../data/glade/preferences_window.glade.h:95 msgid "_Font:" msgstr "_Písmo:" -#: ../data/glade/preferences_window.glade.h:92 +#: ../data/glade/preferences_window.glade.h:96 msgid "_Highlight misspelled words" msgstr "_Zvýrazniť zle napísané slová" -#: ../data/glade/preferences_window.glade.h:93 +#: ../data/glade/preferences_window.glade.h:97 msgid "_Ignore events from contacts not in the roster" -msgstr "_Ignorovať udalosti od kontaktov, ktorí nie sú v zozname" +msgstr "_Ignorovať udalosti od kontaktov, ktoré nie sú v zozname" -#: ../data/glade/preferences_window.glade.h:94 +#: ../data/glade/preferences_window.glade.h:98 msgid "_Incoming message:" msgstr "_Prichádzajúca správa:" -#: ../data/glade/preferences_window.glade.h:95 +#: ../data/glade/preferences_window.glade.h:99 msgid "_Log status changes of contacts" msgstr "_Zaznamenať zmenu stavu kontaktu" -#: ../data/glade/preferences_window.glade.h:96 +#: ../data/glade/preferences_window.glade.h:100 msgid "_Mail client:" msgstr "_E-mailový klient:" -#: ../data/glade/preferences_window.glade.h:97 -msgid "_Never" -msgstr "_Nikdy" +#: ../data/glade/preferences_window.glade.h:101 +msgid "_Make message windows compact" +msgstr "Z_meniť okno správ na kompaktné" -#: ../data/glade/preferences_window.glade.h:98 -msgid "_Notify me about it" -msgstr "_Upozorni ma na to" - -#: ../data/glade/preferences_window.glade.h:99 +#: ../data/glade/preferences_window.glade.h:102 msgid "_Open..." msgstr "_Otvoriť..." -#: ../data/glade/preferences_window.glade.h:100 +#: ../data/glade/preferences_window.glade.h:103 msgid "_Outgoing message:" msgstr "_Odchádzajúca správa:" -#: ../data/glade/preferences_window.glade.h:101 +#: ../data/glade/preferences_window.glade.h:104 msgid "_Player:" msgstr "_Prehrávač:" -#: ../data/glade/preferences_window.glade.h:102 -msgid "_Pop it up" -msgstr "_Popup" - -#: ../data/glade/preferences_window.glade.h:103 +#: ../data/glade/preferences_window.glade.h:105 msgid "_Reset to Default Colors" -msgstr "Návrat k Pôvodnému nastaveniu farieb" +msgstr "Náv_rat k pôvodnému nastaveniu farieb" -#: ../data/glade/preferences_window.glade.h:104 +#: ../data/glade/preferences_window.glade.h:106 +msgid "_Send chat state notifications:" +msgstr "Odo_slať upozornenia o stave rozhovoru:" + +#: ../data/glade/preferences_window.glade.h:107 msgid "_Sort contacts by status" msgstr "_Zotriediť kontakty podľa stavu" -#: ../data/glade/preferences_window.glade.h:105 +#: ../data/glade/preferences_window.glade.h:108 msgid "_Status message:" msgstr "_Správa o stave:" -#: ../data/glade/preferences_window.glade.h:106 +#: ../data/glade/preferences_window.glade.h:109 msgid "_URL:" msgstr "_URL:" -#: ../data/glade/preferences_window.glade.h:107 +#: ../data/glade/preferences_window.glade.h:110 +msgid "_Window behavior:" +msgstr "_Správanie okna:" + +#: ../data/glade/preferences_window.glade.h:111 msgid "minutes" -msgstr "minuty" +msgstr "minút" #: ../data/glade/privacy_lists_window.glade.h:1 msgid "Privacy Lists:" @@ -1840,13 +2030,13 @@ msgstr "JabberID" msgid "Order:" msgstr "Poradie:" -#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:1841 +#: ../data/glade/privacy_list_window.glade.h:11 ../src/dialogs.py:2377 msgid "Privacy List" msgstr "Súkromný zoznam" #: ../data/glade/privacy_list_window.glade.h:12 msgid "all by subscription" -msgstr "všetko podľa prihlásenia" +msgstr "všetko podľa podpisu" #: ../data/glade/privacy_list_window.glade.h:13 msgid "all in the group" @@ -1870,7 +2060,7 @@ msgstr "poslať mi správu" #: ../data/glade/privacy_list_window.glade.h:19 msgid "to send me queries" -msgstr "odosielať požiadavku" +msgstr "poslať mi požiadavky" #: ../data/glade/privacy_list_window.glade.h:20 msgid "to send me status" @@ -1884,7 +2074,7 @@ msgstr "vidieť môj stav" #: ../data/glade/profile_window.glade.h:2 #: ../data/glade/vcard_information_window.glade.h:2 msgid "About" -msgstr "Informácie" +msgstr "O mne" #: ../data/glade/profile_window.glade.h:3 #: ../data/glade/vcard_information_window.glade.h:3 @@ -1906,268 +2096,311 @@ msgid "City:" msgstr "Mesto:" #: ../data/glade/profile_window.glade.h:7 +msgid "Click to set your avatar" +msgstr "Kliknite pre výber avataru" + +#: ../data/glade/profile_window.glade.h:8 #: ../data/glade/vcard_information_window.glade.h:10 msgid "Company:" msgstr "Spoločnosť:" -#: ../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 "Krajina:" -#: ../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 "Oddelenie:" -#: ../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 "Extra adresa:" +msgstr "Ďaľšia 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:19 msgid "Family:" msgstr "Priezvisko:" #. 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 "Formát: YYYY-MM-DD" -#. Given Name #: ../data/glade/profile_window.glade.h:17 #: ../data/glade/vcard_information_window.glade.h:22 +msgid "Full Name" +msgstr "Celé meno" + +#. Given Name +#: ../data/glade/profile_window.glade.h:19 +#: ../data/glade/vcard_information_window.glade.h:24 msgid "Given:" msgstr "Meno:" -#: ../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 "Domovská stránka:" #. 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 "Prostredné meno:" -#: ../data/glade/profile_window.glade.h:21 -#: ../data/glade/vcard_information_window.glade.h:27 -msgid "More" -msgstr "Viac" - -#: ../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 "Osobné informácie" -#: ../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 "Telefónne č.:" -#: ../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 "Pozícia:" -#: ../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 "PSČ:" #. Prefix in Name -#: ../data/glade/profile_window.glade.h:30 -#: ../data/glade/vcard_information_window.glade.h:36 -msgid "Prefix:" -msgstr "Prefix:" - #: ../data/glade/profile_window.glade.h:31 -#: ../data/glade/vcard_information_window.glade.h:38 ../src/vcard.py:273 +#: ../data/glade/vcard_information_window.glade.h:39 +msgid "Prefix:" +msgstr "Titul pred:" + +#: ../data/glade/profile_window.glade.h:32 +#: ../data/glade/vcard_information_window.glade.h:41 ../src/vcard.py:307 msgid "Role:" msgstr "Rola:" -#: ../data/glade/profile_window.glade.h:32 -#: ../data/glade/vcard_information_window.glade.h:39 -msgid "State:" -msgstr "Stav:" - #: ../data/glade/profile_window.glade.h:33 -#: ../data/glade/vcard_information_window.glade.h:41 +#: ../data/glade/vcard_information_window.glade.h:42 +msgid "State:" +msgstr "Štát:" + +#: ../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 "Titul za:" -#: ../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 "Práca" -#: ../data/glade/profile_window.glade.h:37 -msgid "_Publish" -msgstr "_Zverejniť" - -#: ../data/glade/profile_window.glade.h:38 -msgid "_Retrieve" -msgstr "_Získať" - #: ../data/glade/remove_account_window.glade.h:1 msgid "What do you want to do?" msgstr "Čo si prajete vykonať?" #: ../data/glade/remove_account_window.glade.h:2 msgid "Remove account _only from Gajim" -msgstr "_Odstrániť účet iba z Gajima" +msgstr "Odstrániť účet iba z Ga_jim" #: ../data/glade/remove_account_window.glade.h:3 msgid "Remove account from Gajim and from _server" -msgstr "Odstrániť účet z Gajima a zo _serveru" +msgstr "Odstrániť účet z Gajim aj zo _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:2574 ../src/roster_window.py:2793 +#: ../src/roster_window.py:2929 +msgid "_Remove" +msgstr "O_dstrániť" #: ../data/glade/roster_contact_context_menu.glade.h:1 msgid "A_sk to see his/her status" msgstr "P_ožiadať jeho/ju o súhlas k zobrazeniu stavu" #: ../data/glade/roster_contact_context_menu.glade.h:2 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:1 -msgid "Add Special _Notification" -msgstr "Pridať špeciálne _upozornenie" +msgid "Add Special _Notification..." +msgstr "Pridať špeciálne _upozornenie..." #: ../data/glade/roster_contact_context_menu.glade.h:3 -#: ../data/glade/zeroconf_contact_context_menu.glade.h:2 -msgid "Assign Open_PGP Key" -msgstr "Prideliť Open_PGP kľúč" +msgid "Assign Open_PGP Key..." +msgstr "Prideliť Open_PGP kľúč..." #: ../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 "Upraviť _Skupiny" +msgid "Edit _Groups..." +msgstr "Upraviť _skupiny..." +#. Execute Command #: ../data/glade/roster_contact_context_menu.glade.h:5 -#: ../src/roster_window.py:2128 +#: ../src/roster_window.py:2872 msgid "Execute Command..." msgstr "Vykonať príkaz..." +#. Invite to Groupchat +#. Invite to #: ../data/glade/roster_contact_context_menu.glade.h:6 -#: ../src/roster_window.py:1951 +#: ../src/roster_window.py:2527 ../src/roster_window.py:2714 msgid "In_vite to" msgstr "Poz_vať 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 "Poslať krátku _správu" +#: ../src/roster_window.py:2723 ../src/roster_window.py:2839 +msgid "Send Cus_tom Status" +msgstr "Poslať vlas_tný stav" + +#: ../data/glade/roster_contact_context_menu.glade.h:8 +msgid "Send Single _Message..." +msgstr "Poslať krátku _správu..." #: ../data/glade/roster_contact_context_menu.glade.h:9 +msgid "Send _File..." +msgstr "Poslať _súbor..." + +#: ../data/glade/roster_contact_context_menu.glade.h:10 +msgid "Set Custom _Avatar..." +msgstr "Nastaviť vlastný _avatar..." + +#: ../data/glade/roster_contact_context_menu.glade.h:11 #: ../data/glade/zeroconf_contact_context_menu.glade.h:5 msgid "Start _Chat" msgstr "Začať _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 "_Povoliť jemu/jej vidieť môj stav" -#: ../data/glade/roster_contact_context_menu.glade.h:12 -msgid "_Forbid him/her to see my status" -msgstr "_Odmietnuť zobrazenie stavu" - -#. 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 "_Odstrániť zo zoznamu" +#: ../src/roster_window.py:2564 ../src/roster_window.py:2784 +#: ../src/roster_window.py:2919 +msgid "_Block" +msgstr "_Blokovať" #: ../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 "_Premenovať" +msgid "_Forbid him/her to see my status" +msgstr "_Odmietnuť jemu/jej zobrazenie stavu" -#: ../data/glade/roster_contact_context_menu.glade.h:16 +#: ../data/glade/roster_contact_context_menu.glade.h:17 +#: ../data/glade/zeroconf_contact_context_menu.glade.h:7 +msgid "_Manage Contact" +msgstr "S_pravovať kontakt" + +#: ../data/glade/roster_contact_context_menu.glade.h:19 +msgid "_Rename..." +msgstr "_Premenovať..." + +#: ../data/glade/roster_contact_context_menu.glade.h:20 msgid "_Subscription" msgstr "_Požiadavky" +#: ../data/glade/roster_contact_context_menu.glade.h:21 +#: ../src/roster_window.py:2558 ../src/roster_window.py:2778 +#: ../src/roster_window.py:2916 +msgid "_Unblock" +msgstr "_Odblokovať" + #: ../data/glade/roster_window.glade.h:1 msgid "A_ccounts" msgstr "Úč_ty" #: ../data/glade/roster_window.glade.h:2 -msgid "Add _Contact" -msgstr "Pridať _kontakt" +msgid "Add _Contact..." +msgstr "Pridať k_ontakt..." #: ../data/glade/roster_window.glade.h:3 +msgid "Fea_tures" +msgstr "Fu_nkcie" + +#: ../data/glade/roster_window.glade.h:4 msgid "File _Transfers" msgstr "Prenos _súborov" -#: ../data/glade/roster_window.glade.h:4 +#: ../data/glade/roster_window.glade.h:5 msgid "Frequently Asked Questions (online)" -msgstr "Často kladené otázky (FAQ - online)" - -#: ../data/glade/roster_window.glade.h:6 -msgid "Help online" -msgstr "Online pomoc" +msgstr "Často kladené otázky (online)" #: ../data/glade/roster_window.glade.h:7 -msgid "Profile, A_vatar" -msgstr "Profil, A_vatar" - -#: ../data/glade/roster_window.glade.h:8 -msgid "Show Trans_ports" -msgstr "Zobraziť transporty" +msgid "Help online" +msgstr "Pomocník online" #: ../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 "Zobraziť trans_porty" + +#: ../data/glade/roster_window.glade.h:11 msgid "Show _Offline Contacts" -msgstr "Zobraziť _offline kontakty" +msgstr "Zobraziť _odhlásené kontakty" #: ../data/glade/roster_window.glade.h:12 +msgid "Show _roster" +msgstr "Zobraziť _zoznam" + +#: ../data/glade/roster_window.glade.h:15 msgid "_Contents" -msgstr "_Obsah dokumentácie" +msgstr "Ob_sah" -#: ../data/glade/roster_window.glade.h:13 -msgid "_Discover Services" -msgstr "_Preskúmať služby" - -#: ../data/glade/roster_window.glade.h:14 ../src/disco.py:1256 -#: ../src/roster_window.py:2120 +#: ../data/glade/roster_window.glade.h:17 ../src/disco.py:1323 msgid "_Edit" msgstr "_Upraviť" -#: ../data/glade/roster_window.glade.h:15 -msgid "_FAQ" -msgstr "_Často kladené otázky" - -#: ../data/glade/roster_window.glade.h:17 -msgid "_Help" -msgstr "_Pomoc" - #: ../data/glade/roster_window.glade.h:18 -msgid "_Preferences" -msgstr "_Nastavenia" +msgid "_FAQ" +msgstr "Často k_ladené otázky" #: ../data/glade/roster_window.glade.h:19 +msgid "_Help" +msgstr "_Pomocník" + +#: ../data/glade/roster_window.glade.h:21 +msgid "_Preferences" +msgstr "_Predvoľby" + +#: ../data/glade/roster_window.glade.h:22 msgid "_Quit" msgstr "_Koniec" -#: ../data/glade/roster_window.glade.h:21 +#: ../data/glade/roster_window.glade.h:23 +msgid "_Send Single Message..." +msgstr "Poslať krátku _správu..." + +#: ../data/glade/roster_window.glade.h:24 +msgid "_Services" +msgstr "_Služby" + +#: ../data/glade/roster_window.glade.h:26 msgid "_View" msgstr "_Zobraziť" +#: ../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 "_Pridať kontakt" + +#. Information +#: ../data/glade/search_window.glade.h:4 ../src/roster_window.py:2941 +msgid "_Information" +msgstr "_Informácie" + #: ../data/glade/service_discovery_window.glade.h:1 msgid "G_o" msgstr "Ch_oď" @@ -2176,13 +2409,9 @@ msgstr "Ch_oď" msgid "_Address:" msgstr "_Adresa:" -#: ../data/glade/service_discovery_window.glade.h:3 -msgid "_Filter:" -msgstr "_Filter:" - #: ../data/glade/service_registration_window.glade.h:1 msgid "Register to" -msgstr "Registrovaný(á) k" +msgstr "Registrovaný na" #: ../data/glade/service_registration_window.glade.h:2 msgid "_Cancel" @@ -2237,14 +2466,14 @@ msgid "Au_thorize" msgstr "Au_torizovať" #: ../data/glade/subscription_request_window.glade.h:2 -msgid "Authorize contact so he can know when you're connected" -msgstr "Autorizovať kontakt, od teraz vude vidieť kedy ste pripojený(á)" +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 "" -"Zamietnuť autorizáciu od kontaktu, nebude tým pádom vedieť, kedy ste " -"pripojený(á)" #: ../data/glade/subscription_request_window.glade.h:4 msgid "Subscription Request" @@ -2254,10 +2483,26 @@ msgstr "Požiadavka o zapísanie" msgid "_Deny" msgstr "_Zakázať" +#: ../data/glade/synchronise_select_account_dialog.glade.h:1 +msgid "Select the account with which you want to synchronise" +msgstr "Zvoľte účet, s ktorým sa chcete synchronizovať" + +#: ../data/glade/synchronise_select_contacts_dialog.glade.h:1 +msgid "Select the contacts you want to synchronise" +msgstr "" + +#: ../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 "Stlmiť zvuky" +#: ../data/glade/systray_context_menu.glade.h:2 +msgid "Send Single _Message" +msgstr "Poslať krátku _správu" + #: ../data/glade/systray_context_menu.glade.h:3 msgid "Show All Pending _Events" msgstr "Zobraziť všetky čakajúce _udalosti" @@ -2270,6 +2515,10 @@ msgstr "Zobraziť _zoznam" msgid "Sta_tus" msgstr "S_tav" +#: ../data/glade/systray_context_menu.glade.h:6 +msgid "_Group Chat" +msgstr "_Diskusná skupina" + #. Given Name #: ../data/glade/vcard_information_window.glade.h:5 msgid "Ask:" @@ -2284,57 +2533,53 @@ msgid "Comments" msgstr "Komentáre" #: ../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 "Kontakt" -#: ../data/glade/vcard_information_window.glade.h:12 +#: ../data/glade/vcard_information_window.glade.h:13 msgid "Contact Information" msgstr "Kontaktné informácie" -#: ../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 "Viac" -#: ../data/glade/vcard_information_window.glade.h:30 +#: ../data/glade/vcard_information_window.glade.h:33 msgid "OS:" msgstr "Operačný systém:" -#: ../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 "Zápis:" -#: ../data/glade/vcard_information_window.glade.h:47 -#: ../data/glade/zeroconf_information_window.glade.h:10 -msgid "_Log conversation history" -msgstr "História _konverzácie" +#: ../data/glade/vcard_information_window.glade.h:49 +msgid "User avatar:" +msgstr "Používa avatar:" #: ../data/glade/xml_console_window.glade.h:1 msgid "Jabber Traffic" -msgstr "Prevádzka Jabber-a" +msgstr "Jabber prevádzka" #: ../data/glade/xml_console_window.glade.h:2 msgid "XML Input" msgstr "XML vstup" -#. XML Console enable checkbutton -#: ../data/glade/xml_console_window.glade.h:4 -msgid "Enable" -msgstr "Povoliť" - #. 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" @@ -2353,259 +2598,346 @@ msgstr "_Správa" msgid "_Presence" msgstr "_Prítomnosť" -#: ../data/glade/zeroconf_information_window.glade.h:3 -#: ../data/glade/zeroconf_properties_window.glade.h:6 -msgid "First Name:" -msgstr "Prvé meno:" +#: ../data/glade/zeroconf_contact_context_menu.glade.h:1 +msgid "Add Special _Notification" +msgstr "Pridať špeciálne _upozornenie" -#: ../data/glade/zeroconf_information_window.glade.h:5 -#: ../data/glade/zeroconf_properties_window.glade.h:14 -msgid "Last Name:" -msgstr "Posledné meno:" +#: ../data/glade/zeroconf_contact_context_menu.glade.h:2 +msgid "Assign Open_PGP Key" +msgstr "Prideliť Open_PGP kľúč" + +#. Edit Groups +#: ../data/glade/zeroconf_contact_context_menu.glade.h:3 +#: ../src/roster_window.py:2547 +msgid "Edit _Groups" +msgstr "Upraviť _skupiny" + +#. Rename +#: ../data/glade/zeroconf_contact_context_menu.glade.h:8 +#: ../src/roster_window.py:2899 +msgid "_Rename" +msgstr "_Premenovať" + +#: ../data/glade/zeroconf_context_menu.glade.h:1 +msgid "_Modify Account..." +msgstr "_Upraviť účet" #: ../data/glade/zeroconf_information_window.glade.h:6 msgid "Local jid:" -msgstr "Lokálny jid:" +msgstr "Miestne jid:" #: ../data/glade/zeroconf_information_window.glade.h:7 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 "" -"Ak vám nevyhovuje predvolený port na príjem správ, tu si môžete zvoliť " -"vlastný.\n" -"Zoberte v úvahu aj prípadné nastavenie firewallu." - #: ../data/glade/zeroconf_properties_window.glade.h:15 msgid "Modify Account" msgstr "Upraviť účet" -#: ../data/glade/zeroconf_properties_window.glade.h:21 -msgid "Use custom port:" -msgstr "Použiť port:" +#. For i18n +#: ../src/advanced.py:56 +msgid "Activated" +msgstr "Aktivovaná" -#: ../src/advanced.py:57 +#: ../src/advanced.py:56 +msgid "Deactivated" +msgstr "Deaktivovaná" + +#: ../src/advanced.py:58 +msgid "Boolean" +msgstr "Logický" + +#: ../src/advanced.py:59 +msgid "Integer" +msgstr "Celočíselný" + +#: ../src/advanced.py:60 +msgid "Text" +msgstr "Text" + +#: ../src/advanced.py:61 +msgid "Color" +msgstr "Farba" + +#: ../src/advanced.py:70 msgid "Preference Name" -msgstr "Meno vlastnosti" +msgstr "Názov vlastnosti" -#: ../src/advanced.py:63 +#: ../src/advanced.py:76 msgid "Value" msgstr "Hodnota" -#: ../src/advanced.py:72 +#: ../src/advanced.py:84 msgid "Type" msgstr "Typ" #. we talk about option description in advanced configuration editor -#: ../src/advanced.py:128 +#: ../src/advanced.py:140 msgid "(None)" msgstr "(Nič)" #. we talk about password -#: ../src/advanced.py:227 +#: ../src/advanced.py:243 msgid "Hidden" msgstr "Skryté" #. 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 "Anglicky" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 +msgid "Belarusian" +msgstr "" + +#: ../src/chat_control.py:60 msgid "Bulgarian" msgstr "Bulharsky" -#: ../src/chat_control.py:52 -msgid "Briton" -msgstr "Briton" +#: ../src/chat_control.py:60 +msgid "Breton" +msgstr "" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Czech" msgstr "Česky" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "German" -msgstr "German" +msgstr "" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Greek" -msgstr "Greek" +msgstr "" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 +msgid "British" +msgstr "" + +#: ../src/chat_control.py:60 msgid "Esperanto" -msgstr "Esperanto" +msgstr "" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Spanish" -msgstr "Španiesky" +msgstr "" -#: ../src/chat_control.py:52 -msgid "Basc" -msgstr "Basc" +#: ../src/chat_control.py:60 +msgid "Basque" +msgstr "" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "French" msgstr "Francúzsky" -#: ../src/chat_control.py:52 +#: ../src/chat_control.py:60 msgid "Croatian" -msgstr "Croatian" - -#: ../src/chat_control.py:52 -msgid "Italian" -msgstr "Italian" - -#: ../src/chat_control.py:52 -msgid "Norvegian b" -msgstr "Norvegian b" - -#: ../src/chat_control.py:52 -msgid "Dutch" -msgstr "Dutch" - -#: ../src/chat_control.py:52 -msgid "Norvegian" -msgstr "Norvegian" - -#: ../src/chat_control.py:52 -msgid "Polish" -msgstr "Polish" - -#: ../src/chat_control.py:52 -msgid "Portuguese" -msgstr "Portuguese" - -#: ../src/chat_control.py:52 -msgid "Brazilian Portuguese" -msgstr "Brazilian Portuguese" - -#: ../src/chat_control.py:52 -msgid "Russian" -msgstr "Rusky" - -#: ../src/chat_control.py:52 -msgid "Slovak" -msgstr "Slovensky" - -#: ../src/chat_control.py:52 -msgid "Swedish" -msgstr "Swedish" - -#: ../src/chat_control.py:52 -msgid "Chinese (Ch)" -msgstr "Chinese (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 "" -"Ak toto nie je jazyk pre ktorý chcete mať zapnuté zvýrazňovanie zle " -"napísaných slov, potom prosím nastavte premennú $LANG na príslušnú hodnotu. " -"Napr. pre Slovenčinu zadajte príkaz export LANG=sk_SK alebo export " -"LANG=sk_SK.UTF-8 v súbore ~/.bash_profile alebo pre globálne nastavenie " -"doplnte súbor /etc/profile.\n" -"\n" -"Zvýrazňovanie zle napísaných slov nebude používané" -#: ../src/chat_control.py:239 +#: ../src/chat_control.py:60 +msgid "Italian" +msgstr "" + +#: ../src/chat_control.py:60 +msgid "Norwegian (b)" +msgstr "" + +#: ../src/chat_control.py:60 +msgid "Dutch" +msgstr "" + +#: ../src/chat_control.py:60 +msgid "Norwegian" +msgstr "" + +#: ../src/chat_control.py:60 +msgid "Polish" +msgstr "" + +#: ../src/chat_control.py:60 +msgid "Portuguese" +msgstr "" + +#: ../src/chat_control.py:60 +msgid "Brazilian Portuguese" +msgstr "" + +#: ../src/chat_control.py:60 +msgid "Russian" +msgstr "" + +#: ../src/chat_control.py:60 +msgid "Serbian" +msgstr "" + +#: ../src/chat_control.py:60 +msgid "Slovak" +msgstr "" + +#: ../src/chat_control.py:60 +msgid "Swedish" +msgstr "" + +#: ../src/chat_control.py:60 +msgid "Chinese (Ch)" +msgstr "" + +#: ../src/chat_control.py:313 msgid "Spelling language" msgstr "Jazyk používaný pri kontrole pravopisu" #. we are not connected -#: ../src/chat_control.py:262 ../src/chat_control.py:468 +#: ../src/chat_control.py:336 ../src/chat_control.py:559 msgid "A connection is not available" msgstr "Pripojenie nie je dostupné" -#: ../src/chat_control.py:263 ../src/chat_control.py:469 +#: ../src/chat_control.py:337 ../src/chat_control.py:560 msgid "Your message can not be sent until you are connected." -msgstr "Vašu správu nie je možné odoslať, pokiaľ nebudete pripojený(á)" +msgstr "Vašu správu nie je možné odoslať, pokiaľ nebudete pripojený." -#: ../src/chat_control.py:844 -msgid "Chats" -msgstr "Rozhovory" +#: ../src/chat_control.py:1064 ../src/chat_control.py:1271 +msgid "GPG encryption enabled" +msgstr "Zapnuté GPG šifrovanie" -#: ../src/chat_control.py:1030 +#: ../src/chat_control.py:1186 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s z diskusnej skupiny %(room_name)s" -#. we talk about a contact here -#: ../src/chat_control.py:1118 +#: ../src/chat_control.py:1266 +msgid "GPG encryption disabled" +msgstr "Vypnuté GPG šifrovanie" + +#: ../src/chat_control.py:1320 ../src/groupchat_control.py:1458 #, python-format -msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" -msgstr "%s nezverejnil svoj OpenPGP kľúč, alebo nemá žiadny vytvorený" +msgid "No such command: /%s (if you want to send this, prefix it with /say)" +msgstr "" +"Neznámy príkaz: /%s (ak chcete toto odoslať, zaraďte /say pred to, čo " +"hovoríte)" -#: ../src/chat_control.py:1254 -msgid "Encryption enabled" -msgstr "Šifrovanie zapnuté" +#: ../src/chat_control.py:1327 ../src/groupchat_control.py:1481 +#, python-format +msgid "Commands: %s" +msgstr "Príkazy: %s" -#: ../src/chat_control.py:1259 -msgid "Encryption disabled" -msgstr "Šifrovanie vypnuté" +#: ../src/chat_control.py:1330 ../src/groupchat_control.py:1495 +#, python-format +msgid "Usage: /%s, clears the text window." +msgstr "Použitie: /%s, vyčistí textové okno." + +#: ../src/chat_control.py:1333 ../src/groupchat_control.py:1500 +#, python-format +msgid "Usage: /%s, hide the chat buttons." +msgstr "Použitie: /%s, skryje tlačidlá rozhovoru." + +#: ../src/chat_control.py:1336 ../src/groupchat_control.py:1516 +#, python-format +msgid "" +"Usage: /%s , sends action to the current group chat. Use third " +"person. (e.g. /%s explodes.)" +msgstr "" +"Použitie: /%s , odošle akciu pre aktuálnu diskusnú skupinu. " +"Používajte tretiu osobu. (napr. /%s explodoval.)" + +#: ../src/chat_control.py:1340 +#, python-format +msgid "Usage: /%s, sends a ping to the contact" +msgstr "" + +#: ../src/chat_control.py:1343 +#, python-format +msgid "Usage: /%s, send the message to the contact" +msgstr "" + +#: ../src/chat_control.py:1346 ../src/groupchat_control.py:1539 +#, python-format +msgid "No help info for /%s" +msgstr "Žiadne informácie s pomocou pre /%s" + +#: ../src/chat_control.py:1465 +msgid "Session negotiation cancelled" +msgstr "" + +#: ../src/chat_control.py:1471 +msgid "E2E encryption enabled" +msgstr "" + +#: ../src/chat_control.py:1475 +msgid "Session WILL be logged" +msgstr "" + +#: ../src/chat_control.py:1477 +msgid "Session WILL NOT be logged" +msgstr "" + +#: ../src/chat_control.py:1481 +msgid "E2E encryption disabled" +msgstr "" + +#: ../src/chat_control.py:1505 ../src/chat_control.py:1516 +msgid "The following message was NOT encrypted" +msgstr "" + +#: ../src/chat_control.py:1511 +msgid "The following message was encrypted" +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_control.py:1680 ../src/conversation_textview.py:704 +#: ../src/dialogs.py:851 ../src/gajim.py:926 ../src/gajim.py:927 +#: ../src/gajim.py:1466 ../src/gajim.py:1717 ../src/roster_window.py:359 +#: ../src/roster_window.py:444 ../src/roster_window.py:1853 +#: ../src/roster_window.py:1863 ../src/roster_window.py:2203 +#: ../src/roster_window.py:2372 ../src/roster_window.py:3206 +#: ../src/roster_window.py:3449 ../src/roster_window.py:4897 +#: ../src/roster_window.py:4899 ../src/common/contacts.py:94 +#: ../src/common/helpers.py:53 ../src/common/helpers.py:267 msgid "Not in Roster" msgstr "Nie je v zozname" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:1545 +#: ../src/chat_control.py:1834 #, python-format msgid "You just received a new message from \"%s\"" -msgstr "Práve ste prijal(a) novú správu od \"%s\"" +msgstr "Práve ste prijali novú správu od \"%s\"" -#: ../src/chat_control.py:1546 +#: ../src/chat_control.py:1835 msgid "" "If you close this tab and you have history disabled, this message will be " "lost." msgstr "" -"Ak zatvoríte túto záložku a máte deaktivovanú históriu, správa bude stratená." +"Ak zatvoríte túto kartu a máte deaktivovanú históriu, správa bude stratená." -#: ../src/config.py:135 ../src/config.py:594 +#: ../src/config.py:129 ../src/config.py:627 msgid "Disabled" msgstr "Vypnuté" -#: ../src/config.py:221 -#, python-format -msgid "Every %s _minutes" -msgstr "Každých %s _minút" - -#: ../src/config.py:363 +#: ../src/config.py:295 msgid "Active" msgstr "Aktívne" -#: ../src/config.py:371 +#: ../src/config.py:303 msgid "Event" msgstr "Udalosť" -#: ../src/config.py:685 ../src/gajim.py:2142 +#: ../src/config.py:409 +msgid "Always use OS/X default applications" +msgstr "Vždy použiť štandartné aplikácie OS/X" + +#: ../src/config.py:410 +msgid "Custom" +msgstr "" + +#: ../src/config.py:700 ../src/dialogs.py:1137 #, python-format msgid "Dictionary for lang %s not available" msgstr "Slovník pre jazyk %s nie je k dispozícii" -#: ../src/config.py:686 ../src/gajim.py:2143 +#: ../src/config.py:701 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -2615,245 +2947,252 @@ msgstr "" "pravopisu, prípadne si môžete zvoliť iný jazyk na kontrolu pravopisu " "nastavením premennej setting the speller_language." -#: ../src/config.py:1038 +#: ../src/config.py:1063 msgid "status message title" msgstr "titulok správy o stave" -#: ../src/config.py:1038 +#: ../src/config.py:1063 msgid "status message text" msgstr "text správy o stave" -#: ../src/config.py:1073 +#: ../src/config.py:1099 msgid "First Message Received" msgstr "Prvá prijatá správa" -#: ../src/config.py:1074 +#: ../src/config.py:1100 msgid "Next Message Received" msgstr "Ďalšia prijatá správa správa" -#: ../src/config.py:1075 +#: ../src/config.py:1101 msgid "Contact Connected" msgstr "Kotakt pripojený" -#: ../src/config.py:1076 +#: ../src/config.py:1102 msgid "Contact Disconnected" msgstr "Kontakt odpojený" -#: ../src/config.py:1077 +#: ../src/config.py:1103 msgid "Message Sent" msgstr "Správa odoslaná" -#: ../src/config.py:1078 +#: ../src/config.py:1104 msgid "Group Chat Message Highlight" msgstr "Zvýraznenie správ v diskusnej skupine" -#: ../src/config.py:1079 +#: ../src/config.py:1105 msgid "Group Chat Message Received" msgstr "Prijatá správa - diskusná skupina" -#: ../src/config.py:1086 +#: ../src/config.py:1112 msgid "GMail Email Received" -msgstr "Doručený e-mail na GMail" - -#: ../src/config.py:1289 -msgid "OpenPGP is not usable in this computer" -msgstr "OpenPGP nie je použiteľné na tomto počítači" - -#: ../src/config.py:1335 -msgid "You are currently connected to the server" -msgstr "Ste pripojený(á) na server" - -#: ../src/config.py:1336 -msgid "To change the account name, you must be disconnected." -msgstr "Pre zmenu názvu účtu, musíte byť odpojený." - -#: ../src/config.py:1339 ../src/config.py:1931 -msgid "Unread events" -msgstr "Neprečítané udalosti" - -#: ../src/config.py:1340 -msgid "To change the account name, you must read all pending events." -msgstr "Pre zmenu názvu účtu, musíte mať prečítané všetky čakajúce správy." - -#: ../src/config.py:1344 -msgid "Account Name Already Used" -msgstr "Názov účtu je už používaný" - -#: ../src/config.py:1345 -msgid "" -"This name is already used by another of your accounts. Please choose another " -"name." msgstr "" -"Toto meno je už použité jednom z vašich účtom. Prosím, zvoľte si iné meno." -#: ../src/config.py:1349 ../src/config.py:1353 -msgid "Invalid account name" -msgstr "Nesprávny názov účtu" +#. Name column +#: ../src/config.py:1376 ../src/dialogs.py:1636 ../src/dialogs.py:1700 +#: ../src/disco.py:742 ../src/disco.py:1534 ../src/disco.py:1780 +#: ../src/history_window.py:113 +msgid "Name" +msgstr "Meno" -#: ../src/config.py:1350 -msgid "Account name cannot be empty." -msgstr "Názov účtu nemôže byť prázdny." - -#: ../src/config.py:1354 -msgid "Account name cannot contain spaces." -msgstr "Názov účtu nemôže obsahovať medzery." - -#: ../src/config.py:1362 ../src/config.py:1368 ../src/config.py:1378 -#: ../src/config.py:3036 -msgid "Invalid Jabber ID" -msgstr "Nespravné Jabber ID" - -#: ../src/config.py:1369 -msgid "A Jabber ID must be in the form \"user@servername\"." -msgstr "Jabbe ID musí byť v tvare \"používateľ@menoserveru\"" - -#: ../src/config.py:1428 -msgid "Invalid entry" -msgstr "Nesprávny záznam" - -#: ../src/config.py:1429 -msgid "Custom port must be a port number." -msgstr "Port musí byť číslo." - -#: ../src/config.py:1555 ../src/common/config.py:363 +#: ../src/config.py:1453 ../src/common/config.py:403 msgid "Be right back." msgstr "Za chvíľu som späť." -#: ../src/config.py:1565 +#: ../src/config.py:1457 msgid "Relogin now?" msgstr "Prihlásiť znovu?" -#: ../src/config.py:1566 +#: ../src/config.py:1458 msgid "If you want all the changes to apply instantly, you must relogin." msgstr "" "Ak chcete, aby boli všetky zmeny naraz aplikované, musíte sa znovu prihlásiť." -#: ../src/config.py:1592 -msgid "No such account available" -msgstr "Taký účet nie je k dispozícii" +#: ../src/config.py:1588 ../src/config.py:1685 +msgid "OpenPGP is not usable in this computer" +msgstr "OpenPGP nie je použiteľné na tomto počítači" -#: ../src/config.py:1593 -msgid "You must create your account before editing your personal information." -msgstr "Musíte si vytvoriť účet, aby ste mohli meniť osobné informácie." +#: ../src/config.py:1721 ../src/config.py:1762 +msgid "Unread events" +msgstr "Neprečítané udalosti" -#: ../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 -msgid "You are not connected to the server" -msgstr "Nie ste pripojený na server" - -#: ../src/config.py:1601 -msgid "Without a connection, you can not edit your personal information." -msgstr "Bez pripojenia nemôžete meniť osobné informácie." - -#: ../src/config.py:1605 -msgid "Your server doesn't support Vcard" -msgstr "Server nepodporuje Vcard" - -#: ../src/config.py:1606 -msgid "Your server can't save your personal information." -msgstr "Váš server neumožňuje uloženie vašich osobných informácií." - -#: ../src/config.py:1630 ../src/config.py:3423 -msgid "Failed to get secret keys" -msgstr "Nepodarilo sa získať tajné kľúče" - -#: ../src/config.py:1631 ../src/config.py:3424 -msgid "There was a problem retrieving your OpenPGP secret keys." -msgstr "Vznikol problém pri získavaní vášho OpenPGP tajného kľúča." - -#: ../src/config.py:1634 ../src/config.py:3427 -msgid "OpenPGP Key Selection" -msgstr "Výber OpenPGP kľúča" - -#: ../src/config.py:1635 ../src/config.py:3428 -msgid "Choose your OpenPGP key" -msgstr "Vyberte váš OpenPGP kľúč" - -#. 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 "Meno" - -#: ../src/config.py:1868 -msgid "Server" -msgstr "Server" - -#: ../src/config.py:1932 +#: ../src/config.py:1722 msgid "Read all pending events before removing this account." msgstr "Prečítať všetky správy pred odstránením tohoto účtu." -#: ../src/config.py:1969 +#: ../src/config.py:1748 #, python-format msgid "You have opened chat in account %s" -msgstr "Máte otvorenú diskusiu pod účtom %s" +msgstr "Máte otvorený rozhovor pod účtom %s" -#: ../src/config.py:1970 +#: ../src/config.py:1749 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "" "Všetky okná s diskusiami a diskusnými skupinami budú zatvorené. Prajete si " "pokračovať?" -#: ../src/config.py:2029 +#: ../src/config.py:1758 +msgid "You are currently connected to the server" +msgstr "Ste pripojený na server" + +#: ../src/config.py:1759 +msgid "To change the account name, you must be disconnected." +msgstr "Pre zmenu názvu účtu, musíte byť odpojený." + +#: ../src/config.py:1763 +msgid "To change the account name, you must read all pending events." +msgstr "Pre zmenu názvu účtu, musíte mať prečítané všetky čakajúce správy." + +#: ../src/config.py:1769 +msgid "Account Name Already Used" +msgstr "Názov účtu je už použitý" + +#: ../src/config.py:1770 +msgid "" +"This name is already used by another of your accounts. Please choose another " +"name." +msgstr "" +"Tento názov je už použitý jedným z vašich účtov. Prosím, zvoľte si iný názov." + +#: ../src/config.py:1774 ../src/config.py:1778 +msgid "Invalid account name" +msgstr "Nesprávny názov účtu" + +#: ../src/config.py:1775 +msgid "Account name cannot be empty." +msgstr "Názov účtu nemôže byť prázdny." + +#: ../src/config.py:1779 +msgid "Account name cannot contain spaces." +msgstr "Názov účtu nemôže obsahovať medzery." + +#: ../src/config.py:1843 +msgid "Rename Account" +msgstr "Premenovať účet" + +#: ../src/config.py:1844 +#, python-format +msgid "Enter a new name for account %s" +msgstr "Zadať nový názov pre účet %s" + +#: ../src/config.py:1862 ../src/config.py:1870 ../src/config.py:1910 +#: ../src/config.py:3133 ../src/dataforms_widget.py:533 +msgid "Invalid Jabber ID" +msgstr "Nesprávné Jabber ID" + +#: ../src/config.py:1871 +msgid "A Jabber ID must be in the form \"user@servername\"." +msgstr "Jabber ID musí byť v tvare \"používateľ@menoserveru\"." + +#: ../src/config.py:2066 ../src/config.py:3205 +msgid "Invalid entry" +msgstr "Nesprávny záznam" + +#: ../src/config.py:2067 ../src/config.py:3206 +msgid "Custom port must be a port number." +msgstr "Vlastný port musí byť číslo portu." + +#: ../src/config.py:2088 ../src/config.py:3682 +msgid "Failed to get secret keys" +msgstr "Nepodarilo sa získať tajné kľúče" + +#: ../src/config.py:2089 ../src/config.py:3683 +msgid "There was a problem retrieving your OpenPGP secret keys." +msgstr "Vznikol problém pri získavaní vášho OpenPGP tajného kľúča." + +#: ../src/config.py:2092 ../src/config.py:3686 +msgid "OpenPGP Key Selection" +msgstr "Výber OpenPGP kľúča" + +#: ../src/config.py:2093 ../src/config.py:3687 +msgid "Choose your OpenPGP key" +msgstr "Vybrať váš OpenPGP kľúč" + +#: ../src/config.py:2133 +msgid "No such account available" +msgstr "Taký účet nie je k dispozícii" + +#: ../src/config.py:2134 +msgid "You must create your account before editing your personal information." +msgstr "" +"Musíte si vytvoriť účet predtým, než budete môcť meniť vaše osobné " +"informácie." + +#: ../src/config.py:2141 ../src/dialogs.py:1483 ../src/dialogs.py:1624 +#: ../src/dialogs.py:1804 ../src/disco.py:426 ../src/profile_window.py:318 +msgid "You are not connected to the server" +msgstr "Nie ste pripojený k serveru" + +#: ../src/config.py:2142 +msgid "Without a connection, you can not edit your personal information." +msgstr "Bez pripojenia nemôžete meniť osobné informácie." + +#: ../src/config.py:2146 +msgid "Your server doesn't support Vcard" +msgstr "Server nepodporuje Vcard" + +#: ../src/config.py:2147 +msgid "Your server can't save your personal information." +msgstr "Váš server neumožňuje uloženie vašich osobných informácií." + +#: ../src/config.py:2178 msgid "Account Local already exists." msgstr "Účet Local už existuje." -#: ../src/config.py:2030 +#: ../src/config.py:2179 msgid "Please rename or remove it before enabling link-local messaging." msgstr "Prosím, premenujte alebo odstráňte to pred zapnutím link-local správ." -#: ../src/config.py:2262 +#: ../src/config.py:2358 #, python-format msgid "Edit %s" msgstr "Upraviť %s" -#: ../src/config.py:2264 +#: ../src/config.py:2360 #, python-format msgid "Register to %s" msgstr "Registrovať na %s" -#. list at the begining -#: ../src/config.py:2336 +#. list at the beginning +#: ../src/config.py:2396 msgid "Ban List" msgstr "Čierna listina" -#: ../src/config.py:2337 +#: ../src/config.py:2397 msgid "Member List" msgstr "Zoznam členov" -#: ../src/config.py:2338 +#: ../src/config.py:2398 msgid "Owner List" msgstr "Zoznam vlastníkov" -#: ../src/config.py:2339 +#: ../src/config.py:2399 msgid "Administrator List" msgstr "Zoznam správcov" #. Address column #. holds JID (who said this) -#: ../src/config.py:2372 ../src/disco.py:748 ../src/history_manager.py:154 +#: ../src/config.py:2448 ../src/disco.py:749 ../src/history_manager.py:177 msgid "JID" msgstr "JID" -#: ../src/config.py:2380 +#: ../src/config.py:2456 msgid "Reason" msgstr "Dôvod" -#: ../src/config.py:2385 +#: ../src/config.py:2461 msgid "Nick" msgstr "Prezývka" -#: ../src/config.py:2389 +#: ../src/config.py:2465 msgid "Role" msgstr "Rola" -#: ../src/config.py:2410 +#: ../src/config.py:2490 msgid "Banning..." msgstr "Zakazujem..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2412 +#: ../src/config.py:2492 msgid "" "Whom do you want to ban?\n" "\n" @@ -2861,11 +3200,11 @@ msgstr "" "Koho chcete zakázať?\n" "\n" -#: ../src/config.py:2414 +#: ../src/config.py:2494 msgid "Adding Member..." msgstr "Pridáva sa člen..." -#: ../src/config.py:2415 +#: ../src/config.py:2495 msgid "" "Whom do you want to make a member?\n" "\n" @@ -2873,31 +3212,29 @@ msgstr "" "Koho chcete pridať k členom?\n" "\n" -#: ../src/config.py:2417 +#: ../src/config.py:2497 msgid "Adding Owner..." msgstr "Pridáva sa vlastník..." -#: ../src/config.py:2418 +#: ../src/config.py:2498 msgid "" -"Whom do you want to make a owner?\n" +"Whom do you want to make an owner?\n" "\n" msgstr "" "Koho chcete určiť za vlastníka?\n" "\n" -#: ../src/config.py:2420 +#: ../src/config.py:2500 msgid "Adding Administrator..." msgstr "Pridáva sa Administrátor..." -#: ../src/config.py:2421 +#: ../src/config.py:2501 msgid "" "Whom do you want to make an administrator?\n" "\n" msgstr "" -"koho chcete určiť za vlastníka?\n" -"\n" -#: ../src/config.py:2422 +#: ../src/config.py:2502 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" @@ -2913,122 +3250,145 @@ msgstr "" "4. doména (doména sama o sebe, ľubovoľný používateľ@doména,\n" "doména/zdroj, alebo adresa obsahujúca subdoménu." -#: ../src/config.py:2527 +#: ../src/config.py:2606 #, python-format msgid "Removing %s account" msgstr "Odstraňuje sa účet %s" -#: ../src/config.py:2544 ../src/roster_window.py:2665 +#: ../src/config.py:2621 ../src/gajim.py:1364 ../src/roster_window.py:3508 msgid "Password Required" msgstr "Heslo je požadované" -#: ../src/config.py:2545 ../src/roster_window.py:2666 +#: ../src/config.py:2622 ../src/roster_window.py:3503 #, python-format msgid "Enter your password for account %s" msgstr "Vložte heslo pre váš účet %s" -#: ../src/config.py:2546 ../src/roster_window.py:2667 +#: ../src/config.py:2623 ../src/roster_window.py:3509 msgid "Save password" msgstr "Uložiť heslo" -#: ../src/config.py:2560 +#: ../src/config.py:2636 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Účet \"%s\" je pripojený na server" -#: ../src/config.py:2561 +#: ../src/config.py:2637 msgid "If you remove it, the connection will be lost." msgstr "Ak dôjde k odstráneniu, stratíte spojenie." -#: ../src/config.py:2645 +#: ../src/config.py:2730 msgid "Default" -msgstr "Predvolené" +msgstr "Štandartné" -#: ../src/config.py:2645 +#: ../src/config.py:2730 msgid "?print_status:All" msgstr "?zobrazovaný stav:All" -#: ../src/config.py:2646 +#: ../src/config.py:2731 msgid "Enter and leave only" msgstr "Len vstúpiť a vystúpiť" -#: ../src/config.py:2716 +#: ../src/config.py:2732 +msgid "?print_status:None" +msgstr "?zobrazovaný stav:None" + +#: ../src/config.py:2801 msgid "New Group Chat" msgstr "Nová diskusná skupina" -#: ../src/config.py:2748 +#: ../src/config.py:2834 msgid "This bookmark has invalid data" msgstr "Táto záložka obsahuje chybné údaje" -#: ../src/config.py:2749 +#: ../src/config.py:2835 msgid "" "Please be sure to fill out server and room fields or remove this bookmark." msgstr "" "Prosim, uistite sa, že je vyplnená položka server a miestnosť alebo " "odstráňte túto záložku." -#: ../src/config.py:3011 +#: ../src/config.py:3116 msgid "Invalid username" msgstr "Nesprávne meno používateľa" -#: ../src/config.py:3012 +#: ../src/config.py:3118 msgid "You must provide a username to configure this account." msgstr "Musíte vložiť meno používateľa pre konfuguráciu tohoto účtu." -#: ../src/config.py:3022 ../src/dialogs.py:1316 -msgid "Invalid password" -msgstr "Nesprávne heslo" - -#: ../src/config.py:3023 -msgid "You must enter a password for the new account." -msgstr "Musíte vložiť heslo pre nový účet." - -#: ../src/config.py:3027 ../src/dialogs.py:1321 -msgid "Passwords do not match" -msgstr "Heslá sa nezhodujú" - -#: ../src/config.py:3028 ../src/dialogs.py:1322 -msgid "The passwords typed in both fields must be identical." -msgstr "Heslá vložené do oboch polí musia zhodovať." - -#: ../src/config.py:3047 +#: ../src/config.py:3144 msgid "Duplicate Jabber ID" -msgstr "Duplikované Jabber ID" +msgstr "" -#: ../src/config.py:3048 +#: ../src/config.py:3145 msgid "This account is already configured in Gajim." -msgstr "Tento účet už v Gajime nastavný." +msgstr "Tento účet už nastavný v Gajim." -#: ../src/config.py:3065 +#: ../src/config.py:3162 msgid "Account has been added successfully" msgstr "Účet bol úspešne pridaný" -#: ../src/config.py:3066 ../src/config.py:3101 +#: ../src/config.py:3163 ../src/config.py:3350 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 "" -"Môžete nastaviť rozšírené možnosti účtu stlačením tlačidla Rozšírené " -"možnosti, alebo neskôr kliknutím na položku Účty v menu Upraviť, v hlavnom " -"okne" +"Môžete nastaviť pokročilé vlastnosti účtu stlačením tlačidla Pokročilé, " +"alebo neskôr zvolením položky Účty v menu Upraviť v hlavnom okne." -#: ../src/config.py:3100 +#: ../src/config.py:3181 +msgid "Invalid server" +msgstr "" + +#: ../src/config.py:3182 +msgid "Please provide a server on which you want to register." +msgstr "" + +#: ../src/config.py:3233 ../src/gajim.py:2210 +msgid "Certificate Already in File" +msgstr "" + +#: ../src/config.py:3234 ../src/gajim.py:2211 +#, python-format +msgid "This certificate is already in file %s, so it's not added again." +msgstr "" + +#: ../src/config.py:3302 +#, 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:3308 ../src/gajim.py:2226 +#, python-format +msgid "" +"Add this certificate to the list of trusted certificates.\n" +"SHA1 fingerprint of the certificate:\n" +"%s" +msgstr "" + +#: ../src/config.py:3329 ../src/config.py:3368 +msgid "An error occurred during account creation" +msgstr "" + +#: ../src/config.py:3349 msgid "Your new account has been created successfully" -msgstr "Váš nový účet bol vytvorený úspešne" +msgstr "Váš nový účet bol úspešne vytvorený" -#: ../src/config.py:3118 -msgid "An error occured during account creation" -msgstr "Nastala chyba pri vytváraní účtu" - -#: ../src/config.py:3176 +#: ../src/config.py:3452 msgid "Account name is in use" -msgstr "Názov účtu je už používané" +msgstr "Názov účtu je už používaný" -#: ../src/config.py:3177 +#: ../src/config.py:3453 msgid "You already have an account using this name." msgstr "Už máte účet s týmto názvom." -#: ../src/conversation_textview.py:273 +#: ../src/conversation_textview.py:453 msgid "" "Text below this line is what has been said since the last time you paid " "attention to this group chat" @@ -3036,250 +3396,842 @@ msgstr "" "Zatiaľ čo ste nevenovali pozornosť tejto diskusnej skupine, pribudol " "nasledujúci text" -#: ../src/conversation_textview.py:342 +#: ../src/conversation_textview.py:551 #, python-format msgid "_Actions for \"%s\"" msgstr "_Akcie pre \"%s\"" -#: ../src/conversation_textview.py:354 +#: ../src/conversation_textview.py:563 msgid "Read _Wikipedia Article" msgstr "Čítať článok na _Wikipédii" -#: ../src/conversation_textview.py:359 +#: ../src/conversation_textview.py:568 msgid "Look it up in _Dictionary" -msgstr "Vyhľadať to v _Slovníku" +msgstr "Vyhľadať to v _slovníku" #. we must have %s in the url if not WIKTIONARY -#: ../src/conversation_textview.py:375 +#: ../src/conversation_textview.py:584 #, python-format msgid "Dictionary URL is missing an \"%s\" and it is not WIKTIONARY" -msgstr "URL Slovníka chýba \"%s\" a nie je WIKTIONÁRNE" +msgstr "" #. we must have %s in the url -#: ../src/conversation_textview.py:388 +#: ../src/conversation_textview.py:597 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "URL pre web vyhľadávanie chýba \"%s\"" -#: ../src/conversation_textview.py:391 +#: ../src/conversation_textview.py:600 msgid "Web _Search for it" msgstr "_Hľadať na webe" -#: ../src/conversation_textview.py:397 +#: ../src/conversation_textview.py:606 msgid "Open as _Link" msgstr "Otvoriť ako _odkaz" -#: ../src/conversation_textview.py:757 +#: ../src/conversation_textview.py:1072 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:761 +#: ../src/conversation_textview.py:1076 #, python-format msgid "%i days ago" msgstr "Pred %i dňami" #. if we have subject, show it too! -#: ../src/conversation_textview.py:793 +#: ../src/conversation_textview.py:1110 #, python-format msgid "Subject: %s\n" msgstr "Predmet: %s\n" -#: ../src/dialogs.py:59 +#: ../src/dataforms_widget.py:537 +msgid "Jabber ID already in list" +msgstr "" + +#: ../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 "nové@jabber.id" + +#: ../src/dataforms_widget.py:552 ../src/dataforms_widget.py:554 +#, python-format +msgid "new%d@jabber.id" +msgstr "nové%d@jabber.id" + +#: ../src/dialogs.py:71 #, python-format msgid "Contact name: %s" msgstr "Kontaktné meno: %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 "Skupina" -#: ../src/dialogs.py:218 +#: ../src/dialogs.py:230 msgid "In the group" msgstr "V skupine" -#: ../src/dialogs.py:269 +#: ../src/dialogs.py:330 msgid "KeyID" msgstr "ID kľúča" -#: ../src/dialogs.py:272 +#: ../src/dialogs.py:335 msgid "Contact name" -msgstr "Kontaktné meno" +msgstr "Meno kontaktu" -#: ../src/dialogs.py:318 +#: ../src/dialogs.py:374 +msgid "doing_chores" +msgstr "" + +#: ../src/dialogs.py:374 +msgid "drinking" +msgstr "" + +#: ../src/dialogs.py:374 +msgid "eating" +msgstr "jem" + +#: ../src/dialogs.py:375 +msgid "excercising" +msgstr "" + +#: ../src/dialogs.py:375 +msgid "grooming" +msgstr "" + +#: ../src/dialogs.py:375 +msgid "having_appointment" +msgstr "" + +#: ../src/dialogs.py:376 +msgid "inactive" +msgstr "" + +#: ../src/dialogs.py:376 +msgid "relaxing" +msgstr "" + +#: ../src/dialogs.py:376 +msgid "talking" +msgstr "" + +#: ../src/dialogs.py:376 +msgid "traveling" +msgstr "" + +#: ../src/dialogs.py:377 +msgid "working" +msgstr "pracujem" + +#: ../src/dialogs.py:378 +msgid "at_the_spa" +msgstr "" + +#: ../src/dialogs.py:378 +msgid "brushing_teeth" +msgstr "" + +#: ../src/dialogs.py:379 +msgid "buying_groceries" +msgstr "" + +#: ../src/dialogs.py:379 +msgid "cleaning" +msgstr "" + +#: ../src/dialogs.py:379 +msgid "coding" +msgstr "" + +#: ../src/dialogs.py:380 +msgid "commuting" +msgstr "" + +#: ../src/dialogs.py:380 +msgid "cooking" +msgstr "" + +#: ../src/dialogs.py:380 +msgid "cycling" +msgstr "" + +#: ../src/dialogs.py:380 +msgid "day_off" +msgstr "" + +#: ../src/dialogs.py:381 +msgid "doing_maintenance" +msgstr "" + +#: ../src/dialogs.py:381 +msgid "doing_the_dishes" +msgstr "" + +#: ../src/dialogs.py:382 +msgid "doing_the_laundry" +msgstr "" + +#: ../src/dialogs.py:382 +msgid "driving" +msgstr "" + +#: ../src/dialogs.py:382 +msgid "gaming" +msgstr "" + +#: ../src/dialogs.py:383 +msgid "gardening" +msgstr "" + +#: ../src/dialogs.py:383 +msgid "getting_a_haircut" +msgstr "" + +#: ../src/dialogs.py:383 +msgid "going_out" +msgstr "" + +#: ../src/dialogs.py:384 +msgid "hanging_out" +msgstr "" + +#: ../src/dialogs.py:384 +msgid "having_a_beer" +msgstr "" + +#: ../src/dialogs.py:384 +msgid "having_a_snack" +msgstr "" + +#: ../src/dialogs.py:385 +msgid "having_breakfast" +msgstr "" + +#: ../src/dialogs.py:385 +msgid "having_coffee" +msgstr "" + +#: ../src/dialogs.py:386 +msgid "having_dinner" +msgstr "" + +#: ../src/dialogs.py:386 +msgid "having_lunch" +msgstr "" + +#: ../src/dialogs.py:386 +msgid "having_tea" +msgstr "" + +#: ../src/dialogs.py:387 +msgid "hiking" +msgstr "" + +#: ../src/dialogs.py:387 +msgid "in_a_car" +msgstr "" + +#: ../src/dialogs.py:387 +msgid "in_a_meeting" +msgstr "" + +#: ../src/dialogs.py:388 +msgid "in_real_life" +msgstr "" + +#: ../src/dialogs.py:388 +msgid "jogging" +msgstr "" + +#: ../src/dialogs.py:388 +msgid "on_a_bus" +msgstr "" + +#: ../src/dialogs.py:389 +msgid "on_a_plane" +msgstr "" + +#: ../src/dialogs.py:389 +msgid "on_a_train" +msgstr "" + +#: ../src/dialogs.py:389 +msgid "on_a_trip" +msgstr "" + +#: ../src/dialogs.py:390 +msgid "on_the_phone" +msgstr "" + +#: ../src/dialogs.py:390 +msgid "on_vacation" +msgstr "" + +#: ../src/dialogs.py:390 +msgid "other" +msgstr "" + +#: ../src/dialogs.py:391 +msgid "partying" +msgstr "" + +#: ../src/dialogs.py:391 +msgid "playing_sports" +msgstr "" + +#: ../src/dialogs.py:391 +msgid "reading" +msgstr "" + +#: ../src/dialogs.py:392 +msgid "rehearsing" +msgstr "" + +#: ../src/dialogs.py:392 +msgid "running" +msgstr "" + +#: ../src/dialogs.py:392 +msgid "running_an_errand" +msgstr "" + +#: ../src/dialogs.py:393 +msgid "scheduled_holiday" +msgstr "" + +#: ../src/dialogs.py:393 +msgid "shaving" +msgstr "" + +#: ../src/dialogs.py:393 +msgid "shopping" +msgstr "" + +#: ../src/dialogs.py:394 +msgid "skiing" +msgstr "lyžujem" + +#: ../src/dialogs.py:394 +msgid "sleeping" +msgstr "spím" + +#: ../src/dialogs.py:394 +msgid "socializing" +msgstr "" + +#: ../src/dialogs.py:395 +msgid "studying" +msgstr "" + +#: ../src/dialogs.py:395 +msgid "sunbathing" +msgstr "" + +#: ../src/dialogs.py:395 +msgid "swimming" +msgstr "plávanie" + +#: ../src/dialogs.py:396 +msgid "taking_a_bath" +msgstr "" + +#: ../src/dialogs.py:396 +msgid "taking_a_shower" +msgstr "" + +#: ../src/dialogs.py:396 +msgid "walking" +msgstr "" + +#: ../src/dialogs.py:397 +msgid "walking_the_dog" +msgstr "" + +#: ../src/dialogs.py:397 +msgid "watching_tv" +msgstr "" + +#: ../src/dialogs.py:398 +msgid "watching_a_movie" +msgstr "" + +#: ../src/dialogs.py:398 +msgid "working_out" +msgstr "" + +#: ../src/dialogs.py:398 +msgid "writing" +msgstr "píšem" + +#: ../src/dialogs.py:404 +msgid "Activity" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "afraid" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "amazed" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "angry" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "annoyed" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "anxious" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "aroused" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "ashamed" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "bored" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "brave" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "calm" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "cold" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "confused" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "contented" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "cranky" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "curious" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "depressed" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "disappointed" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "disgusted" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "distracted" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "embarrassed" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "excited" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "flirtatious" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "frustrated" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "grumpy" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "guilty" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "happy" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "hot" +msgstr "horúci" + +#: ../src/dialogs.py:454 +msgid "humbled" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "humiliated" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "hungry" +msgstr "hladný" + +#: ../src/dialogs.py:454 +msgid "hurt" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "impressed" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "in_awe" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "in_love" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "indignant" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "interested" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "intoxicated" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "invincible" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "jealous" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "lonely" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "mean" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "moody" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "nervous" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "neutral" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "offended" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "playful" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "proud" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "relieved" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "remorseful" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "restless" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "sad" +msgstr "smutný" + +#: ../src/dialogs.py:454 +msgid "sarcastic" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "serious" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "shocked" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "shy" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "sick" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "sleepy" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "stressed" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "surprised" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "thirsty" +msgstr "" + +#: ../src/dialogs.py:454 +msgid "worried" +msgstr "" + +#: ../src/dialogs.py:460 +msgid "Mood" +msgstr "" + +#: ../src/dialogs.py:500 #, python-format msgid "%s Status Message" -msgstr "%s Správa o stave" +msgstr "%s správa o stave" -#: ../src/dialogs.py:320 +#: ../src/dialogs.py:502 msgid "Status Message" msgstr "Správa o stave" -#: ../src/dialogs.py:395 +#: ../src/dialogs.py:602 msgid "Save as Preset Status Message" msgstr "Uložiť ako prednastavenú správu o stave" -#: ../src/dialogs.py:396 +#: ../src/dialogs.py:603 msgid "Please type a name for this status message" msgstr "Zadajte prosím názov pre túto stavovú správu" -#: ../src/dialogs.py:417 -msgid "AIM Address:" -msgstr "_AIM adresa:" +#: ../src/dialogs.py:614 +msgid "Overwrite Status Message?" +msgstr "" -#: ../src/dialogs.py:418 +#: ../src/dialogs.py:615 +msgid "" +"This name is already used. Do you want to overwrite this status message?" +msgstr "Tento názov je už použitý. Chcete prepísať túto správu o stave?" + +#: ../src/dialogs.py:631 +msgid "AIM Address:" +msgstr "AIM adresa:" + +#: ../src/dialogs.py:632 msgid "GG Number:" msgstr "GG číslo:" -#: ../src/dialogs.py:419 +#: ../src/dialogs.py:633 msgid "ICQ Number:" msgstr "ICQ číslo:" -#: ../src/dialogs.py:420 +#: ../src/dialogs.py:634 msgid "MSN Address:" -msgstr "_MSN adresa:" +msgstr "MSN adresa:" -#: ../src/dialogs.py:421 +#: ../src/dialogs.py:635 msgid "Yahoo! Address:" msgstr "Yahoo! adresa:" -#: ../src/dialogs.py:457 +#: ../src/dialogs.py:672 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" msgstr "Prosím vyplňte údaje o kontakte, ktorý chcete pridať do účtu %s" -#: ../src/dialogs.py:459 +#: ../src/dialogs.py:674 msgid "Please fill in the data of the contact you want to add" msgstr "Prosím vyplňte údaje o kontakte, ktorý chcete pridať" -#: ../src/dialogs.py:609 ../src/dialogs.py:615 +#: ../src/dialogs.py:831 ../src/dialogs.py:837 msgid "Invalid User ID" msgstr "Nespravné ID používateľa" -#: ../src/dialogs.py:616 +#: ../src/dialogs.py:838 msgid "The user ID must not contain a resource." msgstr "ID používateľa nesmie obsahovať zdroj." -#: ../src/dialogs.py:630 +#: ../src/dialogs.py:852 msgid "Contact already in roster" -msgstr "Kontakt je už v zozname" +msgstr "" -#: ../src/dialogs.py:631 +#: ../src/dialogs.py:853 msgid "This contact is already listed in your roster." msgstr "Tento kontakt je už uvedený v zozname." -#: ../src/dialogs.py:665 +#: ../src/dialogs.py:889 msgid "User ID:" msgstr "Používateľské ID:" -#: ../src/dialogs.py:728 +#: ../src/dialogs.py:951 msgid "A GTK+ jabber client" msgstr "GTK+ jabber klient" -#: ../src/dialogs.py:729 +#: ../src/dialogs.py:952 msgid "GTK+ Version:" -msgstr "GTK+ verzia:" +msgstr "Verzia GTK+:" -#: ../src/dialogs.py:730 +#: ../src/dialogs.py:953 msgid "PyGTK Version:" -msgstr "PyGTK verzia:" +msgstr "Verzia PyGTK:" -#: ../src/dialogs.py:744 +#: ../src/dialogs.py:967 msgid "Current Developers:" msgstr "Súčasní vývojári:" -#: ../src/dialogs.py:746 +#: ../src/dialogs.py:969 msgid "Past Developers:" msgstr "Bývalí vývojári:" -#: ../src/dialogs.py:756 +#: ../src/dialogs.py:979 msgid "THANKS:" msgstr "POĎAKOVANIE:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:762 +#: ../src/dialogs.py:985 msgid "Last but not least, we would like to thank all the package maintainers." -msgstr "" -"V neposlednom rade ďakujeme všetkým správcom balíkov (package maintainers)" +msgstr "V neposlednom rade ďakujeme všetkým správcom balíkov." #. here you write your name in the form Name FamilyName -#: ../src/dialogs.py:776 +#: ../src/dialogs.py:998 msgid "translator-credits" msgstr "" "Juraj Michálek (juraj.michalek AT asinus.org)\n" -"Peter Trško (dogmat AT dogmat.us)" +"Peter Trško (dogmat AT dogmat.us)\n" +"Pavol Klačanský " -#: ../src/dialogs.py:906 +#: ../src/dialogs.py:1130 #, python-format msgid "Unable to bind to port %s." -msgstr "Nie je možné pripojiť sa k portu %s." +msgstr "Nie je možné použiť port %s." -#: ../src/dialogs.py:907 +#: ../src/dialogs.py:1131 msgid "" "Maybe you have another running instance of Gajim. File Transfer will be " -"canceled." +"cancelled." msgstr "" -"Pravdepodobne beží už druhý program Gajim. Prenos súborov bude zrušený." -#: ../src/dialogs.py:1058 +#: ../src/dialogs.py:1138 +#, 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 "" + +#: ../src/dialogs.py:1412 #, python-format msgid "Subscription request for account %s from %s" -msgstr "Požiadavka na prihlásenie pre účet %s od %s" +msgstr "Požiadavka na zápis pre účet %s od %s" -#: ../src/dialogs.py:1061 +#: ../src/dialogs.py:1415 #, python-format msgid "Subscription request from %s" msgstr "Požiadavka na prihlásenie od %s" -#: ../src/dialogs.py:1121 ../src/roster_window.py:681 +#: ../src/dialogs.py:1476 ../src/roster_window.py:778 #, python-format msgid "You are already in group chat %s" msgstr "Už ste v diskusnej skupine %s" -#: ../src/dialogs.py:1129 +#: ../src/dialogs.py:1484 msgid "You can not join a group chat unless you are connected." -msgstr "" -"Nemôžete sa pripojiť do diskusnej skupiny, pokiaľ nie ste prihlásený(á)" +msgstr "Nemôžete sa pripojiť do diskusnej skupiny, pokiaľ nie ste prihlásený." -#: ../src/dialogs.py:1144 +#: ../src/dialogs.py:1502 #, python-format msgid "Join Group Chat with account %s" msgstr "Pripojiť sa k diskusnej skupine s účtom %s" -#: ../src/dialogs.py:1212 ../src/dialogs.py:1218 +#: ../src/dialogs.py:1572 ../src/dialogs.py:1578 +#: ../src/groupchat_control.py:1719 msgid "Invalid group chat Jabber ID" msgstr "Nesprávne Jabber ID diskusnej skupiny" -#: ../src/dialogs.py:1213 ../src/dialogs.py:1219 +#: ../src/dialogs.py:1573 ../src/dialogs.py:1579 +#: ../src/groupchat_control.py:1720 msgid "The group chat Jabber ID has not allowed characters." -msgstr "Diskusná skupina obsahuje nepovolené znaky" +msgstr "" -#: ../src/dialogs.py:1225 +#: ../src/dialogs.py:1585 msgid "This is not a group chat" msgstr "Toto nie je diskusná skupina" -#: ../src/dialogs.py:1226 +#: ../src/dialogs.py:1586 #, python-format msgid "%s is not the name of a group chat." -msgstr "%s nie je meno v diskusnej skupine." +msgstr "%s nie je názov diskusnej skupiny." -#: ../src/dialogs.py:1248 +#: ../src/dialogs.py:1625 +msgid "Without a connection, you can not synchronise your contacts." +msgstr "Bez pripojenie nemôžete synchronizovať vaše kontakty." + +#: ../src/dialogs.py:1639 +msgid "Server" +msgstr "Server" + +#: ../src/dialogs.py:1672 +msgid "This account is not connected to the server" +msgstr "" + +#: ../src/dialogs.py:1673 +msgid "You cannot synchronize with an account unless it is connected." +msgstr "" + +#: ../src/dialogs.py:1697 +msgid "Synchronise" +msgstr "" + +#: ../src/dialogs.py:1755 #, python-format msgid "Start Chat with account %s" msgstr "Začať rozhovor s účtom %s" -#: ../src/dialogs.py:1250 +#: ../src/dialogs.py:1757 msgid "Start Chat" msgstr "Začať rozhovor" -#: ../src/dialogs.py:1251 +#: ../src/dialogs.py:1758 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" @@ -3288,476 +4240,755 @@ msgstr "" "odoslať správu:" #. if offline or connecting -#: ../src/dialogs.py:1276 ../src/dialogs.py:1635 ../src/dialogs.py:1764 +#: ../src/dialogs.py:1783 ../src/dialogs.py:2159 ../src/dialogs.py:2300 msgid "Connection not available" msgstr "Pripojenie nie je dostupné" -#: ../src/dialogs.py:1277 ../src/dialogs.py:1636 ../src/dialogs.py:1765 +#: ../src/dialogs.py:1784 ../src/dialogs.py:2160 ../src/dialogs.py:2301 #, python-format msgid "Please make sure you are connected with \"%s\"." -msgstr "Prosím, uistite sa, že ste pripojený(á) k \"%s\"." +msgstr "Prosím, uistite sa, že ste pripojený k \"%s\"." -#: ../src/dialogs.py:1286 ../src/dialogs.py:1289 +#: ../src/dialogs.py:1793 ../src/dialogs.py:1796 msgid "Invalid JID" -msgstr "Nespravné JID" +msgstr "Nesprávne JID" -#: ../src/dialogs.py:1289 +#: ../src/dialogs.py:1796 #, python-format msgid "Unable to parse \"%s\"." msgstr "Nie je možné spracovať \"%s\"." -#: ../src/dialogs.py:1298 +#: ../src/dialogs.py:1805 msgid "Without a connection, you can not change your password." msgstr "Bez pripojenia nemôžete meniť heslo." -#: ../src/dialogs.py:1317 +#: ../src/dialogs.py:1823 +msgid "Invalid password" +msgstr "Nesprávne heslo" + +#: ../src/dialogs.py:1824 msgid "You must enter a password." msgstr "Musíte vložiť heslo." +#: ../src/dialogs.py:1828 +msgid "Passwords do not match" +msgstr "Heslá sa nezhodujú" + +#: ../src/dialogs.py:1829 +msgid "The passwords typed in both fields must be identical." +msgstr "Heslá vložené do oboch polí sa musia zhodovať." + #. img to display #. default value -#: ../src/dialogs.py:1364 ../src/notify.py:211 ../src/notify.py:411 +#: ../src/dialogs.py:1871 ../src/notify.py:234 ../src/notify.py:449 msgid "Contact Signed In" msgstr "Kontakt sa prihlasil" -#: ../src/dialogs.py:1366 ../src/notify.py:219 ../src/notify.py:413 +#: ../src/dialogs.py:1873 ../src/notify.py:242 ../src/notify.py:451 msgid "Contact Signed Out" msgstr "Kontakt sa odhlásil" #. chat message -#: ../src/dialogs.py:1368 ../src/notify.py:238 ../src/notify.py:415 +#: ../src/dialogs.py:1875 ../src/notify.py:265 ../src/notify.py:453 msgid "New Message" msgstr "Nová správa" #. single message -#: ../src/dialogs.py:1368 ../src/notify.py:223 ../src/notify.py:415 +#: ../src/dialogs.py:1875 ../src/notify.py:246 ../src/notify.py:453 msgid "New Single Message" msgstr "Nová krátka správa" #. private message -#: ../src/dialogs.py:1369 ../src/notify.py:230 ../src/notify.py:416 +#: ../src/dialogs.py:1876 ../src/notify.py:253 ../src/notify.py:454 msgid "New Private Message" -msgstr "Nová privátna správa" +msgstr "Nová súkromná správa" -#: ../src/dialogs.py:1369 ../src/gajim.py:1216 ../src/notify.py:424 +#: ../src/dialogs.py:1876 ../src/gajim.py:1562 ../src/notify.py:462 msgid "New E-mail" -msgstr "Nový E-mail" +msgstr "Nový e-mail" -#: ../src/dialogs.py:1371 ../src/gajim.py:1369 ../src/notify.py:418 +#: ../src/dialogs.py:1878 ../src/gajim.py:1737 ../src/notify.py:456 msgid "File Transfer Request" msgstr "Požiadavka na prenos súboru" -#: ../src/dialogs.py:1373 ../src/gajim.py:1188 ../src/gajim.py:1345 -#: ../src/notify.py:420 +#: ../src/dialogs.py:1880 ../src/gajim.py:1534 ../src/gajim.py:1704 +#: ../src/notify.py:458 msgid "File Transfer Error" msgstr "Chyba pri prenose súboru" -#: ../src/dialogs.py:1375 ../src/gajim.py:1408 ../src/gajim.py:1430 -#: ../src/gajim.py:1447 ../src/notify.py:422 +#: ../src/dialogs.py:1882 ../src/gajim.py:1776 ../src/gajim.py:1798 +#: ../src/gajim.py:1815 ../src/notify.py:460 msgid "File Transfer Completed" msgstr "Prenos súboru dokončený" -#: ../src/dialogs.py:1376 ../src/gajim.py:1411 ../src/notify.py:422 +#: ../src/dialogs.py:1883 ../src/gajim.py:1779 ../src/notify.py:460 msgid "File Transfer Stopped" msgstr "Prenos súboru zastavený" -#: ../src/dialogs.py:1378 ../src/gajim.py:1086 ../src/notify.py:426 +#: ../src/dialogs.py:1885 ../src/gajim.py:1385 ../src/notify.py:464 msgid "Groupchat Invitation" msgstr "Pozvánka do diskusnej skupiny" -#: ../src/dialogs.py:1380 ../src/notify.py:203 ../src/notify.py:428 +#: ../src/dialogs.py:1887 ../src/notify.py:226 ../src/notify.py:466 msgid "Contact Changed Status" msgstr "Kontakt zmenil stav" -#: ../src/dialogs.py:1565 +#: ../src/dialogs.py:2078 #, python-format msgid "Single Message using account %s" msgstr "Krátka správa s použitím účtu %s" -#: ../src/dialogs.py:1567 +#: ../src/dialogs.py:2080 #, python-format msgid "Single Message in account %s" msgstr "Krátka správa v účte %s" -#: ../src/dialogs.py:1569 +#: ../src/dialogs.py:2082 msgid "Single Message" msgstr "Krátka správa" #. prepare UI for Sending -#: ../src/dialogs.py:1572 +#: ../src/dialogs.py:2085 #, python-format msgid "Send %s" msgstr "Poslať %s" #. prepare UI for Receiving -#: ../src/dialogs.py:1595 +#: ../src/dialogs.py:2108 #, python-format msgid "Received %s" msgstr "Prijatý %s" +#. prepare UI for Receiving +#: ../src/dialogs.py:2131 +#, 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:1667 +#: ../src/dialogs.py:2201 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:1668 +#: ../src/dialogs.py:2202 #, python-format msgid "%s wrote:\n" msgstr "%s napísal:\n" -#: ../src/dialogs.py:1712 +#: ../src/dialogs.py:2246 #, python-format msgid "XML Console for %s" msgstr "XML konzola pre %s" -#: ../src/dialogs.py:1714 +#: ../src/dialogs.py:2248 msgid "XML Console" msgstr "XML konzola" -#: ../src/dialogs.py:1835 +#: ../src/dialogs.py:2371 #, python-format msgid "Privacy List %s" msgstr "Súkromný zoznam %s" -#: ../src/dialogs.py:1839 +#: ../src/dialogs.py:2375 #, python-format msgid "Privacy List for %s" msgstr "Súkromný zoznam pre %s" -#: ../src/dialogs.py:1887 +#: ../src/dialogs.py:2431 #, python-format msgid "Order: %s, action: %s, type: %s, value: %s" msgstr "Poradie: %s, akcia: %s, typ: %s, hodnota: %s" -#: ../src/dialogs.py:1890 +#: ../src/dialogs.py:2434 #, python-format msgid "Order: %s, action: %s" msgstr "Poradie: %s, akcia: %s" -#: ../src/dialogs.py:1932 +#: ../src/dialogs.py:2476 msgid "Edit a rule" msgstr "Upraviť pravidlo" -#: ../src/dialogs.py:2019 +#: ../src/dialogs.py:2563 msgid "Add a rule" msgstr "Pridať pravidlo" -#: ../src/dialogs.py:2115 +#: ../src/dialogs.py:2659 #, python-format msgid "Privacy Lists for %s" -msgstr "Súkromný zoznam pre %s" +msgstr "Súkromné zoznamy pre %s" -#: ../src/dialogs.py:2117 +#: ../src/dialogs.py:2661 msgid "Privacy Lists" -msgstr "Súkromný zoznam" +msgstr "Súkromné zoznamy" -#: ../src/dialogs.py:2185 +#: ../src/dialogs.py:2731 msgid "Invalid List Name" -msgstr "Nesprávne meno" +msgstr "Nesprávny názov zoznamu" -#: ../src/dialogs.py:2186 +#: ../src/dialogs.py:2732 msgid "You must enter a name to create a privacy list." -msgstr "Musíte vložiť meno, aby bolo možné vytvoriť nový súkromný zoznam." +msgstr "Musíte vložiť názov, aby bolo možné vytvoriť nový súkromný zoznam." -#. FIXME: use nickname instead of contact_jid -#: ../src/dialogs.py:2220 +#: ../src/dialogs.py:2769 +msgid "$Contact has invited you to join a discussion" +msgstr "" + +#: ../src/dialogs.py:2771 #, python-format -msgid "%(contact_jid)s has invited you to group chat %(room_jid)s" -msgstr "%(contact_jid)s vás pozval do diskusnej skupiny %(room_jid)s" +msgid "$Contact has invited you to group chat %(room_jid)s" +msgstr "" -#. only if not None and not '' -#: ../src/dialogs.py:2226 +#: ../src/dialogs.py:2784 #, python-format msgid "Comment: %s" msgstr "Komentár: %s" -#: ../src/dialogs.py:2288 +#: ../src/dialogs.py:2850 msgid "Choose Sound" msgstr "Vybrať zvuk" -#: ../src/dialogs.py:2298 ../src/dialogs.py:2343 +#: ../src/dialogs.py:2860 ../src/dialogs.py:2911 msgid "All files" msgstr "Všetky súbory" -#: ../src/dialogs.py:2303 +#: ../src/dialogs.py:2865 msgid "Wav Sounds" msgstr "Wav zvuky" -#: ../src/dialogs.py:2333 +#: ../src/dialogs.py:2898 msgid "Choose Image" -msgstr "Vyberte obrázok" +msgstr "Vybrať obrázok" -#: ../src/dialogs.py:2348 +#: ../src/dialogs.py:2916 msgid "Images" msgstr "Obrázky" -#: ../src/dialogs.py:2405 +#: ../src/dialogs.py:2981 #, python-format msgid "When %s becomes:" msgstr "Keď %s sa stane:" -#: ../src/dialogs.py:2407 +#: ../src/dialogs.py:2983 #, python-format msgid "Adding Special Notification for %s" -msgstr "Pridať špeciálne na %s" +msgstr "" #. # means number -#: ../src/dialogs.py:2478 +#: ../src/dialogs.py:3054 msgid "#" msgstr "#" -#: ../src/dialogs.py:2484 +#: ../src/dialogs.py:3060 msgid "Condition" msgstr "Podmienka" -#: ../src/dialogs.py:2605 +#: ../src/dialogs.py:3178 msgid "when I am " -msgstr "keď som" +msgstr "keď som " -#: ../src/disco.py:101 +#: ../src/disco.py:110 msgid "Others" msgstr "Ostatný" -#: ../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:111 ../src/disco.py:112 ../src/disco.py:1320 +#: ../src/gajim.py:675 ../src/roster_window.py:295 ../src/roster_window.py:356 +#: ../src/roster_window.py:396 ../src/roster_window.py:505 +#: ../src/roster_window.py:537 ../src/roster_window.py:539 +#: ../src/roster_window.py:4893 ../src/roster_window.py:4895 +#: ../src/common/contacts.py:301 ../src/common/contacts.py:316 +#: ../src/common/helpers.py:53 msgid "Transports" msgstr "Transporty" #. conference is a category for listing mostly groupchats in service discovery -#: ../src/disco.py:105 +#: ../src/disco.py:114 msgid "Conference" msgstr "Konferencia" -#: ../src/disco.py:418 +#: ../src/disco.py:427 msgid "Without a connection, you can not browse available services" -msgstr "Bez pripojenia, nemôžete prehľadávať dostupné služby" +msgstr "Bez pripojenia, nemôžete prehliadať dostupné služby" -#: ../src/disco.py:497 +#: ../src/disco.py:501 #, python-format msgid "Service Discovery using account %s" -msgstr "Prehľadávanie služieb s použitím účtu %s" +msgstr "Prehliadanie služieb s použitím účtu %s" -#: ../src/disco.py:499 +#: ../src/disco.py:503 msgid "Service Discovery" -msgstr "Prehľadávanie služieb" +msgstr "Prehliadanie služieb" -#: ../src/disco.py:642 +#: ../src/disco.py:643 msgid "The service could not be found" msgstr "Služba nebola nájdená" -#: ../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." msgstr "" -"Žiadna služba Nie je k dispozícii na zadanej adrese alebo neodpovedá. " +"Žiadna služba nie je k dispozícii na zadanej adrese alebo neodpovedá. " "Skontrolujte adresu a skúste opäť." -#: ../src/disco.py:647 ../src/disco.py:928 +#: ../src/disco.py:648 ../src/disco.py:929 msgid "The service is not browsable" msgstr "Služba nie je prehľadávateľná" -#: ../src/disco.py:648 +#: ../src/disco.py:649 msgid "This type of service does not contain any items to browse." msgstr "Tento typ služby neobsahuje žiadne položky na prehľadávanie." -#: ../src/disco.py:728 +#: ../src/disco.py:729 #, python-format msgid "Browsing %s using account %s" -msgstr "Prehľadávanie %s s použitím účtu %s" +msgstr "Prehliadanie %s s použitím účtu %s" -#: ../src/disco.py:767 +#: ../src/disco.py:768 msgid "_Browse" -msgstr "_Prehľadávať" +msgstr "_Prehliadať" -#: ../src/disco.py:929 +#: ../src/disco.py:930 msgid "This service does not contain any items to browse." -msgstr "Táto služba neobsahuje žiadne položky." +msgstr "Táto služba neobsahuje žiadne položky na prehliadanie." -#: ../src/disco.py:1143 ../src/disco.py:1258 +#: ../src/disco.py:1151 +msgid "_Execute Command" +msgstr "_Vykonať príkaz" + +#: ../src/disco.py:1161 ../src/disco.py:1325 msgid "Re_gister" msgstr "Re_gistrácia" -#: ../src/disco.py:1295 +#: ../src/disco.py:1362 #, python-format msgid "Scanning %d / %d.." msgstr "Prieskum %d / %d.." #. Users column -#: ../src/disco.py:1476 +#: ../src/disco.py:1544 msgid "Users" msgstr "Používatelia" #. Description column -#: ../src/disco.py:1483 +#: ../src/disco.py:1552 msgid "Description" msgstr "Popis" #. Id column -#: ../src/disco.py:1490 +#: ../src/disco.py:1560 msgid "Id" msgstr "Id" -#: ../src/disco.py:1713 +#: ../src/disco.py:1789 msgid "Subscribed" msgstr "Prihlásiť" -#: ../src/disco.py:1739 +#: ../src/disco.py:1797 +msgid "Node" +msgstr "" + +#: ../src/disco.py:1854 msgid "New post" msgstr "Nová správa" -#: ../src/disco.py:1745 +#: ../src/disco.py:1860 msgid "_Subscribe" msgstr "_Zapísať" -#: ../src/disco.py:1751 +#: ../src/disco.py:1866 msgid "_Unsubscribe" msgstr "_Odhlásiť" -#: ../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 "" +"Knižnica používaná k overeniu serverových certifikátov, kvôli zaisteniu " +"bezpečného pripojenia." + +#: ../src/features_window.py:48 ../src/features_window.py:49 +msgid "Requires python-pyopenssl." +msgstr "Vyžaduje 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 "" + +#: ../src/features_window.py:52 +msgid "Requires python-avahi." +msgstr "Vyžaduje python-avahi." + +#: ../src/features_window.py:53 +msgid "Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." +msgstr "Vyžaduje 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 "Skript na ovládanie Gajim cez príkazový riadok." + +#: ../src/features_window.py:56 +msgid "Requires python-dbus." +msgstr "Vyžaduje 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 "" + +#: ../src/features_window.py:58 +msgid "OpenGPG" +msgstr "OpenGPG" + +#: ../src/features_window.py:59 +msgid "Encrypting chatmessages with gpg keys." +msgstr "Šifruje správy rozhovoru pomocou gpg kľúčov." + +#: ../src/features_window.py:60 +msgid "Requires gpg and python-GnuPGInterface." +msgstr "Vyžaduje gpg a python-GnuPGInterface." + +#: ../src/features_window.py:62 +msgid "network-manager" +msgstr "network-manager" + +#: ../src/features_window.py:63 +msgid "Autodetection of network status." +msgstr "Automaticky zistí stav siete." + +#: ../src/features_window.py:64 +msgid "Requires gnome-network-manager and python-dbus." +msgstr "Vyžaduje gnome-network-manager a python-dbus." + +#: ../src/features_window.py:66 +msgid "Session Management" +msgstr "Správa sedenia" + +#: ../src/features_window.py:67 +msgid "Gajim session is stored on logout and restored on login." +msgstr "Sedenie Gajim bude uložené pri odhlásení a obnovené pri prihlásení." + +#: ../src/features_window.py:68 +msgid "Requires python-gnome2." +msgstr "Vyžaduje python-gnome2." + +#: ../src/features_window.py:70 +msgid "gnome-keyring" +msgstr "gnome-keyring" + +#: ../src/features_window.py:71 +msgid "Passwords can be stored securely and not just in plaintext." +msgstr "Heslá môžu byť bezpečne uložené a nie sú v obyčajnom texte." + +#: ../src/features_window.py:72 +msgid "Requires gnome-keyring and python-gnome2-desktop." +msgstr "Vyžaduje gnome-keyring a python-gnome2-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 "Schopnosť pripojiť sa k serverom, ktoré používajú SRV protokoly." + +#: ../src/features_window.py:76 +msgid "Requires dnsutils." +msgstr "Vyžaduje dnsutils." + +#: ../src/features_window.py:77 +msgid "Requires nslookup to use SRV records." +msgstr "Vyžaduje nslookup k použitiu SRV protokolov." + +#: ../src/features_window.py:78 +msgid "Spell Checker" +msgstr "Kontrola pravopisu" + +#: ../src/features_window.py:79 +msgid "Spellchecking of composed messages." +msgstr "Kontrolovať pravopis vo vytvorených správach." + +#: ../src/features_window.py:80 +msgid "" +"Requires python-gnome2-extras or compilation of gtkspell module from Gajim " +"sources." +msgstr "" +"Vyžaduje python-gnome2-extras alebo kompiláciu gtkspell modulu zo zdrojových " +"kódov Gajim." + +#: ../src/features_window.py:82 +msgid "Notification-daemon" +msgstr "Notification-daemon" + +#: ../src/features_window.py:83 +msgid "Passive popups notifying for new events." +msgstr "Nereagujúce vyskakovacie upozornenia pre nové udalosti." + +#: ../src/features_window.py:84 +msgid "" +"Requires python-notify or instead python-dbus in conjunction with " +"notification-daemon." +msgstr "" +"Vyžaduje python-notify alebo instead python-dbus v spojení snotification-" +"daemon." + +#: ../src/features_window.py:86 +msgid "Trayicon" +msgstr "Trayikona" + +#: ../src/features_window.py:87 +msgid "A icon in systemtray reflecting the current presence." +msgstr "Ikona v oblasti systémových upozornení odráža prítomnosť." + +#: ../src/features_window.py:88 +msgid "" +"Requires python-gnome2-extras or compiled trayicon module from Gajim sources." +msgstr "" +"Vyžaduje python-gnome2-extras alebo skompilovaný modul trayicon zo " +"zdrojových kódov Gajim." + +#: ../src/features_window.py:89 +msgid "Requires PyGTK >= 2.10." +msgstr "Vyžaduje PyGTK >= 2.10." + +#: ../src/features_window.py:90 +msgid "Idle" +msgstr "Nečinný" + +#: ../src/features_window.py:91 +msgid "Ability to measure idle time, in order to set auto status." +msgstr "" +"Schopnosť odhadnúť čas nečinnosti v nastavení poradia automatických stavov." + +#: ../src/features_window.py:92 ../src/features_window.py:93 +msgid "Requires compilation of the idle module from Gajim sources." +msgstr "Vyžaduje kompiláciu idle modulu zo zdrojový kódov Gajim." + +#: ../src/features_window.py:94 +msgid "LaTeX" +msgstr "LaTeX" + +#: ../src/features_window.py:95 +msgid "Transform LaTeX expressions between $$ $$." +msgstr "Prevádza LaTeX výrazy medzi $$ $$." + +#: ../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 "" +"Vyžaduje texlive-latex-base, dvips a imagemagick. Nastavte 'use_latex' na " +"pravda v Editor rozšírenej konfigurácie." + +#: ../src/features_window.py:98 +msgid "End to end encryption" +msgstr "End to End šifrovanie" + +#: ../src/features_window.py:99 +msgid "Encrypting chatmessages." +msgstr "Šifrovanie správ rozhovorov." + +#: ../src/features_window.py:100 ../src/features_window.py:101 +msgid "Requires python-crypto." +msgstr "Vyžaduje python-crypto." + +#: ../src/features_window.py:102 +msgid "RST Generator" +msgstr "RST generátor" + +#: ../src/features_window.py:103 +msgid "" +"Generate XHTML output from RST code (see http://docutils.sourceforge.net/" +"docs/ref/rst/restructuredtext.html)." +msgstr "" +"Generuje XHTML z výstupu RST kódu (pozrite http://docutils.sourceforge.net/" +"docs/ref/rst/restructuredtext.html)." + +#: ../src/features_window.py:104 ../src/features_window.py:105 +msgid "Requires python-docutils." +msgstr "Vyžaduje python-docutils." + +#: ../src/features_window.py:106 +msgid "libsexy" +msgstr "libsexy" + +#: ../src/features_window.py:107 +msgid "Ability to have clickable URLs in chat and groupchat window banners." +msgstr "" +"Schopnosť spraviť klikacie URL v titulkoch okien rozhovorov a diskusných " +"skupín." + +#: ../src/features_window.py:108 ../src/features_window.py:109 +msgid "Requires python-sexy." +msgstr "Vyžaduje python-sexy." + +#: ../src/features_window.py:116 ../src/common/helpers.py:248 +msgid "Available" +msgstr "Prítomný" + +#: ../src/features_window.py:123 +msgid "Feature" +msgstr "Funkcia" + +#: ../src/filetransfers_window.py:77 msgid "File" msgstr "Súbor" -#: ../src/filetransfers_window.py:87 +#: ../src/filetransfers_window.py:92 msgid "Time" msgstr "Čas" -#: ../src/filetransfers_window.py:99 +#: ../src/filetransfers_window.py:104 msgid "Progress" msgstr "Stav" -#: ../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 "Názov súboru: %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 "Veľkosť: %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:485 msgid "You" msgstr "Vy" -#: ../src/filetransfers_window.py:174 +#: ../src/filetransfers_window.py:175 #, python-format msgid "Sender: %s" msgstr "Odosielateľ: %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:643 msgid "Recipient: " -msgstr "Príjemca:" +msgstr "Príjemca: " -#: ../src/filetransfers_window.py:186 +#: ../src/filetransfers_window.py:187 #, python-format msgid "Saved in: %s" msgstr "Uložené do: %s" -#: ../src/filetransfers_window.py:188 +#: ../src/filetransfers_window.py:189 msgid "File transfer completed" msgstr "Prenos súboru dokončený" -#: ../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 "Prenos súboru bol zrušený" -#: ../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 "Spojenie s druhou stranou nie je možné nadviazať." -#: ../src/filetransfers_window.py:224 +#: ../src/filetransfers_window.py:219 #, python-format msgid "Recipient: %s" msgstr "Príjemca: %s" -#: ../src/filetransfers_window.py:226 +#: ../src/filetransfers_window.py:221 #, python-format msgid "Error message: %s" msgstr "Chybová správa: %s" -#: ../src/filetransfers_window.py:227 -msgid "File transfer stopped by the contact of the other side" -msgstr "Prenos súboru bol zastavený druhou stranou" +#: ../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 "Vyberte súbor na odoslanie..." -#: ../src/filetransfers_window.py:263 +#: ../src/filetransfers_window.py:259 ../src/tooltips.py:683 +msgid "Description: " +msgstr "Popis:" + +#: ../src/filetransfers_window.py:270 msgid "Gajim cannot access this file" msgstr "Gajim nemôže pristupovať k tomuto súboru" -#: ../src/filetransfers_window.py:264 +#: ../src/filetransfers_window.py:271 msgid "This file is being used by another process." msgstr "Tento súbor je používaný iným procesom." -#: ../src/filetransfers_window.py:296 +#: ../src/filetransfers_window.py:303 #, python-format msgid "File: %s" msgstr "Súbor: %s" -#: ../src/filetransfers_window.py:301 +#: ../src/filetransfers_window.py:308 #, python-format msgid "Type: %s" msgstr "Typ: %s" -#: ../src/filetransfers_window.py:303 +#: ../src/filetransfers_window.py:310 #, python-format msgid "Description: %s" msgstr "Popis: %s" -#: ../src/filetransfers_window.py:304 +#: ../src/filetransfers_window.py:311 #, python-format msgid "%s wants to send you a file:" msgstr "%s vám chce poslať súbor:" -#: ../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 "Nie je možné prepísať existujúci súbor \"%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 "" -"Súbor s rovnakým menom už existuje a nemáte oprávnenie na jeho prepísanie." +"Súbor s rovnakým názvom už existuje a nemáte oprávnenie na jeho prepísanie." -#: ../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 "Tento súbor už existuje" -#: ../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 "Čo si prajete vykonať?" -#: ../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 "Do adresára \"%s\" nie je možné zapisovať" +msgstr "Do priečinku \"%s\" nie je možné zapisovať" -#: ../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 "Nemáte oprávnenie vytvoriť súbor v tomto adresári." +msgstr "Nemáte oprávnenie vytvoriť súbor v tomto priečinku." -#: ../src/filetransfers_window.py:348 +#: ../src/filetransfers_window.py:356 msgid "Save File as..." msgstr "Uložiť súbor ako..." #. 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" @@ -3765,60 +4996,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 "Nesprávny súbor" -#: ../src/filetransfers_window.py:544 +#: ../src/filetransfers_window.py:565 msgid "File: " -msgstr "Súbor: " +msgstr "Súbor:" -#: ../src/filetransfers_window.py:548 +#: ../src/filetransfers_window.py:569 msgid "It is not possible to send empty files" msgstr "Nie je možné poslať prázdne súbory" -#: ../src/filetransfers_window.py:568 ../src/tooltips.py:563 +#: ../src/filetransfers_window.py:591 ../src/tooltips.py:633 msgid "Name: " msgstr "Meno: " -#: ../src/filetransfers_window.py:570 ../src/tooltips.py:567 +#: ../src/filetransfers_window.py:593 ../src/tooltips.py:637 msgid "Sender: " msgstr "Odosielateľ: " -#: ../src/filetransfers_window.py:758 +#: ../src/filetransfers_window.py:781 msgid "Pause" -msgstr "Pauza" +msgstr "Pozastaviť" -#: ../src/gajim.py:47 -msgid "Gajim needs Xserver to run. Quiting..." -msgstr "Gajim potrebuje Xserver pre svoj beh. Ukončujem..." +#: ../src/gajim.py:71 +#, python-format +msgid "%s is not a valid loglevel" +msgstr "" -#: ../src/gajim.py:51 -msgid "Gajim needs PyGTK 2.6 or above" -msgstr "Gajim potrebuje PyGTK 2.6+ alebo novšie" +#: ../src/gajim.py:144 +msgid "Gajim needs X server to run. Quiting..." +msgstr "Gajim potrebuje X server k behu. Ukončujem..." -#: ../src/gajim.py:52 -msgid "Gajim needs PyGTK 2.6 or above to run. Quiting..." -msgstr "Gajim potrebuje PyGTK 2.6+ alebo novšie pre svoj beh. Ukončujem..." +#: ../src/gajim.py:171 +msgid "Gajim needs PyGTK 2.8 or above" +msgstr "Gajim potrebuje PyGTK 2.8 alebo vyššie" -#: ../src/gajim.py:54 -msgid "Gajim needs GTK 2.6 or above" -msgstr "Gajim potrebuje GTK 2.6+ alebo novšie" +#: ../src/gajim.py:172 +msgid "Gajim needs PyGTK 2.8 or above to run. Quiting..." +msgstr "Gajim potrebuje PyGTK 2.8 alebo vyššie k behu. Ukončujem..." -#: ../src/gajim.py:55 -msgid "Gajim needs GTK 2.6 or above to run. Quiting..." -msgstr "Gajim potrebuje GTK 2.6+ alebo novšiu pre svoj beh. Ukončujem..." +#: ../src/gajim.py:174 +msgid "Gajim needs GTK 2.8 or above" +msgstr "Gajim potrebuje GTK 2.8 alebo vyššie" -#: ../src/gajim.py:60 +#: ../src/gajim.py:175 +msgid "Gajim needs GTK 2.8 or above to run. Quiting..." +msgstr "Gajim potrebuje GTK 2.8 alebo vyššie k behu. Ukončujem..." + +#: ../src/gajim.py:180 msgid "GTK+ runtime is missing libglade support" -msgstr "GTK+ prostredie nemá podporu libglade" +msgstr "GTK+ prostredie nepodporuje libglade" -#: ../src/gajim.py:62 +#: ../src/gajim.py:182 #, python-format msgid "" "Please remove your current GTK+ runtime and install the latest stable " @@ -3827,22 +5063,22 @@ msgstr "" "Prosím, odstráňte vašu aktuálnu verziu GTK+ prostredia a nainštalujte si " "poslednú stabilnú verziu z %s" -#: ../src/gajim.py:64 +#: ../src/gajim.py:184 msgid "" "Please make sure that GTK+ and PyGTK have libglade support in your system." msgstr "" "Prosím, uistite sa, že GTK+ a PyGTK majú podporu pre libglade vo vašom " "systéme." -#: ../src/gajim.py:69 +#: ../src/gajim.py:189 msgid "Gajim needs PySQLite2 to run" msgstr "Gajim potrebuje PySQLite2 pre svoj beh" -#: ../src/gajim.py:77 +#: ../src/gajim.py:197 msgid "Gajim needs pywin32 to run" msgstr "Gajim vyžaduje pywin32 na spustenie" -#: ../src/gajim.py:78 +#: ../src/gajim.py:198 #, python-format msgid "" "Please make sure that Pywin32 is installed on your system. You can get it at " @@ -3852,11 +5088,11 @@ msgstr "" "získať na %s" #. set the icon to all newly opened wind -#: ../src/gajim.py:238 +#: ../src/gajim.py:342 msgid "Gajim is already running" msgstr "Gajim už beží" -#: ../src/gajim.py:239 +#: ../src/gajim.py:343 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -3864,88 +5100,182 @@ msgstr "" "Pravdepodobne už jeden program Gajim beží\n" "Želáte si aj napriek tomu spustiť Gajim?" -#: ../src/gajim.py:346 +#: ../src/gajim.py:366 ../src/common/connection_handlers.py:929 +#: ../src/common/connection_handlers.py:1653 +#: ../src/common/connection_handlers.py:1682 +#: ../src/common/connection_handlers.py:1692 +#: ../src/common/connection_handlers.py:1711 +#: ../src/common/connection_handlers.py:1962 +#: ../src/common/connection_handlers.py:2074 ../src/common/connection.py:1061 +msgid "Disk Write Error" +msgstr "Chyba pri zápise na disk" + +#: ../src/gajim.py:462 +msgid "Do you accept this request?" +msgstr "Prijať túto požiadavku?" + +#: ../src/gajim.py:464 +#, python-format +msgid "Do you accept this request on account %s?" +msgstr "" + +#: ../src/gajim.py:467 #, python-format msgid "HTTP (%s) Authorization for %s (id: %s)" -msgstr "HTTP (%s) Autorizácia pre %s (id: %s)" +msgstr "Overenie HTTP (%s) pre %s (id: %s)" -#: ../src/gajim.py:347 -msgid "Do you accept this request?" -msgstr "Akceptujete túto požiadavku?" - -#: ../src/gajim.py:393 ../src/notify.py:430 +#: ../src/gajim.py:514 ../src/notify.py:468 msgid "Connection Failed" msgstr "Spojenie zlyhalo" -#: ../src/gajim.py:706 +#: ../src/gajim.py:849 #, python-format msgid "Subject: %s" msgstr "Predmet: %s" #. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time)) -#: ../src/gajim.py:751 ../src/gajim.py:764 +#: ../src/gajim.py:896 ../src/gajim.py:909 #, python-format msgid "error while sending %s ( %s )" msgstr "chyba pri odosielaní %s ( %s )" -#: ../src/gajim.py:797 +#: ../src/gajim.py:942 msgid "Authorization accepted" msgstr "Autorizácia akceptovaná" -#: ../src/gajim.py:798 +#: ../src/gajim.py:943 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "" -"Kontakt \"%s\" vás autorizoval, aby ste mohol(a) vidieť jeho alebo jej stav." +"Kontakt \"%s\" vás autorizoval, aby ste mohol vidieť jeho alebo jej stav." -#: ../src/gajim.py:806 +#: ../src/gajim.py:951 #, python-format msgid "Contact \"%s\" removed subscription from you" -msgstr "Kontakt \"%s\" vás odobral zo svojho zoznamu" +msgstr "Kontakt \"%s\" vás odstránil zo svojho zoznamu" -#: ../src/gajim.py:807 +#: ../src/gajim.py:952 msgid "You will always see him or her as offline." -msgstr "Vždy uvidíte jeho alebo ju ako offline." +msgstr "Vždy uvidíte jeho alebo ju ako odhlásený." -#: ../src/gajim.py:850 +#: ../src/gajim.py:996 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "Spojenie s \"%s\" nie je možné nadviazať" -#: ../src/gajim.py:851 ../src/common/connection.py:406 +#: ../src/gajim.py:997 ../src/common/connection.py:562 msgid "Check your connection or try again later." -msgstr "Skontrolujte svoje pripojenie alebo skúste neskôr." +msgstr "Skontrolujte svoje pripojenie alebo to skúste neskôr." -#: ../src/gajim.py:999 ../src/roster_window.py:1197 +#: ../src/gajim.py:1172 ../src/groupchat_control.py:1016 +#, python-format +msgid "%s is now known as %s" +msgstr "%s je známy ako %s" + +#: ../src/gajim.py:1188 ../src/roster_window.py:1400 #, python-format msgid "%s is now %s (%s)" msgstr "%s je teraz %s (%s)" -#: ../src/gajim.py:1096 +#. No status message +#: ../src/gajim.py:1191 ../src/groupchat_control.py:1167 +#: ../src/roster_window.py:1403 +#, python-format +msgid "%s is now %s" +msgstr "%s je teraz %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:1312 ../src/groupchat_control.py:976 +msgid "Any occupant is allowed to see your full JID" +msgstr "" + +#: ../src/gajim.py:1315 +msgid "Room now shows unavailable member" +msgstr "" + +#: ../src/gajim.py:1317 +msgid "room now does not show unavailable members" +msgstr "" + +#: ../src/gajim.py:1320 +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:1323 +msgid "Room logging is now enabled" +msgstr "" + +#: ../src/gajim.py:1325 +msgid "Room logging is now disabled" +msgstr "" + +#: ../src/gajim.py:1327 +msgid "Room is now non-anonymous" +msgstr "" + +#: ../src/gajim.py:1330 +msgid "Room is now semi-anonymous" +msgstr "" + +#: ../src/gajim.py:1333 +msgid "Room is now fully-anonymous" +msgstr "" + +#: ../src/gajim.py:1365 +#, python-format +msgid "A Password is required to join the room %s. Please type it" +msgstr "" + +#: ../src/gajim.py:1399 +msgid "" +"You configured Gajim to use GPG agent, but there is no GPG agent running or " +"it returned a wrong passphrase.\n" +msgstr "" + +#: ../src/gajim.py:1401 +msgid "You are currently connected without your OpenPGP key." +msgstr "Momentálne ste pripojený bez vášho OpenPGP kľúča." + +#: ../src/gajim.py:1404 msgid "Your passphrase is incorrect" msgstr "Vaša passfráza je nesprávna" -#: ../src/gajim.py:1097 -msgid "You are currently connected without your OpenPGP key." -msgstr "Momentálne ste pripojený(á) bez vášho OpenPGP kľúča." +#: ../src/gajim.py:1421 +msgid "Passphrase Required" +msgstr "Passfráza je požadovaná" -#: ../src/gajim.py:1199 +#: ../src/gajim.py:1422 +#, python-format +msgid "Enter GPG key passphrase for account %s." +msgstr "Vložiť passfrázu ku GPG kľúču pre účet %s." + +#: ../src/gajim.py:1434 +msgid "Wrong Passphrase" +msgstr "Nesprávna passfráza" + +#: ../src/gajim.py:1435 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "Prosím zadajte znova vašu GPG passfrázu alebo stlačte Zrušiť." + +#: ../src/gajim.py:1545 #, python-format msgid "New mail on %(gmail_mail_address)s" -msgstr "Nový mail %(gmail_mail_address)s" +msgstr "Nový e-mail %(gmail_mail_address)s" -#: ../src/gajim.py:1201 +#: ../src/gajim.py:1547 #, python-format msgid "You have %d new mail conversation" msgid_plural "You have %d new mail conversations" -msgstr[0] "Máte %d novú E-mailovú správu" -msgstr[1] "Máte %d nových E-mailových správ" -msgstr[2] "Máte %d nových E-mailových správ" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" #. 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:1556 #, python-format msgid "" "\n" @@ -3954,125 +5284,201 @@ msgstr "" "\n" "Od: %(from_address)s" -#: ../src/gajim.py:1366 +#: ../src/gajim.py:1734 #, python-format msgid "%s wants to send you a file." msgstr "%s vám chce poslať súbor." -#: ../src/gajim.py:1431 +#: ../src/gajim.py:1799 #, python-format msgid "You successfully received %(filename)s from %(name)s." -msgstr "Úspešne ste prijali(a) súbor %(filename)s od %(name)s." +msgstr "Úspešne prijatý súbor %(filename)s od %(name)s." #. ft stopped -#: ../src/gajim.py:1435 +#: ../src/gajim.py:1803 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Prenos súboru %(filename)s od %(name)s zastavený." -#: ../src/gajim.py:1448 +#: ../src/gajim.py:1816 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "Úspešne odoslaný súbor %(filename)s pre %(name)s." #. ft stopped -#: ../src/gajim.py:1452 +#: ../src/gajim.py:1820 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Prenos súboru %(filename)s pre %(name)s zastavený." -#: ../src/gajim.py:1558 +#: ../src/gajim.py:1946 ../src/gajim.py:1990 +msgid "Confirm these session options" +msgstr "" + +#: ../src/gajim.py:1947 +#, 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:1991 +#, python-format +msgid "" +"The remote client selected these options:\n" +"\n" +"%s\n" +"\n" +"Continue with the session?" +msgstr "" + +#: ../src/gajim.py:2121 msgid "Username Conflict" msgstr "Konflikt používateľských mien" -#: ../src/gajim.py:1559 +#: ../src/gajim.py:2122 msgid "Please type a new username for your local account" -msgstr "Prosím, zadajte nové používateľské meno pre váš lokálny účet" +msgstr "Prosím, zadajte nové používateľské meno pre váš miestny účet" + +#: ../src/gajim.py:2139 +msgid "Ping?" +msgstr "" + +#: ../src/gajim.py:2147 +#, python-format +msgid "Pong! (%s s.)" +msgstr "" + +#: ../src/gajim.py:2153 +msgid "Error." +msgstr "Chyba." + +#: ../src/gajim.py:2178 +msgid "Resource Conflict" +msgstr "" + +#: ../src/gajim.py:2179 +msgid "" +"You are already connected to this account with the same resource. Please " +"type a new one" +msgstr "" + +#: ../src/gajim.py:2223 +msgid "Error verifying SSL certificate" +msgstr "" + +#: ../src/gajim.py:2224 +#, 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:2244 +msgid "SSL certificate error" +msgstr "" + +#: ../src/gajim.py:2245 +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:2606 msgid "Could not save your settings and preferences" -msgstr "Nie je možné uložiť nastavenia." +msgstr "Nie je možné uložiť nastavenia" -#: ../src/gajim.py:2090 +#. sorted alphanum +#: ../src/gajim.py:2743 ../src/common/config.py:102 +#: ../src/common/config.py:423 ../src/common/optparser.py:206 +#: ../src/common/optparser.py:424 ../src/common/optparser.py:458 +msgid "default" +msgstr "štandartná" + +#: ../src/gajim.py:2829 msgid "Network Manager support not available" msgstr "Podpora pre správcu sieťových spojení nie je k dispozícii" -#: ../src/gajim.py:2165 +#: ../src/gajim.py:2934 msgid "Session Management support not available (missing gnome.ui module)" msgstr "Podpora Správy sedenia nie je dostupná (chýba modul gnome.ui)" -#: ../src/gajim-remote.py:66 +#: ../src/gajim-remote.py:73 msgid "Shows a help on specific command" -msgstr "Zobrazí pomoc pre daný príkaz" +msgstr "Zobrazí pomocníka pre daný príkaz" #. User gets help for the command, specified by this parameter -#: ../src/gajim-remote.py:69 +#: ../src/gajim-remote.py:76 msgid "command" msgstr "príkaz" -#: ../src/gajim-remote.py:70 +#: ../src/gajim-remote.py:77 msgid "show help on command" -msgstr "ukáž pomoc pre príkaz" +msgstr "ukáž pomocníka pre príkaz" -#: ../src/gajim-remote.py:74 +#: ../src/gajim-remote.py:81 msgid "Shows or hides the roster window" -msgstr "Ukázať alebo skryť okno so zoznamom" +msgstr "Zobraziť alebo skryť okno so zoznamom" -#: ../src/gajim-remote.py:78 -msgid "Popups a window with the next pending event" -msgstr "Zobraz vyskakovacie okno s ďalšou neprečítanou správou" +#: ../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 "" -"Vypíše zoznam všetkých kontaktov v zozname. Každý kontakt bude na " -"samostatnom riadku" -#: ../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 "účet" -#: ../src/gajim-remote.py:84 +#: ../src/gajim-remote.py:92 msgid "show only contacts of the given account" msgstr "zobraziť len kontakty daného účtu" -#: ../src/gajim-remote.py:89 +#: ../src/gajim-remote.py:98 msgid "Prints a list of registered accounts" msgstr "Vypíše zoznam registrovaných účtov" -#: ../src/gajim-remote.py:93 +#: ../src/gajim-remote.py:102 msgid "Changes the status of account or accounts" msgstr "Zmeniť stav účtu alebo účtov" #. offline, online, chat, away, xa, dnd, invisible should not be translated -#: ../src/gajim-remote.py:96 +#: ../src/gajim-remote.py:105 msgid "status" msgstr "stav" -#: ../src/gajim-remote.py:96 +#: ../src/gajim-remote.py:105 msgid "one of: offline, online, chat, away, xa, dnd, invisible " msgstr "" -"jeden z: offline, online, chat, preč, diskutovať, zaneprázdnený, neviditeľný" +"jeden z: odhlásený, prítomný, chat, preč, diskutovať, zaneprázdnený, " +"neviditeľný" -#: ../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 "správa" -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:106 msgid "status message" msgstr "správa o stave" -#: ../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" @@ -4080,19 +5486,19 @@ msgstr "" "zmeniť stav účtu \"účet\". Ak nie je špecifikovaný, pokús sa zmeniť všetky " "účty, ktoré majú nastavenú vlastnosť \"synchronizácia s globálnym stavom\"" -#: ../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 "Zobrazí diskusné okno, takže môžete odoslať správu kontaktu" -#: ../src/gajim-remote.py:106 +#: ../src/gajim-remote.py:115 msgid "JID of the contact that you want to chat with" msgstr "JID kontaktu, s ktorým chcete komunikovať" -#: ../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 "ak je špecifikované, kontakt je zobraný zo zoznamu pre tento účet" -#: ../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 " @@ -4102,28 +5508,30 @@ msgstr "" "nepovinné. Ak chcete nastaviť iba 'účet', bez 'OpenPGP kľúča', nastavte " "'OpenPGP kľúč' na ''." -#: ../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 kontaktu, ktorý prijme správu" -#: ../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 "obsah správy" -#: ../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 kľúč" -#: ../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 "" "ak je špecifikovaný, správa bude zašifrovaná s použitím verejného kľúča" -#: ../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 "ak je špecifikovaný, správa bude odoslaná s použitím tohoto účtu" -#: ../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 " @@ -4133,128 +5541,136 @@ msgstr "" "nepovinné. Ak chcete nastaviť iba 'účet', bez 'OpenPGP kľúča', nastavte " "'OpenPGP kľúč' na ''." -#: ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:140 msgid "subject" msgstr "predmet" -#: ../src/gajim-remote.py:131 -msgid "message subject" -msgstr "Predmet správy" - #: ../src/gajim-remote.py:140 -msgid "Gets detailed info on a contact" -msgstr "Získať detailné informácie o kontakte" +msgid "message subject" +msgstr "predmet správy" -#: ../src/gajim-remote.py:142 ../src/gajim-remote.py:155 -#: ../src/gajim-remote.py:185 ../src/gajim-remote.py:194 +#: ../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 "" + +#: ../src/gajim-remote.py:158 +msgid "Gets detailed info on a contact" +msgstr "Získať podrobné informácie o kontakte" + +#: ../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 kontaktu" -#: ../src/gajim-remote.py:146 +#: ../src/gajim-remote.py:164 msgid "Gets detailed info on a account" -msgstr "Získať detailné informácie o účte" +msgstr "Získať podrobné informácie o účte" -#: ../src/gajim-remote.py:148 +#: ../src/gajim-remote.py:166 msgid "Name of the account" msgstr "Názov účtu" -#: ../src/gajim-remote.py:152 +#: ../src/gajim-remote.py:170 msgid "Sends file to a contact" msgstr "Poslať súbor kontaktu" -#: ../src/gajim-remote.py:154 +#: ../src/gajim-remote.py:172 msgid "file" msgstr "súbor" -#: ../src/gajim-remote.py:154 +#: ../src/gajim-remote.py:172 msgid "File path" msgstr "Cesta k súboru" -#: ../src/gajim-remote.py:156 +#: ../src/gajim-remote.py:174 msgid "if specified, file will be sent using this account" msgstr "ak je špecifikovaný, súbor bude odoslaný s použitím tohto účtom" -#: ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:179 msgid "Lists all preferences and their values" msgstr "Výpis všetkých nastavení a ich hodnôt" -#: ../src/gajim-remote.py:165 +#: ../src/gajim-remote.py:183 msgid "Sets value of 'key' to 'value'." msgstr "Nastavuje hodnotu 'kľúča' na 'hodnotu'." -#: ../src/gajim-remote.py:167 +#: ../src/gajim-remote.py:185 msgid "key=value" msgstr "kľúč=hodnota" -#: ../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 "" -"'kľúč' je meno vlastnosti, 'hodnota' je hodnota, na ktorú má byť nastavený" +"'kľúč' je názov vlastnosti, 'hodnota' je hodnota, na ktorú má byť nastavený" -#: ../src/gajim-remote.py:172 +#: ../src/gajim-remote.py:190 msgid "Deletes a preference item" -msgstr "Zmazať položku z nastavenia" +msgstr "Odstrániť položku predvoľby" -#: ../src/gajim-remote.py:174 +#: ../src/gajim-remote.py:192 msgid "key" msgstr "kľúč" -#: ../src/gajim-remote.py:174 +#: ../src/gajim-remote.py:192 msgid "name of the preference to be deleted" -msgstr "názov nastavenia ktoré má byť zmazané" +msgstr "názov nastavenia, ktoré má byť zmazané" -#: ../src/gajim-remote.py:178 +#: ../src/gajim-remote.py:196 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "Zapíše aktuálny stav nastavení programu Gajim do súboru .config" -#: ../src/gajim-remote.py:183 +#: ../src/gajim-remote.py:201 msgid "Removes contact from roster" msgstr "Odstráni kontakt zo zoznamu" -#: ../src/gajim-remote.py:192 +#: ../src/gajim-remote.py:210 msgid "Adds contact to roster" msgstr "Pridá kontakt do zoznamu" -#: ../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 "Pridá nový kontakt k tomuto účtu" +msgstr "Pridá nový kontakt do tohto účtu" -#: ../src/gajim-remote.py:200 +#: ../src/gajim-remote.py:218 msgid "Returns current status (the global one unless account is specified)" msgstr "Vráti aktuálny stav (použije sa globálny, pokiaľ nie je vybraný účet)" -#: ../src/gajim-remote.py:207 +#: ../src/gajim-remote.py:225 msgid "" "Returns current status message(the global one unless account is specified)" msgstr "" "Vráti aktuálnu správu o stave (použije sa globálny, pokiaľ nie je vybraný " "účet)" -#: ../src/gajim-remote.py:214 -msgid "Returns number of unreaded messages" -msgstr "Vráti počet neprečítaných správ" +#: ../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 "Otvorí dialóg 'Začiatok diskusie'" -#: ../src/gajim-remote.py:220 +#: ../src/gajim-remote.py:238 msgid "Starts chat, using this account" msgstr "Začať rozhovor s použitím účtu %s" -#: ../src/gajim-remote.py:224 +#: ../src/gajim-remote.py:242 msgid "Sends custom XML" msgstr "Odoslať vlastné XML" -#: ../src/gajim-remote.py:226 +#: ../src/gajim-remote.py:244 msgid "XML to send" msgstr "XML na odoslanie" -#: ../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" @@ -4262,11 +5678,35 @@ msgstr "" "Účet na ktorý bude XML odoslané; ak nie je špecifikovaný, XML bude odoslané " "všetkým účtom" -#: ../src/gajim-remote.py:249 +#: ../src/gajim-remote.py:251 +msgid "Handle a xmpp:/ uri" +msgstr "" + +#: ../src/gajim-remote.py:253 +msgid "uri" +msgstr "uri" + +#: ../src/gajim-remote.py:258 +msgid "Join a MUC room" +msgstr "" + +#: ../src/gajim-remote.py:260 +msgid "room" +msgstr "miestnosť" + +#: ../src/gajim-remote.py:261 +msgid "nick" +msgstr "prezývka" + +#: ../src/gajim-remote.py:262 +msgid "password" +msgstr "heslo" + +#: ../src/gajim-remote.py:285 msgid "Missing argument \"contact_jid\"" msgstr "Chýbajúci argument \"contact_jid\"" -#: ../src/gajim-remote.py:268 +#: ../src/gajim-remote.py:304 #, python-format msgid "" "'%s' is not in your roster.\n" @@ -4275,11 +5715,11 @@ msgstr "" "'%s' nie je vo vašom zozname.\n" "Prosím, špecifikujte účet, z ktorého odoslať správu." -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:307 msgid "You have no active account" msgstr "Nemáte žiadny aktívny účet" -#: ../src/gajim-remote.py:335 +#: ../src/gajim-remote.py:371 #, python-format msgid "" "Usage: %s %s %s \n" @@ -4288,16 +5728,16 @@ msgstr "" "Použitie: %s %s %s \n" "\t %s" -#: ../src/gajim-remote.py:338 +#: ../src/gajim-remote.py:374 msgid "Arguments:" msgstr "Argumenty:" -#: ../src/gajim-remote.py:342 +#: ../src/gajim-remote.py:378 #, python-format msgid "%s not found" msgstr "%s nenájdený" -#: ../src/gajim-remote.py:346 +#: ../src/gajim-remote.py:382 #, python-format msgid "" "Usage: %s command [arguments]\n" @@ -4306,7 +5746,14 @@ msgstr "" "Použitie: %s príkaz [argumenty]\n" "Príkaz je jeden z:\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 "" + +#: ../src/gajim-remote.py:459 #, python-format msgid "" "Argument \"%s\" is not specified. \n" @@ -4315,136 +5762,152 @@ msgstr "" "Argument \"%s\" nie je špecifikovaný. \n" "Zadajte \"%s help %s\" pre viac informácií" -#: ../src/gajim_themes_window.py:60 +#: ../src/gajim-remote.py:477 +msgid "Wrong uri" +msgstr "Nesprávna uri" + +#: ../src/gajim_themes_window.py:67 msgid "Theme" msgstr "Téma" +#: ../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 "názov témy" -#: ../src/gajim_themes_window.py:172 +#: ../src/gajim_themes_window.py:197 msgid "You cannot delete your current theme" -msgstr "Nemôžete zmazať aktuálnu tému" +msgstr "Nemôžete odstrániť súčastnú tému" -#: ../src/gajim_themes_window.py:173 +#: ../src/gajim_themes_window.py:198 msgid "Please first choose another for your current theme." -msgstr "Prosím, vyberte najskôr inú tému." +msgstr "Prosím, vyberte najskôr inú tému ako sučastnú." -#: ../src/groupchat_control.py:106 -msgid "Private Chat" -msgstr "Súkromný rozhovor" - -#: ../src/groupchat_control.py:106 -msgid "Private Chats" -msgstr "Súkromné rozhovory" - -#: ../src/groupchat_control.py:123 +#: ../src/groupchat_control.py:146 msgid "Sending private message failed" msgstr "Odoslanie súkromnej správy sa nepodarilo" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:125 +#: ../src/groupchat_control.py:148 #, python-format msgid "You are no longer in group chat \"%s\" or \"%s\" has left." msgstr "" -"Nie ste už pripojený(á) diskusnej skupine \"%s\" alebo \"%s\" odišiel(a)." -#: ../src/groupchat_control.py:144 -msgid "Group Chat" -msgstr "Diskusná skupina" - -#: ../src/groupchat_control.py:144 -msgid "Group Chats" -msgstr "Diskusné skupiny" - -#: ../src/groupchat_control.py:318 +#: ../src/groupchat_control.py:369 msgid "Insert Nickname" msgstr "Vložiť prezývku" +#: ../src/groupchat_control.py:903 +msgid "Really send file?" +msgstr "Skutočne poslať súbor?" + +#: ../src/groupchat_control.py:904 +#, 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:979 +msgid "Room logging is enabled" +msgstr "" + +#: ../src/groupchat_control.py:981 +msgid "A new room has been created" +msgstr "" + +#: ../src/groupchat_control.py:984 +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:990 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s bol vykopnutý: %(reason)s" -#: ../src/groupchat_control.py:835 +#: ../src/groupchat_control.py:994 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" -msgstr "%(nick)s bol vykopnutý - %(who)s: %(reason)s" +msgstr "%(nick)s bol vykopnutý %(who)s: %(reason)s" #. do not print 'banned by None' -#: ../src/groupchat_control.py:842 +#: ../src/groupchat_control.py:1001 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s bol zakázaný: %(reason)s" -#: ../src/groupchat_control.py:846 +#: ../src/groupchat_control.py:1005 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" -msgstr "%(nick)s bol zakázaný - %(who)s: %(reason)s" +msgstr "%(nick)s bol zakázaný %(who)s: %(reason)s" -#: ../src/groupchat_control.py:854 +#: ../src/groupchat_control.py:1014 #, python-format msgid "You are now known as %s" -msgstr "Teraz ste známy(a) ako %s" +msgstr "Teraz ste známy ako %s" -#: ../src/groupchat_control.py:856 +#: ../src/groupchat_control.py:1050 ../src/groupchat_control.py:1054 +#: ../src/groupchat_control.py:1059 #, python-format -msgid "%s is now known as %s" -msgstr "%s je známy(a) ako %s" +msgid "%(nick)s has been removed from the room (%(reason)s)" +msgstr "%(nick)s bol odstránený z miestnosti (%(reason)s)" -#: ../src/groupchat_control.py:936 +#: ../src/groupchat_control.py:1051 +msgid "affiliation changed" +msgstr "príslušnosť zmenená" + +#: ../src/groupchat_control.py:1056 +msgid "room configuration changed to members-only" +msgstr "" + +#: ../src/groupchat_control.py:1061 +msgid "system shutdown" +msgstr "" + +#: ../src/groupchat_control.py:1160 #, python-format msgid "%s has left" msgstr "%s odišiel" -#: ../src/groupchat_control.py:941 +#: ../src/groupchat_control.py:1165 #, python-format msgid "%s has joined the group chat" -msgstr "%s sa pripojil(a) do diskusnej skupiny" +msgstr "%s sa pripojil do diskusnej skupiny" -#. No status message -#: ../src/groupchat_control.py:943 ../src/roster_window.py:1200 -#, python-format -msgid "%s is now %s" -msgstr "%s je teraz %s" +#. Invalid Nickname +#. invalid char +#: ../src/groupchat_control.py:1278 ../src/groupchat_control.py:1557 +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:1279 ../src/groupchat_control.py:1558 +msgid "The nickname has not allowed characters." +msgstr "Prezývka obsahuje nepovolené znaky." + +#: ../src/groupchat_control.py:1302 ../src/groupchat_control.py:1320 +#: ../src/groupchat_control.py:1404 ../src/groupchat_control.py:1421 #, python-format msgid "Nickname not found: %s" msgstr "Prezývka nenájdená: %s" -#: ../src/groupchat_control.py:1096 +#: ../src/groupchat_control.py:1336 msgid "This group chat has no subject" -msgstr "Diskusná skupina nemá nastavenú tému" +msgstr "Diskusná skupina nemá nastavený predmet" -#: ../src/groupchat_control.py:1109 +#: ../src/groupchat_control.py:1347 #, python-format msgid "Invited %(contact_jid)s to %(room_jid)s." -msgstr "Pozvaný(á) %(contact_jid)s do %(room_jid)s." +msgstr "Pozvaný %(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:1116 ../src/groupchat_control.py:1144 -#, python-format -msgid "%s does not appear to be a valid JID" -msgstr "%s nevyzerá ako správny JID" - -#: ../src/groupchat_control.py:1227 -#, python-format -msgid "No such command: /%s (if you want to send this, prefix it with /say)" -msgstr "" -"Neznámy príkaz: /%s (ak chcete toto odoslať, zaraďte /say pred to, čo " -"hovoríte)" - -#: ../src/groupchat_control.py:1250 -#, python-format -msgid "Commands: %s" -msgstr "Príkazy: %s" - -#: ../src/groupchat_control.py:1252 +#: ../src/groupchat_control.py:1484 #, python-format msgid "" "Usage: /%s [reason], bans the JID from the group chat. The " @@ -4454,36 +5917,26 @@ msgid "" msgstr "" "Použitie: /%s [dôvod], zakáže JID v diskusnej skupine. " "Prezývka človeka môže byť zmenená, ale nesmie obsahovať \"@\". Ak je JID " -"práve v diskusnej skupine, on/ona/ono bude vykoponutý(á). Medzery v " -"prezývkach nie sú podporované." +"práve v diskusnej skupine, on/ona/ono bude vykoponutý. Medzery v prezývkach " +"nie sú podporované." -#: ../src/groupchat_control.py:1259 +#: ../src/groupchat_control.py:1491 #, 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 "" -"Použitie: /%s , otvorí okno na súkromnú komunikáciu s človekom." -#: ../src/groupchat_control.py:1263 -#, python-format -msgid "Usage: /%s, clears the text window." -msgstr "Použiteie: /%s, vyčistí textové okno." - -#: ../src/groupchat_control.py:1265 +#: ../src/groupchat_control.py:1497 #, python-format msgid "" "Usage: /%s [reason], closes the current window or tab, displaying reason if " "specified." msgstr "" -"Použitie: /%s [dôvod], zatvorí aktuálnu záložku v okne a zobrazí " -"zdôvodnenie, pokiaľ je špecifikované." +"Použitie: /%s [dôvod], zatvorí aktuálnu kartu v okne a zobrazí zdôvodnenie, " +"pokiaľ je špecifikované." -#: ../src/groupchat_control.py:1268 -#, python-format -msgid "Usage: /%s, hide the chat buttons." -msgstr "Použitie: /%s, skryje tlačidlá." - -#: ../src/groupchat_control.py:1271 +#: ../src/groupchat_control.py:1503 #, python-format msgid "" "Usage: /%s [reason], invites JID to the current group chat, optionally " @@ -4492,16 +5945,16 @@ msgstr "" "Použitie: /%s [dôvod], pozve JID do aktuálnej diskusnej skupiny, " "prípadne sa zobrazí aj dôvod." -#: ../src/groupchat_control.py:1275 +#: ../src/groupchat_control.py:1507 #, python-format msgid "" "Usage: /%s @[/nickname], offers to join room@server optionally " "using specified nickname." msgstr "" "Použitie: /%s @[/prezývka], ponúkne možnosť pripojiť sa " -"do miestnosť@server pre nick, ak je špecifikovaný." +"do miestnosť@server pre prezývku, ak je špecifikovaný." -#: ../src/groupchat_control.py:1279 +#: ../src/groupchat_control.py:1511 #, python-format msgid "" "Usage: /%s [reason], removes the occupant specified by nickname " @@ -4512,120 +5965,120 @@ msgstr "" "podľa prezývky, prípadne zobrazí dôvod. Medzery v prezývkach nie sú " "podporované." -#: ../src/groupchat_control.py:1284 +#: ../src/groupchat_control.py:1520 #, python-format msgid "" -"Usage: /%s , sends action to the current group chat. Use third " -"person. (e.g. /%s explodes.)" -msgstr "" -"Použitie: /%s , odošle akciu pre aktuálnu diskusnú skupinu. " -"Používajte tretiu osobu. (napr. /%s exlodoval(a).)" - -#: ../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 "" -"Použitie: /%s [správa], otvorí okno na súkromnú komunikáciu a " -"prípadne odošle správu členovi s prezývkou." -#: ../src/groupchat_control.py:1293 +#: ../src/groupchat_control.py:1525 #, python-format msgid "Usage: /%s , changes your nickname in current group chat." msgstr "" "Použitie: /%s , zmení prezývku v aktuálnej diskusnej skupine." -#: ../src/groupchat_control.py:1297 +#: ../src/groupchat_control.py:1529 #, python-format msgid "Usage: /%s , display the names of group chat occupants." -msgstr "Použitie: /%s [téma], zobrazí mená členov v diskusnej skupine." +msgstr "Použitie: /%s , zobrazí mená členov v diskusnej skupine." -#: ../src/groupchat_control.py:1301 +#: ../src/groupchat_control.py:1533 #, python-format msgid "Usage: /%s [topic], displays or updates the current group chat topic." msgstr "" -"Použitie: /%s [téma], zobrazí alebo zaktualizuje tému v diskusnej skupine." +"Použitie: /%s [téma], zobrazí alebo aktualizuje tému v diskusnej skupine." -#: ../src/groupchat_control.py:1304 +#: ../src/groupchat_control.py:1536 #, python-format msgid "" "Usage: /%s , sends a message without looking for other commands." msgstr "Použitie: /%s , odošle správu, bezohľadu na ďalšie príkazy." -#: ../src/groupchat_control.py:1307 -#, python-format -msgid "No help info for /%s" -msgstr "Žiadne informácie s pomocou pre /%s" - -#: ../src/groupchat_control.py:1356 +#: ../src/groupchat_control.py:1642 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" -msgstr "Ste si istý(á), že chcete opustiť diskusnú skupinu \"%s\"?" +msgstr "Ste si istý, že chcete opustiť diskusnú skupinu \"%s\"?" -#: ../src/groupchat_control.py:1358 +#: ../src/groupchat_control.py:1644 msgid "" "If you close this window, you will be disconnected from this group chat." -msgstr "Ak zatvoríte okno, budete odpojený(á) z tejto diskusnej skupiny." +msgstr "Ak zatvoríte okno, budete odpojený z tejto diskusnej skupiny." -#: ../src/groupchat_control.py:1362 ../src/roster_window.py:3962 +#: ../src/groupchat_control.py:1648 ../src/roster_window.py:5040 msgid "Do _not ask me again" msgstr "Znovu sa už _nepýtať" -#: ../src/groupchat_control.py:1396 +#: ../src/groupchat_control.py:1680 msgid "Changing Subject" msgstr "Zmena predmetu" -#: ../src/groupchat_control.py:1397 +#: ../src/groupchat_control.py:1681 msgid "Please specify the new subject:" msgstr "Prosím, špecifikujte nový predmet:" -#: ../src/groupchat_control.py:1406 +#: ../src/groupchat_control.py:1690 msgid "Changing Nickname" msgstr "Zmena prezývky" -#: ../src/groupchat_control.py:1407 +#: ../src/groupchat_control.py:1691 msgid "Please specify the new nickname you want to use:" msgstr "Prosím špecifikujte novú prezývku, ktorú chcete používať:" -#: ../src/groupchat_control.py:1432 +#. Ask for a reason +#: ../src/groupchat_control.py:1706 +#, python-format +msgid "Destroying %s" +msgstr "" + +#: ../src/groupchat_control.py:1707 +msgid "" +"You are going to definitively destroy this room.\n" +"You may specify a reason below:" +msgstr "" + +#: ../src/groupchat_control.py:1709 +msgid "You may also enter an alternate venue:" +msgstr "" + +#: ../src/groupchat_control.py:1741 msgid "Bookmark already set" msgstr "Záložka je už nastavená" -#: ../src/groupchat_control.py:1433 +#: ../src/groupchat_control.py:1742 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Diskusná skupina \"%s\" je už vo vašich záložkách." -#: ../src/groupchat_control.py:1442 +#: ../src/groupchat_control.py:1751 msgid "Bookmark has been added successfully" msgstr "Záložka bola úspešne pridaná" -#: ../src/groupchat_control.py:1443 +#: ../src/groupchat_control.py:1752 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "Môžete spravovať záložky cez Akcie v menu vo vašom zozname." #. ask for reason -#: ../src/groupchat_control.py:1569 +#: ../src/groupchat_control.py:1904 #, python-format msgid "Kicking %s" msgstr "Vykopnúť %s" -#: ../src/groupchat_control.py:1570 ../src/groupchat_control.py:1852 +#: ../src/groupchat_control.py:1905 ../src/groupchat_control.py:2200 msgid "You may specify a reason below:" -msgstr "Môžete špecifikovať dôvod:" +msgstr "Môžete dole špecifikovať dôvod:" #. ask for reason -#: ../src/groupchat_control.py:1851 +#: ../src/groupchat_control.py:2199 #, python-format msgid "Banning %s" -msgstr "Zakázať %s" +msgstr "Zakazujem %s" -#: ../src/gtkexcepthook.py:41 +#: ../src/gtkexcepthook.py:46 msgid "A programming error has been detected" msgstr "Bola detekovaná chyba v programe" -#: ../src/gtkexcepthook.py:42 +#: ../src/gtkexcepthook.py:47 msgid "" "It probably is not fatal, but should be reported to the developers " "nonetheless." @@ -4633,84 +6086,96 @@ msgstr "" "Pravdepodobne nie je fatálna, ale mala aj napriek tomu by mala byť oznámená " "vývojárom." -#: ../src/gtkexcepthook.py:48 +#: ../src/gtkexcepthook.py:53 msgid "_Report Bug" msgstr "Sp_ráva o chybe" -#: ../src/gtkexcepthook.py:71 +#: ../src/gtkexcepthook.py:76 msgid "Details" msgstr "Podrobnosti" #. 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 "Chyba: nie je možné otvoriť %s na čítanie" -#: ../src/gtkgui_helpers.py:293 +#: ../src/gtkgui_helpers.py:347 msgid "Error reading file:" msgstr "Chyba čítania súboru:" -#: ../src/gtkgui_helpers.py:296 +#: ../src/gtkgui_helpers.py:350 msgid "Error parsing file:" msgstr "Chyba štruktúry súboru:" #. 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 "Nie je možné zapisovať do %s. Správca sedenia nebude fungovať." +msgstr "Nie je možné zapisovať do %s. Správca sedenia nebude fungovať" -#: ../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 nie je štandartným Jabber klientom" + +#: ../src/gtkgui_helpers.py:720 +msgid "Would you like to make Gajim the default Jabber client?" +msgstr "Chcete, aby bol Gajim štandartným Jabber klientom?" + +#: ../src/gtkgui_helpers.py:721 +msgid "Always check to see if Gajim is the default Jabber client on startup" +msgstr "Vždy kontrolovať pri spustení, či je Gajim štandartným Jabber klientom" + +#: ../src/gtkgui_helpers.py:818 msgid "Extension not supported" -msgstr "Rozšírenie nie je podporovaný." +msgstr "Rozšírenie nie je podporované" -#: ../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 "" "Obrázok nie je možné uložiť vo formáte %(type)s. Uložiť ako %(new_filename)s?" -#: ../src/gtkgui_helpers.py:738 +#: ../src/gtkgui_helpers.py:828 msgid "Save Image as..." msgstr "Uložiť obrázok ako..." -#: ../src/history_manager.py:64 +#: ../src/history_manager.py:90 msgid "Cannot find history logs database" msgstr "Nie je možné nájsť databázu so záznamami o histórii" #. holds jid -#: ../src/history_manager.py:107 +#: ../src/history_manager.py:130 msgid "Contacts" msgstr "Kontakty" #. holds time -#: ../src/history_manager.py:120 ../src/history_manager.py:160 -#: ../src/history_window.py:86 +#: ../src/history_manager.py:143 ../src/history_manager.py:183 +#: ../src/history_window.py:121 msgid "Date" msgstr "Dátum" #. holds nickname -#: ../src/history_manager.py:126 ../src/history_manager.py:178 +#: ../src/history_manager.py:149 ../src/history_manager.py:201 msgid "Nickname" msgstr "Prezývka" #. holds message -#: ../src/history_manager.py:134 ../src/history_manager.py:166 -#: ../src/history_window.py:94 +#: ../src/history_manager.py:157 ../src/history_manager.py:189 +#: ../src/history_window.py:129 msgid "Message" msgstr "Správa" -#: ../src/history_manager.py:186 +#: ../src/history_manager.py:209 msgid "" "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " "RUNNING)" msgstr "" -"Skutočne si želáte vyčistiť databázu? (Varovanie: Nepoužívajte v prípade, že " -"Gajim beží)" +"Skutočne si želáte vyčistiť databázu? (SILNE SA NEODPORÚČA, KEĎ BEŽÍ GAJIM)" -#: ../src/history_manager.py:188 +#: ../src/history_manager.py:211 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 " @@ -4724,239 +6189,308 @@ msgstr "" "\n" "V prípade, že zvolite Áno, prosíme o strpenie..." -#: ../src/history_manager.py:400 +#: ../src/history_manager.py:423 msgid "Exporting History Logs..." -msgstr "Export záznamov histórie..." +msgstr "Exportovanie záznamov histórie..." -#: ../src/history_manager.py:476 +#: ../src/history_manager.py:498 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" -msgstr "%(who)s o %(time)s povedal(a): %(message)s\n" +msgstr "%(who)s o %(time)s povedal: %(message)s\n" -#: ../src/history_manager.py:514 +#: ../src/history_manager.py:535 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] "" -"Skutočne si želáte zmazať záznamy histórie súvisiace s vybrabraným kontaktom?" +"Skutočne si želáte, odstrániť záznamy histórie súvisiace s vybranými " +"kontaktami?" msgstr[1] "" -"Skutočne si želáte zmazať záznamy histórie súvisiace s vybrabranými " -"kontaktmi?" +"Skutočne si želáte, odstrániť záznamy histórie súvisiace s vybraným " +"kontaktom?" msgstr[2] "" +"Skutočne si želáte, odstrániť záznamy histórie súvisiace s vybranými " +"kontaktami?" -#: ../src/history_manager.py:518 ../src/history_manager.py:554 +#: ../src/history_manager.py:539 ../src/history_manager.py:574 msgid "This is an irreversible operation." msgstr "Toto je nevratná operácia." -#: ../src/history_manager.py:551 +#: ../src/history_manager.py:571 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" -msgstr[0] "Skutočne si želáte zmazať vybranú správu?" -msgstr[1] "Skutočne si želáte zmazať vybrané správy?" -msgstr[2] "" +msgstr[0] "Skutočne si želáte zmazať vybraných správ?" +msgstr[1] "Skutočne si želáte zmazať vybranú správu?" +msgstr[2] "Skutočne si želáte zmazať vybrané správy?" -#: ../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ória konverzácie s %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 je teraz %(status)s: %(status_msg)s" -#: ../src/history_window.py:265 ../src/notify.py:198 +#: ../src/history_window.py:346 ../src/notify.py:221 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s je teraz %(status)s" -#: ../src/history_window.py:271 +#: ../src/history_window.py:352 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Stav je teraz: %(status)s: %(status_msg)s" -#: ../src/history_window.py:274 +#: ../src/history_window.py:355 #, python-format msgid "Status is now: %(status)s" msgstr "Stav je teraz: %(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 "Obrázok je príliš veľký" + +#: ../src/message_window.py:366 +msgid "Chats" +msgstr "Rozhovory" + +#: ../src/message_window.py:368 +msgid "Group Chats" +msgstr "Diskusné skupiny" + +#: ../src/message_window.py:370 +msgid "Private Chats" +msgstr "Súkromné rozhovory" + +#: ../src/message_window.py:376 msgid "Messages" msgstr "Správy" -#: ../src/message_window.py:274 +#: ../src/message_window.py:380 #, python-format -msgid "%s - Gajim" -msgstr "%s - Gajim" +msgid "%s - %s" +msgstr "" -#: ../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:219 #, python-format msgid "%(nick)s Changed Status" -msgstr "%(nick)s zmenil(a) stav" +msgstr "%(nick)s zmenil stav" -#: ../src/notify.py:206 +#: ../src/notify.py:229 #, python-format msgid "%(nickname)s Signed In" -msgstr "%(nickname)s sa prihlásil(a)" +msgstr "%(nickname)s sa prihlásil" -#: ../src/notify.py:214 +#: ../src/notify.py:237 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s sa odhlásil" -#: ../src/notify.py:226 +#: ../src/notify.py:249 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Nová správa od %(nickname)s" -#: ../src/notify.py:234 +#: ../src/notify.py:257 #, python-format msgid "New Private Message from group chat %s" -msgstr "Nová súkromná správa v diskusnej skupine %s" +msgstr "Nová súkromná správa od diskusnej skupiny %s" -#: ../src/notify.py:235 +#: ../src/notify.py:259 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/notify.py:241 +#: ../src/notify.py:262 +#, python-format +msgid "Messaged by %(nickname)s" +msgstr "" + +#: ../src/notify.py:268 #, python-format msgid "New Message from %(nickname)s" msgstr "Správa od %(nickname)s" -#: ../src/profile_window.py:72 ../src/profile_window.py:376 +#: ../src/profile_window.py:54 msgid "Retrieving profile..." msgstr "Získavanie profilu..." -#: ../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 pre výber avatara" +#: ../src/profile_window.py:107 ../src/roster_window.py:1947 +msgid "File is empty" +msgstr "Súbor je prázdny" + +#: ../src/profile_window.py:110 ../src/roster_window.py:1950 +msgid "File does not exist" +msgstr "Súbor neexistuje" #. keep identation -#: ../src/profile_window.py:136 +#. unknown format +#: ../src/profile_window.py:124 ../src/profile_window.py:140 +#: ../src/roster_window.py:1952 ../src/roster_window.py:1963 msgid "Could not load image" msgstr "Nie je možné načítať obrázok" -#: ../src/profile_window.py:238 +#: ../src/profile_window.py:250 msgid "Information received" msgstr "Informácie prijaté" -#: ../src/profile_window.py:308 +#: ../src/profile_window.py:319 msgid "Without a connection you can not publish your contact information." msgstr "Bez pripojenie nemôžete publikovať informácie o vašom kontakte." -#: ../src/profile_window.py:320 +#: ../src/profile_window.py:331 msgid "Sending profile..." msgstr "Odosielanie profilu..." -#: ../src/profile_window.py:328 -msgid "Information published" -msgstr "Informácie boli zverejnené" - -#: ../src/profile_window.py:340 +#: ../src/profile_window.py:346 msgid "Information NOT published" msgstr "Informácie neboli zverejnené" -#: ../src/profile_window.py:347 +#: ../src/profile_window.py:353 msgid "vCard publication failed" msgstr "zverejnenia vCard zlyhalo" -#: ../src/profile_window.py:348 +#: ../src/profile_window.py:354 msgid "" "There was an error while publishing your personal information, try again " "later." msgstr "" -"Nastala chyba pri zverejňovaní vašich osobných údajov, skúste prosím neskôr." +"Nastala chyba pri zverejňovaní vašich osobných údajov, skúste to prosím " +"neskôr." -#: ../src/profile_window.py:374 -msgid "Without a connection, you can not get your contact information." -msgstr "Bez pripojenia, nemôžete získať informácie o kontakte." - -#: ../src/roster_window.py:168 ../src/roster_window.py:223 +#: ../src/roster_window.py:194 ../src/roster_window.py:249 msgid "Merged accounts" -msgstr "Spojiť účty" +msgstr "Zlúčené účty" -#: ../src/roster_window.py:340 ../src/common/helpers.py:42 +#: ../src/roster_window.py:371 ../src/roster_window.py:637 +#: ../src/roster_window.py:2276 ../src/common/contacts.py:318 +#: ../src/common/helpers.py:53 msgid "Observers" msgstr "Pozorovatelia" -#: ../src/roster_window.py:686 ../src/roster_window.py:3133 +#. Make special context menu if group is Groupchats +#: ../src/roster_window.py:456 ../src/roster_window.py:461 +#: ../src/roster_window.py:2000 ../src/roster_window.py:2003 +#: ../src/roster_window.py:2657 ../src/roster_window.py:2660 +#: ../src/roster_window.py:2685 ../src/roster_window.py:4901 +#: ../src/roster_window.py:4903 ../src/common/commands.py:199 +#: ../src/common/contacts.py:107 ../src/common/helpers.py:53 +msgid "Groupchats" +msgstr "Diskuné skupiny" + +#: ../src/roster_window.py:786 ../src/roster_window.py:4108 msgid "You cannot join a group chat while you are invisible" -msgstr "Nemôžete sa pripojiť do diskusnej skupiny, pokiaľ ste neviditeľný(á)" +msgstr "Nemôžete sa pripojiť do diskusnej skupiny, pokiaľ ste neviditeľný" #. 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:1016 ../src/roster_window.py:1026 +#: ../src/roster_window.py:1035 ../src/systray.py:212 ../src/systray.py:217 +#: ../src/systray.py:223 #, python-format msgid "using account %s" -msgstr "použiť %s účet" +msgstr "použiť účet %s" -#. the 'manage gc bookmarks' item is shown -#. below to avoid duplicate code #. add -#: ../src/roster_window.py:903 +#: ../src/roster_window.py:1042 #, python-format msgid "to %s account" msgstr "pre %s účet" #. disco -#: ../src/roster_window.py:908 +#: ../src/roster_window.py:1047 #, python-format msgid "using %s account" msgstr "použiť %s účet" +#: ../src/roster_window.py:1128 +msgid "_Manage Bookmarks..." +msgstr "_Spravovať záložky..." + +#. PEP services #. profile, avatar -#: ../src/roster_window.py:983 +#: ../src/roster_window.py:1149 ../src/roster_window.py:1155 #, python-format msgid "of account %s" msgstr "účtu %s" -#: ../src/roster_window.py:1003 -msgid "_Manage Bookmarks..." -msgstr "_Spravovať záložky..." - -#: ../src/roster_window.py:1032 +#: ../src/roster_window.py:1204 #, python-format msgid "for account %s" msgstr "pre účet %s" #. History manager -#: ../src/roster_window.py:1053 +#: ../src/roster_window.py:1228 msgid "History Manager" msgstr "Správca histórie" -#: ../src/roster_window.py:1062 +#: ../src/roster_window.py:1237 msgid "_Join New Group Chat" msgstr "_Pripojiť sa k diskusnej skupine" -#: ../src/roster_window.py:1380 ../src/roster_window.py:3326 -#: ../src/roster_window.py:3333 +#: ../src/roster_window.py:1607 ../src/roster_window.py:4323 +#: ../src/roster_window.py:4330 msgid "You have unread messages" msgstr "Máte neprečítané správy" -#: ../src/roster_window.py:1381 +#: ../src/roster_window.py:1608 msgid "You must read them before removing this transport." msgstr "Musíte si ich prečítať pred odstránením tohoto transportu." -#: ../src/roster_window.py:1384 +#: ../src/roster_window.py:1611 #, python-format msgid "Transport \"%s\" will be removed" msgstr "Transport \"%s\" bude odstránený" -#: ../src/roster_window.py:1385 +#: ../src/roster_window.py:1612 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 "" -"Už nebudete môcť prijímať a odosielať správy k tomuto kontaktu cez tento " +"Už nebudete môcť prijímať a odosielať správy tomuto kontaktu cez tento " "transport." -#: ../src/roster_window.py:1388 +#: ../src/roster_window.py:1615 msgid "Transports will be removed" msgstr "Transport bude odstránený" -#: ../src/roster_window.py:1393 +#: ../src/roster_window.py:1620 #, python-format msgid "" "You will no longer be able to send and receive messages to contacts from " @@ -4966,139 +6500,161 @@ msgstr "" "transport:%s" #. it's jid -#: ../src/roster_window.py:1413 +#: ../src/roster_window.py:1786 msgid "Rename Contact" msgstr "Premenovať kontakt" -#: ../src/roster_window.py:1414 +#: ../src/roster_window.py:1787 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Zadať novú prezývku pre kontakt %s" -#: ../src/roster_window.py:1421 +#: ../src/roster_window.py:1794 msgid "Rename Group" msgstr "Premenovať skupinu" -#: ../src/roster_window.py:1422 +#: ../src/roster_window.py:1795 #, python-format msgid "Enter a new name for group %s" msgstr "Zadať nové meno skupiny %s" -#: ../src/roster_window.py:1476 +#: ../src/roster_window.py:1870 msgid "Remove Group" msgstr "Odstrániť skupinu" -#: ../src/roster_window.py:1477 +#: ../src/roster_window.py:1871 #, python-format msgid "Do you want to remove group %s from the roster?" -msgstr "Chcete skutočne odstrániť skupinu %s zo zoznamu?" +msgstr "Chcete skutočne odstrániť skupinu %s zo zoznamu kontaktov?" -#: ../src/roster_window.py:1478 +#: ../src/roster_window.py:1872 msgid "Remove also all contacts in this group from your roster" -msgstr "Odstráni aj všetky kontakty z tejto skupiny z vášho zoznamu" +msgstr "Odstráni aj všetky kontakty tejto skupiny z vášho zoznamu" -#: ../src/roster_window.py:1502 +#: ../src/roster_window.py:1903 msgid "Assign OpenPGP Key" -msgstr "Priradiť OpenPGP kľúč" +msgstr "Prideliť Open_PGP kľúč" -#: ../src/roster_window.py:1503 +#: ../src/roster_window.py:1904 msgid "Select a key to apply to the contact" msgstr "Vybrať kľúč a aplikovať ho na kontakt" -#: ../src/roster_window.py:1784 ../src/roster_window.py:1960 -msgid "_New group chat" +#: ../src/roster_window.py:2078 +msgid "_New Group Chat" msgstr "_Nová diskusná skupina" -#: ../src/roster_window.py:1842 +#: ../src/roster_window.py:2395 msgid "I would like to add you to my roster" -msgstr "Chce si vás pridať do svojho zoznamu" +msgstr "Chcem si vás pridať do svojho zoznamu" -#: ../src/roster_window.py:2005 ../src/roster_window.py:2052 +#. Send Group Message +#: ../src/roster_window.py:2519 ../src/roster_window.py:2694 msgid "Send Group M_essage" msgstr "Poslať sprá_vu skupine" -#: ../src/roster_window.py:2031 -msgid "Re_name" -msgstr "Preme_novať" +#. Manage Transport submenu +#: ../src/roster_window.py:2539 +msgid "_Manage Contacts" +msgstr "S_pravovať kontakty" -#: ../src/roster_window.py:2058 +#: ../src/roster_window.py:2600 +msgid "_Maximize" +msgstr "Ma_ximalizovať" + +#: ../src/roster_window.py:2607 +msgid "_Disconnect" +msgstr "O_dpojiť" + +#: ../src/roster_window.py:2686 +msgid "_Maximize All" +msgstr "_Maximalizovať všetko" + +#: ../src/roster_window.py:2702 msgid "To all users" msgstr "Všetkým používateľom" -#: ../src/roster_window.py:2061 +#: ../src/roster_window.py:2705 msgid "To all online users" -msgstr "Všetkým online používateľom" +msgstr "Všetkým pripojeným používateľom" -#: ../src/roster_window.py:2097 -msgid "_Log on" -msgstr "_Prihlásiť" +#. Send single message +#: ../src/roster_window.py:2827 +msgid "Send Single Message" +msgstr "Poslať krátku správu" -#: ../src/roster_window.py:2107 -msgid "Log _off" -msgstr "_Odhlásiť" +#. Manage Transport submenu +#: ../src/roster_window.py:2882 +msgid "_Manage Transport" +msgstr "S_pravovať transport" -#: ../src/roster_window.py:2229 ../src/roster_window.py:2300 +#. Modify Transport +#: ../src/roster_window.py:2890 +msgid "_Modify Transport" +msgstr "_Upraviť transport" + +#: ../src/roster_window.py:3024 ../src/roster_window.py:3114 msgid "_Change Status Message" msgstr "_Zmeniť správu o stave" -#: ../src/roster_window.py:2372 +#: ../src/roster_window.py:3186 msgid "Authorization has been sent" msgstr "Autorizácia bola odoslaná" -#: ../src/roster_window.py:2373 +#: ../src/roster_window.py:3187 #, python-format msgid "Now \"%s\" will know your status." -msgstr "Od teraz bude \"%s\" vidieť váš stav." +msgstr "Od teraz bude \"%s\" vidieť váš stav." -#: ../src/roster_window.py:2393 +#: ../src/roster_window.py:3207 msgid "Subscription request has been sent" msgstr "Žiadosť o zapísanie bola odoslaná" -#: ../src/roster_window.py:2394 +#: ../src/roster_window.py:3208 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." -msgstr "Ak \"%s\" akceptuje túto požiadavku, budete vidieť jeho/jej stav." +msgstr "" +"Ak \"%s\" akceptuje túto požiadavku, budete vidieť jeho alebo jej stav." -#: ../src/roster_window.py:2406 +#: ../src/roster_window.py:3220 msgid "Authorization has been removed" msgstr "Autorizácia bola odstránená" -#: ../src/roster_window.py:2407 +#: ../src/roster_window.py:3221 #, python-format msgid "Now \"%s\" will always see you as offline." -msgstr "Odteraz \"%s\" vás uvidí len v stave offline." +msgstr "Odteraz vás \"%s\" uvidí len v stave odhlásený." -#: ../src/roster_window.py:2615 +#: ../src/roster_window.py:3459 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Kontakt \"%s\" bude odstránený zo zoznamu" -#: ../src/roster_window.py:2619 +#: ../src/roster_window.py:3463 msgid "" "By removing this contact you also remove authorization resulting in him or " "her always seeing you as offline." msgstr "" -"Odstránením tohoto kontaktu, automaticky odstránite aj autorizáciu, to " -"znamená, že ona/on vás vždy uvidí ako offline." +"Odstránením tohto kontaktu, automaticky odstránite aj autorizáciu, to " +"znamená, že ona alebo on vás vždy uvidí ako odhlásený." -#: ../src/roster_window.py:2624 +#: ../src/roster_window.py:3468 msgid "" "By removing this contact you also by default remove authorization resulting " "in him or her always seeing you as offline." msgstr "" -"Odstránením tohoto kontaktu, automaticky odstránite aj autorizáciu, to " -"znamená, že ona/on vás vždy uvidí ako offline." +"Odstránením tohto kontaktu, automaticky odstránite aj autorizáciu, to " +"znamená, že ona alebo on vás vždy uvidí ako odhlásený." -#: ../src/roster_window.py:2627 +#: ../src/roster_window.py:3471 msgid "I want this contact to know my status after removal" msgstr "Chcem upozorniť kontakt, na to, že bol odstránený" #. several contact to remove at the same time -#: ../src/roster_window.py:2631 +#: ../src/roster_window.py:3475 msgid "Contacts will be removed from your roster" msgstr "Kontakt bude odstránený zo zoznamu" -#: ../src/roster_window.py:2635 +#: ../src/roster_window.py:3479 #, python-format msgid "" "By removing these contacts:%s\n" @@ -5106,203 +6662,250 @@ msgid "" msgstr "" "Odstránením nasledujúcich kontaktov:%s\n" "taktiež odstránite vašu autorizáciu, to znamená, že vás budú vidieť ako " -"offline." +"odhlásený." + +#: ../src/roster_window.py:3506 +msgid "" +"Gnome Keyring is installed but not correctly started\t\t\t\t\t\t\t\t" +"(environment variable probably not correctly set)" +msgstr "" +"Správca zväzku kľúčov je nainštalovaný, ale nesprávne spustený\t\t\t\t\t\t\t" +"\t(pravdepodobne je nesprávne nastavená premenná prostredia)" + +#: ../src/roster_window.py:3526 +msgid "GPG is not usable" +msgstr "" -#. 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:3527 ../src/common/connection_handlers.py:2201 +#: ../src/common/zeroconf/connection_zeroconf.py:174 #, python-format msgid "You will be connected to %s without OpenPGP." -msgstr "Budete pripojený(á) k %s bez OpenPGP." +msgstr "Budete pripojený k %s bez OpenPGP." -#: ../src/roster_window.py:2710 -msgid "Passphrase Required" -msgstr "Passfráza je požadovaná" - -#: ../src/roster_window.py:2711 -#, python-format -msgid "Enter GPG key passphrase for account %s." -msgstr "Vložiť passfrázu ku GPG kľúču pre účet %s." - -#: ../src/roster_window.py:2716 -msgid "Save passphrase" -msgstr "Uložiť passfrázu" - -#: ../src/roster_window.py:2724 -msgid "Wrong Passphrase" -msgstr "Nesprávna passfráza" - -#: ../src/roster_window.py:2725 -msgid "Please retype your GPG passphrase or press Cancel." -msgstr "Prosím zadajte znova vašu GPG passfrázu alebo stlačte Zrušiť." - -#: ../src/roster_window.py:2782 ../src/roster_window.py:2842 +#: ../src/roster_window.py:3598 ../src/roster_window.py:3676 msgid "You are participating in one or more group chats" msgstr "Ste v jednej alebo viacerých diskusných skupinách" -#: ../src/roster_window.py:2783 ../src/roster_window.py:2843 +#: ../src/roster_window.py:3599 ../src/roster_window.py:3677 msgid "" "Changing your status to invisible will result in disconnection from those " "group chats. Are you sure you want to go invisible?" msgstr "" -"Zmena stavu na neviditeľný, automaticky spôsobí, že budete odpojený(á) z " -"diskusných skupín. Ste si skutočne istý(á), že chcete zmeniť stav na " +"Zmena stavu na neviditeľný, automaticky spôsobí, že budete odpojený z " +"diskusných skupín. Ste si skutočne istý, že chcete zmeniť stav na " "neviditeľný?" -#: ../src/roster_window.py:2800 +#: ../src/roster_window.py:3633 msgid "No account available" msgstr "Žiadne účty nie sú dostupné" -#: ../src/roster_window.py:2801 +#: ../src/roster_window.py:3634 msgid "You must create an account before you can chat with other contacts." msgstr "" "Musíte si vytvoriť účet predtým, než budete môcť komunikovať s ostatnými." -#: ../src/roster_window.py:2899 +#: ../src/roster_window.py:3819 #, 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:4324 ../src/roster_window.py:4331 msgid "" "Messages will only be available for reading them later if you have history " "enabled." -msgstr "Správu bude možné prečítať, ak máte povolenú históriu." +msgstr "Správu bude možné prečítať len vtedy, ak máte povolenú históriu." -#: ../src/roster_window.py:3912 +#: ../src/roster_window.py:4987 msgid "Metacontacts storage not supported by your server" -msgstr "Server nepodporuje ukladanie metakontaktov." +msgstr "Server nepodporuje ukladanie metakontaktov" -#: ../src/roster_window.py:3914 +#: ../src/roster_window.py:4989 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 "" -"Váš server nepodporuje ukladanie informácii o metakontaktoch. Takže " -"informácie nebudú uložené a načítané pri ďalšom pripojení." -#: ../src/roster_window.py:3956 +#: ../src/roster_window.py:5034 msgid "" "You are about to create a metacontact. Are you sure you want to continue?" msgstr "" -"Práve sa chystáte vytvoriť metakontakt. Ste si skutočne istý(á), že chcete " +"Práve sa chystáte vytvoriť metakontakt. Ste si skutočne istý, že chcete " "pokračovať?" -#: ../src/roster_window.py:3958 +#: ../src/roster_window.py:5036 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 "" -"Metakontakty umožňujú zoskupovanie rôznych kontaktov do jedného riadku. Túto " -"vlastnosť je napríklad vhodné využiť ak má osoba viac Jabber účtov alebo " -"využíva viac transportov." -#: ../src/roster_window.py:4125 +#: ../src/roster_window.py:5131 +msgid "Invalid file URI:" +msgstr "" + +#: ../src/roster_window.py:5142 #, python-format -msgid "Drop %s in group %s" -msgstr "Vložiť %s do skupiny %s" +msgid "Do you want to send this file to %s:" +msgid_plural "Do you want to send those files to %s:" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" -#: ../src/roster_window.py:4132 -#, python-format -msgid "Make %s and %s metacontacts" -msgstr "Vytvoriť %s a %s metakontakty" - -#: ../src/roster_window.py:4319 +#: ../src/roster_window.py:5490 msgid "Change Status Message..." -msgstr "Zmeniť Správu o stave..." +msgstr "Zmeniť správu o stave..." -#: ../src/systray.py:144 +#: ../src/search_window.py:91 +msgid "Waiting for results" +msgstr "Čakám na výsledky" + +#: ../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 "Žiadny výsledok" + +#: ../src/systray.py:169 msgid "_Change Status Message..." msgstr "_Zmeniť správu o stave..." -#: ../src/systray.py:234 +#: ../src/systray.py:254 msgid "Hide this menu" -msgstr "Ukryť toto menu" +msgstr "Skryť toto menu" -#: ../src/tooltips.py:309 ../src/tooltips.py:492 +#: ../src/tooltips.py:317 ../src/tooltips.py:560 msgid "Jabber ID: " -msgstr "Jabber ID:" +msgstr "Jabber ID: " -#: ../src/tooltips.py:312 ../src/tooltips.py:496 +#: ../src/tooltips.py:320 ../src/tooltips.py:564 msgid "Resource: " -msgstr "Zdroj:" +msgstr "Zdroj: " -#: ../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 tejto diskusnej skupiny" -#: ../src/tooltips.py:430 ../src/tooltips.py:610 -msgid "Status: " -msgstr "Stav:" +#: ../src/tooltips.py:423 +msgid " [blocked]" +msgstr " [blokovaný]" -#: ../src/tooltips.py:461 +#: ../src/tooltips.py:427 +msgid " [minimized]" +msgstr "" + +#: ../src/tooltips.py:442 ../src/tooltips.py:680 +msgid "Status: " +msgstr "Stav: " + +#: ../src/tooltips.py:476 #, python-format msgid "Last status: %s" msgstr "Posledný stav: %s" -#: ../src/tooltips.py:463 +#: ../src/tooltips.py:478 #, python-format msgid " since %s" -msgstr "od %s" +msgstr " od %s" + +#: ../src/tooltips.py:496 +msgid "Connected" +msgstr "" + +#: ../src/tooltips.py:498 +msgid "Disconnected" +msgstr "Odpojený" + +#: ../src/tooltips.py:505 +msgid "Mood:" +msgstr "" + +#: ../src/tooltips.py:515 +msgid "Activity:" +msgstr "" + +#: ../src/tooltips.py:533 +msgid "Unknown Artist" +msgstr "Neznámy umelec" + +#: ../src/tooltips.py:538 +msgid "Unknown Title" +msgstr "Neznámy titulok" + +#: ../src/tooltips.py:543 +msgid "Unknown Source" +msgstr "Neznámy zdroj" + +#: ../src/tooltips.py:544 +msgid "Tune:" +msgstr "" + +#: ../src/tooltips.py:544 +#, python-format +msgid "" +"\"%(title)s\" by %(artist)s\n" +"from %(source)s" +msgstr "" #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:502 +#: ../src/tooltips.py:571 msgid "Subscription: " -msgstr "Zápis:" +msgstr "Zápis: " -#: ../src/tooltips.py:512 +#: ../src/tooltips.py:581 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:566 +#: ../src/tooltips.py:636 msgid "Download" msgstr "Stiahnuť" -#: ../src/tooltips.py:572 +#: ../src/tooltips.py:642 msgid "Upload" -msgstr "Upload" +msgstr "Nahrať" -#: ../src/tooltips.py:579 +#: ../src/tooltips.py:649 msgid "Type: " msgstr "Typ: " -#: ../src/tooltips.py:585 +#: ../src/tooltips.py:655 msgid "Transferred: " msgstr "Prenesené:" -#: ../src/tooltips.py:588 ../src/tooltips.py:609 +#: ../src/tooltips.py:658 ../src/tooltips.py:679 msgid "Not started" msgstr "Nezačal" -#: ../src/tooltips.py:592 +#: ../src/tooltips.py:662 msgid "Stopped" msgstr "Zastavený" -#: ../src/tooltips.py:594 ../src/tooltips.py:597 +#: ../src/tooltips.py:664 ../src/tooltips.py:667 msgid "Completed" msgstr "Dokončený" -#: ../src/tooltips.py:601 +#: ../src/tooltips.py:671 msgid "?transfer status:Paused" -msgstr "?stav prenosu:Pauza" +msgstr "?stav prenosu:Pozastavené" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:605 +#: ../src/tooltips.py:675 msgid "Stalled" -msgstr "Uviaznutý" +msgstr "" -#: ../src/tooltips.py:607 +#: ../src/tooltips.py:677 msgid "Transferring" msgstr "Prenášanie" -#: ../src/tooltips.py:639 +#: ../src/tooltips.py:713 msgid "This service has not yet responded with detailed information" msgstr "Táto služba neodpovedala podrobnejšími informáciami" -#: ../src/tooltips.py:642 +#: ../src/tooltips.py:716 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -5310,24 +6913,24 @@ msgstr "" "Táto služba neodpovedala podrobnejšími informáciami.\n" "Je pravdepodobne zastaralá alebo poškodená" -#: ../src/vcard.py:217 +#: ../src/vcard.py:245 msgid "?Client:Unknown" msgstr "?Klient: Neznámy" -#: ../src/vcard.py:219 +#: ../src/vcard.py:247 msgid "?OS:Unknown" msgstr "?OS:Neznámy" -#: ../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 "od %s" -#: ../src/vcard.py:277 +#: ../src/vcard.py:311 msgid "Affiliation:" msgstr "Príslušnosť:" -#: ../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" @@ -5335,7 +6938,7 @@ msgstr "" "Tento kontakt sa zaujíma o vaše informácie o prítomnosti, ale vy sa " "nezaujímate o jeho/jej informácie o prítomnosti" -#: ../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" @@ -5343,14 +6946,12 @@ msgstr "" "Zaujímate sa o informácie o prítomnosti vášho kontaktu, ale on/ona sa " "nezaujíma o vaše" -#: ../src/vcard.py:289 +#: ../src/vcard.py:323 msgid "You and the contact are interested in each other's presence information" msgstr "" -"Vy aj váš kontakt sa vzájomne zaujímate o informácie o vašej a jeho/jej " -"prítomnosti" #. 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" @@ -5358,74 +6959,143 @@ msgstr "" "Nezaujímate sa o informácie o prítomnosti vášho kontaktu a ani on/ona sa " "nezaujíma o vaše" -#: ../src/vcard.py:299 +#: ../src/vcard.py:333 msgid "You are waiting contact's answer about your subscription request" -msgstr "Čakáte na odpoveď od kontaktu - ohľadne vašej požiadavky na zápis" +msgstr "Čakáte na odpoveď od kontaktu ohľadne vašej požiadavky na zápis" -#: ../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 "priorita zdroja" +msgstr " zdroj s prioritou " -#: ../src/common/check_paths.py:33 +#: ../src/common/check_paths.py:38 msgid "creating logs database" msgstr "vytváranie záznamov databáz" -#: ../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" -msgstr "%s je súbor, ale mal by to byť adresár" +msgid "%s is a file but it should be a directory" +msgstr "" -#: ../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 bude ukončený" -#: ../src/common/check_paths.py:115 +#: ../src/common/check_paths.py:127 #, python-format -msgid "%s is directory but should be file" -msgstr "%s je adresár, ale mal by byť súbor" +msgid "%s is a directory but should be a file" +msgstr "" -#: ../src/common/check_paths.py:131 +#: ../src/common/check_paths.py:143 #, python-format msgid "creating %s directory" -msgstr "vytvorenie %s adresára" +msgstr "vytváram priečinok %s" -#: ../src/common/config.py:55 +#: ../src/common/commands.py:74 +msgid "Change status information" +msgstr "Zmeniť informáciu o stave" + +#: ../src/common/commands.py:87 +msgid "Change status" +msgstr "Zmeniť stav" + +#: ../src/common/commands.py:88 +msgid "Set the presence type and description" +msgstr "" + +#: ../src/common/commands.py:94 +msgid "Free for chat" +msgstr "Mám čas na debatu" + +#: ../src/common/commands.py:95 +msgid "Online" +msgstr "Prítomný" + +#: ../src/common/commands.py:97 +msgid "Extended away" +msgstr "" + +#: ../src/common/commands.py:98 +msgid "Do not disturb" +msgstr "Nerušiť" + +#: ../src/common/commands.py:99 +msgid "Offline - disconnect" +msgstr "Odhlásený - odpojený" + +#: ../src/common/commands.py:104 +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 "Opustiť diskusnú skupinu" + +#: ../src/common/commands.py:184 +#, python-format +msgid "%(nickname)s on %(room_jid)s" +msgstr "%(nickname)s v %(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 "Použiť DBus a Notification-Daemon pre zobrazenie upozornení" +msgstr "Použiť D-Bus a Notification-Daemon pre zobrazenie upozornení" -#: ../src/common/config.py:60 +#: ../src/common/config.py:79 msgid "Time in minutes, after which your status changes to away." -msgstr "Čas v minútach, po ktorých sa zmení stav na Preč." +msgstr "Čas v minútach, po ktorých sa zmení stav na preč." -#: ../src/common/config.py:61 +#: ../src/common/config.py:80 msgid "Away as a result of being idle" msgstr "Preč ako výsledok nečinnosti" -#: ../src/common/config.py:63 -msgid "Time in minutes, after which your status changes to not available." -msgstr "Čas v minútach, po ktorých sa zmení stav na Neprítomný(á)" - -#: ../src/common/config.py:64 -msgid "Not available as a result of being idle" -msgstr "Neprítomný(á) ako výsledok nečinnosti" - #: ../src/common/config.py:82 +msgid "Time in minutes, after which your status changes to not available." +msgstr "Čas v minútach, po ktorých sa zmení stav na neprítomný." + +#: ../src/common/config.py:83 +msgid "Not available as a result of being idle" +msgstr "Neprítomný ako výsledok nečinnosti" + +#: ../src/common/config.py:101 msgid "" "List (space separated) of rows (accounts and groups) that are collapsed." msgstr "" "Zoznam (oddelený medzerami) a riadkov (účet a skupina), ktoré sú zabalené." -#: ../src/common/config.py:87 +#: ../src/common/config.py:106 msgid "Enable link-local/zeroconf messaging" msgstr "Povoliť link-local/zeroconf správy" -#: ../src/common/config.py:90 +#: ../src/common/config.py:109 msgid "Language used by speller" msgstr "Jazyk pre kontrolu pravopisu" -#: ../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" @@ -5435,37 +7105,36 @@ msgstr "" "'sometimes' - zobraziť každých print_ichat_every_foo_minutes minút.\n" "'never' - nezobrazovať čas." -#: ../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 "" -"Vypísať čas vo formáte Fuzzy Clock. Je možné použiť hodnoty od 1 do 4, or 0 " -"to vypne Fuzzy Clock. 1 je najpodrobnejšie zobrazenie, 4 je najmenej " -"podrobné zobrazenie. Táto voľba je použitá len v prípade, že premenná " -"print_time je nastavená na 'sometimes'." -#: ../src/common/config.py:95 +#: ../src/common/config.py:114 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Použiť * / _ pár znakov ako možné formátovacie znaky." -#: ../src/common/config.py:96 +#: ../src/common/config.py:115 msgid "" "If True, do not remove */_ . So *abc* will be bold but with * * not removed." msgstr "" "Ak je pravda, neodstaňuj */_ . Takže *abc* bude tečné a * * nebude " "odstránené." -#: ../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 "" -"Ak je zvolené, použije sa ReStructured text alebo HTML, plus ascii " -"formátovanie. (If you want to use this, install docutils)" +"Používať preštruktúrované značkovanie textu k odoslaniu HTML, plus ascii " +"formátovanie ak je označený. Pre syntaxu si pozrite http://docutils." +"sourceforge.net/docs/ref/rst/restructuredtext.html (Ak to chcete používať, " +"nainštalujte docutils)" -#: ../src/common/config.py:108 +#: ../src/common/config.py:127 msgid "" "Character to add after nickname when using nick completion (tab) in group " "chat." @@ -5473,31 +7142,57 @@ msgstr "" "Znak použitý za prezývkou, keď sa používa automatické dopĺňanie (tab) v " "diskusnej skupine." -#: ../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 "" -"Vaša prezývka koliduje s inou prezývkou v diskusnej miestnosti aj po " +"Vaša prezývka sa zhoduje s inou prezývkou v diskusnej miestnosti aj po " "pripojení znaku." -#: ../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 "" + +#: ../src/common/config.py:152 +msgid "Characters that are printed before the nickname in conversations" +msgstr "Znaky zobrazené za prezývkou v konverzáciách" + +#: ../src/common/config.py:153 +msgid "Characters that are printed after the nickname in conversations" +msgstr "Znaky zobrazené pred prezývkou v konverzáciách" + +#: ../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:161 msgid "Add * and [n] in roster title?" msgstr "Pridať * a [n] do titulku zoznamu?" -#: ../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." msgstr "" -"Koľko riadkov si pamätať z predchádzajúceho rozhovoru, keď bude okno/záložka " +"Koľko riadkov si pamätať z predchádzajúceho rozhovoru, keď bude karta/okno " "znovu otvorená." -#: ../src/common/config.py:144 +#: ../src/common/config.py:163 msgid "How many minutes should last lines from previous conversation last." -msgstr "Koľko minút má mať posledný riadok z poslednej konverzácie." +msgstr "Z koľkých minút majú byť riadky s predchádzajúcej konverzácie." -#: ../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)." @@ -5505,11 +7200,11 @@ msgstr "" "Poslať správu pri stlačení Ctrl+Enter a pri Enter spraviť nový riadok " "(chovanie podobné ako Mirabilis ICQ klient)" -#: ../src/common/config.py:147 +#: ../src/common/config.py:166 msgid "How many lines to store for Ctrl+KeyUP." -msgstr "Koľko riadkov posunúť pri stlačení Ctrl+šípka hore." +msgstr "Koľko riadkov posunúť pri stlačení Ctrl+KP_hore." -#: ../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' " @@ -5518,38 +7213,36 @@ msgstr "" "Ani url s %s kde je %s slovo/fráza alebo 'WIKTIONARY' čo znamená použitie " "wiktionary." -#: ../src/common/config.py:153 +#: ../src/common/config.py:172 msgid "If checked, Gajim can be controlled remotely using gajim-remote." msgstr "" "Ak je zaškrtnuté, Gajim môže byť ovládaný na diaľku s použitím 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 "" -"Ak je zapnuté, Gajim načítava D-Bus signály z NetworkManager a mení stav " +"Ak je zapnuté, Gajim načítava D-Bus signály z NetworkManager a mení stav " "účtov (nie je nutné, aby listen_to_network_manager bolo nastavené na False) " "podľa stavu sieťového pripojenia." -#: ../src/common/config.py:155 +#: ../src/common/config.py:174 msgid "" "Sent chat state notifications. Can be one of all, composing_only, disabled." msgstr "" "Posielanie informácii o stave diskusie. Môže byť nastavené na hodnotu all, " "composing_only, disabled." -#: ../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 "" -"Zobrazovanie stavu diskusie v okna. Môže byť nastavené na: all, " -"composing_only, disabled." -#: ../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." @@ -5557,70 +7250,89 @@ msgstr "" "Pokiaľ sa čas pri každej správe (print_time==sometimes), vypíše sa každých x " "minút." -#: ../src/common/config.py:159 +#: ../src/common/config.py:178 msgid "Ask before closing a group chat tab/window." msgstr "Spýtať sa pred zatvorením okna/záložky pre diskusnú skupinu." -#: ../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 "" -"Spýtať sa vždy pred zatvorením okna/záložky diskusnej skupiny, ktorej meno " +"Vždy sa spýtať pred zatvorením okna/záložky diskusnej skupiny, ktorej meno " "je uvedené v zozname diskusných JID." -#: ../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." msgstr "" -"Nikdy sa nepýtať pred zatvorením okna/záložky pre diskusnú skupinu, ktorej " +"Nikdy sa nepýtať pred zatvorením karty/okna pre diskusnú skupinu, ktorej " "meno je uvedené v zozname JID." -#: ../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." -msgstr "Potlačí server pre Prenos súborov, pri preklade/forwarde portu." +"Comma separated list of hosts that we send, in addition of local interfaces, " +"for File Transfer in case of address translation/port forwarding." +msgstr "" -#: ../src/common/config.py:166 +#: ../src/common/config.py:185 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "IEC štandard znamná KiB = 1024 bajtov, KB = 1000 bajtov." -#: ../src/common/config.py:168 +#: ../src/common/config.py:187 msgid "Notify of events in the system trayicon." msgstr "Upozorňovať na udalosti v oblasti systémových upozornení." -#: ../src/common/config.py:174 +#: ../src/common/config.py:193 msgid "Show tab when only one conversation?" -msgstr "Ukázať záložku len ak prebieha konverzácia?" +msgstr "Ukázať kartu len ak prebieha konverzácia?" -#: ../src/common/config.py:175 +#: ../src/common/config.py:194 msgid "Show tabbed notebook border in chat windows?" -msgstr "Zobraziť záložky v okne s diskusnou skupinou?" +msgstr "" -#: ../src/common/config.py:176 +#: ../src/common/config.py:195 msgid "Show close button in tab?" -msgstr "Zobraziť zatváracie tlačidlo v záložke?" +msgstr "Zobraziť zatváracie tlačidlo v karte?" -#: ../src/common/config.py:189 +#: ../src/common/config.py:196 +msgid "" +"When negotiating an encrypted session, should Gajim assume you want your " +"messages to be logged?" +msgstr "" + +#: ../src/common/config.py:197 +msgid "" +"When negotiating an encrypted session, should Gajim prefer to use public " +"keys for identification?" +msgstr "" + +#: ../src/common/config.py:206 +msgid "Preview new messages in notification popup?" +msgstr "Predbežné zobrazenie nových správ vo vyskakovacom upozornení." + +#: ../src/common/config.py:211 msgid "" "A semicolon-separated list of words that will be highlighted in group chats." msgstr "Bodkočiarkou oddelený zoznam slov bude zvýraznený v diskusnej skupine." -#: ../src/common/config.py:190 +#: ../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." msgstr "" "Ak je pravda, Gajim skončí keď bude X tlačidlo vo Window manažéri stlačené. " -"Toto nastavenie je použíté, len v prípade, že sa používa trayicon. " +"Toto nastavenie je použíté, len v prípade, že sa používa trayikona." -#: ../src/common/config.py:191 -msgid "If True, Gajim registers for xmpp:// on each startup." -msgstr "Ak je pravda, Gajim bude registrovaný pre xmpp:// pri každom spustení." +#: ../src/common/config.py:213 +msgid "" +"If True, Gajim will check if it's the default jabber client on each startup." +msgstr "" +"Ak je pravda, Gajim bude kontrolovať pri každom štarte, či je štandartný " +"klient." -#: ../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." @@ -5628,7 +7340,7 @@ msgstr "" "Ak je pravda, Gajim zobrazí ikonku na každej záložke obsahujúcej neprečítané " "správy. Závisí na téme, ikonka môže byť animovaná." -#: ../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." @@ -5636,7 +7348,11 @@ msgstr "" "Ak je pravda, Gajim zobrazí stavovú správu v zozname kontaktov, za " "predpokladu, že táto správa nie je prázdna." -#: ../src/common/config.py:195 +#: ../src/common/config.py:217 +msgid "Define the position of the avatar in roster. Can be left or right" +msgstr "" + +#: ../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." @@ -5644,7 +7360,7 @@ msgstr "" "Ak je pravda, Gajim si vyžiada avatara, pre každý kontakt, ktorý nemá " "avatara z posledného spojenia, alebo ak nie je cache príliš zastaralá." -#: ../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." @@ -5652,132 +7368,129 @@ msgstr "" "Ak nie je pravda, nebudete vidieť informáciu o zmene stavu kontaktu a jeho/" "jej stavovú správu" -#: ../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 " "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 "" -"Môže byť \"none\", \"all\" alebo \"in_and_out\". Ak je \"none\", Gajim " -"nebude zobrazovať správu o stave v diskusnej skupine a zmení ona/on svoj " -"stav. Ak je \"all\" Gajim bude zobrazovať informáciu o stave. Ak je " -"\"in_and_out\", Gajim zobrazí len FOO vstúpil/opustil miestnosť." -#: ../src/common/config.py:199 +#: ../src/common/config.py:222 msgid "Background color of contacts when they just signed in." msgstr "Farba pozadia použitá pri prihlásení kontaktu." -#: ../src/common/config.py:200 +#: ../src/common/config.py:223 msgid "Background color of contacts when they just signed out." msgstr "Farba pozadia použitá pri odhlásení kontaktu." -#: ../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 "Ak je zapnuté, obnovené správy budú zobrazené menším písmom." -#: ../src/common/config.py:203 +#: ../src/common/config.py:226 msgid "Don't show avatar for the transport itself." msgstr "Nezobrazovať avatarov pre transport." -#: ../src/common/config.py:204 +#: ../src/common/config.py:227 msgid "Don't show roster in the system taskbar." -msgstr "Nezobrazovať zoznam kontaktov v paneli úloh." +msgstr "Nezobrazovať zoznam v paneli úloh." -#: ../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 " "pending events." msgstr "" -"Ak je Pravda a GTK+ je nainštalované a PyGTK nainštalované vo verzii aspoň " +"Ak je pravda a GTK+ je nainštalované a PyGTK nainštalované vo verzii aspoň " "2.8, potom bude okno blikať (bežné správanie pre väčšinu Window manažérov), " "keď sa udeje nejaká udalosť." -#: ../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 " "presences." msgstr "" "Jabberd1.4 nezdieľa informácie, keď sa používateľ pripojí do miestnosti " -"chránenej heslom. Zmeňte túto možnosť na Vypnuté, aby sa neposielali " +"chránenej heslom. Zmeňte túto možnosť na vypnuté, aby sa neposielali " "informácie o prítomnosti v diskusnej skupine." #. 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" +"'always_with_roster' - Like 'always' but the messages are in a single window " +"along with the roster.\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." +"specific window." msgstr "" -"Nastavuje okno, kde sú zobrazované nové správy.\n" -"'vždy' - Všetky správy sa zobrazia v jednom okne.\n" -"'nikdy' - Každá správa sa zobrazí v samostatnom okne.\n" -"'podľa účtu' - Správy pre jednotlivé účty sú zobrazované v samostatných " -"oknách.\n" -"'podľa typu' - Každý typ správy (e.g., rozhovor, diskusná skupina) sú " -"zobrazené v samostatnom okne. Poznámka: pre aplikovanie zmeny tohoto " -"nastavenia, je nutné reštartovať Gajim" +"Ovládanie okna, kde je umiestnená nová správa.\n" +"'always' - Všetky správy sú odoslané do samostatného okna.\n" +"'always_with_roster' - Ako 'always', ale správy su v samostatnom okne spolu " +"s zoznamom.\n" +"'never' - Všetky správy dostanú vlastné okno.\n" +"'peracct' - Správy pre každý účet sú odoslané do špecifikovaného okna.\n" +"'pertype' - Každý typ správy (napr., rozhovory proti diskusiám) sú odoslané " +"do špecifikovaného okna." -#: ../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 "Ak je Vypnuté, neuvidíte avatarov v diskusnom okne" +msgstr "Ak nie je pravda, neuvidíte avatarov v diskusnom okne" -#: ../src/common/config.py:212 +#: ../src/common/config.py:235 msgid "If True, pressing the escape key closes a tab/window." -msgstr "Ak je pravda, stlačením ESC klávesy zatvoríte tab/okno." +msgstr "Ak je pravda, stlačením Esc klávesy zatvoríte kartu/okno." -#: ../src/common/config.py:213 -msgid "Hides the buttons in group chat window." -msgstr "Skrývanie tlačidiel v okne s diskusnou skupinou." +#: ../src/common/config.py:236 +msgid "Hides the buttons in chat windows." +msgstr "Skývať tlačidlá v okne rozhovoru." -#: ../src/common/config.py:214 -msgid "Hides the buttons in two persons chat window." -msgstr "Skrývanie tlačidiel v okne s rozhovorom medzi dvoma osobami." - -#: ../src/common/config.py:215 +#: ../src/common/config.py:237 msgid "Hides the banner in a group chat window" -msgstr "Skrývanie titilku v okne s diskusnou skupinou." +msgstr "Skrývanie titulku v okne s diskusnou skupinou" -#: ../src/common/config.py:216 +#: ../src/common/config.py:238 msgid "Hides the banner in two persons chat window" msgstr "Skryť titulok v okne s diskusiou dvoch osôb." -#: ../src/common/config.py:217 +#: ../src/common/config.py:239 msgid "Hides the group chat occupants list in group chat window." msgstr "Skrývanie zoznamu účastníkov v okne s diskusnou skupinou." -#: ../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." msgstr "" -"V diskusii sa zobrazí prezývka na začiatku riadku, len v prípade, že " +"V rozhovore sa zobrazí prezývka na začiatku riadku, len v prípade, že " "predchádzajúca správa prišla od inej osoby." -#: ../src/common/config.py:219 -msgid "Indentation when using merge consecutive nickame." -msgstr "Zarovnanie v prípade zlúčenia prezývok." +#: ../src/common/config.py:241 +msgid "Indentation when using merge consecutive nickname." +msgstr "" -#: ../src/common/config.py:220 +#: ../src/common/config.py:242 +msgid "Smooth scroll message in conversation window" +msgstr "" + +#: ../src/common/config.py:243 msgid "List of colors that will be used to color nicknames in group chats." msgstr "" "Zoznam farieb, ktoré budú použité na zafarbenie prezývok v diskusnej skupine." -#: ../src/common/config.py:221 +#: ../src/common/config.py:244 msgid "Ctrl-Tab go to next composing tab when none is unread." msgstr "" -"CTRL+TAB vás presunie na ďalšiu záložku, pokiaľ už nie sú žiadne neprečítané " +"Ctrl-Tab vás presunie na ďalšiu kartu, pokiaľ už nie sú žiadne neprečítané " "správy." -#: ../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." @@ -5785,17 +7498,68 @@ msgstr "" "Má byť zobrazovaný dialóg pri vytváraní metakontaktov? Prázdny reťazec " "znamená, že dialóg sa nezobrazuje." -#: ../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 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 "" -"Ak je zapnuté, budete môcť zadať aj negatívnu prioritu pre účet v okne na " -"modifikáciu účtov. Buďte však opatrní(á), pokiaľ sa prihlásite s negatívnou " -"prioritou, nebudete dostávať žiadne správy zo servera." -#: ../src/common/config.py:234 +#: ../src/common/config.py:247 +msgid "" +"If True, Gajim will use Gnome Keyring (if available) to store account " +"passwords." +msgstr "" +"Ak je pravda, Gajim bude používať Správca zväzku kľúčov (ak je prítomný) na " +"ukladanie hesiel." + +#: ../src/common/config.py:248 +msgid "" +"If True, Gajim will show number of online and total contacts in account and " +"group rows." +msgstr "" +"Ak je pravda, Gajim bude zobrazovať počet prítomných a všetkých kontaktov v " +"riadku účtu a skupiny." + +#: ../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 "" + +#: ../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 "" +"Ak je pravda, Gajim naroluje a označí kontakt, ktorý poslal poslednú správu, " +"ak nie je práve otvorené okno rozhovoru." + +#: ../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 "" + +#: ../src/common/config.py:252 +msgid "Time of inactivity needed before the change status window closes down." +msgstr "Doba neaktivity potrebná na zmenenie stavu na zatvoril okno." + +#: ../src/common/config.py:253 +msgid "" +"Maximum number of lines that are printed in conversations. Oldest lines are " +"cleared." +msgstr "" +"Maximálny počet riadkov zobrazených v rozhovore. Najstaršie riadky budú " +"zmazané." + +#: ../src/common/config.py:260 +msgid "" +"If True, notification windows from notification-daemon will be attached to " +"systray icon." +msgstr "" + +#: ../src/common/config.py:272 msgid "" "Priority will change automatically according to your status. Priorities are " "defined in autopriority_* options." @@ -5803,236 +7567,243 @@ msgstr "" "Priorita sa zmení automaticky vzhľadom k vášmu stavu. Priority sú definované " "v premenných autopriority_* nastaveniach." -#. yes, no, ask -#: ../src/common/config.py:263 -msgid "Jabberd2 workaround" -msgstr "Jabberd2 workaround" +#: ../src/common/config.py:284 +msgid "" +"If disabled, don't sign presences with GPG key, even if GPG is configured." +msgstr "" -#: ../src/common/config.py:267 +#. yes, no, ask +#: ../src/common/config.py:302 +msgid "Jabberd2 workaround" +msgstr "" + +#: ../src/common/config.py:306 msgid "" "If checked, Gajim will use your IP and proxies defined in " "file_transfer_proxies option for file transfer." msgstr "" -"Ak je zapnuté, Gajim použije vašu IP adresu a proxy definovanú v premennej " -"file_transfer_proxies na prenos súborov." +"Ak je zaškrtnuté, Gajim použije vašu IP adresu a proxy definovanú v " +"premennej file_transfer_proxies na prenos súborov." -#: ../src/common/config.py:326 +#: ../src/common/config.py:366 msgid "Is OpenPGP enabled for this contact?" msgstr "Má tento kontakt k dispozícii OpenPGP?" -#: ../src/common/config.py:327 ../src/common/config.py:330 +#: ../src/common/config.py:367 ../src/common/config.py:370 msgid "Language for which we want to check misspelled words" msgstr "Jazyk v ktorom má byť prevádzaná kontrola pravopisu" -#: ../src/common/config.py:336 +#: ../src/common/config.py:376 msgid "all or space separated status" -msgstr "všetky alebo medzerou oddelené stavu" +msgstr "všetky alebo medzerou oddelené stavy" -#: ../src/common/config.py:337 +#: ../src/common/config.py:377 msgid "'yes', 'no', or 'both'" msgstr "'áno', 'nie', alebo '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:378 ../src/common/config.py:380 +#: ../src/common/config.py:381 ../src/common/config.py:384 +#: ../src/common/config.py:385 msgid "'yes', 'no' or ''" msgstr "'áno', 'nie' alebo ''" -#: ../src/common/config.py:351 +#: ../src/common/config.py:391 msgid "Sleeping" msgstr "Spím" -#: ../src/common/config.py:352 +#: ../src/common/config.py:392 msgid "Back soon" msgstr "Hneď som späť" -#: ../src/common/config.py:352 +#: ../src/common/config.py:392 msgid "Back in some minutes." msgstr "Som späť za pár minút." -#: ../src/common/config.py:353 +#: ../src/common/config.py:393 msgid "Eating" -msgstr "Jedlo" +msgstr "Jem" -#: ../src/common/config.py:353 +#: ../src/common/config.py:393 msgid "I'm eating, so leave me a message." msgstr "Práve jem, prosím nechajte mi odkaz." -#: ../src/common/config.py:354 +#: ../src/common/config.py:394 msgid "Movie" msgstr "Film" -#: ../src/common/config.py:354 +#: ../src/common/config.py:394 msgid "I'm watching a movie." msgstr "Pozerám film." -#: ../src/common/config.py:355 +#: ../src/common/config.py:395 msgid "Working" msgstr "Pracujem" -#: ../src/common/config.py:355 +#: ../src/common/config.py:395 msgid "I'm working." msgstr "Pracujem." -#: ../src/common/config.py:356 +#: ../src/common/config.py:396 msgid "Phone" -msgstr "Telefónujem" +msgstr "Telefonujem" -#: ../src/common/config.py:356 +#: ../src/common/config.py:396 msgid "I'm on the phone." -msgstr "Mám hovor." +msgstr "Telefonujem." -#: ../src/common/config.py:357 +#: ../src/common/config.py:397 msgid "Out" msgstr "Vonku" -#: ../src/common/config.py:357 +#: ../src/common/config.py:397 msgid "I'm out enjoying life." msgstr "Som vonku a užívam si život." -#: ../src/common/config.py:361 +#: ../src/common/config.py:401 msgid "I'm available." msgstr "Prítomný." -#: ../src/common/config.py:362 +#: ../src/common/config.py:402 msgid "I'm free for chat." -msgstr "Mám čas na debatu." +msgstr "Mám čas na rozhovor." -#: ../src/common/config.py:364 +#: ../src/common/config.py:404 msgid "I'm not available." -msgstr "Nie som prítomný(á)." +msgstr "Nie som prítomný." -#: ../src/common/config.py:365 +#: ../src/common/config.py:405 msgid "Do not disturb." msgstr "Nerušiť." -#: ../src/common/config.py:366 ../src/common/config.py:367 +#: ../src/common/config.py:406 ../src/common/config.py:407 msgid "Bye!" msgstr "Ahoj!" -#: ../src/common/config.py:376 +#: ../src/common/config.py:416 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 "" -"Prehrať zvuk keď MUC správa obsahuje slová, ktoré sú v uvedené v " -"moc_highlihgt_words, alebo keď MUC správa obsahuje vašu prezývku." -#: ../src/common/config.py:377 +#: ../src/common/config.py:417 msgid "Sound to play when any MUC message arrives." -msgstr "Zvuk, pri prijatí správy do MUC." +msgstr "" -#: ../src/common/config.py:386 ../src/common/optparser.py:197 +#: ../src/common/config.py:426 ../src/common/optparser.py:220 msgid "green" msgstr "zelená" -#: ../src/common/config.py:390 ../src/common/optparser.py:183 +#: ../src/common/config.py:430 ../src/common/optparser.py:206 msgid "grocery" msgstr "obchod s potravinami" -#: ../src/common/config.py:394 +#: ../src/common/config.py:434 msgid "human" msgstr "človek" -#: ../src/common/config.py:398 +#: ../src/common/config.py:438 msgid "marine" msgstr "námornícka" -#: ../src/common/connection_handlers.py:52 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:44 +#: ../src/common/connection_handlers.py:67 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:48 msgid "Unable to load idle module" msgstr "Nie je možné nahrať idle modul" -#: ../src/common/connection_handlers.py:177 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:233 +#: ../src/common/connection_handlers.py:225 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:242 msgid "Wrong host" -msgstr "Nesprávna host" +msgstr "Nesprávny 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." +#: ../src/common/connection_handlers.py:226 +msgid "Invalid local address? :-O" msgstr "" -"Host, ktorý ste nastavili ako ft_override_host_to_send v rozšírených " -"nastaveniach nie je správny a bude preto ignorovaný." -#: ../src/common/connection_handlers.py:590 +#: ../src/common/connection_handlers.py:624 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Redistračné informácie pre službu %s nedorazili včas" -#: ../src/common/connection_handlers.py:1523 +#: ../src/common/connection_handlers.py:1849 #, python-format msgid "Nickname not allowed: %s" msgstr "Prezývka nie je povolená: %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:1919 +#: ../src/common/connection_handlers.py:1922 +#: ../src/common/connection_handlers.py:1925 +#: ../src/common/connection_handlers.py:1928 +#: ../src/common/connection_handlers.py:1932 +#: ../src/common/connection_handlers.py:1941 msgid "Unable to join group chat" msgstr "Nie je možné pripojiť sa do diskusnej skupiny" -#: ../src/common/connection_handlers.py:1586 -msgid "A password is required to join this group chat." -msgstr "Pre vstup do diskusnej skupiny je vyžadované heslo." +#: ../src/common/connection_handlers.py:1920 +#, python-format +msgid "You are banned from group chat %s." +msgstr "" -#: ../src/common/connection_handlers.py:1589 -msgid "You are banned from this group chat." -msgstr "Vstup do diskusnej skupiny vám bol zakázaný." +#: ../src/common/connection_handlers.py:1923 +#, python-format +msgid "Group chat %s does not exist." +msgstr "" -#: ../src/common/connection_handlers.py:1592 -msgid "Such group chat does not exist." -msgstr "Takáto diskusná skupina neexistuje." - -#: ../src/common/connection_handlers.py:1595 +#: ../src/common/connection_handlers.py:1926 msgid "Group chat creation is restricted." msgstr "Vytváranie diskusných skupín je obmedzené." -#: ../src/common/connection_handlers.py:1598 -msgid "Your registered nickname must be used." -msgstr "Musíte použiť vašu zaregistrovanú prezývku." +#: ../src/common/connection_handlers.py:1929 +#, python-format +msgid "Your registered nickname must be used in group chat %s." +msgstr "" -#: ../src/common/connection_handlers.py:1601 -msgid "You are not in the members list." -msgstr "Nie ste v zozname." +#: ../src/common/connection_handlers.py:1933 +#, python-format +msgid "You are not in the members list in groupchat %s." +msgstr "" -#: ../src/common/connection_handlers.py:1609 +#: ../src/common/connection_handlers.py:1942 +#, 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žadovaná prezývka je používaná alebo už je registrovaná iným členom.\n" -"Prosím zadajte inú prezývku:" -#: ../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:1973 +msgid "Room has been destroyed" +msgstr "Miestnosť bola zničená" + +#: ../src/common/connection_handlers.py:1980 +#, python-format +msgid "You can join this room instead: %s" +msgstr "" + +#: ../src/common/connection_handlers.py:2007 msgid "I would like to add you to my roster." -msgstr "Chcel by som si ťa pridať do môjho zoznamu." +msgstr "Chcem si vás pridať do môjho zoznamu." #. BE CAREFUL: no con.updateRosterItem() in a callback -#: ../src/common/connection_handlers.py:1680 +#: ../src/common/connection_handlers.py:2028 #, python-format msgid "we are now subscribed to %s" msgstr "sme prihlásení k %s" -#: ../src/common/connection_handlers.py:1682 +#: ../src/common/connection_handlers.py:2030 #, python-format msgid "unsubscribe request from %s" msgstr "požiadavka na odhlásenie od %s" -#: ../src/common/connection_handlers.py:1684 +#: ../src/common/connection_handlers.py:2032 #, python-format msgid "we are now unsubscribed from %s" msgstr "sme odhlásení od %s" -#: ../src/common/connection_handlers.py:1854 +#: ../src/common/connection_handlers.py:2174 #, python-format msgid "" "JID %s is not RFC compliant. It will not be added to your roster. Use roster " @@ -6042,80 +7813,258 @@ msgstr "" "nástroje na správu zoznamu, napríklad: http://jru.jabberstudio.org/ pre jeho " "odstránenie" -#: ../src/common/connection.py:175 -#: ../src/common/zeroconf/connection_zeroconf.py:196 +#. We didn't set a passphrase +#: ../src/common/connection_handlers.py:2199 +#: ../src/common/zeroconf/connection_zeroconf.py:172 +msgid "OpenPGP passphrase was not given" +msgstr "OpenPGP passfráza nebola zadaná" + +#: ../src/common/connection.py:59 +msgid "Unable to get issuer certificate" +msgstr "" + +#: ../src/common/connection.py:60 +msgid "Unable to get certificate CRL" +msgstr "" + +#: ../src/common/connection.py:61 +msgid "Unable to decrypt certificate's signature" +msgstr "" + +#: ../src/common/connection.py:62 +msgid "Unable to decrypt CRL's signature" +msgstr "" + +#: ../src/common/connection.py:63 +msgid "Unable to decode issuer public key" +msgstr "" + +#: ../src/common/connection.py:64 +msgid "Certificate signature failure" +msgstr "" + +#: ../src/common/connection.py:65 +msgid "CRL signature failure" +msgstr "" + +#: ../src/common/connection.py:66 +msgid "Certificate is not yet valid" +msgstr "" + +#: ../src/common/connection.py:67 +msgid "Certificate has expired" +msgstr "" + +#: ../src/common/connection.py:68 +msgid "CRL is not yet valid" +msgstr "" + +#: ../src/common/connection.py:69 +msgid "CRL has expired" +msgstr "" + +#: ../src/common/connection.py:70 +msgid "Format error in certificate's notBefore field" +msgstr "" + +#: ../src/common/connection.py:71 +msgid "Format error in certificate's notAfter field" +msgstr "" + +#: ../src/common/connection.py:72 +msgid "Format error in CRL's lastUpdate field" +msgstr "" + +#: ../src/common/connection.py:73 +msgid "Format error in CRL's nextUpdate field" +msgstr "" + +#: ../src/common/connection.py:74 +msgid "Out of memory" +msgstr "" + +#: ../src/common/connection.py:75 +msgid "Self signed certificate" +msgstr "" + +#: ../src/common/connection.py:76 +msgid "Self signed certificate in certificate chain" +msgstr "" + +#: ../src/common/connection.py:77 +msgid "Unable to get local issuer certificate" +msgstr "" + +#: ../src/common/connection.py:78 +msgid "Unable to verify the first certificate" +msgstr "" + +#: ../src/common/connection.py:79 +msgid "Certificate chain too long" +msgstr "" + +#: ../src/common/connection.py:80 +msgid "Certificate revoked" +msgstr "" + +#: ../src/common/connection.py:81 +msgid "Invalid CA certificate" +msgstr "" + +#: ../src/common/connection.py:82 +msgid "Path length constraint exceeded" +msgstr "" + +#: ../src/common/connection.py:83 +msgid "Unsupported certificate purpose" +msgstr "" + +#: ../src/common/connection.py:84 +msgid "Certificate not trusted" +msgstr "" + +#: ../src/common/connection.py:85 +msgid "Certificate rejected" +msgstr "" + +#: ../src/common/connection.py:86 +msgid "Subject issuer mismatch" +msgstr "" + +#: ../src/common/connection.py:87 +msgid "Authority and subject key identifier mismatch" +msgstr "" + +#: ../src/common/connection.py:88 +msgid "Authority and issuer serial number mismatch" +msgstr "" + +#: ../src/common/connection.py:89 +msgid "Key usage does not include certificate signing" +msgstr "" + +#: ../src/common/connection.py:90 +msgid "Application verification failure" +msgstr "" + +#: ../src/common/connection.py:250 +#: ../src/common/zeroconf/connection_zeroconf.py:214 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "Spojenie s účtom \"%s\" bolo stratené" -#: ../src/common/connection.py:176 +#: ../src/common/connection.py:251 msgid "Reconnect manually." msgstr "Znovu pripojiť manuálne." -#: ../src/common/connection.py:187 ../src/common/connection.py:214 +#: ../src/common/connection.py:262 #, python-format -msgid "Transport %s answered wrongly to register request: %s" +msgid "Server %s answered wrongly to register request: %s" msgstr "" -"Transport %s odpovedal nekorektne pri odoslaní registračnej požiadavky: %s" + +#: ../src/common/connection.py:296 +#, python-format +msgid "Server %s provided a different registration form" +msgstr "" + +#: ../src/common/connection.py:312 +#, python-format +msgid "Unknown SSL error: %d" +msgstr "Neznáma chyba SSL: %d" #. wrong answer -#: ../src/common/connection.py:213 +#: ../src/common/connection.py:327 msgid "Invalid answer" msgstr "Nesprávna odpoveď" -#: ../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:328 +#, python-format +msgid "Transport %s answered wrongly to register request: %s" +msgstr "" +"Transport %s odpovedal nesprávne pri odoslaní registračnej požiadavky: %s" + +#: ../src/common/connection.py:507 +msgid "Connection to proxy failed" +msgstr "" + +#: ../src/common/connection.py:561 ../src/common/connection.py:623 +#: ../src/common/connection.py:1185 +#: ../src/common/zeroconf/connection_zeroconf.py:248 #, python-format msgid "Could not connect to \"%s\"" msgstr "Nie je možné pripojiť sa k \"%s\"" -#: ../src/common/connection.py:419 +#: ../src/common/connection.py:575 #, python-format msgid "Connected to server %s:%s with %s" msgstr "Pripojený na server %s:%s s %s" -#: ../src/common/connection.py:441 -msgid "Check your connection or try again later" -msgstr "Skontrolujte svoje pripojenie alebo skúste neskôr" +#: ../src/common/connection.py:586 +#, python-format +msgid "The authenticity of the %s certificate could be invalid." +msgstr "" -#: ../src/common/connection.py:467 +#: ../src/common/connection.py:589 +#, python-format +msgid "" +"\n" +"SSL Error: %s" +msgstr "" +"\n" +"Chyba SSL: %d" + +#: ../src/common/connection.py:591 +#, python-format +msgid "" +"\n" +"Unknown SSL error: %d" +msgstr "" +"\n" +"Neznáma chyba SSL: %d" + +#: ../src/common/connection.py:624 +msgid "Check your connection or try again later" +msgstr "Skontrolujte svoje pripojenie alebo to skúste neskôr" + +#: ../src/common/connection.py:649 #, python-format msgid "Authentication failed with \"%s\"" -msgstr "Autentifikácia bola neúspešná s \"%s\"" +msgstr "Overenie zlyhalo s \"%s\"" -#: ../src/common/connection.py:468 +#: ../src/common/connection.py:651 msgid "Please check your login and password for correctness." msgstr "Prosím, skontrolujte správnosť prihlasovacieho mena a hesla." -#. 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 passfráza nebola zadaná" +#: ../src/common/connection.py:694 +msgid "Error while removing privacy list" +msgstr "" -#. do not show I'm invisible! -#: ../src/common/connection.py:627 -msgid "invisible" -msgstr "neviditeľný" - -#: ../src/common/connection.py:628 -msgid "offline" -msgstr "offline" - -#: ../src/common/connection.py:629 +#: ../src/common/connection.py:695 #, python-format -msgid "I'm %s" -msgstr "Som %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 "" + +#: ../src/common/connection.py:967 +#: ../src/common/zeroconf/connection_zeroconf.py:381 +msgid "Neither the remote presence is signed, nor a key was assigned." +msgstr "" + +#: ../src/common/connection.py:969 +#: ../src/common/zeroconf/connection_zeroconf.py:383 +#, python-format +msgid "The contact's key (%s) does not match the key assigned in Gajim." +msgstr "" #. we're not english #. one in locale and one en -#: ../src/common/connection.py:720 +#: ../src/common/connection.py:978 msgid "[This message is *encrypted* (See :JEP:`27`]" -msgstr "[Táto správa je *šifrovaná* (See :JEP:`27`]" +msgstr "[Táto správa je *šifrovaná* (Pozrite :JEP:`27`]" -#: ../src/common/connection.py:776 -#: ../src/common/zeroconf/connection_zeroconf.py:397 +#: ../src/common/connection.py:1052 +#: ../src/common/zeroconf/connection_zeroconf.py:447 #, python-format msgid "" "Subject: %s\n" @@ -6124,34 +8073,38 @@ msgstr "" "Predmet: %s\n" "%s" -#: ../src/common/connection.py:915 +#: ../src/common/connection.py:1217 msgid "Not fetched because of invisible status" msgstr "Nie je možné získať, pretože aktuálny stav je: Neviditeľný" +#: ../src/common/contacts.py:305 +msgid "Not in roster" +msgstr "Nie je v zozname" + #. 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 väzby chýbajú na tomto počítači" -#: ../src/common/dbus_support.py:34 +#: ../src/common/dbus_support.py:42 msgid "D-Bus capabilities of Gajim cannot be used" msgstr "D-Bus vlastnosti programu Gajim nemôžu byť použité" -#: ../src/common/exceptions.py:22 +#: ../src/common/exceptions.py:27 msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." msgstr "chýbajúca závislosť na pysqlite2 (aka python-pysqlite2). Ukončenie..." -#: ../src/common/exceptions.py:30 +#: ../src/common/exceptions.py:44 msgid "Service not available: Gajim is not running, or remote_control is False" msgstr "" "Služba nie je dostupná: Gajim nebeží alebo ovládanie vzdialeného Gajimu " "vrátilo 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 je prítomný na tomto stroji alebo chýba modul pre Python" +msgstr "D-Bus nie je prítomný na tomto stroji alebo chýba modul pre python" -#: ../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" @@ -6159,845 +8112,497 @@ msgstr "" "Session bus nie je k dispozícii.\n" "Viac informácií nájdete na adrese http://trac.gajim.org/wiki/GajimDBus" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "one" -msgstr "jedna" +msgstr "jeden" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "two" msgstr "dva" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "three" msgstr "tri" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "four" msgstr "štyri" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "five" msgstr "päť" -#: ../src/common/fuzzyclock.py:42 +#: ../src/common/fuzzyclock.py:47 msgid "six" msgstr "šesť" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "seven" msgstr "sedem" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "eight" msgstr "osem" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "nine" msgstr "deväť" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "ten" msgstr "desať" -#: ../src/common/fuzzyclock.py:43 +#: ../src/common/fuzzyclock.py:48 msgid "eleven" msgstr "jedenásť" -#: ../src/common/fuzzyclock.py:44 +#: ../src/common/fuzzyclock.py:49 msgid "twelve" msgstr "dvanásť" #. 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 hodín" - -#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:55 -msgid "five past %0" -msgstr "%0 a päť minút" - -#: ../src/common/fuzzyclock.py:47 ../src/common/fuzzyclock.py:56 -msgid "ten past %0" -msgstr "%0 a desať minút" - -#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:56 -msgid "quarter past %0" -msgstr "%0 a štvrť" - -#: ../src/common/fuzzyclock.py:48 ../src/common/fuzzyclock.py:57 -msgid "twenty past %0" -msgstr "%0 a dvadsať minút" - -#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:57 -msgid "twenty five past %0" -msgstr "%0 a dvadsať päť minút" - -#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:58 -msgid "half past %0" -msgstr "%0 a pol" - -#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:58 -msgid "twenty five to %1" -msgstr "o dvadsať päť minút %1" - -#: ../src/common/fuzzyclock.py:50 ../src/common/fuzzyclock.py:59 -msgid "twenty to %1" -msgstr "o dvadsať minút %1" - -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:59 -msgid "quarter to %1" -msgstr "o štvrť %1" - -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:60 -msgid "ten to %1" -msgstr "Desať minút pred %1" - -#: ../src/common/fuzzyclock.py:51 ../src/common/fuzzyclock.py:60 -msgid "five to %1" -msgstr "o päť minút %1" +#: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 +msgid "$0 o'clock" +msgstr "" #: ../src/common/fuzzyclock.py:52 ../src/common/fuzzyclock.py:60 -msgid "%1 o'clock" -msgstr "%1 hodina" +msgid "five past $0" +msgstr "" -#: ../src/common/fuzzyclock.py:62 +#: ../src/common/fuzzyclock.py:53 ../src/common/fuzzyclock.py:61 +msgid "ten past $0" +msgstr "" + +#: ../src/common/fuzzyclock.py:53 ../src/common/fuzzyclock.py:61 +msgid "quarter past $0" +msgstr "" + +#: ../src/common/fuzzyclock.py:54 ../src/common/fuzzyclock.py:62 +msgid "twenty past $0" +msgstr "dvadsať po $0" + +#: ../src/common/fuzzyclock.py:54 ../src/common/fuzzyclock.py:62 +msgid "twenty five past $0" +msgstr "dvadsaťpäť po $0" + +#: ../src/common/fuzzyclock.py:55 ../src/common/fuzzyclock.py:63 +msgid "half past $0" +msgstr "" + +#: ../src/common/fuzzyclock.py:55 ../src/common/fuzzyclock.py:63 +msgid "twenty five to $1" +msgstr "dvadsaťpäť do $1" + +#: ../src/common/fuzzyclock.py:56 ../src/common/fuzzyclock.py:64 +msgid "twenty to $1" +msgstr "dvadsať do $1" + +#: ../src/common/fuzzyclock.py:56 ../src/common/fuzzyclock.py:64 +msgid "quarter to $1" +msgstr "" + +#: ../src/common/fuzzyclock.py:57 ../src/common/fuzzyclock.py:65 +msgid "ten to $1" +msgstr "" + +#: ../src/common/fuzzyclock.py:57 ../src/common/fuzzyclock.py:65 +msgid "five to $1" +msgstr "" + +#: ../src/common/fuzzyclock.py:57 ../src/common/fuzzyclock.py:66 +msgid "$1 o'clock" +msgstr "" + +#: ../src/common/fuzzyclock.py:69 msgid "Night" msgstr "Noc" -#: ../src/common/fuzzyclock.py:62 +#: ../src/common/fuzzyclock.py:69 msgid "Early morning" msgstr "Skoré ráno" -#: ../src/common/fuzzyclock.py:62 +#: ../src/common/fuzzyclock.py:69 msgid "Morning" msgstr "Ráno" -#: ../src/common/fuzzyclock.py:62 +#: ../src/common/fuzzyclock.py:69 msgid "Almost noon" msgstr "Takmer poludnie" -#: ../src/common/fuzzyclock.py:63 +#: ../src/common/fuzzyclock.py:70 msgid "Noon" msgstr "Obed" -#: ../src/common/fuzzyclock.py:63 +#: ../src/common/fuzzyclock.py:70 msgid "Afternoon" msgstr "Popoludnie" -#: ../src/common/fuzzyclock.py:63 +#: ../src/common/fuzzyclock.py:70 msgid "Evening" msgstr "Večer" -#: ../src/common/fuzzyclock.py:63 +#: ../src/common/fuzzyclock.py:70 msgid "Late evening" msgstr "neskorý večer" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:72 msgid "Start of week" msgstr "Začiatok týždňa" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:72 msgid "Middle of week" msgstr "Stred týždňa" -#: ../src/common/fuzzyclock.py:65 +#: ../src/common/fuzzyclock.py:72 msgid "End of week" msgstr "Koniec týždňa" -#: ../src/common/fuzzyclock.py:66 +#: ../src/common/fuzzyclock.py:73 msgid "Weekend!" msgstr "Víkend!" -#: ../src/common/helpers.py:105 +#: ../src/common/helpers.py:124 msgid "Invalid character in username." -msgstr "Nepovolený znak v mene účtu." +msgstr "Nepovolený znak v názve účtu." -#: ../src/common/helpers.py:110 +#: ../src/common/helpers.py:129 msgid "Server address required." -msgstr "Adresa serveru je požadovaná:" +msgstr "Adresa serveru je požadovaná." -#: ../src/common/helpers.py:115 +#: ../src/common/helpers.py:134 msgid "Invalid character in hostname." -msgstr "Nesprávny znak v mene servera." +msgstr "Nepovolený znak v názve hostu." -#: ../src/common/helpers.py:121 +#: ../src/common/helpers.py:140 msgid "Invalid character in resource." msgstr "Nepovolený znak v zdroji." #. 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 "_Zaneprázdnený" -#: ../src/common/helpers.py:212 +#: ../src/common/helpers.py:233 msgid "Busy" msgstr "Zaneprázdnený" -#: ../src/common/helpers.py:215 +#: ../src/common/helpers.py:236 msgid "_Not Available" msgstr "_Neprítomný" -#: ../src/common/helpers.py:220 +#: ../src/common/helpers.py:241 msgid "_Free for Chat" msgstr "_Mám čas na debatu" -#: ../src/common/helpers.py:222 +#: ../src/common/helpers.py:243 msgid "Free for Chat" msgstr "Mám čas na debatu" -#: ../src/common/helpers.py:225 +#: ../src/common/helpers.py:246 msgid "_Available" msgstr "_Prítomný" -#: ../src/common/helpers.py:227 -msgid "Available" -msgstr "Prítomný" - -#: ../src/common/helpers.py:229 +#: ../src/common/helpers.py:250 msgid "Connecting" msgstr "Pripájanie" -#: ../src/common/helpers.py:232 +#: ../src/common/helpers.py:253 msgid "A_way" -msgstr "Preč" +msgstr "P_reč" -#: ../src/common/helpers.py:237 +#: ../src/common/helpers.py:258 msgid "_Offline" -msgstr "_Offline" +msgstr "_Odhlásený" -#: ../src/common/helpers.py:239 +#: ../src/common/helpers.py:260 msgid "Offline" -msgstr "Offline" +msgstr "Odhlásený" -#: ../src/common/helpers.py:242 +#: ../src/common/helpers.py:263 msgid "_Invisible" msgstr "_Neviditeľný" -#: ../src/common/helpers.py:248 +#: ../src/common/helpers.py:269 msgid "?contact has status:Unknown" msgstr "?kontakt má stav:Neznámy" -#: ../src/common/helpers.py:250 +#: ../src/common/helpers.py:271 msgid "?contact has status:Has errors" msgstr "?kontakt má stav:Chyba" -#: ../src/common/helpers.py:255 +#: ../src/common/helpers.py:276 msgid "?Subscription we already have:None" msgstr "?Zápis už máme:Nič" -#: ../src/common/helpers.py:257 +#: ../src/common/helpers.py:278 msgid "To" msgstr "Pre" -#: ../src/common/helpers.py:261 +#: ../src/common/helpers.py:282 msgid "Both" msgstr "Oba" -#: ../src/common/helpers.py:269 +#: ../src/common/helpers.py:290 msgid "?Ask (for Subscription):None" msgstr "?Vyžiadať (zápis): Nič" -#: ../src/common/helpers.py:271 +#: ../src/common/helpers.py:292 msgid "Subscribe" msgstr "Zapísať" -#: ../src/common/helpers.py:280 +#: ../src/common/helpers.py:301 msgid "?Group Chat Contact Role:None" msgstr "?Rola kontaktu v diskusnej skupine: žiadna" -#: ../src/common/helpers.py:283 +#: ../src/common/helpers.py:304 msgid "Moderators" msgstr "Moderátori" -#: ../src/common/helpers.py:285 +#: ../src/common/helpers.py:306 msgid "Moderator" msgstr "Moderátor" -#: ../src/common/helpers.py:288 +#: ../src/common/helpers.py:309 msgid "Participants" msgstr "Účastníci" -#: ../src/common/helpers.py:290 +#: ../src/common/helpers.py:311 msgid "Participant" msgstr "Účastník" -#: ../src/common/helpers.py:293 +#: ../src/common/helpers.py:314 msgid "Visitors" msgstr "Návštevníci" -#: ../src/common/helpers.py:295 +#: ../src/common/helpers.py:316 msgid "Visitor" msgstr "Návštevník" -#: ../src/common/helpers.py:301 +#: ../src/common/helpers.py:322 msgid "?Group Chat Contact Affiliation:None" msgstr "?Príslušnosť kontaktu v diskusnej skupine: žiadna" -#: ../src/common/helpers.py:303 +#: ../src/common/helpers.py:324 msgid "Owner" msgstr "Vlastník" -#: ../src/common/helpers.py:305 +#: ../src/common/helpers.py:326 msgid "Administrator" msgstr "Administrátor" -#: ../src/common/helpers.py:307 +#: ../src/common/helpers.py:328 msgid "Member" msgstr "Člen" -#: ../src/common/helpers.py:346 +#: ../src/common/helpers.py:367 msgid "is paying attention to the conversation" msgstr "sleduje konverzáciu" -#: ../src/common/helpers.py:348 +#: ../src/common/helpers.py:369 msgid "is doing something else" msgstr "robí niečo iné" -#: ../src/common/helpers.py:350 +#: ../src/common/helpers.py:371 msgid "is composing a message..." msgstr "píše správu..." -#. 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 "prestal písať správu" -#: ../src/common/helpers.py:355 +#: ../src/common/helpers.py:376 msgid "has closed the chat window or tab" msgstr "zatvoril okno alebo záložku" -#: ../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 neprečítaná správa" -msgstr[1] "%d neprečítaných správ" -msgstr[2] "%d neprečítaných správ" +msgid "%d message pending" +msgid_plural "%d messages pending" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" -#: ../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 neprečítaná krátka správa" -msgstr[1] "%d neprečítané krátke správ" -msgstr[2] "%d neprečítaných krátkych správ" +msgid " from room %s" +msgstr " z miestnosti %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 neprečítaná správa z diskusnej skupiny" -msgstr[1] "%d neprečítaných správ z diskusnej skupiny" -msgstr[2] "%d neprečítaných správ z diskusnej skupiny" +msgid " from user %s" +msgstr " od používateľa %s" -#: ../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 neprečítaná súkromná správa" -msgstr[1] "%d neprečítané súkromné správy" -msgstr[2] "%d neprečítaných súkromných správ" +msgid " from %s" +msgstr " od %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] "" +msgstr[1] "" +msgstr[2] "" + +#: ../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 "chyba: nie je možné otvoriť %s na čítanie" -#: ../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 "azúrová" -#: ../src/common/optparser.py:302 -msgid "migrating logs database to indeces" -msgstr "migrácia databázových záznamov" +#: ../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 účet %s" -#: ../src/common/zeroconf/client_zeroconf.py:189 -msgid "" -"Connection to host could not be established: Incorrect answer from server." -msgstr "Spojenie na host nie je možné vytvoriť: Nekorektná odpoveď od serveru." - -#: ../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 "Spojenie s hostom nie je možné nadviazať." -#: ../src/common/zeroconf/client_zeroconf.py:334 +#: ../src/common/zeroconf/client_zeroconf.py:206 +msgid "" +"Connection to host could not be established: Incorrect answer from server." +msgstr "Spojenie na host nie je možné vytvoriť: Nesprávna odpoveď od serveru." + +#: ../src/common/zeroconf/client_zeroconf.py:366 msgid "" "Connection to host could not be established: Timeout while sending data." msgstr "" "Spojenie na host nie je možné vytvoriť: Vypršal časový limit pri odosielaní " "dát." -#: ../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 "Kontakt je offline. Vašu správu nie je možné odoslať." +msgstr "Kontakt je odhlásený. Vašu správu nie je možné odoslať." -#: ../src/common/zeroconf/connection_zeroconf.py:197 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:242 +#, python-format +msgid "" +"The host %s you configured as the ft_add_hosts_to_send advanced option is " +"not valid, so ignored." +msgstr "" + +#: ../src/common/zeroconf/connection_zeroconf.py:215 msgid "To continue sending and receiving messages, you will need to reconnect." msgstr "" "Pre pokračovanie odosielania a prijímania správ, sa musíte znovu pripojiť." -#: ../src/common/zeroconf/connection_zeroconf.py:207 +#: ../src/common/zeroconf/connection_zeroconf.py:238 msgid "Avahi error" -msgstr "Chyba programu Avahi" +msgstr "Chyba Avahi" -#: ../src/common/zeroconf/connection_zeroconf.py:207 +#: ../src/common/zeroconf/connection_zeroconf.py:238 #, python-format msgid "" "%s\n" "Link-local messaging might not work properly." msgstr "" "%s\n" -"Link-local správy nemusia fungovať korektne." +"Link-local správy nemusia správne fungovať." -#: ../src/common/zeroconf/connection_zeroconf.py:218 +#: ../src/common/zeroconf/connection_zeroconf.py:249 msgid "Please check if Avahi is installed." -msgstr "Prosím skontrolujte, či je nainštalovaný program Avahi" +msgstr "Prosím skontrolujte, či je nainštalovaný program Avahi." -#: ../src/common/zeroconf/connection_zeroconf.py:227 -#: ../src/common/zeroconf/connection_zeroconf.py:231 +#: ../src/common/zeroconf/connection_zeroconf.py:258 +#: ../src/common/zeroconf/connection_zeroconf.py:262 msgid "Could not start local service" msgstr "Nie je možné spustiť lokálnu službu" -#: ../src/common/zeroconf/connection_zeroconf.py:228 +#: ../src/common/zeroconf/connection_zeroconf.py:259 #, python-format msgid "Unable to bind to port %d." msgstr "Nie je možné použiť port %d." -#: ../src/common/zeroconf/connection_zeroconf.py:232 -#: ../src/common/zeroconf/connection_zeroconf.py:325 +#: ../src/common/zeroconf/connection_zeroconf.py:263 +#: ../src/common/zeroconf/connection_zeroconf.py:358 msgid "Please check if avahi-daemon is running." -msgstr "Prosím skontrolujte, či je spustený program avahi-démon" +msgstr "Prosím skontrolujte, či je spustený program avahi-daemon" -#: ../src/common/zeroconf/connection_zeroconf.py:324 +#: ../src/common/zeroconf/connection_zeroconf.py:357 #, python-format msgid "Could not change status of account \"%s\"" msgstr "Nie je možné zmeniť stav účtu \"%s\"" -#: ../src/common/zeroconf/connection_zeroconf.py:341 +#: ../src/common/zeroconf/connection_zeroconf.py:374 msgid "" "You are not connected or not visible to others. Your message could not be " "sent." msgstr "" -"Nie ste pripojený(á) alebo viditeľný(á) pre ostatných. Vašu správu nie je " -"možné odoslať." +"Nie ste pripojený alebo viditeľný pre ostatných. Vašu správu nie je možné " +"odoslať." #. we're not english -#: ../src/common/zeroconf/connection_zeroconf.py:353 +#: ../src/common/zeroconf/connection_zeroconf.py:391 msgid "[This message is encrypted]" msgstr "[Táto správa je šifrovaná]" -#: ../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 "Chyba pri pridávaní služby. %s" -#~ msgid "_New room" -#~ msgstr "_Nová miestnosť" +#~ msgid "_New group chat" +#~ msgstr "_Nová diskusná skupina" -#~ msgid "Role: " -#~ msgstr "Rola:" - -#~ msgid "Affiliation: " -#~ msgstr "Príslušnosť:" - -#~ msgid "Merge consecutive nickname in chat window." -#~ msgstr "Zlúčiť prezývky v diskusnom okne." - -#~ 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 "" -#~ "Prehrať zvuk keď príde akákoľvek MUC správa (Toto nastavenie sa vzťahuje " -#~ "len na účet, ak notify_on_all_muc_message je pravda)" - -#~ msgid "Add" -#~ msgstr "Adresa" - -#~ msgid "Away " -#~ msgstr "Preč" - -#~ msgid "Down" -#~ msgstr "Stiahnuť" - -#~ msgid "List of special notifications settings" -#~ msgstr "Pridať špeciálne na %s" - -#~ msgid "Not Available " -#~ msgstr "Neprítomný" - -#~ msgid "Contact _Info" -#~ msgstr "Kontaktné _info" - -#~ msgid "Jabber" -#~ msgstr "Jabber" - -#~ msgid "Invalid room or server name" -#~ msgstr "Nesprávny názov miestnosti alebo serveru" - -#~ msgid "Unknown D-Bus version: %s" -#~ msgstr "Neznáma verzia D-Bus: %s" - -#~ msgid "vCard publication succeeded" -#~ msgstr "zverejnenie vCard úspešné" - -#~ msgid "Your personal information has been published successfully." -#~ msgstr "Vaše osobné informácie boli úspešne zverejnené." - -#~ msgid "Migrating Logs..." -#~ msgstr "Presúvanie záznamov histórie..." - -#~ msgid "_Join New Room" -#~ msgstr "_Pripojiť do novej miestnosti" - -#~ msgid "Gajim - %d unread message" -#~ msgid_plural "Gajim - %d unread messages" -#~ msgstr[0] "Gajim - %d neprečítaná správa" -#~ msgstr[1] "Gajim - %d neprečítaných správ" -#~ msgstr[2] "" - -#~ msgid "Since %s" -#~ msgstr "Od %s" - -#~ msgid "Send" -#~ msgstr "Poslať" - -#~ msgid "Would you like to overwrite it?" -#~ msgstr "Prajete si ho prepísať?" - -#~ msgid "%(nickname)s in room %(room_name)s has sent you a new message." -#~ msgstr "%(nickname)s v miestnosti %(room_name)s vám poslal(a) správu." - -#~ msgid "%s has sent you a new message." -#~ msgstr "%s vám poslal(a) správu." - -#~ msgid "GUI Migration failed" -#~ msgstr "Migrácia prostredníctvom grafického rozhrania zlyhala" - -#~ msgid "" -#~ "Logs migration through graphical interface failed. The migration process " -#~ "will start in the background. Please wait a few minutes for Gajim to " -#~ "start." -#~ msgstr "" -#~ "Migrácia záznamov konverzácie prostredníctvom grafického nástroja " -#~ "neuspela. Proces migrácie bude spustený na pozadí. Prosím počkajte pár " -#~ "minút, kým sa Gajim spustí." - -#~ msgid "Logs have been successfully migrated to the database." -#~ msgstr "Záznamy boli úspešne prenesené do databázy." - -#~ msgid "Usage: /%s, sets the groupchat window to compact mode." -#~ msgstr "" -#~ "Použitie: /%s, nastaví okno pre skupinový rozhovor do kompaktného módu." - -#~ msgid "Please modify your special notification below" -#~ msgstr "Prosím, zmente upozornenie na jedno z uvedeného zoznamu:" - -#~ msgid "Automatically authorize contact" -#~ msgstr "Automaticky autorizovať kontakt" - -#~ msgid "" -#~ "Available\n" -#~ "Free for Chat\n" -#~ "Available or Free for Chat\n" -#~ "Away\n" -#~ "Not Available\n" -#~ "Away or Not Available\n" -#~ "Busy\n" -#~ "Not Available or Busy\n" -#~ "Offline" -#~ msgstr "" -#~ "Prítomný(á)\n" -#~ "Mám čas na debatu\n" -#~ "Prítomný(á) alebo má čas na debatu\n" -#~ "Preč\n" -#~ "Neprítomný(á)\n" -#~ "Preč alebo neprítomný(á)\n" -#~ "Zaneprázdnený(á)\n" -#~ "Neprítomný(á) alebo zaneprázdnený(á)\n" -#~ "Offline" - -#~ msgid "Delete Message of the Day" -#~ msgstr "Zmazať správu dňa" - -#~ msgid "I want a notification popup:" -#~ msgstr "Chcem byť upozornený(á) prostredníctvom popup:" - -#~ msgid "I want to listen to:" -#~ msgstr "Chcem počúvať na:" - -#~ msgid "If checked, Gajim will also have a trayicon" -#~ msgstr "Ak je zaškrtnuté, Gajim bude zobrazovať trayicon" - -#~ msgid "" -#~ "No Sound\n" -#~ "Select Sound..." -#~ msgstr "" -#~ "Bez zvuku\n" -#~ "Vybrať zvuk..." - -#~ msgid "Send File" -#~ msgstr "Poslať súbor" - -#~ msgid "Send _New Message..." -#~ msgstr "Poslať _novú správu..." - -#~ msgid "Set Message of the Day" -#~ msgstr "Nastaviť správu dňa" - -#~ msgid "Underline" -#~ msgstr "Podčiarknutie" - -#~ msgid "Update Message of the Day" -#~ msgstr "Aktualizovať Správu dňa" - -#~ msgid "" -#~ "Yes\n" -#~ "No" -#~ msgstr "" -#~ "Áno\n" -#~ "Nie" - -#~ msgid "_Join New Room..." -#~ msgstr "_Pripojiť sa do novej miestnosti..." - -#~ msgid "_XML Console..." -#~ msgstr "_XML konzola" - -#~ msgid "Start Chat with Contact" -#~ msgstr "Začať rozhovor s kontaktom %s" - -#~ msgid "All contacts in this group are offline or have errors" -#~ msgstr "Všetky kontakty v tejto skupine sú offline, alebo došlo k chybe" - -#~ msgid "Size: " -#~ msgstr "Veľkosť:" - -#~ msgid "Choose Avatar" -#~ msgstr "Vybrať avatara" - -#~ msgid "Session bus is not available" -#~ msgstr "Session bus nie je prístupný" - -#~ msgid "Use compact view when you open a chat window" -#~ msgstr "Použiť kompaktný pohľad pri otvorení nového diskusného okna" - -#~ msgid "Use compact view when you open a group chat window" -#~ msgstr "Použiť kompaktný pohľad pri otvorení okna skupinovej diskusie" - -#~ msgid "plain" -#~ msgstr "jednoduchá" - -#~ msgid "Sound" -#~ msgstr "Zvuk" - -#~ msgid "Text" -#~ msgstr "Text" - -#~ msgid "Image" -#~ msgstr "Obrázok" - -#~ msgid "Read AUTHORS file for full list including past developers" -#~ msgstr "" -#~ "Prečítajte si súbor AUTHORS, kde je uvedený zoznam všetkých vývojárov" - -#~ msgid "From %s" -#~ msgstr "Od %s" - -#~ msgid "To %s" -#~ msgstr "Pre %s" - -#~ msgid "You have been invited to the %(room_jid)s room by %(contact_jid)s" -#~ msgstr "Boli ste pozvaný(á) do %(room_jid)s miestnosti - %(contact_jid)s" - -#~ msgid "" -#~ "Animated\n" -#~ "Static" -#~ msgstr "" -#~ "Animovaný\n" -#~ "Statický" - -#~ msgid "Manage Emoticons" -#~ msgstr "Upraviť emotikony" - -#~ msgid "Or choose a preset message:" -#~ msgstr "Alebo vyberte jednu zo správ:" - -#~ msgid "Use _emoticons" -#~ msgstr "Použiť _emotikony" - -#~ msgid "_Set Image..." -#~ msgstr "_Nastaviť obrázok..." - -#~ msgid "Switch to %s" -#~ msgstr "Prepnúť na %s" - -#~ msgid "using account " -#~ msgstr "použiť účet" - -#~ msgid "The filesize of image \"%s\" is too large" -#~ msgstr "Obrázok \"%s\" je príliš veľký" - -#~ msgid "The file must not be more than 32 kilobytes." -#~ msgstr "Súbor nemôže mať viac než 32 kilobatov." - -#~ msgid "A list of rooms that do not require confirmation before closing" -#~ msgstr "Zoznam miestností, ktoré nevyžadujú potvrdenie pred zatvorením" - -#~ msgid "Timeout" -#~ msgstr "Čas vypršal" - -#~ msgid "account: " -#~ msgstr "účet:" - -#~ msgid "Are you sure you want to leave rooms \"%s\"?" -#~ msgstr "Ste si istý, že chcete opustiť miestnosti \"%s\"?" - -#~ msgid "If you close this window, you will be disconnected from these rooms." -#~ msgstr "Ak zatvoríte toto okno, budete odpojený(á) z týchto miestností." - -#~ msgid "Activate/Disable notification for when a file transfer is complete" -#~ msgstr "Aktivovať/deaktivovať upozorňovanie pri dokončení penosu súboru" - -#~ msgid "Removing selected file transfer" -#~ msgstr "Odstraňovanie vybraných prenosov súborov" - -#~ msgid "Stoping selected file transfer" -#~ msgstr "Zastavovanie vybraných prenosov súborov" - -#~ msgid "" -#~ "If you close this tab and you have history disabled, the message will be " -#~ "lost." -#~ msgstr "" -#~ "Ak zatvoríte túto záložku a máte deaktivovanú históriu, správa bude " -#~ "stratená." - -#~ msgid "Cannot remove last group" -#~ msgstr "Nie je možné odstrániť poslednú skupinu" - -#~ msgid "At least one contact group must be present." -#~ msgstr "Minimálne jedna skupina kontaktov musí zostať." - -#~ 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 "" -#~ "pysqlite2 (taktiež python-pysqlite2) chýba. Ak chcete zmigrovaž vaše " -#~ "záznamy rozhovorov, po inštalácii pysqlite3, do novej databázy, prosím " -#~ "prečítajte si dokument: http://trac.gajim.org/wiki/MigrateLogToDot9DB " -#~ "Ukončovanie..." - -#~ msgid "Image is too big" -#~ msgstr "Obrázok je príliš veľký" - -#~ msgid "" -#~ "Image for emoticon has to be less than or equal to 24 pixels in width and " -#~ "24 in height." -#~ msgstr "" -#~ "Obrázok pre emotikon má menej alebo práve 24 pixelov šírku a 24 pixelov " -#~ "výšku." - -#~ msgid "Changes in latest version" -#~ msgstr "Zmeny v poslednej verzii" - -#~ msgid "Check for new _version on Gajim startup" -#~ msgstr "Skontrolovať nové _verzie Gajimu pri štarte" - -#~ msgid "Log history" -#~ msgstr "Záznam histórie" - -#~ msgid "New version of Gajim available" -#~ msgstr "Je dostupná nová verzia Gajimu" - -#~ msgid "Open Download Page" -#~ msgstr "Otvor Sťahovaciu stránku" - -#~ msgid "(%s/s)" -#~ msgstr "(%s/s)" - -#~ msgid "Session bus is not available." -#~ msgstr "Session bus nie je dostupný." - -#~ msgid "with account " -#~ msgstr "účet:" - -#~ msgid "Chat with" -#~ msgstr "Rozprávať sa s" - -#~ msgid "as %s" -#~ msgstr "ako %s" - -#~ msgid "as " -#~ msgstr "ako" - -#~ msgid "Re_quest Authorization from" -#~ msgstr "Pož_iadavka na autorizáciu od" - -#~ msgid "Send Authorization to" -#~ msgstr "Poslať autorizáciu" - -#~ msgid "Send _New Message" -#~ msgstr "Poslať _novú sprábu" - -#~ msgid "Error:" -#~ msgstr "Chyba:" - -#~ msgid "error appeared while processing xmpp:" -#~ msgstr "objavila sa chyba pri spracovaní xmpp:" +#~ msgid "Gajim needs you to create a passphrase to encrypt stored secrets" +#~ msgstr "Gajim potrebuje vytvoriť passfrázu k zašifrovaniu tajných uložení" diff --git a/src/Makefile.am b/src/Makefile.am index 27a734196..6239d1c63 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -44,26 +44,26 @@ trayicon.c: $(srcdir)/trayicon.defs > $@ endif gajimsrcdir = $(pkgdatadir)/src -gajimsrc_DATA = $(srcdir)/*.py +gajimsrc_PYTHON = $(srcdir)/*.py gajimsrc1dir = $(pkgdatadir)/src/common -gajimsrc1_DATA = \ +gajimsrc1_PYTHON = \ $(srcdir)/common/*.py gajimsrc2dir = $(pkgdatadir)/src/common/xmpp -gajimsrc2_DATA = \ +gajimsrc2_PYTHON = \ $(srcdir)/common/xmpp/*.py gajimsrc3dir = $(pkgdatadir)/src/common/zeroconf -gajimsrc3_DATA = \ +gajimsrc3_PYTHON = \ $(srcdir)/common/zeroconf/*.py DISTCLEANFILES = -EXTRA_DIST = $(gajimsrc_DATA) \ - $(gajimsrc1_DATA) \ - $(gajimsrc2_DATA) \ - $(gajimsrc3_DATA) \ +EXTRA_DIST = $(gajimsrc_PYTHON) \ + $(gajimsrc1_PYTHON) \ + $(gajimsrc2_PYTHON) \ + $(gajimsrc3_PYTHON) \ gtkspellmodule.c \ eggtrayicon.c \ trayiconmodule.c \ diff --git a/src/chat_control.py b/src/chat_control.py index d78a7f1c5..fa398d870 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -151,7 +151,7 @@ class ChatControlBase(MessageControl): self._on_banner_eventbox_button_press_event) self.handlers[id] = widget - self.urlfinder = re.compile("(https?://|www|ftp)[^ ]+") + self.urlfinder = re.compile(r"(www\.(?!\.)|[a-z][a-z0-9+.-]*://)[^\s<>'\"]+[^!,\.\s<>\)'\"\]]") if gajim.HAVE_PYSEXY: import sexy @@ -643,7 +643,7 @@ class ChatControlBase(MessageControl): self.orig_msg = None def print_conversation_line(self, text, kind, name, tim, - other_tags_for_name = [], other_tags_for_time = [], + other_tags_for_name = [], other_tags_for_time = [], other_tags_for_text = [], count_as_new = True, subject = None, old_kind = None, xhtml = None): '''prints 'chat' type messages''' @@ -1017,7 +1017,11 @@ class ChatControl(ChatControlBase): self.chat_buttons_set_visible(compact_view) self.widget_set_visible(self.xml.get_widget('banner_eventbox'), gajim.config.get('hide_chat_banner')) - + + # Add lock image to show chat encryption + self.lock_image = self.xml.get_widget('lock_image') + self.lock_tooltip = gtk.Tooltips() + # 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 self.show_bigger_avatar_timeout_id = None @@ -1050,15 +1054,25 @@ class ChatControl(ChatControlBase): self.on_avatar_eventbox_button_press_event) self.handlers[id] = widget - widget = self.xml.get_widget('gpg_togglebutton') - id = widget.connect('clicked', self.on_toggle_gpg_togglebutton) - self.handlers[id] = widget - - if self.contact.jid in gajim.encrypted_chats[self.account]: - self.xml.get_widget('gpg_togglebutton').set_active(True) - self.set_session(session) + # Enable ecryption if needed + e2e_is_active = hasattr(self, 'session') and self.session and self.session.enable_encryption + self.gpg_is_active = False + gpg_pref = gajim.config.get_per('contacts', contact.jid, 'gpg_enabled') + + if not e2e_is_active and gpg_pref and gajim.config.get_per('accounts', self.account, 'keyid') and\ + gajim.connections[self.account].USE_GPG: + self.gpg_is_active = True + gajim.encrypted_chats[self.account].append(contact.jid) + msg = _('GPG encryption enabled') + ChatControlBase.print_conversation_line(self, msg, 'status', '', None) + + if self.session: + self.session.loggable = gajim.config.get('log_encrypted_sessions') + self._show_lock_image(self.gpg_is_active, 'GPG', self.gpg_is_active, self.session and \ + self.session.is_loggable()) + self.status_tooltip = gtk.Tooltips() self.update_ui() # restore previous conversation @@ -1164,8 +1178,6 @@ class ChatControl(ChatControlBase): gtk.gdk.INTERP_BILINEAR) banner_status_img.set_from_pixbuf(scaled_pix) - self._update_gpg() - def draw_banner_text(self): '''Draw the text in the fat line at the top of the window that houses the name, jid. @@ -1254,34 +1266,52 @@ class ChatControl(ChatControlBase): # setup the label that holds name and jid banner_name_label.set_markup(label_text) - def on_toggle_gpg_togglebutton(self, widget): - gajim.config.set_per('contacts', self.contact.jid, 'gpg_enabled', - widget.get_active()) - - def _update_gpg(self): - tb = self.xml.get_widget('gpg_togglebutton') - # we can do gpg - # if self.contact is our own contact info (transports), - # don't enable pgp - if self.contact.keyID and not gajim.jid_is_transport(self.contact.jid): - tb.set_sensitive(True) - tt = _('OpenPGP Encryption') - - # restore gpg pref - gpg_pref = gajim.config.get_per('contacts', self.contact.jid, - 'gpg_enabled') - if gpg_pref == None: - gajim.config.add_per('contacts', self.contact.jid) - gpg_pref = gajim.config.get_per('contacts', self.contact.jid, - 'gpg_enabled') - tb.set_active(gpg_pref) + def _toggle_gpg(self): + ec = gajim.encrypted_chats[self.account] + if self.gpg_is_active: + # Disable encryption + ec.remove(self.contact.jid) + self.gpg_is_active = False + msg = _('GPG encryption disabled') + ChatControlBase.print_conversation_line(self, msg, 'status', '', None) + if self.session: + self.session.loggable = True else: - tb.set_sensitive(False) - #we talk about a contact here - tt = _('%s has not broadcast an OpenPGP key, nor has one been assigned') %\ - self.contact.get_shown_name() - gtk.Tooltips().set_tip(self.xml.get_widget('gpg_eventbox'), tt) + # Enable encryption + ec.append(self.contact.jid) + self.gpg_is_active = True + msg = _('GPG encryption enabled') + ChatControlBase.print_conversation_line(self, msg, 'status', '', None) + + if self.session: + self.session.loggable = gajim.config.get('log_encrypted_sessions'); + if self.session and not self.session.is_loggable(): + msg = _('Session WILL NOT be logged') + else: + msg = _('Session WILL be logged') + ChatControlBase.print_conversation_line(self, msg, 'status', '', None) + + gpg_pref = gajim.config.get_per('contacts', self.contact.jid, + 'gpg_enabled') + if gpg_pref is None: + gajim.config.add_per('contacts', self.contact.jid) + gajim.config.set_per('contacts', self.contact.jid, 'gpg_enabled', + self.gpg_is_active) + + self._show_lock_image(self.gpg_is_active, 'GPG', self.gpg_is_active, self.session and \ + self.session.is_loggable()) + + def _show_lock_image(self, visible, enc_type = '', enc_enabled = False, chat_logged = False): + '''Set lock icon visibiity and create tooltip''' + status_string = enc_enabled and 'is' or 'is NOT' + logged_string = chat_logged and 'will' or 'will NOT' + tooltip = '%s Encryption %s active. \nYour chat session %s be logged.' %\ + (enc_type, status_string, logged_string) + + self.lock_tooltip.set_tip(self.lock_image, tooltip) + self.widget_set_visible(self.lock_image, not visible) + self.lock_image.set_sensitive(enc_enabled) def _process_command(self, message): if message[0] != '/': @@ -1369,9 +1399,11 @@ class ChatControl(ChatControlBase): encrypted = bool(self.session) and self.session.enable_encryption keyID = '' - if self.xml.get_widget('gpg_togglebutton').get_active(): + if self.gpg_is_active: keyID = contact.keyID encrypted = True + if not keyID: + keyID = 'UNKNOWN' chatstates_on = gajim.config.get('outgoing_chat_state_notifications') != \ 'disabled' @@ -1401,7 +1433,7 @@ class ChatControl(ChatControlBase): gobject.source_remove(self.possible_paused_timeout_id) gobject.source_remove(self.possible_inactive_timeout_id) self._schedule_activity_timers() - + if not ChatControlBase.send_message(self, message, keyID, type = 'chat', chatstate = chatstate_to_send, composing_xep = composing_xep, process_command = process_command): @@ -1468,13 +1500,14 @@ class ChatControl(ChatControlBase): 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: + '''print esession settings to textview''' + e2e_is_active = self.session and self.session.enable_encryption + if e2e_is_active: msg = _('E2E encryption enabled') ChatControlBase.print_conversation_line(self, msg, 'status', '', None) - if self.session.loggable: + if self.session.is_loggable(): msg = _('Session WILL be logged') else: msg = _('Session WILL NOT be logged') @@ -1483,6 +1516,8 @@ class ChatControl(ChatControlBase): else: msg = _('E2E encryption disabled') ChatControlBase.print_conversation_line(self, msg, 'status', '', None) + self._show_lock_image(e2e_is_active, 'E2E', e2e_is_active, self.session and \ + self.session.is_loggable()) def print_conversation(self, text, frm = '', tim = None, encrypted = False, subject = None, xhtml = None): @@ -1510,19 +1545,15 @@ class ChatControl(ChatControlBase): 'status', '', tim) else: # GPG encryption - ec = gajim.encrypted_chats[self.account] - if encrypted and jid not in ec: - msg = _('OpenPGP Encryption enabled') + if encrypted and not self.gpg_is_active: + msg = _('The following message was encrypted') ChatControlBase.print_conversation_line(self, msg, 'status', '', tim) - ec.append(jid) - elif not encrypted and jid in ec: - msg = _('OpenPGP Encryption disabled') + self._toggle_gpg() + elif not encrypted and self.gpg_is_active: + msg = _('The following message was NOT encrypted') 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() @@ -1649,13 +1680,16 @@ class ChatControl(ChatControlBase): contact = self.parent_win.get_active_contact() jid = contact.jid - - # 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) + + # check if we support and use gpg + if not gajim.config.get_per('accounts', self.account, 'keyid') or\ + not gajim.connections[self.account].USE_GPG or\ + gajim.jid_is_transport(jid): + toggle_gpg_menuitem.set_sensitive(False) + else: + e2e_is_active = int(self.session != None and self.session.enable_encryption) + toggle_gpg_menuitem.set_sensitive(not e2e_is_active) + toggle_gpg_menuitem.set_active(self.gpg_is_active) # TODO: check that the remote client supports e2e if not gajim.HAVE_PYCRYPTO: @@ -1663,6 +1697,7 @@ class ChatControl(ChatControlBase): else: isactive = int(self.session != None and self.session.enable_encryption) toggle_e2e_menuitem.set_active(isactive) + toggle_e2e_menuitem.set_sensitive(not self.gpg_is_active) # If we don't have resource, we can't do file transfer # in transports, contact holds our info we need to disable it too @@ -1694,14 +1729,15 @@ class ChatControl(ChatControlBase): id = send_file_menuitem.connect('activate', self._on_send_file_menuitem_activate) self.handlers[id] = send_file_menuitem - id = add_to_roster_menuitem.connect('activate', + id = add_to_roster_menuitem.connect('activate', self._on_add_to_roster_menuitem_activate) - self.handlers[id] = add_to_roster_menuitem - id = toggle_gpg_menuitem.connect('activate', + self.handlers[id] = add_to_roster_menuitem + id = toggle_gpg_menuitem.connect('activate', self._on_toggle_gpg_menuitem_activate) + self.handlers[id] = toggle_gpg_menuitem id = toggle_e2e_menuitem.connect('activate', self._on_toggle_e2e_menuitem_activate) - self.handlers[id] = toggle_gpg_menuitem + self.handlers[id] = toggle_e2e_menuitem id = information_menuitem.connect('activate', self._on_contact_information_menuitem_activate) self.handlers[id] = information_menuitem @@ -2154,10 +2190,7 @@ class ChatControl(ChatControlBase): gajim.interface.roster.on_info(widget, self.contact, self.account) def _on_toggle_gpg_menuitem_activate(self, widget): - # update the button - # this is reverse logic, as we are on 'activate' (before change happens) - tb = self.xml.get_widget('gpg_togglebutton') - tb.set_active(not tb.get_active()) + self._toggle_gpg() def _on_convert_to_gc_menuitem_activate(self, widget): '''user want to invite some friends to chat''' diff --git a/src/common/GnuPG.py b/src/common/GnuPG.py index 8870b6bd3..72c34a8f9 100644 --- a/src/common/GnuPG.py +++ b/src/common/GnuPG.py @@ -28,24 +28,12 @@ ## along with Gajim. If not, see . ## -import os +import gajim from os import tmpfile from common import helpers -USE_GPG = True - -try: - import GnuPGInterface # Debian package doesn't distribute 'our' file -except ImportError: - try: - from common import GnuPGInterface # use 'our' file - except ImportError: - USE_GPG = False # user can't do OpenGPG only if he or she removed the file! - -else: - status = os.system('gpg -h >/dev/null 2>&1') - if status != 0: - USE_GPG = False +if gajim.HAVE_GPG: + import GnuPGInterface class GnuPG(GnuPGInterface.GnuPG): def __init__(self, use_agent = False): @@ -57,8 +45,6 @@ else: self.options.armor = 1 self.options.meta_interactive = 0 self.options.extra_args.append('--no-secmem-warning') - # Nolith's patch - prevent crashs on non fully-trusted keys - self.options.extra_args.append('--always-trust') if self.use_agent: self.options.extra_args.append('--use-agent') @@ -88,8 +74,6 @@ else: return resp def encrypt(self, str, recipients): - if not USE_GPG: - return str, 'GnuPG not usable' self.options.recipients = recipients # a list! proc = self.run(['--encrypt'], create_fhs=['stdin', 'stdout', 'status', @@ -125,8 +109,6 @@ else: return self._stripHeaderFooter(output), error def decrypt(self, str, keyID): - if not USE_GPG: - return str proc = self.run(['--decrypt', '-q', '-u %s'%keyID], create_fhs=['stdin', 'stdout']) enc = self._addHeaderFooter(str, 'MESSAGE') proc.handles['stdin'].write(enc) @@ -140,8 +122,6 @@ else: return output def sign(self, str, keyID): - if not USE_GPG: - return str proc = self.run(['-b', '-u %s'%keyID], create_fhs=['stdin', 'stdout', 'status', 'stderr']) proc.handles['stdin'].write(str) try: @@ -170,8 +150,6 @@ else: return 'BAD_PASSPHRASE' def verify(self, str, sign): - if not USE_GPG: - return str if str == None: return '' f = tmpfile() @@ -193,15 +171,13 @@ else: try: proc.wait() except IOError: pass - + keyid = '' if resp.has_key('GOODSIG'): keyid = resp['GOODSIG'].split()[0] return keyid def get_keys(self, secret = False): - if not USE_GPG: - return {} if secret: opt = '--list-secret-keys' else: @@ -217,8 +193,10 @@ else: sline = line.split(':') if (sline[0] == 'sec' and secret) or \ (sline[0] == 'pub' and not secret): + # decode escaped chars + name = eval('"' + sline[9].replace('"', '\\"') + '"') # make it unicode instance - keys[sline[4][8:]] = helpers.decode_string(sline[9]) + keys[sline[4][8:]] = helpers.decode_string(name) return keys try: proc.wait() except IOError: pass diff --git a/src/common/config.py b/src/common/config.py index 0e8282daf..9eda27542 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -45,7 +45,7 @@ opt_int = [ 'integer', 0 ] opt_str = [ 'string', 0 ] opt_bool = [ 'boolean', 0 ] opt_color = [ 'color', '^(#[0-9a-fA-F]{6})|()$' ] -opt_one_window_types = ['never', 'always', 'peracct', 'pertype'] +opt_one_window_types = ['never', 'always', 'always_with_roster', 'peracct', 'pertype'] opt_treat_incoming_messages = ['', 'chat', 'normal'] class Config: @@ -100,7 +100,6 @@ class Config: '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, _('default'), '', True ], - 'saveposition': [ opt_bool, True ], 'mergeaccounts': [ opt_bool, False, '', True ], 'sort_by_show': [ opt_bool, True, '', True ], 'enable_zeroconf': [opt_bool, False, _('Enable link-local/zeroconf messaging')], @@ -214,6 +213,7 @@ class Config: '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.')], 'show_status_msgs_in_roster': [opt_bool, True, _('If True, Gajim will display the status message, if not empty, for every contact under the contact name in roster window.'), True], 'show_avatars_in_roster': [opt_bool, True, '', True], + 'avatar_position_in_roster': [opt_str, 'right', _('Define the position of the avatar in roster. Can be left or right'), True], 'ask_avatars_on_startup': [opt_bool, True, _('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.')], 'print_status_in_chats': [opt_bool, True, _('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.')], 'print_status_in_muc': [opt_str, 'in_and_out', _('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.')], @@ -229,7 +229,7 @@ class Config: 'send_sha_in_gc_presence': [opt_bool, True, _('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.')], 'one_message_window': [opt_str, 'always', #always, never, peracct, pertype should not be translated - _('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.')], + _('Controls the window where new messages are placed.\n\'always\' - All messages are sent to a single window.\n\'always_with_roster\' - Like \'always\' but the messages are in a single window along with the roster.\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.')], '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.')], 'compact_view': [opt_bool, False, _('Hides the buttons in chat windows.')], @@ -250,7 +250,14 @@ 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], '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 = { @@ -275,7 +282,8 @@ class Config: '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 ], + 'connection_types': [ opt_str, 'tls ssl plain', _('Ordered list (space separated) of connection type to try. Can contain tls, ssl or plain')], + 'warn_when_insecure_connection': [ opt_bool, True, _('Show a warning dialog before sending password on an insecure connection.') ], 'ssl_fingerprint_sha1': [ opt_str, '', '', True ], 'use_srv': [ opt_bool, True, '', True ], 'use_custom_host': [ opt_bool, False, '', True ], @@ -306,6 +314,7 @@ class Config: 'zeroconf_last_name': [ opt_str, '', '', True ], 'zeroconf_jabber_id': [ opt_str, '', '', True ], 'zeroconf_email': [ opt_str, '', '', True ], + 'use_env_http_proxy' : [opt_bool, False], }, {}), 'statusmsg': ({ 'message': [ opt_str, '' ], @@ -354,7 +363,7 @@ class Config: 'state_muc_directed_msg_color': [ opt_color, 'red2' ], }, {}), 'contacts': ({ - 'gpg_enabled': [ opt_bool, True, _('Is OpenPGP enabled for this contact?')], + 'gpg_enabled': [ opt_bool, False, _('Is OpenPGP enabled for this contact?')], 'speller_language': [ opt_str, '', _('Language for which we want to check misspelled words')], }, {}), 'rooms': ({ @@ -400,7 +409,8 @@ class Config: soundevents_default = { 'first_message_received': [ True, '../data/sounds/message1.wav' ], - 'next_message_received': [ True, '../data/sounds/message2.wav' ], + 'next_message_received_focused': [ True, '../data/sounds/message2.wav' ], + 'next_message_received_unfocused': [ True, '../data/sounds/message2.wav' ], 'contact_connected': [ True, '../data/sounds/connected.wav' ], 'contact_disconnected': [ True, '../data/sounds/disconnected.wav' ], 'message_sent': [ True, '../data/sounds/sent.wav' ], diff --git a/src/common/connection.py b/src/common/connection.py index 71b8840a8..9606afc36 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -48,7 +48,6 @@ from common import passwords from common import exceptions from connection_handlers import * -USE_GPG = GnuPG.USE_GPG from common.rst_xhtml_generator import create_xhtml @@ -56,8 +55,6 @@ from string import Template import logging log = logging.getLogger('gajim.c.connection') -import gtkgui_helpers - ssl_error = { 2: _("Unable to get issuer certificate"), 3: _("Unable to get certificate CRL"), @@ -75,9 +72,9 @@ ssl_error = { 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"), +18: _("Self signed certificate"), +19: _("Self signed certificate in certificate chain"), +20: _("Unable to get local issuer certificate"), 21: _("Unable to verify the first certificate"), 22: _("Certificate chain too long"), 23: _("Certificate revoked"), @@ -107,7 +104,9 @@ class Connection(ConnectionHandlers): self.last_connection = None # last ClientCommon instance self.is_zeroconf = False self.gpg = None - if USE_GPG: + self.USE_GPG = False + if gajim.HAVE_GPG: + self.USE_GPG = True self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) self.status = '' self.priority = gajim.get_priority(name, 'offline') @@ -142,6 +141,9 @@ class Connection(ConnectionHandlers): self.blocked_contacts = [] self.blocked_groups = [] self.pep_supported = False + self.mood = {} + self.tune = {} + self.activity = {} # 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 @@ -178,7 +180,7 @@ class Connection(ConnectionHandlers): self.dispatch('STATUS', 'connecting') self.retrycount += 1 self.on_connect_auth = self._init_roster - self.connect_and_init(self.old_show, self.status, self.gpg != None) + self.connect_and_init(self.old_show, self.status, self.USE_GPG) else: # reconnect succeeded self.time_to_reconnect = None @@ -186,6 +188,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 @@ -265,7 +269,8 @@ class Connection(ConnectionHandlers): if not common.xmpp.isResultNode(result): self.dispatch('ACC_NOT_OK', (result.getError())) return - if USE_GPG: + if gajim.HAVE_GPG: + self.USE_GPG = True self.gpg = GnuPG.GnuPG(gajim.config.get( 'use_gpg_agent')) self.dispatch('ACC_OK', (self.new_account_info)) @@ -279,7 +284,7 @@ class Connection(ConnectionHandlers): # typed, so send them if is_form: #TODO: Check if form has changed - iq = Iq('set', NS_REGISTER, to=self._hostname) + 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) @@ -313,7 +318,7 @@ class Connection(ConnectionHandlers): ssl_fingerprint = \ self.connection.Connection.ssl_fingerprint_sha1 self.dispatch('NEW_ACC_CONNECTED', (conf, is_form, ssl_msg, - ssl_cert, ssl_fingerprint)) + errnum, ssl_cert, ssl_fingerprint)) self.connection.UnregisterDisconnectHandler( self._on_new_account) self.disconnect(on_purpose=True) @@ -423,27 +428,56 @@ class Connection(ConnectionHandlers): proxy['user'] = gajim.config.get_per('proxies', p, 'user') proxy['password'] = gajim.config.get_per('proxies', p, 'pass') proxy['type'] = gajim.config.get_per('proxies', p, 'type') + elif gajim.config.get_per('accounts', self.name, 'use_env_http_proxy'): + try: + try: + env_http_proxy = os.environ['HTTP_PROXY'] + except: + env_http_proxy = os.environ['http_proxy'] + env_http_proxy = env_http_proxy.strip('"') + # Dispose of the http:// prefix + env_http_proxy = env_http_proxy.split('://') + env_http_proxy = env_http_proxy[len(env_http_proxy)-1] + env_http_proxy = env_http_proxy.split('@') + + if len(env_http_proxy) == 2: + login = env_http_proxy[0].split(':') + addr = env_http_proxy[1].split(':') + else: + login = ['', ''] + addr = env_http_proxy[0].split(':') + + proxy = {'host': addr[0], 'type' : u'http', 'user':login[0]} + + if len(addr) == 2: + proxy['port'] = addr[1] + else: + proxy['port'] = 3128 + + if len(login) == 2: + proxy['password'] = login[1] + else: + proxy['password'] = u'' + + except: + proxy = None else: proxy = None h = hostname p = 5222 - # autodetect [for SSL in 5223/443 and for TLS if broadcasted] - secur = None - if usessl: - p = 5223 - secur = 1 # 1 means force SSL no matter what the port will be - use_srv = False # wants ssl? disable srv lookup + ssl_p = 5223 +# use_srv = False # wants ssl? disable srv lookup if use_custom: h = custom_h p = custom_p + ssl_p = custom_p use_srv = False - hosts = [] # SRV resolver self._proxy = proxy - self._secure = secur - self._hosts = [ {'host': h, 'port': p, 'prio': 10, 'weight': 10} ] + self._hosts = [ {'host': h, 'port': p, 'ssl_port': ssl_p, 'prio': 10, + 'weight': 10} ] self._hostname = hostname if use_srv: # add request for srv query to the resolve, on result '_on_resolve' @@ -457,6 +491,12 @@ class Connection(ConnectionHandlers): # SRV query returned at least one valid result, we put it in hosts dict if len(result_array) != 0: self._hosts = [i for i in result_array] + # Add ssl port + ssl_p = 5223 + if gajim.config.get_per('accounts', self.name, 'use_custom_host'): + ssl_p = gajim.config.get_per('accounts', self.name, 'custom_port') + for i in self._hosts: + i['ssl_port'] = ssl_p self.connect_to_next_host() def on_proxy_failure(self, reason): @@ -468,8 +508,9 @@ class Connection(ConnectionHandlers): self.dispatch('CONNECTION_LOST', (_('Connection to proxy failed'), reason)) - def connect_to_next_host(self, retry = False): - if len(self._hosts): + def connect_to_next_type(self, retry=False): + if len(self._connection_types): + self._current_type = self._connection_types.pop(0) if self.last_connection: self.last_connection.socket.disconnect() self.last_connection = None @@ -478,27 +519,49 @@ class Connection(ConnectionHandlers): con = common.xmpp.NonBlockingClient(self._hostname, caller = self, on_connect = self.on_connect_success, on_proxy_failure = self.on_proxy_failure, - on_connect_failure = self.connect_to_next_host) + on_connect_failure = self.connect_to_next_type) else: - con = common.xmpp.NonBlockingClient(self._hostname, debug = [], caller = self, - on_connect = self.on_connect_success, + con = common.xmpp.NonBlockingClient(self._hostname, debug = [], + caller = self, on_connect = self.on_connect_success, on_proxy_failure = self.on_proxy_failure, - on_connect_failure = self.connect_to_next_host) + on_connect_failure = self.connect_to_next_type) self.last_connection = con # increase default timeout for server responses common.xmpp.dispatcher_nb.DEFAULT_TIMEOUT_SECONDS = self.try_connecting_for_foo_secs con.set_idlequeue(gajim.idlequeue) - host = self.select_next_host(self._hosts) - self._current_host = host - self._hosts.remove(host) - # FIXME: this is a hack; need a better way if self.on_connect_success == self._on_new_account: con.RegisterDisconnectHandler(self._on_new_account) - log.info("Connecting to %s: [%s:%d]", self.name, host['host'], host['port']) - con.connect((host['host'], host['port']), proxy = self._proxy, - secure = self._secure) + if self._current_type == 'ssl': + port = self._current_host['ssl_port'] + secur = 1 + else: + port = self._current_host['port'] + if self._current_type == 'plain': + secur = 0 + else: + secur = None + log.info('Connecting to %s: [%s:%d]', self.name, + self._current_host['host'], port) + con.connect((self._current_host['host'], port), proxy=self._proxy, + secure = secur) + else: + self.connect_to_next_host(retry) + + def connect_to_next_host(self, retry = False): + if len(self._hosts): + # No config option exist when creating a new account + if self.name in gajim.config.get_per('accounts'): + self._connection_types = gajim.config.get_per('accounts', self.name, + 'connection_types').split() + else: + self._connection_types = ['tls', 'ssl', 'plain'] + host = self.select_next_host(self._hosts) + self._current_host = host + self._hosts.remove(host) + self.connect_to_next_type() + else: if not retry and self.retrycount == 0: log.debug("Out of hosts, giving up connecting to %s", self.name) @@ -527,15 +590,26 @@ class Connection(ConnectionHandlers): if not self.connected: # We went offline during connecting process # FIXME - not possible, maybe it was when we used threads return + _con_type = con_type + # xmpp returns 'tcp', but we set 'plain' in connection_types in config + if _con_type == 'tcp': + _con_type = 'plain' + if _con_type != self._current_type: + self.connect_to_next_type() + return + if _con_type == 'plain' and gajim.config.get_per('accounts', self.name, + 'warn_when_insecure_connection'): + self.dispatch('PLAIN_CONNECTION', (con,)) + return True + return self.connection_accepted(con, con_type) + + def connection_accepted(self, con, con_type): self.hosts = [] - if not con_type: - log.debug('Could not connect to %s:%s' % (self._current_host['host'], - self._current_host['port'])) self.connected_hostname = self._current_host['host'] self.on_connect_failure = None con.RegisterDisconnectHandler(self._disconnectedReconnCB) - log.debug(_('Connected to server %s:%s with %s') % (self._current_host['host'], - self._current_host['port'], con_type)) + log.debug('Connected to server %s:%s with %s' % ( + self._current_host['host'], self._current_host['port'], con_type)) name = gajim.config.get_per('accounts', self.name, 'name') hostname = gajim.config.get_per('accounts', self.name, 'hostname') @@ -548,10 +622,10 @@ class Connection(ConnectionHandlers): text = _('The authenticity of the %s certificate could be invalid.') %\ hostname if errnum in ssl_error: - text += _('\nSSL Error: %s') % ssl_error[errnum] + text += _('\nSSL Error: %s') % ssl_error[errnum] else: text += _('\nUnknown SSL error: %d') % errnum - self.dispatch('SSL_ERROR', (text, con.Connection.ssl_cert_pem, + self.dispatch('SSL_ERROR', (text, errnum, con.Connection.ssl_cert_pem, con.Connection.ssl_fingerprint_sha1)) return True if hasattr(con.Connection, 'ssl_fingerprint_sha1'): @@ -565,11 +639,17 @@ class Connection(ConnectionHandlers): self._register_handlers(con, con_type) con.auth(name, self.password, self.server_resource, 1, self.__on_auth) - 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) + self.connection.auth(name, self.password, self.server_resource, 1, + self.__on_auth) + + def plain_connection_accepted(self): + name = gajim.config.get_per('accounts', self.name, 'name') + self._register_handlers(self.connection, 'tcp') + 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() @@ -699,6 +779,17 @@ class Connection(ConnectionHandlers): def send_invisible_presence(self, msg, signed, initial = False): if not self.connection: return + # If we are already connected, and privacy rules are supported, send + # offline presence first as it's required by XEP-0126 + if self.connected > 1 and self.privacy_rules_supported: + self.on_purpose = True + p = common.xmpp.Presence(typ = 'unavailable') + p = self.add_sha(p, False) + if msg: + p.setStatus(msg) + self.remove_all_transfers() + self.connection.send(p) + # try to set the privacy rule iq = self.build_privacy_rule('invisible', 'deny') self.connection.SendAndCallForResponse(iq, self._continue_invisible, @@ -707,8 +798,7 @@ class Connection(ConnectionHandlers): def _continue_invisible(self, con, iq_obj, msg, signed, initial): ptype = '' show = '' - # FIXME: JEP 126 need some modifications (see http://lists.jabber.ru/pipermail/ejabberd/2005-July/001252.html). So I disable it for the moment - if 1 or iq_obj.getType() == 'error': #server doesn't support privacy lists + if iq_obj.getType() == 'error': # server doesn't support privacy lists # We use the old way which is not xmpp complient ptype = 'invisible' show = 'invisible' @@ -760,7 +850,7 @@ class Connection(ConnectionHandlers): callback is the function to call when user give the passphrase''' signed = '' keyID = gajim.config.get_per('accounts', self.name, 'keyid') - if keyID and self.gpg: + if keyID and self.USE_GPG: use_gpg_agent = gajim.config.get('use_gpg_agent') if self.gpg.passphrase is None and not use_gpg_agent: # We didn't set a passphrase @@ -768,7 +858,7 @@ class Connection(ConnectionHandlers): if self.gpg.passphrase is not None or use_gpg_agent: signed = self.gpg.sign(msg, keyID) if signed == 'BAD_PASSPHRASE': - self.gpg = None + self.USE_GPG = False signed = '' self.dispatch('BAD_PASSPHRASE', ()) return signed @@ -845,7 +935,8 @@ class Connection(ConnectionHandlers): safe_substitute({ 'hostname': socket.gethostname() }) - if USE_GPG: + if gajim.HAVE_GPG: + self.USE_GPG = True self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) self.connect_and_init(show, msg, sign_msg) @@ -922,9 +1013,15 @@ class Connection(ConnectionHandlers): fjid += '/' + resource msgtxt = msg msgenc = '' - if keyID and self.gpg: - #encrypt - msgenc, error = self.gpg.encrypt(msg, [keyID]) + + if keyID and self.USE_GPG: + if keyID == 'UNKNOWN': + error = _('Neither the remote presence is signed, nor a key was assigned.') + elif keyID[8:] == 'MISMATCH': + error = _('The contact\'s key (%s) does not match the key assigned in Gajim.' % keyID[:8]) + else: + #encrypt + msgenc, error = self.gpg.encrypt(msg, [keyID]) if msgenc and not error: msgtxt = '[This message is encrypted]' lang = os.getenv('LANG') @@ -1109,7 +1206,7 @@ class Connection(ConnectionHandlers): def send_new_account_infos(self, form, is_form): if is_form: # Get username and password and put them in new_account_info - for field in self._data_form.iter_fields(): + for field in form.iter_fields(): if field.var == 'username': self.new_account_info['name'] = field.value if field.var == 'password': diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index baea7e087..375279b51 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -35,15 +35,20 @@ from calendar import timegm import socks5 import common.xmpp -from common import GnuPG 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 +from common import dbus_support +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', @@ -54,6 +59,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 @@ -182,7 +188,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: - ft_add_hosts.append(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: @@ -750,6 +756,13 @@ 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}) + 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': @@ -821,6 +834,12 @@ class ConnectionDisco: if identity['category'] == 'pubsub' and identity['type'] == \ 'pep': self.pep_supported = True + if dbus_support.supported: + 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) @@ -860,7 +879,7 @@ class ConnectionVcard: ext.append('xhtml') if gajim.config.get('outgoing_chat_state_notifactions') != 'disabled': ext.append('cstates') - + if len(ext): c.setAttr('ext', ' '.join(ext)) c.setAttr('ver', gajim.version.split('-', 1)[0]) @@ -1099,6 +1118,16 @@ 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) + if form_tag: + 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] @@ -1251,7 +1280,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, reply.setType('error') reply.addChild(feature) - reply.addChild(node=xmpp.ErrorNode('service-unavailable', typ='cancel')) + reply.addChild(node=common.xmpp.ErrorNode('service-unavailable', typ='cancel')) con.send(reply) @@ -1419,7 +1448,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, iq_obj = iq_obj.buildReply('result') qp = iq_obj.getTag('query') qp.setTagData('utc', strftime('%Y%m%dT%T', gmtime())) - qp.setTagData('tz', tzname[daylight]) + qp.setTagData('tz', helpers.decode_string(tzname[daylight])) qp.setTagData('display', helpers.decode_string(strftime('%c', localtime()))) self.connection.send(iq_obj) @@ -1599,7 +1628,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if not user_nick: user_nick = '' - if encTag and GnuPG.USE_GPG: + if encTag and self.USE_GPG: #decrypt encmsg = encTag.getData() @@ -1770,8 +1799,22 @@ returns the session that we last sent a message to.''' ''' Called when we receive with pubsub event. ''' # TODO: Logging? (actually services where logging would be useful, should # TODO: allow to access archives remotely...) + jid = helpers.get_full_jid_from_iq(msg) event = msg.getTag('event') + # XEP-0107: User Mood + items = event.getTag('items', {'node': common.xmpp.NS_MOOD}) + if items: pep.user_mood(items, self.name, jid) + # XEP-0118: User Tune + items = event.getTag('items', {'node': common.xmpp.NS_TUNE}) + if items: pep.user_tune(items, self.name, jid) + # XEP-0080: User Geolocation + items = event.getTag('items', {'node': common.xmpp.NS_GEOLOC}) + if items: pep.user_geoloc(items, self.name, jid) + # XEP-0108: User Activity + items = event.getTag('items', {'node': common.xmpp.NS_ACTIVITY}) + if items: pep.user_activity(items, self.name, jid) + items = event.getTag('items') if items is None: return @@ -1857,7 +1900,7 @@ returns the session that we last sent a message to.''' except: prio = 0 keyID = '' - if sigTag and self.gpg: + if sigTag and self.USE_GPG: # verify sigmsg = sigTag.getData() keyID = self.gpg.verify(status, sigmsg) @@ -2109,6 +2152,21 @@ returns the session that we last sent a message to.''' raw_roster = roster.getRaw() roster = {} our_jid = helpers.parse_jid(gajim.get_jid_from_account(self.name)) + if self.connected > 1 and self.continue_connect_info: + msg = self.continue_connect_info[1] + sign_msg = self.continue_connect_info[2] + signed = '' + send_first_presence = True + 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 + send_first_presence = False + if send_first_presence: + self._send_first_presence(signed) + for jid in raw_roster: try: j = helpers.parse_jid(jid) @@ -2131,20 +2189,6 @@ returns the session that we last sent a message to.''' self.dispatch('ROSTER', roster) - # continue connection - if self.connected > 1 and self.continue_connect_info: - msg = self.continue_connect_info[1] - 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) - def _send_first_presence(self, signed = ''): show = self.continue_connect_info[0] msg = self.continue_connect_info[1] @@ -2155,6 +2199,7 @@ returns the session that we last sent a message to.''' self.dispatch('ERROR', (_('OpenPGP passphrase was not given'), #%s is the account name here _('You will be connected to %s without OpenPGP.') % self.name)) + self.USE_GPG = False signed = '' self.connected = STATUS_LIST.index(show) sshow = helpers.get_xmpp_show(show) diff --git a/src/common/contacts.py b/src/common/contacts.py index 262edd1d8..303fe3854 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -27,7 +27,8 @@ 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_xep = None): + chatstate=None, last_status_time=None, msg_id = None, composing_xep = None, + mood={}, tune={}, activity={}): self.jid = jid self.name = name self.contact_name = '' # nick choosen by contact @@ -63,6 +64,10 @@ class Contact: self.chatstate = chatstate self.last_status_time = last_status_time + self.mood = mood.copy() + self.tune = tune.copy() + self.activity = activity.copy() + def get_full_jid(self): if self.resource: return self.jid + '/' + self.resource @@ -162,15 +167,16 @@ 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_xep=None): + chatstate=None, last_status_time=None, composing_xep=None, + mood={}, tune={}, activity={}): return Contact(jid, name, groups, show, status, sub, ask, resource, priority, keyID, our_chatstate, chatstate, last_status_time, - composing_xep) + None, composing_xep, mood, tune, activity) def copy_contact(self, contact): return self.create_contact(jid = contact.jid, name = contact.name, - groups = contact.groups, show = contact.show, status = contact.status, - sub = contact.sub, ask = contact.ask, resource = contact.resource, + groups = contact.groups, show = contact.show, status = + 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) @@ -469,6 +475,15 @@ class Contacts: return 1 if show2 > show1: return -1 + server1 = common.gajim.get_server_from_jid(jid1) + server2 = common.gajim.get_server_from_jid(jid2) + myserver1 = common.gajim.config.get_per('accounts', account1, 'hostname') + myserver2 = common.gajim.config.get_per('accounts', account2, 'hostname') + if server1 == myserver1: + if server2 != myserver2: + return 1 + elif server2 == myserver2: + return -1 if jid1 > jid2: return 1 if jid2 > jid1: diff --git a/src/common/defs.py b/src/common/defs.py index 3f776c43e..7cdfe0111 100644 --- a/src/common/defs.py +++ b/src/common/defs.py @@ -2,7 +2,7 @@ docdir = '../' datadir = '../' -version = '0.11.4.0-svn' +version = '0.11.4.2-svn' import sys, os.path for base in ('.', 'common'): diff --git a/src/common/gajim.py b/src/common/gajim.py index dcb294034..0e11a9ee4 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -138,9 +138,6 @@ SHOW_LIST = ['offline', 'connecting', 'online', 'chat', 'away', 'xa', 'dnd', # zeroconf account name ZEROCONF_ACC_NAME = 'Local' -priority_dict = {} -for status in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible'): - priority_dict[status] = config.get('autopriority' + status) HAVE_PYCRYPTO = True try: @@ -154,6 +151,17 @@ try: except ImportError: HAVE_PYSEXY = False +HAVE_GPG = True +try: + import GnuPGInterface +except ImportError: + HAVE_GPG = False +else: + import os + status = os.system('gpg -h >/dev/null 2>&1') + if status != 0: + HAVE_GPG = False + def get_nick_from_jid(jid): pos = jid.find('@') return jid[:pos] @@ -260,13 +268,14 @@ def account_is_disconnected(account): def get_number_of_securely_connected_accounts(): '''returns the number of the accounts that are SSL/TLS connected''' num_of_secured = 0 - for account in connections: + for account in connections.keys(): if account_is_securely_connected(account): num_of_secured += 1 return num_of_secured def account_is_securely_connected(account): - if account in con_types and con_types[account] in ('tls', 'ssl'): + if account_is_connected(account) and \ + account in con_types and con_types[account] in ('tls', 'ssl'): return True else: return False diff --git a/src/common/helpers.py b/src/common/helpers.py index aed9e5280..1efadab81 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -429,8 +429,8 @@ 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')): + elif ((sys.platform == 'darwin') and\ + (gajim.config.get('openwith') == 'open')): command = 'open' elif gajim.config.get('openwith') == 'custom': if kind == 'url': @@ -459,8 +459,8 @@ 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')): + 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') @@ -784,7 +784,8 @@ def get_os_info(): 'sourcemage') or not\ os.path.basename(path_to_file).startswith('slackware'): text = distro_name + ' ' + text - elif path_to_file.endswith('aurox-release'): + elif path_to_file.endswith('aurox-release') or \ + path_to_file.endswith('arch-release'): # file doesn't have version text = distro_name elif path_to_file.endswith('lfs-release'): # file just has version @@ -792,7 +793,7 @@ def get_os_info(): return text # our last chance, ask uname and strip it - uname_output = get_output_of_command('uname -a | cut -d" " -f1,3') + uname_output = get_output_of_command('uname -sr') if uname_output is not None: return uname_output[0] # only first line return 'N/A' @@ -1092,3 +1093,38 @@ def get_transport_path(transport): elif os.path.isdir(os.path.join(gajim.MY_ICONSETS_PATH, 'transports', transport)): return os.path.join(gajim.MY_ICONSETS_PATH, 'transports', transport) + # No transport folder found, use default jabber one + return get_iconset_path(gajim.config.get('iconset')) + +def prepare_and_validate_gpg_keyID(account, jid, keyID): + '''Returns an eight char long keyID that can be used with for GPG encryption with this contact. + If the given keyID is None, return UNKNOWN; if the key does not match the assigned key + XXXXXXXXMISMATCH is returned. If the key is trusted and not yet assigned, assign it''' + if gajim.connections[account].USE_GPG: + if keyID and len(keyID) == 16: + keyID = keyID[8:] + + attached_keys = gajim.config.get_per('accounts', account, + 'attached_gpg_keys').split() + + if jid in attached_keys and keyID: + attachedkeyID = attached_keys[attached_keys.index(jid) + 1] + if attachedkeyID != keyID: + # Mismatch! Another gpg key was expected + keyID += 'MISMATCH' + elif jid in attached_keys: + # An unsigned presence, just use the assigned key + keyID = attached_keys[attached_keys.index(jid) + 1] + elif keyID: + public_keys = gajim.connections[account].ask_gpg_keys() + # Assign the corresponding key, if we have it in our keyring + if public_keys.has_key(keyID): + for u in gajim.contacts.get_contacts(account, jid): + u.keyID = keyID + keys_str = gajim.config.get_per('accounts', account, 'attached_gpg_keys') + keys_str += jid + ' ' + keyID + ' ' + gajim.config.set_per('accounts', account, 'attached_gpg_keys', keys_str) + elif keyID is None: + keyID = 'UNKNOWN' + return keyID + diff --git a/src/common/optparser.py b/src/common/optparser.py index 86a86b5d7..72b6fe6e7 100644 --- a/src/common/optparser.py +++ b/src/common/optparser.py @@ -174,8 +174,10 @@ class OptionsParser: 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() + if old < [0, 11, 4, 1] and new >= [0, 11, 4, 1]: + self.update_config_to_01141() + if old < [0, 11, 4, 2] and new >= [0, 11, 4, 2]: + self.update_config_to_01142() gajim.logger.init_vars() gajim.config.set('version', new_version) @@ -503,7 +505,7 @@ class OptionsParser: gajim.config.set('version', '0.11.2.1') - def update_config_to_01122(self): + def update_config_to_01141(self): back = os.getcwd() os.chdir(logger.LOG_DB_FOLDER) con = sqlite.connect(logger.LOG_DB_FILE) @@ -524,5 +526,20 @@ class OptionsParser: except sqlite.OperationalError, e: pass con.close() - gajim.config.set('version', '0.11.2.2') + gajim.config.set('version', '0.11.4.1') + def update_config_to_01142(self): + '''next_message_received sound event is splittedin 2 events''' + gajim.config.add_per('soundevents', 'next_message_received_focused') + gajim.config.add_per('soundevents', 'next_message_received_unfocused') + if gajim.config.get_per('soundevents', 'next_message_received'): + enabled = gajim.config.get_per('soundevents', 'next_message_received', + 'enabled') + path = gajim.config.get_per('soundevents', 'next_message_received', + 'path') + gajim.config.del_per('soundevents', 'next_message_received') + gajim.config.set_per('soundevents', 'next_message_received_focused', + 'enabled', enabled) + gajim.config.set_per('soundevents', 'next_message_received_focused', + 'path', path) + gajim.config.set('version', '0.11.1.2') diff --git a/src/common/pep.py b/src/common/pep.py new file mode 100644 index 000000000..c9f2f59c2 --- /dev/null +++ b/src/common/pep.py @@ -0,0 +1,220 @@ +from common import gajim, xmpp + +def user_mood(items, name, jid): + has_child = False + mood = None + text = None + for item in items.getTags('item'): + child = item.getTag('mood') + if child is not None: + has_child = True + for ch in child.getChildren(): + if ch.getName() != 'text': + mood = ch.getName() + else: + text = ch.getData() + if jid == gajim.get_jid_from_account(name): + acc = gajim.connections[name] + if has_child: + if acc.mood.has_key('mood'): + del acc.mood['mood'] + if acc.mood.has_key('text'): + del acc.mood['text'] + if mood != None: + acc.mood['mood'] = mood + if text != None: + acc.mood['text'] = text + + (user, resource) = gajim.get_room_and_nick_from_fjid(jid) + contact = gajim.contacts.get_contact(name, user, resource=resource) + if not contact: + return + if has_child: + if contact.mood.has_key('mood'): + del contact.mood['mood'] + if contact.mood.has_key('text'): + del contact.mood['text'] + if mood != None: + contact.mood['mood'] = mood + if text != None: + contact.mood['text'] = text + +def user_tune(items, name, jid): + has_child = False + artist = None + title = None + source = None + track = None + length = None + + for item in items.getTags('item'): + child = item.getTag('tune') + if child is not None: + has_child = True + for ch in child.getChildren(): + if ch.getName() == 'artist': + artist = ch.getData() + elif ch.getName() == 'title': + title = ch.getData() + elif ch.getName() == 'source': + source = ch.getData() + elif ch.getName() == 'track': + track = ch.getData() + elif ch.getName() == 'length': + length = ch.getData() + + if jid == gajim.get_jid_from_account(name): + acc = gajim.connections[name] + if has_child: + if acc.tune.has_key('artist'): + del acc.tune['artist'] + if acc.tune.has_key('title'): + del acc.tune['title'] + if acc.tune.has_key('source'): + del acc.tune['source'] + if acc.tune.has_key('track'): + del acc.tune['track'] + if acc.tune.has_key('length'): + del acc.tune['length'] + if artist != None: + acc.tune['artist'] = artist + if title != None: + acc.tune['title'] = title + if source != None: + acc.tune['source'] = source + if track != None: + acc.tune['track'] = track + if length != None: + acc.tune['length'] = length + + (user, resource) = gajim.get_room_and_nick_from_fjid(jid) + contact = gajim.contacts.get_contact(name, user, resource=resource) + if not contact: + return + if has_child: + 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'] + if artist != None: + contact.tune['artist'] = artist + if title != None: + contact.tune['title'] = title + if source != None: + contact.tune['source'] = source + if track != None: + contact.tune['track'] = track + if length != None: + contact.tune['length'] = length + +def user_geoloc(items, name, jid): + pass + +def user_activity(items, name, jid): + has_child = False + activity = None + subactivity = None + text = None + + for item in items.getTags('item'): + child = item.getTag('activity') + if child is not None: + has_child = True + for ch in child.getChildren(): + if ch.getName() != 'text': + activity = ch.getName() + for chi in ch.getChildren(): + subactivity = chi.getName() + else: + text = ch.getData() + + if jid == gajim.get_jid_from_account(name): + acc = gajim.connections[name] + if has_child: + if acc.activity.has_key('activity'): + del acc.activity['activity'] + if acc.activity.has_key('subactivity'): + del acc.activity['subactivity'] + if acc.activity.has_key('text'): + del acc.activity['text'] + if activity != None: + acc.activity['activity'] = activity + if subactivity != None: + acc.activity['subactivity'] = subactivity + if text != None: + acc.activity['text'] = text + + (user, resource) = gajim.get_room_and_nick_from_fjid(jid) + contact = gajim.contacts.get_contact(name, user, resource=resource) + if not contact: + return + if has_child: + 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'] + if activity != None: + contact.activity['activity'] = activity + if subactivity != None: + contact.activity['subactivity'] = subactivity + if text != None: + contact.activity['text'] = text + +def user_send_mood(account, mood, message = ''): + if gajim.config.get('publish_mood') == False: + return + item = xmpp.Node('mood', {'xmlns': xmpp.NS_MOOD}) + if mood != '': + item.addChild(mood) + if message != '': + i = item.addChild('text') + i.addData(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}) + if 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') + +def user_send_tune(account, artist = '', title = '', source = '', track = 0,length = 0, items = None): + if (gajim.config.get('publish_tune') == False) or \ + (gajim.connections[account].pep_supported == False): + return + item = xmpp.Node('tune', {'xmlns': xmpp.NS_TUNE}) + if artist != '': + i = item.addChild('artist') + i.addData(artist) + if title != '': + i = item.addChild('title') + i.addData(title) + if source != '': + i = item.addChild('source') + i.addData(source) + if track != 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/common/pubsub.py b/src/common/pubsub.py index 8a6da05cc..50249cc9e 100644 --- a/src/common/pubsub.py +++ b/src/common/pubsub.py @@ -1,5 +1,6 @@ import xmpp import gajim +import connection_handlers class ConnectionPubSub: def __init__(self): @@ -43,9 +44,61 @@ 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=configure_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()) cb(conn, stanza, *args, **kwargs) except: 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/socks5.py b/src/common/socks5.py index 6d70266a8..caa82b679 100644 --- a/src/common/socks5.py +++ b/src/common/socks5.py @@ -932,7 +932,7 @@ class Socks5Receiver(Socks5, IdleObject): elif self.state == 3: # send 'connect' request self.send_raw(self._get_request_buff(self._get_sha1_auth())) elif self.file_props['type'] != 'r': - if self.file_props['paused'] == True: + if self.file_props['paused']: self.idlequeue.plug_idle(self, False, False) return result = self.write_next() diff --git a/src/common/stanza_session.py b/src/common/stanza_session.py index d8625d6a7..84034dc9e 100644 --- a/src/common/stanza_session.py +++ b/src/common/stanza_session.py @@ -1,7 +1,6 @@ from common import gajim from common import xmpp -from common import helpers from common import exceptions import random @@ -571,9 +570,9 @@ class EncryptedStanzaSession(StanzaSession): 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 } + '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]) diff --git a/src/common/xmpp/protocol.py b/src/common/xmpp/protocol.py index 2edb5be83..c09b9921f 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_BYTESTREAM ='http://jabber.org/protocol/bytestreams' # XEP-0065 -NS_CAPS ='http://jabber.org/protocol/caps' # XEP-0115 -NS_CHATSTATES ='http://jabber.org/protocol/chatstates' # XEP-0085 +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,8 +51,9 @@ NS_ENCRYPTED ='jabber:x:encrypted' # XEP-00 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' # XEP-0096 -NS_GEOLOC ='http://jabber.org/protocol/geoloc' # XEP-0080 +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' # XEP-0070 NS_HTTP_BIND ='http://jabber.org/protocol/httpbind' # XEP-0124 @@ -72,6 +76,7 @@ NS_PRIVACY ='jabber:iq:privacy' NS_PRIVATE ='jabber:iq:private' NS_PROFILE ='http://jabber.org/protocol/profile' # XEP-0154 NS_PUBSUB ='http://jabber.org/protocol/pubsub' # XEP-0060 +NS_PUBSUB_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' # XEP-0144 @@ -90,12 +95,14 @@ NS_STREAMS ='http://etherx.jabber.org/streams' 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' 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' # XEP-0130 NS_XHTML_IM ='http://jabber.org/protocol/xhtml-im' # XEP-0071 diff --git a/src/common/xmpp/roster.py b/src/common/xmpp/roster.py index b90c30732..33472c56b 100644 --- a/src/common/xmpp/roster.py +++ b/src/common/xmpp/roster.py @@ -87,7 +87,11 @@ class Roster(PlugIn): def PresenceHandler(self,dis,pres): """ Presence tracker. Used internally for setting items' resources state in internal roster representation. """ - jid=JID(pres.getFrom()) + jid=pres.getFrom() + if not jid: + # If no from attribue, it's from server + jid=self._owner.Server + jid=JID(jid) if not self._data.has_key(jid.getStripped()): self._data[jid.getStripped()]={'name':None,'ask':None,'subscription':'none','groups':['Not in roster'],'resources':{}} if type(self._data[jid.getStripped()]['resources'])!=type(dict()): self._data[jid.getStripped()]['resources']={} diff --git a/src/common/xmpp/transports_nb.py b/src/common/xmpp/transports_nb.py index c4cda4636..64e5323d2 100644 --- a/src/common/xmpp/transports_nb.py +++ b/src/common/xmpp/transports_nb.py @@ -761,15 +761,18 @@ class NonBlockingTLS(PlugIn): 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 OpenSSL.crypto.Error, exception_obj: + log.warning('Unable to load a certificate from file %s: %s' %\ + (gajim.MY_CACERTS, exception_obj.args[0][0][2])) except: - log.warning('Unable to load a certificate from file %s' % \ + log.warning( + 'Unknown error while loading certificate from file %s' % \ gajim.MY_CACERTS) begin = -1 i += 1 @@ -787,7 +790,8 @@ class NonBlockingTLS(PlugIn): try: self.starttls='in progress' tcpsock._sslObj.do_handshake() - except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError), e: + # Errors are handeled in _do_receive function + except: pass tcpsock._sslObj.setblocking(False) log.debug("Synchronous handshake completed") @@ -1027,7 +1031,7 @@ class NBSOCKS5PROXYsocket(NonBlockingTcp): # use the IPv4 address request even if remote resolving was specified. try: self.ipaddr = socket.inet_aton(self.server[0]) - req = req + "\x01" + ipaddr + req = req + "\x01" + self.ipaddr except socket.error: # Well it's not an IP number, so it's probably a DNS name. # if self.__proxy[3]==True: diff --git a/src/common/zeroconf/connection_handlers_zeroconf.py b/src/common/zeroconf/connection_handlers_zeroconf.py index 8ccc68d64..848bdff9e 100644 --- a/src/common/zeroconf/connection_handlers_zeroconf.py +++ b/src/common/zeroconf/connection_handlers_zeroconf.py @@ -32,7 +32,6 @@ from calendar import timegm from common import socks5 import common.xmpp -from common import GnuPG from common import helpers from common import gajim from common.zeroconf import zeroconf @@ -726,13 +725,15 @@ class ConnectionHandlersZeroconf(ConnectionVcard, ConnectionBytestream): if not user_nick: user_nick = '' - if encTag and GnuPG.USE_GPG: + if encTag and self.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 diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index 36f56a347..04294118c 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -49,8 +49,6 @@ from common.zeroconf import client_zeroconf from common.zeroconf import zeroconf from connection_handlers_zeroconf import * -USE_GPG = GnuPG.USE_GPG - class ConnectionZeroconf(ConnectionHandlersZeroconf): '''Connection class''' def __init__(self, name): @@ -62,7 +60,9 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): self.connected = 0 # offline self.connection = None self.gpg = None - if USE_GPG: + self.USE_GPG = False + if gajim.HAVE_GPG: + self.USE_GPG = True self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) self.is_zeroconf = True self.privacy_rules_supported = False @@ -71,9 +71,9 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): self.status = '' self.old_show = '' self.priority = 0 - + self.call_resolve_timeout = False - + self.time_to_reconnect = None #self.new_account_info = None self.bookmarks = [] @@ -86,21 +86,25 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): self.no_log_for = False self.pep_supported = False + self.mood = {} + self.tune = {} + self.activity = {} # Do we continue connection when we get roster (send presence,get vcard...) self.continue_connect_info = None - if USE_GPG: + if gajim.HAVE_GPG: + self.USE_GPG = True self.gpg = GnuPG.GnuPG(gajim.config.get('use_gpg_agent')) - + self.get_config_values_or_default() - + self.muc_jid = {} # jid of muc server for each transport type self.vcard_supported = False self.private_storage_supported = False def get_config_values_or_default(self): - ''' get name, host, port from config, or + ''' get name, host, port from config, or create zeroconf account with default values''' - + if not gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'name'): gajim.log.debug('Creating zeroconf account') gajim.config.add_per('accounts', gajim.ZEROCONF_ACC_NAME) @@ -146,7 +150,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): def quit(self, kill_core): if kill_core and self.connected > 1: self.disconnect() - + def disable_account(self): self.disconnect() @@ -160,17 +164,19 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): def get_signed_msg(self, msg): signed = '' keyID = gajim.config.get_per('accounts', self.name, 'keyid') - if keyID and USE_GPG: + if keyID and self.USE_GPG: use_gpg_agent = gajim.config.get('use_gpg_agent') if self.connected < 2 and self.gpg.passphrase is None and \ - not use_gpg_agent: + not use_gpg_agent: # We didn't set a passphrase self.dispatch('ERROR', (_('OpenPGP passphrase was not given'), #%s is the account name here _('You will be connected to %s without OpenPGP.') % self.name)) + self.USE_GPG = False elif self.gpg.passphrase is not None or use_gpg_agent: signed = self.gpg.sign(msg, keyID) if signed == 'BAD_PASSPHRASE': + self.USE_GPG = False signed = '' if self.connected < 2: self.dispatch('BAD_PASSPHRASE', ()) @@ -189,12 +195,12 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): #XXX open chat windows don't get refreshed (full name), add that return self.call_resolve_timeout - # callbacks called from zeroconf + # callbacks called from zeroconf def _on_new_service(self,jid): self.roster.setItem(jid) self.dispatch('ROSTER_INFO', (jid, self.roster.getName(jid), 'both', 'no', self.roster.getGroups(jid))) self.dispatch('NOTIFY', (jid, self.roster.getStatus(jid), self.roster.getMessage(jid), 'local', 0, None, 0, None)) - + def _on_remove_service(self, jid): self.roster.delItem(jid) # 'NOTIFY' (account, (jid, status, status message, resource, priority, @@ -326,7 +332,7 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): elif show == 'offline' and self.connected: self.disconnect() self.time_to_reconnect = None - + # update status elif show != 'offline' and self.connected: was_invisible = self.connected == STATUS_LIST.index('invisible') @@ -344,18 +350,18 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): if check: self.dispatch('STATUS', show) else: - # show notification that avahi or system bus is down + # show notification that avahi or system bus is down self.dispatch('STATUS', 'offline') self.status = 'offline' self.dispatch('CONNECTION_LOST', (_('Could not change status of account "%s"') % self.name, _('Please check if avahi-daemon is running.'))) - + def get_status(self): return STATUS_LIST[self.connected] def send_message(self, jid, msg, keyID, type = 'chat', subject='', - chatstate = None, msg_id = None, composing_xep = None, resource = None, + chatstate = None, msg_id = None, composing_xep = None, resource = None, user_nick = None, session=None): fjid = jid @@ -370,9 +376,14 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): msgtxt = msg msgenc = '' - if keyID and USE_GPG: - # encrypt - msgenc, error = self.gpg.encrypt(msg, [keyID]) + if keyID and self.USE_GPG: + if keyID == 'UNKNOWN': + error = _('Neither the remote presence is signed, nor a key was assigned.') + elif keyID[8:] == 'MISMATCH': + error = _('The contact\'s key (%s) does not match the key assigned in Gajim.' % keyID[:8]) + else: + # encrypt + msgenc, error = self.gpg.encrypt(msg, [keyID]) if msgenc and not error: msgtxt = '[This message is encrypted]' lang = os.getenv('LANG') @@ -414,8 +425,8 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): 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 session: session.last_send = time.time() @@ -440,15 +451,15 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): else: kind = 'single_msg_sent' gajim.logger.write(kind, jid, log_msg) - + 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): gajim.log.debug('This should not happen (ack_subscribed)') @@ -471,11 +482,11 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): def unsubscribe_agent(self, agent): gajim.log.debug('This should not happen (unsubscribe_agent)') - def update_contact(self, jid, name, groups): + def update_contact(self, jid, name, groups): if self.connection: self.connection.getRoster().setItem(jid = jid, name = name, groups = groups) - + def new_account(self, name, config, sync = False): gajim.log.debug('This should not happen (new_account)') @@ -496,18 +507,18 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): def get_bookmarks(self): gajim.log.debug('This should not happen (get_bookmarks)') - + def store_bookmarks(self): gajim.log.debug('This should not happen (store_bookmarks)') - + def get_metacontacts(self): gajim.log.debug('This should not happen (get_metacontacts)') - + def send_agent_status(self, agent, ptype): gajim.log.debug('This should not happen (send_agent_status)') def gpg_passphrase(self, passphrase): - if USE_GPG: + if self.gpg: use_gpg_agent = gajim.config.get('use_gpg_agent') if use_gpg_agent: self.gpg.passphrase = None @@ -515,13 +526,13 @@ class ConnectionZeroconf(ConnectionHandlersZeroconf): 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 diff --git a/src/config.py b/src/config.py index a47844400..43ede20f8 100644 --- a/src/config.py +++ b/src/config.py @@ -6,6 +6,7 @@ ## Copyright (C) 2003-2005 Vincent Hanquez ## Copyright (C) 2006 Stefan Bethge ## Copyright (C) 2007 Stephan Erb +## Copyright (C) 2007 Travis Shirk ## ## This file is part of Gajim. ## @@ -49,6 +50,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 @@ -69,8 +71,6 @@ class PreferencesWindow: 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') @@ -90,8 +90,6 @@ class PreferencesWindow: 'auto_xa_time_spinbutton') self.auto_xa_message_entry = self.xml.get_widget('auto_xa_message_entry') - w = self.xml.get_widget('anc_hbox') - ### General tab ### # Display avatars in roster st = gajim.config.get('show_avatars_in_roster') @@ -132,14 +130,6 @@ 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') @@ -163,6 +153,7 @@ class PreferencesWindow: else: self.xml.get_widget('speller_checkbutton').set_sensitive(False) + ### Style tab ### # Themes theme_combobox = self.xml.get_widget('theme_combobox') cell = gtk.CellRendererText() @@ -173,7 +164,7 @@ 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) + 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) @@ -206,12 +197,42 @@ class PreferencesWindow: model.append([preview, l[i]]) if gajim.config.get('iconset') == l[i]: self.iconset_combobox.set_active(i) - + # Use transports iconsets st = gajim.config.get('use_transports_iconsets') self.xml.get_widget('transports_iconsets_checkbutton').set_active(st) - ### Privacy tab ### + # 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) + + ### Personal Events tab ### # outgoing send chat state notifications st = gajim.config.get('outgoing_chat_state_notifications') combo = self.xml.get_widget('outgoing_chat_states_combobox') @@ -232,11 +253,29 @@ 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')) + # PEP + st = gajim.config.get('publish_mood') + self.xml.get_widget('publish_mood_checkbutton').set_active(st) - ### Events tab ### + st = gajim.config.get('publish_activity') + self.xml.get_widget('publish_activity_checkbutton').set_active(st) + + st = gajim.config.get('publish_tune') + self.xml.get_widget('publish_tune_checkbutton').set_active(st) + + st = gajim.config.get('subscribe_mood') + self.xml.get_widget('subscribe_mood_checkbutton').set_active(st) + + st = gajim.config.get('subscribe_activity') + self.xml.get_widget('subscribe_activity_checkbutton').set_active(st) + + st = gajim.config.get('subscribe_tune') + self.xml.get_widget('subscribe_tune_checkbutton').set_active(st) + + if not gajim.config.get('use_pep'): + self.xml.get_widget('frame_pep').set_sensitive(False) + + ### Notifications tab ### # On new event on_event_combobox = self.xml.get_widget('on_event_combobox') if gajim.config.get('autopopup'): @@ -285,7 +324,7 @@ class PreferencesWindow: # sounds treeview self.sound_tree = self.xml.get_widget('sounds_treeview') - + # active, event ui name, path to sound file, event_config_name model = gtk.ListStore(bool, str, str, str) self.sound_tree.set_model(model) @@ -306,6 +345,24 @@ class PreferencesWindow: self.fill_sound_treeview() + # Notify user of new gmail e-mail messages, + # make checkbox sensitive if user has a gtalk account + frame_gmail = self.xml.get_widget('frame_gmail') + notify_gmail_checkbutton = self.xml.get_widget('notify_gmail_checkbutton') + notify_gmail_extra_checkbutton = self.xml.get_widget( + 'notify_gmail_extra_checkbutton') + + 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: + frame_gmail.set_sensitive(True) + st = gajim.config.get('notify_on_new_gmail_email') + notify_gmail_checkbutton.set_active(st) + st = gajim.config.get('notify_on_new_gmail_email_extra') + notify_gmail_extra_checkbutton.set_active(st) + break + + #### Status tab ### # Autoaway st = gajim.config.get('autoaway') self.auto_away_checkbutton.set_active(st) @@ -356,7 +413,7 @@ class PreferencesWindow: renderer = gtk.CellRendererText() col.pack_start(renderer, False) col.set_attributes(renderer, text = 1) - col = gtk.TreeViewColumn('Message') + col = gtk.TreeViewColumn('Default Message') self.default_msg_tree.append_column(col) renderer = gtk.CellRendererText() col.pack_start(renderer, True) @@ -387,6 +444,7 @@ class PreferencesWindow: buf = self.xml.get_widget('msg_textview').get_buffer() buf.connect('changed', self.on_msg_textview_changed) + ### Advanced tab ### # open links with if os.name == 'nt': applications_frame = self.xml.get_widget('applications_frame') @@ -417,8 +475,8 @@ class PreferencesWindow: self.applications_combobox.set_active(2) elif gajim.config.get('openwith') == 'exo-open': self.applications_combobox.set_active(3) - elif ((sys.platform == 'darwin') and - (gajim.config.get('openwith') == 'open')): + elif ((sys.platform == 'darwin') and\ + (gajim.config.get('openwith') == 'open')): self.applications_combobox.set_active(1) elif gajim.config.get('openwith') == 'custom': if sys.platform == 'darwin': @@ -426,7 +484,7 @@ class PreferencesWindow: else: self.applications_combobox.set_active(4) self.xml.get_widget('custom_apps_frame').show() - + self.xml.get_widget('custom_browser_entry').set_text( gajim.config.get('custombrowser')) self.xml.get_widget('custom_mail_client_entry').set_text( @@ -438,74 +496,21 @@ class PreferencesWindow: st = gajim.config.get('log_contact_status_changes') self.xml.get_widget('log_show_changes_checkbutton').set_active(st) + # log encrypted chat sessions + st = gajim.config.get('log_encrypted_sessions') + self.xml.get_widget('log_encrypted_chats_checkbutton').set_active(st) + # send os info st = gajim.config.get('send_os_info') self.xml.get_widget('send_os_info_checkbutton').set_active(st) - # send os info + # check if gajm is default st = gajim.config.get('check_if_gajim_is_default') self.xml.get_widget('check_default_client_checkbutton').set_active(st) - # set status msg from currently playing music track - widget = self.xml.get_widget( - 'set_status_msg_from_current_music_track_checkbutton') - if os.name == 'nt': - widget.set_no_show_all(True) - widget.hide() - elif dbus_support.supported: - st = gajim.config.get('set_status_msg_from_current_music_track') - widget.set_active(st) - else: - widget.set_sensitive(False) - - # 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') - notify_gmail_checkbutton = self.xml.get_widget('notify_gmail_checkbutton') - notify_gmail_extra_checkbutton = self.xml.get_widget( - 'notify_gmail_extra_checkbutton') - - 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: - frame_gmail.show_all() - st = gajim.config.get('notify_on_new_gmail_email') - notify_gmail_checkbutton.set_active(st) - st = gajim.config.get('notify_on_new_gmail_email_extra') - notify_gmail_extra_checkbutton.set_active(st) - 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) + # Ignore messages from unknown contacts + self.xml.get_widget('ignore_events_from_unknown_contacts_checkbutton').\ + set_active(gajim.config.get('ignore_unknown_contacts')) self.xml.signal_autoconnect(self) @@ -517,10 +522,11 @@ class PreferencesWindow: self.on_msg_treemodel_row_deleted) self.default_msg_tree.get_model().connect('row-changed', self.on_default_msg_treemodel_row_changed) - + self.theme_preferences = None - + self.notebook.set_current_page(0) + self.window.show_all() gtkgui_helpers.possibly_move_window_in_current_desktop(self.window) @@ -536,6 +542,42 @@ class PreferencesWindow: w.set_sensitive(widget.get_active()) gajim.interface.save_config() + 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_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_publish_tune_checkbutton_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_subscribe_mood_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'subscribe_mood') + + def on_subscribe_activity_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'subscribe_activity') + + def on_subscribe_tune_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'subscribe_tune') + + def on_sort_by_show_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'sort_by_show') + gajim.interface.roster.draw_roster() + def on_show_avatars_in_roster_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'show_avatars_in_roster') gajim.interface.roster.draw_roster() @@ -576,11 +618,6 @@ class PreferencesWindow: for win in gajim.interface.msg_win_mgr.windows(): win.toggle_emoticons() - def on_treat_incoming_messages_combobox_changed(self, widget): - active = widget.get_active() - 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() config_type = common.config.opt_one_window_types[active] @@ -662,7 +699,7 @@ class PreferencesWindow: def update_theme_list(self): theme_combobox = self.xml.get_widget('theme_combobox') model = gtk.ListStore(str) - theme_combobox.set_model(model) + theme_combobox.set_model(model) i = 0 for config_theme in gajim.config.get_per('themes'): theme = config_theme.replace('_', ' ') @@ -794,7 +831,7 @@ class PreferencesWindow: def on_conversation_fontbutton_font_set(self, widget): self.on_preference_widget_font_set(widget, 'conversation_font') - + def on_default_chat_font_toggled(self, widget): font_widget = self.xml.get_widget('conversation_fontbutton') if widget.get_active(): @@ -899,7 +936,7 @@ class PreferencesWindow: val = model[iter][0].decode('utf-8') if model[iter][1]: # we have a preset message if not val: # no title, use message text for title - val = model[iter][1] + val = model[iter][1] gajim.config.add_per('statusmsg', val) msg = helpers.to_one_line(model[iter][1].decode('utf-8')) gajim.config.set_per('statusmsg', val, 'message', msg) @@ -954,6 +991,9 @@ class PreferencesWindow: def on_log_show_changes_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'log_contact_status_changes') + + def on_log_encrypted_chats_checkbutton_toggled(self, widget): + self.on_checkbutton_toggled(widget, 'log_encrypted_sessions') def on_send_os_info_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'send_os_info') @@ -1030,26 +1070,23 @@ class PreferencesWindow: def fill_sound_treeview(self): model = self.sound_tree.get_model() model.clear() - + model.set_sort_column_id(1, gtk.SORT_ASCENDING) + # NOTE: sounds_ui_names MUST have all items of # sounds = gajim.config.get_per('soundevents') as keys sounds_dict = { 'first_message_received': _('First Message Received'), - 'next_message_received': _('Next Message Received'), + 'next_message_received_focused': _('Next Message Received Focused'), + 'next_message_received_unfocused': + _('Next Message Received Unfocused'), 'contact_connected': _('Contact Connected'), 'contact_disconnected': _('Contact Disconnected'), 'message_sent': _('Message Sent'), 'muc_message_highlight': _('Group Chat Message Highlight'), - 'muc_message_received': _('Group Chat Message Received') + 'muc_message_received': _('Group Chat Message Received'), + 'gmail_received': _('GMail Email Received') } - # In case of a GMail account we provide a sound notification option - 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: - sounds_dict['gmail_received'] = _('GMail Email Received') - break - for sound_event_config_name, sound_ui_name in sounds_dict.items(): enabled = gajim.config.get_per('soundevents', sound_event_config_name, 'enabled') @@ -1290,6 +1327,7 @@ class AccountsWindow: del gajim.interface.instances['accounts'] def on_close_button_clicked(self, widget): + self.check_resend_relog() self.window.destroy() def __init__(self): @@ -1299,8 +1337,6 @@ class AccountsWindow: self.accounts_treeview = self.xml.get_widget('accounts_treeview') self.remove_button = self.xml.get_widget('remove_button') 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') @@ -1327,7 +1363,10 @@ class AccountsWindow: # Merge accounts st = gajim.config.get('mergeaccounts') - self.xml.get_widget('merge_checkbutton').set_active(st) + checkbutton = self.xml.get_widget('merge_checkbutton') + checkbutton.set_active(st) + # prevent roster redraws by connecting the signal after button state is set + checkbutton.connect('toggled', self.on_merge_checkbutton_toggled) self.avahi_available = True try: @@ -1337,6 +1376,7 @@ class AccountsWindow: def on_accounts_window_key_press_event(self, widget, event): if event.keyval == gtk.keysyms.Escape: + self.check_resend_relog() self.window.destroy() def select_account(self, account): @@ -1354,7 +1394,6 @@ class AccountsWindow: 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.config.get_per('accounts'): @@ -1366,42 +1405,12 @@ class AccountsWindow: 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 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 check_resend_relog(self): 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 self.current_account and \ gajim.connections[self.current_account].connected > 0: def login(account, show_before, status_before): @@ -1435,6 +1444,40 @@ class AccountsWindow: self.need_relogin = False self.resend_presence = False + + def on_accounts_treeview_cursor_changed(self, widget): + '''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) + + self.check_resend_relog() + self.remove_button.set_sensitive(True) self.rename_button.set_sensitive(True) if iter: @@ -1487,7 +1530,7 @@ class AccountsWindow: 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: @@ -1585,8 +1628,16 @@ class AccountsWindow: 'priority')) # Connection tab - usessl = gajim.config.get_per('accounts', account, 'usessl') - self.xml.get_widget('use_ssl_checkbutton1').set_active(usessl) + use_env_http_proxy = gajim.config.get_per('accounts', account, + 'use_env_http_proxy') + self.xml.get_widget('use_env_http_proxy_checkbutton1').set_active( + use_env_http_proxy) + self.xml.get_widget('proxy_hbox1').set_sensitive(not use_env_http_proxy) + + warn_when_insecure = gajim.config.get_per('accounts', account, + 'warn_when_insecure_connection') + self.xml.get_widget('warn_when_insecure_connection_checkbutton1').\ + set_active(warn_when_insecure) self.xml.get_widget('send_keepalive_checkbutton1').set_active( gajim.config.get_per('accounts', account, 'keep_alives_enabled')) @@ -1825,7 +1876,7 @@ class AccountsWindow: passwords.save_password(self.current_account, password) else: passwords.save_password(self.current_account, '') - + def on_resource_entry1_focus_out_event(self, widget, event): if self.ignore_events: return @@ -1899,7 +1950,8 @@ class AccountsWindow: '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(): + + if not widget.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)) @@ -1917,6 +1969,14 @@ class AccountsWindow: self.on_checkbutton_toggled(widget, 'use_ft_proxies', account=self.current_account) + def on_use_env_http_proxy_checkbutton1_toggled(self, widget): + if self.ignore_events: + return + self.on_checkbutton_toggled(widget, 'use_env_http_proxy', + account=self.current_account) + hbox = self.xml.get_widget('proxy_hbox1') + hbox.set_sensitive(not widget.get_active()) + def on_proxies_combobox1_changed(self, widget): active = widget.get_active() proxy = widget.get_model()[active][0].decode('utf-8') @@ -1934,20 +1994,11 @@ class AccountsWindow: else: gajim.interface.instances['manage_proxies'] = ManageProxiesWindow() - def on_use_ssl_checkbutton1_toggled(self, widget): + def on_warn_when_insecure_connection_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', + self.on_checkbutton_toggled(widget, 'warn_when_insecure_connection', account=self.current_account) def on_send_keepalive_checkbutton1_toggled(self, widget): @@ -1992,14 +2043,14 @@ class AccountsWindow: custom_port) def on_gpg_choose_button_clicked(self, widget, data = None): - if gajim.connections.has_key(self.current_account): + if gajim.connections.has_key(self.current_account) and \ + gajim.connections[self.current_account].gpg: 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: + if gajim.HAVE_GPG: secret_keys = GnuPG.GnuPG().get_secret_keys() else: secret_keys = [] @@ -2123,8 +2174,8 @@ class AccountsWindow: del gajim.transport_avatar[gajim.ZEROCONF_ACC_NAME] if len(gajim.connections) >= 2: # Do not merge accounts if only one exists - gajim.interface.roster.regroup = gajim.config.get('mergeaccounts') - else: + gajim.interface.roster.regroup = gajim.config.get('mergeaccounts') + else: gajim.interface.roster.regroup = False gajim.interface.roster.draw_roster() gajim.interface.roster.set_actions_menu_needs_rebuild() @@ -2158,8 +2209,8 @@ class AccountsWindow: # refresh roster if len(gajim.connections) >= 2: # Do not merge accounts if only one exists - gajim.interface.roster.regroup = gajim.config.get('mergeaccounts') - else: + gajim.interface.roster.regroup = gajim.config.get('mergeaccounts') + else: gajim.interface.roster.regroup = False gajim.interface.roster.draw_roster() gajim.interface.roster.set_actions_menu_needs_rebuild() @@ -2424,7 +2475,7 @@ class GroupchatConfigWindow: '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.') - + instance = dialogs.InputDialog(title, prompt) response = instance.get_response() if response != gtk.RESPONSE_OK: @@ -2557,7 +2608,7 @@ class RemoveAccountWindow: on_response_ok = remove) else: remove() - + def _on_remove_success(self, res): # action of unregistration has failed, we don't remove the account # Error message is send by connect_and_auth() @@ -2585,8 +2636,8 @@ class RemoveAccountWindow: del gajim.status_before_autoaway[self.account] del gajim.transport_avatar[self.account] if len(gajim.connections) >= 2: # Do not merge accounts if only one exists - gajim.interface.roster.regroup = gajim.config.get('mergeaccounts') - else: + gajim.interface.roster.regroup = gajim.config.get('mergeaccounts') + else: gajim.interface.roster.regroup = False gajim.interface.roster.draw_roster() gajim.interface.roster.set_actions_menu_needs_rebuild() @@ -3030,7 +3081,7 @@ class AccountCreationWizardWindow: elif cur_page == 1: # We are adding an existing account username = self.xml.get_widget('username_entry').get_text().decode( - 'utf-8') + 'utf-8').strip() if not username: pritext = _('Invalid username') sectext = _( @@ -3038,7 +3089,7 @@ class AccountCreationWizardWindow: dialogs.ErrorDialog(pritext, sectext) return server = self.xml.get_widget('server_comboboxentry').child.get_text().\ - decode('utf-8') + decode('utf-8').strip() savepass = self.xml.get_widget('save_password_checkbutton').\ get_active() password = self.xml.get_widget('password_entry').get_text().decode( @@ -3142,12 +3193,22 @@ class AccountCreationWizardWindow: 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 + # Check if cert is already in file + certs = '' + if os.path.isfile(gajim.MY_CACERTS): + f = open(gajim.MY_CACERTS) + certs = f.read() + f.close() + if self.ssl_cert in certs: + dialogs.ErrorDialog(_('Certificate Already in File'), + _('This certificate is already in file %s, so it\'s not added again.') % gajim.MY_CACERTS) + else: + 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: @@ -3188,7 +3249,7 @@ class AccountCreationWizardWindow: self.progressbar.pulse() return True # loop forever - def new_acc_connected(self, form, is_form, ssl_msg, ssl_cert, + def new_acc_connected(self, form, is_form, ssl_msg, ssl_err, ssl_cert, ssl_fingerprint): '''connection to server succeded, present the form to the user.''' if self.update_progressbar_timeout_id is not None: @@ -3213,8 +3274,12 @@ class AccountCreationWizardWindow: '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) + if ssl_err in (18, 27): + 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) + else: + self.xml.get_widget('ssl_checkbutton').set_no_show_all(True) + self.xml.get_widget('ssl_checkbutton').hide() self.notebook.set_current_page(3) # show SSL page else: self.notebook.set_current_page(4) # show form page @@ -3400,9 +3465,283 @@ class AccountCreationWizardWindow: gajim.interface.instances['accounts'].init_accounts() # refresh roster if len(gajim.connections) >= 2: # Do not merge accounts if only one exists - gajim.interface.roster.regroup = gajim.config.get('mergeaccounts') - else: + gajim.interface.roster.regroup = gajim.config.get('mergeaccounts') + else: gajim.interface.roster.regroup = False gajim.interface.roster.draw_roster() gajim.interface.roster.set_actions_menu_needs_rebuild() gajim.interface.save_config() + +#---------- ZeroconfPropertiesWindow class -------------# +class ZeroconfPropertiesWindow: + def __init__(self): + self.xml = gtkgui_helpers.get_glade('zeroconf_properties_window.glade') + self.window = self.xml.get_widget('zeroconf_properties_window') + self.window.set_transient_for(gajim.interface.roster.window) + self.xml.signal_autoconnect(self) + + self.init_account() + self.init_account_gpg() + + self.xml.get_widget('save_button').grab_focus() + self.window.show_all() + + def init_account(self): + st = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'autoconnect') + if st: + self.xml.get_widget('autoconnect_checkbutton').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_checkbutton').set_active(0) + else: + self.xml.get_widget('log_history_checkbutton').set_active(1) + + + st = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'sync_with_global_status') + if st: + self.xml.get_widget('sync_with_global_status_checkbutton').set_active( + st) + + for opt in ('first_name', 'last_name', 'jabber_id', 'email'): + st = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'zeroconf_' + opt) + if st: + self.xml.get_widget(opt + '_entry').set_text(st) + + st = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'custom_port') + if st: + self.xml.get_widget('custom_port_entry').set_text(str(st)) + + st = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'use_custom_host') + if st: + self.xml.get_widget('custom_port_checkbutton').set_active(st) + + self.xml.get_widget('custom_port_entry').set_sensitive(bool(st)) + + if not st: + gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'custom_port', '5298') + + def init_account_gpg(self): + keyid = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, 'keyid') + keyname = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'keyname') + savegpgpass = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + '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', + gajim.ZEROCONF_ACC_NAME, 'gpgpassword') + entry.set_text(gpgpassword) + + def on_zeroconf_properties_window_destroy(self, widget): + # close window + if gajim.interface.instances.has_key('zeroconf_properties'): + del gajim.interface.instances['zeroconf_properties'] + + def on_custom_port_checkbutton_toggled(self, widget): + st = self.xml.get_widget('custom_port_checkbutton').get_active() + self.xml.get_widget('custom_port_entry').set_sensitive(bool(st)) + + def on_cancel_button_clicked(self, widget): + self.window.destroy() + + def on_save_button_clicked(self, widget): + config = {} + + st = self.xml.get_widget('autoconnect_checkbutton').get_active() + config['autoconnect'] = 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: + list_no_log_for.remove(gajim.ZEROCONF_ACC_NAME) + if not self.xml.get_widget('log_history_checkbutton').get_active(): + list_no_log_for.append(gajim.ZEROCONF_ACC_NAME) + config['no_log_for'] = ' '.join(list_no_log_for) + + st = self.xml.get_widget('sync_with_global_status_checkbutton').\ + get_active() + config['sync_with_global_status'] = st + + st = self.xml.get_widget('first_name_entry').get_text() + config['zeroconf_first_name'] = st.decode('utf-8') + + st = self.xml.get_widget('last_name_entry').get_text() + config['zeroconf_last_name'] = st.decode('utf-8') + + st = self.xml.get_widget('jabber_id_entry').get_text() + config['zeroconf_jabber_id'] = st.decode('utf-8') + + st = self.xml.get_widget('email_entry').get_text() + config['zeroconf_email'] = st.decode('utf-8') + + use_custom_port = self.xml.get_widget('custom_port_checkbutton').\ + get_active() + config['use_custom_host'] = use_custom_port + + old_port = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, + 'custom_port') + if use_custom_port: + port = self.xml.get_widget('custom_port_entry').get_text() + else: + port = 5298 + + config['custom_port'] = port + + 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') + + reconnect = False + for opt in ('zeroconf_first_name','zeroconf_last_name', + 'zeroconf_jabber_id', 'zeroconf_email', 'custom_port'): + if gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, opt) != \ + config[opt]: + reconnect = True + + for opt in config: + gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, opt, + config[opt]) + + if gajim.connections.has_key(gajim.ZEROCONF_ACC_NAME): + if port != old_port or reconnect: + gajim.connections[gajim.ZEROCONF_ACC_NAME].update_details() + + self.window.destroy() + + def on_gpg_choose_button_clicked(self, widget, data = None): + if gajim.connections.has_key(gajim.ZEROCONF_ACC_NAME): + secret_keys = gajim.connections[gajim.ZEROCONF_ACC_NAME].\ + ask_gpg_secrete_keys() + + # self.account is None and/or gajim.connections is {} + else: + if gajim.HAVE_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_gpg_save_password_checkbutton_toggled(self, widget): + 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 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 + + 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/conversation_textview.py b/src/conversation_textview.py index 53b3a68b1..07998af66 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -61,8 +61,8 @@ class TextViewImage(gtk.Image): self.anchor = anchor self._selected = False self._disconnect_funcs = [] - self.connect("parent-set", self.on_parent_set) - self.connect("expose-event", self.on_expose) + self.connect('parent-set', self.on_parent_set) + self.connect('expose-event', self.on_expose) def _get_selected(self): parent = self.get_parent() @@ -74,7 +74,7 @@ class TextViewImage(gtk.Image): return True else: return False - + def get_state(self): parent = self.get_parent() if not parent: @@ -110,22 +110,22 @@ class TextViewImage(gtk.Image): 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) + 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) - + 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 @@ -142,12 +142,12 @@ class TextViewImage(gtk.Image): 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''' - + 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) @@ -159,7 +159,7 @@ class ConversationTextview: '''if used_in_history_window is True, then we do not show Clear menuitem in context menu''' self.used_in_history_window = used_in_history_window - + # no need to inherit TextView, use it as atrribute is safer self.tv = HtmlTextView() self.tv.html_hyperlink_handler = self.html_hyperlink_handler @@ -185,8 +185,8 @@ 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", + + id = self.tv.connect('expose-event', self.on_textview_expose_event) self.handlers[id] = self.tv @@ -213,10 +213,9 @@ class ConversationTextview: colors = gajim.config.get('gc_nicknames_colors') colors = colors.split(':') - for color in xrange(len(colors)): - tagname = 'gc_nickname_color_' + str(color) + for i,color in enumerate(colors): + tagname = 'gc_nickname_color_' + str(i) tag = buffer.create_tag(tagname) - color = colors[color] tag.set_property('foreground', color) tag = buffer.create_tag('marked') @@ -282,7 +281,7 @@ class ConversationTextview: self.tv.destroy() #FIXME: # self.line_tooltip.destroy() - + def update_tags(self): self.tagIn.set_property('foreground', gajim.config.get('inmsgcolor')) self.tagOut.set_property('foreground', gajim.config.get('outmsgcolor')) @@ -315,7 +314,7 @@ class ConversationTextview: self.smooth_id = None self.smooth_scroll_timer.cancel() return False - return True + return True def smooth_scroll_timeout(self): gobject.idle_add(self.do_smooth_scroll_timeout) @@ -336,9 +335,9 @@ class ConversationTextview: if None != self.smooth_id: # already scrolling return False self.smooth_id = gobject.timeout_add(self.SCROLL_DELAY, - self.smooth_scroll) + self.smooth_scroll) self.smooth_scroll_timer = Timer(self.MAX_SCROLL_TIME, - self.smooth_scroll_timeout) + self.smooth_scroll_timeout) self.smooth_scroll_timer.start() return False @@ -353,9 +352,8 @@ 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,\ - use_smooth =\ - gajim.config.get('use_smooth_scrolling')): + 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() @@ -418,12 +416,13 @@ class ConversationTextview: # add the new focus out line end_iter = buffer.get_end_iter() buffer.insert(end_iter, '\n') - buffer.insert_pixbuf(end_iter, + buffer.insert_pixbuf(end_iter, ConversationTextview.FOCUS_OUT_LINE_PIXBUF) end_iter = buffer.get_end_iter() before_img_iter = end_iter.copy() - before_img_iter.backward_char() # one char back (an image also takes one char) + # one char back (an image also takes one char) + before_img_iter.backward_char() buffer.apply_tag_by_name('focus-out-line', before_img_iter, end_iter) self.allow_focus_out_line = False @@ -452,7 +451,8 @@ class ConversationTextview: # check if the current pointer is still over the line position = self.tv.window.get_origin() 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]) + '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 @@ -460,7 +460,7 @@ class ConversationTextview: 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: @@ -582,7 +582,8 @@ class ConversationTextview: else: if dict_link.find('%s') == -1: # we must have %s in the url if not WIKTIONARY - item = gtk.MenuItem(_('Dictionary URL is missing an "%s" and it is not WIKTIONARY')) + item = gtk.MenuItem(_( + 'Dictionary URL is missing an "%s" and it is not WIKTIONARY')) item.set_property('sensitive', False) else: link = dict_link % self.selected_phrase @@ -603,7 +604,7 @@ class ConversationTextview: id = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id] = item submenu.append(item) - + item = gtk.MenuItem(_('Open as _Link')) id = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id] = item @@ -639,7 +640,8 @@ class ConversationTextview: if return_val: # if sth was selected when we right-clicked # get the selected text start_sel, finish_sel = return_val[0], return_val[1] - self.selected_phrase = buffer.get_text(start_sel, finish_sel).decode('utf-8') + self.selected_phrase = buffer.get_text(start_sel, finish_sel).decode( + 'utf-8') def on_open_link_activate(self, widget, kind, text): helpers.launch_browser_mailer(kind, text) @@ -673,7 +675,8 @@ class ConversationTextview: if kind == 'url': id = childs[0].connect('activate', self.on_copy_link_activate, text) self.handlers[id] = childs[0] - id = childs[1].connect('activate', self.on_open_link_activate, kind, text) + id = childs[1].connect('activate', self.on_open_link_activate, kind, + text) self.handlers[id] = childs[1] childs[2].hide() # copy mail address childs[3].hide() # open mail composer @@ -685,13 +688,14 @@ class ConversationTextview: # load muc icon join_group_chat_menuitem = xml.get_widget('join_group_chat_menuitem') muc_icon = gajim.interface.roster.load_icon('muc_active') - if muc_icon: - join_group_chat_menuitem.set_image(muc_icon) + if muc_icon: + join_group_chat_menuitem.set_image(muc_icon) text = text.lower() id = childs[2].connect('activate', self.on_copy_link_activate, text) self.handlers[id] = childs[2] - id = childs[3].connect('activate', self.on_open_link_activate, kind, text) + id = childs[3].connect('activate', self.on_open_link_activate, kind, + text) self.handlers[id] = childs[3] id = childs[5].connect('activate', self.on_start_chat_activate, text) self.handlers[id] = childs[5] @@ -708,7 +712,8 @@ class ConversationTextview: allow_add = True if allow_add: - id = childs[7].connect('activate', self.on_add_to_roster_activate, text) + id = childs[7].connect('activate', self.on_add_to_roster_activate, + text) self.handlers[id] = childs[7] childs[7].show() # show add to roster menuitem else: @@ -729,7 +734,8 @@ class ConversationTextview: # we get the end of the tag while not end_iter.ends_tag(texttag): end_iter.forward_char() - word = self.tv.get_buffer().get_text(begin_iter, end_iter).decode('utf-8') + word = self.tv.get_buffer().get_text(begin_iter, end_iter).decode( + 'utf-8') if event.button == 3: # right click self.make_link_menu(event, kind, word) else: @@ -786,16 +792,16 @@ class ConversationTextview: 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", "\\[", - "\\]"] + 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] @@ -807,16 +813,18 @@ class ConversationTextview: if exitcode == 0: random.seed() - tmpfile = os.path.join(gettempdir(), "gajimtex_" + random.randint(0, + 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 = '\\documentclass[12pt]{article}\\usepackage[dvips]{graphicx}' + texstr += '\\usepackage{amsmath}\\usepackage{amssymb}' + texstr += '\\pagestyle{empty}' + texstr += '\\begin{document}\\begin{large}\\begin{gather*}' texstr += str - texstr += "\\end{gather*}\\end{large}\\end{document}" + texstr += '\\end{gather*}\\end{large}\\end{document}' - file = open(os.path.join(tmpfile + ".tex"), "w+") + file = open(os.path.join(tmpfile + '.tex'), 'w+') file.write(texstr) file.flush() file.close() @@ -825,17 +833,17 @@ 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() if exitcode == 0: - p = Popen(['convert', tmpfile + '.ps', tmpfile + '.png'], - cwd=gettempdir()) + p = Popen(['convert', '-alpha', 'off', tmpfile + '.ps', + tmpfile + '.png'], cwd=gettempdir()) exitcode = p.wait() - extensions = [".tex", ".log", ".aux", ".dvi", ".ps"] + extensions = ['.tex', '.log', '.aux', '.dvi', '.ps'] for ext in extensions: try: os.remove(tmpfile + ext) @@ -895,11 +903,13 @@ class ConversationTextview: use_other_tags = False elif special_text.startswith('*'): # it's a bold text tags.append('bold') - if special_text[1] == '/' and special_text[-2] == '/' and len(special_text) > 4: # it's also italic + if special_text[1] == '/' and special_text[-2] == '/' and\ + len(special_text) > 4: # it's also italic tags.append('italic') if not show_ascii_formatting_chars: special_text = special_text[2:-2] # remove */ /* - elif special_text[1] == '_' and special_text[-2] == '_' and len(special_text) > 4: # it's also underlined + elif special_text[1] == '_' and special_text[-2] == '_' and \ + len(special_text) > 4: # it's also underlined tags.append('underline') if not show_ascii_formatting_chars: special_text = special_text[2:-2] # remove *_ _* @@ -908,11 +918,13 @@ class ConversationTextview: special_text = special_text[1:-1] # remove * * elif special_text.startswith('/'): # it's an italic text tags.append('italic') - if special_text[1] == '*' and special_text[-2] == '*' and len(special_text) > 4: # it's also bold + if special_text[1] == '*' and special_text[-2] == '*' and \ + len(special_text) > 4: # it's also bold tags.append('bold') if not show_ascii_formatting_chars: special_text = special_text[2:-2] # remove /* */ - elif special_text[1] == '_' and special_text[-2] == '_' and len(special_text) > 4: # it's also underlined + elif special_text[1] == '_' and special_text[-2] == '_' and \ + len(special_text) > 4: # it's also underlined tags.append('underline') if not show_ascii_formatting_chars: special_text = special_text[2:-2] # remove /_ _/ @@ -921,11 +933,13 @@ class ConversationTextview: special_text = special_text[1:-1] # remove / / elif special_text.startswith('_'): # it's an underlined text tags.append('underline') - if special_text[1] == '*' and special_text[-2] == '*' and len(special_text) > 4: # it's also bold + if special_text[1] == '*' and special_text[-2] == '*' and \ + len(special_text) > 4: # it's also bold tags.append('bold') if not show_ascii_formatting_chars: special_text = special_text[2:-2] # remove _* *_ - elif special_text[1] == '/' and special_text[-2] == '/' and len(special_text) > 4: # it's also italic + elif special_text[1] == '/' and special_text[-2] == '/' and \ + len(special_text) > 4: # it's also italic tags.append('italic') if not show_ascii_formatting_chars: special_text = special_text[2:-2] # remove _/ /_ @@ -1123,8 +1137,8 @@ class ConversationTextview: self.tv.display_html(xhtml.encode('utf-8')) return except Exception, e: - gajim.log.debug(str("Error processing xhtml")+str(e)) - gajim.log.debug(str("with |"+xhtml+"|")) + gajim.log.debug(str('Error processing xhtml')+str(e)) + gajim.log.debug(str('with |'+xhtml+'|')) buffer = self.tv.get_buffer() # /me is replaced by name if name is given @@ -1136,4 +1150,3 @@ class ConversationTextview: # add the rest of text located in the index and after end_iter = buffer.get_end_iter() buffer.insert_with_tags_by_name(end_iter, text[index:], *text_tags) - diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index 95f60ab8b..0cedc65f6 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -342,7 +342,7 @@ class SingleForm(gtk.Table, object): for value, label in field.iter_options(): radio = gtk.RadioButton(first_radio, label=label) radio.connect('toggled', - self.on_list_single_radiobutton_toggled, field, value) + self.on_list_single_radiobutton_toggled, field, value) if first_radio is None: first_radio = radio if field.value == '': # TODO: is None when done diff --git a/src/dialogs.py b/src/dialogs.py index 28e77f9de..073c0b78f 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -9,7 +9,7 @@ ## Copyright (C) 2005 Norman Rasmussen ## Copyright (C) 2007 Lukas Petrovicky ## Julien Pivotto -## Stephan Erb +## Stephan Erb ## ## This file is part of Gajim. ## @@ -207,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 @@ -256,7 +256,7 @@ class PassphraseDialog: self.window.destroy() return passphrase, checked - def __init__(self, titletext, labeltext, checkbuttontext=None, is_modal = True, + 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') @@ -278,14 +278,14 @@ class PassphraseDialog: 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') @@ -351,9 +351,9 @@ class ChooseGPGKeyDialog: def run(self): rep = self.window.run() - if rep == gtk.RESPONSE_OK: - selection = self.keys_treeview.get_selection() - (model, iter) = selection.get_selected() + selection = self.keys_treeview.get_selection() + (model, iter) = selection.get_selected() + if iter and rep == gtk.RESPONSE_OK: keyID = [ model[iter][0].decode('utf-8'), model[iter][1].decode('utf-8') ] else: @@ -370,6 +370,125 @@ 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): + 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.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) + self.xml.signal_autoconnect(self) + self.window.show_all() + + def on_ok_button_clicked(self, widget): + '''Return mood and messsage (None if no mood selected)''' + mood = None + message = None + active = self.combo.get_active() + if active > -1: + mood = self.liststore[active][0].decode('utf-8') + message = self.entry.get_text().decode('utf-8') + 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): self.show = show @@ -502,7 +621,7 @@ class ChangeStatusMessageDialog: 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 + # 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) @@ -578,7 +697,7 @@ _('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) + self.group_comboboxentry.set_model(liststore) # Combobox with transport/jabber icons liststore = gtk.ListStore(str, gtk.gdk.Pixbuf, str) cell = gtk.CellRendererPixbuf() @@ -828,7 +947,7 @@ class AboutDialog: text = open(copying_file_path).read() dlg.set_license(text) - dlg.set_comments('%s\n%s %s\n%s %s' + dlg.set_comments('%s\n%s %s\n%s %s' % (_('A GTK+ jabber client'), \ _('GTK+ Version:'), self.tuple2str(gtk.gtk_version), \ _('PyGTK Version:'), self.tuple2str(gtk.pygtk_version))) @@ -872,7 +991,7 @@ class AboutDialog: dlg.props.wrap_license = True pixbuf = gtk.gdk.pixbuf_new_from_file(os.path.join( - gajim.DATA_DIR, 'pixmaps', 'gajim_about.png')) + gajim.DATA_DIR, 'pixmaps', 'gajim_about.png')) dlg.set_logo(pixbuf) #here you write your name in the form Name FamilyName @@ -918,11 +1037,11 @@ class HigDialog(gtk.MessageDialog): def __init__(self, parent, type, buttons, pritext, sectext, on_response_ok = None, on_response_cancel = None, on_response_yes = None, on_response_no = None): - gtk.MessageDialog.__init__(self, parent, + gtk.MessageDialog.__init__(self, parent, gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_MODAL, type, buttons, message_format = pritext) - self.format_secondary_text(sectext) + self.format_secondary_markup(sectext) buttons = self.action_area.get_children() possible_responses = {gtk.STOCK_OK: on_response_ok, @@ -969,7 +1088,7 @@ class FileChooserDialog(gtk.FileChooserDialog): select_multiple = False, current_folder = None, on_response_ok = None, on_response_cancel = None): - gtk.FileChooserDialog.__init__(self, title = title_text, + gtk.FileChooserDialog.__init__(self, title = title_text, action = action, buttons = buttons) self.set_default_response(default_response) @@ -1027,7 +1146,7 @@ class ConfirmationDialog(HigDialog): on_response_cancel = None): self.user_response_ok = on_response_ok self.user_response_cancel = on_response_cancel - HigDialog.__init__(self, None, + HigDialog.__init__(self, None, gtk.MESSAGE_QUESTION, gtk.BUTTONS_OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) self.popup() @@ -1054,7 +1173,7 @@ class NonModalConfirmationDialog(HigDialog): on_response_cancel = None): self.user_response_ok = on_response_ok self.user_response_cancel = on_response_cancel - HigDialog.__init__(self, None, + HigDialog.__init__(self, None, gtk.MESSAGE_QUESTION, gtk.BUTTONS_OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) self.set_modal(False) @@ -1078,7 +1197,7 @@ class NonModalConfirmationDialog(HigDialog): class WarningDialog(HigDialog): def __init__(self, pritext, sectext=''): '''HIG compliant warning dialog.''' - HigDialog.__init__( self, None, + HigDialog.__init__( self, None, gtk.MESSAGE_WARNING, gtk.BUTTONS_OK, pritext, sectext) self.set_modal(False) self.set_transient_for(gajim.interface.roster.window) @@ -1087,7 +1206,7 @@ class WarningDialog(HigDialog): class InformationDialog(HigDialog): def __init__(self, pritext, sectext=''): '''HIG compliant info dialog.''' - HigDialog.__init__( self, None, + HigDialog.__init__( self, None, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, pritext, sectext) self.set_modal(False) self.set_transient_for(gajim.interface.roster.window) @@ -1096,20 +1215,52 @@ class InformationDialog(HigDialog): class ErrorDialog(HigDialog): def __init__(self, pritext, sectext=''): '''HIG compliant error dialog.''' - HigDialog.__init__( self, None, + HigDialog.__init__( self, None, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, pritext, sectext) self.popup() class YesNoDialog(HigDialog): - def __init__(self, pritext, sectext='', on_response_yes = None, - on_response_no = None): + def __init__(self, pritext, sectext='', checktext='', on_response_yes=None, + on_response_no=None): '''HIG compliant YesNo dialog.''' - HigDialog.__init__( self, None, + self.user_response_yes = on_response_yes + self.user_response_no = on_response_no + 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) + on_response_yes=self.on_response_yes, + on_response_no=self.on_response_no) + + if checktext: + self.checkbutton = gtk.CheckButton(checktext) + self.vbox.pack_start(self.checkbutton, expand=False, fill=True) + else: + self.checkbutton = None self.set_modal(False) self.popup() + def on_response_yes(self, widget): + if self.user_response_yes: + if isinstance(self.user_response_yes, tuple): + self.user_response_yes[0](self.is_checked(), + *self.user_response_yes[1:]) + else: + self.user_response_yes(self.is_checked()) + self.destroy() + + def on_response_no(self, widget): + if self.user_response_no: + if isinstance(self.user_response_no, tuple): + self.user_response_no[0](*self.user_response_no[1:]) + else: + self.user_response_no() + self.destroy() + + def is_checked(self): + ''' Get active state of the checkbutton ''' + if not self.checkbutton: + return False + return self.checkbutton.get_active() + class ConfirmationDialogCheck(ConfirmationDialog): '''HIG compliant confirmation dialog with checkbutton.''' def __init__(self, pritext, sectext='', checktext = '', @@ -1145,7 +1296,7 @@ class ConfirmationDialogCheck(ConfirmationDialog): 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:]) + self.user_response_cancel[0](*self.user_response_cancel[1:]) else: self.user_response_cancel() self.destroy() @@ -1765,7 +1916,7 @@ class PopupNotificationWindow: bg_color = 'yellowgreen' elif event_type == _('Groupchat Invitation'): bg_color = 'tan1' - elif event_type == _('Contact Changed Status'): + elif event_type == _('Contact Changed Status'): bg_color = 'thistle2' else: # Unknown event! Shouldn't happen but deal with it bg_color = 'white' @@ -1773,7 +1924,7 @@ class PopupNotificationWindow: close_button.modify_bg(gtk.STATE_NORMAL, popup_bg_color) eventbox.modify_bg(gtk.STATE_NORMAL, popup_bg_color) event_description_label.set_markup( - '%s' % text) + '%s' % text) # set the image image.set_from_file(path_to_image) @@ -1922,14 +2073,14 @@ class SingleMessageWindow: self.completion_dict = {} self.xml.signal_autoconnect(self) - if gajim.config.get('saveposition'): - # get window position and size from config - gtkgui_helpers.move_window(self.window, - gajim.config.get('single-msg-x-position'), - gajim.config.get('single-msg-y-position')) - gtkgui_helpers.resize_window(self.window, - gajim.config.get('single-msg-width'), - gajim.config.get('single-msg-height')) + # get window position and size from config + gtkgui_helpers.resize_window(self.window, + gajim.config.get('single-msg-width'), + gajim.config.get('single-msg-height')) + gtkgui_helpers.move_window(self.window, + gajim.config.get('single-msg-x-position'), + gajim.config.get('single-msg-y-position')) + self.window.show_all() def on_single_message_window_destroy(self, widget): @@ -1940,15 +2091,14 @@ class SingleMessageWindow: self.message_tv_buffer.place_cursor(end_iter) def save_pos(self): - if gajim.config.get('saveposition'): - # save the window size and position - x, y = self.window.get_position() - gajim.config.set('single-msg-x-position', x) - gajim.config.set('single-msg-y-position', y) - width, height = self.window.get_size() - gajim.config.set('single-msg-width', width) - gajim.config.set('single-msg-height', height) - gajim.interface.save_config() + # save the window size and position + x, y = self.window.get_position() + gajim.config.set('single-msg-x-position', x) + gajim.config.set('single-msg-y-position', y) + width, height = self.window.get_size() + gajim.config.set('single-msg-width', width) + gajim.config.set('single-msg-height', height) + gajim.interface.save_config() def on_single_message_window_delete_event(self, window, ev): self.save_pos() @@ -1999,7 +2149,7 @@ class SingleMessageWindow: if self.message: self.conversation_textview.print_real_text(self.message) - fjid = self.from_whom + fjid = self.from_whom if self.resource: fjid += '/' + self.resource # Full jid of sender (with resource) self.from_entry.set_text(fjid) @@ -2009,16 +2159,16 @@ class SingleMessageWindow: 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() + 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) @@ -2266,7 +2416,7 @@ class PrivacyListWindow: # 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]) + 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) @@ -2280,7 +2430,7 @@ class PrivacyListWindow: self.list_of_groups[group] = count count += 1 self.edit_type_group_combobox.append_text(group) - self.edit_type_group_combobox.set_active(0) + self.edit_type_group_combobox.set_active(0) self.window.set_title(title) @@ -2302,7 +2452,7 @@ class PrivacyListWindow: if a_d_dict['default'] == self.privacy_list_name: self.privacy_list_default_checkbutton.set_active(True) else: - self.privacy_list_default_checkbutton.set_active(False) + self.privacy_list_default_checkbutton.set_active(False) def privacy_list_received(self, rules): self.list_of_rules_combobox.get_model().clear() @@ -2437,7 +2587,7 @@ class PrivacyListWindow: self.edit_queries_send_checkbutton.set_active(False) self.edit_view_status_checkbutton.set_active(False) self.edit_send_status_checkbutton.set_active(False) - self.edit_order_spinbutton.set_value(1) + self.edit_order_spinbutton.set_value(1) self.edit_type_group_combobox.set_active(0) self.edit_type_subscription_combobox.set_active(0) self.add_edit_rule_label.set_label( @@ -2519,7 +2669,7 @@ class PrivacyListsWindow: or edit an already there one''' def __init__(self, account): self.account = account - self.privacy_lists_save = [] + self.privacy_lists_save = [] self.xml = gtkgui_helpers.get_glade('privacy_lists_window.glade') @@ -2529,7 +2679,7 @@ class PrivacyListsWindow: 'new_privacy_list_button', 'new_privacy_list_entry', 'privacy_lists_refresh_button', 'close_privacy_lists_window_button']: self.__dict__[widget_to_add] = self.xml.get_widget( - widget_to_add) + widget_to_add) self.draw_privacy_lists_in_combobox([]) self.privacy_lists_refresh() @@ -2967,8 +3117,8 @@ class AdvancedNotificationsWindow: self.window.show_all() - def initiate_rule_state(self): - '''Set values for all widgets''' + def initiate_rule_state(self): + '''Set values for all widgets''' if self.active_num < 0: return # event @@ -3209,7 +3359,7 @@ class AdvancedNotificationsWindow: for st in ['online', 'away', 'xa', 'dnd', 'invisible']: self.__dict__[st + '_cb'].hide() - self.special_status_rb.show() + self.special_status_rb.show() else: self.set_status_config() # 'special status' clicked @@ -3417,6 +3567,15 @@ class TransformChatToMUC: self.guests_treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + # All contacts beside the following can be invited: + # transports, zeroconf contacts, minimized groupchats + invitable = lambda contact, contact_transport = None:\ + contact.jid not in self.auto_jids and\ + contact.jid != gajim.get_jid_from_account(self.account) and\ + contact.jid not in gajim.interface.minimized_controls[account] and\ + not contact.is_transport() and\ + not contact_transport + # set jabber id and pseudos for account in gajim.contacts.get_accounts(): if gajim.connections[account].is_zeroconf: @@ -3425,24 +3584,20 @@ class TransformChatToMUC: 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) + # Add contact if it can be invited + if invitable(contact, contact_transport) and \ + 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() @@ -3460,7 +3615,6 @@ class TransformChatToMUC: 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): @@ -3473,7 +3627,7 @@ class TransformChatToMUC: 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]['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) diff --git a/src/disco.py b/src/disco.py index 28ff7b2a0..cc4368b47 100644 --- a/src/disco.py +++ b/src/disco.py @@ -46,7 +46,6 @@ import inspect import weakref import gobject import gtk -import gobject import pango import dialogs diff --git a/src/features_window.py b/src/features_window.py index eeb983a98..59c5f3a1f 100644 --- a/src/features_window.py +++ b/src/features_window.py @@ -21,7 +21,6 @@ import os import sys import gtk -import gobject import gtkgui_helpers import dialogs @@ -53,7 +52,7 @@ class FeaturesWindow: _('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.'), + _('A script to controle Gajim via commandline.'), _('Requires python-dbus.'), _('Feature not available under Windows.')), _('OpenGPG'): (self.gpg_available, @@ -86,14 +85,14 @@ class FeaturesWindow: _('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 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 $$ $$.'), + _('Transform LaTeX expressions 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, @@ -141,6 +140,8 @@ class FeaturesWindow: def on_features_treeview_cursor_changed(self, widget): selection = widget.get_selection() + if not selection: + return path = selection.get_selected_rows()[1][0] available = self.model[path][1] feature = self.model[path][0].decode('utf-8') @@ -178,8 +179,8 @@ class FeaturesWindow: def gpg_available(self): if os.name == 'nt': return False - from common import GnuPG - return GnuPG.USE_GPG + from common import gajim + return gajim.HAVE_GPG def network_manager_available(self): if os.name == 'nt': diff --git a/src/gajim.py b/src/gajim.py index d268e0ae2..ad64b9b52 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -44,7 +44,6 @@ if os.name == 'nt': # os.environ['GTK_BASEPATH'] = 'gtk' import sys -import urllib import logging consoleloghandler = logging.StreamHandler() @@ -222,7 +221,6 @@ import gobject import re import signal -import getopt import time import math @@ -457,10 +455,13 @@ class Interface: def handle_event_http_auth(self, account, data): #('HTTP_AUTH', account, (method, url, transaction_id, iq_obj, msg)) - def response(widget, account, iq_obj, answer): + def response(account, iq_obj, answer): self.dialog.destroy() gajim.connections[account].build_http_auth_answer(iq_obj, answer) + def on_yes(is_checked, account, iq_obj): + response(account, iq_obj, 'yes') + 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 @@ -468,8 +469,8 @@ class Interface: sec_msg = data[4] + '\n' + sec_msg self.dialog = dialogs.YesNoDialog(_('HTTP (%s) Authorization for %s (id: %s)') \ % (data[0], data[1], data[2]), sec_msg, - on_response_yes = (response, account, data[3], 'yes'), - on_response_no = (response, account, data[3], 'no')) + on_response_yes=(on_yes, account, data[3]), + on_response_no=(response, account, data[3], 'no')) def handle_event_error_answer(self, account, array): #('ERROR_ANSWER', account, (id, jid_from, errmsg, errcode)) @@ -581,10 +582,11 @@ class Interface: 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: - keyID = attached_keys[attached_keys.index(jid) + 1] + + # Get the proper keyID + keyID = helpers.prepare_and_validate_gpg_keyID(account, + jid, keyID) + resource = array[3] if not resource: resource = '' @@ -723,7 +725,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, None)) + array[3], None, None, None, None, None, [], None, None)) def handle_event_msg(self, account, array): @@ -848,8 +850,14 @@ class Interface: msg = message if subject: msg = _('Subject: %s') % subject + '\n' + msg + focused = False + if chat_control: + parent_win = chat_control.parent_win + if chat_control == parent_win.get_active_control() and \ + parent_win.window.has_focus: + focused = True notify.notify('new_message', jid_of_control, account, [msg_type, - first, nickname, msg], advanced_notif_num) + first, nickname, msg, focused], advanced_notif_num) if self.remote_ctrl: self.remote_ctrl.raise_signal('NewMessage', (account, array)) @@ -949,13 +957,22 @@ class Interface: self.remote_ctrl.raise_signal('Subscribed', (account, array)) def handle_event_unsubscribed(self, account, jid): - dialogs.InformationDialog(_('Contact "%s" removed subscription from you')\ - % jid, _('You will always see him or her as offline.')) - # FIXME: Per RFC 3921, we can "deny" ack as well, but the GUI does not show deny gajim.connections[account].ack_unsubscribed(jid) if self.remote_ctrl: self.remote_ctrl.raise_signal('Unsubscribed', (account, jid)) + contact = gajim.contacts.get_first_contact_from_jid(account, jid) + if not contact: + return + def on_yes(is_checked, list_): + self.roster.on_req_usub(None, list_) + list_ = [(contact, account)] + dialogs.YesNoDialog( + _('Contact "%s" removed subscription from you') % jid, + _('You will always see him or her as offline.\nDo you want to remove him or her from your contact list?'), + on_response_yes=(on_yes, list_)) + # FIXME: Per RFC 3921, we can "deny" ack as well, but the GUI does not show deny + def handle_event_agent_info_error(self, account, agent): #('AGENT_ERROR_INFO', account, (agent)) try: @@ -999,6 +1016,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]) @@ -1014,11 +1036,11 @@ class Interface: return def handle_event_new_acc_connected(self, account, array): - #('NEW_ACC_CONNECTED', account, (infos, is_form, ssl_msg, ssl_cert, - # ssl_fingerprint)) + #('NEW_ACC_CONNECTED', account, (infos, is_form, ssl_msg, ssl_err, + # 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[2], array[3], array[4]) + array[1], array[2], array[3], array[4], array[5]) def handle_event_new_acc_not_connected(self, account, array): #('NEW_ACC_NOT_CONNECTED', account, (reason)) @@ -1407,14 +1429,19 @@ class Interface: gajim.connections[account].gpg_passphrase(self.gpg_passphrase[keyid]) callback() return + if self.gpg_dialog: + # A GPG dialog is already open, retry in 0.5 second + gobject.timeout_add(500, self.handle_event_gpg_password_required, + account, array) + 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() + self.gpg_dialog = dialogs.PassphraseDialog(title, second, '') + passphrase, save = self.gpg_dialog.run() if passphrase == -1: # User pressed cancel passphrase = None @@ -1424,6 +1451,7 @@ class Interface: test_gpg_passphrase(passphrase) title = _('Wrong Passphrase') second = _('Please retype your GPG passphrase or press Cancel.') + self.gpg_dialog = None if passphrase != None: self.gpg_passphrase[keyid] = passphrase gobject.timeout_add(30000, self.forget_gpg_passphrase, keyid) @@ -1857,6 +1885,7 @@ class Interface: # block signed in notifications for 30 seconds gajim.block_signed_in_notifications[account] = True self.roster.set_actions_menu_needs_rebuild() + self.roster.draw_account(account) 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 @@ -1922,12 +1951,12 @@ class Interface: negotiated, not_acceptable, ask_user = session.verify_options_bob(form) if ask_user: - def accept_nondefault_options(widget): + def accept_nondefault_options(is_checked): self.dialog.destroy() negotiated.update(ask_user) session.respond_e2e_bob(form, negotiated, not_acceptable) - def reject_nondefault_options(widget): + def reject_nondefault_options(): self.dialog.destroy() for key in ask_user.keys(): not_acceptable.append(key) @@ -1939,8 +1968,8 @@ class Interface: %s Are these options acceptable?''') % (negotiation.describe_features(ask_user)), - on_response_yes = accept_nondefault_options, - on_response_no = reject_nondefault_options) + on_response_yes=accept_nondefault_options, + on_response_no=reject_nondefault_options) else: session.respond_e2e_bob(form, negotiated, not_acceptable) @@ -1963,7 +1992,7 @@ class Interface: session.check_identity = _cb if ask_user: - def accept_nondefault_options(widget): + def accept_nondefault_options(is_checked): dialog.destroy() negotiated.update(ask_user) @@ -1973,7 +2002,7 @@ class Interface: except exceptions.NegotiationError, details: session.fail_bad_negotiation(details) - def reject_nondefault_options(widget): + def reject_nondefault_options(): session.reject_negotiation() dialog.destroy() @@ -2169,6 +2198,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 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) @@ -2181,44 +2215,76 @@ class Interface: instance.unique_room_id_error(data[0]) def handle_event_ssl_error(self, account, data): - # ('SSL_ERROR', account, (text, cert, sha1_fingerprint)) + # ('SSL_ERROR', account, (text, errnum, cert, sha1_fingerprint)) server = gajim.config.get_per('accounts', account, 'hostname') - def on_ok(is_checked): + def on_ok(is_checked=False): if is_checked: - f = open(gajim.MY_CACERTS, 'a') - f.write(server + '\n') - f.write(data[1] + '\n\n') - f.close() + # Check if cert is already in file + certs = '' + if os.path.isfile(gajim.MY_CACERTS): + f = open(gajim.MY_CACERTS) + certs = f.read() + f.close() + if data[2] in certs: + dialogs.ErrorDialog(_('Certificate Already in File'), + _('This certificate is already in file %s, so it\'s not added again.') % gajim.MY_CACERTS) + else: + f = open(gajim.MY_CACERTS, 'a') + f.write(server + '\n') + f.write(data[2] + '\n\n') + f.close() gajim.config.set_per('accounts', account, 'ssl_fingerprint_sha1', - data[2]) + data[3]) 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) + if data[1] in (18, 27): + checktext = _('Add this certificate to the list of trusted certificates.\nSHA1 fingerprint of the certificate:\n%s') % data[3] + dialogs.ConfirmationDialogCheck(pritext, sectext, checktext, + on_response_ok=on_ok, on_response_cancel=on_cancel) + else: + dialogs.ConfirmationDialog(pritext, sectext, + 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() + # ('FINGERPRINT_ERROR', account, (new_fingerprint,)) + def on_yes(is_checked): gajim.config.set_per('accounts', account, 'ssl_fingerprint_sha1', data[0]) gajim.connections[account].ssl_certificate_accepted() - def on_no(widget): - dialog.destroy() + def on_no(): 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?') + sectext = _('It seems the SSL certificate has changed or your connection ' + 'is being hacked.\nOld fingerprint: %s\nNew fingerprint: %s\n\nDo you ' + 'still want to connect and update the fingerprint of the certificate?'\ + ) % (gajim.config.get_per('accounts', account, 'ssl_fingerprint_sha1'), + data[0]) dialog = dialogs.YesNoDialog(pritext, sectext, on_response_yes=on_yes, on_response_no=on_no) + def handle_event_plain_connection(self, account, data): + # ('PLAIN_CONNECTION', account, (connection)) + server = gajim.config.get_per('accounts', account, 'hostname') + def on_yes(is_checked): + if is_checked: + gajim.config.set_per('accounts', account, + 'warn_when_insecure_connection', False) + gajim.connections[account].connection_accepted(data[0], 'tcp') + def on_no(): + gajim.connections[account].disconnect(on_purpose=True) + self.handle_event_status(account, 'offline') + pritext = _('Insecure connection') + sectext = _('You are about to send your password on an insecure ' + 'conection. Are you sure you want to do that?') + checktext = _('Do _not ask me again') + dialog = dialogs.YesNoDialog(pritext, sectext, checktext, + 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(): @@ -2328,7 +2394,7 @@ class Interface: #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]' @@ -2340,7 +2406,7 @@ class Interface: latex = r'|\$\$[^$\\]*?([\]\[0-9A-Za-z()|+*/-]|[\\][\]\[0-9A-Za-z()|{}$])(.*?[^\\])?\$\$' - basic_pattern = links + mail + basic_pattern = links + '|' + mail if gajim.config.get('use_latex'): basic_pattern += latex @@ -2551,6 +2617,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, 'UNIQUE_ROOM_ID_UNSUPPORTED': \ self.handle_event_unique_room_id_unsupported, 'UNIQUE_ROOM_ID_SUPPORTED': self.handle_event_unique_room_id_supported, @@ -2558,6 +2625,7 @@ class Interface: 'GPG_PASSWORD_REQUIRED': self.handle_event_gpg_password_required, 'SSL_ERROR': self.handle_event_ssl_error, 'FINGERPRINT_ERROR': self.handle_event_fingerprint_error, + 'PLAIN_CONNECTION': self.handle_event_plain_connection, } gajim.handlers = self.handlers @@ -2674,6 +2742,7 @@ class Interface: self.status_sent_to_users = {} self.status_sent_to_groups = {} self.gpg_passphrase = {} + self.gpg_dialog = None self.default_colors = { 'inmsgcolor': gajim.config.get('inmsgcolor'), 'outmsgcolor': gajim.config.get('outmsgcolor'), @@ -2903,7 +2972,7 @@ if __name__ == '__main__': print >> sys.stderr, _('Session Management support not available (missing gnome.ui module)') else: def die_cb(cli): - gtk.main_quit() + gajim.interface.roster.quit_gtkgui_interface() gnome.program_init('gajim', gajim.version) cli = gnome.ui.master_client() cli.connect('die', die_cb) @@ -2928,4 +2997,7 @@ if __name__ == '__main__': osx.init() Interface() - gtk.main() + try: + gtk.main() + except KeyboardInterrupt: + print >> sys.stderr, 'KeyboardInterrupt' diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 1d975cf9c..c5b2ae487 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -72,12 +72,19 @@ def tree_cell_data_func(column, renderer, model, iter, tv=None): # reference to GroupchatControl instance (self) theme = gajim.config.get('roster_theme') # allocate space for avatar only if needed + parent_iter = model.iter_parent(iter) if isinstance(renderer, gtk.CellRendererPixbuf): - if model[iter][C_AVATAR]: + avatar_position = gajim.config.get('avatar_position_in_roster') + if avatar_position == 'right': + renderer.set_property('xalign', 1) # align pixbuf to the right + else: + renderer.set_property('xalign', 0.5) + if parent_iter and (model[iter][C_AVATAR] or avatar_position == 'left'): renderer.set_property('visible', True) + renderer.set_property('width', gajim.config.get('roster_avatar_width')) else: renderer.set_property('visible', False) - if model.iter_parent(iter): + if parent_iter: bgcolor = gajim.config.get_per('themes', theme, 'contactbgcolor') if bgcolor: renderer.set_property('cell-background', bgcolor) @@ -228,6 +235,12 @@ class GroupchatControl(ChatControlBase): self.tooltip = tooltips.GCTooltip() + # nickname coloring + self.gc_count_nicknames_colors = 0 + self.gc_custom_colors = {} + self.number_of_colors = len(gajim.config.get('gc_nicknames_colors').\ + split(':')) + # connect the menuitems to their respective functions xm = gtkgui_helpers.get_glade('gc_control_popup_menu.glade') @@ -301,6 +314,16 @@ class GroupchatControl(ChatControlBase): # first one img, second one text, third is sec pixbuf column = gtk.TreeViewColumn() + def add_avatar_renderer(): + 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) + + if gajim.config.get('avatar_position_in_roster') == 'left': + add_avatar_renderer() + renderer_image = cell_renderer_image.CellRendererImage(0, 0) # status img renderer_image.set_property('width', 26) column.pack_start(renderer_image, expand = False) @@ -315,12 +338,8 @@ class GroupchatControl(ChatControlBase): 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 + if gajim.config.get('avatar_position_in_roster') == 'right': + add_avatar_renderer() self.list_treeview.append_column(column) @@ -639,9 +658,6 @@ class GroupchatControl(ChatControlBase): fin = True return None - gc_count_nicknames_colors = 0 - gc_custom_colors = {} - def print_old_conversation(self, text, contact = '', tim = None, xhtml = None): if isinstance(text, str): @@ -692,9 +708,7 @@ class GroupchatControl(ChatControlBase): str(self.gc_custom_colors[contact])) else: self.gc_count_nicknames_colors += 1 - number_of_colors = len(gajim.config.get('gc_nicknames_colors').\ - split(':')) - if self.gc_count_nicknames_colors == number_of_colors: + if self.gc_count_nicknames_colors == self.number_of_colors: self.gc_count_nicknames_colors = 0 self.gc_custom_colors[contact] = \ self.gc_count_nicknames_colors @@ -813,6 +827,13 @@ class GroupchatControl(ChatControlBase): return False else: # Special word == word, no char after in word return True + for special_word in special_words: + if special_word.find(' ') > -1: + # There is a space in this special word, do a global search + # without splitting by words as previously + # We don't search this in all cases so we don't loose time + if text.find(special_word) > -1: + return True return False def set_subject(self, subject): @@ -1979,7 +2000,8 @@ class GroupchatControl(ChatControlBase): self.handlers[id] = item item = xml.get_widget('add_to_roster_menuitem') - if not jid: + our_jid = gajim.get_jid_from_account(self.account) + if not jid or jid == our_jid: item.set_sensitive(False) else: id = item.connect('activate', self.on_add_to_roster, jid) @@ -2079,12 +2101,7 @@ class GroupchatControl(ChatControlBase): 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 x < 27: if (widget.row_expanded(path)): widget.collapse_row(path) else: @@ -2142,6 +2159,9 @@ class GroupchatControl(ChatControlBase): self.tooltip.hide_tooltip() def show_tooltip(self, contact): + if not self.list_treeview.window: + # control has been destroyed since tooltip was requested + return pointer = self.list_treeview.get_pointer() props = self.list_treeview.get_path_at_pos(pointer[0], pointer[1]) # check if the current pointer is at the same path diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index c69716460..1bfe3955f 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -247,6 +247,11 @@ def move_window(window, x, y): x = 0 if y < 0: y = 0 + w, h = window.get_size() + if x + w > screen_w: + x = screen_w - w + if y + h > screen_h: + y = screen_h - h window.move(x, y) def resize_window(window, w, h): diff --git a/src/history_manager.py b/src/history_manager.py index cfd72aae5..3ba50a8cb 100755 --- a/src/history_manager.py +++ b/src/history_manager.py @@ -21,25 +21,25 @@ ## 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 os - -if os.name == 'nt': - import warnings - warnings.filterwarnings(action='ignore') - + +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) +# 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 @@ -100,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 @@ -236,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() @@ -579,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/lastfm.py b/src/lastfm.py index 385407f13..a247ef5a4 100644 --- a/src/lastfm.py +++ b/src/lastfm.py @@ -25,7 +25,7 @@ __version__ = '$Revision: 64 $' from urllib import urlopen from xml.dom import minidom -from time import time, strftime +from time import time class LastFM: # Where to fetch the played song information diff --git a/src/message_control.py b/src/message_control.py index b6b584eb2..a81532bc1 100644 --- a/src/message_control.py +++ b/src/message_control.py @@ -1,6 +1,6 @@ ## message_control.py ## -## Copyright (C) 2006 Travis Shirk +## Copyright (C) 2006-2007 Travis Shirk ## Copyright (C) 2007 Stephan Erb ## ## This file is part of Gajim. @@ -34,7 +34,7 @@ class MessageControl: def __init__(self, type_id, parent_win, widget_name, contact, account, resource = None): # dict { cb id : widget} # keep all registered callbacks of widgets, created by self.xml - self.handlers = {} + self.handlers = {} self.type_id = type_id self.parent_win = parent_win self.widget_name = widget_name @@ -86,7 +86,7 @@ class MessageControl: pass # NOTE: Derived classes SHOULD implement this def get_tab_label(self, chatstate): - '''Return a suitable the tab label string. Returns a tuple such as: + '''Return a suitable tab label string. Returns a tuple such as: (label_str, color) either of which can be None if chatstate is given that means we have HE SENT US a chatstate and we want it displayed''' @@ -126,8 +126,8 @@ class MessageControl: 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) + gajim.connections[self.account].delete_session(self.session.jid, + self.session.thread_id) self.session = session diff --git a/src/message_window.py b/src/message_window.py index c2ebe2769..f882b86cc 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -6,10 +6,9 @@ ## Vincent Hanquez ## Nikos Kouremenos ## Dimitur Kirov -## Travis Shirk ## Norman Rasmussen -## Copyright (C) 2006 Travis Shirk -## Geobert Quach +## Copyright (C) 2005-2007 Travis Shirk +## Copyright (C) 2006 Geobert Quach ## Copyright (C) 2007 Stephan Erb ## ## This file is part of Gajim. @@ -39,7 +38,7 @@ from common import gajim #################### -class MessageWindow: +class MessageWindow(object): '''Class for windows which contain message like things; chats, groupchats, etc.''' @@ -53,8 +52,8 @@ class MessageWindow: CLOSE_COMMAND, CLOSE_CTRL_KEY ) = range(5) - - def __init__(self, acct, type): + + def __init__(self, acct, type, parent_window=None, parent_paned=None): # A dictionary of dictionaries where _contacts[account][jid] == A MessageControl self._controls = {} # If None, the window is not tied to any specific account @@ -68,6 +67,18 @@ class MessageWindow: self.widget_name = 'message_window' self.xml = gtkgui_helpers.get_glade('%s.glade' % self.widget_name) self.window = self.xml.get_widget(self.widget_name) + self.notebook = self.xml.get_widget('notebook') + self.parent_paned = None + + if parent_window: + orig_window = self.window + self.window = parent_window + self.parent_paned = parent_paned + self.notebook.reparent(self.parent_paned) + self.parent_paned.pack2(self.notebook, resize=True, shrink=True) + orig_window.destroy() + del orig_window + id = self.window.connect('delete-event', self._on_window_delete) self.handlers[id] = self.window id = self.window.connect('destroy', self._on_window_destroy) @@ -91,7 +102,6 @@ class MessageWindow: self.window.add_events(gtk.gdk.POINTER_MOTION_MASK) self.alignment = self.xml.get_widget('alignment') - self.notebook = self.xml.get_widget('notebook') id = self.notebook.connect('switch-page', self._on_notebook_switch_page) self.handlers[id] = self.notebook @@ -144,6 +154,9 @@ class MessageWindow: n += len(dict) return n + def resize(self, width, height): + gtkgui_helpers.resize_window(self.window, width, height) + def _on_window_focus(self, widget, event): # window received focus, so if we had urgency REMOVE IT # NOTE: we do not have to read the message (it maybe in a bg tab) @@ -179,6 +192,8 @@ class MessageWindow: for ctrl in self.controls(): ctrl.shutdown() self._controls.clear() + # Clean up handlers connected to the parent window, this is important since + # self.window may be the RosterWindow for i in self.handlers.keys(): if self.handlers[i].handler_is_connected(i): self.handlers[i].disconnect(i) @@ -210,8 +225,9 @@ class MessageWindow: widget = xml.get_widget('tab_close_button') id = widget.connect('clicked', self._on_close_button_clicked, control) control.handlers[id] = widget - - id = tab_label_box.connect('button-press-event', self.on_tab_eventbox_button_press_event, control.widget) + + id = tab_label_box.connect('button-press-event', self.on_tab_eventbox_button_press_event, + control.widget) control.handlers[id] = tab_label_box self.notebook.append_page(control.widget, tab_label_box) @@ -222,7 +238,10 @@ class MessageWindow: self.setup_tab_dnd(control.widget) self.redraw_tab(control) - self.window.show_all() + if self.parent_paned: + self.notebook.show_all() + else: + self.window.show_all() # NOTE: we do not call set_control_active(True) since we don't know whether # the tab is the active one. self.show_title() @@ -263,7 +282,7 @@ class MessageWindow: if not control: # No more control in this window return - + # CTRL mask if modifier & gtk.gdk.CONTROL_MASK: if keyval == gtk.keysyms.h: @@ -286,7 +305,7 @@ class MessageWindow: # Tab switch bindings if keyval == gtk.keysyms.Right: # ALT + RIGHT new = self.notebook.get_current_page() + 1 - if new >= self.notebook.get_n_pages(): + if new >= self.notebook.get_n_pages(): new = 0 self.notebook.set_current_page(new) elif keyval == gtk.keysyms.Left: # ALT + LEFT @@ -307,7 +326,7 @@ class MessageWindow: '''When close button is pressed: close a tab''' self.remove_tab(control, self.CLOSE_CLOSE_BUTTON) - def show_title(self, urgent = True, control = None): + def show_title(self, urgent=True, control=None): '''redraw the window's title''' if not control: control = self.get_active_control() @@ -341,10 +360,7 @@ class MessageWindow: name += '/' + control.resource window_mode = gajim.interface.msg_win_mgr.mode - - if self.get_num_controls() == 1: - label = name - elif window_mode == MessageWindowMgr.ONE_MSG_WINDOW_PERTYPE: + if window_mode == MessageWindowMgr.ONE_MSG_WINDOW_PERTYPE: # Show the plural form since number of tabs > 1 if self.type == 'chat': label = _('Chats') @@ -352,9 +368,16 @@ class MessageWindow: label = _('Group Chats') else: label = _('Private Chats') + elif window_mode == MessageWindowMgr.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: + label = None + elif self.get_num_controls() == 1: + label = name else: label = _('Messages') - title = _('%s - Gajim') % label + + title = 'Gajim' + if label: + title = _('%s - %s') % (label, title) if window_mode == MessageWindowMgr.ONE_MSG_WINDOW_PERACCT: title = title + ": " + control.account @@ -370,7 +393,7 @@ class MessageWindow: ctrl = self._controls[acct][jid] ctrl_page = self.notebook.page_num(ctrl.widget) self.notebook.set_current_page(ctrl_page) - + def remove_tab(self, ctrl, method, reason = None, force = False): '''reason is only for gc (offline status message) if force is True, do not ask any confirmation''' @@ -413,7 +436,12 @@ class MessageWindow: gajim.interface.msg_win_mgr._on_window_destroy(self.window) # dnd clean up self.notebook.drag_dest_unset() - self.window.destroy() + if self.parent_paned: + # Don't close parent window, just remove the child + child = self.parent_paned.get_child2() + self.parent_paned.remove(child) + else: + self.window.destroy() return # don't show_title, we are dead elif self.get_num_controls() == 1: # we are going from two tabs to one show_tabs_if_one_tab = gajim.config.get('tabs_always_visible') @@ -542,7 +570,7 @@ class MessageWindow: first_composing_ind = -1 # id of first composing ctrl to switch to # if no others controls have awaiting events # loop until finding an unread tab or having done a complete cycle - while True: + while True: if forward == True: # look for the first unread tab on the right ind = ind + 1 if ind >= self.notebook.get_n_pages(): @@ -590,7 +618,7 @@ class MessageWindow: if old_no >= 0: old_ctrl = self._widget_to_control(notebook.get_nth_page(old_no)) old_ctrl.set_control_active(False) - + new_ctrl = self._widget_to_control(notebook.get_nth_page(page_num)) new_ctrl.set_control_active(True) self.show_title(control = new_ctrl) @@ -598,8 +626,8 @@ class MessageWindow: def _on_notebook_key_press(self, widget, event): 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): + 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 @@ -609,7 +637,7 @@ class MessageWindow: def setup_tab_dnd(self, child): '''Set tab label as drag source and connect the drag_data_get signal''' tab_label = self.notebook.get_tab_label(child) - tab_label.dnd_handler = tab_label.connect('drag_data_get', + tab_label.dnd_handler = tab_label.connect('drag_data_get', self.on_tab_label_drag_data_get_cb) self.handlers[tab_label.dnd_handler] = tab_label tab_label.drag_source_set(gtk.gdk.BUTTON1_MASK, self.DND_TARGETS, @@ -630,11 +658,11 @@ class MessageWindow: source_child = self.notebook.get_nth_page(source_page_num) if dest_page_num != source_page_num: self.notebook.reorder_child(source_child, dest_page_num) - + def get_tab_at_xy(self, x, y): '''Thanks to Gaim Return the tab under xy and - if its nearer from left or right side of the tab + if its nearer from left or right side of the tab ''' page_num = -1 to_right = False @@ -655,7 +683,7 @@ class MessageWindow: if (y >= tab_alloc.y) and \ (y <= (tab_alloc.y + tab_alloc.height)): page_num = i - + if y > tab_alloc.y + (tab_alloc.height / 2.0): to_right = True break @@ -679,36 +707,53 @@ class MessageWindow: tab_label.disconnect(tab_label.dnd_handler) ################################################################################ -class MessageWindowMgr: +class MessageWindowMgr(gobject.GObject): '''A manager and factory for MessageWindow objects''' + __gsignals__ = { + 'window-delete': (gobject.SIGNAL_RUN_LAST, None, (object,)), + } # These constants map to common.config.opt_one_window_types indices ( ONE_MSG_WINDOW_NEVER, ONE_MSG_WINDOW_ALWAYS, + ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER, ONE_MSG_WINDOW_PERACCT, - ONE_MSG_WINDOW_PERTYPE - ) = range(4) - # A key constant for the main window for all messages + ONE_MSG_WINDOW_PERTYPE, + ) = range(5) + # A key constant for the main window in ONE_MSG_WINDOW_ALWAYS mode MAIN_WIN = 'main' + # A key constant for the main window in ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER mode + ROSTER_MAIN_WIN = 'roster' - def __init__(self): + def __init__(self, parent_window, parent_paned): ''' A dictionary of windows; the key depends on the config: ONE_MSG_WINDOW_NEVER: The key is the contact JID - ONE_MSG_WINDOW_ALWAYS: The key is MessageWindowMgr.MAIN_WIN + ONE_MSG_WINDOW_ALWAYS: The key is MessageWindowMgr.MAIN_WIN + ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: The key is MessageWindowMgr.MAIN_WIN ONE_MSG_WINDOW_PERACCT: The key is the account name ONE_MSG_WINDOW_PERTYPE: The key is a message type constant''' + gobject.GObject.__init__(self) self._windows = {} + # Map the mode to a int constant for frequent compares mode = gajim.config.get('one_message_window') self.mode = common.config.opt_one_window_types.index(mode) + self.parent_win = parent_window + self.parent_paned = parent_paned + def change_account_name(self, old_name, new_name): for win in self.windows(): win.change_account_name(old_name, new_name) def _new_window(self, acct, type): - win = MessageWindow(acct, type) + parent_win = None + parent_paned = None + if self.mode == self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: + parent_win = self.parent_win + parent_paned = self.parent_paned + win = MessageWindow(acct, type, parent_win, parent_paned) # we track the lifetime of this window win.window.connect('delete-event', self._on_window_delete) win.window.connect('destroy', self._on_window_destroy) @@ -729,7 +774,7 @@ class MessageWindowMgr: def has_window(self, jid, acct): return self.get_window(jid, acct) != None - def one_window_opened(self, contact, acct, type): + def one_window_opened(self, contact=None, acct=None, type=None): try: return self._windows[self._mode_to_key(contact, acct, type)] != None except KeyError: @@ -737,12 +782,13 @@ class MessageWindowMgr: def _resize_window(self, win, acct, type): '''Resizes window according to config settings''' - if not gajim.config.get('saveposition'): - return - - if self.mode == self.ONE_MSG_WINDOW_ALWAYS: + if self.mode in (self.ONE_MSG_WINDOW_ALWAYS, + self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER): size = (gajim.config.get('msgwin-width'), gajim.config.get('msgwin-height')) + if self.mode == self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: + parent_size = win.window.get_size() + size = (parent_size[0] + size[0], size[1]) elif self.mode == self.ONE_MSG_WINDOW_PERACCT: size = (gajim.config.get_per('accounts', acct, 'msgwin-width'), gajim.config.get_per('accounts', acct, 'msgwin-height')) @@ -754,13 +800,12 @@ class MessageWindowMgr: size = (gajim.config.get(opt_width), gajim.config.get(opt_height)) else: return + win.resize(size[0], size[1]) - gtkgui_helpers.resize_window(win.window, size[0], size[1]) - def _position_window(self, win, acct, type): '''Moves window according to config settings''' - if not gajim.config.get('saveposition') or\ - self.mode == self.ONE_MSG_WINDOW_NEVER: + if (self.mode in [self.ONE_MSG_WINDOW_NEVER, + self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER]): return if self.mode == self.ONE_MSG_WINDOW_ALWAYS: @@ -782,21 +827,22 @@ class MessageWindowMgr: key = acct + contact.jid if resource: key += '/' + resource + return key elif self.mode == self.ONE_MSG_WINDOW_ALWAYS: - key = self.MAIN_WIN + return self.MAIN_WIN + elif self.mode == self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: + return self.ROSTER_MAIN_WIN elif self.mode == self.ONE_MSG_WINDOW_PERACCT: - key = acct + return acct elif self.mode == self.ONE_MSG_WINDOW_PERTYPE: - key = type - return key + return type def create_window(self, contact, acct, type, resource = None): - key = None win_acct = None win_type = None - win_role = 'messages' + win_role = None # X11 window role - key = self._mode_to_key(contact, acct, type, resource) + win_key = self._mode_to_key(contact, acct, type, resource) if self.mode == self.ONE_MSG_WINDOW_PERACCT: win_acct = acct win_role = acct @@ -806,21 +852,24 @@ class MessageWindowMgr: elif self.mode == self.ONE_MSG_WINDOW_NEVER: win_type = type win_role = contact.jid + elif self.mode == self.ONE_MSG_WINDOW_ALWAYS: + win_role = 'messages' win = None try: - win = self._windows[key] + win = self._windows[win_key] except KeyError: win = self._new_window(win_acct, win_type) - win.window.set_role(win_role) + if win_role: + win.window.set_role(win_role) # Position and size window based on saved state and window mode if not self.one_window_opened(contact, acct, type): - self._position_window(win, acct, type) self._resize_window(win, acct, type) + self._position_window(win, acct, type) - self._windows[key] = win + self._windows[win_key] = win return win def change_key(self, old_jid, new_jid, acct): @@ -842,6 +891,7 @@ class MessageWindowMgr: def _on_window_destroy(self, win): for k in self._windows.keys(): if self._windows[k].window == win: + self.emit('window-delete', self._windows[k]) del self._windows[k] return @@ -870,17 +920,16 @@ class MessageWindowMgr: for c in w.controls(): yield c - def shutdown(self): + def shutdown(self, width_adjust=0): for w in self.windows(): - self.save_state(w) - w.window.hide() - w.window.destroy() + self.save_state(w, width_adjust) + if not w.parent_paned: + w.window.hide() + w.window.destroy() + gajim.interface.save_config() - def save_state(self, msg_win): - if not gajim.config.get('saveposition'): - return - + def save_state(self, msg_win, width_adjust=0): # Save window size and position pos_x_key = 'msgwin-x-position' pos_y_key = 'msgwin-y-position' @@ -907,6 +956,9 @@ class MessageWindowMgr: type = msg_win.type size_width_key = type + '-msgwin-width' size_height_key = type + '-msgwin-height' + elif self.mode == self.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: + # Ignore any hpaned width + width = msg_win.notebook.allocation.width if acct: gajim.config.set_per('accounts', acct, size_width_key, width) @@ -915,11 +967,12 @@ class MessageWindowMgr: if self.mode != self.ONE_MSG_WINDOW_NEVER: gajim.config.set_per('accounts', acct, pos_x_key, x) gajim.config.set_per('accounts', acct, pos_y_key, y) - + else: + width += width_adjust gajim.config.set(size_width_key, width) gajim.config.set(size_height_key, height) - + if self.mode != self.ONE_MSG_WINDOW_NEVER: gajim.config.set(pos_x_key, x) gajim.config.set(pos_y_key, y) @@ -937,17 +990,24 @@ class MessageWindowMgr: controls = [] for w in self.windows(): - w.window.hide() + # Note, we are taking care not to hide/delete the roster window when the + # MessageWindow is embedded. + if not w.parent_paned: + w.window.hide() while w.notebook.get_n_pages(): page = w.notebook.get_nth_page(0) ctrl = w._widget_to_control(page) w.notebook.remove_page(0) page.unparent() controls.append(ctrl) - # Must clear _controls from window to prevent - # MessageControl.shutdown calls + # Must clear _controls from window to prevent MessageControl.shutdown calls w._controls = {} - w.window.destroy() + if not w.parent_paned: + w.window.destroy() + else: + # Don't close parent window, just remove the child + child = w.parent_paned.get_child2() + w.parent_paned.remove(child) self._windows = {} diff --git a/src/music_track_listener.py b/src/music_track_listener.py index 2b9ca6140..1867db981 100644 --- a/src/music_track_listener.py +++ b/src/music_track_listener.py @@ -18,6 +18,7 @@ ## You should have received a copy of the GNU General Public License ## along with Gajim. If not, see . ## +import os import gobject if __name__ == '__main__': # install _() func before importing dbus_support @@ -51,6 +52,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._mpris_playing_changed_cb, 'StatusChange', + 'org.freedesktop.MediaPlayer') + + ## Muine bus.add_signal_receiver(self._muine_music_track_change_cb, 'SongChanged', 'org.gnome.Muine.Player') @@ -60,30 +68,32 @@ class MusicTrackListener(gobject.GObject): 'org.gnome.Muine.Player') ## Rhythmbox - bus.add_signal_receiver(self._rhythmbox_music_track_change_cb, - 'playingUriChanged', 'org.gnome.Rhythmbox.Player') bus.add_signal_receiver(self._player_name_owner_changed, 'NameOwnerChanged', 'org.freedesktop.DBus', arg0='org.gnome.Rhythmbox') - bus.add_signal_receiver(self._player_playing_changed_cb, + bus.add_signal_receiver(self._rhythmbox_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() - dubus = banshee_bus.get_object('org.freedesktop.DBus', - '/org/freedesktop/dbus') - self.dubus_methods = dbus.Interface(dubus, 'org.freedesktop.DBus') - self.current_banshee_title = '' - self.banshee_paused_before = False - self.banshee_is_here = False - gobject.timeout_add(10000, self._check_if_banshee_bus) - if self.dubus_methods.NameHasOwner('org.gnome.Banshee'): - self._get_banshee_bus() - self.banshee_is_here = True - # Otherwise, it opens Banshee! - self.banshee_props ={} - gobject.timeout_add(1000, self._banshee_check_track_status) + # Banshee sucks because it only supports polling. + # Thus, we only register this is we are very sure that it's + # installed. + if os.name == 'posix' and os.system('which banshee >/dev/null 2>&1') == 0: + banshee_bus = dbus.SessionBus() + dubus = banshee_bus.get_object('org.freedesktop.DBus', + '/org/freedesktop/dbus') + self.dubus_methods = dbus.Interface(dubus, 'org.freedesktop.DBus') + self.current_banshee_title = '' + self.banshee_paused_before = False + self.banshee_is_here = False + gobject.timeout_add(10000, self._check_if_banshee_bus) + if self.dubus_methods.NameHasOwner('org.gnome.Banshee'): + self._get_banshee_bus() + self.banshee_is_here = True + # 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'): @@ -116,6 +126,40 @@ 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() + + if song.has_key('title'): + info.title = song['title'] + else: + info.title = '' + + if song.has_key('album'): + info.album = song['album'] + else: + info.album = '' + + if song.has_key('artist'): + info.artist = song['artist'] + else: + info.artist = '' + + if song.has_key('length'): + info.duration = int(song['length']) + else: + info.duration = 0 + + return info + + def _mpris_playing_changed_cb(self, playing): + if playing == 0: + self.emit('music-track-changed', self._last_playing_music) + else: + self.emit('music-track-changed', None) + + def _mpris_music_track_change_cb(self, arg): + self._last_playing_music = self._mpris_properties_extract(arg) + def _muine_properties_extract(self, song_string): d = dict((x.strip() for x in s1.split(':', 1)) for s1 in \ song_string.split('\n')) @@ -131,6 +175,13 @@ class MusicTrackListener(gobject.GObject): info = self._muine_properties_extract(arg) self.emit('music-track-changed', info) + def _rhythmbox_playing_changed_cb(self, playing): + if playing: + info = self.get_playing_track() + self.emit('music-track-changed', info) + else: + self.emit('music-track-changed', None) + def _rhythmbox_properties_extract(self, props): info = MusicTrackInfo() info.title = props['title'] @@ -139,17 +190,6 @@ class MusicTrackListener(gobject.GObject): info.duration = int(props['duration']) info.track_number = int(props['track-number']) 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') - rbshell = dbus.Interface(rbshellobj, 'org.gnome.Rhythmbox.Shell') - props = rbshell.getSongProperties(uri) - info = self._rhythmbox_properties_extract(props) - self.emit('music-track-changed', info) def _banshee_check_track_status(self): if self.dubus_methods.NameHasOwner('org.gnome.Banshee') and \ diff --git a/src/notify.py b/src/notify.py index 01974d688..6106227c3 100644 --- a/src/notify.py +++ b/src/notify.py @@ -170,17 +170,25 @@ def notify(event, jid, account, parameters, advanced_notif_num = None): nickname = parameters[2] if gajim.config.get('notification_preview_message'): message = parameters[3] + if message.startswith('/me ') or message.startswith('/me\n'): + message = '* ' + nickname + message[3:] else: # We don't want message preview, do_preview = False message = '' + focused = parameters[4] if helpers.allow_showing_notification(account, 'notify_on_new_message', advanced_notif_num, is_first_message): do_popup = True if is_first_message and helpers.allow_sound_notification( 'first_message_received', advanced_notif_num): do_sound = True - elif not is_first_message and helpers.allow_sound_notification( - 'next_message_received', advanced_notif_num): + elif not is_first_message and focused and \ + helpers.allow_sound_notification('next_message_received_focused', + advanced_notif_num): + do_sound = True + elif not is_first_message and not focused and \ + helpers.allow_sound_notification('next_message_received_unfocused', + advanced_notif_num): do_sound = True else: print '*Event not implemeted yet*' @@ -283,8 +291,10 @@ def notify(event, jid, account, parameters, advanced_notif_num = None): pass # do not set snd_event elif is_first_message: snd_event = 'first_message_received' + elif focused: + snd_event = 'next_message_received_focused' else: - snd_event = 'next_message_received' + snd_event = 'next_message_received_unfocused' elif event in ('contact_connected', 'contact_disconnected'): snd_event = event if snd_file: diff --git a/src/osx/.deps/idle_la-idle.Plo b/src/osx/.deps/idle_la-idle.Plo deleted file mode 100644 index 9ce06a81e..000000000 --- a/src/osx/.deps/idle_la-idle.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/src/osx/.deps/nsapp.Plo b/src/osx/.deps/nsapp.Plo deleted file mode 100644 index 9ce06a81e..000000000 --- a/src/osx/.deps/nsapp.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/src/osx/growl/.deps/_growlImage.Plo b/src/osx/growl/.deps/_growlImage.Plo deleted file mode 100644 index 9ce06a81e..000000000 --- a/src/osx/growl/.deps/_growlImage.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/src/osx/growl/.deps/_growl_la-_growl.Plo b/src/osx/growl/.deps/_growl_la-_growl.Plo deleted file mode 100644 index 9ce06a81e..000000000 --- a/src/osx/growl/.deps/_growl_la-_growl.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/src/osx/idle.c b/src/osx/idle.c index c24c30438..badad7fba 100644 --- a/src/osx/idle.c +++ b/src/osx/idle.c @@ -114,6 +114,7 @@ static PyObject * idle_getIdleSec(PyObject *self, PyObject *args) else { printf("Couldn't grab properties of system\n"); + return NULL; } if (obj) diff --git a/src/osx/syncmenu/.deps/syncmenu_la-pysyncmenu.Plo b/src/osx/syncmenu/.deps/syncmenu_la-pysyncmenu.Plo deleted file mode 100644 index 9ce06a81e..000000000 --- a/src/osx/syncmenu/.deps/syncmenu_la-pysyncmenu.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/src/osx/syncmenu/.deps/syncmenu_la-sync-menu.Plo b/src/osx/syncmenu/.deps/syncmenu_la-sync-menu.Plo deleted file mode 100644 index 9ce06a81e..000000000 --- a/src/osx/syncmenu/.deps/syncmenu_la-sync-menu.Plo +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/src/remote_control.py b/src/remote_control.py index 3bde37b72..5049c5606 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -6,6 +6,7 @@ ## Copyright (C) 2005-2006 Andrew Sayman ## Copyright (C) 2007 Lukas Petrovicky ## Copyright (C) 2007 Julien Pivotto +## Copyright (C) 2007 Travis Shirk ## ## This file is part of Gajim. ## @@ -373,7 +374,6 @@ class SignalObject(dbus.service.Object): if not specified status is changed for all accounts. ''' if status not in ('offline', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible'): - raise InvalidArgument return DBUS_BOOLEAN(False) if account: gobject.idle_add(gajim.interface.roster.send_status, account, @@ -615,7 +615,10 @@ class SignalObject(dbus.service.Object): for contact in contacts: resource_props = dbus.Struct((DBUS_STRING(contact.resource), dbus.Int32(contact.priority), DBUS_STRING(contact.status))) - contact_dict['resources'].append(resource_props) + contact_dict['resources'].append(resource_props) + contact_dict['groups'] = dbus.Array([], signature='s') + for group in prim_contact.groups: + contact_dict['groups'].append(DBUS_STRING(group)) return contact_dict @dbus.service.method(INTERFACE, in_signature='', out_signature='s') @@ -654,4 +657,4 @@ class SignalObject(dbus.service.Object): gajim.interface.instances[account]['join_gc'] = \ JoinGroupchatWindow(account, room_jid, nick) else: - gajim.connections[account].join_gc(nick, room_jid, password) + gajim.interface.roster.join_gc_room(account, room_jid, nick, password) diff --git a/src/roster_window.py b/src/roster_window.py index da17f4c3b..876d3e81e 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -3,10 +3,11 @@ ## ## Copyright (C) 2003-2007 Yann Leboulanger ## Copyright (C) 2005-2007 Nikos Kouremenos +## Travis Shirk ## Copyright (C) 2005-2006 Dimitur Kirov ## Copyright (C) 2007 Lukas Petrovicky ## Copyright (C) 2007 Julien Pivotto -## Copyright (C) 2007 Stephan Erb +## Copyright (C) 2007 Stephan Erb ## ## This file is part of Gajim. ## @@ -29,7 +30,6 @@ import gobject import os import sys import time -import urllib import common.sleepy import history_window @@ -62,7 +62,6 @@ if dbus_support.supported: import dbus from lastfm_track_listener import LastFMTrackListener -import sys if sys.platform == 'darwin': from osx import syncmenu @@ -74,8 +73,9 @@ C_NAME, # cellrenderer text that holds contact nickame C_TYPE, # account, group or contact? C_JID, # the jid of the row C_ACCOUNT, # cellrenderer text that holds account name -C_SECPIXBUF, # secondary_pixbuf (holds avatar or padlock) -) = range(6) +C_AVATAR_PIXBUF, # avatar_pixbuf +C_PADLOCK_PIXBUF, # use for account row only +) = range(7) class RosterWindow: '''Class for main window of the GTK+ interface''' @@ -191,7 +191,7 @@ class RosterWindow: if self.regroup: show = helpers.get_global_show() model.append(None, [self.jabber_state_images['16'][show], - _('Merged accounts'), 'account', '', 'all', None]) + _('Merged accounts'), 'account', '', 'all', None, None]) self.draw_account(account) return @@ -206,42 +206,30 @@ class RosterWindow: model.append(None, [self.jabber_state_images['16'][show], gobject.markup_escape_text(account), - 'account', our_jid, account, tls_pixbuf]) + 'account', our_jid, account, None, tls_pixbuf]) def draw_account(self, account): + if account in self.draw_account_id: + return + self.draw_account_id[account] = gobject.timeout_add(500, + self.really_draw_account, account) + + def really_draw_account(self, account): + if account in self.draw_account_id: + del self.draw_account_id[account] model = self.tree.get_model() iter = self.get_account_iter(account) - if self.regroup: - accounts = gajim.connections.keys() - else: - accounts = [account] - num_of_accounts = len(accounts) + + num_of_accounts = gajim.get_number_of_connected_accounts() num_of_secured = gajim.get_number_of_securely_connected_accounts() - if num_of_secured and gajim.con_types.has_key(account) and \ - gajim.con_types[account] in ('tls', 'ssl'): + + if gajim.account_is_securely_connected(account) and not self.regroup or \ + self.regroup and num_of_secured and num_of_secured == num_of_accounts: tls_pixbuf = self.window.render_icon(gtk.STOCK_DIALOG_AUTHENTICATION, gtk.ICON_SIZE_MENU) # the only way to create a pixbuf from stock - if num_of_secured < num_of_accounts: - # Make it transparent - colorspace = tls_pixbuf.get_colorspace() - bps = tls_pixbuf.get_bits_per_sample() - rowstride = tls_pixbuf.get_rowstride() - pixels = tls_pixbuf.get_pixels() - new_pixels = '' - width = tls_pixbuf.get_width() - height = tls_pixbuf.get_height() - for i in range(0, width*height): - rgb = pixels[4*i:4*i+3] - new_pixels += rgb - if rgb == chr(0)*3: - new_pixels += chr(0) - else: - new_pixels += chr(128) - tls_pixbuf = gtk.gdk.pixbuf_new_from_data(new_pixels, colorspace, - True, bps, width, height, rowstride) - model[iter][C_SECPIXBUF] = tls_pixbuf + model[iter][C_PADLOCK_PIXBUF] = tls_pixbuf else: - model[iter][C_SECPIXBUF] = None + model[iter][C_PADLOCK_PIXBUF] = None path = model.get_path(iter) account_name = account accounts = [account] @@ -256,7 +244,7 @@ class RosterWindow: 'show_contacts_number'): nbr_on, nbr_total = gajim.contacts.get_nb_online_total_contacts( accounts = accounts) - account_name += ' (%s/%s)' % (repr(nbr_on),repr(nbr_total)) + account_name += ' (%s/%s)' % (repr(nbr_on), repr(nbr_total)) model[iter][C_NAME] = account_name def remove_newly_added(self, jid, account): @@ -343,9 +331,11 @@ class RosterWindow: name = contact.get_shown_name() for i in parent_iters: # we add some values here. see draw_contact for more - model.append(i, (None, name, 'contact', jid, account, None)) + model.append(i, (None, name, 'contact', jid, account, None, + None)) self.draw_contact(jid, account) - self.draw_avatar(jid, account) + if gajim.config.get('show_avatars_in_roster'): + self.draw_avatar(jid, account) self.draw_account(account) # Redraw parent to change icon self.draw_contact(big_brother_jid, big_brother_account) @@ -378,7 +368,7 @@ class RosterWindow: iterG = model.append(IterAcct, [ self.jabber_state_images['16']['closed'], gobject.markup_escape_text(group), 'group', - group, account, None]) + group, account, None, None]) self.draw_group(group, account) if model.iter_n_children(IterAcct) == 1: # We added the first one self.draw_account(account) @@ -399,12 +389,14 @@ class RosterWindow: name = contact.get_shown_name() # we add some values here. see draw_contact for more - model.append(iterG, (None, name, typestr, contact.jid, account, None)) + model.append(iterG, (None, name, typestr, contact.jid, account, None, + None)) if gajim.groups[account][group]['expand']: self.tree.expand_row(model.get_path(iterG), False) self.draw_contact(jid, account) - self.draw_avatar(jid, account) + if gajim.config.get('show_avatars_in_roster'): + self.draw_avatar(jid, account) self.draw_account(account) # put the children under this iter for data in shown_family: @@ -413,6 +405,16 @@ class RosterWindow: self.add_contact_to_roster(data['jid'], data['account']) def draw_group(self, group, account): + key = (group, account) + if key in self.draw_group_id: + return + self.draw_group_id[key] = gobject.timeout_add(500, + self.really_draw_group, group, account) + + def really_draw_group(self, group, account): + key = (group, account) + if key in self.draw_group_id: + del self.draw_group_id[key] iter = self.get_group_iter(group, account) if not iter: return @@ -494,7 +496,7 @@ class RosterWindow: model = self.tree.get_model() iterAcct = self.get_account_iter(account) model.append(iterAcct, (None, gajim.nicks[account], 'self_contact', jid, - account, None)) + account, None, None)) self.draw_contact(jid, account) self.draw_avatar(jid, account) @@ -538,7 +540,15 @@ class RosterWindow: gajim.account_is_disconnected(account))) and nb_events == 0: self.remove_contact(contact, account) else: - self.draw_contact(contact.jid, account) + # If it's a metacontact, big brother may have changed, so remove and + # re-add + model = self.tree.get_model() + iters = self.get_contact_iter(contact.jid, account) + if iters and model.iter_has_child(iters[0]): + self.remove_contact(contact, account) + self.add_contact_to_roster(contact.jid, account) + else: + self.draw_contact(contact.jid, account) def remove_contact(self, contact, account): '''Remove a contact from the roster''' @@ -763,7 +773,7 @@ class RosterWindow: else: scaled_pixbuf = None for iter in iters: - model[iter][C_SECPIXBUF] = scaled_pixbuf + model[iter][C_AVATAR_PIXBUF] = scaled_pixbuf def join_gc_room(self, account, room_jid, nick, password, minimize=False, is_continued=False): @@ -931,7 +941,11 @@ class RosterWindow: 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') + 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() @@ -954,6 +968,11 @@ class RosterWindow: self.new_chat_menuitem_handler_id) self.new_chat_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 + if self.single_message_menuitem_handler_id: single_message_menuitem.handler_disconnect( self.single_message_menuitem_handler_id) @@ -964,7 +983,6 @@ class RosterWindow: 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() @@ -973,6 +991,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: @@ -1010,7 +1029,7 @@ class RosterWindow: if gajim.config.get_per('accounts', account, 'is_zeroconf'): continue - + # single message single_message_item = gtk.MenuItem(_('using account %s') % account, False) @@ -1131,7 +1150,15 @@ 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: + if gajim.connections[account].pep_supported: + # 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 profile_avatar_item = gtk.MenuItem(_('of account %s') % account, False) @@ -1140,18 +1167,27 @@ class RosterWindow: 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) + 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) # Advanced Actions if len(gajim.connections) == 0: # user has no accounts @@ -1211,8 +1247,9 @@ class RosterWindow: 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 + + # user has at least one bookmark + if len(gajim.connections[account].bookmarks) > 0: item = gtk.SeparatorMenuItem() # separator gc_sub_menu.append(item) @@ -1275,18 +1312,18 @@ class RosterWindow: gajim.contacts.clear_contacts(account) for jid in array.keys(): jids = jid.split('/') - #get jid + # get jid ji = jids[0] - #get resource + # get resource resource = '' if len(jids) > 1: resource = '/'.join(jids[1:]) - #get name + # get name name = array[jid]['name'] if not name: name = '' show = 'offline' # show is offline by default - status = '' #no status message by default + status = '' # no status message by default keyID = '' attached_keys = gajim.config.get_per('accounts', account, @@ -1339,12 +1376,11 @@ class RosterWindow: # 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 + if len(contact_instances) > 1: + if contact.resource != '': + name += '/' + contact.resource + if show in ('offline', 'error') and \ + len(gajim.events.get_events(account, contact.get_full_jid())) == 0: jid_with_resource = contact.jid + '/' + contact.resource if gajim.interface.msg_win_mgr.has_window(jid_with_resource, account): @@ -1354,8 +1390,6 @@ 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 @@ -1412,7 +1446,6 @@ class RosterWindow: return info[contact.jid] = vcard.ZeroconfVcardWindow(contact, account) - def show_tooltip(self, contact): pointer = self.tree.get_pointer() props = self.tree.get_path_at_pos(pointer[0], pointer[1]) @@ -1498,7 +1531,10 @@ class RosterWindow: name = account_name, show = connection.get_status(), sub = '', status = connection.status, resource = connection.server_resource, - priority = connection.priority) + priority = connection.priority, + mood = connection.mood, + tune = connection.tune, + activity = connection.activity) if gajim.connections[account].gpg: contact.keyID = gajim.config.get_per('accounts', connection.name, 'keyid') @@ -1878,12 +1914,11 @@ class RosterWindow: if keyID[0] == _('None'): if contact.jid in keys: del keys[contact.jid] - for u in gajim.contacts.get_contacts(account, contact.jid): - u.keyID = '' + keyID = '' else: - keys[contact.jid] = keyID[0] - for u in gajim.contacts.get_contacts(account, contact.jid): - u.keyID = keyID[0] + keyID = keyID[0] + keys[contact.jid] = keyID + if gajim.interface.msg_win_mgr.has_window(contact.jid, account): ctrl = gajim.interface.msg_win_mgr.get_control(contact.jid, account) ctrl.update_ui() @@ -1891,6 +1926,9 @@ class RosterWindow: for jid in keys: keys_str += jid + ' ' + keys[jid] + ' ' gajim.config.set_per('accounts', account, 'attached_gpg_keys', keys_str) + for u in gajim.contacts.get_contacts(account, contact.jid): + u.keyID = helpers.prepare_and_validate_gpg_keyID(account, + contact.jid, keyID) def update_avatar_in_gui(self, jid, account): # Update roster @@ -1910,7 +1948,7 @@ class RosterWindow: if os.path.isfile(path_to_file): stat = os.stat(path_to_file) if stat[6] == 0: - invalid_file = True + invalid_file = True msg = _('File is empty') else: invalid_file = True @@ -1990,6 +2028,104 @@ class RosterWindow: def on_add_special_notification_menuitem_activate(self, widget, jid): dialogs.AddSpecialNotificationDialog(jid) + def build_resources_submenu(self, contacts, account, action, room_jid=None, + room_account=None): + ''' 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(helpers.get_iconset_path(iconset), '16x16') + for c in contacts: + # icon MUST be different instance for every item + state_images = self.load_iconset(path) + item = gtk.ImageMenuItem('%s (%s)' % (c.resource, str(c.priority))) + icon_name = helpers.get_icon_name_to_show(c, account) + icon = state_images[icon_name] + item.set_image(icon) + sub_menu.append(item) + if action == self.on_invite_to_room: + 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) + else: # start_chat, execute_command, send_file + item.connect('activate', action, c, account, c.resource) + return sub_menu + + def build_invite_submenu(self, invite_menuitem, list_): + '''list_ in a list of (contact, account)''' + # used if we invite only one contact with several resources + contact_list = [] + if len(list_) == 1: + contact, account = list_[0] + contact_list = gajim.contacts.get_contacts(account, contact.jid) + contacts_transport = -1 + connected_accounts = [] + # -1 is at start, False when not from the same, None when jabber + for (contact, account) in list_: + if not account in connected_accounts: + connected_accounts.append(account) + transport = gajim.get_transport_name_from_jid(contact.jid) + if contacts_transport == -1: + contacts_transport = transport + elif contacts_transport != transport: + contacts_transport = False + + if contacts_transport == False: + # they are not all from the same transport + invite_menuitem.set_sensitive(False) + return + invite_to_submenu = gtk.Menu() + invite_menuitem.set_submenu(invite_to_submenu) + 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) + if len(contact_list) > 1: # several resources + invite_to_new_room_menuitem.set_submenu(self.build_resources_submenu( + contact_list, account, self.on_invite_to_new_room)) + else: + invite_to_new_room_menuitem.connect('activate', + self.on_invite_to_new_room, list_) + # transform None in 'jabber' + c_t = contacts_transport or 'jabber' + muc_jid = {} + for account in connected_accounts: + for t in gajim.connections[account].muc_jid: + muc_jid[t] = gajim.connections[account].muc_jid[t] + if not muc_jid.has_key(c_t): + invite_to_new_room_menuitem.set_sensitive(False) + rooms = [] # a list of (room_jid, account) tuple + invite_to_submenu.append(invite_to_new_room_menuitem) + rooms = [] # a list of (room_jid, account) tuple + minimized_controls = [] + for account in connected_accounts: + minimized_controls += \ + gajim.interface.minimized_controls[account].values() + for gc_control in gajim.interface.msg_win_mgr.get_controls( + message_control.TYPE_GC) + minimized_controls: + acct = gc_control.account + room_jid = gc_control.room_jid + if gajim.gc_connected[acct].has_key(room_jid) and \ + gajim.gc_connected[acct][room_jid] and \ + contacts_transport == gajim.get_transport_name_from_jid(room_jid): + rooms.append((room_jid, acct)) + if len(rooms): + item = gtk.SeparatorMenuItem() # separator + invite_to_submenu.append(item) + for (room_jid, account) in rooms: + menuitem = gtk.MenuItem(room_jid.split('@')[0]) + if len(contact_list) > 1: # several resources + menuitem.set_submenu(self.build_resources_submenu( + contact_list, account, self.on_invite_to_new_room, room_jid, + account)) + else: + menuitem.connect('activate', self.on_invite_to_room, list_, + room_jid, account) + invite_to_submenu.append(menuitem) + def make_contact_menu(self, event, iter): '''Make contact\'s popup menu''' model = self.tree.get_model() @@ -2000,7 +2136,7 @@ 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') @@ -2156,7 +2292,7 @@ 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: + else: icon = gtk.image_new_from_stock(gtk.STOCK_NETWORK, gtk.ICON_SIZE_MENU) send_custom_status_menuitem.set_image(icon) @@ -2172,6 +2308,8 @@ class RosterWindow: if muc_icon: invite_menuitem.set_image(muc_icon) + self.build_invite_submenu(invite_menuitem, [(contact, account)]) + # Subscription submenu subscription_menuitem = xml.get_widget('subscription_menuitem') send_auth_menuitem, ask_auth_menuitem, revoke_auth_menuitem =\ @@ -2185,31 +2323,6 @@ class RosterWindow: 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')) - 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) - t = contact_transport or 'jabber' # transform None in 'jabber' - if not gajim.connections[account].muc_jid.has_key(t): - 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( - 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 \ - gajim.gc_connected[acct][room_jid] and \ - contact_transport == gajim.get_transport_name_from_jid(room_jid): - rooms.append((room_jid, acct)) - if len(rooms): - 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) @@ -2225,46 +2338,12 @@ class RosterWindow: 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. - 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(helpers.get_iconset_path(iconset), '16x16') - for c in contacts: - # icon MUST be different instance for every item - state_images = self.load_iconset(path) - item = gtk.ImageMenuItem('%s (%s)' % (c.resource, - str(c.priority))) - icon_name = helpers.get_icon_name_to_show(c, account) - icon = state_images[icon_name] - item.set_image(icon) - sub_menu.append(item) - if action == self.on_invite_to_room: - 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) - else: # start_chat, execute_command - item.connect('activate', action, c, account, c.resource) - return sub_menu - - 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( - 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, - room_jid, room_account)) - invite_to_submenu.append(menuitem) + start_chat_menuitem.set_submenu(self.build_resources_submenu(contacts, + account, self.on_open_chat_window)) + send_file_menuitem.set_submenu(self.build_resources_submenu(contacts, + account, self.on_send_file_menuitem_activate)) + execute_command_menuitem.set_submenu(self.build_resources_submenu( + contacts, account, self.on_execute_command)) else: # one resource start_chat_menuitem.connect('activate', @@ -2278,16 +2357,6 @@ class RosterWindow: 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)], - 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, - our_jid_other_resource) - invite_to_submenu.append(menuitem) - if contact.resource: send_file_menuitem.connect('activate', self.on_send_file_menuitem_activate, contact, account) @@ -2362,7 +2431,7 @@ class RosterWindow: widget.set_sensitive(False) if gajim.connections[account] and gajim.connections[account].\ - privacy_rules_supported: + 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) @@ -2431,24 +2500,14 @@ class RosterWindow: model = self.tree.get_model() list_ = [] # list of (jid, account) tuples one_account_offline = False - 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') if gajim.connections[account].connected < 2: one_account_offline = True - elif not account in connected_accounts: - connected_accounts.append(account) contact = gajim.contacts.get_contact_with_highest_priority(account, jid) - transport = gajim.get_transport_name_from_jid(contact.jid) - if contacts_transport == -1: - 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)) @@ -2468,51 +2527,14 @@ class RosterWindow: 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')) 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) - else: - - sub_menu = gtk.Menu() - menuitem = gtk.ImageMenuItem(_('_New group chat')) - icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) - menuitem.set_image(icon) - menuitem.connect('activate', self.on_invite_to_new_room, list_) - muc_jid = {} - c_t = contacts_transport or 'jabber' # transform None in 'jabber' - for account in connected_accounts: - for t in gajim.connections[account].muc_jid: - muc_jid[t] = gajim.connections[account].muc_jid[t] - if not muc_jid.has_key(c_t): - menuitem.set_sensitive(False) - 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) + \ - 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 \ - gajim.gc_connected[account][room_jid] and \ - contacts_transport == gajim.get_transport_name_from_jid(room_jid): - rooms.append((room_jid, account)) - if len(rooms): - item = gtk.SeparatorMenuItem() # separator - sub_menu.append(item) - for (room_jid, account) in rooms: - menuitem = gtk.MenuItem(room_jid.split('@')[0]) - menuitem.connect('activate', self.on_invite_to_room, list_, - room_jid, account) - sub_menu.append(menuitem) - - invite_item.set_submenu(sub_menu) + self.build_invite_submenu(invite_item, list_) menu.append(invite_item) item = gtk.SeparatorMenuItem() # separator @@ -2525,7 +2547,7 @@ class RosterWindow: 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) @@ -2553,7 +2575,7 @@ class RosterWindow: if not gajim.connections[account].privacy_rules_supported: block_menuitem.set_sensitive(False) - # Remove + # Remove remove_item = gtk.ImageMenuItem(_('_Remove')) icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU) remove_item.set_image(icon) @@ -2586,17 +2608,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) - + 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) @@ -2626,7 +2648,7 @@ class RosterWindow: 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, \ + mw = gajim.interface.msg_win_mgr.create_window(ctrl.contact, ctrl.account, ctrl.type_id) ctrl.parent_win = mw mw.new_tab(ctrl) @@ -2669,7 +2691,7 @@ class RosterWindow: 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, \ + maximize_menuitem.connect('activate', self.on_all_groupchat_maximized,\ list_) menu.append(maximize_menuitem) else: @@ -2693,6 +2715,15 @@ class RosterWindow: group_message_to_all_item.connect('activate', self.on_send_single_message_menuitem_activate, account, list_) + # Invite to + invite_menuitem = gtk.ImageMenuItem(_('In_vite to')) + muc_icon = self.load_icon('muc_active') + if muc_icon: + invite_menuitem.set_image(muc_icon) + + self.build_invite_submenu(invite_menuitem, list_online) + menu.append(invite_menuitem) + # Send Custom Status send_custom_status_menuitem = gtk.ImageMenuItem(_('Send Cus_tom Status')) # add a special img for this menuitem @@ -2717,7 +2748,7 @@ 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) @@ -2770,11 +2801,11 @@ class RosterWindow: 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) @@ -2797,28 +2828,6 @@ class RosterWindow: contact = gajim.contacts.get_contact_with_highest_priority(account, jid) menu = gtk.Menu() - # Connect/Didconnect - show = contact.show - if (show != 'offline' and show != 'error') or\ - gajim.account_is_disconnected(account): - # 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 == 'error': - item.set_sensitive(False) - - 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) @@ -2827,32 +2836,40 @@ class RosterWindow: self.on_send_single_message_menuitem_activate, account, contact) menu.append(item) + blocked = False + if jid in gajim.connections[account].blocked_contacts: + blocked = True + # 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])) + if blocked: + send_custom_status_menuitem.set_image(self.load_icon('offline')) + send_custom_status_menuitem.set_sensitive(False) 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) + 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) @@ -2895,10 +2912,24 @@ class RosterWindow: item.connect('activate', self.on_rename, iter, path) if gajim.account_is_disconnected(account): item.set_sensitive(False) - + item = gtk.SeparatorMenuItem() # separator manage_transport_submenu.append(item) + # Block + if blocked: + item = gtk.ImageMenuItem(_('_Unblock')) + item.connect('activate', self.on_unblock, iter, None) + else: + item = gtk.ImageMenuItem(_('_Block')) + item.connect('activate', self.on_block, iter, None) + + icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) + item.set_image(icon) + manage_transport_submenu.append(item) + if gajim.account_is_disconnected(account): + item.set_sensitive(False) + # Remove item = gtk.ImageMenuItem(_('_Remove')) icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU) @@ -2907,7 +2938,7 @@ class RosterWindow: 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) @@ -2945,6 +2976,12 @@ class RosterWindow: if url: 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) + def on_change_status_message_activate(self, widget, account): show = gajim.SHOW_LIST[gajim.connections[account].connected] dlg = dialogs.ChangeStatusMessageDialog(show) @@ -3010,6 +3047,23 @@ 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 and gajim.config.get('use_pep'): + pep_submenu = gtk.Menu() + pep_menuitem.set_submenu(pep_submenu) + 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() + if not gajim.connections[account].gmail_url: open_gmail_inbox_menuitem.set_no_show_all(True) open_gmail_inbox_menuitem.hide() @@ -3027,8 +3081,8 @@ 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', + + start_chat_menuitem.connect('activate', self.on_new_chat_menuitem_activate, account) gc_sub_menu = gtk.Menu() # gc is always a submenu @@ -3038,8 +3092,7 @@ 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, + join_group_chat_menuitem, execute_command_menuitem, pep_menuitem, start_chat_menuitem]: widget.set_sensitive(False) else: @@ -3285,7 +3338,6 @@ class RosterWindow: model, list_of_paths = self.tree.get_selection().get_selected_rows() except TypeError: list_of_paths = [] - pass if path not in list_of_paths: self.tree.get_selection().unselect_all() self.tree.get_selection().select_path(path) @@ -3296,7 +3348,6 @@ class RosterWindow: model, list_of_paths = self.tree.get_selection().get_selected_rows() except TypeError: list_of_paths = [] - pass if list_of_paths != [path]: self.tree.get_selection().unselect_all() self.tree.get_selection().select_path(path) @@ -3328,11 +3379,17 @@ class RosterWindow: elif event.button == 1: # Left click model = self.tree.get_model() type_ = model[path][C_TYPE] + # x_min is the x start position of status icon column + if gajim.config.get('avatar_position_in_roster') == 'left': + x_min = gajim.config.get('roster_avatar_width') + else: + x_min = 0 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): + if x > x_min and x < x_min + 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) @@ -3347,8 +3404,8 @@ class RosterWindow: # 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) + return else: if type_ == 'group' and x < 27: # first cell in 1st column (the arrow SINGLE clicked) @@ -3357,7 +3414,7 @@ class RosterWindow: else: self.tree.expand_row(path, False) - elif type_ == 'contact' and x < 27: + elif type_ == 'contact' and x > x_min and x < x_min + 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) @@ -3451,7 +3508,8 @@ class RosterWindow: text = _('Enter your password for account %s') % account if passwords.USER_HAS_GNOMEKEYRING and \ not passwords.USER_USES_GNOMEKEYRING: - text += '\n' + _('Gnome Keyring is installed but not correctly started (environment variable probably not correctly set)') + text += '\n' + _('Gnome Keyring is installed but not correctly started\ + (environment variable probably not correctly set)') w = dialogs.PassphraseDialog(_('Password Required'), text, _('Save password')) passphrase, save = w.run() @@ -3555,13 +3613,17 @@ class RosterWindow: message = dlg.run() if message is not None: # None if user pressed Cancel for (contact, account) in contact_list: + our_jid = gajim.get_jid_from_account(account) 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) + jid = contact.jid + if jid == our_jid: + jid += '/' + contact.resource + self.send_status(account, show, message, to=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 @@ -3582,9 +3644,9 @@ class RosterWindow: self.update_status_combobox() return status = model[active][2].decode('utf-8') - statuses_unified = helpers.statuses_unified() + statuses_unified = helpers.statuses_unified() # status "desync'ed" or not 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) + # 'Change status message' selected: # do not change show, just show change status dialog status = model[self.previous_status_combobox_active][2].decode('utf-8') dlg = dialogs.ChangeStatusMessageDialog(status) @@ -3659,18 +3721,18 @@ class RosterWindow: # do nothing if user doesn't have D-Bus bindings return if enabled: + listener = MusicTrackListener.get() if self._music_track_changed_signal is None: - 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) ## enable setting status msg from a Last.fm account def enable_syncing_status_msg_from_lastfm(self, enabled): @@ -3718,7 +3780,43 @@ 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=''): + 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 = '' + source = '' + track = '' + length = '' + else: + artist = music_track_info.artist + title = music_track_info.title + source = music_track_info.album + if account == '': + for account in accounts: + if not gajim.account_is_connected(account): + continue + if not gajim.config.get('use_pep') and 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: + pep.user_send_tune(account, artist, title, source) + return + # No PEP accounts = gajim.connections.keys() if music_track_info is None: status_message = '' @@ -3768,8 +3866,8 @@ class RosterWindow: 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]) + 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 @@ -3803,15 +3901,12 @@ class RosterWindow: else: # No need to redraw contacts if we're quitting if accountIter: - model[accountIter][C_SECPIXBUF] = None + model[accountIter][C_AVATAR_PIXBUF] = 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: + for contact in [c for c in lcontact if c.show != 'offline']: self.chg_contact_status(contact, 'offline', '', account) self.actions_menu_needs_rebuild = True self.update_status_combobox() @@ -4002,6 +4097,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) @@ -4050,7 +4152,7 @@ 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() @@ -4152,20 +4254,30 @@ class RosterWindow: def quit_gtkgui_interface(self): '''When we quit the gtk interface : tell that to the core and exit gtk''' - if gajim.config.get('saveposition'): - # in case show_roster_on_start is False and roster is never shown - # window.window is None - if self.window.window is not None: - x, y = self.window.window.get_root_origin() - gajim.config.set('roster_x-position', x) - gajim.config.set('roster_y-position', y) - width, height = self.window.get_size() - gajim.config.set('roster_width', width) - gajim.config.set('roster_height', height) + msgwin_width_adjust = 0 + + # in case show_roster_on_start is False and roster is never shown + # window.window is None + if self.window.window is not None: + x, y = self.window.window.get_root_origin() + gajim.config.set('roster_x-position', x) + gajim.config.set('roster_y-position', y) + width, height = self.window.get_size() + # For the width use the size of the vbox containing the tree and + # status combo, this will cancel out any hpaned width + width = self.xml.get_widget('roster_vbox2').allocation.width + gajim.config.set('roster_width', width) + gajim.config.set('roster_height', height) + if not self.xml.get_widget('roster_vbox2').get_property('visible'): + # The roster vbox is hidden, so the message window is larger + # then we want to save (i.e. the window will grow every startup) + # so adjust. + msgwin_width_adjust = -1 * width + gajim.config.set('show_roster_on_startup', self.window.get_property('visible')) - gajim.interface.msg_win_mgr.shutdown() + gajim.interface.msg_win_mgr.shutdown(msgwin_width_adjust) gajim.config.set('collapsed_rows', '\t'.join(self.collapsed_rows)) gajim.interface.save_config() @@ -4567,6 +4679,25 @@ class RosterWindow: gajim.config.set('showoffline', not gajim.config.get('showoffline')) self.draw_roster() + def on_view_menu_activate(self, widget): + # Hide the show roster menu if we are not in the right windowing mode. + if self.hpaned.get_child2() is not None: + self.xml.get_widget('show_roster_menuitem').show() + else: + self.xml.get_widget('show_roster_menuitem').hide() + + def on_show_roster_menuitem_toggled(self, widget): + # when num controls is 0 this menuitem is hidden, but still need to + # disable keybinding + if self.hpaned.get_child2() is not None: + self.show_roster_vbox(widget.get_active()) + + def show_roster_vbox(self, active): + if active: + self.xml.get_widget('roster_vbox2').show() + else: + self.xml.get_widget('roster_vbox2').hide() + def set_renderer_color(self, renderer, style, set_background = True): '''set style for treeview cell, using PRELIGHT system color''' if set_background: @@ -4683,32 +4814,24 @@ class RosterWindow: else: renderer.set_property('xpad', 8) - def fill_secondary_pixbuf_rederer(self, column, renderer, model, iter, + def fill_avatar_pixbuf_rederer(self, column, renderer, model, iter, data = None): - '''When a row is added, set properties for secondary renderer (avatar or - padlock)''' + '''When a row is added, set properties for avatar renderer''' theme = gajim.config.get('roster_theme') type_ = model[iter][C_TYPE] + if type_ in ('group', 'account'): + renderer.set_property('visible', False) + return + # allocate space for the icon only if needed - if model[iter][C_SECPIXBUF]: + if model[iter][C_AVATAR_PIXBUF] or \ + gajim.config.get('avatar_position_in_roster') == 'left': renderer.set_property('visible', True) else: renderer.set_property('visible', False) - if type_ == 'account': - color = gajim.config.get_per('themes', theme, 'accountbgcolor') - if color: - renderer.set_property('cell-background', color) - else: - self.set_renderer_color(renderer, gtk.STATE_ACTIVE) - elif type_ == 'group': - color = gajim.config.get_per('themes', theme, 'groupbgcolor') - if color: - renderer.set_property('cell-background', color) - else: - self.set_renderer_color(renderer, gtk.STATE_PRELIGHT) - elif type_: # prevent type_ = None, see http://trac.gajim.org/ticket/2534 + if type_: # prevent type_ = None, see http://trac.gajim.org/ticket/2534 if not model[iter][C_JID] or not model[iter][C_ACCOUNT]: - # This can append when at the moment we add the row + # This can append at the moment we add the row return jid = model[iter][C_JID].decode('utf-8') account = model[iter][C_ACCOUNT].decode('utf-8') @@ -4724,7 +4847,28 @@ class RosterWindow: renderer.set_property('cell-background', color) else: renderer.set_property('cell-background', None) - renderer.set_property('xalign', 1) # align pixbuf to the right + if gajim.config.get('avatar_position_in_roster') == 'left': + renderer.set_property('width', gajim.config.get('roster_avatar_width')) + renderer.set_property('xalign', 0.5) + else: + renderer.set_property('xalign', 1) # align pixbuf to the right + + def fill_padlock_pixbuf_rederer(self, column, renderer, model, iter, + data = None): + '''When a row is added, set properties for padlock renderer''' + theme = gajim.config.get('roster_theme') + type_ = model[iter][C_TYPE] + # allocate space for the icon only if needed + if type_ == 'account' and model[iter][C_PADLOCK_PIXBUF]: + renderer.set_property('visible', True) + color = gajim.config.get_per('themes', theme, 'accountbgcolor') + if color: + renderer.set_property('cell-background', color) + else: + self.set_renderer_color(renderer, gtk.STATE_ACTIVE) + renderer.set_property('xalign', 1) # align pixbuf to the right + else: + renderer.set_property('visible', False) def get_show(self, lcontact): prio = lcontact[0].priority @@ -4804,6 +4948,16 @@ class RosterWindow: show2 = cshow[s] else: show2 = 9 + removing1 = False + removing2 = False + if show1 == 6 and jid1 in gajim.to_be_removed[account1]: + removing1 = True + if show2 == 6 and jid2 in gajim.to_be_removed[account2]: + removing2 = True + if removing1 and not removing2: + return -1 + if removing2 and not removing1: + return 1 if show1 < show2: return -1 elif show1 > show2: @@ -4886,7 +5040,7 @@ class RosterWindow: # 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) + self.draw_account(account_source) context.finish(True, True, etime) confirm_metacontacts = gajim.config.get('confirm_metacontacts') @@ -4958,7 +5112,7 @@ class RosterWindow: 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) + 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') @@ -5012,7 +5166,7 @@ class RosterWindow: uri_splitted)) dialog.popup() return - + # a roster entry was dragged and dropped somewhere in the roster # source: the row that was dragged @@ -5020,14 +5174,14 @@ class RosterWindow: iter_source = model.get_iter(path_source) type_source = model[iter_source][C_TYPE] account_source = model[iter_source][C_ACCOUNT].decode('utf-8') - - # Only normal contacts can be dragged - if type_source != 'contact': + + # 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 + # A contact was dropped if gajim.config.get_per('accounts', account_dest, 'is_zeroconf'): # drop on zeroconf account, adding not possible return @@ -5072,7 +5226,7 @@ class RosterWindow: 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: @@ -5080,7 +5234,7 @@ class RosterWindow: 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 @@ -5094,7 +5248,7 @@ class RosterWindow: 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: @@ -5109,21 +5263,30 @@ class RosterWindow: def show_title(self): change_title_allowed = gajim.config.get('change_roster_title') + if not change_title_allowed: + return + + if gajim.config.get('one_message_window') == 'always_with_roster': + # always_with_roster mode defers to the MessageWindow + if not gajim.interface.msg_win_mgr.one_window_opened(): + # No MessageWindow to defer to + self.window.set_title('Gajim') + return + nb_unread = 0 - if change_title_allowed: - start = '' - for account in gajim.connections: - # Count events in roster title only if we don't auto open them - if not helpers.allow_popup_window(account): - nb_unread += gajim.events.get_nb_events(['chat', 'normal', - 'file-request', 'file-error', 'file-completed', - 'file-request-error', 'file-send-error', 'file-stopped', - 'printed_chat'], account) - if nb_unread > 1: - start = '[' + str(nb_unread) + '] ' - elif nb_unread == 1: - start = '* ' - self.window.set_title(start + 'Gajim') + start = '' + for account in gajim.connections: + # Count events in roster title only if we don't auto open them + if not helpers.allow_popup_window(account): + nb_unread += gajim.events.get_nb_events(['chat', 'normal', + 'file-request', 'file-error', 'file-completed', + 'file-request-error', 'file-send-error', 'file-stopped', + 'printed_chat'], account) + if nb_unread > 1: + start = '[' + str(nb_unread) + '] ' + elif nb_unread == 1: + start = '* ' + self.window.set_title(start + 'Gajim') gtkgui_helpers.set_unset_urgency_hint(self.window, nb_unread) @@ -5176,6 +5339,11 @@ class RosterWindow: self._last_selected_contact.append((jid, account)) self.draw_contact(jid, account, selected = True) + def search_roster_func(self, model, column, key, iter): + if model[iter][C_NAME].decode('utf-8').startswith(gobject.markup_escape_text(key)): + return False + return 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 @@ -5204,7 +5372,7 @@ class RosterWindow: 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) + gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) app_menu.append(prefs_item) app_menu.append(gtk.MenuItem('__SKIP__')) app_menu.append(gtk.MenuItem('__SKIP__')) @@ -5222,11 +5390,20 @@ class RosterWindow: #self.xml.get_widget('menubar').hide() return + def _on_message_window_delete(self, win_mgr, msg_win): + if gajim.config.get('one_message_window') == 'always_with_roster': + self.show_roster_vbox(True) + gtkgui_helpers.resize_window(self.window, + gajim.config.get('roster_width'), + gajim.config.get('roster_height')) + def __init__(self): self.xml = gtkgui_helpers.get_glade('roster_window.glade') self.window = self.xml.get_widget('roster_window') + self.hpaned = self.xml.get_widget('roster_hpaned') self._music_track_changed_signal = None - gajim.interface.msg_win_mgr = MessageWindowMgr() + gajim.interface.msg_win_mgr = MessageWindowMgr(self.window, self.hpaned) + gajim.interface.msg_win_mgr.connect('window-delete', self._on_message_window_delete) self.advanced_menus = [] # We keep them to destroy them if gajim.config.get('roster_window_skip_taskbar'): self.window.set_property('skip-taskbar-hint', True) @@ -5249,27 +5426,30 @@ class RosterWindow: 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 + self.draw_group_id = {} + self.draw_account_id = {} 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 # no need of this variable self.have_new_chat_accel = False # Is the "Ctrl+N" shown ? - if gajim.config.get('saveposition'): - gtkgui_helpers.move_window(self.window, - gajim.config.get('roster_x-position'), - gajim.config.get('roster_y-position')) - gtkgui_helpers.resize_window(self.window, - gajim.config.get('roster_width'), - gajim.config.get('roster_height')) + gtkgui_helpers.resize_window(self.window, + gajim.config.get('roster_width'), + gajim.config.get('roster_height')) + gtkgui_helpers.move_window(self.window, + gajim.config.get('roster_x-position'), + gajim.config.get('roster_y-position')) self.popups_notification_height = 0 self.popup_notification_windows = [] - #(icon, name, type, jid, account, editable, secondary_pixbuf) - model = gtk.TreeStore(gtk.Image, str, str, str, str, gtk.gdk.Pixbuf) + #(icon, name, type, jid, account, editable, avatar_pixbuf, padlock_pixbuf) + model = gtk.TreeStore(gtk.Image, str, str, str, str, gtk.gdk.Pixbuf, + gtk.gdk.Pixbuf) model.set_sort_func(1, self.compareIters) model.set_sort_column_id(1, gtk.SORT_ASCENDING) @@ -5359,12 +5539,24 @@ class RosterWindow: self.xml.get_widget('show_transports_menuitem').set_active( show_transports_group) + self.xml.get_widget('show_roster_menuitem').set_active(True) + # columns # this col has 3 cells: # first one img, second one text, third is sec pixbuf col = gtk.TreeViewColumn() + def add_avatar_renderer(): + render_pixbuf = gtk.CellRendererPixbuf() # avatar img + col.pack_start(render_pixbuf, expand = False) + col.add_attribute(render_pixbuf, 'pixbuf', C_AVATAR_PIXBUF) + col.set_cell_data_func(render_pixbuf, + self.fill_avatar_pixbuf_rederer, None) + + if gajim.config.get('avatar_position_in_roster') == 'left': + add_avatar_renderer() + render_image = cell_renderer_image.CellRendererImage(0, 0) # show img or +- col.pack_start(render_image, expand = False) @@ -5372,20 +5564,22 @@ 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) + 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) - render_pixbuf = gtk.CellRendererPixbuf() # tls or avatar img - col.pack_start(render_pixbuf, expand = False) - col.add_attribute(render_pixbuf, 'pixbuf', C_SECPIXBUF) - col.set_cell_data_func(render_pixbuf, self.fill_secondary_pixbuf_rederer, - None) + if gajim.config.get('avatar_position_in_roster') == 'right': + add_avatar_renderer() + render_pixbuf = gtk.CellRendererPixbuf() # tls/ssl img + col.pack_start(render_pixbuf, expand = False) + col.add_attribute(render_pixbuf, 'pixbuf', C_PADLOCK_PIXBUF) + col.set_cell_data_func(render_pixbuf, + self.fill_padlock_pixbuf_rederer, None) self.tree.append_column(col) - #do not show gtk arrows workaround + # do not show gtk arrows workaround col = gtk.TreeViewColumn() render_pixbuf = gtk.CellRendererPixbuf() col.pack_start(render_pixbuf, expand = False) @@ -5393,7 +5587,10 @@ class RosterWindow: col.set_visible(False) self.tree.set_expander_column(col) - #signals + # set search function + self.tree.set_search_equal_func(self.search_roster_func) + + # signals self.TARGET_TYPE_URI_LIST = 80 TARGETS = [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_APP | gtk.TARGET_SAME_WIDGET, 0)] @@ -5414,18 +5611,21 @@ 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. - 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) + if gajim.config.get('use_pep'): + self.enable_syncing_status_msg_from_current_music_track( + gajim.config.get('publish_tune')) else: - gobject.timeout_add(1000, - self.enable_syncing_status_msg_from_lastfm, - gajim.config.get('set_status_msg_from_lastfm')) + ## 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() @@ -5446,3 +5646,4 @@ class RosterWindow: if sys.platform == 'darwin': self.setup_for_osx() + diff --git a/src/statusicon.py b/src/statusicon.py index 2b26fd999..4a49f8669 100644 --- a/src/statusicon.py +++ b/src/statusicon.py @@ -22,7 +22,6 @@ import sys import gtk import systray -import gobject from common import gajim from common import helpers @@ -60,7 +59,7 @@ class StatusIcon(systray.Systray): self.unsubscribe_events() def on_status_icon_left_clicked(self, widget): - gobject.idle_add(self.on_left_click) + self.on_left_click() def set_img(self): '''apart from image, we also update tooltip text here''' diff --git a/src/systray.py b/src/systray.py index 2d6df9fd4..0afae5b4a 100644 --- a/src/systray.py +++ b/src/systray.py @@ -247,21 +247,17 @@ class Systray: sounds_mute_menuitem.set_active(not gajim.config.get('sounds_on')) - if os.name == 'nt': + if os.name == 'nt': if gtk.pygtk_version >= (2, 10, 0) and gtk.gtk_version >= (2, 10, 0): if self.added_hide_menuitem is False: - self.systray_context_menu.prepend(gtk.SeparatorMenuItem()) - item = gtk.MenuItem(_('Hide this menu')) - self.systray_context_menu.prepend(item) - self.added_hide_menuitem = True - self.systray_context_menu.popup(None, None, - gtk.status_icon_position_menu, event_button, - event_time, self.status_icon) + self.systray_context_menu.prepend(gtk.SeparatorMenuItem()) + item = gtk.MenuItem(_('Hide this menu')) + self.systray_context_menu.prepend(item) + self.added_hide_menuitem = True - else: # GNU and Unices - self.systray_context_menu.popup(None, None, None, event_button, - event_time) self.systray_context_menu.show_all() + self.systray_context_menu.popup(None, None, None, event_button, + event_time) def on_show_all_events_menuitem_activate(self, widget): events = gajim.events.get_systray_events() diff --git a/src/tooltips.py b/src/tooltips.py index e07ae4675..78214f352 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- ## tooltips.py ## ## Copyright (C) 2005-2006 Dimitur Kirov @@ -463,6 +464,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: @@ -494,6 +499,52 @@ class RosterTooltip(NotificationAreaTooltip): show = '' + show + '' # we append show below + if contact.mood.has_key('mood'): + mood = contact.mood['mood'].strip() + mood = gobject.markup_escape_text(mood) + mood_string = _('Mood:') + ' %s' % mood + if contact.mood.has_key('text') and contact.mood['text'] != '': + mood_text = contact.mood['text'].strip() + mood_text = gobject.markup_escape_text(mood_text) + mood_string += ' (%s)' % mood_text + properties.append((mood_string, None)) + + if contact.activity.has_key('activity'): + activity = contact.activity['activity'].strip() + activity = gobject.markup_escape_text(activity) + activity_string = _('Activity:') + ' %s' % activity + if contact.activity.has_key('subactivity'): + activity_sub = contact.activity['subactivity'].strip() + activity_sub = gobject.markup_escape_text(activity_sub) + activity_string += ' (%s)' % activity_sub + else: + activity_string += '' + if contact.activity.has_key('text'): + activity_text = contact.activity['text'].strip() + activity_text = gobject.markup_escape_text(activity_text) + 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() + artist = gobject.markup_escape_text(artist) + else: + artist = _('Unknown Artist') + if contact.tune.has_key('title'): + title = contact.tune['title'].strip() + title = gobject.markup_escape_text(title) + else: + title = _('Unknown Title') + if contact.tune.has_key('source'): + source = contact.tune['source'].strip() + source = gobject.markup_escape_text(source) + else: + source = _('Unknown Source') + tune_string = _('Tune:') + ' ' + _('"%(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: @@ -551,7 +602,7 @@ class RosterTooltip(NotificationAreaTooltip): vertical_fill, 0, 0) else: if isinstance(property[0], (unicode, str)): #FIXME: rm unicode? - label.set_markup(property[0]) + label.set_markup(property[0]) label.set_line_wrap(True) else: label = property[0] diff --git a/src/vcard.py b/src/vcard.py index 4784d9f0d..b6fcc3695 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -178,8 +178,6 @@ 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: @@ -187,6 +185,7 @@ class VcardWindow: get_avatar_pixbuf_encoded_mime(vcard[i]) image = self.xml.get_widget('PHOTO_image') image.show() + self.xml.get_widget('user_avatar_label').show() if not pixbuf: image.set_from_icon_name('stock_person', gtk.ICON_SIZE_DIALOG) From 0b574d23601c6bf42cf80606e85d71138f9821ed Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Wed, 6 Feb 2008 01:40:51 +0000 Subject: [PATCH 03/18] move message handling into ChatControlSession --- src/common/connection_handlers.py | 11 +- src/common/events.py | 2 +- src/gajim.py | 136 ------------------ src/roster_window.py | 123 ++-------------- src/session.py | 224 ++++++++++++++++++++++++++++++ 5 files changed, 240 insertions(+), 256 deletions(-) create mode 100644 src/session.py diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 375279b51..f882ecbce 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -49,7 +49,8 @@ if dbus_support.supported: import dbus from music_track_listener import MusicTrackListener -from common.stanza_session import EncryptedStanzaSession +# XXX interface leaking into the back end? +import session STATUS_LIST = ['offline', 'connecting', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible', 'error'] @@ -1713,9 +1714,9 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, 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_xep, user_nick, msghtml, - session, form_node)) + + session.received(frm, msgtxt, tim, encrypted, mtype, subject, chatstate, + msg_id, composing_xep, user_nick, msghtml, form_node) # END messageCB def get_session(self, jid, thread_id, type): @@ -1786,7 +1787,7 @@ returns the session that we last sent a message to.''' return None def make_new_session(self, jid, thread_id = None, type = 'chat'): - sess = EncryptedStanzaSession(self, common.xmpp.JID(jid), thread_id, type) + sess = session.ChatControlSession(self, common.xmpp.JID(jid), thread_id, type) if not jid in self.sessions: self.sessions[jid] = {} diff --git a/src/common/events.py b/src/common/events.py index f676ec7fc..90e6cc08f 100644 --- a/src/common/events.py +++ b/src/common/events.py @@ -168,7 +168,7 @@ class Events: '''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''' + optionally only from given type''' if not self._events.has_key(account): return [] if not jid: diff --git a/src/gajim.py b/src/gajim.py index ad64b9b52..ec798f6c0 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -727,141 +727,6 @@ class Interface: self.handle_event_gc_notify(account, (jid, array[1], status_message, array[3], 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, session, form_node)) - # user_nick is JEP-0172 - - full_jid_with_resource = array[0] - jid = gajim.get_jid_without_resource(full_jid_with_resource) - resource = gajim.get_resource_from_jid(full_jid_with_resource) - - message = array[1] - encrypted = array[3] - msg_type = array[4] - subject = array[5] - chatstate = array[6] - 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): - jid = jid.replace('@', '') - - groupchat_control = self.msg_win_mgr.get_control(jid, account) - if not groupchat_control and \ - 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: - # It's a Private message - pm = True - msg_type = 'pm' - - chat_control = None - jid_of_control = full_jid_with_resource - highest_contact = gajim.contacts.get_contact_with_highest_priority( - account, jid) - # Look for a chat control that has the given resource, or default to one - # without resource - ctrl = self.msg_win_mgr.get_control(full_jid_with_resource, account) - if ctrl: - chat_control = ctrl - elif not pm and (not highest_contact or not highest_contact.resource): - # unknow contact or offline message - jid_of_control = jid - chat_control = self.msg_win_mgr.get_control(jid, account) - elif highest_contact and resource != highest_contact.resource and \ - highest_contact.show != 'offline': - jid_of_control = full_jid_with_resource - chat_control = None - elif not pm: - jid_of_control = jid - chat_control = self.msg_win_mgr.get_control(jid, account) - - # Handle chat states - contact = gajim.contacts.get_contact(account, jid, resource) - if contact: - 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 - contact.chatstate = chatstate - if contact.our_chatstate == 'ask': # we were jep85 disco? - contact.our_chatstate = 'active' # no more - chat_control.handle_incoming_chatstate() - elif contact.chatstate != 'active': - # got no valid jep85 answer, peer does not support it - contact.chatstate = False - elif chatstate == 'active': - # Brand new message, incoming. - contact.our_chatstate = chatstate - contact.chatstate = chatstate - if msg_id: # Do not overwrite an existing msg_id with None - contact.msg_id = msg_id - - # THIS MUST BE AFTER chatstates handling - # AND BEFORE playsound (else we ear sounding on chatstates!) - if not message: # empty message text - return - - if gajim.config.get('ignore_unknown_contacts') and \ - 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 - # notification - contact = common.contacts.Contact(jid = jid, resource = resource) - advanced_notif_num = notify.get_advanced_notification('message_received', - account, contact) - - # Is it a first or next message received ? - first = False - 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, - 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, 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, 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, session=session, - form_node=array[12]) - nickname = gajim.get_name_from_jid(account, jid) - # Check and do wanted notifications - msg = message - if subject: - msg = _('Subject: %s') % subject + '\n' + msg - focused = False - if chat_control: - parent_win = chat_control.parent_win - if chat_control == parent_win.get_active_control() and \ - parent_win.window.has_focus: - focused = True - notify.notify('new_message', jid_of_control, account, [msg_type, - first, nickname, msg, focused], advanced_notif_num) - - if self.remote_ctrl: - self.remote_ctrl.raise_signal('NewMessage', (account, array)) - def handle_event_msgerror(self, account, array): #'MSGERROR' (account, (jid, error_code, error_msg, msg, time)) full_jid_with_resource = array[0] @@ -2556,7 +2421,6 @@ class Interface: 'ERROR_ANSWER': self.handle_event_error_answer, 'STATUS': self.handle_event_status, 'NOTIFY': self.handle_event_notify, - 'MSG': self.handle_event_msg, 'MSGERROR': self.handle_event_msgerror, 'MSGSENT': self.handle_event_msgsent, 'MSGNOTSENT': self.handle_event_msgnotsent, diff --git a/src/roster_window.py b/src/roster_window.py index 876d3e81e..485b23cda 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -3929,7 +3929,7 @@ class RosterWindow: # We call this here to avoid race conditions with widget validation chat_control.read_queue() - def new_chat(self, contact, account, resource = None, session = None): + def new_chat(self, session, contact, account, resource = None): # Get target window, create a control, and associate it with the window type_ = message_control.TYPE_CHAT @@ -3945,9 +3945,7 @@ class RosterWindow: 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() + return chat_control def new_chat_from_jid(self, account, fjid): jid, resource = gajim.get_room_and_nick_from_fjid(fjid) @@ -3963,7 +3961,12 @@ class RosterWindow: resource = resource) if not gajim.interface.msg_win_mgr.has_window(fjid, account): - self.new_chat(contact, account, resource = resource) + session = account.make_new_session(account, fjid) + self.control = self.new_chat(session, contact, account, resource = resource) + + if len(gajim.events.get_events(account, fjid)): + chat_control.read_queue() + mw = gajim.interface.msg_win_mgr.get_window(fjid, account) mw.set_active_tab(fjid, account) mw.window.present() @@ -3983,114 +3986,6 @@ class RosterWindow: 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, session=None, form_node=None): - '''when we receive a message''' - contact = None - # if chat window will be for specific resource - resource_for_chat = resource - fjid = jid - # Try to catch the contact with correct resource - if resource: - fjid = jid + '/' + resource - contact = gajim.contacts.get_contact(account, jid, resource) - highest_contact = gajim.contacts.get_contact_with_highest_priority( - account, jid) - if not contact: - # If there is another resource, it may be a message from an invisible - # resource - 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) - contact.resource = resource - if resource: - fjid = jid + '/' + resource - contact.priority = 0 - contact.show = 'offline' - contact.status = '' - gajim.contacts.add_contact(account, contact) - - else: - # Default to highest prio - fjid = jid - resource_for_chat = None - contact = highest_contact - if not contact: - # contact is not in roster - contact = self.add_to_not_in_the_roster(account, jid, user_nick) - - path = self.get_path(jid, account) # Try to get line of contact in roster - - # Look for a chat control that has the given resource - ctrl = gajim.interface.msg_win_mgr.get_control(fjid, account) - if not ctrl: - # if not, if message comes from highest prio, get control or open one - # without resource - if highest_contact and contact.resource == highest_contact.resource \ - and not jid == gajim.get_jid_from_account(account): - ctrl = gajim.interface.msg_win_mgr.get_control(jid, account) - fjid = jid - resource_for_chat = None - - # Do we have a queue? - no_queue = len(gajim.events.get_events(account, fjid)) == 0 - - 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, - session=session, form_node=form_node) - return - - # We print if window is opened and it's not a single message - if ctrl and msg_type != 'normal': - 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: - gajim.logger.set_read_messages([msg_id]) - return - - # We save it in a queue - type_ = 'chat' - event_type = 'message_received' - if msg_type == 'normal': - type_ = 'normal' - event_type = 'single_message_received' - 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, 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) - 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 - # do not change selection while DND'ing - self.tree.expand_row(path[0:1], False) - self.tree.expand_row(path[0:2], False) - self.tree.scroll_to_cell(path) - self.tree.set_cursor(path) - else: - if no_queue: # We didn't have a queue: we change icons - self.draw_contact(jid, account) - self.show_title() # we show the * or [n] - # Show contact in roster (if he is invisible for example) and select - # line - self.show_and_select_path(path, jid, account) - def on_preferences_menuitem_activate(self, widget): if gajim.interface.instances.has_key('preferences'): gajim.interface.instances['preferences'].window.present() @@ -4399,7 +4294,7 @@ class RosterWindow: fjid += '/' + resource win = gajim.interface.msg_win_mgr.get_window(fjid, account) if not win: - self.new_chat(contact, account, resource = resource, session = session) + self.new_chat(session, contact, account, resource = resource) win = gajim.interface.msg_win_mgr.get_window(fjid, account) ctrl = win.get_control(fjid, account) # last message is long time ago diff --git a/src/session.py b/src/session.py new file mode 100644 index 000000000..a07a520ff --- /dev/null +++ b/src/session.py @@ -0,0 +1,224 @@ +from common import helpers + +from common import gajim +from common import stanza_session +from common import contacts + +import dialogs + +import message_control + +import notify + +class ChatControlSession(stanza_session.EncryptedStanzaSession): + def __init__(self, conn, jid, thread_id, type = 'chat'): + stanza_session.EncryptedStanzaSession.__init__(self, conn, jid, thread_id, type = 'chat') + + self.control = None + + def received(self, full_jid_with_resource, message, tim, encrypted, msg_type, subject, chatstate, msg_id, composing_xep, user_nick, xhtml, form_node): + + jid = gajim.get_jid_without_resource(full_jid_with_resource) + resource = gajim.get_resource_from_jid(full_jid_with_resource) + + if gajim.config.get('ignore_incoming_xhtml'): + xhtml = None + if gajim.jid_is_transport(jid): + jid = jid.replace('@', '') + + groupchat_control = gajim.interface.msg_win_mgr.get_control(jid, self.conn.name) + if not groupchat_control and \ + jid in gajim.interface.minimized_controls[self.conn.name]: + groupchat_control = self.minimized_controls[self.conn.name][jid] + + pm = False + if groupchat_control and groupchat_control.type_id == \ + message_control.TYPE_GC: + # It's a Private message + pm = True + msg_type = 'pm' + + jid_of_control = full_jid_with_resource + + # Handle chat states + contact = gajim.contacts.get_contact(self.conn.name, jid, resource) + if contact: + if contact.composing_xep != 'XEP-0085': # We cache xep85 support + contact.composing_xep = composing_xep + if self.control and self.control.type_id == message_control.TYPE_CHAT: + if chatstate is not None: + # other peer sent us reply, so he supports jep85 or jep22 + contact.chatstate = chatstate + if contact.our_chatstate == 'ask': # we were jep85 disco? + contact.our_chatstate = 'active' # no more + self.control.handle_incoming_chatstate() + elif contact.chatstate != 'active': + # got no valid jep85 answer, peer does not support it + contact.chatstate = False + elif chatstate == 'active': + # Brand new message, incoming. + contact.our_chatstate = chatstate + contact.chatstate = chatstate + if msg_id: # Do not overwrite an existing msg_id with None + contact.msg_id = msg_id + + # THIS MUST BE AFTER chatstates handling + # AND BEFORE playsound (else we ear sounding on chatstates!) + if not message: # empty message text + return + + if gajim.config.get('ignore_unknown_contacts') and \ + not gajim.contacts.get_contacts(self.conn.name, jid) and not pm: + return + + if not contact: + # contact is not in the roster, create a fake one to display + # notification + contact = contacts.Contact(jid = jid, resource = resource) + advanced_notif_num = notify.get_advanced_notification('message_received', + self.conn.name, contact) + + # Is it a first or next message received ? + first = False + if not self.control: + first = True + + if pm: + nickname = resource + groupchat_control.on_private_message(nickname, message, array[2], + xhtml, session, msg_id) + else: + self.roster_message(jid, message, tim, encrypted, msg_type, + subject, resource, msg_id, user_nick, advanced_notif_num, + xhtml=xhtml, form_node=form_node) + + nickname = gajim.get_name_from_jid(self.conn.name, jid) + # Check and do wanted notifications + msg = message + if subject: + msg = _('Subject: %s') % subject + '\n' + msg + focused = False + + if self.control: + parent_win = self.control.parent_win + if self.control == parent_win.get_active_control() and \ + parent_win.window.has_focus: + focused = True + + notify.notify('new_message', jid_of_control, self.conn.name, [msg_type, + first, nickname, msg, focused], advanced_notif_num) + + if gajim.interface.remote_ctrl: + gajim.interface.remote_ctrl.raise_signal('NewMessage', (self.conn.name, [full_jid_with_resource, message, tim, encrypted, msg_type, subject, chatstate, msg_id, composing_xep, user_nick, xhtml, form_node])) + + def roster_message(self, jid, msg, tim, encrypted=False, msg_type='', + subject=None, resource='', msg_id=None, user_nick='', + advanced_notif_num=None, xhtml=None, form_node=None): + contact = None + # if chat window will be for specific resource + resource_for_chat = resource + + fjid = jid + + # Try to catch the contact with correct resource + if resource: + fjid = jid + '/' + resource + contact = gajim.contacts.get_contact(self.conn.name, jid, resource) + + highest_contact = gajim.contacts.get_contact_with_highest_priority( + self.conn.name, jid) + if not contact: + # If there is another resource, it may be a message from an invisible + # resource + lcontact = gajim.contacts.get_contacts(self.conn.name, 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) + contact.resource = resource + if resource: + fjid = jid + '/' + resource + contact.priority = 0 + contact.show = 'offline' + contact.status = '' + gajim.contacts.add_contact(self.conn.name, contact) + + else: + # Default to highest prio + fjid = jid + resource_for_chat = None + contact = highest_contact + + if not contact: + # contact is not in roster + contact = gajim.interface.roster.add_to_not_in_the_roster(self.conn.name, jid, user_nick) + + path = gajim.interface.roster.get_path(jid, self.conn.name) # Try to get line of contact in roster + + # Do we have a queue? + no_queue = len(gajim.events.get_events(self.conn.name, fjid)) == 0 + + popup = helpers.allow_popup_window(self.conn.name, advanced_notif_num) + + if msg_type == 'normal' and popup: # it's single message to be autopopuped + dialogs.SingleMessageWindow(self.conn.name, contact.jid, action='receive', + from_whom=jid, subject=subject, message=msg, resource=resource, + session=self, form_node=form_node) + return + + # We print if window is opened and it's not a single message + if self.control and msg_type != 'normal': + typ = '' + + if msg_type == 'error': + typ = 'status' + + self.control.print_conversation(msg, typ, tim = tim, + encrypted = encrypted, subject = subject, xhtml = xhtml) + + if msg_id: + gajim.logger.set_read_messages([msg_id]) + + return + + # We save it in a queue + type_ = 'chat' + event_type = 'message_received' + + if msg_type == 'normal': + type_ = 'normal' + event_type = 'single_message_received' + + show_in_roster = notify.get_show_in_roster(event_type, self.conn.name, contact) + show_in_systray = notify.get_show_in_systray(event_type, self.conn.name, contact) + + event = gajim.events.create_event(type_, (msg, subject, msg_type, tim, + encrypted, resource, msg_id, xhtml, self, form_node), + show_in_roster=show_in_roster, show_in_systray=show_in_systray) + + gajim.events.add_event(self.conn.name, fjid, event) + + if popup: + if not self.control: + self.control = self.new_chat(self, contact, self.conn.name, resource=resource_for_chat) + + if len(gajim.events.get_events(self.conn.name, fjid)): + self.control.read_queue() + + if path and not gajim.interface.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 + # do not change selection while DND'ing + self.tree.expand_row(path[0:1], False) + self.tree.expand_row(path[0:2], False) + self.tree.scroll_to_cell(path) + self.tree.set_cursor(path) + else: + if no_queue: # We didn't have a queue: we change icons + gajim.interface.roster.draw_contact(jid, self.conn.name) + + gajim.interface.roster.show_title() # we show the * or [n] + # Show contact in roster (if he is invisible for example) and select + # line + gajim.interface.roster.show_and_select_path(path, jid, self.conn.name) From 381ba838b9e92cf9c597c23284ddce93daf46df5 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Wed, 6 Feb 2008 05:24:07 +0000 Subject: [PATCH 04/18] post-refactor traceback fixing --- src/chat_control.py | 6 +++++- src/common/connection_handlers.py | 2 +- src/message_control.py | 1 + src/notify.py | 9 +++++---- src/roster_window.py | 29 +++++++++++++++++++---------- src/session.py | 11 +++++++---- 6 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index fa398d870..9598be4a2 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -678,7 +678,7 @@ class ChatControlBase(MessageControl): type_ = 'printed_' + self.type_id event = 'message_received' show_in_roster = notify.get_show_in_roster(event, - self.account, self.contact) + self.account, self.contact, self.session) show_in_systray = notify.get_show_in_systray(event, self.account, self.contact) if gc_message: @@ -1841,10 +1841,14 @@ class ChatControl(ChatControlBase): def shutdown(self): # destroy banner tooltip - bug #pygtk for that! self.status_tooltip.destroy() + # Send 'gone' chatstate self.send_chatstate('gone', self.contact) self.contact.chatstate = None self.contact.our_chatstate = None + + self.session.control = None + # Disconnect timer callbacks gobject.source_remove(self.possible_paused_timeout_id) gobject.source_remove(self.possible_inactive_timeout_id) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index f882ecbce..789877a3d 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1752,7 +1752,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, 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: diff --git a/src/message_control.py b/src/message_control.py index a81532bc1..e2e903824 100644 --- a/src/message_control.py +++ b/src/message_control.py @@ -145,6 +145,7 @@ class MessageControl: jid = self.contact.jid if not self.session: + print('uhoh new session') fjid = self.contact.get_full_jid() new_session = gajim.connections[self.account].make_new_session(fjid) diff --git a/src/notify.py b/src/notify.py index 6106227c3..a7f8d11ff 100644 --- a/src/notify.py +++ b/src/notify.py @@ -53,8 +53,7 @@ try: except: USER_HAS_GROWL = False - -def get_show_in_roster(event, account, contact): +def get_show_in_roster(event, account, contact, session = None): '''Return True if this event must be shown in roster, else False''' if event == 'gc_message_received': return True @@ -65,8 +64,10 @@ def get_show_in_roster(event, account, contact): if gajim.config.get_per('notifications', str(num), 'roster') == 'no': return False if event == 'message_received': - chat_control = helpers.get_chat_control(account, contact) - if chat_control: + if session: + if session.control: + return False + elif helpers.get_chat_control(account, contact): return False return True diff --git a/src/roster_window.py b/src/roster_window.py index 485b23cda..b64751e90 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -1299,8 +1299,7 @@ class RosterWindow: 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], session = session) + session.roster_message(jid, result[1], tim, msg_type='chat', msg_id=result[0]) def fill_contacts_and_groups_dicts(self, array, account): '''fill gajim.contacts and gajim.groups''' @@ -3960,12 +3959,13 @@ class RosterWindow: contact = self.add_to_not_in_the_roster(account, jid, resource = resource) + session = gajim.connections[account].get_session(fjid, None, 'chat') + if not gajim.interface.msg_win_mgr.has_window(fjid, account): - session = account.make_new_session(account, fjid) - self.control = self.new_chat(session, contact, account, resource = resource) + session.control = self.new_chat(session, contact, account, resource = resource) if len(gajim.events.get_events(account, fjid)): - chat_control.read_queue() + session.control.read_queue() mw = gajim.interface.msg_win_mgr.get_window(fjid, account) mw.set_active_tab(fjid, account) @@ -4292,16 +4292,25 @@ class RosterWindow: fjid = contact.jid if resource: fjid += '/' + resource + + conn = gajim.connections[account] + + if not session: + session = conn.get_session(fjid, None, 'chat') + win = gajim.interface.msg_win_mgr.get_window(fjid, account) if not win: - self.new_chat(session, contact, account, resource = resource) + session.control = self.new_chat(session, contact, account, resource=resource) + + if len(gajim.events.get_events(account, fjid)): + session.control.read_queue() + win = gajim.interface.msg_win_mgr.get_window(fjid, account) - ctrl = win.get_control(fjid, account) # last message is long time ago - gajim.last_message_time[account][ctrl.get_full_jid()] = 0 + gajim.last_message_time[account][session.control.get_full_jid()] = 0 + win.set_active_tab(fjid, account) - if gajim.connections[account].is_zeroconf and \ - gajim.connections[account].status in ('offline', 'invisible'): + if conn.is_zeroconf and conn.status in ('offline', 'invisible'): win.get_control(fjid, account).got_disconnected() win.window.present() diff --git a/src/session.py b/src/session.py index a07a520ff..494be99ef 100644 --- a/src/session.py +++ b/src/session.py @@ -51,7 +51,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): contact.chatstate = chatstate if contact.our_chatstate == 'ask': # we were jep85 disco? contact.our_chatstate = 'active' # no more - self.control.handle_incoming_chatstate() + #self.control.handle_incoming_chatstate() XXX elif contact.chatstate != 'active': # got no valid jep85 answer, peer does not support it contact.chatstate = False @@ -109,7 +109,10 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): first, nickname, msg, focused], advanced_notif_num) if gajim.interface.remote_ctrl: - gajim.interface.remote_ctrl.raise_signal('NewMessage', (self.conn.name, [full_jid_with_resource, message, tim, encrypted, msg_type, subject, chatstate, msg_id, composing_xep, user_nick, xhtml, form_node])) + gajim.interface.remote_ctrl.raise_signal('NewMessage', + (self.conn.name, [full_jid_with_resource, message, tim, + encrypted, msg_type, subject, chatstate, msg_id, + composing_xep, user_nick, xhtml, form_node])) def roster_message(self, jid, msg, tim, encrypted=False, msg_type='', subject=None, resource='', msg_id=None, user_nick='', @@ -188,7 +191,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): type_ = 'normal' event_type = 'single_message_received' - show_in_roster = notify.get_show_in_roster(event_type, self.conn.name, contact) + show_in_roster = notify.get_show_in_roster(event_type, self.conn.name, contact, self) show_in_systray = notify.get_show_in_systray(event_type, self.conn.name, contact) event = gajim.events.create_event(type_, (msg, subject, msg_type, tim, @@ -199,7 +202,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): if popup: if not self.control: - self.control = self.new_chat(self, contact, self.conn.name, resource=resource_for_chat) + self.control = gajim.interface.roster.new_chat(self, contact, self.conn.name, resource=resource_for_chat) if len(gajim.events.get_events(self.conn.name, fjid)): self.control.read_queue() From 867955155f9fd22cdaf77f1785edd28920fd50c0 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sat, 9 Feb 2008 06:57:07 +0000 Subject: [PATCH 05/18] groupchat sessions fix --- src/chat_control.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index 9598be4a2..a4faa3f6c 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -675,12 +675,6 @@ class ChatControlBase(MessageControl): 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, self.session) - show_in_systray = notify.get_show_in_systray(event, - self.account, self.contact) if gc_message: type_ = 'printed_gc_msg' event = 'gc_message_received' @@ -690,6 +684,14 @@ class ChatControlBase(MessageControl): show_in_systray = True if other_tags_for_text == ['marked']: type_ = 'printed_marked_gc_msg' + else: + type_ = 'printed_' + self.type_id + event = 'message_received' + show_in_roster = notify.get_show_in_roster(event, + self.account, self.contact, self.session) + show_in_systray = notify.get_show_in_systray(event, + self.account, self.contact) + event = gajim.events.create_event(type_, None, show_in_roster = show_in_roster, show_in_systray = show_in_systray) From c8cae710995cfd1e9a55bacb677f7f7bb31f55cd Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Thu, 14 Feb 2008 02:20:07 +0000 Subject: [PATCH 06/18] merged trunk --- data/glade/preferences_window.glade | 1110 +++++++++++++-------------- src/chat_control.py | 2 +- src/common/config.py | 1 + src/common/connection.py | 40 +- src/common/connection_handlers.py | 41 +- src/config.py | 14 +- src/dialogs.py | 2 +- src/features_window.py | 5 +- src/gajim-remote.py | 82 +- src/gajim.py | 12 +- src/groupchat_control.py | 15 +- src/message_window.py | 16 +- src/roster_window.py | 8 +- 13 files changed, 686 insertions(+), 662 deletions(-) diff --git a/data/glade/preferences_window.glade b/data/glade/preferences_window.glade index c4e2ebea9..697d0e711 100644 --- a/data/glade/preferences_window.glade +++ b/data/glade/preferences_window.glade @@ -130,37 +130,61 @@ 6 6 - - 50 + True - Detached roster with detached chats -Detached roster with single chat -Single window for everything -Detached roster with chat grouped by account -Detached roster with chat grouped by type - + 0 + 1 + _Window behavior: + True + one_window_type_combobox + + + 1 + 2 + GTK_FILL + + + + + True + 1 2 - 1 - 2 - + + True + If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons + + + True + 0 + 1 + Emoticons: + + + + + GTK_FILL + + + + True - If checked, Gajim will highlight spelling errors in input fields of chat windows. If no language is explicitly set via right click on the input field, the default language will be used for this contact or group chat. - _Highlight misspelled words + Hide all buttons in chat windows + _Make message windows compact True 0 True - + 2 - 4 - 5 + 2 + 3 GTK_FILL @@ -183,62 +207,38 @@ Detached roster with chat grouped by type - + True - Hide all buttons in chat windows - _Make message windows compact + If checked, Gajim will highlight spelling errors in input fields of chat windows. If no language is explicitly set via right click on the input field, the default language will be used for this contact or group chat. + _Highlight misspelled words True 0 True - + 2 - 2 - 3 + 4 + 5 GTK_FILL - + + 50 True - If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons - - - True - 0 - 1 - Emoticons: - - - - - GTK_FILL - - - - - True - + Detached roster with detached chats +Detached roster with single chat +Single window for everything +Detached roster with chat grouped by account +Detached roster with chat grouped by type + 1 2 - - - - - True - 0 - 1 - _Window behavior: - True - one_window_type_combobox - - 1 2 - GTK_FILL @@ -478,51 +478,17 @@ Show only in roster True 6 - + True - 6 - True - - - True - True - Play _sounds - True - 0 - True - - - - - - 5 - - - True - _Player: - True - soundplayer_entry - - - - - True - True - - - - 1 - - - - - 1 - - + True + Play _sounds + True + 0 + True + False - False @@ -657,7 +623,7 @@ Show only in roster 6 6 - + True All chat states Composing only @@ -666,23 +632,8 @@ Disabled 1 2 - - - - - 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 + 1 + 2 @@ -705,7 +656,24 @@ Disabled - + + 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 @@ -714,8 +682,6 @@ Disabled 1 2 - 1 - 2 @@ -759,89 +725,7 @@ Disabled 6 6 - - True - 0 - 1 - Allow others to see your: - True - one_window_type_combobox - - - GTK_FILL - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Tune - True - 0 - True - - - - 2 - 3 - 1 - 2 - GTK_FILL - - - - - True - 0 - 1 - Receive your contact's: - True - True - one_window_type_combobox - - - 1 - 2 - GTK_FILL - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Tune - True - 0 - True - - - - 2 - 3 - GTK_FILL - - - - - True - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Activity - True - 0 - True - - - - 3 - 4 - GTK_FILL - - - - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -849,11 +733,13 @@ Disabled True 0 True - + 1 2 + 1 + 2 GTK_FILL @@ -877,7 +763,7 @@ Disabled - + True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -885,16 +771,96 @@ Disabled True 0 True - + 1 2 + GTK_FILL + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Activity + True + 0 + True + + + + 3 + 4 + GTK_FILL + + + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Tune + True + 0 + True + + + + 2 + 3 + GTK_FILL + + + + + True + 0 + 1 + Receive your contact's: + True + True + one_window_type_combobox + + 1 2 GTK_FILL + + + True + True + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Tune + True + 0 + True + + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + True + 0 + 1 + Allow others to see your: + True + one_window_type_combobox + + + GTK_FILL + + @@ -957,33 +923,90 @@ Disabled 12 6 - + True True - The auto not available status message. If empty, Gajim will not change the current status message - + If checked, Gajim will change status to Away when the computer is unused. + _Away after: + True + 0 + True + - 3 - 4 - 1 - 2 + GTK_FILL - + True True - The auto away status message. If empty, Gajim will not change the current status message - + If checked, Gajim will change status to Not Available when the computer has not been used even longer + _Not available after: + True + 0 + True + - 3 - 4 + 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 @@ -1010,87 +1033,30 @@ Disabled - - 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 - If checked, Gajim will change status to Not Available when the computer has not been used even longer - _Not available after: - True - 0 - True - + The auto away status message. If empty, Gajim will not change the current status message + - 1 - 2 - GTK_FILL + 3 + 4 - + True True - If checked, Gajim will change status to Away when the computer is unused. - _Away after: - True - 0 - True - + The auto not available status message. If empty, Gajim will not change the current status message + - GTK_FILL + 3 + 4 + 1 + 2 @@ -1250,46 +1216,6 @@ Disabled - - - True - True - GTK_POLICY_NEVER - GTK_POLICY_NEVER - GTK_SHADOW_IN - - - True - True - 3 - GTK_WRAP_WORD - - - - - 1 - 2 - GTK_FILL - - - - - True - True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - - - True - True - False - - - - - - True @@ -1328,6 +1254,46 @@ Disabled GTK_FILL + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + + + True + True + False + + + + + + + + + True + True + GTK_POLICY_NEVER + GTK_POLICY_NEVER + GTK_SHADOW_IN + + + True + True + 3 + GTK_WRAP_WORD + + + + + 1 + 2 + GTK_FILL + + @@ -1390,14 +1356,14 @@ Disabled - + True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - Chat message: + True + 0 - GTK_FILL - GTK_FILL + 1 + 2 @@ -1418,14 +1384,14 @@ Disabled - + True - True - 0 + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Chat message: - 1 - 2 + GTK_FILL + GTK_FILL @@ -1475,18 +1441,62 @@ Disabled - + True - 0 - T_heme: + 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 icons True - theme_combobox + 0 + True + + 1 + 3 + 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 + + True @@ -1505,62 +1515,18 @@ Disabled - - True - - - - 1 - 2 - - - - + True 0 - Status _iconset: + T_heme: True - iconset_combobox + theme_combobox - 1 - 2 GTK_FILL GTK_FILL - - - True - - - - 1 - 2 - 1 - 2 - GTK_FILL - GTK_FILL - - - - - 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 icons - True - 0 - True - - - - 1 - 3 - 2 - 3 - - @@ -1599,6 +1565,135 @@ Disabled 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 highlight: + True + url_msg_colorbutton + + + 2 + 3 + 1 + 2 + GTK_FILL + + + + + + True + True + 0 + + + + 3 + 4 + 1 + 2 + GTK_FILL + + + True @@ -1667,135 +1762,6 @@ Disabled GTK_FILL - - - True - True - 0 - - - - 3 - 4 - 1 - 2 - GTK_FILL - - - - - - True - 0 - _URL highlight: - 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 - - - @@ -1880,56 +1846,16 @@ Custom 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 + 2 + 3 @@ -1949,16 +1875,56 @@ Custom - + True True - + 1 2 - 2 - 3 + + + + + + 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 @@ -2022,19 +1988,18 @@ Custom 6 6 - + True True - If checked, Gajim log GPG or E2E encrypted messages. However, when using E2E encryption the remote site has to agree on logging. If the other side has declined logging, your messages will NOT be logged. - Log _encrypted chat session + If checked, Gajim will ignore incoming events from unauthorized contacts. 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 - 3 + GTK_FILL @@ -2054,18 +2019,19 @@ Custom - + True True - If checked, Gajim will ignore incoming events from unauthorized contacts. 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 + If checked, Gajim log GPG or E2E encrypted messages. However, when using E2E encryption the remote site has to agree on logging. If the other side has declined logging, your messages will NOT be logged. + Log _encrypted chat session True 0 True - + - GTK_FILL + 2 + 3 diff --git a/src/chat_control.py b/src/chat_control.py index a4faa3f6c..45963855c 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -281,7 +281,7 @@ class ChatControlBase(MessageControl): self.conv_textview.tv.show() self._paint_banner() - # For JEP-0172 + # For XEP-0172 self.user_nick = None self.smooth = True diff --git a/src/common/config.py b/src/common/config.py index 9eda27542..a8a0e6603 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -296,6 +296,7 @@ class Config: 'keep_alives_enabled': [ opt_bool, True], # send keepalive every N seconds of inactivity 'keep_alive_every_foo_secs': [ opt_int, 55 ], + 'time_for_keep_alive_answer': [ opt_int, 20, _('How many seconds to wait for the answer of keepalive packet before we try to reconnect.') ], # try for 2 minutes before giving up (aka. timeout after those seconds) 'try_connecting_for_foo_secs': [ opt_int, 60 ], 'http_auth': [opt_str, 'ask'], # yes, no, ask diff --git a/src/common/connection.py b/src/common/connection.py index 9606afc36..2c1177bbc 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -705,11 +705,21 @@ class Connection(ConnectionHandlers): return common.xmpp.features_nb.getPrivacyLists(self.connection) - def sendPing(self, pingTo): + def sendPing(self, pingTo=None): + '''Send XMPP Ping (XEP-0199) request. If pingTo is not set, ping is sent + to server to detect connection failure at application level.''' if not self.connection: return - iq = common.xmpp.Iq('get', to = pingTo.get_full_jid()) + id = self.connection.getAnID() + if pingTo: + to = pingTo.get_full_jid() + self.dispatch('PING_SENT', (pingTo)) + else: + to = gajim.config.get_per('accounts', self.name, 'hostname') + self.awaiting_xmpp_ping_id = id + iq = common.xmpp.Iq('get', to=to) iq.addChild(name = 'ping', namespace = common.xmpp.NS_PING) + iq.setID(id) def _on_response(resp): timePong = time_time() if not common.xmpp.isResultNode(resp): @@ -717,9 +727,13 @@ class Connection(ConnectionHandlers): 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) + if pingTo: + timePing = time_time() + self.connection.SendAndCallForResponse(iq, _on_response) + else: + self.connection.send(iq) + gajim.idlequeue.set_alarm(self.check_keepalive, gajim.config.get_per( + 'accounts', self.name, 'time_for_keep_alive_answer')) def get_active_default_lists(self): if not self.connection: @@ -877,7 +891,7 @@ class Connection(ConnectionHandlers): self.connection = con if not self.connection: return - self.connection.set_send_timeout(self.keepalives, self.send_keepalive) + self.connection.set_send_timeout(self.keepalives, self.sendPing) self.connection.onreceive(None) iq = common.xmpp.Iq('get', common.xmpp.NS_PRIVACY, xmlns = '') id = self.connection.getAnID() @@ -922,7 +936,7 @@ class Connection(ConnectionHandlers): if not auto and not show == 'offline': sign_msg = True self.status = msg - if show != 'offline' and not self.connected: + if show != 'offline' and self.connected < 1: # set old_show to requested 'show' in case we need to # recconect before we auth to server self.old_show = show @@ -955,7 +969,7 @@ class Connection(ConnectionHandlers): self.time_to_reconnect = None self._on_disconnected() - elif show != 'offline' and self.connected: + elif show != 'offline' and self.connected > 0: # dont'try to connect, when we are in state 'connecting' if self.connected == 1: return @@ -1257,6 +1271,7 @@ class Connection(ConnectionHandlers): iq.setID(id) if groupchat_jid: self.groupchat_jids[id] = groupchat_jid + self.last_ids.append(id) self.connection.send(iq) def request_os_info(self, jid, resource, groupchat_jid=None): @@ -1277,6 +1292,7 @@ class Connection(ConnectionHandlers): iq.setID(id) if groupchat_jid: self.groupchat_jids[id] = groupchat_jid + self.version_ids.append(id) self.connection.send(iq) def get_settings(self): @@ -1599,10 +1615,10 @@ class Connection(ConnectionHandlers): c.setTagData('reason', reason) self.connection.send(message) - def send_keepalive(self): - # nothing received for the last foo seconds (60 secs by default) - if self.connection: - self.connection.send(' ') + def check_keepalive(self): + if self.awaiting_xmpp_ping_id: + # We haven't got the pong in time, disco and reconnect + self._disconnectedReconnCB() def _reconnect_alarm(self): if self.time_to_reconnect: diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 789877a3d..24f6c6575 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -426,6 +426,9 @@ class ConnectionBytestream: # 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 == self.awaiting_xmpp_ping_id: + self.awaiting_xmpp_ping_id = None + return if real_id[:3] != 'au_': return frm = helpers.get_full_jid_from_iq(iq_obj) @@ -667,8 +670,8 @@ class ConnectionDisco: query = iq.setTag('query') 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): + for f in (common.xmpp.NS_BYTESTREAM, common.xmpp.NS_SI, + common.xmpp.NS_FILE, common.xmpp.NS_COMMANDS): feature = common.xmpp.Node('feature') feature.setAttr('var', f) query.addChild(node=feature) @@ -1240,6 +1243,12 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, # keep the latest subscribed event for each jid to prevent loop when we # acknoledge presences self.subscribed_events = {} + # IDs of jabber:iq:last requests + self.last_ids = [] + # IDs of jabber:iq:version requests + self.version_ids = [] + # ID of urn:xmpp:ping requests + self.awaiting_xmpp_ping_id = None # keep track of sessions this connection has with other JIDs self.sessions = {} @@ -1298,15 +1307,21 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, def _ErrorCB(self, con, iq_obj): gajim.log.debug('ErrorCB') - if iq_obj.getQueryNS() == common.xmpp.NS_VERSION: - who = helpers.get_full_jid_from_iq(iq_obj) - jid_stripped, resource = gajim.get_room_and_nick_from_fjid(who) + jid_from = helpers.get_full_jid_from_iq(iq_obj) + jid_stripped, resource = gajim.get_room_and_nick_from_fjid(jid_from) + id = unicode(iq_obj.getID()) + if id in self.version_ids: self.dispatch('OS_INFO', (jid_stripped, resource, '', '')) + self.version_ids.remove(id) return + if id in self.last_ids: + self.dispatch('LAST_STATUS_TIME', (jid_stripped, resource, -1, '')) + self.last_ids.remove(id) + return + if id == self.awaiting_xmpp_ping_id: + self.awaiting_xmpp_ping_id = None errmsg = iq_obj.getErrorMsg() errcode = iq_obj.getErrorCode() - jid_from = helpers.get_full_jid_from_iq(iq_obj) - id = unicode(iq_obj.getID()) self.dispatch('ERROR_ANSWER', (id, jid_from, errmsg, errcode)) def _PrivateCB(self, con, iq_obj): @@ -1393,9 +1408,9 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, qp.setTagData('os', helpers.get_os_info()) self.connection.send(iq_obj) raise common.xmpp.NodeProcessed - + def _LastCB(self, con, iq_obj): - gajim.log.debug('IdleCB') + gajim.log.debug('LastCB') iq_obj = iq_obj.buildReply('result') qp = iq_obj.getTag('query') if not HAS_IDLE: @@ -1405,7 +1420,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, self.connection.send(iq_obj) raise common.xmpp.NodeProcessed - + def _LastResultCB(self, con, iq_obj): gajim.log.debug('LastResultCB') qp = iq_obj.getTag('query') @@ -1421,9 +1436,11 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, del self.groupchat_jids[id] else: who = helpers.get_full_jid_from_iq(iq_obj) + if id in self.last_ids: + self.last_ids.remove(id) jid_stripped, resource = gajim.get_room_and_nick_from_fjid(who) self.dispatch('LAST_STATUS_TIME', (jid_stripped, resource, seconds, status)) - + def _VersionResultCB(self, con, iq_obj): gajim.log.debug('VersionResultCB') client_info = '' @@ -1442,6 +1459,8 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, else: who = helpers.get_full_jid_from_iq(iq_obj) jid_stripped, resource = gajim.get_room_and_nick_from_fjid(who) + if id in self.version_ids: + self.version_ids.remove(id) self.dispatch('OS_INFO', (jid_stripped, resource, client_info, os_info)) def _TimeCB(self, con, iq_obj): diff --git a/src/config.py b/src/config.py index 43ede20f8..7c58705e7 100644 --- a/src/config.py +++ b/src/config.py @@ -298,27 +298,20 @@ class PreferencesWindow: self.auto_popup_away_checkbutton.set_active(st) # sounds - 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) if gajim.config.get('sounds_on'): self.xml.get_widget('play_sounds_checkbutton').set_active(True) else: - self.xml.get_widget('soundplayer_hbox').set_sensitive(False) self.xml.get_widget('sounds_scrolledwindow').set_sensitive(False) self.xml.get_widget('browse_sounds_hbox').set_sensitive(False) # sound player player = gajim.config.get('soundplayer') - self.xml.get_widget('soundplayer_entry').set_text(player) if player == '': # only on first time Gajim starts commands = ('aplay', 'play', 'esdplay', 'artsplay') for command in commands: if helpers.is_in_path(command): if command == 'aplay': command += ' -q' - self.xml.get_widget('soundplayer_entry').set_text(command) gajim.config.set('soundplayer', command) break @@ -775,14 +768,9 @@ class PreferencesWindow: 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('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', diff --git a/src/dialogs.py b/src/dialogs.py index 073c0b78f..7cdcb39cf 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -936,7 +936,7 @@ class AboutDialog: dlg.set_transient_for(gajim.interface.roster.window) dlg.set_name('Gajim') dlg.set_version(gajim.version) - s = u'Copyright © 2003-2007 Gajim Team' + s = u'Copyright © 2003-2008 Gajim Team' dlg.set_copyright(s) copying_file_path = None if os.path.isfile(os.path.join(gajim.defs.docdir, 'COPYING')): diff --git a/src/features_window.py b/src/features_window.py index 59c5f3a1f..a57822959 100644 --- a/src/features_window.py +++ b/src/features_window.py @@ -142,7 +142,10 @@ class FeaturesWindow: selection = widget.get_selection() if not selection: return - path = selection.get_selected_rows()[1][0] + rows = selection.get_selected_rows()[1] + if not rows: + return + path = rows[0] available = self.model[path][1] feature = self.model[path][0].decode('utf-8') text = self.features[feature][1] + '\n' diff --git a/src/gajim-remote.py b/src/gajim-remote.py index 892375a39..6871edbca 100755 --- a/src/gajim-remote.py +++ b/src/gajim-remote.py @@ -59,7 +59,7 @@ BASENAME = 'gajim-remote' class GajimRemote: def __init__(self): - self.argv_len = len(sys.argv) + self.argv_len = len(sys.argv) # define commands dict. Prototype : # { # 'command': [comment, [list of arguments] ] @@ -73,14 +73,14 @@ class GajimRemote: _('Shows a help on specific command'), [ #User gets help for the command, specified by this parameter - (_('command'), + (_('command'), _('show help on command'), False) ] - ], + ], 'toggle_roster_appearance' : [ _('Shows or hides the roster window'), [] - ], + ], 'show_next_pending_event': [ _('Pops up a window with the next pending event'), [] @@ -93,27 +93,27 @@ class GajimRemote: False) ] - ], + ], 'list_accounts': [ _('Prints a list of registered accounts'), [] - ], + ], 'change_status': [ _('Changes the status of account or accounts'), [ #offline, online, chat, away, xa, dnd, invisible should not be translated - (_('status'), _('one of: offline, online, chat, away, xa, dnd, invisible '), True), - (_('message'), _('status message'), False), + (_('status'), _('one of: offline, online, chat, away, xa, dnd, invisible '), True), + (_('message'), _('status message'), False), (_('account'), _('change status of account "account". ' 'If not specified, try to change status of all accounts that have ' '"sync with global status" option set'), False) ] ], - 'open_chat': [ - _('Shows the chat dialog so that you can send messages to a contact'), + 'open_chat': [ + _('Shows the chat dialog so that you can send messages to a contact'), [ ('jid', _('JID of the contact that you want to chat with'), - True), + True), (_('account'), _('if specified, contact is taken from the ' 'contact list of this account'), False) ] @@ -121,7 +121,7 @@ class GajimRemote: 'send_chat_message':[ _('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 \'\'.'), + 'without \'OpenPGP key\', just set \'OpenPGP key\' to \'\'.'), [ ('jid', _('JID of the contact that will receive the message'), True), (_('message'), _('message contents'), True), @@ -134,7 +134,7 @@ class GajimRemote: 'send_single_message':[ _('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 \'\'.'), + 'without \'OpenPGP key\', just set \'OpenPGP key\' to \'\'.'), [ ('jid', _('JID of the contact that will receive the message'), True), (_('subject'), _('message subject'), True), @@ -144,9 +144,9 @@ class GajimRemote: (_('account'), _('if specified, the message will be sent ' 'using this account'), False), ] - ], + ], 'send_groupchat_message':[ - _('Sends new message to a groupchat you\'ve joined.'), + _('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), @@ -155,13 +155,13 @@ class GajimRemote: ] ], 'contact_info': [ - _('Gets detailed info on a contact'), + _('Gets detailed info on a contact'), [ ('jid', _('JID of the contact'), True) ] ], 'account_info': [ - _('Gets detailed info on a account'), + _('Gets detailed info on a account'), [ ('account', _('Name of the account'), True) ] @@ -188,8 +188,8 @@ class GajimRemote: ], 'prefs_del': [ _('Deletes a preference item'), - [ - (_('key'), _('name of the preference to be deleted'), True) + [ + (_('key'), _('name of the preference to be deleted'), True) ] ], 'prefs_store': [ @@ -199,7 +199,7 @@ class GajimRemote: ], 'remove_contact': [ _('Removes contact from roster'), - [ + [ ('jid', _('JID of the contact'), True), (_('account'), _('if specified, contact is taken from the ' 'contact list of this account'), False) @@ -208,7 +208,7 @@ class GajimRemote: ], 'add_contact': [ _('Adds contact to roster'), - [ + [ (_('jid'), _('JID of the contact'), True), (_('account'), _('Adds new contact to this account'), False) ] @@ -226,7 +226,7 @@ class GajimRemote: [ (_('account'), _(''), False) ] - ], + ], 'get_unread_msgs_number': [ _('Returns number of unread messages'), @@ -239,7 +239,7 @@ class GajimRemote: ] ], 'send_xml': [ - _('Sends custom XML'), + _('Sends custom XML'), [ ('xml', _('XML to send'), True), ('account', _('Account in which the xml will be sent; ' @@ -263,8 +263,13 @@ class GajimRemote: (_('account'), _(''), False) ] ], + 'check_gajim_running':[ + _('Check if Gajim is running'), + [] + ], } + self.sbus = None if self.argv_len < 2 or \ sys.argv[1] not in self.commands.keys(): # no args or bad args send_error(self.compose_help()) @@ -277,6 +282,9 @@ class GajimRemote: sys.exit(0) if self.command == 'handle_uri': self.handle_uri() + if self.command == 'check_gajim_running': + print self.check_gajim_running() + sys.exit(0) self.init_connection() self.check_arguments() @@ -323,7 +331,7 @@ class GajimRemote: pref_keys.sort() for pref_key in pref_keys: result = '%s = %s' % (pref_key, res[pref_key]) - if isinstance(result, unicode): + if isinstance(result, unicode): print result.encode(PREFERRED_ENCODING) else: print result @@ -332,6 +340,22 @@ class GajimRemote: elif res: print unicode(res).encode(PREFERRED_ENCODING) + def check_gajim_running(self): + if not self.sbus: + try: + self.sbus = dbus.SessionBus() + except: + raise exceptions.SessionBusNotPresent + + test = False + if hasattr(self.sbus, 'name_has_owner'): + if self.sbus.name_has_owner(SERVICE): + test = True + elif dbus.dbus_bindings.bus_name_has_owner(self.sbus.get_connection(), + SERVICE): + test = True + return test + def init_connection(self): ''' create the onnection to the session dbus, or exit if it is not possible ''' @@ -340,6 +364,8 @@ class GajimRemote: except: raise exceptions.SessionBusNotPresent + if not self.check_gajim_running(): + send_error(_('It seems Gajim is not running. So you can\'t use gajim-remote.')) obj = self.sbus.get_object(SERVICE, OBJ_PATH) interface = dbus.Interface(obj, INTERFACE) @@ -368,7 +394,7 @@ class GajimRemote: if command in self.commands: command_props = self.commands[command] arguments_str = self.make_arguments_row(command_props[1]) - str = _('Usage: %s %s %s \n\t %s') % (BASENAME, command, + str = _('Usage: %s %s %s \n\t %s') % (BASENAME, command, arguments_str, command_props[0]) if len(command_props[1]) > 0: str += '\n\n' + _('Arguments:') + '\n' @@ -383,7 +409,7 @@ class GajimRemote: commands = self.commands.keys() commands.sort() for command in commands: - str += ' ' + command + str += ' ' + command for argument in self.commands[command][1]: str += ' ' if argument[2]: @@ -457,7 +483,7 @@ class GajimRemote: if len(args) > argv_len: if args[argv_len][2]: send_error(_('Argument "%s" is not specified. \n' - 'Type "%s help %s" for more info') % + 'Type "%s help %s" for more info') % (args[argv_len][0], BASENAME, self.command)) self.arguments = [] i = 0 @@ -485,7 +511,7 @@ class GajimRemote: if action == 'join': self.command = sys.argv[1] = 'join_room' return - + sys.exit(0) def call_remote_method(self): diff --git a/src/gajim.py b/src/gajim.py index ec798f6c0..3c84e56c7 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -720,12 +720,6 @@ class Interface: elif new_show > 1: # Status change (not connected/disconnected or error (<1)) notify.notify('status_change', jid, account, [new_show, status_message]) - else: - # FIXME: Msn transport (CMSN1.2.1 and PyMSN0.10) doesn't follow the JEP - # 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)) def handle_event_msgerror(self, account, array): #'MSGERROR' (account, (jid, error_code, error_msg, msg, time)) @@ -989,6 +983,10 @@ class Interface: def handle_event_last_status_time(self, account, array): # ('LAST_STATUS_TIME', account, (jid, resource, seconds, status)) + tim = array[2] + if tim < 0: + # Ann error occured + return win = None if self.instances[account]['infos'].has_key(array[0]): win = self.instances[account]['infos'][array[0]] @@ -997,7 +995,7 @@ class Interface: if win: c = gajim.contacts.get_contact(account, array[0], array[1]) if c: # c can be none if it's a gc contact - c.last_status_time = time.localtime(time.time() - array[2]) + c.last_status_time = time.localtime(time.time() - tim) if array[3]: c.status = array[3] win.set_last_status_time() diff --git a/src/groupchat_control.py b/src/groupchat_control.py index c5b2ae487..0234ce5a1 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -939,19 +939,18 @@ class GroupchatControl(ChatControlBase): model[iter][C_TEXT] = name def draw_avatar(self, nick): + if not gajim.config.get('show_avatars_in_roster'): + return model = self.list_treeview.get_model() iter = self.get_contact_iter(nick) if not iter: return - if gajim.config.get('show_avatars_in_roster'): - pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(self.room_jid + \ - '/' + nick, True) - if pixbuf in ('ask', None): - scaled_pixbuf = None - else: - scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'roster') - else: + pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(self.room_jid + \ + '/' + nick, True) + if pixbuf in ('ask', None): scaled_pixbuf = None + else: + scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'roster') model[iter][C_AVATAR] = scaled_pixbuf def chg_contact_status(self, nick, show, status, role, affiliation, jid, diff --git a/src/message_window.py b/src/message_window.py index f882b86cc..0406559de 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -4,12 +4,12 @@ ## Vincent Hanquez ## Copyright (C) 2005 Yann Leboulanger ## Vincent Hanquez -## Nikos Kouremenos ## Dimitur Kirov ## Norman Rasmussen ## Copyright (C) 2005-2007 Travis Shirk ## Copyright (C) 2006 Geobert Quach ## Copyright (C) 2007 Stephan Erb +## Copyright (C) 2005-2008 Nikos Kouremenos ## ## This file is part of Gajim. ## @@ -123,7 +123,9 @@ class MessageWindow(object): else: nb_pos = gtk.POS_TOP self.notebook.set_tab_pos(nb_pos) - if gajim.config.get('tabs_always_visible'): + window_mode = gajim.interface.msg_win_mgr.mode + if gajim.config.get('tabs_always_visible') or \ + window_mode == MessageWindowMgr.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER: self.notebook.set_show_tabs(True) self.alignment.set_property('top-padding', 2) else: @@ -444,7 +446,9 @@ class MessageWindow(object): self.window.destroy() return # don't show_title, we are dead elif self.get_num_controls() == 1: # we are going from two tabs to one - show_tabs_if_one_tab = gajim.config.get('tabs_always_visible') + window_mode = gajim.interface.msg_win_mgr.mode + show_tabs_if_one_tab = gajim.config.get('tabs_always_visible') or \ + window_mode == MessageWindowMgr.ONE_MSG_WINDOW_ALWAYS_WITH_ROSTER self.notebook.set_show_tabs(show_tabs_if_one_tab) if not show_tabs_if_one_tab: self.alignment.set_property('top-padding', 0) @@ -624,11 +628,15 @@ class MessageWindow(object): self.show_title(control = new_ctrl) def _on_notebook_key_press(self, widget, event): - 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 + # when tab itself is selected, make sure <- and -> are allowed for navigating between tabs + if event.keyval in (gtk.keysyms.Left, gtk.keysyms.Right): + return False + + control = self.get_active_control() if isinstance(control, ChatControlBase): # we forwarded it to message textview control.msg_textview.emit('key_press_event', event) diff --git a/src/roster_window.py b/src/roster_window.py index b64751e90..54ce52e09 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -334,8 +334,7 @@ class RosterWindow: model.append(i, (None, name, 'contact', jid, account, None, None)) self.draw_contact(jid, account) - if gajim.config.get('show_avatars_in_roster'): - self.draw_avatar(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) @@ -395,8 +394,7 @@ class RosterWindow: if gajim.groups[account][group]['expand']: self.tree.expand_row(model.get_path(iterG), False) self.draw_contact(jid, account) - if gajim.config.get('show_avatars_in_roster'): - self.draw_avatar(jid, account) + self.draw_avatar(jid, account) self.draw_account(account) # put the children under this iter for data in shown_family: @@ -762,6 +760,8 @@ class RosterWindow: def draw_avatar(self, jid, account): '''draw the avatar''' + if not gajim.config.get('show_avatars_in_roster'): + return model = self.tree.get_model() iters = self.get_contact_iter(jid, account) if gajim.config.get('show_avatars_in_roster'): From d034078c03efc8b679b0f0b3a9bf8e5c0fe1736e Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sun, 6 Apr 2008 22:21:46 +0000 Subject: [PATCH 07/18] rearranged _messageCB and split it into multiple methods --- src/common/connection_handlers.py | 198 ++++++++++++++++++------------ 1 file changed, 118 insertions(+), 80 deletions(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 24f6c6575..1a005f47d 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1548,24 +1548,26 @@ 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 + + # check if the message is a XEP 0020 feature negotiation request if msg.getTag('feature') and msg.getTag('feature').namespace == \ common.xmpp.NS_FEATURE: if gajim.HAVE_PYCRYPTO: self._FeatureNegCB(con, msg, session) return + + # check if the message is initiating an ESession negotiation 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: @@ -1579,35 +1581,36 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, msgtxt = msg.getBody() msghtml = msg.getXHTML() subject = msg.getSubject() # if not there, it's None + tim = msg.getTimestamp() 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: - no_log_for = '' - no_log_for = no_log_for.split() - chatstate = None + encTag = msg.getTag('x', namespace = common.xmpp.NS_ENCRYPTED) - decmsg = '' # invitations invite = None + if not encTag: invite = msg.getTag('x', namespace = common.xmpp.NS_MUC_USER) if invite and not invite.getTag('invite'): invite = None + delayed = msg.getTag('x', namespace = common.xmpp.NS_DELAY) != None msg_id = None composing_xep = None + # FIXME: Msn transport (CMSN1.2.1 and PyMSN0.10) do NOT RECOMMENDED # invitation # stanza (MUC XEP) remove in 2007, as we do not do NOT RECOMMENDED @@ -1621,11 +1624,15 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, 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 + + chatstate = None + # chatstates - look for chatstate tags in a message if not delayed if not delayed: composing_xep = False @@ -1643,94 +1650,54 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, composing_xep = 'XEP-0022' if not msgtxt and chatstate_child.getTag('composing'): chatstate = 'composing' + # XEP-0172 User Nickname user_nick = msg.getTagData('nick') if not user_nick: user_nick = '' if encTag and self.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 + msgtxt = decmsg.replace('\x00', '') + + encrypted = True + if mtype == 'error': - error_msg = msg.getError() - if not error_msg: - error_msg = msgtxt - msgtxt = None - if session.is_loggable(): - 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)) + self.dispatch_error_message(msg, msgtxt, session, frm, tim, subject) + return elif mtype == 'groupchat': - has_timestamp = False - if msg.timestamp: - has_timestamp = True - 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'): - 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, - 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: - self.dispatch('ERROR', (_('Disk Write Error'), str(e))) + self.dispatch_gc_message(msg, subject, frm, msgtxt, jid, tim, msghtml) + return - elif mtype == 'chat': # it's type 'chat' - if not msg.getTag('body') and chatstate is None: #no + elif invite is not None: + self.dispatch_invite_message(invite, frm) + + return + elif mtype == 'chat': + if not msg.getTag('body') and chatstate is None: # no return - 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) - 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') - jid_from = item.getAttr('from') - reason = item.getTagData('reason') - item = invite.getTag('password') - password = invite.getTagData('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 session.is_loggable()and msgtxt: - 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))) + + log_type = 'chat_msg_recv' + else: # it's a single message + log_type = 'single_msg_recv' + mtype = 'normal' + + if session.is_loggable() and msgtxt: + try: + msg_id = gajim.logger.write(log_type, frm, msgtxt, + tim = tim, subject = subject) + except exceptions.PysqliteOperationalError, e: + self.dispatch('ERROR', (_('Disk Write Error'), str(e))) + treat_as = gajim.config.get('treat_incoming_messages') + if treat_as: mtype = treat_as @@ -1738,6 +1705,77 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, msg_id, composing_xep, user_nick, msghtml, form_node) # END messageCB + # process and dispatch an error message + def dispatch_error_message(self, msg, msgtxt, session, frm, tim, subject) + error_msg = msg.getError() + + if not error_msg: + error_msg = msgtxt + msgtxt = None + + if session.is_loggable(): + 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)) + + # process and dispatch a groupchat message + def dispatch_gc_message(self, msg, subject, frm, msgtxt, jid, tim, msghtml): + has_timestamp = bool(msg.timestamp) + + 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'): + if statusCode != []: + self.dispatch('GC_CONFIG_CHANGE', (jid, statusCode)) + return + + # Ignore messages from rooms that we're not in + if not self.last_history_line.has_key(jid): + return + + self.dispatch('GC_MSG', (frm, msgtxt, tim, has_timestamp, msghtml, + statusCode)) + + no_log_for = gajim.config.get_per('accounts', self.name, + 'no_log_for') + + if not no_log_for: + no_log_for = '' + + no_log_for = no_log_for.split() + + 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: + self.dispatch('ERROR', (_('Disk Write Error'), str(e))) + + def dispatch_invite_message(self, invite, frm) + item = invite.getTag('invite') + + jid_from = item.getAttr('from') + reason = item.getTagData('reason') + item = invite.getTag('password') + password = invite.getTagData('password') + + is_continued = False + if invite.getTag('invite').getTag('continue'): + is_continued = True + + self.dispatch('GC_INVITATION',(frm, jid_from, reason, password, + is_continued)) + 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) From b170e77cdb97a16e131fbaa1ea04b5dac6263d07 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Fri, 11 Apr 2008 03:52:45 +0000 Subject: [PATCH 08/18] functioning tic-tac-toe :D --- data/glade/roster_contact_context_menu.glade | 7 + src/common/connection_handlers.py | 55 ++-- src/common/stanza_session.py | 26 +- src/roster_window.py | 14 + src/session.py | 2 + src/tictactoe.py | 276 +++++++++++++++++++ 6 files changed, 350 insertions(+), 30 deletions(-) create mode 100644 src/tictactoe.py diff --git a/data/glade/roster_contact_context_menu.glade b/data/glade/roster_contact_context_menu.glade index f873e7f77..2a1955007 100644 --- a/data/glade/roster_contact_context_menu.glade +++ b/data/glade/roster_contact_context_menu.glade @@ -91,6 +91,13 @@ + + + True + Play Tic Tac Toe + True + + True diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 1a005f47d..bd806f9fd 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -50,7 +50,8 @@ if dbus_support.supported: from music_track_listener import MusicTrackListener # XXX interface leaking into the back end? -import session +from session import ChatControlSession +import tictactoe STATUS_LIST = ['offline', 'connecting', 'online', 'chat', 'away', 'xa', 'dnd', 'invisible', 'error'] @@ -768,6 +769,7 @@ class ConnectionDisco: 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}) + q.addChild('feature', attrs = {'var': 'http://jabber.org/protocol/games'}) 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}) @@ -779,6 +781,9 @@ class ConnectionDisco: q.addChild('feature', attrs = {'var': common.xmpp.NS_PING}) q.addChild('feature', attrs = {'var': common.xmpp.NS_TIME_REVISED}) + if node == 'http://jabber.org/protocol/games': + q.addChild('feature', attrs = {'var': 'http://jabber.org/protocol/games/tictactoe'}) + if q.getChildren(): self.connection.send(iq) raise common.xmpp.NodeProcessed @@ -1538,7 +1543,20 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if not mtype: mtype = 'normal' - if not mtype == 'groupchat': + game_invite = msg.getTag('invite', namespace='http://jabber.org/protocol/games') + if game_invite: + game = game_invite.getTag('game') + + if game.getAttr('var') == 'http://jabber.org/protocol/games/tictactoe': + klass = tictactoe.TicTacToeSession + + # this assumes that the invitation came with a thread_id we haven't seen + session = self.make_new_session(frm, thread_id, klass=klass) + + session.invited(msg) + + return + elif mtype != 'groupchat': session = self.get_session(frm, thread_id, mtype) if thread_id and not session.received_thread_id: @@ -1550,27 +1568,23 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, return # check if the message is a xep70-confirmation-request - if msg.getTag('confirm') and msg.getTag('confirm').namespace == \ - common.xmpp.NS_HTTP_AUTH: + if msg.getTag('confirm', namespace=common.xmpp.NS_HTTP_AUTH): self._HttpAuthCB(con, msg) return # check if the message is a XEP 0020 feature negotiation request - if msg.getTag('feature') and msg.getTag('feature').namespace == \ - common.xmpp.NS_FEATURE: + if msg.getTag('feature', namespace=common.xmpp.NS_FEATURE): if gajim.HAVE_PYCRYPTO: self._FeatureNegCB(con, msg, session) return # check if the message is initiating an ESession negotiation - if msg.getTag('init') and msg.getTag('init').namespace == \ - common.xmpp.NS_ESESSION_INIT: + if msg.getTag('init', namespace=common.xmpp.NS_ESESSION_INIT): self._InitE2ECB(con, msg, session) encrypted = False - e2e_tag = msg.getTag('c', namespace = common.xmpp.NS_STANZA_CRYPTO) - if e2e_tag: + if msg.getTag('c', namespace = common.xmpp.NS_STANZA_CRYPTO): encrypted = True try: @@ -1701,12 +1715,16 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if treat_as: mtype = treat_as - session.received(frm, msgtxt, tim, encrypted, mtype, subject, chatstate, - msg_id, composing_xep, user_nick, msghtml, form_node) + # XXX horrible hack + if isinstance(session, ChatControlSession): + session.received(frm, msgtxt, tim, encrypted, mtype, subject, chatstate, + msg_id, composing_xep, user_nick, msghtml, form_node) + else: + session.received(msg) # END messageCB # process and dispatch an error message - def dispatch_error_message(self, msg, msgtxt, session, frm, tim, subject) + def dispatch_error_message(self, msg, msgtxt, session, frm, tim, subject): error_msg = msg.getError() if not error_msg: @@ -1761,7 +1779,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, except exceptions.PysqliteOperationalError, e: self.dispatch('ERROR', (_('Disk Write Error'), str(e))) - def dispatch_invite_message(self, invite, frm) + def dispatch_invite_message(self, invite, frm): item = invite.getTag('invite') jid_from = item.getAttr('from') @@ -1833,7 +1851,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, '''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) @@ -1843,8 +1861,11 @@ returns the session that we last sent a message to.''' else: return None - def make_new_session(self, jid, thread_id = None, type = 'chat'): - sess = session.ChatControlSession(self, common.xmpp.JID(jid), thread_id, type) + def make_new_session(self, jid, thread_id=None, type='chat', klass=None): + if not klass: + klass = ChatControlSession + + sess = klass(self, common.xmpp.JID(jid), thread_id, type) if not jid in self.sessions: self.sessions[jid] = {} diff --git a/src/common/stanza_session.py b/src/common/stanza_session.py index 84034dc9e..bee4ae98f 100644 --- a/src/common/stanza_session.py +++ b/src/common/stanza_session.py @@ -32,10 +32,23 @@ class StanzaSession(object): else: self.thread_id = self.generate_thread_id() + self.loggable = True + self.last_send = 0 self.status = None self.negotiated = {} + 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 generate_thread_id(self): return "".join([random.choice(string.ascii_letters) for x in xrange(0,32)]) @@ -132,8 +145,6 @@ 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 = {} @@ -891,17 +902,6 @@ otherwise, list the fields we haven't implemented''' # 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 diff --git a/src/roster_window.py b/src/roster_window.py index 54ce52e09..f884fe015 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -2345,6 +2345,9 @@ class RosterWindow: contacts, account, self.on_execute_command)) else: # one resource + tictactoe_menuitem = xml.get_widget( 'tictactoe_menuitem') + tictactoe_menuitem.connect('activate', self.play_tictactoe, contact, account, contact.resource) + start_chat_menuitem.connect('activate', self.on_open_chat_window, contact, account) execute_command_menuitem.connect('activate', self.on_execute_command, @@ -4278,6 +4281,17 @@ class RosterWindow: return True return False + def play_tictactoe(self, widget, contact, account, resource=None): + jid = contact.jid + + if resource is not None: + jid = jid + u'/' + resource + + import tictactoe + + sess = gajim.connections[account].make_new_session(jid, klass=tictactoe.TicTacToeSession) + sess.begin() + def on_execute_command(self, widget, contact, account, resource=None): '''Execute command. Full JID needed; if it is other contact, resource is necessary. Widget is unnecessary, only to be diff --git a/src/session.py b/src/session.py index 494be99ef..643c7eaf7 100644 --- a/src/session.py +++ b/src/session.py @@ -16,6 +16,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): self.control = None + # dispatch a received stanza def received(self, full_jid_with_resource, message, tim, encrypted, msg_type, subject, chatstate, msg_id, composing_xep, user_nick, xhtml, form_node): jid = gajim.get_jid_without_resource(full_jid_with_resource) @@ -114,6 +115,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): encrypted, msg_type, subject, chatstate, msg_id, composing_xep, user_nick, xhtml, form_node])) + # display the message or show notification in the roster def roster_message(self, jid, msg, tim, encrypted=False, msg_type='', subject=None, resource='', msg_id=None, user_nick='', advanced_notif_num=None, xhtml=None, form_node=None): diff --git a/src/tictactoe.py b/src/tictactoe.py new file mode 100644 index 000000000..4477b1b10 --- /dev/null +++ b/src/tictactoe.py @@ -0,0 +1,276 @@ +from common import stanza_session +from common import xmpp + +import pygtk +pygtk.require('2.0') +import gtk +from gtk import gdk +import cairo + +# implements + +class InvalidMove(Exception): + pass + +class TicTacToeSession(stanza_session.StanzaSession): + def begin(self, rows = 3, cols = 3, role_s = 'x'): + self.rows = rows + self.cols = cols + + self.role_s = role_s + + if self.role_s == 'x': + self.role_o = 'o' + else: + self.role_o = 'x' + + msg = xmpp.Message() + + invite = msg.NT.invite + invite.setNamespace('http://jabber.org/protocol/games') + + game = invite.NT.game + game.setAttr('var', 'http://jabber.org/protocol/games/tictactoe') + + x = xmpp.DataForm(typ='submit') + + game.addChild(node=x) + + self.send(msg) + + self.next_move_id = 1 + self.state = 'sent_invite' + + # received an invitation + def invited(self, msg): + invite = msg.getTag('invite', namespace='http://jabber.org/protocol/games') + game = invite.getTag('game') + x = game.getTag('x', namespace='jabber:x:data') + + form = xmpp.DataForm(node=x) + + if form.getField('role'): + self.role_o = form.getField('role').getValues()[0] + + if form.getField('rows'): + self.rows = int(form.getField('rows').getValues()[0]) + + if form.getField('cols'): + self.cols = int(form.getField('cols').getValues()[0]) + + # XXX 'strike' + + if not hasattr(self, 'rows'): + self.rows = 3 + + if not hasattr(self, 'cols'): + self.cols = 3 + + # the number of the move about to be made + self.next_move_id = 1 + + self.board = TicTacToeBoard(self, self.rows, self.cols) + + # accept the invitation, join the game + response = xmpp.Message() + + join = response.NT.join + join.setNamespace('http://jabber.org/protocol/games') + + self.send(response) + + if not hasattr(self, 'role_o') or self.role_o == 'x': + self.role_s = 'o' + self.role_o = 'x' + + self.their_turn() + else: + self.role_s = 'x' + self.role_o = 'o' + + self.our_turn() + + def is_my_turn(self): + return self.state == 'get_input' + + def received(self, msg): + # just sent an invitation, expecting a reply + if self.state == 'sent_invite': + if msg.getTag('join', namespace='http://jabber.org/protocol/games'): + self.board = TicTacToeBoard(self, self.rows, self.cols) + + if self.role_s == 'x': + self.our_turn() + else: + self.their_turn() + + return + + # ignore messages unless we're expecting a move + if self.state != 'waiting': + return + + turn = msg.getTag('turn', namespace='http://jabber.org/protocol/games') + + move = turn.getTag('move', namespace='http://jabber.org/protocol/games/tictactoe') + + row = int(move.getAttr('row')) + col = int(move.getAttr('col')) + id = int(move.getAttr('id')) + + if id != self.next_move_id: + print 'unexpected move id, lost a move somewhere?' + raise + + try: + self.board.mark(row, col, self.role_o) + except InvalidMove, e: + print 'received invalid move' + return + + # XXX check win conditions + + self.next_move_id += 1 + + self.our_turn() + + def our_turn(self): + self.state = 'get_input' + self.board.win.set_title(self.board.title + ': your turn') + + def their_turn(self): + self.state = 'waiting' + self.board.win.set_title(self.board.title + ': their turn') + + # called when the board receives input + def move(self, row, column): + try: + self.board.mark(row, column, self.role_s) + except InvalidMove, e: + print 'invalid move' + return + + self.send_move(row, column) + + # XXX check win conditions + + def send_move(self, row, column): + msg = xmpp.Message() + + turn = msg.NT.turn + turn.setNamespace('http://jabber.org/protocol/games') + + move = turn.NT.move + move.setNamespace('http://jabber.org/protocol/games/tictactoe') + + move.setAttr('row', str(row)) + move.setAttr('col', str(column)) + move.setAttr('id', str(self.next_move_id)) + + self.send(msg) + + self.next_move_id += 1 + + self.their_turn() + +class TicTacToeBoard: + def __init__(self, session, rows, cols): + self.session = session + + self.rows = rows + self.cols = cols + + self.board = [ [None] * self.cols for r in xrange(self.rows) ] + + self.setup_window() + + def setup_window(self): + self.win = gtk.Window() + + self.title = 'tic-tac-toe with %s' % self.session.jid + + self.win.set_title(self.title) + self.win.set_app_paintable(True) + + self.win.add_events(gdk.BUTTON_PRESS_MASK) + self.win.connect('button-press-event', self.clicked) + self.win.connect('expose-event', self.expose) + + self.win.show_all() + + def clicked(self, widget, event): + if not self.session.is_my_turn(): + return + + (height, width) = widget.get_size() + + # convert click co-ordinates to row and column + + row_height = height // self.rows + col_width = width // self.cols + + row = int(event.y // row_height) + 1 + column = int(event.x // col_width) + 1 + + self.session.move(row, column) + + def expose(self, widget, event): + win = widget.window + + cr = win.cairo_create() + + cr.set_source_rgb(1.0, 1.0, 1.0) + + cr.set_operator(cairo.OPERATOR_SOURCE) + cr.paint() + + (width, height) = widget.get_size() + + row_height = height // self.rows + col_width = width // self.cols + + for i in xrange(self.rows): + for j in xrange(self.cols): + if self.board[i][j] == 'x': + self.draw_x(cr, i, j, row_height, col_width) + elif self.board[i][j] == 'o': + self.draw_o(cr, i, j, row_height, col_width) + + def draw_x(self, cr, row, col, row_height, col_width): + cr.set_source_rgb(0, 0, 0) + + top = row_height * (row + 0.2) + bottom = row_height * (row + 0.8) + + left = col_width * (col + 0.2) + right = col_width * (col + 0.8) + + cr.set_line_width(row_height / 5) + + cr.move_to(left, top) + cr.line_to(right, bottom) + + cr.move_to(right, top) + cr.line_to(left, bottom) + + cr.stroke() + + def draw_o(self, cr, row, col, row_height, col_width): + cr.set_source_rgb(0, 0, 0) + + x = col_width * (col + 0.5) + y = row_height * (row + 0.5) + + cr.arc(x, y, row_height/4, 0, 2.0*3.2) # slightly further than 2*pi + + cr.set_line_width(row_height / 5) + cr.stroke() + + # mark a move on the board + def mark(self, row, column, player): + if self.board[row-1][column-1]: + raise InvalidMove + else: + self.board[row-1][column-1] = player + + self.win.queue_draw() From 76808901eb6099ad7d46075189ea56ea6742839e Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Tue, 15 Apr 2008 05:32:45 +0000 Subject: [PATCH 09/18] check tic-tac-toe win conditions, slimmed down _messageCB some more --- src/common/connection_handlers.py | 82 ++------------ src/session.py | 77 ++++++++++++- src/tictactoe.py | 179 +++++++++++++++++++++--------- 3 files changed, 208 insertions(+), 130 deletions(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index bd806f9fd..29b27e479 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1593,7 +1593,6 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, self.dispatch('FAILED_DECRYPT', (frm, tim)) msgtxt = msg.getBody() - msghtml = msg.getXHTML() subject = msg.getSubject() # if not there, it's None tim = msg.getTimestamp() @@ -1612,19 +1611,15 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, frm = address.getAttr('jid') jid = gajim.get_jid_without_resource(frm) - encTag = msg.getTag('x', namespace = common.xmpp.NS_ENCRYPTED) # invitations invite = None + encTag = msg.getTag('x', namespace = common.xmpp.NS_ENCRYPTED) if not encTag: invite = msg.getTag('x', namespace = common.xmpp.NS_MUC_USER) if invite and not invite.getTag('invite'): invite = None - delayed = msg.getTag('x', namespace = common.xmpp.NS_DELAY) != None - msg_id = None - composing_xep = None - # FIXME: Msn transport (CMSN1.2.1 and PyMSN0.10) do NOT RECOMMENDED # invitation # stanza (MUC XEP) remove in 2007, as we do not do NOT RECOMMENDED @@ -1639,37 +1634,6 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, is_continued)) return - form_node = None - for xtag in xtags: - if xtag.getNamespace() == common.xmpp.NS_DATA: - form_node = xtag - break - - chatstate = None - - # chatstates - look for chatstate tags in a message if not delayed - if not delayed: - composing_xep = False - children = msg.getChildren() - for child in children: - if child.getNamespace() == 'http://jabber.org/protocol/chatstates': - chatstate = child.getName() - composing_xep = 'XEP-0085' - break - # 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_xep = 'XEP-0022' - if not msgtxt and chatstate_child.getTag('composing'): - chatstate = 'composing' - - # XEP-0172 User Nickname - user_nick = msg.getTagData('nick') - if not user_nick: - user_nick = '' - if encTag and self.USE_GPG: encmsg = encTag.getData() @@ -1683,44 +1647,16 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if mtype == 'error': self.dispatch_error_message(msg, msgtxt, session, frm, tim, subject) - - return elif mtype == 'groupchat': - self.dispatch_gc_message(msg, subject, frm, msgtxt, jid, tim, msghtml) - - return + self.dispatch_gc_message(msg, subject, frm, msgtxt, jid, tim) elif invite is not None: self.dispatch_invite_message(invite, frm) - - return - elif mtype == 'chat': - if not msg.getTag('body') and chatstate is None: # no - return - - log_type = 'chat_msg_recv' - else: # it's a single message - log_type = 'single_msg_recv' - - mtype = 'normal' - - if session.is_loggable() and msgtxt: - try: - msg_id = gajim.logger.write(log_type, frm, msgtxt, - tim = tim, subject = subject) - except exceptions.PysqliteOperationalError, e: - self.dispatch('ERROR', (_('Disk Write Error'), str(e))) - - treat_as = gajim.config.get('treat_incoming_messages') - - if treat_as: - mtype = treat_as - - # XXX horrible hack - if isinstance(session, ChatControlSession): - session.received(frm, msgtxt, tim, encrypted, mtype, subject, chatstate, - msg_id, composing_xep, user_nick, msghtml, form_node) else: - session.received(msg) + # XXX horrible hack + if isinstance(session, ChatControlSession): + session.received(frm, msgtxt, tim, encrypted, subject, msg) + else: + session.received(msg) # END messageCB # process and dispatch an error message @@ -1741,7 +1677,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, self.dispatch('MSGERROR', (frm, msg.getErrorCode(), error_msg, msgtxt, tim)) # process and dispatch a groupchat message - def dispatch_gc_message(self, msg, subject, frm, msgtxt, jid, tim, msghtml): + def dispatch_gc_message(self, msg, subject, frm, msgtxt, jid, tim): has_timestamp = bool(msg.timestamp) if subject != None: @@ -1761,7 +1697,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, if not self.last_history_line.has_key(jid): return - self.dispatch('GC_MSG', (frm, msgtxt, tim, has_timestamp, msghtml, + self.dispatch('GC_MSG', (frm, msgtxt, tim, has_timestamp, msg.getXHTML(), statusCode)) no_log_for = gajim.config.get_per('accounts', self.name, diff --git a/src/session.py b/src/session.py index 643c7eaf7..ea38ee682 100644 --- a/src/session.py +++ b/src/session.py @@ -1,9 +1,12 @@ from common import helpers +from common import exceptions from common import gajim from common import stanza_session from common import contacts +import common.xmpp + import dialogs import message_control @@ -16,8 +19,70 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): self.control = None + # extracts chatstate from a stanza + def get_chatstate(self, msg, msgtxt): + composing_xep = None + chatstate = None + + # chatstates - look for chatstate tags in a message if not delayed + delayed = msg.getTag('x', namespace=common.xmpp.NS_DELAY) != None + if not delayed: + composing_xep = False + children = msg.getChildren() + for child in children: + if child.getNamespace() == 'http://jabber.org/protocol/chatstates': + chatstate = child.getName() + composing_xep = 'XEP-0085' + break + # 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_xep = 'XEP-0022' + if not msgtxt and chatstate_child.getTag('composing'): + chatstate = 'composing' + + return (composing_xep, chatstate) + # dispatch a received stanza - def received(self, full_jid_with_resource, message, tim, encrypted, msg_type, subject, chatstate, msg_id, composing_xep, user_nick, xhtml, form_node): + def received(self, full_jid_with_resource, msgtxt, tim, encrypted, subject, msg): + msg_type = msg.getType() + msg_id = None + + # XEP-0172 User Nickname + user_nick = msg.getTagData('nick') + if not user_nick: + user_nick ='' + + form_node = None + for xtag in msg.getTags('x'): + if xtag.getNamespace() == common.xmpp.NS_DATA: + form_node = xtag + break + + composing_xep, chatstate = self.get_chatstate(msg, msgtxt) + + xhtml = msg.getXHTML() + + if msg_type == 'chat': + if not msg.getTag('body') and chatstate is None: + return + + log_type = 'chat_msg_recv' + else: + log_type = 'single_msg_recv' + + if self.is_loggable() and msgtxt: + try: + msg_id = gajim.logger.write(log_type, full_jid_with_resource, msgtxt, + tim=tim, subject=subject) + except exceptions.PysqliteOperationalError, e: + gajim.dispatch('ERROR', (_('Disk WriteError'), str(e))) + + treat_as = gajim.config.get('treat_incoming_messages') + if treat_as: + msg_type = treat_as jid = gajim.get_jid_without_resource(full_jid_with_resource) resource = gajim.get_resource_from_jid(full_jid_with_resource) @@ -65,7 +130,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): # THIS MUST BE AFTER chatstates handling # AND BEFORE playsound (else we ear sounding on chatstates!) - if not message: # empty message text + if not msgtxt: # empty message text return if gajim.config.get('ignore_unknown_contacts') and \ @@ -86,16 +151,16 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): if pm: nickname = resource - groupchat_control.on_private_message(nickname, message, array[2], + groupchat_control.on_private_message(nickname, msgtxt, array[2], xhtml, session, msg_id) else: - self.roster_message(jid, message, tim, encrypted, msg_type, + self.roster_message(jid, msgtxt, tim, encrypted, msg_type, subject, resource, msg_id, user_nick, advanced_notif_num, xhtml=xhtml, form_node=form_node) nickname = gajim.get_name_from_jid(self.conn.name, jid) # Check and do wanted notifications - msg = message + msg = msgtxt if subject: msg = _('Subject: %s') % subject + '\n' + msg focused = False @@ -111,7 +176,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): if gajim.interface.remote_ctrl: gajim.interface.remote_ctrl.raise_signal('NewMessage', - (self.conn.name, [full_jid_with_resource, message, tim, + (self.conn.name, [full_jid_with_resource, msgtxt, tim, encrypted, msg_type, subject, chatstate, msg_id, composing_xep, user_nick, xhtml, form_node])) diff --git a/src/tictactoe.py b/src/tictactoe.py index 4477b1b10..5bb20ea1b 100644 --- a/src/tictactoe.py +++ b/src/tictactoe.py @@ -9,6 +9,8 @@ import cairo # implements +games_ns = 'http://jabber.org/protocol/games' + class InvalidMove(Exception): pass @@ -24,13 +26,19 @@ class TicTacToeSession(stanza_session.StanzaSession): else: self.role_o = 'x' + self.send_invitation() + + self.next_move_id = 1 + self.received = self.wait_for_invite_response + + def send_invitation(self): msg = xmpp.Message() invite = msg.NT.invite - invite.setNamespace('http://jabber.org/protocol/games') + invite.setNamespace(games_ns) game = invite.NT.game - game.setAttr('var', 'http://jabber.org/protocol/games/tictactoe') + game.setAttr('var', games_ns + '/tictactoe') x = xmpp.DataForm(typ='submit') @@ -38,12 +46,8 @@ class TicTacToeSession(stanza_session.StanzaSession): self.send(msg) - self.next_move_id = 1 - self.state = 'sent_invite' - - # received an invitation - def invited(self, msg): - invite = msg.getTag('invite', namespace='http://jabber.org/protocol/games') + def read_invitation(self, msg): + invite = msg.getTag('invite', namespace=games_ns) game = invite.getTag('game') x = game.getTag('x', namespace='jabber:x:data') @@ -51,37 +55,47 @@ class TicTacToeSession(stanza_session.StanzaSession): if form.getField('role'): self.role_o = form.getField('role').getValues()[0] + else: + self.role_o = 'x' if form.getField('rows'): self.rows = int(form.getField('rows').getValues()[0]) + else: + self.rows = 3 if form.getField('cols'): self.cols = int(form.getField('cols').getValues()[0]) - - # XXX 'strike' - - if not hasattr(self, 'rows'): - self.rows = 3 - - if not hasattr(self, 'cols'): + else: self.cols = 3 + if form.getField('strike'): + self.strike = int(form.getField('strike').getValues()[0]) + else: + self.strike = 3 + + # received an invitation + def invited(self, msg): + self.read_invitation(msg) + + # XXX prompt user + # "accept, reject, ignore" + # the number of the move about to be made self.next_move_id = 1 + # display the board self.board = TicTacToeBoard(self, self.rows, self.cols) # accept the invitation, join the game response = xmpp.Message() join = response.NT.join - join.setNamespace('http://jabber.org/protocol/games') + join.setNamespace(games_ns) self.send(response) - if not hasattr(self, 'role_o') or self.role_o == 'x': + if self.role_o == 'x': self.role_s = 'o' - self.role_o = 'x' self.their_turn() else: @@ -91,27 +105,28 @@ class TicTacToeSession(stanza_session.StanzaSession): self.our_turn() def is_my_turn(self): - return self.state == 'get_input' + # XXX not great semantics + return self.received == self.ignore - def received(self, msg): - # just sent an invitation, expecting a reply - if self.state == 'sent_invite': - if msg.getTag('join', namespace='http://jabber.org/protocol/games'): - self.board = TicTacToeBoard(self, self.rows, self.cols) + # just sent an invitation, expecting a reply + def wait_for_invite_response(self, msg): + if msg.getTag('join', namespace=games_ns): + self.board = TicTacToeBoard(self, self.rows, self.cols) - if self.role_s == 'x': - self.our_turn() - else: - self.their_turn() + if self.role_s == 'x': + self.our_turn() + else: + self.their_turn() - return + elif msg.getTag('decline', namespace=games_ns): + self.XXX() - # ignore messages unless we're expecting a move - if self.state != 'waiting': - return - - turn = msg.getTag('turn', namespace='http://jabber.org/protocol/games') + # silently ignores any received messages + def ignore(self, msg): + pass + def wait_for_move(self, msg): + turn = msg.getTag('turn', namespace=games_ns) move = turn.getTag('move', namespace='http://jabber.org/protocol/games/tictactoe') row = int(move.getAttr('row')) @@ -128,40 +143,54 @@ class TicTacToeSession(stanza_session.StanzaSession): print 'received invalid move' return - # XXX check win conditions + # check win conditions + if self.board.check_for_strike(self.role_o, row, col, self.strike): + self.lost() + elif self.board.full(): + self.drawn() + else: + self.next_move_id += 1 - self.next_move_id += 1 - - self.our_turn() + self.our_turn() def our_turn(self): - self.state = 'get_input' + # ignore messages until we've made our move + self.received = self.ignore self.board.win.set_title(self.board.title + ': your turn') def their_turn(self): - self.state = 'waiting' + self.received = self.wait_for_move self.board.win.set_title(self.board.title + ': their turn') # called when the board receives input - def move(self, row, column): + def move(self, row, col): try: - self.board.mark(row, column, self.role_s) + self.board.mark(row, col, self.role_s) except InvalidMove, e: - print 'invalid move' + print 'you made an invalid move' return - self.send_move(row, column) + self.send_move(row, col) - # XXX check win conditions + # check win conditions + if self.board.check_for_strike(self.role_s, row, col,self.strike): + self.won() + elif self.board.full(): + self.drawn() + else: + self.next_move_id += 1 + + self.their_turn() def send_move(self, row, column): msg = xmpp.Message() + msg.setType('chat') turn = msg.NT.turn - turn.setNamespace('http://jabber.org/protocol/games') + turn.setNamespace(games_ns) move = turn.NT.move - move.setNamespace('http://jabber.org/protocol/games/tictactoe') + move.setNamespace(games_ns+'/tictactoe') move.setAttr('row', str(row)) move.setAttr('col', str(column)) @@ -169,11 +198,49 @@ class TicTacToeSession(stanza_session.StanzaSession): self.send(msg) - self.next_move_id += 1 - - self.their_turn() - class TicTacToeBoard: + def check_for_strike(self, p, r, c, strike): + # up and down, left and right + tallyI = 0 + tally_ = 0 + + # right triangles: L\ , F/ + tallyL = 0 + tallyF = 0 + + # convert real columns to internal columns + r -= 1 + c -= 1 + + for d in xrange(-strike, strike): + # vertical check + try: + tallyI = tallyI + 1 if self.board[r+d][c] == p else 0 + except IndexError: + pass + + # horizontal check + try: + tally_ = tally_ + 1 if self.board[r][c+d] == p else 0 + except IndexError: + pass + + # diagonal checks + try: + tallyL = tallyL + 1 if self.board[r+d][c+d] == p else 0 + except IndexError: + pass + + try: + tallyF = tallyF + 1 if self.board[r+d][c-d] == p else 0 + except IndexError: + pass + + if any([t == strike for t in (tallyL, tallyF, tallyI, tally_)]): + return True + + return False + def __init__(self, session, rows, cols): self.session = session @@ -184,6 +251,15 @@ class TicTacToeBoard: self.setup_window() + # is the board full? + def full(self): + for r in xrange(self.rows): + for c in xrange(self.cols): + if self.board[r][c] == None: + return False + + return True + def setup_window(self): self.win = gtk.Window() @@ -214,6 +290,7 @@ class TicTacToeBoard: self.session.move(row, column) + # this actually draws the board def expose(self, widget, event): win = widget.window From 051bd6e1b72819ea72cf8db511f15234251e44df Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sat, 26 Apr 2008 01:52:03 +0000 Subject: [PATCH 10/18] fixed e2ee traceback --- src/common/stanza_session.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/common/stanza_session.py b/src/common/stanza_session.py index bee4ae98f..e3a007f5a 100644 --- a/src/common/stanza_session.py +++ b/src/common/stanza_session.py @@ -83,7 +83,7 @@ class StanzaSession(object): def cancelled_negotiation(self): '''A negotiation has been cancelled, so reset this session to its default state.''' - if hasattr(self, 'control'): + if self.control: self.control.on_cancel_session_negotiation() self.status = None @@ -778,7 +778,7 @@ class EncryptedStanzaSession(StanzaSession): self.status = 'active' self.enable_encryption = True - if hasattr(self, 'control'): + if self.control: self.control.print_esession_details() def final_steps_alice(self, form): @@ -798,15 +798,14 @@ class EncryptedStanzaSession(StanzaSession): self.do_retained_secret(k, srs) - # don't need to calculate ks_s here - + # ks_s doesn't need to be calculated 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. + # 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 @@ -814,7 +813,7 @@ class EncryptedStanzaSession(StanzaSession): self.status = 'active' self.enable_encryption = True - if hasattr(self, 'control'): + if self.control: self.control.print_esession_details() # calculate and store the new retained secret From 2648aa4a9fe495abc11b41c83a9d76f2b99c3e02 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sat, 26 Apr 2008 02:06:08 +0000 Subject: [PATCH 11/18] tictactoe: notify user of when won/lost --- src/tictactoe.py | 118 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 94 insertions(+), 24 deletions(-) diff --git a/src/tictactoe.py b/src/tictactoe.py index 5bb20ea1b..083375cbe 100644 --- a/src/tictactoe.py +++ b/src/tictactoe.py @@ -15,12 +15,15 @@ class InvalidMove(Exception): pass class TicTacToeSession(stanza_session.StanzaSession): + # initiate a session def begin(self, rows = 3, cols = 3, role_s = 'x'): self.rows = rows self.cols = cols self.role_s = role_s + self.strike = 3 + if self.role_s == 'x': self.role_o = 'o' else: @@ -68,6 +71,7 @@ class TicTacToeSession(stanza_session.StanzaSession): else: self.cols = 3 + # number in a row needed to win if form.getField('strike'): self.strike = int(form.getField('strike').getValues()[0]) else: @@ -104,10 +108,6 @@ class TicTacToeSession(stanza_session.StanzaSession): self.our_turn() - def is_my_turn(self): - # XXX not great semantics - return self.received == self.ignore - # just sent an invitation, expecting a reply def wait_for_invite_response(self, msg): if msg.getTag('join', namespace=games_ns): @@ -119,12 +119,22 @@ class TicTacToeSession(stanza_session.StanzaSession): self.their_turn() elif msg.getTag('decline', namespace=games_ns): - self.XXX() + # XXX notify the user + + # XXX end session + pass # silently ignores any received messages def ignore(self, msg): pass + def game_over(self, msg): + invite = msg.getTag('invite', namespace=games_ns) + + # ignore messages unless they're renewing the game + if invite and invite.getAttr('type') == 'renew': + self.invited(msg) + def wait_for_move(self, msg): turn = msg.getTag('turn', namespace=games_ns) move = turn.getTag('move', namespace='http://jabber.org/protocol/games/tictactoe') @@ -135,12 +145,15 @@ class TicTacToeSession(stanza_session.StanzaSession): if id != self.next_move_id: print 'unexpected move id, lost a move somewhere?' - raise + return try: self.board.mark(row, col, self.role_o) except InvalidMove, e: - print 'received invalid move' + # received an invalid move, end the game. + + # XXX notify the user + self.terminate('cheating') return # check win conditions @@ -153,14 +166,18 @@ class TicTacToeSession(stanza_session.StanzaSession): self.our_turn() + def is_my_turn(self): + # XXX not great semantics + return self.received == self.ignore + def our_turn(self): # ignore messages until we've made our move self.received = self.ignore - self.board.win.set_title(self.board.title + ': your turn') + self.board.set_title('your turn') def their_turn(self): self.received = self.wait_for_move - self.board.win.set_title(self.board.title + ': their turn') + self.board.set_title('their turn') # called when the board receives input def move(self, row, col): @@ -173,7 +190,7 @@ class TicTacToeSession(stanza_session.StanzaSession): self.send_move(row, col) # check win conditions - if self.board.check_for_strike(self.role_s, row, col,self.strike): + if self.board.check_for_strike(self.role_s, row, col, self.strike): self.won() elif self.board.full(): self.drawn() @@ -182,6 +199,7 @@ class TicTacToeSession(stanza_session.StanzaSession): self.their_turn() + # sends a move message def send_move(self, row, column): msg = xmpp.Message() msg.setType('chat') @@ -198,13 +216,50 @@ class TicTacToeSession(stanza_session.StanzaSession): self.send(msg) + # sends a termination message and ends the game + def terminate(self, reason): + msg = xmpp.Message() + + terminate = msg.NT.terminate + terminate.setNamespace(games_ns) + terminate.setAttr('reason', reason) + + self.send(msg) + + self.received = self.game_over + + def won(self): + self.terminate('won') + self.board.won() + + def lost(self): + self.terminate('lost') + self.board.lost() + + def drawn(self): + self.terminate('draw') + self.board.drawn() + class TicTacToeBoard: + def __init__(self, session, rows, cols): + self.session = session + + self.state = 'None' + + self.rows = rows + self.cols = cols + + self.board = [ [None] * self.cols for r in xrange(self.rows) ] + + self.setup_window() + def check_for_strike(self, p, r, c, strike): - # up and down, left and right + # number in a row: up and down, left and right tallyI = 0 tally_ = 0 - # right triangles: L\ , F/ + # number in a row: diagonal + # (imagine L or F as two sides of a right triangle: L\ or F/) tallyL = 0 tallyF = 0 @@ -241,16 +296,6 @@ class TicTacToeBoard: return False - def __init__(self, session, rows, cols): - self.session = session - - self.rows = rows - self.cols = cols - - self.board = [ [None] * self.cols for r in xrange(self.rows) ] - - self.setup_window() - # is the board full? def full(self): for r in xrange(self.rows): @@ -263,9 +308,9 @@ class TicTacToeBoard: def setup_window(self): self.win = gtk.Window() - self.title = 'tic-tac-toe with %s' % self.session.jid + self.title_prefix = 'tic-tac-toe with %s' % self.session.jid + self.set_title() - self.win.set_title(self.title) self.win.set_app_paintable(True) self.win.add_events(gdk.BUTTON_PRESS_MASK) @@ -313,6 +358,8 @@ class TicTacToeBoard: elif self.board[i][j] == 'o': self.draw_o(cr, i, j, row_height, col_width) + # XXX draw 'won', 'lost', 'draw' + def draw_x(self, cr, row, col, row_height, col_width): cr.set_source_rgb(0, 0, 0) @@ -351,3 +398,26 @@ class TicTacToeBoard: self.board[row-1][column-1] = player self.win.queue_draw() + + def set_title(self, suffix = None): + str = self.title_prefix + + if suffix: + str += ': ' + suffix + + self.win.set_title(str) + + def won(self): + self.state = 'won' + self.set_title('you won!') + self.win.queue_draw() + + def lost(self): + self.state = 'lost' + self.set_title('you lost.') + self.win.queue_draw() + + def drawn(self): + self.state = 'drawn' + self.win.set_title(self.title_prefix + ': a draw.') + self.win.queue_draw() From d4a766963ff629586562c62590dab5cf60f6d37f Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Wed, 30 Apr 2008 02:55:13 +0000 Subject: [PATCH 12/18] multiple chat session windows per contact. groupchat and pms broken. --- src/chat_control.py | 75 +++++++++++++++++++++---------------------- src/common/events.py | 2 +- src/message_window.py | 29 +++++++++++------ src/roster_window.py | 9 +++--- src/session.py | 32 ++++++++++++++---- 5 files changed, 87 insertions(+), 60 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index 45963855c..2c1a51a01 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -385,7 +385,7 @@ class ChatControlBase(MessageControl): 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) id = widget.connect('style-set', self._on_style_set_event, set_fg, set_bg) @@ -709,11 +709,10 @@ class ChatControlBase(MessageControl): 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(): - self.parent_win.show_title(True, ctrl) # Enabled Urgent hint + self.parent_win.show_title(True, self) # Enabled Urgent hint else: - self.parent_win.show_title(False, ctrl) # Disabled Urgent hint + self.parent_win.show_title(False, self) # Disabled Urgent hint def toggle_emoticons(self): '''hide show emoticons_button and make sure emoticons_menu is always there @@ -905,8 +904,7 @@ class ChatControlBase(MessageControl): self.parent_win.get_active_control() == self and \ self.parent_win.window.is_active(): # we are at the end - if not gajim.events.remove_events(self.account, self.get_full_jid(), - types = ['printed_' + type_, type_]): + if not self.session.remove_events(['printed_' + type_, type_]): # There were events to remove self.redraw_after_event_removed(jid) @@ -1019,11 +1017,11 @@ class ChatControl(ChatControlBase): self.chat_buttons_set_visible(compact_view) self.widget_set_visible(self.xml.get_widget('banner_eventbox'), gajim.config.get('hide_chat_banner')) - + # Add lock image to show chat encryption self.lock_image = self.xml.get_widget('lock_image') self.lock_tooltip = gtk.Tooltips() - + # 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 self.show_bigger_avatar_timeout_id = None @@ -1069,12 +1067,12 @@ class ChatControl(ChatControlBase): gajim.encrypted_chats[self.account].append(contact.jid) msg = _('GPG encryption enabled') ChatControlBase.print_conversation_line(self, msg, 'status', '', None) - + if self.session: self.session.loggable = gajim.config.get('log_encrypted_sessions') self._show_lock_image(self.gpg_is_active, 'GPG', self.gpg_is_active, self.session and \ self.session.is_loggable()) - + self.status_tooltip = gtk.Tooltips() self.update_ui() # restore previous conversation @@ -1093,17 +1091,17 @@ class ChatControl(ChatControlBase): return avatar_w = avatar_pixbuf.get_width() avatar_h = avatar_pixbuf.get_height() - + scaled_buf = self.xml.get_widget('avatar_image').get_pixbuf() scaled_buf_w = scaled_buf.get_width() scaled_buf_h = scaled_buf.get_height() - + # do we have something bigger to show? if avatar_w > scaled_buf_w or avatar_h > scaled_buf_h: # wait for 0.5 sec in case we leave earlier self.show_bigger_avatar_timeout_id = gobject.timeout_add(500, self.show_bigger_avatar, widget) - + def on_avatar_eventbox_leave_notify_event(self, widget, event): '''we left the eventbox area that holds the avatar img''' # did we add a timeout? if yes remove it @@ -1122,7 +1120,7 @@ class ChatControl(ChatControlBase): self.handlers[id] = menuitem menu.append(menuitem) menu.show_all() - menu.connect('selection-done', lambda w:w.destroy()) + menu.connect('selection-done', lambda w:w.destroy()) # show the menu menu.show_all() menu.popup(None, None, None, event.button, event.time) @@ -1189,7 +1187,7 @@ class ChatControl(ChatControlBase): 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 @@ -1275,7 +1273,7 @@ class ChatControl(ChatControlBase): ec.remove(self.contact.jid) self.gpg_is_active = False msg = _('GPG encryption disabled') - ChatControlBase.print_conversation_line(self, msg, 'status', '', None) + ChatControlBase.print_conversation_line(self, msg, 'status', '', None) if self.session: self.session.loggable = True @@ -1300,10 +1298,10 @@ class ChatControl(ChatControlBase): gajim.config.add_per('contacts', self.contact.jid) gajim.config.set_per('contacts', self.contact.jid, 'gpg_enabled', self.gpg_is_active) - + self._show_lock_image(self.gpg_is_active, 'GPG', self.gpg_is_active, self.session and \ self.session.is_loggable()) - + def _show_lock_image(self, visible, enc_type = '', enc_enabled = False, chat_logged = False): '''Set lock icon visibiity and create tooltip''' status_string = enc_enabled and 'is' or 'is NOT' @@ -1467,7 +1465,7 @@ class ChatControl(ChatControlBase): # assume no activity and let the motion-notify or 'insert-text' make them # True refresh 30 seconds vars too or else it's 30 - 5 = 25 seconds! self.reset_kbd_mouse_timeout_vars() - return True # loop forever + return True # loop forever def check_for_possible_inactive_chatstate(self, arg): ''' did we move mouse over that window or wrote something in message @@ -1617,7 +1615,7 @@ class ChatControl(ChatControlBase): color = self.lighten_color(color) else: # active or not chatstate, get color from gtk color = self.parent_win.notebook.style.fg[gtk.STATE_ACTIVE] - + name = self.contact.get_shown_name() if self.resource: @@ -1636,7 +1634,7 @@ class ChatControl(ChatControlBase): ['printed_' + self.type_id, self.type_id])) # 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 = 'event') @@ -1672,7 +1670,7 @@ class ChatControl(ChatControlBase): 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) + 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, @@ -1682,7 +1680,7 @@ class ChatControl(ChatControlBase): contact = self.parent_win.get_active_contact() jid = contact.jid - + # check if we support and use gpg if not gajim.config.get_per('accounts', self.account, 'keyid') or\ not gajim.connections[self.account].USE_GPG or\ @@ -1765,7 +1763,7 @@ class ChatControl(ChatControlBase): # JEP 85 does not allow resending the same chatstate # this function checks for that and just returns so it's safe to call it # with same state. - + # This functions also checks for violation in state transitions # and raises RuntimeException with appropriate message # more on that http://www.jabber.org/jeps/jep-0085.html#statechart @@ -1794,7 +1792,7 @@ class ChatControl(ChatControlBase): if contact.composing_xep is False: # jid cannot do xep85 nor xep22 return - # if the new state we wanna send (state) equals + # if the new state we wanna send (state) equals # the current state (contact.our_chatstate) then return if contact.our_chatstate == state: return @@ -1806,7 +1804,7 @@ class ChatControl(ChatControlBase): # in self.send_message() because we need REAL message (with ) # for that procedure so return to make sure we send only once # 'active' until we know peer supports jep85 - return + return if contact.our_chatstate == 'ask': return @@ -1826,7 +1824,7 @@ class ChatControl(ChatControlBase): MessageControl.send_message(self, None, chatstate = 'active') contact.our_chatstate = 'active' self.reset_kbd_mouse_timeout_vars() - + # if we're inactive prevent composing (JEP violation) elif contact.our_chatstate == 'inactive' and state == 'composing': # go active before @@ -2052,12 +2050,6 @@ class ChatControl(ChatControlBase): 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) - control = gajim.interface.msg_win_mgr.get_control(room_jid, self.account) - if control and control.type_id == message_control.TYPE_GC: - is_pm = True # list of message ids which should be marked as read message_ids = [] for event in events: @@ -2082,11 +2074,16 @@ class ChatControl(ChatControlBase): types = [self.type_id]) typ = 'chat' # Is it a normal chat or a pm ? + # reset to status image in gc if it is a pm - if is_pm: - control.update_ui() - control.parent_win.show_title() - typ = 'pm' + # Is it a pm ? + room_jid, nick = gajim.get_room_and_nick_from_fjid(jid) +# XXX fixme somehow +# control = gajim.interface.msg_win_mgr.get_control(room_jid, self.account) +# if control and control.type_id == message_control.TYPE_GC: +# control.update_ui() +# control.parent_win.show_title() +# typ = 'pm' self.redraw_after_event_removed(jid) if (self.contact.show in ('offline', 'error')): @@ -2097,8 +2094,8 @@ class ChatControl(ChatControlBase): len(gajim.contacts.get_contacts(self.account, jid)) < 2): gajim.interface.roster.really_remove_contact(self.contact, self.account) - elif typ == 'pm': - control.remove_contact(nick) +# elif typ == 'pm': +# control.remove_contact(nick) def show_bigger_avatar(self, small_avatar): '''resizes the avatar, if needed, so it has at max half the screen size diff --git a/src/common/events.py b/src/common/events.py index 90e6cc08f..ac9625783 100644 --- a/src/common/events.py +++ b/src/common/events.py @@ -116,7 +116,7 @@ class Events: def remove_events(self, account, jid, event = None, types = []): '''if event is not specified, remove all events from this jid, - optionnaly only from given type + optionally only from given type return True if no such event found''' if not self._events.has_key(account): return True diff --git a/src/message_window.py b/src/message_window.py index 0406559de..5f857d841 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -152,8 +152,9 @@ class MessageWindow(object): def get_num_controls(self): n = 0 - for dict in self._controls.values(): - n += len(dict) + for jid_dict in self._controls.values(): + for dict in jid_dict.values(): + n += len(dict) return n def resize(self, width, height): @@ -206,7 +207,11 @@ class MessageWindow(object): if not self._controls.has_key(control.account): self._controls[control.account] = {} fjid = control.get_full_jid() - self._controls[control.account][fjid] = control + + if not self._controls[control.account].has_key(fjid): + self._controls[control.account][fjid] = {} + + self._controls[control.account][fjid][control.session.thread_id] = control if self.get_num_controls() == 2: # is first conversation_textview scrolled down ? @@ -391,8 +396,8 @@ class MessageWindow(object): else: gtkgui_helpers.set_unset_urgency_hint(self.window, False) - def set_active_tab(self, jid, acct): - ctrl = self._controls[acct][jid] + def set_active_tab(self, session): + ctrl = self._controls[session.conn.name][session.jid][session.thread_id] ctrl_page = self.notebook.page_num(ctrl.widget) self.notebook.set_current_page(ctrl_page) @@ -424,7 +429,12 @@ class MessageWindow(object): self.notebook.remove_page(self.notebook.page_num(ctrl.widget)) fjid = ctrl.get_full_jid() - del self._controls[ctrl.account][fjid] + thread_id = ctrl.session.thread_id + del self._controls[ctrl.account][fjid][thread_id] + + if len(self._controls[ctrl.account][fjid]) == 0: + del self._controls[ctrl.account][fjid] + if len(self._controls[ctrl.account]) == 0: del self._controls[ctrl.account] @@ -563,9 +573,10 @@ class MessageWindow(object): del gajim.last_message_time[acct][old_jid] def controls(self): - for ctrl_dict in self._controls.values(): - for ctrl in ctrl_dict.values(): - yield ctrl + for jid_dict in self._controls.values(): + for ctrl_dict in jid_dict.values(): + for ctrl in ctrl_dict.values(): + yield ctrl def move_to_next_unread_tab(self, forward): ind = self.notebook.get_current_page() diff --git a/src/roster_window.py b/src/roster_window.py index f884fe015..c5145868a 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -4312,18 +4312,18 @@ class RosterWindow: if not session: session = conn.get_session(fjid, None, 'chat') - win = gajim.interface.msg_win_mgr.get_window(fjid, account) - if not win: + if not session.control: session.control = self.new_chat(session, contact, account, resource=resource) if len(gajim.events.get_events(account, fjid)): session.control.read_queue() - win = gajim.interface.msg_win_mgr.get_window(fjid, account) # last message is long time ago gajim.last_message_time[account][session.control.get_full_jid()] = 0 - win.set_active_tab(fjid, account) + win = session.control.parent_win + win.set_active_tab(session) + if conn.is_zeroconf and conn.status in ('offline', 'invisible'): win.get_control(fjid, account).got_disconnected() @@ -5204,6 +5204,7 @@ class RosterWindow: start = '[' + str(nb_unread) + '] ' elif nb_unread == 1: start = '* ' + self.window.set_title(start + 'Gajim') gtkgui_helpers.set_unset_urgency_hint(self.window, nb_unread) diff --git a/src/session.py b/src/session.py index ea38ee682..f77569c16 100644 --- a/src/session.py +++ b/src/session.py @@ -19,6 +19,21 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): self.control = None + # remove events associated with this session from the queue + def remove_events(self, types): + any_removed = False + + for event in gajim.events.get_events(self.conn, self.jid, types=types): + if event.parameters[8] != self: + continue + + r = gajim.events.remove_events(self.conn, self.jid, event) + + if not_any_removed: + any_removed = r + + return any_removed + # extracts chatstate from a stanza def get_chatstate(self, msg, msgtxt): composing_xep = None @@ -93,16 +108,18 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): jid = jid.replace('@', '') groupchat_control = gajim.interface.msg_win_mgr.get_control(jid, self.conn.name) - if not groupchat_control and \ - jid in gajim.interface.minimized_controls[self.conn.name]: - groupchat_control = self.minimized_controls[self.conn.name][jid] + +# XXX fixme +# if not groupchat_control and \ +# jid in gajim.interface.minimized_controls[self.conn.name]: +# groupchat_control = self.minimized_controls[self.conn.name][jid] pm = False - if groupchat_control and groupchat_control.type_id == \ - message_control.TYPE_GC: +# if groupchat_control and groupchat_control.type_id == \ +# message_control.TYPE_GC: # It's a Private message - pm = True - msg_type = 'pm' +# pm = True +# msg_type = 'pm' jid_of_control = full_jid_with_resource @@ -184,6 +201,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): def roster_message(self, jid, msg, tim, encrypted=False, msg_type='', subject=None, resource='', msg_id=None, user_nick='', advanced_notif_num=None, xhtml=None, form_node=None): + contact = None # if chat window will be for specific resource resource_for_chat = resource From 20beea4b4991d6c6c3574976b239f1dd1e9c1741 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Fri, 2 May 2008 02:32:28 +0000 Subject: [PATCH 13/18] fixed groupchat --- src/chat_control.py | 4 +- src/common/connection_handlers.py | 6 +-- src/gajim.py | 54 +++++++++++---------- src/groupchat_control.py | 11 +++-- src/message_window.py | 47 ++++++++++++++---- src/roster_window.py | 79 ++++++++++++++++--------------- src/session.py | 2 +- src/vcard.py | 8 ++-- 8 files changed, 122 insertions(+), 89 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index 2c1a51a01..002f7cb8c 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -916,7 +916,7 @@ class ChatControlBase(MessageControl): # TODO : get the contact and check notify.get_show_in_roster() if self.type_id == message_control.TYPE_PM: room_jid, nick = gajim.get_room_and_nick_from_fjid(jid) - groupchat_control = gajim.interface.msg_win_mgr.get_control( + groupchat_control = gajim.interface.msg_win_mgr.get_gc_control( room_jid, self.account) if room_jid in gajim.interface.minimized_controls[self.account]: groupchat_control = \ @@ -927,7 +927,7 @@ class ChatControlBase(MessageControl): 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) + mw = gajim.interface.msg_win_mgr.get_gc_window(room_jid, self.account) if mw: mw.redraw_tab(groupchat_control) else: diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 29b27e479..3e9fece19 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1298,7 +1298,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, reply.addChild(node=common.xmpp.ErrorNode('service-unavailable', typ='cancel')) con.send(reply) - + raise common.xmpp.NodeProcessed def _InitE2ECB(self, con, stanza, session): @@ -1328,7 +1328,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, errmsg = iq_obj.getErrorMsg() errcode = iq_obj.getErrorCode() self.dispatch('ERROR_ANSWER', (id, jid_from, errmsg, errcode)) - + def _PrivateCB(self, con, iq_obj): ''' Private Data (XEP 048 and 049) @@ -1590,7 +1590,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, try: msg = session.decrypt_stanza(msg) except: - self.dispatch('FAILED_DECRYPT', (frm, tim)) + self.dispatch('FAILED_DECRYPT', (frm, tim, session)) msgtxt = msg.getBody() subject = msg.getSubject() # if not there, it's None diff --git a/src/gajim.py b/src/gajim.py index 3c84e56c7..09bab6b89 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -446,7 +446,7 @@ class Interface: title = data[1] prompt = data[2] proposed_nick = data[3] - gc_control = self.msg_win_mgr.get_control(room_jid, account) + gc_control = self.msg_win_mgr.get_gc_control(room_jid, account) if not gc_control and \ room_jid in self.minimized_controls[account]: gc_control = self.minimized_controls[account][room_jid] @@ -500,9 +500,10 @@ class Interface: (jid_from, file_props)) conn.disconnect_transfer(file_props) return - ctrl = self.msg_win_mgr.get_control(jid_from, account) - if ctrl and ctrl.type_id == message_control.TYPE_GC: - ctrl.print_conversation('Error %s: %s' % (array[2], array[1])) + + for ctrl in self.msg_win_mgr.get_chat_controls(jid_from, account): + if ctrl.type_id == message_control.TYPE_GC: + ctrl.print_conversation('Error %s: %s' % (array[2], array[1])) def handle_event_con_type(self, account, con_type): # ('CON_TYPE', account, con_type) which can be 'ssl', 'tls', 'tcp' @@ -956,21 +957,22 @@ class Interface: win.set_values(vcard) # show avatar in chat - win = None - ctrl = None + ctrls = [] if resource and self.msg_win_mgr.has_window( jid + '/' + resource, account): win = self.msg_win_mgr.get_window(jid + '/' + resource, account) - ctrl = win.get_control(jid + '/' + resource, account) + ctrls = win.get_controls(jid + '/' + resource, account) elif self.msg_win_mgr.has_window(jid, account): win = self.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() + ctrls = win.get_controls(jid, account) + + for ctrl in ctrls: + if ctrl.type_id != message_control.TYPE_GC: + ctrl.show_avatar() # Show avatar in roster or gc_roster - gc_ctrl = self.msg_win_mgr.get_control(jid, account) + gc_ctrl = self.msg_win_mgr.get_gc_control(jid, account) if not gc_ctrl and \ jid in self.minimized_controls[account]: gc_ctrl = self.minimized_controls[account][jid] @@ -1027,26 +1029,25 @@ 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) + control = self.msg_win_mgr.get_gc_control(room_jid, account) + if not control 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: + if not control or (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[11]) + + control.chg_contact_status(nick, show, status, array[4], array[5], + array[6], array[7], array[8], array[9], array[10], array[11]) 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) - - # print status in chat window and update status/GPG image - if ctrl: + # print status in chat windows and update status/GPG image + for ctrl in self.msg_win_mgr.get_chat_controls(fjid, account): statusCode = array[9] if '303' in statusCode: new_nick = array[10] @@ -1082,7 +1083,7 @@ class Interface: jids = array[0].split('/', 1) room_jid = jids[0] - gc_control = self.msg_win_mgr.get_control(room_jid, account) + gc_control = self.msg_win_mgr.get_gc_control(room_jid, account) if not gc_control and \ room_jid in self.minimized_controls[account]: gc_control = self.minimized_controls[account][room_jid] @@ -1115,7 +1116,7 @@ class Interface: jids = array[0].split('/', 1) jid = jids[0] - gc_control = self.msg_win_mgr.get_control(jid, account) + gc_control = self.msg_win_mgr.get_gc_control(jid, account) if not gc_control and \ jid in self.minimized_controls[account]: @@ -1180,7 +1181,7 @@ class Interface: jid = array[0] statusCode = array[1] - gc_control = self.msg_win_mgr.get_control(jid, account) + gc_control = self.msg_win_mgr.get_gc_control(jid, account) if not gc_control and \ jid in self.minimized_controls[account]: gc_control = self.minimized_controls[account][jid] @@ -1239,7 +1240,7 @@ class Interface: 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) + ctrl = win.get_gc_control(room_jid, account) win.remove_tab(ctrl, 3) dlg = dialogs.InputDialog(_('Password Required'), @@ -1782,9 +1783,9 @@ class Interface: AtomWindow.newAtomEntry(atom_entry) def handle_event_failed_decrypt(self, account, data): - jid, tim = data + jid, tim, session = data - ctrl = self.msg_win_mgr.get_control(jid, account) + ctrl = self.msg_win_mgr.get_control(jid, account, session.thread_id) if ctrl: ctrl.print_conversation_line('Unable to decrypt message from %s\nIt may have been tampered with.' % (jid), 'status', '', tim) else: @@ -2583,6 +2584,7 @@ class Interface: data[1], data[3]) gajim.events.remove_events(account, jid, event) self.roster.draw_contact(jid, account) + if w: w.set_active_tab(fjid, account) w.window.present() diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 0234ce5a1..61def8345 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -43,6 +43,7 @@ import cell_renderer_image from common import gajim from common import helpers +from common.stanza_session import StanzaSession from chat_control import ChatControl from chat_control import ChatControlBase @@ -57,7 +58,7 @@ C_TYPE, # type of the row ('contact' or 'role') C_TEXT, # text shown in the cellrenderer C_AVATAR, # avatar of the contact ) = range(5) - + def set_renderer_color(treeview, renderer, set_background = True): '''set style for group row, using PRELIGHT system color''' if set_background: @@ -210,6 +211,9 @@ class GroupchatControl(ChatControlBase): self.new_nick = '' self.name = self.room_jid.split('@')[0] + self.session = StanzaSession(gajim.connections[self.account], + self.room_jid, 'gc', 'gc') + compact_view = gajim.config.get('compact_view') self.chat_buttons_set_visible(compact_view) self.widget_set_visible(self.xml.get_widget('banner_eventbox'), @@ -852,10 +856,9 @@ class GroupchatControl(ChatControlBase): for nick in nick_list: # Update pm chat window fjid = self.room_jid + '/' + nick - ctrl = gajim.interface.msg_win_mgr.get_control(fjid, self.account) gc_contact = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick) - if ctrl: + for ctrl in gajim.interface.msg_win_mgr.get_chat_controls(fjid, self.account): gc_contact.show = 'offline' gc_contact.status = '' ctrl.update_ui() @@ -2022,7 +2025,7 @@ class GroupchatControl(ChatControlBase): menu.show_all() menu.popup(None, None, None, event.button, event.time) - def _start_private_message(self, nick, session = None): + def _start_private_message(self, nick): gc_c = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick) nick_jid = gc_c.get_full_jid() diff --git a/src/message_window.py b/src/message_window.py index 5f857d841..74aa6f16a 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -396,8 +396,7 @@ class MessageWindow(object): else: gtkgui_helpers.set_unset_urgency_hint(self.window, False) - def set_active_tab(self, session): - ctrl = self._controls[session.conn.name][session.jid][session.thread_id] + def set_active_tab(self, ctrl): ctrl_page = self.notebook.page_num(ctrl.widget) self.notebook.set_current_page(ctrl_page) @@ -538,16 +537,16 @@ class MessageWindow(object): for ctrl in self.controls(): ctrl.update_tags() - def get_control(self, key, acct): + def get_control(self, key, acct, thread_id): '''Return the MessageControl for jid or n, where n is a notebook page index. - When key is an int index acct may be None''' + When key is an int index acct and thread_id may be None''' if isinstance(key, str): key = unicode(key, 'utf-8') if isinstance(key, unicode): jid = key try: - return self._controls[acct][jid] + return self._controls[acct][jid][thread_id] except: return None else: @@ -558,6 +557,15 @@ class MessageWindow(object): nth_child = notebook.get_nth_page(page_num) return self._widget_to_control(nth_child) + def get_gc_control(self, jid, acct): + return self.get_control(jid, acct, 'gc') + + def get_controls(self, jid, acct): + try: + return self._controls[acct][jid].values() + except KeyError: + return [] + def change_key(self, old_jid, new_jid, acct): '''Change the key of a control''' try: @@ -594,7 +602,7 @@ class MessageWindow(object): ind = ind - 1 if ind < 0: ind = self.notebook.get_n_pages() - 1 - ctrl = self.get_control(ind, None) + ctrl = self.get_control(ind, None, None) if ctrl.get_nb_unread() > 0: found = True break # found @@ -786,8 +794,19 @@ class MessageWindowMgr(gobject.GObject): def get_window(self, jid, acct): for win in self.windows(): - if win.get_control(jid, acct): - return win + try: + if win._controls[acct][jid]: + return win + except KeyError: + pass + return None + + def get_gc_control(self, jid, acct): + win = self.get_window(jid, acct) + + if win: + return win.get_gc_control(jid, acct) + return None def has_window(self, jid, acct): @@ -914,11 +933,11 @@ class MessageWindowMgr(gobject.GObject): del self._windows[k] return - def get_control(self, jid, acct): + def get_control(self, jid, acct, session): '''Amongst all windows, return the MessageControl for jid''' win = self.get_window(jid, acct) if win: - return win.get_control(jid, acct) + return win.get_control(jid, acct, session) return None def get_controls(self, type = None, acct = None): @@ -930,6 +949,14 @@ class MessageWindowMgr(gobject.GObject): ctrls.append(c) return ctrls + def get_chat_controls(self, jid, acct): + win = self.get_window(jid, acct) + + if win: + return win.get_controls(jid, acct) + else: + return [] + def windows(self): for w in self._windows.values(): yield w diff --git a/src/roster_window.py b/src/roster_window.py index c5145868a..315683761 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -777,12 +777,13 @@ class RosterWindow: def join_gc_room(self, account, room_jid, nick, password, minimize=False, is_continued=False): - '''joins the room immediatelly''' + '''joins the room immediately''' 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) + ctrl = gajim.interface.msg_win_mgr.get_gc_control(room_jid, account) win.window.present() - win.set_active_tab(room_jid, account) + win.set_active_tab(ctrl) dialogs.ErrorDialog(_('You are already in group chat %s') % room_jid) return minimized_control_exists = False @@ -808,7 +809,8 @@ class RosterWindow: 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) + gc_control = gc_win.get_gc_control(room_jid, account) + gc_win.set_active_tab(gc_control) gc_win.window.present() gajim.connections[account].join_gc(nick, room_jid, password) if password: @@ -1361,10 +1363,10 @@ class RosterWindow: gajim.transport_avatar[account][host] = [contact1.jid] else: gajim.transport_avatar[account][host].append(contact1.jid) - # If we already have a chat window opened, update it with new contact + + # If we already have chat windows opened, update them with new contact # instance - chat_control = gajim.interface.msg_win_mgr.get_control(ji, account) - if chat_control: + for chat_control in gajim.interface.msg_win_mgr.get_chat_controls(ji, account): chat_control.contact = contact1 def chg_contact_status(self, contact, show, status, account): @@ -1385,28 +1387,30 @@ class RosterWindow: account): win = gajim.interface.msg_win_mgr.get_window(jid_with_resource, account) - ctrl = win.get_control(jid_with_resource, account) - ctrl.update_ui() - win.redraw_tab(ctrl) + for ctrl in win.get_controls(jid_with_resource, account): + ctrl.update_ui() + win.redraw_tab(ctrl) + gajim.contacts.remove_contact(account, contact) self.remove_contact(contact, account) self.add_contact_to_roster(contact.jid, account) # print status in chat window and update status/GPG image 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) - 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') + + for ctrl in win.get_controls(contact.jid, account): + ctrl.contact = gajim.contacts.get_contact_with_highest_priority( + account, contact.jid) + ctrl.update_ui() + win.redraw_tab(ctrl) + + 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') # unset custom status if gajim.interface.status_sent_to_users.has_key(account) and \ @@ -1808,9 +1812,8 @@ class RosterWindow: u.name = new_text gajim.connections[account].update_contact(jid, new_text, u.groups) self.draw_contact(jid, account) - # Update opened chat - ctrl = gajim.interface.msg_win_mgr.get_control(jid, account) - if ctrl: + # Update opened chats + for ctrl in gajim.interface.msg_win_mgr.get_controls(jid, account): ctrl.update_ui() win = gajim.interface.msg_win_mgr.get_window(jid, account) win.redraw_tab(ctrl) @@ -1858,8 +1861,9 @@ class RosterWindow: # Close chat window msg_win = gajim.interface.msg_win_mgr.get_window(contact.jid, account) - ctrl = gajim.interface.msg_win_mgr.get_control(contact.jid, account) - msg_win.remove_tab(ctrl, msg_win.CLOSE_CLOSE_BUTTON) + for ctrl in gajim.interface.msg_win_mgr.get_controls(contact.jid, + account): + msg_win.remove_tab(ctrl, msg_win.CLOSE_CLOSE_BUTTON) else: need_readd = True if need_readd: @@ -1918,8 +1922,7 @@ class RosterWindow: keyID = keyID[0] keys[contact.jid] = keyID - if gajim.interface.msg_win_mgr.has_window(contact.jid, account): - ctrl = gajim.interface.msg_win_mgr.get_control(contact.jid, account) + for ctrl in gajim.interface.msg_win_mgr.get_chat_controls(contact.jid, account): ctrl.update_ui() keys_str = '' for jid in keys: @@ -1934,10 +1937,9 @@ class RosterWindow: 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() + for ctrl in gajim.interface.msg_win_mgr.get_chat_controls(jid, account): + if 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): @@ -2654,7 +2656,7 @@ class RosterWindow: ctrl.account, ctrl.type_id) ctrl.parent_win = mw mw.new_tab(ctrl) - mw.set_active_tab(jid, account) + mw.set_active_tab(ctrl) mw.window.present() del gajim.interface.minimized_controls[account][jid] @@ -3971,12 +3973,12 @@ class RosterWindow: session.control.read_queue() mw = gajim.interface.msg_win_mgr.get_window(fjid, account) - mw.set_active_tab(fjid, account) + mw.set_active_tab(session.control) mw.window.present() # For JEP-0172 if added_to_roster: - mc = mw.get_control(fjid, account) - mc.user_nick = gajim.nicks[account] + for mc in mw.get_controls(fjid, account): + mc.user_nick = gajim.nicks[account] def new_room(self, room_jid, nick, account, is_continued=False): # Get target window, create a control, and associate it with the window @@ -4322,10 +4324,11 @@ class RosterWindow: gajim.last_message_time[account][session.control.get_full_jid()] = 0 win = session.control.parent_win - win.set_active_tab(session) + win.set_active_tab(session.control) if conn.is_zeroconf and conn.status in ('offline', 'invisible'): - win.get_control(fjid, account).got_disconnected() + for ctrl in win.get_controls(fjid, account): + ctrl.got_disconnected() win.window.present() diff --git a/src/session.py b/src/session.py index f77569c16..1f11450b3 100644 --- a/src/session.py +++ b/src/session.py @@ -107,7 +107,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): if gajim.jid_is_transport(jid): jid = jid.replace('@', '') - groupchat_control = gajim.interface.msg_win_mgr.get_control(jid, self.conn.name) + #groupchat_control = gajim.interface.msg_win_mgr.get_control(jid, self.conn.name) # XXX fixme # if not groupchat_control and \ diff --git a/src/vcard.py b/src/vcard.py index b6fcc3695..d1b974198 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -123,11 +123,9 @@ class VcardWindow: 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: + # Update chat windows + for ctrl in gajim.interface.msg_win_mgr.get_chat_controls(jid, self.account): + if ctrl.type_id != message_control.TYPE_GC: ctrl.show_avatar() def on_vcard_information_window_destroy(self, widget): From 99f2997d2707afc1805256131ea2e812b7e69bcc Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sat, 3 May 2008 00:10:17 +0000 Subject: [PATCH 14/18] pm fixes --- src/chat_control.py | 5 ++--- src/common/connection_handlers.py | 3 ++- src/gajim.py | 2 +- src/groupchat_control.py | 19 ++++++++++++------- src/roster_window.py | 3 +++ src/session.py | 23 +++++++++++------------ 6 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index 002f7cb8c..b130d2f86 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -927,9 +927,8 @@ class ChatControlBase(MessageControl): if contact: gajim.interface.roster.draw_contact(room_jid, self.account) groupchat_control.draw_contact(nick) - mw = gajim.interface.msg_win_mgr.get_gc_window(room_jid, self.account) - if mw: - mw.redraw_tab(groupchat_control) + if groupchat_control.parent_win: + groupchat_control.parent_win.redraw_tab(groupchat_control) else: gajim.interface.roster.draw_contact(jid, self.account) gajim.interface.roster.show_title() diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 3e9fece19..11629328e 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1029,7 +1029,7 @@ class ConnectionVcard: gajim.interface.remove_avatar_files(our_jid) self.awaiting_answers[id] = (VCARD_PUBLISHED, iq2) - + def _IqCB(self, con, iq_obj): id = iq_obj.getID() @@ -1081,6 +1081,7 @@ class ConnectionVcard: our_jid = gajim.get_jid_from_account(self.name) if iq_obj.getType() == 'error' and jid == our_jid: # our server doesn't support vcard + gajim.log.debug('xxx error xxx') self.vcard_supported = False if not iq_obj.getTag('vCard') or iq_obj.getType() == 'error': if frm and frm != our_jid: diff --git a/src/gajim.py b/src/gajim.py index 09bab6b89..046792cc6 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -727,7 +727,7 @@ class Interface: full_jid_with_resource = array[0] jids = full_jid_with_resource.split('/', 1) jid = jids[0] - gc_control = self.msg_win_mgr.get_control(jid, account) + gc_control = self.msg_win_mgr.get_gc_control(jid, account) if not gc_control and \ jid in self.minimized_controls[account]: gc_control = self.minimized_controls[account][jid] diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 61def8345..88862e5c4 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -121,7 +121,7 @@ class PrivateChatControl(ChatControl): 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) + room_ctrl = gajim.interface.msg_win_mgr.get_gc_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 @@ -448,9 +448,9 @@ class GroupchatControl(ChatControlBase): 'state_muc_msg_color') if color_name: color = gtk.gdk.colormap_get_system().alloc_color(color_name) - + label_str = self.name - + # count waiting highlighted messages unread = '' num_unread = self.get_nb_unread() @@ -604,9 +604,11 @@ class GroupchatControl(ChatControlBase): no_queue = len(gajim.events.get_events(self.account, fjid)) == 0 # We print if window is opened - pm_control = gajim.interface.msg_win_mgr.get_control(fjid, self.account) + pm_control = gajim.interface.msg_win_mgr.get_control(fjid, self.account, session) + if pm_control: pm_control.print_conversation(msg, tim = tim, xhtml = xhtml) + return event = gajim.events.create_event('pm', (msg, '', 'incoming', tim, @@ -883,7 +885,7 @@ class GroupchatControl(ChatControlBase): def on_send_pm(self, widget = None, model = None, iter = None, nick = None, msg = None): - '''opens a chat window and msg is not None sends private message to a + '''opens a chat window and if msg is not None sends private message to a contact in a room''' if nick is None: nick = model[iter][C_NICK].decode('utf-8') @@ -1603,7 +1605,7 @@ class GroupchatControl(ChatControlBase): for nick in nick_list: # Update pm chat window fjid = self.room_jid + '/' + nick - ctrl = gajim.interface.msg_win_mgr.get_control(fjid, self.account) + ctrl = gajim.interface.msg_win_mgr.get_gc_control(fjid, self.account) if ctrl: contact = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick) contact.show = 'offline' @@ -2033,7 +2035,10 @@ class GroupchatControl(ChatControlBase): if not win: 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) + + ctrl = win.get_controls(nick_jid, self.account)[0] + + win.set_active_tab(ctrl) win.window.present() def on_row_activated(self, widget, path): diff --git a/src/roster_window.py b/src/roster_window.py index 315683761..0af45b8ec 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -3927,6 +3927,9 @@ class RosterWindow: if not mw: mw = gajim.interface.msg_win_mgr.create_window(contact, account, type_) + if not session: + session = gajim.connections[account].get_session(fjid, None, 'pm') + chat_control = PrivateChatControl(mw, gc_contact, contact, account, session) mw.new_tab(chat_control) if len(gajim.events.get_events(account, fjid)): diff --git a/src/session.py b/src/session.py index 1f11450b3..cfeb407bd 100644 --- a/src/session.py +++ b/src/session.py @@ -107,19 +107,18 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): if gajim.jid_is_transport(jid): jid = jid.replace('@', '') - #groupchat_control = gajim.interface.msg_win_mgr.get_control(jid, self.conn.name) + groupchat_control = gajim.interface.msg_win_mgr.get_gc_control(jid, self.conn.name) -# XXX fixme -# if not groupchat_control and \ -# jid in gajim.interface.minimized_controls[self.conn.name]: -# groupchat_control = self.minimized_controls[self.conn.name][jid] + if not groupchat_control and \ + jid in gajim.interface.minimized_controls[self.conn.name]: + groupchat_control = self.minimized_controls[self.conn.name][jid] pm = False -# if groupchat_control and groupchat_control.type_id == \ -# message_control.TYPE_GC: + if groupchat_control and groupchat_control.type_id == \ + message_control.TYPE_GC: # It's a Private message -# pm = True -# msg_type = 'pm' + pm = True + msg_type = 'pm' jid_of_control = full_jid_with_resource @@ -134,7 +133,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): contact.chatstate = chatstate if contact.our_chatstate == 'ask': # we were jep85 disco? contact.our_chatstate = 'active' # no more - #self.control.handle_incoming_chatstate() XXX + self.control.handle_incoming_chatstate() elif contact.chatstate != 'active': # got no valid jep85 answer, peer does not support it contact.chatstate = False @@ -168,8 +167,8 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): if pm: nickname = resource - groupchat_control.on_private_message(nickname, msgtxt, array[2], - xhtml, session, msg_id) + groupchat_control.on_private_message(nickname, msgtxt, tim, + xhtml, self, msg_id) else: self.roster_message(jid, msgtxt, tim, encrypted, msg_type, subject, resource, msg_id, user_nick, advanced_notif_num, From f3b154e429c3e10424044959072037d67f12abb0 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sat, 3 May 2008 16:50:16 +0000 Subject: [PATCH 15/18] made compatible with python 2.4 --- src/tictactoe.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/tictactoe.py b/src/tictactoe.py index 083375cbe..9adf0da80 100644 --- a/src/tictactoe.py +++ b/src/tictactoe.py @@ -270,24 +270,32 @@ class TicTacToeBoard: for d in xrange(-strike, strike): # vertical check try: - tallyI = tallyI + 1 if self.board[r+d][c] == p else 0 + tallyI = tallyI + 1 + if self.board[r+d][c] != p: + tallyI = 0 except IndexError: pass # horizontal check try: - tally_ = tally_ + 1 if self.board[r][c+d] == p else 0 + tally_ = tally_ + 1 + if self.board[r][c+d] != p: + tally_ = 0 except IndexError: pass # diagonal checks try: - tallyL = tallyL + 1 if self.board[r+d][c+d] == p else 0 + tallyL = tallyL + 1 + if self.board[r+d][c+d] != p: + tallyL = 0 except IndexError: pass try: - tallyF = tallyF + 1 if self.board[r+d][c-d] == p else 0 + tallyF = tallyF + 1 + if self.board[r+d][c-d] != p: + tallyF = 0 except IndexError: pass From d15b9dea6ee283e4578109225b73105f93186cda Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sat, 3 May 2008 16:52:27 +0000 Subject: [PATCH 16/18] reuse existing chat sessions and controls --- src/common/connection_handlers.py | 4 +-- .../zeroconf/connection_handlers_zeroconf.py | 4 +-- src/roster_window.py | 31 +++++++++++++++---- src/session.py | 6 ++++ 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 11629328e..bc007fdd1 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -1558,7 +1558,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, return elif mtype != 'groupchat': - session = self.get_session(frm, thread_id, mtype) + session = self.get_or_create_session(frm, thread_id, mtype) if thread_id and not session.received_thread_id: session.received_thread_id = True @@ -1731,7 +1731,7 @@ class ConnectionHandlers(ConnectionVcard, ConnectionBytestream, ConnectionDisco, self.dispatch('GC_INVITATION',(frm, jid_from, reason, password, is_continued)) - def get_session(self, jid, thread_id, type): + def get_or_create_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) diff --git a/src/common/zeroconf/connection_handlers_zeroconf.py b/src/common/zeroconf/connection_handlers_zeroconf.py index 848bdff9e..d6b1993fb 100644 --- a/src/common/zeroconf/connection_handlers_zeroconf.py +++ b/src/common/zeroconf/connection_handlers_zeroconf.py @@ -658,7 +658,7 @@ class ConnectionHandlersZeroconf(ConnectionVcard, ConnectionBytestream): frm = unicode(frm) jid = frm - session = self.get_session(frm, thread_id, mtype) + session = self.get_or_create_session(frm, thread_id, mtype) if thread_id and not session.received_thread_id: session.received_thread_id = True @@ -794,7 +794,7 @@ class ConnectionHandlersZeroconf(ConnectionVcard, ConnectionBytestream): raise common.xmpp.NodeProcessed - def get_session(self, jid, thread_id, type): + def get_or_create_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) diff --git a/src/roster_window.py b/src/roster_window.py index 0af45b8ec..5c2e21ebf 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -56,6 +56,8 @@ from chat_control import ChatControl from groupchat_control import GroupchatControl from groupchat_control import PrivateChatControl +from session import ChatControlSession + from common import dbus_support if dbus_support.supported: from music_track_listener import MusicTrackListener @@ -3390,7 +3392,7 @@ class RosterWindow: x_min = 0 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 + # Don't handle double click if we press icon of a metacontact iter = model.get_iter(path) if x > x_min and x < x_min + 27 and type_ == 'contact' and \ model.iter_has_child(iter): @@ -3928,7 +3930,7 @@ class RosterWindow: mw = gajim.interface.msg_win_mgr.create_window(contact, account, type_) if not session: - session = gajim.connections[account].get_session(fjid, None, 'pm') + session = gajim.connections[account].get_or_create_session(fjid, None, 'pm') chat_control = PrivateChatControl(mw, gc_contact, contact, account, session) mw.new_tab(chat_control) @@ -3967,7 +3969,7 @@ class RosterWindow: contact = self.add_to_not_in_the_roster(account, jid, resource = resource) - session = gajim.connections[account].get_session(fjid, None, 'chat') + session = gajim.connections[account].get_or_create_session(fjid, None, 'chat') if not gajim.interface.msg_win_mgr.has_window(fjid, account): session.control = self.new_chat(session, contact, account, resource = resource) @@ -4314,10 +4316,26 @@ class RosterWindow: conn = gajim.connections[account] + if not session and fjid in conn.sessions: + sessions = filter(lambda s: isinstance(s, ChatControlSession), + conn.sessions[fjid].values()) + + # look for an existing session with a chat control + for s in sessions: + if s.control: + session = s + break + + if not session and not len(sessions) == 0: + # there are no sessions with chat controls, just take the first one + session = sessions[0] + if not session: - session = conn.get_session(fjid, None, 'chat') + # couldn't find an existing ChatControlSession, just make a new one + session = conn.make_new_session(fjid, None, 'chat') if not session.control: + # open a new chat control session.control = self.new_chat(session, contact, account, resource=resource) if len(gajim.events.get_events(account, fjid)): @@ -4336,8 +4354,8 @@ class RosterWindow: win.window.present() def on_row_activated(self, widget, path): - '''When an iter is activated (dubblick or single click if gnome is set - this way''' + '''When an iter is activated (double-click 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] @@ -4384,6 +4402,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, session = session) def on_roster_treeview_row_activated(self, widget, path, col = 0): diff --git a/src/session.py b/src/session.py index cfeb407bd..72d89dcda 100644 --- a/src/session.py +++ b/src/session.py @@ -19,6 +19,12 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): self.control = None + def acknowledge_termination(self): + # the other party terminated the session. we'll keep the control around, though. + stanza_session.EncryptedStanzaSession.acknowledge_termination(self) + + self.control.session = None + # remove events associated with this session from the queue def remove_events(self, types): any_removed = False From be0af1a56bedebeb1c53223559372c52e4a0f07c Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sat, 3 May 2008 23:19:02 +0000 Subject: [PATCH 17/18] couple of quick bugfixes --- src/session.py | 3 ++- src/tictactoe.py | 20 ++++++++------------ 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/session.py b/src/session.py index 72d89dcda..195764074 100644 --- a/src/session.py +++ b/src/session.py @@ -23,7 +23,8 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): # the other party terminated the session. we'll keep the control around, though. stanza_session.EncryptedStanzaSession.acknowledge_termination(self) - self.control.session = None + if self.control: + self.control.session = None # remove events associated with this session from the queue def remove_events(self, types): diff --git a/src/tictactoe.py b/src/tictactoe.py index 9adf0da80..a8500af45 100644 --- a/src/tictactoe.py +++ b/src/tictactoe.py @@ -253,6 +253,7 @@ class TicTacToeBoard: self.setup_window() + # check if the last move (at row r and column c) won the game def check_for_strike(self, p, r, c, strike): # number in a row: up and down, left and right tallyI = 0 @@ -268,36 +269,31 @@ class TicTacToeBoard: c -= 1 for d in xrange(-strike, strike): + r_in_range = 0 <= r+d < self.rows + c_in_range = 0 <= c+d < self.cols + # vertical check - try: + if r_in_range: tallyI = tallyI + 1 if self.board[r+d][c] != p: tallyI = 0 - except IndexError: - pass # horizontal check - try: + if c_in_range: tally_ = tally_ + 1 if self.board[r][c+d] != p: tally_ = 0 - except IndexError: - pass # diagonal checks - try: + if r_in_range and c_in_range: tallyL = tallyL + 1 if self.board[r+d][c+d] != p: tallyL = 0 - except IndexError: - pass - try: + if r_in_range and 0 <= c-d < self.cols: tallyF = tallyF + 1 if self.board[r+d][c-d] != p: tallyF = 0 - except IndexError: - pass if any([t == strike for t in (tallyL, tallyF, tallyI, tally_)]): return True From 1962b231e6b03dc4423e62efe9c7aa318ec7d282 Mon Sep 17 00:00:00 2001 From: Brendan Taylor Date: Sun, 4 May 2008 00:24:27 +0000 Subject: [PATCH 18/18] pm bugfix --- src/chat_control.py | 24 ++++++++++++------------ src/gajim.py | 1 + src/groupchat_control.py | 13 +++++++------ src/message_control.py | 30 +++++++++++------------------- src/message_window.py | 22 +++++++++++++++++----- 5 files changed, 48 insertions(+), 42 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index b130d2f86..89aff6890 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -1586,7 +1586,7 @@ class ChatControl(ChatControlBase): elif num_unread > 1: unread = '[' + unicode(num_unread) + ']' - # Draw tab label using chatstate + # Draw tab label using chatstate theme = gajim.config.get('roster_theme') color = None if not chatstate: @@ -1846,6 +1846,7 @@ class ChatControl(ChatControlBase): self.contact.chatstate = None self.contact.our_chatstate = None + # terminate session self.session.control = None # Disconnect timer callbacks @@ -2077,12 +2078,11 @@ class ChatControl(ChatControlBase): # reset to status image in gc if it is a pm # Is it a pm ? room_jid, nick = gajim.get_room_and_nick_from_fjid(jid) -# XXX fixme somehow -# control = gajim.interface.msg_win_mgr.get_control(room_jid, self.account) -# if control and control.type_id == message_control.TYPE_GC: -# control.update_ui() -# control.parent_win.show_title() -# typ = 'pm' + control = gajim.interface.msg_win_mgr.get_gc_control(room_jid, self.account) + if control and control.type_id == message_control.TYPE_GC: + control.update_ui() + control.parent_win.show_title() + typ = 'pm' self.redraw_after_event_removed(jid) if (self.contact.show in ('offline', 'error')): @@ -2093,8 +2093,8 @@ class ChatControl(ChatControlBase): len(gajim.contacts.get_contacts(self.account, jid)) < 2): gajim.interface.roster.really_remove_contact(self.contact, self.account) -# elif typ == 'pm': -# control.remove_contact(nick) + elif typ == 'pm': + control.remove_contact(nick) def show_bigger_avatar(self, small_avatar): '''resizes the avatar, if needed, so it has at max half the screen size @@ -2140,18 +2140,18 @@ class ChatControl(ChatControlBase): 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 window.window.shape_combine_mask(mask, 0, 0) - # make the bigger avatar window show up centered + # make the bigger avatar window show up centered x0, y0 = small_avatar.window.get_origin() x0 += small_avatar.allocation.x y0 += small_avatar.allocation.y center_x= x0 + (small_avatar.allocation.width / 2) center_y = y0 + (small_avatar.allocation.height / 2) - pos_x, pos_y = center_x - (avatar_w / 2), center_y - (avatar_h / 2) + pos_x, pos_y = center_x - (avatar_w / 2), center_y - (avatar_h / 2) window.move(pos_x, pos_y) # make the cursor invisible so we can see the image invisible_cursor = gtkgui_helpers.get_invisible_cursor() diff --git a/src/gajim.py b/src/gajim.py index 046792cc6..328ab47ac 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -1924,6 +1924,7 @@ class Interface: if ctrl: new_sess = gajim.connections[account].make_new_session(str(jid)) ctrl.set_session(new_sess) + gajim.connections[account].delete_session(str(jid), session.thread_id) if was_encrypted: ctrl.print_esession_details() diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 88862e5c4..009ac3e1b 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -604,7 +604,7 @@ class GroupchatControl(ChatControlBase): no_queue = len(gajim.events.get_events(self.account, fjid)) == 0 # We print if window is opened - pm_control = gajim.interface.msg_win_mgr.get_control(fjid, self.account, session) + pm_control = session.control if pm_control: pm_control.print_conversation(msg, tim = tim, xhtml = xhtml) @@ -632,7 +632,7 @@ class GroupchatControl(ChatControlBase): self.parent_win.show_title() self.parent_win.redraw_tab(self) else: - self._start_private_message(nick, session) + self._start_private_message(nick) # Scroll to line self.list_treeview.expand_row(path[0:1], False) self.list_treeview.scroll_to_cell(path) @@ -891,10 +891,9 @@ class GroupchatControl(ChatControlBase): nick = model[iter][C_NICK].decode('utf-8') fjid = gajim.construct_fjid(self.room_jid, nick) # 'fake' jid - self._start_private_message(nick) + ctrl = self._start_private_message(nick) if msg: - gajim.interface.msg_win_mgr.get_control(fjid, self.account).\ - send_message(msg) + ctrl.send_message(msg) def on_send_file(self, widget, gc_contact): '''sends a file to a contact in the room''' @@ -2041,6 +2040,8 @@ class GroupchatControl(ChatControlBase): win.set_active_tab(ctrl) win.window.present() + return ctrl + def on_row_activated(self, widget, path): '''When an iter is activated (dubblick or single click if gnome is set this way''' @@ -2099,7 +2100,7 @@ class GroupchatControl(ChatControlBase): return if gajim.single_click and not event.state & gtk.gdk.SHIFT_MASK: - self.on_row_activated(widget, path) + self.on_row_activated(widget, path) return True else: model = widget.get_model() diff --git a/src/message_control.py b/src/message_control.py index e2e903824..a1c99a55b 100644 --- a/src/message_control.py +++ b/src/message_control.py @@ -117,25 +117,24 @@ class MessageControl: return len(gajim.events.get_events(self.account, self.contact.jid)) def set_session(self, session): - if hasattr(self, 'session') and session == self.session: + oldsession = None + if hasattr(self, 'session'): + oldsession = self.session + + if oldsession and session == oldsession: return - was_encrypted = False - - if hasattr(self, 'session') and self.session: - if self.session.enable_encryption: - was_encrypted = True - - 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() + if oldsession: + self.parent_win.change_thread_key(self.contact.jid, + self.account, oldsession.thread_id, session.thread_id) + + if oldsession.enable_encryption: + self.print_esession_details() def send_message(self, message, keyID = '', type = 'chat', chatstate = None, msg_id = None, composing_xep = None, resource = None, @@ -144,13 +143,6 @@ class MessageControl: ''' jid = self.contact.jid - if not self.session: - print('uhoh new 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, diff --git a/src/message_window.py b/src/message_window.py index 74aa6f16a..20f2f2e46 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -429,6 +429,7 @@ class MessageWindow(object): fjid = ctrl.get_full_jid() thread_id = ctrl.session.thread_id + del self._controls[ctrl.account][fjid][thread_id] if len(self._controls[ctrl.account][fjid]) == 0: @@ -567,19 +568,30 @@ class MessageWindow(object): return [] def change_key(self, old_jid, new_jid, acct): - '''Change the key of a control''' + '''Change the JID key of a control''' try: - # Check if control exists - ctrl = self._controls[acct][old_jid] - except: + # Check if controls exists + ctrls = self._controls[acct][old_jid] + except KeyError: return - self._controls[acct][new_jid] = self._controls[acct][old_jid] + self._controls[acct][new_jid] = ctrls 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 change_thread_key(self, jid, acct, old_thread_id, new_thread_id): + '''Change the thread_id key of a control''' + try: + # Check if control exists + ctrl = self._controls[acct][jid][old_thread_id] + except KeyError: + return + + self._controls[acct][jid][new_thread_id] = ctrl + del self._controls[acct][jid][old_thread_id] + def controls(self): for jid_dict in self._controls.values(): for ctrl_dict in jid_dict.values():