diff --git a/README.html b/README.html index 38861e74b30d03a3cf20f80ef5645c221c1da245..5fa6156a9959091376985378717e584a3c2efeac 100644 --- a/README.html +++ b/README.html @@ -14,8 +14,9 @@ <h2>Runtime Requirements</h2> <ul> -<li>python2.5 or higher</li> -<li>pygtk2.22 or higher</li> +<li>python2.7 or higher</li> +<li>python-gi</li> +<li>gir1.2-gtk-3.0</li> <li>python-nbxmpp</li> </ul> @@ -28,7 +29,7 @@ <li>For zeroconf (bonjour), the "enable link-local messaging" checkbox, you need dbus-glib, python-avahi</li> <li>dnsutils (or whatever package provides the nslookup binary) for SRV support</li> <li>gtkspell and aspell-LANG where lang is your locale eg. en, fr etc</li> -<li>gnome-python-desktop (for GnomeKeyring support as password storage)</li> +<li>gir1.2-gnomekeyring-1.0 for GnomeKeyring support as password storage</li> <li>kwalletcli (for support of KDE Wallet as password storage)</li> <li>notification-daemon or notify-python (and D-Bus) to get cooler popups</li> <li>D-Bus running to have gajim-remote working. Some distributions split dbus-x11, which is needed for dbus to work with Gajim. Version >= 0.80 is required.</li> diff --git a/build.bat b/build.bat index f3e8c7113b0c29712bfa8137c0a0c77893c6120c..e427d8ab33b0e2ad9273c9bc8d03fa08b4725fd9 100644 --- a/build.bat +++ b/build.bat @@ -22,6 +22,9 @@ rename exe.win32-2.7 bin copy ..\LIBEAY32.dll bin copy ..\SSLEAY32.dll bin +REM for snarl plugin +xcopy ..\win32com bin\win32com /e /i + mkdir bin\gtk cd ../src/gtk hg archive ..\..\gajim_built\bin\gtk diff --git a/data/Makefile.am b/data/Makefile.am index 827882796f6fb4f08f82c60f49aadea1e22f90db..81c1c2967901a60f8af97ae8e9af4fc539bbaabf 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -12,7 +12,9 @@ soundsdir = $(pkgdatadir)/data/sounds sounds_DATA = $(srcdir)/sounds/*.wav otherdir = $(pkgdatadir)/data/other -other_DATA = other/servers.xml other/cacerts.pem +other_DATA = other/servers.xml other/dh4096.pem +# other/cacert.pem is used only on Windows. On Unix platforms +# use CA certificates installed in /etc/ssl/certs man_MANS = gajim.1 gajim-remote.1 gajim-history-manager.1 diff --git a/data/gui/account_context_menu.ui b/data/gui/account_context_menu.ui index a2840e785a7beff852427df8a18eeee917babe16..0924fb7de7c3b66ba8cb7aafa14f78c63a12a714 100644 --- a/data/gui/account_context_menu.ui +++ b/data/gui/account_context_menu.ui @@ -40,7 +40,7 @@ </child> <child> <object class="GtkImageMenuItem" id="join_group_chat_menuitem"> - <property name="label" translatable="yes">Join _Group Chat...</property> + <property name="label" translatable="yes">Join _Group Chat</property> <property name="visible">True</property> <property name="use_underline">True</property> <property name="image">image4</property> @@ -93,7 +93,7 @@ </child> <child> <object class="GtkImageMenuItem" id="edit_account_menuitem"> - <property name="label" translatable="yes">_Modify Account</property> + <property name="label" translatable="yes">_Modify Account...</property> <property name="visible">True</property> <property name="use_underline">True</property> <property name="image">image8</property> diff --git a/data/gui/account_creation_wizard_window.ui b/data/gui/account_creation_wizard_window.ui index 41b6a87a9e230f87c4a6ddc202893116f276dbad..1fa4294d0f8c18c8bc96891583abc594ab296653 100644 --- a/data/gui/account_creation_wizard_window.ui +++ b/data/gui/account_creation_wizard_window.ui @@ -1,31 +1,54 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-requires gtk+ 3.0 --> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-preferences</property> + </object> + <object class="GtkImage" id="image3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-apply</property> + </object> + <object class="GtkListStore" id="liststore1"> + <columns> + <!-- column-name item --> + <column type="gchararray"/> + </columns> + <data> + <row> + <col id="0" translatable="yes">None</col> + </row> + </data> + </object> <object class="GtkWindow" id="account_creation_wizard_window"> + <property name="can_focus">False</property> <property name="border_width">12</property> <property name="title" translatable="yes">Gajim: Account Creation Wizard</property> <property name="resizable">False</property> <property name="type_hint">dialog</property> - <signal name="destroy" handler="on_wizard_window_destroy"/> + <signal name="destroy" handler="on_wizard_window_destroy" swapped="no"/> <child> <object class="GtkVBox" id="vbox77"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkNotebook" id="notebook"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="show_tabs">False</property> <property name="show_border">False</property> <child> <object class="GtkVBox" id="vbox78"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">12</property> <child> <object class="GtkLabel" id="label256"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">You need to have an account in order to connect to the Jabber network.</property> @@ -39,18 +62,20 @@ to the Jabber network.</property> <child> <object class="GtkFrame" id="frame33"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment68"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="top_padding">5</property> <property name="left_padding">12</property> <child> <object class="GtkVBox" id="vbox83"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> - <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkRadioButton" id="use_existing_account_radiobutton"> @@ -59,6 +84,7 @@ to the Jabber network.</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> </object> <packing> @@ -74,6 +100,7 @@ to the Jabber network.</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> <property name="group">use_existing_account_radiobutton</property> </object> @@ -90,6 +117,7 @@ to the Jabber network.</property> <child type="label"> <object class="GtkLabel" id="label269"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>Please choose one of the options below:</b></property> <property name="use_markup">True</property> </object> @@ -106,6 +134,7 @@ to the Jabber network.</property> <child type="tab"> <object class="GtkLabel" id="label259"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> <packing> <property name="tab_fill">False</property> @@ -114,12 +143,13 @@ to the Jabber network.</property> <child> <object class="GtkVBox" id="register_vbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> - <property name="orientation">vertical</property> <property name="spacing">12</property> <child> <object class="GtkLabel" id="label270"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes"><b>Please fill in the data for your existing account</b></property> <property name="use_markup">True</property> @@ -133,25 +163,30 @@ to the Jabber network.</property> <child> <object class="GtkTable" id="table27"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="n_rows">3</property> <property name="n_columns">4</property> <property name="column_spacing">12</property> <property name="row_spacing">6</property> + <child> + <placeholder/> + </child> <child> <object class="GtkEntry" id="username_entry"> <property name="visible">True</property> <property name="can_focus">True</property> - <signal name="key_press_event" handler="on_username_entry_key_press_event"/> + <signal name="key-press-event" handler="on_username_entry_key_press_event" swapped="no"/> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkLabel" id="label263"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_Password:</property> <property name="use_underline">True</property> @@ -161,7 +196,7 @@ to the Jabber network.</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -173,9 +208,10 @@ to the Jabber network.</property> <property name="tooltip_text" translatable="yes">If checked, Gajim will remember the password for this account</property> <property name="use_underline">True</property> <property name="focus_on_click">False</property> + <property name="xalign">0.5</property> <property name="active">True</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_save_password_checkbutton_toggled"/> + <signal name="toggled" handler="on_save_password_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="left_attach">2</property> @@ -183,7 +219,7 @@ to the Jabber network.</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -198,12 +234,13 @@ to the Jabber network.</property> <property name="right_attach">2</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkLabel" id="label262"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_Jabber ID:</property> <property name="use_underline">True</property> @@ -211,30 +248,20 @@ to the Jabber network.</property> </object> <packing> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkLabel" id="label1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label">@</property> </object> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> - <property name="x_options"></property> - </packing> - </child> - <child> - <object class="GtkComboBoxEntry" id="server_comboboxentry"> - <property name="visible">True</property> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> + <property name="x_options"/> </packing> </child> <child> @@ -244,8 +271,9 @@ to the Jabber network.</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_anonymous_checkbutton1_toggled"/> + <signal name="toggled" handler="on_anonymous_checkbutton1_toggled" swapped="no"/> </object> <packing> <property name="left_attach">1</property> @@ -260,6 +288,7 @@ to the Jabber network.</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -271,6 +300,7 @@ to the Jabber network.</property> <child type="tab"> <object class="GtkLabel" id="label261"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> <packing> <property name="position">1</property> @@ -280,12 +310,13 @@ to the Jabber network.</property> <child> <object class="GtkVBox" id="vbox105"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> - <property name="orientation">vertical</property> <property name="spacing">12</property> <child> <object class="GtkLabel" id="label368"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes"><b>Please select a server</b></property> <property name="use_markup">True</property> @@ -299,10 +330,12 @@ to the Jabber network.</property> <child> <object class="GtkHBox" id="hbox2997"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="label369"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_Server:</property> <property name="use_underline">True</property> @@ -313,14 +346,6 @@ to the Jabber network.</property> <property name="position">0</property> </packing> </child> - <child> - <object class="GtkComboBoxEntry" id="server_comboboxentry1"> - <property name="visible">True</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> </object> <packing> <property name="expand">False</property> @@ -335,10 +360,12 @@ to the Jabber network.</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> @@ -349,6 +376,7 @@ to the Jabber network.</property> <child> <object class="GtkTable" id="table32"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">5</property> <property name="n_rows">3</property> <property name="n_columns">3</property> @@ -357,18 +385,20 @@ to the Jabber network.</property> <child> <object class="GtkLabel" id="label381"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Prox_y:</property> <property name="use_underline">True</property> </object> <packing> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkComboBox" id="proxies_combobox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="model">liststore1</property> <child> <object class="GtkCellRendererText" id="cellrenderertext1"/> @@ -390,13 +420,13 @@ to the Jabber network.</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> - <signal name="clicked" handler="on_manage_proxies_button_clicked"/> + <signal name="clicked" handler="on_manage_proxies_button_clicked" swapped="no"/> </object> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -406,24 +436,27 @@ to the Jabber network.</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_custom_host_port_checkbutton_toggled"/> + <signal name="toggled" handler="on_custom_host_port_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="right_attach">3</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkHBox" id="custom_host_hbox"> <property name="visible">True</property> <property name="sensitive">False</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="label380"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_Hostname:</property> <property name="use_underline">True</property> @@ -441,12 +474,15 @@ to the Jabber network.</property> <property name="can_focus">True</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkLabel" id="label379"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_Port:</property> <property name="use_underline">True</property> @@ -467,6 +503,7 @@ to the Jabber network.</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">3</property> </packing> </child> @@ -484,12 +521,15 @@ to the Jabber network.</property> <child type="label"> <object class="GtkLabel" id="label378"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">_Advanced</property> <property name="use_underline">True</property> </object> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">3</property> </packing> </child> @@ -501,6 +541,7 @@ to the Jabber network.</property> <child type="tab"> <object class="GtkLabel" id="label367"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> <packing> <property name="position">2</property> @@ -510,34 +551,41 @@ to the Jabber network.</property> <child> <object class="GtkVBox" id="ssl_vbox"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <child> <object class="GtkHBox" id="hbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> <object class="GtkImage" id="image1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="stock">gtk-dialog-warning</property> <property name="icon-size">5</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkLabel" id="ssl_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> + <property name="expand">True</property> <property name="fill">False</property> <property name="position">0</property> </packing> @@ -551,9 +599,11 @@ SHA1 fingerprint of the certificate: <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> </object> <packing> + <property name="expand">True</property> <property name="fill">False</property> <property name="position">1</property> </packing> @@ -566,6 +616,7 @@ SHA1 fingerprint of the certificate: <child type="tab"> <object class="GtkLabel" id="label482"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> <packing> <property name="position">3</property> @@ -575,7 +626,7 @@ SHA1 fingerprint of the certificate: <child> <object class="GtkVBox" id="form_vbox"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <child> <placeholder/> </child> @@ -587,6 +638,7 @@ SHA1 fingerprint of the certificate: <child type="tab"> <object class="GtkLabel" id="label382"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> <packing> <property name="position">4</property> @@ -596,10 +648,11 @@ SHA1 fingerprint of the certificate: <child> <object class="GtkVBox" id="vbox104"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <child> <object class="GtkLabel" id="progressbar_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>Connecting to server</b> Please wait...</property> @@ -607,6 +660,7 @@ Please wait...</property> <property name="justify">center</property> </object> <packing> + <property name="expand">True</property> <property name="fill">False</property> <property name="position">0</property> </packing> @@ -614,6 +668,7 @@ Please wait...</property> <child> <object class="GtkProgressBar" id="progressbar"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="pulse_step">0.10000000149</property> </object> <packing> @@ -630,6 +685,7 @@ Please wait...</property> <child type="tab"> <object class="GtkLabel" id="label365"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> <packing> <property name="position">5</property> @@ -639,14 +695,16 @@ Please wait...</property> <child> <object class="GtkVBox" id="vbox103"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <child> <object class="GtkHBox" id="hbox2986"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">12</property> <child> <object class="GtkImage" id="finish_image"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-missing-image</property> </object> <packing> @@ -658,16 +716,21 @@ Please wait...</property> <child> <object class="GtkLabel" id="finish_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0.10000000149011612</property> <property name="use_markup">True</property> <property name="wrap">True</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -678,6 +741,7 @@ Please wait...</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="active">True</property> <property name="draw_indicator">True</property> </object> @@ -694,6 +758,7 @@ Please wait...</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="active">True</property> <property name="draw_indicator">True</property> </object> @@ -711,6 +776,7 @@ Please wait...</property> <child type="tab"> <object class="GtkLabel" id="label286"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> <packing> <property name="position">6</property> @@ -719,12 +785,15 @@ Please wait...</property> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkHButtonBox" id="hbuttonbox19"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">12</property> <property name="layout_style">end</property> <child> @@ -735,7 +804,7 @@ Please wait...</property> <property name="can_default">True</property> <property name="receives_default">False</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_cancel_button_clicked"/> + <signal name="clicked" handler="on_cancel_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -752,7 +821,7 @@ Please wait...</property> <property name="can_default">True</property> <property name="receives_default">False</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_back_button_clicked"/> + <signal name="clicked" handler="on_back_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -769,7 +838,7 @@ Please wait...</property> <property name="has_default">True</property> <property name="receives_default">False</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_forward_button_clicked"/> + <signal name="clicked" handler="on_forward_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -779,47 +848,14 @@ Please wait...</property> </child> <child> <object class="GtkButton" id="advanced_button"> + <property name="label" translatable="yes">_Advanced</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="receives_default">False</property> <property name="no_show_all">True</property> - <signal name="clicked" handler="on_advanced_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment96"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox2996"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image1265"> - <property name="visible">True</property> - <property name="stock">gtk-preferences</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label364"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Advanced</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> + <property name="image">image2</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="on_advanced_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -829,47 +865,14 @@ Please wait...</property> </child> <child> <object class="GtkButton" id="finish_button"> + <property name="label" translatable="yes">_Finish</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="receives_default">False</property> <property name="no_show_all">True</property> - <signal name="clicked" handler="on_finish_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment87"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox2989"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image1112"> - <property name="visible">True</property> - <property name="stock">gtk-apply</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label352"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Finish</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> + <property name="image">image3</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="on_finish_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -880,21 +883,25 @@ Please wait...</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> </child> </object> - <object class="GtkListStore" id="liststore1"> + <object class="GtkListStore" id="server_liststore"> <columns> - <!-- column-name item --> + <!-- column-name gchararray1 --> <column type="gchararray"/> </columns> - <data> - <row> - <col id="0" translatable="yes">None</col> - </row> - </data> + </object> + <object class="GtkEntryCompletion" id="server_entrycompletion"> + <property name="model">server_liststore</property> + <property name="text_column">0</property> + </object> + <object class="GtkEntryCompletion" id="server_entrycompletion1"> + <property name="model">server_liststore</property> + <property name="text_column">0</property> </object> </interface> diff --git a/data/gui/accounts_window.ui b/data/gui/accounts_window.ui index 1d37004b2fb43ddc4c0840ff8ad945d3b2e64354..ff23dadd5ea936fd84ab8ae8fed2d135fd9e7606 100644 --- a/data/gui/accounts_window.ui +++ b/data/gui/accounts_window.ui @@ -63,42 +63,14 @@ </child> <child> <object class="GtkButton" id="add_button"> + <property name="label" translatable="yes">Add</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="image">image1</property> + <property name="use_underline">True</property> <signal name="clicked" handler="on_add_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment5"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox4"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image1"> - <property name="visible">True</property> - <property name="stock">gtk-add</property> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label29"> - <property name="visible">True</property> - <property name="label" translatable="yes">Add</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -107,42 +79,14 @@ </child> <child> <object class="GtkButton" id="remove_button"> + <property name="label" translatable="yes">Delete</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="image">image2</property> + <property name="use_underline">True</property> <signal name="clicked" handler="on_remove_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment7"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox7"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image2"> - <property name="visible">True</property> - <property name="stock">gtk-remove</property> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label26"> - <property name="visible">True</property> - <property name="label" translatable="yes">Delete</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -151,46 +95,14 @@ </child> <child> <object class="GtkButton" id="rename_button"> + <property name="label" translatable="yes">Re_name</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="image">rename_image</property> + <property name="use_underline">True</property> <signal name="clicked" handler="on_rename_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment6"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox8"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="rename_image"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-missing-image</property> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label25"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="label" translatable="yes">Re_name</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -225,7 +137,7 @@ <property name="orientation">vertical</property> <child> <object class="GtkCheckButton" id="enable_checkbutton1"> - <property name="label" translatable="yes">_Enable</property> + <property name="label" translatable="yes">Active</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -520,6 +432,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="invisible_char">●</property> + <signal name="focus_out_event" handler="on_cert_entry1_focus_out_event"/> </object> <packing> <property name="position">1</property> @@ -531,6 +444,7 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> + <property name="use_underline">True</property> <signal name="clicked" handler="on_browse_for_client_cert_button_clicked"/> </object> <packing> @@ -1120,7 +1034,7 @@ <property name="orientation">vertical</property> <child> <object class="GtkCheckButton" id="enable_zeroconf_checkbutton2"> - <property name="label" translatable="yes">_Enable</property> + <property name="label" translatable="yes">Active</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> @@ -1552,4 +1466,16 @@ You might consider to change possible firewall settings.</property> <property name="step_increment">1</property> <property name="page_increment">5</property> </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="stock">gtk-add</property> + </object> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="stock">gtk-remove</property> + </object> + <object class="GtkImage" id="rename_image"> + <property name="visible">True</property> + <property name="stock">gtk-missing-image</property> + </object> </interface> diff --git a/data/gui/add_new_contact_window.ui b/data/gui/add_new_contact_window.ui index e9f713f1e8803e76a53273a0718aaccd53ce6067..cee67a0bbfeb45033b1355cbbac16cbbbaf2a4e6 100644 --- a/data/gui/add_new_contact_window.ui +++ b/data/gui/add_new_contact_window.ui @@ -1,22 +1,23 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-requires gtk+ 3.0 --> <object class="GtkWindow" id="add_new_contact_window"> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="title" translatable="yes">Add New Contact</property> <property name="resizable">False</property> <property name="type_hint">dialog</property> - <signal name="destroy" handler="on_add_new_contact_window_destroy"/> - <signal name="key_press_event" handler="on_add_new_contact_window_key_press_event"/> + <signal name="destroy" handler="on_add_new_contact_window_destroy" swapped="no"/> + <signal name="key-press-event" handler="on_add_new_contact_window_key_press_event" swapped="no"/> <child> <object class="GtkVBox" id="vbox8"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="prompt_label"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> <packing> <property name="expand">False</property> @@ -27,10 +28,12 @@ <child> <object class="GtkHBox" id="account_hbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="account_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">A_ccount:</property> <property name="use_underline">True</property> @@ -44,8 +47,9 @@ <child> <object class="GtkComboBox" id="account_combobox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="model">liststore3</property> - <signal name="changed" handler="on_account_combobox_changed"/> + <signal name="changed" handler="on_account_combobox_changed" swapped="no"/> <child> <object class="GtkCellRendererText" id="cellrenderertext3"/> <attributes> @@ -64,16 +68,20 @@ </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkHBox" id="protocol_hbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="protocol_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_Protocol:</property> <property name="use_underline">True</property> @@ -88,7 +96,8 @@ <child> <object class="GtkComboBox" id="protocol_combobox"> <property name="visible">True</property> - <signal name="changed" handler="on_protocol_combobox_changed"/> + <property name="can_focus">False</property> + <signal name="changed" handler="on_protocol_combobox_changed" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -99,9 +108,10 @@ <child> <object class="GtkComboBox" id="protocol_jid_combobox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="no_show_all">True</property> <property name="model">liststore2</property> - <signal name="changed" handler="on_protocol_jid_combobox_changed"/> + <signal name="changed" handler="on_protocol_jid_combobox_changed" swapped="no"/> <child> <object class="GtkCellRendererText" id="cellrenderertext2"/> <attributes> @@ -110,17 +120,22 @@ </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> <child> <object class="GtkTable" id="subscription_table"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="no_show_all">True</property> <property name="border_width">6</property> <property name="n_rows">3</property> @@ -130,6 +145,7 @@ <child> <object class="GtkLabel" id="uid_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_User ID:</property> <property name="use_underline">True</property> @@ -137,7 +153,7 @@ </object> <packing> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -145,16 +161,18 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="activates_default">True</property> + <property name="placeholder_text">Type User ID</property> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkLabel" id="label188"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_Nickname:</property> <property name="use_underline">True</property> @@ -164,7 +182,7 @@ <property name="top_attach">1</property> <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -172,18 +190,20 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="activates_default">True</property> + <property name="placeholder_text">Type Nickname</property> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkLabel" id="label223"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_Group:</property> <property name="use_underline">True</property> @@ -192,37 +212,48 @@ <property name="top_attach">2</property> <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> - <object class="GtkComboBoxEntry" id="group_comboboxentry"> + <object class="GtkComboBoxText" id="group_comboboxentry"> <property name="visible">True</property> - <property name="model">groups_liststore</property> - <property name="text_column">0</property> + <property name="can_focus">False</property> + <property name="has_entry">True</property> + <property name="entry_text_column">0</property> + <property name="id_column">1</property> + <child internal-child="entry"> + <object class="GtkEntry" id="comboboxtext-entry"> + <property name="can_focus">True</property> + <property name="placeholder_text">Choose a group of type a new group</property> + </object> + </child> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> - <property name="x_options">GTK_FILL</property> </packing> </child> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">3</property> </packing> </child> <child> <object class="GtkCheckButton" id="auto_authorize_checkbutton"> <property name="label" translatable="yes">A_llow this contact to view my status</property> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="no_show_all">True</property> + <property name="use_action_appearance">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="active">True</property> <property name="draw_indicator">True</property> </object> @@ -238,9 +269,8 @@ <property name="can_focus">True</property> <property name="no_show_all">True</property> <property name="border_width">6</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> <property name="shadow_type">etched-in</property> + <property name="min_content_height">5</property> <child> <object class="GtkTextView" id="message_textview"> <property name="visible">True</property> @@ -251,30 +281,39 @@ </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">5</property> </packing> </child> <child> <object class="GtkCheckButton" id="save_message_checkbutton"> <property name="label" translatable="yes">_Save subscription message</property> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">6</property> </packing> </child> <child> <object class="GtkHBox" id="register_hbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="no_show_all">True</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="label224"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">You have to register with this transport to be able to add a contact from this @@ -283,18 +322,22 @@ proceed.</property> <property name="wrap">True</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkButton" id="register_button"> <property name="label" translatable="yes">_Register</property> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> <property name="use_underline">True</property> - <signal name="clicked" handler="on_register_button_clicked"/> + <signal name="clicked" handler="on_register_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -304,12 +347,15 @@ proceed.</property> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">7</property> </packing> </child> <child> <object class="GtkLabel" id="connected_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="no_show_all">True</property> <property name="label" translatable="yes">You must be connected to the transport to be able to add a contact from this protocol.</property> @@ -323,18 +369,21 @@ to add a contact from this protocol.</property> <child> <object class="GtkHButtonBox" id="hbuttonbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">5</property> <property name="spacing">12</property> <property name="layout_style">end</property> <child> <object class="GtkButton" id="cancel_button"> <property name="label">gtk-cancel</property> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_cancel_button_clicked"/> + <signal name="clicked" handler="on_cancel_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -345,13 +394,15 @@ to add a contact from this protocol.</property> <child> <object class="GtkButton" id="add_button"> <property name="label">gtk-add</property> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="has_default">True</property> <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_add_button_clicked"/> + <signal name="clicked" handler="on_add_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -369,9 +420,6 @@ to add a contact from this protocol.</property> </object> </child> </object> - <object class="GtkTextBuffer" id="textbuffer1"> - <property name="text" translatable="yes">I would like to add you to my contact list.</property> - </object> <object class="GtkListStore" id="groups_liststore"> <columns> <!-- column-name item --> @@ -390,4 +438,7 @@ to add a contact from this protocol.</property> <column type="gchararray"/> </columns> </object> + <object class="GtkTextBuffer" id="textbuffer1"> + <property name="text" translatable="yes">I would like to add you to my contact list.</property> + </object> </interface> diff --git a/data/gui/advanced_configuration_window.ui b/data/gui/advanced_configuration_window.ui index 52df66599d40ac2a0eaa0b25b1cfa313c001391b..72c058b157fa69ae1cba45c71a831bd677663a4c 100644 --- a/data/gui/advanced_configuration_window.ui +++ b/data/gui/advanced_configuration_window.ui @@ -5,6 +5,7 @@ <property name="can_focus">False</property> <property name="border_width">6</property> <property name="title" translatable="yes">Advanced Configuration Editor</property> + <property name="window_position">center-on-parent</property> <property name="role">ace</property> <property name="default_width">650</property> <property name="default_height">540</property> diff --git a/data/gui/blocked_contacts_window.ui b/data/gui/blocked_contacts_window.ui index 2f9f371273b065b0570e34af6f0b582c9c1af9e0..5f84a9b7c230ce34b82981b4689d71fe5d2b219c 100644 --- a/data/gui/blocked_contacts_window.ui +++ b/data/gui/blocked_contacts_window.ui @@ -38,47 +38,14 @@ </child> <child> <object class="GtkButton" id="remove_button"> + <property name="label" translatable="yes">_Unblock</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="border_width">3</property> + <property name="image">image1</property> + <property name="use_underline">True</property> <signal name="clicked" handler="on_remove_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox1"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image1"> - <property name="visible">True</property> - <property name="stock">gtk-remove</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Unblock</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -89,4 +56,8 @@ </object> </child> </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="stock">gtk-remove</property> + </object> </interface> diff --git a/data/gui/change_status_message_dialog.ui b/data/gui/change_status_message_dialog.ui index c7c350cdfba2b205c92575c815fa4cafb3d6a71b..e4aa969706695e0b42eddd9bc0af72b3fedc52c8 100644 --- a/data/gui/change_status_message_dialog.ui +++ b/data/gui/change_status_message_dialog.ui @@ -1,39 +1,88 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-requires gtk+ 3.0 --> <object class="GtkDialog" id="change_status_message_dialog"> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="default_width">270</property> - <property name="default_height">175</property> + <property name="default_height">330</property> <property name="type_hint">dialog</property> - <signal name="key_press_event" handler="on_change_status_message_dialog_key_press_event"/> + <signal name="key-press-event" handler="on_change_status_message_dialog_key_press_event" swapped="no"/> <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox5"> + <object class="GtkBox" id="dialog-vbox5"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="cancel_button"> + <property name="label">gtk-cancel</property> + <property name="use_action_appearance">False</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="ok_button"> + <property name="label">gtk-ok</property> + <property name="use_action_appearance">False</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> <child> <object class="GtkFrame" id="frame38"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment107"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="left_padding">12</property> <child> <object class="GtkVBox" id="vbox112"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> - <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkScrolledWindow" id="scrolledwindow24"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> <property name="shadow_type">in</property> <child> <object class="GtkTextView" id="message_textview"> @@ -45,33 +94,41 @@ </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkHButtonBox" id="hbuttonbox33"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="layout_style">end</property> <child> <object class="GtkButton" id="save_as_preset_button"> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="sensitive">False</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="receives_default">False</property> - <signal name="clicked" handler="on_save_as_preset_button_clicked"/> + <property name="use_action_appearance">False</property> + <signal name="clicked" handler="on_save_as_preset_button_clicked" swapped="no"/> <child> <object class="GtkAlignment" id="alignment106"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xscale">0</property> <property name="yscale">0</property> <child> <object class="GtkHBox" id="hbox3021"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">2</property> <child> <object class="GtkImage" id="image1369"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-save-as</property> </object> <packing> @@ -83,6 +140,7 @@ <child> <object class="GtkLabel" id="label380"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Save as Preset...</property> <property name="use_underline">True</property> </object> @@ -106,44 +164,53 @@ </object> <packing> <property name="expand">False</property> - <property name="fill">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkTable" id="under_table"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="n_rows">3</property> <property name="n_columns">2</property> <property name="column_spacing">6</property> <property name="row_spacing">6</property> <child> <object class="GtkButton" id="mood_button"> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <signal name="clicked" handler="on_mood_button_clicked"/> + <property name="use_action_appearance">False</property> + <signal name="clicked" handler="on_mood_button_clicked" swapped="no"/> <child> <object class="GtkHBox" id="hbox2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkImage" id="mood_image"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-missing-image</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkLabel" id="mood_button_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="wrap">True</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -155,35 +222,44 @@ <property name="right_attach">2</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> + <property name="y_options">GTK_FILL</property> </packing> </child> <child> <object class="GtkButton" id="activity_button"> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <signal name="clicked" handler="on_activity_button_clicked"/> + <property name="use_action_appearance">False</property> + <signal name="clicked" handler="on_activity_button_clicked" swapped="no"/> <child> <object class="GtkHBox" id="hbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkImage" id="activity_image"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-missing-image</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkLabel" id="activity_button_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="wrap">True</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -195,11 +271,13 @@ <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> + <property name="y_options">GTK_FILL</property> </packing> </child> <child> <object class="GtkLabel" id="mood_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Mood:</property> </object> @@ -207,11 +285,13 @@ <property name="top_attach">2</property> <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> </packing> </child> <child> <object class="GtkLabel" id="activity_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Activity:</property> </object> @@ -219,31 +299,37 @@ <property name="top_attach">1</property> <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> </packing> </child> <child> <object class="GtkComboBox" id="message_combobox"> <property name="visible">True</property> - <signal name="changed" handler="on_message_combobox_changed"/> + <property name="can_focus">False</property> + <signal name="changed" handler="on_message_combobox_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> + <property name="y_options">GTK_FILL</property> </packing> </child> <child> <object class="GtkLabel" id="label165"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Preset messages:</property> </object> <packing> <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> </packing> </child> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> @@ -254,63 +340,19 @@ <child type="label"> <object class="GtkLabel" id="label383"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>Type your new status message</b></property> <property name="use_markup">True</property> </object> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="cancel_button"> - <property name="label">gtk-cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="ok_button"> - <property name="label">gtk-ok</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="has_default">True</property> - <property name="receives_default">False</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> </object> </child> - <action-widgets> - <action-widget response="-6">cancel_button</action-widget> - <action-widget response="-5">ok_button</action-widget> - </action-widgets> </object> </interface> diff --git a/data/gui/chat_control.ui b/data/gui/chat_control.ui index d4ac9498024e62769c312036c540fc74589fa9cf..b9eae0f67e78cd5f6dc040e28399bb401f3b191e 100644 --- a/data/gui/chat_control.ui +++ b/data/gui/chat_control.ui @@ -1,7 +1,18 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy project-wide --> + <!-- interface-requires gtk+ 3.0 --> + <object class="GtkAdjustment" id="adjustment1"> + <property name="upper">110</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + <property name="page_size">10</property> + </object> + <object class="GtkAdjustment" id="adjustment2"> + <property name="upper">110</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + <property name="page_size">10</property> + </object> <object class="GtkHBox" id="chat_control_hbox"> <property name="can_focus">True</property> <property name="spacing">1</property> @@ -9,159 +20,119 @@ <object class="GtkVBox" id="chat_control_vbox"> <property name="can_focus">True</property> <property name="border_width">3</property> - <property name="orientation">vertical</property> <property name="spacing">1</property> <child> - <object class="GtkHPaned" id="hpaned1"> + <object class="GtkVBox" id="vbox2"> <property name="visible">True</property> - <property name="can_focus">True</property> + <property name="can_focus">False</property> <child> - <object class="GtkVBox" id="vbox2"> + <object class="GtkAlignment" id="alignment"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> + <property name="left_padding">3</property> + <property name="right_padding">3</property> <child> - <object class="GtkAlignment" id="alignment"> + <object class="GtkEventBox" id="banner_eventbox"> <property name="visible">True</property> - <property name="left_padding">3</property> - <property name="right_padding">3</property> + <property name="can_focus">False</property> <child> - <object class="GtkEventBox" id="banner_eventbox"> + <object class="GtkHBox" id="hbox3004"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> - <object class="GtkHBox" id="hbox3004"> + <object class="GtkImage" id="banner_status_image"> <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="ypad">5</property> + <property name="stock">gtk-missing-image</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="banner_vbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="border_width">5</property> + <child> + <object class="GtkLabel" id="banner_name_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label"><span weight="heavy" size="large">Contact name</span></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> <child> - <object class="GtkImage" id="banner_status_image"> + <object class="GtkLabel" id="banner_label"> <property name="visible">True</property> - <property name="ypad">5</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label">label</property> + <property name="use_markup">True</property> + <property name="selectable">True</property> + <signal name="populate-popup" handler="on_banner_label_populate_popup" swapped="no"/> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">4</property> + <child> + <object class="GtkImage" id="mood_image"> + <property name="can_focus">False</property> + <property name="no_show_all">True</property> <property name="stock">gtk-missing-image</property> + <property name="icon-size">1</property> </object> <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="padding">5</property> <property name="position">0</property> </packing> </child> <child> - <object class="GtkVBox" id="banner_vbox"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="border_width">5</property> - <property name="orientation">vertical</property> - <child> - <object class="GtkLabel" id="banner_name_label"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label"><span weight="heavy" size="large">Contact name</span></property> - <property name="use_markup">True</property> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="banner_label"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label">label</property> - <property name="use_markup">True</property> - <property name="selectable">True</property> - <signal name="populate_popup" handler="on_banner_label_populate_popup"/> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> + <object class="GtkImage" id="activity_image"> + <property name="can_focus">False</property> + <property name="no_show_all">True</property> + <property name="stock">gtk-missing-image</property> + <property name="icon-size">1</property> </object> <packing> + <property name="expand">False</property> + <property name="fill">False</property> <property name="position">1</property> </packing> </child> <child> - <object class="GtkHBox" id="hbox2"> - <property name="visible">True</property> - <property name="spacing">4</property> - <child> - <object class="GtkImage" id="mood_image"> - <property name="no_show_all">True</property> - <property name="stock">None</property> - <property name="icon-size">1</property> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkImage" id="activity_image"> - <property name="no_show_all">True</property> - <property name="stock">None</property> - <property name="icon-size">1</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkImage" id="tune_image"> - <property name="no_show_all">True</property> - <property name="stock">None</property> - <property name="icon-size">1</property> - </object> - <packing> - <property name="position">2</property> - </packing> - </child> - <child> - <object class="GtkEventBox" id="location_eventbox"> - <property name="visible">True</property> - <property name="visible_window">False</property> - <child> - <object class="GtkImage" id="location_image"> - <property name="no_show_all">True</property> - <property name="stock">None</property> - <property name="icon-size">1</property> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">3</property> - </packing> - </child> - <child> - <object class="GtkImage" id="audio_banner_image"> - <property name="visible">True</property> - <property name="stock">None</property> - <property name="icon-size">1</property> - </object> - <packing> - <property name="position">4</property> - </packing> - </child> - <child> - <object class="GtkImage" id="video_banner_image"> - <property name="visible">True</property> - <property name="stock">None</property> - <property name="icon-size">1</property> - </object> - <packing> - <property name="position">5</property> - </packing> - </child> - <child> - <object class="GtkAlignment" id="alignment3"> - <property name="width_request">11</property> - <property name="visible">True</property> - <child> - <placeholder/> - </child> - </object> - <packing> - <property name="position">6</property> - </packing> - </child> + <object class="GtkImage" id="tune_image"> + <property name="can_focus">False</property> + <property name="no_show_all">True</property> + <property name="stock">gtk-missing-image</property> + <property name="icon-size">1</property> </object> <packing> <property name="expand">False</property> @@ -170,13 +141,16 @@ </packing> </child> <child> - <object class="GtkEventBox" id="avatar_eventbox"> + <object class="GtkEventBox" id="location_eventbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="visible_window">False</property> <child> - <object class="GtkImage" id="avatar_image"> - <property name="visible">True</property> - <property name="stock">None</property> + <object class="GtkImage" id="location_image"> + <property name="can_focus">False</property> + <property name="no_show_all">True</property> + <property name="stock">gtk-missing-image</property> + <property name="icon-size">1</property> </object> </child> </object> @@ -186,572 +160,581 @@ <property name="position">3</property> </packing> </child> - </object> - </child> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkVBox" id="vbox106"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <child> - <object class="GtkScrolledWindow" id="conversation_scrolledwindow"> - <property name="height_request">60</property> - <property name="can_focus">True</property> - <property name="border_width">3</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> - <property name="shadow_type">in</property> - <child> - <placeholder/> - </child> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="hbox"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <child> - <object class="GtkButton" id="authentication_button"> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="no_show_all">True</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> <child> - <object class="GtkImage" id="lock_image"> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-dialog-authentication</property> + <object class="GtkImage" id="audio_banner_image"> + <property name="can_focus">False</property> + <property name="no_show_all">True</property> + <property name="stock">gtk-missing-image</property> <property name="icon-size">1</property> </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkImage" id="video_banner_image"> + <property name="can_focus">False</property> + <property name="no_show_all">True</property> + <property name="stock">gtk-missing-image</property> + <property name="icon-size">1</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="GtkAlignment" id="alignment3"> + <property name="width_request">11</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">6</property> + </packing> </child> </object> <packing> <property name="expand">False</property> - <property name="position">0</property> + <property name="fill">False</property> + <property name="position">2</property> </packing> </child> <child> - <object class="GtkScrolledWindow" id="message_scrolledwindow"> + <object class="GtkEventBox" id="avatar_eventbox"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="border_width">3</property> - <property name="hscrollbar_policy">never</property> - <property name="vscrollbar_policy">never</property> - <property name="shadow_type">in</property> + <property name="can_focus">False</property> + <property name="visible_window">False</property> <child> - <placeholder/> + <object class="GtkImage" id="avatar_image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-missing-image</property> + </object> </child> </object> <packing> - <property name="position">1</property> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> </packing> </child> </object> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox106"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkScrolledWindow" id="conversation_scrolledwindow"> + <property name="height_request">60</property> + <property name="can_focus">True</property> + <property name="border_width">3</property> + <property name="shadow_type">in</property> + <child> + <placeholder/> </child> </object> <packing> - <property name="position">1</property> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> </packing> </child> <child> - <object class="GtkHBox" id="actions_hbox"> + <object class="GtkHBox" id="hbox"> <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> - <object class="GtkButton" id="emoticons_button"> - <property name="visible">True</property> + <object class="GtkButton" id="authentication_button"> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="tooltip_text" translatable="yes">Show a list of emoticons (Alt+M)</property> + <property name="no_show_all">True</property> <property name="relief">none</property> <property name="focus_on_click">False</property> <child> - <object class="GtkImage" id="emoticons_button_image"> - <property name="visible">True</property> + <object class="GtkImage" id="lock_image"> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-missing-image</property> + <property name="stock">gtk-dialog-authentication</property> <property name="icon-size">1</property> </object> </child> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> - <object class="GtkButton" id="formattings_button"> + <object class="GtkScrolledWindow" id="message_scrolledwindow"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> + <property name="border_width">3</property> + <property name="hscrollbar_policy">never</property> + <property name="vscrollbar_policy">never</property> + <property name="shadow_type">in</property> <child> - <object class="GtkImage" id="image10"> - <property name="visible">True</property> - <property name="stock">gtk-bold</property> - <property name="icon-size">1</property> - </object> + <placeholder/> </child> </object> <packing> - <property name="expand">False</property> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="actions_hbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkButton" id="emoticons_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="has_tooltip">True</property> + <property name="tooltip_text" translatable="yes">Show a list of emoticons (Alt+M)</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> <child> - <object class="GtkVSeparator" id="vseparator1"> + <object class="GtkImage" id="emoticons_button_image"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="orientation">vertical</property> + <property name="stock">gtk-missing-image</property> + <property name="icon-size">1</property> </object> - <packing> - <property name="expand">False</property> - <property name="position">2</property> - </packing> </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="formattings_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="has_tooltip">True</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> <child> - <object class="GtkButton" id="add_to_roster_button"> - <property name="can_focus">True</property> - <property name="receives_default">True</property> + <object class="GtkImage" id="image10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-bold</property> + <property name="icon-size">1</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkVSeparator" id="vseparator1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="add_to_roster_button"> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="no_show_all">True</property> + <property name="has_tooltip">True</property> + <property name="tooltip_text" translatable="yes">Add this contact to roster (Ctrl+D)</property> + <property name="relief">none</property> + <child> + <object class="GtkImage" id="image9"> + <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="no_show_all">True</property> - <property name="tooltip_text" translatable="yes">Add this contact to roster (Ctrl+D)</property> - <property name="relief">none</property> - <child> - <object class="GtkImage" id="image9"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-add</property> - <property name="icon-size">1</property> - </object> - </child> + <property name="stock">gtk-add</property> + <property name="icon-size">1</property> </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">3</property> - </packing> </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="send_file_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> <child> - <object class="GtkButton" id="send_file_button"> + <object class="GtkImage" id="image3"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> - <child> - <object class="GtkImage" id="image3"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="icon-size">1</property> - </object> - </child> + <property name="icon-size">1</property> </object> - <packing> - <property name="expand">False</property> - <property name="position">4</property> - </packing> </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkToggleButton" id="audio_togglebutton"> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="has_tooltip">True</property> + <property name="relief">none</property> <child> - <object class="GtkToggleButton" id="audio_togglebutton"> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="relief">none</property> - <child> - <object class="GtkImage" id="audio_image"> - <property name="visible">True</property> - <property name="stock">gtk-missing-image</property> - <property name="icon-size">1</property> - </object> - </child> + <object class="GtkImage" id="audio_image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-missing-image</property> + <property name="icon-size">1</property> </object> - <packing> - <property name="expand">False</property> - <property name="position">5</property> - </packing> </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + <child> + <object class="GtkToggleButton" id="video_togglebutton"> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="has_tooltip">True</property> + <property name="relief">none</property> <child> - <object class="GtkToggleButton" id="video_togglebutton"> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="relief">none</property> - <child> - <object class="GtkImage" id="video_image"> - <property name="visible">True</property> - <property name="stock">gtk-missing-image</property> - <property name="icon-size">1</property> - </object> - </child> + <object class="GtkImage" id="video_image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-missing-image</property> + <property name="icon-size">1</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">6</property> + </packing> + </child> + <child> + <object class="GtkButton" id="convert_to_gc_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="has_tooltip">True</property> + <property name="tooltip_text" translatable="yes">Invite contacts to the conversation (Ctrl+G)</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> + <child> + <object class="GtkImage" id="convert_to_gc_button_image"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="stock">gtk-missing-image</property> + <property name="icon-size">1</property> </object> - <packing> - <property name="expand">False</property> - <property name="position">6</property> - </packing> </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">7</property> + </packing> + </child> + <child> + <object class="GtkButton" id="contact_information_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="has_tooltip">True</property> + <property name="tooltip_text" translatable="yes">Show the contact's profile (Ctrl+I)</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> <child> - <object class="GtkButton" id="convert_to_gc_button"> + <object class="GtkImage" id="image2"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="tooltip_text" translatable="yes">Invite contacts to the conversation (Ctrl+G)</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> - <child> - <object class="GtkImage" id="convert_to_gc_button_image"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-missing-image</property> - <property name="icon-size">1</property> - </object> - </child> + <property name="stock">gtk-info</property> + <property name="icon-size">1</property> </object> - <packing> - <property name="expand">False</property> - <property name="position">7</property> - </packing> </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">8</property> + </packing> + </child> + <child> + <object class="GtkButton" id="history_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="has_tooltip">True</property> + <property name="tooltip_text" translatable="yes">Browse the chat history (Ctrl+H)</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> <child> - <object class="GtkButton" id="contact_information_button"> + <object class="GtkImage" id="history_image"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="tooltip_text" translatable="yes">View contact information (Ctrl+I)</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> - <child> - <object class="GtkImage" id="image2"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-info</property> - <property name="icon-size">1</property> - </object> - </child> + <property name="stock">gtk-justify-fill</property> + <property name="icon-size">1</property> </object> - <packing> - <property name="expand">False</property> - <property name="position">8</property> - </packing> </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">9</property> + </packing> + </child> + <child> + <object class="GtkVSeparator" id="vseparator3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">10</property> + </packing> + </child> + <child> + <object class="GtkButton" id="message_window_actions_button"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="has_tooltip">True</property> + <property name="tooltip_text" translatable="yes">Show advanced functions (Alt+D)</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> <child> - <object class="GtkButton" id="history_button"> + <object class="GtkImage" id="image1"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="tooltip_text" translatable="yes">Browse the chat history (Ctrl+H)</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> - <child> - <object class="GtkImage" id="image5"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-justify-fill</property> - <property name="icon-size">1</property> - </object> - </child> + <property name="stock">gtk-execute</property> + <property name="icon-size">1</property> </object> - <packing> - <property name="expand">False</property> - <property name="position">9</property> - </packing> </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">11</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="audio_buttons_hbox"> + <property name="can_focus">False</property> + <property name="no_show_all">True</property> <child> - <object class="GtkVSeparator" id="vseparator3"> + <object class="GtkVSeparator" id="vseparator2"> <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> </object> <packing> <property name="expand">False</property> - <property name="position">10</property> + <property name="fill">True</property> + <property name="position">0</property> </packing> </child> <child> - <object class="GtkButton" id="message_window_actions_button"> + <object class="GtkVolumeButton" id="sound_hscale"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="tooltip_text" translatable="yes">Show advanced functions (Alt+D)</property> <property name="relief">none</property> <property name="focus_on_click">False</property> - <child> - <object class="GtkImage" id="image1"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-execute</property> - <property name="icon-size">1</property> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">11</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="audio_buttons_hbox"> - <property name="no_show_all">True</property> - <child> - <object class="GtkVSeparator" id="vseparator2"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkVolumeButton" id="sound_hscale"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_action_appearance">True</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> - <property name="orientation">vertical</property> - <property name="size">menu</property> - <property name="adjustment">adjustment1</property> - <property name="icons">audio-volume-muted + <property name="orientation">vertical</property> + <property name="size">menu</property> + <property name="adjustment">adjustment1</property> + <property name="icons">audio-volume-muted audio-volume-high audio-volume-low audio-volume-medium</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkVolumeButton" id="mic_hscale"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_action_appearance">True</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> - <property name="yalign">0.4699999988079071</property> - <property name="orientation">vertical</property> - <property name="size">menu</property> - <property name="adjustment">adjustment2</property> - <property name="icons">audio-mic-volume-muted -audio-mic-volume-high -audio-mic-volume-medium -audio-mic-volume-low</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">2</property> - </packing> - </child> - <child> - <object class="GtkButton" id="dtmf_button"> - <property name="label" translatable="yes">#</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="relief">none</property> - </object> - <packing> - <property name="position">3</property> - </packing> - </child> </object> <packing> <property name="expand">False</property> - <property name="position">12</property> - </packing> - </child> - <child> - <object class="GtkComboBox" id="label_selector"> - <property name="visible">True</property> - </object> - <packing> - <property name="position">13</property> + <property name="fill">True</property> + <property name="position">1</property> </packing> </child> <child> - <object class="GtkAlignment" id="alignment1"> + <object class="GtkVolumeButton" id="mic_hscale"> <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <child> - <placeholder/> - </child> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="relief">none</property> + <property name="focus_on_click">False</property> + <property name="yalign">0.4699999988079071</property> + <property name="orientation">vertical</property> + <property name="size">menu</property> + <property name="adjustment">adjustment2</property> + <property name="icons">audio-mic-volume-muted +audio-mic-volume-high +audio-mic-volume-medium +audio-mic-volume-low</property> </object> <packing> - <property name="position">14</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> </packing> </child> <child> - <object class="GtkButton" id="send_button"> + <object class="GtkButton" id="dtmf_button"> + <property name="label" translatable="yes">#</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Send message</property> - <child> - <object class="GtkAlignment" id="alignment102"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox3010"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image1339"> - <property name="visible">True</property> - <property name="stock">gtk-jump-to</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label373"> - <property name="visible">True</property> - <property name="label" translatable="yes" comments="Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector)">_Send</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> + <property name="relief">none</property> </object> <packing> - <property name="expand">False</property> - <property name="position">15</property> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">3</property> </packing> </child> </object> <packing> <property name="expand">False</property> - <property name="position">2</property> + <property name="fill">True</property> + <property name="position">12</property> </packing> </child> - </object> - <packing> - <property name="resize">False</property> - <property name="shrink">True</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="video_hbox"> - <property name="no_show_all">True</property> - <property name="spacing">6</property> <child> - <object class="GtkFixed" id="outgoing_fixed"> - <property name="no_show_all">True</property> - <child> - <object class="GtkViewport" id="viewport1"> - <property name="width_request">160</property> - <property name="height_request">120</property> - <property name="visible">True</property> - <property name="resize_mode">queue</property> - <child> - <object class="GtkDrawingArea" id="outgoing_drawingarea"> - <property name="width_request">160</property> - <property name="height_request">120</property> - <property name="visible">True</property> - <property name="double_buffered">False</property> - </object> - </child> - </object> - </child> + <object class="GtkComboBox" id="label_selector"> + <property name="visible">True</property> + <property name="can_focus">False</property> </object> <packing> - <property name="expand">False</property> - <property name="position">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">13</property> </packing> </child> <child> - <object class="GtkVBox" id="vbox1"> + <object class="GtkAlignment" id="alignment1"> <property name="visible">True</property> - <property name="orientation">vertical</property> - <child> - <object class="GtkViewport" id="viewport2"> - <property name="visible">True</property> - <property name="resize_mode">queue</property> - <child> - <object class="GtkDrawingArea" id="incoming_drawingarea"> - <property name="width_request">320</property> - <property name="height_request">240</property> - <property name="visible">True</property> - <property name="double_buffered">False</property> - </object> - </child> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> + <property name="can_focus">False</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> <placeholder/> </child> </object> <packing> - <property name="position">1</property> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">14</property> + </packing> + </child> + <child> + <object class="GtkButton" id="send_button"> + <property name="label" translatable="yes">_Send</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Send message</property> + <property name="image">image4</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">15</property> </packing> </child> </object> <packing> - <property name="resize">True</property> - <property name="shrink">True</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> </packing> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> </object> - <object class="GtkAdjustment" id="adjustment2"> - <property name="upper">110</property> - <property name="step_increment">1</property> - <property name="page_increment">10</property> - <property name="page_size">10</property> - </object> - <object class="GtkAdjustment" id="adjustment1"> - <property name="upper">110</property> - <property name="step_increment">1</property> - <property name="page_increment">10</property> - <property name="page_size">10</property> - </object> <object class="GtkWindow" id="dtmf_window"> + <property name="can_focus">False</property> <property name="resizable">False</property> <property name="modal">True</property> <property name="window_position">mouse</property> @@ -763,200 +746,297 @@ audio-mic-volume-low</property> <child> <object class="GtkTable" id="table2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="n_rows">4</property> <property name="n_columns">3</property> - <property name="homogeneous">True</property> <child> <object class="GtkButton" id="1_button"> - <property name="label" translatable="yes">1</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="relief">none</property> + <child> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>1</b></property> + <property name="use_markup">True</property> + </object> + </child> </object> <packing> - <property name="x_options"/> + <property name="x_options">GTK_FILL</property> <property name="y_options"/> </packing> </child> <child> <object class="GtkButton" id="2_button"> - <property name="label" translatable="yes">2</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="relief">none</property> + <property name="xalign">0</property> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>2</b> abc</property> + <property name="use_markup">True</property> + </object> + </child> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> - <property name="x_options"/> + <property name="x_options">GTK_FILL</property> <property name="y_options"/> </packing> </child> <child> <object class="GtkButton" id="3_button"> - <property name="label" translatable="yes">3</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="relief">none</property> + <property name="xalign">0</property> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>3</b> def</property> + <property name="use_markup">True</property> + </object> + </child> </object> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> - <property name="x_options"/> + <property name="x_options">GTK_FILL</property> <property name="y_options"/> </packing> </child> <child> <object class="GtkButton" id="4_button"> - <property name="label" translatable="yes">4</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="relief">none</property> + <property name="xalign">0</property> + <child> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>4</b> def</property> + <property name="use_markup">True</property> + </object> + </child> </object> <packing> <property name="top_attach">1</property> <property name="bottom_attach">2</property> - <property name="x_options"/> + <property name="x_options">GTK_FILL</property> <property name="y_options"/> </packing> </child> <child> <object class="GtkButton" id="5_button"> - <property name="label" translatable="yes">5</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="relief">none</property> + <property name="xalign">0</property> + <child> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>5</b> jkl</property> + <property name="use_markup">True</property> + </object> + </child> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> - <property name="x_options"/> + <property name="x_options">GTK_FILL</property> <property name="y_options"/> </packing> </child> <child> <object class="GtkButton" id="6_button"> - <property name="label" translatable="yes">6</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="relief">none</property> + <property name="xalign">0</property> + <child> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>6</b> mno</property> + <property name="use_markup">True</property> + </object> + </child> </object> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> - <property name="x_options"/> + <property name="x_options">GTK_FILL</property> <property name="y_options"/> </packing> </child> <child> <object class="GtkButton" id="7_button"> - <property name="label" translatable="yes">7</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="relief">none</property> + <child> + <object class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>7</b> pqrs</property> + <property name="use_markup">True</property> + </object> + </child> </object> <packing> <property name="top_attach">2</property> <property name="bottom_attach">3</property> - <property name="x_options"/> + <property name="x_options">GTK_FILL</property> <property name="y_options"/> </packing> </child> <child> <object class="GtkButton" id="8_button"> - <property name="label" translatable="yes">8</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="relief">none</property> + <property name="xalign">0</property> + <child> + <object class="GtkLabel" id="label8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>8</b> tuv</property> + <property name="use_markup">True</property> + </object> + </child> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> - <property name="x_options"/> + <property name="x_options">GTK_FILL</property> <property name="y_options"/> </packing> </child> <child> <object class="GtkButton" id="9_button"> - <property name="label" translatable="yes">9</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="relief">none</property> + <property name="xalign">0</property> + <child> + <object class="GtkLabel" id="label9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>9</b> wxyz</property> + <property name="use_markup">True</property> + </object> + </child> </object> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> - <property name="x_options"/> + <property name="x_options">GTK_FILL</property> <property name="y_options"/> </packing> </child> <child> <object class="GtkButton" id="*_button"> - <property name="label" translatable="yes">*</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="relief">none</property> + <child> + <object class="GtkLabel" id="label10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>*</b></property> + <property name="use_markup">True</property> + </object> + </child> </object> <packing> <property name="top_attach">3</property> <property name="bottom_attach">4</property> - <property name="x_options"/> + <property name="x_options">GTK_FILL</property> <property name="y_options"/> </packing> </child> <child> <object class="GtkButton" id="0_button"> - <property name="label" translatable="yes">0</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="relief">none</property> + <child> + <object class="GtkLabel" id="label11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>0</b></property> + <property name="use_markup">True</property> + </object> + </child> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="top_attach">3</property> <property name="bottom_attach">4</property> - <property name="x_options"/> + <property name="x_options">GTK_FILL</property> <property name="y_options"/> </packing> </child> <child> <object class="GtkButton" id="#_button"> - <property name="label" translatable="yes">#</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="relief">none</property> + <child> + <object class="GtkLabel" id="label12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>#</b></property> + <property name="use_markup">True</property> + </object> + </child> </object> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> <property name="top_attach">3</property> <property name="bottom_attach">4</property> - <property name="x_options"/> + <property name="x_options">GTK_FILL</property> <property name="y_options"/> </packing> </child> </object> </child> </object> + <object class="GtkImage" id="image4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-jump-to</property> + </object> </interface> diff --git a/data/gui/chat_to_muc_window.ui b/data/gui/chat_to_muc_window.ui index 0c0c36e7e1ab57660aefd6adf91b172db414eb78..4a8f30d8a4178ce40a36dacd8eb83bb2925cd434 100644 --- a/data/gui/chat_to_muc_window.ui +++ b/data/gui/chat_to_muc_window.ui @@ -75,7 +75,7 @@ Select the contacts you want to invite</property> </packing> </child> <child> - <object class="GtkComboBoxEntry" id="server_list_comboboxentry"> + <object class="GtkComboBox" id="server_list_comboboxentry"> <property name="visible">True</property> </object> <packing> @@ -122,46 +122,13 @@ Select the contacts you want to invite</property> </child> <child> <object class="GtkButton" id="invite_button"> + <property name="label" translatable="yes">In_vite</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> + <property name="image">image1</property> + <property name="use_underline">True</property> <signal name="clicked" handler="on_invite_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox2"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image1"> - <property name="visible">True</property> - <property name="stock">gtk-jump-to</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="label" translatable="yes">In_vite</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -179,4 +146,8 @@ Select the contacts you want to invite</property> </object> </child> </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="stock">gtk-jump-to</property> + </object> </interface> diff --git a/data/gui/dubbleinput_dialog.ui b/data/gui/dubbleinput_dialog.ui index 1599394684e04a169f20ab5a5c0ba46435b2d5ee..8770d27df0fb36256e9aaa1328aa109427bcf948 100644 --- a/data/gui/dubbleinput_dialog.ui +++ b/data/gui/dubbleinput_dialog.ui @@ -1,50 +1,105 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-requires gtk+ 3.0 --> <object class="GtkDialog" id="dubbleinput_dialog"> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="type_hint">dialog</property> - <property name="has_separator">False</property> - <signal name="destroy" handler="on_dubbleinput_dialog_destroy"/> + <signal name="destroy" handler="on_dubbleinput_dialog_destroy" swapped="no"/> <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox10"> + <object class="GtkBox" id="dialog-vbox10"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="cancelbutton"> + <property name="label">gtk-cancel</property> + <property name="use_action_appearance">False</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="okbutton"> + <property name="label">gtk-ok</property> + <property name="use_action_appearance">False</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> <child> <object class="GtkVBox" id="vbox76"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> - <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkHBox" id="hbox2960"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">12</property> <child> <object class="GtkImage" id="image507"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-dialog-question</property> <property name="icon-size">6</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkLabel" id="label1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_markup">True</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -63,6 +118,7 @@ <child> <object class="GtkLabel" id="label2"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> <packing> <property name="expand">False</property> @@ -82,50 +138,10 @@ </packing> </child> </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area9"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="cancelbutton"> - <property name="label">gtk-cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="okbutton"> - <property name="label">gtk-ok</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="has_default">True</property> - <property name="receives_default">False</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> <packing> <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> + <property name="fill">True</property> + <property name="position">1</property> </packing> </child> </object> diff --git a/data/gui/edit_groups_dialog.ui b/data/gui/edit_groups_dialog.ui index d53d5257b78e6200edfa417810d00d62775bde2f..fab50a505ef5d389c9e2a66daadda2e62720f0d4 100644 --- a/data/gui/edit_groups_dialog.ui +++ b/data/gui/edit_groups_dialog.ui @@ -1,41 +1,77 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-requires gtk+ 3.0 --> <object class="GtkDialog" id="edit_groups_dialog"> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="title" translatable="yes">Edit Groups</property> <property name="modal">True</property> <property name="default_height">290</property> <property name="type_hint">dialog</property> - <signal name="response" handler="on_edit_groups_dialog_response"/> + <signal name="response" handler="on_edit_groups_dialog_response" swapped="no"/> <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox6"> + <object class="GtkBox" id="dialog-vbox6"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="close_button"> + <property name="label">gtk-close</property> + <property name="use_action_appearance">False</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> <child> <object class="GtkLabel" id="nickname_label"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> <child> <object class="GtkLabel" id="jid_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_markup">True</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">3</property> </packing> </child> <child> <object class="GtkHBox" id="hbox2926"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkEntry" id="group_entry"> @@ -44,19 +80,23 @@ <property name="activates_default">True</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkButton" id="add_button"> <property name="label">gtk-add</property> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="has_default">True</property> <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_add_button_clicked"/> + <signal name="clicked" handler="on_add_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -75,47 +115,24 @@ <object class="GtkScrolledWindow" id="scrolledwindow32"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> <property name="shadow_type">in</property> <child> <object class="GtkTreeView" id="groups_treeview"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="headers_visible">False</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="treeview-selection1"/> + </child> </object> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">5</property> </packing> </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area5"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="close_button"> - <property name="label">gtk-close</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> </object> </child> <action-widgets> diff --git a/data/gui/esession_info_window.ui b/data/gui/esession_info_window.ui index 9e6dee5b26a0b591733288a39b6053d0db2f2b74..bd6489024a0ff5053d3b2bbfb4090bdd1b8dcb86 100644 --- a/data/gui/esession_info_window.ui +++ b/data/gui/esession_info_window.ui @@ -1,93 +1,46 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-requires gtk+ 3.0 --> <object class="GtkDialog" id="esession_info_window"> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="border_width">5</property> <property name="window_position">center-on-parent</property> <property name="type_hint">dialog</property> - <property name="has_separator">False</property> <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox1"> + <object class="GtkBox" id="dialog-vbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="orientation">vertical</property> <property name="spacing">2</property> - <child> - <object class="GtkHBox" id="title-hbox"> - <property name="visible">True</property> - <child> - <object class="GtkImage" id="security_image"> - <property name="width_request">32</property> - <property name="height_request">32</property> - <property name="visible">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="verification_status_label"> - <property name="visible">True</property> - <property name="xalign">0</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="hbox4"> - <property name="visible">True</property> - <property name="spacing">4</property> - <child> - <object class="GtkLabel" id="info_display"> - <property name="visible">True</property> - <property name="label" translatable="yes">(<b>ESession</b> info)</property> - <property name="use_markup">True</property> - <property name="wrap">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="padding">10</property> - <property name="position">0</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> - </child> <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area1"> + <object class="GtkButtonBox" id="dialog-action_area1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="layout_style">end</property> <child> <object class="GtkButton" id="verify_now_button"> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> - <signal name="clicked" handler="on_verify_now_button_clicked"/> + <property name="use_action_appearance">False</property> + <signal name="clicked" handler="on_verify_now_button_clicked" swapped="no"/> <child> <object class="GtkAlignment" id="alignment2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xscale">0</property> <property name="yscale">0</property> <child> <object class="GtkHBox" id="hbox3"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">2</property> <child> <object class="GtkImage" id="image2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-apply</property> </object> <packing> @@ -99,6 +52,7 @@ <child> <object class="GtkLabel" id="button_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">_Verify</property> <property name="use_underline">True</property> </object> @@ -122,11 +76,13 @@ <child> <object class="GtkButton" id="close_button3"> <property name="label">gtk-close</property> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_close_button_clicked"/> + <signal name="clicked" handler="on_close_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -137,10 +93,74 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="pack_type">end</property> <property name="position">0</property> </packing> </child> + <child> + <object class="GtkHBox" id="title-hbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkImage" id="security_image"> + <property name="width_request">32</property> + <property name="height_request">32</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="verification_status_label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">4</property> + <child> + <object class="GtkLabel" id="info_display"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label">(<b>ESession</b> info)</property> + <property name="use_markup">True</property> + <property name="wrap">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">10</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> </object> </child> <action-widgets> diff --git a/data/gui/filetransfers.ui b/data/gui/filetransfers.ui index 8933b714d07cec144004367b10f29a028d270017..201d8e7c38c161ab8c76432091773817bf52437e 100644 --- a/data/gui/filetransfers.ui +++ b/data/gui/filetransfers.ui @@ -41,11 +41,11 @@ </object> </child> <signal name="button_press_event" handler="on_transfers_list_button_press_event"/> + <signal name="row_activated" handler="on_transfers_list_row_activated"/> <signal name="button_release_event" handler="on_transfers_list_button_release_event"/> <signal name="key_press_event" handler="on_transfers_list_key_press_event"/> - <signal name="leave_notify_event" handler="on_transfers_list_leave_notify_event"/> <signal name="motion_notify_event" handler="on_transfers_list_motion_notify_event"/> - <signal name="row_activated" handler="on_transfers_list_row_activated"/> + <signal name="leave_notify_event" handler="on_transfers_list_leave_notify_event"/> </object> </child> </object> @@ -81,12 +81,15 @@ <property name="layout_style">end</property> <child> <object class="GtkButton" id="cleanup_button"> + <property name="label" translatable="yes">Clean _up</property> <property name="visible">True</property> <property name="sensitive">False</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">Removes completed, cancelled and failed file transfers from the list</property> + <property name="image">image1</property> + <property name="use_underline">True</property> <child internal-child="accessible"> <object class="AtkObject" id="cleanup_button-atkobject"> <property name="AtkObject::accessible-name" translatable="yes">Remove file transfer from the list.</property> @@ -94,42 +97,6 @@ </object> </child> <signal name="clicked" handler="on_cleanup_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment91"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox2992"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image1143"> - <property name="visible">True</property> - <property name="stock">gtk-clear</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label358"> - <property name="visible">True</property> - <property name="label" translatable="yes">Clean _up</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -139,48 +106,15 @@ </child> <child> <object class="GtkButton" id="pause_restore_button"> + <property name="label" translatable="yes">_Pause</property> <property name="visible">True</property> <property name="sensitive">False</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="receives_default">False</property> + <property name="image">image2</property> + <property name="use_underline">True</property> <signal name="clicked" handler="on_pause_restore_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment92"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox2993"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image1147"> - <property name="visible">True</property> - <property name="stock">gtk-media-pause</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label359"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Pause</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -252,7 +186,7 @@ </child> <child> <object class="GtkImageMenuItem" id="continue_menuitem"> - <property name="label" translatable="yes">_Continue</property> + <property name="label">_Continue</property> <property name="no_show_all">True</property> <property name="use_underline">True</property> <property name="use_stock">True</property> @@ -262,7 +196,7 @@ </child> <child> <object class="GtkImageMenuItem" id="pause_menuitem"> - <property name="label" translatable="yes">_Pause</property> + <property name="label">_Pause</property> <property name="use_underline">True</property> <property name="use_stock">True</property> <property name="accel_group">accelgroup1</property> @@ -285,7 +219,7 @@ </child> <child> <object class="GtkImageMenuItem" id="open_folder_menuitem"> - <property name="label" translatable="yes">_Open Containing Folder</property> + <property name="label">_Open Containing Folder</property> <property name="use_underline">True</property> <property name="use_stock">True</property> <property name="accel_group">accelgroup1</property> @@ -294,4 +228,12 @@ </child> </object> <object class="GtkAccelGroup" id="accelgroup1"/> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="stock">gtk-clear</property> + </object> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="stock">gtk-media-pause</property> + </object> </interface> diff --git a/data/gui/gajim_themes_window.ui b/data/gui/gajim_themes_window.ui index 9b45b421ed689a0bbe8db389ab4dcdcb3ee67d3e..184bf47273f673f2b1d7723aa7ce89fb0dfa69ad 100644 --- a/data/gui/gajim_themes_window.ui +++ b/data/gui/gajim_themes_window.ui @@ -25,6 +25,7 @@ <object class="GtkWindow" id="gajim_themes_window"> <property name="border_width">12</property> <property name="title" translatable="yes">Gajim Themes Customization</property> + <property name="window_position">center-on-parent</property> <property name="type_hint">dialog</property> <child> <object class="GtkVBox" id="vbox97"> @@ -64,6 +65,7 @@ <object class="GtkHButtonBox" id="hbuttonbox27"> <property name="visible">True</property> <property name="spacing">6</property> + <property name="layout_style">center</property> <child> <object class="GtkButton" id="add_button"> <property name="label">gtk-add</property> @@ -148,7 +150,7 @@ </object> <packing> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -165,7 +167,7 @@ <property name="top_attach">1</property> <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -182,7 +184,7 @@ <property name="top_attach">2</property> <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -197,7 +199,7 @@ <property name="top_attach">3</property> <property name="bottom_attach">4</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -211,8 +213,8 @@ <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -228,8 +230,8 @@ <property name="right_attach">3</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -247,7 +249,7 @@ <property name="right_attach">3</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -269,8 +271,8 @@ <property name="right_attach">2</property> <property name="top_attach">3</property> <property name="bottom_attach">4</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -292,8 +294,8 @@ <property name="right_attach">3</property> <property name="top_attach">3</property> <property name="bottom_attach">4</property> - <property name="x_options"></property> - <property name="y_options"></property> + <property name="x_options"/> + <property name="y_options"/> </packing> </child> <child> @@ -348,7 +350,7 @@ <property name="top_attach">4</property> <property name="bottom_attach">5</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -364,7 +366,7 @@ <property name="top_attach">4</property> <property name="bottom_attach">5</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -380,7 +382,7 @@ <property name="top_attach">3</property> <property name="bottom_attach">4</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -393,7 +395,7 @@ <property name="top_attach">3</property> <property name="bottom_attach">4</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -406,7 +408,7 @@ <property name="top_attach">2</property> <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -422,7 +424,7 @@ <property name="top_attach">2</property> <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -435,7 +437,7 @@ <packing> <property name="right_attach">2</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -448,7 +450,7 @@ <property name="top_attach">5</property> <property name="bottom_attach">6</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -464,7 +466,7 @@ <property name="top_attach">5</property> <property name="bottom_attach">6</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -478,7 +480,7 @@ Messages</property> <property name="top_attach">7</property> <property name="bottom_attach">8</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -494,7 +496,7 @@ Messages</property> <property name="top_attach">7</property> <property name="bottom_attach">8</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -520,7 +522,7 @@ Messages</property> <property name="top_attach">8</property> <property name="bottom_attach">9</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -536,7 +538,7 @@ Messages</property> <property name="top_attach">8</property> <property name="bottom_attach">9</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> diff --git a/data/gui/groupchat_control.ui b/data/gui/groupchat_control.ui index d32b6b023912b9769921e9fd610233f3f8e9046a..e316267490e53cd551af0e4e1b46967b67c3b985 100644 --- a/data/gui/groupchat_control.ui +++ b/data/gui/groupchat_control.ui @@ -1,29 +1,31 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy project-wide --> + <!-- interface-requires gtk+ 3.0 --> <object class="GtkHBox" id="groupchat_control_hbox"> <property name="can_focus">True</property> <child> <object class="GtkVBox" id="groupchat_control_vbox"> <property name="can_focus">True</property> <property name="border_width">3</property> - <property name="orientation">vertical</property> <child> <object class="GtkAlignment" id="alignment"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="bottom_padding">1</property> <property name="left_padding">3</property> <property name="right_padding">3</property> <child> <object class="GtkEventBox" id="banner_eventbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkHBox" id="hbox3024"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkImage" id="gc_banner_status_image"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-missing-image</property> </object> <packing> @@ -36,34 +38,42 @@ <child> <object class="GtkVBox" id="banner_vbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="border_width">5</property> - <property name="orientation">vertical</property> <child> <object class="GtkLabel" id="banner_name_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label"><span weight="heavy" size="large">room jid</span></property> <property name="use_markup">True</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkLabel" id="banner_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label">label</property> <property name="use_markup">True</property> <property name="selectable">True</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -85,12 +95,12 @@ <property name="border_width">3</property> <property name="position">495</property> <property name="position_set">True</property> - <signal name="notify" handler="on_hpaned_notify"/> + <signal name="notify" handler="on_hpaned_notify" swapped="no"/> <child> <object class="GtkVBox" id="gc_textviews_vbox"> <property name="width_request">0</property> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkScrolledWindow" id="conversation_scrolledwindow"> @@ -98,14 +108,14 @@ <property name="height_request">60</property> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> <property name="shadow_type">in</property> <child> <placeholder/> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -122,6 +132,7 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -137,7 +148,6 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="hscrollbar_policy">never</property> - <property name="vscrollbar_policy">automatic</property> <property name="shadow_type">in</property> <child> <object class="GtkTreeView" id="list_treeview"> @@ -155,15 +165,19 @@ </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkHBox" id="actions_hbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkHBox" id="hbox3023"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkButton" id="emoticons_button"> <property name="visible">True</property> @@ -176,6 +190,7 @@ <child> <object class="GtkImage" id="emoticons_button_image"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-missing-image</property> <property name="icon-size">1</property> </object> @@ -190,6 +205,7 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -206,6 +222,7 @@ <child> <object class="GtkImage" id="image11"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-bold</property> <property name="icon-size">1</property> </object> @@ -213,16 +230,19 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkVSeparator" id="vseparator2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> @@ -238,6 +258,7 @@ <child> <object class="GtkImage" id="image4"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="stock">gtk-edit</property> <property name="icon-size">1</property> @@ -262,6 +283,7 @@ <child> <object class="GtkImage" id="image6"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="stock">gtk-properties</property> <property name="icon-size">1</property> @@ -287,6 +309,7 @@ <child> <object class="GtkImage" id="image7"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="stock">gtk-add</property> <property name="icon-size">1</property> @@ -309,8 +332,9 @@ <property name="tooltip_text" translatable="yes">Browse the chat history (Ctrl+H)</property> <property name="relief">none</property> <child> - <object class="GtkImage" id="image8"> + <object class="GtkImage" id="history_image"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="stock">gtk-justify-fill</property> <property name="icon-size">1</property> @@ -326,10 +350,12 @@ <child> <object class="GtkVSeparator" id="vseparator4"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">7</property> </packing> </child> @@ -346,11 +372,13 @@ <child> <object class="GtkAlignment" id="alignment104"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xscale">0</property> <property name="yscale">0</property> <child> <object class="GtkImage" id="image1344"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-execute</property> <property name="icon-size">1</property> </object> @@ -367,65 +395,38 @@ <child> <object class="GtkComboBox" id="label_selector"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">9</property> </packing> </child> <child> <object class="GtkAlignment" id="alignment2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> <placeholder/> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">10</property> </packing> </child> <child> <object class="GtkButton" id="send_button"> + <property name="label" translatable="yes">_Send</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">Send message</property> - <child> - <object class="GtkAlignment" id="alignment105"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox3016"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image1345"> - <property name="visible">True</property> - <property name="stock">gtk-jump-to</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label377"> - <property name="visible">True</property> - <property name="label" translatable="yes" comments="Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector)">_Send</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> + <property name="image">image1</property> + <property name="use_underline">True</property> </object> <packing> <property name="expand">False</property> @@ -436,13 +437,21 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-jump-to</property> + </object> </interface> diff --git a/data/gui/history_manager.ui b/data/gui/history_manager.ui index 1f206ecb48fbdf263d39b1513650327ae0ff16c7..27ad1d61407537f9706f72e28d5e6c9ce96b31e4 100644 --- a/data/gui/history_manager.ui +++ b/data/gui/history_manager.ui @@ -212,48 +212,16 @@ If you plan to do massive deletions, please make sure Gajim is not running. Gene </child> <child> <object class="GtkButton" id="search_db_button"> + <property name="label" translatable="yes">_Search Database</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="has_default">True</property> <property name="receives_default">False</property> + <property name="image">image1</property> + <property name="use_underline">True</property> + <property name="image_position">bottom</property> <signal name="clicked" handler="on_search_db_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox1"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image1"> - <property name="visible">True</property> - <property name="stock">gtk-find</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Search Database</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -345,4 +313,8 @@ If you plan to do massive deletions, please make sure Gajim is not running. Gene <action-widget response="-5">save_button</action-widget> </action-widgets> </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="stock">gtk-find</property> + </object> </interface> diff --git a/data/gui/history_window.ui b/data/gui/history_window.ui index 7000914ae7c8d7d194224a9a17a2436bd7ccd010..37994d07ed6529e8f88a6e7728b2ee22612b2707 100644 --- a/data/gui/history_window.ui +++ b/data/gui/history_window.ui @@ -1,63 +1,49 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> - <object class="GtkListStore" id="liststore1"> - <columns> - <!-- column-name item --> - <column type="gchararray"/> - </columns> - <data> - <row> - <col id="0" translatable="yes">Enter JID or Contact name</col> - </row> - <row> - <col id="0" translatable="yes">Groupchat Histories</col> - </row> - <row> - <col id="0" translatable="yes">All Chat Histories</col> - </row> - </data> - </object> + <!-- interface-requires gtk+ 3.0 --> <object class="GtkWindow" id="history_window"> + <property name="can_focus">False</property> <property name="title" translatable="yes">Conversation History</property> <property name="role">history</property> <property name="default_width">650</property> <property name="default_height">450</property> - <signal name="destroy" handler="on_history_window_destroy"/> - <signal name="key_press_event" handler="on_history_window_key_press_event"/> + <signal name="destroy" handler="on_history_window_destroy" swapped="no"/> + <signal name="key-press-event" handler="on_history_window_key_press_event" swapped="no"/> <child> <object class="GtkVBox" id="vbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">12</property> - <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkVBox" id="vbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkHBox" id="hbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="spacing">6</property> <child> - <object class="GtkComboBoxEntry" id="query_combobox"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="model">liststore1</property> - <property name="text_column">0</property> - <signal name="changed" handler="on_query_combobox_changed"/> + <object class="GtkEntry" id="query_entry"> + <property name="can_focus">True</property> + <property name="invisible_char">â—</property> + <property name="invisible_char_set">True</property> + <property name="placeholder_text">Enter name / JID of contact or groupchat</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkLabel" id="label3"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label" translatable="yes">Search:</property> </object> @@ -68,26 +54,30 @@ </packing> </child> <child> - <object class="GtkEntry" id="query_entry"> + <object class="GtkEntry" id="search_entry"> <property name="visible">True</property> <property name="sensitive">False</property> <property name="can_focus">True</property> <property name="activates_default">True</property> - <signal name="activate" handler="on_query_entry_activate"/> + <signal name="activate" handler="on_search_entry_activate" swapped="no"/> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> <child> <object class="GtkCheckButton" id="search_in_date"> <property name="label" translatable="yes">_In date search</property> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">False</property> <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">Searching only in the selected day </property> + <property name="use_action_appearance">False</property> <property name="use_underline">True</property> + <property name="xalign">0.5</property> <property name="draw_indicator">True</property> </object> <packing> @@ -99,6 +89,7 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -114,17 +105,18 @@ <child> <object class="GtkVBox" id="vbox2"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkCalendar" id="calendar"> <property name="visible">True</property> <property name="can_focus">True</property> - <signal name="month_changed" handler="on_calendar_month_changed"/> - <signal name="day_selected" handler="on_calendar_day_selected"/> + <signal name="month-changed" handler="on_calendar_month_changed" swapped="no"/> + <signal name="day-selected" handler="on_calendar_day_selected" swapped="no"/> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -141,8 +133,6 @@ <object class="GtkScrolledWindow" id="scrolledwindow"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> <property name="shadow_type">etched-in</property> <child> <placeholder/> @@ -163,15 +153,16 @@ <object class="GtkScrolledWindow" id="results_scrolledwindow"> <property name="can_focus">True</property> <property name="no_show_all">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> <property name="shadow_type">in</property> <child> <object class="GtkTreeView" id="results_treeview"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="rules_hint">True</property> - <signal name="row_activated" handler="on_results_treeview_row_activated"/> + <signal name="row-activated" handler="on_results_treeview_row_activated" swapped="no"/> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="treeview-selection1"/> + </child> </object> </child> </object> @@ -182,25 +173,33 @@ </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkHBox" id="hbox2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> <object class="GtkCheckButton" id="log_history_checkbutton"> <property name="label" translatable="yes">_Log conversation history</property> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> <property name="use_underline">True</property> + <property name="xalign">0.5</property> <property name="active">True</property> <property name="draw_indicator">True</property> </object> @@ -230,23 +229,27 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkHButtonBox" id="hbuttonbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <property name="layout_style">end</property> <child> <object class="GtkButton" id="close_button"> <property name="label">gtk-close</property> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_close_button_clicked"/> + <signal name="clicked" handler="on_close_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> diff --git a/data/gui/input_dialog.ui b/data/gui/input_dialog.ui index 1e475eb2b435077e3baad0402aa0ee670fdc0bcb..64c7269c1382cd5f68ead07d091e5fd0581ad6f9 100644 --- a/data/gui/input_dialog.ui +++ b/data/gui/input_dialog.ui @@ -1,51 +1,106 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-requires gtk+ 3.0 --> <object class="GtkDialog" id="input_dialog"> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="type_hint">dialog</property> - <property name="has_separator">False</property> - <signal name="destroy" handler="on_input_dialog_destroy"/> - <signal name="delete_event" handler="on_input_dialog_delete_event"/> + <signal name="destroy" handler="on_input_dialog_destroy" swapped="no"/> + <signal name="delete-event" handler="on_input_dialog_delete_event" swapped="no"/> <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox10"> + <object class="GtkBox" id="dialog-vbox10"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="cancelbutton"> + <property name="label">gtk-cancel</property> + <property name="use_action_appearance">False</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="okbutton"> + <property name="label">gtk-ok</property> + <property name="use_action_appearance">False</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> <child> <object class="GtkVBox" id="vbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> - <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkHBox" id="hbox2960"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">12</property> <child> <object class="GtkImage" id="image507"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-dialog-question</property> <property name="icon-size">6</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkLabel" id="label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_markup">True</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -62,50 +117,10 @@ </packing> </child> </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area9"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="cancelbutton"> - <property name="label">gtk-cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="okbutton"> - <property name="label">gtk-ok</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="has_default">True</property> - <property name="receives_default">False</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> <packing> <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> + <property name="fill">True</property> + <property name="position">1</property> </packing> </child> </object> diff --git a/data/gui/input_text_dialog.ui b/data/gui/input_text_dialog.ui index 68fc57979e6a29b9973135a1b167bd18c1e81ca8..c8584f696a296a78a01b4d85488a26a2bfa06d2b 100644 --- a/data/gui/input_text_dialog.ui +++ b/data/gui/input_text_dialog.ui @@ -1,51 +1,106 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-requires gtk+ 3.0 --> <object class="GtkDialog" id="input_dialog"> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="default_width">400</property> <property name="type_hint">dialog</property> - <property name="has_separator">False</property> - <signal name="destroy" handler="on_input_dialog_destroy"/> + <signal name="destroy" handler="on_input_dialog_destroy" swapped="no"/> <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox10"> + <object class="GtkBox" id="dialog-vbox10"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="orientation">vertical</property> <property name="spacing">6</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="cancelbutton"> + <property name="label">gtk-cancel</property> + <property name="use_action_appearance">False</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="okbutton"> + <property name="label">gtk-ok</property> + <property name="use_action_appearance">False</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="has_default">True</property> + <property name="receives_default">False</property> + <property name="use_action_appearance">False</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> <child> <object class="GtkVBox" id="vbox76"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> - <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkHBox" id="hbox2960"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">12</property> <child> <object class="GtkImage" id="image507"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-dialog-question</property> <property name="icon-size">6</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkLabel" id="label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_markup">True</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -53,7 +108,6 @@ <object class="GtkScrolledWindow" id="scrolledwindow1"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> <property name="vscrollbar_policy">never</property> <property name="shadow_type">in</property> <child> @@ -65,54 +119,16 @@ </child> </object> <packing> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area9"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="cancelbutton"> - <property name="label">gtk-cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="okbutton"> - <property name="label">gtk-ok</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="has_default">True</property> - <property name="receives_default">False</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> + <property name="fill">True</property> + <property name="position">1</property> </packing> </child> </object> diff --git a/data/gui/join_groupchat_window.ui b/data/gui/join_groupchat_window.ui index c2db0bc174c167681c50498f9881f6479a519aba..9e018f731bdbff138c2f89bcdeaffdf4e6369210 100644 --- a/data/gui/join_groupchat_window.ui +++ b/data/gui/join_groupchat_window.ui @@ -1,21 +1,32 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-requires gtk+ 3.0 --> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-find</property> + </object> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-apply</property> + </object> <object class="GtkWindow" id="join_groupchat_window"> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="title" translatable="yes">Join Group Chat</property> <property name="type_hint">dialog</property> - <signal name="destroy" handler="on_join_groupchat_window_destroy"/> - <signal name="key_press_event" handler="on_join_groupchat_window_key_press_event"/> + <signal name="destroy" handler="on_join_groupchat_window_destroy" swapped="no"/> + <signal name="key-press-event" handler="on_join_groupchat_window_key_press_event" swapped="no"/> <child> <object class="GtkVBox" id="vbox28"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">12</property> <child> <object class="GtkTable" id="table15"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="n_rows">8</property> <property name="n_columns">2</property> <property name="column_spacing">12</property> @@ -26,14 +37,14 @@ <property name="can_focus">True</property> <property name="has_focus">True</property> <property name="activates_default">True</property> - <signal name="changed" handler="on_required_entry_changed"/> + <signal name="changed" handler="on_required_entry_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="top_attach">3</property> <property name="bottom_attach">4</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -41,19 +52,20 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="activates_default">True</property> - <signal name="changed" handler="on_required_entry_changed"/> + <signal name="changed" handler="on_required_entry_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkLabel" id="label143"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Room:</property> </object> @@ -61,12 +73,13 @@ <property name="top_attach">3</property> <property name="bottom_attach">4</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkLabel" id="label142"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Nickname:</property> </object> @@ -74,12 +87,13 @@ <property name="top_attach">2</property> <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkLabel" id="label225"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Recently:</property> </object> @@ -87,13 +101,14 @@ <property name="top_attach">1</property> <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkComboBox" id="recently_combobox"> <property name="visible">True</property> - <signal name="changed" handler="on_recently_combobox_changed"/> + <property name="can_focus">False</property> + <signal name="changed" handler="on_recently_combobox_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> @@ -107,6 +122,7 @@ <child> <object class="GtkLabel" id="label145"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Password:</property> </object> @@ -114,7 +130,7 @@ <property name="top_attach">5</property> <property name="bottom_attach">6</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -129,7 +145,7 @@ <property name="right_attach">2</property> <property name="top_attach">5</property> <property name="bottom_attach">6</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -140,6 +156,7 @@ <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> </object> <packing> @@ -147,24 +164,26 @@ <property name="top_attach">7</property> <property name="bottom_attach">8</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkLabel" id="account_label"> + <property name="can_focus">False</property> <property name="no_show_all">True</property> <property name="xalign">0</property> <property name="label" translatable="yes">Account</property> </object> <packing> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkComboBox" id="account_combobox"> + <property name="can_focus">False</property> <property name="no_show_all">True</property> - <signal name="changed" handler="on_account_combobox_changed"/> + <signal name="changed" handler="on_account_combobox_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> @@ -180,20 +199,22 @@ <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_bookmark_checkbutton_toggled"/> + <signal name="toggled" handler="on_bookmark_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="right_attach">2</property> <property name="top_attach">6</property> <property name="bottom_attach">7</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkLabel" id="label1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Server:</property> </object> @@ -205,16 +226,10 @@ <child> <object class="GtkHBox" id="hbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> - <object class="GtkComboBoxEntry" id="server_comboboxentry"> - <property name="visible">True</property> - <property name="model">liststore1</property> - <property name="text_column">0</property> - </object> - <packing> - <property name="position">0</property> - </packing> + <placeholder/> </child> <child> <object class="GtkButton" id="browse_rooms_button"> @@ -224,9 +239,12 @@ <property name="receives_default">True</property> <property name="image">image1</property> <property name="use_underline">True</property> - <signal name="clicked" handler="on_browse_rooms_button_clicked"/> + <signal name="clicked" handler="on_browse_rooms_button_clicked" swapped="no"/> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="pack_type">end</property> <property name="position">1</property> </packing> </child> @@ -242,12 +260,14 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkHButtonBox" id="hbuttonbox12"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">12</property> <property name="layout_style">end</property> <child> @@ -258,7 +278,7 @@ <property name="can_default">True</property> <property name="receives_default">False</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_cancel_button_clicked"/> + <signal name="clicked" handler="on_cancel_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -268,48 +288,15 @@ </child> <child> <object class="GtkButton" id="join_button"> + <property name="label" translatable="yes">_Join</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="has_default">True</property> <property name="receives_default">False</property> - <signal name="clicked" handler="on_join_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment25"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox37"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image148"> - <property name="visible">True</property> - <property name="stock">gtk-apply</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label146"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Join</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> + <property name="image">image2</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="on_join_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -320,6 +307,7 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="pack_type">end</property> <property name="position">1</property> </packing> @@ -327,14 +315,4 @@ </object> </child> </object> - <object class="GtkListStore" id="liststore1"> - <columns> - <!-- column-name gchararray1 --> - <column type="gchararray"/> - </columns> - </object> - <object class="GtkImage" id="image1"> - <property name="visible">True</property> - <property name="stock">gtk-find</property> - </object> </interface> diff --git a/data/gui/manage_bookmarks_window.ui b/data/gui/manage_bookmarks_window.ui index 752aeaa30d4cd8b9c217cd0c76f11ed2c334ae25..f61987d6cee97fd711829b6fdf3ebd84a91c04cc 100644 --- a/data/gui/manage_bookmarks_window.ui +++ b/data/gui/manage_bookmarks_window.ui @@ -51,7 +51,7 @@ <object class="GtkHButtonBox" id="hbuttonbox25"> <property name="visible">True</property> <property name="spacing">6</property> - <property name="layout_style">end</property> + <property name="layout_style">center</property> <child> <object class="GtkButton" id="add_bookmark_button"> <property name="label">gtk-add</property> @@ -113,7 +113,7 @@ <property name="top_attach">4</property> <property name="bottom_attach">5</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -128,7 +128,7 @@ <property name="right_attach">2</property> <property name="top_attach">4</property> <property name="bottom_attach">5</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -142,7 +142,7 @@ <property name="right_attach">2</property> <property name="top_attach">3</property> <property name="bottom_attach">4</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -156,7 +156,7 @@ <property name="top_attach">3</property> <property name="bottom_attach">4</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -170,7 +170,7 @@ <property name="top_attach">2</property> <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -184,7 +184,7 @@ <property name="right_attach">2</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -198,7 +198,7 @@ <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -212,7 +212,7 @@ <property name="top_attach">1</property> <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -224,7 +224,7 @@ </object> <packing> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -236,7 +236,7 @@ <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -250,7 +250,7 @@ <property name="top_attach">6</property> <property name="bottom_attach">7</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> diff --git a/data/gui/manage_pep_services_window.ui b/data/gui/manage_pep_services_window.ui index e73aaea323db3f45a2479fa6d040de17ee62749b..778a99775733d30cbfcb93e0ac21218c336d4608 100644 --- a/data/gui/manage_pep_services_window.ui +++ b/data/gui/manage_pep_services_window.ui @@ -55,38 +55,14 @@ </child> <child> <object class="GtkButton" id="configure_button"> + <property name="label" translatable="yes">_Configure</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="image">image1</property> + <property name="use_underline">True</property> <signal name="clicked" handler="on_configure_button_clicked"/> - <child> - <object class="GtkHBox" id="hbox1"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <child> - <object class="GtkImage" id="image1"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-preferences</property> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="label" translatable="yes">_Configure</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -120,4 +96,8 @@ </object> </child> </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="stock">gtk-preferences</property> + </object> </interface> diff --git a/data/gui/manage_proxies_window.ui b/data/gui/manage_proxies_window.ui index 0fe8109e5b7e046ca59161755c89ce0f8b84f679..ce1b419a2dd4c71be845810d34a45a6c8c07c9e5 100644 --- a/data/gui/manage_proxies_window.ui +++ b/data/gui/manage_proxies_window.ui @@ -22,6 +22,7 @@ <object class="GtkWindow" id="manage_proxies_window"> <property name="border_width">12</property> <property name="title" translatable="yes">Manage Proxy Profiles</property> + <property name="window_position">center-on-parent</property> <property name="type_hint">dialog</property> <signal name="destroy" handler="on_manage_proxies_window_destroy"/> <child> @@ -63,7 +64,7 @@ <object class="GtkHButtonBox" id="hbuttonbox21"> <property name="visible">True</property> <property name="spacing">6</property> - <property name="layout_style">end</property> + <property name="layout_style">center</property> <child> <object class="GtkButton" id="add_proxy_button"> <property name="label">gtk-add</property> @@ -137,7 +138,7 @@ <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -172,7 +173,7 @@ <property name="top_attach">1</property> <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -185,7 +186,7 @@ </object> <packing> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> </object> @@ -237,7 +238,7 @@ <property name="top_attach">1</property> <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -249,7 +250,7 @@ <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -262,7 +263,7 @@ </object> <packing> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -280,7 +281,7 @@ <property name="top_attach">4</property> <property name="bottom_attach">5</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -294,7 +295,7 @@ <property name="right_attach">2</property> <property name="top_attach">5</property> <property name="bottom_attach">6</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -309,7 +310,7 @@ <property name="right_attach">2</property> <property name="top_attach">6</property> <property name="bottom_attach">7</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -324,7 +325,7 @@ <property name="top_attach">5</property> <property name="bottom_attach">6</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -339,7 +340,7 @@ <property name="top_attach">6</property> <property name="bottom_attach">7</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -354,7 +355,7 @@ <property name="top_attach">2</property> <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -368,7 +369,7 @@ <property name="right_attach">2</property> <property name="top_attach">3</property> <property name="bottom_attach">4</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -382,7 +383,7 @@ <property name="right_attach">2</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> @@ -397,7 +398,7 @@ <property name="top_attach">3</property> <property name="bottom_attach">4</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> </object> diff --git a/data/gui/manage_sounds_window.ui b/data/gui/manage_sounds_window.ui index b1243a1eb4f26606383a0a76e5506b5736b689e9..798413880ca18ebae7ab9972ba125e1c2d0cd494 100644 --- a/data/gui/manage_sounds_window.ui +++ b/data/gui/manage_sounds_window.ui @@ -7,6 +7,7 @@ <property name="height_request">350</property> <property name="border_width">6</property> <property name="title" translatable="yes">Manage sounds</property> + <property name="window_position">center-on-parent</property> <property name="type_hint">dialog</property> <signal name="delete_event" handler="on_manage_sounds_window_delete_event"/> <child> diff --git a/data/gui/message_window.ui b/data/gui/message_window.ui index b801f82906eb13ec701468abdea682dc3ed8f836..da9982ba491ef842be43da160bbb08d997f96b78 100644 --- a/data/gui/message_window.ui +++ b/data/gui/message_window.ui @@ -1,34 +1,19 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> - <object class="GtkWindow" id="message_window"> - <property name="default_width">480</property> - <property name="default_height">440</property> - <child> - <object class="GtkAlignment" id="msg_window_alignment"> - <property name="visible">True</property> - <property name="top_padding">2</property> - <child> - <object class="GtkNotebook" id="notebook"> - <property name="visible">True</property> - <property name="scrollable">True</property> - <property name="tab_border">0</property> - </object> - </child> - </object> - </child> - </object> + <!-- interface-requires gtk+ 3.0 --> <object class="GtkEventBox" id="chat_tab_ebox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="visible_window">False</property> <child> <object class="GtkHBox" id="tab_hbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">4</property> <child> <object class="GtkImage" id="tab_image"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-missing-image</property> </object> <packing> @@ -39,25 +24,32 @@ </child> <child> <object class="GtkLabel" id="tab_label"> + <property name="width_request">70</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="use_markup">True</property> <property name="ellipsize">end</property> <property name="max_width_chars">9</property> </object> <packing> + <property name="expand">False</property> + <property name="fill">False</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkButton" id="tab_close_button"> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> + <property name="use_action_appearance">False</property> <property name="relief">none</property> <child> <object class="GtkImage" id="image1329"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-close</property> <property name="icon-size">1</property> </object> @@ -72,4 +64,23 @@ </object> </child> </object> + <object class="GtkWindow" id="message_window"> + <property name="can_focus">False</property> + <property name="default_width">480</property> + <property name="default_height">440</property> + <child> + <object class="GtkAlignment" id="msg_window_alignment"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="top_padding">2</property> + <child> + <object class="GtkNotebook" id="notebook"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="scrollable">True</property> + </object> + </child> + </object> + </child> + </object> </interface> diff --git a/data/gui/plugins_window.ui b/data/gui/plugins_window.ui index 357815983829a2666b1d8c1a67bf2d0807106136..2ddcd5efa5615454852fbf2d09c68dbd27a29f05 100644 --- a/data/gui/plugins_window.ui +++ b/data/gui/plugins_window.ui @@ -1,39 +1,55 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-requires gtk+ 3.0 --> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-apply</property> + </object> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-cancel</property> + </object> + <object class="GtkImage" id="image3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-preferences</property> + </object> <object class="GtkWindow" id="plugins_window"> <property name="width_request">650</property> <property name="height_request">500</property> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="title" translatable="yes">Plugins</property> <property name="default_width">650</property> <property name="default_height">500</property> <property name="type_hint">dialog</property> - <signal name="destroy" handler="on_plugins_window_destroy"/> + <signal name="destroy" handler="on_plugins_window_destroy" swapped="no"/> <child> <object class="GtkVBox" id="vbox1"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkNotebook" id="plugins_notebook"> <property name="visible">True</property> <property name="can_focus">True</property> - <signal name="switch_page" handler="on_plugins_notebook_switch_page"/> + <signal name="switch-page" handler="on_plugins_notebook_switch_page" swapped="no"/> <child> <object class="GtkHPaned" id="hpaned1"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="position">250</property> + <property name="position_set">True</property> <child> <object class="GtkAlignment" id="alignment1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <child> <object class="GtkVBox" id="vbox6"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <child> <object class="GtkScrolledWindow" id="scrolledwindow1"> <property name="visible">True</property> @@ -48,50 +64,32 @@ </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkAspectFrame" id="aspectframe1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <property name="xalign">0</property> <child> <object class="GtkButton" id="install_plugin_button"> + <property name="label" translatable="yes">Install from zip</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <signal name="clicked" handler="on_install_plugin_button_clicked"/> - <child> - <object class="GtkHBox" id="hbox8"> - <property name="visible">True</property> - <child> - <object class="GtkImage" id="image2"> - <property name="visible">True</property> - <property name="stock">gtk-apply</property> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="configure_plugin_button_label2"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Install from zip</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - </child> + <property name="image">image1</property> + <signal name="clicked" handler="on_install_plugin_button_clicked" swapped="no"/> </object> </child> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="padding">5</property> <property name="position">1</property> </packing> @@ -107,104 +105,125 @@ <child> <object class="GtkVBox" id="vbox2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> - <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="plugin_name_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">&lt;empty&gt;</property> - <property name="use_markup">True</property> <property name="selectable">True</property> + <attributes> + <attribute name="weight" value="bold"/> + </attributes> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkHBox" id="hbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="label5"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Version:</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkLabel" id="plugin_version_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> - <property name="label" translatable="yes"><empty></property> + <property name="label"><empty></property> <property name="selectable">True</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkHBox" id="hbox2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="label4"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="yalign">0</property> <property name="label" translatable="yes">Authors:</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkLabel" id="plugin_authors_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="yalign">0</property> - <property name="label" translatable="yes"><empty></property> + <property name="label"><empty></property> <property name="wrap_mode">word-char</property> <property name="selectable">True</property> <property name="ellipsize">end</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> <child> <object class="GtkHBox" id="hbox3"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkLabel" id="label6"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Homepage:</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkLinkButton" id="plugin_homepage_linkbutton"> - <property name="label" translatable="yes">homepage url</property> + <property name="label">homepage url</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> @@ -213,28 +232,35 @@ <property name="xalign">0</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">3</property> </packing> </child> <child> <object class="GtkVBox" id="vbox3"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkHBox" id="hbox5"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkLabel" id="label7"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Description:</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -244,6 +270,7 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -251,56 +278,38 @@ <object class="GtkScrolledWindow" id="scrolledwindow2"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> + <property name="shadow_type">in</property> <child> <placeholder/> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">4</property> </packing> </child> <child> <object class="GtkHButtonBox" id="hbuttonbox3"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">5</property> <property name="layout_style">end</property> <child> <object class="GtkButton" id="uninstall_plugin_button"> + <property name="label" translatable="yes">Uninstall</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <signal name="clicked" handler="on_uninstall_plugin_button_clicked"/> - <child> - <object class="GtkHBox" id="hbox6"> - <property name="visible">True</property> - <child> - <object class="GtkImage" id="image5"> - <property name="visible">True</property> - <property name="stock">gtk-cancel</property> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="uninstall_plugin_button_label1"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Uninstall</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - </child> + <property name="image">image2</property> + <signal name="clicked" handler="on_uninstall_plugin_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -310,34 +319,12 @@ </child> <child> <object class="GtkButton" id="configure_plugin_button"> + <property name="label" translatable="yes">Configure</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - <signal name="clicked" handler="on_configure_plugin_button_clicked"/> - <child> - <object class="GtkHBox" id="hbox7"> - <property name="visible">True</property> - <child> - <object class="GtkImage" id="image6"> - <property name="visible">True</property> - <property name="stock">gtk-preferences</property> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="configure_plugin_button_label1"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Configure</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - </child> + <property name="image">image3</property> + <signal name="clicked" handler="on_configure_plugin_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -348,13 +335,14 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">5</property> </packing> </child> </object> <packing> <property name="resize">True</property> - <property name="shrink">True</property> + <property name="shrink">False</property> </packing> </child> </object> @@ -362,6 +350,7 @@ <child type="tab"> <object class="GtkLabel" id="label1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Installed</property> </object> <packing> @@ -376,12 +365,15 @@ </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkHButtonBox" id="hbuttonbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">15</property> <property name="layout_style">end</property> <child> @@ -391,7 +383,7 @@ <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_close_button_clicked"/> + <signal name="clicked" handler="on_close_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -402,6 +394,7 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> diff --git a/data/gui/preferences_window.ui b/data/gui/preferences_window.ui index d9ea88655ee2e0a05df56ca738bfba4bbd2595c0..43068b2136a73c9de67d7ed4d03af01521b55a0f 100644 --- a/data/gui/preferences_window.ui +++ b/data/gui/preferences_window.ui @@ -1,21 +1,30 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-requires gtk+ 3.0 --> <object class="GtkAdjustment" id="adjustment1"> - <property name="value">20</property> <property name="lower">1</property> <property name="upper">1440</property> + <property name="value">20</property> <property name="step_increment">1</property> <property name="page_increment">10</property> </object> <object class="GtkAdjustment" id="adjustment2"> - <property name="value">12</property> <property name="lower">1</property> <property name="upper">720</property> + <property name="value">12</property> <property name="step_increment">1</property> <property name="page_increment">10</property> </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-revert-to-saved</property> + </object> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-open</property> + </object> <object class="GtkListStore" id="liststore1"> <columns> <!-- column-name item --> @@ -149,47 +158,68 @@ </row> </data> </object> + <object class="GtkListStore" id="status_message_liststore"> + <columns> + <!-- column-name name --> + <column type="gchararray"/> + <!-- column-name text --> + <column type="gchararray"/> + <!-- column-name activity --> + <column type="gchararray"/> + <!-- column-name sub_activity --> + <column type="gchararray"/> + <!-- column-name activity_text --> + <column type="gchararray"/> + <!-- column-name mood --> + <column type="gchararray"/> + <!-- column-name mood_text --> + <column type="gchararray"/> + </columns> + </object> <object class="GtkWindow" id="preferences_window"> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="title" translatable="yes">Preferences</property> <property name="role">preferences</property> <property name="type_hint">dialog</property> - <signal name="destroy" handler="on_preferences_window_destroy"/> - <signal name="key_press_event" handler="on_preferences_window_key_press_event"/> + <signal name="destroy" handler="on_preferences_window_destroy" swapped="no"/> + <signal name="key-press-event" handler="on_preferences_window_key_press_event" swapped="no"/> <child> <object class="GtkVBox" id="vbox13"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkNotebook" id="preferences_notebook"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="show_border">False</property> - <signal name="switch_page" handler="on_preferences_notebook_switch_page"/> + <signal name="switch-page" handler="on_preferences_notebook_switch_page" swapped="no"/> <child> <object class="GtkVBox" id="vbox41"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">12</property> - <property name="orientation">vertical</property> <property name="spacing">12</property> <child> <object class="GtkFrame" id="frame1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="border_width">6</property> <property name="left_padding">12</property> <child> <object class="GtkVBox" id="vbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkCheckButton" id="show_avatars_in_roster_checkbutton"> @@ -199,8 +229,9 @@ <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">If checked, Gajim will display avatars of contacts in roster window and in group chats</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_show_avatars_in_roster_checkbutton_toggled"/> + <signal name="toggled" handler="on_show_avatars_in_roster_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -216,8 +247,9 @@ <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">If checked, Gajim will display status messages of contacts under the contact name in roster window and in group chats</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_show_status_msgs_in_roster_checkbutton_toggled"/> + <signal name="toggled" handler="on_show_status_msgs_in_roster_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -227,14 +259,15 @@ </child> <child> <object class="GtkCheckButton" id="show_pep_in_roster_checkbutton"> - <property name="label" translatable="yes">Display e_xtra information of contacts in roster (mood, activity, ...)</property> + <property name="label" translatable="yes">Display e_xtra information of contacts in roster (mood, activity, ...)m_ood of contacts in roster</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">If checked, Gajim will display the mood of contacts in the roster window</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_show_pep_in_roster_checkbutton_toggled"/> + <signal name="toggled" handler="on_show_pep_in_roster_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -245,14 +278,17 @@ <child> <object class="GtkHBox" id="hbox3"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="label10"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Sort contacts by status</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -263,11 +299,13 @@ <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_sort_by_show_in_roster_checkbutton_toggled"/> + <signal name="toggled" handler="on_sort_by_show_in_roster_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -278,15 +316,20 @@ <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_sort_by_show_in_muc_checkbutton_toggled"/> + <signal name="toggled" handler="on_sort_by_show_in_muc_checkbutton_toggled" swapped="no"/> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">3</property> </packing> </child> @@ -297,6 +340,7 @@ <child type="label"> <object class="GtkLabel" id="label1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label" translatable="yes"><b>Roster Appearance</b></property> <property name="use_markup">True</property> @@ -305,24 +349,28 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkFrame" id="frame2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="border_width">6</property> <property name="left_padding">12</property> <child> <object class="GtkTable" id="table1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="n_rows">7</property> <property name="n_columns">2</property> @@ -331,6 +379,7 @@ <child> <object class="GtkLabel" id="label379"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="xpad">1</property> <property name="label" translatable="yes">_Window behavior:</property> @@ -346,7 +395,8 @@ <child> <object class="GtkComboBox" id="emoticons_combobox"> <property name="visible">True</property> - <signal name="changed" handler="on_emoticons_combobox_changed"/> + <property name="can_focus">False</property> + <signal name="changed" handler="on_emoticons_combobox_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> @@ -356,10 +406,12 @@ <child> <object class="GtkEventBox" id="eventbox5"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons</property> <child> <object class="GtkLabel" id="label381"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="xpad">1</property> <property name="label" translatable="yes">_Emoticons:</property> @@ -378,8 +430,9 @@ <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">Hide all buttons in chat windows</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_compact_view_checkbutton_toggled"/> + <signal name="toggled" handler="on_compact_view_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="right_attach">2</property> @@ -396,8 +449,9 @@ <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text.</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_xhtml_checkbutton_toggled"/> + <signal name="toggled" handler="on_xhtml_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="right_attach">2</property> @@ -413,8 +467,9 @@ <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">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.</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_speller_checkbutton_toggled"/> + <signal name="toggled" handler="on_speller_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="right_attach">2</property> @@ -427,8 +482,9 @@ <object class="GtkComboBox" id="one_window_type_combobox"> <property name="width_request">50</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="model">liststore6</property> - <signal name="changed" handler="on_one_window_type_combo_changed"/> + <signal name="changed" handler="on_one_window_type_combo_changed" swapped="no"/> <child> <object class="GtkCellRendererText" id="cellrenderertext6"/> <attributes> @@ -446,6 +502,7 @@ <child> <object class="GtkLabel" id="label28"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="xpad">1</property> <property name="label" translatable="yes">_Show roster on startup:</property> @@ -462,8 +519,9 @@ <object class="GtkComboBox" id="show_roster_on_startup"> <property name="width_request">50</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="model">liststore7</property> - <signal name="changed" handler="on_show_roster_on_startup_changed"/> + <signal name="changed" handler="on_show_roster_on_startup_changed" swapped="no"/> <child> <object class="GtkCellRendererText" id="cellrenderertext7"/> <attributes> @@ -484,8 +542,9 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_positive_184_ack_checkbutton_toggled"/> + <signal name="toggled" handler="on_positive_184_ack_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="right_attach">2</property> @@ -500,6 +559,7 @@ <child type="label"> <object class="GtkLabel" id="label2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label" translatable="yes"><b>Chat Appearance</b></property> <property name="use_markup">True</property> @@ -508,6 +568,7 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -516,6 +577,7 @@ <child type="tab"> <object class="GtkLabel" id="label74"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">General</property> </object> <packing> @@ -525,47 +587,53 @@ <child> <object class="GtkVBox" id="vbox42"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">12</property> - <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkFrame" id="frame29"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment58"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="left_padding">12</property> <child> <object class="GtkVBox" id="vbox67"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkHBox" id="hbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="label7"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="xalign">0</property> <property name="label" translatable="yes">When new event is received:</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkComboBox" id="on_event_combobox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="model">liststore5</property> - <signal name="changed" handler="on_on_event_combobox_changed"/> + <signal name="changed" handler="on_on_event_combobox_changed" swapped="no"/> <child> <object class="GtkCellRendererText" id="cellrenderertext5"/> <attributes> @@ -574,11 +642,15 @@ </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> + <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -590,10 +662,13 @@ <property name="receives_default">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_notify_on_signin_checkbutton_toggled"/> + <signal name="toggled" handler="on_notify_on_signin_checkbutton_toggled" swapped="no"/> </object> <packing> + <property name="expand">False</property> + <property name="fill">False</property> <property name="position">1</property> </packing> </child> @@ -605,8 +680,9 @@ <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed out</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_notify_on_signout_checkbutton_toggled"/> + <signal name="toggled" handler="on_notify_on_signout_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -621,8 +697,9 @@ <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_auto_popup_away_checkbutton_toggled"/> + <signal name="toggled" handler="on_auto_popup_away_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -634,17 +711,19 @@ <object class="GtkFrame" id="frame_gmail"> <property name="visible">True</property> <property name="sensitive">False</property> + <property name="can_focus">False</property> <property name="no_show_all">True</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment_gmail"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="left_padding">12</property> <child> <object class="GtkVBox" id="vbox_gmail"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkCheckButton" id="notify_gmail_checkbutton"> @@ -654,8 +733,9 @@ <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">If checked, Gajim will show a notification when a new e-mail is received via GMail</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_notify_gmail_checkbutton_toggled"/> + <signal name="toggled" handler="on_notify_gmail_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -671,8 +751,9 @@ <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">If checked, Gajim will also include information about the sender of new emails</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_notify_gmail_extra_checkbutton_toggled"/> + <signal name="toggled" handler="on_notify_gmail_extra_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -687,6 +768,7 @@ <child type="label"> <object class="GtkLabel" id="gmail_options_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>GMail Options</b></property> <property name="use_markup">True</property> </object> @@ -701,22 +783,26 @@ <child> <object class="GtkHBox" id="hbox5"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="label11"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Show notification area icon:</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkComboBox" id="systray_combobox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="model">liststore4</property> - <signal name="changed" handler="on_systray_combobox_changed"/> + <signal name="changed" handler="on_systray_combobox_changed" swapped="no"/> <child> <object class="GtkCellRendererText" id="cellrenderertext4"/> <attributes> @@ -725,12 +811,15 @@ </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">5</property> </packing> </child> @@ -741,6 +830,7 @@ <child type="label"> <object class="GtkLabel" id="label240"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>Visual Notifications</b></property> <property name="use_markup">True</property> </object> @@ -748,29 +838,33 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkFrame" id="frame5"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment5"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="border_width">6</property> <property name="left_padding">12</property> <child> <object class="GtkVBox" id="vbox3"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkHBox" id="hbox4"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkCheckButton" id="play_sounds_checkbutton"> @@ -779,11 +873,13 @@ <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_play_sounds_checkbutton_toggled"/> + <signal name="toggled" handler="on_play_sounds_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -794,15 +890,18 @@ <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_underline">True</property> - <signal name="clicked" handler="on_manage_sounds_button_clicked"/> + <signal name="clicked" handler="on_manage_sounds_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> + <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -813,10 +912,13 @@ <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_sound_dnd_checkbutton_toggled"/> + <signal name="toggled" handler="on_sound_dnd_checkbutton_toggled" swapped="no"/> </object> <packing> + <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -827,6 +929,7 @@ <child type="label"> <object class="GtkLabel" id="label8"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label" translatable="yes"><b>Sounds</b></property> <property name="use_markup">True</property> @@ -835,6 +938,7 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -846,6 +950,7 @@ <child type="tab"> <object class="GtkLabel" id="label76"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="no_show_all">True</property> <property name="label" translatable="yes">Notifications</property> </object> @@ -857,24 +962,31 @@ <child> <object class="GtkVBox" id="vbox11"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">12</property> - <property name="orientation">vertical</property> <property name="spacing">12</property> <child> <object class="GtkFrame" id="frame13"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label_xalign">0</property> + <property name="label_yalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment19"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="border_width">6</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="yscale">0</property> <property name="left_padding">12</property> <child> <object class="GtkTable" id="table7"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="n_rows">2</property> <property name="n_columns">2</property> @@ -883,8 +995,9 @@ <child> <object class="GtkComboBox" id="displayed_chat_states_combobox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="model">liststore3</property> - <signal name="changed" handler="on_displayed_chat_states_combobox_changed"/> + <signal name="changed" handler="on_displayed_chat_states_combobox_changed" swapped="no"/> <child> <object class="GtkCellRendererText" id="cellrenderertext3"/> <attributes> @@ -897,15 +1010,18 @@ <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkEventBox" id="eventbox8"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">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.</property> <child> <object class="GtkLabel" id="label33"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_Display chat state notifications:</property> <property name="use_underline">True</property> @@ -921,10 +1037,12 @@ <child> <object class="GtkEventBox" id="eventbox9"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">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.</property> <child> <object class="GtkLabel" id="label34"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_Send chat state notifications:</property> <property name="use_underline">True</property> @@ -938,8 +1056,9 @@ <child> <object class="GtkComboBox" id="outgoing_chat_states_combobox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="model">liststore2</property> - <signal name="changed" handler="on_outgoing_chat_states_combobox_changed"/> + <signal name="changed" handler="on_outgoing_chat_states_combobox_changed" swapped="no"/> <child> <object class="GtkCellRendererText" id="cellrenderertext2"/> <attributes> @@ -950,6 +1069,7 @@ <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> + <property name="y_options"/> </packing> </child> </object> @@ -959,6 +1079,7 @@ <child type="label"> <object class="GtkLabel" id="label35"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label" translatable="yes"><b>Chat state notifications</b></property> <property name="use_markup">True</property> @@ -967,17 +1088,23 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> + <child> + <placeholder/> + </child> </object> <packing> <property name="position">2</property> + <property name="tab_fill">False</property> </packing> </child> <child type="tab"> <object class="GtkLabel" id="label9"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label" translatable="yes">Personal Events</property> </object> @@ -989,23 +1116,26 @@ <child> <object class="GtkVBox" id="status_vbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">12</property> - <property name="orientation">vertical</property> <property name="spacing">12</property> <child> <object class="GtkFrame" id="frame81"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="no_show_all">True</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment_gmail1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="left_padding">12</property> <child> <object class="GtkTable" id="autoaway_table"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="n_rows">2</property> <property name="n_columns">4</property> <property name="column_spacing">12</property> @@ -1018,8 +1148,9 @@ <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">If checked, Gajim will change status to Away when the computer is unused.</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_auto_away_checkbutton_toggled"/> + <signal name="toggled" handler="on_auto_away_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="x_options">GTK_FILL</property> @@ -1034,8 +1165,9 @@ <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">If checked, Gajim will change status to Not Available when the computer has not been used even longer</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_auto_xa_checkbutton_toggled"/> + <signal name="toggled" handler="on_auto_xa_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="top_attach">1</property> @@ -1047,6 +1179,7 @@ <child> <object class="GtkLabel" id="label77"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">minutes</property> </object> @@ -1060,6 +1193,7 @@ <child> <object class="GtkLabel" id="label78"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">minutes</property> </object> @@ -1075,6 +1209,7 @@ <child> <object class="GtkAlignment" id="alignment33"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">1</property> <property name="xscale">0</property> <child> @@ -1084,7 +1219,7 @@ <property name="can_focus">True</property> <property name="adjustment">adjustment2</property> <property name="climb_rate">1</property> - <signal name="value_changed" handler="on_auto_away_time_spinbutton_value_changed"/> + <signal name="value-changed" handler="on_auto_away_time_spinbutton_value_changed" swapped="no"/> </object> </child> </object> @@ -1098,6 +1233,7 @@ <child> <object class="GtkAlignment" id="alignment34"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">1</property> <property name="xscale">0</property> <child> @@ -1107,7 +1243,7 @@ <property name="can_focus">True</property> <property name="adjustment">adjustment1</property> <property name="climb_rate">1</property> - <signal name="value_changed" handler="on_auto_xa_time_spinbutton_value_changed"/> + <signal name="value-changed" handler="on_auto_xa_time_spinbutton_value_changed" swapped="no"/> </object> </child> </object> @@ -1127,7 +1263,7 @@ <property name="tooltip_text" translatable="yes">The auto away status message. If empty, Gajim will not change the current status message $S will be replaced by previous status message $T will be replaced by auto-away timeout</property> - <signal name="changed" handler="on_auto_away_message_entry_changed"/> + <signal name="changed" handler="on_auto_away_message_entry_changed" swapped="no"/> </object> <packing> <property name="left_attach">3</property> @@ -1142,7 +1278,7 @@ $T will be replaced by auto-away timeout</property> <property name="tooltip_text" translatable="yes">The auto not available status message. If empty, Gajim will not change the current status message $S will be replaced by previous status message $T will be replaced by auto-not-available timeout</property> - <signal name="changed" handler="on_auto_xa_message_entry_changed"/> + <signal name="changed" handler="on_auto_xa_message_entry_changed" swapped="no"/> </object> <packing> <property name="left_attach">3</property> @@ -1159,6 +1295,7 @@ $T will be replaced by auto-not-available timeout</property> <child type="label"> <object class="GtkLabel" id="label81"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>Auto Status</b></property> <property name="use_markup">True</property> </object> @@ -1173,26 +1310,30 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkFrame" id="frame8"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment8"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="left_padding">12</property> <child> <object class="GtkVBox" id="vbox2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkHBox" id="hbox2934"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="label214"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Ask status message when I:</property> </object> <packing> @@ -1204,6 +1345,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkHBox" id="hbox6"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">14</property> <child> <object class="GtkCheckButton" id="prompt_online_status_message_checkbutton"> @@ -1212,8 +1354,9 @@ $T will be replaced by auto-not-available timeout</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_prompt_online_status_message_checkbutton_toggled"/> + <signal name="toggled" handler="on_prompt_online_status_message_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -1228,8 +1371,9 @@ $T will be replaced by auto-not-available timeout</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_prompt_offline_status_message_checkbutton_toggled"/> + <signal name="toggled" handler="on_prompt_offline_status_message_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -1256,8 +1400,6 @@ $T will be replaced by auto-not-available timeout</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="tooltip_text" translatable="yes">If enabled, Gajim will not ask for a status message. The specified default message will be used instead.</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> <property name="shadow_type">in</property> <child> <object class="GtkTreeView" id="default_msg_treeview"> @@ -1267,6 +1409,8 @@ $T will be replaced by auto-not-available timeout</property> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -1277,36 +1421,46 @@ $T will be replaced by auto-not-available timeout</property> <child type="label"> <object class="GtkLabel" id="label12"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>Status Messages</b></property> <property name="use_markup">True</property> </object> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkFrame" id="frame22"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment49"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="left_padding">12</property> <child> <object class="GtkTable" id="table4"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="n_rows">2</property> <property name="n_columns">2</property> <property name="column_spacing">6</property> <property name="row_spacing">6</property> + <child> + <placeholder/> + </child> <child> <object class="GtkVButtonBox" id="vbuttonbox3"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">5</property> <property name="layout_style">start</property> <child> @@ -1317,7 +1471,7 @@ $T will be replaced by auto-not-available timeout</property> <property name="can_default">True</property> <property name="receives_default">False</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_new_msg_button_clicked"/> + <signal name="clicked" handler="on_new_msg_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -1333,7 +1487,7 @@ $T will be replaced by auto-not-available timeout</property> <property name="can_default">True</property> <property name="receives_default">False</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_delete_msg_button_clicked"/> + <signal name="clicked" handler="on_delete_msg_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -1353,16 +1507,16 @@ $T will be replaced by auto-not-available timeout</property> <object class="GtkScrolledWindow" id="scrolledwindow22"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> <property name="shadow_type">in</property> <child> <object class="GtkTreeView" id="msg_treeview"> <property name="visible">True</property> <property name="can_focus">True</property> + <property name="model">status_message_liststore</property> <property name="headers_visible">False</property> - <signal name="cursor_changed" handler="on_msg_treeview_cursor_changed"/> - <signal name="key_press_event" handler="on_msg_treeview_key_press_event"/> + <property name="headers_clickable">False</property> + <signal name="cursor-changed" handler="on_msg_treeview_cursor_changed" swapped="no"/> + <signal name="key-press-event" handler="on_msg_treeview_key_press_event" swapped="no"/> </object> </child> </object> @@ -1376,6 +1530,7 @@ $T will be replaced by auto-not-available timeout</property> <property name="shadow_type">in</property> <child> <object class="GtkTextView" id="msg_textview"> + <property name="height_request">21</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="border_width">3</property> @@ -1389,9 +1544,6 @@ $T will be replaced by auto-not-available timeout</property> <property name="y_options">GTK_FILL</property> </packing> </child> - <child> - <placeholder/> - </child> </object> </child> </object> @@ -1399,12 +1551,15 @@ $T will be replaced by auto-not-available timeout</property> <child type="label"> <object class="GtkLabel" id="label213"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>Preset Status Messages</b></property> <property name="use_markup">True</property> </object> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> @@ -1416,6 +1571,7 @@ $T will be replaced by auto-not-available timeout</property> <child type="tab"> <object class="GtkLabel" id="label80"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Status</property> </object> <packing> @@ -1426,33 +1582,39 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkVBox" id="vbox58"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">12</property> - <property name="orientation">vertical</property> <property name="spacing">12</property> <child> <object class="GtkFrame" id="frame9"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment10"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="left_padding">12</property> <child> <object class="GtkTable" id="table5"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="n_rows">2</property> <property name="n_columns">2</property> <property name="column_spacing">6</property> <property name="row_spacing">6</property> + <child> + <placeholder/> + </child> <child> <object class="GtkFontButton" id="conversation_fontbutton"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> - <signal name="font_set" handler="on_conversation_fontbutton_font_set"/> + <signal name="font-set" handler="on_conversation_fontbutton_font_set" swapped="no"/> </object> <packing> <property name="left_attach">1</property> @@ -1466,8 +1628,9 @@ $T will be replaced by auto-not-available timeout</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_default_chat_font_toggled"/> + <signal name="toggled" handler="on_default_chat_font_toggled" swapped="no"/> </object> <packing> <property name="left_attach">1</property> @@ -1479,6 +1642,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkLabel" id="label4"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label" translatable="yes">Chat message:</property> </object> @@ -1487,9 +1651,6 @@ $T will be replaced by auto-not-available timeout</property> <property name="y_options">GTK_FILL</property> </packing> </child> - <child> - <placeholder/> - </child> </object> </child> </object> @@ -1497,6 +1658,7 @@ $T will be replaced by auto-not-available timeout</property> <child type="label"> <object class="GtkLabel" id="label23"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>Font</b></property> <property name="use_markup">True</property> </object> @@ -1511,23 +1673,32 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkFrame" id="frame3"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment3"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="border_width">6</property> <property name="left_padding">12</property> <child> <object class="GtkTable" id="table2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="n_rows">3</property> <property name="n_columns">3</property> <property name="column_spacing">6</property> <property name="row_spacing">6</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> <child> <object class="GtkCheckButton" id="transports_iconsets_checkbutton"> <property name="label" translatable="yes">Use _transports icons</property> @@ -1536,20 +1707,23 @@ $T will be replaced by auto-not-available timeout</property> <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">If checked, Gajim will use protocol-specific status icons. (e.g. A contact from MSN will have the equivalent msn icon for status online, away, busy, etc...)</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_transports_iconsets_checkbutton_toggled"/> + <signal name="toggled" handler="on_transports_iconsets_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">3</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkComboBox" id="iconset_combobox"> <property name="visible">True</property> - <signal name="changed" handler="on_iconset_combobox_changed"/> + <property name="can_focus">False</property> + <signal name="changed" handler="on_iconset_combobox_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> @@ -1563,6 +1737,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkLabel" id="label174"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Status _iconset:</property> <property name="use_underline">True</property> @@ -1578,11 +1753,13 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkComboBox" id="theme_combobox"> <property name="visible">True</property> - <signal name="changed" handler="on_theme_combobox_changed"/> + <property name="can_focus">False</property> + <signal name="changed" handler="on_theme_combobox_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> + <property name="y_options"/> </packing> </child> <child> @@ -1593,18 +1770,18 @@ $T will be replaced by auto-not-available timeout</property> <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">Configure color and font of the interface</property> <property name="use_underline">True</property> - <signal name="clicked" handler="on_manage_theme_button_clicked"/> + <signal name="clicked" handler="on_manage_theme_button_clicked" swapped="no"/> </object> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkLabel" id="label249"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">T_heme:</property> <property name="use_underline">True</property> @@ -1615,12 +1792,6 @@ $T will be replaced by auto-not-available timeout</property> <property name="y_options">GTK_FILL</property> </packing> </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> </object> </child> </object> @@ -1628,6 +1799,7 @@ $T will be replaced by auto-not-available timeout</property> <child type="label"> <object class="GtkLabel" id="label3"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label" translatable="yes"><b>Themes</b></property> <property name="use_markup">True</property> @@ -1636,29 +1808,40 @@ $T will be replaced by auto-not-available timeout</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkFrame" id="frame24"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment53"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="left_padding">12</property> <child> <object class="GtkTable" id="table25"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="n_rows">5</property> <property name="n_columns">4</property> <property name="column_spacing">12</property> <property name="row_spacing">6</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> <child> <object class="GtkLabel" id="label72"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Contact's nickname:</property> <property name="use_underline">True</property> @@ -1672,6 +1855,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkLabel" id="label70"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Your nickname:</property> <property name="use_underline">True</property> @@ -1687,6 +1871,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkLabel" id="label71"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_Status message:</property> <property name="use_underline">True</property> @@ -1702,6 +1887,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkLabel" id="label371"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_URL highlight:</property> <property name="use_underline">True</property> @@ -1718,58 +1904,28 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkHBox" id="hbox3022"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkLabel" id="label383"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> <packing> + <property name="expand">True</property> <property name="fill">False</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkButton" id="reset_colors_button"> + <property name="label" translatable="yes">_Reset to Default Colors</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> + <property name="image">image1</property> + <property name="use_underline">True</property> <property name="focus_on_click">False</property> - <signal name="clicked" handler="on_reset_colors_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment52"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox2936"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image439"> - <property name="visible">True</property> - <property name="stock">gtk-revert-to-saved</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label217"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Reset to Default Colors</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> + <signal name="clicked" handler="on_reset_colors_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -1788,6 +1944,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkLabel" id="label13"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Contact's message:</property> </object> @@ -1801,6 +1958,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkLabel" id="label14"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Your message:</property> </object> @@ -1816,15 +1974,19 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkHBox" id="hbox8"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkCheckButton" id="incoming_msg_checkbutton"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> + <property name="xalign">0.5</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_incoming_msg_checkbutton_toggled"/> + <signal name="toggled" handler="on_incoming_msg_checkbutton_toggled" swapped="no"/> </object> <packing> + <property name="expand">False</property> + <property name="fill">False</property> <property name="position">0</property> </packing> </child> @@ -1835,10 +1997,11 @@ $T will be replaced by auto-not-available timeout</property> <property name="receives_default">True</property> <property name="xalign">0</property> <property name="color">#000000000000</property> - <signal name="color_set" handler="on_incoming_msg_colorbutton_color_set"/> + <signal name="color-set" handler="on_incoming_msg_colorbutton_color_set" swapped="no"/> </object> <packing> <property name="expand">False</property> + <property name="fill">False</property> <property name="pack_type">end</property> <property name="position">1</property> </packing> @@ -1849,22 +2012,26 @@ $T will be replaced by auto-not-available timeout</property> <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> - <property name="x_options"/> + <property name="x_options">GTK_FILL</property> <property name="y_options"/> </packing> </child> <child> <object class="GtkHBox" id="hbox9"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkCheckButton" id="outgoing_msg_checkbutton"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> + <property name="xalign">0.5</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_outgoing_msg_checkbutton_toggled"/> + <signal name="toggled" handler="on_outgoing_msg_checkbutton_toggled" swapped="no"/> </object> <packing> + <property name="expand">False</property> + <property name="fill">False</property> <property name="position">0</property> </packing> </child> @@ -1875,10 +2042,11 @@ $T will be replaced by auto-not-available timeout</property> <property name="receives_default">True</property> <property name="xalign">0</property> <property name="color">#000000000000</property> - <signal name="color_set" handler="on_outgoing_msg_colorbutton_color_set"/> + <signal name="color-set" handler="on_outgoing_msg_colorbutton_color_set" swapped="no"/> </object> <packing> <property name="expand">False</property> + <property name="fill">False</property> <property name="pack_type">end</property> <property name="position">1</property> </packing> @@ -1889,13 +2057,14 @@ $T will be replaced by auto-not-available timeout</property> <property name="right_attach">4</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> - <property name="x_options"/> + <property name="x_options">GTK_FILL</property> <property name="y_options"/> </packing> </child> <child> <object class="GtkHBox" id="hbox10"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <placeholder/> </child> @@ -1906,10 +2075,11 @@ $T will be replaced by auto-not-available timeout</property> <property name="receives_default">True</property> <property name="xalign">0</property> <property name="color">#000000000000</property> - <signal name="color_set" handler="on_incoming_nick_colorbutton_color_set"/> + <signal name="color-set" handler="on_incoming_nick_colorbutton_color_set" swapped="no"/> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="pack_type">end</property> <property name="position">1</property> </packing> @@ -1925,9 +2095,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkHBox" id="hbox11"> <property name="visible">True</property> - <child> - <placeholder/> - </child> + <property name="can_focus">False</property> <child> <object class="GtkColorButton" id="status_msg_colorbutton"> <property name="visible">True</property> @@ -1935,12 +2103,13 @@ $T will be replaced by auto-not-available timeout</property> <property name="receives_default">True</property> <property name="xalign">0</property> <property name="color">#000000000000</property> - <signal name="color_set" handler="on_status_msg_colorbutton_color_set"/> + <signal name="color-set" handler="on_status_msg_colorbutton_color_set" swapped="no"/> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="pack_type">end</property> - <property name="position">1</property> + <property name="position">0</property> </packing> </child> </object> @@ -1956,6 +2125,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkHBox" id="hbox12"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <placeholder/> </child> @@ -1966,10 +2136,11 @@ $T will be replaced by auto-not-available timeout</property> <property name="receives_default">True</property> <property name="xalign">0</property> <property name="color">#000000000000</property> - <signal name="color_set" handler="on_outgoing_nick_colorbutton_color_set"/> + <signal name="color-set" handler="on_outgoing_nick_colorbutton_color_set" swapped="no"/> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="pack_type">end</property> <property name="position">1</property> </packing> @@ -1985,6 +2156,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkHBox" id="hbox13"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <placeholder/> </child> @@ -1995,10 +2167,11 @@ $T will be replaced by auto-not-available timeout</property> <property name="receives_default">True</property> <property name="xalign">0</property> <property name="color">#000000000000</property> - <signal name="color_set" handler="on_url_msg_colorbutton_color_set"/> + <signal name="color-set" handler="on_url_msg_colorbutton_color_set" swapped="no"/> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="pack_type">end</property> <property name="position">1</property> </packing> @@ -2016,6 +2189,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkHBox" id="hbox2"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <placeholder/> </child> @@ -2026,10 +2200,11 @@ $T will be replaced by auto-not-available timeout</property> <property name="receives_default">True</property> <property name="xalign">0</property> <property name="color">#000000000000</property> - <signal name="color_set" handler="on_muc_highlight_colorbutton_color_set"/> + <signal name="color-set" handler="on_muc_highlight_colorbutton_color_set" swapped="no"/> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="pack_type">end</property> <property name="position">1</property> </packing> @@ -2047,6 +2222,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkLabel" id="label30"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Group chat highlight:</property> <property name="use_underline">True</property> @@ -2058,12 +2234,6 @@ $T will be replaced by auto-not-available timeout</property> <property name="y_options"/> </packing> </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> </object> </child> </object> @@ -2071,6 +2241,7 @@ $T will be replaced by auto-not-available timeout</property> <child type="label"> <object class="GtkLabel" id="label228"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>Chat Line Colors</b></property> <property name="use_markup">True</property> </object> @@ -2090,6 +2261,7 @@ $T will be replaced by auto-not-available timeout</property> <child type="tab"> <object class="GtkLabel" id="label218"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Style</property> </object> <packing> @@ -2100,21 +2272,28 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkVBox" id="vbox4"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">12</property> - <property name="orientation">vertical</property> <property name="spacing">12</property> <child> <object class="GtkFrame" id="audio_frame"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label_xalign">0</property> + <property name="label_yalign">1</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment6"> <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="yscale">0</property> <property name="left_padding">12</property> <child> <object class="GtkTable" id="table6"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="n_rows">2</property> <property name="n_columns">2</property> <property name="column_spacing">6</property> @@ -2122,28 +2301,33 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkComboBox" id="audio_input_combobox"> <property name="visible">True</property> - <signal name="changed" handler="on_audio_input_combobox_changed"/> + <property name="can_focus">False</property> + <signal name="changed" handler="on_audio_input_combobox_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkComboBox" id="audio_output_combobox"> <property name="visible">True</property> - <signal name="changed" handler="on_audio_output_combobox_changed"/> + <property name="can_focus">False</property> + <signal name="changed" handler="on_audio_output_combobox_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkLabel" id="label18"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Audio input device</property> </object> @@ -2154,6 +2338,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkLabel" id="label19"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Audio output device</property> </object> @@ -2170,6 +2355,7 @@ $T will be replaced by auto-not-available timeout</property> <child type="label"> <object class="GtkLabel" id="label16"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>Audio</b></property> <property name="use_markup">True</property> </object> @@ -2177,28 +2363,37 @@ $T will be replaced by auto-not-available timeout</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkFrame" id="frame6"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label_xalign">0</property> + <property name="label_yalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment7"> <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="yscale">0</property> <property name="left_padding">12</property> <child> <object class="GtkTable" id="table8"> <property name="visible">True</property> - <property name="n_rows">5</property> + <property name="can_focus">False</property> + <property name="n_rows">4</property> <property name="n_columns">2</property> <property name="column_spacing">6</property> <property name="row_spacing">6</property> <child> <object class="GtkLabel" id="label20"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Video input device</property> </object> @@ -2209,6 +2404,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkLabel" id="label21"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Video output device</property> </object> @@ -2221,28 +2417,33 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkComboBox" id="video_input_combobox"> <property name="visible">True</property> - <signal name="changed" handler="on_video_input_combobox_changed"/> + <property name="can_focus">False</property> + <signal name="changed" handler="on_video_input_combobox_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkComboBox" id="video_output_combobox"> <property name="visible">True</property> - <signal name="changed" handler="on_video_output_combobox_changed"/> + <property name="can_focus">False</property> + <signal name="changed" handler="on_video_output_combobox_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkLabel" id="label26"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Video framerate</property> </object> @@ -2255,6 +2456,7 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkLabel" id="label27"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Video size</property> </object> @@ -2267,40 +2469,29 @@ $T will be replaced by auto-not-available timeout</property> <child> <object class="GtkComboBox" id="video_framerate_combobox"> <property name="visible">True</property> - <signal name="changed" handler="on_video_framerate_combobox_changed"/> + <property name="can_focus">False</property> + <signal name="changed" handler="on_video_framerate_combobox_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="top_attach">2</property> <property name="bottom_attach">3</property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkComboBox" id="video_size_combobox"> <property name="visible">True</property> - <signal name="changed" handler="on_video_size_combobox_changed"/> + <property name="can_focus">False</property> + <signal name="changed" handler="on_video_size_combobox_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="top_attach">3</property> <property name="bottom_attach">4</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="video_see_self_checkbutton"> - <property name="label" translatable="yes">View own video source</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_video_see_self_checkbutton_toggled"/> - </object> - <packing> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> + <property name="y_options"/> </packing> </child> </object> @@ -2310,6 +2501,7 @@ $T will be replaced by auto-not-available timeout</property> <child type="label"> <object class="GtkLabel" id="label17"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>Video</b></property> <property name="use_markup">True</property> </object> @@ -2317,37 +2509,48 @@ $T will be replaced by auto-not-available timeout</property> </object> <packing> <property name="expand">False</property> + <property name="fill">False</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkFrame" id="frame7"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label_xalign">0</property> + <property name="label_yalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment9"> <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="yscale">0</property> <property name="left_padding">12</property> <child> <object class="GtkTable" id="table9"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="n_columns">4</property> <property name="column_spacing">6</property> <property name="row_spacing">6</property> <child> <object class="GtkLabel" id="label24"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">STUN server:</property> </object> <packing> <property name="x_options">GTK_FILL</property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkLabel" id="label25"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><i>(example: stunserver.org)</i></property> <property name="use_markup">True</property> </object> @@ -2363,12 +2566,13 @@ $T will be replaced by auto-not-available timeout</property> <property name="can_focus">True</property> <property name="tooltip_text" translatable="yes">STUN server hostname. If none given, Gajim will try to discover one from server.</property> - <property name="invisible_char">●</property> - <signal name="changed" handler="stun_server_entry_changed"/> + <property name="invisible_char">â—</property> + <signal name="changed" handler="stun_server_entry_changed" swapped="no"/> </object> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> + <property name="y_options"/> </packing> </child> <child> @@ -2376,13 +2580,15 @@ to discover one from server.</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> + <property name="xalign">0.5</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_stun_checkbutton_toggled"/> + <signal name="toggled" handler="on_stun_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> <property name="x_options">GTK_FILL</property> + <property name="y_options"/> </packing> </child> </object> @@ -2392,24 +2598,31 @@ to discover one from server.</property> <child type="label"> <object class="GtkLabel" id="label22"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>Connection</b></property> <property name="use_markup">True</property> </object> </child> </object> <packing> - <property name="expand">False</property> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> + <child> + <placeholder/> + </child> </object> <packing> <property name="position">5</property> + <property name="tab_fill">False</property> </packing> </child> <child type="tab"> <object class="GtkLabel" id="label15"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Audio / Video</property> </object> <packing> @@ -2420,29 +2633,32 @@ to discover one from server.</property> <child> <object class="GtkVBox" id="vbox45"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">12</property> - <property name="orientation">vertical</property> <property name="spacing">12</property> <child> <object class="GtkFrame" id="applications_frame"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment89"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="left_padding">12</property> <child> <object class="GtkVBox" id="vbox50"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkComboBox" id="applications_combobox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="model">liststore1</property> - <signal name="changed" handler="on_applications_combobox_changed"/> + <signal name="changed" handler="on_applications_combobox_changed" swapped="no"/> <child> <object class="GtkCellRendererText" id="cellrenderertext1"/> <attributes> @@ -2451,21 +2667,26 @@ to discover one from server.</property> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkFrame" id="custom_apps_frame"> + <property name="can_focus">False</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment43"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="left_padding">12</property> <child> <object class="GtkTable" id="table22"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="n_rows">3</property> <property name="n_columns">2</property> <property name="column_spacing">12</property> @@ -2474,7 +2695,7 @@ to discover one from server.</property> <object class="GtkEntry" id="custom_file_manager_entry"> <property name="visible">True</property> <property name="can_focus">True</property> - <signal name="changed" handler="on_custom_file_manager_entry_changed"/> + <signal name="changed" handler="on_custom_file_manager_entry_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> @@ -2487,6 +2708,7 @@ to discover one from server.</property> <child> <object class="GtkLabel" id="label355"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_File manager:</property> <property name="use_underline">True</property> @@ -2503,7 +2725,7 @@ to discover one from server.</property> <object class="GtkEntry" id="custom_browser_entry"> <property name="visible">True</property> <property name="can_focus">True</property> - <signal name="changed" handler="on_custom_browser_entry_changed"/> + <signal name="changed" handler="on_custom_browser_entry_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> @@ -2515,7 +2737,7 @@ to discover one from server.</property> <object class="GtkEntry" id="custom_mail_client_entry"> <property name="visible">True</property> <property name="can_focus">True</property> - <signal name="changed" handler="on_custom_mail_client_entry_changed"/> + <signal name="changed" handler="on_custom_mail_client_entry_changed" swapped="no"/> </object> <packing> <property name="left_attach">1</property> @@ -2528,6 +2750,7 @@ to discover one from server.</property> <child> <object class="GtkLabel" id="label200"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_Mail client:</property> <property name="use_underline">True</property> @@ -2543,6 +2766,7 @@ to discover one from server.</property> <child> <object class="GtkLabel" id="label199"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">_Browser:</property> <property name="use_underline">True</property> @@ -2560,12 +2784,15 @@ to discover one from server.</property> <child type="label"> <object class="GtkLabel" id="label198"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes" comments="a header for custom browser/client/file manager. so translate sth like: Custom Settings"><b>Custom</b></property> <property name="use_markup">True</property> </object> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -2576,6 +2803,7 @@ to discover one from server.</property> <child type="label"> <object class="GtkLabel" id="label5"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>Applications</b></property> <property name="use_markup">True</property> </object> @@ -2590,18 +2818,21 @@ to discover one from server.</property> <child> <object class="GtkFrame" id="frame4"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment4"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="border_width">6</property> <property name="left_padding">12</property> <child> <object class="GtkTable" id="table3"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="n_rows">6</property> <property name="column_spacing">6</property> @@ -2614,8 +2845,9 @@ to discover one from server.</property> <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">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</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_ignore_events_from_unknown_contacts_checkbutton_toggled"/> + <signal name="toggled" handler="on_ignore_events_from_unknown_contacts_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="x_options">GTK_FILL</property> @@ -2629,8 +2861,9 @@ to discover one from server.</property> <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">If checked, Gajim will allow others to detect the operation system you are using</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_send_os_info_checkbutton_toggled"/> + <signal name="toggled" handler="on_send_os_info_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="top_attach">1</property> @@ -2645,8 +2878,9 @@ to discover one from server.</property> <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">If checked, Gajim will allow others to detect the time on your system</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_send_time_info_checkbutton_toggled"/> + <signal name="toggled" handler="on_send_time_info_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="top_attach">2</property> @@ -2661,8 +2895,9 @@ to discover one from server.</property> <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">If checked, Gajim will keep logs for encrypted messages. Please note that when using E2E encryption the remote party has to agree on logging, else the messages will not be logged.</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_log_encrypted_chats_checkbutton_toggled"/> + <signal name="toggled" handler="on_log_encrypted_chats_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="top_attach">3</property> @@ -2676,8 +2911,9 @@ to discover one from server.</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_send_idle_time_checkbutton_toggled"/> + <signal name="toggled" handler="on_send_idle_time_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="top_attach">4</property> @@ -2687,22 +2923,26 @@ to discover one from server.</property> <child> <object class="GtkHBox" id="box1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="label29"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Global proxy:</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkComboBox" id="proxies_combobox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="model">liststore8</property> - <signal name="changed" handler="on_proxies_combobox_changed"/> + <signal name="changed" handler="on_proxies_combobox_changed" swapped="no"/> <child> <object class="GtkCellRendererText" id="cellrenderertext8"/> <attributes> @@ -2711,6 +2951,8 @@ to discover one from server.</property> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -2721,10 +2963,11 @@ to discover one from server.</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_underline">True</property> - <signal name="clicked" handler="on_manage_proxies_button_clicked"/> + <signal name="clicked" handler="on_manage_proxies_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> @@ -2741,6 +2984,7 @@ to discover one from server.</property> <child type="label"> <object class="GtkLabel" id="label6"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label" translatable="yes"><b>Privacy</b></property> <property name="use_markup">True</property> @@ -2749,23 +2993,26 @@ to discover one from server.</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkFrame" id="frame27"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment56"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="left_padding">12</property> <child> <object class="GtkVBox" id="vbox66"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkCheckButton" id="log_show_changes_checkbutton"> @@ -2774,8 +3021,9 @@ to discover one from server.</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_log_show_changes_checkbutton_toggled"/> + <signal name="toggled" handler="on_log_show_changes_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -2790,8 +3038,9 @@ to discover one from server.</property> <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_check_default_client_checkbutton_toggled"/> + <signal name="toggled" handler="on_check_default_client_checkbutton_toggled" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -2806,6 +3055,7 @@ to discover one from server.</property> <child type="label"> <object class="GtkLabel" id="label235"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>Miscellaneous</b></property> <property name="use_markup">True</property> </object> @@ -2820,57 +3070,26 @@ to discover one from server.</property> <child> <object class="GtkFrame" id="frame31"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label_xalign">0</property> <property name="shadow_type">none</property> <child> <object class="GtkAlignment" id="alignment64"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="yscale">0</property> <property name="left_padding">12</property> <property name="right_padding">335</property> <child> <object class="GtkButton" id="open_advanced_editor_button"> + <property name="label" translatable="yes">_Open...</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> - <signal name="clicked" handler="on_open_advanced_editor_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment70"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox2962"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image597"> - <property name="visible">True</property> - <property name="stock">gtk-open</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label296"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Open...</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> + <property name="image">image2</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="on_open_advanced_editor_button_clicked" swapped="no"/> </object> </child> </object> @@ -2878,6 +3097,7 @@ to discover one from server.</property> <child type="label"> <object class="GtkLabel" id="label247"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes"><b>Advanced Configuration Editor</b></property> <property name="use_markup">True</property> </object> @@ -2897,6 +3117,7 @@ to discover one from server.</property> <child type="tab"> <object class="GtkLabel" id="label169"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Advanced</property> </object> <packing> @@ -2906,12 +3127,15 @@ to discover one from server.</property> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkHButtonBox" id="hbuttonbox7"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">15</property> <property name="layout_style">end</property> <child> @@ -2922,7 +3146,7 @@ to discover one from server.</property> <property name="can_default">True</property> <property name="receives_default">False</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_close_button_clicked"/> + <signal name="clicked" handler="on_close_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -2933,6 +3157,7 @@ to discover one from server.</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> diff --git a/data/gui/profile_window.ui b/data/gui/profile_window.ui index 88ba214e4799d19271db273cb88a2b355f6ad106..005668f3c6b17e489857c813c38ff03f41c7703a 100644 --- a/data/gui/profile_window.ui +++ b/data/gui/profile_window.ui @@ -531,6 +531,7 @@ <object class="GtkEventBox" id="eventbox1"> <property name="visible">True</property> <property name="tooltip_text" translatable="yes">Format: YYYY-MM-DD</property> + <property name="visible_window">False</property> <child> <object class="GtkLabel" id="label13"> <property name="visible">True</property> @@ -1152,7 +1153,6 @@ <child> <object class="GtkStatusbar" id="statusbar"> <property name="visible">True</property> - <property name="has_resize_grip">False</property> </object> <packing> <property name="expand">False</property> diff --git a/data/gui/remove_account_window.ui b/data/gui/remove_account_window.ui index a84a3012e3728774f74be16136f29aaf4f43541d..e0130c5a352b57baca5b9aa912a35461066101ac 100644 --- a/data/gui/remove_account_window.ui +++ b/data/gui/remove_account_window.ui @@ -123,47 +123,14 @@ </child> <child> <object class="GtkButton" id="remove_button"> + <property name="label" translatable="yes">_Remove</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="receives_default">False</property> + <property name="image">image1</property> + <property name="use_underline">True</property> <signal name="clicked" handler="on_remove_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment62"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox2954"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image501"> - <property name="visible">True</property> - <property name="stock">gtk-delete</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label245"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Remove</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -181,4 +148,8 @@ </object> </child> </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="stock">gtk-delete</property> + </object> </interface> diff --git a/data/gui/roster_window.ui b/data/gui/roster_window.ui index a0fd915e24ae010426db9e810d22fc9dc2bd3f2c..f47bbb26cc1ddb2785e240d14d76178acfe31fc5 100644 --- a/data/gui/roster_window.ui +++ b/data/gui/roster_window.ui @@ -1,10 +1,95 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-requires gtk+ 3.0 --> + <object class="GtkAccelGroup" id="accelgroup1"/> + <object class="GtkImage" id="image10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-help</property> + <property name="icon-size">1</property> + </object> + <object class="GtkImage" id="image11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-dialog-question</property> + <property name="icon-size">1</property> + </object> + <object class="GtkImage" id="image12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-properties</property> + <property name="icon-size">1</property> + </object> + <object class="GtkImage" id="image9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-justify-fill</property> + <property name="icon-size">1</property> + </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-jump-to</property> + <property name="icon-size">1</property> + </object> + <object class="GtkImage" id="image13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-disconnect</property> + <property name="icon-size">1</property> + </object> + <object class="GtkImage" id="image14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-info</property> + <property name="icon-size">1</property> + </object> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-new</property> + <property name="icon-size">1</property> + </object> + <object class="GtkImage" id="image3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-connect</property> + <property name="icon-size">1</property> + </object> + <object class="GtkImage" id="image4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-add</property> + <property name="icon-size">1</property> + </object> + <object class="GtkImage" id="image5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-find</property> + <property name="icon-size">1</property> + </object> + <object class="GtkImage" id="image6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-network</property> + <property name="icon-size">1</property> + </object> + <object class="GtkImage" id="image7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-properties</property> + <property name="icon-size">1</property> + </object> + <object class="GtkImage" id="image8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-save</property> + <property name="icon-size">1</property> + </object> <object class="GtkWindow" id="roster_window"> <property name="width_request">85</property> <property name="height_request">200</property> + <property name="can_focus">False</property> <property name="title" translatable="yes">Gajim</property> <property name="role">roster</property> <property name="default_width">250</property> @@ -12,30 +97,34 @@ <accel-groups> <group name="accelgroup1"/> </accel-groups> - <signal name="key_press_event" handler="on_roster_window_key_press_event"/> - <signal name="delete_event" handler="on_roster_window_delete_event"/> - <signal name="focus_in_event" handler="on_roster_window_focus_in_event"/> - <signal name="focus_out_event" handler="on_roster_window_focus_out_event"/> - <signal name="popup_menu" handler="on_roster_window_popup_menu"/> + <signal name="key-press-event" handler="on_roster_window_key_press_event" swapped="no"/> + <signal name="delete-event" handler="on_roster_window_delete_event" swapped="no"/> + <signal name="focus-in-event" handler="on_roster_window_focus_in_event" swapped="no"/> + <signal name="focus-out-event" handler="on_roster_window_focus_out_event" swapped="no"/> + <signal name="popup-menu" handler="on_roster_window_popup_menu" swapped="no"/> <child> <object class="GtkVBox" id="roster_vbox"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <child> <object class="GtkMenuBar" id="menubar"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkMenuItem" id="actions_menu"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">_Actions</property> <property name="use_underline">True</property> - <signal name="activate" handler="on_actions_menuitem_activate"/> + <signal name="activate" handler="on_actions_menuitem_activate" swapped="no"/> <child type="submenu"> <object class="GtkMenu" id="actions_menu_menu"> + <property name="can_focus">False</property> <child> <object class="GtkImageMenuItem" id="new_chat_menuitem"> <property name="label" translatable="yes">_Start Chat...</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="image">image1</property> <property name="use_stock">False</property> @@ -45,6 +134,7 @@ <child> <object class="GtkImageMenuItem" id="send_single_message_menuitem"> <property name="label" translatable="yes">Send Single _Message...</property> + <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="image">image2</property> <property name="use_stock">False</property> @@ -53,8 +143,9 @@ </child> <child> <object class="GtkImageMenuItem" id="join_gc_menuitem"> - <property name="label" translatable="yes">Join _Group Chat...</property> + <property name="label" translatable="yes">Join _Group Chat</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="image">image3</property> <property name="use_stock">False</property> @@ -64,12 +155,14 @@ <child> <object class="GtkSeparatorMenuItem" id="separatormenuitem1"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> </child> <child> <object class="GtkImageMenuItem" id="add_new_contact_menuitem"> <property name="label" translatable="yes">Add _Contact...</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="image">image4</property> <property name="use_stock">False</property> @@ -80,6 +173,7 @@ <object class="GtkImageMenuItem" id="service_disco_menuitem"> <property name="label" translatable="yes">_Discover Services</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="image">image5</property> <property name="use_stock">False</property> @@ -89,6 +183,7 @@ <child> <object class="GtkMenuItem" id="advanced_menuitem"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">_Advanced</property> <property name="use_underline">True</property> </object> @@ -96,17 +191,19 @@ <child> <object class="GtkSeparatorMenuItem" id="separator1"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> </child> <child> <object class="GtkImageMenuItem" id="quit_menuitem"> <property name="label">gtk-quit</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="use_stock">True</property> <property name="accel_group">accelgroup1</property> <accelerator key="Q" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_quit_request"/> + <signal name="activate" handler="on_quit_request" swapped="no"/> </object> </child> </object> @@ -116,27 +213,31 @@ <child> <object class="GtkMenuItem" id="edit_menu"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">_Edit</property> <property name="use_underline">True</property> - <signal name="activate" handler="on_edit_menuitem_activate"/> + <signal name="activate" handler="on_edit_menuitem_activate" swapped="no"/> <child type="submenu"> <object class="GtkMenu" id="edit_menu_menu"> + <property name="can_focus">False</property> <child> <object class="GtkImageMenuItem" id="accounts_menuitem"> <property name="label" translatable="yes">_Accounts</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="image">image6</property> <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> <accelerator key="A" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_accounts_menuitem_activate"/> + <signal name="activate" handler="on_accounts_menuitem_activate" swapped="no"/> </object> </child> <child> <object class="GtkImageMenuItem" id="profile_avatar_menuitem"> <property name="label" translatable="yes">Profile, A_vatar</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="image">image7</property> <property name="use_stock">False</property> @@ -146,27 +247,30 @@ <child> <object class="GtkSeparatorMenuItem" id="separator2"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> </child> <child> <object class="GtkImageMenuItem" id="preferences_menuitem"> <property name="label">gtk-preferences</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="use_stock">True</property> <property name="accel_group">accelgroup1</property> <accelerator key="P" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_preferences_menuitem_activate"/> + <signal name="activate" handler="on_preferences_menuitem_activate" swapped="no"/> </object> </child> <child> <object class="GtkImageMenuItem" id="plugins_menuitem"> <property name="label" translatable="yes">P_lugins</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="image">image13</property> <property name="use_stock">False</property> - <signal name="activate" handler="on_plugins_menuitem_activate"/> + <signal name="activate" handler="on_plugins_menuitem_activate" swapped="no"/> </object> </child> </object> @@ -176,75 +280,84 @@ <child> <object class="GtkMenuItem" id="view_menu"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">_View</property> <property name="use_underline">True</property> - <signal name="activate" handler="on_view_menu_activate"/> + <signal name="activate" handler="on_view_menu_activate" swapped="no"/> <child type="submenu"> <object class="GtkMenu" id="view_menu_menu"> + <property name="can_focus">False</property> <child> <object class="GtkCheckMenuItem" id="show_offline_contacts_menuitem"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Show _Offline Contacts</property> <property name="use_underline">True</property> <accelerator key="O" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_show_offline_contacts_menuitem_activate"/> + <signal name="activate" handler="on_show_offline_contacts_menuitem_activate" swapped="no"/> </object> </child> <child> <object class="GtkCheckMenuItem" id="show_only_active_contacts_menuitem"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Show Only _Active Contacts</property> <property name="use_underline">True</property> <accelerator key="Y" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_show_only_active_contacts_menuitem_activate"/> + <signal name="activate" handler="on_show_only_active_contacts_menuitem_activate" swapped="no"/> </object> </child> <child> <object class="GtkCheckMenuItem" id="show_transports_menuitem"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Show T_ransports</property> <property name="use_underline">True</property> - <signal name="activate" handler="on_show_transports_menuitem_activate"/> + <signal name="activate" handler="on_show_transports_menuitem_activate" swapped="no"/> </object> </child> <child> <object class="GtkCheckMenuItem" id="show_roster_menuitem"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="label" translatable="yes">Show _Roster</property> <property name="use_underline">True</property> <property name="active">True</property> <accelerator key="R" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="toggled" handler="on_show_roster_menuitem_toggled"/> + <signal name="toggled" handler="on_show_roster_menuitem_toggled" swapped="no"/> </object> </child> <child> <object class="GtkSeparatorMenuItem" id="separator3"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> </child> <child> <object class="GtkImageMenuItem" id="file_transfers_menuitem"> <property name="label" translatable="yes">File _Transfers</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="image">image8</property> <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> <accelerator key="T" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_file_transfers_menuitem_activate"/> + <signal name="activate" handler="on_file_transfers_menuitem_activate" swapped="no"/> </object> </child> <child> <object class="GtkImageMenuItem" id="history_menuitem"> <property name="label" translatable="yes">_History</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="use_underline">True</property> <property name="image">image9</property> <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> - <signal name="activate" handler="on_history_menuitem_activate"/> + <signal name="activate" handler="on_history_menuitem_activate" swapped="no"/> </object> </child> </object> @@ -254,69 +367,77 @@ <child> <object class="GtkMenuItem" id="help_menu"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">_Help</property> <property name="use_underline">True</property> <child type="submenu"> <object class="GtkMenu" id="help_menu_menu"> + <property name="can_focus">False</property> <child> <object class="GtkImageMenuItem" id="contents_menuitem"> <property name="label" translatable="yes">_Contents</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Help online</property> <property name="use_underline">True</property> <property name="image">image10</property> <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> - <signal name="activate" handler="on_contents_menuitem_activate"/> + <signal name="activate" handler="on_contents_menuitem_activate" swapped="no"/> </object> </child> <child> <object class="GtkImageMenuItem" id="faq_menuitem"> <property name="label" translatable="yes">_FAQ</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Frequently Asked Questions (online)</property> <property name="use_underline">True</property> <property name="image">image11</property> <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> - <signal name="activate" handler="on_faq_menuitem_activate"/> + <signal name="activate" handler="on_faq_menuitem_activate" swapped="no"/> </object> </child> <child> <object class="GtkImageMenuItem" id="keyboard_shortcuts_menuitem"> <property name="label" translatable="yes">Keyboard Shortcuts</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="image">image14</property> <property name="use_stock">False</property> - <signal name="activate" handler="on_keyboard_shortcuts_menuitem_activate"/> + <signal name="activate" handler="on_keyboard_shortcuts_menuitem_activate" swapped="no"/> </object> </child> <child> <object class="GtkSeparatorMenuItem" id="menuitem1"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> </child> <child> <object class="GtkImageMenuItem" id="features_menuitem"> <property name="label" translatable="yes">Fea_tures</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="use_underline">True</property> <property name="image">image12</property> <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> - <signal name="activate" handler="on_features_menuitem_activate"/> + <signal name="activate" handler="on_features_menuitem_activate" swapped="no"/> </object> </child> <child> <object class="GtkImageMenuItem" id="about_menuitem"> <property name="label">gtk-about</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="use_stock">True</property> <property name="accel_group">accelgroup1</property> - <signal name="activate" handler="on_about_menuitem_activate"/> + <signal name="activate" handler="on_about_menuitem_activate" swapped="no"/> </object> </child> </object> @@ -335,24 +456,24 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <signal name="notify" handler="on_roster_hpaned_notify"/> + <signal name="notify" handler="on_roster_hpaned_notify" swapped="no"/> <child> <object class="GtkVBox" id="roster_vbox2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="orientation">vertical</property> <child> <object class="GtkEntry" id="rfilter_entry"> <property name="can_focus">True</property> <property name="no_show_all">True</property> <property name="editable">False</property> <property name="primary_icon_stock">gtk-clear</property> - <property name="primary_icon_activatable">True</property> - <signal name="changed" handler="on_rfilter_entry_changed"/> - <signal name="icon_press" handler="on_rfilter_entry_icon_press"/> + <signal name="changed" handler="on_rfilter_entry_changed" swapped="no"/> + <signal name="icon-press" handler="on_rfilter_entry_icon_press" swapped="no"/> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -361,36 +482,40 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="hscrollbar_policy">never</property> - <property name="vscrollbar_policy">automatic</property> <child> <object class="GtkTreeView" id="roster_treeview"> <property name="visible">True</property> <property name="can_focus">True</property> + <property name="has_tooltip">True</property> <property name="headers_visible">False</property> <property name="reorderable">True</property> - <signal name="row_expanded" handler="on_roster_treeview_row_expanded"/> - <signal name="key_press_event" handler="on_roster_treeview_key_press_event"/> - <signal name="scroll_event" handler="on_roster_treeview_scroll_event"/> - <signal name="leave_notify_event" handler="on_roster_treeview_leave_notify_event"/> - <signal name="button_press_event" handler="on_roster_treeview_button_press_event"/> - <signal name="row_activated" handler="on_roster_treeview_row_activated"/> - <signal name="row_collapsed" handler="on_roster_treeview_row_collapsed"/> - <signal name="motion_notify_event" handler="on_roster_treeview_motion_notify_event"/> - <signal name="button_release_event" handler="on_roster_treeview_button_release_event"/> + <signal name="row-expanded" handler="on_roster_treeview_row_expanded" swapped="no"/> + <signal name="key-press-event" handler="on_roster_treeview_key_press_event" swapped="no"/> + <signal name="scroll-event" handler="on_roster_treeview_scroll_event" swapped="no"/> + <signal name="leave-notify-event" handler="on_roster_treeview_leave_notify_event" swapped="no"/> + <signal name="button-press-event" handler="on_roster_treeview_button_press_event" swapped="no"/> + <signal name="row-activated" handler="on_roster_treeview_row_activated" swapped="no"/> + <signal name="row-collapsed" handler="on_roster_treeview_row_collapsed" swapped="no"/> + <signal name="motion-notify-event" handler="on_roster_treeview_motion_notify_event" swapped="no"/> + <signal name="button-release-event" handler="on_roster_treeview_button_release_event" swapped="no"/> </object> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkComboBox" id="status_combobox"> <property name="visible">True</property> - <signal name="changed" handler="on_status_combobox_changed"/> + <property name="can_focus">False</property> + <signal name="changed" handler="on_status_combobox_changed" swapped="no"/> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> @@ -405,81 +530,12 @@ </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> </child> </object> - <object class="GtkAccelGroup" id="accelgroup1"/> - <object class="GtkImage" id="image1"> - <property name="visible">True</property> - <property name="stock">gtk-jump-to</property> - <property name="icon-size">1</property> - </object> - <object class="GtkImage" id="image2"> - <property name="visible">True</property> - <property name="stock">gtk-new</property> - <property name="icon-size">1</property> - </object> - <object class="GtkImage" id="image3"> - <property name="visible">True</property> - <property name="stock">gtk-connect</property> - <property name="icon-size">1</property> - </object> - <object class="GtkImage" id="image4"> - <property name="visible">True</property> - <property name="stock">gtk-add</property> - <property name="icon-size">1</property> - </object> - <object class="GtkImage" id="image5"> - <property name="visible">True</property> - <property name="stock">gtk-find</property> - <property name="icon-size">1</property> - </object> - <object class="GtkImage" id="image6"> - <property name="visible">True</property> - <property name="stock">gtk-network</property> - <property name="icon-size">1</property> - </object> - <object class="GtkImage" id="image7"> - <property name="visible">True</property> - <property name="stock">gtk-properties</property> - <property name="icon-size">1</property> - </object> - <object class="GtkImage" id="image8"> - <property name="visible">True</property> - <property name="stock">gtk-save</property> - <property name="icon-size">1</property> - </object> - <object class="GtkImage" id="image9"> - <property name="visible">True</property> - <property name="stock">gtk-justify-fill</property> - <property name="icon-size">1</property> - </object> - <object class="GtkImage" id="image10"> - <property name="visible">True</property> - <property name="stock">gtk-help</property> - <property name="icon-size">1</property> - </object> - <object class="GtkImage" id="image11"> - <property name="visible">True</property> - <property name="stock">gtk-dialog-question</property> - <property name="icon-size">1</property> - </object> - <object class="GtkImage" id="image12"> - <property name="visible">True</property> - <property name="stock">gtk-properties</property> - <property name="icon-size">1</property> - </object> - <object class="GtkImage" id="image13"> - <property name="visible">True</property> - <property name="stock">gtk-disconnect</property> - <property name="icon-size">1</property> - </object> - <object class="GtkImage" id="image14"> - <property name="visible">True</property> - <property name="stock">gtk-info</property> - <property name="icon-size">1</property> - </object> </interface> diff --git a/data/gui/search_window.ui b/data/gui/search_window.ui index dc23bda21e4b46aabbfc8b08f1ff77883b9f9050..6af2ca9aae64bc734bfdc4389ce2337a964b23ae 100644 --- a/data/gui/search_window.ui +++ b/data/gui/search_window.ui @@ -52,50 +52,15 @@ <property name="layout_style">end</property> <child> <object class="GtkButton" id="add_contact_button"> + <property name="label" translatable="yes">_Add contact</property> <property name="sensitive">False</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="no_show_all">True</property> + <property name="image">image1</property> + <property name="use_underline">True</property> <signal name="clicked" handler="on_add_contact_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment2"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <child> - <object class="GtkHBox" id="hbox1"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image2"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-add</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="label" translatable="yes">_Add contact</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -105,50 +70,15 @@ </child> <child> <object class="GtkButton" id="information_button"> + <property name="label" translatable="yes">_Information</property> <property name="sensitive">False</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="no_show_all">True</property> + <property name="image">image3</property> + <property name="use_underline">True</property> <signal name="clicked" handler="on_information_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment3"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <child> - <object class="GtkHBox" id="hbox2"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image3"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="stock">gtk-info</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label2"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="label" translatable="yes">_Information</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -158,47 +88,14 @@ </child> <child> <object class="GtkButton" id="search_button"> + <property name="label" translatable="yes">_Search</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="receives_default">False</property> + <property name="image">image2</property> + <property name="use_underline">True</property> <signal name="clicked" handler="on_search_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox5"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image1"> - <property name="visible">True</property> - <property name="stock">gtk-find</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label58"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Search</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -231,4 +128,16 @@ </object> </child> </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="stock">gtk-add</property> + </object> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="stock">gtk-find</property> + </object> + <object class="GtkImage" id="image3"> + <property name="visible">True</property> + <property name="stock">gtk-dialog-info</property> + </object> </interface> diff --git a/data/gui/service_discovery_window.ui b/data/gui/service_discovery_window.ui index 46c83e4d048766eaec0a91190cd525446f6b833f..0aa547cc2c2dc12ce2e9156921bcd4ea806b3bda 100644 --- a/data/gui/service_discovery_window.ui +++ b/data/gui/service_discovery_window.ui @@ -1,7 +1,11 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-requires gtk+ 3.0 --> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-jump-to</property> + </object> <object class="GtkListStore" id="liststore1"> <columns> <!-- column-name item --> @@ -9,27 +13,31 @@ </columns> </object> <object class="GtkWindow" id="service_discovery_window"> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="role">Service Discovery</property> <property name="default_width">550</property> <property name="default_height">420</property> <property name="type_hint">dialog</property> - <signal name="destroy" handler="on_service_discovery_window_destroy"/> + <signal name="destroy" handler="on_service_discovery_window_destroy" swapped="no"/> <child> <object class="GtkVBox" id="vbox11"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkEventBox" id="banner_agent_eventbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkHBox" id="banner_agent_hbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="banner_agent_label"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0.05000000074505806</property> <property name="ypad">6</property> <property name="label"><span weight="heavy" size="large">Agent name</span> @@ -37,18 +45,22 @@ Agent JID - node</property> <property name="use_markup">True</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkImage" id="banner_agent_icon"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xpad">6</property> <property name="ypad">6</property> <property name="stock">gtk-missing-image</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -64,99 +76,56 @@ Agent JID - node</property> <child> <object class="GtkTable" id="address_table"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="n_rows">3</property> <property name="n_columns">3</property> <property name="column_spacing">6</property> <child> - <object class="GtkComboBoxEntry" id="address_comboboxentry"> - <property name="visible">True</property> - <property name="model">liststore1</property> - <property name="text_column">0</property> - <signal name="changed" handler="on_address_comboboxentry_changed"/> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options">GTK_FILL</property> - </packing> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> </child> <child> <object class="GtkButton" id="browse_button"> + <property name="label" translatable="yes">G_o</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="has_default">True</property> <property name="receives_default">False</property> - <signal name="clicked" handler="on_go_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment93"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox2995"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image1148"> - <property name="visible">True</property> - <property name="stock">gtk-jump-to</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label362"> - <property name="visible">True</property> - <property name="label" translatable="yes">G_o</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> + <property name="image">image1</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="on_go_button_clicked" swapped="no"/> </object> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> <child> <object class="GtkLabel" id="label224"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">_Address:</property> <property name="use_underline">True</property> - <property name="mnemonic_widget">address_comboboxentry</property> </object> <packing> <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options"/> </packing> </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -164,29 +133,31 @@ Agent JID - node</property> <object class="GtkScrolledWindow" id="services_scrollwin"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> <property name="shadow_type">etched-in</property> <child> <object class="GtkTreeView" id="services_treeview"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="headers_visible">False</property> - <signal name="row_activated" handler="on_services_treeview_row_activated"/> + <signal name="row-activated" handler="on_services_treeview_row_activated" swapped="no"/> </object> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> <child> <object class="GtkHBox" id="hbox2994"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">12</property> <child> <object class="GtkProgressBar" id="services_progressbar"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="no_show_all">True</property> <property name="pulse_step">0.10000000149</property> </object> @@ -199,14 +170,18 @@ Agent JID - node</property> <child> <object class="GtkLabel" id="label363"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkHBox" id="action_buttonbox"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkButton" id="close_button"> @@ -217,7 +192,7 @@ Agent JID - node</property> <property name="can_default">True</property> <property name="receives_default">False</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_close_button_clicked"/> + <signal name="clicked" handler="on_close_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -229,12 +204,14 @@ Agent JID - node</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="padding">2</property> <property name="position">3</property> </packing> diff --git a/data/gui/service_registration_window.ui b/data/gui/service_registration_window.ui index 3c6d275dc0784b2a2418312f488d3287bc3b761c..f2980291957ebd42af3f822a7d08e0e2964c1c1a 100644 --- a/data/gui/service_registration_window.ui +++ b/data/gui/service_registration_window.ui @@ -35,47 +35,14 @@ <property name="layout_style">end</property> <child> <object class="GtkButton" id="cancel_button"> + <property name="label" translatable="yes">_Cancel</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="receives_default">False</property> + <property name="image">image2</property> + <property name="use_underline">True</property> <signal name="clicked" handler="on_cancel_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment18"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox22"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image107"> - <property name="visible">True</property> - <property name="stock">gtk-cancel</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label34"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Cancel</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -85,48 +52,15 @@ </child> <child> <object class="GtkButton" id="ok_button"> + <property name="label" translatable="yes">_OK</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="has_default">True</property> <property name="receives_default">False</property> + <property name="image">image1</property> + <property name="use_underline">True</property> <signal name="clicked" handler="on_ok_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment17"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox21"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image106"> - <property name="visible">True</property> - <property name="stock">gtk-ok</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label33"> - <property name="visible">True</property> - <property name="label" translatable="yes">_OK</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> </object> <packing> <property name="expand">False</property> @@ -143,4 +77,12 @@ </object> </child> </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="stock">gtk-apply</property> + </object> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="stock">gtk-cancel</property> + </object> </interface> diff --git a/data/gui/systray_context_menu.ui b/data/gui/systray_context_menu.ui index f502dbcdbabd087c37172f01a434bdef50466c86..c2cc6ae12f45c737797162fc740c50bbea17ec73 100644 --- a/data/gui/systray_context_menu.ui +++ b/data/gui/systray_context_menu.ui @@ -15,7 +15,7 @@ </child> <child> <object class="GtkImageMenuItem" id="chat_with_menuitem"> - <property name="label" translatable="yes">_Start Chat</property> + <property name="label" translatable="yes">_Start Chat...</property> <property name="visible">True</property> <property name="use_underline">True</property> <property name="image">image2</property> @@ -25,7 +25,7 @@ </child> <child> <object class="GtkImageMenuItem" id="join_gc_menuitem"> - <property name="label" translatable="yes">_Group Chat</property> + <property name="label" translatable="yes">Join _Group Chat</property> <property name="visible">True</property> <property name="use_underline">True</property> <property name="image">image3</property> @@ -35,7 +35,7 @@ </child> <child> <object class="GtkImageMenuItem" id="single_message_menuitem"> - <property name="label" translatable="yes">Send Single _Message</property> + <property name="label" translatable="yes">Send Single _Message...</property> <property name="visible">True</property> <property name="use_underline">True</property> <property name="image">image4</property> diff --git a/data/gui/vcard_information_window.ui b/data/gui/vcard_information_window.ui index 71a2f1e281027ca39c47e20023c454052a5c2cfe..b36fe93f581f8cb769e4865b50247efcafe86c5e 100644 --- a/data/gui/vcard_information_window.ui +++ b/data/gui/vcard_information_window.ui @@ -201,6 +201,7 @@ <child> <object class="GtkEventBox" id="status_label_eventbox"> <property name="visible">True</property> + <property name="visible_window">False</property> <child> <object class="GtkLabel" id="status_label"> <property name="visible">True</property> @@ -942,6 +943,7 @@ <object class="GtkEventBox" id="eventbox1"> <property name="visible">True</property> <property name="tooltip_text" translatable="yes">Format: YYYY-MM-DD</property> + <property name="visible_window">False</property> <child> <object class="GtkLabel" id="label13"> <property name="visible">True</property> diff --git a/data/gui/xml_console_window.ui b/data/gui/xml_console_window.ui index 96dff7add46158861472806061a61f5ba0e5360b..350037124ae17ff4e65101e0896a82140e3939e7 100644 --- a/data/gui/xml_console_window.ui +++ b/data/gui/xml_console_window.ui @@ -1,20 +1,26 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-requires gtk+ 3.0 --> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-apply</property> + </object> <object class="GtkWindow" id="xml_console_window"> + <property name="can_focus">False</property> <property name="border_width">12</property> <property name="default_width">550</property> <property name="default_height">450</property> - <signal name="destroy" handler="on_xml_console_window_destroy"/> + <signal name="destroy" handler="on_xml_console_window_destroy" swapped="no"/> <child> <object class="GtkVBox" id="vbox"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkLabel" id="label342"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes"><b>Jabber Traffic</b></property> <property name="use_markup">True</property> @@ -29,8 +35,6 @@ <object class="GtkScrolledWindow" id="scrolledwindow43"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> <property name="shadow_type">in</property> <child> <object class="GtkTextView" id="stanzas_log_textview"> @@ -42,12 +46,15 @@ </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkHBox" id="hbox2988"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkCheckButton" id="enable_checkbutton"> <property name="label" translatable="yes" comments="XML Console enable checkbutton">_Enable</property> @@ -55,23 +62,16 @@ <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> + <property name="xalign">0</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_enable_checkbutton_toggled"/> + <signal name="toggled" handler="on_enable_checkbutton_toggled" swapped="no"/> </object> <packing> - <property name="expand">False</property> - <property name="fill">False</property> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> - <child> - <object class="GtkLabel" id="label351"> - <property name="visible">True</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> <child> <object class="GtkButton" id="clear_button"> <property name="label">gtk-clear</property> @@ -79,12 +79,12 @@ <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="position">2</property> + <property name="position">1</property> </packing> </child> </object> @@ -102,21 +102,25 @@ <child> <object class="GtkVBox" id="input_vbox1"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkHBox" id="hbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkCheckButton" id="in_stanza_checkbutton"> <property name="label" translatable="yes">Hide IN stanzas</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> + <property name="xalign">0.5</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_in_stanza_checkbutton_toggled"/> + <signal name="toggled" handler="on_in_stanza_checkbutton_toggled" swapped="no"/> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -126,10 +130,13 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> + <property name="xalign">0.5</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_out_stanza_checkbutton_toggled"/> + <signal name="toggled" handler="on_out_stanza_checkbutton_toggled" swapped="no"/> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -139,10 +146,13 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> + <property name="xalign">0.5</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_presence_stanza_checkbutton_toggled"/> + <signal name="toggled" handler="on_presence_stanza_checkbutton_toggled" swapped="no"/> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">2</property> </packing> </child> @@ -152,10 +162,13 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> + <property name="xalign">0.5</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_iq_stanza_checkbutton_toggled"/> + <signal name="toggled" handler="on_iq_stanza_checkbutton_toggled" swapped="no"/> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">3</property> </packing> </child> @@ -165,21 +178,27 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">False</property> + <property name="xalign">0.5</property> <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_message_stanza_checkbutton_toggled"/> + <signal name="toggled" handler="on_message_stanza_checkbutton_toggled" swapped="no"/> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">4</property> </packing> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkHBox" id="hbox2"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <placeholder/> </child> @@ -188,6 +207,8 @@ </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -196,6 +217,7 @@ <child type="label"> <object class="GtkLabel" id="label2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes"><b>Filter</b></property> <property name="use_markup">True</property> @@ -204,6 +226,7 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">3</property> </packing> </child> @@ -212,18 +235,17 @@ <property name="visible">True</property> <property name="can_focus">True</property> <property name="spacing">6</property> - <signal name="activate" handler="on_expander_activate"/> + <signal name="activate" handler="on_expander_activate" swapped="no"/> <child> <object class="GtkVBox" id="input_vbox"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <child> <object class="GtkScrolledWindow" id="scrolledwindow42"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hscrollbar_policy">never</property> - <property name="vscrollbar_policy">automatic</property> <property name="shadow_type">in</property> <child> <object class="GtkTextView" id="input_textview"> @@ -235,12 +257,15 @@ </child> </object> <packing> + <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkHButtonBox" id="hbuttonbox31"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">6</property> <property name="layout_style">end</property> <child> @@ -251,7 +276,7 @@ <property name="receives_default">False</property> <property name="tooltip_text" translatable="yes">Info/Query</property> <property name="use_underline">True</property> - <signal name="clicked" handler="on_iq_button_clicked"/> + <signal name="clicked" handler="on_iq_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -266,7 +291,7 @@ <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> - <signal name="clicked" handler="on_presence_button_clicked"/> + <signal name="clicked" handler="on_presence_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -281,7 +306,7 @@ <property name="can_focus">True</property> <property name="receives_default">False</property> <property name="use_underline">True</property> - <signal name="clicked" handler="on_message_button_clicked"/> + <signal name="clicked" handler="on_message_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -291,47 +316,14 @@ </child> <child> <object class="GtkButton" id="send_button"> + <property name="label" translatable="yes">_Send</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="can_default">True</property> <property name="receives_default">False</property> - <signal name="clicked" handler="on_send_button_clicked"/> - <child> - <object class="GtkAlignment" id="alignment80"> - <property name="visible">True</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <child> - <object class="GtkHBox" id="hbox2980"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkImage" id="image833"> - <property name="visible">True</property> - <property name="stock">gtk-apply</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label341"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Send</property> - <property name="use_underline">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> + <property name="image">image1</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="on_send_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -351,6 +343,7 @@ <child type="label"> <object class="GtkLabel" id="label343"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes"><b>XML Input</b></property> <property name="use_markup">True</property> @@ -359,6 +352,7 @@ </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">4</property> </packing> </child> diff --git a/data/other/cacerts.pem b/data/other/cacerts.pem index cdcbc425e1c959930ab9208847714ef621a0c32b..b84848519e13b73978c2fa2fbb15a962c0a560e0 100644 --- a/data/other/cacerts.pem +++ b/data/other/cacerts.pem @@ -1,439 +1,47 @@ -ABAecom_=sub.__Am._Bankers_Assn.=_Root_CA ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEF -BQAwgYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2Fz -aGluZ3RvbjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFC -QS5FQ09NIFJvb3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3Ry -dXN0LmNvbTAeFw05OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQsw -CQYDVQQGEwJVUzELMAkGA1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24x -FzAVBgNVBAoTDkFCQS5FQ09NLCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBS -b290IENBMSQwIgYJKoZIhvcNAQkBFhVhZG1pbkBkaWdzaWd0cnVzdC5jb20w -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx0xHgeVVDBwhMywVC -AOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM0KLMsFWWU4RmBQDaREmA2FQK -pSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFGPR7wuSw0X4x8TAgpnUBV -6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGULOR4SCQaJRk665Wc -OQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZsiSrK2jMTecJV -jO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU+/94Qby9 -cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8C -AQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k -qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvT -ZOirvRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHeg -TYjHInYZw8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm -/lowdiT/QHI8eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgx -fexgeqMiKL0ZJGA/O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJ -TzFxiNmIf1Q= ------END CERTIFICATE----- - -AddTrust_External_Root ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4 -dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5h -bCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzEL -MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1B -ZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1 -c3QgRXh0ZXJuYWwgQ0EgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALf3GjPm8gAELTngTlvtH7xsD821+iO2zt6bETOXpClMfZOfvUq8 -k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfwTz/oMp50 -ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504 -B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDez -eWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5 -aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0WicCAwEAAaOB -3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0PBAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6 -xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdv -cmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJ -KoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl -j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5R -xNKWt9x+Tu5w/Rw56wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjT -K3rMUUKhemPR5ruhxSvCNr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1 -n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHx -REzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49O -hgQ= ------END CERTIFICATE----- - -AddTrust_Low-Value_Services_Root ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw -HhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwze -xODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY654eyNAbFvAWlA3yCyykQruGI -gb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWroulpOj0O -M3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1Lc -sRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5 -mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG -9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0OBBYEFJWxtPCU -tr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ -MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAx -IENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0 -MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9 -tTEv2dB8Xfjea4MYeDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL -/bscVjby/rK25Xa71SJlpz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlV -g3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6 -tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -AddTrust_Public_Services_Root ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAe -Fw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNF -MRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+ -A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c -+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1id9NEHif2 -P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKX -C1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8R -s3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9 -BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQWBBSBPjfYkrAf -d59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zCB -jgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkG -A1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU -cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmu -G7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbj -PGsye/Kf8Lb93/AoGEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bY -GozH7ZxOmuASu7VqTITh4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6 -NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9HEufOX1362Kqx -My3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -AddTrust_Qualified_Certificates_Root ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU -UCBOZXR3b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9v -dDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYT -AlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3Qg -VFRQIE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBS -b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoek -n0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKk -IhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3KP0q6p6z -sLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1t -UvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R -+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvES -a0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0GA1UdDgQWBBQ5 -lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkw -ZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL -ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVh -bGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2Vh -lRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx9 -5dr6h+sNNVJn0J6XdgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKF -Yqa0p9m9N5xotS1WfbC3P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVA -wRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQw -dOUeqN48Jzd/g66ed8/wMLH/S5noxqE= ------END CERTIFICATE----- - -America_Online_Root_Certification_Authority_1 ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l -cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4X -DTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp -Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCa -xlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CGv2BlnEtUiMJIxUo5vxTjWVXl -GbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44zDyL9Hy7n -BzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145Lcx -VR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiE -mf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCu -JKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Zo/Z5 -9m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUA -A4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF -Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOM -IOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTI -dGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j -8uB9Gr784N/Xx6dssPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -America_Online_Root_Certification_Authority_2 ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l -cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4X -DTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp -Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssN -t79Hc9PwVU3dxgz6sWYFas14tNwC206B89enfHG8dWOgXeMHDEjsJcQDIPT/ -DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8f3SkWq7x -uhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE -18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxr -kJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMD -bi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8BPeraunzgWGcX -uVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn6KVu -Y8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9 -W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ -o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48 -ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124Hhn -AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNee -MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypL -M7PmG2tZTiLMubekJcmnxPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qf -tIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjR -Ywu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R -+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr -+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVM -nNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMADjMSW7yV5TKQqLPGbIOt -d+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh1NolNscI -WC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZ -ZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y -3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz -2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw -RY8mkaKO/qk= ------END CERTIFICATE----- - -AOL_Time_Warner_Root_Certification_Authority_1 ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC -VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB -bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAw -MFoXDTM3MTEyMDE1MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB -T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg -SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U0pPlLYnKhHw/EEMbjIt8hFj4JHxI -zyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItITuLCxFlpMGK2MKKMCxGZYTVt -fu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAfRC+iYkGzuxgh28pxPIzs -trkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqFzQ6axOAAsNUl6twr -5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqhBC4aMqiaILGc -LCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEAAaNjMGEw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jYPXy+ -XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ -BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNM -eUWn9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7 -CegCgTXTCt8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77Bf -WgDrvq2g+EQFZ7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oT -LW4jYYehY0KswsuXn2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCz -vhGbRWeDhhmH05i9CBoWH1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmw -X7A5KGgOc90lmt4S ------END CERTIFICATE----- - -AOL_Time_Warner_Root_Certification_Authority_2 ------BEGIN CERTIFICATE----- -MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC -VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB -bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAw -MFoXDTM3MDkyODIzNDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB -T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg -SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -ggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ7ouZzU9AhqS2TcnZsdw8TQ2FTBVs -RotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilbm2BPJoPRYxJWSXakFsKlnUWs -i4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOYxFSMFkpBd4aVdQxHAWZg -/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZYYCLqJV+FNwSbKTQ -2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbqJS5Gr42whTg0 -ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fxI2rSAG2X -+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETzkxml -J85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh -EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNo -Kk/SBtc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJ -Kg71ZDIMgtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1Ex -MVCgyhwn2RAurda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaA -FE9pbQN+nZ8HGEO8txBO1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAO/Ouyuguh4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0 -cnAxa8cZmIDJgt43d15Ui47y6mdPyXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRF -ASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q7C+qPBR7V8F+GBRn7iTGvboVsNIY -vbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKTRuidDV29rs4prWPVVRaAMCf/ -drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ClTluUI8JPu3B5wwn3la -5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyBM5kYJRF3p+v9WAks -mWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQmy8YJPamTQr5 -O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xOAU++CrYD -062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT9Y41 -xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H -hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOL -Z8/5fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= ------END CERTIFICATE----- - -Baltimore_CyberTrust_Root ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG -EwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0 -MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUx -MjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNV -BAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZ -QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKMEuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+h -Xe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gR -QKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/CG9VwcPCP -wBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1 -pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNT -Px8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkC -AwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1BE3wMBIGA1Ud -EwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUA -A4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkT -I7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/ -oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67 -G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -beTRUSTed_Root_CA-Baltimore_Implementation ------BEGIN CERTIFICATE----- -MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK -EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG -A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0 -aW9uMB4XDTAyMDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UE -ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx -BgNVBAMTKmJlVFJVU1RlZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRh -dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALx+xDmcjOPW -HIb/ymKt4H8wRXqOGrO4x/nRNv8i805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R -9U+jK7wYFuK13XneIviCfsuBH/0nLI/6l2Qijvj/YaOcGx6Sj8CoCd8JEey3 -fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92BFODEPM2dMPgwqZfT7syj0B9f -HBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+YmpkbIq2eszh+6l/ePazIjm -iSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7eHgZFLL8kFKJOGJg -B7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIaMA8GA1UdEwEB -/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4AAAEJKIOR -MTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3IgdXNl -IG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu -dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5k -YXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmlj -YXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0 -eSBBZ3JlZW1lbnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVT -VGVkIHdlYiBzaXRlLCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVj -dHNfc2VydmljZXMvaW5kZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3 -dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWww -HQYDVR0OBBYEFEU9w6nR3D8kVpgccxiIav+DR+22MB8GA1UdIwQYMBaAFEU9 -w6nR3D8kVpgccxiIav+DR+22MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0B -AQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCAWXf82n+0S9/DZEtqTg6t8n1Z -dwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu67RMdmgduyzFiEuhjA6p9 -beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AYgkHNZTfqjjJ+vWuZ -XTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb4cV97yHgjQ5d -UX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9CReJf8Py -05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== ------END CERTIFICATE----- - -beTRUSTed_Root_CA ------BEGIN CERTIFICATE----- -MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG -EwJXVzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQg -Um9vdCBDQXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYy -MDE0MjEwNFoXDTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNV -BAoTCWJlVFJVU1RlZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRow -GAYDVQQDExFiZVRSVVNUZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBANS0c3oTCjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4 -SP+00PpeQY1hRIfo7clY+vyTmt9P6j41ffgzeubx181vSUs9Ty1uDoM6GHh3 -o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwMjmVZxXH/YgmPqsWPzGCgc0rXOD8V -cr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX2P8ZDoMbjNx4RWc0PfSvHI3k -bWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2NR47rtMNE5qdMf1ZD6Li8 -tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5jrEq2I8QBoa2k5MUC -AwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNVHSAEggFQMIIB -TDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQagfFSZWxp -YW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVz -IGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0 -ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9u -IHByYWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJl -VFJVU1RlZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29t -L3ZhdWx0L3Rlcm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNU -ZWQuY29tL3ZhdWx0L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYD -VQQKEwliZVRSVVNUZWQxCzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub -2M3eKjEENGvKBxirZzAfBgNVHSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxir -ZzAOBgNVHQ8BAf8EBAMCAf4wDQYJKoZIhvcNAQEFBQADggEBAHlh26Nebhax -6nZR+csVm8tpvuaBa58oH2U+3RGFktToQb9+M70j5/Egv6S0phkBxoyNNXxl -pE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2jCBHOElQBp1yZzrwmAOtlmdE -/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe1lMBzW1MaFVA4e5rxyoA -AEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5mlWXKWWuGVUlBXJH -0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYctmBjRYoQtLpG -EK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4= ------END CERTIFICATE----- - -beTRUSTed_Root_CA_-_Entrust_Implementation ------BEGIN CERTIFICATE----- -MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK -EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG -A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0 -aW9uMB4XDTAyMDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UE -ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx -BgNVBAMTKmJlVFJVU1RlZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRh -dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1 -Q+xVkrYwfTVXDNvzDSduTPdQqJtOK2/b9a0cS12zqcH+e0TrW6MFDR/FNCsw -ACnxeECypP869AGIF37m1CbTukzqMvtDd5eHI8XbQ6P1KqNRXuE70mVpflUV -m3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdjDheT389Lrm5zdeDzqrmkwAkb -hepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCeyv78IZTuEyhL11xeDGbu -6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCktVjMFu5dZfsZJT4nX -LySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMBMIIBtwYDVR0g -BIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYIKwYBBQUH -AgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRpZmlj -YXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug -b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29u -ZGl0aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0 -YXRlbWVudCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGlj -aCBjYW4gYmUgZm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0 -cHM6Ly93d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRl -eC5odG1sMEIGCCsGAQUFBwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29t -L3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQD -AgAHMIGJBgNVHR8EgYEwfzB9oHugeaR3MHUxEjAQBgNVBAoTCWJlVFJVU1Rl -ZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYDVQQDEypiZVRS -VVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1wbGVtZW50YXRpb24xDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEwODI0MjdagQ8yMDIyMDQx -MTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFH1w5a44iwY/qhwa -j/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQwqoSEFjAMBgNV -HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkq -hkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ5V04 -ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB -evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220 -Y/ozADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2 -KjiS2d2kXgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFi -aDrmLzfzgYYhxKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep -9w== ------END CERTIFICATE----- - -beTRUSTed_Root_CA_-_RSA_Implementation ------BEGIN CERTIFICATE----- -MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUF -ADBiMRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBS -b290IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1w -bGVtZW50YXRpb24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBi -MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290 -IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVt -ZW50YXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQw -CY5X0LkGLG9uJIAiv11DpvpPrILnHGhwhRujbrWqeNluB0s/6d/16uhUoWGK -Di9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I1DpAa5LxmZZk3tv/ePTulh1HiXzU -vrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPktPDgaTuID0GQ+NRxQyTBjyZL -O1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnUGxlkVgoZ98zh/4avflhe -rHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8ercmsl9fNTGwxMLvF1 -S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIYMIICFDAMBgNV -HRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+AAADCSiD -kTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20v -cHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB -OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBj -cmVhdGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRo -ZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlv -bnMgb2YgdXNlLCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1l -bnQgYW5kIHRoZSBSZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2Fu -IGJlIGZvdW5kIGF0IHRoZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93 -d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1s -MAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAWgBSp7BR++dlDzFMrFK3P9/BZiUHN -GTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxStz/fwWYlBzRkwDQYJKoZIhvcNAQEF -BQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g6IHHtt9DwSwddUvUQo3neqh0 -3GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuKmET7m9cqg5c0Lcd9NUwt -NLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbdLrML3kqNWz2rDcI1 -UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28BbJ1zTcwfBwvNM -m2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3SK41ty8y -mmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= ------END CERTIFICATE----- - -CAcert_org_-_root_CA +cacert.org/cacert.org_class3.crt +-----BEGIN CERTIFICATE----- +MIIHWTCCBUGgAwIBAgIDCkGKMA0GCSqGSIb3DQEBCwUAMHkxEDAOBgNVBAoTB1Jv +b3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEiMCAGA1UEAxMZ +Q0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSc3VwcG9y +dEBjYWNlcnQub3JnMB4XDTExMDUyMzE3NDgwMloXDTIxMDUyMDE3NDgwMlowVDEU +MBIGA1UEChMLQ0FjZXJ0IEluYy4xHjAcBgNVBAsTFWh0dHA6Ly93d3cuQ0FjZXJ0 +Lm9yZzEcMBoGA1UEAxMTQ0FjZXJ0IENsYXNzIDMgUm9vdDCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAKtJNRFIfNImflOUz0Op3SjXQiqL84d4GVh8D57a +iX3h++tykA10oZZkq5+gJJlz2uJVdscXe/UErEa4w75/ZI0QbCTzYZzA8pD6Ueb1 +aQFjww9W4kpCz+JEjCUoqMV5CX1GuYrz6fM0KQhF5Byfy5QEHIGoFLOYZcRD7E6C +jQnRvapbjZLQ7N6QxX8KwuPr5jFaXnQ+lzNZ6MMDPWAzv/fRb0fEze5ig1JuLgia +pNkVGJGmhZJHsK5I6223IeyFGmhyNav/8BBdwPSUp2rVO5J+TJAFfpPBLIukjmJ0 +FXFuC3ED6q8VOJrU0gVyb4z5K+taciX5OUbjchs+BMNkJyIQKopPWKcDrb60LhPt +XapI19V91Cp7XPpGBFDkzA5CW4zt2/LP/JaT4NsRNlRiNDiPDGCbO5dWOK3z0luL +oFvqTpa4fNfVoIZwQNORKbeiPK31jLvPGpKK5DR7wNhsX+kKwsOnIJpa3yxdUly6 +R9Wb7yQocDggL9V/KcCyQQNokszgnMyXS0XvOhAKq3A6mJVwrTWx6oUrpByAITGp +rmB6gCZIALgBwJNjVSKRPFbnr9s6JfOPMVTqJouBWfmh0VMRxXudA/Z0EeBtsSw/ +LIaRmXGapneLNGDRFLQsrJ2vjBDTn8Rq+G8T/HNZ92ZCdB6K4/jc0m+YnMtHmJVA +BfvpAgMBAAGjggINMIICCTAdBgNVHQ4EFgQUdahxYEyIE/B42Yl3tW3Fid+8sXow +gaMGA1UdIwSBmzCBmIAUFrUyG9TH8+DmjvO90rA67rI5GNGhfaR7MHkxEDAOBgNV +BAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEiMCAG +A1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS +c3VwcG9ydEBjYWNlcnQub3JnggEAMA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUH +AQEEUTBPMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggr +BgEFBQcwAoYcaHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBB +MD8GCCsGAQQBgZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9y +Zy9pbmRleC5waHA/aWQ9MTAwNAYJYIZIAYb4QgEIBCcWJWh0dHA6Ly93d3cuQ0Fj +ZXJ0Lm9yZy9pbmRleC5waHA/aWQ9MTAwUAYJYIZIAYb4QgENBEMWQVRvIGdldCB5 +b3VyIG93biBjZXJ0aWZpY2F0ZSBmb3IgRlJFRSwgZ28gdG8gaHR0cDovL3d3dy5D +QWNlcnQub3JnMA0GCSqGSIb3DQEBCwUAA4ICAQApKIWuRKm5r6R5E/CooyuXYPNc +7uMvwfbiZqARrjY3OnYVBFPqQvX56sAV2KaC2eRhrnILKVyQQ+hBsuF32wITRHhH +Va9Y/MyY9kW50SD42CEH/m2qc9SzxgfpCYXMO/K2viwcJdVxjDm1Luq+GIG6sJO4 +D+Pm1yaMMVpyA4RS5qb1MyJFCsgLDYq4Nm+QCaGrvdfVTi5xotSu+qdUK+s1jVq3 +VIgv7nSf7UgWyg1I0JTTrKSi9iTfkuO960NAkW4cGI5WtIIS86mTn9S8nK2cde5a +lxuV53QtHA+wLJef+6kzOXrnAzqSjiL2jA3k2X4Ndhj3AfnvlpaiVXPAPHG0HRpW +Q7fDCo1y/OIQCQtBzoyUoPkD/XFzS4pXM+WOdH4VAQDmzEoc53+VGS3FpQyLu7Xt +hbNc09+4ufLKxw0BFKxwWMWMjTPUnWajGlCVI/xI4AZDEtnNp4Y5LzZyo4AQ5OHz +0ctbGsDkgJp8E3MGT9ujayQKurMcvEp4u+XjdTilSKeiHq921F73OIZWWonO1sOn +ebJSoMbxhbQljPI/lrMQ2Y1sVzufb4Y6GIIiNsiwkTjbKqGTqoQ/9SdlrnPVyNXT +d+pLncdBu8fA46A/5H2kjXPmEkvfoXNzczqA6NXLji/L6hOn1kGLrPo8idck9U60 +4GGSt/M3mMS+lqO3ig== +-----END CERTIFICATE----- +cacert.org/cacert.org_root.crt -----BEGIN CERTIFICATE----- MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB @@ -475,2044 +83,250 @@ GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD -----END CERTIFICATE----- - -CAcert_org_-_class3_CA ------BEGIN CERTIFICATE----- -MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS -BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v -cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9 -4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB -Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J -0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ -FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx -bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q -SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb -6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV -m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g -eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG -kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7 -6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG -CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc -aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB -gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w -aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6 -tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0 -nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M -77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV -Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L -ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM -zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU -rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF -YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT -oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu -FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB -0m6lG5kngOcLqagA ------END CERTIFICATE----- - - -Certum_Root_CA ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYT -AlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNl -cnR1bSBDQTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJ -BgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNV -BAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AM6xwS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYV -M42sLQnFdvkrOYCJ5JdLkKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/Ox -LjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE -7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/KUz/iDsaW -VhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu -/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYD -VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESS -bLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQaTOs9qmdvLdTN -/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvgGrZg -FCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqT -E5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x -O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYV -IZQs6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -Comodo_AAA_Services_root ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJH -QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm -b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFB -IENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIz -MTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu -Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENB -IExpbWl0ZWQxITAfBgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL5AnfRu4ep2hxxNRUSO -vkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhGC1Pqy0wk -wLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfH -dr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf04 -9vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULi -mAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cmez6KJcfA3Z3m -NWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEKIz6W -8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB -Af8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwu -Y29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG -9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm -7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHC -v8S5dIa2LX1rzNLzRt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdV -CYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAV -GI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C12yxow+ev+to -51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -Comodo_Secure_Services_root ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJH -QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm -b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2Vj -dXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4 -MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIg -TWFuY2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2Rv -IENBIExpbWl0ZWQxJDAiBgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2 -aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMBxM4KK0HDr -c4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP9nQ95IDC -+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8 -j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWC -iIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtG -Cd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz6YiO/O1R65Nx -Tq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4EFgQU -PNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv -Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNo -dHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNl -cy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm -4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiF -Gv45jN5bBAS0VPmjZ55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXG -De+X3EyrEeFryzHRbPtIgKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsF -Vy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfU -a7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6s -Cx1HRR3B7Hzs/Sk= ------END CERTIFICATE----- - -Comodo_Trusted_Services_root ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJH -QjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxm -b3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1 -c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0y -ODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVy -IE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9k -byBDQSBMaW1pdGVkMSUwIwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNl -cnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhT -WvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh73TkVvFVI -xO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9 -C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/ -oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW1O24zG71++IsWL1/ -T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7kUlcsutT6vif -R4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1UdDgQW -BBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v -ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2 -hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2Vy -dmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw -uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdT -mw7pSqBYaWcOrp32pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+C -l5EfKNsYEYwq5GWDVxISjBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/g -hhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVF -wL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOj -GM9O9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -Digital_Signature_Trust_Co._Global_CA_1 ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG -EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw -DwYDVQQLEwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQw -MjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy -ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEB -AQUAA4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlR -EmlvMVW5SXIACH7TpWJENySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+Lth -zfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2io74CTADKAqjuAQIxZA9SLRN0 -dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E -YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg -U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIx -MDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5fpFpRhgTCgJ3 -pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAMBgNV -HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 -DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN -QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomA -sH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6 -w4pl ------END CERTIFICATE----- - -Digital_Signature_Trust_Co._Global_CA_2 ------BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGp -MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM -YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv -LjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDEx -ODE4NTVaFw0wODExMjgxODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE -CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp -Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDEx -FjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0BCQEWEmNhQGRp -Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdfWvnTLnUv2Chi0ZMv/E3U -q4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uKxBmd9LIO/BZsubEF -koPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBEzUNKcI5YhZXh -TizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F5X5yP4Wd -lGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMvOnNn -7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+ -LegzZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvV -WlHG4VMElo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX -8ngvYzZAOONGDx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn8 -6Oawde3uPclwx12qgUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsT -F7ANUkz+/m9c4pFuHf2kYtdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A== ------END CERTIFICATE----- - -Digital_Signature_Trust_Co._Global_CA_3 ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG -EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw -DwYDVQQLEwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3 -MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy -ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEB -AQUAA4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fB -w18DW9Fvrn5C6mYjuGODVvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87e -ZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd -55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E -YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg -U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIw -OTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6CTShlgDzJQW6s -NS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAMBgNV -HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3 -DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR -xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLb -dHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlih -w6ID ------END CERTIFICATE----- - -Digital_Signature_Trust_Co._Global_CA_4 ------BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGp -MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM -YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv -LjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAy -MjQ2MTZaFw0wODExMjcyMjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE -CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp -Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDIx -FjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0BCQEWEmNhQGRp -Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbVp9oaBBg5kkp4o4HC9Xd6 -ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWwBZoPFflrWXJW8vo5 -/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl5WJp3OXuAFK9 -MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi3sOP17ih -YqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+QVCv -bK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWog -WxyQ2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6 -HE3K1GjNI3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV -6YyDfFk/xPEL553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8 -PzGn0EdzMzkbzE5q10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30 -sPDst2yC7S8xmUJMqbINuBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg== ------END CERTIFICATE----- - -Entrust.net_Global_Secure_Personal_CA ------BEGIN CERTIFICATE----- -MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NB -X0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT -HChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 -c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAy -MDcxNjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0 -Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29y -cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg -RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xp -ZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTU -rcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB -3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn5JVn1j+SgF7y -NH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNVHR8E -gdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAw -PgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy -ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0 -Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw -IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQD -AgEGMB8GA1UdIwQYMBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQW -BBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 -fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWA -O9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+L -a3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7l -TRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKdzmVml64mXg== ------END CERTIFICATE----- - -Entrust.net_Global_Secure_Server_CA ------BEGIN CERTIFICATE----- -MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xf -Q1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVz -dC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw0wMDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtF -bnRydXN0Lm5ldDE/MD0GA1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMg -aW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykg -MjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5l -dCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0G -CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUw -tZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxK -wz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2dWcTC5/oVzbI -XQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEBBAQD -AgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0Vu -dHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAy -MDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0 -IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV -BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIw -NDE3NTAwMFowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc -/vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNV -HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkq -hkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvv -yQbvH9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVp -bbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/ -bIkz8OwVDw== ------END CERTIFICATE----- - -Entrust.net_Premium_2048_Secure_Server_CA ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNf -MjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT -HChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1 -c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEy -MjQxNzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0 -Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29y -cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkg -RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4 -QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/EC -DNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuXMlBvPci6Zgzj -/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzWnLLP -KQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZd -enoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB -0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJ -FrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B -AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFh -fGPjK50xA3B20qMooPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVU -KcgF7bISKo30Axv/55IQh7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaoho -wXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2 -+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof888 -6ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- - -Entrust.net_Secure_Personal_CA ------BEGIN CERTIFICATE----- -MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UE -BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50 -cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBs -aW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExp -bWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBa -MIHJMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNV -BAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3Jw -LiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50 -cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GL -ADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSv -x1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux5zDeg7K6PvHV -iTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTmT173 -iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkw -ggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 -cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0Ff -SW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UE -CxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50 -cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYD -VQQDEwRDUkwxMCygKqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9D -bGllbnQxLmNybDArBgNVHRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkx -MDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW -/O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwG -A1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQ -OokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzzwy5E97BnRqqS5TvaHBkU -ODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYGJqibGapE -PHayXOw= ------END CERTIFICATE----- - -Entrust.net_Secure_Server_CA ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UE -BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50 -cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE -AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3 -dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh -Yi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkMTow -OAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0 -VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHIN -iC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3wkrYKZImZNHk -mGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcwggHT -MBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHY -pIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChs -aW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBM -aW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNo -dHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAi -gA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMC -AQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYE -FPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9 -B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKn -CqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2Zcgx -xufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd2cNgQ4xYDiKWL2KjLB+6 -rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -Equifax_Secure_CA ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG -EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1 -cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4 -MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgx -LTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0 -eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2R -FGiYCh7+2gRvE4RiIcPRfM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO -/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuv -K9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAGA1UdHwRp -MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEt -MCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjAL -BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gjIBBPM5iQn9Qw -HQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMBAf8w -GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB -AFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2u -FHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- - -Equifax_Secure_eBusiness_CA_1 ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1 -aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcN -MjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZh -eCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2lu -ZXNzIENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fe -k6lfWg0XTzQaDJj0ItlZ1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5 -/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4aIZX5UkxVWsUPOE9G+m34LjXW -HXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBkMBEGCWCG -SAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4 -MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBq -R3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnm -JXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+WB5Hh1Q+WKG1 -tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+KpYr -tWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -Equifax_Secure_eBusiness_CA_2 ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG -EwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlm -YXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5 -MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXgg -U2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0Et -MjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF -7Y6yEb3+6+e0dMKP/wXn2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKD -pkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HM -HMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAGA1UdHwRp -MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBT -ZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y -MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjAL -BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBqy/3YIHqngnYw -HQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMBAf8w -GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB -AAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy -0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkt -y3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN ------END CERTIFICATE----- - -Equifax_Secure_Global_eBusiness_CA ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJV -UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1 -aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0 -MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoT -E0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJl -IEdsb2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw -gYkCgYEAuucXkAJlsTRVPEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQy -td4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORR -OhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxnhcXIw2EC -AwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8w -HwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6o -oHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf -2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkAZ70Br83gcfxa -z2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIYNMR1 -pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -GeoTrust_Global_CA ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYT -AlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVz -dCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBC -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE -AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEH -CIjaWC9mOSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlC -GDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7 -csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAj -Nvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdRe -JivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQAB -o1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9 -qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1luMrMTjANBgkq -hkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Qzxpe -R+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWV -Yrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot -2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeX -xx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- - -GlobalSign_Root_CA ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzEL -MAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV -BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05 -ODA5MDExMjAwMDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkw -FwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRsw -GQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQDaDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR -4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc -71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4 -bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgK -OOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMW -ea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DP -AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQUYHtmGkUNl8qJ -UC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOC -AQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq75bCd -PTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q -gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT -2iHRrH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlD -NPYPhyk7ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBg -Hcl5JLL2bP2oZg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w== ------END CERTIFICATE----- - -GTE_CyberTrust_Global_Root ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgw -FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRy -dXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3Qg -R2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1 -MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYD -VQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMT -GkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4usJTQGz0O9pTAipTHBsiQl8i4 -ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcqlHHK6XALn -ZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8F -LztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh3 -46B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq -81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0PlZPvy5TYnh+d -XIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -GTE_CyberTrust_Root_CA ------BEGIN CERTIFICATE----- -MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgw -FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRy -dXN0IFJvb3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQsw -CQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQD -ExNHVEUgQ3liZXJUcnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQC45k+625h8cXyvRLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8K -DPufpz+iCWaEVh43KRuH6X4MypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPw -KfWVWgkWYXcKIiXUT0Wqx73llt/51KiOQswkwB6RJ0q1bQaAYznEol44AwID -AQABMA0GCSqGSIb3DQEBBAUAA4GBABKzdcZfHeFhVYAA1IFLezEPI2PnPfMD -+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWlIjeaY8JIILTbcuPI9tl8vrGv -U9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9ApybW1EDp3zdHSo1TRJ6V6e -6bR64eVaH4QwnNOfpSXY ------END CERTIFICATE----- - -IPS_Chained_CAs_root ------BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjEzMDEGA1UECxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MTMwMQYDVQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlw -cy5lczAeFw0wMTEyMjkwMDUzNThaFw0yNTEyMjcwMDUzNThaMIIBHDELMAkG -A1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vs -b25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNl -cyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYw -OTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFpbmVkIENBcyBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1h -aWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJspQg -vJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB -hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQT -y2nBBt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8w -HQYDVR0OBBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCC -AUGAFKGtMbH5PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQG -EwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmEx -LjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMu -bC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0 -NTIxMzAxBgNVBAsTKklQUyBDQSBDaGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTEzMDEGA1UEAxMqSVBTIENBIENoYWluZWQgQ0FzIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5p -cHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRk -MGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggr -BgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYK -KwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBz -QG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglg -hkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg -aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3 -Lmlwcy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5p -cHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYt -aHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/ -MDkGCWCGSAGG+EIBBwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl -bmV3YWxDQUMuaHRtbD8wNwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBz -LmVzL2lwczIwMDIvcG9saWN5Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYo -aHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCg -LoYsaHR0cDovL3d3d2JhY2suaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNBQy5j -cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p -cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1WWKJBGyi3leGmGpVfp3hA -K+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfNHnNDJGD1HWHc3Jag -vPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvNb2ar7QMiRDjM -Wb2f2/YHogF/JsRj9SVCXmK9 ------END CERTIFICATE----- - -IPS_CLASE1_root ------BEGIN CERTIFICATE----- -MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAx -MTIyOTAwNTkzOFoXDTI1MTIyNzAwNTkzOFowggESMQswCQYDVQQGEwJFUzES -MBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNV -BAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzAp -BgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAs -BgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx -LjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG -9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywSzHb5 -BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS -YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJ -ZHMQKD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzc -uh9morKbadB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKb -adB4CKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl -bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu -ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFp -bC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0Eg -Q0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMg -Q0EgQ0xBU0UxIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcN -AQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E -BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUH -AwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB -FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw -GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0Bt -YWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRpZmlj -YXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC -BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQt -FitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3Js -MD8GCWCGSAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl -dm9jYXRpb25DTEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93 -d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgB -hvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT -RTEuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9p -cHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFj -ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0UxLmNybDAvBggrBgEFBQcB -AQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI -hvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuKYn4VLenZMdMu9Ccj/1ur -xUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpjV4F1Wo7ojPsCwJTG -Kbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+hjM+5i9Ibq9U -kE6tsSU= ------END CERTIFICATE----- - -IPS_CLASE3_root ------BEGIN CERTIFICATE----- -MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjEuMCwGA1UECxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTEuMCwGA1UEAxMlSVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAx -MTIyOTAxMDE0NFoXDTI1MTIyNzAxMDE0NFowggESMQswCQYDVQQGEwJFUzES -MBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNV -BAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzAp -BgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxLjAs -BgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx -LjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG -9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZH49N -zjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY -8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBx -RiVrSXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLn -ev42USGjmFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGj -mFsMNKGCARqkggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl -bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJu -ZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFp -bC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0Eg -Q0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMg -Q0EgQ0xBU0UzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcN -AQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E -BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUH -AwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB -FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcw -GgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0Bt -YWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRpZmlj -YXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC -BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQt -FitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3Js -MD8GCWCGSAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jl -dm9jYXRpb25DTEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93 -d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgB -hvhCAQgELRYraHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFT -RTMuaHRtbDBzBgNVHR8EbDBqMDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9p -cHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMDWgM6Axhi9odHRwOi8vd3d3YmFj -ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0UzLmNybDAvBggrBgEFBQcB -AQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI -hvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dDqsfwfewPxqmurpYPdikc -4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9D6eSb9ijBmgpjnn1 -/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGyr33I6unUVtkO -E7LFRVA= ------END CERTIFICATE----- - -IPS_CLASEA1_root ------BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcN -MDExMjI5MDEwNTMyWhcNMjUxMjI3MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwG -A1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjEr -MCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEv -MC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8m2md -d81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd -ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1 -e+J8eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/ -2LUDnf473P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf47 -3P7yiuYV3TChggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlC -YXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIElu -dGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBz -QG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBT -IENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT -JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ -KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM -BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYI -KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB -BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEE -BAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB -D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBDQSBD -ZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG -SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgB -hvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xB -U0VBMS5jcmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lw -czIwMDIvcmV2b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAW -Lmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRt -bD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv -cG9saWN5Q0xBU0VBMS5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93 -d3cuaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNMQVNFQTEuY3JsMDagNKAyhjBo -dHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j -cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p -cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyAAIQVCtWYUQxkxZwCWINm -yq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeFaQoO42Hu6r4okzPV -7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aLH2betgPAK7N4 -1lUH5Y85UN4HI3LmvSAUS7SG ------END CERTIFICATE----- - -IPS_CLASEA3_root ------BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcN -MDExMjI5MDEwNzUwWhcNMjUxMjI3MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwG -A1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjEr -MCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEv -MC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvNG7uG -BiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU -VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4 -Ninn6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2 -YZM50yz82l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz8 -2l09BXW3mQKhggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlC -YXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIElu -dGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBz -QG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBT -IENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT -JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJ -KoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM -BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYI -KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYB -BAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEE -BAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB -D2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBDQSBD -ZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG -SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgB -hvhCAQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xB -U0VBMy5jcmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lw -czIwMDIvcmV2b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAW -Lmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRt -bD8wOwYJYIZIAYb4QgEIBC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIv -cG9saWN5Q0xBU0VBMy5odG1sMHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93 -d3cuaXBzLmVzL2lwczIwMDIvaXBzMjAwMkNMQVNFQTMuY3JsMDagNKAyhjBo -dHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j -cmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5p -cHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca2on0eisxeewBwMwB9dbB -/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI3y2s6Q73nMify5NF -8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYSAfWRMS1Jjbs/ -RU4s4OjNtckUFQzjB4ObJnXv ------END CERTIFICATE----- - -IPS_Servidores_root ------BEGIN CERTIFICATE----- -MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIw -EAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UE -ChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVz -MRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBz -QG1haWwuaXBzLmVzMB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1ow -gaMxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcT -CUJBUkNFTE9OQTEZMBcGA1UEChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UE -CxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQDEw5JUFMgU0VSVklET1JFUzEe -MBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyYXZhkJAk8IbPMGbWOlI6H0fg3 -PqHILVikgDVboXVsHUUMH2Fjal5vmwpMwci4YSM1gf/+rHhwLWjhOgeYlQJU -3c0jt4BT18g3RXIGJBK6E2Ehim51KODFDzT9NthFf+G4Nu+z4cYgjui0OLzh -PvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACzzw3lYJN7GO9HgQmm4 -7mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsUdx+2/iU9 -4aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14cJ58 -GNCr+Lh3B0Zx8coLY1xq+XKU1QFPoNtC ------END CERTIFICATE----- - -IPS_Timestamping_root ------BEGIN CERTIFICATE----- -MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYT -AkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEu -MCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5s -LjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1 -MjE0MDIGA1UECxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTE0MDIGA1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwu -aXBzLmVzMB4XDTAxMTIyOTAxMTAxOFoXDTI1MTIyNzAxMTAxOFowggEeMQsw -CQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJj -ZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZp -Y2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4gIEIt -NjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3RhbXBpbmcgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBUaW1lc3RhbXBp -bmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lw -c0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLju -VqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4 -Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6 -KaFYq6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAw -ggR8MB0GA1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSC -AUcwggFDgBSL0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkG -A1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vs -b25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNl -cyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYw -OTI5NDUyMTQwMgYDVQQLEytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MTQwMgYDVQQDEytJUFMgQ0EgVGltZXN0YW1waW5n -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNA -bWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsG -A1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUF -BwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGC -NwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw -EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5l -czBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl -IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwW -Gmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFo -dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcu -Y3JsMEUGCWCGSAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAy -L3Jldm9jYXRpb25UaW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUW -M2h0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGlu -Zy5odG1sPzBABglghkgBhvhCAQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBz -MjAwMi9wb2xpY3lUaW1lc3RhbXBpbmcuaHRtbDB/BgNVHR8EeDB2MDegNaAz -hjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBp -bmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9p -cHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYB -BQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEA -ZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk36MNbsMRnLWha -sl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I3pGW7hdb -rqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU= ------END CERTIFICATE----- - -QuoVadis_Root_CA ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQG -EwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9v -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNa -Fw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9W -YWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1 -lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMukJ0KX0J+D -isPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj18 -2d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Sp -x2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZ -yH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospUxbF6lR1xHkop -igPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4wPQYI -KwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFk -aXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlh -bmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBw -YXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRp -ZmljYXRpb24gcHJhY3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmlj -YXRlIFBvbGljeS4wIgYIKwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMu -Ym0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYw -gaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJN -MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCLMA4GA1UdDwEB/wQEAwIB -BjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lofFIk3Wdv -OXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10 -buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe -/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6 -isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQ -NiOKSnQ2+Q== ------END CERTIFICATE----- - -RSA_Root_Certificate_1 ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD -ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRp -b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv -bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy -NjAwMjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x -NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x -IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2f -NUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChM -MFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqYJJgpp0lZpd34 -t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs3x/b -e0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0Wu -PIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- - -RSA_Security_1024_v3 ------BEGIN CERTIFICATE----- -MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUF -ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg -U2VjdXJpdHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAx -NDlaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT -QSBTZWN1cml0eSAxMDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB -gQDV3f5mCc8kPD6ugU5OisRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dY -rIMKo1W1exeQFYRMiu4mmdxY78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYt -bzZUaMjShFbuklNhCbM/OZuoyZu9zp9+1BlqFikYvtc6adwlWzMaUQIDAQAB -o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSME -GDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAdBgNVHQ4EFgQUxMAcpAeU/c1N -AdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEAPy1q4yZDlX2Jl2X7deRy -HUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdNT1+nr6JGFLkM88y9 -am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgDmMrzVcydro7B -qkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= ------END CERTIFICATE----- - -RSA_Security_2048_v3 ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUF -ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg -U2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5 -MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT -QSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37 -RqtBaB4Y6lXIL5F4iSj7Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E -0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J -6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iHKrtjEAMq -s6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzD -uvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2Mw -YTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAW -gBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NRMKSq6UWuNST6 -/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmYv/3V -EhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5g -EydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ -f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJq -aHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEk -llgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- - -Security_Communication_Root_CA ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJK -UDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0 -eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMw -OTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1 -c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RD -QTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8 -V6UMbXaKL0u/ZPtM7orw8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpx -xpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uMDPpVmDvY6CKhS3E4eayXkmmz -iX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX5HA49LY6 -tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819 -uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/L -TX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZ -aNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g0dNq -/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94 -nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNn -PaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfci -oU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - -Sonera_Class_1_Root_CA ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJG -STEPMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENB -MB4XDTAxMDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMC -RkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue -+H887dF+2rDNbS82rDTG29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mX -y47vPxVnqIJyY1MPQYx9EJUkoVqlBvqSV536pQHydekfvFYmUk54GWVYVQNY -wBSujHxVX3BbdyMGNpfzJLWaRpXk3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JF -hfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBLqdReLjVQCfOAl/QMF6452F/NM8Ec -yonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIINnvmLVz5MxxftLItyM19yejhW -1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB -/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuXZfsSZ9gqXLar -5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0HDjxVyhbM -p6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VOTzF2 -nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv -kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2y -Ix4wzMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa ------END CERTIFICATE----- - -Sonera_Class_2_Root_CA ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJG -STEPMA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENB -MB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMC -RkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE -+hY3/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gX -GM2RX/uJ4+q/Tl18GybTdXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQ -TiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMGf+dJQMjFAbJUWmYdPfz56TwK -noG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8PtOFCx4j1 -P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURr -BGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB -/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zilzqsWuasvfDXL -rNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEIcbCd -jdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr4 -50kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkeja -nZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- - -Staat_der_Nederlanden_Root_CA ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG -EwJOTDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQD -Ex1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIz -NDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVT -dGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRl -cmxhbmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAmNK1URF6gaYUmHFtvsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rF -DBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02PjLwYdjeFnejKScfST5gTCaI+ -Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGcaC1Hoi6Ce -UJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7l -r7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4Zl -kuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGO -MAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDwwOgYIKwYBBQUH -AgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9vdC1w -b2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg -0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k -/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVF -IGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0 -C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y -nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBp -IzlWYGeQiy52OfsRiJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYV -wSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- - -StartCom_Ltd__Free_SSL_Certification_Authority ------BEGIN CERTIFICATE----- -MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx -DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0 -Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG -cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS -YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoXDTM1MDMxMDE3Mzc0 -OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVp -bGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3Jp -dHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG -9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x -18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5 -yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYI -LzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0G -A1UdDgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOW -zL3+MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT -BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4x -GjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3Rh -cnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV -HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8G -CWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAy -BglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5j -cmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJ -YIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/ -YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1 -ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p -00UOpO6wNnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLb -cCOxgN8aIDjnfg== ------END CERTIFICATE----- - -TC_TrustCenter__Germany__Class_2_CA ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT -AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD -VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 -b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENB -MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe -Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE -RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE -ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y -a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTEp -MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w -DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmk -qYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJO -gtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8/vhYnvgpjbB7 -zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w -DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+W -LDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xR -T3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac -ASZ4smZHcFFk ------END CERTIFICATE----- - -TC_TrustCenter__Germany__Class_3_CA ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT -AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD -VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3 -b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENB -MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe -Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE -RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE -ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y -a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTEp -MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w -DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQ -GwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYn -v68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDWw1Krj10nnGvA -o+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w -DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4 -iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yC -GdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS -CdS7kjXvD9s0 ------END CERTIFICATE----- - -TDC_Internet_Root_CA ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQG -EwJESzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50 -ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTda -MEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNV -BAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4Nr -XceO+YQwzho7+vvOi20jxsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaq -HF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5 -Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc5IogCSEW -Vmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8n -mHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwID -AQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBY -oFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIEludGVybmV0MR0w -GwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JMMTAr -BgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjAL -BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw -HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8w -HQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m -gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKs -LtB9KOy282A4aW8+2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7T -mHnaCB4Mb7j4Fifvwm899qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE -64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQ -V0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- - -TDC_OCES_Root_CA ------BEGIN CERTIFICATE----- -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQG -EwJESzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0w -MzAyMTEwODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQww -CgYDVQQKEwNUREMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSj -hFuHnEz9pPPEXyG9VhDr2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8 -z3sM8W9Hpg1DTeLpHTk0zY0s2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJH -hNlktxmW/OwZ5LKXJk5KTMuPJItUGBxIYXvViGjaXbXqzRowwYCDdlCqT9HU -3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKjdGqPqcNiKXEx5TukYBdedObaE+3p -Hx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+rTpPGWOmlgtt3xDqZsXKVSQTw -tyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkBAQEwgdEwLwYIKwYB -BQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBvc2l0b3J5MIGd -BggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRlciBmcmEg -ZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEuMS4x -LiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg -T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEG -A1UdHwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERD -MRQwEgYDVQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYm -aHR0cDovL2NybC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0Q -BCQwIoAPMjAwMzAyMTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0j -BBgwFoAUYLWF7FZkfhIZJ2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4S -GSdnHVAVS3OuO/kSMB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDAN -BgkqhkiG9w0BAQUFAAOCAQEACromJkbTc6gJ82sLMJn9iuFXehHTuJTXCRBu -o7E4A9G28kNBKWKnctj7fAXmMXAnVBhOinxO5dHKjHiIzxvTkIvmI/gLDjND -fZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2YcaaYb7Z8vTd/vuGTJW1v8Aqt -FxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoBmbgGglGBTvH1tJFUuSN6 -AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQYqbsFbS1AoLbrIyi -gfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9BKNDLdr8C2Lq -L19iUw== ------END CERTIFICATE----- - -Thawte_Personal_Basic_CA ------BEGIN CERTIFICATE----- -MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBl -cnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNp -Y0B0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVow -gcsxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNV -BAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAm -BgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNV -BAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZ -cGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTK -P1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdKwPQIcOk8RHtQ -fmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7G1sY0b8j -kyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOB -gQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 -c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95 -B21P9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== ------END CERTIFICATE----- - -Thawte_Personal_Freemail_CA ------BEGIN CERTIFICATE----- -MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBl -cnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1m -cmVlbWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIz -NTk1OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUx -EjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRp -bmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x -JDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqG -SIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkq -hkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0N -j3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5ErHzmj+hND3Ef -QDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgkCGqY -x7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP -MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgC -neSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr -5PjRzneigQ== ------END CERTIFICATE----- - -Thawte_Personal_Premium_CA ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBl -cnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXBy -ZW1pdW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5 -NTlaMIHPMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIw -EAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5n -MSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSMw -IQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3 -DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw7 -7f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWIEt12TfIa/G8j -Hnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYDZicRFTuq -W/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH -b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVx -eTBhKXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1 -KzGJ ------END CERTIFICATE----- - -Thawte_Premium_Server_CA ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy -dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3Rl -IFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl -cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1 -OVowgc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQ -BgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcg -Y2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x -ITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3 -DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhI -NTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPL -lyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/qgeN -9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B -AQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZ -a4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcU -Qg== ------END CERTIFICATE----- - -Thawte_Server_CA ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du -MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy -dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3Rl -IFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkG -A1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2Fw -ZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE -CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQ -VGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRz -QHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I -/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC -6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCXL+eQbcAoQpnX -TEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzARMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWD -TSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdni -TCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -Thawte_Time_Stamping_CA ------BEGIN CERTIFICATE----- -MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMC -WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmls -bGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmlj -YXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcw -MTAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTAT -BgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN -BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24x -HzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcN -AQEBBQADgY0AMIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+oJ9O0yeB8 -WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR -5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7 -X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN -AQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC9RAIDb/LogWK -0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQpgCed/r8 -zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZCayJ -SdM= ------END CERTIFICATE----- - -UTN_DATACorp_SGC_Root_CA ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUF -ADCBkzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVU -TiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2 -MzBaMIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNh -bHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsx -ITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTEbMBkGA1UEAxMS -VVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+O -GQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrr -U0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrL -Z9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykqlXvY8qdOD1R8 -oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv33i+ -Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4Gr -MIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT -MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8v -Y3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUE -IzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 -DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHc -rpY6CiM+iVnJowftGzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuM -FrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1 -+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdO -jtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jF -VkwPDPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - -UTN_USERFirst_Email_Root_CA ------BEGIN CERTIFICATE----- -MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUF -ADCBrjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVU -Ti1VU0VSRmlyc3QtQ2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAe -Fw05OTA3MDkxNzI4NTBaFw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJV -UzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD -VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93 -d3cudXNlcnRydXN0LmNvbTE2MDQGA1UEAxMtVVROLVVTRVJGaXJzdC1DbGll -bnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWlsMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3BYHW8OWX5ShpHornMSMxq -mNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9hVE1eaROaJB7HHqk -kqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6lL8/K2m2qL+us -obNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLmSGHGTPNp -saguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM1tZU -Ot4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws -6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0G -A1UdDgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJ -hkdodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGll -bnRBdXRoZW50aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEF -BQcDAgYIKwYBBQUHAwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rk -MPxTbyUkxsrt4jFcKw7u7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK -2lYcYJeA3IKirUq9iiv/Cwm0xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/ -bDCVNy8zEqx/3cfREYxRmLLQo5HQrfafnoOTHh1CuEava2bwm3/q4wMC5QJR -warVNZ1yQAOJujEdxRBoUp7fooXFXAimeOZTT7Hot9MUnpOmw2TjrH5xzbyf -6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gkUSeh1YdV8nuPmD0Wnu51tvjQ -jvLzxq4oW6fw8zYX/MMF08oDSlQ= ------END CERTIFICATE----- - -UTN_USERFirst_Hardware_Root_CA ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUF -ADCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVU -Ti1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5 -MTgxOTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQH -Ew5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3 -b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNV -BAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZ -FvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6N -q9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEH -OG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNdoI6yqqr2jmmI -BsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjfPe58 -BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhb -AgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWG -M2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3 -YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF -BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0o -XnWO6y1n7k57K9cM//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjA -bPLPSbtNk28GpgoiskliCE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59 -Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4f -Fm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchq -J/kniCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0q -UZ6B+dQ7XnASfxAynB67nfhmqA== ------END CERTIFICATE----- - -UTN-USER_First-Network_Applications ------BEGIN CERTIFICATE----- -MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUF -ADCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVU -Ti1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0 -ODM5WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgT -AlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT -RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVz -dC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNh -dGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZV -hawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAb -GHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZ -NaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hAReYFmnjDRy7rh4 -xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwiP8vv -/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7i -gEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD -AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf -8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0 -LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G -CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXh -i6r/fWRRzwr/vH3YIWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUq -f9FuVSTiuwL7MT++6LzsQCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAf -hZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvP -NximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+ -FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjis -H8SE ------END CERTIFICATE----- - -UTN_USERFirst_Object_Root_CA ------BEGIN CERTIFICATE----- -MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUF -ADCBlTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw -HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVU -Ti1VU0VSRmlyc3QtT2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4 -NDAzNlowgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMO -U2FsdCBMYWtlIENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29y -azEhMB8GA1UECxMYaHR0cDovL3d3dy51c2VydHJ1c3QuY29tMR0wGwYDVQQD -ExRVVE4tVVNFUkZpcnN0LU9iamVjdDCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicPHxzfOpuCaDDASmEd8S8O+r55 -96Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLOKqJdhwQJ9jCdGIqXsqoc -/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo5hy485RjiGpq/gt2 -yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+pKvEHDHd17bR -5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehbkkj7RwvC -bNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUCAwEA -AaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0 -cDovL2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNy -bDApBgNVHSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQw -DQYJKoZIhvcNAQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXF -wfNfLEzIR1pp6ujwNTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T -7/yxSPlrJSUtUbYsbUXBmMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85 -dRNacrACgZ++8A+EVCBibGnU4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U -+CRVX/A0FklmPlBGyWNxODFiuGK581OtbLUrohKqGU8J2l7nk8aOFAj+8DCA -GKCGhU3IfdeLA/5u1fedFqySLKAj5ZyRUh+U3xeUc8OzwcFxBSAAeL0TUh2o -Ps0AH8g= ------END CERTIFICATE----- - -ValiCert_Class_1_VA ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD -ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRp -b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv -bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy -NTIyMjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x -NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x -IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw -8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m -+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8YTfwggtFzVXSN -dnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwGlN+V -YH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8so -gTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- - -ValiCert_Class_2_VA ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD -ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu -Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRp -b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv -bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy -NjAwMTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x -NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g -QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x -IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3 -DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc -65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQ -b7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QSv4dk+NoS/zcn -wbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZSWI4 -OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZ -oDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- - -Verisign_Class_1_Public_Primary_Certification_Authority ------BEGIN CERTIFICATE----- -MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8x -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UE -CxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNV -BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3 -noaACpEO+jglr0aIguVzqKCbJF0NH8xlbgyw0FaEGIeaBpsQoXPftFg5a27B -9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR4k5FVmkfeAKA2txHkSm7NsljXMXg -1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATANBgkqhkiG9w0BAQIFAAOBgQBM -P7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZoEWx8QszznC7EBz8UsA9P -/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5FvjqBUuUfx3CHMjj -t/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89FxlA== ------END CERTIFICATE----- - -Verisign_Class_1_Public_Primary_Certification_Authority_-_G2 ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcEx -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE -CxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt -IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG -A1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j -LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq -0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9 -Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSmFc/IReumXY6c -PvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9Zr -bWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul -uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4i -P/68DzFc6PLZ ------END CERTIFICATE----- - -Verisign_Class_1_Public_Primary_Certification_Authority_-_G3 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHK -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV -BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 -IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD -BgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 -MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s -IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFBy -aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRR -ZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO8ESlV8dAWB6j -Rx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJrKsh -JlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7P -oBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 -6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHh -v2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQ -BfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N -y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUf -xJM8/XmPBNQ+T+r3ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFM -DSZl4kSAHsef493oCtrspSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5 -SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXV -OBRgmaNL3gaWcSzy27YfpO8/7g== ------END CERTIFICATE----- - -Verisign_Class_1_Public_Primary_OCSP_Responder ------BEGIN CERTIFICATE----- -MIIDnjCCAwegAwIBAgIQK2jUo0aexTsoCas4XX8nIDANBgkqhkiG9w0BAQUF -ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 -BgNVBAsTLkNsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov -L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAx -IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQC57V56Ondfzl86UvzNZPdxtW9qlsZZklWUXS9bLsER -6iaKy6eBPPZaRN56Ey/9WlHZezcmSsAnPwQDalbBgyzhb1upVFAkSsYuekyh -WzdUJCExH6F4GHansXDaItBq/gdiQMb39pt9DAa4S8co5GYjhFHvRreT2IEz -y+U2rMboBQIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT -CE9DU1AgMS0xMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwudmVyaXNp -Z24uY29tL3BjYTEuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIGCCsGAQUF -BwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j -b20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG -CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1Ud -EwQCMAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAHCQ3bjkvlMX -fH8C6dX3i5mTMWCNfuZgayTvYKzSzpHegG0JpNO4OOVEynJeDS3Bd5y9LAN4 -KY2kpXeH9fErJq3MB2w6VFoo4AnzTQoEytRYaQuns/XdAaXn3PAfusFdkI2z -6k/BEVmXarIrE7HarZehs7GgIFvKMquNzxPwHynD ------END CERTIFICATE----- - -Verisign_Class_2_Public_Primary_Certification_Authority ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL -Ey5DbGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf -MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZM -JaLtVRKXxaeAufqDwSCg+i8VDXyhYGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvE -erf4Zh+AVPy3wo5ZShRXRtGak75BkQO7FYCTXOvnzAhsPz6zSvz/S2wj1VCC -JkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBAIob -K/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxgJ8pFUs4W7z8GZOeUaHxg -MxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Ncr6Pc5iaAIzy4RHT3 -Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY ------END CERTIFICATE----- - -Verisign_Class_2_Public_Primary_Certification_Authority_-_G2 ------BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHB -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNV -BAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4g -LSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24g -VHJ1c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTla -MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6 -BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNp -Z24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA -p4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkf -rbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjwDqL7MWzJ5m+Z -Jwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEAATAN -BgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/ -7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX -rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6x -RnInjBJ7xUS0rg== ------END CERTIFICATE----- - -Verisign_Class_2_Public_Primary_Certification_Authority_-_G3 ------BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcox -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UE -CxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkg -VmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMG -A1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcx -NjIzNTk1OVowgcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwg -SW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UE -CxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1 -c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJp -bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY8 -1nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDOJxOeBUebMXoT -2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7C9UT -AJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQ -HgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN -qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVC -YQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekh -ktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf -0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydE -p85EXdQbkJgNHkKUsQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377B -MnMiIYtYgXsVkXq642RIsH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab -5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//jGHyJizNdrDPX -p/naOlXJWBD5qu9ats9LS98q ------END CERTIFICATE----- - -Verisign_Class_2_Public_Primary_OCSP_Responder ------BEGIN CERTIFICATE----- -MIIDnjCCAwegAwIBAgIQCUYX5h3Y1BygDKBi6HmKpzANBgkqhkiG9w0BAQUF -ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 -BgNVBAsTLkNsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDAwODAxMDAwMDAwWhcNMDQwNzMxMjM1OTU5WjCBpzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov -L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAy -IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDQymMxYX9ENHwFfQs9apDLeUt3Cj9LxyPlwGItfpx+ -PoiHkdCs6E1Jh6KWkIrdBKUCP4yb6Yn+YqDiWr3I3bR45qVCkwhnAcAgTddc -9F3as+M3plIaLExlTYqH2aij8UlUuzxcgFFoxvtJ/wtVqxXd+5rBuR10DbKM -RF2J/J/5gwIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT -CE9DU1AgMS0yMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwudmVyaXNp -Z24uY29tL3BjYTIuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIGCCsGAQUF -BwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j -b20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG -CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1Ud -EwQCMAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAB99CW4kRnUE -nPMmm+M5bhfvvL2iG9IChIar0ECXLMRDiDcZayKoA3FQnSDcNmAgmnMtc1Vs -WJsswrQ0LHozQsqR2elDr88e4PXEeqs/cmMeqTfhWzuIsxOGgpBXy1f/9Fa+ -It3jl6jhvCJDwt1N2/aBnpIUnjkPE1TegtjAXjSN ------END CERTIFICATE----- - -Verisign_Class_3_Public_Primary_Certification_Authority ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL -Ey5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf -MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69q -RUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94f56TuZoAqiN91qyFomNFx3In -zPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Olhec9vn2a -/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtM -EivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPw -TtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzk -uxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- - -Verisign_Class_3_Public_Primary_Certification_Authority_-_G2 ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcEx -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE -CxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt -IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG -A1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j -LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM -XtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXX -wc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg013gfqLptQ5GV -j0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01U -bSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo -1KpYoJ2daZH9 ------END CERTIFICATE----- - -Verisign_Class_3_Public_Primary_Certification_Authority_-_G3 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHK -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV -BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 -IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD -BgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 -MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s -IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFBy -aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2 -R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2tKmFZpGcmTNDo -vFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUccLwg -TS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+V -k7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJ -OxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my -/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoA -Wii/gt/4uhMdUIaC/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8S -GhJouPtmmRQURVyu565pF4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbb -o27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh -/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -Verisign_Class_3_Public_Primary_OCSP_Responder ------BEGIN CERTIFICATE----- -MIIDojCCAwugAwIBAgIQLpaev7ZibOx76XPM42zBhDANBgkqhkiG9w0BAQUF -ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1 -BgNVBAsTLkNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov -L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDx5AgOg7t140jluNum8Lmr6Txix141W9ACVBHYydFW -uXZLuat65s269gwE1n7WsAplrE454/H3LaMlOe+wi8++2wxdbnD0B81w9zrA -PjUW7XiMQ8/CJi5H1oZ9nPG+1mcMIiWkymXmH3p4KC8/BdsEIb/hRWb+PLeC -7Vq4FhW5VQIDAQABo4IBFDCCARAwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT -CE9DU1AgMS0zMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9jcmwudmVyaXNp -Z24uY29tL3BjYTMuMS4xLmNybDATBgNVHSUEDDAKBggrBgEFBQcDCTBCBggr -BgEFBQcBAQQ2MDQwMgYIKwYBBQUHMAGmJhYkaHR0cDovL29jc3AudmVyaXNp -Z24uY29tL29jc3Avc3RhdHVzMEQGA1UdIAQ9MDswOQYLYIZIAYb4RQEHAQEw -KjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL1JQQTAJ -BgNVHRMEAjAAMAsGA1UdDwQEAwIHgDANBgkqhkiG9w0BAQUFAAOBgQAC9lNj -wKke8tCLMzCPSJtMsFa0g3FKvtxQ2PW24AvbvXhP6c8JNNopSZ0Bc1qRkYJU -LBMK03cjzzf8Y96n4/a3tWlFKEnDkdyqRxypiJksBSqNjYr6YuJatwAgXTnE -KMLL/J6oia5bPY4S6jKy/OsU1wkVGsDNG9W1FU5B1ZbjTg== ------END CERTIFICATE----- - -Verisign_Class_4_Public_Primary_Certification_Authority_-_G2 ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcEx -CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE -CxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt -IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG -A1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j -LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6 -8OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTK -QWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtKqsGgtG7rL+VX -xbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGI -L4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y -cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckzt -ImRPT8qAkbYp ------END CERTIFICATE----- - -Verisign_Class_4_Public_Primary_Certification_Authority_-_G3 ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHK -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV -BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5 -IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD -BgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3 -MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s -IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFBy -aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYl -S+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ+mGuqPKljYXC -KtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM8BDc -VHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdL -MEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY -ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDD -Zq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1Wr -IhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csK -vE+MW8VLADsfKoKmfjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluP -QSjA1egtTaRezarZ7c7c2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kP -mF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr -9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- - -Verisign_RSA_Secure_Server_CA ------BEGIN CERTIFICATE----- -MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzEL -MAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMu -MS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MB4XDTk0MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UE -BhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD -VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGb -MA0GCSqGSIb3DQEBAQUAA4GJADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6O -LDfO6zV4ZFQD5YRAUcm/jwjiioII0haGN1XpsSECrXZogZoFokvJSyVmIlZs -iAeP94FZbYQHZXATcXY+m3dM41CJVphIuR2nKRoTLkoRWZweFdVJVCxzOmmC -sZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZIhvcNAQECBQADfgBl3X7hsuyw -4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3YQO2WxZpO8ZECAyIUwxr -l0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc1/p3yjkWWW8O6tO1 -g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== ------END CERTIFICATE----- - -Verisign_Secure_Server_OCSP_Responder ------BEGIN CERTIFICATE----- -MIIDnzCCAwygAwIBAgIRAP9F1SddJPuzwjkkU1fhT94wDQYJKoZIhvcNAQEF -BQAwXzELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5 -LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MB4XDTAwMDgwNDAwMDAwMFoXDTA0MDgwMzIzNTk1OVowgZ4x -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6 -Ly93d3cudmVyaXNpZ24uY29tL1JQQSAoYykwMDElMCMGA1UEAxMcU2VjdXJl -IFNlcnZlciBPQ1NQIFJlc3BvbmRlcjCBnzANBgkqhkiG9w0BAQEFAAOBjQAw -gYkCgYEAuFGZZIUO7rMKaPC/Y3YdU/X8oXiMM+6f9L452psPTUepjyDoS0S9 -zs17kNEw6JDEJXuJKN699pMd/7n/krWpjeSuzOLDB4Nqo3IQASdiIqY1Jjkt -ns9gDPxHpNfQQninHWzQy08VpykKtJVFxLHnWgnXOZXYHTWewr2zXcEMSx8C -AwEAAaOCAR0wggEZMCAGA1UdEQQZMBekFTATMREwDwYDVQQDEwhPQ1NQIDEt -NDA+BgNVHR8ENzA1MDOgMaAvhi1odHRwOi8vY3JsLnZlcmlzaWduLmNvbS9S -U0FTZWN1cmVTZXJ2ZXItcC5jcmwwEwYDVR0lBAwwCgYIKwYBBQUHAwkwQgYI -KwYBBQUHAQEENjA0MDIGCCsGAQUFBzABpiYWJGh0dHA6Ly9vY3NwLnZlcmlz -aWduLmNvbS9vY3NwL3N0YXR1czBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBwEB -MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9SUEEw -CQYDVR0TBAIwADALBgNVHQ8EBAMCB4AwDQYJKoZIhvcNAQEFBQADfgAAsxBT -ZpxJky4xoAJC0lhXfmah/huKYRhQQCweK0Gl1tv/rAgcWgVtAlwqtpZPR9u+ -TtvOzLqGuBjOsRKRX2P380g+zPFNE+RtCZR4AJLLoyCdBgtqoEMHztEZbI8Y -dZqfFzP9qSa44+LewqjEWop/mNYHBmvMVp6GcM7U7w== ------END CERTIFICATE----- - -Verisign_Time_Stamping_Authority_CA ------BEGIN CERTIFICATE----- -MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUF -ADCBwTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTww -OgYDVQQLEzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24g -QXV0aG9yaXR5IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1 -OTU5WjCBpTEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBh -dCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTAwMSwwKgYDVQQD -EyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1dGhvcml0eSBDQTCBnzANBgkq -hkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVlizrQJIkRpivglWtvtDbc2 -fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU/OB4naCTuQk9I1F/ -RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11S7zi6ESHzeZB -CiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/AgEAMEUG -A1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0dHBz -Oi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0 -cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIG -CCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJp -c2lnbi5jb20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2 -DcIBcBlK0lRWHqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQn -Keg3S/LvRJdrF1Eaw1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937n -tag+RaypJXUie28/sJyU58dzq6wf7iWbwBbtt8pb8BQ= ------END CERTIFICATE----- - -Visa_eCommerce_Root ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUF -ADBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlz -YSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMT -E1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0 -MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UE -CxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAa -BgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh -28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8bRaVK7362 -rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81 -q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtF -Wsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0 -lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaLdXe6YJ2E5/4t -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOC -AQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKht -cbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGI -xHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/ -hC3euiInlhBx6yLt398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -Visa_International_Global_Root_2 ------BEGIN CERTIFICATE----- -MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMC -VVMxDTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25h -bCBTZXJ2aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcN -MDAwODE2MjI1MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzEN -MAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNl -cnZpY2UgQXNzb2NpYXRpb24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZ -DK9vZBv42pWUJGkzEXDK41Z0ohdXZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJ -XLB1LRckaeNCYOTudNargFbYiCjh+20i/SN8RnNPflRzHqgsVVh1t0zzWkWl -Ahr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU58fy+pmjIlC++QU3o63tmsPm -7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/ghalMCXI5Etuz9c9OYmTa -xhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E1w0cslSsMoW0ZA3e -QbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ca3CBfYDdYDO -qU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqG -SIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHbmQdp -NSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ -kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoL -axhNdBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/Rt -Ldh6yumJivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8 -ofyrEK9ca3CnB+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G ------END CERTIFICATE----- - -ICA XSF ------BEGIN CERTIFICATE----- -MIIHADCCBmmgAwIBAgIBFDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCSUwx -DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0 -Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG -cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS -YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA2MTIwMjIzNTUyMVoXDTExMTIwMjIzNTUy -MVowgdgxCzAJBgNVBAYTAlVTMREwDwYDVQQIDAhDb2xvcmFkbzEjMCEGA1UECgwa -SmFiYmVyIFNvZnR3YXJlIEZvdW5kYXRpb24xIzAhBgNVBAsMGlNlY3VyZSBDZXJ0 -aWZpY2F0ZSBTaWduaW5nMUYwRAYDVQQDDD1TdGFydENvbSBDbGFzcyAxIEludGVy -bWVkaWF0ZSBDQSAtIEphYmJlciBTb2Z0d2FyZSBGb3VuZGF0aW9uMSQwIgYJKoZI -hvcNAQkBFhVjZXJ0bWFzdGVyQGphYmJlci5vcmcwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCeju/E54r6cwRmEzkGwBIq5anE2IHM10iYIeqOjTnN2WMM -XERxgmuSpwJays/BaMATh1/QFnMHjXiTICmeyXbJ2fKrxTHPCJ+DUeLbFvVX3bOO -SxAffkCLwZuUw9RyZ9zDLBNpR1FsdiSD9mV9DEH4T3sNU79Mjy+o83jFojTg39R7 -nH8B6z7VLmlC+ENxsMqjdwRv7HtY595VBLwK/gejblT8kCVFFA/WjmiOVoZ4aMGd -OOvsSgEZ9LaejB4xZdq+PP40DjxqhMQw89uzhWnCxxh0h+4PNfxhbPqJxZ9UMUWg -uPLYPAoj9U5p3YgmRvEaKdrijOkhODeNVkV/a57jAgMBAAGjggN6MIIDdjAMBgNV -HRMEBTADAQH/MAsGA1UdDwQEAwIBJjAdBgNVHQ4EFgQUe47EZ9BGIRcR/6F6QnWf -6sSrcuQwgd0GA1UdIwSB1TCB0oAUHInDlsy9/jLVDYyBMbaYnY0oZI2hgbakgbMw -gbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVpbGF0 -MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3JpdHkg -RGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx -ITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZ4IBADAgBgNVHREEGTAX -gRVjZXJ0bWFzdGVyQGphYmJlci5vcmcwHQYDVR0SBBYwFIESYWRtaW5Ac3RhcnRj -b20ub3JnMBEGCWCGSAGG+EIBAQQEAwIABzBUBglghkgBhvhCAQ0ERxZFU3RhcnRD -b20gQ2xhc3MgMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEphYmJlciBTb2Z0 -d2FyZSBGb3VuZGF0aW9uMGIGA1UdHwRbMFkwKaAnoCWGI2h0dHA6Ly9jZXJ0LnN0 -YXJ0Y29tLm9yZy9jYS1jcmwuY3JsMCygKqAohiZodHRwOi8vY3JsLnN0YXJ0Y29t -Lm9yZy9jcmwvY2EtY3JsLmNybDCCAUoGA1UdIASCAUEwggE9MIIBOQYLKwYBBAGB -tTcBAQEwggEoMC8GCCsGAQUFBwIBFiNodHRwOi8vY2VydC5zdGFydGNvbS5vcmcv -cG9saWN5LnBkZjA1BggrBgEFBQcCARYpaHR0cDovL2NlcnQuc3RhcnRjb20ub3Jn -L2ludGVybWVkaWF0ZS5wZGYwgb0GCCsGAQUFBwICMIGwMBQWDVN0YXJ0Q29tIEx0 -ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpM -ZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRj -b20ub3JnL3BvbGljeS5wZGYwDQYJKoZIhvcNAQEFBQADgYEAtOq85Q1lf8PjsJCg -uQ6TL3TJ1rSadfOwEyHJqIjR5LYpxdcJ5WxSEM3DxdrFnTaPBC6RQ7v836i9DdW3 -FS5/y1Et5gKksLNPQqaYEVFuvB4AGTp2HkdUGo8Oz9Dd4zTcvTSTeo/9mVxqdxKa -lhMZMHD/ivqg8faZSQNYMg6xq7I= ------END CERTIFICATE----- - -StartCom_root_Certificate ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW +mozilla/Security_Communication_EV_RootCA1.crt +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz +MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N +IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 +bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE +RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO +zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 +bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF +MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 +VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC +OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G +CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW +tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ +q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb +EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ +Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O +VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- +mozilla/DST_ACES_CA_X6.crt +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx +ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w +MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD +VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx +FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu +ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 +gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH +fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a +ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT +ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk +c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto +dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt +aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI +hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk +QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ +h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR +rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 +9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= +-----END CERTIFICATE----- +mozilla/Swisscom_Root_EV_CA_2.crt +-----BEGIN CERTIFICATE----- +MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw +ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp +dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290 +IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD +VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy +dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg +MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx +UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD +1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH +oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR +HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/ +5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv +idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL +OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC +NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f +46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB +UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth +7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G +A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED +MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB +bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x +XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T +PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0 +Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70 +WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL +Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm +7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S +nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN +vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB +WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI +fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb +I+2ksx0WckNLIOFZfsLorSa/ovc= +-----END CERTIFICATE----- +mozilla/D-TRUST_Root_Class_3_CA_2_EV_2009.crt +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- +mozilla/VeriSign_Class_3_Public_Primary_Certification_Authority_-_G4.crt +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- +mozilla/CA_Disig.crt +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET +MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE +AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw +CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg +YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE +Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX +mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD +XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW +S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp +FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD +AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu +ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z +ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv +Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw +DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6 +yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq +EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB +EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN +PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- +mozilla/VeriSign_Universal_Root_Certification_Authority.crt +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- +mozilla/GeoTrust_Global_CA_2.crt +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs +IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg +R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A +PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 +Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL +TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL +5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 +S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe +2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap +EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td +EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv +/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN +A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 +abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF +I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz +4iIprn2DQKi6bA== +-----END CERTIFICATE----- +mozilla/EC-ACC.crt +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB +8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy +dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 +YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 +dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh +IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD +LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG +EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g +KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD +ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu +bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg +ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R +85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm +4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV +HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd +QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t +lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB +o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 +opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo +dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW +ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN +AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y +/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k +SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy +Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS +Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl +nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= +-----END CERTIFICATE----- +mozilla/StartCom_Certification_Authority.crt +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 +dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA @@ -2527,32 +341,3023 @@ Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B 26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j -ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js -LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM -BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy -dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh -cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh -YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg -dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp -bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ -YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT -TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ -9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 -jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW -FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz -ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 -ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L -EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu -L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC -O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V -um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh -NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= ------END CERTIFICATE----- -Deutsche Telekom Root CA 2 +AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul +F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC +ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w +ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk +aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 +YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg +c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 +d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG +CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF +wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS +Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst +0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc +pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl +CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF +P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK +1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm +KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ +8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm +fyWl8kgAwKQB2j8= +-----END CERTIFICATE----- +mozilla/WellsSecure_Public_Root_Certificate_Authority.crt +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx +IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs +cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 +MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl +bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD +DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r +WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU +Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs +HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj +z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf +SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl +AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG +KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P +AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j +BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC +VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX +ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB +ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd +/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB +A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn +k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 +iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv +2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- +mozilla/Entrust_Root_Certification_Authority.crt +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- +mozilla/Staat_der_Nederlanden_Root_CA_-_G2.crt +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- +mozilla/thawte_Primary_Root_CA_-_G2.crt +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- +mozilla/ACEDICOM_Root.crt +-----BEGIN CERTIFICATE----- +MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE +AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x +CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW +MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF +RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC +AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 +09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 +XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P +Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK +t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb +X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 +MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU +fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI +2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH +K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae +ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP +BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ +MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw +RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv +bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm +fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 +gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe +I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i +5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi +ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn +MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ +o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 +zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN +GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt +r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK +Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== +-----END CERTIFICATE----- +mozilla/ePKI_Root_Certification_Authority.crt +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- +mozilla/GeoTrust_Primary_Certification_Authority_-_G2.crt +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- +mozilla/Taiwan_GRCA.crt +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- +mozilla/AffirmTrust_Networking.crt +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- +mozilla/Sonera_Class_2_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- +mozilla/Juur-SK.crt +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN +AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp +dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw +MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw +CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ +MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB +SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz +ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH +LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP +PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL +2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w +ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC +MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk +AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0 +AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz +AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz +AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f +BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY +P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi +CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g +kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95 +HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS +na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q +qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z +TbvGRNs2yyqcjg== +-----END CERTIFICATE----- +mozilla/Baltimore_CyberTrust_Root.crt +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- +mozilla/Trustis_FPS_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- +mozilla/UTN_USERFirst_Email_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB +rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt +Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa +Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV +BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l +dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE +AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B +YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 +hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l +L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm +SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM +1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws +6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw +Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 +aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u +7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 +xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ +rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim +eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk +USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= +-----END CERTIFICATE----- +mozilla/Swisscom_Root_CA_1.crt +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 +m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih +FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ +TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F +EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco +kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu +HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF +vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo +19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC +L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW +bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX +JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j +BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc +K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf +ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik +Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB +sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e +3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR +ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip +mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH +b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf +rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms +hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y +zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 +MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- +mozilla/QuoVadis_Root_CA_3.crt +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- +mozilla/GeoTrust_Primary_Certification_Authority.crt +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- +mozilla/Cybertrust_Global_Root.crt +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- +mozilla/SwissSign_Silver_CA_-_G2.crt +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- +mozilla/Hellenic_Academic_and_Research_Institutions_RootCA_2011.crt +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- +mozilla/GlobalSign_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- +mozilla/EE_Certification_Centre_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- +mozilla/America_Online_Root_Certification_Authority_1.crt +-----BEGIN CERTIFICATE----- +MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk +hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym +1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW +OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb +2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko +O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU +AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF +Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb +LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir +oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C +MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds +sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 +-----END CERTIFICATE----- +mozilla/Starfield_Services_Root_Certificate_Authority_-_G2.crt +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- +mozilla/DigiCert_Assured_ID_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- +mozilla/GeoTrust_Universal_CA_2.crt +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- +mozilla/GeoTrust_Global_CA.crt +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- +mozilla/QuoVadis_Root_CA_2.crt +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- +mozilla/AffirmTrust_Commercial.crt +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- +mozilla/certSIGN_ROOT_CA.crt +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- +mozilla/GlobalSign_Root_CA_-_R3.crt +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- +mozilla/QuoVadis_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- +mozilla/XRamp_Global_CA_Root.crt +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- +mozilla/StartCom_Certification_Authority_G2.crt +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW +MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 +OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG +A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ +JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD +vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo +D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ +Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW +RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK +HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN +nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM +0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i +UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 +Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg +TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL +BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX +UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl +6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK +9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ +HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI +wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY +XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l +IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo +hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr +so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- +mozilla/Go_Daddy_Class_2_CA.crt +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- +mozilla/GeoTrust_Primary_Certification_Authority_-_G3.crt +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- +mozilla/AddTrust_Public_Services_Root.crt +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx +MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB +ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV +BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV +6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX +GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP +dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH +1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF +62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW +BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL +MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU +cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv +b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 +IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ +iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh +4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm +XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- +mozilla/A-Trust-nQual-03.crt +-----BEGIN CERTIFICATE----- +MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB +VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp +bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R +dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw +MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy +dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52 +ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM +EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj +lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ +znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH +2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1 +k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs +2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD +VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG +KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+ +8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R +FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS +mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE +DNuxUCAKGkq6ahq97BvIxYSazQ== +-----END CERTIFICATE----- +mozilla/TDC_OCES_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE +SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw +ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU +REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr +2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s +2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU +GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj +dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r +TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB +AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv +c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl +ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu +MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg +T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud +HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD +VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny +bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy +MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ +J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG +SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom +JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO +inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y +caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB +mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ +YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9 +BKNDLdr8C2LqL19iUw== +-----END CERTIFICATE----- +mozilla/Verisign_Class_2_Public_Primary_Certification_Authority_-_G3.crt +-----BEGIN CERTIFICATE----- +MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy +aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp +Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV +BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp +Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g +Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU +J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO +JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY +wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o +koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN +qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E +Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe +xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u +7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU +sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI +sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP +cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q +-----END CERTIFICATE----- +mozilla/SecureSign_RootCA11.crt +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- +mozilla/ComSign_Secured_CA.crt +-----BEGIN CERTIFICATE----- +MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw +PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu +MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx +GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL +MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf +HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh +gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW +v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue +Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr +9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt +6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7 +MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl +Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58 +ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq +hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p +iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC +dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL +kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL +hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz +OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== +-----END CERTIFICATE----- +mozilla/DigiCert_Global_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- +mozilla/Buypass_Class_3_CA_1.crt +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg +isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z +NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI ++MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R +hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ +mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP +Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s +EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 +mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC +e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow +dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 +-----END CERTIFICATE----- +mozilla/Comodo_Secure_Services_root.crt +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp +ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow +fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV +BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM +cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S +HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 +CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk +3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz +6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV +HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv +Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw +Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww +DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 +5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI +gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ +aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl +izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= +-----END CERTIFICATE----- +mozilla/Microsec_e-Szigno_Root_CA_2009.crt +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- +mozilla/Go_Daddy_Root_Certificate_Authority_-_G2.crt +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- +mozilla/Certum_Trusted_Network_CA.crt +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- +mozilla/TC_TrustCenter_Class_2_CA_II.crt +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf +tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg +uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J +XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK +8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 +5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 +kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS +GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt +ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 +au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV +hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI +dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== +-----END CERTIFICATE----- +mozilla/Chambers_of_Commerce_Root_-_2008.crt +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- +mozilla/S-TRUST_Authentication_and_Encryption_Root_CA_2005_PN.crt +-----BEGIN CERTIFICATE----- +MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCB +rjELMAkGA1UEBhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcp +MRIwEAYDVQQHEwlTdHV0dGdhcnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fz +c2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVTLVRSVVNUIEF1dGhlbnRpY2F0aW9u +IGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0wNTA2MjIwMDAwMDBa +Fw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFkZW4t +V3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMg +RGV1dHNjaGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJV +U1QgQXV0aGVudGljYXRpb24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBO +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1 +toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob4QSwI7+Vio5bG0F/WsPo +TUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXLg3KSwlOy +ggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1 +XgqfeN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteF +hy+S8dF2g08LOlk3KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm +7QIDAQABo4GSMIGPMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEG +MCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJvbmxpbmUxLTIwNDgtNTAdBgNV +HQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAUD8oeXHngovMp +ttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD +pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFo +LtU96G7m1R08P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersF +iXOMy6ZNwPv2AtawB6MDwidAnwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0y +h9WUUpY6RsZxlj33mA6ykaqP2vROJAA5VeitF7nTNCtKqUDMFypVZUF0Qn71wK/I +k63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8bHz2eBIPdltkdOpQ= +-----END CERTIFICATE----- +mozilla/Swisscom_Root_CA_2.crt +-----BEGIN CERTIFICATE----- +MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk +MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 +YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg +Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT +AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp +Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr +jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r +0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f +2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP +ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF +y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA +tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL +6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0 +uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL +acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh +k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q +VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw +FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O +BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh +b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R +fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv +/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI +REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx +srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv +aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT +woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n +Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W +t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N +8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2 +9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5 +wSsSnqaeG8XmDtkx2Q== +-----END CERTIFICATE----- +mozilla/Secure_Global_CA.crt +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- +mozilla/UTN_USERFirst_Hardware_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB +lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt +SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG +A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe +MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v +d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh +cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn +0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ +M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a +MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd +oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI +DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy +oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 +dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy +bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF +BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli +CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE +CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t +3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS +KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== +-----END CERTIFICATE----- +mozilla/E-Guven_Kok_Elektronik_Sertifika_Hizmet_Saglayicisi.crt +-----BEGIN CERTIFICATE----- +MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp +Z2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp +a2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx +MzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg +R3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg +U2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU +MZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT +L/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H +5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC +90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1 +c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE +VtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP +qk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S +/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj +/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X +KWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq +fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX +-----END CERTIFICATE----- +mozilla/Camerfirma_Global_Chambersign_Root.crt +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo +YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 +MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy +NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G +A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA +A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 +Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s +QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV +eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 +B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh +z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T +AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i +ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w +TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH +MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD +VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE +VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B +AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM +bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi +ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG +VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c +ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ +AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- +mozilla/NetLock_Arany_=Class_Gold=_FÅ‘tanúsÃtvány.crt +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- +mozilla/Verisign_Class_3_Public_Primary_Certification_Authority_-_G3.crt +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- +mozilla/Security_Communication_RootCA2.crt +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- +mozilla/thawte_Primary_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- +mozilla/OISTE_WISeKey_Global_Root_GA_CA.crt +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- +mozilla/AC_RaÃz_Certicámara_S.A..crt +-----BEGIN CERTIFICATE----- +MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx +CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp +ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa +QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw +NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft +ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu +QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq +hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG +qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL +fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ +Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 +Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ +54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b +MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j +ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej +YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt +A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF +rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ +pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB +lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy +YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 +7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs +YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 +xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc +unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ +Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp +ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 +gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 +jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ +XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD +W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ +RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r +MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk +BYn8eNZcLCZDqQ== +-----END CERTIFICATE----- +mozilla/SecureTrust_CA.crt +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- +mozilla/Autoridad_de_Certificacion_Firmaprofesional_CIF_A62634068.crt +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- +mozilla/GeoTrust_Universal_CA.crt +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- +mozilla/D-TRUST_Root_Class_3_CA_2_2009.crt +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- +mozilla/Visa_eCommerce_Root.crt +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- +mozilla/TÃœBÄ°TAK_UEKAE_Kök_Sertifika_Hizmet_SaÄŸlayıcısı_-_Sürüm_3.crt +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS +MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp +bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw +VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy +YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy +dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 +ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe +Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx +GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls +aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU +QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh +xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 +aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr +IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h +gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK +O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO +fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw +lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID +AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP +NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t +wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM +7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh +gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n +oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs +yZyQ2uypQjyttgI= +-----END CERTIFICATE----- +mozilla/AddTrust_External_Root.crt +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- +mozilla/Comodo_Trusted_Services_root.crt +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 +aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla +MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD +VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW +fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt +TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL +fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW +1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 +kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G +A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v +ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo +dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu +Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ +HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS +jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ +xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn +dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- +mozilla/RSA_Security_2048_v3.crt +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 +MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp +dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX +BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy +MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp +eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg +/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl +wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh +AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 +PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu +AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR +MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc +HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ +Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ +f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO +rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch +6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 +7CAFYd4= +-----END CERTIFICATE----- +mozilla/DST_Root_CA_X3.crt +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- +mozilla/Verisign_Class_4_Public_Primary_Certification_Authority_-_G3.crt +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 +GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ ++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd +U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm +NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY +ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ +ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 +CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq +g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm +fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c +2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ +bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== +-----END CERTIFICATE----- +mozilla/Global_Chambersign_Root_-_2008.crt +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- +mozilla/Buypass_Class_2_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- +mozilla/America_Online_Root_Certification_Authority_2.crt +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP +bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 +MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft +ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC +206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci +KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 +JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 +BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e +Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B +PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 +Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq +Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ +o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 ++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj +YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj +FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn +xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 +LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc +obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 +CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe +IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA +DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F +AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX +Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb +AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl +Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw +RY8mkaKO/qk= +-----END CERTIFICATE----- +mozilla/CA_Disig_Root_R1.crt +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy +MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk +D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o +OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A +fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe +IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n +oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK +/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj +rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD +3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE +7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC +yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd +qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI +hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA +SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo +HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB +emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC +AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb +7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x +DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk +F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF +a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT +Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- +mozilla/TC_TrustCenter_Class_3_CA_II.crt +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV +BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 +Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 +OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i +SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc +VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW +Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q +Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 +1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq +ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 +Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX +XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy +dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 +Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz +JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 +Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u +TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN +irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 +TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 +g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB +95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj +S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== +-----END CERTIFICATE----- +mozilla/TDC_Internet_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE +SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg +Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV +BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl +cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA +vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu +Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a +0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 +4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN +eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD +R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG +A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu +dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME +Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 +WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw +HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ +KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO +Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX +wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ +2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 +9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 +jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 +aQNiuJkFBT1reBK9sG9l +-----END CERTIFICATE----- +mozilla/Network_Solutions_Certificate_Authority.crt +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- +mozilla/Buypass_Class_3_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- +mozilla/UTN_DATACorp_SGC_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB +kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug +Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho +dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw +IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG +EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD +VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu +dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 +E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ +D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK +4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq +lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW +bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB +o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT +MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js +LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr +BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB +AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft +Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj +j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH +KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv +2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 +mfnGV/TJVTl4uix5yaaIK/QI +-----END CERTIFICATE----- +mozilla/NetLock_Notary_=Class_A=_Root.crt +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV +MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe +TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 +dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB +KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 +N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC +dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu +MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL +b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD +zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi +3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 +WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY +Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi +NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC +ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 +QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 +YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz +aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm +ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg +ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs +amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv +IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 +Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 +ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 +YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg +dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs +b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G +CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO +xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP +0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ +QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk +f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK +8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI +-----END CERTIFICATE----- +mozilla/Microsec_e-Szigno_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw +cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy +b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z +ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4 +NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN +TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p +Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u +uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+ +LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA +vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770 +Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx +62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB +AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw +LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP +BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB +AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov +MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5 +ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT +AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh +ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo +AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa +AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln +bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p +Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP +PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv +Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB +EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu +w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj +cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV +HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI +VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS +BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS +b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS +8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds +ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl +7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR +hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/ +MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- +mozilla/AffirmTrust_Premium.crt +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- +mozilla/Certplus_Class_2_Primary_CA.crt +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- +mozilla/Entrust.net_Premium_2048_Secure_Server_CA.crt +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- +mozilla/Sonera_Class_1_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx +MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG +29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk +oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk +3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL +qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN +nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX +ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H +DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO +TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv +kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w +zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa +-----END CERTIFICATE----- +mozilla/Starfield_Class_2_CA.crt +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- +mozilla/SwissSign_Gold_CA_-_G2.crt +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- +mozilla/China_Internet_Network_Information_Center_EV_Certificates_Root.crt +-----BEGIN CERTIFICATE----- +MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC +Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g +Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0 +aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa +Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg +SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo +aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp +ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z +7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA// +DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx +zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8 +hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs +4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u +gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY +NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3 +j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG +52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB +echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws +ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI +zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy +wy39FCqQmbkHzJ8= +-----END CERTIFICATE----- +mozilla/Certum_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM +MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD +QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E +jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo +ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI +ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu +Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg +AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 +HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA +uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa +TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg +xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q +CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x +O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs +6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- +mozilla/CA_Disig_Root_R2.crt +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- +mozilla/TWCA_Root_Certification_Authority.crt +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- +mozilla/thawte_Primary_Root_CA_-_G3.crt +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- +mozilla/AddTrust_Low-Value_Services_Root.crt +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw +MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD +VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul +CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n +tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl +dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch +PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC ++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O +BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl +MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk +ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X +7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz +43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl +pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA +WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- +mozilla/Starfield_Root_Certificate_Authority_-_G2.crt +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- +mozilla/IGC_A.crt +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT +AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ +TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG +9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw +MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM +BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO +MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 +LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI +s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 +xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 +u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b +F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx +Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd +PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV +HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx +NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF +AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ +L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY +YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a +NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R +0982gaEbeC9xs/FZTEYYKKuF0mBWWg== +-----END CERTIFICATE----- +mozilla/Comodo_AAA_Services_root.crt +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- +mozilla/DigiCert_High_Assurance_EV_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- +mozilla/PSCProcert.crt +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s +YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz +dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 +aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh +IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ +KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw +MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy +b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx +KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG +A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u +aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 +7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 +BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G +ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 +JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 +PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 +0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ +6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m +v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 +K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev +bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw +MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w +MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD +gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 +b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh +bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 +cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp +ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg +ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq +hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD +AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w +MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag +RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t +UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl +cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG +AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN +AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS +1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB +3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv +Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh +HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm +pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz +sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE +qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb +mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 +opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H +YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- +mozilla/Certinomis_-_Autorité_Racine.crt +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk +BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 +Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl +cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 +aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY +F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N +8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe +rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K +/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu +7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC +28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 +lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E +nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB +0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 +5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj +WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN +jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s +ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM +OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q +619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn +2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj +o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v +nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG +5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq +pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb +dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 +BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- +mozilla/Security_Communication_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- +mozilla/Izenpe.com.crt +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- +mozilla/AddTrust_Qualified_Certificates_Root.crt +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 +b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 +MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK +EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh +BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq +xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G +87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i +2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U +WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 +0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G +A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr +pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL +ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm +aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv +hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm +hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 +P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y +iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no +xqE= +-----END CERTIFICATE----- +mozilla/NetLock_Qualified_=Class_QA=_Root.crt +-----BEGIN CERTIFICATE----- +MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD +EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz +aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w +MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l +dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh +bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq +eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe +r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 +3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd +vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l +mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC +wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg +hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 +TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh +biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg +ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg +dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 +b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl +c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 +ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 +dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu +ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo +ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 +Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u +ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA +A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ +MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ +NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR +VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY +83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 +macqaJVmlaut74nLYKkGEsaUR+ko +-----END CERTIFICATE----- +mozilla/COMODO_ECC_Certification_Authority.crt +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- +mozilla/SwissSign_Platinum_CA_-_G2.crt +-----BEGIN CERTIFICATE----- +MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu +IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw +WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD +ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y +IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn +IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ +6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob +jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw +izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl ++zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY +zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP +pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF +KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW +ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB +AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 +ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW +IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA +A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 +uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ +FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 +jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ +u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D +YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 +puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa +icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG +DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x +kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z +Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== +-----END CERTIFICATE----- +mozilla/TC_TrustCenter_Universal_CA_I.crt +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL +MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV +BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 +c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx +MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg +R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD +VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR +JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T +fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu +jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z +wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ +fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD +VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G +CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 +7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn +8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs +ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT +ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ +2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY +-----END CERTIFICATE----- +mozilla/Deutsche_Telekom_Root_CA_2.crt -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj @@ -2575,3 +3380,486 @@ IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- +mozilla/ComSign_CA.crt +-----BEGIN CERTIFICATE----- +MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0 +MRMwEQYDVQQDEwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQG +EwJJTDAeFw0wNDAzMjQxMTMyMThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMT +CkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNpZ24xCzAJBgNVBAYTAklMMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49qROR+WCf4C9DklBKK +8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTyP2Q2 +98CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb +2CEJKHxNGGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxC +ejVb7Us6eva1jsz/D3zkYDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7Kpi +Xd3DTKaCQeQzC6zJMw9kglcq/QytNuEMrkvF7zuZ2SOzW120V+x0cAwqTwIDAQAB +o4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2Zl +ZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0PAQH/BAQD +AgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRL +AZs+VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWd +foPPbrxHbvUanlR2QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0M +cXS6hMTXcpuEfDhOZAYnKuGntewImbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq +8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb/627HOkthIDYIb6FUtnUdLlp +hbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VGzT2ouvDzuFYk +Res3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U +AGegcQCCSA== +-----END CERTIFICATE----- +mozilla/Staat_der_Nederlanden_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO +TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy +MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk +ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn +ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 +9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO +hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U +tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o +BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh +SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww +OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv +cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA +7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k +/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm +eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 +u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy +7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- +mozilla/Root_CA_Generalitat_Valenciana.crt +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF +UzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ +R1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN +MDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw +JQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+ +WmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj +SgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl +u6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy +A8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk +Hl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7 +MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr +aS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC +IwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A +cgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA +YQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA +bABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA +bgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA +aQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA +ZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA +YwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA +ZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA +LgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6 +Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y +eAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw +CQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G +A1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu +Y2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn +lD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt +b8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg +9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF +ducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC +IoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- +mozilla/EBG_Elektronik_Sertifika_Hizmet_SaÄŸlayıcısı.crt +-----BEGIN CERTIFICATE----- +MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV +BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx +c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt +ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4 +MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl +a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h +4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk +tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s +tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL +dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4 +c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um +TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z ++kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O +Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW +OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW +fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2 +l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw +FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+ +8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI +6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO +TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME +wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY +Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn +xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q +DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q +Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t +hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4 +7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7 +QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT +-----END CERTIFICATE----- +mozilla/Wells_Fargo_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v +dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 +MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww +KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G +A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 +5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE +SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O +JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu +ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE +AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB +AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB +CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw +b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo +7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ +0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 +nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx +x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ +33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= +-----END CERTIFICATE----- +mozilla/Hongkong_Post_Root_CA_1.crt +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- +mozilla/GlobalSign_Root_CA_-_R2.crt +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- +mozilla/Firmaprofesional_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx +IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 +dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u +Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY +rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z +hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay +BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL +iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb +AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv +bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 +MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E +FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n +VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq +u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m +hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl +ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp +QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 +quGnM/b9Sh/22WA= +-----END CERTIFICATE----- +mozilla/T-TeleSec_GlobalRoot_Class_3.crt +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- +mozilla/VeriSign_Class_3_Public_Primary_Certification_Authority_-_G5.crt +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- +mozilla/ApplicationCA_-_Japanese_Government.crt +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc +MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp +b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT +AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs +aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H +j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K +f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 +IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw +FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht +QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm +/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ +k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ +MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC +seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ +hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ +eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U +DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj +B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- +mozilla/Actalis_Authentication_Root_CA.crt +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- +mozilla/COMODO_Certification_Authority.crt +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- +mozilla/Verisign_Class_1_Public_Primary_Certification_Authority_-_G3.crt +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 +nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO +8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV +ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb +PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 +6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr +n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a +qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 +wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 +ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs +pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 +E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== +-----END CERTIFICATE----- +mozilla/CNNIC_ROOT.crt +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD +TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 +MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF +Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh +IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 +dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO +V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC +GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN +v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB +AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB +Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO +76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK +OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH +ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi +yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL +buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj +2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= +-----END CERTIFICATE----- +mozilla/AffirmTrust_Premium_ECC.crt +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- +mozilla/Buypass_Class_2_CA_1.crt +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg +Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL +MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD +VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 +ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX +l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB +HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B +5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 +WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP +gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ +DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu +BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs +h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk +LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- +mozilla/Certigna.crt +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- +mozilla/Camerfirma_Chambers_of_Commerce_Root.crt +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn +MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL +ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg +b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa +MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB +ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw +IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B +AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb +unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d +BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq +7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 +0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX +roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG +A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j +aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p +26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA +BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud +EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN +BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB +AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd +p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi +1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc +XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 +eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu +tGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- diff --git a/data/other/dh4096.pem b/data/other/dh4096.pem new file mode 100644 index 0000000000000000000000000000000000000000..90ef682834262dde0f8335a3e28252aa587eed64 --- /dev/null +++ b/data/other/dh4096.pem @@ -0,0 +1,21 @@ +-----BEGIN DH PARAMETERS----- +MIICCAKCAgEA///////////JD9qiIWjCNMTGYouA3BzRKQJOCIpnzHQCC76mOxOb +IlFKCHmONATd75UZs806QxswKwpt8l8UN0/hNW1tUcJF5IW1dmJefsb0TELppjft +awv/XLb0Brft7jhr+1qJn6WunyQRfEsf5kkoZlHs5Fs9wgB8uKFjvwWY2kg2HFXT +mmkWP6j9JM9fg2VdI9yjrZYcYvNWIIVSu57VKQdwlpZtZww1Tkq8mATxdGwIyhgh +fDKQXkYuNs474553LBgOhgObJ4Oi7Aeij7XFXfBvTFLJ3ivL9pVYFxg5lUl86pVq +5RXSJhiY+gUQFXKOWoqqxC2tMxcNBFB6M6hVIavfHLpk7PuFBFjb7wqK6nFXXQYM +fbOXD4Wm4eTHq/WujNsJM9cejJTgSiVhnc7j0iYa0u5r8S/6BtmKCGTYdgJzPshq +ZFIfKxgXeyAMu+EXV3phXWx3CYjAutlG4gjiT6B05asxQ9tb/OD9EI5LgtEgqSEI +ARpyPBKnh+bXiHGaEL26WyaZwycYavTiPBqUaDS2FQvaJYPpyirUTOjbu8LbBN6O ++S6O/BQfvsqmKHxZR05rwF2ZspZPoJDDoiM7oYZRW+ftH2EpcM7i16+4G912IXBI +HNAGkSfVsFqpk7TqmI2P3cGG/7fckKbAj030Nck0BjGZ//////////8CAQI= +-----END DH PARAMETERS----- + +"4096-bit MODP Group" from RFC3526, Section 5. + +The prime is: 2^4096 - 2^4032 - 1 + 2^64 * { [2^3966 pi] + 240904 } + +RFC3526 specifies a generator of 2. + +The generation of the group is described in RFC 2412. diff --git a/gajim.nsi b/gajim.nsi index 8bef329f9133b93e022ed7baa15574059d132c21..fa050c518799537b0cea1f4a4eba04a4a598eca3 100644 --- a/gajim.nsi +++ b/gajim.nsi @@ -182,8 +182,10 @@ Section "Gajim" SecGajim File "bin\library.zip" File "bin\pangocairo.pyd" File "bin\pango.pyd" + File "bin\pycurl.pyd" File "bin\pyexpat.pyd" File "bin\python27.dll" + File "bin\pythoncom27.dll" File "bin\pywintypes27.dll" File "bin\OpenSSL.rand.pyd" File "bin\select.pyd" @@ -194,8 +196,10 @@ Section "Gajim" SecGajim File "bin\win32api.pyd" File "bin\win32file.pyd" File "bin\win32pipe.pyd" + File "bin\win32ui.pyd" File "bin\winsound.pyd" File "msvcr90.dll" + File /r "bin\win32com" WriteRegStr HKCU "Software\Gajim" "" $INSTDIR WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Gajim" "DisplayName" "Gajim" @@ -530,6 +534,7 @@ Section "Uninstall" RMDir /r "$INSTDIR\bin\gtk\lib" RMDir /r "$INSTDIR\bin\gtk\share" RMDir "$INSTDIR\bin\gtk" + RMDir "$INSTDIR\bin\win32com" Delete "$INSTDIR\bin\_bsddb.pyd" Delete "$INSTDIR\bin\_ctypes.pyd" Delete "$INSTDIR\bin\_hashlib.pyd" @@ -558,8 +563,10 @@ Section "Uninstall" Delete "$INSTDIR\bin\OpenSSL.SSL.pyd" Delete "$INSTDIR\bin\pango.pyd" Delete "$INSTDIR\bin\pangocairo.pyd" + Delete "$INSTDIR\bin\pycurl.pyd" Delete "$INSTDIR\bin\pyexpat.pyd" Delete "$INSTDIR\bin\python27.dll" + Delete "$INSTDIR\bin\pythoncom27.dll" Delete "$INSTDIR\bin\pywintypes27.dll" Delete "$INSTDIR\bin\select.pyd" Delete "$INSTDIR\bin\sqlite3.dll" @@ -568,6 +575,7 @@ Section "Uninstall" Delete "$INSTDIR\bin\win32api.pyd" Delete "$INSTDIR\bin\win32file.pyd" Delete "$INSTDIR\bin\win32pipe.pyd" + Delete "$INSTDIR\bin\win32ui.pyd" Delete "$INSTDIR\bin\winsound.pyd" Delete "$INSTDIR\bin\msvcr90.dll" RMDir /r "$INSTDIR\bin" diff --git a/icons/hicolor/16x16/status/gajim-muc_separator.png b/icons/hicolor/16x16/status/gajim-muc_separator.png deleted file mode 100644 index f54797c8e98839147e55d954f46b08d25f442aa4..0000000000000000000000000000000000000000 Binary files a/icons/hicolor/16x16/status/gajim-muc_separator.png and /dev/null differ diff --git a/launch.sh b/launch.sh index 69c923d7b53f135394010bf7bd551976496aecf8..ad7265660b9ab413c236b5ebc1b0f5a6efda38ae 100755 --- a/launch.sh +++ b/launch.sh @@ -1,6 +1,6 @@ #!/bin/sh if [ ! $PYTHON ]; then - PYTHON="python"; + PYTHON="python3"; fi cd "$(dirname $0)/src" exec $PYTHON -OOt gajim.py "$@" diff --git a/plugins/acronyms_expander/__init__.py b/plugins/acronyms_expander/__init__.py index 25280942c4608c821fe3ae68a36d4419dfec1131..6b85dc73587f328ad8d9db5ba5250fbc4a0b8721 100644 --- a/plugins/acronyms_expander/__init__.py +++ b/plugins/acronyms_expander/__init__.py @@ -1 +1 @@ -from acronyms_expander import AcronymsExpanderPlugin +from .acronyms_expander import AcronymsExpanderPlugin diff --git a/plugins/acronyms_expander/acronyms.py b/plugins/acronyms_expander/acronyms similarity index 100% rename from plugins/acronyms_expander/acronyms.py rename to plugins/acronyms_expander/acronyms diff --git a/plugins/acronyms_expander/acronyms_expander.py b/plugins/acronyms_expander/acronyms_expander.py index 153b3784997fa52bd104dc2ca2f23aa8959ab59b..834cc4f9aadabd1a829a2342e04e2e16ad0b820f 100644 --- a/plugins/acronyms_expander/acronyms_expander.py +++ b/plugins/acronyms_expander/acronyms_expander.py @@ -26,8 +26,8 @@ Acronyms expander plugin. import sys -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import GObject from plugins import GajimPlugin from plugins.helpers import log, log_calls @@ -62,7 +62,7 @@ class AcronymsExpanderPlugin(GajimPlugin): @log_calls('AcronymsExpanderPlugin') def get_own_acronyms_list(self): - data_file = self.local_file_path('acronyms.py') + data_file = self.local_file_path('acronyms') data = open(data_file, 'r') acronyms = eval(data.read()) data.close() @@ -76,7 +76,7 @@ class AcronymsExpanderPlugin(GajimPlugin): #assert isinstance(tb,gtk.TextBuffer) ACRONYMS = self.config['ACRONYMS'] INVOKER = self.config['INVOKER'] - t = tb.get_text(tb.get_start_iter(), tb.get_end_iter()) + t = tb.get_text(tb.get_start_iter(), tb.get_end_iter(), True) #log.debug('%s %d'%(t, len(t))) if t and t[-1] == INVOKER: #log.debug('changing msg text') @@ -87,7 +87,7 @@ class AcronymsExpanderPlugin(GajimPlugin): #log.debug('head: %s'%(head)) t = ''.join((base, sep, head, INVOKER)) #log.debug("setting text: '%s'"%(t)) - gobject.idle_add(tb.set_text, t) + GObject.idle_add(tb.set_text, t) @log_calls('AcronymsExpanderPlugin') def connect_with_chat_control_base(self, chat_control): diff --git a/plugins/dbus_plugin/plugin.py b/plugins/dbus_plugin/plugin.py index 43f3840e81823f0ff23218e70f3947d65c660609..a3dcae62e790287abdf0ab9403a6b03ca4de2c14 100644 --- a/plugins/dbus_plugin/plugin.py +++ b/plugins/dbus_plugin/plugin.py @@ -407,7 +407,7 @@ if dbus_support.supported: return DBUS_DICT_SV() jid = self._get_real_jid(jid) - cached_vcard = gajim.connections.values()[0].get_cached_vcard(jid) + cached_vcard = list(gajim.connections.values())[0].get_cached_vcard(jid) if cached_vcard: return get_dbus_struct(cached_vcard) @@ -428,7 +428,7 @@ if dbus_support.supported: def account_info(self, account): '''show info on account: resource, jid, nick, prio, message''' result = DBUS_DICT_SS() - if gajim.connections.has_key(account): + if account in gajim.connections: # account is valid con = gajim.connections[account] index = con.connected @@ -508,7 +508,7 @@ if dbus_support.supported: def prefs_store(self): try: gajim.interface.save_config() - except Exception, e: + except Exception: return DBUS_BOOLEAN(False) return DBUS_BOOLEAN(True) diff --git a/po/he.po b/po/he.po index 35213b1a0247848b9fdfc4a686f81a4579b51df5..ec9daa729043ddd27a51d59d1db0ab9c3e3d1851 100644 --- a/po/he.po +++ b/po/he.po @@ -1,15 +1,14 @@ # Hebrew translations for gajim -# Copyright (C) Copyright © 2003-2013 Gajim Team +# Copyright (C) Copyright © 2003-2012 Gajim Team # This file is distributed under the same license as the gajim package. -# Darlan <xmpp:israeli@failar.nu>, 2012 - 2013. -# Isratine Citizen <genghiskhan@gmx.ca>, 2012 - 2013. +# Darlan <xmpp:israeli@failar.nu>, 2012. # msgid "" msgstr "" "Project-Id-Version: gajim 0.15\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-30 14:12+0300\n" -"PO-Revision-Date: 2013-08-30 14:13+0200\n" +"POT-Creation-Date: 2012-11-15 14:27+0400\n" +"PO-Revision-Date: 2012-12-09 10:07+0200\n" "Last-Translator: Isratine Citizen <genghiskhan@gmx.ca>\n" "Language-Team: Rahut\n" "Language: he\n" @@ -22,7 +21,7 @@ msgstr "" #: ../data/gui/account_context_menu.ui.h:1 #: ../data/gui/zeroconf_context_menu.ui.h:1 msgid "_Status" -msgstr "_מצב חיבור" +msgstr "_מצב־חיבור" #: ../data/gui/account_context_menu.ui.h:2 msgid "_Personal Events" @@ -30,7 +29,7 @@ msgstr "_××™×¨×•×¢×™× ×ישיי×" #: ../data/gui/account_context_menu.ui.h:3 ../data/gui/roster_window.ui.h:3 msgid "_Start Chat..." -msgstr "התחלת _שיחה..." +msgstr "התחל _שיחה..." # הצטרפות ×ך/ל # שיחה מרובת ×ž×©×ª×ª×¤×™× @@ -42,7 +41,7 @@ msgstr "שיחת _קבוצה..." #: ../data/gui/account_context_menu.ui.h:5 msgid "_Add Contact..." -msgstr "הוספת _×יש קשר..." +msgstr "הוסף _×יש קשר..." # ×יתור #: ../data/gui/account_context_menu.ui.h:6 ../data/gui/roster_window.ui.h:7 @@ -51,7 +50,7 @@ msgstr "×ž×¦× _שירותי×" #: ../data/gui/account_context_menu.ui.h:7 msgid "_Execute Command..." -msgstr "הרצת _פקודה..." +msgstr "הרץ _פקודה..." #: ../data/gui/account_context_menu.ui.h:8 msgid "_Open Gmail Inbox" @@ -73,17 +72,22 @@ msgstr "" "יש צורך בחשבון בכדי להתחבר\n" "×ל רשת התקשורת Jabber." +# בו ×× ×™ רוצה לעשות #: ../data/gui/account_creation_wizard_window.ui.h:4 msgid "I already have an account I want to _use" -msgstr "כבר ×§×™×™× ×‘×¨×©×•×ª×™ _חשבון ×שר ×‘×¨×¦×•× ×™ לעשות בו שימוש" +msgstr "כבר ×§×™×™× ×‘×¨×©×•×ª×™ _חשבון ×©×‘×¨×¦×•× ×™ לעשות שימוש בו" +# I want to _register a new account +# ×× ×™ רוצה _×œ×¨×©×•× ×—×©×‘×•×Ÿ חדש +# I want to _register for a new account +# ×× ×™ רוצה _×œ×”×™×¨×©× ×œ×—×©×‘×•×Ÿ חדש #: ../data/gui/account_creation_wizard_window.ui.h:5 msgid "I want to _register for a new account" msgstr "×‘×¨×¦×•× ×™ ל_×¨×©×•× ×—×©×‘×•×Ÿ חדש" #: ../data/gui/account_creation_wizard_window.ui.h:6 msgid "<b>Please choose one of the options below:</b>" -msgstr "<b>×× × ×‘×—×¨ ב×חת מתוך ×”×פשרויות מטה:</b>" +msgstr "<b>× × ×œ×‘×—×•×¨ ב×חת מן ×”×פשרויות מטה:</b>" # credentials #: ../data/gui/account_creation_wizard_window.ui.h:7 @@ -102,6 +106,11 @@ msgid "Save pass_word" msgstr "שמו_ר סיסמה" # BUG: a dot at the end +# From: Clipman +# If checked, this option allows to store one image inside the history +# במידה והמשבצת/וה×פשרות ×ž×¡×•×ž× ×ª +# במידה ומשבצת/ו×פשרות זו ×ž×¡×•×ž× ×ª +# בבוחרך ב×פשרות זו, Wicd #: ../data/gui/account_creation_wizard_window.ui.h:10 #: ../data/gui/accounts_window.ui.h:21 msgid "If checked, Gajim will remember the password for this account" @@ -110,7 +119,7 @@ msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יזכור ×ת הס #: ../data/gui/account_creation_wizard_window.ui.h:11 #: ../data/gui/accounts_window.ui.h:23 msgid "_Jabber ID:" -msgstr "מזהה _Jabber:" +msgstr "‫_JID:" #: ../data/gui/account_creation_wizard_window.ui.h:12 msgid "Anon_ymous authentication" @@ -118,7 +127,7 @@ msgstr "×ימות _××œ×ž×•× ×™" #: ../data/gui/account_creation_wizard_window.ui.h:13 msgid "<b>Please select a server</b>" -msgstr "<b>×× × ×‘×—×¨ שרת</b>" +msgstr "<b>× × ×œ×‘×—×•×¨ שרת</b>" #: ../data/gui/account_creation_wizard_window.ui.h:14 #: ../data/gui/manage_bookmarks_window.ui.h:3 @@ -132,7 +141,7 @@ msgstr "_פרוקסי:" # BUG: _underline #: ../data/gui/account_creation_wizard_window.ui.h:16 msgid "Manage..." -msgstr " × ×™×”×•×œ... " +msgstr " × ×”×œ... " # BUG: _underline #: ../data/gui/account_creation_wizard_window.ui.h:17 @@ -152,6 +161,8 @@ msgstr "_פורט:" msgid "_Advanced" msgstr "_מתקד×" +# הוספת ×ישור ×–×” לרשימת ×”××™×©×•×¨×™× ×”×ž×”×™×ž× ×™×.\n +# טביעת ×צבע (מסוג) SHA1 של ×”×ישור:\n #: ../data/gui/account_creation_wizard_window.ui.h:21 msgid "" "Add this certificate to the list of trusted certificates.\n" @@ -168,11 +179,12 @@ msgid "" msgstr "" "<b>מתחבר כעת ×ל שרת</b>\n" "\n" -"×× × ×”×ž×ª×Ÿ..." +"× × ×œ×”×ž×ª×™×Ÿ..." +# מיידית ל×חר ש #: ../data/gui/account_creation_wizard_window.ui.h:27 msgid "Connect when I press Finish" -msgstr "התחבר ×›×שר ×× ×™ ×לחץ על סיי×" +msgstr "התחבר מיידית ×›×שר ×× ×™ ×לחץ על סיו×" #: ../data/gui/account_creation_wizard_window.ui.h:28 msgid "Set my profile when I connect" @@ -180,17 +192,30 @@ msgstr "הגדר ×ת הדיוקן שלי בעת התחברותי" #: ../data/gui/account_creation_wizard_window.ui.h:29 msgid "_Finish" -msgstr "_סיי×" +msgstr "_סיו×" #: ../data/gui/account_creation_wizard_window.ui.h:30 -#: ../data/gui/accounts_window.ui.h:1 ../data/gui/change_mood_dialog.ui.h:1 -#: ../src/config.py:1253 ../src/config.py:1267 ../src/config.py:1272 -#: ../src/config.py:1320 ../src/config.py:1423 ../src/config.py:1742 -#: ../src/config.py:1747 ../src/config.py:2339 ../src/config.py:2420 -#: ../src/config.py:2435 ../src/config.py:3716 ../src/config.py:3791 -#: ../src/dialogs.py:315 ../src/dialogs.py:317 ../src/dialogs.py:523 -#: ../src/dialogs.py:536 ../src/roster_window.py:3147 -#: ../src/roster_window.py:3153 ../src/roster_window.py:3158 +#: ../data/gui/accounts_window.ui.h:1 +#: ../data/gui/change_mood_dialog.ui.h:1 +#: ../src/config.py:1254 +#: ../src/config.py:1268 +#: ../src/config.py:1273 +#: ../src/config.py:1321 +#: ../src/config.py:1424 +#: ../src/config.py:1739 +#: ../src/config.py:1744 +#: ../src/config.py:2320 +#: ../src/config.py:2399 +#: ../src/config.py:2412 +#: ../src/config.py:3698 +#: ../src/config.py:3773 +#: ../src/dialogs.py:313 +#: ../src/dialogs.py:315 +#: ../src/dialogs.py:521 +#: ../src/dialogs.py:534 +#: ../src/roster_window.py:3214 +#: ../src/roster_window.py:3220 +#: ../src/roster_window.py:3225 msgid "None" msgstr "לל×" @@ -199,19 +224,22 @@ msgid "Accounts" msgstr "×—×©×‘×•× ×•×ª" #. Change label for accept_button to action name instead of 'OK'. -#: ../data/gui/accounts_window.ui.h:3 ../src/dialogs.py:3524 -#: ../src/dialogs.py:3570 +#: ../data/gui/accounts_window.ui.h:3 +#: ../src/dialogs.py:3426 +#: ../src/dialogs.py:3472 msgid "Add" -msgstr "הוסף" +msgstr "הוספה" #. Change label for accept_button to action name instead of 'OK'. -#: ../data/gui/accounts_window.ui.h:4 ../src/dialogs.py:3528 -#: ../src/dialogs.py:3625 +#: ../data/gui/accounts_window.ui.h:4 +#: ../src/dialogs.py:3430 +#: ../src/dialogs.py:3527 msgid "Delete" -msgstr "מחק" +msgstr "מחיקה" #. Rename -#: ../data/gui/accounts_window.ui.h:5 ../src/roster_window.py:5792 +#: ../data/gui/accounts_window.ui.h:5 +#: ../src/roster_window.py:5844 msgid "Re_name" msgstr "_×©× ×” ש×" @@ -220,9 +248,10 @@ msgstr "_×©× ×” ש×" msgid "_Enable" msgstr "×_פשר" +# ×ימות ××œ×ž×•× ×™ #: ../data/gui/accounts_window.ui.h:7 msgid "Anonymous authentication" -msgstr "×ימות ××œ×ž×•× ×™" +msgstr "הת×מתות ××œ×ž×•× ×™×ª" #: ../data/gui/accounts_window.ui.h:8 msgid "" @@ -260,6 +289,7 @@ msgstr "לחץ בכדי לבקש הרש×ות עבור כל ×× ×©×™ קשר של msgid "Chan_ge Password" msgstr "ש_× ×” סיסמה" +# Omitted: Click to #: ../data/gui/accounts_window.ui.h:13 msgid "Click to change account's password" msgstr "×©× ×” סיסמת חשבון" @@ -272,22 +302,17 @@ msgstr "פעולות ×”× ×”×œ×ª מערכת" # BUG: from a jabber "the" # ×©× ×™ לקוחות ומעלה #: ../data/gui/accounts_window.ui.h:15 -msgid "" -"Priority is used in Jabber to determine who gets the events from the jabber " -"server when two or more clients are connected using the same account; The " -"client with the highest priority gets the events" -msgstr "" -"עדיפת משמשת ×ת Jabber כדי לקבוע מי מקבל ×ת ×”××™×¨×•×¢×™× ×ž×ª×•×š שרת jabber ×›×שר ×©× ×™ " -"לקוחות ×ו יותר ×ž×—×•×‘×¨×™× ×‘×מצעות ×ותו החשבון; הלקוח בעל העדיפות הגבוהה ביותר " -"יקבל ×ת ×”×ירועי×" +msgid "Priority is used in Jabber to determine who gets the events from the jabber server when two or more clients are connected using the same account; The client with the highest priority gets the events" +msgstr "עדיפת משמשת ×צל Jabber כדי לקבוע מי מקבל ×ת ×”××™×¨×•×¢×™× ×ž×Ÿ שרת jabber ×›×שר ×©× ×™ לקוחות ×ו יותר ×ž×—×•×‘×¨×™× ×‘×מצעות ×ותו החשבון; הלקוח בעל העדיפות הגבוהה ביותר יקבל ×ת ×”×ירועי×" #: ../data/gui/accounts_window.ui.h:16 msgid "A_djust to status" -msgstr "_הת×× ×ל מצב חיבור" +msgstr "_הת×× ×œ×ž×¦×‘Ö¾×—×™×‘×•×¨" +# ×ª×©×•× ×” #: ../data/gui/accounts_window.ui.h:17 msgid "Priority will change automatically according to your status." -msgstr "העדיפות ×ª×©×ª× ×” ×וטומטית בהת×× ×ל מצב החיבור שלך." +msgstr "העדיפות ×ª×©×ª× ×” ×וטומטית בהת×× ×œ×ž×¦×‘Ö¾×—×™×‘×•×¨×š." #: ../data/gui/accounts_window.ui.h:18 msgid "Priori_ty:" @@ -318,12 +343,13 @@ msgstr "תעודת לקוח" msgid "Account" msgstr "חשבון" +# ×תחול #: ../data/gui/accounts_window.ui.h:29 msgid "C_onnect on Gajim startup" msgstr "התחבר בעת ×”_פעלת Gajim" # BUG: a dot at the end -# ×›×שר משוגר +# ×›×שר ישוגר #: ../data/gui/accounts_window.ui.h:30 msgid "" "If checked, Gajim, when launched, will automatically connect to jabber using " @@ -333,17 +359,20 @@ msgstr "" "חשבון ×–×”" # BUG: _underline +# במידה והחיבור #: ../data/gui/accounts_window.ui.h:31 msgid "Auto-reconnect when connection is lost" msgstr "התחבר ×וטומטית ×›×שר החיבור ×ובד" +# יו_×ž× ×™ שיחות #: ../data/gui/accounts_window.ui.h:32 msgid "Save conversation _logs for all contacts" msgstr "שמור רשו_מות שיחה עבור כל ×× ×©×™ קשר" +# ×›×•×œ×œ× ×™ #: ../data/gui/accounts_window.ui.h:33 msgid "Synch_ronize account status with global status" -msgstr "×¡× ×›×¨×Ÿ מצב חשבון ×¢× ×ž×¦×‘ חיבור _גלובלי" +msgstr "×¡× ×›×¨×Ÿ מצב חשבון ×¢× ×ž×¦×‘Ö¾×—×™×‘×•×¨ _גלובלי" # BUG: a dot at the end # תיבת ×פשרויות @@ -352,37 +381,32 @@ msgstr "×¡× ×›×¨×Ÿ מצב חשבון ×¢× ×ž×¦×‘ חיבור _גלובלי" # תיבת ×§×•×ž×‘×™× ×” (×§×•×ž×‘×™× ×¦×™×”) # תיבת שיח #: ../data/gui/accounts_window.ui.h:34 -msgid "" -"If checked, any change to the global status (handled by the combobox at the " -"bottom of the roster window) will change the status of this account " -"accordingly" -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, כל ×©×™× ×•×™ ×ל מצב החיבור הגלובלי (מטופל על ידי תיבת " -"הבחירה שמצויה בתחתית חלון הרשימה) ×™×©× ×” ×ת המצב של חשבון ×–×” בהת×מה" +msgid "If checked, any change to the global status (handled by the combobox at the bottom of the roster window) will change the status of this account accordingly" +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, כל ×©×™× ×•×™ ×ל מצב־החיבור הגלובלי (מטופל על ידי תיבת־הבחירה שמצויה בתחתית חלון הרשימה) ×™×©× ×” ×ת המצב של חשבון ×–×” בהת×מה" # BUG: _underline #: ../data/gui/accounts_window.ui.h:35 msgid "Use file transfer proxies" msgstr "השתמש במתווכי העברת קובץ" +# שיהיו ×¡×™×›×•×™×™× ×’×“×•×œ×™× ×™×•×ª×¨ להעברת קובץ לעבוד #: ../data/gui/accounts_window.ui.h:36 -msgid "" -"If checked, Gajim will also broadcast some more IPs except from just your " -"IP, so file transfer has higher chances of working." -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim ישדר, ×‘× ×•×¡×£ לכתובת פרוטוקול המרשתת (IP; â€" -"Internet Protocol) שלך, מספר כתובות IP × ×•×¡×¤×•×ª, כך שלפעולת העברת קובץ יהיו " -"×¡×™×›×•×™×™× ×’×“×•×œ×™× ×™×•×ª×¨ לעבוד." +msgid "If checked, Gajim will also broadcast some more IPs except from just your IP, so file transfer has higher chances of working." +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim ישדר, ×‘× ×•×¡×£ לכתובת פרוטוקול המרשתת (IP) שלך, מספר כתובות IP × ×•×¡×¤×•×ª, כך שלהעברת קובץ יהיו ×¡×™×›×•×™×™× ×’×“×•×œ×™× ×™×•×ª×¨ לעבוד." -# (קבוצה כללית) +# ×כן, זוהי קבוצה כללית. × × ×œ× ×œ×”×¤×•×š ×–×ת ב×ופן שרירותי ל"רישו×" כללי ×ו לכל מילה ×חר ×©×œ× ×§×©×•×¨×” ×ל ×”×ª×•×›× ×™×ª #. FIXME: Ugly workaround. #. FIXME: Ugly workaround. #. Maybe we haven't been in any group (defaults to General) #. General group cannot be changed -#: ../data/gui/accounts_window.ui.h:37 ../data/gui/preferences_window.ui.h:41 -#: ../src/common/contacts.py:135 ../src/dialogs.py:115 ../src/dialogs.py:127 -#: ../src/roster_window.py:3089 ../src/roster_window.py:4215 -#: ../src/roster_window.py:5842 +#: ../data/gui/accounts_window.ui.h:37 +#: ../data/gui/preferences_window.ui.h:46 +#: ../src/common/contacts.py:135 +#: ../src/dialogs.py:113 +#: ../src/dialogs.py:125 +#: ../src/roster_window.py:3156 +#: ../src/roster_window.py:4284 +#: ../src/roster_window.py:5894 msgid "General" msgstr "כללית" @@ -390,9 +414,10 @@ msgstr "כללית" msgid "_use HTTP__PROXY environment variable" msgstr "השתמש במשת_× ×™ סביבת HTTP__PROXY" -#: ../data/gui/accounts_window.ui.h:39 ../data/gui/preferences_window.ui.h:134 +#: ../data/gui/accounts_window.ui.h:39 +#: ../data/gui/preferences_window.ui.h:137 msgid "_Manage..." -msgstr " × ×™×”×•_ל... " +msgstr " × ×”_ל... " #: ../data/gui/accounts_window.ui.h:40 msgid "<b>Proxy</b>" @@ -400,7 +425,7 @@ msgstr "<b>פרוקסי</b>" #: ../data/gui/accounts_window.ui.h:41 msgid "_Warn before using an insecure connection" -msgstr "×”_זהר ×ותי ×˜×¨× ×©×™×ž×•×© בחיבור ×œ× ×ž×ובטח" +msgstr "×”_זהר ×ותי ×œ×¤× ×™ שימוש בחיבור ×œ× ×ž×ובטח" #: ../data/gui/accounts_window.ui.h:42 msgid "" @@ -410,6 +435,7 @@ msgstr "" "סמן ×ת ×פשרות זו כדי ש־Gajim יש×ל ×ותך ×˜×¨× ×©×œ×™×—×ª סיסמתך על ×¤× ×™ חיבור ×œ× " "מ×ובטח." +# חבילות × ×ª×•× ×™× ×ž×¡×•×’ #: ../data/gui/accounts_window.ui.h:43 msgid "Send _keep-alive packets" msgstr "ש_לח חבילות keep-alive" @@ -423,6 +449,7 @@ msgstr "" "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim ישלח חבילות keep-alive כדי ×œ×ž× ×•×¢ פקיעת זמן של " "חיבור (connection timeout) המבי××” לידי × ×™×ª×•×§" +# הת×מה של ×©× #: ../data/gui/accounts_window.ui.h:45 msgid "Use cust_om hostname/port" msgstr "השתמש ×‘×©× ×ž×רח\\פורט מו_ת×מי×" @@ -436,7 +463,8 @@ msgstr "×©× ×ž_×רח: " msgid "_Port: " msgstr "_פורט: " -#: ../data/gui/accounts_window.ui.h:48 ../data/gui/preferences_window.ui.h:138 +#: ../data/gui/accounts_window.ui.h:48 +#: ../data/gui/preferences_window.ui.h:141 msgid "<b>Miscellaneous</b>" msgstr "<b>×©×•× ×•×ª</b>" @@ -444,8 +472,9 @@ msgstr "<b>×©×•× ×•×ª</b>" msgid "Connection" msgstr "חיבור" -#: ../data/gui/accounts_window.ui.h:50 ../src/config.py:1840 -#: ../src/config.py:2436 +#: ../data/gui/accounts_window.ui.h:50 +#: ../src/config.py:1835 +#: ../src/config.py:2413 msgid "No key selected" msgstr "×œ× × ×‘×—×¨ מפתח" @@ -460,16 +489,16 @@ msgstr "השתמש בסוכן G_PG" # BUG: a dot at the end #: ../data/gui/accounts_window.ui.h:53 msgid "If checked, Gajim will get the password from a GPG agent like seahorse" -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim ×™×חזר ×ת הסיסמה מתוך סוכן GPG כגון seahorse" +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim ×™×חזר ×ת הסיסמה מן סוכן GPG כגון seahorse" +# OpenPGP #: ../data/gui/accounts_window.ui.h:54 msgid "<b>OpenPGP</b>" -msgstr "<b>â€OpenPGP</b>" +msgstr "‫<b>OpenPGP</b>" #: ../data/gui/accounts_window.ui.h:55 msgid "_Edit Personal Information..." -msgstr "_עריכת מידע ×ישי..." +msgstr "_ערוך מידע ×ישי..." #: ../data/gui/accounts_window.ui.h:56 msgid "Information about you, as stored in the server" @@ -489,7 +518,7 @@ msgstr "התחבר בעת ×”_פעלת Gajim" #: ../data/gui/accounts_window.ui.h:60 msgid "Synchroni_ze account status with global status" -msgstr "×¡× ×›×¨×Ÿ מצב חשבון ×¢× ×ž×¦×‘ חיבור _גלובלי" +msgstr "×¡× ×›×¨×Ÿ מצב חשבון ×¢× ×ž×¦×‘Ö¾×—×™×‘×•×¨ _גלובלי" #: ../data/gui/accounts_window.ui.h:61 msgid "Use cust_om port:" @@ -502,9 +531,8 @@ msgid "" "setup you can select another one here.\n" "You might consider to change possible firewall settings." msgstr "" -"במידה והפורט המשתמט שמצוי בשימוש עבור הודעות × ×›× ×¡×•×ª ××™× × ×• מת××™× ×¢×‘×•×¨ ×”×ª×§× ×ª×š " -"ב×פשרותך לבחור פורט ×חר ×›×ן.\n" -"ייתכן ×›×™ ×™×”×™×” ×‘×¨×¦×•× ×š לשקול ×œ×©× ×•×ª הגדרות חומת ×ש ×פשריות." +"במידה והפורט המשתמט שמצוי בשימוש עבור הודעות × ×›× ×¡×•×ª ××™× × ×• מת××™× ×¢×‘×•×¨ ×”×ª×§× ×ª×š ביכולתך לבחור פורט×חר ×›×ן.\n" +"ייתכן שיהיה ×‘×¨×¦×•× ×š לשקול ×œ×©× ×•×ª הגדרות חומת־×ש ×פשריות." #: ../data/gui/accounts_window.ui.h:64 #: ../data/gui/zeroconf_information_window.ui.h:10 @@ -516,20 +544,25 @@ msgstr "×©× ×¤×¨×˜×™:" msgid "Last Name:" msgstr "×©× ×ž×©×¤×—×”:" +# ×´ +# " +# דו×\"ל: +# דו×״ל: #: ../data/gui/accounts_window.ui.h:66 #: ../data/gui/zeroconf_information_window.ui.h:8 msgid "E-Mail:" msgstr "דו×״ל:" #: ../data/gui/accounts_window.ui.h:67 -#: ../data/gui/zeroconf_information_window.ui.h:7 ../src/config.py:1867 -#: ../src/dialogs.py:841 +#: ../data/gui/zeroconf_information_window.ui.h:7 +#: ../src/config.py:1862 +#: ../src/dialogs.py:839 msgid "Jabber ID:" -msgstr "מזהה Jabber:" +msgstr "‫JID:" #: ../data/gui/accounts_window.ui.h:68 msgid "Mer_ge accounts" -msgstr "מזג _×—×©×‘×•× ×•×ª" +msgstr "מיזוג _×—×©×‘×•× ×•×ª" #: ../data/gui/add_new_contact_window.ui.h:1 msgid "Add New Contact" @@ -543,9 +576,10 @@ msgstr "_חשבון:" msgid "_Protocol:" msgstr "_פרוטוקול:" +# זהות #: ../data/gui/add_new_contact_window.ui.h:4 msgid "_User ID:" -msgstr "מזהה _משתמש:" +msgstr "‫ID _משתמש:" #: ../data/gui/add_new_contact_window.ui.h:5 #: ../data/gui/manage_bookmarks_window.ui.h:5 @@ -574,10 +608,10 @@ msgid "" "protocol. Click on register button to\n" "proceed." msgstr "" -"עליך ×œ×”×™×¨×©× ×‘×מצעות מוביל ×–×”\n" -"כדי שתהיה ב×פשרותך להוסיף ×יש\n" -"קשר מתוך פרוטוקול ×–×”. הקלק על\n" -"לחצן ×¨×™×©×•× ×›×“×™ להמשיך." +"× ×¨×©×ž×ª ב×מצעות מוביל ×–×”\n" +"כדי שתהיה ביכולתך להוסיף ×יש קשר\n" +"מפרוטוקול ×–×”. × × ×œ×”×§×™×© על לחצן\n" +"הרשמה כדי להמשיך." #: ../data/gui/add_new_contact_window.ui.h:13 msgid "_Register" @@ -590,20 +624,22 @@ msgid "" "to add a contact from this protocol." msgstr "" "עליך להתחבר ×ל מוביל בכדי שתעמוד לרשותך\n" -"×”×פשרות להוסיף ×יש קשר מתוך פרוטוקול ×–×”." +"היכולת להוסיף ×יש קשר מן פרוטוקול ×–×”." -#: ../data/gui/add_new_contact_window.ui.h:16 ../src/common/helpers.py:1366 +#: ../data/gui/add_new_contact_window.ui.h:16 +#: ../src/common/helpers.py:1363 msgid "I would like to add you to my contact list." msgstr "×‘×¨×¦×•× ×™ להוסיפך ×ל רשימת הקשר שלי." #. displaying the window -#: ../data/gui/adhoc_commands_window.ui.h:1 ../src/adhoc_commands.py:104 +#: ../data/gui/adhoc_commands_window.ui.h:1 +#: ../src/adhoc_commands.py:102 msgid "Ad-hoc Commands - Gajim" msgstr "פקודות ייעודיות (‫Ad-hoc) - ‫Gajim" #: ../data/gui/adhoc_commands_window.ui.h:2 msgid "Please wait while retrieving command list..." -msgstr "×× × ×”×ž×ª×Ÿ בעת ×חזרת רשימת פקודה..." +msgstr "× × ×œ×”×ž×ª×™×Ÿ בעת ×חזרת רשימת פקודות..." #: ../data/gui/adhoc_commands_window.ui.h:3 msgid "<b>Choose command to execute:</b>" @@ -613,13 +649,14 @@ msgstr "<b>בחר פקודה להרצה:</b>" msgid "Check once more" msgstr "בדוק ×¤×¢× × ×•×¡×¤×ª" +# "Please wait while the command is sending..." has been turned to "Please wait while the command is being sent..." #: ../data/gui/adhoc_commands_window.ui.h:5 -msgid "Please wait while the command is being sent..." -msgstr "×× × ×”×ž×ª×Ÿ בזמן שהפקודה × ×©×œ×—×ª..." +msgid "Please wait while the command is sending..." +msgstr "× × ×œ×”×ž×ª×™×Ÿ בזמן שהפקודה × ×©×œ×—×ª..." #: ../data/gui/adhoc_commands_window.ui.h:6 msgid "Please wait..." -msgstr "×× × ×”×ž×ª×Ÿ..." +msgstr "× × ×œ×”×ž×ª×™×Ÿ..." # BUG: commands or command #: ../data/gui/adhoc_commands_window.ui.h:7 @@ -628,7 +665,7 @@ msgstr "ישות jabber זו ×œ× ×—×•×©×¤×ª ×©×•× ×¤×§×•×“×”." #: ../data/gui/adhoc_commands_window.ui.h:8 msgid "<b>An error has occurred:</b>" -msgstr "<b>×ירעה שגי××”:</b>" +msgstr "<b>×רעה שגי××”:</b>" #: ../data/gui/adhoc_commands_window.ui.h:9 msgid "Error description..." @@ -636,7 +673,7 @@ msgstr "תי×ור שגי××”..." #: ../data/gui/adhoc_commands_window.ui.h:10 msgid "F_inish" -msgstr "_סיי×" +msgstr "_סיו×" #: ../data/gui/advanced_configuration_window.ui.h:1 msgid "Advanced Configuration Editor" @@ -651,6 +688,7 @@ msgstr "×¡×™× ×•×Ÿ:" msgid "<b>Description</b>" msgstr "<b>תי×ור</b>" +# יש צורך ל×תחל #: ../data/gui/advanced_configuration_window.ui.h:4 msgid "<b>NOTE:</b> You should restart Gajim for some settings to take effect" msgstr "<b>הערה:</b> עליך ל×תחל ×ת Gajim כדי שהגדרות מסוימות ×™×™×›× ×¡×• לתוקף" @@ -663,13 +701,15 @@ msgstr "_×פס ×ל ברירת מחדל" msgid "Show _XML Console" msgstr "הצג _מסוף XML" +# management of archives +# × × ×œ×ž×¦×•× ×ª×¨×’×•× ×ž×•×¦×œ×— יותר #: ../data/gui/advanced_menuitem_menu.ui.h:2 msgid "Edit Archi_ving Preferences" msgstr "ערוך העדפות _××¨×›×™×•× ×ות" #: ../data/gui/advanced_menuitem_menu.ui.h:3 msgid "Edit _Privacy Lists..." -msgstr "עריכת _רשימות פרטיות..." +msgstr "ערוך _רשימות פרטיות..." # Administration #: ../data/gui/advanced_menuitem_menu.ui.h:4 @@ -678,7 +718,7 @@ msgstr "×”_× ×”×œ×”" #: ../data/gui/advanced_menuitem_menu.ui.h:5 msgid "_Send Server Message..." -msgstr "_שליחת הודעת שרת..." +msgstr "_שלח הודעת שרת..." #: ../data/gui/advanced_menuitem_menu.ui.h:6 msgid "Sends a message to users currently connected to this server" @@ -690,7 +730,7 @@ msgstr "הגדרת הודעת ×”×™×•× (Message of the Day)" #: ../data/gui/advanced_menuitem_menu.ui.h:8 msgid "Set MOTD..." -msgstr "הגדרת MOTD..." +msgstr "הגדר MOTD..." #: ../data/gui/advanced_menuitem_menu.ui.h:9 msgid "Updates Message of the Day" @@ -698,12 +738,13 @@ msgstr "עדכון הודעת ×”×™×•× (Message of the Day)" #: ../data/gui/advanced_menuitem_menu.ui.h:10 msgid "Update MOTD..." -msgstr "עדכון MOTD..." +msgstr "עדכן MOTD..." #: ../data/gui/advanced_menuitem_menu.ui.h:11 msgid "Delete MOTD" msgstr "מחק MOTD" +# הודעה יומית #: ../data/gui/advanced_menuitem_menu.ui.h:12 msgid "Deletes Message of the Day" msgstr "מחיקת הודעת ×”×™×•× (Message of the Day)" @@ -726,6 +767,7 @@ msgstr "העדף" msgid "Concede" msgstr "וותר" +# ×סירה #: ../data/gui/archiving_preferences_window.ui.h:5 msgid "Forbid" msgstr "×סור" @@ -777,10 +819,12 @@ msgstr "×× ×©×™ קשר חסומי×" #: ../data/gui/blocked_contacts_window.ui.h:2 #: ../data/gui/contact_context_menu.ui.h:20 -#: ../data/gui/gc_occupants_menu.ui.h:14 ../src/roster_window.py:5811 -#: ../src/roster_window.py:5938 ../src/roster_window.py:6071 +#: ../data/gui/gc_occupants_menu.ui.h:14 +#: ../src/roster_window.py:5863 +#: ../src/roster_window.py:5990 +#: ../src/roster_window.py:6123 msgid "_Unblock" -msgstr "_בטל חסימה" +msgstr "_ביטול חסימה" #: ../data/gui/change_activity_dialog.ui.h:1 msgid "Set Activity" @@ -810,14 +854,14 @@ msgstr "×©× ×” סיסמה" msgid "Enter new password:" msgstr "הזן סיסמה חדשה:" +# ×œ×©× #: ../data/gui/change_password_dialog.ui.h:3 msgid "Enter it again for confirmation:" -msgstr "הזן ×ת הסיסמה, ×¤×¢× × ×•×¡×¤×ª, ×œ×©× ×ימות:" +msgstr "הזן ×ת הסיסמה, ×¤×¢× × ×•×¡×¤×ª, ל×ימות:" -# ערוך מר×ש #: ../data/gui/change_status_message_dialog.ui.h:1 msgid "Save as Preset..." -msgstr "שמירה כמצב מות××..." +msgstr "שמירה כמצב ערוך מר×ש..." #: ../data/gui/change_status_message_dialog.ui.h:2 msgid "Mood:" @@ -827,17 +871,19 @@ msgstr "מצב רוח:" msgid "Activity:" msgstr "פעילות:" +# ×ž×•×›× ×•×ª מר×ש #: ../data/gui/change_status_message_dialog.ui.h:4 msgid "Preset messages:" -msgstr "הודעות מות×מות:" +msgstr "הודעות שמורות:" #: ../data/gui/change_status_message_dialog.ui.h:5 msgid "<b>Type your new status message</b>" msgstr "<b>הקלד הודעת מצב חדשה</b>" +# Changed: Location to Destination #: ../data/gui/chat_context_menu.ui.h:1 msgid "_Copy Link Location" -msgstr "×”_עתק כתובת מיקו×" +msgstr "×”_עתק כתובת יעד" #: ../data/gui/chat_context_menu.ui.h:2 msgid "_Open Link in Browser" @@ -864,88 +910,116 @@ msgstr "הצטרף ×ל שיחת _קבוצה" #: ../data/gui/chat_context_menu.ui.h:7 #: ../data/gui/contact_context_menu.ui.h:24 msgid "_Add to Roster..." -msgstr "הו_ספה ×ל רשימה..." +msgstr "הו_סף ×ל הרשימה..." #: ../data/gui/chat_control.ui.h:1 ../data/gui/groupchat_control.ui.h:1 msgid "Show a list of emoticons (Alt+M)" msgstr "הצגת רשימת ×¨×’×©×•× ×™× (Alt+M)" #: ../data/gui/chat_control.ui.h:2 -msgid "Add this contact to roster (Ctrl+D)" -msgstr "הוספת ×יש קשר ×–×” לרשימה (Ctrl+D)" +#: ../data/gui/groupchat_control.ui.h:2 +msgid "Show a list of formattings" +msgstr "הצגת רשימת עיצובי×" #: ../data/gui/chat_control.ui.h:3 +msgid "Add this contact to roster (Ctrl+D)" +msgstr "הוספת ×יש קשר ×–×” ×ל הרשימה (Ctrl+D)" + +#. change tooltip text for audio and video buttons if python-farstream is +#. not installed +#: ../data/gui/chat_control.ui.h:4 +#: ../src/chat_control.py:1724 +#: ../src/command_system/implementation/standard.py:214 +msgid "Toggle audio session" +msgstr "הפעלת סשן שמע" + +#: ../data/gui/chat_control.ui.h:5 +#: ../src/chat_control.py:1725 +#: ../src/command_system/implementation/standard.py:224 +msgid "Toggle video session" +msgstr "הפעלת סשן ויד×ו" + +#: ../data/gui/chat_control.ui.h:6 msgid "Invite contacts to the conversation (Ctrl+G)" msgstr "×”×–×ž× ×ª ×× ×©×™ קשר ×ל הדיון (Ctrl+G)" -#: ../data/gui/chat_control.ui.h:4 -msgid "View contact information (Ctrl+I)" -msgstr "צפייה במידע ×יש קשר (Ctrl+I)" +#: ../data/gui/chat_control.ui.h:7 +msgid "Show the contact's profile (Ctrl+I)" +msgstr "הצגת דיוקן ×יש קשר (Ctrl+I)" -#: ../data/gui/chat_control.ui.h:5 ../data/gui/groupchat_control.ui.h:6 +#: ../data/gui/chat_control.ui.h:8 +#: ../data/gui/groupchat_control.ui.h:6 msgid "Browse the chat history (Ctrl+H)" msgstr "עיון בהיסטוריית השיחה (Ctrl+H)" -#: ../data/gui/chat_control.ui.h:6 ../data/gui/groupchat_control.ui.h:7 -msgid "Show advanced functions (Alt+D)" -msgstr "הצגת ×¤×§×“×™× ×ž×ª×§×“×ž×™× (Alt+D)" +# תפקודיות +#: ../data/gui/chat_control.ui.h:9 +#: ../data/gui/groupchat_control.ui.h:7 +msgid "Show a menu of advanced functions (Alt+D)" +msgstr "הצגת תפריט ×¤×§×“×™× ×ž×ª×§×“×ž×™× (Alt+D)" -#: ../data/gui/chat_control.ui.h:7 +#: ../data/gui/chat_control.ui.h:10 msgid "#" msgstr "" -#: ../data/gui/chat_control.ui.h:8 ../data/gui/groupchat_control.ui.h:8 -#: ../data/gui/single_message_window.ui.h:6 -msgid "Send message" -msgstr "שליחת הודעה" - #. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) -#: ../data/gui/chat_control.ui.h:10 ../data/gui/groupchat_control.ui.h:10 -#: ../data/gui/xml_console_window.ui.h:15 ../src/filetransfers_window.py:322 +#: ../data/gui/chat_control.ui.h:12 +#: ../data/gui/groupchat_control.ui.h:9 +#: ../data/gui/xml_console_window.ui.h:15 +#: ../src/filetransfers_window.py:322 msgid "_Send" msgstr "_שלח" -#: ../data/gui/chat_control.ui.h:11 +#: ../data/gui/chat_control.ui.h:13 msgid "1" msgstr "" -#: ../data/gui/chat_control.ui.h:12 +#: ../data/gui/chat_control.ui.h:14 +#, fuzzy msgid "2" -msgstr "" +msgstr "2 (דהו)" -#: ../data/gui/chat_control.ui.h:13 +#: ../data/gui/chat_control.ui.h:15 +#, fuzzy msgid "3" -msgstr "" +msgstr "3 (×בג)" -#: ../data/gui/chat_control.ui.h:14 +#: ../data/gui/chat_control.ui.h:16 +#, fuzzy msgid "4" -msgstr "" +msgstr "4 (×ž× )" -#: ../data/gui/chat_control.ui.h:15 +#: ../data/gui/chat_control.ui.h:17 +#, fuzzy msgid "5" -msgstr "" +msgstr "5 (יכל)" -#: ../data/gui/chat_control.ui.h:16 +#: ../data/gui/chat_control.ui.h:18 +#, fuzzy msgid "6" -msgstr "" +msgstr "6 (זחט)" -#: ../data/gui/chat_control.ui.h:17 +#: ../data/gui/chat_control.ui.h:19 +#, fuzzy msgid "7" -msgstr "" +msgstr "7 (רשת)" -#: ../data/gui/chat_control.ui.h:18 +#: ../data/gui/chat_control.ui.h:20 +#, fuzzy msgid "8" -msgstr "" +msgstr "8 (צק)" -#: ../data/gui/chat_control.ui.h:19 +#: ../data/gui/chat_control.ui.h:21 +#, fuzzy msgid "9" -msgstr "" +msgstr "9 (סעפ)" -#: ../data/gui/chat_control.ui.h:20 +#: ../data/gui/chat_control.ui.h:22 msgid "*" msgstr "" -#: ../data/gui/chat_control.ui.h:21 ../data/gui/single_message_window.ui.h:3 +#: ../data/gui/chat_control.ui.h:23 +#: ../data/gui/single_message_window.ui.h:3 msgid "0" msgstr "" @@ -979,17 +1053,18 @@ msgstr "התחל _שיחה" #: ../data/gui/contact_context_menu.ui.h:2 ../data/gui/roster_window.ui.h:4 msgid "Send Single _Message..." -msgstr "שליחת הודעה _בודדת..." +msgstr "שלח הודעה _בודדת..." #: ../data/gui/contact_context_menu.ui.h:3 msgid "Send _File..." -msgstr "שליחת _קובץ..." +msgstr "שלח _קובץ..." #. Invite to #. Invite to Groupchat #: ../data/gui/contact_context_menu.ui.h:4 -#: ../data/gui/gc_occupants_menu.ui.h:11 ../src/roster_window.py:5747 -#: ../src/roster_window.py:5906 +#: ../data/gui/gc_occupants_menu.ui.h:11 +#: ../src/roster_window.py:5799 +#: ../src/roster_window.py:5958 msgid "In_vite to" msgstr "×”_זמן ×ל" @@ -999,21 +1074,25 @@ msgstr "הזמן _×× ×©×™ קשר" #: ../data/gui/contact_context_menu.ui.h:6 msgid "Toggle Open_PGP Encryption" -msgstr "הפעל ×”×¦×¤× ×ª Open_PGP" +msgstr "הפעלת ×”×¦×¤× ×ª Open_PGP" # BUG: No _underline +# I need another word for Toggle +# [ x ] Activate +# קצה ×ל קצה #: ../data/gui/contact_context_menu.ui.h:7 msgid "Toggle End to End Encryption" -msgstr "הפעל ×”×¦×¤× ×ª קצה ×ל קצה" +msgstr "הפעלת ×”×¦×¤× ×ª E2E" -#: ../data/gui/contact_context_menu.ui.h:8 ../src/roster_window.py:5757 -#: ../src/roster_window.py:5995 +#: ../data/gui/contact_context_menu.ui.h:8 +#: ../src/roster_window.py:5809 +#: ../src/roster_window.py:6047 msgid "Send Cus_tom Status" -msgstr "שלח מצב חיבור מו_ת××" +msgstr "שלח מצב־חיבור מו_ת××" #: ../data/gui/contact_context_menu.ui.h:9 msgid "E_xecute Command..." -msgstr "הרצת _פקודה..." +msgstr "הרץ _פקודה..." #: ../data/gui/contact_context_menu.ui.h:10 msgid "M_anage Contact" @@ -1021,49 +1100,55 @@ msgstr "_× ×”×œ ×יש קשר" #: ../data/gui/contact_context_menu.ui.h:11 msgid "_Rename..." -msgstr "_×©×™× ×•×™ ש×..." +msgstr "_×©× ×” ש×..." #: ../data/gui/contact_context_menu.ui.h:12 msgid "Edit _Groups..." -msgstr "עריכת _קבוצות..." +msgstr "ערוך _קבוצות..." #: ../data/gui/contact_context_menu.ui.h:13 msgid "Assign Open_PGP Key..." -msgstr "הקצ×ת מפתח Open_PGP..." +msgstr "הקצה מפתח Open_PGP..." #: ../data/gui/contact_context_menu.ui.h:14 msgid "Set Custom _Avatar..." -msgstr "הגדרת _×ווט×ר מות××..." +msgstr "הגדר _×ווט×ר מות××..." #: ../data/gui/contact_context_menu.ui.h:15 msgid "Add Special _Notification..." -msgstr "הוספת ×”_תר××” מיוחדת..." +msgstr "הוסף ×”_תר××” מיוחדת..." #: ../data/gui/contact_context_menu.ui.h:16 msgid "_Subscription" msgstr "×”_רשמה" +# Changed to: Allow this contact to view my status +# ל×יש קשר ×–×” #: ../data/gui/contact_context_menu.ui.h:17 -msgid "_Allow contact to see my status" -msgstr "הת_ר ל×יש קשר לר×ות ×ת המצב שלי" +msgid "_Allow him/her to see my status" +msgstr "_התר ל×יש קשר ×–×” לר×ות ×ת מצב־חיבורי" +# לר×ות +# שלה/שלו #: ../data/gui/contact_context_menu.ui.h:18 -msgid "A_sk to see contact status" -msgstr "_בקש להציג מצב ×יש קשר" +msgid "A_sk to see his/her status" +msgstr "_בקש להציג ×ת מצב־החיבור של ×יש קשר ×–×”" #: ../data/gui/contact_context_menu.ui.h:19 -msgid "_Forbid contact to see my status" -msgstr "_×ž× ×¢ מ×יש קשר מלר×ות ×ת המצב שלי" +msgid "_Forbid him/her to see my status" +msgstr "_×ž× ×¢ מ×יש קשר ×–×” מלר×ות ×ת מצב־חיבורי" #: ../data/gui/contact_context_menu.ui.h:21 -#: ../data/gui/gc_occupants_menu.ui.h:13 ../src/roster_window.py:5819 -#: ../src/roster_window.py:5944 ../src/roster_window.py:6074 +#: ../data/gui/gc_occupants_menu.ui.h:13 +#: ../src/roster_window.py:5871 +#: ../src/roster_window.py:5996 +#: ../src/roster_window.py:6126 msgid "_Block" msgstr "_חסו×" #: ../data/gui/contact_context_menu.ui.h:22 msgid "_Unignore" -msgstr "_בטל התעלמות" +msgstr "_×י־התעלמות" #: ../data/gui/contact_context_menu.ui.h:23 msgid "_Ignore" @@ -1075,8 +1160,9 @@ msgstr "הס_ר" #: ../data/gui/contact_context_menu.ui.h:26 #: ../data/gui/gc_control_popup_menu.ui.h:9 -#: ../data/gui/gc_occupants_menu.ui.h:15 ../data/gui/roster_window.ui.h:19 -#: ../src/roster_window.py:6145 +#: ../data/gui/gc_occupants_menu.ui.h:15 +#: ../data/gui/roster_window.ui.h:19 +#: ../src/roster_window.py:6197 msgid "_History" msgstr "_היסטוריה" @@ -1084,14 +1170,16 @@ msgstr "_היסטוריה" msgid "Room Configuration" msgstr "תצורת חדר" +# טופס #: ../data/gui/data_form_window.ui.h:2 msgid "Fill in the form." -msgstr "×ž×œ× ×ת הטופס." +msgstr "× × ×œ×ž×œ× ×ת ×”×ª×‘× ×™×ª." #: ../data/gui/edit_groups_dialog.ui.h:1 msgid "Edit Groups" msgstr "עריכת קבוצות" +# סשן E #: ../data/gui/esession_info_window.ui.h:1 msgid "(<b>ESession</b> info)" msgstr "(מידע <b>ESession</b>)" @@ -1106,7 +1194,7 @@ msgstr "×ª×›×•× ×•×ª" #: ../data/gui/features_window.ui.h:2 msgid "<b>List of possible features in Gajim:</b>" -msgstr "<b>רשימה של ×ª×›×•× ×•×ª ×פשריות בתוך Gajim:</b>" +msgstr "<b>רשימה של ×ª×›×•× ×•×ª ×פשריות ×צל Gajim:</b>" #: ../data/gui/filetransfers.ui.h:1 msgid "File Transfers" @@ -1135,19 +1223,15 @@ msgstr "הצג התר××” מוקפצת ×›×שר העברת קובץ הושלמה #: ../data/gui/filetransfers.ui.h:7 msgid "Removes completed, cancelled and failed file transfers from the list" -msgstr "הסרת העברות ×§×‘×¦×™× ×©×œ×ž×•×ª, מבוטלות וכושלות מתוך הרשימה" +msgstr "הסרת העברות ×§×‘×¦×™× ×©×œ×ž×•×ª, מבוטלות וכושלות מן הרשימה" #: ../data/gui/filetransfers.ui.h:8 msgid "Remove file transfer from the list." -msgstr "הסר העברת קובץ מתוך הרשימה." +msgstr "הסר העברת קובץ מן הרשימה." #: ../data/gui/filetransfers.ui.h:9 -msgid "" -"This action removes single file transfer from the list. If the transfer is " -"active, it is first stopped and then removed" -msgstr "" -"פעולה זו מסירה העברת קובץ בודדת מתוך הרשימה. במידה וההעברה פעילה, ×”×™× ×ª×™×¢×¦×¨ " -"תחילה ול×חר מכן ×”×™× ×ª×•×¡×¨" +msgid "This action removes single file transfer from the list. If the transfer is active, it is first stopped and then removed" +msgstr "פעולה זו מסירה העברת קובץ בודדת מן הרשימה. במידה וההעברה פעילה, ר×שית ×”×™× ×ª×™×¢×¦×¨ ול×חר מכן ×”×™× ×ª×•×¡×¨" #: ../data/gui/filetransfers.ui.h:10 msgid "Clean _up" @@ -1157,8 +1241,9 @@ msgstr "_× ×§×”" msgid "_Pause" msgstr "×”_שהה" +# Changed to: Cancels the selected file transfer and removes incomplete files (notice the letter s for plural in the second "file") #: ../data/gui/filetransfers.ui.h:12 -msgid "Cancels the selected file transfer and removes incomplete files" +msgid "Cancels the selected file transfer and removes incomplete file" msgstr "ביטול העברת הקובץ ×”× ×‘×—×¨ והסרת ×§×‘×¦×™× ×œ× ×©×œ×ž×™×" #: ../data/gui/filetransfers.ui.h:13 @@ -1169,6 +1254,7 @@ msgstr "ביטול העברת קובץ" msgid "Cancels the selected file transfer" msgstr "ביטול העברת קובץ ×”× ×‘×—×¨×ª" +# Hide window #: ../data/gui/filetransfers.ui.h:15 msgid "Hides the window" msgstr "הסתרת החלון" @@ -1177,10 +1263,11 @@ msgstr "הסתרת החלון" msgid "_Continue" msgstr "×”_משך" -#: ../data/gui/filetransfers.ui.h:17 ../src/chat_control.py:3351 +#: ../data/gui/filetransfers.ui.h:17 +#: ../src/chat_control.py:3256 #: ../src/filetransfers_window.py:213 msgid "_Open Containing Folder" -msgstr "_פתח תיקיה מכילה" +msgstr "_פתיחת תיקיה מכילה" #: ../data/gui/gajim_themes_window.ui.h:1 msgid "Account row" @@ -1218,17 +1305,19 @@ msgstr "_גופן תמליל:" msgid "Font style:" msgstr "×¡×’× ×•×Ÿ גופן:" -#: ../data/gui/gajim_themes_window.ui.h:10 ../src/chat_control.py:1045 +#: ../data/gui/gajim_themes_window.ui.h:10 +#: ../src/chat_control.py:1049 msgid "Bold" -msgstr "מובלט" +msgstr "מודגש" -#: ../data/gui/gajim_themes_window.ui.h:11 ../src/chat_control.py:1046 +#: ../data/gui/gajim_themes_window.ui.h:11 +#: ../src/chat_control.py:1050 msgid "Italic" msgstr "× ×˜×•×™" #: ../data/gui/gajim_themes_window.ui.h:12 msgid "Paused" -msgstr "השהיה" +msgstr "הופסקה" #: ../data/gui/gajim_themes_window.ui.h:13 msgid "Composing" @@ -1241,11 +1330,12 @@ msgstr "×œ× ×¤×¢×™×œ" # Chat-state? #: ../data/gui/gajim_themes_window.ui.h:15 msgid "<b>Chatstate Tab Colors</b>" -msgstr "<b>צבעי כרטיסייה מצב שיחה</b>" +msgstr "<b>צבעי ×œ×©×•× ×™×ª מצב שיחה</b>" +# × ×¢×–×‘ #: ../data/gui/gajim_themes_window.ui.h:16 msgid "Gone" -msgstr "× ×˜×™×©×”" +msgstr "עזוב" #: ../data/gui/gajim_themes_window.ui.h:17 msgid "" @@ -1265,7 +1355,7 @@ msgstr "" #: ../data/gui/gc_control_popup_menu.ui.h:1 msgid "Change _Nickname..." -msgstr "×©×™× ×•×™ ×©× _×›×™× ×•×™..." +msgstr "×©× ×” ×©× _×›×™× ×•×™..." #: ../data/gui/gc_control_popup_menu.ui.h:2 msgid "_Manage Room" @@ -1273,11 +1363,11 @@ msgstr "× ×”×œ _חדר" #: ../data/gui/gc_control_popup_menu.ui.h:3 msgid "Change _Subject..." -msgstr "×©×™× ×•×™ _× ×•×©×..." +msgstr "×©× ×” _× ×•×©×..." #: ../data/gui/gc_control_popup_menu.ui.h:4 msgid "Configure _Room..." -msgstr "×”_גדרת חדר..." +msgstr "×”_גדר חדר..." #: ../data/gui/gc_control_popup_menu.ui.h:5 msgid "_Destroy Room" @@ -1287,11 +1377,16 @@ msgstr "×”_חרב חדר" msgid "_Minimize on close" msgstr "_מזער בעת סגירה" +# שליחת בקשה ל +# השמעת קולי +# השמעתי +# ×œ×”×ª×‘×˜× #: ../data/gui/gc_control_popup_menu.ui.h:7 msgid "_Request Voice" -msgstr "_בקש ביטוי" +msgstr "_בקש/×™ שקולך ישמע" -#: ../data/gui/gc_control_popup_menu.ui.h:8 ../src/disco.py:1843 +#: ../data/gui/gc_control_popup_menu.ui.h:8 +#: ../src/disco.py:1799 msgid "_Bookmark" msgstr "_סמן" @@ -1303,13 +1398,16 @@ msgstr "_שלח הודעה פרטית" msgid "Send _File" msgstr "שלח _קובץ" +# Other word for Occupant (please) +# FOUND! Attendee #: ../data/gui/gc_occupants_menu.ui.h:3 msgid "Occupant Actions" msgstr "פעולות × ×•×›×—" +# _קול #: ../data/gui/gc_occupants_menu.ui.h:4 msgid "_Voice" -msgstr "×”_שמע" +msgstr "×”_שמעה" #: ../data/gui/gc_occupants_menu.ui.h:5 msgid "Mo_derator" @@ -1329,28 +1427,26 @@ msgstr "_בעלי×" #: ../data/gui/gc_occupants_menu.ui.h:9 msgid "_Kick" -msgstr "ב_עט" +msgstr "ב_עיטה" +# ×_סירה #: ../data/gui/gc_occupants_menu.ui.h:10 msgid "_Ban" -msgstr "×_סור" +msgstr "×—_סימה" #: ../data/gui/gc_occupants_menu.ui.h:12 msgid "_Add to Roster" -msgstr "הו_סף ×ל רשימה" - -#: ../data/gui/groupchat_control.ui.h:2 ../src/chat_control.py:1723 -msgid "Show a list of formattings" -msgstr "הצגת רשימת עיצובי×" +msgstr "הו_ספה ×ל הרשימה" #: ../data/gui/groupchat_control.ui.h:3 msgid "Change your nickname (Ctrl+N)" -msgstr "×©×™× ×•×™ ×©× ×›×™× ×•×™ (Ctrl+N)" +msgstr "×©×™× ×•×™ ×©× ×›×™× ×•×™×™×š (Ctrl+N)" #: ../data/gui/groupchat_control.ui.h:4 msgid "Change the room's subject (Alt+T)" msgstr "×©×™× ×•×™ ×”× ×•×©× ×©×œ חדר ×–×” (Alt+T)" +# הוספת חדר ×–×” ×ל ×”×¡×™×ž× ×™×•×ª #: ../data/gui/groupchat_control.ui.h:5 msgid "Bookmark this room (Ctrl+B)" msgstr "סימון חדר ×–×” (Ctrl+B)" @@ -1378,7 +1474,6 @@ msgid "<big><b>Welcome to Gajim History Logs Manager</b></big>" msgstr "<big><b>ברוך בו×ך ×ל ×ž× ×”×œ רשומות ההיסטוריה של Gajim</b></big>" # BUG: or is better than and/or -# ××™× ×• מהווה כלי לש×/לצורך צפיה #: ../data/gui/history_manager.ui.h:3 msgid "" "This log manager is not intended for log viewing. If you are looking for " @@ -1387,12 +1482,11 @@ msgid "" "Use this program to delete or export logs. You can select logs from the left " "and/or search database from below." msgstr "" -"×ž× ×”×œ רשומות ×–×” ××™× ×• מיועד לצורך צפייה ברשומות. ×× ×¨×¦×•× ×š בתפקודיות שכזו, " -"לרשותך עומד חלון ההיסטוריה במקו×.\n" +"×ž× ×”×œ רשומות ×–×” ××™× ×• מיועד עבור צפיה ברשומות. ×× ×¨×¦×•× ×š בתפקודיות שכזו, לרשותך עומד חלון ההיסטוריה במקו×.\n" "\n" -"ב×פשרותך לעשות שימוש ×‘×ª×•×›× ×™×ª זו למחיקה ו/×ו ×œ×™×™×¦×•× ×¨×©×•×ž×•×ª. ב×פשרותך לבחור " -"רשומות מימין ו/×ו לחפש בתוך מסד ×”× ×ª×•× ×™× ×œ×ž×˜×”." +"ב×פשרותך לעשות שימוש ×‘×ª×•×›× ×™×ª זו למחיקה ×ו ×œ×™×™×¦×•× ×¨×©×•×ž×•×ª. ביכולתך לבחור רשומות מימין ו/×ו לחפש במסד ×”× ×ª×•× ×™× ×œ×ž×˜×”." +# BUG: הפסקה צרה יותר מן המקורי #: ../data/gui/history_manager.ui.h:6 msgid "" "<b>WARNING:</b>\n" @@ -1400,16 +1494,15 @@ msgid "" "Generally avoid deletions with contacts you currently chat with." msgstr "" "<b>×זהרה:</b>\n" -"×× ×‘×›×•×•× ×ª×š לבצע מחיקה ×‘×§× ×” מידה גדול, ×× × ×•×“× ×›×™ Gajim ××™× ×• מורץ. ב×ופן כללי " -"מוטב ×œ×”×™×ž× ×¢ ממחיקות ×¢× ×× ×©×™ קשר ×שר ×ž×©×•×—×—×™× ×¢×ž×š כעת." +"×× ×‘×›×•×•× ×ª×š לבצע מחיקה ×‘×§× ×” מידה גדול, × × ×œ×•×•×“× ×©×”×™×™×©×•× Gajim ××™× ×• מורץ. ב×ופן כללי מוטב ×œ×”×™×ž× ×¢ ממחיקות ×¢× ×× ×©×™ קשר ×©×ž×©×•×—×—×™× ×¢×ž×š כעת." #: ../data/gui/history_manager.ui.h:8 msgid "_Search Database" -msgstr "_חפש בתוך מסד × ×ª×•× ×™×" +msgstr "_חיפוש במסד × ×ª×•× ×™×" #: ../data/gui/history_manager.ui.h:9 msgid "Export" -msgstr "יצ×" +msgstr "יצו×" #: ../data/gui/history_window.ui.h:1 msgid "Enter JID or Contact name" @@ -1423,7 +1516,8 @@ msgstr "היסטוריות שיחת קבוצה" msgid "All Chat Histories" msgstr "כל היסטוריות שיחה" -#: ../data/gui/history_window.ui.h:4 ../src/history_window.py:326 +#: ../data/gui/history_window.ui.h:4 +#: ../src/history_window.py:324 msgid "Conversation History" msgstr "היסטוריית שיחה" @@ -1431,29 +1525,27 @@ msgstr "היסטוריית שיחה" msgid "Search:" msgstr "חיפוש:" -# ×™×•× _× ×‘×—×¨ #: ../data/gui/history_window.ui.h:6 msgid "_In date search" -msgstr "חפש בתוך _ת×ריך" +msgstr "חיפוש _בת×ריך" #: ../data/gui/history_window.ui.h:7 -msgid "Searching only in the selected day " -msgstr "חיפוש בתוך ×”×™×•× ×”× ×‘×—×¨ בלבד" +msgid "searching only in the selected day " +msgstr "חיפוש ×‘×™×•× ×”× ×‘×—×¨ בלבד" #: ../data/gui/history_window.ui.h:8 #: ../data/gui/zeroconf_information_window.ui.h:5 msgid "_Log conversation history" msgstr "_×¨×©×•× ×”×™×¡×˜×•×¨×™×™×ª שיחה" -#: ../data/gui/history_window.ui.h:9 -msgid "_Show status changes" -msgstr "הצג _הודעות מצב" - +# פג, × ×¤×§×¢ #: ../data/gui/item_archiving_preferences_window.ui.h:1 +#, fuzzy msgid "expire" -msgstr "פוקעת" +msgstr "פגה" #: ../data/gui/item_archiving_preferences_window.ui.h:2 +#, fuzzy msgid "save" msgstr "שמור" @@ -1463,55 +1555,74 @@ msgstr "" # gajim-remote #: ../data/gui/item_archiving_preferences_window.ui.h:4 -#: ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:229 msgid "jid" msgstr "" #: ../data/gui/item_archiving_preferences_window.ui.h:5 +#, fuzzy msgid "body" msgstr "גוף" #: ../data/gui/item_archiving_preferences_window.ui.h:6 +#, fuzzy msgid "false" -msgstr "שוו×" +msgstr "false" +# gajim-remote #: ../data/gui/item_archiving_preferences_window.ui.h:7 +#: ../src/gajim-remote.py:110 +#: ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:144 +#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 +#: ../src/gajim-remote.py:282 +#, fuzzy msgid "message" msgstr "הודעה" #: ../data/gui/item_archiving_preferences_window.ui.h:8 +#, fuzzy msgid "stream" msgstr "זר×" #: ../data/gui/item_archiving_preferences_window.ui.h:9 +#, fuzzy msgid "approve" msgstr "×שר" #: ../data/gui/item_archiving_preferences_window.ui.h:10 +#, fuzzy msgid "concede" msgstr "וותר" #: ../data/gui/item_archiving_preferences_window.ui.h:11 +#, fuzzy msgid "forbid" msgstr "×סור" # ×œ×”×™×ž× ×¢ # conflict? #: ../data/gui/item_archiving_preferences_window.ui.h:12 +#, fuzzy msgid "oppose" msgstr "×”×ª× ×’×“" #: ../data/gui/item_archiving_preferences_window.ui.h:13 +#, fuzzy msgid "prefer" msgstr "העדף" +# × ×“×¨×© #: ../data/gui/item_archiving_preferences_window.ui.h:14 +#, fuzzy msgid "require" msgstr "דרוש" -#: ../data/gui/join_groupchat_window.ui.h:1 ../src/dialogs.py:2416 +#: ../data/gui/join_groupchat_window.ui.h:1 +#: ../src/dialogs.py:2372 msgid "Join Group Chat" -msgstr "הצטרף ×ל שיחת קבוצה" +msgstr "הצטרפות ×ל שיחת קבוצה" #: ../data/gui/join_groupchat_window.ui.h:2 msgid "Room:" @@ -1532,15 +1643,18 @@ msgstr "××—×¨×•× ×™×:" msgid "Password:" msgstr "סיסמה:" +# ×›×שר ×× ×™ מתחבר #: ../data/gui/join_groupchat_window.ui.h:6 msgid "Join this room _automatically when I connect" msgstr "הצטרף ×ל חדר ×–×” ב×ופן _×וטומטי בעת התחברותי" +# Translated to: Create a bookmark for this room #: ../data/gui/join_groupchat_window.ui.h:8 msgid "_Bookmark this room" msgstr "_סמן ×ת חדר ×–×”" -#: ../data/gui/join_groupchat_window.ui.h:9 ../src/config.py:1857 +#: ../data/gui/join_groupchat_window.ui.h:9 +#: ../src/config.py:1852 msgid "Server:" msgstr "שרת:" @@ -1548,8 +1662,10 @@ msgstr "שרת:" msgid "Bro_wse Rooms" msgstr "_עיון ברשימת חדרי×" -#: ../data/gui/join_groupchat_window.ui.h:11 ../src/chat_control.py:3386 -#: ../src/disco.py:1396 ../src/disco.py:1847 +#: ../data/gui/join_groupchat_window.ui.h:11 +#: ../src/chat_control.py:3291 +#: ../src/disco.py:1360 +#: ../src/disco.py:1803 msgid "_Join" msgstr "_×›× ×¡" @@ -1572,7 +1688,7 @@ msgstr "×”_דפס מצב:" #: ../data/gui/manage_bookmarks_window.ui.h:8 msgid "A_uto join" -msgstr "×”_צטרף ×וטומטית" +msgstr "×”_צטרפות ×וטומטית" # BUG: a dot at the end # ×תחול @@ -1606,7 +1722,7 @@ msgstr "" #: ../data/gui/manage_proxies_window.ui.h:4 msgid "Manage Proxy Profiles" -msgstr "× ×™×”×•×œ ×“×™×•×§× ×™ Proxy" +msgstr "× ×™×”×•×œ ×“×™×•×§× ×™ פרוקסי" #: ../data/gui/manage_proxies_window.ui.h:5 msgid "_Type:" @@ -1622,16 +1738,16 @@ msgstr "<b>מ××¤×™×™× ×™×</b>" #: ../data/gui/manage_proxies_window.ui.h:8 msgid "Use HTTP prox_y" -msgstr "השתמש בציר _HTTP" +msgstr "השתמש במתווך _HTTP" # כתובת _BOSH: #: ../data/gui/manage_proxies_window.ui.h:9 msgid "_BOSH URL:" -msgstr "â€_BOSH URL:" +msgstr "‫_BOSH URL:" #: ../data/gui/manage_proxies_window.ui.h:10 msgid "Use proxy auth_entication" -msgstr "השתמש ב×ימות _ציר" +msgstr "השתמש ב×ימות מ_תווך" #: ../data/gui/manage_proxies_window.ui.h:11 msgid "_Username:" @@ -1643,26 +1759,22 @@ msgstr "ס_יסמה:" #: ../data/gui/manage_proxies_window.ui.h:13 msgid "Proxy _Host:" -msgstr "מ_×רח ציר:" +msgstr "מ_×רח מתווך:" #: ../data/gui/manage_proxies_window.ui.h:14 msgid "Proxy _Port:" -msgstr "פו_רט ציר:" +msgstr "פו_רט מתווך:" #: ../data/gui/manage_proxies_window.ui.h:15 msgid "<b>Settings</b>" msgstr "<b>הגדרות</b>" -#: ../data/gui/manage_sounds_window.ui.h:1 -msgid "Manage sounds" -msgstr "× ×™×”×•×œ צלילי×" - # צירוף־מעבר # משפט/צירוף # ×ישור/מעבר/מפתח #: ../data/gui/passphrase_dialog.ui.h:1 msgid "Passphrase" -msgstr "מימרת סיסמה" +msgstr "מימרת־סיסמה" #: ../data/gui/plugins_window.ui.h:1 msgid "Plugins" @@ -1670,8 +1782,9 @@ msgstr "תוספות" #: ../data/gui/plugins_window.ui.h:2 msgid "Install from zip" -msgstr "התקן מתוך ×רכיון zip" +msgstr "×”×ª×§× ×” מתוך ×רכיון zip" +# ריק מתוכן #: ../data/gui/plugins_window.ui.h:3 msgid "<empty>" msgstr "<ריק>" @@ -1701,6 +1814,7 @@ msgstr "כתובת עמוד בית" msgid "Description:" msgstr "תי×ור:" +# ××™Ö¾×”×ª×§× ×” #: ../data/gui/plugins_window.ui.h:10 msgid "Uninstall" msgstr "הסרה" @@ -1723,7 +1837,7 @@ msgstr "" #: ../data/gui/popup_notification_window.ui.h:1 msgid "Event Type" -msgstr "טיפוס ×ירוע" +msgstr "סוג ×ירוע" #: ../data/gui/popup_notification_window.ui.h:2 msgid "Event desc" @@ -1731,12 +1845,13 @@ msgstr "תי×ור ×ירוע" #: ../data/gui/preferences_window.ui.h:1 msgid "Use default applications" -msgstr "השתמש ×‘×™×™×©×•×ž×™× ×ž×©×ª×ž×˜×™×" +msgstr "שימוש ×‘×™×™×©×•×ž×™× ×ž×©×ª×ž×˜×™×" #: ../data/gui/preferences_window.ui.h:2 msgid "Custom" msgstr "מות××" +# In any/every chat state #: ../data/gui/preferences_window.ui.h:3 msgid "All chat states" msgstr "בכל מצב שיחה" @@ -1745,8 +1860,10 @@ msgstr "בכל מצב שיחה" msgid "Composing only" msgstr "×”×œ×—× ×” בלבד" -#: ../data/gui/preferences_window.ui.h:5 ../src/config.py:164 -#: ../src/config.py:677 +# (ההעדפה) ×ž× ×•×˜×¨×œ×ª +#: ../data/gui/preferences_window.ui.h:5 +#: ../src/config.py:173 +#: ../src/config.py:689 msgid "Disabled" msgstr "×ž× ×•×˜×¨×œ×ª" @@ -1762,6 +1879,7 @@ msgstr "רק ×›×שר ×§×™×™×ž×™× ××™×¨×•×¢×™× ×ž×ž×ª×™× ×™×" msgid "Always" msgstr "תמיד" +# הקפץ ×–×ת #: ../data/gui/preferences_window.ui.h:9 msgid "Pop it up" msgstr "הצג התר××” מוקפצת" @@ -1786,6 +1904,7 @@ msgstr "רשימה ×ž× ×•×ª×§×ª ×¢× ×©×™×—×” יחידה" msgid "Single window for everything" msgstr "חלון בודד עבור כל ×”×—×œ×•× ×•×ª" +# × ×™×ª×•×§ רשימה #: ../data/gui/preferences_window.ui.h:15 msgid "Detached roster with chat grouped by account" msgstr "רשימה ×ž× ×•×ª×§×ª ×¢× ×©×™×—×•×ª מ×וגדות לפי חשבון" @@ -1809,12 +1928,8 @@ msgstr "הצג _×ווט××¨×™× ×©×œ ×× ×©×™ קשר ברשימה" # BUG: a dot at the end #: ../data/gui/preferences_window.ui.h:20 -msgid "" -"If checked, Gajim will display avatars of contacts in roster window and in " -"group chats" -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יציג ×ווט××¨×™× ×©×œ ×× ×©×™ קשר בחלון הרשימה ובתוך " -"שיחות קבוצה" +msgid "If checked, Gajim will display avatars of contacts in roster window and in group chats" +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יציג ×ווט××¨×™× ×©×œ ×× ×©×™ קשר בחלון הרשימה ובשיחות קבוצה" #: ../data/gui/preferences_window.ui.h:21 msgid "Display status _messages of contacts in roster" @@ -1823,16 +1938,13 @@ msgstr "הצג הו_דעות מצב של ×× ×©×™ קשר ברשימה" # BUG: a dot at the end # BUG: under [the] contact - remove "the" #: ../data/gui/preferences_window.ui.h:22 -msgid "" -"If checked, Gajim will display status messages of contacts under the contact " -"name in roster window and in group chats" -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יציג ×ת הודעות המצב של ×× ×©×™ קשר תחת ×©× ×יש " -"קשר בתוך חלון הרשימה ×•×’× ×‘×ª×•×š שיחות קבוצה" +msgid "If checked, Gajim will display status messages of contacts under the contact name in roster window and in group chats" +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יציג ×ת הודעות המצב של ×× ×©×™ קשר תחת ×©× ×יש קשר בחלון הרשימה ובשיחות קבוצה" +# מ_צבי הרוח #: ../data/gui/preferences_window.ui.h:23 -msgid "Display e_xtra information of contacts in roster (mood, activity, ...)" -msgstr "הצג _מידע × ×•×¡×£ של ×× ×©×™ קשר ברשימה (מצב רוח, פעילות, ...)" +msgid "Display m_ood of contacts in roster" +msgstr "הצג מצ_בי רוח של ×× ×©×™ קשר ברשימה" # BUG: a dot at the end #: ../data/gui/preferences_window.ui.h:24 @@ -1841,245 +1953,248 @@ msgid "" msgstr "" "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יציג ×ת מצבי הרוח של ×× ×©×™ קשר בחלון הרשימה" +# Changed "activity" with "activities" +# שברשימה #: ../data/gui/preferences_window.ui.h:25 -msgid "Sort contacts by status" -msgstr "מיין ×× ×©×™ קשר לפי מצב חיבור" +msgid "Display _activity of contacts in roster" +msgstr "הצג _פעילויות של ×× ×©×™ קשר ברשימה" +# BUG: a dot at the end #: ../data/gui/preferences_window.ui.h:26 -msgid "in _roster" -msgstr "בתוך _רשימה" +msgid "If checked, Gajim will display the activity of contacts in the roster window" +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יציג ×ת הפעילויות של ×× ×©×™ קשר בחלון הרשימה" +# × ×¢×™×ž×•×ª, לחן, ×ž× ×’×™× ×” #: ../data/gui/preferences_window.ui.h:27 -msgid "in _group chats" -msgstr "בתוך _שיחות קבוצה" +msgid "Display _tunes of contacts in roster" +msgstr "הצג לח_× ×™× ×©×œ ×× ×©×™ קשר ברשימה" +# BUG: a dot at the end #: ../data/gui/preferences_window.ui.h:28 -msgid "<b>Roster Appearance</b>" -msgstr "<b>הופעת רשימה</b>" +msgid "If checked, Gajim will display the tunes of contacts in the roster window" +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יציג ×ת ×”×œ×—× ×™× ×©×œ ×× ×©×™ קשר בחלון הרשימה" +# Changed "location" with "locations" #: ../data/gui/preferences_window.ui.h:29 +msgid "Display _location of contacts in roster" +msgstr "הצג _×ž×™×§×•×ž×™× ×©×œ ×× ×©×™ קשר ברשימה" + +# BUG: a dot at the end +#: ../data/gui/preferences_window.ui.h:30 +msgid "If checked, Gajim will display the location of contacts in the roster window" +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יציג ×ת ×”×ž×™×§×•×ž×™× ×©×œ ×× ×©×™ קשר בחלון הרשימה" + +# מיון +#: ../data/gui/preferences_window.ui.h:31 +msgid "Sort contacts by status" +msgstr "סדר ×× ×©×™ קשר לפי מצב־חיבור" + +#: ../data/gui/preferences_window.ui.h:32 +msgid "in _roster" +msgstr "ב_רשימה" + +#: ../data/gui/preferences_window.ui.h:33 +msgid "in _group chats" +msgstr "ב_שיחות קבוצה" + +# <b>Roster Display</b> +#: ../data/gui/preferences_window.ui.h:34 +msgid "<b>Roster Appearance</b>" +msgstr "<b>מר××” רשימה</b>" + +#: ../data/gui/preferences_window.ui.h:35 msgid "_Window behavior:" msgstr "×”×ª× ×”×’×•×ª _×—×œ×•× ×•×ª:" # תרשימיי×, × ×™×™×—×™× -#: ../data/gui/preferences_window.ui.h:30 -msgid "" -"If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " -"animated or static graphical emoticons" -msgstr "" -"במידה ו×פשרות זו ×œ× ×ž× ×•×˜×¨×œ×ª, Gajim יחליף ×¡×ž×™×™×œ×™× ×שר ×ž×•×¨×›×‘×™× ×ž×ª×•×•×™ ascii " -"כגון ':)' ×¢× ×¨×’×©×•× ×™× ×¦×™×•×¨×™×™× ×ª×•××ž×™× (×ž×•× ×¤×©×™× ×ו סטטיי×)" +#: ../data/gui/preferences_window.ui.h:36 +msgid "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons" +msgstr "במידה ו×פשרות זו ×œ× ×ž× ×•×˜×¨×œ×ª, Gajim יחליף ×¡×ž×™×™×œ×™× ×”×ž×•×¨×›×‘×™× ×ž×ª×•×•×™ ascii כגון ':)' ×¢× ×¨×’×©×•× ×™× ×¦×™×•×¨×™×™× ×ª×•××ž×™× (×ž×•× ×¤×©×™× ×ו סטטיי×)" -#: ../data/gui/preferences_window.ui.h:31 +#: ../data/gui/preferences_window.ui.h:37 msgid "_Emoticons:" msgstr "_×¨×’×©×•× ×™×:" -#: ../data/gui/preferences_window.ui.h:32 +# דחוסי×, ×ž×§×•×¦×¨×™× +#: ../data/gui/preferences_window.ui.h:38 msgid "Ma_ke message windows compact" msgstr "השתמש ×‘×—×œ×•× ×•×ª שיחה צ_פופי×" -#: ../data/gui/preferences_window.ui.h:33 +#: ../data/gui/preferences_window.ui.h:39 msgid "Hide all buttons in chat windows" msgstr "הסתרת כל ×”×œ×—×¦× ×™× ×‘×—×œ×•× ×•×ª שיחה" -#: ../data/gui/preferences_window.ui.h:34 +# ×¢× ×¢×™×¦×•×‘×™× +# ×¢× ×ª×‘× ×™×ª טקסט עשירה +#: ../data/gui/preferences_window.ui.h:40 msgid "_Ignore rich content in incoming messages" msgstr "הת_×¢×œ× ×ž×Ÿ תוכן עשיר בהודעות × ×›× ×¡×•×ª" # הודעות מסוימות עשויות להכיל -#: ../data/gui/preferences_window.ui.h:35 -msgid "" -"Some messages may include rich content (formatting, colors etc). If checked, " -"Gajim will just display the raw message text." -msgstr "" -"ייתכן ×›×™ הודעות מסוימות יכילו תוכן עשיר (עיצוב, ×¦×‘×¢×™× ×•×›×•×³). במידה ו×פשרות " -"זו ×ž×¡×•×ž× ×ª, Gajim יציג רק ×ת התמליל הגולמי ×שר מצוי בהודעה." +#: ../data/gui/preferences_window.ui.h:41 +msgid "Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text." +msgstr "ייתכן שהודעות מסוימות יכילו תוכן עשיר (עיצוב, ×¦×‘×¢×™× ×•×›×•×³). במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יציג רק ×ת התמליל הגולמי שבהודעה." -#: ../data/gui/preferences_window.ui.h:36 +#: ../data/gui/preferences_window.ui.h:42 msgid "_Highlight misspelled words" msgstr "הדגש שגי×ות _כתיב" -#: ../data/gui/preferences_window.ui.h:37 -msgid "" -"If checked, Gajim will highlight spelling errors in input fields of chat " -"windows. If no language is explicitly set via right click on the input " -"field, the default language will be used for this contact or group chat." -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יבליט שגי×ות כתיב בשדות קלט של ×—×œ×•× ×•×ª שיחה. " -"במידה ×•×œ× ×¦×•×™× ×” במפורש ב×מצעות מקש ×™×ž× ×™ על שדה הקלט, השפה המשתמטת תהיה " -"בשימוש עבור ×יש קשר ×–×” ×ו שיחת קבוצה." +# הוגדרה +#: ../data/gui/preferences_window.ui.h:43 +msgid "If checked, Gajim will highlight spelling errors in input fields of chat windows. If no language is explicitly set via right click on the input field, the default language will be used for this contact or group chat." +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יבליט שגי×ות כתיב בשדות קלט של ×—×œ×•× ×•×ª שיחה. במידה ×•×œ× ×¦×•×™× ×” במפורש ב×מצעות מקש ×™×ž× ×™ על שדה הקלט, השפה המשתמטת תהיה בשימוש עבור ×יש קשר ×–×” ×ו שיחת קבוצה." -#: ../data/gui/preferences_window.ui.h:38 +#: ../data/gui/preferences_window.ui.h:44 msgid "_Show roster on startup:" msgstr "×”_צג רשימה בעת הפעלה:" -#: ../data/gui/preferences_window.ui.h:39 -msgid "Show icon when your messages are received" -msgstr "הצג צלמית ×›×שר הודעותיך מתקבלות" - -#: ../data/gui/preferences_window.ui.h:40 +#: ../data/gui/preferences_window.ui.h:45 msgid "<b>Chat Appearance</b>" -msgstr "<b>הופעת שיחה</b>" +msgstr "<b>מר××” שיחה</b>" -#: ../data/gui/preferences_window.ui.h:42 +#: ../data/gui/preferences_window.ui.h:47 msgid "When new event is received:" msgstr "×›×שר ×ירוע חדש מתקבל:" -#: ../data/gui/preferences_window.ui.h:43 +#: ../data/gui/preferences_window.ui.h:48 msgid "Notify me about contacts that sign _in" -msgstr "הודע לי ×ודות ×× ×©×™ קשר ×שר מת_חברי×" +msgstr "הודע לי ×ודות ×× ×©×™ קשר שמת_חברי×" -#: ../data/gui/preferences_window.ui.h:44 +#: ../data/gui/preferences_window.ui.h:49 msgid "Notify me about contacts that sign _out" -msgstr "הודע לי ×ודות ×× ×©×™ קשר ×שר מת_× ×ª×§×™×" +msgstr "הודע לי ×ודות ×× ×©×™ קשר שמת_× ×ª×§×™×" -#: ../data/gui/preferences_window.ui.h:45 -msgid "" -"Gajim will notify you via a popup window in the bottom right of the screen " -"about contacts that just signed out" -msgstr "" -"â€Gajim יידע ×ותך ב×מצעות חלון מוקפץ בצד ×”×™×ž× ×™ התחתון של המסך, ×ודות ×× ×©×™ קשר " -"×שר ×”×ª× ×ª×§×• ×–×” עתה" +# signed out +# יידעך +# ×©×”×ª× ×ª×§×• ×–×” עתה +#: ../data/gui/preferences_window.ui.h:50 +msgid "Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed out" +msgstr "‫Gajim יידע ×ותך ב×מצעות חלון מוקפץ בצד ×”×™×ž× ×™ התחתון של המסך, ×ודות ×× ×©×™ קשר שזה עתה ×”×ª× ×ª×§×•" -#: ../data/gui/preferences_window.ui.h:46 +#: ../data/gui/preferences_window.ui.h:51 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "התר התר×ות מוקפצות ×›×שר ×× ×™ במצב × ×¢×“×¨/_×œ× ×–×ž×™×Ÿ/עסוק/בלתי × ×¨××”" -#: ../data/gui/preferences_window.ui.h:47 +# הודע לי +#: ../data/gui/preferences_window.ui.h:52 msgid "Notify on new _GMail email" -msgstr "הודע על _דו×״ל GMail חדש" +msgstr "הודע ×ודות _דו×״ל GMail" # BUG: a dot at the end # דרך -#: ../data/gui/preferences_window.ui.h:48 -msgid "" -"If checked, Gajim will show a notification when a new e-mail is received via " -"GMail" -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יציג התר××” ×›×שר דו×״ל חדש מתקבל דרך GMail" +#: ../data/gui/preferences_window.ui.h:53 +msgid "If checked, Gajim will show a notification when a new e-mail is received via GMail" +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יציג התר××” ×›×שר דו×״ל חדש מתקבל ב×מצעות GMail" -#: ../data/gui/preferences_window.ui.h:49 +# Does extra means special? +#: ../data/gui/preferences_window.ui.h:54 msgid "Display _extra email details" msgstr "הצג _פרטי דו×״ל × ×•×¡×¤×™×" # BUG: a dot at the end -#: ../data/gui/preferences_window.ui.h:50 -msgid "" -"If checked, Gajim will also include information about the sender of new " -"emails" -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יכיל ×’× ×ž×™×“×¢ ×ודות הממען של ההודעות " -"×”××œ×§×˜×¨×•× ×™×•×ª החדשות." +# BUG: of the new emails > of new emails +#: ../data/gui/preferences_window.ui.h:55 +msgid "If checked, Gajim will also include information about the sender of the new emails" +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יכיל ×’× ×ž×™×“×¢ ×ודות הממען של ההוד×ות ×”××œ×§×˜×¨×•× ×™×•×ª החדשות." -#: ../data/gui/preferences_window.ui.h:51 +#: ../data/gui/preferences_window.ui.h:56 msgid "<b>GMail Options</b>" msgstr "<b>×פשרויות GMail</b>" -#: ../data/gui/preferences_window.ui.h:52 +#: ../data/gui/preferences_window.ui.h:57 msgid "Show notification area icon:" msgstr "הצג צלמית ×זור התר××”:" -#: ../data/gui/preferences_window.ui.h:53 +#: ../data/gui/preferences_window.ui.h:58 msgid "<b>Visual Notifications</b>" msgstr "<b>התר×ות חזותיות</b>" -#: ../data/gui/preferences_window.ui.h:54 +#: ../data/gui/preferences_window.ui.h:59 msgid "Play _sounds" msgstr "× ×’×Ÿ _צלילי×" -#: ../data/gui/preferences_window.ui.h:55 +# Manage sound events +# × ×™×”×•×œ _×ירועי צליל... +#: ../data/gui/preferences_window.ui.h:60 msgid "Ma_nage..." -msgstr " × ×™×”×•_ל... " +msgstr " × ×”_ל... " # בהיותי -#: ../data/gui/preferences_window.ui.h:56 +#: ../data/gui/preferences_window.ui.h:61 msgid "Allow sound when I'm _busy" msgstr "התר ×¦×œ×™×œ×™× ×›×שר ×× ×™ במצב _עסוק" -#: ../data/gui/preferences_window.ui.h:57 +#: ../data/gui/preferences_window.ui.h:62 msgid "<b>Sounds</b>" msgstr "<b>צלילי×</b>" -#: ../data/gui/preferences_window.ui.h:58 +#: ../data/gui/preferences_window.ui.h:63 msgid "Notifications" msgstr "התר×ות" -#: ../data/gui/preferences_window.ui.h:59 -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 לשלוח ולקבל מידע-מוצמד (meta-information) הקשור ×ל דיון ×שר " -"עשוי להיות לך ×¢× ×יש קשר. ×›×ן × ×ª×•× ×” לך ×”×פשרות לציין ×ילו מצבי שיחה ×‘×¨×¦×•× ×š " -"להציג בחלון שיחה." +#: ../data/gui/preferences_window.ui.h:64 +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 לשלוח ולקבל מידע-מוצמד (meta-information) הקשור ×ל דיון שעשוי להיות לך ×¢× ×יש קשר. ×›×ן × ×ª×•× ×” לך היכולת לציין ×ילו מצבי שיחה ×‘×¨×¦×•× ×š להציג בחלון שיחה." -#: ../data/gui/preferences_window.ui.h:60 +#: ../data/gui/preferences_window.ui.h:65 msgid "_Display chat state notifications:" msgstr "×”_צג התר×ות מצב שיחה:" -#: ../data/gui/preferences_window.ui.h:61 -msgid "" -"Gajim can send and receive meta-information related to a conversation you " -"may have with a contact. Here you can specify which chatstates you want to " -"send to the other party." -msgstr "" -"ביכולתו של Gajim לשלוח ולקבל מידע-מוצמד (meta-information) הקשור ×ל דיון ×שר " -"עשוי להיות לך ×¢× ×יש קשר. ×›×ן × ×ª×•× ×” לך ×”×פשרות לציין ×ילו מצבי שיחה ×‘×¨×¦×•× ×š " -"לשלוח ×ל הקצה ×”×חר." +# ×ל הקצה ×”×חר +#: ../data/gui/preferences_window.ui.h:66 +msgid "Gajim can send and receive meta-information related to a conversation you may have with a contact. Here you can specify which chatstates you want to send to the other party." +msgstr "ביכולתו של Gajim לשלוח ולקבל מידע-מוצמד (meta-information) הקשור ×ל דיון שעשוי להיות לך ×¢× ×יש קשר. ×›×ן × ×ª×•× ×” לך היכולת לציין ×ילו מצבי שיחה ×‘×¨×¦×•× ×š לשלוח ×ל הצד ×”×חר." -#: ../data/gui/preferences_window.ui.h:62 +#: ../data/gui/preferences_window.ui.h:67 msgid "_Send chat state notifications:" msgstr "_שלח התר×ות מצב שיחה:" -#: ../data/gui/preferences_window.ui.h:63 +#: ../data/gui/preferences_window.ui.h:68 msgid "<b>Chat state notifications</b>" msgstr "<b>התר×ות מצב שיחה</b>" -#: ../data/gui/preferences_window.ui.h:64 +#: ../data/gui/preferences_window.ui.h:69 msgid "Personal Events" msgstr "××™×¨×•×¢×™× ×ישיי×" -#: ../data/gui/preferences_window.ui.h:65 +#: ../data/gui/preferences_window.ui.h:70 msgid "_Away after:" msgstr "× _עדר כעבור:" -#: ../data/gui/preferences_window.ui.h:66 -msgid "" -"If checked, Gajim will change status to Away when the computer is unused." -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim ×™×©× ×” מצב ×ל × ×¢×“×¨ ×›×שר המחשב ×œ× ×ž×¦×•×™ בשימוש." +#: ../data/gui/preferences_window.ui.h:71 +msgid "If checked, Gajim will change status to Away when the computer is unused." +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim ×™×©× ×” מצב ×ל × ×¢×“×¨ ×›×שר המחשב ×œ× ×ž×¦×•×™ בשימוש." -#: ../data/gui/preferences_window.ui.h:67 +#: ../data/gui/preferences_window.ui.h:72 msgid "_Not available after:" msgstr "×œ× _זמין כעבור:" # BUG: a dot at the end -#: ../data/gui/preferences_window.ui.h:68 -msgid "" -"If checked, Gajim will change status to Not Available when the computer has " -"not been used even longer" -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim ×™×©× ×” מצב ×ל ×œ× ×–×ž×™×Ÿ ×›×שר המחשב ×œ× ×ž×¦×•×™ בשימוש " -"לזמן ממושך עוד יותר." +# ×פילו לזמן ממושך יותר +# ×פילו לזמן ממושך עוד יותר +#: ../data/gui/preferences_window.ui.h:73 +msgid "If checked, Gajim will change status to Not Available when the computer has not been used even longer" +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim ×™×©× ×” מצב ×ל ×œ× ×–×ž×™×Ÿ ×›×שר המחשב ×œ× ×ž×¦×•×™ בשימוש לזמן ממושך עוד יותר." -#: ../data/gui/preferences_window.ui.h:69 +#: ../data/gui/preferences_window.ui.h:74 msgid "minutes" msgstr "דקות" -#: ../data/gui/preferences_window.ui.h:70 +# על ידי +# ×”×™×” ושדה ×–×” +# זמן התפוגה שמצוין בערך +#: ../data/gui/preferences_window.ui.h:75 msgid "" "The auto away status message. If empty, Gajim will not change the current " "status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-away timeout" msgstr "" -"הודעת מצב × ×¢×“×¨×•×ª ×וטומטית. ×× ×©×“×” ×–×” ריק, Gajim ×œ× ×™×©× ×” ×ת הודעת המצב " -"×”× ×•×›×—×™×ª\n" +"הודעת מצב ×”× ×¢×“×¨×•×ª ×”×וטומטית. במידה ושדה ×–×” ריק, Gajim ×œ× ×™×©× ×” ×ת הודעת המצב ×”× ×•×›×—×™×ª\n" "×”×ª×•×•×™× $S יוחלפו בהודעת מצב קודמת\n" -"×”×ª×•×•×™× $T יוחלפו על פי זמן תפוגה ×שר מצוין עבור auto-away" +"×”×ª×•×•×™× $T יוחלפו על פי זמן תפוגה של auto-away" -#: ../data/gui/preferences_window.ui.h:73 +#: ../data/gui/preferences_window.ui.h:78 msgid "" "The auto not available status message. If empty, Gajim will not change the " "current status message\n" @@ -2091,297 +2206,277 @@ msgstr "" "×”×ª×•×•×™× $S יוחלפו בהודעת מצב קודמת\n" "×”×ª×•×•×™× $T יוחלפו על פי זמן תפוגה של auto-not-available" -#: ../data/gui/preferences_window.ui.h:76 +#: ../data/gui/preferences_window.ui.h:81 msgid "<b>Auto Status</b>" -msgstr "<b>מצב חיבור ×וטומטי</b>" +msgstr "<b>מצב־חיבור ×וטומטי</b>" # Sign in # Sign out -#: ../data/gui/preferences_window.ui.h:77 +#: ../data/gui/preferences_window.ui.h:82 msgid "Ask status message when I:" -msgstr "ש×ל ×ותי עבור הודעת מצב חיבור בעת:" +msgstr "ש×ל ×ותי עבור הודעת מצב־חיבור בעת:" -#: ../data/gui/preferences_window.ui.h:78 +#: ../data/gui/preferences_window.ui.h:83 msgid "Sign _in" msgstr "התח_ברות" -#: ../data/gui/preferences_window.ui.h:79 +#: ../data/gui/preferences_window.ui.h:84 msgid "Sign _out" msgstr "הת_× ×ª×§×•×ª" -#: ../data/gui/preferences_window.ui.h:80 -msgid "" -"If enabled, Gajim will not ask for a status message. The specified default " -"message will be used instead." -msgstr "" -"במידה ו×פשרות זו מופעלת, Gajim ×œ× ×™×©×ל עבור הודעת מצב. ההודעה המשתמטת ×שר " -"תצוין תהיה זו ×©×ª×™×›× ×¡ לתוקף במקו×." +# ×©×ª×™×›× ×¡ לתוקף +#: ../data/gui/preferences_window.ui.h:85 +msgid "If enabled, Gajim will not ask for a status message. The specified default message will be used instead." +msgstr "במידה ו×פשרות זו מופעלת, Gajim ×œ× ×™×©×ל עבור הודעת מצב. ההודעה המשתמטת שתצוין תהיה זו ×©×ª×™×›× ×¡ לשימוש במקו×." -#: ../data/gui/preferences_window.ui.h:81 +#: ../data/gui/preferences_window.ui.h:86 msgid "<b>Status Messages</b>" msgstr "<b>הודעות מצב</b>" -#: ../data/gui/preferences_window.ui.h:82 +# שמורות +#: ../data/gui/preferences_window.ui.h:87 msgid "<b>Preset Status Messages</b>" -msgstr "<b>הודעות מצב מות×מות</b>" +msgstr "<b>הודעות מצב ערוכות מר×ש</b>" -#: ../data/gui/preferences_window.ui.h:83 ../src/config.py:398 +#: ../data/gui/preferences_window.ui.h:88 +#: ../src/config.py:403 msgid "Status" -msgstr "מצב חיבור" +msgstr "מצב־חיבור" -#: ../data/gui/preferences_window.ui.h:84 +#: ../data/gui/preferences_window.ui.h:89 msgid "Use system _default" -msgstr "השתמש בברירת מ_חדל מערכת" +msgstr "השתמש בברירת מ_חדל של מערכת" -#: ../data/gui/preferences_window.ui.h:85 +#: ../data/gui/preferences_window.ui.h:90 msgid "Chat message:" msgstr "הודעת שיחה:" -#: ../data/gui/preferences_window.ui.h:86 +#: ../data/gui/preferences_window.ui.h:91 msgid "<b>Font</b>" msgstr "<b>גופן</b>" -#: ../data/gui/preferences_window.ui.h:87 +#: ../data/gui/preferences_window.ui.h:92 msgid "Use _transports icons" msgstr "השתמש בצלמיות של מו_בילי×" -#: ../data/gui/preferences_window.ui.h:88 -msgid "" -"If checked, Gajim will use protocol-specific status icons. (e.g. A contact " -"from MSN will have the equivalent msn icon for status online, away, busy, " -"etc...)" -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יעשה שימוש בצלמיות מצב ×שר ××•×¤×™×™× ×™×•×ª לכל " -"פרוטוקול בהת×מה (למשל: עבור ×יש קשר ×שר מצוי ×צל MSN תהיה צלמית מצב msn " -"שקילה עבור מצב מקוון, × ×¢×“×¨, עסוק, וכו׳)" +# BUG: e.g. +# BUG: A dot > see >> . (see below) +#: ../data/gui/preferences_window.ui.h:93 +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 "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יעשה שימוש בצלמיות מצב ש××•×¤×™×™× ×™×•×ª לכל פרוטוקול בהת×מה (למשל: עבור ×יש קשר המצוי ×צל MSN תהיה צלמית מצב msn שקילה עבור מצב מקוון, × ×¢×“×¨, עסוק, וכו׳)" -#: ../data/gui/preferences_window.ui.h:89 +# סדרת _צלמיות מצב: +#: ../data/gui/preferences_window.ui.h:94 msgid "Status _iconset:" msgstr "_צלמיות:" -#: ../data/gui/preferences_window.ui.h:90 +#: ../data/gui/preferences_window.ui.h:95 msgid "Configure color and font of the interface" msgstr "עיצוב גופן וצבע של הממשק" -#: ../data/gui/preferences_window.ui.h:91 +#: ../data/gui/preferences_window.ui.h:96 msgid "T_heme:" msgstr "מו_טיב:" -#: ../data/gui/preferences_window.ui.h:92 +# ערכ×ות × ×•×©× +#: ../data/gui/preferences_window.ui.h:97 msgid "<b>Themes</b>" -msgstr "<b>ערכ×ות × ×•×©×</b>" +msgstr "<b>מוטיבי×</b>" -#: ../data/gui/preferences_window.ui.h:93 +#: ../data/gui/preferences_window.ui.h:98 msgid "Contact's nickname:" msgstr "×©× ×›×™× ×•×™ של ×יש קשר:" -#: ../data/gui/preferences_window.ui.h:94 +#: ../data/gui/preferences_window.ui.h:99 msgid "Your nickname:" -msgstr "×©× ×›×™× ×•×™:" +msgstr "×©× ×›×™× ×•×™×™×š:" -#: ../data/gui/preferences_window.ui.h:95 +#: ../data/gui/preferences_window.ui.h:100 msgid "_Status message:" msgstr "הודעת _מצב:" -#: ../data/gui/preferences_window.ui.h:96 +#: ../data/gui/preferences_window.ui.h:101 msgid "_URL highlight:" msgstr "הבלטת _URL:" +# ×יפוס ×ל צבעי ברירת המחדל # ×¦×‘×¢×™× ×ž×©×ª×ž×˜×™× -#: ../data/gui/preferences_window.ui.h:97 +#: ../data/gui/preferences_window.ui.h:102 msgid "_Reset to Default Colors" -msgstr "_×פס ×¦×‘×¢×™× ×ל ברירת מחדל" +msgstr "_×יפוס צבעי×" -#: ../data/gui/preferences_window.ui.h:98 +#: ../data/gui/preferences_window.ui.h:103 msgid "Contact's message:" msgstr "הודעת ×יש קשר:" -#: ../data/gui/preferences_window.ui.h:99 +#: ../data/gui/preferences_window.ui.h:104 msgid "Your message:" msgstr "הודעתך:" -#: ../data/gui/preferences_window.ui.h:100 -msgid "Group chat highlight:" -msgstr "הבלטת שיחת קבוצה:" - -#: ../data/gui/preferences_window.ui.h:101 +#: ../data/gui/preferences_window.ui.h:105 msgid "<b>Chat Line Colors</b>" msgstr "<b>צבעי שורות שיחה</b>" -#: ../data/gui/preferences_window.ui.h:102 +#: ../data/gui/preferences_window.ui.h:106 msgid "Style" msgstr "×¡×’× ×•×Ÿ" -# התקן -#: ../data/gui/preferences_window.ui.h:103 +#: ../data/gui/preferences_window.ui.h:107 msgid "Audio input device" -msgstr "מכשיר קלט שמע" +msgstr "תקן קלט שמע" -#: ../data/gui/preferences_window.ui.h:104 +#: ../data/gui/preferences_window.ui.h:108 msgid "Audio output device" -msgstr "מכשיר פלט שמע" +msgstr "תקן פלט שמע" -#: ../data/gui/preferences_window.ui.h:105 +#: ../data/gui/preferences_window.ui.h:109 msgid "<b>Audio</b>" msgstr "<b>שמע</b>" -#: ../data/gui/preferences_window.ui.h:106 +#: ../data/gui/preferences_window.ui.h:110 msgid "Video input device" -msgstr "מכשיר קלט ויד×ו" +msgstr "תקן קלט ויד×ו" -#: ../data/gui/preferences_window.ui.h:107 +#: ../data/gui/preferences_window.ui.h:111 msgid "Video output device" -msgstr "מכשיר פלט ויד×ו" +msgstr "תקן פלט ויד×ו" -#: ../data/gui/preferences_window.ui.h:108 +#: ../data/gui/preferences_window.ui.h:112 msgid "Video framerate" msgstr "תדר ויד×ו" -#: ../data/gui/preferences_window.ui.h:109 +#: ../data/gui/preferences_window.ui.h:113 msgid "Video size" msgstr "גודל ויד×ו" -#: ../data/gui/preferences_window.ui.h:110 -msgid "View own video source" -msgstr "הצג מקור ויד×ו עצמי" - -#: ../data/gui/preferences_window.ui.h:111 +#: ../data/gui/preferences_window.ui.h:114 msgid "<b>Video</b>" msgstr "<b>ויד×ו</b>" -#: ../data/gui/preferences_window.ui.h:112 +#: ../data/gui/preferences_window.ui.h:115 msgid "STUN server:" msgstr "שרת STUN:" -#: ../data/gui/preferences_window.ui.h:113 +#: ../data/gui/preferences_window.ui.h:116 msgid "<i>(example: stunserver.org)</i>" msgstr "<i>(דוגמ×: stunserver.org)</i>" -#: ../data/gui/preferences_window.ui.h:114 +#: ../data/gui/preferences_window.ui.h:117 msgid "" "STUN server hostname. If none given, Gajim will try\n" "to discover one from server." msgstr "" "×©× ×ž×רח של שרת STUN. במידה ×•×œ× × ×™×ª×Ÿ, Gajim ×™× ×¡×”\n" -"×œ×ž×¦×•× ×חד מתוך שרת." +"×œ×ž×¦×•× ×חד מן שרת × ×ª×•×Ÿ." -#: ../data/gui/preferences_window.ui.h:116 +#: ../data/gui/preferences_window.ui.h:119 msgid "<b>Connection</b>" msgstr "<b>חיבור</b>" -#: ../data/gui/preferences_window.ui.h:117 ../src/features_window.py:102 +#: ../data/gui/preferences_window.ui.h:120 +#: ../src/features_window.py:102 msgid "Audio / Video" msgstr "שמע \\ ויד×ו" -#: ../data/gui/preferences_window.ui.h:118 +#: ../data/gui/preferences_window.ui.h:121 msgid "_File manager:" msgstr "×ž× ×”×œ _קבצי×:" -#: ../data/gui/preferences_window.ui.h:119 +#: ../data/gui/preferences_window.ui.h:122 msgid "_Mail client:" msgstr "לקוח _דו×ר:" -#: ../data/gui/preferences_window.ui.h:120 +#: ../data/gui/preferences_window.ui.h:123 msgid "_Browser:" msgstr "דפדפן:" #. a header for custom browser/client/file manager. so translate sth like: Custom Settings -#: ../data/gui/preferences_window.ui.h:122 +#: ../data/gui/preferences_window.ui.h:125 msgid "<b>Custom</b>" msgstr "<b>הת×מה ×ישית</b>" -#: ../data/gui/preferences_window.ui.h:123 +#: ../data/gui/preferences_window.ui.h:126 msgid "<b>Applications</b>" msgstr "<b>יישומי×</b>" -#: ../data/gui/preferences_window.ui.h:124 +#: ../data/gui/preferences_window.ui.h:127 msgid "_Ignore events from contacts not in the roster" -msgstr "הת_×¢×œ× ×ž×Ÿ ××™×¨×•×¢×™× ×ž×ת ×× ×©×™ קשר ×שר ×œ× × ×•×›×—×™× ×‘×¨×©×™×ž×”" +msgstr "הת_×¢×œ× ×ž×Ÿ ××™×¨×•×¢×™× ×ž×ת ×× ×©×™ קשר ×©×œ× × ×•×›×—×™× ×‘×¨×©×™×ž×”" # BUG: a dot at the end -#: ../data/gui/preferences_window.ui.h:125 -msgid "" -"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" -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim ×™×ª×¢×œ× ×ž×Ÿ ××™×¨×•×¢×™× × ×›× ×¡×™× ×ž×ת ×× ×©×™ קשר ×œ× " -"מורשי×. יש לעשות שימוש זהיר ב×פשרות זו, ×ž×©×•× ×©×–×• חוסמת ×ת כל ההודעות מכל ×יש " -"קשר ×שר ×œ× ×ž×¦×•×™ ברשימה" +#: ../data/gui/preferences_window.ui.h:128 +msgid "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" +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim ×™×ª×¢×œ× ×ž×Ÿ ××™×¨×•×¢×™× × ×›× ×¡×™× ×ž×ת ×× ×©×™ קשר ×œ× ×ž×•×¨×©×™×. יש לעשות שימוש זהיר ב×פשרות זו, ×ž×©×•× ×©×–×• חוסמת ×ת כל ההודעות מכל ×יש קשר ×©×œ× ×ž×¦×•×™ ברשימה" -#: ../data/gui/preferences_window.ui.h:126 +#: ../data/gui/preferences_window.ui.h:129 msgid "Allow client / _OS information to be sent" msgstr "התר שליחת _מידע לקוח \\ מערכת הפעלה" # BUG: a dot at the end # BUG: add Client too -#: ../data/gui/preferences_window.ui.h:127 -msgid "" -"If checked, Gajim will allow others to detect the operation system you are " -"using" -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יתיר ל××—×¨×™× ×œ×תר ×ת מערכת ההפעלה ×שר מצויה " -"תחת שימושך" +#: ../data/gui/preferences_window.ui.h:130 +msgid "If checked, Gajim will allow others to detect the operation system you are using" +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יתיר ל××—×¨×™× ×œ×תר ×ת סוג הלקוח ו×ת סוג מערכת ההפעלה שבשימושך" -#: ../data/gui/preferences_window.ui.h:128 +#: ../data/gui/preferences_window.ui.h:131 msgid "Allow local system time information to be sent" msgstr "התר שליחת _זמן מערכת מקומי" # BUG: a dot at the end -#: ../data/gui/preferences_window.ui.h:129 +#: ../data/gui/preferences_window.ui.h:132 msgid "If checked, Gajim will allow others to detect the time on your system" -msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יתיר ל××—×¨×™× ×œ×תר ×ת הזמן של המערכת שלך" +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יתיר ל××—×¨×™× ×œ×תר ×ת הזמן שבמערכת שלך" -#: ../data/gui/preferences_window.ui.h:130 +#: ../data/gui/preferences_window.ui.h:133 msgid "Log _encrypted chat session" msgstr "×¨×©×•× ×¡×©×Ÿ שיחה מו_צפן ברשומות ההיסטוריה" # BUG: encryption, the # ××œ×ž×œ× ×›×Ÿ -#: ../data/gui/preferences_window.ui.h:131 -msgid "" -"If checked, Gajim will keep logs for encrypted messages. Please note that " -"when using E2E encryption the remote party has to agree on logging, else the " -"messages will not be logged." -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim ישמור רשומות עבור הודעות ×ž×•×¦×¤× ×•×ª. ×× × ×§×— " -"לתשומת לבך ×›×™ ×›×שר ×”×¦×¤× ×ª E2E (קצה ×ל קצה) × ×ž×¦×ת בשימוש, הצד המרוחק מוכרח " -"×œ×”×¡×›×™× ×œ×¨×™×©×•× ×”×©×™×—×”, ×חרת ההודעות ×œ× ×™×™×¨×©×ž×•." +#: ../data/gui/preferences_window.ui.h:134 +msgid "If checked, Gajim will keep logs for encrypted messages. Please note that when using E2E encryption the remote party has to agree on logging, else the messages will not be logged." +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim ישמור רשומות עבור הודעות ×ž×•×¦×¤× ×•×ª. × × ×œ×§×—×ª לתשומת לבך שכ×שר ×”×¦×¤× ×ª קצה ×ל קצה (E2E) × ×ž×¦×ת בשימוש, הצד המרוחק מוכרח ×œ×”×¡×›×™× ×œ×¨×™×©×•× ×”×©×™×—×”, ×חרת ההודעות ×œ× ×™×¨×©×ž×•." # חוסר מעש -#: ../data/gui/preferences_window.ui.h:132 +#: ../data/gui/preferences_window.ui.h:135 msgid "Allow my _idle time to be sent" msgstr "התר שליחת משך זמן _חוסר פעילות" -#: ../data/gui/preferences_window.ui.h:133 +#: ../data/gui/preferences_window.ui.h:136 msgid "Global proxy:" -msgstr "ציר גלובלי:" +msgstr "מתווך גלובלי:" -#: ../data/gui/preferences_window.ui.h:135 +#: ../data/gui/preferences_window.ui.h:138 msgid "<b>Privacy</b>" msgstr "<b>פרטיות</b>" -#: ../data/gui/preferences_window.ui.h:136 +#: ../data/gui/preferences_window.ui.h:139 msgid "_Log status changes of contacts" -msgstr "×¨×©×•× _×©×™× ×•×™×™× ×©×œ מצב חיבור של ×× ×©×™ קשר" +msgstr "×¨×©×•× _×©×™× ×•×™×™× ×©×œ מצב־חיבור של ×× ×©×™ קשר" -#: ../data/gui/preferences_window.ui.h:137 +# ברירת המחדל +#: ../data/gui/preferences_window.ui.h:140 msgid "Check on startup if Gajim is the _default Jabber client" msgstr "בדוק בעת הפעלה ×× Gajim ×”×™× ×• לקוח _Jabber ברירת מחדל" -#: ../data/gui/preferences_window.ui.h:139 +#: ../data/gui/preferences_window.ui.h:142 msgid "_Open..." msgstr "_פתיחה..." -#: ../data/gui/preferences_window.ui.h:140 +#: ../data/gui/preferences_window.ui.h:143 msgid "<b>Advanced Configuration Editor</b>" msgstr "<b>עורך תצורה מתקד×</b>" -#: ../data/gui/preferences_window.ui.h:141 +#: ../data/gui/preferences_window.ui.h:144 msgid "Advanced" msgstr "מתקד×" -#: ../data/gui/privacy_list_window.ui.h:1 ../src/dialogs.py:4121 +#: ../data/gui/privacy_lists_window.ui.h:1 +msgid "Privacy Lists:" +msgstr "רשימות פרטיות:" + +#: ../data/gui/privacy_list_window.ui.h:1 +#: ../src/dialogs.py:4023 msgid "Privacy List" msgstr "רשימת פרטיות" @@ -2401,9 +2496,10 @@ msgstr "פעילה בכל ×תחול" msgid "<b>List of rules</b>" msgstr "<b>רשימת כללי×</b>" +# הוספת / הסרת חוק #: ../data/gui/privacy_list_window.ui.h:6 msgid "<b>Add / Edit a rule</b>" -msgstr "<b>הוספת \\ הסרת כלל</b>" +msgstr "<b>הוספה \\ הסרה של כלל</b>" # להתיר #: ../data/gui/privacy_list_window.ui.h:7 @@ -2416,9 +2512,8 @@ msgstr "ל×סור" #: ../data/gui/privacy_list_window.ui.h:9 msgid "JabberID" -msgstr "מזהה Jabber" +msgstr "‫JID" -# ×שר #: ../data/gui/privacy_list_window.ui.h:10 msgid "all in the group" msgstr "כל מי שבקבוצה" @@ -2447,6 +2542,7 @@ msgstr "לצפות במצב שלי" msgid "to send me status" msgstr "לשלוח ×לי מצב" +# Can I write subscriptions instead? #: ../data/gui/privacy_list_window.ui.h:17 msgid "All (including subscription)" msgstr "הכל (כולל הרשמה)" @@ -2471,10 +2567,6 @@ msgstr "מן" msgid "to" msgstr "×ל" -#: ../data/gui/privacy_lists_window.ui.h:1 -msgid "Privacy Lists:" -msgstr "רשימות פרטיות:" - #. Family Name #: ../data/gui/profile_window.ui.h:3 #: ../data/gui/vcard_information_window.ui.h:17 @@ -2521,6 +2613,10 @@ msgstr "<b>רחוב:</b>" msgid "<b>City:</b>" msgstr "<b>עיר:</b>" +# Changed to District instead of State. +# Reason: Most of the Hebrew speakers, who probably going to be Israelis, would find the word District (the way the big parts of Israel are parted) more attractive. +# State = ×ž×“×™× ×” +# District = מחוז , ×זור #: ../data/gui/profile_window.ui.h:15 #: ../data/gui/vcard_information_window.ui.h:29 msgid "<b>State:</b>" @@ -2585,6 +2681,7 @@ msgstr "<b>דו×״ל:</b>" msgid "<b>Avatar:</b>" msgstr "<b>×ווט×ר:</b>" +# לחץ כדי להגדיר ×ווט×ר #: ../data/gui/profile_window.ui.h:28 msgid "Click to set your avatar" msgstr "לחץ כדי לקבוע ×ווט×ר" @@ -2627,11 +2724,11 @@ msgstr "×ודות" #: ../data/gui/remove_account_window.ui.h:1 msgid "Remove account _only from Gajim" -msgstr "להסיר חשבון מתוך Gajim _בלבד" +msgstr "להסיר חשבון מן Gajim _בלבד" #: ../data/gui/remove_account_window.ui.h:2 msgid "Remove account from Gajim and from _server" -msgstr "להסיר חשבון מתוך Gajim ×•×’× ×ž×ª×•×š _שרת" +msgstr "להסיר חשבון מן Gajim ×•×’× ×ž×Ÿ _שרת" #: ../data/gui/remove_account_window.ui.h:3 msgid "<b>What do you want to do?</b>" @@ -2639,8 +2736,10 @@ msgstr "<b>מה ×‘×¨×¦×•× ×š לעשות?</b>" #. Remove group #. Remove -#: ../data/gui/remove_account_window.ui.h:4 ../src/roster_window.py:5829 -#: ../src/roster_window.py:5954 ../src/roster_window.py:6084 +#: ../data/gui/remove_account_window.ui.h:4 +#: ../src/roster_window.py:5881 +#: ../src/roster_window.py:6006 +#: ../src/roster_window.py:6136 msgid "_Remove" msgstr "הס_ר" @@ -2672,9 +2771,10 @@ msgstr "_פעולות" #: ../data/gui/roster_window.ui.h:6 msgid "Add _Contact..." -msgstr "הוספת _×יש קשר..." +msgstr "הוסף _×יש קשר..." -#: ../data/gui/roster_window.ui.h:9 ../src/disco.py:1558 +#: ../data/gui/roster_window.ui.h:9 +#: ../src/disco.py:1519 msgid "_Edit" msgstr "×¢_ריכה" @@ -2682,6 +2782,7 @@ msgstr "×¢_ריכה" msgid "_Accounts" msgstr "_×—×©×‘×•× ×•×ª" +# _מידע ×ישי #: ../data/gui/roster_window.ui.h:11 msgid "Profile, A_vatar" msgstr "_דיוקן, ×ווט×ר" @@ -2750,29 +2851,32 @@ msgstr "חיפוש" # ×חזור #: ../data/gui/search_window.ui.h:2 msgid "Please wait while retrieving search form..." -msgstr "×× × ×”×ž×ª×Ÿ בעת ×חזרת טופס חיפוש..." +msgstr "× × ×œ×”×ž×ª×™×Ÿ בעת ×חזרת ×ª×‘× ×™×ª חיפוש..." #: ../data/gui/search_window.ui.h:3 msgid "_Add contact" msgstr "הוסף _×יש קשר" #. Information -#: ../data/gui/search_window.ui.h:4 ../src/roster_window.py:6096 +#: ../data/gui/search_window.ui.h:4 +#: ../src/roster_window.py:6148 msgid "_Information" msgstr "_מידע" -#: ../data/gui/search_window.ui.h:5 ../src/disco.py:1408 +#: ../data/gui/search_window.ui.h:5 +#: ../src/disco.py:1372 msgid "_Search" msgstr "_חפש" #: ../data/gui/service_discovery_window.ui.h:1 msgid "G_o" -msgstr "×”_משך" +msgstr "מ_עבר" #: ../data/gui/service_discovery_window.ui.h:2 msgid "_Address:" msgstr "_כתובת:" +# הרשמה ×ל # Register = ×¨×™×©×•× # Subscribe = הרשמה #: ../data/gui/service_registration_window.ui.h:1 @@ -2789,7 +2893,11 @@ msgstr "×ל:" #: ../data/gui/single_message_window.ui.h:5 msgid "Sen_d" -msgstr "של_×—" +msgstr "שלי_×—" + +#: ../data/gui/single_message_window.ui.h:6 +msgid "Send message" +msgstr "שלח הודעה" #: ../data/gui/single_message_window.ui.h:7 msgid "_Reply" @@ -2803,6 +2911,7 @@ msgstr "×ž×¢× ×” להודעה" msgid "_Send & Close" msgstr "_שלח וסגור" +# BUG: Sends ? #: ../data/gui/single_message_window.ui.h:10 msgid "Send message and close window" msgstr "שליחת הודעה וסגירת החלון" @@ -2821,7 +2930,6 @@ msgid "" "connected" msgstr "×יסור הרש×ות מן ×יש קשר כך ×©×”×•× ×ו ×”×™× ×œ× ×™×•×›×œ×• לדעת מתי ×”×™× ×š מחובר" -# הס_מך #: ../data/gui/subscription_request_window.ui.h:6 msgid "Au_thorize" msgstr "×ש_ר" @@ -2834,9 +2942,10 @@ msgstr "×”×¢× ×§×ª הרש××” ×ל ×יש קשר ×–×” כדי ×©×”×•× ×ו ×”×™ msgid "Synchronise contacts" msgstr "×¡× ×›×¨×Ÿ ×× ×©×™ קשר" +# ש×יתו #: ../data/gui/synchronise_select_account_dialog.ui.h:2 msgid "Select the account with which you want to synchronise" -msgstr "בחירת החשבון ×שר עמו ×‘×¨×¦×•× ×š ×œ×¡× ×›×¨×Ÿ" +msgstr "בחירת החשבון שעמו ×‘×¨×¦×•× ×š ×œ×”×¡×ª× ×›×¨×Ÿ" #: ../data/gui/synchronise_select_contacts_dialog.ui.h:1 msgid "Synchronise : select contacts" @@ -2848,7 +2957,7 @@ msgstr "בחירת ×× ×©×™ הקשר ××•×ª× ×‘×¨×¦×•× ×š ×œ×¡× ×›×¨×Ÿ" #: ../data/gui/systray_context_menu.ui.h:1 msgid "Sta_tus" -msgstr "_מצב חיבור" +msgstr "_מצב־חיבור" #: ../data/gui/systray_context_menu.ui.h:3 msgid "_Group Chat" @@ -2866,6 +2975,7 @@ msgstr "הצג _××™×¨×•×¢×™× ×ž×ž×ª×™× ×™×" msgid "Mute Sounds" msgstr "×“×•×ž× _צלילי×" +# מידע ×ישי #: ../data/gui/vcard_information_window.ui.h:1 #: ../data/gui/zeroconf_information_window.ui.h:1 msgid "Contact Information" @@ -2873,7 +2983,7 @@ msgstr "מידע ×יש קשר" #: ../data/gui/vcard_information_window.ui.h:2 msgid "<b>Jabber ID:</b>" -msgstr "<b>מזהה Jabber:</b>" +msgstr "‫<b>JID:</b>" #: ../data/gui/vcard_information_window.ui.h:3 msgid "<b>Resource:</b>" @@ -2891,6 +3001,7 @@ msgstr "<b>לקוח:</b>" msgid "<b>System:</b>" msgstr "<b>מערכת:</b>" +# זמן ×יש קשר #: ../data/gui/vcard_information_window.ui.h:7 msgid "<b>Contact time:</b>" msgstr "<b>זמן:</b>" @@ -2899,9 +3010,10 @@ msgstr "<b>זמן:</b>" msgid "<b>User avatar:</b>" msgstr "<b>×ווט×ר משתמש:</b>" +# Changed to: The avatar which has been set #: ../data/gui/vcard_information_window.ui.h:9 msgid "<b>Configured avatar:</b>" -msgstr "<b>×ווט×ר מוגדר:</b>" +msgstr "<b>×”×ווט×ר שהוגדר:</b>" #. Family Name #: ../data/gui/vcard_information_window.ui.h:11 @@ -2932,25 +3044,26 @@ msgstr "הערות" msgid "<b>Jabber Traffic</b>" msgstr "<b>תעבורת Jabber</b>" +# החב×ת #: ../data/gui/xml_console_window.ui.h:4 msgid "Hide IN stanzas" -msgstr "הסתר ×¡×˜× ×–×•×ª IN" +msgstr "הסתרת ×¡×˜× ×–×•×ª IN" #: ../data/gui/xml_console_window.ui.h:5 msgid "Hide OUT stanzas" -msgstr "הסתר ×¡×˜× ×–×•×ª OUT" +msgstr "הסתרת ×¡×˜× ×–×•×ª OUT" #: ../data/gui/xml_console_window.ui.h:6 msgid "Hide Presence stanzas" -msgstr "הסתר ×¡×˜× ×–×•×ª × ×•×›×—×•×ª" +msgstr "הסתרת ×¡×˜× ×–×•×ª × ×•×›×—×•×ª" #: ../data/gui/xml_console_window.ui.h:7 msgid "Hide IQ stanzas" -msgstr "הסתר ×¡×˜× ×–×•×ª IQ" +msgstr "הסתרת ×¡×˜× ×–×•×ª IQ" #: ../data/gui/xml_console_window.ui.h:8 msgid "Hide Message stanzas" -msgstr "הסתר ×¡×˜× ×–×•×ª הודעה" +msgstr "הסתרת ×¡×˜× ×–×•×ª הודעה" #: ../data/gui/xml_console_window.ui.h:9 msgid "<b>Filter</b>" @@ -2965,6 +3078,7 @@ msgstr "" msgid "Info/Query" msgstr "מידע/ש×ילת×" +# הופעה #: ../data/gui/xml_console_window.ui.h:13 msgid "_Presence" msgstr "_× ×•×›×—×•×ª" @@ -2979,11 +3093,11 @@ msgstr "<b>קלט XML</b>" #: ../data/gui/zeroconf_context_menu.ui.h:2 msgid "_Modify Account..." -msgstr "×”_ת×מת חשבון..." +msgstr "×”_ת×× ×—×©×‘×•×Ÿ..." #: ../data/gui/zeroconf_information_window.ui.h:2 msgid "Local jid:" -msgstr "â€JID מקומית:" +msgstr "‫JID מקומית:" #: ../data/gui/zeroconf_information_window.ui.h:3 msgid "Resource:" @@ -2999,51 +3113,48 @@ msgstr "×ישי" #: ../data/gajim.desktop.in.in.h:2 msgid "Jabber IM Client" -msgstr "לקוח ×ž×¡×¨×™× ×ž×™×“×™×™× Jabber" +msgstr "לקוח ×ž×¡×¨×™× ×ž×™×™×“×™×™× ×’×³×בּר" #: ../data/gajim.desktop.in.in.h:3 msgid "A GTK+ Jabber client" -msgstr "לקוח ג׳×בּר GTK+‎" +msgstr "לקוח ג׳×בּר â€GTK+‬" -#: ../data/gajim.desktop.in.in.h:4 -msgid "chat;messaging;im;jabber;xmpp;bonjour;voip" -msgstr "צ'×ט;מסרי×;×ž×¡× ×’'ר;jabber;xmpp;bonjour;voip" - -#: ../src/adhoc_commands.py:325 +#: ../src/adhoc_commands.py:323 msgid "Cancel confirmation" msgstr "×ימות ביטול" # מצוי/×” במהלך -#: ../src/adhoc_commands.py:326 -msgid "" -"You are in process of executing command. Do you really want to cancel it?" -msgstr "×”×™× ×š בתוך עיצומו של תהליך הרצת פקודה. ×”×× ×‘×¨×¦×•× ×š לבטלו?" +#: ../src/adhoc_commands.py:324 +msgid "You are in process of executing command. Do you really want to cancel it?" +msgstr "×”×™× ×š ב×מצע תהליך של הרצת פקודה. ×”×× ×‘×¨×¦×•× ×š לבטלו?" -#: ../src/adhoc_commands.py:372 +#: ../src/adhoc_commands.py:370 msgid "Invalid Form" -msgstr "טופס שגוי" +msgstr "×ª×‘× ×™×ª שגויה" -#: ../src/adhoc_commands.py:373 +#: ../src/adhoc_commands.py:371 msgid "The form is not filled correctly." -msgstr "הטופס ××™× ×• ×ž×ž×•×œ× ×›×¨×וי." +msgstr "×”×ª×‘× ×™×ª ×œ× ×ž×•×œ××” כר×וי." -#: ../src/adhoc_commands.py:392 ../src/adhoc_commands.py:416 +#: ../src/adhoc_commands.py:390 +#: ../src/adhoc_commands.py:414 msgid "Service sent malformed data" -msgstr "שירות שלח מידע פגו×" +msgstr "השירות שלח מידע פגו×" -#: ../src/adhoc_commands.py:401 +#: ../src/adhoc_commands.py:399 msgid "Service changed the session identifier." -msgstr "שירות ×©×™× ×” ×ת מזהה הסשן." +msgstr "השירות ×©×™× ×” ×ת המזהה של הסשן." -#: ../src/adhoc_commands.py:421 +# RTL, NEEDS +#: ../src/adhoc_commands.py:419 #, python-format msgid "%s - Ad-hoc Commands - Gajim" msgstr "‫%s - פקודות ייעודיות (‫Ad-hoc) - ‫Gajim" #. when stanza doesn't have error description -#: ../src/adhoc_commands.py:516 +#: ../src/adhoc_commands.py:514 msgid "Service returned an error." -msgstr "שירות החזיר שגי××”." +msgstr "השירות החזיר שגי××”." #. For i18n #: ../src/advanced_configuration_window.py:92 @@ -3066,7 +3177,8 @@ msgstr "ספרה" msgid "Text" msgstr "תמליל" -#: ../src/advanced_configuration_window.py:97 ../src/chat_control.py:1065 +#: ../src/advanced_configuration_window.py:97 +#: ../src/chat_control.py:1069 msgid "Color" msgstr "צבע" @@ -3078,17 +3190,17 @@ msgstr "×©× ×”×¢×“×¤×”" msgid "Value" msgstr "ערך" -#: ../src/advanced_configuration_window.py:124 +#: ../src/advanced_configuration_window.py:122 msgid "Type" msgstr "טיפוס" #. we talk about option description in advanced configuration editor -#: ../src/advanced_configuration_window.py:179 +#: ../src/advanced_configuration_window.py:177 msgid "(None)" -msgstr "(×ין)" +msgstr "(לל×)" # Needs to be tested -#: ../src/advanced_configuration_window.py:305 +#: ../src/advanced_configuration_window.py:303 msgid "Hidden" msgstr "מוסתר" @@ -3096,181 +3208,292 @@ msgstr "מוסתר" #, python-format msgid "You have received new entries (and %d not displayed):" msgid_plural "You have received new entries (and %d not displayed):" -msgstr[0] "קיבלת רשומות חדשות (ועוד %d ×שר ×œ× ×ž×•×¦×’×ª):" -msgstr[1] "קיבלת רשומות חדשות (ועוד %d ×שר ×œ× ×ž×•×¦×’×•×ª):" +msgstr[0] "קיבלת רשומות חדשות (ועוד %d ×©×œ× ×ž×•×¦×’×ª):" +msgstr[1] "קיבלת רשומות חדשות (ועוד %d ×©×œ× ×ž×•×¦×’×•×ª):" + +#. the next script, executed in the "po" directory, +#. generates the following list. +#. #!/bin/sh +#. LANG=$(for i in *.po; do j=${i/.po/}; echo -n "_('"$j"')":" '"$j"', " ; done) +#. echo "{_('en'):'en'",$LANG"}" +#: ../src/chat_control.py:86 +msgid "English" +msgstr "×× ×’×œ×™×ª" + +#: ../src/chat_control.py:86 +msgid "Belarusian" +msgstr "בל×רוסית" + +#: ../src/chat_control.py:86 +msgid "Bulgarian" +msgstr "בולגרית" + +#: ../src/chat_control.py:87 +msgid "Breton" +msgstr "×‘×¨×˜×•× ×™×ª" + +#: ../src/chat_control.py:87 +msgid "Czech" +msgstr "צ׳כית" + +#: ../src/chat_control.py:87 +msgid "German" +msgstr "×’×¨×ž× ×™×ª" + +#: ../src/chat_control.py:88 +msgid "Greek" +msgstr "×™×•×•× ×™×ª" + +#: ../src/chat_control.py:88 +msgid "British" +msgstr "בריטית" + +#: ../src/chat_control.py:88 +msgid "Esperanto" +msgstr "××¡×¤×¨× ×˜×•" + +#: ../src/chat_control.py:89 +msgid "Spanish" +msgstr "ספרדית" + +#: ../src/chat_control.py:89 +msgid "Basque" +msgstr "בסקית" + +#: ../src/chat_control.py:89 +msgid "French" +msgstr "צרפתית" + +#: ../src/chat_control.py:90 +msgid "Croatian" +msgstr "קרו×טית" + +#: ../src/chat_control.py:90 +msgid "Italian" +msgstr "×יטלקית" + +# b = book language +#: ../src/chat_control.py:90 +msgid "Norwegian (b)" +msgstr "× ×•×¨×‘×’×™×ª (ס)" + +#: ../src/chat_control.py:91 +msgid "Dutch" +msgstr "×”×•×œ× ×“×™×ª" + +#: ../src/chat_control.py:91 +msgid "Norwegian" +msgstr "× ×•×¨×‘×’×™×ª" + +#: ../src/chat_control.py:91 +msgid "Polish" +msgstr "×¤×•×œ× ×™×ª" + +#: ../src/chat_control.py:92 +msgid "Portuguese" +msgstr "פורטוגזית" + +#: ../src/chat_control.py:92 +msgid "Brazilian Portuguese" +msgstr "פורטוגזית ברזיל×ית" + +#: ../src/chat_control.py:93 +msgid "Russian" +msgstr "רוסית" + +#: ../src/chat_control.py:93 +msgid "Serbian" +msgstr "סרבית" + +#: ../src/chat_control.py:93 +msgid "Slovak" +msgstr "סלובקית" + +#: ../src/chat_control.py:94 +msgid "Swedish" +msgstr "שוודית" + +#: ../src/chat_control.py:94 +msgid "Chinese (Ch)" +msgstr "×¡×™× ×™×ª (Ch)" -#: ../src/chat_control.py:209 +#: ../src/chat_control.py:94 +msgid "Hebrew" +msgstr "עברית" + +#: ../src/chat_control.py:237 msgid "Ping?" msgstr "×¤×™× ×’?" -#: ../src/chat_control.py:214 +#: ../src/chat_control.py:242 #, python-format msgid "Pong! (%s s.)" -msgstr "×¤×•× ×’! (%s ש.)" +msgstr "×¤×•× ×’! (%s s.)" -#: ../src/chat_control.py:219 +#: ../src/chat_control.py:247 msgid "Error." msgstr "שגי××”." +#: ../src/chat_control.py:582 +msgid "Spelling language" +msgstr "שפת ×יות" + #. we are not connected -#: ../src/chat_control.py:800 +#: ../src/chat_control.py:614 +#: ../src/chat_control.py:830 msgid "A connection is not available" msgstr "חיבור ××™× ×• זמין" -#: ../src/chat_control.py:801 +#: ../src/chat_control.py:615 +#: ../src/chat_control.py:831 msgid "Your message can not be sent until you are connected." -msgstr "הודעתך ×œ× ×™×›×•×œ×” להישלח עד ×שר תהיה מחובר." +msgstr "ההודעה ×œ× ×™×›×•×œ×” להישלח עד שתהיה מחובר." -#: ../src/chat_control.py:1047 +#: ../src/chat_control.py:1051 msgid "Underline" msgstr "קו תחתון" -#: ../src/chat_control.py:1048 +#: ../src/chat_control.py:1052 msgid "Strike" msgstr "קו חוצה" -#: ../src/chat_control.py:1071 +#: ../src/chat_control.py:1075 msgid "Font" msgstr "גופן" # Reset -#: ../src/chat_control.py:1080 +#: ../src/chat_control.py:1084 msgid "Clear formating" msgstr "×יפוס עיצוב" -#: ../src/chat_control.py:1157 +#: ../src/chat_control.py:1161 msgid "Really send file?" msgstr "×”×× ×‘×מת לשלוח קובץ?" -#: ../src/chat_control.py:1158 +#: ../src/chat_control.py:1162 #, python-format msgid "If you send a file to %s, he/she will know your real Jabber ID." -msgstr "×× ×ª×©×œ×— קובץ ×ל %s, הו×/×”×™× ×™×“×¢×• ×ת כתובתך (מזהה Jabber) המל××”." - -#: ../src/chat_control.py:1665 ../src/chat_control.py:2249 -msgid "OpenPGP encryption enabled" -msgstr "×”×¦×¤× ×ª OpenPGP מ×ופשרת" - -#: ../src/chat_control.py:1727 -msgid "Formattings are not available when GPG is active" -msgstr "×¢×™×¦×•×‘×™× ××™× × × ×ª×ž×›×™× ×›×שר GPG ×”×™× ×• פעיל" +msgstr "×× ×ª×©×œ×— קובץ ×ל %s, הו×/×”×™× ×™×“×¢×• ×ת כתובתך (JID) המל××”." -#: ../src/chat_control.py:1730 -msgid "This contact does not support HTML" -msgstr "×יש קשר ×–×” ×œ× ×ª×•×ž×š HTML" +# Changed enabled with activated +# Enabled = מ×ופשרת +# Activated = מופעלת +#: ../src/chat_control.py:1645 +#: ../src/chat_control.py:2190 +msgid "GPG encryption enabled" +msgstr "×”×¦×¤× ×ª GPG מופעלת" #. Add to roster -#: ../src/chat_control.py:1735 ../src/common/contacts.py:152 -#: ../src/common/contacts.py:273 ../src/common/helpers.py:67 -#: ../src/common/helpers.py:261 ../src/dialogs.py:1105 ../src/dialogs.py:2310 -#: ../src/dialogs.py:2339 ../src/dialogs.py:3551 ../src/gui_interface.py:485 -#: ../src/gui_menu_builder.py:268 ../src/gui_menu_builder.py:423 -#: ../src/roster_window.py:771 ../src/roster_window.py:1732 -#: ../src/roster_window.py:1734 ../src/roster_window.py:2082 -#: ../src/roster_window.py:3618 ../src/roster_window.py:3645 +#: ../src/chat_control.py:1699 +#: ../src/common/contacts.py:152 +#: ../src/common/contacts.py:273 +#: ../src/common/helpers.py:67 +#: ../src/common/helpers.py:261 +#: ../src/dialogs.py:1101 +#: ../src/dialogs.py:2266 +#: ../src/dialogs.py:2295 +#: ../src/gui_interface.py:484 +#: ../src/gui_menu_builder.py:262 +#: ../src/gui_menu_builder.py:416 +#: ../src/roster_window.py:767 +#: ../src/roster_window.py:1722 +#: ../src/roster_window.py:1724 +#: ../src/roster_window.py:2072 +#: ../src/roster_window.py:3689 +#: ../src/roster_window.py:3716 msgid "Not in Roster" msgstr "×œ× ×‘×¨×©×™×ž×”" -#. change tooltip text for audio and video buttons if python-farstream is -#. not installed -#: ../src/chat_control.py:1760 -#: ../src/command_system/implementation/standard.py:215 -msgid "Toggle audio session" -msgstr "הפעלת סשן שמע" - -#: ../src/chat_control.py:1761 -#: ../src/command_system/implementation/standard.py:225 -msgid "Toggle video session" -msgstr "הפעלת סשן ויד×ו" - -#: ../src/chat_control.py:1763 +#: ../src/chat_control.py:1727 msgid "Feature not available, see Help->Features" msgstr "×ª×›×•× ×” זו ×œ× ×–×ž×™× ×”, ר×ו עזרה->×ª×›×•× ×•×ª." -#: ../src/chat_control.py:1767 +#: ../src/chat_control.py:1731 msgid "Feature not supported by remote client" msgstr "×ª×›×•× ×” ××™× ×” × ×ª×ž×›×ª על ידי לקוח מרוחק" -#: ../src/chat_control.py:1780 -msgid "Send files" -msgstr "שליחת קבצי×" - -#: ../src/chat_control.py:1785 +#: ../src/chat_control.py:1748 msgid "This contact does not support file transfer." msgstr "×יש קשר ×–×” ××™× ×• תומך בהעברת קבצי×." -#: ../src/chat_control.py:1788 +#: ../src/chat_control.py:1751 msgid "You need to know the real JID of the contact to send him or her a file." -msgstr "" -"יש צורך לדעת ×ת הכתובת המממשת (JID) של ×יש הקשר כדי לשלוח ×ליו ×ו ×ליה קובץ." +msgstr "יש צורך לדעת ×ת הכתובת (JID) של ×יש הקשר כדי לשלוח ×ליו ×ו ×ליה קובץ." -#: ../src/chat_control.py:1906 +#: ../src/chat_control.py:1869 #, python-format msgid "%(type)s state : %(state)s, reason: %(reason)s" -msgstr "%(type)s מצב : %(state)s, סיבה: %(reason)s" +msgstr "‫%(type)s מצב : %(state)s, סיבה: %(reason)s" -#: ../src/chat_control.py:2098 +# מן שיחת +#: ../src/chat_control.py:2060 #, python-format msgid "%(nickname)s from group chat %(room_name)s" -msgstr "%(nickname)s מתוך שיחת קבוצה %(room_name)s" +msgstr "‫%(nickname)s משיחת הקבוצה ‫%(room_name)s ‫" #. No key assigned nor a key is used by remote contact -#: ../src/chat_control.py:2229 ../src/dialogs.py:5194 -msgid "No OpenPGP key assigned" -msgstr "×œ× ×”×•×§×¦×” מפתח OpenPGP" - -#: ../src/chat_control.py:2230 -msgid "" -"No OpenPGP key is assigned to this contact. So you cannot encrypt messages " -"with OpenPGP." -msgstr "" -"×ין מפתח OpenPGP ×שר מוקצה ל×יש קשר ×–×”. כך ש×ין ×ין ב×פשרותך להצפין הודעות " -"ב×מצעות OpenPGP." - -#: ../src/chat_control.py:2239 -msgid "OpenPGP encryption disabled" -msgstr "×”×¦×¤× ×ª OpenPGP ×ž× ×•×˜×¨×œ×ª" - -#: ../src/chat_control.py:2265 +#: ../src/chat_control.py:2170 +#: ../src/dialogs.py:5092 +msgid "No GPG key assigned" +msgstr "×œ× ×”×•×§×¦×” מפתח GPG" + +# ב×פשרותך +# כך ש×ין ב +#: ../src/chat_control.py:2171 +msgid "No GPG key is assigned to this contact. So you cannot encrypt messages with GPG." +msgstr "×œ× ×”×•×§×¦×” מפתח GPG ל×יש קשר ×–×”. ××™ לכך ×ין ביכולתך להצפין הודעות ב×מצעות GPG." + +# Changed disabled with neutralized (which is pretty much the exact same) +# Disable = × ×˜×¨×œ +# Neutralized = × ×•×˜×¨×œ +#: ../src/chat_control.py:2180 +msgid "GPG encryption disabled" +msgstr "×”×¦×¤× ×ª GPG ×ž× ×•×˜×¨×œ×ª כעת" + +#: ../src/chat_control.py:2206 msgid "Session WILL be logged" msgstr "הסשן יירש×" -#: ../src/chat_control.py:2267 +#: ../src/chat_control.py:2208 msgid "Session WILL NOT be logged" msgstr "הסשן ×œ× ×™×™×¨×©×" +# Needs to be tested #. encryption %s active -#: ../src/chat_control.py:2284 +#: ../src/chat_control.py:2225 msgid "is" msgstr "×”×™× ×”" -#: ../src/chat_control.py:2284 +# Needs to be tested +#: ../src/chat_control.py:2225 msgid "is NOT" -msgstr "××™× ×”" +msgstr "*××™× ×”*" +# Needs to be tested #. chat session %s be logged -#: ../src/chat_control.py:2286 +#: ../src/chat_control.py:2227 msgid "will" msgstr "יירש×" -#: ../src/chat_control.py:2286 +#: ../src/chat_control.py:2227 msgid "will NOT" msgstr "×œ× ×™×™×¨×©×" +# Needs to be tested #. About encrypted chat session -#: ../src/chat_control.py:2290 +#: ../src/chat_control.py:2231 msgid "and authenticated" msgstr "×•×”×™× ×” מ×ומת" #. About encrypted chat session -#: ../src/chat_control.py:2294 +#: ../src/chat_control.py:2235 msgid "and NOT authenticated" msgstr "ו××™× ×” מ×ומתת" #. status will become 'is' or 'is not', authentificaed will become #. 'and authentificated' or 'and not authentificated', logged will become #. 'will' or 'will not' -#: ../src/chat_control.py:2301 +#: ../src/chat_control.py:2242 #, python-format msgid "" "%(type)s encryption %(status)s active %(authenticated)s.\n" @@ -3279,70 +3502,74 @@ msgstr "" "×”×¦×¤× ×ª %(type)s %(status)s מופעלת %(authenticated)s.\n" "סשן שיחתך %(logged)s ברשומות ההיסטוריה." -#: ../src/chat_control.py:2439 +# הסדרת סשן בוטלה +#: ../src/chat_control.py:2370 msgid "Session negotiation cancelled" msgstr "×ž×©× ×•×ž×ª×Ÿ סשן בוטל" -#: ../src/chat_control.py:2449 +#: ../src/chat_control.py:2380 msgid "This session WILL be archived on server" msgstr "סשן ×–×” ×™×•×©× ×‘×רכיון על שרת" -#: ../src/chat_control.py:2451 +#: ../src/chat_control.py:2382 msgid "This session WILL NOT be archived on server" msgstr "סשן ×–×” ×œ× ×™×•×©× ×‘×רכיון על שרת" -#: ../src/chat_control.py:2460 +#: ../src/chat_control.py:2391 msgid "This session is encrypted" msgstr "סשן ×–×” ×”×™× ×• מוצפן" -#: ../src/chat_control.py:2463 +#: ../src/chat_control.py:2394 msgid " and WILL be logged" msgstr " ויירש×" -#: ../src/chat_control.py:2465 +#: ../src/chat_control.py:2396 msgid " and WILL NOT be logged" msgstr " ×•×œ× ×™×™×¨×©×" -#: ../src/chat_control.py:2470 -msgid "" -"Remote contact's identity not verified. Click the shield button for more " -"details." -msgstr "זהות ×יש קשר מרוחק ×œ× ×ž×ומתת. לחץ על לחצן המגן עבור ×¤×¨×˜×™× × ×•×¡×¤×™×." +#: ../src/chat_control.py:2401 +msgid "Remote contact's identity not verified. Click the shield button for more details." +msgstr "זהות ×יש קשר מרוחק ×œ× ×ž×ומתת. × × ×œ×œ×—×•×¥ על כפתור המגן עבור ×¤×¨×˜×™× × ×•×¡×¤×™×." -#: ../src/chat_control.py:2472 +#: ../src/chat_control.py:2403 msgid "E2E encryption disabled" -msgstr "×”×¦×¤× ×ª E2E ×ž× ×•×˜×¨×œ×ª כעת" +msgstr "×”×¦×¤× ×ª E2E (קצה ×ל קצה) ×ž× ×•×˜×¨×œ×ª כעת" -#: ../src/chat_control.py:2520 ../src/chat_control.py:2534 +#: ../src/chat_control.py:2451 +#: ../src/chat_control.py:2465 msgid "The following message was NOT encrypted" msgstr "ההודעה הב××” ×œ× ×”×•×¦×¤× ×”" -#: ../src/chat_control.py:2526 +#: ../src/chat_control.py:2457 msgid "The following message was encrypted" msgstr "ההודעה הב××” ×”×•×¦×¤× ×”" +# ×–×” עתה קיבלת +# קיבלת ×–×” עתה +# קיבלת כעת #. %s is being replaced in the code with JID -#: ../src/chat_control.py:2797 +#: ../src/chat_control.py:2728 #, python-format msgid "You just received a new message from \"%s\"" msgstr "×–×” עתה קיבלת הודעה חדשה מן \"%s\"" -#: ../src/chat_control.py:2799 -msgid "" -"If you close this tab and you have history disabled, this message will be " -"lost." -msgstr "" -"×× ×›×¨×˜×™×¡×™×™×” זו תיסגר ובמידה ורשימת היסטוריה ×ž× ×•×˜×¨×œ×ª ×צלך. הודעה זו ת×בד." - -#: ../src/chat_control.py:2967 ../src/common/connection.py:523 -#: ../src/common/connection_handlers.py:1145 -#: ../src/common/connection_handlers.py:1269 -#: ../src/common/connection_handlers_events.py:913 -#: ../src/common/logger.py:1161 ../src/gajim.py:229 ../src/session.py:98 +# ת×ובד +#: ../src/chat_control.py:2729 +msgid "If you close this tab and you have history disabled, this message will be lost." +msgstr "×× ×œ×©×•× ×™×ª זו תיסגר ובמידה ורשימת היסטוריה ×ž× ×•×˜×¨×œ×ª ×צלך. הודעה זו ת×בד." + +#: ../src/chat_control.py:2896 +#: ../src/common/connection_handlers_events.py:911 +#: ../src/common/connection_handlers.py:955 +#: ../src/common/connection_handlers.py:1077 +#: ../src/common/connection.py:462 +#: ../src/common/logger.py:1155 +#: ../src/gajim.py:208 +#: ../src/session.py:100 msgid "Database Error" msgstr "שגי×ת מסד × ×ª×•× ×™×" -#: ../src/chat_control.py:2968 +#: ../src/chat_control.py:2897 #, python-format msgid "" "The database file (%s) cannot be read. Try to repair it or remove it (all " @@ -3351,64 +3578,76 @@ msgstr "" "קובץ מסד ×”× ×ª×•× ×™× (%s) ×œ× × ×™×ª×Ÿ לקרי××”. × ×¡×” ×œ×ª×§× ×• ×ו להסירו (כל ההיסטוריה " "ת×בד)." -#: ../src/chat_control.py:3205 ../src/gui_interface.py:1161 +#: ../src/chat_control.py:3134 +#: ../src/gui_interface.py:1151 #, python-format msgid "" "Unable to decrypt message from %s\n" "It may have been tampered with." msgstr "" -"×ין ×פשרות ×œ×¤×¢× ×— הודעה מ×ת %s\n" -"ייתכן ×›×™ הודעה זו × ×¤×’×ž×”." +"×œ× × ×™×ª×Ÿ ×œ×¤×¢× ×— ×ת ההודעה מ×ת %s\n" +"ייתכן שההודעה × ×¤×’×ž×”." -#: ../src/chat_control.py:3262 +# See: LRE string PDF +#: ../src/chat_control.py:3167 #, python-format msgid "%(name)s is now %(status)s" -msgstr "%(name)s מצוי/×” כעת במצב %(status)s" +msgstr "‫%(name)s מצוי/×” כעת במצב %(status)s " -#: ../src/chat_control.py:3321 +#: ../src/chat_control.py:3226 msgid "File transfer" msgstr "העברת קובץ" -#: ../src/chat_control.py:3324 +#: ../src/chat_control.py:3229 msgid "Size" msgstr "גודל" -#: ../src/chat_control.py:3326 +# Would it be proper to translate to _Download? +#: ../src/chat_control.py:3231 msgid "_Accept" -msgstr "_קבל" +msgstr "_קבלה" -#: ../src/chat_control.py:3347 ../src/filetransfers_window.py:211 +#: ../src/chat_control.py:3252 +#: ../src/filetransfers_window.py:211 msgid "File transfer completed" msgstr "העברת קובץ הושלמה" -#: ../src/chat_control.py:3383 ../src/dialogs.py:2927 ../src/dialogs.py:4614 -#: ../src/gui_interface.py:646 ../src/notify.py:278 +# ×”×–×ž× ×ª שיחת קבוצה +#: ../src/chat_control.py:3288 +#: ../src/dialogs.py:2828 +#: ../src/gui_interface.py:645 +#: ../src/notify.py:278 msgid "Groupchat Invitation" msgstr "×”×–×ž× ×” ×ל שיחת קבוצה" -#: ../src/chat_control.py:3405 ../src/gui_interface.py:1019 -#: ../src/roster_window.py:1991 +#: ../src/chat_control.py:3310 +#: ../src/gui_interface.py:1009 +#: ../src/roster_window.py:1981 msgid "Remote contact stopped transfer" msgstr "ההעברה הופסקה על ידי ×יש קשר מרוחק" -#: ../src/chat_control.py:3407 ../src/gui_interface.py:1022 -#: ../src/roster_window.py:1993 +#: ../src/chat_control.py:3312 +#: ../src/gui_interface.py:1012 +#: ../src/roster_window.py:1983 msgid "Error opening file" msgstr "שגי××” בפתיחת הקובץ" -#: ../src/chat_control.py:3409 ../src/filetransfers_window.py:247 +#: ../src/chat_control.py:3314 +#: ../src/filetransfers_window.py:247 msgid "File transfer stopped" msgstr "העברת קובץ × ×¢×¦×¨×”" -#: ../src/chat_control.py:3412 ../src/filetransfers_window.py:226 +#: ../src/chat_control.py:3317 +#: ../src/filetransfers_window.py:226 #: ../src/filetransfers_window.py:233 msgid "File transfer cancelled" msgstr "העברת קובץ בוטלה" -#: ../src/chat_control.py:3413 ../src/filetransfers_window.py:226 +#: ../src/chat_control.py:3318 +#: ../src/filetransfers_window.py:226 #: ../src/filetransfers_window.py:234 msgid "Connection with peer cannot be established." -msgstr "חיבור ×¢× ×¢×ž×™×ª ×œ× ×”×™×” ×פשרי לביסוס." +msgstr "חיבור ×¢× ×¢×ž×™×ª ×œ× ×”×™×” × ×™×ª×Ÿ לביסוס." #: ../src/command_system/implementation/custom.py:105 msgid "The same as using a doc-string, except it supports translation" @@ -3424,17 +3663,16 @@ msgstr "הרצת ביטוי בתוך מעטפת, שליחת פלט" #: ../src/command_system/implementation/middleware.py:74 msgid "Error during command execution!" -msgstr "שגי××” במהלך הוצ××” לפועל של פקודה!" +msgstr "" +# השיחה #: ../src/command_system/implementation/standard.py:50 msgid "Hide the chat buttons" msgstr "הסתרת ×œ×—×¦× ×™ שיחה" #: ../src/command_system/implementation/standard.py:56 -msgid "" -"Show help on a given command or a list of available commands if -a is given" -msgstr "" -"הצגת עזרה על פקודה × ×ª×•× ×” ×ו רשימה של פקודות ×–×ž×™× ×•×ª במידה וה××¨×’×•×ž× ×˜ ‎-a × ×™×ª×Ÿ" +msgid "Show help on a given command or a list of available commands if -a is given" +msgstr "הצגת עזרה ×ודות פקודה × ×ª×•× ×” ×ו רשימה של פקודות ×–×ž×™× ×•×ª במידה וה××¨×’×•×ž× ×˜ ‫â€-a‬ × ×™×ª×Ÿ" #: ../src/command_system/implementation/standard.py:83 msgid "Send a message to the contact" @@ -3446,20 +3684,23 @@ msgstr "שליחת פעולה (בגוף שלישי) ×ל השיחה ×”× ×•×›×—×™ #: ../src/command_system/implementation/standard.py:93 msgid "Show logged messages which mention given text" -msgstr "הצגת הודעות רשומות ×שר מ×זכרות תמליל × ×ª×•×Ÿ" +msgstr "הצגת הודעות רשומות שמ×זכרות תמליל × ×ª×•×Ÿ" # gajim-remote? #: ../src/command_system/implementation/standard.py:99 #, python-format msgid "%s: Nothing found" -msgstr "â€%s: ×œ× × ×ž×¦× ×“×‘×¨" +msgstr "‫%s: ×œ× × ×ž×¦× ×“×‘×¨" #: ../src/command_system/implementation/standard.py:105 msgid "Limit must be an integer" msgstr "×ª×—×•× ×ž×•×›×¨×— להיות ספרה" -#. Do not translate online, away, chat, xa, dnd -#: ../src/command_system/implementation/standard.py:130 +# BUG: move one line like שיוך and תפקיד +# Status can be given as one of the following values:\n +# online, away, chat, xa, dnd.\n +# +#: ../src/command_system/implementation/standard.py:129 msgid "" "\n" " Set the current status\n" @@ -3471,126 +3712,130 @@ msgstr "" "\n" " קביעת מצב החיבור ×”× ×•×›×—×™\n" "\n" -" מצב יכול להיות × ×ª×•×Ÿ בתור ×חד מתוך ×”×¢×¨×›×™× ×”×‘××™×:\n" -" â€online, away, chat, xa, dnd.\n" +" מצב יכול להיות × ×ª×•×Ÿ ×›×חד מן ×”×¢×¨×›×™× ×”×‘××™×:\n" +" online, away, chat, xa, dnd.\n" " " -#: ../src/command_system/implementation/standard.py:148 +#: ../src/command_system/implementation/standard.py:147 msgid "Set the current status to away" msgstr "קביעת מצב החיבור ×”× ×•×›×—×™ ×ל × ×¢×“×¨" -#: ../src/command_system/implementation/standard.py:151 -#: ../src/common/commands.py:110 ../src/common/helpers.py:249 +# ×× ×™ ×œ× ×›×ן +# ×œ× × ×ž×¦× +#: ../src/command_system/implementation/standard.py:150 +#: ../src/common/commands.py:109 +#: ../src/common/helpers.py:249 #: ../src/tooltips.py:189 msgid "Away" msgstr "× ×¢×“×¨" -#: ../src/command_system/implementation/standard.py:162 +#: ../src/command_system/implementation/standard.py:161 msgid "Set the current status to online" msgstr "קביעת מצב החיבור ×”× ×•×›×—×™ ×ל מקוון" -#: ../src/command_system/implementation/standard.py:165 +#: ../src/command_system/implementation/standard.py:164 msgid "Available" msgstr "זמין" -#: ../src/command_system/implementation/standard.py:185 -#: ../src/command_system/implementation/standard.py:267 +#: ../src/command_system/implementation/standard.py:184 +#: ../src/command_system/implementation/standard.py:266 msgid "Clear the text window" msgstr "טיהור תמליל החלון" -#: ../src/command_system/implementation/standard.py:190 -msgid "Toggle the OpenPGP encryption" -msgstr "הפעלת ×”×¦×¤× ×ª OpenPGP" +# BUG: should be> Toggle GPG encryption +#: ../src/command_system/implementation/standard.py:189 +msgid "Toggle the GPG encryption" +msgstr "הפעלת ×”×¦×¤× ×ª ‫GPG" -#: ../src/command_system/implementation/standard.py:195 +#: ../src/command_system/implementation/standard.py:194 msgid "Send a ping to the contact" msgstr "שליחת ×¤×™× ×’ ×ל ×יש הקשר" -#: ../src/command_system/implementation/standard.py:198 +#: ../src/command_system/implementation/standard.py:197 msgid "Command is not supported for zeroconf accounts" msgstr "פקודה ×œ× × ×ª×ž×›×ª עבור ×—×©×‘×•× ×•×ª zeroconf" -#: ../src/command_system/implementation/standard.py:202 +#: ../src/command_system/implementation/standard.py:201 msgid "Send DTMF sequence through an open audio session" -msgstr "שליחת רצף טזמ״ת (DTMF) מבעד סשן שמע פתוח" +msgstr "שליחת רצף טזמ״ת ‫(DTMF) מבעד סשן שמע פתוח" # ×¡×©× ×™× ×©×œ שמע -#: ../src/command_system/implementation/standard.py:205 +#: ../src/command_system/implementation/standard.py:204 msgid "No open audio sessions with the contact" msgstr "×œ× ×§×™×™×ž×™× ×¡×©× ×™ שמע ×¤×ª×•×—×™× ×¢× ×יש הקשר" -#: ../src/command_system/implementation/standard.py:208 +#: ../src/command_system/implementation/standard.py:207 #, python-format msgid "%s is not a valid tone" -msgstr "â€%s ××™× ×• טון (tone) תקף" +msgstr "‫%s ××™× ×• טון (tone) תקף" -#: ../src/command_system/implementation/standard.py:218 +#: ../src/command_system/implementation/standard.py:217 msgid "Audio sessions are not available" msgstr "סשן שמע ××™× ×• זמין" -#: ../src/command_system/implementation/standard.py:228 +#: ../src/command_system/implementation/standard.py:227 msgid "Video sessions are not available" msgstr "סשן ויד×ו ×œ× ×–×ž×™×Ÿ" -# תשומת לב , הקשב , צוּמִי -#: ../src/command_system/implementation/standard.py:235 +# תשומת־לב , הקשב , צוּמִי +#: ../src/command_system/implementation/standard.py:234 msgid "Send a message to the contact that will attract his (her) attention" -msgstr "שליחת הודעה ×שר תסב ×ת צומת ליבו של ×יש הקשר" +msgstr "שליחת הודעה שתסב ×ת צומת ליבו של ×יש הקשר" -#: ../src/command_system/implementation/standard.py:274 +#: ../src/command_system/implementation/standard.py:273 msgid "Change your nickname in a group chat" -msgstr "×©×™× ×•×™ ×©× ×”×›×™× ×•×™ שלך בתוך שיחת קבוצה" +msgstr "×©×™× ×•×™ ×©× ×›×™× ×•×™×™×š בשיחת קבוצה" #. invalid char -#: ../src/command_system/implementation/standard.py:279 ../src/config.py:3405 -#: ../src/dialogs.py:2154 +#: ../src/command_system/implementation/standard.py:278 +#: ../src/config.py:3387 +#: ../src/dialogs.py:2113 msgid "Invalid nickname" msgstr "×©× ×›×™× ×•×™ שגוי" -#: ../src/command_system/implementation/standard.py:284 +# מתו×ר, × ×§×•×‘ +#: ../src/command_system/implementation/standard.py:283 msgid "Open a private chat window with a specified occupant" msgstr "פתיחת חלון שיחה פרטית ×¢× × ×•×›×— מצוין" -#: ../src/command_system/implementation/standard.py:290 -#: ../src/command_system/implementation/standard.py:299 -#: ../src/command_system/implementation/standard.py:353 -#: ../src/command_system/implementation/standard.py:365 -#: ../src/command_system/implementation/standard.py:377 +#: ../src/command_system/implementation/standard.py:289 +#: ../src/command_system/implementation/standard.py:298 +#: ../src/command_system/implementation/standard.py:352 +#: ../src/command_system/implementation/standard.py:363 +#: ../src/command_system/implementation/standard.py:374 msgid "Nickname not found" msgstr "×©× ×›×™× ×•×™ ×œ× × ×ž×¦×" # BUG: him or her or they # he she -#: ../src/command_system/implementation/standard.py:293 -msgid "" -"Open a private chat window with a specified occupant and send him a message" +#: ../src/command_system/implementation/standard.py:292 +msgid "Open a private chat window with a specified occupant and send him a message" msgstr "פתיחת חלון שיחה פרטית ×¢× × ×•×›×— מצוין ושליחת הודעה ×ליו" -#: ../src/command_system/implementation/standard.py:302 +#: ../src/command_system/implementation/standard.py:301 msgid "Display or change a group chat topic" msgstr "הצגה ×ו ×©×™× ×•×™ × ×•×©× ×©×œ שיחת קבוצה" # תכלית -#: ../src/command_system/implementation/standard.py:310 +#: ../src/command_system/implementation/standard.py:309 msgid "Invite a user to a room for a reason" msgstr "×”×–×ž× ×ª משתמש ×ל חדר ×¢× ×¦×™×•×Ÿ סיבה" -#: ../src/command_system/implementation/standard.py:313 +#: ../src/command_system/implementation/standard.py:312 #, python-format msgid "Invited %s to %s" msgstr "×”_×–×ž× ×ª %s ×ל %s" -#: ../src/command_system/implementation/standard.py:316 +#: ../src/command_system/implementation/standard.py:315 msgid "Join a group chat given by a jid, optionally using given nickname" -msgstr "הצטרפות ×ל שיחת קבוצה לפי jid, ×פשרי לעשות שימוש ×‘×©× ×›×™× ×•×™ × ×ª×•×Ÿ" +msgstr "הצטרפות ×ל שיחת קבוצה לפי כתובת ‫jid, ×פשרי לעשות שימוש ×‘×©× ×›×™× ×•×™ × ×ª×•×Ÿ" -#: ../src/command_system/implementation/standard.py:333 -msgid "" -"Leave the groupchat, optionally giving a reason, and close tab or window" -msgstr "" -"עזיבת שיחת קבוצה, קיימת ×פשרות לתת סיבה, ולסגור ×ת הכרטיסייה ×ו ×ת החלון" +# ×פשרי לתת +#: ../src/command_system/implementation/standard.py:332 +msgid "Leave the groupchat, optionally giving a reason, and close tab or window" +msgstr "עזיבת שיחת קבוצה, קיימת ×פשרות לתת סיבה, ולסגור ×ת ×”×œ×©×•× ×™×ª ×ו החלון" -#: ../src/command_system/implementation/standard.py:338 +#: ../src/command_system/implementation/standard.py:337 msgid "" "\n" " Ban user by a nick or a jid from a groupchat\n" @@ -3599,75 +3844,65 @@ msgid "" " " msgstr "" "\n" -" חסימת משתמש מתוך שיחת קבוצה לפי ×›×™× ×•×™ ×ו לפי jid\n" +" חסימת משתמש מן שיחת קבוצה לפי ×›×™× ×•×™ ×ו לפי כתובת ‫jid\n" "\n" -" במידה ×•×©× ×›×™× ×•×™ × ×ª×•×Ÿ ×œ× × ×ž×¦× ×–×” ייוחס בתור jid.\n" +" במידה ×•×©× ×›×™× ×•×™ × ×ª×•×Ÿ ×œ× × ×ž×¦× ×–×” ייוחס ככתובת ‫jid.\n" " " -#: ../src/command_system/implementation/standard.py:350 +#: ../src/command_system/implementation/standard.py:349 msgid "Kick user by a nick from a groupchat" -msgstr "בעיטת משתמש מתוך שיחת קבוצה לפי ×›×™× ×•×™" +msgstr "בעיטת משתמש מן שיחת קבוצה לפי ×›×™× ×•×™" -#. Do not translate moderator, participant, visitor, none -#: ../src/command_system/implementation/standard.py:358 +# ×חר××™, משתתף, מבקר, ×œ×œ× +#: ../src/command_system/implementation/standard.py:356 msgid "" "Set occupant role in group chat.\n" " Role can be given as one of the following values:\n" " moderator, participant, visitor, none" msgstr "" -"קביעת תפקיד × ×•×›×— בתוך שיחת קבוצה.\n" -" תפקיד יכול להיות × ×ª×•×Ÿ בתור ×חד מתוך ×”×¢×¨×›×™× ×”×‘××™×:\n" -" â€moderator, participant, visitor, none" +"הגדרת תפקיד × ×•×›×— בשיחת קבוצה.\n" +" תפקיד יכול להיות × ×ª×•×Ÿ ×›×חד מן ×”×¢×¨×›×™× ×”×‘××™×:\n" +" ‫moderator, participant, visitor, none" -#: ../src/command_system/implementation/standard.py:363 +#: ../src/command_system/implementation/standard.py:361 msgid "Invalid role given" msgstr "× ×™×ª×Ÿ תפקיד שגוי" -#. Do not translate owner, admin, member, outcast, none -#: ../src/command_system/implementation/standard.py:370 +# בעלי×, ×ž× ×”×œ, חבר, מוחר×, ×œ×œ× +#: ../src/command_system/implementation/standard.py:367 msgid "" "Set occupant affiliation in group chat.\n" " Affiliation can be given as one of the following values:\n" " owner, admin, member, outcast, none" msgstr "" -"קביעת שיוך × ×•×›×— בתוך שיחת קבוצה.\n" -" שיוך יכול להיות × ×ª×•×Ÿ בתור ×חד מתוך ×”×¢×¨×›×™× ×”×‘××™×:\n" -" â€owner, admin, member, outcast, none" +"הגדרת שיוך × ×•×›×— בשיחת קבוצה.\n" +" שיוך יכול להיות × ×ª×•×Ÿ ×›×חד מן ×”×¢×¨×›×™× ×”×‘××™×:\n" +" ‫owner, admin, member, outcast, none" -#: ../src/command_system/implementation/standard.py:375 +#: ../src/command_system/implementation/standard.py:372 msgid "Invalid affiliation given" msgstr "× ×™×ª×Ÿ שיוך שגוי" -#: ../src/command_system/implementation/standard.py:383 +#: ../src/command_system/implementation/standard.py:380 msgid "Display names of all group chat occupants" -msgstr "הצגת שמות של כל ×”× ×•×›×—×™× ×‘×ª×•×š שיחת קבוצה" +msgstr "הצגת השמות של כל ×”× ×•×›×—×™× ×‘×©×™×—×ª קבוצה" -#: ../src/command_system/implementation/standard.py:405 +#: ../src/command_system/implementation/standard.py:402 msgid "Forbid an occupant to send you public or private messages" msgstr "×סירה על × ×•×›×— לשלוח ×ליך הודעות פומביות ×ו פרטיות" -#: ../src/command_system/implementation/standard.py:410 +#: ../src/command_system/implementation/standard.py:407 msgid "Allow an occupant to send you public or private messages" msgstr "התרה ×œ× ×•×›×— לשלוח לך הודעות פומביות ×ו פרטיות" -#: ../src/command_system/mapping.py:165 ../src/command_system/mapping.py:175 -#: ../src/command_system/mapping.py:195 -#, fuzzy -msgid "Missing arguments" -msgstr "cli?" - -#: ../src/command_system/mapping.py:262 -#, fuzzy -msgid "Excessive arguments" -msgstr "cli?" - #: ../src/common/check_paths.py:39 msgid "creating logs database" -msgstr "יוצר כעת רשומות מסד × ×ª×•× ×™×" +msgstr "רשומות מסד × ×ª×•× ×™× × ×•×¦×¨×•×ª כעת" +# מתייצר #: ../src/common/check_paths.py:87 msgid "creating cache database" -msgstr "יוצר כעת מטמון מסד × ×ª×•× ×™×" +msgstr "מטמון מסד × ×ª×•× ×™× × ×•×¦×¨ כעת" #: ../src/common/check_paths.py:278 ../src/common/check_paths.py:285 #: ../src/common/check_paths.py:292 ../src/common/check_paths.py:299 @@ -3675,153 +3910,171 @@ msgstr "יוצר כעת מטמון מסד × ×ª×•× ×™×" #: ../src/common/check_paths.py:320 ../src/common/check_paths.py:327 #, python-format msgid "%s is a file but it should be a directory" -msgstr "â€%s ×”×™× ×• קובץ ×ך ×מור להיות מדור" - -#: ../src/common/check_paths.py:279 ../src/common/check_paths.py:286 -#: ../src/common/check_paths.py:293 ../src/common/check_paths.py:300 -#: ../src/common/check_paths.py:307 ../src/common/check_paths.py:314 -#: ../src/common/check_paths.py:321 ../src/common/check_paths.py:328 -#: ../src/common/check_paths.py:338 ../src/common/check_paths.py:346 -#, fuzzy +msgstr "‫%s ×”×™× ×• קובץ ×ך ×מור להיות מדור" + +# CLI? +# The session of Gajim will end now +# הסשן של Gajim ×™×¡×•×™×™× ×›×¢×ª +#: ../src/common/check_paths.py:279 +#: ../src/common/check_paths.py:286 +#: ../src/common/check_paths.py:293 +#: ../src/common/check_paths.py:300 +#: ../src/common/check_paths.py:307 +#: ../src/common/check_paths.py:314 +#: ../src/common/check_paths.py:321 +#: ../src/common/check_paths.py:328 +#: ../src/common/check_paths.py:338 +#: ../src/common/check_paths.py:346 msgid "Gajim will now exit" -msgstr "cli" +msgstr "" #: ../src/common/check_paths.py:337 ../src/common/check_paths.py:345 #, python-format msgid "%s is a directory but should be a file" -msgstr "â€%s ×”×™× ×• מדור ×ך ×מור להיות קובץ" +msgstr "‫%s ×”×™× ×• מדור ×ך ×מור להיות קובץ" #: ../src/common/check_paths.py:366 #, python-format msgid "creating %s directory" msgstr "יוצר כעת מדור %s" -#: ../src/common/commands.py:86 +#: ../src/common/commands.py:85 msgid "Change status information" msgstr "×©× ×” מידע מצב" -#: ../src/common/commands.py:101 +#: ../src/common/commands.py:100 msgid "Change status" -msgstr "×©× ×” מצב חיבור" +msgstr "×©× ×” מצב־חיבור" -#: ../src/common/commands.py:102 +#: ../src/common/commands.py:101 msgid "Set the presence type and description" -msgstr "קביעת טיפוס ותי×ור ×”× ×•×›×—×•×ª" +msgstr "הגדרת טיפוס ×”× ×•×›×—×•×ª ותי×ור" # BUG: Free for Chat # BUG: x2 -#: ../src/common/commands.py:108 +#: ../src/common/commands.py:107 msgid "Free for chat" msgstr "חופשי לשיחה" -#: ../src/common/commands.py:109 +#: ../src/common/commands.py:108 msgid "Online" msgstr "מקוון" -#: ../src/common/commands.py:111 +#: ../src/common/commands.py:110 msgid "Extended away" msgstr "× ×¢×“×¨ לזמן ×רוך" -#: ../src/common/commands.py:112 +#: ../src/common/commands.py:111 msgid "Do not disturb" msgstr "× × ×œ× ×œ×”×¤×¨×™×¢" # Needs to be tested -#: ../src/common/commands.py:113 +#: ../src/common/commands.py:112 msgid "Offline - disconnect" msgstr "×œ× ×ž×§×•×•×Ÿ - ×ž× ×•×ª×§" # BUG: Remove colon because it is appearing in Psi with two colons # תי×ור × ×•×›×—×•×ª:: -#: ../src/common/commands.py:118 +#: ../src/common/commands.py:117 msgid "Presence description:" msgstr "תי×ור × ×•×›×—×•×ª:" -#: ../src/common/commands.py:153 ../src/common/commands.py:330 +# The word ×”×©×ª× ×” is also urination so do not use it +# המצב ×©×•× ×”. +#: ../src/common/commands.py:152 +#: ../src/common/commands.py:324 msgid "The status has been changed." msgstr "מצב החיבור ×”×©×ª× ×”." -#: ../src/common/commands.py:185 ../src/common/commands.py:211 +#: ../src/common/commands.py:184 +#: ../src/common/commands.py:210 msgid "Leave Groupchats" msgstr "עזיבת שיחות קבוצה" -#: ../src/common/commands.py:201 +#: ../src/common/commands.py:200 #, python-format msgid "%(nickname)s on %(room_jid)s" -msgstr "%(nickname)s בחדר %(room_jid)s" +msgstr "‫%(nickname)s בתוך החדר %(room_jid)s" -#: ../src/common/commands.py:205 +#: ../src/common/commands.py:204 msgid "You have not joined a groupchat." msgstr "×œ× ×”×¦×˜×¨×¤×ª ×ל שיחת קבוצה." -#: ../src/common/commands.py:212 +#: ../src/common/commands.py:211 msgid "Choose the groupchats you want to leave" -msgstr "בחירת שיחות קבוצה ×שר ×‘×¨×¦×•× ×š לעזוב" +msgstr "בחירת שיחות קבוצה ×©×‘×¨×¦×•× ×š לעזוב" #. Make special context menu if group is Groupchats -#: ../src/common/commands.py:216 ../src/common/contacts.py:131 -#: ../src/common/helpers.py:67 ../src/roster_window.py:824 -#: ../src/roster_window.py:1736 ../src/roster_window.py:1738 -#: ../src/roster_window.py:2621 ../src/roster_window.py:5714 +#: ../src/common/commands.py:215 +#: ../src/common/contacts.py:131 +#: ../src/common/helpers.py:67 +#: ../src/roster_window.py:820 +#: ../src/roster_window.py:1726 +#: ../src/roster_window.py:1728 +#: ../src/roster_window.py:2611 +#: ../src/roster_window.py:5766 msgid "Groupchats" msgstr "שיחות קבוצה" -#: ../src/common/commands.py:257 +#: ../src/common/commands.py:256 msgid "You left the following groupchats:" msgstr "עזבת ×ת שיחות הקבוצה הב×ות:" -#: ../src/common/commands.py:269 +# להעביר הל××” +# שליחת +#: ../src/common/commands.py:268 msgid "Forward unread messages" -msgstr "×§×“× ×”×•×“×¢×•×ª ×שר ×œ× × ×§×¨×ו" +msgstr "×§×™×“×•× ×”×•×“×¢×•×ª ×©×œ× × ×§×¨×ו" -#: ../src/common/commands.py:296 +#: ../src/common/commands.py:294 msgid "All unread messages have been forwarded." -msgstr "כל ההודעות ×שר ×œ× × ×§×¨×ו קודמו." +msgstr "כל ההודעות ×©×œ× × ×§×¨×ו קודמו." -#: ../src/common/commands.py:304 +# ול×חר מכן ×”×ª× ×ª×§ +#: ../src/common/commands.py:302 msgid "Forward unread message then disconnect" -msgstr "×§×“× ×”×•×“×¢×•×ª ×שר ×œ× × ×§×¨×ו ×•×”×ª× ×ª×§ ל×חר מכן" +msgstr "×§×™×“×•× ×”×•×“×¢×•×ª ×©×œ× × ×§×¨×ו ×•×”×ª× ×ª×§×•×ª ל×לתר" #: ../src/common/config.py:76 msgid "Play sound when user is busy" -msgstr "× ×’×Ÿ ×¦×œ×™×œ×™× ×›×שר המשתמש עסוק" +msgstr "השמעת ×¦×œ×™×œ×™× ×›×שר המשתמש עסוק" +# שדון #: ../src/common/config.py:77 msgid "Use D-Bus and Notification-Daemon to show notifications" msgstr "השתמש ב×פיק D-Bus ×•×’× Notification-Daemon כדי להציג התר×ות" #: ../src/common/config.py:79 msgid "Show only online and free for chat contacts in roster." -msgstr "הצגה בלעדית של ×× ×©×™ קשר ×ž×§×•×•× ×™× ×•×—×•×¤×©×™×™× ×œ×©×™×—×” ברשימה." +msgstr "הצגה של ×× ×©×™ קשר ×ž×§×•×•× ×™× ×•×¤× ×•×™×™× ×œ×©×™×—×” בלבד ברשימה." #: ../src/common/config.py:82 msgid "Time in minutes, after which your status changes to away." -msgstr "זמן בדקות, ×שר ל×חריו מצבך ×™×©×ª× ×” ×ל × ×¢×“×¨." +msgstr "זמן בדקות, של×חריו מצבך ×™×©×ª× ×” ×ל × ×¢×“×¨." # במצב סרק #: ../src/common/config.py:83 msgid "$S (Away as a result of being idle more than $T min)" -msgstr "$S (× ×¢×“×¨ כתוצ××” מהיותי בחוסר פעילות למשך של יותר מ־$T דקות)" +msgstr "$S (× ×¢×“×¨ כתוצ××” מהיותי בחוסר פעילות למשך יותר מ־$T דקות)" +# BUG: autoaway time or the ACE entry autoawaytime? #: ../src/common/config.py:83 -msgid "$S will be replaced by current status message, $T by autoawaytime." -msgstr "" -"×”×ª×•×•×™× $S יוחלפו על ידי הודעת מצב × ×•×›×—×™×ª, ×•×”×ª×•×•×™× $T יוחלפו בערך ×”× ×§×•×‘ " -"ברשומה autoawaytime." +msgid "$S will be replaced by current status message, $T by autoaway time." +msgstr "×”×ª×•×•×™× $S יוחלפו על ידי הודעת מצב × ×•×›×—×™×ª, ×•×”×ª×•×•×™× $T יוחלפו בערך ×”× ×§×•×‘ ברשומה autoawaytime." +# ×”×× ×פשר למחוק ×ת הפסיק ×ž×©×•× ×©×§×™×™×ž×ª ש ×חרי? #: ../src/common/config.py:85 msgid "Time in minutes, after which your status changes to not available." -msgstr "זמן בדקות, ×שר ל×חריו מצבך ×™×©×ª× ×” ×ל ×œ× ×–×ž×™×Ÿ." +msgstr "זמן בדקות, של×חריו מצבך ×™×©×ª× ×” ×ל ×œ× ×–×ž×™×Ÿ." #: ../src/common/config.py:86 msgid "$S (Not available as a result of being idle more than $T min)" -msgstr "$S (×œ× ×–×ž×™×Ÿ כתוצ××” מהיותי בחוסר פעילות למשך של יותר מ־$T דקות)" +msgstr "$S (×œ× ×–×ž×™×Ÿ כתוצ××” מהיותי בחוסר פעילות למשך יותר מ־$T דקות)" +# BUG: autoxa time or autoxatime of ACE #: ../src/common/config.py:86 -msgid "$S will be replaced by current status message, $T by autoxatime." -msgstr "" -"×”×ª×•×•×™× $S יוחלפו על ידי הודעת מצב × ×•×›×—×™×ª, ×•×”×ª×•×•×™× $T יוחלפו בערך ×”× ×§×•×‘ " -"ברשומה autoxatime." +msgid "$S will be replaced by current status message, $T by autoxa time." +msgstr "×”×ª×•×•×™× $S יוחלפו על ידי הודעת מצב × ×•×›×—×™×ª, ×•×”×ª×•×•×™× $T יוחלפו בערך ×”× ×§×•×‘ ברשומה autoxatime." # מגש המערכת #: ../src/common/config.py:89 @@ -3833,7 +4086,7 @@ msgstr "" #: ../src/common/config.py:90 msgid "Allow to hide the roster window even if the tray icon is not shown." -msgstr "×פשר הסתרת הרשימה ×פילו ×›×שר צלמית המגש ××™× × ×” מוצגת." +msgstr "×פשר הסתרת הרשימה ×פילו ×× ×¦×œ×ž×™×ª המגש ××™× × ×” מוצגת." #: ../src/common/config.py:95 msgid "Incoming nickname color." @@ -3870,6 +4123,7 @@ msgstr "צבע התר××” של ×”×ª× ×ª×§×•×ª ×יש קשר" msgid "New message/email notification color." msgstr "צבע התר××” של הודעה/דו×״ל חדש/×”." +# בקשה להעברת קובץ #. dodgerblue #: ../src/common/config.py:105 msgid "File transfer request notification color." @@ -3897,12 +4151,13 @@ msgstr "צבע התר××” של ×”×–×ž× ×” ×ל שיחת קבוצה" #. tan1 #: ../src/common/config.py:109 msgid "Status changed notification background color" -msgstr "צבע רקע ×חורי של התר×ת ×©×™× ×•×™ מצב חיבור" +msgstr "צבע רקע ×חורי של התר×ת ×©×™× ×•×™ מצב־חיבור" #. thistle2 #: ../src/common/config.py:110 +#, fuzzy msgid "Other dialogs color." -msgstr "צבע של תיבות דו שיח ×חרות." +msgstr "צבע דו־שיח ×חר." #. white #: ../src/common/config.py:111 @@ -3931,15 +4186,18 @@ msgid "" msgstr "רשימה (רווח מפריד) של שורות (×—×©×‘×•× ×•×ª וקבוצות) מכווצות." #. sorted alphanum -#: ../src/common/config.py:117 ../src/common/config.py:533 -#: ../src/common/optparser.py:295 ../src/common/optparser.py:491 -#: ../src/common/optparser.py:525 ../src/gui_interface.py:2795 +#: ../src/common/config.py:117 +#: ../src/common/config.py:528 +#: ../src/common/optparser.py:295 +#: ../src/common/optparser.py:491 +#: ../src/common/optparser.py:525 +#: ../src/gui_interface.py:2761 msgid "default" msgstr "ברירת מחדל" #: ../src/common/config.py:123 msgid "Language used by speller" -msgstr "השפה ×שר בשימוש על ידי מ×יית" +msgstr "השפה שבשימוש על ידי מ×יית" #: ../src/common/config.py:124 msgid "" @@ -3951,409 +4209,295 @@ msgstr "" "â€'sometimes' - הדפסת זמן כל print_ichat_every_foo_minutes דקות.\n" "â€'never' - ×œ× ×œ×”×“×¤×™×¡ זמן בכלל." -# while the value 1 will +# while the value 4 will +# בעוד שהערך 4 יספק #: ../src/common/config.py:125 -msgid "" -"Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " -"to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " -"This is used only if print_time is 'sometimes'." -msgstr "" -"הדפסת זמן בתוך שיחות ב×מצעות שעון מעורפל. ערך הערפול × ×¢ בין 1 ×ל 4, ×ו 0 " -"×œ× ×˜×¨×•×œ שעון מעורפל. בעוד שהערך 1 יספק ×ת השעה המדויקת ביותר, הערך 4 יספק ×ת " -"השעה ×”×›×™ פחות מדויקת. ×פשרות זו × ×™×ª× ×ª לשימוש רק ×›×שר print_time מוגדר ×ל " -"'sometimes'." +msgid "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. This is used only if print_time is 'sometimes'." +msgstr "הדפסת זמן בשיחות ב×מצעות שעון מעורפל. ערך הערפול × ×¢ בין 1 ×ל 4, ×ו 0 ×œ× ×˜×¨×•×œ שעון מעורפל. הערך 1 יספק ×ת השעה המדויקת ביותר, הערך 4 יספק ×ת השעה ×”×›×™ פחות מדויקת. ×פשרות זו × ×™×ª× ×ª לשימוש רק ×× print_time מוגדר ×ל 'sometimes'." #: ../src/common/config.py:128 msgid "Treat * / _ pairs as possible formatting characters." -msgstr "התייחסות ×ל ×¦×ž×“×™× ×©×œ * / _ בתור תווי עיצוב ×פשריי×." +msgstr "התייחסות ×ל ×¦×ž×“×™× ×©×œ * / _ כתווי עיצוב ×פשריי×." +# מודגשות ובו בזמן ×¢× ×”×›×•×›×‘×™×•×ª * * ×œ× ×ž×•×¡×¨×•×ª (×ª×•×•×™× ×ו כוכביות) #: ../src/common/config.py:129 -msgid "" -"If True, do not remove */_ . So *abc* will be bold but with * * not removed." -msgstr "" -"במידה והעדפה זו מופעלת, ×ל תסיר */_ . כך שמחרוזת כגון *×בג* תהיה מובלטת ×›×שר " -"* * ×œ× ×ž×•×¡×¨×™×." +msgid "If True, do not remove */_ . So *abc* will be bold but with * * not removed." +msgstr "במידה והעדפה זו מופעלת, ×ל תסיר */_ . כך שמחרוזת כגון *×בג* יהיו מודגשות ביחד ×¢× ×”×ª×•×•×™× * * ×œ× ×ž×•×¡×¨×™×." +# If you want to +# ×× ×ין ×‘×¨×¦×•× ×š +# ×× ×™×© ×‘×¨×¦×•× ×š #: ../src/common/config.py:132 msgid "" "Uses ReStructured text markup to send HTML, plus ascii formatting if " "selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" "restructuredtext.html (If you want to use this, install docutils)" msgstr "" -"השתמש בשיטת קידוד ReStructured כדי לשלוח HTML, ×‘× ×•×¡×£ ×’× ×¢×™×¦×•×‘ ascii במידה " -"×•× ×‘×—×¨. לתחביר, ר×ו http://docutils.sourceforge.net/docs/ref/rst/" -"restructuredtext.html (×× ×¨×¦×•× ×š להפיק מזה שימוש, יש להתקין docutils)" +# בהשלמת ×›×™× ×•×™ ×וטומטית #: ../src/common/config.py:141 -msgid "" -"Character to add after nickname when using nick completion (tab) in group " -"chat." -msgstr "" -"תו להוספה ל×חר ×©× ×›×™× ×•×™ ×›×שר ×ž×©×ª×ž×©×™× ×‘×”×©×œ×ž×ª ×›×™× ×•×™ (tab) בתוך שיחת קבוצה." +msgid "Character to add after nickname when using nick completion (tab) in group chat." +msgstr "תו להוספה ל×חר ×©× ×›×™× ×•×™ ×›×שר ×ž×©×ª×ž×©×™× ×‘×”×©×œ×ž×ª ×›×™× ×•×™ (tab) בשיחת קבוצה." # מוצע #: ../src/common/config.py:142 -msgid "" -"Character to propose to add after desired nickname when desired nickname is " -"used by someone else in group chat." -msgstr "" -"תו להציע להוספה ל×חר ×©× ×”×›×™× ×•×™ הרצוי ×›×שר ×–×” בשימוש על ידי מישהו ×חר בתוך " -"שיחת קבוצה." +msgid "Character to propose to add after desired nickname when desired nickname is used by someone else in group chat." +msgstr "תו להציע להוספה ל×חר ×©× ×”×›×™× ×•×™ הרצוי ×›×שר ×–×” בשימוש על ידי מישהו ×חר בשיחת קבוצה." +# BUG: TYPO: If True, (Case is 'T', not 't') +# ×ª× ×•×—×ª #: ../src/common/config.py:160 -msgid "" -"If True, Gajim will save roster position when hiding roster, and restore it " -"when showing roster." -msgstr "" -"במידה והעדפה זו מופעלת, Gajim ישמור ×ת ×ž×™×§×•× ×”×¨×©×™×ž×” ×›×שר הרשימה מוסתרת, " -"וישחזרה ×›×שר הרשימה מוצגת." +msgid "If true, Gajim will save roster position when hiding roster, and restore it when showing roster." +msgstr "במידה והעדפה זו מופעלת, Gajim ישמור ×ת ×ž×™×§×•× ×”×¨×©×™×ž×” ×›×שר הרשימה מוסתרת, וישחזרה ×›×שר הרשימה מוצגת." # ר××” -#: ../src/common/config.py:172 -msgid "" -"This option let you customize timestamp that is printed in conversation. For " -"exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " -"strftime for full documentation: http://docs.python.org/lib/module-time.html" -msgstr "" -"×פשרות זו מ×פשרת לך להת××™× ×ת חותמת הזמן המודפסת בתוך דיון. למשל \"[%H:%M] " -"\" תציג \"[שעה:דקה] \". לרשותך ×§×™×™× ×ž×¡×ž×š Python ×ודות strftime עבור תיעוד " -"×ž×œ× ×‘×›×ª×•×‘×ª: http://docs.python.org/lib/module-time.html" +#: ../src/common/config.py:171 +msgid "This option let you customize timestamp that is printed in conversation. For exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on strftime for full documentation: http://docs.python.org/lib/module-time.html" +msgstr "×פשרות זו מ×פשרת לך להת××™× ×ת חותמת הזמן המודפסת בדיון. למשל \"[%H:%M] \" תר××” \"[שעה:דקה] \". ×§×™×™× ×œ×¨×©×•×ª×š מסמך Python ×ודות strftime עבור תיעוד ×ž×œ× ×‘×›×ª×•×‘×ª: http://docs.python.org/lib/module-time.html" -#: ../src/common/config.py:173 +#: ../src/common/config.py:172 msgid "Characters that are printed before the nickname in conversations" -msgstr "×ª×•×•×™× ×שר ×ž×•×“×¤×¡×™× ×œ×¤× ×™ ×©× ×›×™× ×•×™ בתוך ×“×™×•× ×™×" +msgstr "×ª×•×•×™× ×©×ž×•×“×¤×¡×™× ×œ×¤× ×™ ×©× ×›×™× ×•×™ ×‘×“×™×•× ×™×" -#: ../src/common/config.py:174 +#: ../src/common/config.py:173 msgid "Characters that are printed after the nickname in conversations" -msgstr "×ª×•×•×™× ×שר ×ž×•×“×¤×¡×™× ×חרי ×©× ×›×™× ×•×™ בתוך ×“×™×•× ×™×" +msgstr "×ª×•×•×™× ×©×ž×•×“×¤×¡×™× ×חרי ×©× ×›×™× ×•×™ ×‘×“×™×•× ×™×" -#: ../src/common/config.py:177 -msgid "" -"Specify the command to run when new mail arrives, e.g.: /usr/bin/getmail -q" -msgstr "" -"ציון הפקודה ×שר ×‘×¨×¦×•× ×š להריץ ×›×שר דו×ר חדש מגיעה, למשל: ‎/usr/bin/getmail -q" +# LRO character has solved the problem! +# Yann, we can also do this: +# למשל:\n +# /usr/bin/getmail -q +#: ../src/common/config.py:176 +msgid "Specify the command to run when new mail arrives, e.g.: /usr/bin/getmail -q" +msgstr "ציון הפקודה ×©×‘×¨×¦×•× ×š להריץ ×›×שר דו×ר חדש מגיעה, למשל: â€/usr/bin/getmail -q" -#: ../src/common/config.py:179 +#: ../src/common/config.py:178 msgid "Add * and [n] in roster title?" msgstr "×”×× ×œ×”×•×¡×™×£ * ×•×’× [n] בכותרת הרשימה?" # × ×¤×ª×—×ª שוב -#: ../src/common/config.py:180 -msgid "" -"How many lines to remember from previous conversation when a chat tab/window " -"is reopened?" -msgstr "כמה שורות לזכור מתוך דיון ×§×•×“× ×›×שר חלון/כרטיסייה שיחה × ×¤×ª×—×™× ×ž×—×“×©." +# BUG: Question mark ? at the end +#: ../src/common/config.py:179 +msgid "How many lines to remember from previous conversation when a chat tab/window is reopened." +msgstr "כמה שורות לזכור מן דיון ×§×•×“× ×›×שר חלון/×œ×©×•× ×™×ª שיחה × ×¤×ª×—×ª מחדש." -#: ../src/common/config.py:181 +#: ../src/common/config.py:180 msgid "How many minutes should last lines from previous conversation last." -msgstr "כמה דקות על שורות ××—×¨×•× ×•×ª מתוך דיון ×§×•×“× ×œ×”×™×©×ר." +msgstr "כמה דקות על שורות ××—×¨×•× ×•×ª מן דיון ×§×•×“× ×œ×”×™×©×ר." # ×œ×œ× ×’×‘×•×œ/סייג +#: ../src/common/config.py:181 +msgid "How many lines to request from server when entering a groupchat. -1 means no limit" +msgstr "כמה שורות לבקש מן שרת בעת ×›× ×™×¡×” ×ל שיחת קבוצה. הערך 1- מסמל ××™ הגבלה" + +# BUG: when ? entering #: ../src/common/config.py:182 -msgid "" -"How many lines to request from server when entering a groupchat. -1 means no " -"limit" -msgstr "כמה שורות לבקש מתוך שרת בעת ×›× ×™×¡×” ×ל שיחת קבוצה. הערך 1- מסמל ××™ הגבלה" +msgid "How many minutes back to request logs when a entering a groupchat. -1 means no limit" +msgstr "כמה דקות ל×חור לבקש רשומות בעת התחברות ×ל שיחת קבוצה. הערך 1- מסמל ××™ הגבלה" +# × ×™×¡×™×•×Ÿ #: ../src/common/config.py:183 -msgid "" -"How many minutes back to request logs when entering a groupchat. -1 means no " -"limit" -msgstr "" -"כמה דקות ל×חור לבקש רשומות בעת התחברות ×ל שיחת קבוצה. הערך 1- מסמל ××™ הגבלה" +msgid "How many seconds to wait before trying to autorejoin to a conference you are being disconnected from. Set to 0 to disable autorejoining." +msgstr "כמה ×©× ×™×•×ª להמתין ×œ×¤× ×™ ש×× ×• ×ž× ×¡×™× ×œ×”×¦×˜×¨×£ ×וטומטית ×ל שיחת ועידה ×©×ž×ž× ×” ×”×™× ×š ×ž×ª× ×ª×§. הגדר ×ל 0 כדי ×œ× ×˜×¨×œ הצטרפות ×וטומטית." +# הצטרפות חוזרת ×וטומטית #: ../src/common/config.py:184 -msgid "" -"How many seconds to wait before trying to autorejoin to a conference you are " -"being disconnected from. Set to 0 to disable autorejoining." -msgstr "" -"כמה ×©× ×™×•×ª להמתין ×˜×¨× × ×™×¡×™×•×Ÿ להצטרף ×וטומטית ×ל שיחת ועידה ×שר ×ž×ž× ×” ×”×™× ×š " -"×ž×ª× ×ª×§. הגדר ×ל 0 כדי ×œ× ×˜×¨×œ הצטרפות ×וטומטית." +msgid "Should autorejoin be activated when we are being kicked from a conference?" +msgstr "×”×× ×”×¦×˜×¨×¤×•×ª ×וטומטית צריכה להיות מופעלת ×›×שר ×× ×—× ×• × ×‘×¢×˜×™× ×ž×Ÿ שיחת ועידה?" #: ../src/common/config.py:185 -msgid "" -"Should autorejoin be activated when we are being kicked from a conference?" -msgstr "" -"×”×× ×¢×œ הצטרפות חוזרת ×וטומטית להיות מופעלת ×›×שר ×× ×—× ×• × ×‘×¢×˜×™× ×ž×ª×•×š שיחת ועידה?" - -#: ../src/common/config.py:186 -msgid "" -"Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " -"Client default behaviour)." -msgstr "" -"שליחת הודעה בלחיצה על Ctrl+Enter ויצירת שורה חדשה ב×מצעות המקש Enter " -"(×”×ª× ×”×’×•×ª משתמטת של Mirabilis לקוח ICQ)." +msgid "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ Client default behaviour)." +msgstr "שליחת הודעה בלחיצה על Ctrl+Enter ויצירת שורה חדשה ב×מצעות המקש Enter (×”×ª× ×”×’×•×ª משתמטת של Mirabilis לקוח ICQ)." -# Ctrl+מעלה -#: ../src/common/config.py:188 +# מקש־למעלה +#: ../src/common/config.py:187 msgid "How many lines to store for Ctrl+KeyUP." msgstr "כמה שורות ל×חסן עבור Ctrl+KeyUP." -#: ../src/common/config.py:191 +#: ../src/common/config.py:190 #, python-format -msgid "" -"Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' " -"which means use wiktionary." -msgstr "" -"×ו כתובת url מות×מת ×¢× %s בתוכה ×›×שר הסימן %s ×”×™× ×• המילה/הצירוף ×ו " -"'WIKTIONARY' ×שר משמעותו ×”×™× ×œ×”×©×ª×ž×© בויקימילון." +msgid "Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' which means use wiktionary." +msgstr "×ו כתובת url מות×מת ×¢× %s בתוכה ×›×שר הסימן %s ×”×™× ×• המילה/הצירוף ×ו 'WIKTIONARY' שמשמעותו ×”×™× ×œ×¢×©×•×ª שימוש בויקימילון." -#: ../src/common/config.py:194 +#: ../src/common/config.py:193 msgid "If checked, Gajim can be controlled remotely using gajim-remote." -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יכול לפעול ב×ופן מרוחק ב×מצעות gajim-remote." +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, ביכולתו של Gajim לפעול ב×ופן מרוחק ב×מצעות gajim-remote." # they = signals? # מוגדרת ×ל ×ž× ×•×˜×¨×œ×ª +#: ../src/common/config.py:194 +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 "במידה והעדפה זו מופעלת, הקשב ×ל ×ותות D-Bus ×”×ž×©×•×“×¨×™× ×ž×Ÿ NetworkManager ×•×©× ×” ×ת מצב החיבור של ×—×©×‘×•× ×•×ª (×‘×ª× ××™ ש×ין ×œ×”× ×ת ההעדפה listen_to_network_manager ×ž× ×•×˜×¨×œ×ª ×•×”× ×ž×¡×•× ×›×¨× ×™× ×¢× ×ž×¦×‘Ö¾×—×™×‘×•×¨ גלובלי) על סמך המצב של חיבור רשת העבודה." + +# What is: one of all? #: ../src/common/config.py:195 -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 "" -"במידה והעדפה זו מופעלת, הקשב ×ל ×ותות D-Bus ×”×ž×©×•×“×¨×™× ×ž×ª×•×š NetworkManager " -"×•×©× ×” ×ת מצב החיבור של ×—×©×‘×•× ×•×ª (×‘×ª× ××™ ש×ין ×œ×”× ×ת ההעדפה " -"listen_to_network_manager ×ž× ×•×˜×¨×œ×ª ×•×”× ×ž×¡×•× ×›×¨× ×™× ×¢× ×ž×¦×‘ חיבור גלובלי) על סמך " -"המצב של חיבור רשת העבודה." +#, fuzzy +msgid "Sent chat state notifications. Can be one of all, composing_only, disabled." +msgstr "שליחת התר×ות מצב שיחה בחלון שיחה. Can be one of all, composing_only, disabled." +# What is: one of all? #: ../src/common/config.py:196 -msgid "" -"Sent chat state notifications. Can be one of all, composing_only, disabled." -msgstr "" -"שלח התר×ות מצב שיחה בחלון שיחה. יכול להיות ×חד מ×לו all, composing_only, " -"disabled." +#, fuzzy +msgid "Displayed chat state notifications in chat windows. Can be one of all, composing_only, disabled." +msgstr "הצגת התר×ות מצב שיחה בחלון שיחה. Can be one of all, composing_only, disabled." -#: ../src/common/config.py:197 -msgid "" -"Displayed chat state notifications in chat windows. Can be one of all, " -"composing_only, disabled." -msgstr "" -"הצגת התר×ות מצב שיחה בחלון שיחה. יכול להיות ×חד מ×לו all, composing_only, " -"disabled." +#: ../src/common/config.py:198 +msgid "When not printing time for every message (print_time==sometimes), print it every x minutes." +msgstr "×›×שר זמן ×œ× ×ž×•×“×¤×¡ עבור כל הודעה (print_time==sometimes), הזמן יודפס כל x דקות." #: ../src/common/config.py:199 -msgid "" -"When not printing time for every message (print_time==sometimes), print it " -"every x minutes." -msgstr "" -"×›×שר זמן ×œ× ×ž×•×“×¤×¡ עבור כל הודעה (print_time==sometimes), הזמן יודפס כל x " -"דקות." +msgid "Ask before closing a group chat tab/window." +msgstr "ש×ל ×œ×¤× ×™ סגירת חלון/×œ×©×•× ×™×ª של שיחת קבוצה." +# BUG: Make it JIDs #: ../src/common/config.py:200 -msgid "Ask before closing a group chat tab/window." -msgstr "ש×ל ×˜×¨× ×¡×’×™×¨×ª חלון/כרטיסייה של שיחת קבוצה." +msgid "Always ask before closing group chat tab/window in this space separated list of group chat jids." +msgstr "ש×ל תמיד ×œ×¤× ×™ סגירת חלון/×œ×©×•× ×™×ª של שיחת קבוצה ברשימה זו שמופרדת ×¢× ×¨×•×•×—, של כתובות JID של שיחות קבוצה." +# BUG: Make it JIDs #: ../src/common/config.py:201 -msgid "" -"Always ask before closing group chat tab/window in this space separated list " -"of group chat JIDs." -msgstr "" -"ש×ל תמיד ×˜×¨× ×¡×’×™×¨×ª חלון/כרטיסייה של שיחת קבוצה ברשימה זו ×שר מופרדת ×¢× ×¨×•×•×—, " -"של כתובות JID של שיחות קבוצה." +msgid "Never ask before closing group chat tab/window in this space separated list of group chat jids." +msgstr "×œ×¢×•×œ× ×ל תש×ל ×œ×¤× ×™ סגירת חלון/×œ×©×•× ×™×ª של שיחת קבוצה ברשימה זו שמופרדת ×¢× ×¨×•×•×—, של כתובות JID של שיחות קבוצה." +# there are control? #: ../src/common/config.py:202 -msgid "" -"Never ask before closing group chat tab/window in this space separated list " -"of group chat JIDs." -msgstr "" -"×œ×¢×•×œ× ×ל תש×ל ×˜×¨× ×¡×’×™×¨×ª חלון/כרטיסייה של שיחת קבוצה ברשימה זו ×שר מופרדת ×¢× " -"רווח, של כתובות JID של שיחות קבוצה." - -#: ../src/common/config.py:203 -msgid "" -"Ask before closing tabbed chat window if there are controls that can lose " -"data (chat, private chat, groupchat that will not be minimized)" -msgstr "" -"ש×ל ×˜×¨× ×¡×’×™×¨×ª חלון שיחה בעל ×¡×™×ž× ×™×•×ª ×›×שר ×§×™×™×ž×™× ×‘×§×¨×™× ×שר ×¢×œ×•×œ×™× ×œ×בד מידע " -"(שיחה, שיחה פרטית, שיחת קבוצה ×שר ×œ× ×ª×ž×•×–×¢×¨)" +#, fuzzy +msgid "Ask before closing tabbed chat window if there are control that can loose data (chat, private chat, groupchat that will not be minimized)" +msgstr "ש×ל ×œ×¤× ×™ סגירת חלון שיחה tabbed ×× " -#: ../src/common/config.py:206 -msgid "" -"Comma separated list of hosts that we send, in addition of local interfaces, " -"for File Transfer in case of address translation/port forwarding." -msgstr "" -"רשימה ×שר מופרדת ×¢× ×¤×¡×™×§×™×, של מ××¨×—×™× ×שר ×× ×• שולחי×, ×‘× ×•×¡×£ לממשק מקומי, " -"עבור העברת קובץ במקרה של ×ª×¨×’×•× ×›×ª×•×‘×ª/תיעול ×©×¢×¨×™× (port forwarding)." +#: ../src/common/config.py:205 +msgid "Comma separated list of hosts that we send, in addition of local interfaces, for File Transfer in case of address translation/port forwarding." +msgstr "רשימה שמופרדת ×¢× ×¤×¡×™×§×™×, של מ××¨×—×™× ×©×× ×• שולחי×, ×‘× ×•×¡×£ לממשק מקומי, עבור העברת קובץ במקרה של ×ª×¨×’×•× ×›×ª×•×‘×ª/תיעול ×©×¢×¨×™× (port forwarding)." # לפי תקן IEC -#: ../src/common/config.py:208 +#: ../src/common/config.py:207 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." -msgstr "תקן IEC ×ומר KiB†= 1024 ביתי×, KB†= 1000 ביתי×." +msgstr "תקן IEC ×ומר KiB = 1024 ביתי×, KB = 1000 ביתי×." -#: ../src/common/config.py:210 +#: ../src/common/config.py:209 msgid "Notify of events in the notification area." -msgstr "הודע על ××™×¨×•×¢×™× ×‘×זור ההתר××”." +msgstr "הודע לי על ××™×¨×•×¢×™× ×‘×זור ההתר××”." # המהבהבת # ×›×שר ×–×” מתריע על ×ירוע -#: ../src/common/config.py:211 -msgid "" -"If False, Gajim will display a static event icon instead of the blinking " -"status icon in the notification area when notifying on event." -msgstr "" -"במידה ו×פשרות זו ×ž× ×•×˜×¨×œ×ª, Gajim יציג צלמית ×ירוע סטטית ×‘×ž×§×•× ×¦×œ×ž×™×ª המצב ×שר " -"ממצמצת ב×זור ההתר××” בעת יידוע על ×ירוע." +#: ../src/common/config.py:210 +msgid "If False, Gajim will display a static event icon instead of the blinking status icon in the notification area when notifying on event." +msgstr "במידה ו×פשרות זו ×ž× ×•×˜×¨×œ×ª, Gajim יציג צלמית ×ירוע סטטית ×‘×ž×§×•× ×¦×œ×ž×™×ª המצב הממצמצת ב×זור ההתר××” בעת יידוע על ×ירוע." -#: ../src/common/config.py:217 +# ×× ×¨×§ +#: ../src/common/config.py:216 msgid "Show tab when only one conversation?" -msgstr "×”×× ×œ×”×¦×™×’ כרטיסייה ×›×שר רק דיון ×חד קיי×?" +msgstr "×”×× ×œ×”×¦×™×’ ×œ×©×•× ×™×ª ×›×שר רק דיון ×חד קיי×?" -#: ../src/common/config.py:218 +#: ../src/common/config.py:217 #, fuzzy msgid "Show tabbed notebook border in chat windows?" -msgstr "להציג מסגרת tabbed notebook בחלון שיחה?" +msgstr "הצגת מסגרת tabbed notebook בחלון שיחה?" -#: ../src/common/config.py:219 +#: ../src/common/config.py:218 msgid "Show close button in tab?" -msgstr "×”×× ×œ×”×¦×™×’ לחצן סגירה בתוך כרטיסייה?" +msgstr "×”×× ×œ×”×¦×™×’ כפתור סגירה ×‘×œ×©×•× ×™×ª?" -#: ../src/common/config.py:220 -msgid "" -"A list of modp groups to use in a Diffie-Hellman, highest preference first, " -"separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher " -"numbers are more secure, but take longer to calculate when you start a " -"session." -msgstr "" -"רשימה של קבוצות modp לשימוש בתוך Diffie-Hellman, ההעדפה הרמה ביותר ר××©×•× ×”, " -"מופרדת בפסיקי×. קבוצות תקפות ×”×™× ×Ÿ 1, 2, 5, 14, 15, 16, 17 ×•×’× 18. ספרות " -"גבוהות יותר ×”×™× ×Ÿ יותר מ×ובטחות, ××•×œ× ×œ×•×§×—×•×ª משך זמן ×רוך יותר לחישוב בהתחילך " -"סשן חדש." +#: ../src/common/config.py:219 +#, fuzzy +msgid "A list of modp groups to use in a Diffie-Hellman, highest preference first, separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher numbers are more secure, but take longer to calculate when you start a session." +msgstr "רשימה של קבוצות modp לשימוש בתוך Diffie-Hellman, highest preference first, מופרדת בפסיקי×. קבוצות תקיפות ×”×™× ×Ÿ 1, 2, 5, 14, 15, 16, 17 ×•×’× 18. ספרות גבוהות יותר ×”×™× ×Ÿ יותר מ×ובטחות, ××•×œ× ×œ×•×§×—×•×ª משך זמן ×רוך יותר לחישוב בהתחילך סשן חדש." -#: ../src/common/config.py:241 +#: ../src/common/config.py:240 msgid "Preview new messages in notification popup?" msgstr "×”×× ×œ×”×¨×ות תצוגה מוקדמת של הודעות חדשות בהתר××” מוקפצת?" +# Changed to: A list of words that will be highlighted in group chats (you will need to use semicolon ; to separate between words) +# ### separated by \":\", ### +#: ../src/common/config.py:245 +msgid "A semicolon-separated list of words that will be highlighted in group chats." +msgstr "רשימה של ×ž×™×œ×™× ×©×™×•×‘×œ×˜×• בשיחות קבוצה (יש לעשות שימוש ×‘× ×§×•×“×” ופסיק ; כדי להפריד בין מילי×)." + #: ../src/common/config.py:246 -msgid "" -"A semicolon-separated list of words that will be highlighted in group chats." -msgstr "" -"רשימה של ×ž×™×œ×™× ×©×™×•×‘×œ×˜×• בתוך שיחות קבוצה (יש לעשות שימוש ×‘× ×§×•×“×” ופסיק ; כדי " -"להפריד בין מילי×)." +msgid "If True, quits Gajim when X button of Window Manager is clicked. This setting is taken into account only if notification icon is used." +msgstr "במידה והעדפה זו מופעלת, Gajim ×™×¦× ×›×שר לחצן X של ×ž× ×”×œ ×—×œ×•× ×•×ª × ×œ×—×¥. יש לקחת ×ת הגדרה זו בחשבון רק במידה וצלמית התר××” בשימוש." #: ../src/common/config.py:247 -msgid "" -"If True, quits Gajim when X button of Window Manager is clicked. This " -"setting is taken into account only if notification icon is used." -msgstr "" -"במידה והעדפה זו מופעלת, Gajim ×™×¦× ×›×שר לחצן X של ×ž× ×”×œ ×—×œ×•× ×•×ª × ×œ×—×¥. הגדרה זו " -"× ×œ×§×—×ª בחשבון רק במידה וצלמית התר××” מצויה בשימוש." +msgid "If True, Gajim will check if it's the default jabber client on each startup." +msgstr "במידה והעדפה זו מופעלת, Gajim יבדוק בכל הפעלה ×× ×”×•× ×œ×§×•×— Jabber המשתמט." #: ../src/common/config.py:248 -msgid "" -"If True, Gajim will check if it's the default jabber client on each startup." -msgstr "" -"במידה והעדפה זו מופעלת, Gajim יבדוק בכל הפעלה ×× ×”×•× ×œ×§×•×— Jabber המשתמט." +msgid "If True, Gajim will display an icon on each tab containing unread messages. Depending on the theme, this icon may be animated." +msgstr "במידה והעדפה זו מופעלת, Gajim יציג צלמית על כל ×œ×©×•× ×™×ª שמכילה הודעות ×©×œ× × ×§×¨×ו. תלוי במוטיב שבשימוש, צלמית זו יכולה להיות ×ž×•× ×¤×©×ª." #: ../src/common/config.py:249 -msgid "" -"If True, Gajim will display an icon on each tab containing unread messages. " -"Depending on the theme, this icon may be animated." -msgstr "" -"במידה והעדפה זו מופעלת, Gajim יציג צלמית על כל כרטיסייה המכילה הודעות ×שר ×œ× " -"× ×§×¨×ו. תלוי במוטיב ×שר מצוי בשימוש, צלמית זו יכולה להיות ×ž×•× ×¤×©×ª." - -#: ../src/common/config.py:250 -msgid "" -"If True, Gajim will display the status message, if not empty, for every " -"contact under the contact name in roster window." -msgstr "" -"במידה והעדפה זו מופעלת, Gajim יציג הודעת מצב, ×‘×ª× ××™ שזו ×œ× ×¨×™×§×”, עבור כל ×יש " -"קשר תחת ×©× ×יש קשר בחלון הרשימה." +msgid "If True, Gajim will display the status message, if not empty, for every contact under the contact name in roster window." +msgstr "במידה והעדפה זו מופעלת, Gajim יציג הודעת מצב, ×‘×ª× ××™ שזו ×œ× ×¨×™×§×”, עבור כל ×יש קשר תחת ×©× ×יש קשר בחלון הרשימה." # right is left and left is right -#: ../src/common/config.py:256 +#: ../src/common/config.py:255 msgid "Define the position of the avatar in roster. Can be left or right" msgstr "" "הגדרת ×”×ž×™×§×•× ×©×œ ×”×ווט×ר ברשימה. ×”×ž×™×§×•× ×™×›×•×œ להיות בצד ימין (left) ×ו בצד " "שמ×ל (right)" # הטמון -#: ../src/common/config.py:257 -msgid "" -"If True, Gajim will ask for avatar each contact that did not have an avatar " -"last time or has one cached that is too old." -msgstr "" -"במידה והעדפה זו מופעלת, Gajim יבקש עבור ×ווט×ר מכל ×יש קשר ×שר ×œ× ×”×™×” ברשותו " -"×ווט×ר ×‘×¤×¢× ××—×¨×•× ×” ×ו ×›×שר ×”×ווט×ר המוטמן עבורו ×”×™× ×• ישן מדי." +#: ../src/common/config.py:256 +msgid "If True, Gajim will ask for avatar each contact that did not have an avatar last time or has one cached that is too old." +msgstr "במידה והעדפה זו מופעלת, Gajim יבקש עבור ×ווט×ר מכל ×יש קשר ×©×œ× ×”×™×” ברשותו ×ווט×ר ×‘×¤×¢× ××—×¨×•× ×” ×ו ×›×שר ×ווט×ר מוטמן ×”×™× ×• ישן מידי." # BUG: or is better than and/or -#: ../src/common/config.py:258 -msgid "" -"If False, Gajim will no longer print status line in chats when a contact " -"changes his or her status and/or his or her status message." -msgstr "" -"במידה ו×פשרות זו ×ž× ×•×˜×¨×œ×ª, Gajim ×œ× ×™×“×¤×™×¡ שורות מצב בתוך שיחות ×›×שר ×יש קשר " -"×ž×©× ×” מצב חיבור ×ו הודעת מצב." +# no longer > not +#: ../src/common/config.py:257 +msgid "If False, Gajim will no longer print status line in chats when a contact changes his or her status and/or his or her status message." +msgstr "במידה ו×פשרות זו ×ž× ×•×˜×¨×œ×ª, Gajim ×œ× ×™×“×¤×™×¡ שורות מצב בתוך שיחות ×›×שר ×יש קשר ×ž×©× ×” מצב־חיבור ×ו הודעת מצב." # BUG: or is better than and/or +# BUG: Can (capital letter) +# FOO? # יוזן > ישובץ -#: ../src/common/config.py:259 -msgid "" -"Can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " -"longer print status line in groupchats when a member changes his or her " -"status and/or his or her status message. If \"all\" Gajim will print all " -"status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " -"group chat." -msgstr "" -"יכול להיות \"none\" (כלל ל×), \"all\" (הכל) ×ו \"in_and_out\" (×›× ×™×¡×” " -"ויצי××”). במידה ויוזן \"none\", â€Gajim ×œ× ×™×“×¤×™×¡ שורות מצב בתוך שיחות קבוצה " -"×›×שר ×—×‘×¨×™× ×‘×©×™×—×ª קבוצה ×ž×©× ×™× ×ת המצב ×©×œ×”× ×ו ×ת הודעת המצב שלה×. במידה ויוזן " -"\"all\" â€Gajim ידפיס ×ת כל הודעות המצב. במידה ויוזן \"in_and_out\", â€Gajim " -"ידפיס FOO ×›× ×™×¡×•×ª/עזיבות של שיחות קבוצה בלבד." +#: ../src/common/config.py:258 +msgid "can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no longer print status line in groupchats when a member changes his or her status and/or his or her status message. If \"all\" Gajim will print all status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves group chat." +msgstr "יכול להיות \"none\" (כלל ל×), \"all\" (הכל) ×ו \"in_and_out\" (×›× ×™×¡×” ויצי××”). במידה ויוזן \"none\", â€Gajim ×œ× ×™×“×¤×™×¡ שורות מצב בשיחות קבוצה ×›×שר ×—×‘×¨×™× ×‘×§×‘×•×¦×” ×ž×©× ×™× ×ת מצב־החיבור ×©×œ×”× ×ו ×ת הודעת המצב שלה×. במידה ויוזן \"all\" â€Gajim ידפיס ×ת כל הודעות המצב. במידה ויוזן \"in_and_out\", â€Gajim ידפיס FOO ×›× ×™×¡×•×ª/עזיבות של שיחות קבוצה בלבד." -#: ../src/common/config.py:261 +#: ../src/common/config.py:260 msgid "Log XHTML messages instead of plain text messages." msgstr "×¨×™×©×•× ×”×•×“×¢×•×ª בתסדיר XHTML ×‘×ž×§×•× ×”×•×“×¢×•×ª בתמליל רגיל." # בזמן ×©×”× ×ž×ª×—×‘×¨×™× # שזה עתה # בעת ×©×”× -#: ../src/common/config.py:262 +#: ../src/common/config.py:261 msgid "Background color of contacts when they just signed in." msgstr "צבע רקע ×חורי של ×× ×©×™ קשר ×›×שר ×”× ×ž×ª×—×‘×¨×™×." -#: ../src/common/config.py:263 +#: ../src/common/config.py:262 msgid "Background color of contacts when they just signed out." msgstr "צבע רקע ×חורי של ×× ×©×™ קשר ×›×שר ×”× ×ž×ª× ×ª×§×™×." -#: ../src/common/config.py:265 -msgid "" -"If True, restored messages will use a smaller font than the default one." -msgstr "" -"במידה והעדפה זו מופעלת, הודעות משוחזרות יעשו שימוש ×‘×’×•×¤× ×™× ×§×˜× ×™× ×™×•×ª×¨ מהגופן " -"המשתמט." +#: ../src/common/config.py:264 +msgid "If True, restored messages will use a smaller font than the default one." +msgstr "במידה והעדפה זו מופעלת, הודעות משוחזרות יעשו שימוש ×‘×’×•×¤× ×™× ×§×˜× ×™× ×™×•×ª×¨ מהגופן המשתמט." -#: ../src/common/config.py:266 +#: ../src/common/config.py:265 msgid "Don't show avatar for the transport itself." -msgstr "×ל תציג ×ווט×ר עבור המוביל עצמו." +msgstr "×œ× ×œ×”×¦×™×’ ×ווט×ר עבור המוביל עצמו." -#: ../src/common/config.py:267 +# שורת המשימות +#: ../src/common/config.py:266 msgid "Don't show roster in the system taskbar." -msgstr "×ל תציג ×ת הרשימה בתוך שורת המשימות של המערכת." +msgstr "×œ× ×œ×”×¦×™×’ ×ת הרשימה בסרגל המשימות." # להבהב -#: ../src/common/config.py:268 -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 "" -"במידה והעדפה זו מופעלת, והגרס×ות ×”×ž×•×ª×§× ×•×ª של â€GTK+‬ ושל PyGTK הן לפחות 2.8, " -"×’×¨×•× ×œ×—×œ×•×Ÿ להבזיק (×”×”×ª× ×”×’×•×ª המשתמטת ברוב ×ž× ×”×œ×™ ×”×—×œ×•× ×•×ª) ×›×שר ×§×™×™×ž×™× ××™×¨×•×¢×™× " -"×ž×ž×ª×™× ×™×." +#: ../src/common/config.py:267 +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 "במידה והעדפה זו מופעלת, והגרס×ות ×”×ž×•×ª×§× ×•×ª של â€GTK+‬ ושל PyGTK הן לפחות 2.8, ×’×¨×•× ×œ×—×œ×•×Ÿ להבזיק (×”×”×ª× ×”×’×•×ª המשתמטת ברוב ×ž× ×”×œ×™ ×”×—×œ×•× ×•×ª) ×›×שר ×§×™×™×ž×™× ××™×¨×•×¢×™× ×ž×ž×ª×™× ×™×." -#: ../src/common/config.py:270 -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 ×œ× ×—×¤×¥ במידע sha ×›×שר מ×ן דהו מצטרף ×ל שיחת קבוצה ×”×ž×•×’× ×ª במילת " -"מעבר. כדי להפסיק לשלוח מידע sha ×‘× ×•×›×—×•×™×•×ª שיחת קבוצה יש ×œ× ×˜×¨×œ ×ת ×פשרות זו." +# keep מילת־מעבר +#: ../src/common/config.py:269 +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 ×œ× ×ž×—×‘×‘ מידע sha ×›×שר מ×ן דהו מצטרף ×ל שיחת קבוצה ×”×ž×•×’× ×ª במילת־מעבר. כדי להפסיק לשלוח מידע sha ×‘× ×•×›×—×•×™×•×ª שיחת קבוצה יש ×œ× ×˜×¨×œ ×ת ×פשרות זו." +# BUG: groupchats) s/are/is sent to +# Is, not Are +# היכן הודעות חדשות יושמו #. always, never, peracct, pertype should not be translated -#: ../src/common/config.py:273 +#: ../src/common/config.py:272 msgid "" "Controls the window where new messages are placed.\n" "'always' - All messages are sent to a single window.\n" @@ -4361,8 +4505,7 @@ msgid "" "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) is sent to a " -"specific window." +"'pertype' - Each message type (e.g., chats vs. groupchats) are sent to a specific window." msgstr "" "בקרה על החלון בו הודעות חדשות מושמות.\n" "â€'always' - כל ההודעות × ×©×œ×—×•×ª ×ל חלון בודד.\n" @@ -4372,7 +4515,7 @@ msgstr "" "â€'peracct' - הודעות עבור כל חשבון × ×©×œ×—×•×ª ×ל חלון מסוי×.\n" "â€'pertype' - כל טיפוס הודעה (למשל, שיחות ×›× ×’×“ שיחות קבוצה) × ×©×œ×— ×ל חלון מסוי×." -#: ../src/common/config.py:274 +#: ../src/common/config.py:273 msgid "" "Show roster on startup.\n" "'always' - Always show roster.\n" @@ -4384,408 +4527,298 @@ msgstr "" "â€'never' - ×œ× ×œ×”×¦×™×’ רשימה בכלל.\n" "â€'last_state' - שחזור המצב ×”×חרון של הרשימה." -#: ../src/common/config.py:275 +# deactivated, not false +# ? +#: ../src/common/config.py:274 msgid "If False, you will no longer see the avatar in the chat window." msgstr "" "במידה ו×פשרות זו ×ž× ×•×˜×¨×œ×ª, ×œ× ×ª×”×™×” לך ×”×פשרות לר×ות ×ת ×”×ווט×ר בחלון השיחה." -#: ../src/common/config.py:276 +#: ../src/common/config.py:275 msgid "If True, pressing the escape key closes a tab/window." -msgstr "במידה והעדפה זו מופעלת, לחיצה על המקש Esc תוביל לסגירת חלון/כרטיסייה." +msgstr "במידה והעדפה זו מופעלת, לחיצה על המקש Esc תוביל לסגירת חלון/×œ×©×•× ×™×ª." -#: ../src/common/config.py:277 +#: ../src/common/config.py:276 msgid "Hides the buttons in chat windows." msgstr "הסתרת ×”×œ×—×¦× ×™× ×‘×—×œ×•× ×•×ª שיחה." -#: ../src/common/config.py:278 +#: ../src/common/config.py:277 msgid "Hides the banner in a group chat window" -msgstr "הסתרת הכרזה בחלון שיחת קבוצה" +msgstr "הסתרת הכרזה בחלון של שיחת קבוצה" # ×¢× ×©×ª×™ ×ישויות -#: ../src/common/config.py:279 +#: ../src/common/config.py:278 msgid "Hides the banner in two persons chat window" msgstr "הסתרת הכרזה בחלון שיחה ×¢× ×©× ×™ × ×•×›×—×™×" -# הסתרת רשימת ×”× ×•×›×—×™× ×‘×©×™×—×ª קבוצה בתוך חלון שיחת קבוצה -#: ../src/common/config.py:280 +# הסתרת רשימת ×”× ×•×›×—×™× ×‘×©×™×—×ª קבוצה בחלון שיחת קבוצה +#: ../src/common/config.py:279 msgid "Hides the group chat occupants list in group chat window." msgstr "הסתרת רשימת ×”× ×•×›×—×™× ×‘×—×œ×•×Ÿ שיחת קבוצה." # What does "than" mean? -#: ../src/common/config.py:281 -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 "" -"בשיחה, הצג ×ת ×©× ×”×›×™× ×•×™ בתחילת שורה רק ×›×שר ×ין זו ×ותה ×”×ישיות ×שר מדברת " -"מבהודעה קודמת." +#: ../src/common/config.py:280 +#, fuzzy +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 "בשיחה, הצג ×ת ×©× ×”×›×™× ×•×™ בתחילת שורה רק ×›×שר ×ין זו ×ותה ×”×ישיות מדברת מבהודעה קודמת." -#: ../src/common/config.py:282 +#: ../src/common/config.py:281 +#, fuzzy msgid "Indentation when using merge consecutive nickname." -msgstr "×”×–×—×” בעת שימוש ×‘×©× ×›×™× ×•×™ עוקב מובלע." +msgstr "×”×–×—×” בעת שימוש במיזוג רציף של ×©× ×›×™× ×•×™." -#: ../src/common/config.py:283 +# גלילת הודעות ב×ופן חלק בחלון שיחה +#: ../src/common/config.py:282 msgid "Smooth scroll message in conversation window" msgstr "גלילה חלקה של הודעות בחלון דיון" -#: ../src/common/config.py:284 -msgid "" -"List of colors, separated by \":\", that will be used to color nicknames in " -"group chats." -msgstr "" -"רשימה של צבעי×, ×ž×•×¤×¨×“×™× ×¢×œ ידי \":\", ×שר ישמשו לצביעת שמות ×›×™× ×•×™ בתוך שיחות " -"קבוצה." +# ### separated by \":\", ### +#: ../src/common/config.py:283 +msgid "List of colors, separated by \":\", that will be used to color nicknames in group chats." +msgstr "רשימה של צבעי×, ×”×ž×•×¤×¨×“×™× ×¢×œ ידי \":\", ושישמשו לצביעת שמות ×›×™× ×•×™ בשיחות קבוצה." -#: ../src/common/config.py:285 +#: ../src/common/config.py:284 msgid "Ctrl-Tab go to next composing tab when none is unread." -msgstr "" -"â€Ctrl-Tab כדי לעבור ×ל הכרטיסייה ×”×ž×•×œ×—× ×ª הב××” ×›×שר ×ין כרטיסיות ×שר ×œ× × ×§×¨×ו." +msgstr "â€Ctrl-Tab כדי לעבור ×ל ×”×œ×©×•× ×™×ª ×”×ž×•×œ×—× ×ª הב××” ×›×שר ×ין ×œ×©×•× ×™×•×ª ×©×œ× × ×§×¨×ו." # ×× ×©×™Ö¾×§×©×¨-×ž×•×¦×ž×“×™× # Meta- (from the Greek preposition μετά = "after", "beyond", "adjacent", "self", # adjacent = adjoining = צמוד +#: ../src/common/config.py:285 +msgid "Should we show the confirm metacontacts creation dialog or not? Empty string means we never show the dialog." +msgstr "×”×× ×§×™×™× ×”×¦×•×¨×š ש×× ×—× ×• × ×¦×™×’ ×ת דו־שיח ×•×™×“×•× ×™×¦×™×¨×ª ×× ×©×™Ö¾×§×©×¨-×ž×•×¦×ž×“×™× ×ו של×? המשמעות של מחרוזת ריקה תהיה ש×× ×—× ×• ×œ× × ×¦×™×’ ×ת הדו־שיח בכלל." + #: ../src/common/config.py:286 -msgid "" -"Should we show the confirm metacontacts creation dialog or not? Empty string " -"means we never show the dialog." -msgstr "" -"×”×× ×¢×œ×™× ×• להציג דו שיח ×•×™×“×•× ×™×¦×™×¨×ª ×× ×©×™Ö¾×§×©×¨-מוצמדי×? המשמעות של מחרוזת ריקה " -"תהיה ש×× ×—× ×• ×œ× × ×¦×™×’ ×ת הדו שיח בכלל." +msgid "Should we show the confirm block contact dialog or not? Empty string means we never show the dialog." +msgstr "×”×× ×§×™×™× ×”×¦×•×¨×š ש×× ×—× ×• × ×¦×™×’ ×ת דו־שיח ×•×™×“×•× ×—×¡×™×ž×ª ×יש קשר ×ו של×? המשמעות של מחרוזת ריקה תהיה ש×× ×—× ×• ×œ× × ×¦×™×’ ×ת הדו־שיח בכלל." #: ../src/common/config.py:287 -msgid "" -"Should we show the confirm block contact dialog or not? Empty string means " -"we never show the dialog." -msgstr "" -"×”×× ×¢×œ×™× ×• להציג דו שיח ×•×™×“×•× ×—×¡×™×ž×ª ×יש קשר? המשמעות של מחרוזת ריקה תהיה " -"ש×× ×—× ×• ×œ× × ×¦×™×’ ×ת הדו שיח בכלל." +msgid "Should we show the confirm custom status dialog or not? Empty string means we never show the dialog." +msgstr "×”×× ×§×™×™× ×”×¦×•×¨×š ש×× ×—× ×• × ×¦×™×’ ×ת דו־שיח ×•×™×“×•× ×ž×¦×‘Ö¾×—×™×‘×•×¨ מות×× ×ו של×? המשמעות של מחרוזת ריקה תהיה ש×× ×—× ×• ×œ× × ×¦×™×’ ×ת הדו־שיח בכלל." #: ../src/common/config.py:288 -msgid "" -"Should we show the confirm custom status dialog or not? Empty string means " -"we never show the dialog." -msgstr "" -"×”×× ×¢×œ×™× ×• להציג דו שיח ×•×™×“×•× ×ž×¦×‘ חיבור מות××? המשמעות של מחרוזת ריקה תהיה " -"ש×× ×—× ×• ×œ× × ×¦×™×’ ×ת הדו שיח בכלל." +msgid "If True, you will be able to set a negative priority to your account in account modification window. BE CAREFUL, when you are logged in with a negative priority, you will NOT receive any message from your server." +msgstr "במידה והעדפה זו מופעלת, תהיה ביכולתך להגדיר עדיפות שלילית עבור ×—×©×‘×•× ×š בתוך חלון הת×מת חשבון. יש להיזהר, בעת התחברותך יחד ×¢× ×¢×“×™×¤×•×ª שלילית, ×œ× ×ª×ª×§×‘×œ× ×” ×©×•× ×”×•×“×¢×” מן שרתך." #: ../src/common/config.py:289 -msgid "" -"If True, you will be able to set a negative priority to your account in " -"account modification window. BE CAREFUL, when you are logged in with a " -"negative priority, you will NOT receive any message from your server." -msgstr "" -"במידה והעדפה זו מופעלת, תהיה ב×פשרותך להגדיר עדיפות שלילית עבור ×—×©×‘×•× ×š בתוך " -"חלון הת×מת חשבון. יש להיזהר, בעת התחברותך יחד ×¢× ×¢×“×™×¤×•×ª שלילית, ×œ× ×ª×ª×§×‘×œ× ×” " -"×©×•× ×”×•×“×¢×” מתוך שרתך." +msgid "If True, Gajim will use Gnome Keyring (if available) to store account passwords." +msgstr "במידה והעדפה זו מופעלת, Gajim יעשה שימוש ×‘×™×™×©×•× Gnome Keyring (במידה ×•×”×™×™×©×•× ×–×ž×™×Ÿ) כדי ל×חסן סיסמ×ות חשבון." #: ../src/common/config.py:290 -msgid "" -"If True, Gajim will use Gnome Keyring (if available) to store account " -"passwords." -msgstr "" -"במידה והעדפה זו מופעלת, Gajim יעשה שימוש ×‘×™×™×©×•× Gnome Keyring (במידה וזה " -"זמין) כדי ל×חסן סיסמ×ות חשבון." +msgid "If True, Gajim will use KDE Wallet (if kwalletcli is available) to store account passwords." +msgstr "במידה והעדפה זו מופעלת, Gajim יעשה שימוש ×‘×™×™×©×•× KDE Wallet (×× kwalletcli ×”×™× ×• זמין) כדי ל×חסן סיסמ×ות חשבון." #: ../src/common/config.py:291 -msgid "" -"If True, Gajim will use KDE Wallet (if kwalletcli is available) to store " -"account passwords." -msgstr "" -"במידה והעדפה זו מופעלת, Gajim יעשה שימוש ×‘×™×™×©×•× KDE Wallet (×›×שר kwalletcli " -"×”×™× ×• זמין) כדי ל×חסן סיסמ×ות חשבון." - -#: ../src/common/config.py:292 -msgid "" -"If True, Gajim will show number of online and total contacts in account and " -"group rows." -msgstr "" -"במידה והעדפה זו מופעלת, Gajim יציג מספר של ×× ×©×™ קשר ×ž×§×•×•× ×™× ×‘×©×•×¨×•×ª חשבון " -"וקבוצה." +msgid "If True, Gajim will show number of online and total contacts in account and group rows." +msgstr "במידה והעדפה זו מופעלת, Gajim יציג מספר של ×× ×©×™ קשר ×ž×§×•×•× ×™× ×‘×©×•×¨×•×ª חשבון וקבוצה." # what type? # ×פשרי שיהיה -#: ../src/common/config.py:293 -msgid "" -"Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " -"as if they were of this type" -msgstr "" -"יכול להיות ריק, 'chat' (שיחה) ×ו 'normal' (רגיל). במידה וערך ×–×” ××™× ×• ריק, " -"התייחס ×ל כל ההודעות ×”× ×›× ×¡×•×ª ×›×ילו היו מטיפוס ×–×”" +#: ../src/common/config.py:292 +msgid "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages as if they were of this type" +msgstr "יכול להיות ריק, 'chat' (שיחה) ×ו 'normal' (רגיל). במידה וערך ×–×” ××™× ×• ריק, התייחס ×ל כל ההודעות ×”× ×›× ×¡×•×ª ×›×ילו היו מטיפוס ×–×”" # ×©×ž×ž× ×• × ×©×œ×—×” -#: ../src/common/config.py:294 -msgid "" -"If True, Gajim will scroll and select the contact who sent you the last " -"message, if chat window is not already opened." -msgstr "" -"במידה והעדפה זו מופעלת, Gajim יגולל ויבחר ×ת ×יש הקשר ×שר שלח לך ×ת ההודעה " -"×”××—×¨×•× ×”, ×× ×•×›×שר חלון שיחה ××™× ×• פתוח כבר." +#: ../src/common/config.py:293 +#, fuzzy +msgid "If True, Gajim will scroll and select the contact who sent you the last message, if chat window is not already opened." +msgstr "במידה והעדפה זו מופעלת, Gajim יגולל ויבחר ×ת ×יש הקשר ששלח לך ×ת ההודעה ×”××—×¨×•× ×”, ×× ×—×œ×•×Ÿ שיחה ××™× ×• פתוח כבר." -#: ../src/common/config.py:295 +#: ../src/common/config.py:294 msgid "Time of inactivity needed before the change status window closes down." -msgstr "זמן חוסר פעילות ×שר × ×—×•×¥ ×œ×¤× ×™ שחלון ×©×™× ×•×™ מצב × ×¡×’×¨." +msgstr "זמן חוסר פעילות ×©× ×—×•×¥ ×œ×¤× ×™ שחלון ×©×™× ×•×™ המצב × ×¡×’×¨." -#: ../src/common/config.py:296 -msgid "" -"Maximum number of lines that are printed in conversations. Oldest lines are " -"cleared." -msgstr "מספר מרבי של שורות ×שר יודפסו בתוך ×“×™×•× ×™×. השורות ×”×›×™ ×™×©× ×•×ª יטוהרו." +# מרבי של שורות +#: ../src/common/config.py:295 +msgid "Maximum number of lines that are printed in conversations. Oldest lines are cleared." +msgstr "מספר שורות מרבי שיודפסו ×‘×“×™×•× ×™×. השורות ×”×›×™ ×™×©× ×•×ª יטוהרו." # יכרכו # BUG: the notification icon? +#: ../src/common/config.py:296 +msgid "If True, notification windows from notification-daemon will be attached to notification icon." +msgstr "במידה והעדפה זו מופעלת, ×—×œ×•× ×•×ª התר××” מן notification-daemon יסופחו ×ל צלמית התר××”." + +# What is checks? #: ../src/common/config.py:297 -msgid "" -"If True, notification windows from notification-daemon will be attached to " -"notification icon." -msgstr "" -"במידה והעדפה זו מופעלת, ×—×œ×•× ×•×ª התר××” מן notification-daemon יסופחו ×ל צלמית " -"התר××”." +#, fuzzy +msgid "Choose interval between 2 checks of idleness." +msgstr "בחירת תדירות עדכון בין 2 checks של חוסר פעילות." -# חוסר #: ../src/common/config.py:298 -msgid "Choose interval between 2 checks of idleness." -msgstr "בחר תדירות עדכון בין 2 בדיקות של העדר פעילות." +msgid "Valid uri schemes. Only schemes in this list will be accepted as \"real\" uri. (mailto and xmpp are handled separately)" +msgstr "×ª×¨×©×™× uri תקף. ×ª×¨×©×™×ž×™× ×”×ž×¦×•×™×™× ×‘×¨×©×™×ž×” בלבד יתקבלו ×›×ª×¨×©×™× uri \"×מיתי\". (mailto ×•×’× xmpp ×ž×˜×•×¤×œ×™× ×‘× ×¤×¨×“)" +# שידור בקשות #: ../src/common/config.py:299 -msgid "" -"Valid uri schemes. Only schemes in this list will be accepted as \"real\" " -"uri. (mailto and xmpp are handled separately)" -msgstr "" -"×ª×¨×©×™× uri תקף. ×ª×¨×©×™×ž×™× ×”×ž×¦×•×™×™× ×‘×ª×•×š הרשימה בלבד יתקבלו בתור ×ª×¨×©×™× uri \"×מיתי" -"\". (mailto ×•×’× xmpp ×ž×˜×•×¤×œ×™× ×‘× ×¤×¨×“)" +msgid "Ask offline status message to all offline contacts when connection to an accoutn is established. WARNING: This causes a lot of requests to be sent!" +msgstr "בקש הודעות מצב ×œ× ×ž×§×•×•× ×•×ª מכל ×× ×©×™ קשר בלתי ×ž×§×•×•× ×™× ×›×שר חיבור ×ל חשבון מבוסס. ×זהרה: זו עלולה ×œ×’×¨×•× ×œ×©×œ×™×—×ª מספר רב של בקשות!" -# שידור בקשות -# עלולה ×œ×’×¨×•× could #: ../src/common/config.py:300 -msgid "" -"Ask offline status message to all offline contacts when connection to an " -"account is established. WARNING: This causes a lot of requests to be sent!" -msgstr "" -"בקש הודעות מצב ×œ× ×ž×§×•×•× ×•×ª מכל ×× ×©×™ קשר בלתי ×ž×§×•×•× ×™× ×›×שר חיבור ×ל חשבון " -"מבוסס. ×זהרה: זו גורמת לשליחת מספר רב של בקשות!" - -#: ../src/common/config.py:301 msgid "If True, completion in groupchats will be like a shell auto-completion" -msgstr "" -"במידה והעדפה זו מופעלת, השלמה בתוך שיחות קבוצה תיעשה בדומה להשלמה ×וטומטית " -"במעטפת (shell) של מסוף." +msgstr "במידה והעדפה זו מופעלת, השלמה בשיחת קבוצה תיעשה בדומה להשלמה ×וטומטית במעטפת (shell) של מסוף." -#: ../src/common/config.py:302 -msgid "" -"When is self contact row displayed. Can be \"always\", \"when_other_resource" -"\" or \"never\"" -msgstr "" -"מתי שורת ×יש קשר עצמי תוצג. יכול להיות \"always\" (תמיד), " -"\"when_other_resource\" (×›×שר מש×ב ×חר מחובר) ×ו \"never\" (בכלל ל×)" +#: ../src/common/config.py:301 +msgid "When is self contact row displayed. Can be \"always\", \"when_other_resource\" or \"never\"" +msgstr "מתי שורת ×יש קשר עצמי תוצג. יכול להיות \"always\" (תמיד), \"when_other_resource\" (×›×שר מש×ב ×חר מחובר) ×ו \"never\" (בכלל ל×)" -#: ../src/common/config.py:307 +# Any better word to mine for Optionally? +# Does it mean: an option to? +#: ../src/common/config.py:306 msgid "Optionally fix jingle output video framerate. Example: 10/1 or 25/2" msgstr "×פשרות קיבוע פלט תדר ויד×ו של jingle. דוגמ×: 10/1 ×ו 25/2" -#: ../src/common/config.py:308 +#: ../src/common/config.py:307 msgid "Optionally resize jingle output video. Example: 320x240" msgstr "×פשרות ×©×™× ×•×™ מידת פלט הויד×ו של jingle. דוגמ×: 320x240" -#: ../src/common/config.py:309 -msgid "If True, You will also see your webcam" -msgstr "במידה והעדפה זו מופעלת, תהיה ב×פשרותך לר×ות ×’× ×ת מצלמת הרשת שלך" +# שהוגדר ברשומה +#: ../src/common/config.py:310 +msgid "If True, Gajim will try to use a STUN server when using jingle. The one in \"stun_server\" option, or the one given by the jabber server." +msgstr "במידה והעדפה זו מופעלת, Gajim ×™× ×¡×” לעשות שימש בשרת STUN ×›×שר jingle מצוי בשימוש. ×–×” שהוזן בהעדפה \"stun_server\", ×ו בזה ×©× ×™×ª×Ÿ בשרת jabber × ×ª×•×Ÿ." +# שישמשך +#: ../src/common/config.py:311 +msgid "STUN server to use when using jingle" +msgstr "שרת STUN שישמש ×ותך בעת שימוש ב־jingle" + +# × ×•×›×—×™ שיחת קבוצה +# × ×•×›×—×™× ×‘×©×™×—×•×ª קבוצה #: ../src/common/config.py:312 -msgid "" -"If True, Gajim will try to use a STUN server when using jingle. The one in " -"\"stun_server\" option, or the one given by the jabber server." -msgstr "" -"במידה והעדפה זו מופעלת, Gajim ×™× ×¡×” לעשות שימש בשרת STUN ×›×שר jingle מצוי " -"בשימוש. ×–×” ×שר הוגדר בתוך \"stun_server\", ×ו בזה ×שר × ×™×ª×Ÿ על ידי שרת jabber " -"× ×ª×•×Ÿ." +msgid "If True, Gajim will show affiliation of groupchat occupants by adding a colored square to the status icon" +msgstr "במידה והעדפה זו מופעלת, Gajim יציג שיוך של × ×•×›×—×™× ×©×œ שיחת קבוצה על ידי הוספת מרובע ×¦×‘×¢×•× ×™ לצלמית המצב" #: ../src/common/config.py:313 -msgid "STUN server to use when using jingle" -msgstr "שרת STUN ×שר ישמש ×ותך בעת שימוש ב־jingle" +msgid "Proxy used for all outgoing connections if the account does not have a specific proxy configured" +msgstr "מתווך שבשימוש עבור כל ×”×—×™×‘×•×¨×™× ×”×™×•×¦××™× ×‘×ž×™×“×” ולחשבון ×ין מתווך ×ž×¡×•×™× ×ž×•×’×“×¨" #: ../src/common/config.py:314 -msgid "" -"If True, Gajim will show affiliation of groupchat occupants by adding a " -"colored square to the status icon" -msgstr "" -"במידה והעדפה זו מופעלת, Gajim יציג שיוך של × ×•×›×—×™× ×©×œ שיחת קבוצה על ידי הוספת " -"מרובע ×¦×‘×¢×•× ×™ לצלמית המצב" - -#: ../src/common/config.py:315 -msgid "" -"Proxy used for all outgoing connections if the account does not have a " -"specific proxy configured" -msgstr "" -"ציר ×שר בשימוש עבור כל ×”×—×™×‘×•×¨×™× ×”×™×•×¦××™× ×‘×ž×™×“×” ולחשבון ×ין ציר ×ž×¡×•×™× ×ž×•×’×“×¨" - -#: ../src/common/config.py:316 msgid "If True, Gajim will ignore incoming attention requestd (\"wizz\")." msgstr "במידה והעדפה זו מופעלת, Gajim ×™×ª×¢×œ× ×ž×‘×§×©×•×ª הקשב × ×›× ×¡×•×ª (\"wizz\")." -#: ../src/common/config.py:317 -msgid "" -"If enabled, Gajim will reopen chat windows that were opened last time Gajim " -"was closed." -msgstr "" -"במידה ו×פשרות זו מופעלת, Gajim ייפתח מחדש ×—×œ×•× ×•×ª שיחה שהיו ×¤×ª×•×—×™× ×‘×¤×¢× " -"×”××—×¨×•× ×” בה Gajim × ×¡×’×¨." - -#: ../src/common/config.py:318 -msgid "" -"If enabled, Gajim will show an icon to show that sent message has been " -"received by your contact" -msgstr "" -"במידה ו×פשרות זו מופעלת, Gajim יציג צלמית המעידה על כך שהודעה ×שר × ×©×œ×—×” " -"התקבלה על ידי ×יש הקשר שלך" +#: ../src/common/config.py:315 +msgid "If enabled, Gajim will reopen chat windows that were opened last time Gajim was closed." +msgstr "במידה ו×פשרות זו מופעלת, Gajim ייפתח מחדש ×—×œ×•× ×•×ª שיחה שהיו ×¤×ª×•×—×™× ×‘×¤×¢× ×”××—×¨×•× ×” ×©×”×™×™×©×•× × ×¡×’×¨." -#: ../src/common/config.py:332 -msgid "" -"Priority will change automatically according to your status. Priorities are " -"defined in autopriority_* options." -msgstr "" -"עדיפות ×ª×©×•× ×” ×וטומטית בהת×× ×ל מצב החיבור שלך. עדיפויות מוגדרות בתוך ×”×פשרות " -"autopriority_*." +#: ../src/common/config.py:329 +msgid "Priority will change automatically according to your status. Priorities are defined in autopriority_* options." +msgstr "עדיפות ×ª×©×•× ×” ×וטומטית בהת×× ×œ×ž×¦×‘Ö¾×—×™×‘×•×¨×š. עדיפויות מוגדרות בתוך ×”×פשרות autopriority_*." -#: ../src/common/config.py:340 -msgid "" -"Status used to autoconnect as. Can be online, chat, away, xa, dnd, " -"invisible. NOTE: this option is used only if restore_last_status is disabled" -msgstr "" -"מצב בשימוש להתחברות ×וטומטית בתור . יכול להיות online (מקוון), chat (×¤× ×•×™ " -"לשיחה), away (× ×¢×“×¨), xa (×œ× ×–×ž×™×Ÿ), dnd (עסוק), invisible (בלתי × ×¨××”). הערה: " -"×פשרות זו × ×›× ×¡×ª לשימוש רק ×× ×”×”×¢×“×¤×” restore_last_status ×ž× ×•×˜×¨×œ×ª" +#: ../src/common/config.py:337 +msgid "Status used to autoconnect as. Can be online, chat, away, xa, dnd, invisible. NOTE: this option is used only if restore_last_status is disabled" +msgstr "מצב בשימוש להתחברות ×וטומטית ×›-. יכול להיות online (מקוון), chat (×¤× ×•×™ לשיחה), away (× ×¢×“×¨), xa (×œ× ×–×ž×™×Ÿ), dnd (עסוק), invisible (בלתי × ×¨××”). הערה: ×פשרות זו × ×›× ×¡×ª לשימוש רק ×× ×”×”×¢×“×¤×” restore_last_status ×ž× ×•×˜×¨×œ×ª" -#: ../src/common/config.py:341 +#: ../src/common/config.py:338 msgid "If enabled, restore the last status that was used." -msgstr "במידה והעדפה זו מופעלת, מצב החיבור ×”×חרון ×שר ×”×™×” בשימוש ישוחזר." +msgstr "במידה והעדפה זו מופעלת, מצב־החיבור ×”×חרון שהיה בשימוש ישוחזר." # BUG: typo: the authorization of the contacts will get accepted, not the contacts themselves # הרש×ות שיתבקשו על ידי ×× ×©×™ קשר יתקבלו ×וטומטית -#: ../src/common/config.py:343 -msgid "" -"If True, Contacts requesting authorization will be automatically accepted." -msgstr "במידה והעדפה זו מופעלת, ×× ×©×™ קשר ×שר ×ž×‘×§×©×™× ×”×¨×©××” יתקבלו ×וטומטית." +#: ../src/common/config.py:340 +msgid "If True, Contacts requesting authorization will be automatically accepted." +msgstr "במידה והעדפה זו מופעלת, ×× ×©×™ קשר ×©×ž×‘×§×©×™× ×”×¨×©××” יתקבלו ×וטומטית." -#: ../src/common/config.py:344 -msgid "" -"If False, this account will be disabled and will not appear in roster window." +# ייר××” +#: ../src/common/config.py:341 +msgid "If False, this account will be disabled and will not appear in roster window." msgstr "במידה ו×פשרות זו ×ž× ×•×˜×¨×œ×ª, חשבון ×–×” ×™× ×•×˜×¨×œ ×•×œ× ×™×•×¤×™×¢ בחלון הרשימה." -#: ../src/common/config.py:347 -msgid "" -"If disabled, don't sign presences with GPG key, even if GPG is configured." -msgstr "" -"במידה ו×פשרות זו ×ž× ×•×˜×¨×œ×ª, ×ל ×ª×—×ª×•× × ×•×›×—×•×ª ב×מצעות מפתח GPG, ×פילו ×× GPG " -"מוגדר." +#: ../src/common/config.py:344 +msgid "If disabled, don't sign presences with GPG key, even if GPG is configured." +msgstr "במידה ו×פשרות זו ×ž× ×•×˜×¨×œ×ª, ×ל ×ª×—×ª×•× × ×•×›×—×•×ª ב×מצעות מפתח GPG, ×פילו ×× GPG מוגדר." -#: ../src/common/config.py:349 +#: ../src/common/config.py:346 msgid "Enable ESessions encryption for this account." msgstr "×פשור ×”×¦×¤× ×ª ESessions עבור חשבון ×–×”." # ב××/×›×שר × ×™×ª×Ÿ -#: ../src/common/config.py:350 +#: ../src/common/config.py:347 msgid "Should Gajim automatically start an encrypted session when possible?" msgstr "×”×× ×¢×œ Gajim להתחיל ×וטומטית סשן מוצפן במידת ×”×פשר?" -#: ../src/common/config.py:351 -msgid "" -"Ordered list (space separated) of connection type to try. Can contain tls, " -"ssl or plain" -msgstr "" -"רשימה סדורה (רווח מפריד) של טיפוס חיבור ×œ× ×¡×•×ª. יכול להכיל tls, ssl ×ו plain" +#: ../src/common/config.py:348 +msgid "Ordered list (space separated) of connection type to try. Can contain tls, ssl or plain" +msgstr "רשימה סדורה (רווח מפריד) של טיפוס חיבור ×œ× ×¡×•×ª. יכול להכיל tls, ssl ×ו plain" -#: ../src/common/config.py:352 -msgid "" -"Show a warning dialog before sending password on an plaintext connection. " -"Can be 'warn', 'connect', 'disconnect'" -msgstr "" -"הצגת דו שיח ×זהרה ×˜×¨× ×©×œ×™×—×ª סיסמה על ×¤× ×™ חיבור גלוי. יכול להיות " -"'warn' (הזהר), 'connect' (התחבר), 'disconnect' (×”×ª× ×ª×§)" +# ×‘×˜×¨× +# חיבור תמליל גלוי +#: ../src/common/config.py:349 +msgid "Show a warning dialog before sending password on an plaintext connection. Can be 'warn', 'connect', 'disconnect'" +msgstr "הצגת דו־שיח ×זהרה ×˜×¨× ×©×œ×™×—×ª סיסמה על ×¤× ×™ חיבור גלוי. יכול להיות 'warn' (הזהר), 'connect' (התחבר), 'disconnect' (×”×ª× ×ª×§)" -#: ../src/common/config.py:353 +# What is standard? +# (1) serving as a model, widely accepted +# (2) normal, regular, typical +#: ../src/common/config.py:350 +#, fuzzy msgid "Show a warning dialog before using standard SSL library." -msgstr "הצג דו שיח ×זהרה ×‘×˜×¨× ×©×™×ž×•×© בספריית SSL ×¡×˜× ×“×¨×˜×™×ª." +msgstr "הצג דו־שיח ×זהרה ×‘×˜×¨× ×©×™×ž×•×© בספריית SSL רגילה." -#: ../src/common/config.py:354 -msgid "" -"Show a warning dialog before sending PLAIN password over a plain connection." -msgstr "הצגת דו שיח ×זהרה ×˜×¨× ×©×œ×™×—×ª סיסמה חשופה על ×¤× ×™ חיבור גלוי." +# גלויה +# חיבור ×œ× ×ž×ובטח +#: ../src/common/config.py:351 +msgid "Show a warning dialog before sending PLAIN password over a plain connection." +msgstr "הצגת דו־שיח ×זהרה ×˜×¨× ×©×œ×™×—×ª סיסמה חשופה על ×¤× ×™ חיבור גלוי." -#: ../src/common/config.py:356 +#: ../src/common/config.py:353 msgid "Space separated list of ssl errors to ignore." -msgstr "רשימה ×שר מופרדת ×¢× ×¨×•×•×—, של שגי×ות ssl שיש ×œ×”×ª×¢×œ× ×ž×”×Ÿ." +msgstr "רשימה שמופרדת ×¢× ×¨×•×•×—, של שגי×ות ssl שיש ×œ×”×ª×¢×œ× ×ž×”×Ÿ." -#: ../src/common/config.py:362 -msgid "" -"Space separated list of JIDs for which you do not want to store logs. You " -"can also add account name to log nothing for this account." -msgstr "" -"רשימה ×שר מופרדת ×¢× ×¨×•×•×—, של כתובות JID עבורן ×ין ×‘×¨×¦×•× ×š ל×חסן רשומות. " -"ב×פשרותך ×’× ×œ×”×•×¡×™×£ ×©× ×—×©×‘×•×Ÿ כדי ×œ× ×œ×¨×©×•× ×“×‘×¨ עבור חשבון ×–×”." +#: ../src/common/config.py:359 +msgid "Space separated list of JIDs for which you do not want to store logs. You can also add account name to log nothing for this account." +msgstr "רשימה שמופרדת ×¢× ×¨×•×•×—, של כתובות JID עבורן ×ין ×‘×¨×¦×•× ×š ל×חסן רשומות. ביכולתך ×’× ×œ×”×•×¡×™×£ ×©× ×—×©×‘×•×Ÿ כדי ×œ× ×œ×¨×©×•× ×“×‘×¨ עבור חשבון ×–×”." # BUG: he or she -#: ../src/common/config.py:363 -msgid "" -"Space separated list of JIDs for which you accept to not log conversations " -"if he does not want to." -msgstr "" -"רשימה ×שר מופרדת ×¢× ×¨×•×•×—, של כתובות JID עבורן ×”×™× ×š מביע הסכמה ×©×œ× ×œ×¨×•×©× " -"×“×™×•× ×™× ×‘×ž×™×“×” והקצה ×”×©× ×™ ×œ× ×ž×¢×•× ×™×™×Ÿ בכך." +#: ../src/common/config.py:360 +msgid "Space separated list of JIDs for which you accept to not log conversations if he does not want to." +msgstr "רשימה שמופרדת ×¢× ×¨×•×•×—, של כתובות JID עבורן ×”×™× ×š מביע הסכמה ×©×œ× ×œ×¨×•×©× ×“×™×•× ×™× ×‘×ž×™×“×” והקצה ×”×©× ×™ ×œ× ×ž×¢×•× ×™×™×Ÿ בכך." # חלל לבן, עקב -#: ../src/common/config.py:366 +#: ../src/common/config.py:363 msgid "Whitespace sent after inactivity" msgstr "סימן לבן × ×©×œ×— ל×חר חוסר פעילות" -#: ../src/common/config.py:367 +#: ../src/common/config.py:364 msgid "XMPP ping sent after inactivity" msgstr "×¤×™× ×’ XMPP × ×©×œ×— ל×חר חוסר פעילות" -#: ../src/common/config.py:371 -msgid "" -"How many seconds to wait for the answer of ping alive packet before we try " -"to reconnect?" -msgstr "" -"כמה ×©× ×™×•×ª להמתין עבור תשובת חבילת ×¤×™× ×’ ×—×™ ×œ×¤× ×™ ש×× ×—× ×• ×ž× ×¡×™× ×œ×”×ª×—×‘×¨ מחדש." +# keep-alive? +# BUG: Question mark ? at the end +# לתשובת +#: ../src/common/config.py:368 +msgid "How many seconds to wait for the answer of ping alive packet before we try to reconnect." +msgstr "כמה ×©× ×™×•×ª להמתין עבור תשובת חבילת ×¤×™× ×’ ×—×™ ×œ×¤× ×™ ש×× ×—× ×• ×ž× ×¡×™× ×œ×”×ª×—×‘×¨ מחדש." #. yes, no, ask -#: ../src/common/config.py:375 +#: ../src/common/config.py:372 msgid "Jabberd2 workaround" msgstr "מעקף עבור Jabberd2" # INTERESTING! # option (×פשרות), not entry (רשומה) -#: ../src/common/config.py:378 -msgid "" -"If checked, Gajim will use your IP and proxies defined in " -"file_transfer_proxies option for file transfer." -msgstr "" -"במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יעשה שימוש בכתובת פרוטוקול המרשתת (IP; â€" -"Internet Protocol) ×•×‘×ž×ª×•×•×›×™× ×©×”×•×’×“×¨×• על ידיך ב×פשרות file_transfer_proxies " -"עבור העברת קובץ." +#: ../src/common/config.py:375 +msgid "If checked, Gajim will use your IP and proxies defined in file_transfer_proxies option for file transfer." +msgstr "במידה ו×פשרות זו ×ž×¡×•×ž× ×ª, Gajim יעשה שימוש בכתובת פרוטוקול המרשתת (IP) ×•×‘×ž×ª×•×•×›×™× ×©×”×•×’×“×¨×• על ידיך ב×פשרות file_transfer_proxies עבור העברת קובץ." -#: ../src/common/config.py:379 -msgid "" -"If True, Gajim will test file transfer proxies on startup to be sure it " -"works. Openfire's proxies are known to fail this test even if they work." -msgstr "" -"במידה והעדפה זו מופעלת, Gajim יבחן מתווכי העברת קובץ בעת הפעלה כדי ×œ×•×•×“× ×›×™ " -"זו ×כן פועלת. ידוע ×›×™ מתווכי Openfire × ×›×©×œ×™× ×‘×‘×—×™× ×” זו ×פילו ×× ×לו עובדי×." +# ×œ×•×•×“× ×©×”×ª×›×•× ×” +#: ../src/common/config.py:376 +msgid "If True, Gajim will test file transfer proxies on startup to be sure it works. Openfire's proxies are known to fail this test even if they work." +msgstr "במידה והעדפה זו מופעלת, Gajim יבחן מתווכי העברת קובץ בעת הפעלה כדי ×œ×•×•×“× ×©×–×• ×כן פועלת. ידוע שמתווכי Openfire × ×›×©×œ×™× ×‘×‘×—×™× ×” זו ×פילו ×× ×לו עובדי×." -#: ../src/common/config.py:393 +#: ../src/common/config.py:390 msgid "Answer to receipt requests" msgstr "×ž×¢× ×” לבקשות קבלה" -#: ../src/common/config.py:394 +#: ../src/common/config.py:391 msgid "Sent receipt requests" -msgstr "בקשות קבלה ×שר × ×©×œ×—×•" +msgstr "בקשות קבלה ×©× ×©×œ×—×•" -#: ../src/common/config.py:403 -msgid "" -"Allow Gajim to send information about the operating system you are running." -msgstr "התר ל־Gajim לשלוח מידע ×ודות מערכת ההפעלה ×שר בשימושך." +# BUG: a dot at the end +#: ../src/common/config.py:400 +msgid "Allow Gajim to send information about the operating system you are running." +msgstr "התר ל־Gajim לשלוח מידע ×ודות מערכת ההפעלה שבשימושך" -#: ../src/common/config.py:404 +#: ../src/common/config.py:401 msgid "Allow Gajim to send your local time." msgstr "התר ל־Gajim לשלוח ×ת הזמן המקומי שלך." @@ -4793,236 +4826,418 @@ msgstr "התר ל־Gajim לשלוח ×ת הזמן המקומי שלך." # מתקיימת הסדרה לסשן # מתקיימת הסדרת סשן # ×©×¨×¦×•× ×š ×”×•× -#: ../src/common/config.py:405 -msgid "" -"When negotiating an encrypted session, should Gajim assume you want your " -"messages to be logged?" -msgstr "" -"×›×שר ×ž×ª×§×™×™× ×ž×©× ×•×ž×ª×Ÿ עבור סשן מוצפן, ×”×× ×¢×œ Gajim ×œ×”× ×™×— ×›×™ ×‘×¨×¦×•× ×š שהודעותיך " -"ירשמו?" +#: ../src/common/config.py:402 +msgid "When negotiating an encrypted session, should Gajim assume you want your messages to be logged?" +msgstr "×›×שר ×ž×ª×§×™×™× ×ž×©× ×•×ž×ª×Ÿ עבור סשן מוצפן, ×”×× ×¢×œ Gajim ×œ×”× ×™×— ×©×‘×¨×¦×•× ×š שהודעותיך ירשמו?" -#: ../src/common/config.py:408 +#: ../src/common/config.py:405 msgid "Message that is sent to contacts you want to add" -msgstr "הודעה ×שר תישלח ×ל ×× ×©×™ קשר ××•×ª× ×‘×¨×¦×•× ×š להוסיף" +msgstr "הודעה שתישלח ×ל ×× ×©×™ קשר ××•×ª× ×‘×¨×¦×•× ×š להוסיף" -#: ../src/common/config.py:409 +#: ../src/common/config.py:406 msgid "Last time we syncronized with logs from server." -msgstr "×¤×¢× ××—×¨×•× ×” בה ×¡× ×›×¨× ×• רשומות מתוך שרת." +msgstr "×¤×¢× ××—×¨×•× ×” בה ×¡× ×›×¨× ×• רשומות מן שרת." -#: ../src/common/config.py:410 -msgid "" -"If enabled and if server supports this feature, Gajim will receive messages " -"sent and received by other resources." -msgstr "" -"במידה ו×פשרות זו מופעלת ושרת × ×ª×•×Ÿ תומך ×‘×ª×›×•× ×” זו, Gajim יקבל הודעות ×שר " -"מתקבלות ×•× ×©×œ×—×•×ª על ידי מש××‘×™× ×חרי×." +#: ../src/common/config.py:407 +msgid "If enabled and if server supports this feature, Gajim will receive messages sent and received by other resources." +msgstr "במידה ו×פשרות זו מופעלת ושרת × ×ª×•×Ÿ תומך ×‘×ª×›×•× ×” זו, Gajim יקבל הודעות שמתקבלות ×•× ×©×œ×—×•×ª על ידי מש××‘×™× ×חרי×." -#: ../src/common/config.py:411 -msgid "" -"If enabled, Gajim will send your local IPs so your contact can connect to " -"your machine to transfer files." -msgstr "" -"במידה ו×פשרות זו מופעלת, Gajim ישלח ×ת כתובות פרוטוקול המרשתת (IP; â€Internet " -"Protocol) המקומיות שלך וכך תעמוד לרשות ×יש הקשר שלך ×”×פשרות להתחבר ישירות ×ל " -"מחשבך כדי להעביר קבצי×." +#: ../src/common/config.py:408 +msgid "If enabled, Gajim will send your local IPs so your contact can connect to your machine to transfer files." +msgstr "במידה ו×פשרות זו מופעלת, Gajim ישלח ×ת כתובות פרוטוקול המרשתת (IP) המקומיות שלך וכך תעמוד לרשות ×יש הקשר שלך ×”×פשרות להתחבר ישירות ×ל מחשבך כדי להעביר קבצי×." -#: ../src/common/config.py:412 +#: ../src/common/config.py:409 msgid "Latest token for Oauth2 authentication." msgstr "×”×ות ×”×חרון עבור ×ימות Oauth2." -#: ../src/common/config.py:413 +#: ../src/common/config.py:410 msgid "client_id for Oauth2 authentication." msgstr "â€client_id עבור ×ימות Oauth2." -#: ../src/common/config.py:414 +#: ../src/common/config.py:411 msgid "redirect_url for Oauth2 authentication." msgstr "â€redirect_url עבור ×ימות Oauth2." -#: ../src/common/config.py:415 -msgid "" -"Space separated list of JIDs for which we want to re-open a chat window on " -"next startup." -msgstr "" -"רשימה ×שר מופרדת ×¢× ×¨×•×•×—, של כתובות JID עבורן ×× ×• ×¨×•×¦×™× ×œ×¤×ª×•×— מחדש חלון שיחה " -"בהפעלה הב××”." +# BUG: jid > JIDs +#: ../src/common/config.py:412 +msgid "Space separated list of jid for which we want to re-open a chat window on next startup." +msgstr "רשימה שמופרדת ×¢× ×¨×•×•×—, של כתובות JID עבורן ×× ×• ×¨×•×¦×™× ×œ×¤×ª×•×— מחדש חלון שיחה בהפעלה הב××”." -#: ../src/common/config.py:477 +#: ../src/common/config.py:474 msgid "Is OpenPGP enabled for this contact?" msgstr "×”×× OpenPGP מ×ופשרת עבור ×יש קשר ×–×”?" # thank you, rodensky -#: ../src/common/config.py:478 -msgid "" -"Should Gajim automatically start an encrypted session with this contact when " -"possible?" +#: ../src/common/config.py:475 +msgid "Should Gajim automatically start an encrypted session with this contact when possible?" msgstr "×”×× ×¢×œ Gajim להתחיל ×וטומטית סשן מוצפן ×¢× ×יש קשר ×–×” במידת ×”×פשר?" -# ×שר ×‘×¨×¦×•× × ×• -#: ../src/common/config.py:479 ../src/common/config.py:482 +# ×©×‘×¨×¦×•× × ×• +#: ../src/common/config.py:476 +#: ../src/common/config.py:479 msgid "Language for which we want to check misspelled words" -msgstr "שפה עבורה ×× ×—× ×• ×¨×•×¦×™× ×œ×‘×“×•×§ ×ž×™×œ×™× ×שר ×œ× ×ž×ויתות כר×וי" - -# ×œ×œ× -#: ../src/common/config.py:483 -msgid "" -"How many lines to request from server when entering a groupchat. -1 means no " -"limit, -2 means global value" -msgstr "" -"כמה שורות לבקש מתוך שרת בעת ×›× ×™×¡×” ×ל שיחת קבוצה. 1- מסמל ××™ הגבלה, 2- מסמל " -"ערך גלובלי" +msgstr "שפה עבורה ×× ×—× ×• ×¨×•×¦×™× ×œ×‘×“×•×§ ×ž×™×œ×™× ×©×œ× ×ž×ויתות כר×וי" -#: ../src/common/config.py:484 -msgid "" -"How many minutes back to request logs when entering a groupchat. -1 means no " -"limit, -2 means global value" +#: ../src/common/config.py:482 +msgid "State whether plugins should be activated on startup (this is saved on Gajim exit). This option SHOULD NOT be used to (de)activate plug-ins. Use GUI instead." msgstr "" -"כמה דקות ל×חור לבקש רשומות בעת התחברות ×ל שיחת קבוצה. 1- מסמל ××™ הגבלה, 2- " -"מסמל ערך גלובלי" #: ../src/common/config.py:487 -msgid "" -"State whether plugins should be activated on startup (this is saved on Gajim " -"exit). This option SHOULD NOT be used to (de)activate plug-ins. Use GUI " -"instead." -msgstr "" -"קבע ×”×× ×¢×œ תוספות להיות מתופעלות בעת הפעלה (זוהי × ×©×ž×¨×ª בעת יצי××” מתוך " -"Gajim). ×ין להשתמש ב×פשרות זו כדי לשפעל ×ו ×œ× ×˜×¨×œ תוספות. עליך להשתמש בממשק " -"משתמש גרפי במקו×." - -# יושן -#: ../src/common/config.py:492 ../src/common/pep.py:157 +#: ../src/common/pep.py:157 msgid "Sleeping" -msgstr "ישן" +msgstr "יושן" -#: ../src/common/config.py:493 +#: ../src/common/config.py:488 msgid "Back soon" msgstr "×שוב בקרוב" -#: ../src/common/config.py:493 +#: ../src/common/config.py:488 msgid "Back in some minutes." msgstr "×× ×™ ×חזור בעוד כמה דקות." -#: ../src/common/config.py:494 ../src/common/pep.py:127 +#: ../src/common/config.py:489 +#: ../src/common/pep.py:127 msgid "Eating" msgstr "×וכל" -#: ../src/common/config.py:494 +#: ../src/common/config.py:489 msgid "I'm eating, so leave me a message." msgstr "×× ×™ בהפסקת ×וכל, ××– תש×ירו לי הודעה." -#: ../src/common/config.py:495 +#: ../src/common/config.py:490 msgid "Movie" msgstr "סרט" -#: ../src/common/config.py:495 +#: ../src/common/config.py:490 msgid "I'm watching a movie." msgstr "×× ×™ צופה בסרט." -#: ../src/common/config.py:496 ../src/common/pep.py:186 +#: ../src/common/config.py:491 +#: ../src/common/pep.py:185 msgid "Working" msgstr "עובד" -#: ../src/common/config.py:496 +#: ../src/common/config.py:491 msgid "I'm working." msgstr "×× ×™ בעבודה." -#: ../src/common/config.py:497 +#: ../src/common/config.py:492 msgid "Phone" msgstr "טלפון" # בשיחת טלפון -#: ../src/common/config.py:497 +#: ../src/common/config.py:492 msgid "I'm on the phone." msgstr "×× ×™ בטלפון." -#: ../src/common/config.py:498 +#: ../src/common/config.py:493 msgid "Out" msgstr "בחוץ" -#: ../src/common/config.py:498 +#: ../src/common/config.py:493 msgid "I'm out enjoying life." msgstr "יצ×תי החוצה ×œ×™×”× ×•×ª מן ×”×—×™×™×." # מצבי זמין -#: ../src/common/config.py:509 +#: ../src/common/config.py:504 msgid "I'm available." msgstr "×× ×™ זמין." -#: ../src/common/config.py:510 +#: ../src/common/config.py:505 msgid "I'm free for chat." msgstr "×× ×™ ×¤× ×•×™/×” לשיחה." # ×שוב מיד # מיד ×שוב -#: ../src/common/config.py:511 ../src/config.py:1646 +#: ../src/common/config.py:506 +#: ../src/config.py:1645 msgid "Be right back." msgstr "×× ×™ כבר ×שוב." # ××™× ×™/××™× × ×™ זמין. -#: ../src/common/config.py:512 +#: ../src/common/config.py:507 msgid "I'm not available." msgstr "×× ×™ ×œ× ×–×ž×™×Ÿ." -#: ../src/common/config.py:513 +#: ../src/common/config.py:508 msgid "Do not disturb." msgstr "× × ×œ× ×œ×”×¤×¨×™×¢." -#: ../src/common/config.py:514 ../src/common/config.py:515 +#: ../src/common/config.py:509 +#: ../src/common/config.py:510 msgid "Bye!" msgstr "להתר×ות!" -#: ../src/common/config.py:526 -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 "" -"צליל ×œ× ×™×’×•×Ÿ ×›×שר הודעת שיחת קבוצה מכילה ×חת מתוך ×”×ž×™×œ×™× ×שר ×ž×¦×•×™× ×•×ª בתוך " -"muc_highlight_words, ×ו ×›×שר הודעת שיחת קבוצה מכילה ××— ×©× ×”×›×™× ×•×™ שלך." +#: ../src/common/config.py:521 +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 "צליל ×œ× ×™×’×•×Ÿ ×›×שר הודעת שיחת קבוצה מכילה ×חת מן ×”×ž×™×œ×™× ×©×ž×¦×•×™× ×•×ª בתוך muc_highlight_words, ×ו ×›×שר הודעת שיחת קבוצה מכילה ××— ×©× ×›×™× ×•×™×™×š." -#: ../src/common/config.py:527 +#: ../src/common/config.py:522 msgid "Sound to play when any MUC message arrives." msgstr "צליל ×œ× ×™×’×•×Ÿ ×›×שר הודעת שמ״מ מגיעה." -#: ../src/common/config.py:536 ../src/common/optparser.py:309 +#: ../src/common/config.py:531 +#: ../src/common/optparser.py:309 msgid "green" msgstr "ירוק" -#: ../src/common/config.py:540 ../src/common/optparser.py:295 +#: ../src/common/config.py:535 +#: ../src/common/optparser.py:295 msgid "grocery" msgstr "במכולת" -#: ../src/common/config.py:544 +#: ../src/common/config.py:539 msgid "human" msgstr "×× ×•×©×™" -#: ../src/common/config.py:548 +#: ../src/common/config.py:543 msgid "marine" msgstr "ימי" -#: ../src/common/config.py:555 +#: ../src/common/config.py:550 msgid "Tor" msgstr "" +# request for comments? +# כתובת JID +#: ../src/common/connection_handlers_events.py:369 +#, python-format +msgid "JID %s is not RFC compliant. It will not be added to your roster. Use roster management tools such as http://jru.jabberstudio.org/ to remove it" +msgstr "‫JID ‫%s ××™× ×” תו×מת RFC. זו ×œ× ×ª×•×¡×£ ×ל רשימתך. × ×™×ª×Ÿ להשתמש בכלי רשימה (roster) כגון http://jru.jabberstudio.org כדי להסירה" + +#: ../src/common/connection_handlers_events.py:823 +#, python-format +msgid "unsubscribe request from %s" +msgstr "בקשת ביטול הרשמה מ×ת %s" + +# Write to Disk? +#: ../src/common/connection_handlers_events.py:908 +#: ../src/common/connection_handlers.py:338 +#: ../src/common/connection_handlers.py:953 +#: ../src/common/connection_handlers.py:1075 +#: ../src/common/connection.py:459 +#: ../src/common/logger.py:1153 +#: ../src/gajim.py:390 +#: ../src/session.py:97 +#, fuzzy +msgid "Disk Write Error" +msgstr "שגי×ת כתיבה ×ל ×›×•× ×Ÿ" + +#: ../src/common/connection_handlers_events.py:912 +#: ../src/common/connection_handlers.py:956 +#: ../src/common/connection_handlers.py:1078 +#: ../src/common/connection.py:463 +#: ../src/common/logger.py:1156 +#: ../src/gajim.py:209 +#: ../src/session.py:101 +#, python-format +msgid "The database file (%s) cannot be read. Try to repair it (see http://trac.gajim.org/wiki/DatabaseBackup) or remove it (all history will be lost)." +msgstr "קובץ מסד ×”× ×ª×•× ×™× (%s) ×œ× × ×™×ª×Ÿ לקרי××”. × ×¡×• ×œ×ª×§× ×• (ר×ו http://trac.gajim.org/wiki/DatabaseBackup) ×ו להסירו (כל ההיסטוריה ת×בד)." + +#. Room has been destroyed. see +#. http://www.xmpp.org/extensions/xep-0045.html#destroyroom +#: ../src/common/connection_handlers_events.py:933 +msgid "Room has been destroyed" +msgstr "החדר הוחרב" + +#: ../src/common/connection_handlers_events.py:941 +#, python-format +msgid "You can join this room instead: %s" +msgstr "יש ב×פשרותך להצטרף ×ל חדר ×–×” במקו×: %s" + +#: ../src/common/connection_handlers_events.py:1025 +#: ../src/common/connection_handlers_events.py:1062 +#: ../src/common/connection.py:263 +#: ../src/config.py:2142 +#: ../src/config.py:2151 +#: ../src/config.py:2219 +#: ../src/config.py:3662 +#: ../src/dataforms_widget.py:633 +#: ../src/dialogs.py:3133 +msgid "Invalid Jabber ID" +msgstr "כתובת JID שגויה" + +# מן כתובת +# זכתה להתעלמות מן הצד/הקצה שלך +#: ../src/common/connection_handlers_events.py:1026 +#: ../src/common/connection_handlers_events.py:1063 +msgid "A message from a non-valid JID arrived, it has been ignored." +msgstr "התקבלה הודעה מן כתובת JID ש××™× × ×” תקפה, Gajim ×”×ª×¢×œ× ×ž×Ÿ הודעה זו." + +#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) +#: ../src/common/connection_handlers_events.py:1094 +#: ../src/gui_interface.py:432 +#: ../src/gui_interface.py:446 +#, python-format +msgid "error while sending %(message)s ( %(error)s )" +msgstr "שגי××” בעת שליחת ‫%(message)s ‫( %(error)s )" + +#: ../src/common/connection_handlers_events.py:1565 +#, python-format +msgid "Unknown SSL error: %d" +msgstr "שגי×ת SSL ×œ× ×™×“×•×¢×”: %d" + +#: ../src/common/connection_handlers_events.py:2157 +#: ../src/dialogs.py:2818 +#: ../src/notify.py:266 +msgid "New Single Message" +msgstr "הודעה בודדת חדשה" + +#: ../src/common/connection_handlers_events.py:2159 +#, python-format +msgid "New Single Message from %(nickname)s" +msgstr "התקבלה הודעה בודדת חדשה מ×ת %(nickname)s" + +#: ../src/common/connection_handlers_events.py:2163 +#: ../src/dialogs.py:2819 +#: ../src/notify.py:267 +msgid "New Private Message" +msgstr "הודעה פרטית חדשה" + +# מן שיחת +#: ../src/common/connection_handlers_events.py:2165 +#, python-format +msgid "New Private Message from group chat %s" +msgstr "הודעה פרטית חדשה משיחת הקבוצה %s" + +#: ../src/common/connection_handlers_events.py:2168 +#, python-format +msgid "%(nickname)s: %(message)s" +msgstr "‫%(nickname)s: ‫%(message)s" + +# [09:02:34 PM] Rodensky: "התקבלה הודעה מ" +# [09:08:28 PM] Myself: ×× ×™ חושב שזה: המסר × ×©×œ×— על-ידי... +# [09:08:39 PM] Rodensky: ×œ× +# [09:08:46 PM] Rodensky: ×–×” "התקבלה הודעה מ" +#: ../src/common/connection_handlers_events.py:2171 +#, python-format +msgid "Messaged by %(nickname)s" +msgstr "התקבלה הודעה מ×ת %(nickname)s" + +#: ../src/common/connection_handlers_events.py:2175 +#: ../src/dialogs.py:2818 +#: ../src/notify.py:266 +msgid "New Message" +msgstr "הודעה חדשה" + +#: ../src/common/connection_handlers_events.py:2177 +#, python-format +msgid "New Message from %(nickname)s" +msgstr "הודעה חדשה מ×ת %(nickname)s" + +# ‫%(nick)s ×©×™× ×”/תה מצב +#: ../src/common/connection_handlers_events.py:2320 +#, python-format +msgid "%(nick)s Changed Status" +msgstr "המצב של %(nick)s ×©×•× ×”" + +# See: LRE string PDF +#: ../src/common/connection_handlers_events.py:2322 +#: ../src/groupchat_control.py:205 +#: ../src/groupchat_control.py:1767 +#: ../src/history_window.py:448 +#, python-format +msgid "%(nick)s is now %(status)s" +msgstr "‫%(nick)s מצוי/×” כעת במצב %(status)s " + +#: ../src/common/connection_handlers_events.py:2327 +#: ../src/dialogs.py:2830 +#: ../src/notify.py:280 +msgid "Contact Changed Status" +msgstr "×יש קשר ×©×™× ×” מצב־חיבור" + +#: ../src/common/connection_handlers_events.py:2329 +#, python-format +msgid "%(nickname)s Signed In" +msgstr "‫%(nickname)s התחבר/×”" + +#. default value +#: ../src/common/connection_handlers_events.py:2334 +#: ../src/dialogs.py:2814 +#: ../src/notify.py:262 +msgid "Contact Signed In" +msgstr "×יש קשר התחבר" + +#: ../src/common/connection_handlers_events.py:2336 +#, python-format +msgid "%(nickname)s Signed Out" +msgstr "‫%(nickname)s ×”×ª× ×ª×§/×”" + +#: ../src/common/connection_handlers_events.py:2341 +#: ../src/dialogs.py:2816 +#: ../src/notify.py:264 +msgid "Contact Signed Out" +msgstr "×יש קשר ×”×ª× ×ª×§" + +#: ../src/common/connection_handlers.py:89 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:54 +msgid "Unable to load idle module" +msgstr "×œ× × ×™×ª×Ÿ לטעון מודוּל חוסר פעילות" + +#: ../src/common/connection_handlers.py:122 +#, python-format +msgid "Registration information for transport %s has not arrived in time" +msgstr "מידע ×¨×™×©×•× ×¢×‘×•×¨ המוביל %s ×œ× ×”×’×™×¢ בזמן" + +#: ../src/common/connection_handlers.py:130 +msgid "Registration succeeded" +msgstr "×¨×™×©×•× ×‘×•×¦×¢ בהצלחה" + +# BUG: agent>transport ? +#: ../src/common/connection_handlers.py:131 +#, python-format +msgid "Registration with agent %s succeeded" +msgstr "×¨×™×©×•× ×¢× ×¡×•×›×Ÿ %s בוצע בהצלחה" + +#: ../src/common/connection_handlers.py:140 +msgid "Registration failed" +msgstr "×¨×™×©×•× × ×›×©×œ" + +# BUG: with errors +# BUG: with an error +# Needs to be tested +#: ../src/common/connection_handlers.py:141 +#, python-format +msgid "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" +msgstr "×¨×™×©×•× ×¢× ×¡×•×›×Ÿ %(agent)s × ×›×©×œ בליווי שגי××” ‫%(error)s: %(error_msg)s" + +#: ../src/common/connection_handlers.py:575 +#: ../src/common/connection.py:1576 +msgid "Invisibility not supported" +msgstr "מצב בלתי × ×¨××” ××™× ×• × ×ª×ž×š" + +#: ../src/common/connection_handlers.py:576 +#: ../src/common/connection.py:1577 +#, python-format +msgid "Account %s doesn't support invisibility." +msgstr "חשבון %s ×œ× ×ª×•×ž×š במצב בלתי × ×¨××”." + +#: ../src/common/connection_handlers.py:1742 +msgid "I would like to add you to my roster." +msgstr "×‘×¨×¦×•× ×™ להוסיפך ×ל הרשימה שלי." + #: ../src/common/connection.py:70 msgid "Unable to get issuer certificate" -msgstr "×ין ×פשרות לקבל תעודת ×ž× ×¤×™×§" +msgstr "×œ× × ×™×ª×Ÿ לקבל תעודת ×ž× ×¤×™×§" #: ../src/common/connection.py:71 msgid "Unable to get certificate CRL" -msgstr "×ין ×פשרות לקבל תעודת CRL" +msgstr "×œ× × ×™×ª×Ÿ לקבל תעודת CRL" #: ../src/common/connection.py:72 msgid "Unable to decrypt certificate's signature" -msgstr "×ין ×פשרות ×œ×¤×¢× ×— ×ת החתימה של התעודה" +msgstr "×œ× × ×™×ª×Ÿ ×œ×¤×¢× ×— ×ת החתימה של התעודה" #: ../src/common/connection.py:73 msgid "Unable to decrypt CRL's signature" -msgstr "×ין ×פשרות ×œ×¤×¢× ×— חתימת CRL" +msgstr "×œ× × ×™×ª×Ÿ ×œ×¤×¢× ×— חתימת CRL" +# Is decode different from decrypt? #: ../src/common/connection.py:74 msgid "Unable to decode issuer public key" -msgstr "×ין ×פשרות ×œ×¤×¢× ×— מפתח ציבורי של ×ž× ×¤×™×§" +msgstr "×œ× × ×™×ª×Ÿ ×œ×¤×¢× ×— מפתח ציבורי של ×ž× ×¤×™×§" +# תעודת חתימה × ×›×©×œ #: ../src/common/connection.py:75 msgid "Certificate signature failure" msgstr "כשל תעודת חתימה" @@ -5042,13 +5257,15 @@ msgstr "התעודה פקעה" # CRL what? (Certificate?) #: ../src/common/connection.py:79 msgid "CRL is not yet valid" -msgstr "â€CRL ××™× ×” תקפה עדיין" +msgstr "‫CRL עדיין ×œ× ×ª×§×¤×”" # CRL what? (Certificate?) #: ../src/common/connection.py:80 msgid "CRL has expired" -msgstr "â€CRL פקעה" +msgstr "‫CRL פקעה" +# ×ª×‘× ×™×ª +# שבתעודה #: ../src/common/connection.py:81 msgid "Format error in certificate's notBefore field" msgstr "שגי×ת תסדיר בשדה notBefore של התעודה" @@ -5080,16 +5297,18 @@ msgstr "תעודה חתומה ב×ופן עצמי בתוך שרשרת תעודה #: ../src/common/connection.py:88 msgid "Unable to get local issuer certificate" -msgstr "×ין ×פשרות לקבל תעודת ×ž× ×¤×™×§ מקומית" +msgstr "×œ× × ×™×ª×Ÿ לקבל תעודת ×ž× ×¤×™×§ מקומית" #: ../src/common/connection.py:89 msgid "Unable to verify the first certificate" -msgstr "×ין ×פשרות ל×מת ×ת התעודה הר××©×•× ×”" +msgstr "×œ× × ×™×ª×Ÿ ל×מת ×ת התעודה הר××©×•× ×”" +# מחרוזת #: ../src/common/connection.py:90 msgid "Certificate chain too long" -msgstr "שרשרת תעודה ×רוכה מדי" +msgstr "שרשרת תעודה ×רוכה מידי" +# × ×¤×¡×œ×” #: ../src/common/connection.py:91 msgid "Certificate revoked" msgstr "התעודה בוטלה" @@ -5100,9 +5319,11 @@ msgstr "תעודת CA חסרת תוקף" #: ../src/common/connection.py:93 msgid "Path length constraint exceeded" -msgstr "מגבלת ×ורך × ×ª×™×‘ מוצתה" +msgstr "" +# מטרת #: ../src/common/connection.py:94 +#, fuzzy msgid "Unsupported certificate purpose" msgstr "תכלית תעודה ×œ× × ×ª×ž×›×ª" @@ -5119,7 +5340,7 @@ msgstr "התעודה × ×“×—×ª×”" # קיימת ××™ תי××•× ×¢×/ב #: ../src/common/connection.py:97 msgid "Subject issuer mismatch" -msgstr "× ×•×©× ×ž× ×¤×™×§ ×œ× ×ª×•××" +msgstr "" #: ../src/common/connection.py:98 msgid "Authority and subject key identifier mismatch" @@ -5132,43 +5353,35 @@ msgstr "רשות ומספר סידורי של ×ž× ×¤×™×§ ×œ× ×ª×•×מי×" #: ../src/common/connection.py:100 msgid "Key usage does not include certificate signing" -msgstr "שימוש מפתח ×œ× ×›×•×œ×œ חתימת תעודה" +msgstr "" #: ../src/common/connection.py:101 #, fuzzy msgid "Application verification failure" msgstr "כשל ×ימות ×¤× ×™×”" -#: ../src/common/connection.py:270 ../src/common/connection.py:280 -#: ../src/common/connection_handlers_events.py:1027 -#: ../src/common/connection_handlers_events.py:1070 ../src/config.py:2157 -#: ../src/config.py:2166 ../src/config.py:2236 ../src/config.py:3680 -#: ../src/dataforms_widget.py:633 ../src/dialogs.py:3244 -msgid "Invalid Jabber ID" -msgstr "מזהה Jabber שגוי" - -#: ../src/common/connection.py:271 ../src/common/connection.py:281 -#: ../src/dialogs.py:3245 +#: ../src/common/connection.py:264 +#: ../src/dialogs.py:3134 #, python-format msgid "It is not possible to send a message to %s, this JID is not valid." -msgstr "×ין ×פשרות לשלוח הודעה ×ל %s, כתובת JID זו ××™× ×” תקפה." +msgstr "×œ× × ×™×ª×Ÿ לשלוח הודעה ×ל %s, כתובת JID זו ××™× ×” תקפה." -#: ../src/common/connection.py:304 +#: ../src/common/connection.py:286 msgid "Neither the remote presence is signed, nor a key was assigned." msgstr "××£ ×œ× ×”× ×•×›×—×•×ª המרוחקת חתומה, ×•×’× ×œ× ×”×•×§×¦×” מפתח." -#: ../src/common/connection.py:307 +#: ../src/common/connection.py:289 #, python-format msgid "The contact's key (%s) does not match the key assigned in Gajim." -msgstr "המפתח של ×יש קשר (%s) ×œ× ×ª×•×× ×ת המפתח שמוקצה בתוך Gajim." +msgstr "המפתח של ×יש קשר (%s) ×œ× ×ª×•×× ×ת המפתח שמוקצה ×צל Gajim." # Needs to be tested #. we're not english: one in locale and one en -#: ../src/common/connection.py:363 +#: ../src/common/connection.py:343 msgid "[This message is *encrypted* (See :XEP:`27`]" msgstr "[הודעה זו ×”×™× ×” *×ž×•×¦×¤× ×ª* (ר×ו :XEP:`27‪`‬]" -#: ../src/common/connection.py:507 +#: ../src/common/connection.py:446 #, python-format msgid "" "Subject: %(subject)s\n" @@ -5177,120 +5390,103 @@ msgstr "" "× ×•×©×: %(subject)s\n" "%(message)s" -# BUG: spawning dialog -#: ../src/common/connection.py:520 ../src/common/connection_handlers.py:343 -#: ../src/common/connection_handlers.py:1143 -#: ../src/common/connection_handlers.py:1267 -#: ../src/common/connection_handlers_events.py:910 -#: ../src/common/logger.py:1159 ../src/gajim.py:435 ../src/session.py:95 -msgid "Disk Write Error" -msgstr "שגי×ת כתיבת ×›×•× ×Ÿ" - -#: ../src/common/connection.py:524 ../src/common/connection_handlers.py:1146 -#: ../src/common/connection_handlers.py:1270 -#: ../src/common/connection_handlers_events.py:914 -#: ../src/common/logger.py:1162 ../src/gajim.py:230 ../src/session.py:99 -#, python-format -msgid "" -"The database file (%s) cannot be read. Try to repair it (see http://trac." -"gajim.org/wiki/DatabaseBackup) or remove it (all history will be lost)." -msgstr "" -"קובץ מסד ×”× ×ª×•× ×™× (%s) ×œ× × ×™×ª×Ÿ לקרי××”. × ×¡×• ×œ×ª×§× ×• (ר×ו http://trac.gajim.org/" -"wiki/DatabaseBackup) ×ו להסירו (כל ההיסטוריה ת×בד)." - -#: ../src/common/connection.py:930 +#: ../src/common/connection.py:866 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "החיבור ×¢× ×—×©×‘×•×Ÿ \"%s\" ×בד" -#: ../src/common/connection.py:931 +# כדי להתחבר מחדש, עליך להתחבר ×™×“× ×™×ª +#: ../src/common/connection.py:867 msgid "Reconnect manually." msgstr "התחבר ×™×“× ×™×ª." #. it's a new account #. wrong answer -#: ../src/common/connection.py:942 +#: ../src/common/connection.py:878 #, python-format msgid "Server %(name)s answered wrongly to register request: %(error)s" msgstr "שרת %(name)s ×¢× ×” ב×ופן שגוי לבקשת rhauo: %(error)s" #. requested config has changed since first connection -#: ../src/common/connection.py:984 +#: ../src/common/connection.py:920 #, python-format msgid "Server %s provided a different registration form" -msgstr "שרת %s סיפק טופס ×¨×™×©×•× ×©×•× ×”" +msgstr "שרת %s סיפק צורת ×¨×™×©×•× ×©×•× ×”" -#: ../src/common/connection.py:1001 +#: ../src/common/connection.py:937 msgid "Invalid answer" msgstr "תשובה שגויה" -#: ../src/common/connection.py:1002 +#: ../src/common/connection.py:938 #, python-format msgid "Transport %(name)s answered wrongly to register request: %(error)s" msgstr "מוביל %(name)s ×¢× ×” ב×ופן שגוי לבקשת רישו×: %(error)s" -#: ../src/common/connection.py:1297 -#, python-format -msgid "Could not connect to \"%(host)s\" via proxy \"%(proxy)s\"" -msgstr "×œ× ×”×™×ª×” ×פשרות להתחבר ×ל \"%(host)s\" דרך ציר \"%(proxy)s\"" - -#: ../src/common/connection.py:1300 +#: ../src/common/connection.py:1230 +#: ../src/common/connection.py:1385 +#: ../src/common/connection.py:2016 +#: ../src/common/zeroconf/connection_zeroconf.py:205 #, python-format -msgid "Could not connect to \"%(host)s\"" -msgstr "×œ× ×”×™×ª×” ×פשרות להתחבר ×ל \"%(host)s\"" +msgid "Could not connect to \"%s\"" +msgstr "×œ× × ×™×ª×Ÿ להתחבר ×ל \"%s\"" -#: ../src/common/connection.py:1302 ../src/common/connection.py:1463 -#: ../src/gui_interface.py:542 +# BUG: x2 +#: ../src/common/connection.py:1231 +#: ../src/gui_interface.py:541 msgid "Check your connection or try again later." -msgstr "בדוק ×ת החיבור שלך ×ו × ×¡×” שוב מ×וחר יותר." +msgstr "× × ×œ×‘×“×•×§ ×ת החיבור ×ו ×œ× ×¡×•×ª שוב מ×וחר יותר." -#: ../src/common/connection.py:1307 +#: ../src/common/connection.py:1236 #, python-format msgid "Server replied: %s" msgstr "תגובת שרת: %s" -#: ../src/common/connection.py:1322 +# כשל בהתחברות +# החיבור +#: ../src/common/connection.py:1251 msgid "Connection to proxy failed" -msgstr "התחברות ×ל ציר × ×›×©×œ×”" +msgstr "התחברות ×ל מתווך × ×›×©×œ×”" -#: ../src/common/connection.py:1360 ../src/common/connection.py:1438 +#: ../src/common/connection.py:1289 +#: ../src/common/connection.py:1361 #, python-format msgid "Could not connect to account %s" -msgstr "×œ× ×”×™×ª×” ×פשרות להתחבר ×ל חשבון %s" +msgstr "×œ× × ×™×ª×Ÿ להתחבר ×ל חשבון %s" -#: ../src/common/connection.py:1361 ../src/common/connection.py:1439 +#: ../src/common/connection.py:1290 +#: ../src/common/connection.py:1362 #, python-format msgid "Connection with account %s has been lost. Retry connecting." msgstr "החיבור ×¢× ×—×©×‘×•×Ÿ %s ×בד. ×ž× ×¡×” להתחבר כעת מחדש." # חסרת תוקף -#: ../src/common/connection.py:1388 +#: ../src/common/connection.py:1315 #, python-format msgid "The authenticity of the %s certificate could be invalid." msgstr "×ž×”×™×ž× ×•×ª×” של התעודה %s עלולה להיות רעועה." -#: ../src/common/connection.py:1391 +#: ../src/common/connection.py:1318 #, python-format msgid "" "\n" "SSL Error: <b>%s</b>" msgstr "" "\n" -"שגי×ת SSL: â€<b>%s</b>" +"שגי×ת SSL: ‫<b>%s</b>" -#: ../src/common/connection.py:1393 +#: ../src/common/connection.py:1320 #, python-format msgid "" "\n" "Unknown SSL error: %d" msgstr "" "\n" -"שגי×ת SSL ×œ× ×ž×•×›×¨×ª: %d" +"שגי×ת SSL ×œ× ×™×“×•×¢×”: %d" # חסרת תוקף # ×©× ×ª×—×•× # כוללת -#: ../src/common/connection.py:1420 +#: ../src/common/connection.py:1343 #, python-format msgid "" "The authenticity of the %s certificate could be invalid.\n" @@ -5299,244 +5495,73 @@ msgstr "" "×ž×”×™×ž× ×•×ª×” של התעודה %s עלולה להיות רעועה.\n" "תעודה זו ××™× ×” מכסה ×ת ×ž×ª×—× ×–×”." -#: ../src/common/connection.py:1462 ../src/common/connection.py:2203 -#: ../src/common/zeroconf/connection_zeroconf.py:205 -#, python-format -msgid "Could not connect to \"%s\"" -msgstr "×œ× ×”×™×ª×” ×פשרות להתחבר ×ל \"%s\"" +# BUG: x2 +#: ../src/common/connection.py:1386 +msgid "Check your connection or try again later" +msgstr "× × ×œ×‘×“×•×§ ×ת החיבור ×ו ×œ× ×¡×•×ª שוב מ×וחר יותר" -#: ../src/common/connection.py:1498 +#: ../src/common/connection.py:1421 #, python-format msgid "Authentication failed with \"%s\"" msgstr "×ימות ×¢× \"%s\" × ×›×©×œ" # × ×›×•× ×•×ª -#: ../src/common/connection.py:1499 +#: ../src/common/connection.py:1422 msgid "Please check your login and password for correctness." msgstr "×× × ×‘×“×•×§ ×ת ×ª×§×™× ×•×ª התחברותך וסיסמתך." -#: ../src/common/connection.py:1574 +#: ../src/common/connection.py:1497 msgid "Error while removing privacy list" msgstr "שגי××” במהלך הסרת רשימת פרטיות" # בטל/×™ × ×˜×¨×œ/×™ -#: ../src/common/connection.py:1575 -#, python-format -msgid "" -"Privacy list %s has not been removed. It is maybe active in one of your " -"connected resources. Deactivate it and try again." -msgstr "" -"רשימת הפרטיות %s ×œ× ×”×•×¡×¨×”. ייתכן וזו פעילה ב×חד ממש×ביך ×שר ×ž×—×•×‘×¨×™× ×›×¢×ª. בטל " -"×ת פעילותה ×•× ×¡×” שוב." - -#: ../src/common/connection.py:1771 ../src/common/connection_handlers.py:592 +#: ../src/common/connection.py:1498 #, python-format -msgid "Account %s doesn't support invisibility." -msgstr "חשבון %s ×œ× ×ª×•×ž×š במצב בלתי × ×¨××”." +msgid "Privacy list %s has not been removed. It is maybe active in one of your connected resources. Deactivate it and try again." +msgstr "רשימת הפרטיות %s ×œ× ×”×•×¡×¨×”. ייתכן וזו פעילה ב×חד ממש×ביך ×©×ž×—×•×‘×¨×™× ×›×¢×ª. יש לבטל ×ת פעילותה ×•×œ× ×¡×•×ª שוב." -#: ../src/common/connection.py:1770 ../src/common/connection_handlers.py:591 -msgid "Invisibility not supported" -msgstr "מצב בלתי × ×¨××” ××™× ×• × ×ª×ž×š" - -#: ../src/common/connection.py:2067 +#: ../src/common/connection.py:1883 #, python-format msgid "Sent contact: \"%s\" (%s)" -msgstr "×יש קשר ×שר × ×©×œ×—: \"%s\" â€(%s)" +msgstr "×יש קשר ×©× ×©×œ×—: \"%s\" ‫(%s)" -#: ../src/common/connection.py:2070 +#: ../src/common/connection.py:1886 msgid "Sent contacts:" -msgstr "×× ×©×™ קשר ×שר × ×©×œ×—×•:" +msgstr "×× ×©×™ קשר ×©× ×©×œ×—×•:" # × ×ª×•×Ÿ להשגה/לביצוע/בהישג יד -#: ../src/common/connection.py:2220 ../src/common/connection.py:2242 +#: ../src/common/connection.py:2033 +#: ../src/common/connection.py:2056 msgid "Not fetched because of invisible status" -msgstr "×œ× ×ž×•×‘× ×ž×©×•× ×ž×¦×‘ חיבור בלתי × ×¨××”" +msgstr "×œ× ×ž×•×‘× ×ž×©×•× ×ž×¦×‘Ö¾×—×™×‘×•×¨ בלתי × ×¨××”" -#: ../src/common/connection.py:2826 +#: ../src/common/connection.py:2616 msgid "Unregister failed" msgstr "ביטול ×¨×™×©×•× × ×›×©×œ" -#: ../src/common/connection.py:2827 +#: ../src/common/connection.py:2617 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" -msgstr "××™ ×¨×™×©×•× ×‘×ª×•×š שרת %(server)s × ×›×©×œ: %(error)s" - -#: ../src/common/connection_handlers.py:92 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:53 -msgid "Unable to load idle module" -msgstr "×ין ×פשרות לטעון מודוּל חוסר פעילות" - -#: ../src/common/connection_handlers.py:127 -#, python-format -msgid "Registration information for transport %s has not arrived in time" -msgstr "מידע ×¨×™×©×•× ×¢×‘×•×¨ המוביל %s ×œ× ×”×’×™×¢ בזמן" - -#: ../src/common/connection_handlers.py:135 -msgid "Registration succeeded" -msgstr "×¨×™×©×•× ×‘×•×¦×¢ בהצלחה" - -#: ../src/common/connection_handlers.py:136 -#, python-format -msgid "Registration with agent %s succeeded" -msgstr "×¨×™×©×•× ×¢× ×¡×•×›×Ÿ %s בוצע בהצלחה" - -#: ../src/common/connection_handlers.py:145 -msgid "Registration failed" -msgstr "×¨×™×©×•× × ×›×©×œ" - -# BUG: with errors -# BUG: with an error -# Needs to be tested -#: ../src/common/connection_handlers.py:146 -#, python-format -msgid "" -"Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" -msgstr "×¨×™×©×•× ×¢× ×¡×•×›×Ÿ %(agent)s × ×›×©×œ בליווי שגי××” %(error)s: â€%(error_msg)s" - -#: ../src/common/connection_handlers.py:1956 -msgid "I would like to add you to my roster." -msgstr "×‘×¨×¦×•× ×™ להוסיפך ×ל הרשימה שלי." - -#: ../src/common/connection_handlers_events.py:370 -#, python-format -msgid "" -"JID %s is not RFC compliant. It will not be added to your roster. Use roster " -"management tools such as http://jru.jabberstudio.org/ to remove it" -msgstr "" -"â€JID â€%s ××™× ×” תו×מת RFC. זו ×œ× ×ª×•×¡×£ ×ל רשימתך. × ×™×ª×Ÿ להשתמש בכלי × ×™×”×•×œ רשימה " -"(roster management tools) כגון http://jru.jabberstudio.org כדי להסירה" - -#: ../src/common/connection_handlers_events.py:825 -#, python-format -msgid "unsubscribe request from %s" -msgstr "בקשת ביטול הרשמה מ×ת %s" - -#. Room has been destroyed. see -#. http://www.xmpp.org/extensions/xep-0045.html#destroyroom -#: ../src/common/connection_handlers_events.py:935 -msgid "Room has been destroyed" -msgstr "החדר הוחרב" - -#: ../src/common/connection_handlers_events.py:943 -#, python-format -msgid "You can join this room instead: %s" -msgstr "ב×פשרותך להצטרף ×ל חדר ×–×” במקו×: %s" - -# זכתה להתעלמות מן הצד/הקצה שלך -#: ../src/common/connection_handlers_events.py:1028 -#: ../src/common/connection_handlers_events.py:1071 -msgid "A message from a non-valid JID arrived, it has been ignored." -msgstr "התקבלה הודעה מן JID ×שר ××™× × ×” תקפה, Gajim ×”×ª×¢×œ× ×ž×Ÿ הודעה זו." - -#. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) -#: ../src/common/connection_handlers_events.py:1102 -#: ../src/gui_interface.py:433 ../src/gui_interface.py:447 -#, python-format -msgid "error while sending %(message)s ( %(error)s )" -msgstr "שגי××” בעת שליחת %(message)s â€( %(error)s )" - -#: ../src/common/connection_handlers_events.py:1307 -msgid "URL:" -msgstr "â€URL:" - -#: ../src/common/connection_handlers_events.py:1608 -#, python-format -msgid "Unknown SSL error: %d" -msgstr "שגי×ת SSL ×œ× ×ž×•×›×¨×ª: %d" - -#: ../src/common/connection_handlers_events.py:2211 ../src/dialogs.py:2917 -#: ../src/notify.py:266 -msgid "New Single Message" -msgstr "הודעה בודדת חדשה" - -#: ../src/common/connection_handlers_events.py:2213 -#, python-format -msgid "New Single Message from %(nickname)s" -msgstr "התקבלה הודעה בודדת חדשה מ×ת %(nickname)s" - -#: ../src/common/connection_handlers_events.py:2217 ../src/dialogs.py:2918 -#: ../src/notify.py:267 -msgid "New Private Message" -msgstr "הודעה פרטית חדשה" - -#: ../src/common/connection_handlers_events.py:2219 -#, python-format -msgid "New Private Message from group chat %s" -msgstr "הודעה פרטית חדשה מתוך שיחת קבוצה %s" - -#: ../src/common/connection_handlers_events.py:2222 -#, python-format -msgid "%(nickname)s: %(message)s" -msgstr "" - -# [09:02:34 PM] Rodensky: "התקבלה הודעה מ" -# [09:08:28 PM] Myself: ×× ×™ חושב שזה: המסר × ×©×œ×— על-ידי... -# [09:08:39 PM] Rodensky: ×œ× -# [09:08:46 PM] Rodensky: ×–×” "התקבלה הודעה מ" -#: ../src/common/connection_handlers_events.py:2225 -#, python-format -msgid "Messaged by %(nickname)s" -msgstr "התקבלה הודעה מ×ת %(nickname)s" - -#: ../src/common/connection_handlers_events.py:2229 ../src/dialogs.py:2917 -#: ../src/notify.py:266 -msgid "New Message" -msgstr "הודעה חדשה" - -#: ../src/common/connection_handlers_events.py:2231 -#, python-format -msgid "New Message from %(nickname)s" -msgstr "הודעה חדשה מ×ת %(nickname)s" - -#: ../src/common/connection_handlers_events.py:2375 -#, python-format -msgid "%(nick)s Changed Status" -msgstr "המצב של %(nick)s ×©×•× ×”" - -#: ../src/common/connection_handlers_events.py:2377 -#: ../src/groupchat_control.py:207 ../src/groupchat_control.py:1855 -#: ../src/history_window.py:455 -#, python-format -msgid "%(nick)s is now %(status)s" -msgstr "%(nick)s מצוי/×” כעת במצב %(status)s " - -#: ../src/common/connection_handlers_events.py:2381 ../src/dialogs.py:2929 -#: ../src/notify.py:280 -msgid "Contact Changed Status" -msgstr "×יש קשר ×©×™× ×” מצב חיבור" - -#: ../src/common/connection_handlers_events.py:2383 -#, python-format -msgid "%(nickname)s Signed In" -msgstr "%(nickname)s התחבר/×”" +msgstr "××™ ×¨×™×©×•× ×צל שרת %(server)s × ×›×©×œ: %(error)s" -#. default value -#: ../src/common/connection_handlers_events.py:2387 ../src/dialogs.py:2913 -#: ../src/notify.py:262 -msgid "Contact Signed In" -msgstr "×יש קשר התחבר" - -#: ../src/common/connection_handlers_events.py:2389 -#, python-format -msgid "%(nickname)s Signed Out" -msgstr "%(nickname)s ×”×ª× ×ª×§/×”" - -#: ../src/common/connection_handlers_events.py:2393 ../src/dialogs.py:2915 -#: ../src/notify.py:264 -msgid "Contact Signed Out" -msgstr "×יש קשר ×”×ª× ×ª×§" - -#: ../src/common/contacts.py:129 ../src/common/helpers.py:67 -#: ../src/gui_interface.py:485 +#: ../src/common/contacts.py:129 +#: ../src/common/helpers.py:67 +#: ../src/gui_interface.py:484 msgid "Observers" msgstr "משקיפי×" -#: ../src/common/contacts.py:133 ../src/common/contacts.py:361 -#: ../src/common/helpers.py:67 ../src/disco.py:121 ../src/disco.py:122 -#: ../src/disco.py:1554 ../src/roster_window.py:863 -#: ../src/roster_window.py:1614 ../src/roster_window.py:1728 -#: ../src/roster_window.py:1730 ../src/roster_window.py:1892 -#: ../src/roster_window.py:2589 +#: ../src/common/contacts.py:133 +#: ../src/common/contacts.py:361 +#: ../src/common/helpers.py:67 +#: ../src/disco.py:120 +#: ../src/disco.py:121 +#: ../src/disco.py:1516 +#: ../src/roster_window.py:859 +#: ../src/roster_window.py:1608 +#: ../src/roster_window.py:1718 +#: ../src/roster_window.py:1720 +#: ../src/roster_window.py:1882 +#: ../src/roster_window.py:2579 msgid "Transports" msgstr "מובילי×" @@ -5572,9 +5597,10 @@ msgstr "מסד × ×ª×•× ×™× ×œ× ×™×›×•×œ להיקר×." #: ../src/common/exceptions.py:56 msgid "Service not available: Gajim is not running, or remote_control is False" -msgstr "שירות ×œ× ×–×ž×™×Ÿ: Gajim ×œ× ×ž×•×¨×¥, ×ו שההעדפה remote_control ×”×™× ×” ×ž× ×•×˜×¨×œ×ª" +msgstr "שירות ×œ× ×–×ž×™×Ÿ: Gajim ×œ× ×ž×•×¨×¥, ×ו שה×פשרות remote_control ×ž× ×•×˜×¨×œ×ª" -#: ../src/common/exceptions.py:67 ../src/gajim-remote.py:56 +#: ../src/common/exceptions.py:67 +#: ../src/gajim-remote.py:55 msgid "D-Bus is not present on this machine or python module is missing" msgstr "" @@ -5763,15 +5789,15 @@ msgstr "סופשבוע!" #: ../src/common/helpers.py:158 msgid "Username must be between 1 and 1023 chars" -msgstr "×©× ×ž×©×ª×ž×© מוכרח להיות בין 1 עד 1023 תווי×" +msgstr "×©× ×ž×©×ª×ž×© מוכרח להיות בין 1 ×ל 1023 תווי×" #: ../src/common/helpers.py:163 msgid "Invalid character in username." -msgstr "תו שגוי בתוך ×©× ×ž×©×ª×ž×©." +msgstr "תו שגוי ×‘×©× ×ž×©×ª×ž×©" #: ../src/common/helpers.py:169 msgid "Server must be between 1 and 1023 chars" -msgstr "שרת מוכרח להיות בין 1 עד 1023 תווי×" +msgstr "שרת מוכרח להיות בין 1 ×ל 1023 תווי×" #: ../src/common/helpers.py:174 msgid "Invalid character in hostname." @@ -5783,7 +5809,7 @@ msgstr "× ×“×¨×©×ª כתובת שרת." #: ../src/common/helpers.py:180 msgid "Resource must be between 1 and 1023 chars" -msgstr "מש×ב מוכרח להיות בין 1 עד 1023 תווי×" +msgstr "מש×ב מוכרח להיות בין 1 ×ל 1023 תווי×" #: ../src/common/helpers.py:185 msgid "Invalid character in resource." @@ -5865,7 +5891,7 @@ msgstr "×ל" #: ../src/common/helpers.py:274 msgid "From" -msgstr "מן" +msgstr "מ×ת" #: ../src/common/helpers.py:276 msgid "Both" @@ -5883,6 +5909,7 @@ msgstr "הרשמה" msgid "?Group Chat Contact Role:None" msgstr "לל×" +# ×œ× ×œ×¢×©×•×ª שימווש במילה ×חר××™×™× #: ../src/common/helpers.py:298 msgid "Moderators" msgstr "×חר××™×" @@ -5923,26 +5950,31 @@ msgstr "×ž× ×”×œ" msgid "Member" msgstr "חבר" +# Osmo - LRE. Take it! +# BUG: Due to RTL issue, I need a translation field that includes username so that I will manage to order it for RTL layout. +# מסב/×” צומת לב ×ל השיחה +# מקשיב/×” #: ../src/common/helpers.py:361 msgid "is paying attention to the conversation" -msgstr "קשוב/×” לשיחה" +msgstr "‪קשוב/×” לשיחה" #: ../src/common/helpers.py:363 msgid "is doing something else" -msgstr "עושה משהו ×חר" +msgstr "‪עושה משהו ×חר" +# מלחין/× ×” #: ../src/common/helpers.py:365 msgid "is composing a message..." -msgstr "כותב/ת הודעה..." +msgstr "‪כותב/ת הודעה..." #. paused means he or she was composing but has stopped for a while #: ../src/common/helpers.py:368 msgid "paused composing a message" -msgstr "חדל/×” מלהלחין הודעה" +msgstr "פסק/×” מלהלחין הודעה" #: ../src/common/helpers.py:370 msgid "has closed the chat window or tab" -msgstr "סגר/×” ×ת כרטיסיית ×ו ×ת חלון השיחה" +msgstr "סגר/×” ×ת ×œ×©×•× ×™×ª ×ו ×ת חלון השיחה" # גיבי ×‘×ª×™× #. GiB means gibibyte @@ -6027,30 +6059,34 @@ msgstr[1] "%d ××™×¨×•×¢×™× ×ª×œ×•×™×™× ×•×¢×•×ž×“×™×" msgid "Gajim - %s" msgstr "‫Gajim - ‫%s" -#: ../src/common/helpers.py:1368 +# LRE string PDF +# שמי ×”×•× +#: ../src/common/helpers.py:1365 msgid "Hello, I am $name." -msgstr "שלו×, שמי $name." +msgstr "שלו×, שמי ‪$name‬. " -#: ../src/common/helpers.py:1478 ../src/common/helpers.py:1487 -#: ../src/common/helpers.py:1541 +#: ../src/common/helpers.py:1475 +#: ../src/common/helpers.py:1484 +#: ../src/common/helpers.py:1538 msgid "Timeout loading image" -msgstr "×ª× ×”×–×ž×Ÿ ×שר הוקצב ×œ×˜×¢×™× ×ª ×ª×ž×•× ×”" +msgstr "×ª× ×”×–×ž×Ÿ שהוקצב ×œ×˜×¢×™× ×ª ×ª×ž×•× ×”" # BUG: File too big -#: ../src/common/helpers.py:1497 ../src/common/helpers.py:1539 +#: ../src/common/helpers.py:1494 +#: ../src/common/helpers.py:1536 msgid "Image is too big" -msgstr "×”×ª×ž×•× ×” גדולה מדי" +msgstr "×”×ª×ž×•× ×” גדולה מידי" -#: ../src/common/helpers.py:1507 +#: ../src/common/helpers.py:1504 msgid "PyCURL is not installed" -msgstr "â€PyCURL ××™× ×” ×ž×•×ª×§× ×ª" +msgstr "‫PyCURL ××™× ×” ×ž×•×ª×§× ×ª" -#: ../src/common/helpers.py:1543 +#: ../src/common/helpers.py:1540 msgid "Error loading image" msgstr "שגי××” ×‘×˜×¢×™× ×ª ×ª×ž×•× ×”" # Needs to be tested -#: ../src/common/jingle_rtp.py:114 +#: ../src/common/jingle_rtp.py:110 #, python-format msgid "%s configuration error" msgstr "שגי×ת תצורת %s" @@ -6058,7 +6094,7 @@ msgstr "שגי×ת תצורת %s" # ×”×”×ª×§× ×” # ×”×¦×™× ×•×¨ (Pipeline) ×”×™×” # השגי××” היתה -#: ../src/common/jingle_rtp.py:115 +#: ../src/common/jingle_rtp.py:111 #, python-format msgid "" "Couldn't setup %s. Check your configuration.\n" @@ -6069,7 +6105,7 @@ msgid "" "Error was:\n" "%s" msgstr "" -"×œ× ×”×™×ª×” ×פשרות להגדיר %s. בדוק ×ת הגדרת התצורה שלך.\n" +"×œ× × ×™×ª×Ÿ להגדיר ×ת %s. × × ×œ×‘×“×•×§ ×ת הגדרת התצורה שלך.\n" "\n" "Pipeline was:\n" "%s\n" @@ -6077,11 +6113,11 @@ msgstr "" "Error was:\n" "%s" -#: ../src/common/jingle_rtp.py:220 +#: ../src/common/jingle_rtp.py:207 msgid "GStreamer error" msgstr "שגי×ת ‫GStreamer" -#: ../src/common/jingle_rtp.py:220 +#: ../src/common/jingle_rtp.py:207 #, python-format msgid "" "Error: %s\n" @@ -6090,112 +6126,112 @@ msgstr "" "שגי××”: %s\n" "× ×™×¤×•×™ שגי×ות: %s" -#: ../src/common/jingle_rtp.py:354 +#: ../src/common/jingle_rtp.py:337 msgid "audio input" msgstr "קלט שמע" -#: ../src/common/jingle_rtp.py:357 +#: ../src/common/jingle_rtp.py:340 msgid "audio output" msgstr "פלט שמע" -#: ../src/common/jingle_rtp.py:412 +#: ../src/common/jingle_rtp.py:382 msgid "video input" msgstr "קלט ויד×ו" -#: ../src/common/jingle_rtp.py:421 +#: ../src/common/jingle_rtp.py:391 msgid "video output" msgstr "פלט ויד×ו" #: ../src/common/logging_helpers.py:33 -#, fuzzy, python-format +#, python-format msgid "%s is not a valid loglevel" -msgstr "cli" +msgstr "" -#: ../src/common/multimedia_helpers.py:41 +#: ../src/common/multimedia_helpers.py:39 msgid " Default device" -msgstr "מכשיר משתמט" +msgstr "תקן משתמט" #. Test src -#: ../src/common/multimedia_helpers.py:62 +#: ../src/common/multimedia_helpers.py:60 msgid "Audio test" msgstr "בדיקת שמע" #. Auto src #. Auto sink #. Auto src -#: ../src/common/multimedia_helpers.py:65 -#: ../src/common/multimedia_helpers.py:81 -#: ../src/common/multimedia_helpers.py:95 -#: ../src/common/multimedia_helpers.py:113 +#: ../src/common/multimedia_helpers.py:63 +#: ../src/common/multimedia_helpers.py:79 +#: ../src/common/multimedia_helpers.py:93 +#: ../src/common/multimedia_helpers.py:111 msgid "Autodetect" msgstr "×יתור ×וטומטי" #. Alsa src #. Alsa sink -#: ../src/common/multimedia_helpers.py:68 -#: ../src/common/multimedia_helpers.py:83 +#: ../src/common/multimedia_helpers.py:66 +#: ../src/common/multimedia_helpers.py:81 #, python-format msgid "ALSA: %s" -msgstr "â€ALSA: â€%s" +msgstr "‫ALSA: ‫%s" #. Pulseaudio src #. Pulseaudio sink -#: ../src/common/multimedia_helpers.py:71 -#: ../src/common/multimedia_helpers.py:85 +#: ../src/common/multimedia_helpers.py:69 +#: ../src/common/multimedia_helpers.py:83 #, python-format msgid "Pulse: %s" -msgstr "â€Pulse: â€%s" +msgstr "‫Pulse: ‫%s" # מעושה, מל×כותי #. Fake sink -#: ../src/common/multimedia_helpers.py:79 +#. Fake video output +#: ../src/common/multimedia_helpers.py:77 +#: ../src/common/multimedia_helpers.py:105 msgid "Fake audio output" msgstr "פלט שמע מזויף" #. Test src -#: ../src/common/multimedia_helpers.py:92 +#: ../src/common/multimedia_helpers.py:90 msgid "Video test" msgstr "בדיקת ויד×ו" #. V4L2 src -#: ../src/common/multimedia_helpers.py:97 +#: ../src/common/multimedia_helpers.py:95 #, python-format msgid "V4L2: %s" -msgstr "â€V4L2: â€%s" +msgstr "‫V4L2: ‫%s" # not sure מרקע #. Funny things, just to test... #. self.devices['GOOM'] = 'audiotestsrc ! goom' -#: ../src/common/multimedia_helpers.py:100 +#: ../src/common/multimedia_helpers.py:98 msgid "Screen" msgstr "×קרן" -#. Fake video output -#: ../src/common/multimedia_helpers.py:107 -msgid "Fake video output" -msgstr "פלט ויד×ו מזויף" - -#: ../src/common/multimedia_helpers.py:110 +#: ../src/common/multimedia_helpers.py:108 #, python-format msgid "X Window System (X11/XShm/Xv): %s" -msgstr "מערכת ×—×œ×•× ×•×ª X â€(X11/XShm/Xv): â€%s" +msgstr "מערכת ×—×œ×•× ×•×ª X ‫(X11/XShm/Xv): ‫%s" #. ximagesink -#: ../src/common/multimedia_helpers.py:112 +#: ../src/common/multimedia_helpers.py:110 msgid "X Window System (without Xv)" msgstr "מערכת ×—×œ×•× ×•×ª X (×œ×œ× Xv)" #. we talk about a file #. we talk about file -#: ../src/common/optparser.py:53 ../src/gtkgui_helpers.py:204 -#: ../src/gtkgui_helpers.py:220 +#: ../src/common/optparser.py:53 +#: ../src/gtkgui_helpers.py:203 +#: ../src/gtkgui_helpers.py:219 #, python-format msgid "Error: cannot open %s for reading" -msgstr "שגי××”: ×ין ×פשרות לפתוח ×ת %s לקרי××”" +msgstr "שגי××”: ×œ× × ×™×ª×Ÿ לפתוח ×ת %s לקרי××”" -#: ../src/common/optparser.py:304 ../src/common/optparser.py:305 +# צי×ן +#: ../src/common/optparser.py:304 +#: ../src/common/optparser.py:305 msgid "cyan" -msgstr "" +msgstr "cyan" #: ../src/common/optparser.py:384 #, fuzzy @@ -6640,7 +6676,8 @@ msgstr "×וכל ×רוחת צהריי×" msgid "Exercising" msgstr "מת×מן" -#: ../src/common/pep.py:133 ../src/common/pep.py:178 +#: ../src/common/pep.py:133 +#: ../src/common/pep.py:177 msgid "Cycling" msgstr "ברכיבה על ××•×¤× ×™×™×" @@ -6749,246 +6786,245 @@ msgid "Relaxing" msgstr "× ×¨×’×¢" #: ../src/common/pep.py:160 -msgid "Fishing" -msgstr "דג" - -#: ../src/common/pep.py:161 msgid "Gaming" msgstr "משחק" # any better word? # יוצ××™× ×§×‘×•×¢ going steady # ×™×•×¦× -#: ../src/common/pep.py:162 +#: ../src/common/pep.py:161 msgid "Going out" msgstr "מסתובב בחוץ" -#: ../src/common/pep.py:163 +#: ../src/common/pep.py:162 msgid "Partying" msgstr "חוגג" -#: ../src/common/pep.py:164 +#: ../src/common/pep.py:163 msgid "Reading" msgstr "קור×" # מת×מן -#: ../src/common/pep.py:165 +#: ../src/common/pep.py:164 msgid "Rehearsing" msgstr "מתרגל" -#: ../src/common/pep.py:166 +#: ../src/common/pep.py:165 msgid "Shopping" msgstr "×‘×§× ×™×•×ª" -#: ../src/common/pep.py:167 +#: ../src/common/pep.py:166 msgid "Smoking" msgstr "מעשן" # Be aware of brainwashing terms! # בגיבוש, מתגבש -#: ../src/common/pep.py:168 +#: ../src/common/pep.py:167 msgid "Socializing" msgstr "מתחבר" -#: ../src/common/pep.py:169 +#: ../src/common/pep.py:168 msgid "Sunbathing" msgstr "משתזף" -#: ../src/common/pep.py:170 +#: ../src/common/pep.py:169 msgid "Watching TV" msgstr "צופה בטלוויזיה" -#: ../src/common/pep.py:171 +#: ../src/common/pep.py:170 msgid "Watching a Movie" msgstr "צופה בסרט" # מדבר -#: ../src/common/pep.py:172 +#: ../src/common/pep.py:171 msgid "Talking" msgstr "משוחח" -#: ../src/common/pep.py:173 +#: ../src/common/pep.py:172 msgid "In Real Life" msgstr "×‘×—×™×™× ×”×מיתיי×" -#: ../src/common/pep.py:174 +#: ../src/common/pep.py:173 msgid "On the Phone" msgstr "בטלפון" -#: ../src/common/pep.py:175 +#: ../src/common/pep.py:174 msgid "On Video Phone" msgstr "בויד×ו־פון" -#: ../src/common/pep.py:176 +#: ../src/common/pep.py:175 msgid "Traveling" msgstr "במסע" -#: ../src/common/pep.py:177 +#: ../src/common/pep.py:176 msgid "Commuting" msgstr "ביוממות" -#: ../src/common/pep.py:179 +#: ../src/common/pep.py:178 msgid "Driving" msgstr "×‘× ×”×™×’×”" -#: ../src/common/pep.py:180 +#: ../src/common/pep.py:179 msgid "In a Car" msgstr "×‘×ž×›×•× ×™×ª" -#: ../src/common/pep.py:181 +#: ../src/common/pep.py:180 msgid "On a Bus" msgstr "ב×וטובוס" -#: ../src/common/pep.py:182 +#: ../src/common/pep.py:181 msgid "On a Plane" msgstr "במטוס" -#: ../src/common/pep.py:183 +#: ../src/common/pep.py:182 msgid "On a Train" msgstr "ברכבת" -#: ../src/common/pep.py:184 +#: ../src/common/pep.py:183 msgid "On a Trip" msgstr "בטיול" -#: ../src/common/pep.py:185 +#: ../src/common/pep.py:184 msgid "Walking" msgstr "הולך" -#: ../src/common/pep.py:187 +#: ../src/common/pep.py:186 msgid "Coding" msgstr "מקודד" -#: ../src/common/pep.py:188 +#: ../src/common/pep.py:187 msgid "In a Meeting" msgstr "בפגישה" -#: ../src/common/pep.py:189 +#: ../src/common/pep.py:188 msgid "Studying" msgstr "לומד" -#: ../src/common/pep.py:190 +#: ../src/common/pep.py:189 msgid "Writing" msgstr "כותב" -#: ../src/common/pep.py:195 +#: ../src/common/pep.py:194 msgid "accuracy" msgstr "דיוק" -#: ../src/common/pep.py:196 +#: ../src/common/pep.py:195 msgid "alt" msgstr "גובה" -#: ../src/common/pep.py:197 +#: ../src/common/pep.py:196 msgid "area" msgstr "×זור" # GPS bearing -#: ../src/common/pep.py:198 +#: ../src/common/pep.py:197 msgid "bearing" msgstr "הסבה" -#: ../src/common/pep.py:199 +#: ../src/common/pep.py:198 msgid "building" msgstr "×‘× ×™×™×Ÿ" -#: ../src/common/pep.py:200 +#: ../src/common/pep.py:199 msgid "country" msgstr "×רץ" -#: ../src/common/pep.py:201 +#: ../src/common/pep.py:200 msgid "countrycode" msgstr "מיקוד ×ž×“×™× ×”" # GPS datum -#: ../src/common/pep.py:202 +#: ../src/common/pep.py:201 msgid "datum" msgstr "× ×ª×•×Ÿ" -#: ../src/common/pep.py:203 +#: ../src/common/pep.py:202 msgid "description" msgstr "תי×ור" -#: ../src/common/pep.py:204 +#: ../src/common/pep.py:203 msgid "error" msgstr "שגי××”" -#: ../src/common/pep.py:205 +#: ../src/common/pep.py:204 msgid "floor" msgstr "קומה" -#: ../src/common/pep.py:206 +#: ../src/common/pep.py:205 msgid "lat" msgstr "קו רוחב" -#: ../src/common/pep.py:207 +#: ../src/common/pep.py:206 msgid "locality" msgstr "מקומיות" -#: ../src/common/pep.py:208 +#: ../src/common/pep.py:207 msgid "lon" msgstr "קו ×ורך" -#: ../src/common/pep.py:209 +#: ../src/common/pep.py:208 msgid "postalcode" msgstr "מיקוד דו×ר" -#: ../src/common/pep.py:210 +#: ../src/common/pep.py:209 msgid "region" msgstr "תחו×" -#: ../src/common/pep.py:211 +# PEP +#: ../src/common/pep.py:210 +#: ../src/gajim-remote.py:288 +#, fuzzy msgid "room" -msgstr "חדר" +msgstr "cli" -#: ../src/common/pep.py:212 +#: ../src/common/pep.py:211 msgid "speed" msgstr "מהירות" -#: ../src/common/pep.py:213 +#: ../src/common/pep.py:212 msgid "street" msgstr "רחוב" -#: ../src/common/pep.py:214 +#: ../src/common/pep.py:213 msgid "text" msgstr "תמליל" -#: ../src/common/pep.py:215 +#: ../src/common/pep.py:214 msgid "timestamp" msgstr "חותמת זמן" -#: ../src/common/pep.py:216 +# â€uri +#: ../src/common/pep.py:215 +#: ../src/gajim-remote.py:279 msgid "uri" -msgstr "â€uriâ€" +msgstr "‫uri" -#: ../src/common/pep.py:349 +#: ../src/common/pep.py:357 msgid "Unknown Artist" msgstr "×מן ×œ× ×™×“×•×¢" -#: ../src/common/pep.py:352 +#: ../src/common/pep.py:360 msgid "Unknown Title" msgstr "כותרת ×œ× ×™×“×•×¢×”" -#: ../src/common/pep.py:355 +#: ../src/common/pep.py:363 msgid "Unknown Source" msgstr "מקור ×œ× ×™×“×•×¢" -#: ../src/common/pep.py:358 +#: ../src/common/pep.py:366 #, python-format msgid "" "<b>\"%(title)s\"</b> by <i>%(artist)s</i>\n" "from <i>%(source)s</i>" msgstr "" -"â€<b>\"%(title)s\"</b> מ×ת <i>%(artist)s</i>\n" -"מתוך <i>%(source)s</i>" +"‫<b>\"%(title)s\"</b> מ×ת <i>%(artist)s</i>\n" +"מן ×”××œ×‘×•× <i>%(source)s</i>" # רו××” הודעה ×–×ת #. we're not english -#: ../src/common/stanza_session.py:425 -msgid "" -"[This is part of an encrypted session. If you see this message, something " -"went wrong.]" -msgstr "[זהו חלק מסשן מוצפן. ב×× ×”×™× ×š רו××” ×ת הודעה ×–×ת, משהו השתבש.]" +#: ../src/common/stanza_session.py:424 +msgid "[This is part of an encrypted session. If you see this message, something went wrong.]" +msgstr "[זהו חלק מסשן מוצפן. ב×× ×”×™× ×š רו××” ×ת הודעה זו, משהו השתבש.]" # שגי××” ×צל #: ../src/common/zeroconf/connection_zeroconf.py:193 @@ -7002,7 +7038,7 @@ msgid "" "Link-local messaging might not work properly." msgstr "" "%s\n" -"ייתכן ×›×™ קישוריות ×ž×¡×¨×™× ×ž×§×•×ž×™×ª ×œ× ×ª×¢×‘×•×“ כר×וי." +"ייתכן שקישוריות ×ž×¡×¨×™× ×ž×§×•×ž×™×ª ×œ× ×ª×¢×‘×•×“ כר×וי." #: ../src/common/zeroconf/connection_zeroconf.py:206 msgid "Please check if Avahi or Bonjour is installed." @@ -7011,12 +7047,12 @@ msgstr "×× × ×‘×“×•×§ ×× Avahi ×ו Bonjour מותקן במערכת." #: ../src/common/zeroconf/connection_zeroconf.py:216 #: ../src/common/zeroconf/connection_zeroconf.py:220 msgid "Could not start local service" -msgstr "×œ× ×”×™×ª×” ×פשרות להתחיל שירות מקומי" +msgstr "×œ× × ×™×ª×Ÿ להתחיל שירות מקומי" #: ../src/common/zeroconf/connection_zeroconf.py:217 #, python-format msgid "Unable to bind to port %d." -msgstr "×ין ×פשרות לכרוך ×ל פורט %d." +msgstr "×œ× × ×™×ª×Ÿ לכרוך ×ל פורט %d." #: ../src/common/zeroconf/connection_zeroconf.py:221 #: ../src/common/zeroconf/connection_zeroconf.py:305 @@ -7030,22 +7066,23 @@ msgstr "×× × ×‘×“×•×§ ×× avahi-daemon מורץ כעת." #: ../src/common/zeroconf/connection_zeroconf.py:333 #, python-format msgid "Could not change status of account \"%s\"" -msgstr "×œ× ×”×™×ª×” ×פשרות ×œ×©× ×•×ª ×ת המצב של חשבון \"%s\"" +msgstr "×œ× × ×™×ª×Ÿ ×œ×©× ×•×ª ×ת המצב של חשבון \"%s\"" # הודעתך ×œ× ×™×›×•×œ×” להישלח. -#: ../src/common/zeroconf/connection_zeroconf.py:353 +#: ../src/common/zeroconf/connection_zeroconf.py:352 +#: ../src/common/zeroconf/connection_zeroconf.py:393 msgid "Your message could not be sent." -msgstr "×œ× ×”×™×ª×” ×פשרות לשלוח ×ת הודעתך זו." +msgstr "×œ× × ×™×ª×Ÿ ×”×™×” לשלוח ×ת הודעתך זו." # ×œ× ×ž×—×•×‘×¨ -#: ../src/common/zeroconf/connection_zeroconf.py:367 +#: ../src/common/zeroconf/connection_zeroconf.py:366 +#: ../src/common/zeroconf/connection_zeroconf.py:407 msgid "Contact is offline. Your message could not be sent." -msgstr "×יש קשר ×œ× ×ž×§×•×•×Ÿ. ×œ× ×”×™×ª×” ×פשרות לשלוח ×ת הודעתך זו." +msgstr "×יש קשר ×œ× ×ž×§×•×•×Ÿ. ×œ× × ×™×ª×Ÿ ×”×™×” לשלוח ×ת הודעתך זו." -#: ../src/common/zeroconf/connection_zeroconf.py:394 -msgid "" -"Connection to host could not be established: Timeout while sending data." -msgstr "×œ× ×”×™×ª×” ×פשרות לבסס חיבור ×ל מ×רח: ×ª× ×”×–×ž×Ÿ במהלך שליחת מידע." +#: ../src/common/zeroconf/connection_zeroconf.py:434 +msgid "Connection to host could not be established: Timeout while sending data." +msgstr "×œ× × ×™×ª×Ÿ ×”×™×” לבסס חיבור ×ל מ×רח: ×ª× ×”×–×ž×Ÿ במהלך שליחת מידע." #: ../src/common/zeroconf/zeroconf_avahi.py:192 #: ../src/common/zeroconf/zeroconf_bonjour.py:191 @@ -7053,26 +7090,29 @@ msgstr "×œ× ×”×™×ª×” ×פשרות לבסס חיבור ×ל מ×רח: ×ª× ×”×– msgid "Error while adding service. %s" msgstr "שגי××” במהלך הוספת שירות. %s" -#: ../src/config.py:404 +#: ../src/config.py:409 msgid "Default Message" msgstr "הודעה משתמטת" -#: ../src/config.py:413 +#: ../src/config.py:418 msgid "Enabled" msgstr "מ×ופשר" # משתמט -#: ../src/config.py:468 ../src/config.py:472 ../src/config.py:3185 +#: ../src/config.py:473 +#: ../src/config.py:477 +#: ../src/config.py:3154 msgid "Default" msgstr "ברירת מחדל" -#: ../src/config.py:747 ../src/dialogs.py:1499 +#: ../src/config.py:759 +#: ../src/dialogs.py:1495 #, python-format msgid "Dictionary for lang %s not available" msgstr "מילון עבור שפה %s ×œ× ×–×ž×™×Ÿ" # להפיק תועלת -#: ../src/config.py:748 +#: ../src/config.py:760 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -7081,225 +7121,252 @@ msgstr "" "עליך להתקין מילון %s כדי לעשות שימוש בבדיקת ×יות, ×ו בחרו בשפה ×©×•× ×” על ידי " "הגדרת ×”×פשרות speller_language." -#: ../src/config.py:1226 +#: ../src/config.py:1227 msgid "status message title" msgstr "כותרת הודעת מצב" -#: ../src/config.py:1226 +#: ../src/config.py:1227 msgid "status message text" msgstr "תמליל הודעת מצב" #. Name column -#: ../src/config.py:1553 ../src/dialogs.py:2673 ../src/dialogs.py:2740 -#: ../src/dialogs.py:3535 ../src/disco.py:889 ../src/disco.py:1787 -#: ../src/disco.py:2089 ../src/history_window.py:92 +#: ../src/config.py:1554 +#: ../src/dialogs.py:2574 +#: ../src/dialogs.py:2641 +#: ../src/dialogs.py:3437 +#: ../src/disco.py:885 +#: ../src/disco.py:1743 +#: ../src/disco.py:2045 +#: ../src/history_window.py:91 msgid "Name" msgstr "ש×" -#: ../src/config.py:1656 +# התחבר/×™ מחדש כעת? +#: ../src/config.py:1654 msgid "Relogin now?" -msgstr "להתחבר מחדש כעת?" +msgstr "התחברות מחודשת?" -#: ../src/config.py:1657 +#: ../src/config.py:1655 msgid "If you want all the changes to apply instantly, you must relogin." -msgstr "×× ×‘×¨×¦×•× ×š ×›×™ ×”×©×™× ×•×™×™× ×™×•×—×œ×• ב×ופן מידי, עליך להתחבר מחדש." +msgstr "×× ×‘×¨×¦×•× ×š ×©×”×©×™× ×•×™×™× ×™×•×—×œ×• ב×ופן מידי, עליך להתחבר מחדש." # ×”×¦×¤× ×ª OpenPGP -#: ../src/config.py:1814 ../src/config.py:1949 +#: ../src/config.py:1809 +#: ../src/config.py:1942 msgid "OpenPGP is not usable on this computer" -msgstr "â€OpenPGP ××™× ×” שמישה על מחשב ×–×”" +msgstr "‫OpenGPG ××™× ×” שמישה במחשב ×–×”" -#: ../src/config.py:1990 ../src/config.py:2039 +#: ../src/config.py:1982 +#: ../src/config.py:2029 msgid "Unread events" -msgstr "××™×¨×•×¢×™× ×שר ×œ× × ×§×¨×ו" +msgstr "××™×¨×•×¢×™× ×©×œ× × ×§×¨×ו" -#: ../src/config.py:1991 +#: ../src/config.py:1983 msgid "Read all pending events before removing this account." -msgstr "×§×¨× ×ת כל ×”××™×¨×•×¢×™× ×שר ×ž×ž×ª×™× ×™× ×˜×¨× ×”×¡×¨×ª חשבון ×–×”." +msgstr "קרי×ת כל ×”××™×¨×•×¢×™× ×”×ž×ž×ª×™× ×™× ×œ×¤× ×™ הסרת חשבון ×–×”." -#: ../src/config.py:2021 +#: ../src/config.py:2012 #, python-format msgid "You have opened chat in account %s" msgstr "פתחת שיחה בחשבון %s" -#: ../src/config.py:2022 +#: ../src/config.py:2013 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "כל ×—×œ×•× ×•×ª שיחה ×•×—×œ×•× ×•×ª שיחת קבוצה ייסגרו. ×”×× ×‘×¨×¦×•× ×š להמשיך?" -#: ../src/config.py:2034 ../src/config.py:2596 ../src/config.py:2634 +#: ../src/config.py:2025 +#: ../src/config.py:2570 +#: ../src/config.py:2607 msgid "You are currently connected to the server" -msgstr "×”×™× ×š מחובר כעת ×ל שרת" +msgstr "×”×™× ×š מחובר כעת ×ל השרת" -#: ../src/config.py:2035 +#: ../src/config.py:2026 msgid "To change the account name, you must be disconnected." msgstr "כדי ×œ×©× ×•×ª ×ת ×©× ×”×—×©×‘×•×Ÿ, עליך ×œ×”×ª× ×ª×§." -#: ../src/config.py:2040 +#: ../src/config.py:2030 msgid "To change the account name, you must read all pending events." -msgstr "כדי ×œ×©× ×•×ª ×ת ×©× ×”×—×©×‘×•×Ÿ, עליך ×œ×§×¨×•× ×ת כל ×”××™×¨×•×¢×™× ×שר ×ž×ž×ª×™× ×™×." +msgstr "כדי ×œ×©× ×•×ª ×ת ×©× ×”×—×©×‘×•×Ÿ, עליך ×œ×§×¨×•× ×ת כל ×”××™×¨×•×¢×™× ×”×ž×ž×ª×™× ×™×." -#: ../src/config.py:2046 +#: ../src/config.py:2036 msgid "Account Name Already Used" msgstr "×©× ×—×©×‘×•×Ÿ כבר מצוי בשימוש" -#: ../src/config.py:2047 -msgid "" -"This name is already used by another of your accounts. Please choose another " -"name." -msgstr "×©× ×–×” כבר מצוי בשימוש על ידי חשבון ×חר ×ž×—×©×‘×•× ×•×ª×™×š. ×× × ×‘×—×¨ ×©× ×חר." +#: ../src/config.py:2037 +msgid "This name is already used by another of your accounts. Please choose another name." +msgstr "×©× ×–×” כבר מצוי בשימוש על ידי חשבון ×חר ×ž×—×©×‘×•× ×•×ª×™×š. × × ×œ×‘×—×•×¨ ×©× ×חר." -#: ../src/config.py:2051 ../src/config.py:2056 +#: ../src/config.py:2041 +#: ../src/config.py:2045 msgid "Invalid account name" msgstr "×©× ×—×©×‘×•×Ÿ שגוי" -#: ../src/config.py:2052 +#: ../src/config.py:2042 msgid "Account name cannot be empty." msgstr "×©× ×—×©×‘×•×Ÿ ×œ× ×™×›×•×œ להיות ריק." -#: ../src/config.py:2057 +#: ../src/config.py:2046 msgid "Account name cannot contain spaces." msgstr "×©× ×—×©×‘×•×Ÿ ×œ× ×™×›×•×œ להכיל רווחי×." -#: ../src/config.py:2138 +#: ../src/config.py:2123 msgid "Rename Account" msgstr "×©× ×” ×©× ×—×©×‘×•×Ÿ" -#: ../src/config.py:2139 +#: ../src/config.py:2124 #, python-format msgid "Enter a new name for account %s" msgstr "הזן ×©× ×—×“×© עבור חשבון %s" -#: ../src/config.py:2168 +# username@servername +# user@server +#: ../src/config.py:2152 msgid "A Jabber ID must be in the form \"user@servername\"." -msgstr "על מזהה Jabber להיות בצורה הזו \"user@servername\"." +msgstr "כתובת JID מוכרחה להיות בצורה של \"user@servername\"." -#: ../src/config.py:2394 ../src/config.py:3726 +#: ../src/config.py:2375 +#: ../src/config.py:3708 msgid "Invalid entry" msgstr "רשומה שגויה" -#: ../src/config.py:2395 ../src/config.py:3727 +# צריכה +# על הפתחה המות×מת להיות +#: ../src/config.py:2376 +#: ../src/config.py:3709 msgid "Custom port must be a port number." msgstr "פורט מות×× ×ž×•×›×¨×— להיות מספר פורט." -#: ../src/config.py:2417 +#: ../src/config.py:2397 msgid "Failed to get secret keys" msgstr "כשל בקבלת מפתחות סודיי×" -#: ../src/config.py:2418 +# Would it be ok to write: "There is no secret OpenPGP key available." ? +# ×œ× ×§×™×™× ×ž×¤×ª×— OpenPGP סודי. +# ×œ× ×§×™×™× ×ž×¤×ª×— סודי של OpenPGP זמין. +#: ../src/config.py:2398 msgid "There is no OpenPGP secret key available." msgstr "×œ× ×§×™×™× ×ž×¤×ª×— OpenPGP סודי זמין." -#: ../src/config.py:2456 +#: ../src/config.py:2432 msgid "OpenPGP Key Selection" msgstr "בחירת מפתח ‫OpenPGP" -#: ../src/config.py:2457 +# Would it be ok to write: an OpenPGP +# × × ×œ×‘×—×•×¨ ×ת מפתח ×”Ö¾OpenPGP שלך +#: ../src/config.py:2433 msgid "Choose your OpenPGP key" msgstr "בחר מפתח OpenPGP" -#: ../src/config.py:2465 +#: ../src/config.py:2441 msgid "No such account available" msgstr "×œ× ×§×™×™× ×—×©×‘×•×Ÿ ×›×–×”" # עוד ×‘×˜×¨× -#: ../src/config.py:2466 +#: ../src/config.py:2442 msgid "You must create your account before editing your personal information." -msgstr "עליך ליצור חשבון ×˜×¨× ×¢×¨×™×›×ª המידע ×”×ישי שלך." - -#: ../src/config.py:2473 ../src/dialogs.py:2369 ../src/dialogs.py:2662 -#: ../src/dialogs.py:2850 ../src/disco.py:516 ../src/profile_window.py:371 +msgstr "עליך ליצור חשבון ×œ×¤× ×™ עריכת המידע ×”×ישי שלך." + +#: ../src/config.py:2449 +#: ../src/dialogs.py:2325 +#: ../src/dialogs.py:2563 +#: ../src/dialogs.py:2751 +#: ../src/disco.py:515 +#: ../src/profile_window.py:369 msgid "You are not connected to the server" msgstr "××™× ×š מחובר ×ל השרת" -#: ../src/config.py:2474 +#: ../src/config.py:2450 msgid "Without a connection, you can not edit your personal information." -msgstr "×œ×œ× ×—×™×‘×•×¨, ×ין ב×פשרותך לערוך ×ת המידע ×”×ישי שלך." +msgstr "×œ×œ× ×—×™×‘×•×¨, ×ין ביכולתך לערוך ×ת המידע ×”×ישי שלך." -#: ../src/config.py:2479 -msgid "Your server doesn't support vCard" -msgstr "שרתך ××™× ×• תומך בטופס vCard" +# Vcard form +#: ../src/config.py:2454 +msgid "Your server doesn't support Vcard" +msgstr "שרתך ××™× ×• תומך ×‘×ª×‘× ×™×ª Vcard" -#: ../src/config.py:2480 +#: ../src/config.py:2455 msgid "Your server can't save your personal information." msgstr "שרתך ×œ× ×™×›×•×œ לשמור ×ת המידע ×”×ישי שלך." -#: ../src/config.py:2597 ../src/config.py:2635 +#: ../src/config.py:2571 +#: ../src/config.py:2608 msgid "To disable the account, you must be disconnected." msgstr "כדי ×œ× ×˜×¨×œ ×ת החשבון, עליך ×œ×”×ª× ×ª×§." -#: ../src/config.py:2604 +#: ../src/config.py:2577 msgid "Account Local already exists." msgstr "חשבון Local כבר קיי×." -#: ../src/config.py:2605 +#: ../src/config.py:2578 msgid "Please rename or remove it before enabling link-local messaging." msgstr "×× × ×©× ×” ×ת שמו ×ו הסר ×ותו ×‘×˜×¨× ×פשור קישוריות ×ž×¡×¨×™× ×ž×§×•×ž×™×ª." -#: ../src/config.py:2766 +#: ../src/config.py:2735 #, python-format msgid "Edit %s" msgstr "ערוך ‫%s" # ×¨×™×©×•× -#: ../src/config.py:2768 +#: ../src/config.py:2737 #, python-format msgid "Register to %s" msgstr "×”×™×¨×©× ×ל ‫%s" #. list at the beginning -#: ../src/config.py:2804 +#: ../src/config.py:2773 msgid "Ban List" -msgstr "רשימת ×סירה" +msgstr "רשימת חסימה" -#: ../src/config.py:2805 +#: ../src/config.py:2774 msgid "Member List" msgstr "רשימת חברי×" -#: ../src/config.py:2805 +#: ../src/config.py:2774 msgid "Owner List" msgstr "רשימת בעלי×" -#: ../src/config.py:2806 +#: ../src/config.py:2775 msgid "Administrator List" msgstr "רשימת ×ž× ×”×œ×™×" #. Address column #. holds JID (who said this) -#: ../src/config.py:2870 ../src/disco.py:896 ../src/history_manager.py:217 +#: ../src/config.py:2839 +#: ../src/disco.py:892 +#: ../src/history_manager.py:207 msgid "JID" -msgstr "â€JID" +msgstr "‫JID" -#: ../src/config.py:2880 +#: ../src/config.py:2849 msgid "Reason" msgstr "סיבה" -#: ../src/config.py:2887 +#: ../src/config.py:2856 msgid "Nick" msgstr "×›×™× ×•×™" -#: ../src/config.py:2893 +#: ../src/config.py:2862 msgid "Role" msgstr "תפקיד" -#: ../src/config.py:2920 +#: ../src/config.py:2889 msgid "Banning..." -msgstr "×וסר כעת..." +msgstr "חוס×..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2922 +#: ../src/config.py:2891 msgid "" "<b>Whom do you want to ban?</b>\n" "\n" msgstr "" -"<b>×ת מי ×‘×¨×¦×•× ×š ל×סור?</b>\n" +"<b>×ת מי ×‘×¨×¦×•× ×š לחסו×?</b>\n" "\n" -# מוסיף כעת חבר... -#: ../src/config.py:2924 +#: ../src/config.py:2893 msgid "Adding Member..." msgstr "הוספת חבר..." -#: ../src/config.py:2925 +#: ../src/config.py:2894 msgid "" "<b>Whom do you want to make a member?</b>\n" "\n" @@ -7307,12 +7374,11 @@ msgstr "" "<b>×ת מי ×‘×¨×¦×•× ×š להפוך ×ל חבר?</b>\n" "\n" -# מוסיף כעת בעלי×... -#: ../src/config.py:2927 +#: ../src/config.py:2896 msgid "Adding Owner..." msgstr "הוספת בעלי×..." -#: ../src/config.py:2928 +#: ../src/config.py:2897 msgid "" "<b>Whom do you want to make an owner?</b>\n" "\n" @@ -7320,12 +7386,11 @@ msgstr "" "<b>×ת מי ×‘×¨×¦×•× ×š להפוך ×ל בעלי×?</b>\n" "\n" -# מוסיף כעת ×ž× ×”×œ... -#: ../src/config.py:2930 +#: ../src/config.py:2899 msgid "Adding Administrator..." msgstr "הוספת ×ž× ×”×œ..." -#: ../src/config.py:2931 +#: ../src/config.py:2900 msgid "" "<b>Whom do you want to make an administrator?</b>\n" "\n" @@ -7338,7 +7403,7 @@ msgstr "" # â€â€user = משתמש\n # â€â€resource = מש×ב\n # -#: ../src/config.py:2932 +#: ../src/config.py:2901 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" @@ -7347,151 +7412,160 @@ msgid "" "4. domain (the domain itself matches, as does any user@domain,\n" "domain/resource, or address containing a subdomain)." msgstr "" -"הקלט יכול להיות ×חד מתוך הב××™×:\n" +"הקלט יכול להיות ×חד מן הב××™×:\n" "1. â€user@domain/resource (רק מש×ב ×–×” תו××).\n" "2. â€user@domain (כל מש×ב תו××).\n" "3. â€domain/resource (רק מש×ב ×–×” תו××).\n" "4. â€domain (×”×ž×ª×—× ×¢×¦×ž×• מת××™×, עבור כל user@domain,\n" -"â€domain/resource, ×ו כתובת ×שר ×ž×›×™×œ×™× ×ž×ª×—× ×ž×©× ×™)." +"â€domain/resource, ×ו כתובת המכילה מתח×Ö¾×ž×©× ×™)." -#: ../src/config.py:3033 +#: ../src/config.py:3002 #, python-format msgid "Removing %s account" msgstr "הסרת חשבון ‫%s" -#: ../src/config.py:3048 +# × ×•×˜×¨×œ +#: ../src/config.py:3017 msgid "Account is disabled" msgstr "חשבון ×ž× ×•×˜×¨×œ" -#: ../src/config.py:3049 +#: ../src/config.py:3018 msgid "To unregister from a server, account must be enabled." -msgstr "כדי לבטל ×¨×™×©×•× ×ž×ª×•×š שרת, על חשבון × ×ª×•×Ÿ להיות מ×ופשר." +msgstr "כדי לבטל ×¨×™×©×•× ×ž×Ÿ שרת, על חשבון × ×ª×•×Ÿ להיות מ×ופשר." -#: ../src/config.py:3062 ../src/gui_interface.py:286 -#: ../src/gui_interface.py:734 +#: ../src/config.py:3031 +#: ../src/gui_interface.py:285 +#: ../src/gui_interface.py:732 msgid "Password Required" -msgstr "× ×“×¨×©×ª מילת מעבר" +msgstr "× ×“×¨×©×ª מילת־מעבר" -#: ../src/config.py:3063 ../src/gui_interface.py:714 +#: ../src/config.py:3032 +#: ../src/gui_interface.py:712 #, python-format msgid "Enter your password for account %s" msgstr "הזן ×ת סיסמתך עבור חשבון %s" -#: ../src/config.py:3064 ../src/gui_interface.py:734 +# שמירת +#: ../src/config.py:3033 +#: ../src/gui_interface.py:732 msgid "Save password" msgstr "שמור סיסמה" -#: ../src/config.py:3074 +#: ../src/config.py:3043 #, python-format msgid "Account \"%s\" is connected to the server" -msgstr "חשבון \"%s\" מחובר כעת ×ל שרת" +msgstr "חשבון \"%s\" מחובר כעת ×ל השרת" # it = account? # תסיר/×™ ×ותו -#: ../src/config.py:3075 +#: ../src/config.py:3044 msgid "If you remove it, the connection will be lost." msgstr "×× ×ª×¡×™×¨×•, החיבור ×™×בד." -#: ../src/config.py:3089 +#: ../src/config.py:3058 #, python-format msgid "Connection to server %s failed" msgstr "התחברות ×ל שרת %s × ×›×©×œ×”" -#: ../src/config.py:3090 +#: ../src/config.py:3059 msgid "What would you like to do?" msgstr "מה ×‘×¨×¦×•× ×š לעשות?" # ×ž×”×™×™×©×•× -#: ../src/config.py:3091 +#: ../src/config.py:3060 msgid "Remove only from Gajim" -msgstr "הסרה מתוך Gajim בלבד" +msgstr "הסרה מן Gajim בלבד" # ×חר כך -#: ../src/config.py:3092 +#: ../src/config.py:3061 msgid "Don't remove anything. I'll try again later" msgstr "×œ× ×œ×”×¡×™×¨ דבר. ×× ×™ ×× ×¡×” שוב מ×וחר יותר" -#: ../src/config.py:3185 +#: ../src/config.py:3154 msgid "?print_status:All" msgstr "הכל" -#: ../src/config.py:3186 +#: ../src/config.py:3155 msgid "Enter and leave only" msgstr "×›× ×™×¡×” ועזיבה בלבד" -#: ../src/config.py:3187 +#: ../src/config.py:3156 msgid "?print_status:None" msgstr "×ל תדפיס" -#: ../src/config.py:3246 +#: ../src/config.py:3228 msgid "New Group Chat" msgstr "שיחת קבוצה חדשה" -#: ../src/config.py:3279 +# ×œ×¡×™×ž× ×™×™×” זו יש מידע שגוי +#: ../src/config.py:3261 msgid "This bookmark has invalid data" msgstr "×¡×™×ž× ×™×™×” זו מכילה מידע שגוי" -#: ../src/config.py:3280 -msgid "" -"Please be sure to fill out server and room fields or remove this bookmark." -msgstr "×× × ×“××’ ×œ×ž×œ× ×©×“×•×ª חדר ושרת ×ו הסר ×ת ×¡×™×ž× ×™×™×” זו." +#: ../src/config.py:3262 +msgid "Please be sure to fill out server and room fields or remove this bookmark." +msgstr "× × ×œ×•×•×“× ×œ×ž×œ× ×©×“×•×ª חדר ושרת ×ו להסיר ×ת ×¡×™×ž× ×™×™×” זו." -#: ../src/config.py:3406 ../src/config.py:3417 ../src/config.py:3426 -#: ../src/config.py:3437 ../src/config.py:3445 +# מותר +#: ../src/config.py:3388 +#: ../src/config.py:3399 +#: ../src/config.py:3408 +#: ../src/config.py:3419 +#: ../src/config.py:3427 msgid "Character not allowed" msgstr "תו ×œ× ×ž×•×¨×©×”" -#: ../src/config.py:3417 ../src/config.py:3425 ../src/config.py:3437 -#: ../src/config.py:3702 +#: ../src/config.py:3399 +#: ../src/config.py:3407 +#: ../src/config.py:3419 +#: ../src/config.py:3684 msgid "Invalid server" msgstr "שרת שגוי" -#: ../src/config.py:3444 +#: ../src/config.py:3426 msgid "Invalid room" msgstr "חדר שגוי" -#: ../src/config.py:3614 +#: ../src/config.py:3596 msgid "Account has been added successfully" msgstr "חשבון הוסף בהצלחה" # מ×וחר יותר -#: ../src/config.py:3615 ../src/config.py:3621 -msgid "" -"You can set advanced account options by pressing the Advanced button, or " -"later by choosing the Accounts menu item under the Edit menu from the main " -"window." -msgstr "" -"ב×פשרותך להגדיר ×פשרויות חשבון מתקדמות על ידי לחיצה על הלחצן מתקד×, ×ו ל×חר " -"מכן בבוחרך בתפריט ×—×©×‘×•× ×•×ª תחת התפריט עריכה מתוך החלון הר×שי." +#: ../src/config.py:3597 +#: ../src/config.py:3603 +msgid "You can set advanced account options by pressing the Advanced button, or later by choosing the Accounts menu item under the Edit menu from the main window." +msgstr "ביכולתך להגדיר ×פשרויות חשבון מתקדמות על ידי לחיצה על הכפתור מתקד×, ×ו ל×חר מכן בבוחרך בתפריט ×—×©×‘×•× ×•×ª תחת התפריט עריכה מן החלון הר×שי." -#: ../src/config.py:3620 +#: ../src/config.py:3602 msgid "Your new account has been created successfully" msgstr "×—×©×‘×•× ×š החדש × ×•×¦×¨ בהצלחה" -#: ../src/config.py:3659 +#: ../src/config.py:3641 msgid "Invalid username" msgstr "×©× ×ž×©×ª×ž×© שגוי" -#: ../src/config.py:3661 +#: ../src/config.py:3643 msgid "You must provide a username to configure this account." msgstr "עליך לספק ×©× ×ž×©×ª×ž×© כדי להגדיר ×ת חשבון ×–×”." -#: ../src/config.py:3703 +#: ../src/config.py:3685 msgid "Please provide a server on which you want to register." msgstr "×× × ×¡×¤×§ שרת ×ליו ×‘×¨×¦×•× ×š להירש×." # BUG: גודל ×ותיות ב×× ×’×œ×™×ª? -#: ../src/config.py:3759 ../src/gui_interface.py:1313 +#: ../src/config.py:3741 +#: ../src/gui_interface.py:1303 msgid "Certificate Already in File" msgstr "התעודה כבר מצויה בקובץ" # חריג לכלל: עשיתי שימוש במילה ×©× ×™×ª ×‘×ž×§×•× ×©×•×‘ מכיוון שתמיד ×™×”×™×” 'ר×שון' ול×חריו ×©× ×™ -#: ../src/config.py:3760 ../src/gui_interface.py:1314 +#: ../src/config.py:3742 +#: ../src/gui_interface.py:1304 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "תעודה זו כבר מצויה בקובץ %s, ולכן ×”×™× ×œ× ×ª×•×¡×£ ×‘×©× ×™×ª." -#: ../src/config.py:3850 +#: ../src/config.py:3830 #, python-format msgid "" "<b>Security Warning</b>\n" @@ -7503,10 +7577,11 @@ msgstr "" "<b>×זהרת ×בטחה</b>\n" "\n" "×ž×”×™×ž× ×•×ª×” של תעודת SSL של %(hostname)s עלולה להיות רעועה.\n" -"שגי×ת SSL: â€%(error)s\n" +"שגי×ת SSL: ‫%(error)s\n" "×”×× ×¢×“×™×™×Ÿ יש ×‘×¨×¦×•× ×š להתחבר ×ל שרת ×–×”?" -#: ../src/config.py:3856 ../src/gui_interface.py:1342 +#: ../src/config.py:3836 +#: ../src/gui_interface.py:1332 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" @@ -7517,90 +7592,85 @@ msgstr "" "טביעת ×צבע SHA1 של התעודה:\n" "%s" -#: ../src/config.py:3888 ../src/config.py:3922 +# בעת מהלך +#: ../src/config.py:3868 +#: ../src/config.py:3902 msgid "An error occurred during account creation" -msgstr "×ירעה שגי××” בעת מהלך יצירת חשבון" +msgstr "×רעה שגי××” בעת יצירת חשבון" -#: ../src/config.py:3987 +#: ../src/config.py:3967 msgid "Account name is in use" -msgstr "×©× ×—×©×‘×•×Ÿ ×”×™× ×• בשימוש" +msgstr "×©× ×—×©×‘×•×Ÿ בשימוש" -#: ../src/config.py:3988 +#: ../src/config.py:3968 msgid "You already have an account using this name." -msgstr "כבר יש ברשותך חשבון ×שר עושה שימוש ×‘×©× ×–×”." +msgstr "כבר יש ברשותך חשבון שעושה שימוש ×‘×©× ×–×”." -#: ../src/config.py:4118 +#: ../src/config.py:4098 msgid "PEP node was not removed" msgstr "ממסר PEP ×œ× ×”×•×¡×¨" -#: ../src/config.py:4119 +#: ../src/config.py:4099 #, python-format msgid "PEP node %(node)s was not removed: %(message)s" -msgstr "ממסר PEP â€%(node)s ×œ× ×”×•×¡×¨: %(message)s" +msgstr "ממסר PEP ‫%(node)s ×œ× ×”×•×¡×¨: %(message)s" -#: ../src/config.py:4147 +#: ../src/config.py:4127 #, python-format msgid "Configure %s" msgstr "תצורת ‫%s" -#: ../src/config.py:4163 ../src/plugins/gui.py:92 +#: ../src/config.py:4143 +#: ../src/plugins/gui.py:88 msgid "Active" msgstr "פעיל" -#: ../src/config.py:4171 +#: ../src/config.py:4151 msgid "Event" msgstr "×ירוע" -#: ../src/config.py:4205 +#: ../src/config.py:4185 msgid "Attention Message Received" msgstr "התקבלה הודעת הקשב" -#: ../src/config.py:4206 +#: ../src/config.py:4186 msgid "First Message Received" -msgstr "הודעה ר××©×•× ×” ×שר התקבלה" +msgstr "הודעה ר××©×•× ×” שהתקבלה" -#: ../src/config.py:4207 +#: ../src/config.py:4187 msgid "Next Message Received Focused" -msgstr "הודעה הב××” ×שר התקבלה (ממוקד)" +msgstr "הודעה הב××” שהתקבלה (ממוקד)" -#: ../src/config.py:4209 +#: ../src/config.py:4189 msgid "Next Message Received Unfocused" -msgstr "הודעה הב××” ×שר התקבלה (×œ× ×ž×ž×•×§×“)" +msgstr "הודעה הב××” שהתקבלה (×œ× ×ž×ž×•×§×“)" -#: ../src/config.py:4210 +#: ../src/config.py:4190 msgid "Contact Connected" msgstr "×יש קשר מחובר" -#: ../src/config.py:4211 +#: ../src/config.py:4191 msgid "Contact Disconnected" msgstr "×יש קשר ×ž× ×•×ª×§" -#: ../src/config.py:4212 +#: ../src/config.py:4192 msgid "Message Sent" msgstr "הודעה × ×©×œ×—×”" -#: ../src/config.py:4213 +#: ../src/config.py:4193 msgid "Group Chat Message Highlight" msgstr "הודעת שיחת קבוצה מודגשת" -#: ../src/config.py:4214 +#: ../src/config.py:4194 msgid "Group Chat Message Received" -msgstr "הודעת שיחת קבוצה ×שר התקבלה" +msgstr "הודעת שיחת קבוצה שהתקבלה" -#: ../src/config.py:4215 +#: ../src/config.py:4195 msgid "GMail Email Received" -msgstr "דו×״ל GMail ×שר התקבל" - -#: ../src/conversation_textview.py:483 ../src/conversation_textview.py:501 -#, python-format -msgid "" -"<b>Message was corrected. Last message was:</b>\n" -" %s" -msgstr "" -"<b>הודעה ×ª×•×§× ×”. הודעה ××—×¨×•× ×” היתה:</b>\n" -" %s" +msgstr "דו×״ל GMail שהתקבל" -#: ../src/conversation_textview.py:654 +# סביר ש +#: ../src/conversation_textview.py:602 msgid "" "This icon indicates that this message has not yet\n" "been received by the remote end. If this icon stays\n" @@ -7608,54 +7678,56 @@ msgid "" msgstr "" "צלמית זו מצביע על כך שהודעה זו עדיין ל×\n" "התקבלה על ידי הקצה המרוחק. ×× ×¦×œ×ž×™×ª זו\n" -"× ×•×ª×¨×ª למשך זמן ממושך, סביר ×›×™ ההודעה ×בדה." +"× ×©×רת לזמן ממושך, ×›× ×¨××” שההודעה ×בדה." -#: ../src/conversation_textview.py:673 +#: ../src/conversation_textview.py:621 msgid "" "Text below this line is what has been said since the\n" "last time you paid attention to this group chat" msgstr "" -"תמליל תחת שורה זו ×”×•× ×“×‘×¨×™× ×שר × ×¨×©×ž×• מ××– הפע×\n" -"×”××—×¨×•× ×” בה הסבת ×ת צומת לבך ×ל שיחת קבוצה זו" +"תמליל תחת שורה זו ×”×™× ×• מה ×©× ×מר מ××–\n" +"×”×¤×¢× ×”××—×¨×•× ×” שהקשבת לשיחת קבוצה זו" -#: ../src/conversation_textview.py:793 +#: ../src/conversation_textview.py:741 msgid "_Quote" -msgstr "_צטט" +msgstr "_ציטוט" -#: ../src/conversation_textview.py:800 +#: ../src/conversation_textview.py:748 #, python-format msgid "_Actions for \"%s\"" -msgstr "_פעולות עבור \"%s\"" +msgstr "_פעולות עבור ‫‫\"%s\"" -#: ../src/conversation_textview.py:813 +# עיון בערך ×צל/ב×תר +#: ../src/conversation_textview.py:761 msgid "Read _Wikipedia Article" -msgstr "עיין ערך _ויקיפדיה" +msgstr "עיון בערך ב_ויקיפדיה" -#: ../src/conversation_textview.py:818 +#: ../src/conversation_textview.py:766 msgid "Look it up in _Dictionary" -msgstr "חפש בתוך _מילון" +msgstr "חיפוש ב_מילון" -#: ../src/conversation_textview.py:835 +#: ../src/conversation_textview.py:783 #, 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:848 +#: ../src/conversation_textview.py:796 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "לכתובת URL של חיפוש ברשת חסר \"%s\"" -#: ../src/conversation_textview.py:851 +#: ../src/conversation_textview.py:799 msgid "Web _Search for it" msgstr "_חפש ברשת" -#: ../src/conversation_textview.py:857 +#: ../src/conversation_textview.py:805 msgid "Open as _Link" -msgstr "פתח בתור _קישור" +msgstr "פתיחה ×›_קישור" +# ×œ×¤× ×™ %i ×™×ž×™× #. %i is day in year (1-365) -#: ../src/conversation_textview.py:1386 +#: ../src/conversation_textview.py:1302 #, python-format msgid "Yesterday" msgid_plural "%(nb_days)i days ago" @@ -7663,14 +7735,15 @@ msgstr[0] "×תמול" msgstr[1] "×œ×¤× ×™ %(nb_days)i ימי×" #. if we have subject, show it too! -#: ../src/conversation_textview.py:1436 ../src/history_window.py:488 +#: ../src/conversation_textview.py:1351 +#: ../src/history_window.py:481 #, python-format msgid "Subject: %s\n" msgstr "× ×•×©×: %s\n" #: ../src/dataforms_widget.py:575 msgid "Unable to load image" -msgstr "×ין ×פשרות לטעון ×ª×ž×•× ×”" +msgstr "×œ× × ×™×ª×Ÿ לטעון ×ª×ž×•× ×”" #: ../src/dataforms_widget.py:577 #, python-format @@ -7679,171 +7752,176 @@ msgstr "טיפוס מדיה ×œ× × ×ª×ž×š: %s" #: ../src/dataforms_widget.py:592 msgid "This field is required" -msgstr "שדה ×–×” ×”×™× ×• × ×“×¨×©" +msgstr "שדה ×–×” × ×“×¨×©" #: ../src/dataforms_widget.py:637 msgid "Jabber ID already in list" -msgstr "מזהה Jabber כבר מצוי בתוך הרשימה" +msgstr "כתובת JID כבר מצויה ברשימה" #: ../src/dataforms_widget.py:638 msgid "The Jabber ID you entered is already in the list. Choose another one." -msgstr "מזהה Jabber ×שר ×”×–× ×ª כבר מצוי בתוך הרשימה. בחר מזהה ×חר." +msgstr "הכתובת (JID) ×©×”×–× ×ª כבר מצויה ברשימה. × × ×œ×‘×—×•×¨ כתובת ×חרת." #. Default jid #: ../src/dataforms_widget.py:649 msgid "new@jabber.id" -msgstr "" +msgstr "new@jabber.id" #: ../src/dataforms_widget.py:652 ../src/dataforms_widget.py:654 #, python-format msgid "new%d@jabber.id" -msgstr "" +msgstr "new%d@jabber.id" -#: ../src/dialogs.py:84 +#: ../src/dialogs.py:82 #, python-format msgid "Contact name: <i>%s</i>" msgstr "×©× ×יש קשר: <i>%s</i>" -#: ../src/dialogs.py:86 +#: ../src/dialogs.py:84 #, python-format msgid "Jabber ID: <i>%s</i>" -msgstr "מזהה Jabber: â€<i>%s</i>" +msgstr "‫JID: ‫<i>%s</i>" -#: ../src/dialogs.py:200 +#: ../src/dialogs.py:198 msgid "Group" msgstr "קבוצה" -#: ../src/dialogs.py:207 +#: ../src/dialogs.py:205 msgid "In the group" msgstr "בקבוצה" -#: ../src/dialogs.py:299 +#: ../src/dialogs.py:297 msgid "KeyID" -msgstr "מזהה מפתח" +msgstr "מפתח (KeyID)" -#: ../src/dialogs.py:304 +#: ../src/dialogs.py:302 msgid "Contact name" msgstr "×©× ×יש קשר" -#: ../src/dialogs.py:479 +#: ../src/dialogs.py:477 msgid "Set Mood" msgstr "קביעת מצב רוח" -#: ../src/dialogs.py:599 +#: ../src/dialogs.py:597 #, python-format msgid "%s Status Message" msgstr "‫%s הודעת מצב" -#: ../src/dialogs.py:613 +#: ../src/dialogs.py:611 msgid "Status Message" msgstr "הודעת מצב" -#: ../src/dialogs.py:804 +# Changed "overwrite" with "delete" +# Changed "delete" with "replace" +#: ../src/dialogs.py:802 msgid "Overwrite Status Message?" msgstr "החלף הודעת מצב?" -#: ../src/dialogs.py:805 -msgid "" -"This name is already used. Do you want to overwrite this status message?" +# Change to: This name is already used. Do you want to delete the existed status message? +#: ../src/dialogs.py:803 +msgid "This name is already used. Do you want to overwrite this status message?" msgstr "×©× ×–×” כבר מצוי בשימוש. ×”×× ×‘×¨×¦×•× ×š להחליף ×ת הודעת המצב הקיימת?" -#: ../src/dialogs.py:813 +#: ../src/dialogs.py:811 msgid "Save as Preset Status Message" -msgstr "שמור בתור הודעת מצב מות×מת" +msgstr "שמירה כהודעת מצב ערוכה מר×ש" -#: ../src/dialogs.py:814 +#: ../src/dialogs.py:812 msgid "Please type a name for this status message" msgstr "×× × ×”×§×œ×“ ×©× ×¢×‘×•×¨ הודעת מצב זו" -#: ../src/dialogs.py:842 +#: ../src/dialogs.py:840 msgid "AIM Address:" msgstr "כתובת AIM:" -#: ../src/dialogs.py:843 +#: ../src/dialogs.py:841 msgid "GG Number:" msgstr "מספר GG:" -#: ../src/dialogs.py:844 +#: ../src/dialogs.py:842 msgid "ICQ Number:" msgstr "מספר ICQ:" -#: ../src/dialogs.py:845 +#: ../src/dialogs.py:843 msgid "MSN Address:" msgstr "כתובת MSN:" -#: ../src/dialogs.py:846 +#: ../src/dialogs.py:844 msgid "Yahoo! Address:" msgstr "כתובת !Yahoo:" -#: ../src/dialogs.py:883 +#: ../src/dialogs.py:881 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" -msgstr "×× × ×ž×œ× ×ת המידע של ×יש הקשר ×שר ×‘×¨×¦×•× ×š להוסיף בחשבון %s" +msgstr "× × ×œ×”×–×™×Ÿ ×ת המידע של ×יש הקשר ×©×‘×¨×¦×•× ×š להוסיף בחשבון %s" -#: ../src/dialogs.py:886 +#: ../src/dialogs.py:884 msgid "Please fill in the data of the contact you want to add" -msgstr "×× × ×ž×œ× ×ת המידע של ×יש הקשר ×שר ×‘×¨×¦×•× ×š להוסיף" +msgstr "× × ×œ×”×–×™×Ÿ ×ת המידע של ×יש הקשר ×©×‘×¨×¦×•× ×š להוסיף" -#: ../src/dialogs.py:1080 ../src/dialogs.py:1086 ../src/dialogs.py:1091 -#: ../src/dialogs.py:3770 +#: ../src/dialogs.py:1076 +#: ../src/dialogs.py:1082 +#: ../src/dialogs.py:1087 +#: ../src/dialogs.py:3672 msgid "Invalid User ID" -msgstr "מזהה משתמש שגוי" +msgstr "‫ID משתמש שגויה" # ×סור להכיל # ×סור ש # מוכרחה ×©×œ× -#: ../src/dialogs.py:1087 +#: ../src/dialogs.py:1083 msgid "The user ID must not contain a resource." -msgstr "מזהה משתמש ×œ× ×™×›×•×œ להכיל מש×ב." +msgstr "‫ID משתמש ×œ× ×™×›×•×œ×” להכיל מש×ב." -#: ../src/dialogs.py:1092 +#: ../src/dialogs.py:1088 msgid "You cannot add yourself to your roster." -msgstr "×ין ב×פשרותך להוסיף ×ת עצמך ×ל הרשימה שלך." +msgstr "×ין ב×פשרותך להוסיף ×ת עצמך ×ל רשימתך." -#: ../src/dialogs.py:1106 +#: ../src/dialogs.py:1102 msgid "Contact already in roster" msgstr "×יש קשר כבר מצוי ברשימה" -#: ../src/dialogs.py:1107 +#: ../src/dialogs.py:1103 msgid "This contact is already listed in your roster." -msgstr "×יש קשר ×–×” כבר מצוי ברשימה שלך." +msgstr "×יש קשר ×–×” כבר מצוי ברשימתך." -#: ../src/dialogs.py:1160 ../src/dialogs.py:1194 +#: ../src/dialogs.py:1156 +#: ../src/dialogs.py:1190 msgid "User ID:" -msgstr "מזהה משתמש:" +msgstr "‫ID משתמש:" -#: ../src/dialogs.py:1279 +#: ../src/dialogs.py:1275 msgid "A GTK+ Jabber/XMPP client" -msgstr "לקוח Jabber/XMPP מבוסס GTK+‎" +msgstr "" -#: ../src/dialogs.py:1280 +#: ../src/dialogs.py:1276 msgid "GTK+ Version:" msgstr "" -#: ../src/dialogs.py:1281 +#: ../src/dialogs.py:1277 msgid "PyGTK Version:" msgstr "" -#: ../src/dialogs.py:1291 +#: ../src/dialogs.py:1287 msgid "Current Developers:" msgstr "×ž×¤×ª×—×™× × ×•×›×—×™×™×:" -#: ../src/dialogs.py:1293 +#: ../src/dialogs.py:1289 msgid "Past Developers:" msgstr "×ž×¤×ª×—×™× ×ž×Ÿ העבר:" -#: ../src/dialogs.py:1299 +#: ../src/dialogs.py:1295 msgid "THANKS:" msgstr "תודות:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:1305 +#: ../src/dialogs.py:1301 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 <someone@somewhere> -#: ../src/dialogs.py:1317 +#: ../src/dialogs.py:1313 msgid "translator-credits" msgstr "" "Lead Translator:\n" @@ -7856,7 +7934,7 @@ msgstr "" "Rahut Contributors:\n" " Isratine Citizen (genghiskhan AT gmx.ca)" -#: ../src/dialogs.py:1500 +#: ../src/dialogs.py:1496 #, python-format msgid "" "You have to install %s dictionary to use spellchecking, or choose another " @@ -7867,495 +7945,475 @@ msgstr "" "עליך להתקין מילון %s כדי לעשות שימוש בבדיקת ×יות, ×ו בחרו בשפה ×©×•× ×” על ידי " "הגדרת ×”×פשרות speller_language.\n" "\n" -"הדגשת ×ž×™×œ×™× ×שר ×œ× ×ויתו כר×וי ×œ× ×ª× ×•×¦×œ" - -#: ../src/dialogs.py:1845 ../src/gui_interface.py:1446 -#: ../src/gui_interface.py:1488 -msgid "Insecure connection" -msgstr "חיבור ×œ× ×ž×ובטח" - -# BUG: to the server > to a serverr > to server -# Added: will be exchanged with the other end will not be encrypted -# ×”×™× ×š על סף התחברות ×ל שרת ×¢× ×—×™×‘×•×¨ ×œ× ×ž×ובטח. משמעות הדבר ×”×™× ×©×›×œ השיחות שלך שיוחלפו ×¢× ×”×§×¦×” ×”×©× ×™ ×œ× ×™×”×™×• ×ž×•×¦×¤× ×•×ª. ×”×× ×¢×“×™×™×Ÿ ×‘×¨×¦×•× ×š להתחבר? -# discouraged: -# > deprived > לקוי בחסר -# > dissuade > dissuade from > ×œ×”× ×™× ×ž- -#: ../src/dialogs.py:1846 -#, python-format -msgid "" -"You are about to connect to the account %(account)s (%(server)s) with an " -"insecure connection. This means all your conversations will be exchanged " -"unencrypted. This type of connection is really discouraged.\n" -"Are you sure you want to do that?" -msgstr "" -"×”×™× ×š על סף התחברות ×ל החשבון %(account)s â€(%(server)s) ב×מצעות חיבור ×œ× " -"מ×ובטח. משמעות הדבר ×”×™× ×›×™ כל השיחות ×שר יוחלפו ×¢× ×”×§×¦×” ×”×©× ×™ ×œ× ×™×”×™×• " -"×ž×•×¦×¤× ×•×ª. רצוי ×œ×”×™×ž× ×¢ ×ž×—×™×‘×•×¨×™× ×ž×˜×™×¤×•×¡ ×–×”.\n" -"×”×× ×תה בטוח ×›×™ ×‘×¨×¦×•× ×š לעשות כן?" - -#: ../src/dialogs.py:1852 ../src/gui_interface.py:1450 -#: ../src/gui_interface.py:1491 -msgid "Yes, I really want to connect insecurely" -msgstr "כן, ×‘×¨×¦×•× ×™ להתחבר בשיטה ×œ× ×‘×˜×•×—×”" - -#: ../src/dialogs.py:1853 -msgid "Gajim will NOT connect unless you check this box" -msgstr "â€Gajim ×œ× ×™×ª×—×‘×¨ ××œ× ×× ×›×Ÿ תיבה זו תסומן" - -#: ../src/dialogs.py:1854 ../src/groupchat_control.py:2130 -#: ../src/gui_interface.py:706 ../src/gui_interface.py:1451 -#: ../src/gui_interface.py:1492 ../src/message_window.py:222 -#: ../src/roster_window.py:3048 ../src/roster_window.py:3728 -#: ../src/roster_window.py:4556 -msgid "_Do not ask me again" -msgstr "×ל ת_ש×ל ×ותי שוב" +"הדגשת ×ž×™×œ×™× ×©×œ× ×ויתו כר×וי ×œ× ×ª× ×•×¦×œ" -#: ../src/dialogs.py:1950 +#: ../src/dialogs.py:1912 msgid "_Resume" -msgstr "_חזור" +msgstr "_חזרה" -#: ../src/dialogs.py:1958 +#: ../src/dialogs.py:1920 msgid "Re_place" -msgstr "×”_חלף" +msgstr "×”_חלפה" -#: ../src/dialogs.py:2155 ../src/dialogs.py:2612 -msgid "The nickname contains invalid characters." +# BUG: unallowed characters +#: ../src/dialogs.py:2114 +#: ../src/dialogs.py:2515 +msgid "The nickname has not allowed characters." msgstr "×©× ×”×›×™× ×•×™ מכיל ×ª×•×•×™× ×סורי×." -#: ../src/dialogs.py:2277 +#: ../src/dialogs.py:2233 #, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "בקשת הרשמה עבור חשבון %(account)s מ×ת %(jid)s" -#: ../src/dialogs.py:2280 +#: ../src/dialogs.py:2236 #, python-format msgid "Subscription request from %s" -msgstr "בקשת הרשמה מ×ת %s" +msgstr "בקשת הרשמה מ×ת ‫‫%s" -#: ../src/dialogs.py:2364 ../src/gui_interface.py:2056 +#: ../src/dialogs.py:2320 +#: ../src/gui_interface.py:2056 #, python-format msgid "You are already in group chat %s" -msgstr "×”×™× ×š כבר בתוך שיחת קבוצה %s" +msgstr "×”×™× ×š כבר בתוך שיחת קבוצה ‫%s" -#: ../src/dialogs.py:2370 +#: ../src/dialogs.py:2326 msgid "You can not join a group chat unless you are connected." -msgstr "×ין ב×פשרותך להצטרף ×ל שיחת קבוצה עד ×שר ×œ× ×ª×—×•×‘×¨." +msgstr "×ין ביכולתך להצטרף ×ל שיחת קבוצה עד ×©×œ× ×ª×—×•×‘×¨." -#: ../src/dialogs.py:2414 +#: ../src/dialogs.py:2370 #, python-format msgid "Join Group Chat with account %s" msgstr "הצטרפות ×ל שיחת קבוצה ב×מצעות חשבון ‫%s" -#: ../src/dialogs.py:2548 ../src/dialogs.py:2558 -msgid "Wrong server" -msgstr "שרת שגוי" - -#: ../src/dialogs.py:2548 ../src/dialogs.py:2558 -#, python-format -msgid "%s is not a groupchat server" -msgstr "â€%s ××™× ×• שרת שיחת קבוצה" - -#: ../src/dialogs.py:2598 +#: ../src/dialogs.py:2501 msgid "Invalid Account" msgstr "חשבון שגוי" -#: ../src/dialogs.py:2599 -msgid "" -"You have to choose an account from which you want to join the groupchat." -msgstr "עליך לבחור חשבון ×שר ×ž×ž× ×• ×‘×¨×¦×•× ×š להצטרף ×ל שיחת הקבוצה." +#: ../src/dialogs.py:2502 +msgid "You have to choose an account from which you want to join the groupchat." +msgstr "עליך לבחור חשבון ×©×ž×ž× ×• ×‘×¨×¦×•× ×š להצטרף ×ל שיחת הקבוצה." -#: ../src/dialogs.py:2611 +#: ../src/dialogs.py:2514 msgid "Invalid Nickname" msgstr "×©× ×›×™× ×•×™ שגוי" -#: ../src/dialogs.py:2616 ../src/dialogs.py:2622 -#: ../src/groupchat_control.py:2198 +#: ../src/dialogs.py:2519 +#: ../src/dialogs.py:2525 +#: ../src/groupchat_control.py:2093 msgid "Invalid group chat Jabber ID" -msgstr "מזהה Jabber של שיחת קבוצה שגוי" +msgstr "כתובת (JID) שגויה של שיחת קבוצה" -#: ../src/dialogs.py:2617 +#: ../src/dialogs.py:2520 msgid "Please enter the group chat Jabber ID as room@server." -msgstr "×× × ×”×–×Ÿ מזהה Jabber של שיחת הקבוצה בתור חדר@שרת." +msgstr "× × ×œ×”×–×™×Ÿ כתובת JID של שיחת הקבוצה ב×ופן ×–×” חדר@שרת." -#: ../src/dialogs.py:2623 -msgid "The group chat Jabber ID contains invalid characters." -msgstr "מזהה Jabber של שיחת קבוצה מכילה ×ª×•×•×™× ×סורי×." +# BUG: unallowed characters +#: ../src/dialogs.py:2526 +#: ../src/groupchat_control.py:2094 +msgid "The group chat Jabber ID has not allowed characters." +msgstr "כתובת (JID) שיחת קבוצה מכילה ×ª×•×•×™× ×סורי×." -#: ../src/dialogs.py:2628 ../src/gui_interface.py:2038 +# זו ×œ× +#: ../src/dialogs.py:2531 +#: ../src/gui_interface.py:2038 msgid "This is not a group chat" msgstr "זוהי ××™× ×” שיחת קבוצה" -#: ../src/dialogs.py:2629 ../src/gui_interface.py:2039 +#: ../src/dialogs.py:2532 +#: ../src/gui_interface.py:2039 #, python-format msgid "%s is not the name of a group chat." msgstr "‫%s ××™× ×• ×©× ×©×œ שיחת קבוצה." -#: ../src/dialogs.py:2663 +#: ../src/dialogs.py:2564 msgid "Without a connection, you can not synchronise your contacts." -msgstr "×œ×œ× ×—×™×‘×•×¨, ×ין ב×פשרותך ×œ×¡× ×›×¨×Ÿ ×ת ×× ×©×™ הקשר שלך." +msgstr "×œ×œ× ×—×™×‘×•×¨, ×ין ביכולתך ×œ×¡× ×›×¨×Ÿ ×ת ×× ×©×™ הקשר שלך." -#: ../src/dialogs.py:2676 +#: ../src/dialogs.py:2577 msgid "Server" msgstr "שרת" # Sync account > Unlogged account > Error # Should this be "to its server" OR "to a server"? -#: ../src/dialogs.py:2712 +#: ../src/dialogs.py:2613 msgid "This account is not connected to the server" -msgstr "חשבון ×–×” ××™× ×• מחובר כעת ×ל שרת" +msgstr "חשבון ×–×” ××™× ×• מחובר כעת ×ל השרת" # BUG: synchronise with *another* account -# עד ×שר ×–×” ×œ× ×™×—×•×‘×¨ -#: ../src/dialogs.py:2713 +# עד שזה ×œ× ×™×—×•×‘×¨ +#: ../src/dialogs.py:2614 msgid "You cannot synchronize with an account unless it is connected." -msgstr "×ין ב×פשרותך ×œ×”×¡×ª× ×›×¨×Ÿ ×¢× ×—×©×‘×•×Ÿ ××œ× ×× ×›×Ÿ החשבון ×”×™× ×• מחובר." +msgstr "×ין ביכולתך ×œ×”×¡×ª× ×›×¨×Ÿ ×¢× ×—×©×‘×•×Ÿ ××œ× ×× ×›×Ÿ החשבון ×”×™× ×• מחובר." -#: ../src/dialogs.py:2738 +#: ../src/dialogs.py:2639 msgid "Synchronise" msgstr "×¡× ×›×¨×•×Ÿ" -#: ../src/dialogs.py:2799 +#: ../src/dialogs.py:2700 #, python-format msgid "Start Chat with account %s" msgstr "התחלת שיחה ב×מצעות חשבון ‫%s" -#: ../src/dialogs.py:2801 +#: ../src/dialogs.py:2702 msgid "Start Chat" msgstr "התחלת שיחה" # לו, ×ליו -#: ../src/dialogs.py:2802 +# × × ×œ×¨×©×•× ×ת ×”×›×™× ×•×™ ×ו ×ת כתובת ×”Ö¾JID של +#: ../src/dialogs.py:2703 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" msgstr "" -"×ž×œ× ×©× ×›×™× ×•×™ ×ו מזהה Jabber של ×יש הקשר\n" -"×שר ×‘×¨×¦×•× ×š לשלוח ×ליו ×ו ×ליה הודעה:" +"× × ×œ×¨×©×•× ×©× ×›×™× ×•×™ ×ו כתובת JID של ×יש הקשר\n" +"×©×‘×¨×¦×•× ×š לשלוח ×ליו ×ו ×ליה הודעה:" #. if offline or connecting -#: ../src/dialogs.py:2829 ../src/dialogs.py:3213 ../src/dialogs.py:3448 +#: ../src/dialogs.py:2730 +#: ../src/dialogs.py:3114 +#: ../src/dialogs.py:3350 msgid "Connection not available" msgstr "חיבור ×œ× ×–×ž×™×Ÿ" -#: ../src/dialogs.py:2830 ../src/dialogs.py:3214 ../src/dialogs.py:3449 +# ×¢× +#: ../src/dialogs.py:2731 +#: ../src/dialogs.py:3115 +#: ../src/dialogs.py:3351 #, python-format msgid "Please make sure you are connected with \"%s\"." -msgstr "×× × ×•×“× ×›×™ ×”×™× ×š מחובר בעזרת \"%s\"." +msgstr "× × ×œ×•×•×“× ×©×”×™× ×š מחובר ב×מצעות \"%s\"." -#: ../src/dialogs.py:2839 ../src/dialogs.py:2842 +#: ../src/dialogs.py:2740 +#: ../src/dialogs.py:2743 msgid "Invalid JID" msgstr "כתובת JID שגויה" -#: ../src/dialogs.py:2842 +#: ../src/dialogs.py:2743 #, python-format msgid "Unable to parse \"%s\"." -msgstr "×ין ×פשרות ×œ× ×ª×— ×ת \"%s\"." +msgstr "×œ× × ×™×ª×Ÿ ×œ× ×ª×— ×ת \"%s\"." -#: ../src/dialogs.py:2851 +#: ../src/dialogs.py:2752 msgid "Without a connection, you can not change your password." -msgstr "×œ×œ× ×—×™×‘×•×¨, ×ין ב×פשרותך ×œ×©× ×•×ª ×ת סיסמתך." +msgstr "×œ×œ× ×—×™×‘×•×¨, ×ין ביכולתך ×œ×©× ×•×ª ×ת סיסמתך." -#: ../src/dialogs.py:2870 +#: ../src/dialogs.py:2771 msgid "Invalid password" msgstr "סיסמה שגויה" -#: ../src/dialogs.py:2870 +#: ../src/dialogs.py:2771 msgid "You must enter a password." msgstr "עליך להזין סיסמה." -#: ../src/dialogs.py:2874 +#: ../src/dialogs.py:2775 msgid "Passwords do not match" msgstr "סיסמ×ות ×œ× ×ª×•×מות" # על הסיסמ×ות -#: ../src/dialogs.py:2875 +#: ../src/dialogs.py:2776 msgid "The passwords typed in both fields must be identical." -msgstr "הסיסמ×ות ×שר מוקלדות ×‘×©× ×™ השדות מוכרחות להיות זהות." +msgstr "הסיסמ×ות שמוקלדות ×‘×©× ×™ השדות מוכרחות להיות זהות." -#: ../src/dialogs.py:2918 ../src/gui_interface.py:883 ../src/notify.py:276 +#: ../src/dialogs.py:2819 +#: ../src/gui_interface.py:873 +#: ../src/notify.py:276 msgid "New E-mail" msgstr "דו×״ל חדש" -#: ../src/dialogs.py:2920 ../src/gui_interface.py:943 ../src/notify.py:269 +#: ../src/dialogs.py:2821 +#: ../src/gui_interface.py:933 +#: ../src/notify.py:269 msgid "File Transfer Request" msgstr "בקשה להעברת קובץ" -#: ../src/dialogs.py:2922 ../src/gui_interface.py:845 -#: ../src/gui_interface.py:909 ../src/notify.py:271 +#: ../src/dialogs.py:2823 +#: ../src/gui_interface.py:835 +#: ../src/gui_interface.py:899 +#: ../src/notify.py:271 msgid "File Transfer Error" msgstr "שגי××” בהעברת קובץ" -#: ../src/dialogs.py:2924 ../src/gui_interface.py:1032 -#: ../src/gui_interface.py:1058 ../src/gui_interface.py:1079 +#: ../src/dialogs.py:2825 +#: ../src/gui_interface.py:1022 +#: ../src/gui_interface.py:1048 +#: ../src/gui_interface.py:1069 #: ../src/notify.py:273 msgid "File Transfer Completed" msgstr "העברת קובץ הושלמה" -#: ../src/dialogs.py:2925 ../src/gui_interface.py:1035 -#: ../src/gui_interface.py:1062 ../src/gui_interface.py:1083 +#: ../src/dialogs.py:2826 +#: ../src/gui_interface.py:1025 +#: ../src/gui_interface.py:1052 +#: ../src/gui_interface.py:1073 #: ../src/notify.py:274 msgid "File Transfer Stopped" msgstr "העברת קובץ × ×¢×¦×¨×”" -#: ../src/dialogs.py:3132 +#: ../src/dialogs.py:3033 #, python-format msgid "Single Message using account %s" msgstr "הודעה בודדת ב×מצעות חשבון ‫%s" -#: ../src/dialogs.py:3134 +#: ../src/dialogs.py:3035 #, python-format msgid "Single Message in account %s" msgstr "הודעה בודדת בחשבון ‫%s" -#: ../src/dialogs.py:3136 +#: ../src/dialogs.py:3037 msgid "Single Message" msgstr "הודעה בודדת" #. prepare UI for Sending -#: ../src/dialogs.py:3139 +#: ../src/dialogs.py:3040 #, python-format msgid "Send %s" msgstr "שליחת %s" #. prepare UI for Receiving -#: ../src/dialogs.py:3162 +#: ../src/dialogs.py:3063 #, python-format msgid "Received %s" msgstr "התקבלה %s" +# BUG: From, not Form? +# ×ª×‘× ×™×ª #. prepare UI for Receiving -#: ../src/dialogs.py:3185 -#, python-format +#: ../src/dialogs.py:3086 +#, fuzzy, python-format msgid "Form %s" -msgstr "טופס %s" +msgstr "מ×ת ‫%s" -# Is there RE for Hebrew? #. we create a new blank window to send and we preset RE: and to jid -#: ../src/dialogs.py:3268 +#: ../src/dialogs.py:3170 #, python-format msgid "RE: %s" msgstr "â€RE: %s" -#: ../src/dialogs.py:3269 +#: ../src/dialogs.py:3171 #, python-format msgid "%s wrote:\n" -msgstr "â€%s כתב/×”:\n" +msgstr "‫%s כתב/×”:\n" -#: ../src/dialogs.py:3329 +#: ../src/dialogs.py:3231 #, python-format msgid "XML Console for %s" msgstr "מסוף ‫XML עבור ‫%s" -#: ../src/dialogs.py:3331 +#: ../src/dialogs.py:3233 msgid "XML Console" msgstr "מסוף XML" # רוצה לה #. Action that can be done with an incoming list of contacts -#: ../src/dialogs.py:3478 +#: ../src/dialogs.py:3380 msgid "add" msgstr "להוסיף" # Is this Change or Adjust? # ×œ×©× ×•×ª # תת××™× -#: ../src/dialogs.py:3478 +#: ../src/dialogs.py:3380 msgid "modify" msgstr "להת××™×" -#: ../src/dialogs.py:3479 +#: ../src/dialogs.py:3381 msgid "remove" msgstr "להסיר" # שתבצע/×™ <b>%(action)s</b> של # שיות×מו על ידך מספר x שברשימה # רוצה ש<b>תוסיף</b> מספר ×× ×©×™ קשר ברשימה -#: ../src/dialogs.py:3508 +#: ../src/dialogs.py:3410 #, python-format -msgid "" -"<b>%(jid)s</b> would like you to <b>%(action)s</b> some contacts in your " -"roster." -msgstr "â€<b>%(jid)s</b> ×ž×¢×•× ×™×™×Ÿ <b>%(action)s</b> מספר ×× ×©×™ קשר ברשימתך." +msgid "<b>%(jid)s</b> would like you to <b>%(action)s</b> some contacts in your roster." +msgstr "‫<b>%(jid)s</b> ×ž×¢×•× ×™×™×Ÿ <b>%(action)s</b> מספר ×× ×©×™ קשר ברשימתך." #. Change label for accept_button to action name instead of 'OK'. -#: ../src/dialogs.py:3526 ../src/dialogs.py:3601 +#: ../src/dialogs.py:3428 +#: ../src/dialogs.py:3503 msgid "Modify" msgstr "הת×מה" #. holds jid -#: ../src/dialogs.py:3532 ../src/history_manager.py:166 +#: ../src/dialogs.py:3434 +#: ../src/history_manager.py:156 msgid "Jabber ID" -msgstr "מזהה Jabber" +msgstr "‫JID" -#: ../src/dialogs.py:3538 +#: ../src/dialogs.py:3440 msgid "Groups" msgstr "קבוצות" #. it is selected #. remote_jid = model[iter_][1].decode('utf-8') -#: ../src/dialogs.py:3646 +#: ../src/dialogs.py:3548 #, python-format msgid "%s suggested me to add you in my roster." -msgstr "â€%s הציע לי להוסיף ×ותך ×ל הרשימה שלי." +msgstr "‫%s הציע לי להוסיפך ×ל רשימתי." # × ×•×¡×¤×• -#: ../src/dialogs.py:3660 +#: ../src/dialogs.py:3562 #, python-format msgid "Added %d contact" msgid_plural "Added %d contacts" msgstr[0] "הוסף ×יש קשר %d" msgstr[1] "הוספו %d ×× ×©×™ קשר" -#: ../src/dialogs.py:3698 +# BUG: extra space ? +#: ../src/dialogs.py:3600 #, python-format msgid "Removed %d contact" msgid_plural "Removed %d contacts" msgstr[0] "הוסר ×יש קשר %d" msgstr[1] "הוסרו %d ×× ×©×™ קשר" -# ××¨×›×™×•× ×ות -#: ../src/dialogs.py:3739 ../src/dialogs.py:3916 +#: ../src/dialogs.py:3641 +#: ../src/dialogs.py:3818 #, python-format msgid "Archiving Preferences for %s" -msgstr "העדפות ×’× ×–×š עבור ‫%s" +msgstr "העדפות ××¨×›×™×•× ×ות עבור ‫%s" -#: ../src/dialogs.py:3779 +#: ../src/dialogs.py:3681 msgid "Invalid expire value" msgstr "ערך תפוגה שגוי" -#: ../src/dialogs.py:3780 +#: ../src/dialogs.py:3682 msgid "Expire must be a valid positive integer." msgstr "תפוגה מוכרחה להיות ספרה חיובית תקפה." -#: ../src/dialogs.py:3827 +# ×¢× ×”×ª×‘× ×™×ª +#: ../src/dialogs.py:3729 msgid "There is an error with the form" -msgstr "קיימת שגי××” ×¢× ×”×˜×•×¤×¡" +msgstr "זוהי שגי××” ×‘×ª×‘× ×™×ª" -#: ../src/dialogs.py:4047 +#: ../src/dialogs.py:3949 msgid "There is an error" -msgstr "קיימת שגי××”" +msgstr "קיימת שגי××”." -#: ../src/dialogs.py:4115 +#: ../src/dialogs.py:4017 #, python-format msgid "Privacy List <b><i>%s</i></b>" msgstr "רשימת פרטיות ‫<b><i>%s</i></b>" -#: ../src/dialogs.py:4119 +#: ../src/dialogs.py:4021 #, python-format msgid "Privacy List for %s" msgstr "רשימת פרטיות עבור ‫%s" -#: ../src/dialogs.py:4186 +#: ../src/dialogs.py:4088 #, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" msgstr "סדר: %(order)s, פעולה: %(action)s, טיפוס: %(type)s, ערך: %(value)s" -#: ../src/dialogs.py:4191 +#: ../src/dialogs.py:4093 #, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "סדר: %(order)s, פעולה: %(action)s" -#: ../src/dialogs.py:4242 +#: ../src/dialogs.py:4144 msgid "<b>Edit a rule</b>" msgstr "<b>עריכת כלל</b>" -#: ../src/dialogs.py:4353 +#: ../src/dialogs.py:4255 msgid "<b>Add a rule</b>" msgstr "<b>הוספת כלל</b>" -#: ../src/dialogs.py:4452 +#: ../src/dialogs.py:4354 #, python-format msgid "Privacy Lists for %s" msgstr "רשימות פרטיות עבור ‫%s" -#: ../src/dialogs.py:4454 +#: ../src/dialogs.py:4356 msgid "Privacy Lists" msgstr "רשימות פרטיות" -#: ../src/dialogs.py:4543 +#: ../src/dialogs.py:4445 msgid "Invalid List Name" msgstr "×©× ×¨×©×™×ž×” שגוי" -#: ../src/dialogs.py:4544 +#: ../src/dialogs.py:4446 msgid "You must enter a name to create a privacy list." msgstr "עליך להזין ×©× ×›×“×™ ליצור רשימת פרטיות." # Changed to: You have been invited to a groupchat -#: ../src/dialogs.py:4580 +#: ../src/dialogs.py:4481 msgid "You are invited to a groupchat" msgstr "×”×•×–×ž× ×ª ×ל שיחת קבוצה" -#: ../src/dialogs.py:4583 +#: ../src/dialogs.py:4484 msgid "$Contact has invited you to join a discussion" -msgstr "â€$Contact ×”×–×ž×™× ×š להצטרף ×ל דיון" +msgstr "‫$Contact ×”×–×ž×™× ×š להצטרף ×ל דיון" -#: ../src/dialogs.py:4585 +#: ../src/dialogs.py:4486 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" -msgstr "â€$Contact ×”×–×ž×™× ×š ×ל שיחת קבוצה %(room_jid)s" +msgstr "‫$Contact ×”×–×ž×™× ×š ×ל שיחת הקבוצה %(room_jid)s" -#: ../src/dialogs.py:4593 +#: ../src/dialogs.py:4494 #, python-format msgid "Comment: %s" msgstr "הערה: %s" -#: ../src/dialogs.py:4595 +#: ../src/dialogs.py:4496 msgid "Do you want to accept the invitation?" msgstr "×”×× ×‘×¨×¦×•× ×š לקבל ×ת ×”×”×–×ž× ×”?" -#: ../src/dialogs.py:4612 +#: ../src/dialogs.py:4512 msgid "Reason (if you decline):" -msgstr "סיבה (ב×× ×¨×¦×•× ×š בדחיית ×”×”×–×ž× ×”):" +msgstr "סיבה (במידה ותסרב):" -#: ../src/dialogs.py:4664 +#: ../src/dialogs.py:4563 msgid "Choose Client Cert #PCKS12" -msgstr "בחירת תעודת לקוח ‎#PCKS12" +msgstr "בחירת תעודת לקוח #PCKS12" -#: ../src/dialogs.py:4674 ../src/dialogs.py:4716 ../src/dialogs.py:4772 -#: ../src/dialogs.py:4860 +#: ../src/dialogs.py:4573 +#: ../src/dialogs.py:4615 +#: ../src/dialogs.py:4671 +#: ../src/dialogs.py:4759 msgid "All files" msgstr "כל הקבצי×" -#: ../src/dialogs.py:4679 +#: ../src/dialogs.py:4578 msgid "PKCS12 Files" msgstr "קבצי PKCS12" -#: ../src/dialogs.py:4706 +#: ../src/dialogs.py:4605 msgid "Choose Sound" msgstr "בחירת צליל" -#: ../src/dialogs.py:4721 +#: ../src/dialogs.py:4620 msgid "Wav Sounds" msgstr "צלילי Wav" -#: ../src/dialogs.py:4759 +#: ../src/dialogs.py:4658 msgid "Choose Image" msgstr "בחירת ×ª×ž×•× ×”" -#: ../src/dialogs.py:4777 +#: ../src/dialogs.py:4676 msgid "Images" msgstr "×ª×ž×•× ×•×ª" -#: ../src/dialogs.py:4847 +#: ../src/dialogs.py:4746 msgid "Choose Archive" msgstr "בחירת ×רכיון" -#: ../src/dialogs.py:4865 +#: ../src/dialogs.py:4764 msgid "Zip files" msgstr "קבצי Zip" # הופך ל -#: ../src/dialogs.py:4891 +#: ../src/dialogs.py:4790 #, python-format msgid "When %s becomes:" msgstr "×›×שר %s × ×”×™×”:" -#: ../src/dialogs.py:4893 +#: ../src/dialogs.py:4792 #, python-format msgid "Adding Special Notification for %s" msgstr "הוספת התר××” מיוחדת עבור ‫%s" -#: ../src/dialogs.py:5113 +#: ../src/dialogs.py:5012 #, python-format msgid "" "Your chat session with <b>%(jid)s</b> is encrypted.\n" @@ -8366,45 +8424,44 @@ msgstr "" "\n" "מחרוזת ×”×ימות הקצרה (SAS) של סשן ×–×” ×”×™× ×” <b>%(sas)s</b>." -#: ../src/dialogs.py:5116 +# ×ומתה הזהות של +#: ../src/dialogs.py:5015 msgid "You have already verified this contact's identity." msgstr "כבר ×ימתת ×ת הזהות של ×יש קשר ×–×”." -#: ../src/dialogs.py:5122 ../src/dialogs.py:5207 +#: ../src/dialogs.py:5021 +#: ../src/dialogs.py:5105 msgid "Contact's identity verified" msgstr "זהות ×יש קשר מ×ומתת" # מ×מת -#: ../src/dialogs.py:5128 +#: ../src/dialogs.py:5027 msgid "Verify again..." msgstr "×מת שוב..." # הודעותיך # GOOD! their identity, not his or her ("he or she") identity [not a BUG:] -#: ../src/dialogs.py:5133 -msgid "" -"To be certain that <b>only</b> the expected person can read your messages or " -"send you messages, you need to verify their identity by clicking the button " -"below." -msgstr "" -"כדי להסיר ספק ×›×™ ×”×ישיות הצפויה <b>בלבד</b> יכולה ×œ×§×¨×•× ×ת הודעותייך ×ו " -"לשלוח לך הודעות, עליך ל×מת ×ת ×–×”×•×ª× ×¢×œ ידי הקלקה על הלחצן מטה." +#: ../src/dialogs.py:5032 +msgid "To be certain that <b>only</b> the expected person can read your messages or send you messages, you need to verify their identity by clicking the button below." +msgstr "כדי להסיר ספק שה×ישיות הצפויה <b>בלבד</b> יכולה ×œ×§×¨×•× ×ת הודעותייך ×ו לשלוח לך הודעות, עליך ל×מת ×ת ×–×”×•×ª× ×¢×œ ידי הקלקה על הלחצן מטה." -#: ../src/dialogs.py:5136 ../src/dialogs.py:5188 ../src/dialogs.py:5201 +#: ../src/dialogs.py:5035 +#: ../src/dialogs.py:5086 +#: ../src/dialogs.py:5099 msgid "Contact's identity NOT verified" msgstr "זהות ×יש קשר ××™× ×” מ×ומתת!" -#: ../src/dialogs.py:5141 +#: ../src/dialogs.py:5040 msgid "Verify..." -msgstr "×ימות..." +msgstr "×מת..." -#: ../src/dialogs.py:5152 +#: ../src/dialogs.py:5051 msgid "Have you verified the contact's identity?" msgstr "×”×× ×ימתת ×ת הזהות של ×יש הקשר?" # ×ישית ×ו ×˜×œ×¤×•× ×™×ª # ב×ופן ×ישי ×ו בטלפון -#: ../src/dialogs.py:5153 +#: ../src/dialogs.py:5052 #, python-format msgid "" "To prevent talking to an unknown person, you should speak to <b>%(jid)s</b> " @@ -8413,69 +8470,60 @@ msgid "" "\n" "This session's Short Authentication String is <b>%(sas)s</b>." msgstr "" -"בכדי ×œ×ž× ×•×¢ שיחה ×ל ×ישיות ×œ× ×ž×•×›×¨×ª, עליך לדבר ×¢× <b>%(jid)s</b> ב×ופן ישיר " -"(ב×ופן ×ישי ×ו ×˜×œ×¤×•× ×™×ª) ×•×œ×•×•×“× ×›×™ ×”× ×¨×•××™× ×ת ×ותה מחרוזת ×ימות קצרה (SAS) " -"כפי ×©×¢×™× ×™×™×š רו×ות.\n" +"בכדי ×œ×ž× ×•×¢ שיחה ×ל ×ישיות ×œ× ×ž×•×›×¨×ª, עליך לדבר ×¢× <b>%(jid)s</b> ב×ופן ישיר (ב×ופן ×ישי ×ו ×˜×œ×¤×•× ×™×ª) ×•×œ×•×•×“× ×©×”× ×¨×•××™× ×ת ×ותה מחרוזת ×ימות קצרה (SAS) כפי ×©×¢×™× ×™×™×š רו×ות.\n" "\n" "מחרוזת ×”×ימות הקצרה של סשן ×–×” ×”×™× ×” <b>%(sas)s</b>." -#: ../src/dialogs.py:5154 +#: ../src/dialogs.py:5053 msgid "Did you talk to the remote contact and verify the SAS?" msgstr "×”×× ×“×™×‘×¨×ª ×¢× ×יש הקשר המרוחק וד×גת ×œ×•×•×“× ×”×¦×¤× ×ª SAS?" -#: ../src/dialogs.py:5189 +#: ../src/dialogs.py:5087 #, python-format msgid "The contact's key (%s) <b>does not match</b> the key assigned in Gajim." -msgstr "המפתח של ×יש קשר (%s) <b>×œ× ×ª×•××</b> ×ת המפתח ×שר מוקצה בתוך Gajim." +msgstr "המפתח של ×יש קשר (%s) <b>×œ× ×ª×•××</b> ×ת המפתח המוקצה ×צל Gajim." -#: ../src/dialogs.py:5195 -msgid "" -"No OpenPGP key is assigned to this contact. So you cannot encrypt messages." -msgstr "×œ× ×”×•×§×¦×” מפתח OpenPGP ל×יש קשר ×–×”. כך ש×ין ×ין ב×פשרותך להצפין הודעות." +#: ../src/dialogs.py:5093 +msgid "No GPG key is assigned to this contact. So you cannot encrypt messages." +msgstr "×œ× ×”×•×§×¦×” מפתח GPG ל×יש קשר ×–×”. ××™ לכך ×ין ב×פשרותך להצפין הודעות." -#: ../src/dialogs.py:5202 -msgid "" -"OpenPGP key is assigned to this contact, but <b>you do not trust his key</" -"b>, so message <b>cannot</b> be encrypted. Use your OpenPGP client to trust " -"this key." -msgstr "" -"מפתח OpenPGP מוקצה ל×יש קשר ×–×”, ×ך <b>××™× ×š סומך על מפתח ×–×”</b>, ××™ לכך " -"הודעות <b>×œ× ×™×›×•×œ×•×ª</b> להיות ×ž×•×¦×¤× ×•×ª. יש לעשות שימוש בלקוח OpenPGP בכדי " -"לבטוח במפתח ×–×”." +#: ../src/dialogs.py:5100 +msgid "GPG key is assigned to this contact, but <b>you do not trust his key</b>, so message <b>cannot</b> be encrypted. Use your GPG client to trust this key." +msgstr "מפתח GPG ×כן הוקצה ל×יש קשר ×–×”, ×ך <b>××™× ×š סומך על מפתח ×–×”</b>, ××™ לכך הודעות <b>×œ× ×™×›×•×œ×•×ª</b> להיות ×ž×•×¦×¤× ×•×ª. יש לעשות שימוש בלקוח GPG בכדי לבטוח במפתח ×–×”." -#: ../src/dialogs.py:5208 -msgid "" -"OpenPGP Key is assigned to this contact, and you trust his key, so messages " -"will be encrypted." -msgstr "" -"מפתח OpenPGP מוקצה ל×יש קשר ×–×”, ×•×”×™× ×š סומך על המפתח שלו, ××™ לכך הודעות " -"×™×•×¦×¤× ×•." +#: ../src/dialogs.py:5106 +msgid "GPG Key is assigned to this contact, and you trust his key, so messages will be encrypted." +msgstr "מפתח GPG מוקצה ל×יש קשר ×–×”, ×•×”×™× ×š סומך על המפתח שלו, ××™ לכך הודעות ×™×•×¦×¤× ×•." -#: ../src/dialogs.py:5273 +#: ../src/dialogs.py:5171 msgid "an audio and video" msgstr "שמע ×•×’× ×•×™×“×ו" -#: ../src/dialogs.py:5275 +#: ../src/dialogs.py:5173 msgid "an audio" msgstr "שמע" -#: ../src/dialogs.py:5277 +#: ../src/dialogs.py:5175 msgid "a video" msgstr "ויד×ו" -#: ../src/dialogs.py:5281 +# What is being put into %(type)s? +# Maybe an RTL issue would show up +# Needs to be tested +# See: Right-to-left mark +#: ../src/dialogs.py:5179 #, python-format -msgid "" -"%(contact)s wants to start %(type)s session with you. Do you want to answer " -"the call?" -msgstr "â€%(contact)s רוצה להתחיל עמך בסשן %(type)s. ×”×× ×™×© ×‘×¨×¦×•× ×š ×œ×¢× ×•×ª לקרי××”?" +msgid "%(contact)s wants to start %(type)s session with you. Do you want to answer the call?" +msgstr "‫%(contact)s רוצה להתחיל עמך בסשן %(type)s. ×”×× ×‘×¨×¦×•× ×š ×œ×¢× ×•×ª לקרי××”?" -#: ../src/dialogs.py:5372 ../src/dialogs.py:5376 +#: ../src/dialogs.py:5248 #, python-format msgid "Certificate for account %s" msgstr "תעודה עבור חשבון ‫%s" -#: ../src/dialogs.py:5376 +# Unit +# Fix LTR issues with Latin characters (Done!) +#: ../src/dialogs.py:5248 #, python-format msgid "" "<b>Issued to:</b>\n" @@ -8497,157 +8545,168 @@ msgid "" "SHA1 Fingerprint: %(sha1)s" msgstr "" "<b>×”×•× ×¤×§×” עבור:</b>\n" -"×©× ×›×œ×œ×™ (CN): â€%(scn)s\n" -"×רגון (O): â€%(sorg)s\n" -"יחידת ×יגוד (OU): â€%(sou)s\n" +"×©× ×›×œ×œ×™ ‫(CN): ‫%(scn)s\n" +"×רגון ‫(O): ‫%(sorg)s\n" +"יחידת ×יגוד ‫(OU): ‫%(sou)s\n" "מספר סידורי: %(sn)s\n" "\n" "<b>×”×•× ×¤×§×” על ידי:</b>\n" -"×©× ×›×œ×œ×™ (CN): â€%(icn)s\n" -"×רגון (O): â€%(iorg)s\n" -"יחידת ×יגוד (OU): â€%(iou)s\n" +"×©× ×›×œ×œ×™ ‫(CN): ‫%(icn)s\n" +"×רגון ‫(O): ‫%(iorg)s\n" +"יחידת ×יגוד ‫(OU): ‫%(iou)s\n" "\n" "<b>תקפות:</b>\n" "×”×•× ×¤×§×” בת×ריך: %(io)s\n" "פוקעת בת×ריך: %(eo)s\n" "\n" "<b>טביעת ×צבע</b>\n" -"טביעת ×צבע SHA1: â€%(sha1)s" +"טביעת ×צבע ‫SHA1: ‫%(sha1)s" -#: ../src/dialogs.py:5411 ../src/dialogs.py:5428 +#: ../src/dialogs.py:5283 +#: ../src/dialogs.py:5300 msgid "View cert..." msgstr "הצג תעודה" -#: ../src/dialogs.py:5436 -msgid "Certificate" -msgstr "תעודה" - -#: ../src/disco.py:120 +#: ../src/disco.py:119 msgid "Others" msgstr "×חרי×" #. conference is a category for listing mostly groupchats in service discovery -#: ../src/disco.py:124 +#: ../src/disco.py:123 msgid "Conference" msgstr "ועידה" # BUG: Dot -#: ../src/disco.py:517 +#: ../src/disco.py:516 msgid "Without a connection, you can not browse available services" -msgstr "×œ×œ× ×—×™×‘×•×¨, ×ין ב×פשרותך לעיין ×‘×©×™×¨×•×ª×™× ×–×ž×™× ×™×" +msgstr "×œ×œ× ×—×™×‘×•×¨, ×ין ביכולתך לעיין ×‘×©×™×¨×•×ª×™× ×–×ž×™× ×™×" -#: ../src/disco.py:603 +#: ../src/disco.py:602 #, python-format msgid "Service Discovery using account %s" msgstr "מצי×ת שירות ב×מצעות חשבון ‫%s" -#: ../src/disco.py:605 +#: ../src/disco.py:604 msgid "Service Discovery" msgstr "מצי×ת שירות" # BUG: general title without "the" -#: ../src/disco.py:761 +# ×œ× × ×™×ª×Ÿ +#: ../src/disco.py:760 msgid "The service could not be found" msgstr "השירות ×œ× ×”×™×” יכול להימצ×" -#: ../src/disco.py:762 -msgid "" -"There is no service at the address you entered, or it is not responding. " -"Check the address and try again." -msgstr "×ין שירות בכתובת ×שר ×”×–× ×ª, ×ו שזה ××™× ×• מגיב. בדוק ×ת הכתובת ×•× ×¡×” שוב." +# it = service +# ×”×•× = השירות +#: ../src/disco.py:761 +msgid "There is no service at the address you entered, or it is not responding. Check the address and try again." +msgstr "×œ× ×§×™×™× ×©×™×¨×•×ª בכתובת ×©×”×–× ×ª, ×ו ×©×”×•× ×œ× ×ž×’×™×‘. × × ×œ×‘×“×•×§ ×ת הכתובת ×•×œ× ×¡×•×ª שוב." -#: ../src/disco.py:768 ../src/disco.py:1109 +#: ../src/disco.py:765 +#: ../src/disco.py:1101 msgid "The service is not browsable" -msgstr "השירות ××™× ×• בר עיון" +msgstr "השירות ××™× ×• בר־עיון" -#: ../src/disco.py:769 +# סוג שירות ×–×” +#: ../src/disco.py:766 msgid "This type of service does not contain any items to browse." -msgstr "טיפוס ×–×” של שירות ×œ× ×ž×›×™×œ ×¤×¨×™×˜×™× ×œ×¢×™×•×Ÿ." +msgstr "טיפוס ×–×” של שירות ×œ× ×ž×›×™×œ ×¤×¨×™×˜×™× ×©× ×™×ª×Ÿ לעיין בה×." -#: ../src/disco.py:810 ../src/disco.py:820 +#: ../src/disco.py:806 +#: ../src/disco.py:816 msgid "Invalid Server Name" msgstr "×©× ×©×¨×ª שגוי" -#: ../src/disco.py:873 +# מעיין כעת +# Browsing services at +#: ../src/disco.py:869 #, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "עיון ×‘×©×™×¨×•×ª×™× ×‘×›×ª×•×‘×ª ‫%(address)s ב×מצעות חשבון ‫%(account)s" -#: ../src/disco.py:917 +#: ../src/disco.py:913 msgid "_Browse" msgstr "_עיון" -#: ../src/disco.py:1110 +#: ../src/disco.py:1102 msgid "This service does not contain any items to browse." -msgstr "שירות ×–×” ×œ× ×ž×›×™×œ ×¤×¨×™×˜×™× ×œ×¢×™×•×Ÿ." +msgstr "שירות ×–×” ×œ× ×ž×›×™×œ ×¤×¨×™×˜×™× ×©× ×™×ª×Ÿ לעיין בה×." -#: ../src/disco.py:1378 +#: ../src/disco.py:1342 msgid "_Execute Command" msgstr "הרץ _פקודה" -#: ../src/disco.py:1388 ../src/disco.py:1560 +#: ../src/disco.py:1352 +#: ../src/disco.py:1521 msgid "Re_gister" -msgstr "×”_רשמה" +msgstr "×”_רש×" +# Plural form maybe? # Scanned/Identified/Detected/Discovered/Found %(current)d out of %(total)d.. # ×ותרו, זוהו, × ×ž×¦×ו -#: ../src/disco.py:1601 +#: ../src/disco.py:1562 #, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "× ×¡×¨×§×• %(current)d ×©×™×¨×•×ª×™× ×ž×ª×•×š %(total)d.." #. Users column -#: ../src/disco.py:1797 +#: ../src/disco.py:1753 msgid "Users" msgstr "משתמשי×" #. Description column -#: ../src/disco.py:1805 +#: ../src/disco.py:1761 msgid "Description" msgstr "תי×ור" #. Id column -#: ../src/disco.py:1813 +#: ../src/disco.py:1769 msgid "Id" msgstr "כתובת" -#: ../src/disco.py:1877 ../src/gui_interface.py:2574 +# כבר הוגדרה ×¡×™×ž× ×™×™×” +#: ../src/disco.py:1834 +#: ../src/gui_interface.py:2574 msgid "Bookmark already set" msgstr "×¡×™×ž× ×™×™×” כבר הוגדרה" -#: ../src/disco.py:1878 ../src/gui_interface.py:2575 +#: ../src/disco.py:1835 +#: ../src/gui_interface.py:2575 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "שיחת קבוצה \"%s\" כבר קיימת ×‘×¡×™×ž× ×™×•×ª×™×™×š." -#: ../src/disco.py:1887 ../src/gui_interface.py:2589 +#: ../src/disco.py:1844 +#: ../src/gui_interface.py:2589 msgid "Bookmark has been added successfully" msgstr "×¡×™×ž× ×™×™×” הוספה בהצלחה" -#: ../src/disco.py:1888 ../src/gui_interface.py:2590 +# יש ב×פשרותך +# דרך +#: ../src/disco.py:1845 +#: ../src/gui_interface.py:2590 msgid "You can manage your bookmarks via Actions menu in your roster." -msgstr "" -"ב×פשרותך ×œ× ×”×œ ×ת ×”×¡×™×ž× ×™×•×ª שלך דרך תפריט 'פעולות' ×שר מצוי בתוך הרשימה שלך." +msgstr "ביכולתך ×œ× ×”×œ ×ת ×¡×™×ž× ×™×•×ª×™×™×š ב×מצעות התפריט 'פעולות' שברשימתך." -#: ../src/disco.py:2098 +#: ../src/disco.py:2054 msgid "Subscribed" msgstr "רשו×" -#: ../src/disco.py:2106 +#: ../src/disco.py:2062 msgid "Node" msgstr "× ×§×•×“×ª ממסר" -#: ../src/disco.py:2173 +#: ../src/disco.py:2129 msgid "New post" msgstr "פוסט חדש" -#: ../src/disco.py:2179 +#: ../src/disco.py:2135 msgid "_Subscribe" -msgstr "×”×™_רש×" +msgstr "×”_רשמה" -#: ../src/disco.py:2185 +#: ../src/disco.py:2141 msgid "_Unsubscribe" -msgstr "_בטל הרשמה" +msgstr "_ביטול הרשמה" #: ../src/features_window.py:50 msgid "SSL certificate validation" @@ -8668,9 +8727,7 @@ msgstr "" #: ../src/features_window.py:55 msgid "Serverless chatting with autodetected clients in a local network." -msgstr "" -"עריכת שיחות ברשת התקשורת המקומית, ×œ×œ× ×©×¨×ª כלל, ב×מצעות ×יתור ×וטומטי של " -"לקוחות ××—×¨×™× ×שר ×ž×—×•×‘×¨×™× ×ל ×ותה הרשת." +msgstr "עריכת שיחות ברשת התקשורת המקומית, ×œ×œ× ×©×¨×ª כלל, ב×מצעות ×יתור ×וטומטי של לקוחות ××—×¨×™× ×©×ž×—×•×‘×¨×™× ×ל ×ותה הרשת." #: ../src/features_window.py:56 msgid "Requires python-avahi." @@ -8703,14 +8760,14 @@ msgstr "יש צורך ×‘×”×ª×§× ×ª python-dbus." msgid "Feature not available under Windows." msgstr "×ª×›×•× ×” זו ×œ× ×–×ž×™× ×” תחת Windows." -# â€OpenPGP ×”×¦×¤× ×ª הודעות +# ‫OpenGPG ×”×¦×¤× ×ª הודעות #: ../src/features_window.py:62 -msgid "OpenPGP message encryption" -msgstr "×”×¦×¤× ×ª הודעות ב×מצעות OpenPGP" +msgid "OpenGPG message encryption" +msgstr "×”×¦×¤× ×ª הודעות ב×מצעות OpenGPG" #: ../src/features_window.py:63 -msgid "Encrypting chat messages with OpenPGP keys." -msgstr "×”×¦×¤× ×ª הודעות שיחה ב×מצעות מפתחות OpenPGP." +msgid "Encrypting chat messages with gpg keys." +msgstr "×”×¦×¤× ×ª הודעות שיחה ב×מצעות מפתחות gpg." #: ../src/features_window.py:64 msgid "Requires gpg and python-gnupg (http://code.google.com/p/python-gnupg/)." @@ -8747,7 +8804,7 @@ msgstr "יש צורך ×‘×”×ª×§× ×ª python-gnome2." #: ../src/features_window.py:74 msgid "Password encryption" -msgstr "×”×¦×¤× ×ª מילת מעבר" +msgstr "×”×¦×¤× ×ª מילת־מעבר" #: ../src/features_window.py:75 msgid "Passwords can be stored securely and not just in plaintext." @@ -8759,7 +8816,7 @@ msgstr "יש צורך ×‘×”×ª×§× ×ª gnome-keyring ×•×’× python-gnome2-desktop, #: ../src/features_window.py:78 msgid "SRV" -msgstr "" +msgstr "SRV" #: ../src/features_window.py:79 msgid "Ability to connect to servers which are using SRV records." @@ -8771,7 +8828,7 @@ msgstr "יש צורך ×‘×”×ª×§× ×ª dnsutils." #: ../src/features_window.py:81 msgid "Requires nslookup to use SRV records." -msgstr "יש צורך ×‘×”×ª×§× ×ª nslookup כדי לעשות שימוש ברשומות SRV." +msgstr "יש צורך ×‘×”×ª×§× ×ª nslookup גדי לעשות שימוש ברשומות SRV." #: ../src/features_window.py:82 msgid "Spell Checker" @@ -8790,14 +8847,17 @@ msgstr "יש צורך ×‘×”×ª×§× ×ª libgtkspell." msgid "Requires libgtkspell and libenchant." msgstr "יש צורך ×‘×”×ª×§× ×ª libgtkspell ×•×’× libenchant." +# התר×ות #: ../src/features_window.py:86 msgid "Notification" msgstr "התר××”" +# הודעות התר××” #: ../src/features_window.py:87 msgid "Passive popups notifying for new events." msgstr "התר×ות מוקפצות פסיביות המיידעות עבור ××™×¨×•×¢×™× ×—×“×©×™×." +# בחיבור ×¢× #: ../src/features_window.py:88 msgid "" "Requires python-notify or instead python-dbus in conjunction with " @@ -8813,9 +8873,7 @@ msgstr "מצב ×וטומטי" # על ×ž× ×ª להגדיר #: ../src/features_window.py:91 msgid "Ability to measure idle time, in order to set auto status." -msgstr "" -"יכולת למדוד ×ת הזמן ×שר בו המערכת מצויה בחוסר פעילות, בכדי לקבוע מצב חיבור " -"×וטומטי." +msgstr "יכולת למדוד ×ת הזמן שבו המערכת מצויה בחוסר פעילות, בכדי לקבוע מצב־חיבור ×וטומטי." #: ../src/features_window.py:92 msgid "Requires libxss library." @@ -8825,6 +8883,7 @@ msgstr "יש צורך ×‘×”×ª×§× ×ª ספריית libxss." msgid "Requires python2.5." msgstr "יש צורך ×‘×”×ª×§× ×ª python2.5." +# מקצה לקצה #: ../src/features_window.py:94 msgid "End to End message encryption" msgstr "×”×¦×¤× ×ª הודעות מן קצה ×ל קצה" @@ -8864,14 +8923,12 @@ msgstr "יש צורך ×‘×”×ª×§× ×ª python-farstream ×•×’× gstreamer-plugins-bad #: ../src/features_window.py:106 msgid "UPnP-IGD" -msgstr "" +msgstr "UPnP-IGD" -# העברת ×©×¢×¨×™× +# העברת פתחות/×©×¢×¨×™× #: ../src/features_window.py:107 msgid "Ability to request your router to forward port for file transfer." -msgstr "" -"יכולת לבקש מן × ×ª×‘ הרשת שלך (ר×וטר) לעשות שימוש בתיעול ×©×¢×¨×™× (Port " -"forwarding) עבור העברת קובץ." +msgstr "יכולת לבקש מן × ×ª×‘ הרשת (ר×וטר) לעשות שימוש בתיעול ×©×¢×¨×™× (Port forwarding) עבור העברת קובץ." #: ../src/features_window.py:108 msgid "Requires python-gupnp-igd." @@ -8879,12 +8936,12 @@ msgstr "יש צורך ×‘×”×ª×§× ×ª python-gupnp-igd." #: ../src/features_window.py:110 msgid "UPower" -msgstr "" +msgstr "UPower" # השעיית התליית #: ../src/features_window.py:111 msgid "Ability to disconnect properly just before suspending the machine." -msgstr "יכולת ×œ×”×ª× ×ª×§ ב×ופן מוסדר ×˜×¨× ×”×©×”×™×™×ª מחשבך." +msgstr "יכולת ×œ×”×ª× ×ª×§ ב×ופן מוסדר ×œ×¤× ×™ השהיית מחשבך." #: ../src/features_window.py:112 msgid "Requires upower and python-dbus." @@ -8924,8 +8981,9 @@ msgstr "גודל: %s" # ×ת/×” #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:196 ../src/filetransfers_window.py:206 -#: ../src/history_manager.py:551 +#: ../src/filetransfers_window.py:196 +#: ../src/filetransfers_window.py:206 +#: ../src/history_manager.py:541 msgid "You" msgstr "עצמך" @@ -8934,15 +8992,17 @@ msgstr "עצמך" msgid "Sender: %s" msgstr "ממען: %s" -#: ../src/filetransfers_window.py:198 ../src/filetransfers_window.py:734 -#: ../src/tooltips.py:758 +#: ../src/filetransfers_window.py:198 +#: ../src/filetransfers_window.py:734 +#: ../src/tooltips.py:756 msgid "Recipient: " msgstr "× ×ž×¢×Ÿ: " +# במדור #: ../src/filetransfers_window.py:209 #, python-format msgid "Saved in: %s" -msgstr "× ×©×ž×¨ בתוך: ‎%s" +msgstr "× ×©×ž×¨ במדור: %s" #: ../src/filetransfers_window.py:244 #, python-format @@ -8962,42 +9022,44 @@ msgid "" "received.\n" "Do you want to reload it?" msgstr "" -"הקובץ %(file)s התקבל בהצלחה, ×ך × ×¨××” ×›×™ ×”×•× ×”×ª×§×‘×œ ב×ופן ×œ× ×ª×§×™×Ÿ.\n" +"הקובץ %(file)s התקבל בהצלחה, ×ך × ×¨××” ×©×”×•× ×”×ª×§×‘×œ ב×ופן ×œ× ×ª×§×™×Ÿ.\n" "×”×× ×‘×¨×¦×•× ×š ×œ×”×˜×¢×™× ×• מחדש?" #: ../src/filetransfers_window.py:313 msgid "Choose File to Send..." msgstr "בחירת קובץ לשליחה..." -#: ../src/filetransfers_window.py:329 ../src/tooltips.py:793 +#: ../src/filetransfers_window.py:329 +#: ../src/tooltips.py:791 msgid "Description: " msgstr "תי×ור: " #: ../src/filetransfers_window.py:342 msgid "Gajim cannot access this file" -msgstr "â€Gajim ×œ× ×ž×¡×•×’×œ להשיג גישה לקובץ ×–×”" +msgstr "‫Gajim ×œ× ×™×›×•×œ להשיג גישה לקובץ ×–×”" #: ../src/filetransfers_window.py:343 msgid "This file is being used by another process." msgstr "קובץ ×–×” מצוי בשימוש בידי תהליך ×חר." -# להחליף -#: ../src/filetransfers_window.py:389 ../src/gtkgui_helpers.py:851 +#: ../src/filetransfers_window.py:389 +#: ../src/gtkgui_helpers.py:850 #, python-format msgid "Cannot overwrite existing file \"%s\"" -msgstr "×ין ×פשרות לכתוב על קובץ ×§×™×™× \"%s\"" +msgstr "×œ× × ×™×ª×Ÿ לכתוב על הקובץ ×”×§×™×™× \"%s\"" -#: ../src/filetransfers_window.py:390 ../src/gtkgui_helpers.py:852 -msgid "" -"A file with this name already exists and you do not have permission to " -"overwrite it." +#: ../src/filetransfers_window.py:390 +#: ../src/gtkgui_helpers.py:851 +msgid "A file with this name already exists and you do not have permission to overwrite it." msgstr "קובץ ×‘×©× ×–×” כבר ×§×™×™× ×•×ין ×•×œ× ×¢×•×ž×“×ª לרשותך הרש××” לכתוב עליו." -#: ../src/filetransfers_window.py:407 ../src/gtkgui_helpers.py:856 +#: ../src/filetransfers_window.py:407 +#: ../src/gtkgui_helpers.py:855 msgid "This file already exists" msgstr "קובץ ×–×” כבר קיי×" -#: ../src/filetransfers_window.py:407 ../src/gtkgui_helpers.py:856 +#: ../src/filetransfers_window.py:407 +#: ../src/gtkgui_helpers.py:855 msgid "What do you want to do?" msgstr "מה ×‘×¨×¦×•× ×š לעשות?" @@ -9005,16 +9067,17 @@ msgstr "מה ×‘×¨×¦×•× ×š לעשות?" #. read-only bit is used to mark special folder under #. windows, not to mark that a folder is read-only. #. See ticket #3587 -#: ../src/filetransfers_window.py:418 ../src/gtkgui_helpers.py:863 +#: ../src/filetransfers_window.py:418 +#: ../src/gtkgui_helpers.py:862 #, python-format msgid "Directory \"%s\" is not writable" msgstr "המדור \"%s\" ××™× ×• × ×ª×•×Ÿ לכתיבה" -#: ../src/filetransfers_window.py:419 ../src/gtkgui_helpers.py:864 +#: ../src/filetransfers_window.py:419 +#: ../src/gtkgui_helpers.py:863 msgid "You do not have permission to create files in this directory." msgstr "×ין לך הרש×ות ליצור ×§×‘×¦×™× ×‘×ž×“×•×¨ ×–×”." -# בתור #: ../src/filetransfers_window.py:430 msgid "Save File as..." msgstr "שמירת קובץ בש×..." @@ -9027,7 +9090,7 @@ msgstr "קובץ: %s" #: ../src/filetransfers_window.py:456 #, python-format msgid "Type: %s" -msgstr "טיפוס: %s" +msgstr "סוג: %s" #: ../src/filetransfers_window.py:458 #, python-format @@ -9037,7 +9100,7 @@ msgstr "תי×ור: %s" #: ../src/filetransfers_window.py:459 #, python-format msgid "%s wants to send you a file:" -msgstr "â€%s רוצה לשלוח ×ליך קובץ:" +msgstr "‫%s רוצה לשלוח ×ליך קובץ:" #: ../src/filetransfers_window.py:500 msgid "Checking file..." @@ -9053,7 +9116,7 @@ msgstr "שגי×ת קובץ" #: ../src/filetransfers_window.py:551 #, python-format msgid "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" -msgstr "" +msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" #. This should make the string Kb/s, #. where 'Kb' part is taken from %s. @@ -9072,16 +9135,18 @@ msgid "File: " msgstr "קובץ: " # ×œ× ×§×™×™×ž×ª ×פשרות -# ×ין ×פשרות +# ×œ× × ×™×ª×Ÿ #: ../src/filetransfers_window.py:704 msgid "It is not possible to send empty files" msgstr "×ין ×–×” ×פשרי לשלוח ×§×‘×¦×™× ×¨×™×§×™×" -#: ../src/filetransfers_window.py:730 ../src/tooltips.py:748 +#: ../src/filetransfers_window.py:730 +#: ../src/tooltips.py:746 msgid "Name: " msgstr "ש×: " -#: ../src/filetransfers_window.py:732 ../src/tooltips.py:752 +#: ../src/filetransfers_window.py:732 +#: ../src/tooltips.py:750 msgid "Sender: " msgstr "ממען: " @@ -9089,137 +9154,209 @@ msgstr "ממען: " msgid "Pause" msgstr "הפסקה" -#: ../src/gajim-remote.py:78 +#: ../src/gajim.py:192 +#, fuzzy +msgid "Gajim needs X server to run. Quiting..." +msgstr "cli" + +#: ../src/gajim.py:194 +#, fuzzy, python-format +msgid "importing PyGTK failed: %s" +msgstr "cli" + +#: ../src/gajim.py:235 +#, fuzzy +msgid "Gajim needs PyGTK 2.22 or above" +msgstr "cli" + +#: ../src/gajim.py:236 +#, fuzzy +msgid "Gajim needs PyGTK 2.22 or above to run. Quiting..." +msgstr "cli" + +#: ../src/gajim.py:238 +#, fuzzy +msgid "Gajim needs GTK 2.22 or above" +msgstr "cli" + +#: ../src/gajim.py:239 +#, fuzzy +msgid "Gajim needs GTK 2.22 or above to run. Quiting..." +msgstr "cli" + +#: ../src/gajim.py:248 +#, fuzzy +msgid "Gajim needs pywin32 to run" +msgstr "cli" + +# component +#: ../src/gajim.py:249 +#, python-format +msgid "Please make sure that Pywin32 is installed on your system. You can get it at %s" +msgstr "× × ×œ×•×•×“× ×©×”×¨×›×™×‘ Pywin32 מותקן במערכתך. ביכולתך להשיגו ×צל %s" + +#. set the icon to all newly opened wind +#: ../src/gajim.py:365 +msgid "Gajim is already running" +msgstr "‫Gajim כבר מורץ כעת" + +#: ../src/gajim.py:366 +msgid "" +"Another instance of Gajim seems to be running\n" +"Run anyway?" +msgstr "" +"× ×¨××” שתהליך ×חר של Gajim מורץ כעת\n" +"×”×× ×‘×¨×¦×•× ×š להריץ ×ת ×”×ª×•×›× ×™×ª בכל ×–×ת?" + +#: ../src/gajim-remote.py:77 #, fuzzy msgid "Shows a help on specific command" msgstr "cli" +# פקודה #. User gets help for the command, specified by this parameter -#: ../src/gajim-remote.py:81 +#: ../src/gajim-remote.py:80 #, fuzzy msgid "command" msgstr "cli" -#: ../src/gajim-remote.py:82 +#: ../src/gajim-remote.py:81 #, fuzzy msgid "show help on command" msgstr "cli" -#: ../src/gajim-remote.py:86 +# הצגה ×ו הסתרה של חלון הרשימה +#: ../src/gajim-remote.py:85 #, fuzzy msgid "Shows or hides the roster window" msgstr "cli" -#: ../src/gajim-remote.py:90 +#: ../src/gajim-remote.py:89 #, fuzzy msgid "Pops up a window with the next pending event" msgstr "cli" -#: ../src/gajim-remote.py:94 +#: ../src/gajim-remote.py:93 #, fuzzy msgid "" "Prints a list of all contacts in the roster. Each contact appears on a " "separate line" msgstr "cli" -#: ../src/gajim-remote.py:97 ../src/gajim-remote.py:112 -#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:132 -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 ../src/gajim-remote.py:192 -#: ../src/gajim-remote.py:222 ../src/gajim-remote.py:231 -#: ../src/gajim-remote.py:238 ../src/gajim-remote.py:245 -#: ../src/gajim-remote.py:256 ../src/gajim-remote.py:281 -#: ../src/gajim-remote.py:292 -msgid "?CLI:account" -msgstr "" +# חשבון +#: ../src/gajim-remote.py:96 +#: ../src/gajim-remote.py:111 +#: ../src/gajim-remote.py:121 +#: ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:147 +#: ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 +#: ../src/gajim-remote.py:191 +#: ../src/gajim-remote.py:221 +#: ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:237 +#: ../src/gajim-remote.py:244 +#: ../src/gajim-remote.py:255 +#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:291 +#, fuzzy +msgid "account" +msgstr "cli" -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:96 #, fuzzy msgid "show only contacts of the given account" msgstr "cli" -#: ../src/gajim-remote.py:103 +# הדפסת רשימה של ×—×©×‘×•× ×•×ª ×¨×©×•×ž×™× +#: ../src/gajim-remote.py:102 #, fuzzy msgid "Prints a list of registered accounts" msgstr "cli" -#: ../src/gajim-remote.py:107 +#: ../src/gajim-remote.py:106 #, fuzzy msgid "Changes the status of account or accounts" msgstr "cli" +# מצב־חיבור #. offline, online, chat, away, xa, dnd, invisible should not be translated -#: ../src/gajim-remote.py:110 -msgid "?CLI:status" -msgstr "" +#: ../src/gajim-remote.py:109 +#, fuzzy +msgid "status" +msgstr "cli" -#: ../src/gajim-remote.py:110 +#: ../src/gajim-remote.py:109 #, fuzzy msgid "" "one of: offline, online, chat, away, xa, dnd, invisible. If not set, use " "account's previous status" msgstr "cli" -#: ../src/gajim-remote.py:111 ../src/gajim-remote.py:134 -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 ../src/gajim-remote.py:283 -msgid "?CLI:message" -msgstr "" - -#: ../src/gajim-remote.py:111 +# הודעת מצב +#: ../src/gajim-remote.py:110 #, fuzzy msgid "status message" msgstr "cli" -#: ../src/gajim-remote.py:112 +#: ../src/gajim-remote.py:111 #, fuzzy msgid "" "change status of account \"account\". If not specified, try to change status " "of all accounts that have \"sync with global status\" option set" msgstr "cli" -#: ../src/gajim-remote.py:118 +#: ../src/gajim-remote.py:117 #, fuzzy msgid "Changes the priority of account or accounts" msgstr "cli" -#: ../src/gajim-remote.py:120 -msgid "?CLI:priority" -msgstr "" +# עדיפות +#: ../src/gajim-remote.py:119 +#, fuzzy +msgid "priority" +msgstr "cli" -#: ../src/gajim-remote.py:120 +# עדיפות ×©×‘×¨×¦×•× ×š לתת/×œ×”×¢× ×™×§ עבור החשבון +#: ../src/gajim-remote.py:119 #, fuzzy msgid "priority you want to give to the account" msgstr "cli" -#: ../src/gajim-remote.py:122 +#: ../src/gajim-remote.py:121 #, fuzzy msgid "" "change the priority of the given account. If not specified, change status of " "all accounts that have \"sync with global status\" option set" msgstr "cli" -#: ../src/gajim-remote.py:128 +#: ../src/gajim-remote.py:127 #, fuzzy msgid "Shows the chat dialog so that you can send messages to a contact" msgstr "cli" -#: ../src/gajim-remote.py:130 +# JID של ×יש-הקשר ×©×‘×¨×¦×•× ×š לשוחח ×¢× +# Changed to: JID of the contact with whom you want to chat (with) +# â€JID של ×יש־הקשר עמו ×‘×¨×¦×•× ×š לשוחח +#: ../src/gajim-remote.py:129 #, fuzzy msgid "JID of the contact that you want to chat with" msgstr "cli" -#: ../src/gajim-remote.py:132 ../src/gajim-remote.py:222 +#: ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:221 #, fuzzy msgid "if specified, contact is taken from the contact list of this account" msgstr "cli" -#: ../src/gajim-remote.py:135 +#: ../src/gajim-remote.py:134 #, fuzzy msgid "message content. The account must be specified or \"\"" msgstr "cli" -#: ../src/gajim-remote.py:140 +# ×”×™× × ×‘×’×“×¨ רשות +# שליחת הודעת שיחה חדשה ×ל ×יש קשר ברשימה. הן מפתח OpenPGP והן החשבון בגדר רשות. ×× ×‘×¨×¦×•× ×š להגדיר רק 'חשבון', ×œ×œ× 'מפתח OpenPGP', יש להגדיר 'מפתח OpenPGP' ×ל ''. +#: ../src/gajim-remote.py:139 #, fuzzy msgid "" "Sends new chat message to a contact in the roster. Both OpenPGP key and " @@ -9227,34 +9364,47 @@ msgid "" "key', just set 'OpenPGP key' to ''." msgstr "cli" -#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:157 +# â€JID של ×יש הקשר שיקבל ×ת ההודעה +#: ../src/gajim-remote.py:143 +#: ../src/gajim-remote.py:156 #, fuzzy msgid "JID of the contact that will receive the message" msgstr "cli" -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 +# תכולת +# תוכן ההודעה +#: ../src/gajim-remote.py:144 +#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 #, fuzzy msgid "message contents" msgstr "cli" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +# מפתח pgp +#: ../src/gajim-remote.py:145 +#: ../src/gajim-remote.py:159 #, fuzzy msgid "pgp key" msgstr "cli" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +# public key +# במידה והוגדר, ההודעה תוצפן ב×מצעות מפתח ציבורי ×–×” +#: ../src/gajim-remote.py:145 +#: ../src/gajim-remote.py:159 #, fuzzy msgid "if specified, the message will be encrypted using this public key" msgstr "cli" -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 +# במידה והוגדר, ההודעה תשלח ב×מצעות חשבון ×–×” +#: ../src/gajim-remote.py:147 +#: ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 #, fuzzy msgid "if specified, the message will be sent using this account" msgstr "cli" -#: ../src/gajim-remote.py:153 +# שליחת הודעת שיחה בודדת חדשה ×ל ×יש קשר ברשימה. הן מפתח OpenPGP והן החשבון בגדר רשות. ×× ×‘×¨×¦×•× ×š להגדיר רק 'חשבון', ×œ×œ× 'מפתח OpenPGP', יש להגדיר 'מפתח OpenPGP' ×ל ''. +#: ../src/gajim-remote.py:152 #, fuzzy msgid "" "Sends new single message to a contact in the roster. Both OpenPGP key and " @@ -9262,422 +9412,371 @@ msgid "" "key', just set 'OpenPGP key' to ''." msgstr "cli" -#: ../src/gajim-remote.py:158 +# × ×•×©× +#: ../src/gajim-remote.py:157 #, fuzzy msgid "subject" msgstr "cli" -#: ../src/gajim-remote.py:158 +# × ×•×©× ×”×•×“×¢×” +#: ../src/gajim-remote.py:157 #, fuzzy msgid "message subject" msgstr "cli" -#: ../src/gajim-remote.py:167 +# שליחת הודעה חדשה ×ל שיחת קבוצה ש×ליה הצטרפת. +#: ../src/gajim-remote.py:166 #, fuzzy msgid "Sends new message to a groupchat you've joined." msgstr "cli" -#: ../src/gajim-remote.py:169 +# â€JID של החדר שיקבל ×ת ההודעה +#: ../src/gajim-remote.py:168 #, fuzzy msgid "JID of the room that will receive the message" msgstr "cli" -#: ../src/gajim-remote.py:176 +# קבלת מידע מפורט ×ודות ×יש קשר +#: ../src/gajim-remote.py:175 #, fuzzy msgid "Gets detailed info on a contact" msgstr "cli" -#: ../src/gajim-remote.py:178 ../src/gajim-remote.py:191 -#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:230 +# â€JID של ×יש הקשר +#: ../src/gajim-remote.py:177 +#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:220 +#: ../src/gajim-remote.py:229 #, fuzzy msgid "JID of the contact" msgstr "cli" # BUG: on an account -#: ../src/gajim-remote.py:182 +# קבלת מידע מפורט על חשבון +#: ../src/gajim-remote.py:181 #, fuzzy msgid "Gets detailed info on a account" msgstr "cli" -#: ../src/gajim-remote.py:184 +# ×©× ×”×—×©×‘×•×Ÿ +#: ../src/gajim-remote.py:183 #, fuzzy msgid "Name of the account" msgstr "cli" -#: ../src/gajim-remote.py:188 +# שליחת קובץ ×ל ×יש קשר +#: ../src/gajim-remote.py:187 #, fuzzy msgid "Sends file to a contact" msgstr "cli" -#: ../src/gajim-remote.py:190 +# קובץ +#: ../src/gajim-remote.py:189 #, fuzzy msgid "file" msgstr "cli" -#: ../src/gajim-remote.py:190 +# × ×ª×™×‘ הקובץ +#: ../src/gajim-remote.py:189 #, fuzzy msgid "File path" msgstr "cli" -#: ../src/gajim-remote.py:192 +# what is specified? (fe/male) +# במידה וצוין, הקובץ ישלח ב×מצעות חשבון ×–×” +#: ../src/gajim-remote.py:191 #, fuzzy msgid "if specified, file will be sent using this account" msgstr "cli" -#: ../src/gajim-remote.py:197 +# ×¨×™×©×•× ×›×œ ההעדפות וערכיהן +# הצגת רשימה של כל +# רשימת כל ההעדפות וערכיהן +#: ../src/gajim-remote.py:196 #, fuzzy msgid "Lists all preferences and their values" msgstr "cli" -#: ../src/gajim-remote.py:201 +# What is "to"? +# הגדרת הערך של 'מפתח' to 'ערך'. +#: ../src/gajim-remote.py:200 #, fuzzy msgid "Sets value of 'key' to 'value'." msgstr "cli" -#: ../src/gajim-remote.py:203 +# מפתח=ערך +#: ../src/gajim-remote.py:202 #, fuzzy msgid "key=value" msgstr "cli" -#: ../src/gajim-remote.py:203 +# 'מפתח' ×–×” ×”×©× ×©×œ ההעדפה, 'ערך' ×–×” הערך שהוגדר עבור ההעדפה +#: ../src/gajim-remote.py:202 #, fuzzy msgid "'key' is the name of the preference, 'value' is the value to set it to" msgstr "cli" -#: ../src/gajim-remote.py:208 +# מחיקת פריט העדפה +#: ../src/gajim-remote.py:207 #, fuzzy msgid "Deletes a preference item" msgstr "cli" -#: ../src/gajim-remote.py:210 +# מפתח +#: ../src/gajim-remote.py:209 #, fuzzy msgid "key" msgstr "cli" -#: ../src/gajim-remote.py:210 +# ×©× ×”×”×¢×“×¤×” למחיקה +#: ../src/gajim-remote.py:209 #, fuzzy msgid "name of the preference to be deleted" msgstr "cli" -#: ../src/gajim-remote.py:214 +#: ../src/gajim-remote.py:213 #, fuzzy msgid "Writes the current state of Gajim preferences to the .config file" msgstr "cli" -#: ../src/gajim-remote.py:219 +# הסרת ×יש קשר מן הרשימה +#: ../src/gajim-remote.py:218 #, fuzzy msgid "Removes contact from roster" msgstr "cli" -#: ../src/gajim-remote.py:228 +# הוספת ×יש קשר ×ל הרשימה +#: ../src/gajim-remote.py:227 #, fuzzy msgid "Adds contact to roster" msgstr "cli" -#: ../src/gajim-remote.py:231 +# הוספת ×יש קשר חדש לחשבון ×–×” +#: ../src/gajim-remote.py:230 #, fuzzy msgid "Adds new contact to this account" msgstr "cli" -#: ../src/gajim-remote.py:236 +#: ../src/gajim-remote.py:235 #, fuzzy msgid "Returns current status (the global one unless account is specified)" msgstr "cli" -#: ../src/gajim-remote.py:243 +#: ../src/gajim-remote.py:242 #, fuzzy msgid "" "Returns current status message (the global one unless account is specified)" msgstr "cli" -#: ../src/gajim-remote.py:250 +#: ../src/gajim-remote.py:249 #, fuzzy msgid "Returns number of unread messages" msgstr "cli" -#: ../src/gajim-remote.py:254 +# פתיחת דו־שיח 'התחלת שיחה' +#: ../src/gajim-remote.py:253 #, fuzzy msgid "Opens 'Start Chat' dialog" msgstr "cli" -#: ../src/gajim-remote.py:256 +# התחלת שיחה ב×מצעות חשבון ×–×” +#: ../src/gajim-remote.py:255 #, fuzzy msgid "Starts chat, using this account" msgstr "cli" -#: ../src/gajim-remote.py:260 +# שליחת XML מות×× +#: ../src/gajim-remote.py:259 #, fuzzy msgid "Sends custom XML" msgstr "cli" -#: ../src/gajim-remote.py:262 +# â€XML לשליחה +#: ../src/gajim-remote.py:261 #, fuzzy msgid "XML to send" msgstr "cli" -#: ../src/gajim-remote.py:263 +# xml what? +# חשבון עבורו ישלח xml; במידה ×•×œ× ×¦×•×™×Ÿ, xml ישלח ×ל כל ×”×—×©×‘×•× ×•×ª +#: ../src/gajim-remote.py:262 #, fuzzy msgid "" "Account in which the xml will be sent; if not specified, xml will be sent to " "all accounts" msgstr "cli" -#: ../src/gajim-remote.py:269 +# ×©×™× ×•×™ ×”×ווט×ר +#: ../src/gajim-remote.py:268 #, fuzzy msgid "Change the avatar" msgstr "cli" -#: ../src/gajim-remote.py:271 +# ×ª×ž×•× ×” לשימוש +#: ../src/gajim-remote.py:270 #, fuzzy msgid "Picture to use" msgstr "cli" -#: ../src/gajim-remote.py:272 +# חשבון עבורו יוגדר ×”×ווט×ר; במידה ×•×œ× ×¦×•×™×Ÿ, ×”×ווט×ר יוגדר עבור כל ×”×—×©×‘×•× ×•×ª +#: ../src/gajim-remote.py:271 #, fuzzy msgid "" "Account in which the avatar will be set; if not specified, the avatar will " "be set for all accounts" msgstr "cli" -#: ../src/gajim-remote.py:278 +#: ../src/gajim-remote.py:277 #, fuzzy msgid "Handle a xmpp:/ uri" msgstr "cli" -#: ../src/gajim-remote.py:280 -msgid "?CLI:uri" -msgstr "" - -#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:279 #, fuzzy msgid "URI to handle" msgstr "cli" -#: ../src/gajim-remote.py:281 +#: ../src/gajim-remote.py:280 #, fuzzy msgid "Account in which you want to handle it" msgstr "cli" -#: ../src/gajim-remote.py:283 +# תוכן הודעה +#: ../src/gajim-remote.py:282 #, fuzzy msgid "Message content" msgstr "cli" -#: ../src/gajim-remote.py:287 +# הצטרפות ×ל חדר MUC +#: ../src/gajim-remote.py:286 #, fuzzy msgid "Join a MUC room" msgstr "cli" -#: ../src/gajim-remote.py:289 -msgid "?CLI:room" -msgstr "" - -#: ../src/gajim-remote.py:289 +#: ../src/gajim-remote.py:288 #, fuzzy msgid "Room JID" msgstr "cli" -#: ../src/gajim-remote.py:290 -msgid "?CLI:nick" -msgstr "" +# ×›×™× ×•×™ +#: ../src/gajim-remote.py:289 +#, fuzzy +msgid "nick" +msgstr "cli" -#: ../src/gajim-remote.py:290 +# ×›×™× ×•×™ לשימוש +#: ../src/gajim-remote.py:289 #, fuzzy msgid "Nickname to use" msgstr "cli" -#: ../src/gajim-remote.py:291 -msgid "?CLI:password" -msgstr "" +# מילת־מעבר +#: ../src/gajim-remote.py:290 +#, fuzzy +msgid "password" +msgstr "cli" -#: ../src/gajim-remote.py:291 +# מילת־מעבר בכדי ×œ×”×™×›× ×¡ ×ל החדר +#: ../src/gajim-remote.py:290 #, fuzzy msgid "Password to enter the room" msgstr "cli" -#: ../src/gajim-remote.py:292 +# החשבון ×©×‘×¨×¦×•× ×š להתחבר ×ž×ž× ×• ×ל החדר +#: ../src/gajim-remote.py:291 #, fuzzy msgid "Account from which you want to enter the room" msgstr "cli" -#: ../src/gajim-remote.py:297 +# × × ×œ×‘×“×•×§ ×× Gajim מורץ כעת +#: ../src/gajim-remote.py:296 #, fuzzy msgid "Check if Gajim is running" msgstr "cli" -#: ../src/gajim-remote.py:301 +# הצגה ×ו הסתרה של חלון ipython +#: ../src/gajim-remote.py:300 #, fuzzy msgid "Shows or hides the ipython window" msgstr "cli" -#: ../src/gajim-remote.py:328 +#: ../src/gajim-remote.py:327 #, fuzzy msgid "Missing argument \"contact_jid\"" msgstr "cli" -#: ../src/gajim-remote.py:350 +#: ../src/gajim-remote.py:349 #, fuzzy, python-format msgid "" "'%s' is not in your roster.\n" "Please specify account for sending the message." msgstr "cli" -#: ../src/gajim-remote.py:353 +# ×ין לך ××£ חשבון פעיל +#: ../src/gajim-remote.py:352 #, fuzzy msgid "You have no active account" msgstr "cli" -# × ×¨××” ×›×™ Gajim ×œ× ×ž×•×¨×¥. משכך ×ין ב×פשרותך לעשות שימוש ×‘×™×™×©×•× gajim-remote. -#: ../src/gajim-remote.py:406 +# × ×¨××” ×©×”×™×™×©×•× Gajim ×œ× ×ž×•×¨×¥. משכך ×ין ביכולתך לעשות שימוש ×‘×™×™×©×•× gajim-remote. +#: ../src/gajim-remote.py:405 #, fuzzy msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "cli" -#: ../src/gajim-remote.py:433 +#: ../src/gajim-remote.py:432 #, fuzzy, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" msgstr "cli" -#: ../src/gajim-remote.py:437 +#: ../src/gajim-remote.py:436 #, fuzzy msgid "Arguments:" msgstr "cli" -#: ../src/gajim-remote.py:441 +# ‫%s ×œ× × ×ž×¦×/ת +#: ../src/gajim-remote.py:440 #, fuzzy, python-format msgid "%s not found" msgstr "cli" -#: ../src/gajim-remote.py:447 -#, fuzzy, python-format +# gajim-remote +# CLI? +#: ../src/gajim-remote.py:446 +#, python-format msgid "" -"Usage:\n" -" %s command [arguments]\n" -"\n" +"Usage: %s command [arguments]\n" "Command is one of:\n" -msgstr "cli" +msgstr "" -#: ../src/gajim-remote.py:517 +#: ../src/gajim-remote.py:515 #, fuzzy, python-format msgid "" "Too many arguments. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "cli" -#: ../src/gajim-remote.py:522 +#: ../src/gajim-remote.py:520 #, fuzzy, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" "Type \"%(basename)s help %(command)s\" for more info" msgstr "cli" -# ×œ× × ×™×ª×Ÿ uri -#: ../src/gajim-remote.py:541 -#, fuzzy -msgid "No uri given" -msgstr "cli" - -#: ../src/gajim-remote.py:543 -#, fuzzy -msgid "Wrong uri" -msgstr "cli" - -#: ../src/gajim.py:135 ../src/history_manager.py:73 -#, fuzzy -msgid "Usage:" -msgstr "cli" - -#: ../src/gajim.py:137 ../src/history_manager.py:75 -#, fuzzy -msgid "Options:" -msgstr "cli" - -#: ../src/gajim.py:139 ../src/history_manager.py:77 -#, fuzzy -msgid "Show this help message and exit" -msgstr "cli" - -#: ../src/gajim.py:141 -#, fuzzy -msgid "Show only critical errors" -msgstr "cli" - -#: ../src/gajim.py:143 -#, fuzzy -msgid "Print xml stanzas and other debug information" -msgstr "cli" - -#: ../src/gajim.py:145 -#, fuzzy -msgid "Use defined profile in configuration directory" -msgstr "cli" - -#: ../src/gajim.py:147 -msgid "Set configuration directory" -msgstr "cli" - -#: ../src/gajim.py:149 -#, fuzzy -msgid "Configure logging system" -msgstr "cli" - -#: ../src/gajim.py:211 -#, fuzzy -msgid "Gajim needs X server to run. Quiting..." -msgstr "cli" - -#: ../src/gajim.py:213 -#, fuzzy, python-format -msgid "importing PyGTK failed: %s" -msgstr "cli" - -#: ../src/gajim.py:256 -#, fuzzy -msgid "Gajim needs PyGTK 2.22 or above" -msgstr "cli" - -#: ../src/gajim.py:257 -#, fuzzy -msgid "Gajim needs PyGTK 2.22 or above to run. Quiting..." -msgstr "cli" - -#: ../src/gajim.py:259 -#, fuzzy -msgid "Gajim needs GTK 2.22 or above" -msgstr "cli" - -#: ../src/gajim.py:260 +# ×œ× × ×™×ª×Ÿ URI +#: ../src/gajim-remote.py:539 #, fuzzy -msgid "Gajim needs GTK 2.22 or above to run. Quiting..." +msgid "No uri given" msgstr "cli" -#: ../src/gajim.py:269 +# â€URI שגוי +#: ../src/gajim-remote.py:541 #, fuzzy -msgid "Gajim needs pywin32 to run" +msgid "Wrong uri" msgstr "cli" -# component -#: ../src/gajim.py:270 -#, python-format -msgid "" -"Please make sure that Pywin32 is installed on your system. You can get it at " -"%s" -msgstr "×× × ×•×“× ×›×™ הרכיב Pywin32 מותקן במערכתך. ב×פשרותך להשיגו ×צל %s" - -#: ../src/gajim.py:410 -msgid "Gajim is already running" -msgstr "â€Gajim כבר מורץ כעת" - -#: ../src/gajim.py:411 -msgid "" -"Another instance of Gajim seems to be running\n" -"Run anyway?" -msgstr "" -"× ×¨××” ×›×™ תהליך ×חר של Gajim מורץ כעת\n" -"×”×× ×‘×¨×¦×•× ×š להריץ בכל ×–×ת?" - # ערכ×ת × ×•×©× #: ../src/gajim_themes_window.py:59 msgid "Theme" @@ -9685,8 +9784,9 @@ msgstr "מוטיב" #: ../src/gajim_themes_window.py:97 msgid "You cannot make changes to the default theme" -msgstr "×ין ב×פשרותך לערוך ×©×™× ×•×™×™× ×œ×ž×•×˜×™×‘ המשתמט" +msgstr "×ין ביכולתך לערוך ×©×™× ×•×™×™× ×œ×ž×•×˜×™×‘ המשתמט" +# clean was omitted #: ../src/gajim_themes_window.py:98 msgid "Please create a clean new theme with your desired name." msgstr "×× × ×¦×•×¨ מוטיב חדש ×¢× ×”×©× ×”×¨×¦×•×™ עליך." @@ -9698,237 +9798,245 @@ msgstr "×©× ×ž×•×˜×™×‘" #: ../src/gajim_themes_window.py:186 msgid "You cannot delete your current theme" -msgstr "×ין ביכולתך למחוק ×ת המוטיב ×”× ×•×›×—×™ שלך" +msgstr "×ין ב×פשרותך למחוק ×ת המוטיב ×”× ×•×›×—×™ שלך" +# another what? +# ר×שית, × × #: ../src/gajim_themes_window.py:187 -msgid "Please first choose another theme as your current theme." -msgstr "×× × ×‘×—×¨ תחילה במוטיב ×חר בתור המוטיב ×”× ×•×›×—×™ שלך." +#, fuzzy +msgid "Please first choose another for your current theme." +msgstr "× × ×œ×‘×—×•×¨ ×§×•×“× ×‘? ×חר עבור המוטיב ×”× ×•×›×—×™ שלך." -# ×‘×›×™× ×•×™ -#: ../src/groupchat_control.py:181 ../src/groupchat_control.py:1645 +#: ../src/groupchat_control.py:179 +#: ../src/groupchat_control.py:1569 #, python-format msgid "%(nick)s is now known as %(new_nick)s" -msgstr "%(nick)s ידוע/×” כעת בתור %(new_nick)s" +msgstr "‫%(nick)s ידוע/×” כעת ×‘×›×™× ×•×™ %(new_nick)s" -#: ../src/groupchat_control.py:236 +#: ../src/groupchat_control.py:234 msgid "Sending private message failed" msgstr "שליחת הודעה פרטית × ×›×©×œ×”" # ××™× ×š עוד בשיחת קבוצה ×ו שהמשתמש עזב #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:238 +#: ../src/groupchat_control.py:236 #, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." -msgstr "××™× ×š × ×•×›×— בשיחת קבוצה \"%(room)s\" ×ו שהמשתמש \"%(nick)s\" עזב." +msgstr "××™× ×š × ×•×›×— בקבוצת השיחה \"%(room)s\" ×ו שהמשתמש \"%(nick)s\" עזב." # ×œ×”×›× ×™×¡/להזין -#: ../src/groupchat_control.py:584 +#: ../src/groupchat_control.py:565 msgid "Insert Nickname" msgstr "שבץ ×©× ×›×™× ×•×™" -#: ../src/groupchat_control.py:767 +#: ../src/groupchat_control.py:748 msgid "Conversation with " msgstr "שיחה ×¢× " # Needs to be tested -#: ../src/groupchat_control.py:769 +#: ../src/groupchat_control.py:750 msgid "Continued conversation" msgstr "שיחה × ×ž×©×›×ª" -# â€%(jid)s הגדיר/×” ×ת ×”× ×•×©× ×ל %(subject)s -#: ../src/groupchat_control.py:1268 +# ‫%(jid)s הגדיר/×” ×ת ×”× ×•×©× ×ל %(subject)s +#: ../src/groupchat_control.py:1227 #, python-format msgid "%(nick)s has set the subject to %(subject)s" -msgstr "×”× ×•×©× ×”×•×’×“×¨ על ידי %(nick)s ×ל %(subject)s" +msgstr "×”× ×•×©× ×”×•×’×“×¨ על ידי %(nick)s ×ל ‎%(subject)s" +# Translated to: Any occupant to All of the occupants +# כל × ×•×›×— מורשה/יורשה #. Can be a presence (see chg_contact_status in groupchat_control.py) -#: ../src/groupchat_control.py:1286 ../src/groupchat_control.py:1587 +#: ../src/groupchat_control.py:1245 +#: ../src/groupchat_control.py:1511 msgid "Any occupant is allowed to see your full JID" -msgstr "כל × ×•×›×— רש××™ לר×ות ×ת כתובתך (JID) המל××”" +msgstr "כל ×”× ×•×›×—×™× ×ž×•×¨×©×™× ×œ×¨×ות ×ת כתובתך (JID) המל××”" -#: ../src/groupchat_control.py:1289 -msgid "Room now shows unavailable members" -msgstr "כרגע החדר מציג ×—×‘×¨×™× ×שר ××™× × ×–×ž×™× ×™×" +# BUG: members? +#: ../src/groupchat_control.py:1248 +msgid "Room now shows unavailable member" +msgstr "כרגע החדר מציג ×—×‘×¨×™× ×©××™× × ×–×ž×™× ×™×" -#: ../src/groupchat_control.py:1291 -msgid "Room now does not show unavailable members" -msgstr "כרגע החדר ×œ× ×ž×¦×™×’ ×—×‘×¨×™× ×שר ××™× × ×–×ž×™× ×™×" +# BUG: Room? (capital letter) +#: ../src/groupchat_control.py:1250 +msgid "room now does not show unavailable members" +msgstr "כרגע החדר ×œ× ×ž×¦×™×’ ×—×‘×¨×™× ×©××™× × ×–×ž×™× ×™×" # שייך, מיוחס -#: ../src/groupchat_control.py:1293 +#: ../src/groupchat_control.py:1252 msgid "A non-privacy-related room configuration change has occurred" -msgstr "×©×™× ×•×™ ×שר ××™× ×• קשור בפרטיות ×ירע בתצורת חדר" +msgstr "×רע ×©×™× ×•×™ בתצורת חדר ש××™× ×• קשור בפרטיות" #. Can be a presence (see chg_contact_status in groupchat_control.py) -#: ../src/groupchat_control.py:1297 +#: ../src/groupchat_control.py:1256 msgid "Room logging is now enabled" msgstr "×¨×™×©×•× ×¤×¢×™×œ×•×ª חדר מ×ופשר כעת" -#: ../src/groupchat_control.py:1299 +#: ../src/groupchat_control.py:1258 msgid "Room logging is now disabled" msgstr "×¨×™×©×•× ×¤×¢×™×œ×•×ª חדר ×ž× ×•×˜×¨×œ כעת" # This room is not anonymous # חדר ×œ× ×× ×•× ×™×ž×™ -#: ../src/groupchat_control.py:1301 +#: ../src/groupchat_control.py:1260 msgid "Room is now non-anonymous" msgstr "החדר ××™× ×• ×× ×•× ×™×ž×™" -#: ../src/groupchat_control.py:1304 +#: ../src/groupchat_control.py:1263 msgid "Room is now semi-anonymous" msgstr "החדר ×”×™× ×• ×× ×•× ×™×ž×™ למחצה" -#: ../src/groupchat_control.py:1307 +#: ../src/groupchat_control.py:1266 msgid "Room is now fully-anonymous" msgstr "החדר ×”×™× ×• ×× ×•× ×™×ž×™ לחלוטין" -# in or to? -#: ../src/groupchat_control.py:1580 ../src/groupchat_control.py:2241 -#: ../src/gui_interface.py:605 ../src/roster_window.py:3323 -#, python-format -msgid "%(jid)s has been invited in this room" -msgstr "%(jid)s הוזמן/×” ×ל חדר ×–×”" - #. Can be a message (see handle_event_gc_config_change in #. gajim.py) -#: ../src/groupchat_control.py:1592 +#: ../src/groupchat_control.py:1516 msgid "Room logging is enabled" msgstr "×¨×™×©×•× ×©×œ פעילות חדר ×”×™× ×• מ×ופשר" -#: ../src/groupchat_control.py:1594 +#: ../src/groupchat_control.py:1518 msgid "A new room has been created" msgstr "חדר חדש × ×•×¦×¨" # BUG: room nick # הקצה -#: ../src/groupchat_control.py:1597 +#: ../src/groupchat_control.py:1521 msgid "The server has assigned or modified your roomnick" msgstr "השרת הסב ×ו ×©×™× ×” ×ת ×›×™× ×•×™ החדר שלך" # סולק #. do not print 'kicked by None' -#: ../src/groupchat_control.py:1603 +#: ../src/groupchat_control.py:1527 #, python-format msgid "%(nick)s has been kicked: %(reason)s" -msgstr "%(nick)s × ×‘×¢×˜/×”: %(reason)s" +msgstr "‫%(nick)s × ×‘×¢×˜/×”: %(reason)s" # סולק -#: ../src/groupchat_control.py:1606 +#: ../src/groupchat_control.py:1530 #, python-format msgid "%(nick)s has been kicked by %(who)s: %(reason)s" -msgstr "%(nick)s × ×‘×¢×˜/×” על ידי %(who)s: %(reason)s" +msgstr "‫%(nick)s × ×‘×¢×˜/×” על ידי %(who)s: ‫%(reason)s" #. do not print 'banned by None' -#: ../src/groupchat_control.py:1615 +#: ../src/groupchat_control.py:1539 #, python-format msgid "%(nick)s has been banned: %(reason)s" -msgstr "%(nick)s × ×סר/×”: %(reason)s" +msgstr "‫%(nick)s × ×—×¡×/×”: %(reason)s" -#: ../src/groupchat_control.py:1618 +#: ../src/groupchat_control.py:1542 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" -msgstr "%(nick)s × ×סר/×” על ידי %(who)s: %(reason)s" +msgstr "‫%(nick)s × ×—×¡×/×” על ידי %(who)s: ‫%(reason)s" -# ×ת/×” ידוע/×” כעת בתור -#: ../src/groupchat_control.py:1629 ../src/groupchat_control.py:1745 +#: ../src/groupchat_control.py:1553 +#: ../src/groupchat_control.py:1657 #, python-format msgid "You are now known as %s" -msgstr "×”×›×™× ×•×™ החדש שלך ×”×•× %s" +msgstr "×›×™× ×•×™×™×š החדש ×”×•× %s" -# מן -#: ../src/groupchat_control.py:1699 ../src/groupchat_control.py:1704 -#: ../src/groupchat_control.py:1710 +#: ../src/groupchat_control.py:1611 +#: ../src/groupchat_control.py:1616 +#: ../src/groupchat_control.py:1622 #, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" -msgstr "%(nick)s הוסר/×” מתוך החדר (%(reason)s)" +msgstr "‫%(nick)s הוסר/×” מן החדר (%(reason)s)" -#: ../src/groupchat_control.py:1701 +#: ../src/groupchat_control.py:1613 msgid "affiliation changed" -msgstr "שיוך ×©×•× ×”" +msgstr "השיוך ×©×•× ×”" -#: ../src/groupchat_control.py:1706 +#: ../src/groupchat_control.py:1618 msgid "room configuration changed to members-only" msgstr "תצורת חדר ×©×•× ×ª×” ×ל חברי×-בלבד" # הדממת, ×“×™×ž×•× -#: ../src/groupchat_control.py:1712 +#: ../src/groupchat_control.py:1624 msgid "system shutdown" msgstr "סגירת מערכת" # שיוכה/ו של # × ×§×‘×¢ -#: ../src/groupchat_control.py:1795 +#: ../src/groupchat_control.py:1707 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "** השיוך של %(nick)s הוגדר ×ל %(affiliation)s על ידי %(actor)s" -#: ../src/groupchat_control.py:1799 +#: ../src/groupchat_control.py:1711 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "** השיוך של %(nick)s הוגדר ×ל %(affiliation)s" # תפקידה/ו של -#: ../src/groupchat_control.py:1814 +#: ../src/groupchat_control.py:1726 #, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "** התפקיד של %(nick)s הוגדר ×ל %(role)s על ידי %(actor)s" -#: ../src/groupchat_control.py:1818 +#: ../src/groupchat_control.py:1730 #, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "** התפקיד של %(nick)s הוגדר ×ל %(role)s" -#: ../src/groupchat_control.py:1848 +#: ../src/groupchat_control.py:1760 #, python-format msgid "%s has left" -msgstr "%s עזב/×”" +msgstr "‫%s עזב/×” ×ת החדר" -# הצטרף -#: ../src/groupchat_control.py:1853 +# הצטרף ×ל שיחת הקבוצה +#: ../src/groupchat_control.py:1765 #, python-format msgid "%s has joined the group chat" -msgstr "%s × ×›× ×¡/×” ×ל שיחת הקבוצה" +msgstr "‫%s × ×›× ×¡/×” ×ל החדר" -#: ../src/groupchat_control.py:2124 +#: ../src/groupchat_control.py:2020 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" -msgstr "×”×× ×תה בטוח ×›×™ ×‘×¨×¦×•× ×š לעזוב ×ת שיחת הקבוצה \"%s\"?" +msgstr "×”×× ×כן ×‘×¨×¦×•× ×š לעזוב ×ת שיחת הקבוצה \"%s\"?" # ×× ×ª×‘×—×¨ לסגור -#: ../src/groupchat_control.py:2126 -msgid "" -"If you close this window, you will be disconnected from this group chat." -msgstr "בסוגרך ×ת חלון ×–×”, ×תה ×ª× ×•×ª×§ מתוך שיחת קבוצה זו." +#: ../src/groupchat_control.py:2022 +msgid "If you close this window, you will be disconnected from this group chat." +msgstr "בסוגרך ×ת חלון ×–×”, ×תה ×ª× ×•×ª×§ מן שיחת קבוצה זו." + +#: ../src/groupchat_control.py:2026 +#: ../src/gui_interface.py:704 +#: ../src/gui_interface.py:1411 +#: ../src/gui_interface.py:1451 +#: ../src/gui_interface.py:1492 +#: ../src/message_window.py:222 +#: ../src/roster_window.py:3064 +#: ../src/roster_window.py:3799 +#: ../src/roster_window.py:4612 +msgid "_Do not ask me again" +msgstr "_× × ×œ× ×œ×©×ול ×ותי שוב" -#: ../src/groupchat_control.py:2165 +#: ../src/groupchat_control.py:2060 msgid "Changing Subject" msgstr "×©×™× ×•×™ × ×•×©×" -#: ../src/groupchat_control.py:2166 +#: ../src/groupchat_control.py:2061 msgid "Please specify the new subject:" -msgstr "×× × ×¦×™×™×Ÿ ×ת ×”× ×•×©× ×”×—×“×©:" +msgstr "× × ×œ×¦×™×™×Ÿ ×ת ×”× ×•×©× ×”×—×“×©:" -#: ../src/groupchat_control.py:2173 +#: ../src/groupchat_control.py:2068 msgid "Changing Nickname" msgstr "×©×™× ×•×™ ×©× ×›×™× ×•×™" -#: ../src/groupchat_control.py:2174 +#: ../src/groupchat_control.py:2069 msgid "Please specify the new nickname you want to use:" -msgstr "×× × ×¦×™×™×Ÿ ×ת ×©× ×”×›×™× ×•×™ החדש ×שר ×‘×¨×¦×•× ×š לעשות בו שימוש:" - -#: ../src/groupchat_control.py:2199 -msgid "The group chat Jabber ID has not allowed characters." -msgstr "מזהה Jabber של שיחת קבוצה מכילה ×ª×•×•×™× ×סורי×." +msgstr "× × ×œ×¦×™×™×Ÿ ×ת ×©× ×”×›×™× ×•×™ החדש ×©×‘×¨×¦×•× ×š לעשות בו שימוש:" # Destroying is "at this moment". It should be Destroy without ing #. Ask for a reason -#: ../src/groupchat_control.py:2205 +#: ../src/groupchat_control.py:2100 #, python-format msgid "Destroying %s" msgstr "החרבת ‫%s" # בחרת להחריב ב×ופן מוחלט ×ת חדר ×–×” -#: ../src/groupchat_control.py:2206 +#: ../src/groupchat_control.py:2101 msgid "" "You are going to definitively destroy this room.\n" "You may specify a reason below:" @@ -9937,25 +10045,34 @@ msgstr "" "ב×פשרותך לציין סיבה למטה:" # ×ž×§×•× ×ž×¤×’×© חלופי -#: ../src/groupchat_control.py:2208 +#: ../src/groupchat_control.py:2103 msgid "You may also enter an alternate venue:" msgstr "ב×פשרותך להזין זירה ××œ×˜×¨× ×˜×™×‘×™×ª:" +# in or to? +#: ../src/groupchat_control.py:2135 +#: ../src/gui_interface.py:604 +#: ../src/roster_window.py:3390 +#, python-format +msgid "%(jid)s has been invited in this room" +msgstr "‫%(jid)s ×”×•×–×ž× ×” בחדר ×–×”" + #. ask for reason -#: ../src/groupchat_control.py:2408 +#: ../src/groupchat_control.py:2300 #, python-format msgid "Kicking %s" msgstr "בעיטת ‫%s" -#: ../src/groupchat_control.py:2409 ../src/groupchat_control.py:2743 +#: ../src/groupchat_control.py:2301 +#: ../src/groupchat_control.py:2633 msgid "You may specify a reason below:" msgstr "ב×פשרותך לציין סיבה למטה:" #. ask for reason -#: ../src/groupchat_control.py:2742 +#: ../src/groupchat_control.py:2632 #, python-format msgid "Banning %s" -msgstr "×סירת ‫%s" +msgstr "חסימת ‫%s" #: ../src/gtkexcepthook.py:46 msgid "A programming error has been detected" @@ -9964,272 +10081,272 @@ msgstr "×ותרה שגי×ת ×ª×›× ×•×ª" # ×בל # ככל ×”× ×¨××” שגי××” זו ××™× ×” חמורה, ×ך בכל ×–×ת יש צורך לדווחה למפתחי×. #: ../src/gtkexcepthook.py:47 -msgid "" -"It probably is not fatal, but should be reported to the developers " -"nonetheless." -msgstr "" -"שגי××” זו ××™× ×” חמורה ככל ×”× ×¨××”, ×ך בכל ×–×ת ×§×™×™× ×”×›×¨×— לדווח עליה למפתחי×." +msgid "It probably is not fatal, but should be reported to the developers nonetheless." +msgstr "שגי××” זו ××™× ×” חמורה ככל ×”× ×¨××”, ×ך בכל ×–×ת ×§×™×™× ×”×¦×•×¨×š לדווחה ×ל המפתחי×." #: ../src/gtkexcepthook.py:54 msgid "_Report Bug" -msgstr "_דווחו על בעיה" +msgstr "_דיווח על בעיה" #: ../src/gtkexcepthook.py:76 msgid "Details" msgstr "פרטי×" -#: ../src/gtkgui_helpers.py:349 +#: ../src/gtkgui_helpers.py:348 msgid "Error reading file:" msgstr "שגי××” בקרי×ת הקובץ:" -#: ../src/gtkgui_helpers.py:352 +#: ../src/gtkgui_helpers.py:351 msgid "Error parsing file:" msgstr "שגי××” ×‘× ×™×ª×•×— הקובץ:" #. do not traceback (could be a permission problem) #. we talk about a file here -#: ../src/gtkgui_helpers.py:393 +#: ../src/gtkgui_helpers.py:392 #, python-format msgid "Could not write to %s. Session Management support will not work" -msgstr "×œ× ×”×™×ª×” ×פשרות לכתוב ×ל %s. תמיכה עבור × ×™×”×•×œ סשן ×œ× ×ª×¢×‘×•×“" +msgstr "×œ× × ×™×ª×Ÿ לכתוב ×ל %s. תמיכה עבור × ×™×”×•×œ סשן ×œ× ×ª×¢×‘×•×“" -# â€Gajim ××™× ×• הלקוח המשתמט עבור Jabber +# הלקוח המשתמט #. xmpp: is currently handled by another program, so ask the user -#: ../src/gtkgui_helpers.py:767 +#: ../src/gtkgui_helpers.py:766 msgid "Gajim is not the default Jabber client" -msgstr "â€Gajim ××™× ×• לקוח Jabber ברירת המחדל" +msgstr "‫Gajim ××™× ×• לקוח ברירת המחדל עבור Jabber" -#: ../src/gtkgui_helpers.py:768 +#: ../src/gtkgui_helpers.py:767 msgid "Would you like to make Gajim the default Jabber client?" msgstr "×”×× ×‘×¨×¦×•× ×š להפוך ×ת Gajim ללקוח Jabber ברירת המחדל?" -#: ../src/gtkgui_helpers.py:769 +#: ../src/gtkgui_helpers.py:768 msgid "Always check to see if Gajim is the default Jabber client on startup" msgstr "בדוק תמיד ×× Gajim ×”×™× ×• לקוח Jabber ברירת המחדל בעת הפעלה" -#: ../src/gtkgui_helpers.py:836 +#: ../src/gtkgui_helpers.py:835 msgid "Extension not supported" msgstr "הרחבה ×œ× × ×ª×ž×›×ª" -#: ../src/gtkgui_helpers.py:837 +# Needs to be tested +# שמירה ×‘×©× ×חר +#: ../src/gtkgui_helpers.py:836 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" -msgstr "×ין ×פשרות לשמור ×ª×ž×•× ×” בפורמט %(type)s. לשמור בתור %(new_filename)s?" +msgstr "×œ× × ×™×ª×Ÿ לשמור ×ª×ž×•× ×” בתסדיר %(type)s. שמירה ×‘×©× %(new_filename)s?" -# בתור -#: ../src/gtkgui_helpers.py:873 +#: ../src/gtkgui_helpers.py:872 msgid "Save Image as..." msgstr "שמירת ×ª×ž×•× ×” בש×..." #. we are banned #. group chat does not exist -#: ../src/gui_interface.py:134 ../src/gui_interface.py:298 -#: ../src/gui_interface.py:307 ../src/gui_interface.py:313 -#: ../src/gui_interface.py:316 ../src/gui_interface.py:319 -#: ../src/gui_interface.py:324 +#: ../src/gui_interface.py:133 +#: ../src/gui_interface.py:297 +#: ../src/gui_interface.py:306 +#: ../src/gui_interface.py:312 +#: ../src/gui_interface.py:315 +#: ../src/gui_interface.py:318 +#: ../src/gui_interface.py:323 msgid "Unable to join group chat" -msgstr "×ין ×פשרות להצטרף ×ל שיחת קבוצה" +msgstr "×œ× × ×™×ª×Ÿ להצטרף ×ל שיחת קבוצה" -#: ../src/gui_interface.py:135 +#: ../src/gui_interface.py:134 #, python-format msgid "" "Your desired nickname in group chat %s is in use or registered by another " "occupant.\n" "Please specify another nickname below:" msgstr "" -"×©× ×”×›×™× ×•×™ ×שר מבוקש על ידך בתוך שיחות הקבוצה %s מצוי בשימוש ×ו ×¨×©×•× ×‘×™×“×™ " -"× ×•×›×— ×חר.\n" -"×× × ×¦×™×™×Ÿ ×©× ×›×™× ×•×™ ×חר למטה:" +"×©× ×›×™× ×•×™×™×š המבוקש בשיחת הקבוצה %s ×”×™× ×• בשימוש ×ו ×¨×©×•× ×‘×™×“×™ × ×•×›×— ×חר.\n" +"× × ×œ×¦×™×™×Ÿ ×©× ×›×™× ×•×™ ×חר למטה:" -#: ../src/gui_interface.py:138 +#: ../src/gui_interface.py:137 msgid "Always use this nickname when there is a conflict" msgstr "השתמש תמיד ×‘×©× ×›×™× ×•×™ ×–×” ×›×שר קיימת ×”×ª× ×’×©×•×ª" -#: ../src/gui_interface.py:155 +#: ../src/gui_interface.py:154 msgid "Do you accept this request?" msgstr "×”×× ×œ×§×‘×œ ×ת בקשה זו?" -#: ../src/gui_interface.py:157 +#: ../src/gui_interface.py:156 #, python-format msgid "Do you accept this request on account %s?" -msgstr "×”×× ×œ×§×‘×œ ×ת בקשה זו בחשבון %s?" +msgstr "×”×× ×œ×§×‘×œ ×ת בקשה זו בחשבון ‫%s?" # Needs to be tested # זהות # ×ישור -#: ../src/gui_interface.py:160 +#: ../src/gui_interface.py:159 #, python-format msgid "HTTP (%(method)s) Authorization for %(url)s (id: %(id)s)" -msgstr "הרש×ת HTTP (%(method)s) עבור %(url)s (מזהה: %(id)s)" +msgstr "הרש×ת HTTP (%(method)s) עבור ‫%(url)s ‫(id: ‫%(id)s)" -#: ../src/gui_interface.py:203 ../src/notify.py:282 +#: ../src/gui_interface.py:202 +#: ../src/notify.py:282 msgid "Connection Failed" -msgstr "התחברות × ×›×©×œ×”" +msgstr "ההתחברות × ×›×©×œ×”" -#: ../src/gui_interface.py:287 +# keep מילת־מעבר +# על ×ž× ×ª +# להקלידה +# להזין ×ותה +#: ../src/gui_interface.py:286 #, python-format msgid "A Password is required to join the room %s. Please type it." -msgstr "× ×“×¨×©×ª מילת מעבר כדי להצטרף ×ל החדר %s. ×× × ×”×§×œ×“ ×ותה." +msgstr "× ×“×¨×©×ª מילת־מעבר כדי להצטרף ×ל החדר %s. × × ×œ×”×§×œ×™×“×”." -# מוצתה -#: ../src/gui_interface.py:299 +# כמות משתמש מרבית עבור ‫<b>%s</b> הושגה +#: ../src/gui_interface.py:298 #, python-format msgid "Maximum number of users for <b>%s</b> has been reached" -msgstr "כמות ×ž×©×ª×ž×©×™× ×ž×¨×‘×™×ª עבור <b>%s</b> הושגה" +msgstr "הושגה כמות משתמש מרבית עבור ‫<b>%s</b>" # בכתובת -#: ../src/gui_interface.py:308 +#: ../src/gui_interface.py:307 #, python-format msgid "You are banned from group chat <b>%s</b>." -msgstr "× ×סרת מתוך שיחת קבוצה בכתובת <b>%s</b>." +msgstr "× ×—×¡×ž×ª מן שיחת קבוצה ×צל ‫<b>%s</b>." -#: ../src/gui_interface.py:314 +#: ../src/gui_interface.py:313 #, python-format msgid "Group chat <b>%s</b> does not exist." msgstr "שיחת קבוצה <b>%s</b> ×œ× ×§×™×™×ž×ª." -#: ../src/gui_interface.py:317 +#: ../src/gui_interface.py:316 msgid "Group chat creation is restricted." msgstr "יצירת שיחות קבוצה ×”×™× ×” מוגבלת." -#: ../src/gui_interface.py:320 +#: ../src/gui_interface.py:319 #, python-format msgid "Your registered nickname must be used in group chat <b>%s</b>." -msgstr "×©× ×”×›×™× ×•×™ ×”×¨×©×•× ×©×œ×š מוכרח להיות בשימוש בתוך שיחת קבוצה <b>%s</b>." +msgstr "×©× ×›×™× ×•×™×™×š ×”×¨×©×•× ×ž×•×›×¨×— להיות בשימוש בשיחת קבוצה <b>%s</b>." -#: ../src/gui_interface.py:325 +#: ../src/gui_interface.py:324 #, python-format msgid "You are not in the members list in groupchat %s." -msgstr "××™× ×š ברשימת ×”×—×‘×¨×™× ×‘×ª×•×š שיחות קבוצה %s." +msgstr "××™× ×š ברשימת ×”×—×‘×¨×™× ×‘×©×™×—×ª קבוצה ‫%s." -#: ../src/gui_interface.py:418 ../src/gui_interface.py:422 +#: ../src/gui_interface.py:417 +#: ../src/gui_interface.py:421 #, python-format msgid "Error %(code)s: %(msg)s" -msgstr "שגי××” %(code)s: â€%(msg)s" +msgstr "שגי××” ‫%(code)s: ‫%(msg)s" -#: ../src/gui_interface.py:474 ../src/notify.py:284 +#: ../src/gui_interface.py:473 +#: ../src/notify.py:284 msgid "Subscription request" msgstr "בקשת הרשמה" -#: ../src/gui_interface.py:499 +#: ../src/gui_interface.py:498 msgid "Authorization accepted" msgstr "התקבלה הרש××”" -#: ../src/gui_interface.py:500 +#: ../src/gui_interface.py:499 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "×”×•×¢× ×§×” לך הרש××” מ×ת \"%s\" לר×ות ×ת מצב החיבור שלו ×ו שלה." -#: ../src/gui_interface.py:508 +#: ../src/gui_interface.py:507 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "×יש קשר \"%s\" הסיר הרשמה ממך" -#: ../src/gui_interface.py:509 +#: ../src/gui_interface.py:508 msgid "" "You will always see him or her as offline.\n" "Do you want to remove him or her from your contact list?" msgstr "" -"×יש קשר ×–×” תמיד ייר××” עבורך במצב ×œ× ×ž×§×•×•×Ÿ.\n" -"×”×× ×‘×¨×¦×•× ×š להסיר ×ותו ×ו ×ותה מתוך רשימת הקשר שלך?" +"×יש קשר ×–×” תמיד יר××” עבורך במצב ×œ× ×ž×§×•×•×Ÿ.\n" +"×”×× ×‘×¨×¦×•× ×š להסירו ×ו להסירה מן רשימת הקשר שלך?" -#: ../src/gui_interface.py:530 ../src/notify.py:286 +#: ../src/gui_interface.py:529 +#: ../src/notify.py:286 msgid "Unsubscribed" msgstr "×œ× ×¨×©×•×" -#: ../src/gui_interface.py:541 +#: ../src/gui_interface.py:540 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "יצירת קשר ×¢× \"%s\" ×œ× ×”×™×ª×” × ×™×ª× ×ª לביסוס" -#: ../src/gui_interface.py:625 +# דחתה ×ת ×”×”×–×ž× ×” +#: ../src/gui_interface.py:624 #, python-format msgid "%(jid)s declined the invitation: %(reason)s" -msgstr "â€%(jid)s סרב/×” ×ת ×”×”×–×ž× ×”: %(reason)s" +msgstr "‫%(jid)s סרב/×” ×œ×”×–×ž× ×”: %(reason)s" -#: ../src/gui_interface.py:629 +#: ../src/gui_interface.py:628 #, python-format msgid "%(jid)s declined the invitation" -msgstr "â€%(jid)s סרב/×” ×œ×”×–×ž× ×”" +msgstr "‫%(jid)s סרב/×” ×œ×”×–×ž× ×”" -#: ../src/gui_interface.py:658 -msgid "" -"You configured Gajim to use OpenPGP agent, but there is no OpenPGP agent " -"running or it returned a wrong passphrase.\n" -msgstr "" -"הגדרת ×ת Gajim לעשות שימוש בסוכן OpenPGP, ×ך ×ין כעת סוכן OpenPGP ×שר מופעל " -"×ו שזה החזיר מימרת-סיסמה שגויה.\n" +#: ../src/gui_interface.py:657 +msgid "You configured Gajim to use GPG agent, but there is no GPG agent running or it returned a wrong passphrase.\n" +msgstr "הגדרת ×ת Gajim לעשות שימוש בסוכן GPG, ×ך ×ין כעת סוכן GPG מופעל ×ו ×©×”×•× ×”×—×–×™×¨ מימרת-סיסמה שגויה.\n" -#: ../src/gui_interface.py:661 ../src/gui_interface.py:669 +# Would it be ok to write: an OpenPGP +#: ../src/gui_interface.py:659 +#: ../src/gui_interface.py:667 msgid "You are currently connected without your OpenPGP key." -msgstr "התחברותך בוצעה ×œ×œ× ×ž×¤×ª×— OpenPGP." +msgstr "התחברותך מבוצעת ×œ×œ× ×ž×¤×ª×— OpenPGP." -#: ../src/gui_interface.py:663 +#: ../src/gui_interface.py:661 msgid "Your passphrase is incorrect" -msgstr "מימרת סיסמתך ×”×™× ×” שגויה" +msgstr "מימרת־סיסמתך ×”×™× ×” שגויה" -#: ../src/gui_interface.py:668 -msgid "OpenPGP Passphrase Incorrect" -msgstr "מימרת סיסמה OpenPGP שגויה" +#: ../src/gui_interface.py:666 +msgid "OpenGPG Passphrase Incorrect" +msgstr "מימרת־סיסמה OpenGPG שגויה" -#: ../src/gui_interface.py:681 +# מימרת־סיסמה של תעודת +#: ../src/gui_interface.py:679 msgid "Certificate Passphrase Required" -msgstr "× ×“×¨×©×ª מימרת סיסמה של תעודת" +msgstr "× ×“×¨×©×ª מימרת־סיסמת תעודת" -#: ../src/gui_interface.py:682 +#: ../src/gui_interface.py:680 #, python-format msgid "Enter the passphrase for the certificate for account %s" -msgstr "הזן מימרת סיסמה עבור התעודה עבור חשבון %s" +msgstr "× × ×œ×”×–×™×Ÿ מימרת־סיסמה עבור התעודה עבור חשבון %s" -#: ../src/gui_interface.py:704 -msgid "OpenPGP key not trusted" -msgstr "מפתח OpenPGP ×œ× ×ž×”×™×ž×Ÿ " +#: ../src/gui_interface.py:702 +msgid "GPG key not trusted" +msgstr "מפתח GPG ×œ× ×ž×”×™×ž×Ÿ " # Changed really with still # Sure = בטוח # Really = ב×מת # Still = עדיין -#: ../src/gui_interface.py:704 -msgid "" -"The OpenPGP key used to encrypt this chat is not trusted. Do you really want " -"to encrypt this message?" -msgstr "" -"מפתח OpenPGP המשמש ×œ×”×¦×¤× ×ª שיחה זו ××™× ×• מהימן. ×”×× ×‘×מת יש ×‘×¨×¦×•× ×š להצפין ×ת " -"הודעה זו?" +#: ../src/gui_interface.py:702 +msgid "The GPG key used to encrypt this chat is not trusted. Do you really want to encrypt this message?" +msgstr "מפתח GPG המשמש ×œ×”×¦×¤× ×ª שיחה זו ××™× ×• מהימן. ×”×× ×¢×“×™×™×Ÿ יש ×‘×¨×¦×•× ×š להצפין הודעה זו?" -#: ../src/gui_interface.py:717 -msgid "" -"Gnome Keyring is installed but not correctly started (environment variable " -"probably not correctly set)" -msgstr "" -"×”×™×™×©×•× Gnome Keyring ×”×™× ×• מותקן ×ך ×œ× ×”×•×¤×¢×œ כר×וי (×›× ×¨××” ×ž×©×ª× ×” סביבה ×œ× " -"הוגדר כר×וי)" +#: ../src/gui_interface.py:715 +msgid "Gnome Keyring is installed but not correctly started (environment variable probably not correctly set)" +msgstr "×”×™×™×©×•× Gnome Keyring ×”×™× ×• מותקן ×ך ×œ× ×”×•×¤×¢×œ כר×וי (×›× ×¨××” ×ž×©×ª× ×” סביבה ×œ× ×”×•×’×“×¨ כר×וי)" # BUG: refreshed # ×סימון -#: ../src/gui_interface.py:755 -msgid "" -"Please copy / paste the refresh token from the website that has just been " -"opened." -msgstr "×× × ×”×¢×ª×§ / הדבק ×ת ×”×ות ×”×¨×¢× ×Ÿ מתוך ×תר הרשת ×שר ×–×” עתה × ×¤×ª×—." +#: ../src/gui_interface.py:753 +msgid "Please copy / paste the refresh token from the website that has just been opened." +msgstr "× × ×œ×”×¢×ª×™×§ / להדביק ×ת ×”×ות ×”×¨×¢× ×Ÿ מן ×תר הרשת שזה עתה × ×¤×ª×—." -#: ../src/gui_interface.py:758 +# תעודות +#: ../src/gui_interface.py:756 msgid "Oauth2 Credentials" msgstr "×ישורי Oauth2" -#: ../src/gui_interface.py:856 +# עבור +#: ../src/gui_interface.py:846 #, python-format msgid "New mail on %(gmail_mail_address)s" msgstr "דו×״ל חדש ×צל %(gmail_mail_address)s" -#: ../src/gui_interface.py:858 +#: ../src/gui_interface.py:848 #, python-format msgid "You have %d new mail conversation" msgid_plural "You have %d new mail conversations" msgstr[0] "יש לך שיחת דו×ר חדשה %d" msgstr[1] "יש לך %d שיחות דו×ר חדשות" -#: ../src/gui_interface.py:871 +#: ../src/gui_interface.py:861 #, python-format msgid "" "\n" @@ -10244,109 +10361,105 @@ msgstr "" "× ×•×©×: %(subject)s\n" "%(snippet)s" -#: ../src/gui_interface.py:941 +# ×ליך +#: ../src/gui_interface.py:931 #, python-format msgid "%s wants to send you a file." -msgstr "â€%s רוצה לשלוח לך קובץ." +msgstr "‫%s רוצה לשלוח לך קובץ." -#: ../src/gui_interface.py:1038 +#: ../src/gui_interface.py:1028 msgid "File Transfer Failed" msgstr "העברת קובץ × ×›×©×œ×”" -#: ../src/gui_interface.py:1059 +#: ../src/gui_interface.py:1049 #, python-format msgid "You successfully received %(filename)s from %(name)s." msgstr "קיבלת בהצלחה ×ת %(filename)s מן %(name)s." -#: ../src/gui_interface.py:1063 +#: ../src/gui_interface.py:1053 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "העברת קובץ %(filename)s מן %(name)s × ×¢×¦×¨×”." #. ft hash error -#: ../src/gui_interface.py:1067 +#: ../src/gui_interface.py:1057 #, python-format msgid "File transfer of %(filename)s from %(name)s failed." msgstr "העברת קובץ %(filename)s מן %(name)s × ×›×©×œ×”." -#: ../src/gui_interface.py:1080 +#: ../src/gui_interface.py:1070 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "שלחת בהצלחה ×ת %(filename)s ×ל %(name)s." -#: ../src/gui_interface.py:1084 +#: ../src/gui_interface.py:1074 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "העברת קובץ %(filename)s ×ל %(name)s × ×¢×¦×¨×”." #. ft hash error -#: ../src/gui_interface.py:1088 +#: ../src/gui_interface.py:1078 #, python-format msgid "File transfer of %(filename)s to %(name)s failed." msgstr "העברת הקובץ %(filename)s ×ל %(name)s × ×›×©×œ×”." -#: ../src/gui_interface.py:1163 +#: ../src/gui_interface.py:1153 msgid "Unable to decrypt message" -msgstr "×ין ×פשרות ×œ×¤×¢× ×— ×ת ההודעה" +msgstr "×œ× × ×™×ª×Ÿ ×œ×¤×¢× ×— ×ת ההודעה" # ×”×ª× ×’×©×•×™×•×ª, × ×™×’×•×“×™×, ×§×•× ×¤×œ×™×§×˜ -#: ../src/gui_interface.py:1175 +#: ../src/gui_interface.py:1165 msgid "Username Conflict" msgstr "×”×ª× ×’×©×•×ª ×©× ×ž×©×ª×ž×©" -#: ../src/gui_interface.py:1176 +#: ../src/gui_interface.py:1166 msgid "Please type a new username for your local account" msgstr "×× × ×”×§×œ×“ ×©× ×ž×©×ª×ž×© חדש עבור ×—×©×‘×•× ×š המקומי" -#: ../src/gui_interface.py:1191 +#: ../src/gui_interface.py:1181 msgid "Resource Conflict" msgstr "×”×ª× ×’×©×•×ª מש×ב" -#: ../src/gui_interface.py:1192 -msgid "" -"You are already connected to this account with the same resource. Please " -"type a new one" -msgstr "×”×™× ×š כבר מחובר ×ל חשבון ×–×” ב×מצעות ×ותו מש×ב. ×× × ×”×§×œ×“ ×חד חדש." +#: ../src/gui_interface.py:1182 +msgid "You are already connected to this account with the same resource. Please type a new one" +msgstr "×”×™× ×š כבר מחובר ×ל חשבון ×–×” ב×מצעות ×ותו מש×ב. × × ×œ×”×§×œ×™×“ מש×ב חדש." #. TODO: we should use another pixmap ;-) -#: ../src/gui_interface.py:1247 +#: ../src/gui_interface.py:1237 #, python-format msgid "%s wants to start a voice chat." -msgstr "â€%s רוצה להתחיל שיחה קולית." +msgstr "‫%s רוצה להתחיל שיחה קולית." -#: ../src/gui_interface.py:1250 +# שיחת שמע +#: ../src/gui_interface.py:1240 msgid "Voice Chat Request" msgstr "בקשה לשיחה קולית" -#: ../src/gui_interface.py:1337 +#: ../src/gui_interface.py:1327 msgid "Error verifying SSL certificate" msgstr "שגי××” ב×ימות תעודת SSL" -#: ../src/gui_interface.py:1338 +#: ../src/gui_interface.py:1328 #, 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 "" -"×ירעה שגי××” ב×ימות תעודת SSL של שרת ×”Ö¾Jabber שלך: %(error)s\n" +"×רעה שגי××” ב×ימות תעודת SSL של שרת ×”Ö¾Jabber שלך: %(error)s\n" "×”×× ×¢×“×™×™×Ÿ יש ×‘×¨×¦×•× ×š להתחבר ×ל שרת ×–×”?" -#: ../src/gui_interface.py:1347 +# התעלמות +#: ../src/gui_interface.py:1337 msgid "Ignore this error for this certificate." msgstr "×”×ª×¢×œ× ×ž×©×’×™××” זו עבור תעודה זו." -#: ../src/gui_interface.py:1355 -#, python-format -msgid "SSL Certificate Verification for %s" -msgstr "×ימות תעודת SSL עבור %s" - -#: ../src/gui_interface.py:1374 +#: ../src/gui_interface.py:1362 msgid "SSL certificate error" msgstr "שגי×ת תעודת SSL" # ×™×©× ×” -#: ../src/gui_interface.py:1375 +#: ../src/gui_interface.py:1363 #, python-format msgid "" "It seems the SSL certificate of account %(account)s has changed or your " @@ -10356,27 +10469,54 @@ msgid "" "\n" "Do you still want to connect and update the fingerprint of the certificate?" msgstr "" -"× ×¨××” שתעודת SSL של חשבון %(account)s ×©×•× ×ª×” ×ו שהחיבור שלך × ×¤×¨×¥ כעת.\n" +"× ×¨××” שתעודת SSL של חשבון %(account)s ×©×•× ×ª×” ×ו שחיבורך × ×¤×¨×¥ כעת.\n" "טביעת ×צבע קודמת: %(old)s\n" "טביעת ×צבע חדשה: %(new)s\n" "\n" "×”×× ×¢×“×™×™×Ÿ יש ×‘×¨×¦×•× ×š להתחבר ולעדכן ×ת טביעת ×”×צבע של התעודה?" -#: ../src/gui_interface.py:1447 -msgid "" -"You are about to send your password on an insecure connection. You should " -"install PyOpenSSL to prevent that. Are you sure you want to do that?" -msgstr "" -"×”×™× ×š על סף שליחת סיסמתך על ×¤× ×™ חיבור ×œ× ×ž×ובטח. עליך להתקין PyOpenSSL בכדי " -"×œ×ž× ×•×¢ ×–×ת. ×”×× ×תה בטוח ×›×™ ×‘×¨×¦×•× ×š להתחבר?" +#: ../src/gui_interface.py:1402 +#: ../src/gui_interface.py:1446 +#: ../src/gui_interface.py:1488 +msgid "Insecure connection" +msgstr "חיבור ×œ× ×ž×ובטח" -#: ../src/gui_interface.py:1489 +# BUG: to the server > to a serverr > to server +# Added: will be exchanged with the other end will not be encrypted +# ×”×™× ×š על סף התחברות ×ל שרת ×¢× ×—×™×‘×•×¨ ×œ× ×ž×ובטח. משמעות הדבר ×”×™× ×©×›×œ השיחות שלך שיוחלפו ×¢× ×”×§×¦×” ×”×©× ×™ ×œ× ×™×”×™×• ×ž×•×¦×¤× ×•×ª. ×”×× ×¢×“×™×™×Ÿ ×‘×¨×¦×•× ×š להתחבר? +# discouraged: +# > deprived > לקוי בחסר +# > dissuade > dissuade from > ×œ×”× ×™× ×ž- +#: ../src/gui_interface.py:1403 +#, python-format msgid "" -"You are about to send your password unencrypted on an insecure connection. " +"You are about to connect to the account %(account)s (%(server)s) with an insecure connection. This means all your conversations will be exchanged unencrypted. This type of connection is really discouraged.\n" "Are you sure you want to do that?" msgstr "" -"×”×™× ×š על סף שליחת סיסמתך ב×ופן ×œ× ×ž×•×¦×¤×Ÿ על ×¤× ×™ חיבור ×œ× ×ž×ובטח. ×”×× ×תה בטוח " -"×›×™ ×‘×¨×¦×•× ×š לעשות ×–×ת?" +"×”×™× ×š על סף התחברות ×ל החשבון ‫%(account)s ‫(%(server)s) ב×מצעות חיבור ×œ× ×ž×ובטח. משמעות הדבר ×”×™× ×©×›×œ השיחות שיוחלפו ×¢× ×”×§×¦×” ×”×©× ×™ ×œ× ×™×”×™×• ×ž×•×¦×¤× ×•×ª. רצוי ×œ×”×™×ž× ×¢ ×ž×—×™×‘×•×¨×™× ×ž×˜×™×¤×•×¡ ×–×”.\n" +"×”×× ×‘×מת ×©×‘×¨×¦×•× ×š להתחבר?" + +# The word 'Really' was omitted +# ×”× × ×™ רוצה +# ב×ופן ×œ× ×‘×˜×•×— +# בצורה ×œ× ×‘×˜×•×—×” +#: ../src/gui_interface.py:1409 +#: ../src/gui_interface.py:1450 +#: ../src/gui_interface.py:1491 +msgid "Yes, I really want to connect insecurely" +msgstr "כן, ×‘×¨×¦×•× ×™ להתחבר בשיטה ×œ× ×‘×˜×•×—×”" + +#: ../src/gui_interface.py:1410 +msgid "Gajim will NOT connect unless you check this box" +msgstr "‫Gajim ×œ× ×™×ª×—×‘×¨ ××œ× ×× ×›×Ÿ תיבה זו תסומן" + +#: ../src/gui_interface.py:1447 +msgid "You are about to send your password on an insecure connection. You should install PyOpenSSL to prevent that. Are you sure you want to do that?" +msgstr "×”×™× ×š על סף שליחת סיסמתך על ×¤× ×™ חיבור ×œ× ×ž×ובטח. עליך להתקין PyOpenSSL בכדי ×œ×ž× ×•×¢ ×–×ת. ×”×× ×¢×“×™×™×Ÿ ×‘×¨×¦×•× ×š להתחבר?" + +#: ../src/gui_interface.py:1489 +msgid "You are about to send your password unencrypted on an insecure connection. Are you sure you want to do that?" +msgstr "×”×™× ×š על סף שליחת סיסמתך ב×ופן ×œ× ×ž×•×¦×¤×Ÿ על ×¤× ×™ חיבור ×œ× ×ž×ובטח. ×”×× ×‘×מת ×©×‘×¨×¦×•× ×š לעשות ×–×ת?" #. theme doesn't exist, disable emoticons #: ../src/gui_interface.py:1995 ../src/gui_interface.py:2018 @@ -10384,107 +10524,95 @@ msgid "Emoticons disabled" msgstr "×¨×’×©×•× ×™× × ×•×˜×¨×œ×•" #: ../src/gui_interface.py:1996 -msgid "" -"Your configured emoticons theme has not been found, so emoticons have been " -"disabled." -msgstr "מוטיב ×”×¨×’×©×•× ×™× ×שר הגדרת ×œ× × ×ž×¦×, ומשכך ×¨×’×©×•× ×™× × ×•×˜×¨×œ×•." +msgid "Your configured emoticons theme has not been found, so emoticons have been disabled." +msgstr "מוטיב ×”×¨×’×©×•× ×™× ×©×”×’×“×¨×ª ×œ× × ×ž×¦×, ומשכך ×¨×’×©×•× ×™× × ×•×˜×¨×œ×•." #: ../src/gui_interface.py:2019 -msgid "" -"Your configured emoticons theme cannot been loaded. You maybe need to update " -"the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons " -"for more details." -msgstr "" -"מוטיב ×”×¨×’×©×•× ×™× ×שר הגדרת ×œ× × ×™×ª×Ÿ ×œ×˜×¢×™× ×”. ייתכן ×•×§×™×™× ×”×¦×•×¨×š לעדכן ×ת התסדיר " -"של הקובץ emoticons.py. ×œ×¤×¨×˜×™× × ×•×¡×¤×™×, ר×ו http://trac.gajim.org/wiki/" -"Emoticons." +msgid "Your configured emoticons theme cannot been loaded. You maybe need to update the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons for more details." +msgstr "מוטיב ×”×¨×’×©×•× ×™× ×©×”×’×“×¨×ª ×œ× × ×™×ª×Ÿ ×œ×˜×¢×™× ×”. ייתכן ×•×§×™×™× ×”×¦×•×¨×š לעדכן ×ת התסדיר של הקובץ emoticons.py. עבור ×¤×¨×˜×™× × ×•×¡×¤×™×, ר×ו http://trac.gajim.org/wiki/Emoticons." -#: ../src/gui_interface.py:2063 ../src/roster_window.py:3895 +#: ../src/gui_interface.py:2063 +#: ../src/roster_window.py:3966 msgid "You cannot join a group chat while you are invisible" -msgstr "×ין ב×פשרותך להשתתף בשיחת קבוצה ×›×שר ×”×™× ×š במצב בלתי × ×¨××”" +msgstr "×ין ביכולתך להשתתף בשיחת קבוצה ×›×שר ×”×™× ×š במצב בלתי × ×¨××”" #. it is good to notify the user #. in case he or she cannot see the output of the console #: ../src/gui_interface.py:2450 msgid "Could not save your settings and preferences" -msgstr "×œ× ×”×™×ª×” ×פשרות לשמור ×ת ההגדרות וההעדפות שלך" +msgstr "×œ× × ×™×ª×Ÿ ×”×™×” לשמור ×ת ההגדרות וההעדפות שלך" -#: ../src/gui_interface.py:3043 +#: ../src/gui_interface.py:3008 msgid "Passphrase Required" -msgstr "× ×“×¨×©×ª מימרת סיסמה" +msgstr "× ×“×¨×©×ª מימרת־סיסמה" -#: ../src/gui_interface.py:3044 +#: ../src/gui_interface.py:3009 #, python-format -msgid "Enter OpenPGP key passphrase for key %(keyid)s (account %(account)s)." -msgstr "" -"הזן מימרת סיסמה של מפתח OpenPGP עבור מפתח %(keyid)s (חשבון %(account)s)." +msgid "Enter GPG key passphrase for key %(keyid)s (account %(account)s)." +msgstr "× × ×œ×”×–×™×Ÿ מימרת־סיסמה של מפתח GPG עבור מפתח %(keyid)s (חשבון %(account)s)." -#: ../src/gui_interface.py:3058 -msgid "OpenPGP key expired" -msgstr "מפתח OpenPGP פקע" +#: ../src/gui_interface.py:3023 +msgid "GPG key expired" +msgstr "מפתח GPG פקע" -#: ../src/gui_interface.py:3059 +#: ../src/gui_interface.py:3024 #, python-format -msgid "" -"Your OpenPGP key has expired, you will be connected to %s without OpenPGP." -msgstr "מפתח OpenPGP פקע, התחברותך ×ל %s ×ª×ª×§×™×™× ×œ×œ× OpenPGP." +msgid "Your GPG key has expired, you will be connected to %s without OpenPGP." +msgstr "מפתח GPG פקע, ההתחברות ×ל %s תתבצע ×œ×œ× OpenPGP." #. ask again -#: ../src/gui_interface.py:3068 +#: ../src/gui_interface.py:3033 msgid "Wrong Passphrase" -msgstr "מימרת סיסמה שגויה" +msgstr "מימרת־סיסמה שגויה" -#: ../src/gui_interface.py:3069 -msgid "Please retype your OpenPGP passphrase or press Cancel." -msgstr "×× × ×”×§×œ×“ מחדש מימרת סיסמה OpenPGP ×ו לחץ על ביטול." +#: ../src/gui_interface.py:3034 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "× × ×œ×”×§×œ×™×“ מימרת־סיסמה GPG מחדש ×ו ללחוץ על ביטול." -#: ../src/gui_menu_builder.py:96 +#: ../src/gui_menu_builder.py:93 msgid "_New Group Chat" msgstr "שיחת קבוצה _חדשה" -#: ../src/gui_menu_builder.py:438 +#: ../src/gui_menu_builder.py:431 msgid "I would like to add you to my roster" msgstr "×‘×¨×¦×•× ×™ להוסיפך ×ל הרשימה שלי" -#: ../src/history_manager.py:78 -#, fuzzy -msgid "Set logs directory" -msgstr "cli" - -#: ../src/history_manager.py:126 +#: ../src/history_manager.py:116 msgid "Cannot find history logs database" -msgstr "×ין ×פשרות ×œ×ž×¦×•× ×ž×¡×“ × ×ª×•× ×™× ×©×œ רשומות היסטוריה" +msgstr "×œ× × ×™×ª×Ÿ ×œ×ž×¦×•× ×ž×¡×“ × ×ª×•× ×™× ×©×œ רשומות היסטוריה" #. holds time -#: ../src/history_manager.py:179 ../src/history_manager.py:223 -#: ../src/history_window.py:100 +#: ../src/history_manager.py:169 +#: ../src/history_manager.py:213 +#: ../src/history_window.py:99 msgid "Date" msgstr "ת×ריך" #. holds nickname -#: ../src/history_manager.py:186 ../src/history_manager.py:242 +#: ../src/history_manager.py:176 +#: ../src/history_manager.py:232 msgid "Nickname" msgstr "×©× ×›×™× ×•×™" #. holds message -#: ../src/history_manager.py:195 ../src/history_manager.py:230 -#: ../src/history_window.py:108 +#: ../src/history_manager.py:185 +#: ../src/history_manager.py:220 +#: ../src/history_window.py:107 msgid "Message" msgstr "הודעה" #. holds subject -#: ../src/history_manager.py:203 ../src/history_manager.py:236 +#: ../src/history_manager.py:193 +#: ../src/history_manager.py:226 msgid "Subject" msgstr "× ×•×©×" -#: ../src/history_manager.py:262 -msgid "" -"Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " -"RUNNING)" -msgstr "" -"×”×× ×‘×¨×¦×•× ×š ×œ× ×§×•×ª ×ת מסד ×”× ×ª×•× ×™×? (פעולה זו בהחלט ×œ× ×ž×•×ž×œ×¦×ª ×›×שר Gajim מורץ)" +# לחלוטין ×œ× ×ž×•×ž×œ×¥ בעת ×©×”×™×™×©×•× Gajim מורץ +#: ../src/history_manager.py:252 +msgid "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS RUNNING)" +msgstr "×”×× ×‘×¨×¦×•× ×š ×œ× ×§×•×ª ×ת מסד ×”× ×ª×•× ×™×? (פעולה זו בפרוש ×œ× ×ž×•×ž×œ×¦×ª בעת ×©×”×™×™×©×•× Gajim מורץ)" -#: ../src/history_manager.py:264 +#: ../src/history_manager.py:254 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 " @@ -10492,102 +10620,103 @@ msgid "" "\n" "In case you click YES, please wait..." msgstr "" -"בדרך כלל גודל מסד × ×ª×•× ×™× ×ž×•×§×¦×” ×œ× ×™×”×™×” חופשי, ××œ× ×”×•× ×¨×§ יהפוך לכזה ×שר × ×™×ª×Ÿ " -"לשימוש חוזר. ×× ×‘×מת ×‘×¨×¦×•× ×š להקטין ×ת הגודל של קובץ מסד ×”× ×ª×•× ×™×, עליך להקיש " -"כן, ×חרת עליך להקיש ל×.\n" +"בדרך כלל הגודל המוקצה של מסד × ×ª×•× ×™× ×œ× ×™×”×™×” חופשי, ×”×•× ×¨×§ יהפוך לכזה ×©× ×™×ª×Ÿ לשימוש חוזר. ×× ×‘×מת ×‘×¨×¦×•× ×š להקטין ×ת הגודל של קובץ מסד ×”× ×ª×•× ×™×, עליך להקיש כן, ×חרת עליך להקיש ל×.\n" "\n" "במידה ותבחר להקיש כן, ×× × ×”×ž×ª×Ÿ..." -#: ../src/history_manager.py:269 +# טיהור (×œ× ×ž×ª××™× ×ž×©×•× ×©×˜×™×”×•×¨ ×–×” ×יפוס מוחלט) +#: ../src/history_manager.py:259 msgid "Database Cleanup" msgstr "× ×™×§×•×™ מסד × ×ª×•× ×™×" -# ×ž×™×™×¦× ×›×¢×ª רשומות היסטוריה... -#: ../src/history_manager.py:487 +#: ../src/history_manager.py:477 msgid "Exporting History Logs..." msgstr "×™×™×¦×•× ×¨×©×•×ž×•×ª היסטוריה..." # BUG: said > wrote? # Needs to be tested -#: ../src/history_manager.py:564 +#: ../src/history_manager.py:554 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" -msgstr "â€%(who)s בשעה %(time)s ×מר/×”: %(message)s\n" +msgstr "‫%(who)s בשעה %(time)s ×מר/×”: %(message)s\n" -#: ../src/history_manager.py:602 +# Really>Still +#: ../src/history_manager.py:592 #, python-format msgid "Do you really want to delete the logs of %(jid)s?" -msgstr "×”×× ×תה בטוח ×›×™ ×‘×¨×¦×•× ×š למחוק ×ת הרשומות של %(jid)s?" +msgstr "×”×× ×‘×מת ×©×‘×¨×¦×•× ×š למחוק ×ת הרשומות של %(jid)s?" -#: ../src/history_manager.py:606 +#: ../src/history_manager.py:596 msgid "Do you really want to delete logs of the selected contacts?" -msgstr "×”×× ×תה בטוח ×›×™ ×‘×¨×¦×•× ×š למחוק ×ת הרשומות של ×× ×©×™ קשר × ×‘×—×¨×™×?" +msgstr "×”×× ×‘×מת ×©×‘×¨×¦×•× ×š למחוק ×ת הרשומות של ×× ×©×™ קשר × ×‘×—×¨×™×?" -#: ../src/history_manager.py:608 ../src/history_manager.py:647 +# ××™× × ×” הפיכה/× ×™×ª× ×ª לביטול +# ×”×™× × ×” +#: ../src/history_manager.py:598 +#: ../src/history_manager.py:637 msgid "This is an irreversible operation." -msgstr "פעולה זו ××™× × ×” הפיכה." +msgstr "פעולה זו ×”×™× ×” בלתי הפיכה." -#: ../src/history_manager.py:610 ../src/history_manager.py:649 +#: ../src/history_manager.py:600 +#: ../src/history_manager.py:639 msgid "Deletion Confirmation" msgstr "×ימות מחיקה" -#: ../src/history_manager.py:644 +# Really>Still +#: ../src/history_manager.py:634 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" -msgstr[0] "×”×× ×תה בטוח ×›×™ ×‘×¨×¦×•× ×š למחוק ×ת ההודעה ×”× ×‘×—×¨×ª?" -msgstr[1] "×”×× ×תה בטוח ×›×™ ×‘×¨×¦×•× ×š למחוק ×ת ההודעות ×”× ×‘×—×¨×•×ª?" +msgstr[0] "×”×× ×‘×מת ×©×‘×¨×¦×•× ×š למחוק ×ת ההודעה ×”× ×‘×—×¨×ª?" +msgstr[1] "×”×× ×‘×מת ×©×‘×¨×¦×•× ×š למחוק ×ת ההודעות ×”× ×‘×—×¨×•×ª?" -#: ../src/history_window.py:308 +#: ../src/history_window.py:306 #, python-format msgid "Conversation History with %s" msgstr "היסטוריית שיחה ×¢× â€«%s" -#: ../src/history_window.py:358 +# ×›×•× ×Ÿ +#: ../src/history_window.py:356 msgid "Disk Error" -msgstr "שגי×ת ×›×•× ×Ÿ" +msgstr "שגי×ת דיסק" -# Fix Psi status with brackets in Psi with LTR at its end - see realisation below -# â€Auto Status (idle) -# â€Auto Status (idle)‎ -#: ../src/history_window.py:451 +# LRE and PDF. +# Fix Psi status with brackets in Psi! not here!! :D +# ‪Auto Status (idle)‬ +#: ../src/history_window.py:444 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" -msgstr "%(nick)s מצוי/×” כעת במצב %(status)s: %(status_msg)s" +msgstr "‫%(nick)s מצוי/×” כעת במצב %(status)s: %(status_msg)s" -#: ../src/history_window.py:462 +#: ../src/history_window.py:455 #, python-format msgid "Error: %s" msgstr "שגי××”: %s" -#: ../src/history_window.py:464 +#: ../src/history_window.py:457 msgid "Error" msgstr "שגי××”" -#: ../src/history_window.py:466 +#: ../src/history_window.py:459 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "מצב × ×•×›×—×™: %(status)s: %(status_msg)s" -#: ../src/history_window.py:469 +#: ../src/history_window.py:462 #, python-format msgid "Status is now: %(status)s" msgstr "המצב כעת: %(status)s" -#: ../src/htmltextview.py:523 +#: ../src/htmltextview.py:522 msgid "Loading" -msgstr "טוען כעת" - -#: ../src/logind_listener.py:53 ../src/upower_listener.py:31 -msgid "Machine going to sleep" -msgstr "מחשב על סף ×©×™× ×”â€«" +msgstr "" #: ../src/message_window.py:220 msgid "You are going to close several tabs" -msgstr "בחרת לסגור מספר כרטיסיות" +msgstr "בחרת לסגור מספר ×œ×©×•× ×™×•×ª" #: ../src/message_window.py:221 msgid "Do you really want to close them all?" -msgstr "×”×× ×תה בטוח ×›×™ ×‘×¨×¦×•× ×š לסגור ×ת כולן?" +msgstr "×”×× ×‘×מת ×©×‘×¨×¦×•× ×š לסגור ×ת כולן?" #: ../src/message_window.py:518 msgid "Chats" @@ -10605,9 +10734,10 @@ msgstr "שיחות פרטיות" msgid "Messages" msgstr "הודעות" +# I think that הודעות יירשמו will be proper since we don't know to where the other end saves its messages #: ../src/negotiation.py:34 msgid "- messages will be logged" -msgstr "- הודעות יירשמו" +msgstr "- הודעות יירשמו ×ל יומן ההיסטוריה" #: ../src/negotiation.py:36 msgid "- messages will not be logged" @@ -10617,49 +10747,53 @@ msgstr "- הודעות ×œ× ×™×™×¨×©×ž×• ×ל יומן ההיסטוריה" msgid "Ignore" msgstr "התעלמות" -#: ../src/plugins/gui.py:82 +#: ../src/plugins/gui.py:78 msgid "Plugin" msgstr "תוספת" -#: ../src/plugins/gui.py:149 +#: ../src/plugins/gui.py:145 #, python-format msgid "Warning: %s" msgstr "×זהרה: %s" -#: ../src/plugins/gui.py:207 +# ×˜×¢×™× ×ª התוסף × ×›×©×œ×” +#: ../src/plugins/gui.py:199 msgid "Plugin failed" msgstr "כשל תוספת" -#: ../src/plugins/gui.py:252 +#: ../src/plugins/gui.py:244 msgid "Unable to properly remove the plugin" -msgstr "×ין ×פשרות להסיר ×ת התוספת ב×ופן רגיל" +msgstr "×œ× × ×™×ª×Ÿ להסיר ×ת התוספת ב×ופן רגיל" #. members not safe -#: ../src/plugins/gui.py:260 ../src/plugins/pluginmanager.py:526 -#: ../src/plugins/pluginmanager.py:534 +#: ../src/plugins/gui.py:252 +#: ../src/plugins/pluginmanager.py:523 +#: ../src/plugins/pluginmanager.py:531 msgid "Archive is malformed" msgstr "×רכיון ×”×™× ×• פגו×" -#: ../src/plugins/gui.py:284 ../src/plugins/gui.py:292 -#: ../src/plugins/pluginmanager.py:542 +#: ../src/plugins/gui.py:276 +#: ../src/plugins/gui.py:284 +#: ../src/plugins/pluginmanager.py:539 msgid "Plugin already exists" msgstr "תוספת כבר קיימת" -#: ../src/plugins/gui.py:284 +#: ../src/plugins/gui.py:276 msgid "Overwrite?" -msgstr "להחליף?" +msgstr "×”×× ×œ×›×ª×•×‘ על הקיי×?" -#: ../src/plugins/gui.py:314 +#: ../src/plugins/gui.py:306 msgid "Configuration" msgstr "תצורה" #. it is not zip file #. CRC error -#: ../src/plugins/pluginmanager.py:512 ../src/plugins/pluginmanager.py:518 +#: ../src/plugins/pluginmanager.py:509 +#: ../src/plugins/pluginmanager.py:515 msgid "Archive corrupted" msgstr "×רכיון מושחת" -#: ../src/plugins/pluginmanager.py:514 +#: ../src/plugins/pluginmanager.py:511 msgid "Archive empty" msgstr "×רכיון ריק" @@ -10667,502 +10801,484 @@ msgstr "×רכיון ריק" msgid "Retrieving profile..." msgstr "מ×חזר כעת דיוקן..." -#: ../src/profile_window.py:129 ../src/roster_window.py:3192 +#: ../src/profile_window.py:129 +#: ../src/roster_window.py:3259 msgid "File is empty" msgstr "קובץ ריק" -#: ../src/profile_window.py:132 ../src/roster_window.py:3195 +#: ../src/profile_window.py:132 +#: ../src/roster_window.py:3262 msgid "File does not exist" msgstr "קובץ ×œ× ×§×™×™×" +# ×ת ×”×ª×ž×•× ×” #. keep identation #. unknown format -#: ../src/profile_window.py:146 ../src/profile_window.py:163 -#: ../src/roster_window.py:3197 ../src/roster_window.py:3208 +#: ../src/profile_window.py:146 +#: ../src/profile_window.py:162 +#: ../src/roster_window.py:3264 +#: ../src/roster_window.py:3275 msgid "Could not load image" -msgstr "×œ× ×”×™×ª×” ×פשרות להטעין ×ª×ž×•× ×”" +msgstr "×œ× × ×™×ª×Ÿ לטעון ×ª×ž×•× ×”" -#: ../src/profile_window.py:235 +#: ../src/profile_window.py:233 msgid "Wrong date format" msgstr "תסדיר ת×ריך שגוי" # חייב -#: ../src/profile_window.py:236 +#: ../src/profile_window.py:234 msgid "Format of the date must be YYYY-MM-DD" -msgstr "הפורמט של הת×ריך מוכרח להיות YYYY-MM-DD" +msgstr "תסדיר הת×ריך מוכרח להיות YYYY-MM-DD" # התקבל מידע -#: ../src/profile_window.py:294 +#: ../src/profile_window.py:292 msgid "Information received" -msgstr "מידע התקבל" +msgstr "המידע התקבל" -#: ../src/profile_window.py:372 -msgid "Without a connection, you can not publish your contact information." +# BUG: Comma +# ×œ×œ× ×—×™×‘×•×¨ זמין +#: ../src/profile_window.py:370 +msgid "Without a connection you can not publish your contact information." msgstr "×œ×œ× ×—×™×‘×•×¨, ×ין ב×פשרותך ×œ×¤×¨×¡× ×ת מידע ×יש הקשר שלך." -#: ../src/profile_window.py:385 +#: ../src/profile_window.py:383 msgid "Sending profile..." msgstr "שולח כעת דיוקן..." -#: ../src/profile_window.py:404 +#: ../src/profile_window.py:402 msgid "Information NOT published" msgstr "מידע ×œ× ×¤×•×¨×¡×" -#: ../src/profile_window.py:411 +#: ../src/profile_window.py:409 msgid "vCard publication failed" msgstr "כשל ×¤×¨×¡×•× vCard" -#: ../src/profile_window.py:412 -msgid "" -"There was an error while publishing your personal information, try again " -"later." -msgstr "×ירעה שגי××” במהלך ×¤×¨×¡×•× ×”×ž×™×“×¢ ×”×ישי שלך, × ×¡×” שוב מ×וחר יותר." +#: ../src/profile_window.py:410 +msgid "There was an error while publishing your personal information, try again later." +msgstr "×רעה שגי××” במהלך ×¤×¨×¡×•× ×”×ž×™×“×¢ ×”×ישי שלך, × × ×œ× ×¡×•×ª שוב מ×וחר יותר." -#: ../src/roster_window.py:240 ../src/roster_window.py:1035 +#: ../src/roster_window.py:240 +#: ../src/roster_window.py:1031 msgid "Merged accounts" msgstr "×—×©×‘×•× ×•×ª ממוזגי×" -#: ../src/roster_window.py:2059 +#: ../src/roster_window.py:2049 msgid "Authorization has been sent" msgstr "הרש××” × ×©×œ×—×”" -#: ../src/roster_window.py:2060 +#: ../src/roster_window.py:2050 #, python-format msgid "Now \"%s\" will know your status." -msgstr "מעתה מצבך ×™×”×™×” גלוי עבור \"%s\"." +msgstr "מעתה מצבך ×™×”×™×” גלוי עבור ‫\"%s\"." -#: ../src/roster_window.py:2083 +#: ../src/roster_window.py:2073 msgid "Subscription request has been sent" msgstr "בקשת הרשמה × ×©×œ×—×”" -#: ../src/roster_window.py:2084 +# Is it possible to use %s twice? +# ×× ×‘×§×©×ª×š תתקבל על ידי \"%s\" מצב־החיבור של \"%s\" ×™×”×™×” גלוי ×‘×¤× ×™×š. +#: ../src/roster_window.py:2074 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "×× ×‘×§×©×ª×š תתקבל על ידי \"%s\" מצב החיבור שלו ×ו שלה ×™×”×™×” גלוי ×‘×¤× ×™×š." -#: ../src/roster_window.py:2098 +#: ../src/roster_window.py:2088 msgid "Authorization has been removed" msgstr "הרש××” הוסרה" -#: ../src/roster_window.py:2099 +#: ../src/roster_window.py:2089 #, python-format msgid "Now \"%s\" will always see you as offline." -msgstr "מעתה מצבך ייר××” בתור ×œ× ×ž×§×•×•×Ÿ עבור \"%s\"." +msgstr "מעתה מצבך ייר××” ×›×œ× ×ž×§×•×•×Ÿ עבור ‫\"%s\"." -#: ../src/roster_window.py:2126 -msgid "OpenPGP is not usable" -msgstr "×”×¦×¤× ×ª OpenPGP ××™× ×” שמישה" +#: ../src/roster_window.py:2116 +msgid "GPG is not usable" +msgstr "×”×¦×¤× ×ª GPG ××™× ×” שמישה" -#: ../src/roster_window.py:2127 +#: ../src/roster_window.py:2117 #, python-format msgid "You will be connected to %s without OpenPGP." -msgstr "התחברותך ×ל %s תתבצע ×œ×œ× OpenPGP." +msgstr "ההתחברות ×ל %s תתבצע ×œ×œ× OpenPGP." -#: ../src/roster_window.py:2334 ../src/roster_window.py:3825 +#: ../src/roster_window.py:2324 +#: ../src/roster_window.py:3896 msgid "You are participating in one or more group chats" msgstr "×”×™× ×š משתתף בשיחת קבוצה ×חת ×ו יותר" # יוביל, ×™×‘×™× ×œ×™×“×™ -#: ../src/roster_window.py:2335 ../src/roster_window.py:3826 -msgid "" -"Changing your status to invisible will result in disconnection from those " -"group chats. Are you sure you want to go invisible?" -msgstr "" -"×©×™× ×•×™ מצב החיבור שלך ×ל בלתי × ×¨××” ×™× ×‘×¢ ×‘× ×™×ª×•×§×š מתוך שיחות קבוצה ×לו. ×”×× ×תה " -"בטוח ×›×™ ×‘×¨×¦×•× ×š להפוך ×ת מצבך ×ל בלתי × ×¨××”?" +#: ../src/roster_window.py:2325 +#: ../src/roster_window.py:3897 +msgid "Changing your status to invisible will result in disconnection from those group chats. Are you sure you want to go invisible?" +msgstr "×©×™× ×•×™ מצב־חיבורך ×ל בלתי × ×¨××” ×™× ×‘×¢ ×‘× ×™×ª×•×§×š מן שיחות קבוצה ×לו. ×”×× ×¢×“×™×™×Ÿ ×‘×¨×¦×•× ×š להפוך ×ת מצבך ×ל בלתי × ×¨××”?" -#: ../src/roster_window.py:2361 +# If this mean desyncronized then '×œ× ×ž×¡×•× ×›×¨×Ÿ' is correct, +#: ../src/roster_window.py:2351 msgid "desync'ed" msgstr "×œ× ×ž×¡×•× ×›×¨×Ÿ" -#: ../src/roster_window.py:2427 +#: ../src/roster_window.py:2417 msgid "Really quit Gajim?" -msgstr "ב×מת לצ×ת מתוך Gajim?" +msgstr "ב×מת לצ×ת מן Gajim?" # לסגור ×ת -#: ../src/roster_window.py:2428 +#: ../src/roster_window.py:2418 msgid "Are you sure you want to quit Gajim?" -msgstr "×”×× ×תה בטוח ×›×™ ×‘×¨×¦×•× ×š לצ×ת מתוך Gajim?" +msgstr "×”×× ×‘×מת ×©×‘×¨×¦×•× ×š לצ×ת מן Gajim?" -#: ../src/roster_window.py:2429 +#: ../src/roster_window.py:2419 msgid "Always close Gajim" msgstr "סגור ×ת Gajim תמיד" -#: ../src/roster_window.py:2519 +#: ../src/roster_window.py:2509 msgid "You have running file transfers" -msgstr "× ×•×ª×¨×• העברות ×§×‘×¦×™× ×¤×¢×™×œ×•×ª" +msgstr "יש לך העברות ×§×‘×¦×™× ×¤×¢×™×œ×•×ª" -#: ../src/roster_window.py:2520 -msgid "" -"If you quit now, the file(s) being transferred will be stopped. Do you still " -"want to quit?" -msgstr "" -"×× ×ª×¦× ×¢×›×©×™×•, הקובץ ×ו ×”×§×‘×¦×™× ×שר ×ž×•×¢×‘×¨×™× ×›×¢×ª יופסקו. ×”×× ×¢×“×™×™×Ÿ ×‘×¨×¦×•× ×š לצ×ת?" +# the transfer of file(s) that are being +#: ../src/roster_window.py:2510 +msgid "If you quit now, the file(s) being transferred will be stopped. Do you still want to quit?" +msgstr "×× ×ª×¦× ×¢×›×©×™×•, הקובץ ×ו ×”×§×‘×¦×™× ×©×ž×•×¢×‘×¨×™× ×›×¢×ª יופסקו. ×”×× ×¢×“×™×™×Ÿ ×‘×¨×¦×•× ×š לצ×ת?" -#: ../src/roster_window.py:2551 ../src/roster_window.py:2988 +#: ../src/roster_window.py:2541 +#: ../src/roster_window.py:2978 msgid "You have unread messages" -msgstr "× ×•×ª×¨×• הודעות ×שר ×œ× × ×§×¨×ו" +msgstr "יש לך הודעות ×©×œ× × ×§×¨×ו" # BUG: and (A or THE) contact # קיימת לרשותך # היסטוריה מ×ופשרת -#: ../src/roster_window.py:2552 -msgid "" -"Messages will only be available for reading them later if you have history " -"enabled and contact is in your roster." -msgstr "" -"הודעות יהיו ×–×ž×™× ×•×ª לקרי××” מ×וחרת רק ×× ×פשרת ×¨×™×©×•× ×”×™×¡×˜×•×¨×™×” ו×יש הקשר מצוי " -"ברשימה שלך." +#: ../src/roster_window.py:2542 +msgid "Messages will only be available for reading them later if you have history enabled and contact is in your roster." +msgstr "הודעות יהיו ×–×ž×™× ×•×ª לקרי××” מ×וחרת רק ×× ×פשרת ×¨×™×©×•× ×”×™×¡×˜×•×¨×™×” ו×יש הקשר מצוי ברשימתך." -#: ../src/roster_window.py:2989 +# לקרו×ן +#: ../src/roster_window.py:2979 msgid "You must read them before removing this transport." -msgstr "עליך ×œ×§×¨×•× ×ותן ×˜×¨× ×”×¡×¨×ª מוביל ×–×”." +msgstr "עליך ×œ×§×¨×•× ×ותן ×œ×¤× ×™ הסרת מוביל ×–×”." -#: ../src/roster_window.py:2992 +#: ../src/roster_window.py:2982 #, python-format msgid "Transport \"%s\" will be removed" msgstr "המוביל \"%s\" יוסר" -#: ../src/roster_window.py:2993 -msgid "" -"You will no longer be able to send and receive messages from contacts using " -"this transport." -msgstr "" -"×œ× ×ª×¢×ž×•×“ עוד לרשותך ×”×פשרות לקבל ולשלוח הודעות מתוך ×× ×©×™ קשר ב×מצעות מוביל " -"×–×”." +#: ../src/roster_window.py:2983 +msgid "You will no longer be able to send and receive messages from contacts using this transport." +msgstr "×œ× ×ª×¢×ž×•×“ עוד לרשותך ×”×פשרות לקבל ולשלוח הודעות מן ×× ×©×™ קשר ב×מצעות מוביל ×–×”." -#: ../src/roster_window.py:2996 +#: ../src/roster_window.py:2986 msgid "Transports will be removed" msgstr "×”×ž×•×‘×™×œ×™× ×™×•×¡×¨×•" # ×”×˜×¨× ×¡×¤×•×¨×˜×™× ×©×œ×”×œ×Ÿ # ×”×˜×¨× ×¡×¤×•×¨×˜×™× ×”×œ×œ×• -#: ../src/roster_window.py:3001 +#: ../src/roster_window.py:2991 #, python-format -msgid "" -"You will no longer be able to send and receive messages to contacts from " -"these transports: %s" -msgstr "" -"×œ× ×ª×¢×ž×•×“ עוד לרשותך ×”×פשרות לקבל ולשלוח הודעות ×ל ×× ×©×™ קשר מתוך ×ž×•×‘×™×œ×™× ×לו: " -"%s" +msgid "You will no longer be able to send and receive messages to contacts from these transports: %s" +msgstr "×œ× ×ª×¢×ž×•×“ עוד לרשותך ×”×פשרות לקבל ולשלוח הודעות ×ל ×× ×©×™ קשר מן ×ž×•×‘×™×œ×™× ×לו: %s" # Needs to be tested # you have chose to -#: ../src/roster_window.py:3043 +#: ../src/roster_window.py:3059 msgid "You are about to block a contact. Are you sure you want to continue?" -msgstr "בחרת ×œ×—×¡×•× ×יש קשר. ×”×× ×תה בטוח ×›×™ ×‘×¨×¦×•× ×š להמשיך?" +msgstr "בחרת ×œ×—×¡×•× ×יש קשר. ×”×× ×¢×“×™×™×Ÿ ×‘×¨×¦×•× ×š להמשיך?" # BUG: HE and SHE # על ידו ×ו על ידה -#: ../src/roster_window.py:3045 -msgid "" -"This contact will see you offline and you will not receive messages he will " -"send you." -msgstr "" -"×יש קשר ×–×” תמיד יר××” ×ותך במצב ×œ× ×ž×§×•×•×Ÿ ×•×œ× ×ª×”×™×” ב×פשרותך לקבל הודעות ×שר " -"יישלחו ×ליך ×ž×ž× ×•." +#: ../src/roster_window.py:3061 +msgid "This contact will see you offline and you will not receive messages he will send you." +msgstr "×יש קשר ×–×” תמיד יר××” ×ותך במצב ×œ× ×ž×§×•×•×Ÿ ×•×œ× ×ª×”×™×” ב×פשרותך לקבל הודעות שישלחו ×ליך ×ž×ž× ×• ×ו ×ž×ž× ×”." #. it's jid -#: ../src/roster_window.py:3084 +#: ../src/roster_window.py:3151 msgid "Rename Contact" -msgstr "×©×™× ×•×™ ×©× ×יש קשר" +msgstr "×©× ×” ×©× ×יש קשר" -#: ../src/roster_window.py:3085 +#: ../src/roster_window.py:3152 #, python-format msgid "Enter a new nickname for contact %s" -msgstr "הזן ×©× ×›×™× ×•×™ חדש עבור ×יש קשר %s" +msgstr "× × ×œ×”×–×™×Ÿ ×©× ×›×™× ×•×™ חדש עבור ×יש קשר ‫%s" -#: ../src/roster_window.py:3092 +#: ../src/roster_window.py:3159 msgid "Rename Group" -msgstr "×©×™× ×•×™ ×©× ×§×‘×•×¦×”" +msgstr "×©× ×” ×©× ×§×‘×•×¦×”" -#: ../src/roster_window.py:3093 +#: ../src/roster_window.py:3160 #, python-format msgid "Enter a new name for group %s" -msgstr "הזן ×©× ×—×“×© עבור קבוצת %s" +msgstr "× × ×œ×”×–×™×Ÿ ×©× ×—×“×© עבור קבוצת ‫%s" -#: ../src/roster_window.py:3138 +#: ../src/roster_window.py:3205 msgid "Remove Group" msgstr "הסרת קבוצה" -#: ../src/roster_window.py:3139 +#: ../src/roster_window.py:3206 #, python-format msgid "Do you want to remove group %s from the roster?" -msgstr "×”×× ×‘×¨×¦×•× ×š להסיר ×ת קבוצת %s מתוך הרשימה?" +msgstr "×”×× ×‘×¨×¦×•× ×š להסיר ×ת קבוצת %s מן הרשימה?" -#: ../src/roster_window.py:3140 +#: ../src/roster_window.py:3207 msgid "Also remove all contacts in this group from your roster" -msgstr "×‘× ×•×¡×£ הסר ×’× ×ת כל ×× ×©×™ הקשר ×שר בקבוצה זו מתוך הרשימה" +msgstr "×‘× ×•×¡×£ ×’× ×œ×”×¡×™×¨ ×ת כל ×× ×©×™ הקשר שבקבוצה זו מן רשימתך" -#: ../src/roster_window.py:3179 +#: ../src/roster_window.py:3246 msgid "Assign OpenPGP Key" msgstr "הקצ×ת מפתח OpenPGP" # BUG: the word OpenPGP should be written # להחלה # ל×יש קשר ×–×” -#: ../src/roster_window.py:3180 +#: ../src/roster_window.py:3247 msgid "Select a key to apply to the contact" -msgstr "בחר מפתח ×œ×™×™×©×•× ×¢×‘×•×¨ ×יש הקשר" +msgstr "בחירת מפתח ×œ×™×™×©× ×¢×‘×•×¨ ×יש הקשר" -#: ../src/roster_window.py:3635 +#: ../src/roster_window.py:3706 #, python-format msgid "Contact \"%s\" will be removed from your roster" -msgstr "×יש קשר \"%s\" יוסר מתוך רשימתך" +msgstr "×יש קשר \"%s\" יוסר מן רשימתך" -#: ../src/roster_window.py:3637 +# you have chose to +#: ../src/roster_window.py:3708 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" -msgstr "בחרת להסיר ×ת \"%(name)s\" (%(jid)s) מתוך הרשימה שלך.\n" +msgstr "בחרת להסיר ×ת \"%(name)s\" (%(jid)s) מן רשימתך.\n" -#: ../src/roster_window.py:3642 -msgid "" -"By removing this contact you also remove authorization resulting in him or " -"her always seeing you as offline." -msgstr "" -"בהסירך ×ת ×יש קשר ×–×” תוסר ×’× ×”×¨×©××” דבר ×שר ×™×’×¨×•× ×œ×›×š ×©×”×•× ×ו ×”×™× ×™×¨×ו ×ותך " -"במצב ×œ× ×ž×§×•×•×Ÿ ב×ופן תמידי." +#: ../src/roster_window.py:3713 +msgid "By removing this contact you also remove authorization resulting in him or her always seeing you as offline." +msgstr "בהסירך ×ת ×יש קשר ×–×” תוסר ×’× ×”×¨×©××” דבר ×©×™×’×¨×•× ×œ×›×š שזה יר××” ×ותך במצב ×œ× ×ž×§×•×•×Ÿ ב×ופן תמידי." #. Contact is not in roster -#: ../src/roster_window.py:3648 +#: ../src/roster_window.py:3719 msgid "Do you want to continue?" msgstr "×”×× ×‘×¨×¦×•× ×š להמשיך?" -#: ../src/roster_window.py:3652 -msgid "" -"By removing this contact you also by default remove authorization resulting " -"in him or her always seeing you as offline." -msgstr "" -"בהסירך ×ת ×יש קשר ×–×” תוסר ×’×, ב×ופן משתמט, הרש××” דבר ×שר ×™×’×¨×•× ×œ×›×š ש×יש הקשר " -"יר××” ×ותך במצב ×œ× ×ž×§×•×•×Ÿ ב×ופן תמידי." +#: ../src/roster_window.py:3723 +msgid "By removing this contact you also by default remove authorization resulting in him or her always seeing you as offline." +msgstr "בהסירך ×ת ×יש קשר ×–×” תוסר ×’×, ב×ופן משתמט, הרש××” דבר ×©×™×’×¨×•× ×œ×›×š ש×יש הקשר יר××” ×ותך במצב ×œ× ×ž×§×•×•×Ÿ ב×ופן תמידי." -# ל×חר כעבור -#: ../src/roster_window.py:3655 +# ל×חר +#: ../src/roster_window.py:3726 msgid "I want this contact to know my status after removal" msgstr "×‘×¨×¦×•× ×™ ש×יש קשר ×–×” ×™×”×™×” מיודע ב×שר ×ל מצב החיבור שלי עובר הסרה" #. several contact to remove at the same time -#: ../src/roster_window.py:3659 +#: ../src/roster_window.py:3730 msgid "Contacts will be removed from your roster" -msgstr "×× ×©×™ קשר יוסרו מתןך הרשימה שלך" +msgstr "×× ×©×™ קשר יוסרו מן רשימתך" -#: ../src/roster_window.py:3664 +#: ../src/roster_window.py:3735 #, python-format msgid "" "By removing these contacts:%s\n" "you also remove authorization resulting in them always seeing you as offline." msgstr "" "בהסירך ×ת ×× ×©×™ קשר ×לו:%s\n" -"×תה ×’× ×ª×¡×™×¨ הרש××” דבר ×שר ×™×‘×™× ×œ×›×š ×©×”× ×ª×ž×™×“ יר×ו ×ותך במצב ×œ× ×ž×§×•×•×Ÿ." +"×תה ×’× ×ª×¡×™×¨ הרש××” דבר ×©×™×‘×™× ×œ×›×š ×©×”× ×ª×ž×™×“ יר×ו ×ותך במצב ×œ× ×ž×§×•×•×Ÿ." -#: ../src/roster_window.py:3722 -msgid "" -"You are about to send a custom status. Are you sure you want to continue?" -msgstr "בחרת לשלוח מצב חיבור מות××. ×”×× ×תה בטוח ×›×™ ×‘×¨×¦×•× ×š להמשיך?" +# you have chose to +#: ../src/roster_window.py:3793 +msgid "You are about to send a custom status. Are you sure you want to continue?" +msgstr "בחרת לשלוח מצב־חיבור מות××. ×”×× ×¢×“×™×™×Ÿ ×‘×¨×¦×•× ×š להמשיך?" -#: ../src/roster_window.py:3724 +#: ../src/roster_window.py:3795 #, python-format -msgid "" -"This contact will temporarily see you as %(status)s, but only until you " -"change your status. Then he or she will see your global status." -msgstr "" -"×יש קשר ×–×” יר××” ×ותך ב×ופן ×–×ž× ×™ במצב %(status)s, ×ך רק עד ×שר ×ª×©× ×” ×ת המצב " -"שלך. ×חרי כן הו×/×”×™× ×™×¨×ו ×ת מצב החיבור הגלובלי שלך." +msgid "This contact will temporarily see you as %(status)s, but only until you change your status. Then he or she will see your global status." +msgstr "×יש קשר ×–×” יר××” ×ותך ב×ופן ×–×ž× ×™ במצב %(status)s, ×ך רק עד שמצבך ×™×©×ª× ×” על ידייך. ×חרי כן הו×/×”×™× ×™×¨×ו ×ת מצב־חיבורך הגלובלי." -#: ../src/roster_window.py:3743 +# Is this the same as: "There is no account available"? +#: ../src/roster_window.py:3814 msgid "No account available" msgstr "×ין חשבון זמין" +# ×œ×¤× ×™ שתעמוד ליכולתך ×”×פשרות לשוחח # ×œ×¤× ×™ שתעמוד לרשותך ×”×פשרות לשוחח -#: ../src/roster_window.py:3744 +# ×œ×¤× ×™ שתעמוד לרשותך היכולת לשוחח +#: ../src/roster_window.py:3815 msgid "You must create an account before you can chat with other contacts." -msgstr "עליך ליצור חשבון ×˜×¨× ×ª×”×™×” ב×פשרותך לשוחח ×¢× ×× ×©×™ קשר ×חרי×." +msgstr "עליך ליצור חשבון ×œ×¤× ×™ שיהיה ביכולתך לשוחח ×¢× ×× ×©×™ קשר ×חרי×." -#: ../src/roster_window.py:4456 +#: ../src/roster_window.py:4512 msgid "Metacontacts storage not supported by your server" msgstr "×חסון ×× ×©×™Ö¾×§×©×¨-×ž×•×¦×ž×“×™× ×œ× × ×ª×ž×š על ידי שרתך" -#: ../src/roster_window.py:4458 -msgid "" -"Your server does not support storing metacontacts information. So this " -"information will not be saved on next reconnection." -msgstr "" -"שרתך ×œ× ×ª×•×ž×š ב×חסון מידע ×× ×©×™Ö¾×§×©×¨-מוצמדי×. לכן מידע ×–×” ×œ× ×™×™×©×ž×¨ בהתחברות " -"הב××”." +# on (? your ?) next reconnection +#: ../src/roster_window.py:4514 +msgid "Your server does not support storing metacontacts information. So this information will not be saved on next reconnection." +msgstr "שרתך ×œ× ×ª×•×ž×š ב×חסון מידע ×× ×©×™Ö¾×§×©×¨-מוצמדי×. לכן מידע ×–×” ×œ× ×™×™×©×ž×¨ בהתחברות הב××”." -#: ../src/roster_window.py:4550 -msgid "" -"You are about to create a metacontact. Are you sure you want to continue?" -msgstr "בחרת ליצור ×יש־קשר-מוצמד. ×”×× ×תה בטוח ×›×™ ×‘×¨×¦×•× ×š להמשיך?" +# you have chose to +#: ../src/roster_window.py:4606 +msgid "You are about to create a metacontact. Are you sure you want to continue?" +msgstr "בחרת ליצור ×יש־קשר-מוצמד. ×”×× ×¢×“×™×™×Ÿ ×‘×¨×¦×•× ×š להמשיך?" -#: ../src/roster_window.py:4552 -msgid "" -"Metacontacts are a way to regroup several contacts in one line. Generally it " -"is used when the same person has several Jabber accounts or transport " -"accounts." -msgstr "" -"×× ×©×™Ö¾×§×©×¨-×ž×•×¦×ž×“×™× (Metacontacts) ×”×™× ×” דרך ל×חד מספר ×× ×©×™ קשר בשורה ×חת. ב×ופן " -"כללי זו בשימוש ×›×שר ×ותה ×”×ישיות מחזיקה במספר ×—×©×‘×•× ×•×ª Jabber ×ו ×—×©×‘×•× ×•×ª " -"מוביל." +#: ../src/roster_window.py:4608 +msgid "Metacontacts are a way to regroup several contacts in one line. Generally it is used when the same person has several Jabber accounts or transport accounts." +msgstr "×× ×©×™Ö¾×§×©×¨-×ž×•×¦×ž×“×™× (Metacontacts) ×”×™× ×” דרך ל×חד מספר ×× ×©×™Ö¾×§×©×¨ בשורה ×חת. ב×ופן כללי זו בשימוש ×›×שר ×ותה ×”×ישיות מחזיקה במספר ×—×©×‘×•× ×•×ª Jabber ×ו ×—×©×‘×•× ×•×ª מוביל." -#: ../src/roster_window.py:4673 +#: ../src/roster_window.py:4729 msgid "Invalid file URI:" msgstr "כתובת URI של קובץ שגויה:" -#: ../src/roster_window.py:4685 +#: ../src/roster_window.py:4741 #, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" msgstr[0] "×”×× ×‘×¨×¦×•× ×š לשלוח קובץ ×–×” ×ל %s:" msgstr[1] "×”×× ×‘×¨×¦×•× ×š לשלוח ×§×‘×¦×™× ×לו ×ל %s:" -#: ../src/roster_window.py:4820 +#: ../src/roster_window.py:4876 #, python-format msgid "Send %s to %s" -msgstr "שלח ×ת %s ×ל %s" +msgstr "שליחת %s ×ל %s" -#: ../src/roster_window.py:4831 -#, python-format +# הפוך ×ת %s ו×ת %s ×ל metacontacts +#: ../src/roster_window.py:4887 +#, fuzzy, python-format msgid "Make %s first contact" -msgstr "הפוך ×ת %s ל×יש קשר ר×שון" +msgstr "הפוך ×ת %s ×•×’× %s ×ל ×× ×©×™Ö¾×§×©×¨-מוצמדי×" -#: ../src/roster_window.py:4834 +# הפוך ×ת %s ו×ת %s ×ל metacontacts +#: ../src/roster_window.py:4890 #, python-format msgid "Make %s and %s metacontacts" -msgstr "הפוך ×ת %s ×•×’× ×ת %s ל×× ×©×™Ö¾×§×©×¨-מוצמדי×" +msgstr "הפיכת %s ×•×’× %s ×ל ×× ×©×™Ö¾×§×©×¨-מוצמדי×" #. new chat #. single message #. for chat_with #. for single message #. join gc -#: ../src/roster_window.py:5294 ../src/roster_window.py:5348 -#: ../src/roster_window.py:5357 ../src/statusicon.py:277 -#: ../src/statusicon.py:324 ../src/statusicon.py:330 +#: ../src/roster_window.py:5346 +#: ../src/roster_window.py:5400 +#: ../src/roster_window.py:5409 +#: ../src/statusicon.py:277 +#: ../src/statusicon.py:324 +#: ../src/statusicon.py:330 #, python-format msgid "using account %s" msgstr "ב×מצעות חשבון %s" #. add -#: ../src/roster_window.py:5364 +#: ../src/roster_window.py:5416 #, python-format msgid "to %s account" msgstr "×ל חשבון %s" #. disco -#: ../src/roster_window.py:5369 +#: ../src/roster_window.py:5421 #, python-format msgid "using %s account" msgstr "ב×מצעות חשבון %s" -#: ../src/roster_window.py:5408 ../src/statusicon.py:340 +#: ../src/roster_window.py:5460 +#: ../src/statusicon.py:340 msgid "_Manage Bookmarks..." -msgstr "_× ×™×”×•×œ ×¡×™×ž× ×™×•×ª..." +msgstr "_× ×”×œ ×¡×™×ž× ×™×•×ª..." #. profile, avatar -#: ../src/roster_window.py:5428 +#: ../src/roster_window.py:5480 #, python-format msgid "of account %s" msgstr "של חשבון %s" -#: ../src/roster_window.py:5469 +#: ../src/roster_window.py:5521 #, python-format msgid "for account %s" msgstr "עבור חשבון %s" -#: ../src/roster_window.py:5529 ../src/roster_window.py:5637 +#: ../src/roster_window.py:5581 +#: ../src/roster_window.py:5689 msgid "_Change Status Message" msgstr "_×©× ×” הודעת מצב" -#: ../src/roster_window.py:5562 +#: ../src/roster_window.py:5614 msgid "Publish Tune" msgstr "×¤×¨×¡× ×œ×—×Ÿ" -#: ../src/roster_window.py:5564 +#: ../src/roster_window.py:5616 msgid "Publish Location" msgstr "×¤×¨×¡× ×ž×™×§×•×" -#: ../src/roster_window.py:5567 +#: ../src/roster_window.py:5619 msgid "Configure Services..." -msgstr "הגדרת שירותי×..." +msgstr "הגדר שירותי×..." # restore -#: ../src/roster_window.py:5715 +#: ../src/roster_window.py:5767 msgid "_Maximize All" msgstr "×”_גדל ×ת כול×" -#: ../src/roster_window.py:5725 ../src/roster_window.py:5898 +#: ../src/roster_window.py:5777 +#: ../src/roster_window.py:5950 msgid "Send Group M_essage" msgstr "שלח הודעת _×שכול" -#: ../src/roster_window.py:5733 +#: ../src/roster_window.py:5785 msgid "To all users" msgstr "×ל כל המשתמשי×" -#: ../src/roster_window.py:5737 +#: ../src/roster_window.py:5789 msgid "To all online users" msgstr "×ל כל ×”×ž×©×ª×ž×©×™× ×”×ž×§×•×•× ×™×" #. Manage Transport submenu -#: ../src/roster_window.py:5918 +#: ../src/roster_window.py:5970 msgid "_Manage Contacts" msgstr "_× ×”×œ ×× ×©×™ קשר" #. Edit Groups -#: ../src/roster_window.py:5927 +#: ../src/roster_window.py:5979 msgid "Edit _Groups" msgstr "ערוך _קבוצות" #. Send single message -#: ../src/roster_window.py:5982 +#: ../src/roster_window.py:6034 msgid "Send Single Message" msgstr "שלח הודעה בודדת" #. Execute Command -#: ../src/roster_window.py:6029 +#: ../src/roster_window.py:6081 msgid "Execute Command..." -msgstr "הרצת פקודה..." +msgstr "הרץ פקודה..." #. Manage Transport submenu -#: ../src/roster_window.py:6039 +#: ../src/roster_window.py:6091 msgid "_Manage Transport" msgstr "_× ×”×œ מוביל" #. Modify Transport -#: ../src/roster_window.py:6048 +#: ../src/roster_window.py:6100 msgid "_Modify Transport" msgstr "×”_ת×× ×ž×•×‘×™×œ" #. Rename -#: ../src/roster_window.py:6058 +#: ../src/roster_window.py:6110 msgid "_Rename" msgstr "_×©× ×” ש×" # Restore שחזר -#: ../src/roster_window.py:6118 +#: ../src/roster_window.py:6170 msgid "_Maximize" msgstr "×”_גדל" -#: ../src/roster_window.py:6127 +#: ../src/roster_window.py:6179 msgid "_Reconnect" -msgstr "הת_חבר מחדש" +msgstr "הת_חבר מחודשת" -#: ../src/roster_window.py:6134 +#: ../src/roster_window.py:6186 msgid "_Disconnect" msgstr "הת_× ×ª×§" #. History manager -#: ../src/roster_window.py:6228 +#: ../src/roster_window.py:6275 msgid "History Manager" msgstr "×ž× ×”×œ היסטוריה" -#: ../src/roster_window.py:6243 +#: ../src/roster_window.py:6286 msgid "_Join New Group Chat" -msgstr "×”_צטרף ×ל שיחת קבוצה חדשה" +msgstr "×”_צטרפות ×ל שיחת קבוצה חדשה" -#: ../src/roster_window.py:6471 +#: ../src/roster_window.py:6514 msgid "Change Status Message..." -msgstr "×©×™× ×•×™ הודעת מצב..." +msgstr "×©× ×” הודעת מצב..." #: ../src/search_window.py:105 msgid "Waiting for results" @@ -11179,11 +11295,12 @@ msgstr "שגי××” בקבלת dataform" msgid "No result" msgstr "×ין ×ª× ×•×‘×”" -#: ../src/session.py:409 ../src/session.py:469 +#: ../src/session.py:411 +#: ../src/session.py:470 msgid "Confirm these session options" -msgstr "×שר ×ת ×פשרויות סשן ×לו" +msgstr "×•×•×“× ×ת ×פשרויות סשן ×לו" -#: ../src/session.py:411 +#: ../src/session.py:413 #, python-format msgid "" "The remote client wants to negotiate a session with these features:\n" @@ -11198,7 +11315,7 @@ msgstr "" "\n" "×”×× ×פשרויות ×לו מקובלות על דעתך?" -#: ../src/session.py:471 +#: ../src/session.py:472 #, python-format msgid "" "The remote client selected these options:\n" @@ -11214,13 +11331,13 @@ msgstr "" "×”×× ×œ×”×ž×©×™×š ×¢× ×”×¡×©×Ÿ?" # ל×יש קשר -#: ../src/session.py:474 +#: ../src/session.py:475 msgid "Always accept for this contact" msgstr "×”×¡×›× ×ª×ž×™×“ עבור ×יש קשר ×–×”" #: ../src/statusicon.py:241 msgid "_Change Status Message..." -msgstr "_×©×™× ×•×™ הודעת מצב..." +msgstr "_×©× ×” הודעת מצב..." #: ../src/statusicon.py:355 msgid "Hide _Roster" @@ -11230,164 +11347,185 @@ msgstr "הסתר _רשימה" msgid "Hide this menu" msgstr "הסתר תפריט ×–×”" -#: ../src/tooltips.py:393 ../src/tooltips.py:614 +#: ../src/tooltips.py:393 +#: ../src/tooltips.py:613 msgid "Jabber ID: " -msgstr "מזהה Jabber: " +msgstr "‫JID: " -#: ../src/tooltips.py:397 ../src/tooltips.py:619 +#: ../src/tooltips.py:396 +#: ../src/tooltips.py:617 msgid "Resource: " msgstr "מש×ב: " -#: ../src/tooltips.py:403 +#: ../src/tooltips.py:402 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" -msgstr "â€%(owner_or_admin_or_member)s בשיחת קבוצה זו" +msgstr "‫%(owner_or_admin_or_member)s בשיחת קבוצה זו" -#: ../src/tooltips.py:511 +#: ../src/tooltips.py:510 msgid " [blocked]" msgstr " [חסומה]" -#: ../src/tooltips.py:515 +# (החדר) ממוזער +#: ../src/tooltips.py:514 msgid " [minimized]" msgstr " [ממוזערת]" -# מצב חיבור -#: ../src/tooltips.py:530 ../src/tooltips.py:791 +# מצב־חיבור +#: ../src/tooltips.py:529 +#: ../src/tooltips.py:789 msgid "Status: " msgstr "מצב: " -#: ../src/tooltips.py:575 +#: ../src/tooltips.py:574 #, python-format msgid "Last status: %s" msgstr "מצב ×חרון: %s" -#: ../src/tooltips.py:577 +#: ../src/tooltips.py:576 #, python-format msgid " since %s" msgstr " מ××– %s" -#: ../src/tooltips.py:595 +#: ../src/tooltips.py:594 msgid "Connected" msgstr "מחובר" -#: ../src/tooltips.py:597 +#: ../src/tooltips.py:596 msgid "Disconnected" msgstr "×ž× ×•×ª×§" #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:626 +#: ../src/tooltips.py:624 msgid "Subscription: " msgstr "הרשמה: " -#: ../src/tooltips.py:636 +#: ../src/tooltips.py:634 msgid "OpenPGP: " -msgstr "â€OpenPGP: " +msgstr "‫OpenPGP: " # מצוי/×” בחוסר פעילות -#: ../src/tooltips.py:659 +#: ../src/tooltips.py:657 #, python-format msgid "Idle since %s" msgstr "בחוסר פעילות מ××– %s" -#: ../src/tooltips.py:660 +#: ../src/tooltips.py:658 #, python-format msgid "Idle for %s" msgstr "בחוסר פעילות במשך %s" -#: ../src/tooltips.py:714 -msgid "Mood: " -msgstr "מצב רוח: " +#: ../src/tooltips.py:712 +#, python-format +msgid "Mood: %s" +msgstr "מצב רוח: %s" -#: ../src/tooltips.py:718 -msgid "Activity: " -msgstr "פעילות: " +#: ../src/tooltips.py:716 +#, python-format +msgid "Activity: %s" +msgstr "פעילות: %s" -#: ../src/tooltips.py:722 -msgid "Tune: " -msgstr "לחן: " +#: ../src/tooltips.py:720 +#, python-format +msgid "Tune: %s" +msgstr "לחן: %s" -#: ../src/tooltips.py:726 -msgid "Location: " -msgstr "מיקו×: " +#: ../src/tooltips.py:724 +#, python-format +msgid "Location: %s" +msgstr "מיקו×: %s" -#: ../src/tooltips.py:751 +#: ../src/tooltips.py:749 msgid "Download" msgstr "הורדה" -#: ../src/tooltips.py:757 +#: ../src/tooltips.py:755 msgid "Upload" msgstr "העל××”" -#: ../src/tooltips.py:764 +#: ../src/tooltips.py:762 msgid "Type: " -msgstr "טיפוס: " +msgstr "סוג: " -#: ../src/tooltips.py:770 +#: ../src/tooltips.py:768 msgid "Transferred: " msgstr "הועברו: " -#: ../src/tooltips.py:773 ../src/tooltips.py:790 +# ×˜×¨× ×”×•×ª×—×œ +#: ../src/tooltips.py:771 +#: ../src/tooltips.py:788 msgid "Not started" msgstr "×œ× ×”×•×ª×—×œ×”" -#: ../src/tooltips.py:775 +# עוצרה +#: ../src/tooltips.py:773 msgid "Stopped" msgstr "× ×¢×¦×¨×”" -#: ../src/tooltips.py:777 ../src/tooltips.py:780 +#: ../src/tooltips.py:775 +#: ../src/tooltips.py:778 msgid "Completed" msgstr "הושלמה" -#: ../src/tooltips.py:783 +#: ../src/tooltips.py:781 msgid "?transfer status:Paused" msgstr "הושהתה" +# מושהה #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:786 +#: ../src/tooltips.py:784 msgid "Stalled" msgstr "מוקפ×ת" -#: ../src/tooltips.py:788 +# הקובץ מועבר כעת +# מועבר כעת קובץ +#: ../src/tooltips.py:786 msgid "Transferring" msgstr "מעביר כעת" # השיב -#: ../src/tooltips.py:825 +#: ../src/tooltips.py:823 msgid "This service has not yet responded with detailed information" -msgstr "שירות ×–×” ×˜×¨× ×”×’×™×‘ ×¢× ×ž×™×“×¢ מפורט" +msgstr "שירות ×–×” עדיין ×œ× ×”×’×™×‘ ×¢× ×ž×™×“×¢ מפורט" # שבור, ×¤×’×•× -#: ../src/tooltips.py:828 +#: ../src/tooltips.py:826 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" msgstr "" -"×œ× ×”×™×” ביכולתו של שירות ×–×” להגיב ×¢× ×ž×™×“×¢ מפורט.\n" -"× ×¨××” ×›×™ שירות ×–×” ×”×™× ×• מיושן ×ו מקוטע" +"×ין ביכולת שירות ×–×” להגיב ×¢× ×ž×™×“×¢ מפורט.\n" +"×›× ×¨××” שהשירות ×”×™× ×• מיושן ×ו מקוטע" + +#: ../src/upower_listener.py:31 +msgid "Machine going to sleep" +msgstr "מחשב על סף ×©×™× ×”â€«" -#: ../src/vcard.py:312 +#: ../src/vcard.py:296 msgid "?Client:Unknown" msgstr "×œ× ×™×“×•×¢" -#: ../src/vcard.py:314 +#: ../src/vcard.py:298 msgid "?OS:Unknown" msgstr "×œ× ×™×“×•×¢×”" -#: ../src/vcard.py:339 +#: ../src/vcard.py:323 msgid "?Time:Unknown" msgstr "×œ× ×™×“×•×¢" -#: ../src/vcard.py:363 ../src/vcard.py:373 ../src/vcard.py:581 +#: ../src/vcard.py:347 +#: ../src/vcard.py:357 +#: ../src/vcard.py:565 #, python-format msgid "since %s" msgstr "מ××– %s" -#: ../src/vcard.py:396 +#: ../src/vcard.py:380 msgid "?Role in Group Chat:<b>Role:</b>" msgstr "<b>תפקיד:</b>" # שיוך, סיפוח -#: ../src/vcard.py:400 +#: ../src/vcard.py:384 msgid "<b>Affiliation:</b>" msgstr "<b>השתייכות:</b>" @@ -11395,41 +11533,1103 @@ msgstr "<b>השתייכות:</b>" # BUG:? # interested at his/her presence # interested in his/her presence information -#: ../src/vcard.py:408 -msgid "" -"This contact is interested in your presence information, but you are not " -"interested in his/her presence" -msgstr "" -"×יש קשר ×–×” ×ž×¢×•× ×™×™×Ÿ במידע × ×•×›×—×•×ª×š, ××•×œ× ×ין לך ×¢× ×™×™×Ÿ ×‘× ×•×›×—×•×ª×• של ×יש קשר ×–×”" +#: ../src/vcard.py:392 +msgid "This contact is interested in your presence information, but you are not interested in his/her presence" +msgstr "×יש קשר ×–×” ×ž×¢×•× ×™×™×Ÿ במידע × ×•×›×—×•×ª×š, ××•×œ× ××™× ×š מגלה ×¢× ×™×™×Ÿ ×‘× ×•×›×—×•×ª×• של ×יש קשר ×–×”" -#: ../src/vcard.py:410 -msgid "" -"You are interested in the contact's presence information, but he/she is not " -"interested in yours" -msgstr "" -"×”×™× ×š מגלה ×¢× ×™×™×Ÿ במידע ×”× ×•×›×—×•×ª ×יש קשר ×–×”, ××•×œ× ×יש קשר ×–×” ××™× ×• ×ž×¢×•× ×™×™×Ÿ " -"×‘× ×•×›×—×•×ª×š" +#: ../src/vcard.py:394 +msgid "You are interested in the contact's presence information, but he/she is not interested in yours" +msgstr "×”×™× ×š מגלה ×¢× ×™×™×Ÿ במידע ×”× ×•×›×—×•×ª ×יש קשר ×–×”, ××•×œ× ×יש קשר ×–×” ××™× ×• ×ž×¢×•× ×™×™×Ÿ ×‘× ×•×›×—×•×ª×š" # ×חד ×ת ×”×©× ×™ -#: ../src/vcard.py:412 +#: ../src/vcard.py:396 msgid "You and the contact are interested in each other's presence information" msgstr "×”×™× ×š והן ×יש הקשר ×ž×¢×•× ×™×™× ×™× ×‘×ž×™×“×¢ ×”× ×•×›×—×•×ª של ×–×” ×ת ×–×”" #. None -#: ../src/vcard.py:414 -msgid "" -"You are not interested in the contact's presence, and neither he/she is " -"interested in yours" +#: ../src/vcard.py:398 +msgid "You are not interested in the contact's presence, and neither he/she is interested in yours" msgstr "×ין לך ×¢× ×™×™×Ÿ ×‘× ×•×›×—×•×ª של ×יש הקשר, וכך ×’× ×–×” ×œ× ×ž×¢×•× ×™×™×Ÿ ×‘× ×•×›×—×•×ª×š" -#: ../src/vcard.py:421 +#: ../src/vcard.py:405 msgid "You are waiting contact's answer about your subscription request" msgstr "×”×™× ×š מחכה ×œ×ž×¢× ×” של ×יש קשר ×‘× ×•×’×¢ לבקשת רישומך" -#: ../src/vcard.py:423 +#: ../src/vcard.py:407 msgid "There is no pending subscription request." msgstr "×œ× ×§×™×™×ž×ª ×©×•× ×‘×§×©×ª הרשמה ×ž×ž×ª×™× ×”." -#: ../src/vcard.py:428 ../src/vcard.py:482 ../src/vcard.py:604 +#: ../src/vcard.py:412 +#: ../src/vcard.py:466 +#: ../src/vcard.py:588 msgid " resource with priority " msgstr " מש×ב ×¢× ×¢×“×™×¤×•×ª " + +# ×ž×™×™×“×™× - cast ; ×ž×™×“×™×™× - from +#~ msgid "Gajim Instant Messenger" +#~ msgstr "Gajim ×ž×¡×¨×™× ×ž×™×™×“×™×™×" +#~ msgid "Fishing" +#~ msgstr "דג" +#~ msgid "Continue" +#~ msgstr "המשך" +#~ msgid "Requires python-farstream." +#~ msgstr "יש צורך ×‘×”×ª×§× ×ª python-farstream." +#~ msgid "Contacts" +#~ msgstr "×× ×©×™Ö¾×§×©×¨" +#~ msgid "@" +#~ msgstr "@" +#~ msgid "Choose Client Cert" +#~ msgstr "× × ×œ×‘×—×•×¨ תעודת לקוח" +#~ msgid "The path to the client certificate and key in PKCS#12 format" +#~ msgstr "×”× ×ª×™×‘ ×ל תעודת הלקוח והמפתח בתסדיר PKCS#12" +#~ msgid "<b>Actions</b>" +#~ msgstr "<b>פעולות</b>" +#~ msgid "<b>Conditions</b>" +#~ msgstr "<b>Conditions</b>" +#~ msgid "Advanced Actions" +#~ msgstr "פעולות מתקדמות" +#~ msgid "Advanced Notifications Control" +#~ msgstr "בקרת התר×ות מתקדמת" +#~ msgid "All statuses" +#~ msgstr "כל המצבי×" +# עסוק (Avahi Discovery: TXT status = dnd) +# ×œ× ×œ×”×¤×¨×™×¢ Do not disturb +#~ msgid "Busy " +#~ msgstr "× × ×œ× ×œ×”×¤×¨×™×¢ " +#~ msgid "Contact Change Status " +#~ msgstr "×יש־הקשר החליף מצב־חיבור " +#~ msgid "Contact Disconnected " +#~ msgstr "×יש־הקשר ×ž× ×•×ª×§ " +#~ msgid "Don't have " +#~ msgstr "Don't have " +#~ msgid "File Transfer Started " +#~ msgstr "העברת קובץ החלה " +#~ msgid "Group Chat Message Highlight " +#~ msgstr "הודעת שיחת קבוצה מובלטות " +#~ msgid "Group Chat Message Received " +#~ msgstr "התקבלה הודעה משיחת קבוצה" +#~ msgid "Have " +#~ msgstr "Have " +#~ msgid "Launch a command" +#~ msgstr "הרצת פקודה" +#~ msgid "One or more special statuses..." +#~ msgstr "מצב־חיבור מיוחד ×חד ×ו יותר..." +#~ msgid "Online / Free For Chat" +#~ msgstr "מקוון \\ ×¤× ×•×™ לשיחה" +#~ msgid "Play a sound" +#~ msgstr "השמעת צליל" +#~ msgid "Receive a Message" +#~ msgstr "קבלת הודעה" +# מתי ×ו ×›×שר +#~ msgid "When " +#~ msgstr "×›×שר " +#~ msgid "_Disable auto opening chat window" +#~ msgstr "_× ×˜×¨×•×œ פתיחה ×וטומטית של חלון שיחה" +# what does it mean? +#~ msgid "_Disable existing popup window" +#~ msgstr "_× ×˜×¨×•×œ חלון מוקפץ קיי×" +#, fuzzy +#~ msgid "_Disable existing sound for this event" +#~ msgstr "_× ×˜×¨×•×œ צלילי existing עבור ×ירוע ×–×”" + +# לוח ×ª×•×¨× ×•×™×•×ª +#~ msgid "_Disable showing event in roster" +#~ msgstr "_× ×˜×¨×•×œ הצגת ×ירוע בלוח החברי×" +#~ msgid "_Disable showing event in systray" +#~ msgstr "_× ×˜×¨×•×œ הצגת ×ירוע במגש המערכת" +#~ msgid "_Inform me with a popup window" +#~ msgstr "_יידע ×ותי ב×מצעות חלון מוקפץ" +#~ msgid "_Open chat window with user" +#~ msgstr "_פתיחת חלון שיחה ×¢× ×ž×©×ª×ž×©" +#~ msgid "_Show event in roster" +#~ msgstr "×”_צגת ×ירוע בלוח החברי×" +#~ msgid "_Show event in systray" +#~ msgstr "×”_צגת ×ירוע במגש המערכת" +#~ msgid "and I " +#~ msgstr "ו×× ×™ " +#, fuzzy +#~ msgid "contact(s)" +#~ msgstr "×יש־קשר" + +#~ msgid "for " +#~ msgstr "עבור " + +#~ msgid "group(s)" +#~ msgstr "קבוצה/ות" + +# ×›×שר ×× ×™ ×צל +#, fuzzy +#~ msgid "when I'm in" +#~ msgstr "when I'm in" + +#~ msgid "label" +#~ msgstr "תווית" + +#~ msgid "Advanced..." +#~ msgstr "מתקד×..." + +#~ msgid "Always use GNOME default applications" +#~ msgstr "שימוש תמידי ×‘×™×™×©×•×ž×™× ×”×ž×©×ª×ž×˜×™× ×©×œ GNOME" + +#~ msgid "Always use Xfce default applications" +#~ msgstr "שימוש תמידי ×‘×™×™×©×•×ž×™× ×”×ž×©×ª×ž×˜×™× ×©×œ Xfce" + +# ×יתור ×וטומטי בכל פע×/עת ×©×”×™×™×©×•× Gajim ×™×ותחל +#~ msgid "Autodetect on every Gajim startup" +#~ msgstr "×יתור ×וטומטי בכל הפעלה של Gajim" +# BUG: Systray icon +#~ msgid "Show systray:" +#~ msgstr "הצגת צלמית מגש המערכת:" +#~ msgid "_Send Single Message..." +#~ msgstr "_שליחת הודעה בודדת..." +#~ msgid "User avatar:" +#~ msgstr "×ווט×ר משתמש:" +# BUG: insterting (TYPO) +#, fuzzy +#~ msgid "" +#~ "If True, Gajim will convert string between $$ and $$ to an image using " +#~ "dvips and convert before insterting it in chat window." +#~ msgstr "" +#~ "במידה והעדפה זו מופעלת, Gajim ימיר מחרוזת בין $$ לבין $$ ×ל ×ª×ž×•× ×” " +#~ "ב×מצעות dvips וימיר ×œ×¤× ×™ insterting ×ל חלון שיחה." + +#, fuzzy +#~ msgid "'yes', 'no', or 'both'" +#~ msgstr "'כן', 'ל×', ×ו '×©× ×™×”×Ÿ'" + +#, fuzzy +#~ msgid "'yes', 'no' or ''" +#~ msgstr "'כן', 'ל×' ×ו ''" + +#~ msgid "Nickname not allowed: %s" +#~ msgstr "×›×™× ×•×™ ×œ× ×ž×•×¨×©×”: %s" + +#~ msgid "we are now subscribed to %s" +#~ msgstr "×× ×—× ×• ×¨×©×•×ž×™× ×›×¢×ª ×ל %s" + +#~ msgid "we are now unsubscribed from %s" +#~ msgstr "×× ×—× ×• כבר ×œ× ×¨×©×•×ž×™× ×ל %s" + +# Mixed RTL with LTR +# Needs to be tested +#~ msgid "Error executing \"%(command)s\": %(error)s" +#~ msgstr "שגי××” בהרצת ‫\"%(command)s\": ‫%(error)s" +#~ msgid "error: cannot open %s for reading" +#~ msgstr "שגי××”: ×œ× × ×™×ª×Ÿ לפתוח ×ת הקובץ %s לקרי××”" +#~ msgid "Unable to bind to port %s." +#~ msgstr "×œ× × ×™×ª×Ÿ לכרוך ×ל פתחה %s." +# שיש לך +#~ msgid "" +#~ "Maybe you have another running instance of Gajim. File Transfer will be " +#~ "cancelled." +#~ msgstr "יכול להיות ×©×§×™×™× ×ª×”×œ×™×š ×חר של Gajim שמורץ כעת. העברת קובץ תסתיי×." +#~ msgid "A GTK+ jabber client" +#~ msgstr "A GTK+ jabber client" +#, fuzzy +#~ msgid "Condition" +#~ msgstr "Condition" + +#~ msgid "when I am " +#~ msgstr "×›×שר ×× ×™ " + +#~ msgid "Requires pybonjour (http://o2s.csail.mit.edu/o2s-wiki/pybonjour)." +#~ msgstr "" +#~ "יש צורך ×‘×”×ª×§× ×ª pybonjour \n" +#~ "http://o2s.csail.mit.edu/o2s-wiki/pybonjour." + +#~ msgid "Requires gpg and python-GnuPGInterface." +#~ msgstr "יש צורך ×‘×”×ª×§× ×ª gpg ×•×’× python-GnuPGInterface." + +#~ msgid "LaTeX" +#~ msgstr "LaTeX" + +# Transform to? +# להפוך ל- +# הפיכה ×ל +# between what? +#, fuzzy +#~ msgid "Transform LaTeX expressions between $$ $$." +#~ msgstr "×©×™× ×•×™ ביטוי LaTeX בין $$ $$." + +# BUG? True >> Activated +#~ msgid "" +#~ "Requires texlive-latex-base and dvipng. You have to set 'use_latex' to " +#~ "True in the Advanced Configuration Editor." +#~ msgstr "" +#~ "יש צורך ×‘×”×ª×§× ×ª texlive-latex-base ×•×’× dvipng. עליך להגדיר ×ת ×”×פשרות " +#~ "'use_latex' ×ל מופעלת בתוך עורך התצורה המתקד×." +# Is it ok to translate to: All is included in MikTeX +#~ msgid "" +#~ "Requires texlive-latex-base and dvipng (All is in MikTeX). You have to " +#~ "set 'use_latex' to True in the Advanced Configuration Editor." +#~ msgstr "" +#~ "יש צורך ×‘×”×ª×§× ×ª texlive-latex-base ×•×’× dvipng (הכל כלול בתוך MikTeX). עליך " +#~ "להגדיר ×ת ×”×פשרות 'use_latex' ×ל מופעלת בתוך עורך התצורה המתקד×." +#, fuzzy +#~ msgid "Disk WriteError" +#~ msgstr "×›×•× ×Ÿ WriteError" + +#~ msgid "Subject: %s" +#~ msgstr "× ×•×©×: %s" + +#~ msgid "Account Modification" +#~ msgstr "Account Modification" + +#~ 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 "" +#~ "Tick 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" + +#~ msgid "Edit Personal Information..." +#~ msgstr "Edit Personal Information..." + +#~ msgid "Hostname: " +#~ msgstr "Hostname: " + +#~ msgid "" +#~ "If checked, Gajim will store the password in ~/.gajim/config with 'read' " +#~ "permission only for you" +#~ msgstr "" +#~ "If ticked, Gajim will store the password in ~/.gajim/config with 'read' " +#~ "permission only for you" + +#~ msgid "Port: " +#~ msgstr "Port: " + +#~ msgid "Proxy:" +#~ msgstr "Proxy:" + +#~ msgid "Save _passphrase (insecure)" +#~ msgstr "Save _passphrase (insecure)" + +#~ msgid "Send keep-alive packets" +#~ msgstr "Send keep-alive packets" + +#~ msgid "Use _SSL (legacy)" +#~ msgstr "Use _SSL (legacy)" + +#~ msgid "_Adjust to status" +#~ msgstr "_Adjust to status" + +#~ msgid "gtk-add" +#~ msgstr "gtk-add" + +#~ msgid "gtk-close" +#~ msgstr "gtk-close" + +#~ msgid "gtk-remove" +#~ msgstr "gtk-remove" + +#~ msgid "" +#~ "Receive a Message\n" +#~ "Contact Disconnected \n" +#~ "Contact Change Status \n" +#~ "Group Chat Message Highlight \n" +#~ "Group Chat Message Received \n" +#~ "File Transfer Request \n" +#~ "File Transfer Started \n" +#~ "File Transfer Finished" +#~ msgstr "" +#~ "Receive a Message\n" +#~ "Contact Disconnected \n" +#~ "Contact Change Status \n" +#~ "Group Chat Message Highlight \n" +#~ "Group Chat Message Received \n" +#~ "File Transfer Request \n" +#~ "File Transfer Started \n" +#~ "File Transfer Finished" + +#~ msgid "" +#~ "contact(s)\n" +#~ "group(s)\n" +#~ "everybody" +#~ msgstr "" +#~ "contact(s)\n" +#~ "group(s)\n" +#~ "everybody" + +#~ msgid "" +#~ "Account row\n" +#~ "Group row\n" +#~ "Contact row\n" +#~ "Chat Banner" +#~ msgstr "" +#~ "Account row\n" +#~ "Group row\n" +#~ "Contact row\n" +#~ "Chat Banner" + +#~ msgid "" +#~ "Enter JID or Contact name\n" +#~ "Groupchat Histories\n" +#~ "All Chat Histories" +#~ msgstr "" +#~ "Enter JID or Contact name\n" +#~ "Groupchat Histories\n" +#~ "All Chat Histories" + +#~ msgid "Manage Accounts" +#~ msgstr "Manage Accounts" + +#~ msgid "gtk-delete" +#~ msgstr "gtk-delete" + +#~ msgid "Send a file (Ctrl+F)" +#~ msgstr "Send a file (Ctrl+F)" + +#~ msgid "" +#~ "All chat states\n" +#~ "Composing only\n" +#~ "Disabled" +#~ msgstr "" +#~ "All chat states\n" +#~ "Composing only\n" +#~ "Disabled" + +#~ msgid "" +#~ "Autodetect on every Gajim startup\n" +#~ "Always use GNOME default applications\n" +#~ "Always use KDE default applications\n" +#~ "Always use Xfce default applications\n" +#~ "Custom" +#~ msgstr "" +#~ "Autodetect on every Gajim startup\n" +#~ "Always use GNOME default applications\n" +#~ "Always use KDE default applications\n" +#~ "Always use Xfce default applications\n" +#~ "Custom" + +#~ 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 "" +#~ "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" + +#~ msgid "" +#~ "Pop it up\n" +#~ "Notify me about it\n" +#~ "Show only in roster" +#~ msgstr "" +#~ "Pop it up\n" +#~ "Notify me about it\n" +#~ "Show only in roster" + +#~ msgid "" +#~ "none\n" +#~ "both\n" +#~ "from\n" +#~ "to" +#~ msgstr "" +#~ "none\n" +#~ "both\n" +#~ "from\n" +#~ "to" + +#~ msgid "gtk-cancel" +#~ msgstr "gtk-cancel" + +#~ msgid "_Quit" +#~ msgstr "_Quit" + +#~ msgid "Enable" +#~ msgstr "Enable" + +#~ msgid "Wrong host" +#~ msgstr "Wrong host" + +#~ msgid "Invalid local address? :-O" +#~ msgstr "Invalid local address? :-O" + +#~ msgid "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." +#~ msgstr "pysqlite2 (aka python-pysqlite2) dependency is missing. Exiting..." + +#~ msgid "Banners and clickable links" +#~ msgstr "Banners and clickable links" + +#~ msgid "Ability to have clickable URLs in chat and groupchat window banners." +#~ msgstr "" +#~ "Ability to have clickable URLs in chat and groupchat window banners." + +#~ msgid "Requires python-sexy." +#~ msgstr "Requires python-sexy." + +#~ msgid "GTK+ runtime is missing libglade support" +#~ msgstr "GTK+ runtime is missing libglade support" + +#~ msgid "" +#~ "Please remove your current GTK+ runtime and install the latest stable " +#~ "version from %s" +#~ msgstr "" +#~ "Please remove your current GTK+ runtime and install the latest stable " +#~ "version from %s" + +#~ msgid "" +#~ "Please make sure that GTK+ and PyGTK have libglade support in your system." +#~ msgstr "" +#~ "Please make sure that GTK+ and PyGTK have libglade support in your system." + +#~ msgid "Gajim needs PySQLite2 to run" +#~ msgstr "Gajim needs PySQLite2 to run" + +#~ msgid "_Incoming message:" +#~ msgstr "_Incoming message:" + +#~ msgid "_Outgoing message:" +#~ msgstr "_Outgoing message:" + +#~ msgid "" +#~ "The host %s you configured as the ft_add_hosts_to_send advanced option is " +#~ "not valid, so ignored." +#~ msgstr "" +#~ "The host %s you configured as the ft_add_hosts_to_send advanced option is " +#~ "not valid, so ignored." + +#~ msgid "OpenPGP passphrase was not given" +#~ msgstr "OpenPGP passphrase was not given" + +#~ msgid "" +#~ "To continue sending and receiving messages, you will need to reconnect." +#~ msgstr "" +#~ "To continue sending and receiving messages, you will need to reconnect." + +#~ msgid "" +#~ "You are not connected or not visible to others. Your message could not be " +#~ "sent." +#~ msgstr "" +#~ "You are not connected or not visible to others. Your message could not be " +#~ "sent." + +#~ msgid "[This message is encrypted]" +#~ msgstr "[This message is encrypted]" + +#~ msgid "%i days ago" +#~ msgstr "%i days ago" + +#~ msgid "Trayicon" +#~ msgstr "Trayicon" + +#~ msgid "A icon in systemtray reflecting the current presence." +#~ msgstr "A icon in systemtray reflecting the current presence." + +#~ msgid "" +#~ "Requires python-gnome2-extras or compiled trayicon module from Gajim " +#~ "sources." +#~ msgstr "" +#~ "Requires python-gnome2-extras or compiled trayicon module from Gajim " +#~ "sources." + +#~ msgid "Requires PyGTK >= 2.10." +#~ msgstr "Requires PyGTK >= 2.10." + +#~ msgid "gtk-ok" +#~ msgstr "gtk-ok" + +#~ msgid "Add Special _Notification" +#~ msgstr "Add Special _Notification" + +#~ msgid "Assign Open_PGP Key" +#~ msgstr "Assign Open_PGP Key" + +#~ msgid "Commands: %s" +#~ msgstr "Commands: %s" + +#~ msgid "" +#~ "Usage: /%(command)s <action>, sends action to the current group chat. Use " +#~ "third person. (e.g. /%(command)s explodes.)" +#~ msgstr "" +#~ "Usage: /%(command)s <action>, sends action to the current group chat. Use " +#~ "third person. (e.g. /%(command)s explodes.)" + +#~ msgid "No help info for /%s" +#~ msgstr "No help info for /%s" + +#~ msgid "Enable link-local/zeroconf messaging" +#~ msgstr "Enable link-local/zeroconf messaging" + +#~ msgid "Nickname not found: %s" +#~ msgstr "Nickname not found: %s" + +#~ msgid "This group chat has no subject" +#~ msgstr "This group chat has no subject" + +#~ msgid "Invited %(contact_jid)s to %(room_jid)s." +#~ msgstr "Invited %(contact_jid)s to %(room_jid)s." + +#~ msgid "" +#~ "There is an ambiguity: %d nicks match.\n" +#~ " Please use graphical interface " +#~ msgstr "" +#~ "There is an ambiguity: %d nicks match.\n" +#~ " Please use graphical interface " + +#~ msgid "" +#~ "There is an ambiguity: %d nicks match.\n" +#~ " Please use graphical interface" +#~ msgstr "" +#~ "There is an ambiguity: %d nicks match.\n" +#~ " Please use graphical interface" + +#~ msgid "" +#~ "Usage: /%s <nickname|JID> [reason], bans the JID from the group chat. The " +#~ "nickname of an occupant may be substituted, but not if it contains \"@\". " +#~ "If the JID is currently in the group chat, he/she/it will also be kicked." +#~ msgstr "" +#~ "Usage: /%s <nickname|JID> [reason], bans the JID from the group chat. The " +#~ "nickname of an occupant may be substituted, but not if it contains \"@\". " +#~ "If the JID is currently in the group chat, he/she/it will also be kicked." + +#~ msgid "" +#~ "Usage: /%s [reason], closes the current window or tab, displaying reason " +#~ "if specified." +#~ msgstr "" +#~ "Usage: /%s [reason], closes the current window or tab, displaying reason " +#~ "if specified." + +#~ msgid "" +#~ "Usage: /%s <JID> [reason], invites JID to the current group chat, " +#~ "optionally providing a reason." +#~ msgstr "" +#~ "Usage: /%s <JID> [reason], invites JID to the current group chat, " +#~ "optionally providing a reason." + +#~ msgid "" +#~ "Usage: /%s <room>@<server>[/nickname], offers to join room@server " +#~ "optionally using specified nickname." +#~ msgstr "" +#~ "Usage: /%s <room>@<server>[/nickname], offers to join room@server " +#~ "optionally using specified nickname." + +#~ msgid "" +#~ "Usage: /%s <nickname> [reason], removes the occupant specified by " +#~ "nickname from the group chat and optionally displays a reason." +#~ msgstr "" +#~ "Usage: /%s <nickname> [reason], removes the occupant specified by " +#~ "nickname from the group chat and optionally displays a reason." + +#~ msgid "" +#~ "Usage: /%s <nickname> [message], opens a private message window and sends " +#~ "message to the occupant specified by nickname." +#~ msgstr "" +#~ "Usage: /%s <nickname> [message], opens a private message window and sends " +#~ "message to the occupant specified by nickname." + +#~ msgid "Usage: /%s <nickname>, changes your nickname in current group chat." +#~ msgstr "Usage: /%s <nickname>, changes your nickname in current group chat." + +#~ msgid "" +#~ "Usage: /%s [topic], displays or updates the current group chat topic." +#~ msgstr "" +#~ "Usage: /%s [topic], displays or updates the current group chat topic." + +#~ msgid "" +#~ "Usage: /%s <message>, sends a message without looking for other commands." +#~ msgstr "" +#~ "Usage: /%s <message>, sends a message without looking for other commands." + +#~ msgid "" +#~ "Usage: /%s <nickname>, prevent <nickname> to send you messages or private " +#~ "messages." +#~ msgstr "" +#~ "Usage: /%s <nickname>, prevent <nickname> to send you messages or private " +#~ "messages." + +#~ msgid "" +#~ "Usage: /%s <nickname>, allow <nickname> to send you messages and private " +#~ "messages." +#~ msgstr "" +#~ "Usage: /%s <nickname>, allow <nickname> to send you messages and private " +#~ "messages." + +#~ msgid "Click to see features (like MSN, ICQ transports) of jabber servers" +#~ msgstr "Click to see features (like MSN, ICQ transports) of jabber servers" + +#~ msgid "Servers Features" +#~ msgstr "Servers Features" + +#~ msgid "Your JID:" +#~ msgstr "Your JID:" + +#~ msgid "Name:" +#~ msgstr "Name:" + +#~ msgid "_Host:" +#~ msgstr "_Host:" + +#~ msgid "Select the account with which to synchronise" +#~ msgstr "Select the account with which to synchronise" + +#~ msgid "Modify Account" +#~ msgstr "Modify Account" + +#~ msgid "" +#~ "%(title)s by %(artist)s\n" +#~ "from %(source)s" +#~ msgstr "" +#~ "%(title)s by %(artist)s\n" +#~ "from %(source)s" + +#~ msgid "Gajim account %s" +#~ msgstr "Gajim account %s" + +#~ msgid "Duplicate Jabber ID" +#~ msgstr "Duplicate Jabber ID" + +#~ msgid "This account is already configured in Gajim." +#~ msgstr "This account is already configured in Gajim." + +#~ msgid "PyOpenSSL" +#~ msgstr "PyOpenSSL" + +#~ msgid "gajim-remote" +#~ msgstr "gajim-remote" + +#~ msgid "OpenGPG" +#~ msgstr "OpenGPG" + +#~ msgid "gnome-keyring" +#~ msgstr "gnome-keyring" + +#~ msgid "" +#~ "Requires python-gnome2-extras or compilation of gtkspell module from " +#~ "Gajim sources." +#~ msgstr "" +#~ "Requires python-gnome2-extras or compilation of gtkspell module from " +#~ "Gajim sources." + +#~ msgid "Notification-daemon" +#~ msgstr "Notification-daemon" + +#~ msgid "Idle" +#~ msgstr "Idle" + +#~ msgid "Requires compilation of the idle module from Gajim sources." +#~ msgstr "Requires compilation of the idle module from Gajim sources." + +#~ msgid "libsexy" +#~ msgstr "libsexy" + +#~ msgid "File transfer stopped by the contact at the other end" +#~ msgstr "File transfer stopped by the contact at the other end" + +#~ msgid "Generic" +#~ msgstr "Generic" + +#~ msgid "Mood" +#~ msgstr "Mood" + +#~ msgid "Activity" +#~ msgstr "Activity" + +#~ msgid "%s has not broadcast an OpenPGP key, nor has one been assigned" +#~ msgstr "%s has not broadcast an OpenPGP key, nor has one been assigned" + +#~ msgid "No such command: /%s (if you want to send this, prefix it with /say)" +#~ msgstr "" +#~ "No such command: /%s (if you want to send this, prefix it with /say)" + +#, fuzzy +#~ msgid "" +#~ "Usage: /%s <action>, sends action to the current group chat. Use third " +#~ "person. (e.g. /%s explodes.)" +#~ msgstr "" +#~ "Usage: /%(command)s <action>, sends action to the current group chat. Use " +#~ "third person. (e.g. /%(command)s explodes.)" + +#, fuzzy +#~ msgid "Encryption enabled" +#~ msgstr "E2E encryption enabled" + +#, fuzzy +#~ msgid "Encryption disabled" +#~ msgstr "E2E encryption disabled" + +#~ msgid "" +#~ "If checked, Gajim will sort contacts in roster window and groupchats by " +#~ "their status and not by the shown name" +#~ msgstr "" +#~ "If ticked, Gajim will sort contacts in roster window and groupchats by " +#~ "their status and not by the shown name" + +#~ msgid "A_ccounts" +#~ msgstr "A_ccounts" + +#~ msgid "<b>\"%(title)s\"</b> by " +#~ msgstr "<b>\"%(title)s\"</b> by " + +#~ msgid "%(title)s by %(artist)s\n" +#~ msgstr "%(title)s by %(artist)s\n" + +#~ msgid "The username used to identify the Last.fm account." +#~ msgstr "The username used to identify the Last.fm account." + +#~ msgid "Thoughtful" +#~ msgstr "Thoughtful" + +#~ msgid "Network Manager support not available" +#~ msgstr "Network Manager support not available" + +#~ msgid "Session Management support not available (missing gnome.ui module)" +#~ msgstr "Session Management support not available (missing gnome.ui module)" + +#~ msgid "_Retype Password:" +#~ msgstr "_Retype Password:" + +#~ 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 "" +#~ "If ticked, 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." + +#~ msgid "" +#~ "If you have 2 or more accounts and this is checked, Gajim will list all " +#~ "contacts as if you had one account" +#~ msgstr "" +#~ "If you have two or more accounts and this is ticked, Gajim will list all " +#~ "contacts as if you had one account" + +#~ msgid "_Enable link-local messaging" +#~ msgstr "_Enable link-local messaging" + +#~ msgid "2003-12-13T18:30:02Z" +#~ msgstr "2003-12-13T18:30:02Z" + +#~ msgid "<small>Romeo and Juliet</small>" +#~ msgstr "<small>Romeo and Juliet</small>" + +#~ msgid "Soliloquy" +#~ msgstr "Soliloquy" + +#~ msgid "_Compact View Alt+C" +#~ msgstr "_Compact View Alt+C" + +#~ msgid "Click to see past conversation in this room" +#~ msgstr "Click to see past conversation in this room" + +#~ msgid "Build custom query" +#~ msgstr "Build custom query" + +#~ msgid "Query Builder..." +#~ msgstr "Query Builder..." + +#~ msgid "Invitation Received" +#~ msgstr "Invitation Received" + +#~ msgid "<b>Format of a line</b>" +#~ msgstr "<b>Format of a line</b>" + +#~ msgid "<b>Interface Customization</b>" +#~ msgstr "<b>Interface Customisation</b>" + +#~ msgid "Also known as iChat style" +#~ msgstr "Also known as iChat style" + +#~ 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 "" +#~ "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" + +#~ msgid "Chat" +#~ msgstr "Chat" + +#~ msgid "" +#~ "Determined by sender\n" +#~ "Chat message\n" +#~ "Single message" +#~ msgstr "" +#~ "Determined by sender\n" +#~ "Chat message\n" +#~ "Single message" + +#~ msgid "E_very 5 minutes" +#~ msgstr "E_very 5 minutes" + +#~ msgid "" +#~ "Gajim will automatically show new events by popping up the relative window" +#~ msgstr "" +#~ "Gajim will automatically show new events by popping up the relative window" + +#~ msgid "" +#~ "Gajim will notify you for new events via a popup in the bottom right of " +#~ "the screen" +#~ msgstr "" +#~ "Gajim will notify you for new events via a pop-up in the bottom right of " +#~ "the screen" + +#~ msgid "" +#~ "Gajim will notify you via a popup window in the bottom right of the " +#~ "screen about contacts that just signed in" +#~ msgstr "" +#~ "Gajim will notify you via a pop-up window in the bottom right of the " +#~ "screen about contacts that just signed in" + +#~ msgid "" +#~ "Gajim will only change the icon of the contact that triggered the new " +#~ "event" +#~ msgstr "" +#~ "Gajim will only change the icon of the contact that triggered the new " +#~ "event" + +#~ 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 "" +#~ "If ticked, Gajim will remember the roster and chat window positions in " +#~ "the screen and the sizes of them next time you run it" + +#~ msgid "" +#~ "Never\n" +#~ "Always\n" +#~ "Per account\n" +#~ "Per type" +#~ msgstr "" +#~ "Never\n" +#~ "Always\n" +#~ "Per account\n" +#~ "Per type" + +#~ msgid "Outgoing Chat state noti_fications:" +#~ msgstr "Outgoing Chat state noti_fications:" + +#~ msgid "Print time:" +#~ msgstr "Print time:" + +#~ msgid "Save _position and size for roster and chat windows" +#~ msgstr "Save _position and size for roster and chat windows" + +#~ msgid "Set status message to reflect currently playing _music track" +#~ msgstr "Set status message to reflect currently playing _music track" + +#~ msgid "The auto away status message" +#~ msgstr "The auto away status message" + +#~ msgid "The auto not available status message" +#~ msgstr "The auto not available status message" + +#~ 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 "" +#~ "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" + +#~ msgid "" +#~ "Works for Rhythmbox and Muine players. For more players, please visit " +#~ "http://trac.gajim.org/wiki/GajimAndMusicPlayer" +#~ msgstr "" +#~ "Works for Rhythmbox and Muine players. For more players, please visit " +#~ "http://trac.gajim.org/wiki/GajimAndMusicPlayer" + +#~ msgid "_Advanced Notifications Control..." +#~ msgstr "_Advanced Notifications Control..." + +#~ msgid "_Player:" +#~ msgstr "_Player:" + +#~ msgid "City:" +#~ msgstr "City:" + +#~ msgid "Company:" +#~ msgstr "Company:" + +#~ msgid "Given:" +#~ msgstr "Given:" + +#~ msgid "Middle:" +#~ msgstr "Middle:" + +#~ msgid "Position:" +#~ msgstr "Position:" + +#~ msgid "Prefix:" +#~ msgstr "Prefix:" + +#~ msgid "Role:" +#~ msgstr "Role:" + +#~ msgid "State:" +#~ msgstr "State:" + +#~ msgid "Suffix:" +#~ msgstr "Suffix:" + +#~ msgid "_Remove from Roster" +#~ msgstr "_Remove from Roster" + +#~ msgid "_Filter:" +#~ msgstr "_Filter:" + +#~ msgid "Ask:" +#~ msgstr "Ask:" + +#~ msgid "Client:" +#~ msgstr "Client:" + +#~ msgid "OS:" +#~ msgstr "OS:" + +#~ msgid "Subscription:" +#~ msgstr "Subscription:" + +#~ msgid "" +#~ "If that is not your language for which you want to highlight misspelled " +#~ "words, then please set your $LANG as appropriate. Eg. for French do " +#~ "export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to " +#~ "make it global in /etc/profile.\n" +#~ "\n" +#~ "Highlighting misspelled words feature will not be used" +#~ msgstr "" +#~ "If that is not your language for which you want to highlight misspelt " +#~ "words, then please set your $LANG as appropriate. Eg. for French do " +#~ "export LANG=fr_FR or export LANG=fr_FR.UTF-8 in ~/.bash_profile or to " +#~ "make it global in /etc/profile.\n" +#~ "\n" +#~ "Highlighting misspelt words feature will not be used" + +#~ msgid "Every %s _minutes" +#~ msgstr "Every %s _minutes" + +#~ msgid "You must enter a password for the new account." +#~ msgstr "You must enter a password for the new account." + +#~ msgid "You will always see him or her as offline." +#~ msgstr "You will always see him or her as offline." + +#~ msgid "%s is now %s (%s)" +#~ msgstr "%s is now %s (%s)" + +#~ msgid "%s is now %s" +#~ msgstr "%s is now %s" + +#~ msgid "" +#~ "\n" +#~ "From: %(from_address)s" +#~ msgstr "" +#~ "\n" +#~ "From: %(from_address)s" + +#~ msgid "" +#~ "Usage: %s %s %s \n" +#~ "\t %s" +#~ msgstr "" +#~ "Usage: %s %s %s \n" +#~ "\t %s" + +#~ msgid "Private Chat" +#~ msgstr "Private Chat" + +#~ msgid "Group Chat" +#~ msgstr "Group Chat" + +#~ msgid "%s does not appear to be a valid JID" +#~ msgstr "%s does not appear to be a valid JID" + +#~ msgid "%s - Gajim" +#~ msgstr "%s - Gajim" + +#~ msgid "_New group chat" +#~ msgstr "_New group chat" + +#~ msgid "_Log on" +#~ msgstr "_Log on" + +#~ msgid "Log _off" +#~ msgstr "Log _off" + +#~ msgid "Save passphrase" +#~ msgstr "Save passphrase" + +#~ msgid "Drop %s in group %s" +#~ msgstr "Drop %s in group %s" + +#~ msgid "Hides the buttons in two persons chat window." +#~ msgstr "Hides the buttons in two persons chat window." + +#~ msgid "Connected to server %s:%s with %s" +#~ msgstr "Connected to server %s:%s with %s" + +#~ msgid "invisible" +#~ msgstr "invisible" + +#~ msgid "offline" +#~ msgstr "offline" + +#~ msgid " %d unread single message" + +#~ msgid_plural " %d unread single messages" +#~ msgstr[0] " %d unread single message" +#~ msgstr[1] " %d unread single messages" + +#~ msgid " %d unread group chat message" + +#~ msgid_plural " %d unread group chat messages" +#~ msgstr[0] " %d unread group chat message" +#~ msgstr[1] " %d unread group chat messages" + +#~ msgid " %d unread private message" + +#~ msgid_plural " %d unread private messages" +#~ msgstr[0] " %d unread private message" +#~ msgstr[1] " %d unread private messages" + +#~ msgid "gtk+" +#~ msgstr "gtk+" + +#~ msgid "" +#~ "Connection to host could not be established: Incorrect answer from server." +#~ msgstr "" +#~ "Connection to host could not be established: Incorrect answer from server." + +#~ msgid "Connection to host could not be established" +#~ msgstr "Connection to host could not be established" + +#~ msgid "A_fter nickname:" +#~ msgstr "A_fter nickname:" + +#~ msgid "_After time:" +#~ msgstr "_After time:" + +#~ msgid "_Before time:" +#~ msgstr "_Before time:" + +#~ msgid "_Retrieve" +#~ msgstr "_Retrieve" + +#~ msgid "Information published" +#~ msgstr "Information published" + +#~ msgid "Without a connection, you can not get your contact information." +#~ msgstr "Without a connection, you can not get your contact information." + +#~ msgid "This is result of query." +#~ msgstr "This is result of query." + +#~ msgid "Edit items on the list" +#~ msgstr "Edit items on the list" diff --git a/po/ru.po b/po/ru.po index 5514a3c23b4fbc7edca1c6cfa6a1ddff3ab23537..a534086712899c4d81e8cfb092cbc34326d5a668 100644 --- a/po/ru.po +++ b/po/ru.po @@ -12,18 +12,17 @@ msgid "" msgstr "" "Project-Id-Version: ru\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-26 09:36+0400\n" -"PO-Revision-Date: 2013-08-26 10:00+0300\n" -"Last-Translator: Fomin Denis <fominde@gmail.com>\n" +"POT-Creation-Date: 2012-11-15 14:27+0400\n" +"PO-Revision-Date: 2012-11-15 14:56+0300\n" +"Last-Translator: Fomin Denis <fominde@mail.ru>\n" "Language-Team: Linux Support LLC\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Poedit-Basepath: /home/test/gajim\n" -"X-Generator: Poedit 1.5.4\n" +"X-Generator: Virtaal 0.6.1\n" #: ../data/gui/account_context_menu.ui.h:1 #: ../data/gui/zeroconf_context_menu.ui.h:1 @@ -34,11 +33,13 @@ msgstr "_СтатуÑ" msgid "_Personal Events" msgstr "_РаÑширенный ÑтатуÑ" -#: ../data/gui/account_context_menu.ui.h:3 ../data/gui/roster_window.ui.h:3 +#: ../data/gui/account_context_menu.ui.h:3 +#: ../data/gui/roster_window.ui.h:3 msgid "_Start Chat..." msgstr "_Ðачать беÑеду..." -#: ../data/gui/account_context_menu.ui.h:4 ../data/gui/roster_window.ui.h:5 +#: ../data/gui/account_context_menu.ui.h:4 +#: ../data/gui/roster_window.ui.h:5 msgid "Join _Group Chat..." msgstr "Войти в _комнату..." @@ -46,7 +47,8 @@ msgstr "Войти в _комнату..." msgid "_Add Contact..." msgstr "_Добавить контакт..." -#: ../data/gui/account_context_menu.ui.h:6 ../data/gui/roster_window.ui.h:7 +#: ../data/gui/account_context_menu.ui.h:6 +#: ../data/gui/roster_window.ui.h:7 msgid "_Discover Services" msgstr "_ПроÑмотреть ÑервиÑÑ‹" @@ -180,14 +182,27 @@ msgid "_Finish" msgstr "_Закончить" #: ../data/gui/account_creation_wizard_window.ui.h:30 -#: ../data/gui/accounts_window.ui.h:1 ../data/gui/change_mood_dialog.ui.h:1 -#: ../src/config.py:1253 ../src/config.py:1267 ../src/config.py:1272 -#: ../src/config.py:1320 ../src/config.py:1423 ../src/config.py:1742 -#: ../src/config.py:1747 ../src/config.py:2339 ../src/config.py:2420 -#: ../src/config.py:2435 ../src/config.py:3716 ../src/config.py:3791 -#: ../src/dialogs.py:315 ../src/dialogs.py:317 ../src/dialogs.py:523 -#: ../src/dialogs.py:536 ../src/roster_window.py:3149 -#: ../src/roster_window.py:3155 ../src/roster_window.py:3160 +#: ../data/gui/accounts_window.ui.h:1 +#: ../data/gui/change_mood_dialog.ui.h:1 +#: ../src/config.py:1254 +#: ../src/config.py:1268 +#: ../src/config.py:1273 +#: ../src/config.py:1321 +#: ../src/config.py:1424 +#: ../src/config.py:1739 +#: ../src/config.py:1744 +#: ../src/config.py:2320 +#: ../src/config.py:2399 +#: ../src/config.py:2412 +#: ../src/config.py:3698 +#: ../src/config.py:3773 +#: ../src/dialogs.py:313 +#: ../src/dialogs.py:315 +#: ../src/dialogs.py:521 +#: ../src/dialogs.py:534 +#: ../src/roster_window.py:3214 +#: ../src/roster_window.py:3220 +#: ../src/roster_window.py:3225 msgid "None" msgstr "Ðет" @@ -196,24 +211,28 @@ msgid "Accounts" msgstr "Учётные запиÑи" #. Change label for accept_button to action name instead of 'OK'. -#: ../data/gui/accounts_window.ui.h:3 ../src/dialogs.py:3524 -#: ../src/dialogs.py:3570 +#: ../data/gui/accounts_window.ui.h:3 +#: ../src/dialogs.py:3426 +#: ../src/dialogs.py:3472 msgid "Add" msgstr "Добавить" #. Change label for accept_button to action name instead of 'OK'. -#: ../data/gui/accounts_window.ui.h:4 ../src/dialogs.py:3528 -#: ../src/dialogs.py:3625 +#: ../data/gui/accounts_window.ui.h:4 +#: ../src/dialogs.py:3430 +#: ../src/dialogs.py:3527 msgid "Delete" msgstr "Удалить" #. Rename -#: ../data/gui/accounts_window.ui.h:5 ../src/roster_window.py:5794 +#: ../data/gui/accounts_window.ui.h:5 +#: ../src/roster_window.py:5844 msgid "Re_name" msgstr "П_ереименовать" #. XML Console enable checkbutton -#: ../data/gui/accounts_window.ui.h:6 ../data/gui/xml_console_window.ui.h:3 +#: ../data/gui/accounts_window.ui.h:6 +#: ../data/gui/xml_console_window.ui.h:3 msgid "_Enable" msgstr "_Включить" @@ -222,35 +241,30 @@ msgid "Anonymous authentication" msgstr "ÐÐ½Ð¾Ð½Ð¸Ð¼Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ" #: ../data/gui/accounts_window.ui.h:8 -msgid "" -"Resource is sent to the Jabber server in order to separate the same JID in " -"two or more parts depending on the number of the clients connected in the " -"same server with the same account. So you might be connected in the same " -"account with resource 'Home' and 'Work' at the same time. The resource which " -"has the highest priority will get the events. (see below)" -msgstr "" -"РеÑÑƒÑ€Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÑетÑÑ Jabber Ñерверу Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы различать два и более " -"клиентов Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾Ð¹ учетной запиÑью, подключенных к одному и тому же " -"Ñерверу. Таким образом, вы можете одновременно подключитьÑÑ Ðº одному Ñерверу " -"Ñ Ñ€ÐµÑурÑов 'Дом' или 'Работа'. РеÑурÑ, обладающий большим приоритетом, будет " -"получать вÑе ÑобытиÑ. (См. ниже)" +msgid "Resource is sent to the Jabber server in order to separate the same JID in two or more parts depending on the number of the clients connected in the same server with the same account. So you might be connected in the same account with resource 'Home' and 'Work' at the same time. The resource which has the highest priority will get the events. (see below)" +msgstr "РеÑÑƒÑ€Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÑетÑÑ Jabber Ñерверу Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы различать два и более клиентов Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾Ð¹ учетной запиÑью, подключенных к одному и тому же Ñерверу. Таким образом, вы можете одновременно подключитьÑÑ Ðº одному Ñерверу Ñ Ñ€ÐµÑурÑов 'Дом' или 'Работа'. РеÑурÑ, обладающий большим приоритетом, будет получать вÑе ÑобытиÑ. (См. ниже)" #. No configured account -#: ../data/gui/accounts_window.ui.h:9 ../data/gui/roster_window.ui.h:1 -#: ../data/gajim.desktop.in.in.h:1 ../src/common/helpers.py:1168 -#: ../src/common/helpers.py:1180 ../src/notify.py:316 ../src/notify.py:339 -#: ../src/notify.py:389 ../src/notify.py:405 +#: ../data/gui/accounts_window.ui.h:9 +#: ../data/gui/roster_window.ui.h:1 +#: ../data/gajim.desktop.in.in.h:1 +#: ../src/common/helpers.py:1168 +#: ../src/common/helpers.py:1180 +#: ../src/notify.py:316 +#: ../src/notify.py:339 +#: ../src/notify.py:389 +#: ../src/notify.py:405 msgid "Gajim" msgstr "Gajim" #: ../data/gui/accounts_window.ui.h:10 +#, fuzzy msgid "Synchronize contacts" -msgstr "Синхронизировать контакты" +msgstr "Объединить контакты" #: ../data/gui/accounts_window.ui.h:11 msgid "Click to request authorization to all contacts of another account" -msgstr "" -"Щелкните, чтобы запроÑить авторизацию у вÑех контактов другой учетной запиÑи" +msgstr "Щелкните, чтобы запроÑить авторизацию у вÑех контактов другой учетной запиÑи" #: ../data/gui/accounts_window.ui.h:12 msgid "Chan_ge Password" @@ -265,15 +279,8 @@ msgid "Administration operations" msgstr "ÐдминиÑтративные операции" #: ../data/gui/accounts_window.ui.h:15 -msgid "" -"Priority is used in Jabber to determine who gets the events from the jabber " -"server when two or more clients are connected using the same account; The " -"client with the highest priority gets the events" -msgstr "" -"Приоритет иÑпользуетÑÑ Ð² Jabber Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð³Ð¾, кто будет получать " -"ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¾Ñ‚ jabber Ñервера когда подÑоединены два и более клиента Ñ Ð¾Ð´Ð½Ð¾Ð¹ и " -"той же учетной запиÑью. Клиент Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ приоритетом будет получать " -"ÑобытиÑ" +msgid "Priority is used in Jabber to determine who gets the events from the jabber server when two or more clients are connected using the same account; The client with the highest priority gets the events" +msgstr "Приоритет иÑпользуетÑÑ Ð² Jabber Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð³Ð¾, кто будет получать ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¾Ñ‚ jabber Ñервера когда подÑоединены два и более клиента Ñ Ð¾Ð´Ð½Ð¾Ð¹ и той же учетной запиÑью. Клиент Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ приоритетом будет получать ÑобытиÑ" #: ../data/gui/accounts_window.ui.h:16 msgid "A_djust to status" @@ -302,7 +309,7 @@ msgstr "_ПроÑмотреть..." #: ../data/gui/accounts_window.ui.h:26 #, fuzzy msgid "Certificate is e_ncrypted" -msgstr "ÐедейÑтвительный Ñертификат" +msgstr "Сертификат отклонен" #: ../data/gui/accounts_window.ui.h:27 msgid "Client certificate" @@ -318,12 +325,8 @@ msgid "C_onnect on Gajim startup" msgstr "_СоединÑÑ‚ÑŒÑÑ Ð¿Ñ€Ð¸ запуÑке Gajim" #: ../data/gui/accounts_window.ui.h:30 -msgid "" -"If checked, Gajim, when launched, will automatically connect to jabber using " -"this account" -msgstr "" -"ЕÑли отмечено, Gajim поÑле запуÑка будет автоматичеÑки подÑоединÑÑ‚ÑŒÑÑ Ðº " -"jabber Ñерверу Ñ Ð¸Ñпользованием Ñтой учетной запиÑи" +msgid "If checked, Gajim, when launched, will automatically connect to jabber using this account" +msgstr "ЕÑли отмечено, Gajim поÑле запуÑка будет автоматичеÑки подÑоединÑÑ‚ÑŒÑÑ Ðº jabber Ñерверу Ñ Ð¸Ñпользованием Ñтой учетной запиÑи" #: ../data/gui/accounts_window.ui.h:31 msgid "Auto-reconnect when connection is lost" @@ -338,35 +341,29 @@ msgid "Synch_ronize account status with global status" msgstr "Син_хронизировать ÑÑ‚Ð°Ñ‚ÑƒÑ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ñ‹Ð¼ ÑтатуÑом" #: ../data/gui/accounts_window.ui.h:34 -msgid "" -"If checked, any change to the global status (handled by the combobox at the " -"bottom of the roster window) will change the status of this account " -"accordingly" -msgstr "" -"ЕÑли отмечено, то любые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ ÑтатуÑа (управлÑемого из " -"выпадающего ÑпиÑка внизу окна роÑтера) повлекут за Ñобой изменение ÑтатуÑа " -"Ñтой учетной запиÑи" +msgid "If checked, any change to the global status (handled by the combobox at the bottom of the roster window) will change the status of this account accordingly" +msgstr "ЕÑли отмечено, то любые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ ÑтатуÑа (управлÑемого из выпадающего ÑпиÑка внизу окна роÑтера) повлекут за Ñобой изменение ÑтатуÑа Ñтой учетной запиÑи" #: ../data/gui/accounts_window.ui.h:35 msgid "Use file transfer proxies" msgstr "ИÑпользовать прокÑи Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ файла" #: ../data/gui/accounts_window.ui.h:36 -msgid "" -"If checked, Gajim will also broadcast some more IPs except from just your " -"IP, so file transfer has higher chances of working." -msgstr "" -"ЕÑли отмечено, Gajim будет передавать еще неÑколько IP адреÑов в дополнение " -"к вашему, так что передача файла имеет больше шанÑов на уÑпех." +msgid "If checked, Gajim will also broadcast some more IPs except from just your IP, so file transfer has higher chances of working." +msgstr "ЕÑли отмечено, Gajim будет передавать еще неÑколько IP адреÑов в дополнение к вашему, так что передача файла имеет больше шанÑов на уÑпех." #. FIXME: Ugly workaround. #. FIXME: Ugly workaround. #. Maybe we haven't been in any group (defaults to General) #. General group cannot be changed -#: ../data/gui/accounts_window.ui.h:37 ../data/gui/preferences_window.ui.h:41 -#: ../src/common/contacts.py:135 ../src/dialogs.py:115 ../src/dialogs.py:127 -#: ../src/roster_window.py:3091 ../src/roster_window.py:4217 -#: ../src/roster_window.py:5844 +#: ../data/gui/accounts_window.ui.h:37 +#: ../data/gui/preferences_window.ui.h:46 +#: ../src/common/contacts.py:135 +#: ../src/dialogs.py:113 +#: ../src/dialogs.py:125 +#: ../src/roster_window.py:3156 +#: ../src/roster_window.py:4284 +#: ../src/roster_window.py:5894 msgid "General" msgstr "Общие" @@ -374,7 +371,8 @@ msgstr "Общие" msgid "_use HTTP__PROXY environment variable" msgstr "_иÑпользовать переменную HTTP_PROXY" -#: ../data/gui/accounts_window.ui.h:39 ../data/gui/preferences_window.ui.h:134 +#: ../data/gui/accounts_window.ui.h:39 +#: ../data/gui/preferences_window.ui.h:137 msgid "_Manage..." msgstr "_Управление..." @@ -388,24 +386,16 @@ msgid "_Warn before using an insecure connection" msgstr "_Предупреждать перед иÑпользованием незащищенного ÑоединениÑ" #: ../data/gui/accounts_window.ui.h:42 -msgid "" -"Check this so Gajim will ask you before sending your password over an " -"insecure connection." -msgstr "" -"ЕÑли отмечено, то Gajim будет Ñпрашивать Ð²Ð°Ñ Ð¿ÐµÑ€ÐµÐ´ отправкой Ð¿Ð°Ñ€Ð¾Ð»Ñ Ñ‡ÐµÑ€ÐµÐ· " -"незащищенное Ñоединение." +msgid "Check this so Gajim will ask you before sending your password over an insecure connection." +msgstr "ЕÑли отмечено, то Gajim будет будет Ñпрашивать Ð²Ð°Ñ Ð¿ÐµÑ€ÐµÐ´ отправкой Ð¿Ð°Ñ€Ð¾Ð»Ñ Ñ‡ÐµÑ€ÐµÐ· незащищенное Ñоединение." #: ../data/gui/accounts_window.ui.h:43 msgid "Send _keep-alive packets" msgstr "ОтправлÑÑ‚ÑŒ _пинг" #: ../data/gui/accounts_window.ui.h:44 -msgid "" -"If checked, Gajim will send keep-alive packets to prevent connection timeout " -"which results in disconnection" -msgstr "" -"ЕÑли отмечено, то Gajim будет пинговать Ñервер, чтобы избежать разрыва " -"ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ таймауту" +msgid "If checked, Gajim will send keep-alive packets to prevent connection timeout which results in disconnection" +msgstr "ЕÑли отмечено, то Gajim будет пинговать Ñервер, чтобы избежать разрыва ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ таймауту" #: ../data/gui/accounts_window.ui.h:45 msgid "Use cust_om hostname/port" @@ -419,7 +409,8 @@ msgstr "_ХоÑÑ‚: " msgid "_Port: " msgstr "_Порт:" -#: ../data/gui/accounts_window.ui.h:48 ../data/gui/preferences_window.ui.h:138 +#: ../data/gui/accounts_window.ui.h:48 +#: ../data/gui/preferences_window.ui.h:141 msgid "<b>Miscellaneous</b>" msgstr "<b>Прочее</b>" @@ -427,8 +418,9 @@ msgstr "<b>Прочее</b>" msgid "Connection" msgstr "Соединение" -#: ../data/gui/accounts_window.ui.h:50 ../src/config.py:1840 -#: ../src/config.py:2436 +#: ../data/gui/accounts_window.ui.h:50 +#: ../src/config.py:1835 +#: ../src/config.py:2413 msgid "No key selected" msgstr "Ðе выбран ключ" @@ -460,7 +452,8 @@ msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ ваÑ, ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð½Ð°Ñ Ð½Ð° Ñервер msgid "<b>Personal Information</b>" msgstr "<b>Ð›Ð¸Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ</b>" -#: ../data/gui/accounts_window.ui.h:58 ../data/gui/profile_window.ui.h:1 +#: ../data/gui/accounts_window.ui.h:58 +#: ../data/gui/profile_window.ui.h:1 msgid "Personal Information" msgstr "Ð›Ð¸Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ" @@ -478,12 +471,10 @@ msgstr "_Другой порт:" #: ../data/gui/accounts_window.ui.h:62 msgid "" -"If the default port that is used for incoming messages is unfitting for your " -"setup you can select another one here.\n" +"If the default port that is used for incoming messages is unfitting for your setup you can select another one here.\n" "You might consider to change possible firewall settings." msgstr "" -"ЕÑли порт по умолчанию, который иÑпользуетÑÑ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих Ñообщений Ð²Ð°Ñ Ð½Ðµ " -"уÑтраивает, вы можете выбрать другой.\n" +"ЕÑли порт по умолчанию, который иÑпользуетÑÑ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð²Ð°Ñ Ð½Ðµ уÑтраивает, вы можете выбрать другой.\n" "Также, возможно, придетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ некоторые наÑтройки брандмауÑра." #: ../data/gui/accounts_window.ui.h:64 @@ -502,8 +493,9 @@ msgid "E-Mail:" msgstr "Почта:" #: ../data/gui/accounts_window.ui.h:67 -#: ../data/gui/zeroconf_information_window.ui.h:7 ../src/config.py:1867 -#: ../src/dialogs.py:841 +#: ../data/gui/zeroconf_information_window.ui.h:7 +#: ../src/config.py:1862 +#: ../src/dialogs.py:839 msgid "Jabber ID:" msgstr "Jabber ID:" @@ -568,12 +560,14 @@ msgstr "" "Чтобы добавить контакт Ð´Ð»Ñ Ñтого протокола,\n" "нужно ÑоединитьÑÑ Ñ Ñ‚Ñ€Ð°Ð½Ñпортом." -#: ../data/gui/add_new_contact_window.ui.h:16 ../src/common/helpers.py:1366 +#: ../data/gui/add_new_contact_window.ui.h:16 +#: ../src/common/helpers.py:1363 msgid "I would like to add you to my contact list." msgstr "Ð’Ñ‹ не возражаете, еÑли Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑŽ Ð’Ð°Ñ Ð² контакт-лиÑÑ‚?" #. displaying the window -#: ../data/gui/adhoc_commands_window.ui.h:1 ../src/adhoc_commands.py:104 +#: ../data/gui/adhoc_commands_window.ui.h:1 +#: ../src/adhoc_commands.py:102 msgid "Ad-hoc Commands - Gajim" msgstr "Специальные команды — Gajim" @@ -590,9 +584,8 @@ msgid "Check once more" msgstr "Проверить еще раз" #: ../data/gui/adhoc_commands_window.ui.h:5 -#, fuzzy -msgid "Please wait while the command is being sent..." -msgstr "пожалуйÑта, подождите, пока будет генерироватьÑÑ ÐºÐ»ÑŽÑ‡ ...\n" +msgid "Please wait while the command is sending..." +msgstr "ПроиÑходит отправка команды. Подождите..." #: ../data/gui/adhoc_commands_window.ui.h:6 msgid "Please wait..." @@ -629,13 +622,12 @@ msgstr "<b>ОпиÑание</b>" #: ../data/gui/advanced_configuration_window.ui.h:4 msgid "<b>NOTE:</b> You should restart Gajim for some settings to take effect" -msgstr "" -"<b>ПРИМЕЧÐÐИЕ:</b> Ðеобходимо перезапуÑтить Gajim, чтобы некоторые наÑтройки " -"вÑтупили в Ñилу" +msgstr "<b>ПРИМЕЧÐÐИЕ:</b> Ðеобходимо перезапуÑтить Gajim, чтобы некоторые наÑтройки вÑтупили в Ñилу" #: ../data/gui/advanced_configuration_window.ui.h:5 +#, fuzzy msgid "_Reset to default" -msgstr "_СброÑить до иÑходных" +msgstr "_ВернутьÑÑ Ðº цветам по умолчанию" #: ../data/gui/advanced_menuitem_menu.ui.h:1 msgid "Show _XML Console" @@ -659,8 +651,7 @@ msgstr "_Отправить Ñообщение Ñервера..." #: ../data/gui/advanced_menuitem_menu.ui.h:6 msgid "Sends a message to users currently connected to this server" -msgstr "" -"ОтправлÑет Ñообщение пользователÑм, подÑоединенным к Ñерверу в данный момент" +msgstr "ОтправлÑет Ñообщение пользователÑм подÑоединенным к Ñерверу в данный момент" #: ../data/gui/advanced_menuitem_menu.ui.h:7 msgid "Sets Message of the Day" @@ -692,49 +683,45 @@ msgid "No" msgstr "Ðет" #: ../data/gui/archiving_preferences_window.ui.h:2 -#, fuzzy msgid "Yes" -msgstr "Да" +msgstr "" #: ../data/gui/archiving_preferences_window.ui.h:3 #, fuzzy msgid "Prefer" -msgstr "Предпочитать обычный текÑÑ‚" +msgstr "ÐаÑтройки" #: ../data/gui/archiving_preferences_window.ui.h:4 msgid "Concede" msgstr "" #: ../data/gui/archiving_preferences_window.ui.h:5 -#, fuzzy msgid "Forbid" -msgstr "^Запретить верÑию" +msgstr "" #: ../data/gui/archiving_preferences_window.ui.h:6 -#, fuzzy msgid "<i>Method Manual</i>" -msgstr "РуководÑтво Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Anjuta" +msgstr "" #: ../data/gui/archiving_preferences_window.ui.h:7 -#, fuzzy msgid "<i>Method Local</i>" -msgstr "Локальный JID:" +msgstr "" #: ../data/gui/archiving_preferences_window.ui.h:8 -#, fuzzy msgid "<i>Method Auto</i>" -msgstr "<b>Ðвто ÑтатуÑ</b>" +msgstr "" #: ../data/gui/archiving_preferences_window.ui.h:9 #, fuzzy msgid "Auto" -msgstr "Ðвто" +msgstr "ÐвтоматичеÑкое приÑоединение" #: ../data/gui/atom_entry_window.ui.h:1 msgid "New entry received" msgstr "Получена Ð½Ð¾Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ" -#: ../data/gui/atom_entry_window.ui.h:2 ../src/atom_window.py:128 +#: ../data/gui/atom_entry_window.ui.h:2 +#: ../src/atom_window.py:128 msgid "You have received new entry:" msgstr "Получена Ð½Ð¾Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ:" @@ -751,9 +738,8 @@ msgid "Last modified:" msgstr "ПоÑледнее изменение:" #: ../data/gui/atom_entry_window.ui.h:6 -#, fuzzy msgid "Next entry" -msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ" +msgstr "" #: ../data/gui/blocked_contacts_window.ui.h:1 msgid "Blocked Contacts" @@ -761,8 +747,10 @@ msgstr "Заблокированные контакты" #: ../data/gui/blocked_contacts_window.ui.h:2 #: ../data/gui/contact_context_menu.ui.h:20 -#: ../data/gui/gc_occupants_menu.ui.h:14 ../src/roster_window.py:5813 -#: ../src/roster_window.py:5940 ../src/roster_window.py:6073 +#: ../data/gui/gc_occupants_menu.ui.h:14 +#: ../src/roster_window.py:5863 +#: ../src/roster_window.py:5990 +#: ../src/roster_window.py:6123 msgid "_Unblock" msgstr "_Разблокировать" @@ -849,86 +837,106 @@ msgstr "Войти в _комнату" msgid "_Add to Roster..." msgstr "_Добавить в роÑтер..." -#: ../data/gui/chat_control.ui.h:1 ../data/gui/groupchat_control.ui.h:1 +#: ../data/gui/chat_control.ui.h:1 +#: ../data/gui/groupchat_control.ui.h:1 msgid "Show a list of emoticons (Alt+M)" msgstr "Показать набор Ñмайлов (Alt+M)" #: ../data/gui/chat_control.ui.h:2 +#: ../data/gui/groupchat_control.ui.h:2 +msgid "Show a list of formattings" +msgstr "Показать ÑпиÑок форматированиÑ" + +#: ../data/gui/chat_control.ui.h:3 msgid "Add this contact to roster (Ctrl+D)" msgstr "Добавить контакт в роÑтер (Ctrl+D)" -#: ../data/gui/chat_control.ui.h:3 +#. change tooltip text for audio and video buttons if python-farstream is +#. not installed +#: ../data/gui/chat_control.ui.h:4 +#: ../src/chat_control.py:1724 +#: ../src/command_system/implementation/standard.py:214 +msgid "Toggle audio session" +msgstr "Переключить аудио ÑеанÑ" + +#: ../data/gui/chat_control.ui.h:5 +#: ../src/chat_control.py:1725 +#: ../src/command_system/implementation/standard.py:224 +msgid "Toggle video session" +msgstr "Переключить видео ÑеанÑ" + +#: ../data/gui/chat_control.ui.h:6 msgid "Invite contacts to the conversation (Ctrl+G)" msgstr "ПриглаÑить к беÑеде (Ctrl+G)" -#: ../data/gui/chat_control.ui.h:4 -msgid "View contact information (Ctrl+I)" +#: ../data/gui/chat_control.ui.h:7 +msgid "Show the contact's profile (Ctrl+I)" msgstr "Показать информацию о контакте (Ctrl+I)" -#: ../data/gui/chat_control.ui.h:5 ../data/gui/groupchat_control.ui.h:6 +#: ../data/gui/chat_control.ui.h:8 +#: ../data/gui/groupchat_control.ui.h:6 msgid "Browse the chat history (Ctrl+H)" msgstr "Открыть иÑторию чата (Ctrl+H)" -#: ../data/gui/chat_control.ui.h:6 ../data/gui/groupchat_control.ui.h:7 -msgid "Show advanced functions (Alt+D)" +#: ../data/gui/chat_control.ui.h:9 +#: ../data/gui/groupchat_control.ui.h:7 +msgid "Show a menu of advanced functions (Alt+D)" msgstr "Показать меню дополнительных функций (Alt+D)" -#: ../data/gui/chat_control.ui.h:7 +#: ../data/gui/chat_control.ui.h:10 msgid "#" msgstr "â„–" -#: ../data/gui/chat_control.ui.h:8 ../data/gui/groupchat_control.ui.h:8 -#: ../data/gui/single_message_window.ui.h:6 -msgid "Send message" -msgstr "Отправить Ñообщение" - #. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) -#: ../data/gui/chat_control.ui.h:10 ../data/gui/groupchat_control.ui.h:10 -#: ../data/gui/xml_console_window.ui.h:15 ../src/filetransfers_window.py:322 +#: ../data/gui/chat_control.ui.h:12 +#: ../data/gui/groupchat_control.ui.h:9 +#: ../data/gui/xml_console_window.ui.h:15 +#: ../src/filetransfers_window.py:322 msgid "_Send" msgstr "_Отправить" -#: ../data/gui/chat_control.ui.h:11 +#: ../data/gui/chat_control.ui.h:13 msgid "1" msgstr "1" -#: ../data/gui/chat_control.ui.h:12 +#: ../data/gui/chat_control.ui.h:14 msgid "2" msgstr "2" -#: ../data/gui/chat_control.ui.h:13 +#: ../data/gui/chat_control.ui.h:15 msgid "3" msgstr "3" -#: ../data/gui/chat_control.ui.h:14 +#: ../data/gui/chat_control.ui.h:16 msgid "4" msgstr "4" -#: ../data/gui/chat_control.ui.h:15 +#: ../data/gui/chat_control.ui.h:17 msgid "5" msgstr "5" -#: ../data/gui/chat_control.ui.h:16 +#: ../data/gui/chat_control.ui.h:18 msgid "6" msgstr "6" -#: ../data/gui/chat_control.ui.h:17 +#: ../data/gui/chat_control.ui.h:19 msgid "7" msgstr "7" -#: ../data/gui/chat_control.ui.h:18 +#: ../data/gui/chat_control.ui.h:20 msgid "8" msgstr "8" -#: ../data/gui/chat_control.ui.h:19 +#: ../data/gui/chat_control.ui.h:21 msgid "9" msgstr "9" -#: ../data/gui/chat_control.ui.h:20 +#: ../data/gui/chat_control.ui.h:22 msgid "*" msgstr "*" -#: ../data/gui/chat_control.ui.h:21 ../data/gui/single_message_window.ui.h:3 +#: ../data/gui/chat_control.ui.h:23 +#: ../data/gui/single_message_window.ui.h:3 msgid "0" msgstr "0" @@ -960,7 +968,8 @@ msgstr "_ПриглаÑить" msgid "Start _Chat" msgstr "Ðачать _беÑеду" -#: ../data/gui/contact_context_menu.ui.h:2 ../data/gui/roster_window.ui.h:4 +#: ../data/gui/contact_context_menu.ui.h:2 +#: ../data/gui/roster_window.ui.h:4 msgid "Send Single _Message..." msgstr "Отправить одиночное _Ñообщение..." @@ -971,8 +980,9 @@ msgstr "Отправить _файл..." #. Invite to #. Invite to Groupchat #: ../data/gui/contact_context_menu.ui.h:4 -#: ../data/gui/gc_occupants_menu.ui.h:11 ../src/roster_window.py:5749 -#: ../src/roster_window.py:5908 +#: ../data/gui/gc_occupants_menu.ui.h:11 +#: ../src/roster_window.py:5799 +#: ../src/roster_window.py:5958 msgid "In_vite to" msgstr "_ПриглаÑить в" @@ -988,8 +998,9 @@ msgstr "Включить Open_PGP шифрование" msgid "Toggle End to End Encryption" msgstr "Включить End to End шифрование" -#: ../data/gui/contact_context_menu.ui.h:8 ../src/roster_window.py:5759 -#: ../src/roster_window.py:5997 +#: ../data/gui/contact_context_menu.ui.h:8 +#: ../src/roster_window.py:5809 +#: ../src/roster_window.py:6047 msgid "Send Cus_tom Status" msgstr "УÑтанови_Ñ‚ÑŒ ÑтатуÑ" @@ -1026,23 +1037,22 @@ msgid "_Subscription" msgstr "_ПодпиÑка" #: ../data/gui/contact_context_menu.ui.h:17 -#, fuzzy -msgid "_Allow contact to see my status" +msgid "_Allow him/her to see my status" msgstr "_Позволить ему или ей видеть мой ÑтатуÑ" #: ../data/gui/contact_context_menu.ui.h:18 -#, fuzzy -msgid "A_sk to see contact status" +msgid "A_sk to see his/her status" msgstr "_ПопроÑить возможноÑÑ‚ÑŒ видеть его или её ÑтатуÑ" #: ../data/gui/contact_context_menu.ui.h:19 -#, fuzzy -msgid "_Forbid contact to see my status" +msgid "_Forbid him/her to see my status" msgstr "_Запретить ему или ей видеть мой ÑтатуÑ" #: ../data/gui/contact_context_menu.ui.h:21 -#: ../data/gui/gc_occupants_menu.ui.h:13 ../src/roster_window.py:5821 -#: ../src/roster_window.py:5946 ../src/roster_window.py:6076 +#: ../data/gui/gc_occupants_menu.ui.h:13 +#: ../src/roster_window.py:5871 +#: ../src/roster_window.py:5996 +#: ../src/roster_window.py:6126 msgid "_Block" msgstr "_Блокировать" @@ -1060,8 +1070,9 @@ msgstr "_Удалить" #: ../data/gui/contact_context_menu.ui.h:26 #: ../data/gui/gc_control_popup_menu.ui.h:9 -#: ../data/gui/gc_occupants_menu.ui.h:15 ../data/gui/roster_window.ui.h:19 -#: ../src/roster_window.py:6147 +#: ../data/gui/gc_occupants_menu.ui.h:15 +#: ../data/gui/roster_window.ui.h:19 +#: ../src/roster_window.py:6197 msgid "_History" msgstr "_ИÑториÑ" @@ -1126,12 +1137,8 @@ msgid "Remove file transfer from the list." msgstr "Удалить передачу из ÑпиÑка." #: ../data/gui/filetransfers.ui.h:9 -msgid "" -"This action removes single file transfer from the list. If the transfer is " -"active, it is first stopped and then removed" -msgstr "" -"Ðто дейÑтвие удалÑет единичную передачу из ÑпиÑка. ЕÑли передача еще " -"активна, она Ñначала оÑтанавливаетÑÑ, а затем удалÑетÑÑ" +msgid "This action removes single file transfer from the list. If the transfer is active, it is first stopped and then removed" +msgstr "Ðто дейÑтвие удалÑет единичную передачу из ÑпиÑка. ЕÑли передача еще активна, она Ñначала оÑтанавливаетÑÑ, а затем удалÑетÑÑ" #: ../data/gui/filetransfers.ui.h:10 msgid "Clean _up" @@ -1142,7 +1149,7 @@ msgid "_Pause" msgstr "_ПриоÑтановить" #: ../data/gui/filetransfers.ui.h:12 -msgid "Cancels the selected file transfer and removes incomplete files" +msgid "Cancels the selected file transfer and removes incomplete file" msgstr "ОтменÑет выбранную передачу и удалÑет неполные файлы" #: ../data/gui/filetransfers.ui.h:13 @@ -1157,11 +1164,13 @@ msgstr "ОтменÑет выбранную передачу" msgid "Hides the window" msgstr "Скрывает окно" -#: ../data/gui/filetransfers.ui.h:16 ../src/filetransfers_window.py:905 +#: ../data/gui/filetransfers.ui.h:16 +#: ../src/filetransfers_window.py:905 msgid "_Continue" msgstr "_Продолжить" -#: ../data/gui/filetransfers.ui.h:17 ../src/chat_control.py:3350 +#: ../data/gui/filetransfers.ui.h:17 +#: ../src/chat_control.py:3256 #: ../src/filetransfers_window.py:213 msgid "_Open Containing Folder" msgstr "_Открыть папку Ñ Ð¿Ñ€Ð¸Ð½Ñтым файлом" @@ -1202,11 +1211,13 @@ msgstr "_Шрифт:" msgid "Font style:" msgstr "Ðачертание:" -#: ../data/gui/gajim_themes_window.ui.h:10 ../src/chat_control.py:1045 +#: ../data/gui/gajim_themes_window.ui.h:10 +#: ../src/chat_control.py:1049 msgid "Bold" msgstr "Полужирный" -#: ../data/gui/gajim_themes_window.ui.h:11 ../src/chat_control.py:1046 +#: ../data/gui/gajim_themes_window.ui.h:11 +#: ../src/chat_control.py:1050 msgid "Italic" msgstr "КурÑив" @@ -1218,7 +1229,8 @@ msgstr "ПриоÑтановилÑÑ" msgid "Composing" msgstr "Печатает" -#: ../data/gui/gajim_themes_window.ui.h:14 ../src/common/pep.py:150 +#: ../data/gui/gajim_themes_window.ui.h:14 +#: ../src/common/pep.py:150 msgid "Inactive" msgstr "Ðеактивен" @@ -1272,7 +1284,8 @@ msgstr "_Сворачивать при закрытии" msgid "_Request Voice" msgstr "_ЗапроÑить право говорить" -#: ../data/gui/gc_control_popup_menu.ui.h:8 ../src/disco.py:1843 +#: ../data/gui/gc_control_popup_menu.ui.h:8 +#: ../src/disco.py:1799 msgid "_Bookmark" msgstr "Добавить Ñту комнату в _закладки" @@ -1320,10 +1333,6 @@ msgstr "_Забанить" msgid "_Add to Roster" msgstr "_Добавить в роÑтер" -#: ../data/gui/groupchat_control.ui.h:2 ../src/chat_control.py:1722 -msgid "Show a list of formattings" -msgstr "Показать ÑпиÑок форматированиÑ" - #: ../data/gui/groupchat_control.ui.h:3 msgid "Change your nickname (Ctrl+N)" msgstr "Изменить ник (Ctrl+N)" @@ -1360,29 +1369,21 @@ msgstr "<big><b>Добро пожаловать в менеджер иÑтори #: ../data/gui/history_manager.ui.h:3 msgid "" -"This log manager is not intended for log viewing. If you are looking for " -"such functionality, use the history window instead.\n" +"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." +"Use this program to delete or export logs. You can select logs from the left and/or search database from below." msgstr "" -"Ðтот менеджер иÑтории не предназначен Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра. ЕÑли вы хотите " -"проÑматривать иÑторию Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ количеÑтвом функций, иÑпользуйте окно " -"иÑтории.\n" +"Ðтот менеджер иÑтории не предназначен Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра. ЕÑли вы хотите проÑматривать иÑторию Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ количеÑтвом функций, иÑпользуйте окно иÑтории.\n" "\n" -"ИÑпользуйте Ñту программу Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑкÑпорта иÑтории. Ð’Ñ‹ можете " -"выбрать лог Ñлева или воÑпользоватьÑÑ Ð¿Ð¾Ð¸Ñком в базе." +"ИÑпользуйте Ñту программу Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑкÑпорта иÑтории. Ð’Ñ‹ можете выбрать лог Ñлева или воÑпользоватьÑÑ Ð¿Ð¾Ð¸Ñком в базе." #: ../data/gui/history_manager.ui.h:6 msgid "" "<b>WARNING:</b>\n" -"If you plan to do massive deletions, please make sure Gajim is not running. " -"Generally avoid deletions with contacts you currently chat with." +"If you plan to do massive deletions, please make sure Gajim is not running. Generally avoid deletions with contacts you currently chat with." msgstr "" "<b>Ð’ÐИМÐÐИЕ:</b>\n" -"ЕÑли вы ÑобираетеÑÑŒ уÑтроить маÑÑовую чиÑтку, удоÑтоверьтеÑÑŒ, что Gajim не " -"запущен. Избегайте удалений из логов контактов, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ вы разговариваете " -"в Ñтот момент." +"ЕÑли вы ÑобираетеÑÑŒ уÑтроить маÑÑовую чиÑтку, удоÑтоверьтеÑÑŒ, что Gajim не запущен. Избегайте удалений из логов контактов, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ вы разговариваете в Ñтот момент." #: ../data/gui/history_manager.ui.h:8 msgid "_Search Database" @@ -1404,7 +1405,8 @@ msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ð¹" msgid "All Chat Histories" msgstr "Ð’ÑÑ Ð¸ÑториÑ" -#: ../data/gui/history_window.ui.h:4 ../src/history_window.py:326 +#: ../data/gui/history_window.ui.h:4 +#: ../src/history_window.py:324 msgid "Conversation History" msgstr "ИÑториÑ" @@ -1413,33 +1415,25 @@ msgid "Search:" msgstr "ПоиÑк:" #: ../data/gui/history_window.ui.h:6 -#, fuzzy msgid "_In date search" -msgstr "ВыполнÑетÑÑ Ð¿Ð¾Ð¸Ñк..." +msgstr "" #: ../data/gui/history_window.ui.h:7 -#, fuzzy -msgid "Searching only in the selected day " -msgstr "ИÑпользовать только выбранные в диалоге предпроÑмотра Ñнимки." +msgid "searching only in the selected day " +msgstr "" #: ../data/gui/history_window.ui.h:8 #: ../data/gui/zeroconf_information_window.ui.h:5 msgid "_Log conversation history" msgstr "_СохранÑÑ‚ÑŒ иÑторию перепиÑки" -#: ../data/gui/history_window.ui.h:9 -msgid "_Show status changes" -msgstr "Показывать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ _ÑтатуÑа" - #: ../data/gui/item_archiving_preferences_window.ui.h:1 -#, fuzzy msgid "expire" -msgstr "ИÑтекает" +msgstr "" #: ../data/gui/item_archiving_preferences_window.ui.h:2 -#, fuzzy msgid "save" -msgstr "Сохранить" +msgstr "" #: ../data/gui/item_archiving_preferences_window.ui.h:3 #, fuzzy @@ -1447,28 +1441,32 @@ msgid "otr" msgstr "другое" #: ../data/gui/item_archiving_preferences_window.ui.h:4 -#: ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:229 msgid "jid" msgstr "JID" #: ../data/gui/item_archiving_preferences_window.ui.h:5 #, fuzzy msgid "body" -msgstr "_Тело:" +msgstr "вÑе" #: ../data/gui/item_archiving_preferences_window.ui.h:6 -#, fuzzy msgid "false" -msgstr "false" +msgstr "" #: ../data/gui/item_archiving_preferences_window.ui.h:7 +#: ../src/gajim-remote.py:110 +#: ../src/gajim-remote.py:133 +#: ../src/gajim-remote.py:144 +#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 +#: ../src/gajim-remote.py:282 msgid "message" msgstr "Ñообщение" #: ../data/gui/item_archiving_preferences_window.ui.h:8 -#, fuzzy msgid "stream" -msgstr "&Поток" +msgstr "" #: ../data/gui/item_archiving_preferences_window.ui.h:9 msgid "approve" @@ -1479,25 +1477,23 @@ msgid "concede" msgstr "" #: ../data/gui/item_archiving_preferences_window.ui.h:11 -#, fuzzy msgid "forbid" -msgstr "^Запретить верÑию" +msgstr "" #: ../data/gui/item_archiving_preferences_window.ui.h:12 msgid "oppose" msgstr "" #: ../data/gui/item_archiving_preferences_window.ui.h:13 -#, fuzzy msgid "prefer" -msgstr "Предпочитать обычный текÑÑ‚" +msgstr "" #: ../data/gui/item_archiving_preferences_window.ui.h:14 -#, fuzzy msgid "require" -msgstr "Требуемый пакет:" +msgstr "" -#: ../data/gui/join_groupchat_window.ui.h:1 ../src/dialogs.py:2416 +#: ../data/gui/join_groupchat_window.ui.h:1 +#: ../src/dialogs.py:2372 msgid "Join Group Chat" msgstr "Войти в комнату" @@ -1525,7 +1521,8 @@ msgstr "Входить в кон_ференцию при подключении" msgid "_Bookmark this room" msgstr "Добавить комнату в закладк_и" -#: ../data/gui/join_groupchat_window.ui.h:9 ../src/config.py:1857 +#: ../data/gui/join_groupchat_window.ui.h:9 +#: ../src/config.py:1852 msgid "Server:" msgstr "Сервер:" @@ -1533,8 +1530,10 @@ msgstr "Сервер:" msgid "Bro_wse Rooms" msgstr "ПроÑмотр конферен_ций" -#: ../data/gui/join_groupchat_window.ui.h:11 ../src/chat_control.py:3385 -#: ../src/disco.py:1396 ../src/disco.py:1847 +#: ../data/gui/join_groupchat_window.ui.h:11 +#: ../src/chat_control.py:3291 +#: ../src/disco.py:1360 +#: ../src/disco.py:1803 msgid "_Join" msgstr "_ПриÑоединитьÑÑ" @@ -1634,11 +1633,6 @@ msgstr "_Порт прокÑи:" msgid "<b>Settings</b>" msgstr "<b>ÐаÑтройки</b>" -#: ../data/gui/manage_sounds_window.ui.h:1 -#, fuzzy -msgid "Manage sounds" -msgstr "Выключить звук" - #: ../data/gui/passphrase_dialog.ui.h:1 msgid "Passphrase" msgstr "ÐŸÐ°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð°" @@ -1652,9 +1646,8 @@ msgid "Install from zip" msgstr "УÑтановить из zip" #: ../data/gui/plugins_window.ui.h:3 -#, fuzzy msgid "<empty>" -msgstr "ОчиÑтка <defs>" +msgstr "" #: ../data/gui/plugins_window.ui.h:4 msgid "Version:" @@ -1662,7 +1655,7 @@ msgstr "ВерÑиÑ:" #: ../data/gui/plugins_window.ui.h:5 msgid "<empty>" -msgstr "пуÑто" +msgstr "" #: ../data/gui/plugins_window.ui.h:6 msgid "Authors:" @@ -1693,9 +1686,7 @@ msgid "Installed" msgstr "УÑтановленные" #: ../data/gui/plugins_window.ui.h:13 -msgid "" -"Plug-in decription should be displayed here. This text will be erased during " -"PluginsWindow initialization." +msgid "Plug-in decription should be displayed here. This text will be erased during PluginsWindow initialization." msgstr "ОпиÑание модулÑ. Ðта Ñтрока будет Ñтерта при загрузке модулÑ." #: ../data/gui/popup_notification_window.ui.h:1 @@ -1722,8 +1713,9 @@ msgstr "При любых изменениÑÑ…" msgid "Composing only" msgstr "Только печатает" -#: ../data/gui/preferences_window.ui.h:5 ../src/config.py:164 -#: ../src/config.py:677 +#: ../data/gui/preferences_window.ui.h:5 +#: ../src/config.py:173 +#: ../src/config.py:689 msgid "Disabled" msgstr "Отключены" @@ -1784,449 +1776,387 @@ msgid "Display a_vatars of contacts in roster" msgstr "Показывать а_ватары Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¾Ð² в роÑтере" #: ../data/gui/preferences_window.ui.h:20 -msgid "" -"If checked, Gajim will display avatars of contacts in roster window and in " -"group chats" -msgstr "" -"ЕÑли отмечено, то Gajim будет показывать аватары контактов в окне роÑтера и " -"в окнах комнат" +msgid "If checked, Gajim will display avatars of contacts in roster window and in group chats" +msgstr "ЕÑли отмечено, то Gajim будет показывать аватары контактов в окне роÑтера и в окнах комнат" #: ../data/gui/preferences_window.ui.h:21 msgid "Display status _messages of contacts in roster" msgstr "Показывать _ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑтатуÑе контакта в роÑтере" #: ../data/gui/preferences_window.ui.h:22 -msgid "" -"If checked, Gajim will display status messages of contacts under the contact " -"name in roster window and in group chats" -msgstr "" -"ЕÑли отмечено, то Gajim будет отображать Ñообщение о ÑтатуÑе контакта под " -"его именем в окне роÑтера и в окнах комнат" +msgid "If checked, Gajim will display status messages of contacts under the contact name in roster window and in group chats" +msgstr "ЕÑли отмечено, то Gajim будет отображать Ñообщение о ÑтатуÑе контакта под его именем в окне роÑтера и в окнах комнат" #: ../data/gui/preferences_window.ui.h:23 -msgid "Display e_xtra information of contacts in roster (mood, activity, ...)" -msgstr "" -"Показывать дополнительную информацию контактов в роÑтере (занÑтие, " -"наÑтроение, ...)" +msgid "Display m_ood of contacts in roster" +msgstr "Показывать на_ÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¾Ð² в роÑтере" #: ../data/gui/preferences_window.ui.h:24 -msgid "" -"If checked, Gajim will display the mood of contacts in the roster window" -msgstr "" -"ЕÑли отмечено, то Gajim будет показывать наÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¾Ð² в окне роÑтера" +msgid "If checked, Gajim will display the mood of contacts in the roster window" +msgstr "ЕÑли отмечено, то Gajim будет показывать наÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¾Ð² в окне роÑтера" #: ../data/gui/preferences_window.ui.h:25 +msgid "Display _activity of contacts in roster" +msgstr "Показывать _занÑÑ‚Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¾Ð² в роÑтере" + +#: ../data/gui/preferences_window.ui.h:26 +msgid "If checked, Gajim will display the activity of contacts in the roster window" +msgstr "ЕÑли отмечено, то Gajim будет показывать занÑÑ‚Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¾Ð² в окне роÑтера" + +#: ../data/gui/preferences_window.ui.h:27 +msgid "Display _tunes of contacts in roster" +msgstr "Отмечать контакты, Ñлушающие музыку (tunes)" + +#: ../data/gui/preferences_window.ui.h:28 +msgid "If checked, Gajim will display the tunes of contacts in the roster window" +msgstr "ЕÑли отмечено, то Gajim будет показывать tunes контактов в окне роÑтера" + +#: ../data/gui/preferences_window.ui.h:29 +msgid "Display _location of contacts in roster" +msgstr "Показывать меÑтоположение контактов в роÑтере" + +#: ../data/gui/preferences_window.ui.h:30 +msgid "If checked, Gajim will display the location of contacts in the roster window" +msgstr "ЕÑли отмечено, то Gajim будет показывать меÑтоположение контактов в окне роÑтера" + +#: ../data/gui/preferences_window.ui.h:31 msgid "Sort contacts by status" msgstr "Сортировать контакты по ÑтатуÑу" -#: ../data/gui/preferences_window.ui.h:26 +#: ../data/gui/preferences_window.ui.h:32 msgid "in _roster" msgstr "в _роÑтере" -#: ../data/gui/preferences_window.ui.h:27 +#: ../data/gui/preferences_window.ui.h:33 msgid "in _group chats" msgstr "в _комнатах" -#: ../data/gui/preferences_window.ui.h:28 +#: ../data/gui/preferences_window.ui.h:34 msgid "<b>Roster Appearance</b>" msgstr "<b>ÐаÑтройки роÑтера</b>" -#: ../data/gui/preferences_window.ui.h:29 +#: ../data/gui/preferences_window.ui.h:35 msgid "_Window behavior:" msgstr "Поведение _окна:" -#: ../data/gui/preferences_window.ui.h:30 -msgid "" -"If not disabled, Gajim will replace ascii smilies like ':)' with equivalent " -"animated or static graphical emoticons" -msgstr "" -"Gajim заменÑет текÑтовые Ñмайлики, например ':)', их графичеÑким или " -"анимированным Ñквивалентом. Выберите «Отключены», чтобы Ñтого не проиÑходило." +#: ../data/gui/preferences_window.ui.h:36 +msgid "If not disabled, Gajim will replace ascii smilies like ':)' with equivalent animated or static graphical emoticons" +msgstr "Gajim заменÑет текÑтовые Ñмайлики, например ':)', их графичеÑким или анимированным Ñквивалентом. Выберите «Отключены», чтобы Ñтого не проиÑходило." -#: ../data/gui/preferences_window.ui.h:31 +#: ../data/gui/preferences_window.ui.h:37 msgid "_Emoticons:" msgstr "_Смайлики:" -#: ../data/gui/preferences_window.ui.h:32 +#: ../data/gui/preferences_window.ui.h:38 msgid "Ma_ke message windows compact" msgstr "_Компактное окно Ñообщений" -#: ../data/gui/preferences_window.ui.h:33 +#: ../data/gui/preferences_window.ui.h:39 msgid "Hide all buttons in chat windows" msgstr "Ðе показывать кнопки в окнах чата" -#: ../data/gui/preferences_window.ui.h:34 +#: ../data/gui/preferences_window.ui.h:40 msgid "_Ignore rich content in incoming messages" msgstr "_Игнорировать форматирование во входÑщих ÑообщениÑÑ…" -#: ../data/gui/preferences_window.ui.h:35 -msgid "" -"Some messages may include rich content (formatting, colors etc). If checked, " -"Gajim will just display the raw message text." -msgstr "" -"Ðекоторые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ Ñодержать форматирование (цвет, шрифт и Ñ‚.д.). " -"ЕÑли отмечено, Gajim будет отображать только их текÑÑ‚, без форматированиÑ." +#: ../data/gui/preferences_window.ui.h:41 +msgid "Some messages may include rich content (formatting, colors etc). If checked, Gajim will just display the raw message text." +msgstr "Ðекоторые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ Ñодержать форматирование (цвет, шрифт и Ñ‚.д.). ЕÑли отмечено, Gajim будет отображать только их текÑÑ‚, без форматированиÑ." -#: ../data/gui/preferences_window.ui.h:36 +#: ../data/gui/preferences_window.ui.h:42 msgid "_Highlight misspelled words" msgstr "ВыделÑÑ‚ÑŒ _Ñлова Ñ Ð¾Ð¿ÐµÑ‡Ð°Ñ‚ÐºÐ°Ð¼Ð¸" -#: ../data/gui/preferences_window.ui.h:37 -msgid "" -"If checked, Gajim will highlight spelling errors in input fields of chat " -"windows. If no language is explicitly set via right click on the input " -"field, the default language will be used for this contact or group chat." -msgstr "" -"ЕÑли отмечено, Gajim будет выделÑÑ‚ÑŒ орфографичеÑкие ошибки в полÑÑ… ввода " -"окон чата. ЕÑли Ñзык проверки Ñвно не задан, будет иÑпользован Ñзык по " -"умолчанию Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ контакта или комнаты." +#: ../data/gui/preferences_window.ui.h:43 +msgid "If checked, Gajim will highlight spelling errors in input fields of chat windows. If no language is explicitly set via right click on the input field, the default language will be used for this contact or group chat." +msgstr "ЕÑли отмечено, Gajim будет выделÑÑ‚ÑŒ орфографичеÑкие ошибки в полÑÑ… ввода окон чата. ЕÑли Ñзык проверки Ñвно не задан, будет иÑпользован Ñзык по умолчанию Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ контакта или комнаты." -#: ../data/gui/preferences_window.ui.h:38 +#: ../data/gui/preferences_window.ui.h:44 msgid "_Show roster on startup:" msgstr "Показ_ывать роÑтер при запуÑке:" -#: ../data/gui/preferences_window.ui.h:39 -msgid "Show icon when your messages are received" -msgstr "Показывать иконку когда ваше Ñообщение доÑтавлено." - -#: ../data/gui/preferences_window.ui.h:40 +#: ../data/gui/preferences_window.ui.h:45 msgid "<b>Chat Appearance</b>" msgstr "<b>ÐаÑтройки окна чата</b>" -#: ../data/gui/preferences_window.ui.h:42 +#: ../data/gui/preferences_window.ui.h:47 msgid "When new event is received:" msgstr "Когда получено новое Ñобытие:" -#: ../data/gui/preferences_window.ui.h:43 +#: ../data/gui/preferences_window.ui.h:48 msgid "Notify me about contacts that sign _in" msgstr "УведомлÑÑ‚ÑŒ о контактах, которые _вошли: " -#: ../data/gui/preferences_window.ui.h:44 +#: ../data/gui/preferences_window.ui.h:49 msgid "Notify me about contacts that sign _out" msgstr "УведомлÑÑ‚ÑŒ о контактах, которые _вышли: " -#: ../data/gui/preferences_window.ui.h:45 -msgid "" -"Gajim will notify you via a popup window in the bottom right of the screen " -"about contacts that just signed out" -msgstr "" -"Gajim будет уведомлÑÑ‚ÑŒ Ð²Ð°Ñ Ð¾Ð± отÑоединившемÑÑ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ðµ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² " -"правом нижнем углу Ñкрана" +#: ../data/gui/preferences_window.ui.h:50 +msgid "Gajim will notify you via a popup window in the bottom right of the screen about contacts that just signed out" +msgstr "Gajim будет уведомлÑÑ‚ÑŒ Ð²Ð°Ñ Ð¾Ð± отÑоединившемÑÑ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ðµ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² правом нижнем углу Ñкрана" -#: ../data/gui/preferences_window.ui.h:46 +#: ../data/gui/preferences_window.ui.h:51 msgid "Allow popup/notifications when I'm _away/na/busy/invisible" msgstr "ПозволÑÑ‚ÑŒ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð² режиме _ушел/недоÑтупен/занÑÑ‚/невидимка" -#: ../data/gui/preferences_window.ui.h:47 +#: ../data/gui/preferences_window.ui.h:52 msgid "Notify on new _GMail email" msgstr "Сообщать о новых пиÑьмах в _Gmail" -#: ../data/gui/preferences_window.ui.h:48 -msgid "" -"If checked, Gajim will show a notification when a new e-mail is received via " -"GMail" -msgstr "" -"ЕÑли отмечено, то Gajim будет Ñообщать о новых пиÑьмах, полученных в GMail" +#: ../data/gui/preferences_window.ui.h:53 +msgid "If checked, Gajim will show a notification when a new e-mail is received via GMail" +msgstr "ЕÑли отмечено, то Gajim будет Ñообщать о новых пиÑьмах, полученных в GMail" -#: ../data/gui/preferences_window.ui.h:49 +#: ../data/gui/preferences_window.ui.h:54 msgid "Display _extra email details" msgstr "Отображать _дополнительные данные о почте" -#: ../data/gui/preferences_window.ui.h:50 -#, fuzzy -msgid "" -"If checked, Gajim will also include information about the sender of new " -"emails" -msgstr "" -"ЕÑли отмечено, то Gajim будет включать информацию об отправителе новых пиÑем." +#: ../data/gui/preferences_window.ui.h:55 +msgid "If checked, Gajim will also include information about the sender of the new emails" +msgstr "ЕÑли отмечено, то Gajim будет включать информацию об отправителе новых пиÑем." -#: ../data/gui/preferences_window.ui.h:51 +#: ../data/gui/preferences_window.ui.h:56 msgid "<b>GMail Options</b>" msgstr "<b>ÐаÑтройки GMail</b>" -#: ../data/gui/preferences_window.ui.h:52 +#: ../data/gui/preferences_window.ui.h:57 msgid "Show notification area icon:" msgstr "Отображать значок в облаÑти уведомлений:" -#: ../data/gui/preferences_window.ui.h:53 +#: ../data/gui/preferences_window.ui.h:58 msgid "<b>Visual Notifications</b>" msgstr "<b>УведомлениÑ</b>" -#: ../data/gui/preferences_window.ui.h:54 +#: ../data/gui/preferences_window.ui.h:59 msgid "Play _sounds" msgstr "Проигрывать _звук" -#: ../data/gui/preferences_window.ui.h:55 +#: ../data/gui/preferences_window.ui.h:60 msgid "Ma_nage..." msgstr "_Управление..." -#: ../data/gui/preferences_window.ui.h:56 +#: ../data/gui/preferences_window.ui.h:61 msgid "Allow sound when I'm _busy" msgstr "Проигрывать звук, когда Ñ _занÑÑ‚" -#: ../data/gui/preferences_window.ui.h:57 +#: ../data/gui/preferences_window.ui.h:62 msgid "<b>Sounds</b>" msgstr "<b>Звуки</b>" -#: ../data/gui/preferences_window.ui.h:58 +#: ../data/gui/preferences_window.ui.h:63 msgid "Notifications" msgstr "УведомлениÑ" -#: ../data/gui/preferences_window.ui.h:59 -msgid "" -"Gajim can send and receive meta-information related to a conversation you " -"may have with a contact. Here you can specify which chatstates you want to " -"display in chat windows." -msgstr "" -"Gajim может отÑылать и получать метаданные, отноÑÑщиеÑÑ Ðº беÑеде Ñ " -"контактом. ЗдеÑÑŒ вы можете указать, какие ÑоÑтоÑние чата вы хотели бы видеть " -"в окне чата." +#: ../data/gui/preferences_window.ui.h:64 +msgid "Gajim can send and receive meta-information related to a conversation you may have with a contact. Here you can specify which chatstates you want to display in chat windows." +msgstr "Gajim может отÑылать и получать метаданные отноÑÑщиеÑÑ Ðº беÑеде Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¾Ð¼. ЗдеÑÑŒ вы можете указать, какие ÑоÑтоÑние чата вы хотели бы видеть в окне чата." -#: ../data/gui/preferences_window.ui.h:60 +#: ../data/gui/preferences_window.ui.h:65 msgid "_Display chat state notifications:" msgstr "_Отображать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ ÑоÑтоÑнии чата:" -#: ../data/gui/preferences_window.ui.h:61 -msgid "" -"Gajim can send and receive meta-information related to a conversation you " -"may have with a contact. Here you can specify which chatstates you want to " -"send to the other party." -msgstr "" -"Gajim может отÑылать и получать метаданные, отноÑÑщиеÑÑ Ðº беÑеде Ñ " -"контактом. ЗдеÑÑŒ вы можете указать, какие ÑоÑтоÑÐ½Ð¸Ñ Ñ‡Ð°Ñ‚Ð° Gajim будет " -"отÑылать вашему реÑпонденту." +#: ../data/gui/preferences_window.ui.h:66 +msgid "Gajim can send and receive meta-information related to a conversation you may have with a contact. Here you can specify which chatstates you want to send to the other party." +msgstr "Gajim может отÑылать и получать метаданные, отноÑÑщиеÑÑ Ðº беÑеде Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¾Ð¼. ЗдеÑÑŒ вы можете указать, какие ÑоÑтоÑÐ½Ð¸Ñ Ñ‡Ð°Ñ‚Ð° Gajim будет отÑылать вашему реÑпонденту." -#: ../data/gui/preferences_window.ui.h:62 +#: ../data/gui/preferences_window.ui.h:67 msgid "_Send chat state notifications:" msgstr "_ОтправлÑÑ‚ÑŒ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ ÑоÑтоÑнии чата:" -#: ../data/gui/preferences_window.ui.h:63 +#: ../data/gui/preferences_window.ui.h:68 msgid "<b>Chat state notifications</b>" msgstr "<b>УведомлениÑ</b>" -#: ../data/gui/preferences_window.ui.h:64 +#: ../data/gui/preferences_window.ui.h:69 msgid "Personal Events" msgstr "РаÑширенные ÑтатуÑÑ‹" -#: ../data/gui/preferences_window.ui.h:65 +#: ../data/gui/preferences_window.ui.h:70 msgid "_Away after:" msgstr "Ðвто-_отошел поÑле:" -#: ../data/gui/preferences_window.ui.h:66 -msgid "" -"If checked, Gajim will change status to Away when the computer is unused." -msgstr "" -"ЕÑли отмечено, то Gajim изменит ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° Away, еÑли компьютер не " -"иÑпользуетÑÑ." +#: ../data/gui/preferences_window.ui.h:71 +msgid "If checked, Gajim will change status to Away when the computer is unused." +msgstr "ЕÑли отмечено, то Gajim изменит ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° Away, еÑли компьютер не иÑпользуетÑÑ." -#: ../data/gui/preferences_window.ui.h:67 +#: ../data/gui/preferences_window.ui.h:72 msgid "_Not available after:" msgstr "Ðвто-_недоÑтупен поÑле:" -#: ../data/gui/preferences_window.ui.h:68 -msgid "" -"If checked, Gajim will change status to Not Available when the computer has " -"not been used even longer" -msgstr "" -"ЕÑли отмечено, Gajim будет менÑÑ‚ÑŒ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° ÐедоÑтупен, еÑли компьютер долго " -"не иÑпользуетÑÑ" +#: ../data/gui/preferences_window.ui.h:73 +msgid "If checked, Gajim will change status to Not Available when the computer has not been used even longer" +msgstr "ЕÑли отмечено, Gajim будет менÑÑ‚ÑŒ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð° ÐедоÑтупен, еÑли компьютер долго не иÑпользуетÑÑ" -#: ../data/gui/preferences_window.ui.h:69 +#: ../data/gui/preferences_window.ui.h:74 msgid "minutes" msgstr "минут" -#: ../data/gui/preferences_window.ui.h:70 +#: ../data/gui/preferences_window.ui.h:75 msgid "" -"The auto away status message. If empty, Gajim will not change the current " -"status message\n" +"The auto away status message. If empty, Gajim will not change the current status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-away timeout" msgstr "" -"ÐвтоматичеÑкое Ñообщение о ÑтатуÑе «Ушел». ЕÑли не указано, Gajim не будет " -"изменÑÑ‚ÑŒ Ñообщение о ÑтатуÑе\n" +"ÐвтоматичеÑкое Ñообщение о ÑтатуÑе «Ушел». ЕÑли не указано, Gajim не будет изменÑÑ‚ÑŒ Ñообщение о ÑтатуÑе\n" "$S заменÑетÑÑ Ð½Ð° предыдущее Ñообщение о ÑтатуÑе\n" -"$T заменÑетÑÑ Ð½Ð° Ð²Ñ€ÐµÐ¼Ñ ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑтатуÑе " -"«Ушел»" +"$T заменÑетÑÑ Ð½Ð° Ð²Ñ€ÐµÐ¼Ñ ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑтатуÑе «Ушел»" -#: ../data/gui/preferences_window.ui.h:73 +#: ../data/gui/preferences_window.ui.h:78 msgid "" -"The auto not available status message. If empty, Gajim will not change the " -"current status message\n" +"The auto not available status message. If empty, Gajim will not change the current status message\n" "$S will be replaced by previous status message\n" "$T will be replaced by auto-not-available timeout" msgstr "" -"ÐвтоматичеÑкое Ñообщение о ÑтатуÑе «ÐедоÑтупен». ЕÑли не указано, Gajim не " -"будет изменÑÑ‚ÑŒ Ñообщение о ÑтатуÑе\n" +"ÐвтоматичеÑкое Ñообщение о ÑтатуÑе «ÐедоÑтупен». ЕÑли не указано, Gajim не будет изменÑÑ‚ÑŒ Ñообщение о ÑтатуÑе\n" "$S заменÑетÑÑ Ð½Ð° предыдущее Ñообщение о ÑтатуÑе\n" -"$T заменÑетÑÑ Ð½Ð° Ð²Ñ€ÐµÐ¼Ñ ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑтатуÑе " -"«ÐедоÑтупен»" +"$T заменÑетÑÑ Ð½Ð° Ð²Ñ€ÐµÐ¼Ñ ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑтатуÑе «ÐедоÑтупен»" -#: ../data/gui/preferences_window.ui.h:76 +#: ../data/gui/preferences_window.ui.h:81 msgid "<b>Auto Status</b>" msgstr "<b>Ðвто ÑтатуÑ</b>" -#: ../data/gui/preferences_window.ui.h:77 +#: ../data/gui/preferences_window.ui.h:82 msgid "Ask status message when I:" msgstr "Запрашивать Ñообщение о ÑтатуÑе, когда Ñ: " -#: ../data/gui/preferences_window.ui.h:78 +#: ../data/gui/preferences_window.ui.h:83 msgid "Sign _in" msgstr "Ð’_ошел" -#: ../data/gui/preferences_window.ui.h:79 +#: ../data/gui/preferences_window.ui.h:84 msgid "Sign _out" msgstr "Ð’_ышел" -#: ../data/gui/preferences_window.ui.h:80 -msgid "" -"If enabled, Gajim will not ask for a status message. The specified default " -"message will be used instead." -msgstr "" -"ЕÑли включено, Gajim не будет запрашивать Ñообщение о ÑтатуÑе. ВмеÑто него " -"будет иÑпользовано ÑоответÑтвующее Ñообщение по умолчанию." +#: ../data/gui/preferences_window.ui.h:85 +msgid "If enabled, Gajim will not ask for a status message. The specified default message will be used instead." +msgstr "ЕÑли включено, Gajim не будет запрашивать Ñообщение о ÑтатуÑе. ВмеÑто него будет иÑпользовано ÑоответÑтвующее Ñообщение по умолчанию." -#: ../data/gui/preferences_window.ui.h:81 +#: ../data/gui/preferences_window.ui.h:86 msgid "<b>Status Messages</b>" msgstr "<b>Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑтатуÑе</b>" -#: ../data/gui/preferences_window.ui.h:82 +#: ../data/gui/preferences_window.ui.h:87 msgid "<b>Preset Status Messages</b>" msgstr "<b>ПредуÑтановленные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑтатуÑе</b>" -#: ../data/gui/preferences_window.ui.h:83 ../src/config.py:398 +#: ../data/gui/preferences_window.ui.h:88 +#: ../src/config.py:403 msgid "Status" msgstr "СтатуÑ" -#: ../data/gui/preferences_window.ui.h:84 +#: ../data/gui/preferences_window.ui.h:89 msgid "Use system _default" msgstr "ИÑпользовать _ÑиÑтемный шрифт" -#: ../data/gui/preferences_window.ui.h:85 +#: ../data/gui/preferences_window.ui.h:90 msgid "Chat message:" msgstr "Сообщение чата:" -#: ../data/gui/preferences_window.ui.h:86 +#: ../data/gui/preferences_window.ui.h:91 msgid "<b>Font</b>" msgstr "<b>Шрифт</b>" -#: ../data/gui/preferences_window.ui.h:87 +#: ../data/gui/preferences_window.ui.h:92 msgid "Use _transports icons" msgstr "ИÑпользовать иконки _транÑпортов" -#: ../data/gui/preferences_window.ui.h:88 -#, fuzzy -msgid "" -"If checked, Gajim will use protocol-specific status icons. (e.g. A contact " -"from MSN will have the equivalent msn icon for status online, away, busy, " -"etc...)" -msgstr "" -"ЕÑли отмечено, то Gajim будет иÑпользовать Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ протокола Ñвои иконки " -"(например, контакты из MSN будут иметь ÑоответÑтвующие иконки msn Ð´Ð»Ñ " -"ÑтатуÑов «в Ñети», «ушёл», «занÑт» и Ñ‚.д.)" +#: ../data/gui/preferences_window.ui.h:93 +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 "ЕÑли отмечено, то Gajim будет иÑпользовать Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ протокола Ñвои иконки (например, контакты из MSN будут иметь ÑоответÑтвующие иконки msn Ð´Ð»Ñ ÑтатуÑов «в Ñети», «ушёл», «занÑт» и Ñ‚.д.)" -#: ../data/gui/preferences_window.ui.h:89 +#: ../data/gui/preferences_window.ui.h:94 msgid "Status _iconset:" msgstr "Тема ÑтатуÑных _иконок:" -#: ../data/gui/preferences_window.ui.h:90 +#: ../data/gui/preferences_window.ui.h:95 msgid "Configure color and font of the interface" msgstr "ÐаÑтроить цвет и шрифт интерфейÑа" -#: ../data/gui/preferences_window.ui.h:91 +#: ../data/gui/preferences_window.ui.h:96 msgid "T_heme:" msgstr "_Тема:" -#: ../data/gui/preferences_window.ui.h:92 +#: ../data/gui/preferences_window.ui.h:97 msgid "<b>Themes</b>" msgstr "<b>ÐаÑтройки интерфейÑа</b>" -#: ../data/gui/preferences_window.ui.h:93 +#: ../data/gui/preferences_window.ui.h:98 msgid "Contact's nickname:" msgstr "Ðик ÑобеÑедника:" -#: ../data/gui/preferences_window.ui.h:94 +#: ../data/gui/preferences_window.ui.h:99 msgid "Your nickname:" msgstr "Ваш ник:" -#: ../data/gui/preferences_window.ui.h:95 +#: ../data/gui/preferences_window.ui.h:100 msgid "_Status message:" msgstr "_Сообщение о ÑтатуÑе:" -#: ../data/gui/preferences_window.ui.h:96 +#: ../data/gui/preferences_window.ui.h:101 msgid "_URL highlight:" msgstr "_Цвет ÑÑылок:" -#: ../data/gui/preferences_window.ui.h:97 +#: ../data/gui/preferences_window.ui.h:102 msgid "_Reset to Default Colors" msgstr "_ВернутьÑÑ Ðº цветам по умолчанию" -#: ../data/gui/preferences_window.ui.h:98 +#: ../data/gui/preferences_window.ui.h:103 msgid "Contact's message:" msgstr "Сообщение ÑобеÑедника:" -#: ../data/gui/preferences_window.ui.h:99 +#: ../data/gui/preferences_window.ui.h:104 msgid "Your message:" msgstr "Ваше Ñообщение:" -#: ../data/gui/preferences_window.ui.h:100 -#, fuzzy -msgid "Group chat highlight:" -msgstr "Ð’Ð°Ñ ÑƒÐ¿Ð¾Ð¼Ñнули в комнате" - -#: ../data/gui/preferences_window.ui.h:101 +#: ../data/gui/preferences_window.ui.h:105 msgid "<b>Chat Line Colors</b>" msgstr "<b>Цвета вкладок Ñ Ñ‡Ð°Ñ‚Ð°Ð¼Ð¸</b>" -#: ../data/gui/preferences_window.ui.h:102 +#: ../data/gui/preferences_window.ui.h:106 msgid "Style" msgstr "Стиль" -#: ../data/gui/preferences_window.ui.h:103 +#: ../data/gui/preferences_window.ui.h:107 msgid "Audio input device" msgstr "УÑтройÑтво захвата звука" -#: ../data/gui/preferences_window.ui.h:104 +#: ../data/gui/preferences_window.ui.h:108 msgid "Audio output device" msgstr "УÑтройÑтво вывода звука" -#: ../data/gui/preferences_window.ui.h:105 +#: ../data/gui/preferences_window.ui.h:109 msgid "<b>Audio</b>" msgstr "<b>Звук</b>" -#: ../data/gui/preferences_window.ui.h:106 +#: ../data/gui/preferences_window.ui.h:110 msgid "Video input device" msgstr "УÑтройÑтво захвата изображениÑ" -#: ../data/gui/preferences_window.ui.h:107 +#: ../data/gui/preferences_window.ui.h:111 msgid "Video output device" msgstr "УÑтройÑтво вывода изображениÑ" -#: ../data/gui/preferences_window.ui.h:108 +#: ../data/gui/preferences_window.ui.h:112 msgid "Video framerate" msgstr "ЧаÑтота кадров видео" -#: ../data/gui/preferences_window.ui.h:109 +#: ../data/gui/preferences_window.ui.h:113 msgid "Video size" msgstr "Разрешение видео" -#: ../data/gui/preferences_window.ui.h:110 -#, fuzzy -msgid "View own video source" -msgstr "ИÑточник ÑÐ»Ð¾Ñ ÐœÐ¾Ð·Ð°Ð¸ÐºÐ°" - -#: ../data/gui/preferences_window.ui.h:111 +#: ../data/gui/preferences_window.ui.h:114 msgid "<b>Video</b>" msgstr "<b>Изображение</b>" -#: ../data/gui/preferences_window.ui.h:112 +#: ../data/gui/preferences_window.ui.h:115 msgid "STUN server:" msgstr "STUN Ñервер:" -#: ../data/gui/preferences_window.ui.h:113 +#: ../data/gui/preferences_window.ui.h:116 msgid "<i>(example: stunserver.org)</i>" msgstr "<i>(например: stunserver.org)</i>" -#: ../data/gui/preferences_window.ui.h:114 +#: ../data/gui/preferences_window.ui.h:117 msgid "" "STUN server hostname. If none given, Gajim will try\n" "to discover one from server." @@ -2234,115 +2164,97 @@ msgstr "" "ÐÐ´Ñ€ÐµÑ Ñервера STUN. ЕÑли не указано, Gajim попробует\n" "получить Ð°Ð´Ñ€ÐµÑ Ñ Ñервера." -#: ../data/gui/preferences_window.ui.h:116 +#: ../data/gui/preferences_window.ui.h:119 msgid "<b>Connection</b>" msgstr "<b>Подключение</b>" -#: ../data/gui/preferences_window.ui.h:117 ../src/features_window.py:102 +#: ../data/gui/preferences_window.ui.h:120 +#: ../src/features_window.py:102 msgid "Audio / Video" msgstr "Звук / Изображение" -#: ../data/gui/preferences_window.ui.h:118 +#: ../data/gui/preferences_window.ui.h:121 msgid "_File manager:" msgstr "_Менеджер файлов:" -#: ../data/gui/preferences_window.ui.h:119 +#: ../data/gui/preferences_window.ui.h:122 msgid "_Mail client:" msgstr "_Почтовый клиент:" -#: ../data/gui/preferences_window.ui.h:120 +#: ../data/gui/preferences_window.ui.h:123 msgid "_Browser:" msgstr "_Браузер:" #. a header for custom browser/client/file manager. so translate sth like: Custom Settings -#: ../data/gui/preferences_window.ui.h:122 +#: ../data/gui/preferences_window.ui.h:125 msgid "<b>Custom</b>" msgstr "<b>ПользовательÑкие наÑтройки</b>" -#: ../data/gui/preferences_window.ui.h:123 +#: ../data/gui/preferences_window.ui.h:126 msgid "<b>Applications</b>" msgstr "<b>ПриложениÑ</b>" -#: ../data/gui/preferences_window.ui.h:124 +#: ../data/gui/preferences_window.ui.h:127 msgid "_Ignore events from contacts not in the roster" msgstr "_Игнорировать ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¾Ñ‚ контактов не из роÑтера" -#: ../data/gui/preferences_window.ui.h:125 -msgid "" -"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" -msgstr "" -"Отметьте Ñту опцию, только еÑли кто-то не из вашего роÑтера Ñпамит/доÑтает " -"ваÑ. ИÑпользуйте Ñ Ð¾ÑторожноÑтью, потому что Ñто заблокирует вÑе ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ " -"от контактов не из вашего роÑтера." +#: ../data/gui/preferences_window.ui.h:128 +msgid "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" +msgstr "Отметьте Ñту опцию, только еÑли кто-то не из вашего роÑтера Ñпамит/доÑтает ваÑ. ИÑпользуйте Ñ Ð¾ÑторожноÑтью, потому что Ñто заблокирует вÑе ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ контактов не из вашего роÑтера." -#: ../data/gui/preferences_window.ui.h:126 +#: ../data/gui/preferences_window.ui.h:129 msgid "Allow client / _OS information to be sent" msgstr "ОтÑылать информацию о клиенте / _ОС" -#: ../data/gui/preferences_window.ui.h:127 -msgid "" -"If checked, Gajim will allow others to detect the operation system you are " -"using" -msgstr "" -"ЕÑли отмечено, то Gajim будет разрешать определÑÑ‚ÑŒ операционную ÑиÑтему, " -"которую вы иÑпользуете" +#: ../data/gui/preferences_window.ui.h:130 +msgid "If checked, Gajim will allow others to detect the operation system you are using" +msgstr "ЕÑли отмечено, то Gajim будет разрешать определÑÑ‚ÑŒ операционную ÑиÑтему, которую вы иÑпользуете" -#: ../data/gui/preferences_window.ui.h:128 +#: ../data/gui/preferences_window.ui.h:131 msgid "Allow local system time information to be sent" msgstr "ОтÑылать информацию о локальном времени" -#: ../data/gui/preferences_window.ui.h:129 +#: ../data/gui/preferences_window.ui.h:132 msgid "If checked, Gajim will allow others to detect the time on your system" -msgstr "" -"ЕÑли отмечено, то Gajim будет разрешать определÑÑ‚ÑŒ Ð²Ñ€ÐµÐ¼Ñ Ð² ÑиÑтеме, которую " -"вы иÑпользуете" +msgstr "ЕÑли отмечено, то Gajim будет разрешать определÑÑ‚ÑŒ Ð²Ñ€ÐµÐ¼Ñ Ð² ÑиÑтеме, которую вы иÑпользуете" -#: ../data/gui/preferences_window.ui.h:130 +#: ../data/gui/preferences_window.ui.h:133 msgid "Log _encrypted chat session" msgstr "ЗапиÑывать в лог _шифрованные ÑообщениÑ" -#: ../data/gui/preferences_window.ui.h:131 -msgid "" -"If checked, Gajim will keep logs for encrypted messages. Please note that " -"when using E2E encryption the remote party has to agree on logging, else the " -"messages will not be logged." -msgstr "" -"ЕÑли отмечено, Gajim будет ÑохранÑÑ‚ÑŒ иÑторию зашифрованных Ñообщений. " -"Помните, что при иÑпользовании E2E ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ð°Ñ Ñторона должна дать " -"ÑоглаÑие на ведение иÑтории, иначе ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ будут ÑохранÑÑ‚ÑŒÑÑ." +#: ../data/gui/preferences_window.ui.h:134 +msgid "If checked, Gajim will keep logs for encrypted messages. Please note that when using E2E encryption the remote party has to agree on logging, else the messages will not be logged." +msgstr "ЕÑли отмечено, Gajim будет ÑохранÑÑ‚ÑŒ иÑторию зашифрованных Ñообщений. Помните, что при иÑпользовании E2E ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ð°Ñ Ñторона должна дать ÑоглаÑие на ведение иÑтории, иначе ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ будут ÑохранÑÑ‚ÑŒÑÑ." -#: ../data/gui/preferences_window.ui.h:132 +#: ../data/gui/preferences_window.ui.h:135 msgid "Allow my _idle time to be sent" msgstr "ОтправлÑÑ‚ÑŒ Ð²Ñ€ÐµÐ¼Ñ Ð¼Ð¾ÐµÐ¹ неактивноÑти" -#: ../data/gui/preferences_window.ui.h:133 +#: ../data/gui/preferences_window.ui.h:136 msgid "Global proxy:" msgstr "Глобальный прокÑи:" -#: ../data/gui/preferences_window.ui.h:135 +#: ../data/gui/preferences_window.ui.h:138 msgid "<b>Privacy</b>" msgstr "<b>УведомлениÑ</b>" -#: ../data/gui/preferences_window.ui.h:136 +#: ../data/gui/preferences_window.ui.h:139 msgid "_Log status changes of contacts" msgstr "_ЗапиÑывать в лог Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑтатуÑов контактов" -#: ../data/gui/preferences_window.ui.h:137 +#: ../data/gui/preferences_window.ui.h:140 msgid "Check on startup if Gajim is the _default Jabber client" -msgstr "" -"_Ð’Ñегда проверÑÑ‚ÑŒ при запуÑке, ÑвлÑетÑÑ Ð»Ð¸ Gajim jabber-клиентом по умолчанию" +msgstr "_Ð’Ñегда проверÑÑ‚ÑŒ при запуÑке, ÑвлÑетÑÑ Ð»Ð¸ Gajim jabber-клиентом по умолчанию" -#: ../data/gui/preferences_window.ui.h:139 +#: ../data/gui/preferences_window.ui.h:142 msgid "_Open..." msgstr "_Открыть..." -#: ../data/gui/preferences_window.ui.h:140 +#: ../data/gui/preferences_window.ui.h:143 msgid "<b>Advanced Configuration Editor</b>" msgstr "<b>РаÑширенный редактор наÑтроек</b>" -#: ../data/gui/preferences_window.ui.h:141 +#: ../data/gui/preferences_window.ui.h:144 msgid "Advanced" msgstr "РаÑширенные" @@ -2350,7 +2262,8 @@ msgstr "РаÑширенные" msgid "Privacy Lists:" msgstr "СпиÑки доÑтупа:" -#: ../data/gui/privacy_list_window.ui.h:1 ../src/dialogs.py:4121 +#: ../data/gui/privacy_list_window.ui.h:1 +#: ../src/dialogs.py:4023 msgid "Privacy List" msgstr "СпиÑок доÑтупа" @@ -2601,8 +2514,10 @@ msgstr "<b>Что вы хотите Ñделать?</b>" #. Remove group #. Remove -#: ../data/gui/remove_account_window.ui.h:4 ../src/roster_window.py:5831 -#: ../src/roster_window.py:5956 ../src/roster_window.py:6086 +#: ../data/gui/remove_account_window.ui.h:4 +#: ../src/roster_window.py:5881 +#: ../src/roster_window.py:6006 +#: ../src/roster_window.py:6136 msgid "_Remove" msgstr "_Удалить" @@ -2611,12 +2526,8 @@ msgid "Roster Item Exchange" msgstr "Обмен контактами" #: ../data/gui/roster_item_exchange_window.ui.h:2 -msgid "" -"<b>someone@somewhere.com</b> would like you to <b>add</b> some contacts in " -"your roster." -msgstr "" -"<b>someone@somewhere.com</b> хочет <b>добавить</b> неÑколько контактов в ваш " -"ÑпиÑок контактов." +msgid "<b>someone@somewhere.com</b> would like you to <b>add</b> some contacts in your roster." +msgstr "<b>someone@somewhere.com</b> хочет <b>добавить</b> неÑколько контактов в ваш ÑпиÑок контактов." #: ../data/gui/roster_item_exchange_window.ui.h:3 #: ../data/gui/service_registration_window.ui.h:3 @@ -2625,9 +2536,7 @@ msgstr "_ОК" #: ../data/gui/roster_item_exchange_window.ui.h:4 msgid "Message Body <currently unused, so it's hidden by default>" -msgstr "" -"Тело ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ <в данное Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ иÑпользуетÑÑ, поÑтому по умолчанию не " -"отображаетÑÑ>" +msgstr "Тело ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ <в данное Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ иÑпользуетÑÑ, поÑтому по умолчанию не отображаетÑÑ>" #. Make sure the character after "_" is not M/m (conflicts with Alt+M that is supposed to show the Emoticon Selector) #: ../data/gui/roster_window.ui.h:2 @@ -2639,7 +2548,8 @@ msgstr "_ДейÑтвиÑ" msgid "Add _Contact..." msgstr "_Добавить контакт..." -#: ../data/gui/roster_window.ui.h:9 ../src/disco.py:1558 +#: ../data/gui/roster_window.ui.h:9 +#: ../src/disco.py:1519 msgid "_Edit" msgstr "_Правка" @@ -2671,7 +2581,8 @@ msgstr "Показать _только активных" msgid "Show T_ransports" msgstr "Показать Т_ранÑпорты" -#: ../data/gui/roster_window.ui.h:17 ../src/statusicon.py:359 +#: ../data/gui/roster_window.ui.h:17 +#: ../src/statusicon.py:359 msgid "Show _Roster" msgstr "Показать _роÑтер" @@ -2701,7 +2612,7 @@ msgstr "ЧаÑто задаваемые вопроÑÑ‹ (онлайн)" #: ../data/gui/roster_window.ui.h:25 msgid "Keyboard Shortcuts" -msgstr "Ð¡Ð¾Ñ‡ÐµÑ‚Ð°Ð½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ" +msgstr "Сочитание клавиш" #: ../data/gui/roster_window.ui.h:26 msgid "Fea_tures" @@ -2720,11 +2631,13 @@ msgid "_Add contact" msgstr "Добавить _контакт" #. Information -#: ../data/gui/search_window.ui.h:4 ../src/roster_window.py:6098 +#: ../data/gui/search_window.ui.h:4 +#: ../src/roster_window.py:6148 msgid "_Information" msgstr "_Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ контакте" -#: ../data/gui/search_window.ui.h:5 ../src/disco.py:1408 +#: ../data/gui/search_window.ui.h:5 +#: ../src/disco.py:1372 msgid "_Search" msgstr "_ПоиÑк" @@ -2752,6 +2665,10 @@ msgstr "Кому:" msgid "Sen_d" msgstr "_Отправить" +#: ../data/gui/single_message_window.ui.h:6 +msgid "Send message" +msgstr "Отправить Ñообщение" + #: ../data/gui/single_message_window.ui.h:7 msgid "_Reply" msgstr "_Ответить" @@ -2777,9 +2694,7 @@ msgid "_Deny" msgstr "_Отклонить" #: ../data/gui/subscription_request_window.ui.h:3 -msgid "" -"Deny authorization from contact so he or she cannot know when you're " -"connected" +msgid "Deny authorization from contact so he or she cannot know when you're connected" msgstr "Отклонить авторизацию от контакта (Он не Ñможет видеть ваш ÑтатуÑ)" #: ../data/gui/subscription_request_window.ui.h:6 @@ -2963,45 +2878,40 @@ msgstr "Jabber-клиент Ð´Ð»Ñ Ð¼Ð³Ð½Ð¾Ð²ÐµÐ½Ð½Ñ‹Ñ… Ñообщений" msgid "A GTK+ Jabber client" msgstr "Jabber-клиент на GTK+" -#: ../data/gajim.desktop.in.in.h:4 -msgid "chat;messaging;im;jabber;xmpp;bonjour;voip" -msgstr "" - -#: ../src/adhoc_commands.py:325 +#: ../src/adhoc_commands.py:323 msgid "Cancel confirmation" msgstr "Отменить подтверждение" -#: ../src/adhoc_commands.py:326 -msgid "" -"You are in process of executing command. Do you really want to cancel it?" -msgstr "" -"Команда находитÑÑ Ð² процеÑÑе выполнениÑ. Ð’Ñ‹ уверены, что хотите её отменить?" +#: ../src/adhoc_commands.py:324 +msgid "You are in process of executing command. Do you really want to cancel it?" +msgstr "Команда находитÑÑ Ð² процеÑÑе выполнениÑ. Ð’Ñ‹ уверены, что хотите её отменить?" -#: ../src/adhoc_commands.py:372 +#: ../src/adhoc_commands.py:370 #, fuzzy msgid "Invalid Form" -msgstr "СоÑтавлÑÑ‚ÑŒ вход" +msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð½Ð°Ñ‚Ð°" -#: ../src/adhoc_commands.py:373 +#: ../src/adhoc_commands.py:371 #, fuzzy msgid "The form is not filled correctly." -msgstr "ЧаÑÑ‹ уÑтановлены неправильно" +msgstr "Ð’ Jabber ID комнаты или Ñервера ÑодержатÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимые Ñимволы." -#: ../src/adhoc_commands.py:392 ../src/adhoc_commands.py:416 +#: ../src/adhoc_commands.py:390 +#: ../src/adhoc_commands.py:414 msgid "Service sent malformed data" msgstr "Ð¡ÐµÑ€Ð²Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ð» недопуÑтимые данные" -#: ../src/adhoc_commands.py:401 +#: ../src/adhoc_commands.py:399 msgid "Service changed the session identifier." msgstr "Ð¡ÐµÑ€Ð²Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ð» идентификатор ÑеанÑа." -#: ../src/adhoc_commands.py:421 +#: ../src/adhoc_commands.py:419 #, fuzzy, python-format msgid "%s - Ad-hoc Commands - Gajim" msgstr "Специальные команды — Gajim" #. when stanza doesn't have error description -#: ../src/adhoc_commands.py:516 +#: ../src/adhoc_commands.py:514 msgid "Service returned an error." msgstr "Ð¡ÐµÑ€Ð²Ð¸Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð¸Ð» ошибкой." @@ -3026,7 +2936,8 @@ msgstr "Целое" msgid "Text" msgstr "ТекÑÑ‚" -#: ../src/advanced_configuration_window.py:97 ../src/chat_control.py:1065 +#: ../src/advanced_configuration_window.py:97 +#: ../src/chat_control.py:1069 msgid "Color" msgstr "Цвет" @@ -3059,178 +2970,275 @@ msgstr[0] "Ð’Ñ‹ получили новую запиÑÑŒ (и %d не отобр msgstr[1] "Ð’Ñ‹ получили новые запиÑи (и %d не отображаютÑÑ):" msgstr[2] "Ð’Ñ‹ получили новые запиÑи (и %d не отображаютÑÑ):" -#: ../src/chat_control.py:209 +#. the next script, executed in the "po" directory, +#. generates the following list. +#. #!/bin/sh +#. LANG=$(for i in *.po; do j=${i/.po/}; echo -n "_('"$j"')":" '"$j"', " ; done) +#. echo "{_('en'):'en'",$LANG"}" +#: ../src/chat_control.py:86 +msgid "English" +msgstr "ÐнглийÑкий" + +#: ../src/chat_control.py:86 +msgid "Belarusian" +msgstr "БелоруÑÑкий" + +#: ../src/chat_control.py:86 +msgid "Bulgarian" +msgstr "БолгарÑкий" + +#: ../src/chat_control.py:87 +msgid "Breton" +msgstr "БретонÑкий" + +#: ../src/chat_control.py:87 +msgid "Czech" +msgstr "ЧешÑкий" + +#: ../src/chat_control.py:87 +msgid "German" +msgstr "Ðемецкий" + +#: ../src/chat_control.py:88 +msgid "Greek" +msgstr "ГречеÑкий" + +#: ../src/chat_control.py:88 +msgid "British" +msgstr "БританÑкий" + +#: ../src/chat_control.py:88 +msgid "Esperanto" +msgstr "ÐÑперанто" + +#: ../src/chat_control.py:89 +msgid "Spanish" +msgstr "ИÑпанÑкий" + +#: ../src/chat_control.py:89 +msgid "Basque" +msgstr "БаÑкÑкий" + +#: ../src/chat_control.py:89 +msgid "French" +msgstr "ФранцузÑкий" + +#: ../src/chat_control.py:90 +msgid "Croatian" +msgstr "ХорватÑкий" + +#: ../src/chat_control.py:90 +msgid "Italian" +msgstr "ИтальÑнÑкий" + +#: ../src/chat_control.py:90 +msgid "Norwegian (b)" +msgstr "ÐорвежÑкий (букмол)" + +#: ../src/chat_control.py:91 +msgid "Dutch" +msgstr "ГолландÑкий" + +#: ../src/chat_control.py:91 +msgid "Norwegian" +msgstr "ÐорвежÑкий" + +#: ../src/chat_control.py:91 +msgid "Polish" +msgstr "ПольÑкий" + +#: ../src/chat_control.py:92 +msgid "Portuguese" +msgstr "ПортугальÑкий" + +#: ../src/chat_control.py:92 +msgid "Brazilian Portuguese" +msgstr "ПортугальÑкий (БразилиÑ)" + +#: ../src/chat_control.py:93 +msgid "Russian" +msgstr "РуÑÑкий" + +#: ../src/chat_control.py:93 +msgid "Serbian" +msgstr "СербÑкий" + +#: ../src/chat_control.py:93 +msgid "Slovak" +msgstr "Словацкий" + +#: ../src/chat_control.py:94 +msgid "Swedish" +msgstr "ШведÑкий" + +#: ../src/chat_control.py:94 +msgid "Chinese (Ch)" +msgstr "КитайÑкий" + +#: ../src/chat_control.py:94 +msgid "Hebrew" +msgstr "" + +#: ../src/chat_control.py:237 msgid "Ping?" msgstr "Ping?" -#: ../src/chat_control.py:214 +#: ../src/chat_control.py:242 #, python-format msgid "Pong! (%s s.)" msgstr "Pong! (%s Ñек.)" -#: ../src/chat_control.py:219 +#: ../src/chat_control.py:247 msgid "Error." msgstr "Ошибка." +#: ../src/chat_control.py:582 +msgid "Spelling language" +msgstr "Язык проверки орфографии" + #. we are not connected -#: ../src/chat_control.py:800 +#: ../src/chat_control.py:614 +#: ../src/chat_control.py:830 msgid "A connection is not available" msgstr "Подключение недоÑтупно" -#: ../src/chat_control.py:801 +#: ../src/chat_control.py:615 +#: ../src/chat_control.py:831 msgid "Your message can not be sent until you are connected." msgstr "Ваше Ñообщение не может быть отправлено, пока вы не подключитеÑÑŒ." -#: ../src/chat_control.py:1047 +#: ../src/chat_control.py:1051 msgid "Underline" msgstr "Подчеркнутый" -#: ../src/chat_control.py:1048 +#: ../src/chat_control.py:1052 msgid "Strike" msgstr "Зачеркнутый" -#: ../src/chat_control.py:1071 +#: ../src/chat_control.py:1075 msgid "Font" msgstr "Шрифт" -#: ../src/chat_control.py:1080 +#: ../src/chat_control.py:1084 msgid "Clear formating" msgstr "Удалить форматирование" -#: ../src/chat_control.py:1157 +#: ../src/chat_control.py:1161 msgid "Really send file?" msgstr "Отправить файл?" -#: ../src/chat_control.py:1158 +#: ../src/chat_control.py:1162 #, python-format msgid "If you send a file to %s, he/she will know your real Jabber ID." msgstr "ЕÑли вы пошлете файл %s, он/она узнает ваш наÑтоÑщий Jabber ID." -#: ../src/chat_control.py:1664 ../src/chat_control.py:2248 -msgid "OpenPGP encryption enabled" -msgstr "OpenPGP шифрование включено" - -#: ../src/chat_control.py:1726 -msgid "Formattings are not available when GPG is active" -msgstr "Форматирование невозможно еÑли включено GPG" - -#: ../src/chat_control.py:1729 -msgid "This contact does not support HTML" -msgstr "Ðтот контакт не поддерживает HTML" +#: ../src/chat_control.py:1645 +#: ../src/chat_control.py:2190 +msgid "GPG encryption enabled" +msgstr "GPG шифрование включено" #. Add to roster -#: ../src/chat_control.py:1734 ../src/common/contacts.py:152 -#: ../src/common/contacts.py:273 ../src/common/helpers.py:67 -#: ../src/common/helpers.py:261 ../src/dialogs.py:1105 ../src/dialogs.py:2310 -#: ../src/dialogs.py:2339 ../src/dialogs.py:3551 ../src/gui_interface.py:485 -#: ../src/gui_menu_builder.py:265 ../src/gui_menu_builder.py:420 -#: ../src/roster_window.py:771 ../src/roster_window.py:1734 -#: ../src/roster_window.py:1736 ../src/roster_window.py:2084 -#: ../src/roster_window.py:3620 ../src/roster_window.py:3647 +#: ../src/chat_control.py:1699 +#: ../src/common/contacts.py:152 +#: ../src/common/contacts.py:273 +#: ../src/common/helpers.py:67 +#: ../src/common/helpers.py:261 +#: ../src/dialogs.py:1101 +#: ../src/dialogs.py:2266 +#: ../src/dialogs.py:2295 +#: ../src/gui_interface.py:484 +#: ../src/gui_menu_builder.py:262 +#: ../src/gui_menu_builder.py:416 +#: ../src/roster_window.py:767 +#: ../src/roster_window.py:1722 +#: ../src/roster_window.py:1724 +#: ../src/roster_window.py:2072 +#: ../src/roster_window.py:3689 +#: ../src/roster_window.py:3716 msgid "Not in Roster" msgstr "Ðе в роÑтере" -#. change tooltip text for audio and video buttons if python-farstream is -#. not installed -#: ../src/chat_control.py:1759 -#: ../src/command_system/implementation/standard.py:215 -msgid "Toggle audio session" -msgstr "Переключить аудио ÑеанÑ" - -#: ../src/chat_control.py:1760 -#: ../src/command_system/implementation/standard.py:225 -msgid "Toggle video session" -msgstr "Переключить видео ÑеанÑ" - -#: ../src/chat_control.py:1762 +#: ../src/chat_control.py:1727 +#, fuzzy msgid "Feature not available, see Help->Features" -msgstr "Ðта возможноÑÑ‚ÑŒ отÑутÑтвует, Ñмотрите Помощь->ВозможноÑти" +msgstr "Ðта возможноÑÑ‚ÑŒ отÑутÑтвует в Windows." -#: ../src/chat_control.py:1766 +#: ../src/chat_control.py:1731 msgid "Feature not supported by remote client" -msgstr "Клиент на другой Ñтороне не поддерживает данную возможноÑÑ‚ÑŒ" - -#: ../src/chat_control.py:1779 -msgid "Send files" -msgstr "Отправить файлы" +msgstr "" -#: ../src/chat_control.py:1784 +#: ../src/chat_control.py:1748 msgid "This contact does not support file transfer." msgstr "Ðтот контакт не поддерживает передачу файлов." -#: ../src/chat_control.py:1787 +#: ../src/chat_control.py:1751 msgid "You need to know the real JID of the contact to send him or her a file." -msgstr "" -"Ðеобходимо знать наÑтоÑщий JID контакта Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы отправить ему или ей " -"файл." +msgstr "Ðеобходимо знать наÑтоÑщий JID контакта Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы отправить ему или ей файл." -#: ../src/chat_control.py:1905 +#: ../src/chat_control.py:1869 #, python-format msgid "%(type)s state : %(state)s, reason: %(reason)s" msgstr "%(type)s ÑоÑтоÑние : %(state)s, причина: %(reason)s" -#: ../src/chat_control.py:2097 +#: ../src/chat_control.py:2060 #, python-format msgid "%(nickname)s from group chat %(room_name)s" msgstr "%(nickname)s из комнаты %(room_name)s" #. No key assigned nor a key is used by remote contact -#: ../src/chat_control.py:2228 ../src/dialogs.py:5194 -msgid "No OpenPGP key assigned" -msgstr "Ключ OpenPGP не приÑвоен" +#: ../src/chat_control.py:2170 +#: ../src/dialogs.py:5092 +msgid "No GPG key assigned" +msgstr "Ключ GPG не приÑвоен" -#: ../src/chat_control.py:2229 -msgid "" -"No OpenPGP key is assigned to this contact. So you cannot encrypt messages " -"with OpenPGP." -msgstr "" -"Ðтому контакту не приÑвоен ключ OpenPGP, поÑтому вы не можете зашифровать " -"ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ OpenPGP." +#: ../src/chat_control.py:2171 +msgid "No GPG key is assigned to this contact. So you cannot encrypt messages with GPG." +msgstr "Ðтому контакту не приÑвоен ключ GPG, поÑтому вы не можете зашифровать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ GPG." -#: ../src/chat_control.py:2238 -msgid "OpenPGP encryption disabled" -msgstr "OpenPGP шифрование выключено" +#: ../src/chat_control.py:2180 +msgid "GPG encryption disabled" +msgstr "GPG шифрование выключено" -#: ../src/chat_control.py:2264 +#: ../src/chat_control.py:2206 msgid "Session WILL be logged" msgstr "Ð”Ð»Ñ ÑеанÑа БУДЕТ Ñохранена иÑÑ‚Ð¾Ñ€Ð¸Ñ Ñообщений" -#: ../src/chat_control.py:2266 +#: ../src/chat_control.py:2208 msgid "Session WILL NOT be logged" msgstr "Ð”Ð»Ñ ÑеанÑа ÐЕ БУДЕТ Ñохранена иÑÑ‚Ð¾Ñ€Ð¸Ñ Ñообщений" #. encryption %s active -#: ../src/chat_control.py:2283 +#: ../src/chat_control.py:2225 msgid "is" msgstr "было" -#: ../src/chat_control.py:2283 +#: ../src/chat_control.py:2225 msgid "is NOT" msgstr "ÐЕ" #. chat session %s be logged -#: ../src/chat_control.py:2285 +#: ../src/chat_control.py:2227 msgid "will" msgstr "будет" -#: ../src/chat_control.py:2285 +#: ../src/chat_control.py:2227 msgid "will NOT" msgstr "ÐЕ будет" #. About encrypted chat session -#: ../src/chat_control.py:2289 +#: ../src/chat_control.py:2231 msgid "and authenticated" msgstr "и заверено" #. About encrypted chat session -#: ../src/chat_control.py:2293 +#: ../src/chat_control.py:2235 msgid "and NOT authenticated" msgstr "и ÐЕ заверено" #. status will become 'is' or 'is not', authentificaed will become #. 'and authentificated' or 'and not authentificated', logged will become #. 'will' or 'will not' -#: ../src/chat_control.py:2300 +#: ../src/chat_control.py:2242 #, python-format msgid "" "%(type)s encryption %(status)s active %(authenticated)s.\n" @@ -3239,81 +3247,75 @@ msgstr "" "%(type)s шифрование %(status)s включено %(authenticated)s.\n" "Ð”Ð»Ñ ÑеанÑа %(logged)s Ñохранена иÑÑ‚Ð¾Ñ€Ð¸Ñ Ñообщений." -#: ../src/chat_control.py:2438 +#: ../src/chat_control.py:2370 msgid "Session negotiation cancelled" msgstr "УÑтановление ÑеанÑа отменено" -#: ../src/chat_control.py:2448 +#: ../src/chat_control.py:2380 msgid "This session WILL be archived on server" msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ ÑеанÑа БУДЕТ Ñохранена на Ñервере" -#: ../src/chat_control.py:2450 +#: ../src/chat_control.py:2382 msgid "This session WILL NOT be archived on server" msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ ÑеанÑа ÐЕ БУДЕТ Ñохранена на Ñервере" -#: ../src/chat_control.py:2459 +#: ../src/chat_control.py:2391 msgid "This session is encrypted" msgstr "Ð¡ÐµÐ°Ð½Ñ Ð·Ð°ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½" -#: ../src/chat_control.py:2462 +#: ../src/chat_control.py:2394 msgid " and WILL be logged" msgstr " и БУДЕТ Ñохранена иÑÑ‚Ð¾Ñ€Ð¸Ñ Ñообщений" -#: ../src/chat_control.py:2464 +#: ../src/chat_control.py:2396 msgid " and WILL NOT be logged" msgstr " и ÐЕ БУДЕТ Ñохранена иÑÑ‚Ð¾Ñ€Ð¸Ñ Ñообщений" -#: ../src/chat_control.py:2469 -msgid "" -"Remote contact's identity not verified. Click the shield button for more " -"details." -msgstr "" -"ЛичноÑÑ‚ÑŒ удаленного контакта не подтверждена. Ðажмите на кнопку Ñо щитом Ð´Ð»Ñ " -"подробноÑтей." +#: ../src/chat_control.py:2401 +msgid "Remote contact's identity not verified. Click the shield button for more details." +msgstr "ЛичноÑÑ‚ÑŒ удаленного контакта не подтверждена. Ðажмите на кнопке Ñо щитом Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ñтей." -#: ../src/chat_control.py:2471 +#: ../src/chat_control.py:2403 msgid "E2E encryption disabled" msgstr "E2E шифрование выключено" -#: ../src/chat_control.py:2519 ../src/chat_control.py:2533 +#: ../src/chat_control.py:2451 +#: ../src/chat_control.py:2465 msgid "The following message was NOT encrypted" msgstr "ПоÑледнее Ñообщение ÐЕ БЫЛО зашифровано" -#: ../src/chat_control.py:2525 +#: ../src/chat_control.py:2457 msgid "The following message was encrypted" msgstr "ПоÑледнее Ñообщение зашифровано" #. %s is being replaced in the code with JID -#: ../src/chat_control.py:2796 +#: ../src/chat_control.py:2728 #, python-format msgid "You just received a new message from \"%s\"" msgstr "Получено новое Ñообщение от «%s»" -#: ../src/chat_control.py:2798 -msgid "" -"If you close this tab and you have history disabled, this message will be " -"lost." -msgstr "" -"ЕÑли вы закроете Ñту вкладку и у Ð²Ð°Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð° Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¸Ñтории " -"Ñообщений, то Ñто Ñообщение будет утерÑно." - -#: ../src/chat_control.py:2966 ../src/common/connection_handlers_events.py:913 -#: ../src/common/connection_handlers.py:1145 -#: ../src/common/connection_handlers.py:1269 ../src/common/connection.py:523 -#: ../src/common/logger.py:1161 ../src/gajim.py:229 ../src/session.py:98 +#: ../src/chat_control.py:2729 +msgid "If you close this tab and you have history disabled, this message will be lost." +msgstr "ЕÑли вы закроете Ñту вкладку и у Ð²Ð°Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð° Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¸Ñтории Ñообщений, то Ñто Ñообщение будет утерÑно." + +#: ../src/chat_control.py:2896 +#: ../src/common/connection_handlers_events.py:911 +#: ../src/common/connection_handlers.py:955 +#: ../src/common/connection_handlers.py:1077 +#: ../src/common/connection.py:462 +#: ../src/common/logger.py:1155 +#: ../src/gajim.py:208 +#: ../src/session.py:100 msgid "Database Error" msgstr "Ошибка базы данных" -#: ../src/chat_control.py:2967 +#: ../src/chat_control.py:2897 #, python-format -msgid "" -"The database file (%s) cannot be read. Try to repair it or remove it (all " -"history will be lost)." -msgstr "" -"Файл базы данных (%s) не может быть прочитан. Попробуйте воÑÑтановить его " -"или удалить (вÑÑ Ð¸ÑÑ‚Ð¾Ñ€Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ утерÑна)." +msgid "The database file (%s) cannot be read. Try to repair it or remove it (all history will be lost)." +msgstr "Файл базы данных (%s) не может быть прочитан. Попробуйте воÑÑтановить его или удалить (вÑÑ Ð¸ÑÑ‚Ð¾Ñ€Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ утерÑна)." -#: ../src/chat_control.py:3204 ../src/gui_interface.py:1161 +#: ../src/chat_control.py:3134 +#: ../src/gui_interface.py:1151 #, python-format msgid "" "Unable to decrypt message from %s\n" @@ -3322,52 +3324,60 @@ msgstr "" "Ðе удалоÑÑŒ раÑшифровать Ñообщение от %s\n" "Возможно, оно было иÑпорчено." -#: ../src/chat_control.py:3261 +#: ../src/chat_control.py:3167 #, python-format msgid "%(name)s is now %(status)s" msgstr "%(name)s теперь %(status)s" -#: ../src/chat_control.py:3320 +#: ../src/chat_control.py:3226 msgid "File transfer" msgstr "Передача файлов" -#: ../src/chat_control.py:3323 +#: ../src/chat_control.py:3229 msgid "Size" msgstr "Размер" -#: ../src/chat_control.py:3325 +#: ../src/chat_control.py:3231 msgid "_Accept" msgstr "_ПринÑÑ‚ÑŒ" -#: ../src/chat_control.py:3346 ../src/filetransfers_window.py:211 +#: ../src/chat_control.py:3252 +#: ../src/filetransfers_window.py:211 msgid "File transfer completed" msgstr "Передача завершена" -#: ../src/chat_control.py:3382 ../src/dialogs.py:2927 ../src/dialogs.py:4614 -#: ../src/gui_interface.py:646 ../src/notify.py:278 +#: ../src/chat_control.py:3288 +#: ../src/dialogs.py:2828 +#: ../src/gui_interface.py:645 +#: ../src/notify.py:278 msgid "Groupchat Invitation" msgstr "Приглашение в комнату" -#: ../src/chat_control.py:3404 ../src/gui_interface.py:1019 -#: ../src/roster_window.py:1993 +#: ../src/chat_control.py:3310 +#: ../src/gui_interface.py:1009 +#: ../src/roster_window.py:1981 msgid "Remote contact stopped transfer" msgstr "Удаленный контакт оÑтановил передачу" -#: ../src/chat_control.py:3406 ../src/gui_interface.py:1022 -#: ../src/roster_window.py:1995 +#: ../src/chat_control.py:3312 +#: ../src/gui_interface.py:1012 +#: ../src/roster_window.py:1983 msgid "Error opening file" msgstr "Ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°" -#: ../src/chat_control.py:3408 ../src/filetransfers_window.py:247 +#: ../src/chat_control.py:3314 +#: ../src/filetransfers_window.py:247 msgid "File transfer stopped" msgstr "Передача файла оÑтановлена" -#: ../src/chat_control.py:3411 ../src/filetransfers_window.py:226 +#: ../src/chat_control.py:3317 +#: ../src/filetransfers_window.py:226 #: ../src/filetransfers_window.py:233 msgid "File transfer cancelled" msgstr "Передача отменена" -#: ../src/chat_control.py:3412 ../src/filetransfers_window.py:226 +#: ../src/chat_control.py:3318 +#: ../src/filetransfers_window.py:226 #: ../src/filetransfers_window.py:234 msgid "Connection with peer cannot be established." msgstr "Соединение не может быть уÑтановлено." @@ -3385,17 +3395,15 @@ msgid "Execute expression inside a shell, send output" msgstr "" #: ../src/command_system/implementation/middleware.py:74 -#, fuzzy msgid "Error during command execution!" -msgstr "Ðе удалоÑÑŒ иÑполнить команду!" +msgstr "" #: ../src/command_system/implementation/standard.py:50 msgid "Hide the chat buttons" msgstr "Скрыть кнопки в окне беÑеды" #: ../src/command_system/implementation/standard.py:56 -msgid "" -"Show help on a given command or a list of available commands if -a is given" +msgid "Show help on a given command or a list of available commands if -a is given" msgstr "" #: ../src/command_system/implementation/standard.py:83 @@ -3411,17 +3419,15 @@ msgid "Show logged messages which mention given text" msgstr "" #: ../src/command_system/implementation/standard.py:99 -#, python-format +#, fuzzy, python-format msgid "%s: Nothing found" -msgstr "%s: Ðичего не найдено" +msgstr "%s не найден" #: ../src/command_system/implementation/standard.py:105 -#, fuzzy msgid "Limit must be an integer" -msgstr "Ðргумент предела должен быть целым чиÑлом." +msgstr "" -#. Do not translate online, away, chat, xa, dnd -#: ../src/command_system/implementation/standard.py:130 +#: ../src/command_system/implementation/standard.py:129 msgid "" "\n" " Set the current status\n" @@ -3431,130 +3437,124 @@ msgid "" " " msgstr "" -#: ../src/command_system/implementation/standard.py:148 -#, fuzzy +#: ../src/command_system/implementation/standard.py:147 msgid "Set the current status to away" -msgstr "УÑтановлен ÑÑ‚Ð°Ñ‚ÑƒÑ Â«Ð½Ðµ в Ñети»" +msgstr "" -#: ../src/command_system/implementation/standard.py:151 -#: ../src/common/commands.py:110 ../src/common/helpers.py:249 +#: ../src/command_system/implementation/standard.py:150 +#: ../src/common/commands.py:109 +#: ../src/common/helpers.py:249 #: ../src/tooltips.py:189 msgid "Away" msgstr "Ушел" -#: ../src/command_system/implementation/standard.py:162 -#, fuzzy +#: ../src/command_system/implementation/standard.py:161 msgid "Set the current status to online" -msgstr "УÑтановлен ÑÑ‚Ð°Ñ‚ÑƒÑ Â«Ð½Ðµ в Ñети»" +msgstr "" -#: ../src/command_system/implementation/standard.py:165 +#: ../src/command_system/implementation/standard.py:164 msgid "Available" msgstr "ДоÑтупен" -#: ../src/command_system/implementation/standard.py:185 -#: ../src/command_system/implementation/standard.py:267 +#: ../src/command_system/implementation/standard.py:184 +#: ../src/command_system/implementation/standard.py:266 msgid "Clear the text window" msgstr "ОчиÑтить текÑтовое окно" -#: ../src/command_system/implementation/standard.py:190 -#, fuzzy -msgid "Toggle the OpenPGP encryption" -msgstr "OpenPGP шифрование включено" +#: ../src/command_system/implementation/standard.py:189 +msgid "Toggle the GPG encryption" +msgstr "Включить GPG шифрование" -#: ../src/command_system/implementation/standard.py:195 +#: ../src/command_system/implementation/standard.py:194 msgid "Send a ping to the contact" msgstr "ПоÑлать пинг контакту" -#: ../src/command_system/implementation/standard.py:198 +#: ../src/command_system/implementation/standard.py:197 +#, fuzzy msgid "Command is not supported for zeroconf accounts" -msgstr "Команда не поддерживаетÑÑ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑью zeroconf" +msgstr "Команда не поддерживаетÑÑ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑью zeroconf." -#: ../src/command_system/implementation/standard.py:202 +#: ../src/command_system/implementation/standard.py:201 msgid "Send DTMF sequence through an open audio session" msgstr "" -#: ../src/command_system/implementation/standard.py:205 +#: ../src/command_system/implementation/standard.py:204 #, fuzzy msgid "No open audio sessions with the contact" msgstr "Щелкните Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра поÑледних беÑед Ñ Ñтим человеком" -#: ../src/command_system/implementation/standard.py:208 +#: ../src/command_system/implementation/standard.py:207 #, fuzzy, python-format msgid "%s is not a valid tone" msgstr "%s не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым loglevel" -#: ../src/command_system/implementation/standard.py:218 +#: ../src/command_system/implementation/standard.py:217 #, fuzzy msgid "Audio sessions are not available" -msgstr "ÐедоÑтупны заголовки раздела!\n" +msgstr "Подключение недоÑтупно" -#: ../src/command_system/implementation/standard.py:228 +#: ../src/command_system/implementation/standard.py:227 #, fuzzy msgid "Video sessions are not available" -msgstr "ÐедоÑтупны заголовки раздела!\n" +msgstr "Соединение недоÑтупно" -#: ../src/command_system/implementation/standard.py:235 +#: ../src/command_system/implementation/standard.py:234 #, fuzzy msgid "Send a message to the contact that will attract his (her) attention" msgstr "ИÑпользование: /%s, поÑылает Ñообщение контакту" -#: ../src/command_system/implementation/standard.py:274 +#: ../src/command_system/implementation/standard.py:273 #, fuzzy msgid "Change your nickname in a group chat" -msgstr "Комната «%s» уже еÑÑ‚ÑŒ в ваших закладках." +msgstr "Изменить ник (Ctrl+N)" #. invalid char -#: ../src/command_system/implementation/standard.py:279 ../src/config.py:3405 -#: ../src/dialogs.py:2154 +#: ../src/command_system/implementation/standard.py:278 +#: ../src/config.py:3387 +#: ../src/dialogs.py:2113 msgid "Invalid nickname" msgstr "Ðеверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" -#: ../src/command_system/implementation/standard.py:284 +#: ../src/command_system/implementation/standard.py:283 #, fuzzy msgid "Open a private chat window with a specified occupant" -msgstr "" -"ИÑпользование: /%s <ник>, открывает окно привата Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ поÑетителем." +msgstr "ИÑпользование: /%s <ник>, открывает окно привата Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ поÑетителем." -#: ../src/command_system/implementation/standard.py:290 -#: ../src/command_system/implementation/standard.py:299 -#: ../src/command_system/implementation/standard.py:353 -#: ../src/command_system/implementation/standard.py:365 -#: ../src/command_system/implementation/standard.py:377 +#: ../src/command_system/implementation/standard.py:289 +#: ../src/command_system/implementation/standard.py:298 +#: ../src/command_system/implementation/standard.py:352 +#: ../src/command_system/implementation/standard.py:363 +#: ../src/command_system/implementation/standard.py:374 msgid "Nickname not found" msgstr "Ðик не обнаружен" -#: ../src/command_system/implementation/standard.py:293 +#: ../src/command_system/implementation/standard.py:292 #, fuzzy -msgid "" -"Open a private chat window with a specified occupant and send him a message" -msgstr "" -"ИÑпользование: /%s <ник>, открывает окно привата Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ поÑетителем." +msgid "Open a private chat window with a specified occupant and send him a message" +msgstr "ИÑпользование: /%s <ник>, открывает окно привата Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ поÑетителем." -#: ../src/command_system/implementation/standard.py:302 +#: ../src/command_system/implementation/standard.py:301 msgid "Display or change a group chat topic" msgstr "Показать или изменить тему комнаты" -#: ../src/command_system/implementation/standard.py:310 -#, fuzzy +#: ../src/command_system/implementation/standard.py:309 msgid "Invite a user to a room for a reason" msgstr "" -"invite <пользователь> [Ñообщение]: ПриглаÑить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² комнату." -#: ../src/command_system/implementation/standard.py:313 +#: ../src/command_system/implementation/standard.py:312 #, fuzzy, python-format msgid "Invited %s to %s" -msgstr "Приглашен %s в %s" +msgstr "Отправить %s контакту %s" -#: ../src/command_system/implementation/standard.py:316 +#: ../src/command_system/implementation/standard.py:315 msgid "Join a group chat given by a jid, optionally using given nickname" msgstr "" -#: ../src/command_system/implementation/standard.py:333 -msgid "" -"Leave the groupchat, optionally giving a reason, and close tab or window" +#: ../src/command_system/implementation/standard.py:332 +msgid "Leave the groupchat, optionally giving a reason, and close tab or window" msgstr "" -#: ../src/command_system/implementation/standard.py:338 +#: ../src/command_system/implementation/standard.py:337 msgid "" "\n" " Ban user by a nick or a jid from a groupchat\n" @@ -3563,61 +3563,48 @@ msgid "" " " msgstr "" -#: ../src/command_system/implementation/standard.py:350 +#: ../src/command_system/implementation/standard.py:349 #, fuzzy msgid "Kick user by a nick from a groupchat" msgstr "Ð’Ñ‹ приглашены в конференцию" -#. Do not translate moderator, participant, visitor, none -#: ../src/command_system/implementation/standard.py:358 +#: ../src/command_system/implementation/standard.py:356 msgid "" "Set occupant role in group chat.\n" " Role can be given as one of the following values:\n" " moderator, participant, visitor, none" msgstr "" -#: ../src/command_system/implementation/standard.py:363 +#: ../src/command_system/implementation/standard.py:361 #, fuzzy msgid "Invalid role given" -msgstr "задана Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ°" +msgstr "Ðеверный Ñервер" -#. Do not translate owner, admin, member, outcast, none -#: ../src/command_system/implementation/standard.py:370 +#: ../src/command_system/implementation/standard.py:367 msgid "" "Set occupant affiliation in group chat.\n" " Affiliation can be given as one of the following values:\n" " owner, admin, member, outcast, none" msgstr "" -#: ../src/command_system/implementation/standard.py:375 +#: ../src/command_system/implementation/standard.py:372 #, fuzzy msgid "Invalid affiliation given" -msgstr "задана Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ°" +msgstr "ранг изменен" -#: ../src/command_system/implementation/standard.py:383 +#: ../src/command_system/implementation/standard.py:380 #, fuzzy msgid "Display names of all group chat occupants" msgstr "ИÑпользование: /%s, показывает ÑпиÑок приÑутÑтвующих в комнате." -#: ../src/command_system/implementation/standard.py:405 +#: ../src/command_system/implementation/standard.py:402 msgid "Forbid an occupant to send you public or private messages" msgstr "" -#: ../src/command_system/implementation/standard.py:410 +#: ../src/command_system/implementation/standard.py:407 msgid "Allow an occupant to send you public or private messages" msgstr "" -#: ../src/command_system/mapping.py:165 ../src/command_system/mapping.py:175 -#: ../src/command_system/mapping.py:195 -#, fuzzy -msgid "Missing arguments" -msgstr "необходимо задать аргументы" - -#: ../src/command_system/mapping.py:262 -#, fuzzy -msgid "Excessive arguments" -msgstr "Ðргументы инициализатора:" - #: ../src/common/check_paths.py:39 msgid "creating logs database" msgstr "ÑоздаетÑÑ Ð‘Ð” иÑтории" @@ -3626,23 +3613,33 @@ msgstr "ÑоздаетÑÑ Ð‘Ð” иÑтории" msgid "creating cache database" msgstr "ÑоздаетÑÑ Ð‘Ð” иÑтории" -#: ../src/common/check_paths.py:278 ../src/common/check_paths.py:285 -#: ../src/common/check_paths.py:292 ../src/common/check_paths.py:299 -#: ../src/common/check_paths.py:306 ../src/common/check_paths.py:313 -#: ../src/common/check_paths.py:320 ../src/common/check_paths.py:327 +#: ../src/common/check_paths.py:278 +#: ../src/common/check_paths.py:285 +#: ../src/common/check_paths.py:292 +#: ../src/common/check_paths.py:299 +#: ../src/common/check_paths.py:306 +#: ../src/common/check_paths.py:313 +#: ../src/common/check_paths.py:320 +#: ../src/common/check_paths.py:327 #, python-format msgid "%s is a file but it should be a directory" msgstr "%s должен быть директорией, а не файлом" -#: ../src/common/check_paths.py:279 ../src/common/check_paths.py:286 -#: ../src/common/check_paths.py:293 ../src/common/check_paths.py:300 -#: ../src/common/check_paths.py:307 ../src/common/check_paths.py:314 -#: ../src/common/check_paths.py:321 ../src/common/check_paths.py:328 -#: ../src/common/check_paths.py:338 ../src/common/check_paths.py:346 +#: ../src/common/check_paths.py:279 +#: ../src/common/check_paths.py:286 +#: ../src/common/check_paths.py:293 +#: ../src/common/check_paths.py:300 +#: ../src/common/check_paths.py:307 +#: ../src/common/check_paths.py:314 +#: ../src/common/check_paths.py:321 +#: ../src/common/check_paths.py:328 +#: ../src/common/check_paths.py:338 +#: ../src/common/check_paths.py:346 msgid "Gajim will now exit" msgstr "Закончить работу" -#: ../src/common/check_paths.py:337 ../src/common/check_paths.py:345 +#: ../src/common/check_paths.py:337 +#: ../src/common/check_paths.py:345 #, python-format msgid "%s is a directory but should be a file" msgstr "%s должен быть файлом, а не директорией" @@ -3652,84 +3649,90 @@ msgstr "%s должен быть файлом, а не директорией" msgid "creating %s directory" msgstr "ÑоздаетÑÑ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ %s" -#: ../src/common/commands.py:86 +#: ../src/common/commands.py:85 msgid "Change status information" msgstr "Изменить информацию о ÑтатуÑе" -#: ../src/common/commands.py:101 +#: ../src/common/commands.py:100 msgid "Change status" msgstr "Контакт изменит ÑтатуÑ" -#: ../src/common/commands.py:102 +#: ../src/common/commands.py:101 msgid "Set the presence type and description" msgstr "УÑтановка ÑтатуÑа и ÑтатуÑного ÑообщениÑ" -#: ../src/common/commands.py:108 +#: ../src/common/commands.py:107 msgid "Free for chat" msgstr "Готов поболтать" -#: ../src/common/commands.py:109 +#: ../src/common/commands.py:108 msgid "Online" msgstr "Ð’ Ñети" -#: ../src/common/commands.py:111 +#: ../src/common/commands.py:110 msgid "Extended away" msgstr "ÐедоÑтупен (раÑширенный)" -#: ../src/common/commands.py:112 +#: ../src/common/commands.py:111 msgid "Do not disturb" msgstr "Ðе беÑпокоить." -#: ../src/common/commands.py:113 +#: ../src/common/commands.py:112 msgid "Offline - disconnect" msgstr "Ðе в Ñети — отключен" -#: ../src/common/commands.py:118 +#: ../src/common/commands.py:117 msgid "Presence description:" msgstr "ОпиÑание приÑутÑтвиÑ:" -#: ../src/common/commands.py:153 ../src/common/commands.py:330 +#: ../src/common/commands.py:152 +#: ../src/common/commands.py:324 msgid "The status has been changed." msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¸Ð·Ð¼ÐµÐ½Ñ‘Ð½." -#: ../src/common/commands.py:185 ../src/common/commands.py:211 +#: ../src/common/commands.py:184 +#: ../src/common/commands.py:210 msgid "Leave Groupchats" msgstr "Покинуть конференции" -#: ../src/common/commands.py:201 +#: ../src/common/commands.py:200 #, python-format msgid "%(nickname)s on %(room_jid)s" msgstr "%(nickname)s из комнаты %(room_jid)s" -#: ../src/common/commands.py:205 +#: ../src/common/commands.py:204 msgid "You have not joined a groupchat." msgstr "Ð’Ñ‹ не вошли в комнату." -#: ../src/common/commands.py:212 +#: ../src/common/commands.py:211 msgid "Choose the groupchats you want to leave" msgstr "Выберите конференции, которые вы хотите покинуть" #. Make special context menu if group is Groupchats -#: ../src/common/commands.py:216 ../src/common/contacts.py:131 -#: ../src/common/helpers.py:67 ../src/roster_window.py:824 -#: ../src/roster_window.py:1738 ../src/roster_window.py:1740 -#: ../src/roster_window.py:2623 ../src/roster_window.py:5716 +#: ../src/common/commands.py:215 +#: ../src/common/contacts.py:131 +#: ../src/common/helpers.py:67 +#: ../src/roster_window.py:820 +#: ../src/roster_window.py:1726 +#: ../src/roster_window.py:1728 +#: ../src/roster_window.py:2611 +#: ../src/roster_window.py:5766 msgid "Groupchats" msgstr "Комнаты" -#: ../src/common/commands.py:257 +#: ../src/common/commands.py:256 msgid "You left the following groupchats:" msgstr "Ð’Ñ‹ покинули Ñледующие комнаты:" -#: ../src/common/commands.py:269 +#: ../src/common/commands.py:268 msgid "Forward unread messages" msgstr "ПереÑлать непрочитанные ÑообщениÑ" -#: ../src/common/commands.py:296 +#: ../src/common/commands.py:294 msgid "All unread messages have been forwarded." msgstr "Ð’Ñе непрочитанные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ñ‹." -#: ../src/common/commands.py:304 +#: ../src/common/commands.py:302 msgid "Forward unread message then disconnect" msgstr "ПереÑлать непрочитанные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ отключении" @@ -3743,9 +3746,7 @@ msgstr "ИÑпользовать DBus и Notification Daemon Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° #: ../src/common/config.py:79 msgid "Show only online and free for chat contacts in roster." -msgstr "" -"Показывать в роÑтере только контакты Ñо ÑтатуÑами «ДоÑтупен» и «Готов " -"поболтать»." +msgstr "Показывать в роÑтере только контакты Ñо ÑтатуÑами «ДоÑтупен» и «Готов поболтать»." #: ../src/common/config.py:82 msgid "Time in minutes, after which your status changes to away." @@ -3756,8 +3757,7 @@ msgid "$S (Away as a result of being idle more than $T min)" msgstr "$S (ÐвтоÑÑ‚Ð°Ñ‚ÑƒÑ 'Отошел' по причине бездейÑÑ‚Ð²Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ $T мин)" #: ../src/common/config.py:83 -#, fuzzy -msgid "$S will be replaced by current status message, $T by autoawaytime." +msgid "$S will be replaced by current status message, $T by autoaway time." msgstr "$S будет замещено текущим Ñообщением о ÑтатуÑе, $T — временем проÑтоÑ." #: ../src/common/config.py:85 @@ -3769,16 +3769,12 @@ msgid "$S (Not available as a result of being idle more than $T min)" msgstr "$S (ÐвтоÑÑ‚Ð°Ñ‚ÑƒÑ 'ÐедоÑтупен' по причине бездейÑÑ‚Ð²Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ $T мин)" #: ../src/common/config.py:86 -#, fuzzy -msgid "$S will be replaced by current status message, $T by autoxatime." +msgid "$S will be replaced by current status message, $T by autoxa time." msgstr "$S будет замещено текущим Ñообщением о ÑтатуÑе, $T — временем проÑтоÑ." #: ../src/common/config.py:89 -msgid "" -"When to show notification area icon. Can be 'never', 'on_event', 'always'." -msgstr "" -"Когда показывать иконку в облаÑти уведомлений. Возможные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ 'never', " -"'on_event', 'always'." +msgid "When to show notification area icon. Can be 'never', 'on_event', 'always'." +msgstr "Когда показывать иконку в облаÑти уведомлений. Возможные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ 'never', 'on_event', 'always'." #: ../src/common/config.py:90 msgid "Allow to hide the roster window even if the tray icon is not shown." @@ -3813,19 +3809,19 @@ msgstr "_Показывать Ñобытие в облаÑти уведомле #: ../src/common/config.py:103 #, fuzzy msgid "Contact signout notification color" -msgstr "Цвет фона контакта/перепиÑки" +msgstr "_Показывать Ñобытие в облаÑти уведомлений" #. red #: ../src/common/config.py:104 #, fuzzy msgid "New message/email notification color." -msgstr "Показывать _ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ получении Ñообщений" +msgstr "ПредпроÑмотр новых Ñообщений во вÑплывающем окне?" #. dodgerblue #: ../src/common/config.py:105 #, fuzzy msgid "File transfer request notification color." -msgstr "Удовлетворить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ файлов от %s?" +msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ файлов" #. khaki #: ../src/common/config.py:106 @@ -3841,8 +3837,9 @@ msgstr "Показать уведомление по окончании загр #. yellowgreen #: ../src/common/config.py:108 +#, fuzzy msgid "Groupchat invitation notification color" -msgstr "Цвет, иÑпользующийÑÑ Ð´Ð»Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ð° ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ наборе" +msgstr "Приглашение в комнату" #. tan1 #: ../src/common/config.py:109 @@ -3851,9 +3848,8 @@ msgstr "" #. thistle2 #: ../src/common/config.py:110 -#, fuzzy msgid "Other dialogs color." -msgstr "Цвет ника ÑобеÑедника." +msgstr "" #. white #: ../src/common/config.py:111 @@ -3877,15 +3873,16 @@ msgid "Status message text font." msgstr "Шрифт ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑтатуÑе" #: ../src/common/config.py:116 -msgid "" -"List (space separated) of rows (accounts and groups) that are collapsed." -msgstr "" -"СпиÑок (через пробел) Ñтрок (учётных запиÑей и групп), которые Ñвёрнуты." +msgid "List (space separated) of rows (accounts and groups) that are collapsed." +msgstr "СпиÑок (через пробел) Ñтрок (учётных запиÑей и групп), которые Ñвёрнуты." #. sorted alphanum -#: ../src/common/config.py:117 ../src/common/config.py:533 -#: ../src/common/optparser.py:295 ../src/common/optparser.py:491 -#: ../src/common/optparser.py:525 ../src/gui_interface.py:2790 +#: ../src/common/config.py:117 +#: ../src/common/config.py:528 +#: ../src/common/optparser.py:295 +#: ../src/common/optparser.py:491 +#: ../src/common/optparser.py:525 +#: ../src/gui_interface.py:2761 msgid "default" msgstr "По_умолчанию" @@ -3904,414 +3901,249 @@ msgstr "" "«never» — не печатать времÑ." #: ../src/common/config.py:125 -msgid "" -"Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 " -"to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. " -"This is used only if print_time is 'sometimes'." -msgstr "" -"Печатать Ð²Ñ€ÐµÐ¼Ñ Ð² беÑеде как в неточных чаÑах. Степень неточноÑти может быть " -"от 1 до 4, 0 отключает Ñту функцию. 1 Ñамые точные чаÑÑ‹, 4 Ñамые неточные. " -"ИÑпользуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ еÑли режим печати времени уÑтановлен на " -"«sometimes» (иногда)." +msgid "Print time in chats using Fuzzy Clock. Value of fuzziness from 1 to 4, or 0 to disable fuzzyclock. 1 is the most precise clock, 4 the least precise one. This is used only if print_time is 'sometimes'." +msgstr "Печатать Ð²Ñ€ÐµÐ¼Ñ Ð² беÑеде как в неточных чаÑах. Степень неточноÑти может быть от 1 до 4, 0 отключает Ñту функцию. 1 Ñамые точные чаÑÑ‹, 4 Ñамые неточные. ИÑпользуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ еÑли режим печати времени уÑтановлен на «sometimes» (иногда)." #: ../src/common/config.py:128 msgid "Treat * / _ pairs as possible formatting characters." msgstr "Обрабатывать пары * / _ как возможные форматирующие Ñимволы." #: ../src/common/config.py:129 -msgid "" -"If True, do not remove */_ . So *abc* will be bold but with * * not removed." -msgstr "" -"ЕÑли активно, то не будут удалÑÑ‚ÑŒÑÑ */_. Так что *фыва* будет напиÑано " -"полужирным шрифтом, но * * удалены не будут" +msgid "If True, do not remove */_ . So *abc* will be bold but with * * not removed." +msgstr "ЕÑли активно, то не будут удалÑÑ‚ÑŒÑÑ */_. Так что *фыва* будет напиÑано полужирным шрифтом, но * * удалены не будут" #: ../src/common/config.py:132 -msgid "" -"Uses ReStructured text markup to send HTML, plus ascii formatting if " -"selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/" -"restructuredtext.html (If you want to use this, install docutils)" -msgstr "" -"ИÑпользовать разметку ReStructuredText Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ HTML, Ð¿Ð»ÑŽÑ ascii " -"форматирование, еÑли оно выбрано. СинтакÑÐ¸Ñ Ð¾Ð¿Ð¸Ñан на http://docutils." -"sourceforge.net/docs/ref/rst/restructuredtext.htm (ЕÑли вы хотите " -"воÑпользоватьÑÑ Ñтой опцией, уÑтановите docutils)" +msgid "Uses ReStructured text markup to send HTML, plus ascii formatting if selected. For syntax, see http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html (If you want to use this, install docutils)" +msgstr "ИÑпользовать разметку ReStructuredText Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ HTML, Ð¿Ð»ÑŽÑ ascii форматирование, еÑли оно выбрано. СинтакÑÐ¸Ñ Ð¾Ð¿Ð¸Ñан на http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.htm (ЕÑли вы хотите воÑпользоватьÑÑ Ñтой опцией, уÑтановите docutils)" #: ../src/common/config.py:141 -msgid "" -"Character to add after nickname when using nick completion (tab) in group " -"chat." -msgstr "" -"Символ, который нужно добавлÑÑ‚ÑŒ к нику, когда иÑпользуетÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ðµ (tab) " -"в комнате." +msgid "Character to add after nickname when using nick completion (tab) in group chat." +msgstr "Символ, который нужно добавлÑÑ‚ÑŒ к нику, когда иÑпользуетÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ðµ (tab) в комнате." #: ../src/common/config.py:142 -msgid "" -"Character to propose to add after desired nickname when desired nickname is " -"used by someone else in group chat." -msgstr "" -"Символ, который будет добавлÑÑ‚ÑŒÑÑ Ð¿Ð¾Ñле ника, когда желаемый ник уже занÑÑ‚ " -"кем-нибудь в комнате." +msgid "Character to propose to add after desired nickname when desired nickname is used by someone else in group chat." +msgstr "Символ, который будет добавлÑÑ‚ÑŒÑÑ Ð¿Ð¾Ñле ника, когда желаемый ник уже занÑÑ‚ кем-нибудь в комнате." #: ../src/common/config.py:160 -msgid "" -"If True, Gajim will save roster position when hiding roster, and restore it " -"when showing roster." +msgid "If true, Gajim will save roster position when hiding roster, and restore it when showing roster." msgstr "" -#: ../src/common/config.py:172 -msgid "" -"This option let you customize timestamp that is printed in conversation. For " -"exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on " -"strftime for full documentation: http://docs.python.org/lib/module-time.html" -msgstr "" -"Ðта Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет наÑтроить отпечаток времени, который печатаетÑÑ Ð² чатах. " -"К примеру «[%H:%M]» будет показано как «[чч:мм]». Смотрите дополнительно " -"документацию python к strftime (http://docs.python.org/lib/module-time.html)" +#: ../src/common/config.py:171 +msgid "This option let you customize timestamp that is printed in conversation. For exemple \"[%H:%M] \" will show \"[hour:minute] \". See python doc on strftime for full documentation: http://docs.python.org/lib/module-time.html" +msgstr "Ðта Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет наÑтроить отпечаток времени, который печатаетÑÑ Ð² чатах. К примеру «[%H:%M]» будет показано как «[чч:мм]». Смотрите дополнительно документацию python к strftime (http://docs.python.org/lib/module-time.html)" -#: ../src/common/config.py:173 +#: ../src/common/config.py:172 msgid "Characters that are printed before the nickname in conversations" msgstr "Символы, которые будут отображатьÑÑ Ð¿ÐµÑ€ÐµÐ´ никами в чате." -#: ../src/common/config.py:174 +#: ../src/common/config.py:173 msgid "Characters that are printed after the nickname in conversations" msgstr "Символы, которые будут отображатьÑÑ Ð¿Ð¾Ñле ников в чате" -#: ../src/common/config.py:177 -msgid "" -"Specify the command to run when new mail arrives, e.g.: /usr/bin/getmail -q" -msgstr "" -"Определение команды Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка при получении нового пиÑьма, например: /usr/" -"bin/getmail -q" +#: ../src/common/config.py:176 +msgid "Specify the command to run when new mail arrives, e.g.: /usr/bin/getmail -q" +msgstr "Определение команды Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка при получении нового пиÑьма, например: /usr/bin/getmail -q" -#: ../src/common/config.py:179 +#: ../src/common/config.py:178 msgid "Add * and [n] in roster title?" msgstr "ДобавлÑÑ‚ÑŒ * и [n] в окно роÑтера?" -#: ../src/common/config.py:180 -msgid "" -"How many lines to remember from previous conversation when a chat tab/window " -"is reopened?" -msgstr "" -"Сколько Ñтрок из предыдущей беÑеды выводить, когда вкладка/окно открываютÑÑ " -"вновь." +#: ../src/common/config.py:179 +msgid "How many lines to remember from previous conversation when a chat tab/window is reopened." +msgstr "Сколько Ñтрок из предыдущей беÑеды выводить, когда вкладка/окно открываютÑÑ Ð²Ð½Ð¾Ð²ÑŒ." -#: ../src/common/config.py:181 +#: ../src/common/config.py:180 msgid "How many minutes should last lines from previous conversation last." msgstr "Сколько минут должны оÑтаватьÑÑ Ð¿Ð¾Ñледние Ñтроки из предыдущей беÑеды." +#: ../src/common/config.py:181 +#, fuzzy +msgid "How many lines to request from server when entering a groupchat. -1 means no limit" +msgstr "КоличеÑтво Ñтрок иÑтории Ñообщений, запрашиваемых при входе в комнату. -1 - не ограничено" + #: ../src/common/config.py:182 -msgid "" -"How many lines to request from server when entering a groupchat. -1 means no " -"limit" -msgstr "" -"КоличеÑтво Ñтрок иÑтории Ñообщений, запрашиваемых при входе в комнату. -1 - " -"не ограничено" +msgid "How many minutes back to request logs when a entering a groupchat. -1 means no limit" +msgstr "За какой период (минут назад) запрашивать иÑторию Ñообщений при входе в комнату. -1 - не ограничено" #: ../src/common/config.py:183 -msgid "" -"How many minutes back to request logs when entering a groupchat. -1 means no " -"limit" -msgstr "" -"За какой период (минут назад) запрашивать иÑторию Ñообщений при входе в " -"комнату. -1 - не ограничено" +msgid "How many seconds to wait before trying to autorejoin to a conference you are being disconnected from. Set to 0 to disable autorejoining." +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð² Ñекундах перед попыткой Ñнова автоматичеÑки войти в комнату, от которой вы были отключены. Чтобы отключить автоматичеÑкий вход в Ñтом Ñлучае, уÑтановите значение 0." #: ../src/common/config.py:184 -msgid "" -"How many seconds to wait before trying to autorejoin to a conference you are " -"being disconnected from. Set to 0 to disable autorejoining." +msgid "Should autorejoin be activated when we are being kicked from a conference?" msgstr "" -"Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð² Ñекундах перед попыткой Ñнова автоматичеÑки войти в " -"комнату, от которой вы были отключены. Чтобы отключить автоматичеÑкий вход в " -"Ñтом Ñлучае, уÑтановите значение 0." #: ../src/common/config.py:185 -msgid "" -"Should autorejoin be activated when we are being kicked from a conference?" -msgstr "" +msgid "Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ Client default behaviour)." +msgstr "ОправлÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ctrl+Enter и Enter Ñоздает новую Ñтроку (как в Mirabilis ICQ)" -#: ../src/common/config.py:186 -msgid "" -"Send message on Ctrl+Enter and with Enter make new line (Mirabilis ICQ " -"Client default behaviour)." -msgstr "" -"ОправлÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ctrl+Enter и Enter Ñоздает новую Ñтроку (как в " -"Mirabilis ICQ)" - -#: ../src/common/config.py:188 +#: ../src/common/config.py:187 msgid "How many lines to store for Ctrl+KeyUP." msgstr "Сколько Ñтрок хранить Ð´Ð»Ñ Ctrl+Стрелка вверх" -#: ../src/common/config.py:191 +#: ../src/common/config.py:190 #, python-format -msgid "" -"Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' " -"which means use wiktionary." -msgstr "" -"Введите Ñвою ÑÑылку Ñ %s, в которой %s подменÑет Ñлово/фразу, или " -"«WIKTIONARY», чтобы иÑпользовать ВикиÑловарь." +msgid "Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' which means use wiktionary." +msgstr "Введите Ñвою ÑÑылку Ñ %s, в которой %s подменÑет Ñлово/фразу, или «WIKTIONARY», чтобы иÑпользовать ВикиÑловарь." -#: ../src/common/config.py:194 +#: ../src/common/config.py:193 msgid "If checked, Gajim can be controlled remotely using gajim-remote." -msgstr "" -"ЕÑли отмечено, то Gajim'ом можно будет управлÑÑ‚ÑŒ удаленно Ñ Ð¸Ñпользованием " -"gajim-remote." +msgstr "ЕÑли отмечено, то Gajim'ом можно будет управлÑÑ‚ÑŒ удаленно Ñ Ð¸Ñпользованием gajim-remote." + +#: ../src/common/config.py:194 +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 "ЕÑли активно, тогда «Ñлушать» ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ NetworkManager по D-Bus и изменÑÑ‚ÑŒ ÑÑ‚Ð°Ñ‚ÑƒÑ ÑƒÑ‡ÐµÑ‚Ð½Ñ‹Ñ… запиÑей в завиÑимоÑти от ÑоÑтоÑÐ½Ð¸Ñ Ñетевого ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (необходимо, чтобы учетные запиÑи не имели уÑтановленной в «Ðеактивно» опции listen_to_network_manager и они должны Ñинхронизировать Ñвой ÑÑ‚Ð°Ñ‚ÑƒÑ Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ñ‹Ð¼)" #: ../src/common/config.py:195 -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 "" -"ЕÑли активно, тогда «Ñлушать» ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ NetworkManager по D-Bus и " -"изменÑÑ‚ÑŒ ÑÑ‚Ð°Ñ‚ÑƒÑ ÑƒÑ‡ÐµÑ‚Ð½Ñ‹Ñ… запиÑей в завиÑимоÑти от ÑоÑтоÑÐ½Ð¸Ñ Ñетевого " -"ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (необходимо, чтобы учетные запиÑи не имели уÑтановленной в " -"«Ðеактивно» опции listen_to_network_manager и они должны Ñинхронизировать " -"Ñвой ÑÑ‚Ð°Ñ‚ÑƒÑ Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ñ‹Ð¼)" +msgid "Sent chat state notifications. Can be one of all, composing_only, disabled." +msgstr "ОтÑылать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ ÑоÑтоÑнии беÑеды. Варианты: all (вÑе), composing_only (только печать), disabled (никаких уведомлений)." #: ../src/common/config.py:196 -msgid "" -"Sent chat state notifications. Can be one of all, composing_only, disabled." -msgstr "" -"ОтÑылать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ ÑоÑтоÑнии беÑеды. Варианты: all (вÑе), composing_only " -"(только печать), disabled (никаких уведомлений)." +msgid "Displayed chat state notifications in chat windows. Can be one of all, composing_only, disabled." +msgstr "Отображать ÑоÑтоÑÐ½Ð¸Ñ Ð±ÐµÑеды в окне беÑеды. Варианты: all (вÑе), composing_only (только печать), disabled (никаких уведомлений)." -#: ../src/common/config.py:197 -msgid "" -"Displayed chat state notifications in chat windows. Can be one of all, " -"composing_only, disabled." -msgstr "" -"Отображать ÑоÑтоÑÐ½Ð¸Ñ Ð±ÐµÑеды в окне беÑеды. Варианты: all (вÑе), " -"composing_only (только печать), disabled (никаких уведомлений)." +#: ../src/common/config.py:198 +msgid "When not printing time for every message (print_time==sometimes), print it every x minutes." +msgstr "ЕÑли отключена печать времени Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑообщениÑ, то печатать его каждые X минут." #: ../src/common/config.py:199 -msgid "" -"When not printing time for every message (print_time==sometimes), print it " -"every x minutes." -msgstr "" -"ЕÑли отключена печать времени Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑообщениÑ, то печатать его каждые " -"X минут." - -#: ../src/common/config.py:200 msgid "Ask before closing a group chat tab/window." msgstr "Спрашивать перед закрытием окна/вкладки комнаты." +#: ../src/common/config.py:200 +msgid "Always ask before closing group chat tab/window in this space separated list of group chat jids." +msgstr "Ð’Ñегда Ñпрашивать перед закрытием окна/вкладки комнаты из Ñтого ÑпиÑка. Комнаты в ÑпиÑке разделÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð¼." + #: ../src/common/config.py:201 -msgid "" -"Always ask before closing group chat tab/window in this space separated list " -"of group chat JIDs." -msgstr "" -"Ð’Ñегда Ñпрашивать перед закрытием окна/вкладки комнаты из Ñтого ÑпиÑка. " -"Комнаты в ÑпиÑке разделÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð¼." +msgid "Never ask before closing group chat tab/window in this space separated list of group chat jids." +msgstr "Ðикогда не Ñпрашивать перед закрытием окна/вкладки комнаты из Ñтого ÑпиÑка. Комнаты в ÑпиÑке разделÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð¼." #: ../src/common/config.py:202 -msgid "" -"Never ask before closing group chat tab/window in this space separated list " -"of group chat JIDs." -msgstr "" -"Ðикогда не Ñпрашивать перед закрытием окна/вкладки комнаты из Ñтого ÑпиÑка. " -"Комнаты в ÑпиÑке разделÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð¼." +msgid "Ask before closing tabbed chat window if there are control that can loose data (chat, private chat, groupchat that will not be minimized)" +msgstr "Спрашивать перед закрытием окна разговора Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°Ð¼Ð¸, еÑли ÑущеÑтвует Ñлемент, который может потерÑÑ‚ÑŒ данные (разговор, личный разговор, разговор в комнате, которые не будут Ñвёрнуты)" -#: ../src/common/config.py:203 -msgid "" -"Ask before closing tabbed chat window if there are controls that can lose " -"data (chat, private chat, groupchat that will not be minimized)" -msgstr "" -"Спрашивать перед закрытием окна разговора Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°Ð¼Ð¸, еÑли ÑущеÑтвует " -"Ñлемент, который может потерÑÑ‚ÑŒ данные (разговор, личный разговор, разговор " -"в комнате, которые не будут Ñвёрнуты)" - -#: ../src/common/config.py:206 -msgid "" -"Comma separated list of hosts that we send, in addition of local interfaces, " -"for File Transfer in case of address translation/port forwarding." -msgstr "" -"Разделенный запÑтыми ÑпиÑок хоÑтов, который мы отÑылаем в дополнение к " -"локальным интерфейÑам при передаче файлов в Ñлучае, еÑли мы за NAT или " -"иÑпользуетÑÑ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ портов." +#: ../src/common/config.py:205 +msgid "Comma separated list of hosts that we send, in addition of local interfaces, for File Transfer in case of address translation/port forwarding." +msgstr "Разделенный запÑтыми ÑпиÑок хоÑтов, который мы отÑылаем в дополнение к локальным интерфейÑам при передаче файлов в Ñлучае, еÑли мы за NAT или иÑпользуетÑÑ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ портов." -#: ../src/common/config.py:208 +#: ../src/common/config.py:207 msgid "IEC standard says KiB = 1024 bytes, KB = 1000 bytes." msgstr "IEC Ñтандарт утверждает, что KiB = 1024 байт, KB = 1000 байт" -#: ../src/common/config.py:210 +#: ../src/common/config.py:209 msgid "Notify of events in the notification area." msgstr "УведомлÑÑ‚ÑŒ о ÑобытиÑÑ… в облаÑти уведомлений." -#: ../src/common/config.py:211 -msgid "" -"If False, Gajim will display a static event icon instead of the blinking " -"status icon in the notification area when notifying on event." +#: ../src/common/config.py:210 +msgid "If False, Gajim will display a static event icon instead of the blinking status icon in the notification area when notifying on event." msgstr "" -#: ../src/common/config.py:217 +#: ../src/common/config.py:216 msgid "Show tab when only one conversation?" msgstr "Показывать вкладку при одном чат-окне?" -#: ../src/common/config.py:218 +#: ../src/common/config.py:217 msgid "Show tabbed notebook border in chat windows?" msgstr "Показывать границу вкладки в окне чата?" -#: ../src/common/config.py:219 +#: ../src/common/config.py:218 msgid "Show close button in tab?" msgstr "Показывать кнопку Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½Ð° вкладке?" -#: ../src/common/config.py:220 -msgid "" -"A list of modp groups to use in a Diffie-Hellman, highest preference first, " -"separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher " -"numbers are more secure, but take longer to calculate when you start a " -"session." -msgstr "" -"СпиÑок modp групп (через запÑтую) Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² алгоритме Диффи-" -"Хеллмана, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ предпочтительной. ДопуÑтимые группы: 1, 2, 5, " -"14, 15, 16, 17 и 18. Более выÑокие чиÑла безопаÑнее, но требуют более " -"длительных вычиÑлений при начале ÑеанÑа." +#: ../src/common/config.py:219 +msgid "A list of modp groups to use in a Diffie-Hellman, highest preference first, separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher numbers are more secure, but take longer to calculate when you start a session." +msgstr "СпиÑок modp групп (через запÑтую) Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² алгоритме Диффи-Хеллмана, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ предпочтительной. ДопуÑтимые группы: 1, 2, 5, 14, 15, 16, 17 и 18. Более выÑокие чиÑла безопаÑнее, но требуют более длительных вычиÑлений при начале ÑеанÑа." -#: ../src/common/config.py:241 +#: ../src/common/config.py:240 msgid "Preview new messages in notification popup?" msgstr "ПредпроÑмотр новых Ñообщений во вÑплывающем окне?" +#: ../src/common/config.py:245 +msgid "A semicolon-separated list of words that will be highlighted in group chats." +msgstr "СпиÑок Ñлов (через точку Ñ Ð·Ð°Ð¿Ñтой), которые будут подÑвечиватьÑÑ Ð² комнатах." + #: ../src/common/config.py:246 -msgid "" -"A semicolon-separated list of words that will be highlighted in group chats." -msgstr "" -"СпиÑок Ñлов (через точку Ñ Ð·Ð°Ð¿Ñтой), которые будут подÑвечиватьÑÑ Ð² комнатах." +msgid "If True, quits Gajim when X button of Window Manager is clicked. This setting is taken into account only if notification icon is used." +msgstr "ЕÑли активно, то Gajim будет завершатьÑÑ Ð¿Ñ€Ð¸ нажатии на кнопку Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¾ÐºÐ½Ð°. Ðта Ð¾Ð¿Ñ†Ð¸Ñ ÑƒÑ‡Ð¸Ñ‚Ñ‹Ð²Ð°ÐµÑ‚ÑÑ, только еÑли иÑпользуетÑÑ Ð¸ÐºÐ¾Ð½ÐºÐ° в облаÑти уведомлений." #: ../src/common/config.py:247 -msgid "" -"If True, quits Gajim when X button of Window Manager is clicked. This " -"setting is taken into account only if notification icon is used." -msgstr "" -"ЕÑли активно, то Gajim будет завершатьÑÑ Ð¿Ñ€Ð¸ нажатии на кнопку Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ " -"окна. Ðта Ð¾Ð¿Ñ†Ð¸Ñ ÑƒÑ‡Ð¸Ñ‚Ñ‹Ð²Ð°ÐµÑ‚ÑÑ, только еÑли иÑпользуетÑÑ Ð¸ÐºÐ¾Ð½ÐºÐ° в облаÑти " -"уведомлений." +msgid "If True, Gajim will check if it's the default jabber client on each startup." +msgstr "ЕÑли активно, то Gajim будет проверÑÑ‚ÑŒ при запуÑке, ÑвлÑетÑÑ Ð»Ð¸ он jabber-клиентом по умолчанию." #: ../src/common/config.py:248 -msgid "" -"If True, Gajim will check if it's the default jabber client on each startup." -msgstr "" -"ЕÑли активно, то Gajim будет проверÑÑ‚ÑŒ при запуÑке, ÑвлÑетÑÑ Ð»Ð¸ он jabber-" -"клиентом по умолчанию." +msgid "If True, Gajim will display an icon on each tab containing unread messages. Depending on the theme, this icon may be animated." +msgstr "ЕÑли активно, то Gajim отображает иконку на каждой вкладке, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñодержит непрочитанные ÑообщениÑ. Ð’ завиÑимоÑти от темы, она может быть анимированной." #: ../src/common/config.py:249 -msgid "" -"If True, Gajim will display an icon on each tab containing unread messages. " -"Depending on the theme, this icon may be animated." -msgstr "" -"ЕÑли активно, то Gajim отображает иконку на каждой вкладке, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñодержит " -"непрочитанные ÑообщениÑ. Ð’ завиÑимоÑти от темы, она может быть анимированной." +msgid "If True, Gajim will display the status message, if not empty, for every contact under the contact name in roster window." +msgstr "ЕÑли активно то Gajim будет отображать Ñообщение о ÑтатуÑе, еÑли оно не пуÑтое, Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ контакта под именем контакта в окне роÑтера" -#: ../src/common/config.py:250 -msgid "" -"If True, Gajim will display the status message, if not empty, for every " -"contact under the contact name in roster window." -msgstr "" -"ЕÑли активно то Gajim будет отображать Ñообщение о ÑтатуÑе, еÑли оно не " -"пуÑтое, Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ контакта под именем контакта в окне роÑтера" - -#: ../src/common/config.py:256 +#: ../src/common/config.py:255 msgid "Define the position of the avatar in roster. Can be left or right" msgstr "ОпределÑет позицию аватар в роÑтере. Может быть left или right" +#: ../src/common/config.py:256 +msgid "If True, Gajim will ask for avatar each contact that did not have an avatar last time or has one cached that is too old." +msgstr "ЕÑли активно, то Gajim будет запрашивать аватару Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ контакта, у которого её не было в поÑледний раз или она уже Ñлишком ÑтараÑ." + #: ../src/common/config.py:257 -msgid "" -"If True, Gajim will ask for avatar each contact that did not have an avatar " -"last time or has one cached that is too old." -msgstr "" -"ЕÑли активно, то Gajim будет запрашивать аватару Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ контакта, у " -"которого её не было в поÑледний раз или она уже Ñлишком ÑтараÑ." +msgid "If False, Gajim will no longer print status line in chats when a contact changes his or her status and/or his or her status message." +msgstr "ЕÑли неактивно, то Gajim больше не будет показывать Ñтроку ÑтатуÑа в окне беÑеды, когда контакт менÑет его или её ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¸/или Ñообщение о ÑтатуÑе." #: ../src/common/config.py:258 -msgid "" -"If False, Gajim will no longer print status line in chats when a contact " -"changes his or her status and/or his or her status message." -msgstr "" -"ЕÑли неактивно, то Gajim больше не будет показывать Ñтроку ÑтатуÑа в окне " -"беÑеды, когда контакт менÑет его или её ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¸/или Ñообщение о ÑтатуÑе." +msgid "can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no longer print status line in groupchats when a member changes his or her status and/or his or her status message. If \"all\" Gajim will print all status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves group chat." +msgstr "может быть «none», «all» или «in_and_out». ЕÑли уÑтановлено «none», то Gajim больше не будет выводить ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑтатуÑе в комнатах, когда учаÑтник менÑет Ñвой ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¸Ð»Ð¸ Ñообщение о ÑтатуÑе. ЕÑли уÑтановлено в «all», то Gajim будет выводить вÑе ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑтатуÑе. ЕÑли уÑтановлено в «in_and_out», то Gajim будет выводить Ñообщение только когда кто-то входит или выходит из комнаты." -#: ../src/common/config.py:259 -msgid "" -"Can be \"none\", \"all\" or \"in_and_out\". If \"none\", Gajim will no " -"longer print status line in groupchats when a member changes his or her " -"status and/or his or her status message. If \"all\" Gajim will print all " -"status messages. If \"in_and_out\", Gajim will only print FOO enters/leaves " -"group chat." -msgstr "" -"может быть «none», «all» или «in_and_out». ЕÑли уÑтановлено «none», то Gajim " -"больше не будет выводить ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑтатуÑе в комнатах, когда учаÑтник " -"менÑет Ñвой ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¸Ð»Ð¸ Ñообщение о ÑтатуÑе. ЕÑли уÑтановлено в «all», то " -"Gajim будет выводить вÑе ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑтатуÑе. ЕÑли уÑтановлено в " -"«in_and_out», то Gajim будет выводить Ñообщение только когда кто-то входит " -"или выходит из комнаты." - -#: ../src/common/config.py:261 +#: ../src/common/config.py:260 msgid "Log XHTML messages instead of plain text messages." msgstr "СохранÑÑ‚ÑŒ XHTML ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð²Ð¼ÐµÑто проÑÑ‚Ñ‹Ñ… текÑтовых Ñообщений" -#: ../src/common/config.py:262 +#: ../src/common/config.py:261 msgid "Background color of contacts when they just signed in." msgstr "Фоновый цвет контакта, который только что вошел." -#: ../src/common/config.py:263 +#: ../src/common/config.py:262 msgid "Background color of contacts when they just signed out." msgstr "Фоновый цвет контакта, который только что вышел." -#: ../src/common/config.py:265 -msgid "" -"If True, restored messages will use a smaller font than the default one." +#: ../src/common/config.py:264 +msgid "If True, restored messages will use a smaller font than the default one." msgstr "ЕÑли активно, то воÑÑтановленные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ иметь меньший шрифт." -#: ../src/common/config.py:266 +#: ../src/common/config.py:265 msgid "Don't show avatar for the transport itself." msgstr "Ðе показывать аватар Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñпорта." -#: ../src/common/config.py:267 +#: ../src/common/config.py:266 msgid "Don't show roster in the system taskbar." msgstr "Ðе показывать роÑтер в панели задач." -#: ../src/common/config.py:268 -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 "" -"ЕÑли активно и уÑтановлены GTK+ и PyGTK верÑий 2.8 и выше, то окно будет " -"мигать (поведение по умолчанию Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð½Ñтва менеджеров окон) когда " -"приÑутÑтвуют не проÑмотренные ÑобытиÑ." +#: ../src/common/config.py:267 +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 "ЕÑли активно и уÑтановлены GTK+ и PyGTK верÑий 2.8 и выше, то окно будет мигать (поведение по умолчанию Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð½Ñтва менеджеров окон) когда приÑутÑтвуют не проÑмотренные ÑобытиÑ." -#: ../src/common/config.py:270 -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 не понимает sha данные при входе в комнату, защищенную паролем. " -"УÑтановите Ñту опцию в «Ðеактивно» Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы запретить отÑылку sha " -"данных в информации Ð´Ð»Ñ ÐºÐ¾Ð¼Ð½Ð°Ñ‚" +#: ../src/common/config.py:269 +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 не понимает sha данные при входе в комнату, защищенную паролем. УÑтановите Ñту опцию в «Ðеактивно» Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы запретить отÑылку sha данных в информации Ð´Ð»Ñ ÐºÐ¾Ð¼Ð½Ð°Ñ‚" #. always, never, peracct, pertype should not be translated -#: ../src/common/config.py:273 +#: ../src/common/config.py:272 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" +"'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) is sent to a " -"specific window." +"'pertype' - Each message type (e.g., chats vs. groupchats) are sent to a specific window." msgstr "" "УправлÑет окном, где помещаютÑÑ Ð½Ð¾Ð²Ñ‹Ðµ ÑообщениÑ.\n" "«always» — Ð’Ñе ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÑÑŽÑ‚ÑÑ Ð² одно окно.\n" "«always_with_roster» — Как «always», но ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² одном окне Ñ Ñ€Ð¾Ñтером.\n" "«never» — Ð’Ñе ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ñ…Ð¾Ð´ÑÑ‚ в Ñвои отдельные окна.\n" "«peracct» — Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ учетной запиÑи отÑылаютÑÑ Ð² Ñвои окна.\n" -"«pertype» — Каждый тип ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ (например, беÑеда или комната) отÑылаетÑÑ Ð² " -"Ñвое окно. Заметьте, что при изменении Ñтого параметра требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк " -"Gajim, чтобы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñтупили в Ñилу." +"«pertype» — Каждый тип ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ (например, беÑеда или комната) отÑылаетÑÑ Ð² Ñвое окно. Заметьте, что при изменении Ñтого параметра требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк Gajim, чтобы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñтупили в Ñилу." -#: ../src/common/config.py:274 +#: ../src/common/config.py:273 msgid "" "Show roster on startup.\n" "'always' - Always show roster.\n" @@ -4323,793 +4155,618 @@ msgstr "" "'never' - Ðикогда не показывать роÑтер.\n" "'last_state' - ВоÑÑтанавливать поÑледнее ÑоÑтоÑние роÑтера." -#: ../src/common/config.py:275 +#: ../src/common/config.py:274 msgid "If False, you will no longer see the avatar in the chat window." msgstr "ЕÑли неактивно, вы больше не будете видеть аватары в окне беÑеды." -#: ../src/common/config.py:276 +#: ../src/common/config.py:275 msgid "If True, pressing the escape key closes a tab/window." msgstr "ЕÑли активно, то нажатие клавиши Escape будет закрывать вкладку/окно." -#: ../src/common/config.py:277 +#: ../src/common/config.py:276 msgid "Hides the buttons in chat windows." msgstr "Скрывает кнопки в окнах чата." -#: ../src/common/config.py:278 +#: ../src/common/config.py:277 msgid "Hides the banner in a group chat window" msgstr "Скрывает баннер в окне комнаты" -#: ../src/common/config.py:279 +#: ../src/common/config.py:278 msgid "Hides the banner in two persons chat window" msgstr "Скрывает баннер в окне чата" -#: ../src/common/config.py:280 +#: ../src/common/config.py:279 msgid "Hides the group chat occupants list in group chat window." msgstr "Скрывает ÑпиÑок поÑетителей в окне комнаты." -#: ../src/common/config.py:281 -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 "" -"Показывать ник в начале Ñтроки в чате только еÑли предыдущее Ñообщение было " -"напиÑано другим учаÑтником." +#: ../src/common/config.py:280 +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 "Показывать ник в начале Ñтроки в чате только еÑли предыдущее Ñообщение было напиÑано другим учаÑтником." -#: ../src/common/config.py:282 +#: ../src/common/config.py:281 msgid "Indentation when using merge consecutive nickname." -msgstr "" -"Разделитель, иÑпользуемый при активированной наÑтройке " -"chat_merge_consecutive_nickname." +msgstr "Разделитель, иÑпользуемый при активированной наÑтройке chat_merge_consecutive_nickname." -#: ../src/common/config.py:283 +#: ../src/common/config.py:282 msgid "Smooth scroll message in conversation window" msgstr "Плавно прокручивать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² окне чата" +#: ../src/common/config.py:283 +msgid "List of colors, separated by \":\", that will be used to color nicknames in group chats." +msgstr "СпиÑок цветов, разделенных «:», которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ñ€Ð°ÑкраÑки ников в комнатах." + #: ../src/common/config.py:284 -msgid "" -"List of colors, separated by \":\", that will be used to color nicknames in " -"group chats." -msgstr "" -"СпиÑок цветов, разделенных «:», которые будут иÑпользоватьÑÑ Ð´Ð»Ñ Ñ€Ð°ÑкраÑки " -"ников в комнатах." +msgid "Ctrl-Tab go to next composing tab when none is unread." +msgstr "ИÑпользовать Ctrl-Tab, чтобы перейти к Ñледующей вкладке Ñ ÑоÑтавлÑемым Ñообщением, когда нет непрочитанных Ñообщений." #: ../src/common/config.py:285 -msgid "Ctrl-Tab go to next composing tab when none is unread." -msgstr "" -"ИÑпользовать Ctrl-Tab, чтобы перейти к Ñледующей вкладке Ñ ÑоÑтавлÑемым " -"Ñообщением, когда нет непрочитанных Ñообщений." +msgid "Should we show the confirm metacontacts creation dialog or not? Empty string means we never show the dialog." +msgstr "Следует ли показывать диалог Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¾ Ñоздании метаконтакта? ПуÑÑ‚Ð°Ñ Ñтрока означает, что Ñообщение не будет показыватьÑÑ Ð²Ð¾Ð¾Ð±Ñ‰Ðµ." #: ../src/common/config.py:286 -msgid "" -"Should we show the confirm metacontacts creation dialog or not? Empty string " -"means we never show the dialog." -msgstr "" -"Следует ли показывать диалог Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¾ Ñоздании метаконтакта? ПуÑÑ‚Ð°Ñ " -"Ñтрока означает, что Ñообщение не будет показыватьÑÑ Ð²Ð¾Ð¾Ð±Ñ‰Ðµ." +msgid "Should we show the confirm block contact dialog or not? Empty string means we never show the dialog." +msgstr "Следует ли показывать диалог Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ контакта? ПуÑÑ‚Ð°Ñ Ñтрока означает, что Ñообщение не будет показыватьÑÑ Ð²Ð¾Ð¾Ð±Ñ‰Ðµ." #: ../src/common/config.py:287 -msgid "" -"Should we show the confirm block contact dialog or not? Empty string means " -"we never show the dialog." -msgstr "" -"Следует ли показывать диалог Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ контакта? ПуÑÑ‚Ð°Ñ " -"Ñтрока означает, что Ñообщение не будет показыватьÑÑ Ð²Ð¾Ð¾Ð±Ñ‰Ðµ." +msgid "Should we show the confirm custom status dialog or not? Empty string means we never show the dialog." +msgstr "Следует ли показывать диалог Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ контакта? ПуÑÑ‚Ð°Ñ Ñтрока означает, что Ñообщение не будет показыватьÑÑ Ð²Ð¾Ð¾Ð±Ñ‰Ðµ." #: ../src/common/config.py:288 -msgid "" -"Should we show the confirm custom status dialog or not? Empty string means " -"we never show the dialog." -msgstr "" -"Следует ли показывать диалог Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ контакта? ПуÑÑ‚Ð°Ñ " -"Ñтрока означает, что Ñообщение не будет показыватьÑÑ Ð²Ð¾Ð¾Ð±Ñ‰Ðµ." +msgid "If True, you will be able to set a negative priority to your account in account modification window. BE CAREFUL, when you are logged in with a negative priority, you will NOT receive any message from your server." +msgstr "ЕÑли активно, то у Ð²Ð°Ñ Ð¿Ð¾ÑвитÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑ‚ÑŒ назначить Ð´Ð»Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи приоритет меньше Ð½ÑƒÐ»Ñ Ð² окне наÑтройки учетной запиÑи. БУДЬТЕ ОСТОРОЖÐЫ, еÑли вы подключитеÑÑŒ Ñ Ð¾Ñ‚Ñ€Ð¸Ñ†Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ приоритетом, то вы ÐЕ получите никаких Ñообщений от Ñервера." #: ../src/common/config.py:289 -msgid "" -"If True, you will be able to set a negative priority to your account in " -"account modification window. BE CAREFUL, when you are logged in with a " -"negative priority, you will NOT receive any message from your server." -msgstr "" -"ЕÑли активно, то у Ð²Ð°Ñ Ð¿Ð¾ÑвитÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑ‚ÑŒ назначить Ð´Ð»Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи " -"приоритет меньше Ð½ÑƒÐ»Ñ Ð² окне наÑтройки учетной запиÑи. БУДЬТЕ ОСТОРОЖÐЫ, " -"еÑли вы подключитеÑÑŒ Ñ Ð¾Ñ‚Ñ€Ð¸Ñ†Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ приоритетом, то вы ÐЕ получите никаких " -"Ñообщений от Ñервера." +msgid "If True, Gajim will use Gnome Keyring (if available) to store account passwords." +msgstr "ЕÑли активно, Gajim будет иÑпользовать (еÑли возможно) Gnome Keyring Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¹ учетных запиÑей." #: ../src/common/config.py:290 -msgid "" -"If True, Gajim will use Gnome Keyring (if available) to store account " -"passwords." -msgstr "" -"ЕÑли активно, Gajim будет иÑпользовать (еÑли возможно) Gnome Keyring Ð´Ð»Ñ " -"Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¹ учетных запиÑей." +msgid "If True, Gajim will use KDE Wallet (if kwalletcli is available) to store account passwords." +msgstr "ЕÑли активно, Gajim будет иÑпользовать (еÑли возможно) KDE Wallet Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¹ учетных запиÑей." #: ../src/common/config.py:291 -msgid "" -"If True, Gajim will use KDE Wallet (if kwalletcli is available) to store " -"account passwords." -msgstr "" -"ЕÑли активно, Gajim будет иÑпользовать (еÑли возможно) KDE Wallet Ð´Ð»Ñ " -"Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¹ учетных запиÑей." +msgid "If True, Gajim will show number of online and total contacts in account and group rows." +msgstr "ЕÑли активно, Gajim будет показывать количеÑтво контактов онлайн/вÑего в Ñтроках Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼ учетной запиÑи и групп." #: ../src/common/config.py:292 -msgid "" -"If True, Gajim will show number of online and total contacts in account and " -"group rows." -msgstr "" -"ЕÑли активно, Gajim будет показывать количеÑтво контактов онлайн/вÑего в " -"Ñтроках Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼ учетной запиÑи и групп." +msgid "Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages as if they were of this type" +msgstr "Может быть пуÑто, 'chat' или 'normal'. ЕÑли не пуÑто — обрабатывать вÑе входÑщие ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‚Ð°Ðº, как будто бы они были Ñтого типа." #: ../src/common/config.py:293 -msgid "" -"Can be empty, 'chat' or 'normal'. If not empty, treat all incoming messages " -"as if they were of this type" -msgstr "" -"Может быть пуÑто, 'chat' или 'normal'. ЕÑли не пуÑто — обрабатывать вÑе " -"входÑщие ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‚Ð°Ðº, как будто бы они были Ñтого типа." +msgid "If True, Gajim will scroll and select the contact who sent you the last message, if chat window is not already opened." +msgstr "ЕÑли активно, Gajim прокрутит роÑтер и выделит контакт, который напиÑал вам Ñообщение поÑледним, еÑли окно чата еще небыло открыто." #: ../src/common/config.py:294 -msgid "" -"If True, Gajim will scroll and select the contact who sent you the last " -"message, if chat window is not already opened." -msgstr "" -"ЕÑли активно, Gajim прокрутит роÑтер и выделит контакт, который напиÑал вам " -"Ñообщение поÑледним, еÑли окно чата еще небыло открыто." - -#: ../src/common/config.py:295 msgid "Time of inactivity needed before the change status window closes down." msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð½Ðµ активноÑти прежде чем окно Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑтатуÑа закроетÑÑ." -#: ../src/common/config.py:296 -msgid "" -"Maximum number of lines that are printed in conversations. Oldest lines are " -"cleared." +#: ../src/common/config.py:295 +msgid "Maximum number of lines that are printed in conversations. Oldest lines are cleared." msgstr "МакÑимальное количеÑтво Ñтрок в окне. Старые Ñтроки будут удалены." -#: ../src/common/config.py:297 -msgid "" -"If True, notification windows from notification-daemon will be attached to " -"notification icon." -msgstr "" -"ЕÑли активно, окно ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ notification-daemon будет прикреплено к " -"облаÑти уведомлений." +#: ../src/common/config.py:296 +msgid "If True, notification windows from notification-daemon will be attached to notification icon." +msgstr "ЕÑли активно, окно ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ notification-daemon будет прикреплено к облаÑти уведомлений." -#: ../src/common/config.py:298 +#: ../src/common/config.py:297 msgid "Choose interval between 2 checks of idleness." msgstr "Выберите интервал между 2 проверками на бездейÑтвие." +#: ../src/common/config.py:298 +msgid "Valid uri schemes. Only schemes in this list will be accepted as \"real\" uri. (mailto and xmpp are handled separately)" +msgstr "ДопуÑтимые uri Ñхемы. Только Ñхемы из Ñтого ÑпиÑка будут принÑÑ‚Ñ‹ как «real» uri.(mailto и xmpp обрабатываютÑÑ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾)" + #: ../src/common/config.py:299 -msgid "" -"Valid uri schemes. Only schemes in this list will be accepted as \"real\" " -"uri. (mailto and xmpp are handled separately)" -msgstr "" -"ДопуÑтимые uri Ñхемы. Только Ñхемы из Ñтого ÑпиÑка будут принÑÑ‚Ñ‹ как «real» " -"uri.(mailto и xmpp обрабатываютÑÑ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾)" +msgid "Ask offline status message to all offline contacts when connection to an accoutn is established. WARNING: This causes a lot of requests to be sent!" +msgstr "Запрашивать Ñообщение о ÑтатуÑе «отключен» у вÑех отключенных контактов при уÑтановлении ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑью. Ð’ÐИМÐÐИЕ: Ð”Ð°Ð½Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ð²Ð¾Ð´Ð¸Ñ‚ к большому количеÑтву поÑылаемых запроÑов!" #: ../src/common/config.py:300 -msgid "" -"Ask offline status message to all offline contacts when connection to an " -"account is established. WARNING: This causes a lot of requests to be sent!" -msgstr "" -"Запрашивать Ñообщение о ÑтатуÑе «отключен» у вÑех отключенных контактов при " -"уÑтановлении ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑью. Ð’ÐИМÐÐИЕ: Ð”Ð°Ð½Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ð²Ð¾Ð´Ð¸Ñ‚ к " -"большому количеÑтву поÑылаемых запроÑов!" - -#: ../src/common/config.py:301 msgid "If True, completion in groupchats will be like a shell auto-completion" -msgstr "" -"ЕÑли Ðктивно, автодополнение ников в конференциÑÑ… будет работать как " -"автодополнение в командной оболочке" +msgstr "ЕÑли Ðктивно, автодополнение ников в конференциÑÑ… будет работать как автодополнение в командной оболочке" -#: ../src/common/config.py:302 -msgid "" -"When is self contact row displayed. Can be \"always\", \"when_other_resource" -"\" or \"never\"" -msgstr "" -"Ð’ каких ÑлучаÑÑ… показывать ÑпиÑок Ñвоих ÑобÑтвенных контактов. Может " -"принимать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Â«always» (вÑегда), «when_other_resource» (еÑли другой " -"реÑурÑ) и «never» (никогда)." +#: ../src/common/config.py:301 +msgid "When is self contact row displayed. Can be \"always\", \"when_other_resource\" or \"never\"" +msgstr "Ð’ каких ÑлучаÑÑ… показывать ÑпиÑок Ñвоих ÑобÑтвенных контактов. Может принимать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Â«always» (вÑегда), «when_other_resource» (еÑли другой реÑурÑ) и «never» (никогда)." -#: ../src/common/config.py:307 +#: ../src/common/config.py:306 msgid "Optionally fix jingle output video framerate. Example: 10/1 or 25/2" -msgstr "" -"Опциональное изменение чаÑтоты кадров видео в jingle. Ðапример: 10/1 или 25/2" +msgstr "Опциональное изменение чаÑтоты кадров видео в jingle. Ðапример: 10/1 или 25/2" -#: ../src/common/config.py:308 +#: ../src/common/config.py:307 msgid "Optionally resize jingle output video. Example: 320x240" msgstr "Опциональное изменение размера кадра видео в jingle. Ðапример: 320x240" -#: ../src/common/config.py:309 -msgid "If True, You will also see your webcam" -msgstr "" +#: ../src/common/config.py:310 +msgid "If True, Gajim will try to use a STUN server when using jingle. The one in \"stun_server\" option, or the one given by the jabber server." +msgstr "ЕÑли включено, Gajim попробует иÑпользовать STUN Ñервер Ñ jingle. Либо указанный опцией \"stun_server\", либо предоÑтавленный jabber Ñервером." + +#: ../src/common/config.py:311 +msgid "STUN server to use when using jingle" +msgstr "Сервер STUN Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ jingle" #: ../src/common/config.py:312 -msgid "" -"If True, Gajim will try to use a STUN server when using jingle. The one in " -"\"stun_server\" option, or the one given by the jabber server." -msgstr "" -"ЕÑли включено, Gajim попробует иÑпользовать STUN Ñервер Ñ jingle. Либо " -"указанный опцией \"stun_server\", либо предоÑтавленный jabber Ñервером." +msgid "If True, Gajim will show affiliation of groupchat occupants by adding a colored square to the status icon" +msgstr "ЕÑли включено, Gajim покажет принадлежноÑÑ‚ÑŒ пользователей группового чата, добавив цветные квадраты к значку ÑтатуÑа" #: ../src/common/config.py:313 -msgid "STUN server to use when using jingle" -msgstr "Сервер STUN Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ jingle" +msgid "Proxy used for all outgoing connections if the account does not have a specific proxy configured" +msgstr "ПрокÑи иÑпользуетÑÑ Ð´Ð»Ñ Ð²Ñех иÑходÑщих Ñоединений, еÑли в наÑтройках учетной запиÑи не задан прокÑи " #: ../src/common/config.py:314 -msgid "" -"If True, Gajim will show affiliation of groupchat occupants by adding a " -"colored square to the status icon" +msgid "If True, Gajim will ignore incoming attention requestd (\"wizz\")." msgstr "" -"ЕÑли включено, Gajim покажет принадлежноÑÑ‚ÑŒ пользователей группового чата, " -"добавив цветные квадраты к значку ÑтатуÑа" #: ../src/common/config.py:315 -msgid "" -"Proxy used for all outgoing connections if the account does not have a " -"specific proxy configured" +msgid "If enabled, Gajim will reopen chat windows that were opened last time Gajim was closed." msgstr "" -"ПрокÑи иÑпользуетÑÑ Ð´Ð»Ñ Ð²Ñех иÑходÑщих Ñоединений, еÑли в наÑтройках учетной " -"запиÑи не задан прокÑи " -#: ../src/common/config.py:316 -msgid "If True, Gajim will ignore incoming attention requestd (\"wizz\")." -msgstr "" +#: ../src/common/config.py:329 +msgid "Priority will change automatically according to your status. Priorities are defined in autopriority_* options." +msgstr "Приоритет будет изменÑÑ‚ÑŒÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки ÑоглаÑно вашему ÑтатуÑу. Приоритеты Ð´Ð»Ñ ÑтатуÑов задаютÑÑ Ð² пункте autopriority_* ." -#: ../src/common/config.py:317 -msgid "" -"If enabled, Gajim will reopen chat windows that were opened last time Gajim " -"was closed." -msgstr "" +#: ../src/common/config.py:337 +msgid "Status used to autoconnect as. Can be online, chat, away, xa, dnd, invisible. NOTE: this option is used only if restore_last_status is disabled" +msgstr "СтатуÑ, иÑпользуемый при автоподключении. Варианты: отключен, в Ñети, готов поболтать, отошел, недоÑтупен, не беÑпокоить, невидимка" -#: ../src/common/config.py:318 -#, fuzzy -msgid "" -"If enabled, Gajim will show an icon to show that sent message has been " -"received by your contact" -msgstr "" -"ЕÑли включено, Gajim не будет запрашивать Ñообщение о ÑтатуÑе. ВмеÑто него " -"будет иÑпользовано ÑоответÑтвующее Ñообщение по умолчанию." - -#: ../src/common/config.py:332 -msgid "" -"Priority will change automatically according to your status. Priorities are " -"defined in autopriority_* options." -msgstr "" -"Приоритет будет изменÑÑ‚ÑŒÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки ÑоглаÑно вашему ÑтатуÑу. Приоритеты " -"Ð´Ð»Ñ ÑтатуÑов задаютÑÑ Ð² пункте autopriority_* ." +#: ../src/common/config.py:338 +msgid "If enabled, restore the last status that was used." +msgstr "ЕÑли включено, воÑÑтанавливать поÑледний иÑпользованный ÑтатуÑ." #: ../src/common/config.py:340 -msgid "" -"Status used to autoconnect as. Can be online, chat, away, xa, dnd, " -"invisible. NOTE: this option is used only if restore_last_status is disabled" -msgstr "" -"СтатуÑ, иÑпользуемый при автоподключении. Варианты: отключен, в Ñети, готов " -"поболтать, отошел, недоÑтупен, не беÑпокоить, невидимка" +msgid "If True, Contacts requesting authorization will be automatically accepted." +msgstr "ЕÑли активно, контакты, запрашивающие авторизацию, будут автоматичеÑки её получать." #: ../src/common/config.py:341 -msgid "If enabled, restore the last status that was used." -msgstr "ЕÑли включено, воÑÑтанавливать поÑледний иÑпользованный ÑтатуÑ." - -#: ../src/common/config.py:343 -msgid "" -"If True, Contacts requesting authorization will be automatically accepted." -msgstr "" -"ЕÑли активно, контакты, запрашивающие авторизацию, будут автоматичеÑки её " -"получать." +msgid "If False, this account will be disabled and will not appear in roster window." +msgstr "ЕÑли неактивно, Ñта ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ будет отключена и не будет отображатьÑÑ Ð² окне роÑтера." #: ../src/common/config.py:344 -msgid "" -"If False, this account will be disabled and will not appear in roster window." -msgstr "" -"ЕÑли неактивно, Ñта ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ будет отключена и не будет отображатьÑÑ Ð² " -"окне роÑтера." +msgid "If disabled, don't sign presences with GPG key, even if GPG is configured." +msgstr "ЕÑли отключено, не подпиÑывать приÑутÑтвие ключом GPG, даже еÑли GPG наÑтроен." -#: ../src/common/config.py:347 -msgid "" -"If disabled, don't sign presences with GPG key, even if GPG is configured." -msgstr "" -"ЕÑли отключено, не подпиÑывать приÑутÑтвие ключом GPG, даже еÑли GPG " -"наÑтроен." - -#: ../src/common/config.py:349 +#: ../src/common/config.py:346 msgid "Enable ESessions encryption for this account." msgstr "Включить ESessions шифрование Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ учетной запиÑи." -#: ../src/common/config.py:350 +#: ../src/common/config.py:347 msgid "Should Gajim automatically start an encrypted session when possible?" -msgstr "" -"Должен ли Gajim по возможноÑти автоматичеÑки начинать зашифрованный ÑеанÑ?" +msgstr "Должен ли Gajim по возможноÑти автоматичеÑки начинать зашифрованный ÑеанÑ?" -#: ../src/common/config.py:351 -msgid "" -"Ordered list (space separated) of connection type to try. Can contain tls, " -"ssl or plain" -msgstr "" -"УпорÑдоченный ÑпиÑок (разделённый пробелами) типов подключениÑ, которые " -"будут перепробованы. Может включать tls, ssl или plain" +#: ../src/common/config.py:348 +msgid "Ordered list (space separated) of connection type to try. Can contain tls, ssl or plain" +msgstr "УпорÑдоченный ÑпиÑок (разделённый пробелами) типов подключениÑ, которые будут перепробованы. Может включать tls, ssl или plain" -#: ../src/common/config.py:352 -msgid "" -"Show a warning dialog before sending password on an plaintext connection. " -"Can be 'warn', 'connect', 'disconnect'" -msgstr "" -"ЕÑли отмечено, то Gajim будет будет Ñпрашивать Ð²Ð°Ñ Ð¿ÐµÑ€ÐµÐ´ отправкой Ð¿Ð°Ñ€Ð¾Ð»Ñ " -"через незащищенное Ñоединение. Может быть 'warn', 'connect', 'disconnect'" +#: ../src/common/config.py:349 +msgid "Show a warning dialog before sending password on an plaintext connection. Can be 'warn', 'connect', 'disconnect'" +msgstr "ЕÑли отмечено, то Gajim будет будет Ñпрашивать Ð²Ð°Ñ Ð¿ÐµÑ€ÐµÐ´ отправкой Ð¿Ð°Ñ€Ð¾Ð»Ñ Ñ‡ÐµÑ€ÐµÐ· незащищенное Ñоединение. Может быть 'warn', 'connect', 'disconnect'" -#: ../src/common/config.py:353 +#: ../src/common/config.py:350 msgid "Show a warning dialog before using standard SSL library." msgstr "Предупреждать, прежде чем иÑпользовать Ñтандартную библиотеку SSL." -#: ../src/common/config.py:354 -msgid "" -"Show a warning dialog before sending PLAIN password over a plain connection." -msgstr "" -"Показывать предупреждение перед отправкой Ð¿Ð°Ñ€Ð¾Ð»Ñ Ñ‡ÐµÑ€ÐµÐ· незащищенное " -"Ñоединение." +#: ../src/common/config.py:351 +msgid "Show a warning dialog before sending PLAIN password over a plain connection." +msgstr "Показывать предупреждение перед отправкой Ð¿Ð°Ñ€Ð¾Ð»Ñ Ñ‡ÐµÑ€ÐµÐ· незащищенное Ñоединение." -#: ../src/common/config.py:356 +#: ../src/common/config.py:353 msgid "Space separated list of ssl errors to ignore." msgstr "Разделенный пробелами ÑпиÑок Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº ssl" -#: ../src/common/config.py:362 -msgid "" -"Space separated list of JIDs for which you do not want to store logs. You " -"can also add account name to log nothing for this account." +#: ../src/common/config.py:359 +msgid "Space separated list of JIDs for which you do not want to store logs. You can also add account name to log nothing for this account." msgstr "" -#: ../src/common/config.py:363 -msgid "" -"Space separated list of JIDs for which you accept to not log conversations " -"if he does not want to." +#: ../src/common/config.py:360 +msgid "Space separated list of JIDs for which you accept to not log conversations if he does not want to." msgstr "" -#: ../src/common/config.py:366 +#: ../src/common/config.py:363 msgid "Whitespace sent after inactivity" msgstr "Пробел, поÑылаемый поÑле бездейÑтвиÑ" # доÑловно: пинг XMPP поÑлал поÑле бездейÑтвиÑ. Возможно, ошибка в оригинале. -#: ../src/common/config.py:367 +#: ../src/common/config.py:364 msgid "XMPP ping sent after inactivity" msgstr "пинг XMPP, поÑылаемый поÑле бездейÑтвиÑ" -#: ../src/common/config.py:371 -msgid "" -"How many seconds to wait for the answer of ping alive packet before we try " -"to reconnect?" -msgstr "" -"Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ (в Ñекундах) ответа на пинг перед повторной попыткой " -"ÑоединениÑ." +#: ../src/common/config.py:368 +msgid "How many seconds to wait for the answer of ping alive packet before we try to reconnect." +msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ (в Ñекундах) ответа на пинг перед повторной попыткой ÑоединениÑ." #. yes, no, ask -#: ../src/common/config.py:375 +#: ../src/common/config.py:372 msgid "Jabberd2 workaround" msgstr "КоÑтыль Ð´Ð»Ñ jabberd2" -#: ../src/common/config.py:378 -msgid "" -"If checked, Gajim will use your IP and proxies defined in " -"file_transfer_proxies option for file transfer." -msgstr "" -"ЕÑли отмечено, Gajim будет иÑпользовать ваш IP и прокÑи, определенные в " -"параметре file_transfer_proxies Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ файлов" +#: ../src/common/config.py:375 +msgid "If checked, Gajim will use your IP and proxies defined in file_transfer_proxies option for file transfer." +msgstr "ЕÑли отмечено, Gajim будет иÑпользовать ваш IP и прокÑи, определенные в параметре file_transfer_proxies Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ файлов" -#: ../src/common/config.py:379 -msgid "" -"If True, Gajim will test file transfer proxies on startup to be sure it " -"works. Openfire's proxies are known to fail this test even if they work." +#: ../src/common/config.py:376 +msgid "If True, Gajim will test file transfer proxies on startup to be sure it works. Openfire's proxies are known to fail this test even if they work." msgstr "" -#: ../src/common/config.py:393 +#: ../src/common/config.py:390 msgid "Answer to receipt requests" msgstr "Отвечать на запроÑÑ‹ уведомлениÑ" -#: ../src/common/config.py:394 +#: ../src/common/config.py:391 msgid "Sent receipt requests" msgstr "ПоÑылать запроÑÑ‹ уведомлениÑ" -#: ../src/common/config.py:403 -msgid "" -"Allow Gajim to send information about the operating system you are running." -msgstr "" -"Разрешить Gajim отправлÑÑ‚ÑŒ информацию о операционной ÑиÑтеме, которую вы " -"иÑпользуете" +#: ../src/common/config.py:400 +msgid "Allow Gajim to send information about the operating system you are running." +msgstr "Разрешить Gajim отправлÑÑ‚ÑŒ информацию о операционной ÑиÑтеме, которую вы иÑпользуете" -#: ../src/common/config.py:404 +#: ../src/common/config.py:401 msgid "Allow Gajim to send your local time." msgstr "Разрешить Gajim отправлÑÑ‚ÑŒ ваше локальное времÑ." -#: ../src/common/config.py:405 -msgid "" -"When negotiating an encrypted session, should Gajim assume you want your " -"messages to be logged?" -msgstr "" -"Когда уÑтанавливаетÑÑ Ð·Ð°ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ð¹ ÑеанÑ, должен ли Gajim предположить, что " -"вы хотите Ñохранить иÑторию Ñообщений?" +#: ../src/common/config.py:402 +msgid "When negotiating an encrypted session, should Gajim assume you want your messages to be logged?" +msgstr "Когда уÑтанавливаетÑÑ Ð·Ð°ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ð¹ ÑеанÑ, должен ли Gajim предположить, что вы хотите Ñохранить иÑторию Ñообщений?" -#: ../src/common/config.py:408 +#: ../src/common/config.py:405 msgid "Message that is sent to contacts you want to add" msgstr "Сообщение отправлÑемое контактам, которых вы хотите добавить" -#: ../src/common/config.py:409 +#: ../src/common/config.py:406 msgid "Last time we syncronized with logs from server." msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледней Ñинхронизации Ñ Ñервером." -#: ../src/common/config.py:410 -msgid "" -"If enabled and if server supports this feature, Gajim will receive messages " -"sent and received by other resources." +#: ../src/common/config.py:407 +msgid "If enabled and if server supports this feature, Gajim will receive messages sent and received by other resources." msgstr "" -#: ../src/common/config.py:411 -msgid "" -"If enabled, Gajim will send your local IPs so your contact can connect to " -"your machine to transfer files." +#: ../src/common/config.py:408 +msgid "If enabled, Gajim will send your local IPs so your contact can connect to your machine to transfer files." msgstr "" -#: ../src/common/config.py:412 +#: ../src/common/config.py:409 #, fuzzy msgid "Latest token for Oauth2 authentication." msgstr "ÐÐ½Ð¾Ð½Ð¸Ð¼Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ" -#: ../src/common/config.py:413 +#: ../src/common/config.py:410 #, fuzzy msgid "client_id for Oauth2 authentication." msgstr "ÐÐ½Ð¾Ð½Ð¸Ð¼Ð½Ð°Ñ Ð°ÑƒÑ‚_ентификациÑ" -#: ../src/common/config.py:414 +#: ../src/common/config.py:411 msgid "redirect_url for Oauth2 authentication." msgstr "" -#: ../src/common/config.py:415 -msgid "" -"Space separated list of JIDs for which we want to re-open a chat window on " -"next startup." +#: ../src/common/config.py:412 +msgid "Space separated list of jid for which we want to re-open a chat window on next startup." msgstr "" -#: ../src/common/config.py:477 +#: ../src/common/config.py:474 msgid "Is OpenPGP enabled for this contact?" msgstr "ИÑпользуетÑÑ Ð»Ð¸ Ð´Ð»Ñ Ñтого контакта OpenPGP?" -#: ../src/common/config.py:478 -msgid "" -"Should Gajim automatically start an encrypted session with this contact when " -"possible?" -msgstr "" -"Должен ли Gajim по возможноÑти автоматичеÑки начинать Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ контакта " -"зашифрованный ÑеанÑ?" +#: ../src/common/config.py:475 +msgid "Should Gajim automatically start an encrypted session with this contact when possible?" +msgstr "Должен ли Gajim по возможноÑти автоматичеÑки начинать Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ контакта зашифрованный ÑеанÑ?" -#: ../src/common/config.py:479 ../src/common/config.py:482 +#: ../src/common/config.py:476 +#: ../src/common/config.py:479 msgid "Language for which we want to check misspelled words" msgstr "Язык, который иÑпользуетÑÑ Ð¿Ñ€Ð¸ проверке правопиÑаниÑ" -#: ../src/common/config.py:483 -msgid "" -"How many lines to request from server when entering a groupchat. -1 means no " -"limit, -2 means global value" -msgstr "" -"КоличеÑтво Ñтрок иÑтории Ñообщений, запрашиваемых при входе в комнату. -1 - " -"не ограничено, -2 - глобальное значение" - -#: ../src/common/config.py:484 -msgid "" -"How many minutes back to request logs when entering a groupchat. -1 means no " -"limit, -2 means global value" -msgstr "" -"За какой период (минут назад) запрашивать иÑторию Ñообщений при входе в " -"комнату. -1 - не ограничено, -2 - глобальное значение" +#: ../src/common/config.py:482 +#, fuzzy +msgid "State whether plugins should be activated on startup (this is saved on Gajim exit). This option SHOULD NOT be used to (de)activate plug-ins. Use GUI instead." +msgstr "СоÑтоÑние модулей при выходе(Ñто ÑохранÑетÑÑ Ð¿Ñ€Ð¸ выключении Gajim). Ðта Ð¾Ð¿Ñ†Ð¸Ñ ÐЕ ДОЛЖÐРиÑпользоватьÑÑ Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¹. ИÑпользуйте графичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ Ñтого." #: ../src/common/config.py:487 -msgid "" -"State whether plugins should be activated on startup (this is saved on Gajim " -"exit). This option SHOULD NOT be used to (de)activate plug-ins. Use GUI " -"instead." -msgstr "" -"СоÑтоÑние модулей при выходе (Ñто ÑохранÑетÑÑ Ð¿Ñ€Ð¸ выключении Gajim). Ðта " -"Ð¾Ð¿Ñ†Ð¸Ñ ÐЕ ДОЛЖÐРиÑпользоватьÑÑ Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¹. " -"ИÑпользуйте графичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ Ñтого." - -#: ../src/common/config.py:492 ../src/common/pep.py:157 +#: ../src/common/pep.py:157 msgid "Sleeping" msgstr "Сплю" -#: ../src/common/config.py:493 +#: ../src/common/config.py:488 msgid "Back soon" msgstr "Скоро буду" -#: ../src/common/config.py:493 +#: ../src/common/config.py:488 msgid "Back in some minutes." msgstr "ВернуÑÑŒ через неÑколько минут" -#: ../src/common/config.py:494 ../src/common/pep.py:127 +#: ../src/common/config.py:489 +#: ../src/common/pep.py:127 msgid "Eating" msgstr "Ем" -#: ../src/common/config.py:494 +#: ../src/common/config.py:489 msgid "I'm eating, so leave me a message." msgstr "Кушаю, так что оÑтавьте Ñообщение Ñекретарю." -#: ../src/common/config.py:495 +#: ../src/common/config.py:490 msgid "Movie" msgstr "Ð’ кино" -#: ../src/common/config.py:495 +#: ../src/common/config.py:490 msgid "I'm watching a movie." msgstr "Смотрю кино" -#: ../src/common/config.py:496 ../src/common/pep.py:186 +#: ../src/common/config.py:491 +#: ../src/common/pep.py:185 msgid "Working" msgstr "Работаю" -#: ../src/common/config.py:496 +#: ../src/common/config.py:491 msgid "I'm working." msgstr "Работаю" -#: ../src/common/config.py:497 +#: ../src/common/config.py:492 msgid "Phone" msgstr "Телефон" -#: ../src/common/config.py:497 +#: ../src/common/config.py:492 msgid "I'm on the phone." msgstr "Говорю по телефону" -#: ../src/common/config.py:498 +#: ../src/common/config.py:493 msgid "Out" msgstr "Вышел" -#: ../src/common/config.py:498 +#: ../src/common/config.py:493 msgid "I'm out enjoying life." msgstr "ÐаÑлаждаюÑÑŒ жизнью, чего и вам желаю." -#: ../src/common/config.py:509 +#: ../src/common/config.py:504 msgid "I'm available." msgstr "Я здеÑÑŒ." -#: ../src/common/config.py:510 +#: ../src/common/config.py:505 msgid "I'm free for chat." msgstr "Я готов поболтать." -#: ../src/common/config.py:511 ../src/config.py:1646 +#: ../src/common/config.py:506 +#: ../src/config.py:1645 msgid "Be right back." msgstr "Скоро буду." -#: ../src/common/config.py:512 +#: ../src/common/config.py:507 msgid "I'm not available." msgstr "ÐœÐµÐ½Ñ Ð½ÐµÑ‚." -#: ../src/common/config.py:513 +#: ../src/common/config.py:508 msgid "Do not disturb." msgstr "Ðе беÑпокоить." -#: ../src/common/config.py:514 ../src/common/config.py:515 +#: ../src/common/config.py:509 +#: ../src/common/config.py:510 msgid "Bye!" msgstr "Пока!" -#: ../src/common/config.py:526 -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 "" -"Звук, который нужно воÑпроизвеÑти, когда в MUC поÑвлÑетÑÑ Ñообщение, которое " -"Ñодержит Ñлово из ÑпиÑка muc_highlight_words, или когда Ñообщение Ñодержит " -"ваш ник." +#: ../src/common/config.py:521 +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 "Звук, который нужно воÑпроизвеÑти, когда в MUC поÑвлÑетÑÑ Ñообщение, которое Ñодержит Ñлово из ÑпиÑка muc_highlight_words, или когда Ñообщение Ñодержит ваш ник." -#: ../src/common/config.py:527 +#: ../src/common/config.py:522 msgid "Sound to play when any MUC message arrives." msgstr "Звук, который нужно проигрывать, когда приходит любое Ñообщение MUC." -#: ../src/common/config.py:536 ../src/common/optparser.py:309 +#: ../src/common/config.py:531 +#: ../src/common/optparser.py:309 msgid "green" msgstr "зеленый" -#: ../src/common/config.py:540 ../src/common/optparser.py:295 +#: ../src/common/config.py:535 +#: ../src/common/optparser.py:295 msgid "grocery" msgstr "овощной" -#: ../src/common/config.py:544 +#: ../src/common/config.py:539 msgid "human" msgstr "телеÑный" -#: ../src/common/config.py:548 +#: ../src/common/config.py:543 msgid "marine" msgstr "морÑкой" -#: ../src/common/config.py:555 +#: ../src/common/config.py:550 +#, fuzzy msgid "Tor" -msgstr "Tor" +msgstr "К" -#: ../src/common/connection_handlers_events.py:370 +#: ../src/common/connection_handlers_events.py:369 #, python-format -msgid "" -"JID %s is not RFC compliant. It will not be added to your roster. Use roster " -"management tools such as http://jru.jabberstudio.org/ to remove it" -msgstr "" -"JID %s не ÑоответÑтвует RFC. Он не будет добавлен в ваш роÑтер. ИÑпользуйте " -"ÑредÑтво ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ€Ð¾Ñтера, например http://jru.jabberstudio.org/, чтобы " -"удалить его" +msgid "JID %s is not RFC compliant. It will not be added to your roster. Use roster management tools such as http://jru.jabberstudio.org/ to remove it" +msgstr "JID %s не ÑоответÑтвует RFC. Он не будет добавлен в ваш роÑтер. ИÑпользуйте ÑредÑтво ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ€Ð¾Ñтера, например http://jru.jabberstudio.org/, чтобы удалить его" -#: ../src/common/connection_handlers_events.py:825 +#: ../src/common/connection_handlers_events.py:823 #, python-format msgid "unsubscribe request from %s" msgstr "%s хочет отменить подпиÑку" -#: ../src/common/connection_handlers_events.py:910 -#: ../src/common/connection_handlers.py:343 -#: ../src/common/connection_handlers.py:1143 -#: ../src/common/connection_handlers.py:1267 ../src/common/connection.py:520 -#: ../src/common/logger.py:1159 ../src/gajim.py:435 ../src/session.py:95 +#: ../src/common/connection_handlers_events.py:908 +#: ../src/common/connection_handlers.py:338 +#: ../src/common/connection_handlers.py:953 +#: ../src/common/connection_handlers.py:1075 +#: ../src/common/connection.py:459 +#: ../src/common/logger.py:1153 +#: ../src/gajim.py:390 +#: ../src/session.py:97 msgid "Disk Write Error" msgstr "Ошибка запиÑи на диÑк" -#: ../src/common/connection_handlers_events.py:914 -#: ../src/common/connection_handlers.py:1146 -#: ../src/common/connection_handlers.py:1270 ../src/common/connection.py:524 -#: ../src/common/logger.py:1162 ../src/gajim.py:230 ../src/session.py:99 +#: ../src/common/connection_handlers_events.py:912 +#: ../src/common/connection_handlers.py:956 +#: ../src/common/connection_handlers.py:1078 +#: ../src/common/connection.py:463 +#: ../src/common/logger.py:1156 +#: ../src/gajim.py:209 +#: ../src/session.py:101 #, python-format -msgid "" -"The database file (%s) cannot be read. Try to repair it (see http://trac." -"gajim.org/wiki/DatabaseBackup) or remove it (all history will be lost)." -msgstr "" -"Файл базы данных (%s) не может быть прочитан. Попробуйте воÑÑтановить его " -"(Ñм. http://trac.gajim.org/wiki/DatabaseBackup) или удалить (вÑÑ Ð¸ÑÑ‚Ð¾Ñ€Ð¸Ñ " -"будет утерÑна)." +msgid "The database file (%s) cannot be read. Try to repair it (see http://trac.gajim.org/wiki/DatabaseBackup) or remove it (all history will be lost)." +msgstr "Файл базы данных (%s) не может быть прочитан. Попробуйте воÑÑтановить его(Ñм. http://trac.gajim.org/wiki/DatabaseBackup) или удалить (вÑÑ Ð¸ÑÑ‚Ð¾Ñ€Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ утерÑна)." #. Room has been destroyed. see #. http://www.xmpp.org/extensions/xep-0045.html#destroyroom -#: ../src/common/connection_handlers_events.py:935 +#: ../src/common/connection_handlers_events.py:933 msgid "Room has been destroyed" msgstr "Комната была удалена" -#: ../src/common/connection_handlers_events.py:943 +#: ../src/common/connection_handlers_events.py:941 #, python-format msgid "You can join this room instead: %s" msgstr "Взамен, вы можете приÑоединитьÑÑ Ðº комнате: %s" -#: ../src/common/connection_handlers_events.py:1027 -#: ../src/common/connection_handlers_events.py:1070 -#: ../src/common/connection.py:270 ../src/common/connection.py:280 -#: ../src/config.py:2157 ../src/config.py:2166 ../src/config.py:2236 -#: ../src/config.py:3680 ../src/dataforms_widget.py:633 ../src/dialogs.py:3244 +#: ../src/common/connection_handlers_events.py:1025 +#: ../src/common/connection_handlers_events.py:1062 +#: ../src/common/connection.py:263 +#: ../src/config.py:2142 +#: ../src/config.py:2151 +#: ../src/config.py:2219 +#: ../src/config.py:3662 +#: ../src/dataforms_widget.py:633 +#: ../src/dialogs.py:3133 msgid "Invalid Jabber ID" msgstr "Ðеверный Jabber ID" -#: ../src/common/connection_handlers_events.py:1028 -#: ../src/common/connection_handlers_events.py:1071 +#: ../src/common/connection_handlers_events.py:1026 +#: ../src/common/connection_handlers_events.py:1063 msgid "A message from a non-valid JID arrived, it has been ignored." msgstr "Было получено Ñообщение от неверного JID, оно было проигнорировано." #. ('MSGNOTSENT', account, (jid, ierror_msg, msg, time, session)) -#: ../src/common/connection_handlers_events.py:1102 -#: ../src/gui_interface.py:433 ../src/gui_interface.py:447 +#: ../src/common/connection_handlers_events.py:1094 +#: ../src/gui_interface.py:432 +#: ../src/gui_interface.py:446 #, python-format msgid "error while sending %(message)s ( %(error)s )" msgstr "ошибка при отправке %(message)s ( %(error)s )" -#: ../src/common/connection_handlers_events.py:1298 -#, fuzzy -msgid "URL:" -msgstr "URL:" - -#: ../src/common/connection_handlers_events.py:1599 +#: ../src/common/connection_handlers_events.py:1565 #, python-format msgid "Unknown SSL error: %d" msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° SSL: %d" -#: ../src/common/connection_handlers_events.py:2202 ../src/dialogs.py:2917 +#: ../src/common/connection_handlers_events.py:2157 +#: ../src/dialogs.py:2818 #: ../src/notify.py:266 msgid "New Single Message" msgstr "Ðовое одиночное Ñообщение" -#: ../src/common/connection_handlers_events.py:2204 +#: ../src/common/connection_handlers_events.py:2159 #, python-format msgid "New Single Message from %(nickname)s" msgstr "Ðовое Ñообщение от %(nickname)s" -#: ../src/common/connection_handlers_events.py:2208 ../src/dialogs.py:2918 +#: ../src/common/connection_handlers_events.py:2163 +#: ../src/dialogs.py:2819 #: ../src/notify.py:267 msgid "New Private Message" msgstr "Ðовое личное Ñообщение" -#: ../src/common/connection_handlers_events.py:2210 +#: ../src/common/connection_handlers_events.py:2165 #, python-format msgid "New Private Message from group chat %s" msgstr "Ðовое личное Ñообщение из комнаты %s" -#: ../src/common/connection_handlers_events.py:2213 +#: ../src/common/connection_handlers_events.py:2168 #, python-format msgid "%(nickname)s: %(message)s" msgstr "%(nickname)s: %(message)s" -#: ../src/common/connection_handlers_events.py:2216 +#: ../src/common/connection_handlers_events.py:2171 #, python-format msgid "Messaged by %(nickname)s" msgstr "Ðовое Ñообщение от %(nickname)s" -#: ../src/common/connection_handlers_events.py:2220 ../src/dialogs.py:2917 +#: ../src/common/connection_handlers_events.py:2175 +#: ../src/dialogs.py:2818 #: ../src/notify.py:266 msgid "New Message" msgstr "Ðовое Ñообщение" -#: ../src/common/connection_handlers_events.py:2222 +#: ../src/common/connection_handlers_events.py:2177 #, python-format msgid "New Message from %(nickname)s" msgstr "Ðовое Ñообщение от %(nickname)s" -#: ../src/common/connection_handlers_events.py:2366 +#: ../src/common/connection_handlers_events.py:2320 #, python-format msgid "%(nick)s Changed Status" msgstr "%(nick)s менÑет ÑтатуÑ" -#: ../src/common/connection_handlers_events.py:2368 -#: ../src/groupchat_control.py:207 ../src/groupchat_control.py:1855 -#: ../src/history_window.py:455 +#: ../src/common/connection_handlers_events.py:2322 +#: ../src/groupchat_control.py:205 +#: ../src/groupchat_control.py:1767 +#: ../src/history_window.py:448 #, python-format msgid "%(nick)s is now %(status)s" msgstr "%(nick)s теперь %(status)s" -#: ../src/common/connection_handlers_events.py:2372 ../src/dialogs.py:2929 +#: ../src/common/connection_handlers_events.py:2327 +#: ../src/dialogs.py:2830 #: ../src/notify.py:280 msgid "Contact Changed Status" msgstr "Контакт изменит ÑтатуÑ" -#: ../src/common/connection_handlers_events.py:2374 +#: ../src/common/connection_handlers_events.py:2329 #, python-format msgid "%(nickname)s Signed In" msgstr "%(nickname)s подключаетÑÑ" #. default value -#: ../src/common/connection_handlers_events.py:2378 ../src/dialogs.py:2913 +#: ../src/common/connection_handlers_events.py:2334 +#: ../src/dialogs.py:2814 #: ../src/notify.py:262 msgid "Contact Signed In" msgstr "Контакт подключилÑÑ" -#: ../src/common/connection_handlers_events.py:2380 +#: ../src/common/connection_handlers_events.py:2336 #, python-format msgid "%(nickname)s Signed Out" msgstr "%(nickname)s отключаетÑÑ" -#: ../src/common/connection_handlers_events.py:2384 ../src/dialogs.py:2915 +#: ../src/common/connection_handlers_events.py:2341 +#: ../src/dialogs.py:2816 #: ../src/notify.py:264 msgid "Contact Signed Out" msgstr "Контакт отключилÑÑ" -#: ../src/common/connection_handlers.py:92 -#: ../src/common/zeroconf/connection_handlers_zeroconf.py:53 +#: ../src/common/connection_handlers.py:89 +#: ../src/common/zeroconf/connection_handlers_zeroconf.py:54 msgid "Unable to load idle module" msgstr "Ðе могу загрузить модуль «idle»" -#: ../src/common/connection_handlers.py:127 +#: ../src/common/connection_handlers.py:122 #, python-format msgid "Registration information for transport %s has not arrived in time" msgstr "Данные о региÑтрации Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ñпорта %s не пришли вовремÑ." -#: ../src/common/connection_handlers.py:135 +#: ../src/common/connection_handlers.py:130 msgid "Registration succeeded" msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð°" -#: ../src/common/connection_handlers.py:136 +#: ../src/common/connection_handlers.py:131 #, python-format msgid "Registration with agent %s succeeded" msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÑервиÑа %s завершена уÑпешно" -#: ../src/common/connection_handlers.py:145 +#: ../src/common/connection_handlers.py:140 msgid "Registration failed" msgstr "Ошибка региÑтрации" -#: ../src/common/connection_handlers.py:146 +#: ../src/common/connection_handlers.py:141 #, python-format -msgid "" -"Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" -msgstr "" -"РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÑервиÑа %(agent)s завершилаÑÑŒ ошибкой: %(error)s: %(error_msg)s" +msgid "Registration with agent %(agent)s failed with error %(error)s: %(error_msg)s" +msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÑервиÑа %(agent)s завершилаÑÑŒ ошибкой: %(error)s: %(error_msg)s" -#: ../src/common/connection_handlers.py:591 ../src/common/connection.py:1770 +#: ../src/common/connection_handlers.py:575 +#: ../src/common/connection.py:1576 msgid "Invisibility not supported" msgstr "ÐевидимоÑÑ‚ÑŒ не поддерживаетÑÑ" -#: ../src/common/connection_handlers.py:592 ../src/common/connection.py:1771 +#: ../src/common/connection_handlers.py:576 +#: ../src/common/connection.py:1577 #, python-format msgid "Account %s doesn't support invisibility." msgstr "Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ %s не поддерживает невидимоÑÑ‚ÑŒ." -#: ../src/common/connection_handlers.py:1945 +#: ../src/common/connection_handlers.py:1742 msgid "I would like to add you to my roster." msgstr "Ð’Ñ‹ не возражаете, еÑли Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑŽ Ð’Ð°Ñ Ð² Ñвой роÑтер?" @@ -5241,27 +4898,27 @@ msgstr "Ðазначение ключа не включает подпиÑыва msgid "Application verification failure" msgstr "Ошибка при проверке приложениÑ" -#: ../src/common/connection.py:271 ../src/common/connection.py:281 -#: ../src/dialogs.py:3245 +#: ../src/common/connection.py:264 +#: ../src/dialogs.py:3134 #, python-format msgid "It is not possible to send a message to %s, this JID is not valid." msgstr "Ðе удалоÑÑŒ передать Ñообщение %s — Ñтот JID неверен." -#: ../src/common/connection.py:304 +#: ../src/common/connection.py:286 msgid "Neither the remote presence is signed, nor a key was assigned." msgstr "Ðи удаленное приÑутÑтвие не подпиÑано, ни ключ не приÑвоен." -#: ../src/common/connection.py:307 +#: ../src/common/connection.py:289 #, python-format msgid "The contact's key (%s) does not match the key assigned in Gajim." msgstr "Ключ (%s) контакта не ÑоответÑтвует ключу, приÑвоенному в Gajim." #. we're not english: one in locale and one en -#: ../src/common/connection.py:363 +#: ../src/common/connection.py:343 msgid "[This message is *encrypted* (See :XEP:`27`]" msgstr "[Ðто Ñообщение *зашифровано* (Ñм. :XEP:`27`]" -#: ../src/common/connection.py:507 +#: ../src/common/connection.py:446 #, python-format msgid "" "Subject: %(subject)s\n" @@ -5270,77 +4927,77 @@ msgstr "" "Тема: %(subject)s\n" "%(message)s" -#: ../src/common/connection.py:930 +#: ../src/common/connection.py:866 #, python-format msgid "Connection with account \"%s\" has been lost" msgstr "СвÑзь Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑью «%s» была потерÑна" -#: ../src/common/connection.py:931 +#: ../src/common/connection.py:867 msgid "Reconnect manually." msgstr "ПереподключатьÑÑ Ð²Ñ€ÑƒÑ‡Ð½ÑƒÑŽ." #. it's a new account #. wrong answer -#: ../src/common/connection.py:942 +#: ../src/common/connection.py:878 #, python-format msgid "Server %(name)s answered wrongly to register request: %(error)s" msgstr "Сервер %(name)s неверно ответил на Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¾ региÑтрации: %(error)s" #. requested config has changed since first connection -#: ../src/common/connection.py:984 +#: ../src/common/connection.py:920 #, python-format msgid "Server %s provided a different registration form" msgstr "Сервер %s предоÑтавил другую региÑтрационную форму" -#: ../src/common/connection.py:1001 +#: ../src/common/connection.py:937 msgid "Invalid answer" msgstr "Ðеверный ответ" -#: ../src/common/connection.py:1002 +#: ../src/common/connection.py:938 #, python-format msgid "Transport %(name)s answered wrongly to register request: %(error)s" msgstr "ТранÑпорт %(name)s неверно ответил на Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¾ региÑтрации: %(error)s" -#: ../src/common/connection.py:1297 -#, fuzzy, python-format -msgid "Could not connect to \"%(host)s\" via proxy \"%(proxy)s\"" +#: ../src/common/connection.py:1230 +#: ../src/common/connection.py:1385 +#: ../src/common/connection.py:2016 +#: ../src/common/zeroconf/connection_zeroconf.py:205 +#, python-format +msgid "Could not connect to \"%s\"" msgstr "Ðе могу ÑоединитьÑÑ Ñ Â«%s»" -#: ../src/common/connection.py:1300 -#, fuzzy, python-format -msgid "Could not connect to \"%(host)s\"" -msgstr "Ðе могу ÑоединитьÑÑ Ñ %s" - -#: ../src/common/connection.py:1302 ../src/common/connection.py:1463 -#: ../src/gui_interface.py:542 +#: ../src/common/connection.py:1231 +#: ../src/gui_interface.py:541 msgid "Check your connection or try again later." msgstr "Проверьте наÑтройки Ñети или попробуйте еще раз позже." -#: ../src/common/connection.py:1307 +#: ../src/common/connection.py:1236 #, python-format msgid "Server replied: %s" msgstr "Сервер ответил: %s" -#: ../src/common/connection.py:1322 +#: ../src/common/connection.py:1251 msgid "Connection to proxy failed" msgstr "Соединение Ñ Ð¿Ñ€Ð¾ÐºÑи разорвалоÑÑŒ" -#: ../src/common/connection.py:1360 ../src/common/connection.py:1438 +#: ../src/common/connection.py:1289 +#: ../src/common/connection.py:1361 #, python-format msgid "Could not connect to account %s" msgstr "Ðе могу ÑоединитьÑÑ Ñ %s" -#: ../src/common/connection.py:1361 ../src/common/connection.py:1439 +#: ../src/common/connection.py:1290 +#: ../src/common/connection.py:1362 #, python-format msgid "Connection with account %s has been lost. Retry connecting." msgstr "СвÑзь Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑью %s была потерÑна. Попытка подключениÑ." -#: ../src/common/connection.py:1388 +#: ../src/common/connection.py:1315 #, python-format msgid "The authenticity of the %s certificate could be invalid." msgstr "ДоÑтоверноÑÑ‚ÑŒ Ñертификата %s может быть недейÑтвительной." -#: ../src/common/connection.py:1391 +#: ../src/common/connection.py:1318 #, python-format msgid "" "\n" @@ -5349,7 +5006,7 @@ msgstr "" "\n" "Ошибка SSL: <b>%s</b>" -#: ../src/common/connection.py:1393 +#: ../src/common/connection.py:1320 #, python-format msgid "" "\n" @@ -5358,75 +5015,76 @@ msgstr "" "\n" "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° SSL: %d" -#: ../src/common/connection.py:1420 +#: ../src/common/connection.py:1343 #, fuzzy, python-format msgid "" "The authenticity of the %s certificate could be invalid.\n" "The certificate does not cover this domain." msgstr "ДоÑтоверноÑÑ‚ÑŒ Ñертификата %s может быть недейÑтвительной." -#: ../src/common/connection.py:1462 ../src/common/connection.py:2203 -#: ../src/common/zeroconf/connection_zeroconf.py:205 -#, python-format -msgid "Could not connect to \"%s\"" -msgstr "Ðе могу ÑоединитьÑÑ Ñ Â«%s»" +#: ../src/common/connection.py:1386 +msgid "Check your connection or try again later" +msgstr "Проверьте наÑтройки Ñети или попробуйте еще раз позже" -#: ../src/common/connection.py:1498 +#: ../src/common/connection.py:1421 #, python-format msgid "Authentication failed with \"%s\"" msgstr "Ошибка аутентификации Ñ Â«%s»" -#: ../src/common/connection.py:1499 +#: ../src/common/connection.py:1422 msgid "Please check your login and password for correctness." msgstr "Проверьте правильноÑÑ‚ÑŒ логина и паролÑ." -#: ../src/common/connection.py:1574 +#: ../src/common/connection.py:1497 msgid "Error while removing privacy list" msgstr "Ошибка при удалении ÑпиÑка доÑтупа" -#: ../src/common/connection.py:1575 +#: ../src/common/connection.py:1498 #, python-format -msgid "" -"Privacy list %s has not been removed. It is maybe active in one of your " -"connected resources. Deactivate it and try again." -msgstr "" -"СпиÑок доÑтупа %s не может быть удален. Возможно, он иÑпользуетÑÑ Ð¾Ð´Ð½Ð¸Ð¼ из " -"ваших активных реÑурÑов. Отключите реÑÑƒÑ€Ñ Ð¸ попробуйте Ñнова." +msgid "Privacy list %s has not been removed. It is maybe active in one of your connected resources. Deactivate it and try again." +msgstr "СпиÑок доÑтупа %s не может быть удален. Возможно, он иÑпользуетÑÑ Ð¾Ð´Ð½Ð¸Ð¼ из ваших активных реÑурÑов. Отключите реÑÑƒÑ€Ñ Ð¸ попробуйте Ñнова." -#: ../src/common/connection.py:2067 +#: ../src/common/connection.py:1883 #, python-format msgid "Sent contact: \"%s\" (%s)" msgstr "Контакт Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸: «%s» (%s)" -#: ../src/common/connection.py:2070 +#: ../src/common/connection.py:1886 msgid "Sent contacts:" msgstr "Контакты Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸:" -#: ../src/common/connection.py:2220 ../src/common/connection.py:2242 +#: ../src/common/connection.py:2033 +#: ../src/common/connection.py:2056 msgid "Not fetched because of invisible status" msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ из-за невидимоÑти" -#: ../src/common/connection.py:2826 +#: ../src/common/connection.py:2616 msgid "Unregister failed" msgstr "Ошибка отказа от региÑтрации" -#: ../src/common/connection.py:2827 +#: ../src/common/connection.py:2617 #, python-format msgid "Unregistration with server %(server)s failed: %(error)s" -msgstr "" -"Отказ от региÑтрации на Ñервере %(server)s завершилÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹: %(error)s" +msgstr "Отказ от региÑтрации на Ñервере %(server)s завершилÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹: %(error)s" -#: ../src/common/contacts.py:129 ../src/common/helpers.py:67 -#: ../src/gui_interface.py:485 +#: ../src/common/contacts.py:129 +#: ../src/common/helpers.py:67 +#: ../src/gui_interface.py:484 msgid "Observers" msgstr "Ðаблюдатели" -#: ../src/common/contacts.py:133 ../src/common/contacts.py:361 -#: ../src/common/helpers.py:67 ../src/disco.py:121 ../src/disco.py:122 -#: ../src/disco.py:1554 ../src/roster_window.py:863 -#: ../src/roster_window.py:1616 ../src/roster_window.py:1730 -#: ../src/roster_window.py:1732 ../src/roster_window.py:1894 -#: ../src/roster_window.py:2591 +#: ../src/common/contacts.py:133 +#: ../src/common/contacts.py:361 +#: ../src/common/helpers.py:67 +#: ../src/disco.py:120 +#: ../src/disco.py:121 +#: ../src/disco.py:1516 +#: ../src/roster_window.py:859 +#: ../src/roster_window.py:1608 +#: ../src/roster_window.py:1718 +#: ../src/roster_window.py:1720 +#: ../src/roster_window.py:1882 +#: ../src/roster_window.py:2579 msgid "Transports" msgstr "ТранÑпорты" @@ -5439,7 +5097,8 @@ msgstr "Ðе в роÑтере" msgid "D-Bus python bindings are missing in this computer" msgstr "Ðа компьютере не уÑтановлена библиотека D-Bus Ð´Ð»Ñ Python" -#: ../src/common/dbus_support.py:42 ../src/common/dbus_support.py:53 +#: ../src/common/dbus_support.py:42 +#: ../src/common/dbus_support.py:53 msgid "D-Bus capabilities of Gajim cannot be used" msgstr "ВозможноÑти работы Gajim Ñ D-Bus не могут быть иÑпользованы" @@ -5462,11 +5121,10 @@ msgstr "База данных не может быть загружена." #: ../src/common/exceptions.py:56 msgid "Service not available: Gajim is not running, or remote_control is False" -msgstr "" -"Ð¡ÐµÑ€Ð²Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупен: Gajim не запущен или отключена Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ð¾Ð³Ð¾ " -"ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (наÑтройка remote_control)" +msgstr "Ð¡ÐµÑ€Ð²Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупен: Gajim не запущен или отключена Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ð¾Ð³Ð¾ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (наÑтройка remote_control)" -#: ../src/common/exceptions.py:67 ../src/gajim-remote.py:56 +#: ../src/common/exceptions.py:67 +#: ../src/gajim-remote.py:55 msgid "D-Bus is not present on this machine or python module is missing" msgstr "Ðа машине отÑутÑтвует D-Bus или модуль питона Ð´Ð»Ñ Ð½ÐµÐµ" @@ -5603,7 +5261,8 @@ msgstr "без пÑти %(1)s" msgid "%(1)s o'clock" msgstr "%(1)s" -#: ../src/common/fuzzyclock.py:49 ../src/common/fuzzyclock.py:51 +#: ../src/common/fuzzyclock.py:49 +#: ../src/common/fuzzyclock.py:51 msgid "Night" msgstr "Ðочь" @@ -5639,7 +5298,8 @@ msgstr "Поздний вечер" msgid "Start of week" msgstr "Ðачало недели" -#: ../src/common/fuzzyclock.py:53 ../src/common/fuzzyclock.py:54 +#: ../src/common/fuzzyclock.py:53 +#: ../src/common/fuzzyclock.py:54 msgid "Middle of week" msgstr "Середина недели" @@ -5683,7 +5343,8 @@ msgstr "Ðеверный Ñимвол в реÑурÑе" msgid "_Busy" msgstr "_ЗанÑÑ‚" -#: ../src/common/helpers.py:227 ../src/tooltips.py:191 +#: ../src/common/helpers.py:227 +#: ../src/tooltips.py:191 msgid "Busy" msgstr "ЗанÑÑ‚" @@ -5691,7 +5352,8 @@ msgstr "ЗанÑÑ‚" msgid "_Not Available" msgstr "_ÐедоÑтупен" -#: ../src/common/helpers.py:232 ../src/tooltips.py:193 +#: ../src/common/helpers.py:232 +#: ../src/tooltips.py:193 msgid "Not Available" msgstr "ÐедоÑтупен" @@ -5699,7 +5361,8 @@ msgstr "ÐедоÑтупен" msgid "_Free for Chat" msgstr "_Готов поболтать" -#: ../src/common/helpers.py:237 ../src/tooltips.py:187 +#: ../src/common/helpers.py:237 +#: ../src/tooltips.py:187 msgid "Free for Chat" msgstr "Готов поболтать" @@ -5707,7 +5370,8 @@ msgstr "Готов поболтать" msgid "?user status:_Available" msgstr "Д_оÑтупен" -#: ../src/common/helpers.py:242 ../src/tooltips.py:185 +#: ../src/common/helpers.py:242 +#: ../src/tooltips.py:185 msgid "?user status:Available" msgstr "ДоÑтупен" @@ -5723,7 +5387,8 @@ msgstr "_Ушел" msgid "_Offline" msgstr "_Отключен" -#: ../src/common/helpers.py:254 ../src/tooltips.py:195 +#: ../src/common/helpers.py:254 +#: ../src/tooltips.py:195 msgid "Offline" msgstr "Отключен" @@ -5795,19 +5460,23 @@ msgstr "ПоÑетители" msgid "Visitor" msgstr "ПоÑетитель" -#: ../src/common/helpers.py:316 ../src/tooltips.py:209 +#: ../src/common/helpers.py:316 +#: ../src/tooltips.py:209 msgid "?Group Chat Contact Affiliation:None" msgstr "?Group Chat Contact Affiliation:ОтÑутÑтвует" -#: ../src/common/helpers.py:318 ../src/tooltips.py:215 +#: ../src/common/helpers.py:318 +#: ../src/tooltips.py:215 msgid "Owner" msgstr "Владелец" -#: ../src/common/helpers.py:320 ../src/tooltips.py:213 +#: ../src/common/helpers.py:320 +#: ../src/tooltips.py:213 msgid "Administrator" msgstr "ÐдминиÑтратор" -#: ../src/common/helpers.py:322 ../src/tooltips.py:211 +#: ../src/common/helpers.py:322 +#: ../src/tooltips.py:211 msgid "Member" msgstr "УчаÑтник" @@ -5874,7 +5543,8 @@ msgstr "%s KB" msgid "%s B" msgstr "%s B" -#: ../src/common/helpers.py:1119 ../src/common/helpers.py:1126 +#: ../src/common/helpers.py:1119 +#: ../src/common/helpers.py:1126 #, python-format msgid "%d message pending" msgid_plural "%d messages pending" @@ -5887,7 +5557,8 @@ msgstr[2] "%d пропущенных Ñообщений" msgid " from room %s" msgstr " в комнате %s" -#: ../src/common/helpers.py:1135 ../src/common/helpers.py:1152 +#: ../src/common/helpers.py:1135 +#: ../src/common/helpers.py:1152 #, python-format msgid " from user %s" msgstr " от Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %s" @@ -5897,7 +5568,8 @@ msgstr " от Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %s" msgid " from %s" msgstr " от %s" -#: ../src/common/helpers.py:1144 ../src/common/helpers.py:1150 +#: ../src/common/helpers.py:1144 +#: ../src/common/helpers.py:1150 #, python-format msgid "%d event pending" msgid_plural "%d events pending" @@ -5910,33 +5582,35 @@ msgstr[2] "%d Ñобытий пропущено" msgid "Gajim - %s" msgstr "Gajim — %s" -#: ../src/common/helpers.py:1368 +#: ../src/common/helpers.py:1365 msgid "Hello, I am $name." msgstr "Привет, Ñ $name." -#: ../src/common/helpers.py:1478 ../src/common/helpers.py:1487 -#: ../src/common/helpers.py:1541 +#: ../src/common/helpers.py:1475 +#: ../src/common/helpers.py:1484 +#: ../src/common/helpers.py:1538 msgid "Timeout loading image" msgstr "Ðе могу загрузить изображение" -#: ../src/common/helpers.py:1497 ../src/common/helpers.py:1539 +#: ../src/common/helpers.py:1494 +#: ../src/common/helpers.py:1536 msgid "Image is too big" msgstr "Изображение Ñлишком большое" -#: ../src/common/helpers.py:1507 +#: ../src/common/helpers.py:1504 msgid "PyCURL is not installed" msgstr "PyCURL не уÑтановлен" -#: ../src/common/helpers.py:1543 +#: ../src/common/helpers.py:1540 msgid "Error loading image" msgstr "Ошибка загрузки изображениÑ" -#: ../src/common/jingle_rtp.py:114 +#: ../src/common/jingle_rtp.py:110 #, python-format msgid "%s configuration error" msgstr "ошибка конфигурации %s" -#: ../src/common/jingle_rtp.py:115 +#: ../src/common/jingle_rtp.py:111 #, python-format msgid "" "Couldn't setup %s. Check your configuration.\n" @@ -5955,11 +5629,11 @@ msgstr "" "Ошибка:\n" "%s" -#: ../src/common/jingle_rtp.py:220 +#: ../src/common/jingle_rtp.py:207 msgid "GStreamer error" msgstr "Ошибка GStreamer" -#: ../src/common/jingle_rtp.py:220 +#: ../src/common/jingle_rtp.py:207 #, python-format msgid "" "Error: %s\n" @@ -5968,19 +5642,19 @@ msgstr "" "Ошибка: %s\n" "Отладка: %s" -#: ../src/common/jingle_rtp.py:354 +#: ../src/common/jingle_rtp.py:337 msgid "audio input" msgstr "звуковой вход" -#: ../src/common/jingle_rtp.py:357 +#: ../src/common/jingle_rtp.py:340 msgid "audio output" msgstr "звуковой выход" -#: ../src/common/jingle_rtp.py:412 +#: ../src/common/jingle_rtp.py:382 msgid "video input" msgstr "видео вход" -#: ../src/common/jingle_rtp.py:421 +#: ../src/common/jingle_rtp.py:391 msgid "video output" msgstr "видео выход" @@ -5989,89 +5663,87 @@ msgstr "видео выход" msgid "%s is not a valid loglevel" msgstr "%s не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым loglevel" -#: ../src/common/multimedia_helpers.py:41 +#: ../src/common/multimedia_helpers.py:39 msgid " Default device" msgstr "УÑтройÑтво по умолчанию" #. Test src -#: ../src/common/multimedia_helpers.py:62 +#: ../src/common/multimedia_helpers.py:60 msgid "Audio test" msgstr "ТеÑÑ‚ звука" #. Auto src #. Auto sink #. Auto src -#: ../src/common/multimedia_helpers.py:65 -#: ../src/common/multimedia_helpers.py:81 -#: ../src/common/multimedia_helpers.py:95 -#: ../src/common/multimedia_helpers.py:113 +#: ../src/common/multimedia_helpers.py:63 +#: ../src/common/multimedia_helpers.py:79 +#: ../src/common/multimedia_helpers.py:93 +#: ../src/common/multimedia_helpers.py:111 msgid "Autodetect" msgstr "Ðвтоопределение" #. Alsa src #. Alsa sink -#: ../src/common/multimedia_helpers.py:68 -#: ../src/common/multimedia_helpers.py:83 +#: ../src/common/multimedia_helpers.py:66 +#: ../src/common/multimedia_helpers.py:81 #, python-format msgid "ALSA: %s" msgstr "ALSA: %s" #. Pulseaudio src #. Pulseaudio sink -#: ../src/common/multimedia_helpers.py:71 -#: ../src/common/multimedia_helpers.py:85 +#: ../src/common/multimedia_helpers.py:69 +#: ../src/common/multimedia_helpers.py:83 #, fuzzy, python-format msgid "Pulse: %s" -msgstr "ПульÑ" +msgstr "Файл: %s" #. Fake sink -#: ../src/common/multimedia_helpers.py:79 +#. Fake video output +#: ../src/common/multimedia_helpers.py:77 +#: ../src/common/multimedia_helpers.py:105 msgid "Fake audio output" msgstr "Виртуальный аудио выход" #. Test src -#: ../src/common/multimedia_helpers.py:92 +#: ../src/common/multimedia_helpers.py:90 msgid "Video test" msgstr "ТеÑÑ‚ видео" #. V4L2 src -#: ../src/common/multimedia_helpers.py:97 +#: ../src/common/multimedia_helpers.py:95 #, python-format msgid "V4L2: %s" msgstr "V4L2: %s" #. Funny things, just to test... #. self.devices['GOOM'] = 'audiotestsrc ! goom' -#: ../src/common/multimedia_helpers.py:100 +#: ../src/common/multimedia_helpers.py:98 #, fuzzy msgid "Screen" -msgstr "Ðкран" - -#. Fake video output -#: ../src/common/multimedia_helpers.py:107 -#, fuzzy -msgid "Fake video output" -msgstr "УÑтройÑтво вывода изображениÑ" +msgstr "зеленый" -#: ../src/common/multimedia_helpers.py:110 +#: ../src/common/multimedia_helpers.py:108 #, python-format msgid "X Window System (X11/XShm/Xv): %s" msgstr "СиÑтема X Window (X11/XShm/Xv): %s" #. ximagesink -#: ../src/common/multimedia_helpers.py:112 +#: ../src/common/multimedia_helpers.py:110 msgid "X Window System (without Xv)" msgstr "СиÑтема X Window (без Xv)" #. we talk about a file #. we talk about file -#: ../src/common/optparser.py:53 ../src/gtkgui_helpers.py:203 +#: ../src/common/optparser.py:53 +#: ../src/gtkgui_helpers.py:203 #: ../src/gtkgui_helpers.py:219 #, python-format msgid "Error: cannot open %s for reading" msgstr "Ошибка: не могу открыть %s Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ" -#: ../src/common/optparser.py:304 ../src/common/optparser.py:305 +#: ../src/common/optparser.py:304 +#: ../src/common/optparser.py:305 msgid "cyan" msgstr "Ñиний" @@ -6496,7 +6168,8 @@ msgstr "Ланч" msgid "Exercising" msgstr "ЗанимаюÑÑŒ Ñпортом" -#: ../src/common/pep.py:133 ../src/common/pep.py:178 +#: ../src/common/pep.py:133 +#: ../src/common/pep.py:177 msgid "Cycling" msgstr "Ðа велоÑипеде" @@ -6597,224 +6270,221 @@ msgid "Relaxing" msgstr "Отдыхаю" #: ../src/common/pep.py:160 -msgid "Fishing" -msgstr "Рыбалка" - -#: ../src/common/pep.py:161 msgid "Gaming" msgstr "Играю" -#: ../src/common/pep.py:162 +#: ../src/common/pep.py:161 msgid "Going out" msgstr "Вышел" -#: ../src/common/pep.py:163 +#: ../src/common/pep.py:162 msgid "Partying" msgstr "Ðа вечеринке" -#: ../src/common/pep.py:164 +#: ../src/common/pep.py:163 msgid "Reading" msgstr "Читаю" -#: ../src/common/pep.py:165 +#: ../src/common/pep.py:164 msgid "Rehearsing" msgstr "РепетициÑ" -#: ../src/common/pep.py:166 +#: ../src/common/pep.py:165 msgid "Shopping" msgstr "Покупки" -#: ../src/common/pep.py:167 +#: ../src/common/pep.py:166 msgid "Smoking" msgstr "Курю" -#: ../src/common/pep.py:168 +#: ../src/common/pep.py:167 msgid "Socializing" msgstr "ОбщаюÑÑŒ" -#: ../src/common/pep.py:169 +#: ../src/common/pep.py:168 msgid "Sunbathing" msgstr "Загораю" -#: ../src/common/pep.py:170 +#: ../src/common/pep.py:169 msgid "Watching TV" msgstr "Смотрю ТВ" -#: ../src/common/pep.py:171 +#: ../src/common/pep.py:170 msgid "Watching a Movie" msgstr "Смотрю кино" -#: ../src/common/pep.py:172 +#: ../src/common/pep.py:171 msgid "Talking" msgstr "Разговариваю" -#: ../src/common/pep.py:173 +#: ../src/common/pep.py:172 msgid "In Real Life" msgstr "Ð’ реальной жизни" -#: ../src/common/pep.py:174 +#: ../src/common/pep.py:173 msgid "On the Phone" msgstr "Говорю по телефону" -#: ../src/common/pep.py:175 +#: ../src/common/pep.py:174 msgid "On Video Phone" msgstr "Говорю по видео телефону" -#: ../src/common/pep.py:176 +#: ../src/common/pep.py:175 msgid "Traveling" msgstr "ПутешеÑтвую" -#: ../src/common/pep.py:177 +#: ../src/common/pep.py:176 msgid "Commuting" msgstr "Еду Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹/на работу" -#: ../src/common/pep.py:179 +#: ../src/common/pep.py:178 msgid "Driving" msgstr "Вождение" -#: ../src/common/pep.py:180 +#: ../src/common/pep.py:179 msgid "In a Car" msgstr "Ð’ машине" -#: ../src/common/pep.py:181 +#: ../src/common/pep.py:180 msgid "On a Bus" msgstr "Ð’ автобуÑе" -#: ../src/common/pep.py:182 +#: ../src/common/pep.py:181 msgid "On a Plane" msgstr "Ð’ Ñамолёте" -#: ../src/common/pep.py:183 +#: ../src/common/pep.py:182 msgid "On a Train" msgstr "Ð’ поезде" -#: ../src/common/pep.py:184 +#: ../src/common/pep.py:183 msgid "On a Trip" msgstr "Ð’ поездке" -#: ../src/common/pep.py:185 +#: ../src/common/pep.py:184 msgid "Walking" msgstr "Прогулка" -#: ../src/common/pep.py:187 +#: ../src/common/pep.py:186 msgid "Coding" msgstr "Пишу программу" -#: ../src/common/pep.py:188 +#: ../src/common/pep.py:187 msgid "In a Meeting" msgstr "Ðа Ñовещании" -#: ../src/common/pep.py:189 +#: ../src/common/pep.py:188 msgid "Studying" msgstr "УчуÑÑŒ" -#: ../src/common/pep.py:190 +#: ../src/common/pep.py:189 msgid "Writing" msgstr "Пишу" -#: ../src/common/pep.py:195 -#, fuzzy +#: ../src/common/pep.py:194 msgid "accuracy" -msgstr "ТочноÑÑ‚ÑŒ значениÑ" +msgstr "" -#: ../src/common/pep.py:196 +#: ../src/common/pep.py:195 msgid "alt" msgstr "выÑота" -#: ../src/common/pep.py:197 +#: ../src/common/pep.py:196 msgid "area" msgstr "район" -#: ../src/common/pep.py:198 +#: ../src/common/pep.py:197 msgid "bearing" msgstr "направление" -#: ../src/common/pep.py:199 +#: ../src/common/pep.py:198 msgid "building" msgstr "Ñтроение" -#: ../src/common/pep.py:200 +#: ../src/common/pep.py:199 msgid "country" msgstr "Ñтрана" -#: ../src/common/pep.py:201 +#: ../src/common/pep.py:200 msgid "countrycode" msgstr "код Ñтраны" -#: ../src/common/pep.py:202 +#: ../src/common/pep.py:201 msgid "datum" msgstr "" -#: ../src/common/pep.py:203 +#: ../src/common/pep.py:202 msgid "description" msgstr "опиÑание" -#: ../src/common/pep.py:204 +#: ../src/common/pep.py:203 #, fuzzy msgid "error" -msgstr "error" +msgstr "Ошибка" -#: ../src/common/pep.py:205 +#: ../src/common/pep.py:204 msgid "floor" msgstr "Ñтаж" -#: ../src/common/pep.py:206 +#: ../src/common/pep.py:205 msgid "lat" msgstr "широта" -#: ../src/common/pep.py:207 +#: ../src/common/pep.py:206 msgid "locality" msgstr "наÑеленный пункт" -#: ../src/common/pep.py:208 +#: ../src/common/pep.py:207 msgid "lon" msgstr "долгота" -#: ../src/common/pep.py:209 +#: ../src/common/pep.py:208 msgid "postalcode" msgstr "индекÑ" -#: ../src/common/pep.py:210 +#: ../src/common/pep.py:209 msgid "region" msgstr "облаÑÑ‚ÑŒ" -#: ../src/common/pep.py:211 +#: ../src/common/pep.py:210 +#: ../src/gajim-remote.py:288 msgid "room" msgstr "комната" -#: ../src/common/pep.py:212 +#: ../src/common/pep.py:211 msgid "speed" msgstr "ÑкороÑÑ‚ÑŒ" -#: ../src/common/pep.py:213 +#: ../src/common/pep.py:212 msgid "street" msgstr "улица" -#: ../src/common/pep.py:214 +#: ../src/common/pep.py:213 msgid "text" msgstr "текÑÑ‚" -#: ../src/common/pep.py:215 +#: ../src/common/pep.py:214 msgid "timestamp" msgstr "Ð²Ñ€ÐµÐ¼Ñ ÑƒÑтановки" -#: ../src/common/pep.py:216 +#: ../src/common/pep.py:215 +#: ../src/gajim-remote.py:279 msgid "uri" msgstr "uri" -#: ../src/common/pep.py:349 +#: ../src/common/pep.py:357 msgid "Unknown Artist" msgstr "ÐеизвеÑтный иÑполнитель" -#: ../src/common/pep.py:352 +#: ../src/common/pep.py:360 msgid "Unknown Title" msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¿ÐµÑнÑ" -#: ../src/common/pep.py:355 +#: ../src/common/pep.py:363 msgid "Unknown Source" msgstr "ÐеизвеÑтный альбом" -#: ../src/common/pep.py:358 +#: ../src/common/pep.py:366 #, python-format msgid "" "<b>\"%(title)s\"</b> by <i>%(artist)s</i>\n" @@ -6824,13 +6494,9 @@ msgstr "" "из <i>%(source)s</i>" #. we're not english -#: ../src/common/stanza_session.py:425 -msgid "" -"[This is part of an encrypted session. If you see this message, something " -"went wrong.]" -msgstr "" -"[Ðто чаÑÑ‚ÑŒ зашифрованного ÑообщениÑ. ЕÑли вы видите Ñто Ñообщение, возможно, " -"произошла ошибка.]" +#: ../src/common/stanza_session.py:424 +msgid "[This is part of an encrypted session. If you see this message, something went wrong.]" +msgstr "[Ðто чаÑÑ‚ÑŒ зашифрованного ÑообщениÑ. ЕÑли вы видите Ñто Ñообщение, возможно, произошла ошибка.]" #: ../src/common/zeroconf/connection_zeroconf.py:193 msgid "Avahi error" @@ -6875,17 +6541,18 @@ msgstr "УдоÑтоверьтеÑÑŒ, что демон avahi запущен." msgid "Could not change status of account \"%s\"" msgstr "Ðе могу изменить ÑÑ‚Ð°Ñ‚ÑƒÑ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи «%s»" -#: ../src/common/zeroconf/connection_zeroconf.py:353 +#: ../src/common/zeroconf/connection_zeroconf.py:352 +#: ../src/common/zeroconf/connection_zeroconf.py:393 msgid "Your message could not be sent." msgstr "Ваше Ñообщение не может быть отправлено." -#: ../src/common/zeroconf/connection_zeroconf.py:367 +#: ../src/common/zeroconf/connection_zeroconf.py:366 +#: ../src/common/zeroconf/connection_zeroconf.py:407 msgid "Contact is offline. Your message could not be sent." msgstr "Контакт не в Ñети. Отправить Ñообщение не удалоÑÑŒ." -#: ../src/common/zeroconf/connection_zeroconf.py:394 -msgid "" -"Connection to host could not be established: Timeout while sending data." +#: ../src/common/zeroconf/connection_zeroconf.py:434 +msgid "Connection to host could not be established: Timeout while sending data." msgstr "Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ Ñ…Ð¾Ñтом: иÑтекло Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ." #: ../src/common/zeroconf/zeroconf_avahi.py:192 @@ -6894,243 +6561,251 @@ msgstr "Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ Ñ…Ð¾Ñтом: иÑтекл msgid "Error while adding service. %s" msgstr "Ошибка при добавлении Ñлужбы. %s" -#: ../src/config.py:404 +#: ../src/config.py:409 msgid "Default Message" msgstr "Сообщение по умолчанию" -#: ../src/config.py:413 +#: ../src/config.py:418 msgid "Enabled" msgstr "Включено" -#: ../src/config.py:468 ../src/config.py:472 ../src/config.py:3185 +#: ../src/config.py:473 +#: ../src/config.py:477 +#: ../src/config.py:3154 msgid "Default" msgstr "По умолчанию" -#: ../src/config.py:747 ../src/dialogs.py:1499 +#: ../src/config.py:759 +#: ../src/dialogs.py:1495 #, python-format msgid "Dictionary for lang %s not available" msgstr "Ðет ÑÐ»Ð¾Ð²Ð°Ñ€Ñ Ð´Ð»Ñ Ñзыка %s" -#: ../src/config.py:748 +#: ../src/config.py:760 #, python-format -msgid "" -"You have to install %s dictionary to use spellchecking, or choose another " -"language by setting the speller_language option." -msgstr "" -"Чтобы воÑпользоватьÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¾Ð¹ правопиÑаниÑ, уÑтановите Ñловарь Ð´Ð»Ñ Ñзыка " -"%s или выберите другой Ñзык, иÑправив наÑтройку speller_language." +msgid "You have to install %s dictionary to use spellchecking, or choose another language by setting the speller_language option." +msgstr "Чтобы воÑпользоватьÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¾Ð¹ правопиÑаниÑ, уÑтановите Ñловарь Ð´Ð»Ñ Ñзыка %s или выберите другой Ñзык, иÑправив наÑтройку speller_language." -#: ../src/config.py:1226 +#: ../src/config.py:1227 msgid "status message title" msgstr "заголовок ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑтатуÑе" -#: ../src/config.py:1226 +#: ../src/config.py:1227 msgid "status message text" msgstr "текÑÑ‚ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑтатуÑе" #. Name column -#: ../src/config.py:1553 ../src/dialogs.py:2673 ../src/dialogs.py:2740 -#: ../src/dialogs.py:3535 ../src/disco.py:889 ../src/disco.py:1787 -#: ../src/disco.py:2089 ../src/history_window.py:92 +#: ../src/config.py:1554 +#: ../src/dialogs.py:2574 +#: ../src/dialogs.py:2641 +#: ../src/dialogs.py:3437 +#: ../src/disco.py:885 +#: ../src/disco.py:1743 +#: ../src/disco.py:2045 +#: ../src/history_window.py:91 msgid "Name" msgstr "ИмÑ" -#: ../src/config.py:1656 +#: ../src/config.py:1654 msgid "Relogin now?" msgstr "ПереподключитьÑÑ ÑейчаÑ?" -#: ../src/config.py:1657 +#: ../src/config.py:1655 msgid "If you want all the changes to apply instantly, you must relogin." -msgstr "" -"ЕÑли вы хотите, чтобы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ применены немедленно, вы должны " -"переподключитьÑÑ." +msgstr "ЕÑли вы хотите, чтобы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ применены немедленно, вы должны переподключитьÑÑ." -#: ../src/config.py:1814 ../src/config.py:1949 +#: ../src/config.py:1809 +#: ../src/config.py:1942 msgid "OpenPGP is not usable on this computer" msgstr "Ðевозможно иÑпользовать OpenPGP на Ñтом компьютере" -#: ../src/config.py:1990 ../src/config.py:2039 +#: ../src/config.py:1982 +#: ../src/config.py:2029 msgid "Unread events" msgstr "ÐепроÑмотренные ÑобытиÑ" -#: ../src/config.py:1991 +#: ../src/config.py:1983 msgid "Read all pending events before removing this account." msgstr "ПроÑмотрите вÑе ожидающие ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´ удалением учетной запиÑи." -#: ../src/config.py:2021 +#: ../src/config.py:2012 #, python-format msgid "You have opened chat in account %s" msgstr "У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ окна чата под учётной запиÑью %s" -#: ../src/config.py:2022 +#: ../src/config.py:2013 msgid "All chat and groupchat windows will be closed. Do you want to continue?" msgstr "Ð’Ñе окна чатов и комнат будут закрыты. Продолжить?" -#: ../src/config.py:2034 ../src/config.py:2596 ../src/config.py:2634 +#: ../src/config.py:2025 +#: ../src/config.py:2570 +#: ../src/config.py:2607 msgid "You are currently connected to the server" msgstr "Ð’Ñ‹ ÑÐµÐ¹Ñ‡Ð°Ñ Ð¿Ð¾Ð´Ñоединены к Ñерверу" -#: ../src/config.py:2035 +#: ../src/config.py:2026 msgid "To change the account name, you must be disconnected." msgstr "Ð”Ð»Ñ Ñмены имени учетной запиÑи необходимо отключитьÑÑ." -#: ../src/config.py:2040 +#: ../src/config.py:2030 msgid "To change the account name, you must read all pending events." -msgstr "" -"Ð”Ð»Ñ Ñмены имени учетной запиÑи необходимо проÑмотреть ожидающие ÑобытиÑ." +msgstr "Ð”Ð»Ñ Ñмены имени учетной запиÑи необходимо проÑмотреть ожидающие ÑобытиÑ." -#: ../src/config.py:2046 +#: ../src/config.py:2036 msgid "Account Name Already Used" msgstr "Такое Ð¸Ð¼Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи уже иÑпользуетÑÑ" -#: ../src/config.py:2047 -msgid "" -"This name is already used by another of your accounts. Please choose another " -"name." -msgstr "" -"Ðто Ð¸Ð¼Ñ ÑƒÐ¶Ðµ иÑпользуетÑÑ Ð² другой вашей учетной запиÑи. Выберите другое." +#: ../src/config.py:2037 +msgid "This name is already used by another of your accounts. Please choose another name." +msgstr "Ðто Ð¸Ð¼Ñ ÑƒÐ¶Ðµ иÑпользуетÑÑ Ð² другой вашей учетной запиÑи. Выберите другое." -#: ../src/config.py:2051 ../src/config.py:2056 +#: ../src/config.py:2041 +#: ../src/config.py:2045 msgid "Invalid account name" msgstr "Ðеверное Ð¸Ð¼Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи" -#: ../src/config.py:2052 +#: ../src/config.py:2042 msgid "Account name cannot be empty." msgstr "Ð˜Ð¼Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи не может быть пуÑтым." -#: ../src/config.py:2057 +#: ../src/config.py:2046 msgid "Account name cannot contain spaces." msgstr "Ð˜Ð¼Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи не может Ñодержать пробелы." -#: ../src/config.py:2138 +#: ../src/config.py:2123 msgid "Rename Account" msgstr "Переименовать учетную запиÑÑŒ" -#: ../src/config.py:2139 +#: ../src/config.py:2124 #, python-format msgid "Enter a new name for account %s" msgstr "Введите новое название Ð´Ð»Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи %s" -#: ../src/config.py:2168 +#: ../src/config.py:2152 msgid "A Jabber ID must be in the form \"user@servername\"." msgstr "Jabber ID должен иметь формат «имÑ_пользователÑ@Ñервер»." -#: ../src/config.py:2394 ../src/config.py:3726 +#: ../src/config.py:2375 +#: ../src/config.py:3708 msgid "Invalid entry" msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ" -#: ../src/config.py:2395 ../src/config.py:3727 +#: ../src/config.py:2376 +#: ../src/config.py:3709 msgid "Custom port must be a port number." msgstr "Ð’ качеÑтве номера порта должно выÑтупать чиÑло" -#: ../src/config.py:2417 +#: ../src/config.py:2397 msgid "Failed to get secret keys" msgstr "Ðе удалоÑÑŒ получить Ñекретный ключ" -#: ../src/config.py:2418 +#: ../src/config.py:2398 msgid "There is no OpenPGP secret key available." msgstr "Ðет Ñекретного ключа OpenPGP." -#: ../src/config.py:2456 +#: ../src/config.py:2432 msgid "OpenPGP Key Selection" msgstr "Выбор ключа OpenPGP" -#: ../src/config.py:2457 +#: ../src/config.py:2433 msgid "Choose your OpenPGP key" msgstr "Выберите Ñвой ключ OpenPGP" -#: ../src/config.py:2465 +#: ../src/config.py:2441 msgid "No such account available" msgstr "Ð¢Ð°ÐºÐ°Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ недоÑтупна" -#: ../src/config.py:2466 +#: ../src/config.py:2442 msgid "You must create your account before editing your personal information." -msgstr "" -"Перед редактированием личных данных необходимо Ñначала Ñоздать учетную " -"запиÑÑŒ." - -#: ../src/config.py:2473 ../src/dialogs.py:2369 ../src/dialogs.py:2662 -#: ../src/dialogs.py:2850 ../src/disco.py:516 ../src/profile_window.py:371 +msgstr "Перед редактированием личных данных необходимо Ñначала Ñоздать учетную запиÑÑŒ." + +#: ../src/config.py:2449 +#: ../src/dialogs.py:2325 +#: ../src/dialogs.py:2563 +#: ../src/dialogs.py:2751 +#: ../src/disco.py:515 +#: ../src/profile_window.py:369 msgid "You are not connected to the server" msgstr "Ð’Ñ‹ не подключены к Ñерверу" -#: ../src/config.py:2474 +#: ../src/config.py:2450 msgid "Without a connection, you can not edit your personal information." msgstr "Чтобы отредактировать личную информацию, нужно подключитьÑÑ Ðº Ñерверу." -#: ../src/config.py:2479 -#, fuzzy -msgid "Your server doesn't support vCard" +#: ../src/config.py:2454 +msgid "Your server doesn't support Vcard" msgstr "Сервер не поддерживает Vcard" -#: ../src/config.py:2480 +#: ../src/config.py:2455 msgid "Your server can't save your personal information." msgstr "Ваш Ñервер не может хранить личную информацию." -#: ../src/config.py:2597 ../src/config.py:2635 +#: ../src/config.py:2571 +#: ../src/config.py:2608 msgid "To disable the account, you must be disconnected." -msgstr "" -"Чтобы отключить Ñту учетную запиÑÑŒ, необходимо отÑоединитьÑÑ Ð¾Ñ‚ Ñервера." +msgstr "Чтобы отключить Ñту учетную запиÑÑŒ, необходимо отÑоединитьÑÑ Ð¾Ñ‚ Ñервера." -#: ../src/config.py:2604 +#: ../src/config.py:2577 msgid "Account Local already exists." msgstr "Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Local уже ÑущеÑтвует." -#: ../src/config.py:2605 +#: ../src/config.py:2578 msgid "Please rename or remove it before enabling link-local messaging." msgstr "Переименуйте или удалите её, прежде чем включать локальные ÑообщениÑ." -#: ../src/config.py:2766 +#: ../src/config.py:2735 #, python-format msgid "Edit %s" msgstr "Править %s" -#: ../src/config.py:2768 +#: ../src/config.py:2737 #, python-format msgid "Register to %s" msgstr "ЗарегиÑтрировать %s" #. list at the beginning -#: ../src/config.py:2804 +#: ../src/config.py:2773 msgid "Ban List" msgstr "Черный ÑпиÑок" -#: ../src/config.py:2805 +#: ../src/config.py:2774 msgid "Member List" msgstr "СпиÑок учаÑтников" -#: ../src/config.py:2805 +#: ../src/config.py:2774 msgid "Owner List" msgstr "СпиÑок владельцев" -#: ../src/config.py:2806 +#: ../src/config.py:2775 msgid "Administrator List" msgstr "СпиÑок админиÑтраторов" #. Address column #. holds JID (who said this) -#: ../src/config.py:2870 ../src/disco.py:896 ../src/history_manager.py:217 +#: ../src/config.py:2839 +#: ../src/disco.py:892 +#: ../src/history_manager.py:207 msgid "JID" msgstr "JID" -#: ../src/config.py:2880 +#: ../src/config.py:2849 msgid "Reason" msgstr "Причина" -#: ../src/config.py:2887 +#: ../src/config.py:2856 msgid "Nick" msgstr "Ðик" -#: ../src/config.py:2893 +#: ../src/config.py:2862 msgid "Role" msgstr "ОбÑзанноÑÑ‚ÑŒ" -#: ../src/config.py:2920 +#: ../src/config.py:2889 msgid "Banning..." msgstr "Баню..." #. You can move '\n' before user@domain if that line is TOO BIG -#: ../src/config.py:2922 +#: ../src/config.py:2891 msgid "" "<b>Whom do you want to ban?</b>\n" "\n" @@ -7138,11 +6813,11 @@ msgstr "" "<b>Кого вы хотите забанить?</b>\n" "\n" -#: ../src/config.py:2924 +#: ../src/config.py:2893 msgid "Adding Member..." msgstr "ДобавлÑÑŽ учаÑтника..." -#: ../src/config.py:2925 +#: ../src/config.py:2894 msgid "" "<b>Whom do you want to make a member?</b>\n" "\n" @@ -7150,11 +6825,11 @@ msgstr "" "<b>Кого вы хотите Ñделать учаÑтником?</b>\n" "\n" -#: ../src/config.py:2927 +#: ../src/config.py:2896 msgid "Adding Owner..." msgstr "ДобавлÑÑŽ владельца..." -#: ../src/config.py:2928 +#: ../src/config.py:2897 msgid "" "<b>Whom do you want to make an owner?</b>\n" "\n" @@ -7162,11 +6837,11 @@ msgstr "" "<b>Кого вы хотите Ñделать владельцем?</b>\n" "\n" -#: ../src/config.py:2930 +#: ../src/config.py:2899 msgid "Adding Administrator..." msgstr "ДобавлÑÑŽ админиÑтратора..." -#: ../src/config.py:2931 +#: ../src/config.py:2900 msgid "" "<b>Whom do you want to make an administrator?</b>\n" "\n" @@ -7174,7 +6849,7 @@ msgstr "" "<b>Кого вы хотите Ñделать админиÑтратором?</b>\n" "\n" -#: ../src/config.py:2932 +#: ../src/config.py:2901 msgid "" "Can be one of the following:\n" "1. user@domain/resource (only that resource matches).\n" @@ -7190,141 +6865,142 @@ msgstr "" "4. domain (Ñам домен, Ñ‚.е. как любое Ñочетание user@domain,\n" "domain/resource, так и адреÑ, Ñодержащий Ñтот поддомен)" -#: ../src/config.py:3033 +#: ../src/config.py:3002 #, python-format msgid "Removing %s account" msgstr "Удаление учетной запиÑи %s" -#: ../src/config.py:3048 +#: ../src/config.py:3017 msgid "Account is disabled" msgstr "Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ отключена" -#: ../src/config.py:3049 +#: ../src/config.py:3018 msgid "To unregister from a server, account must be enabled." -msgstr "" -"Ð”Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ€ÐµÐ³Ð¸Ñтрации Ñ Ñервера, ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ должна быть активна." +msgstr "Ð”Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ€ÐµÐ³Ð¸Ñтрации Ñ Ñервера, ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ должна быть активна." -#: ../src/config.py:3062 ../src/gui_interface.py:286 -#: ../src/gui_interface.py:734 +#: ../src/config.py:3031 +#: ../src/gui_interface.py:285 +#: ../src/gui_interface.py:732 msgid "Password Required" msgstr "ТребуетÑÑ Ð¿Ð°Ñ€Ð¾Ð»ÑŒ" -#: ../src/config.py:3063 ../src/gui_interface.py:714 +#: ../src/config.py:3032 +#: ../src/gui_interface.py:712 #, python-format msgid "Enter your password for account %s" msgstr "Введите пароль Ð´Ð»Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи %s" -#: ../src/config.py:3064 ../src/gui_interface.py:734 +#: ../src/config.py:3033 +#: ../src/gui_interface.py:732 msgid "Save password" msgstr "Сохранить пароль" -#: ../src/config.py:3074 +#: ../src/config.py:3043 #, python-format msgid "Account \"%s\" is connected to the server" msgstr "Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ «%s» подключена к Ñерверу" -#: ../src/config.py:3075 +#: ../src/config.py:3044 msgid "If you remove it, the connection will be lost." msgstr "ЕÑли вы удалите его, произойдет отключение." -#: ../src/config.py:3089 +#: ../src/config.py:3058 #, python-format msgid "Connection to server %s failed" msgstr "Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ Ñервером %s" -#: ../src/config.py:3090 +#: ../src/config.py:3059 msgid "What would you like to do?" msgstr "Что вы хотите Ñделать?" -#: ../src/config.py:3091 +#: ../src/config.py:3060 msgid "Remove only from Gajim" msgstr "Удалить только из Gajim" -#: ../src/config.py:3092 +#: ../src/config.py:3061 msgid "Don't remove anything. I'll try again later" msgstr "Ðичего не удалÑÑ‚ÑŒ. Я попробую позже." -#: ../src/config.py:3185 +#: ../src/config.py:3154 msgid "?print_status:All" msgstr "?print_status:Ð’Ñе" -#: ../src/config.py:3186 +#: ../src/config.py:3155 msgid "Enter and leave only" msgstr "Только приход и уход" -#: ../src/config.py:3187 +#: ../src/config.py:3156 msgid "?print_status:None" msgstr "?print_status:Ðет" -#: ../src/config.py:3246 +#: ../src/config.py:3228 msgid "New Group Chat" msgstr "ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¼Ð½Ð°Ñ‚Ð°" -#: ../src/config.py:3279 +#: ../src/config.py:3261 msgid "This bookmark has invalid data" msgstr "Ðта закладка Ñодержит неверные данные" -#: ../src/config.py:3280 -msgid "" -"Please be sure to fill out server and room fields or remove this bookmark." -msgstr "" -"УдоÑтоверьтеÑÑŒ, что заполнены Ð¿Ð¾Ð»Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ñервера и комнаты, либо удалите " -"Ñту закладку." +#: ../src/config.py:3262 +msgid "Please be sure to fill out server and room fields or remove this bookmark." +msgstr "УдоÑтоверьтеÑÑŒ, что заполнены Ð¿Ð¾Ð»Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ñервера и комнаты, либо удалите Ñту закладку." -#: ../src/config.py:3406 ../src/config.py:3417 ../src/config.py:3426 -#: ../src/config.py:3437 ../src/config.py:3445 +#: ../src/config.py:3388 +#: ../src/config.py:3399 +#: ../src/config.py:3408 +#: ../src/config.py:3419 +#: ../src/config.py:3427 msgid "Character not allowed" msgstr "Символ недопуÑтим" -#: ../src/config.py:3417 ../src/config.py:3425 ../src/config.py:3437 -#: ../src/config.py:3702 +#: ../src/config.py:3399 +#: ../src/config.py:3407 +#: ../src/config.py:3419 +#: ../src/config.py:3684 msgid "Invalid server" msgstr "Ðеверный Ñервер" -#: ../src/config.py:3444 +#: ../src/config.py:3426 msgid "Invalid room" msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð½Ð°Ñ‚Ð°" -#: ../src/config.py:3614 +#: ../src/config.py:3596 msgid "Account has been added successfully" msgstr "Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ уÑпешно добавлена" -#: ../src/config.py:3615 ../src/config.py:3621 -msgid "" -"You can set advanced account options by pressing the Advanced button, or " -"later by choosing the Accounts menu item under the Edit menu from the main " -"window." -msgstr "" -"Ð’Ñ‹ можете уÑтановить раÑширенные наÑтройки учетной запиÑи нажатием кнопки " -"«Дополнительно», или Ñделать Ñто позже поÑредÑтвом пункта «Учетные запиÑи» " -"меню «Правка» в главном окне программы." +#: ../src/config.py:3597 +#: ../src/config.py:3603 +msgid "You can set advanced account options by pressing the Advanced button, or later by choosing the Accounts menu item under the Edit menu from the main window." +msgstr "Ð’Ñ‹ можете уÑтановить раÑширенные наÑтройки учетной запиÑи нажатием кнопки «Дополнительно», или Ñделать Ñто позже поÑредÑтвом пункта «Учетные запиÑи» меню «Правка» в главном окне программы." -#: ../src/config.py:3620 +#: ../src/config.py:3602 msgid "Your new account has been created successfully" msgstr "Ваша Ð½Ð¾Ð²Ð°Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ уÑпешно Ñоздана" -#: ../src/config.py:3659 +#: ../src/config.py:3641 msgid "Invalid username" msgstr "Ðеверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" -#: ../src/config.py:3661 +#: ../src/config.py:3643 msgid "You must provide a username to configure this account." msgstr "Ð”Ð»Ñ Ð½Ð°Ñтройки учетной запиÑи необходимо ввеÑти Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ." -#: ../src/config.py:3703 +#: ../src/config.py:3685 msgid "Please provide a server on which you want to register." msgstr "Укажите Ñервер, на котором вы хотите зарегиÑтрироватьÑÑ." -#: ../src/config.py:3759 ../src/gui_interface.py:1313 +#: ../src/config.py:3741 +#: ../src/gui_interface.py:1303 msgid "Certificate Already in File" msgstr "Сертификат уже находитÑÑ Ð² файле" -#: ../src/config.py:3760 ../src/gui_interface.py:1314 +#: ../src/config.py:3742 +#: ../src/gui_interface.py:1304 #, python-format msgid "This certificate is already in file %s, so it's not added again." msgstr "Ðтот Ñертификат уже еÑÑ‚ÑŒ в файле %s, поÑтому он не был добавлен." -#: ../src/config.py:3850 +#: ../src/config.py:3830 #, python-format msgid "" "<b>Security Warning</b>\n" @@ -7339,7 +7015,8 @@ msgstr "" "Ошибка SSL: %(error)s\n" "СоединитьÑÑ Ñ Ñтим Ñервером?" -#: ../src/config.py:3856 ../src/gui_interface.py:1342 +#: ../src/config.py:3836 +#: ../src/gui_interface.py:1332 #, python-format msgid "" "Add this certificate to the list of trusted certificates.\n" @@ -7350,89 +7027,84 @@ msgstr "" "Отпечаток SHA1 Ñертификата:\n" "%s" -#: ../src/config.py:3888 ../src/config.py:3922 +#: ../src/config.py:3868 +#: ../src/config.py:3902 msgid "An error occurred during account creation" msgstr "Произошла ошибка при Ñоздании учетной запиÑи" -#: ../src/config.py:3987 +#: ../src/config.py:3967 msgid "Account name is in use" msgstr "Такое Ð¸Ð¼Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи уже иÑпользуетÑÑ" -#: ../src/config.py:3988 +#: ../src/config.py:3968 msgid "You already have an account using this name." msgstr "У Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем." -#: ../src/config.py:4118 +#: ../src/config.py:4098 msgid "PEP node was not removed" msgstr "PEP узел не был удален" -#: ../src/config.py:4119 +#: ../src/config.py:4099 #, python-format msgid "PEP node %(node)s was not removed: %(message)s" msgstr "PEP узел %(node)s не был удален: %(message)s" -#: ../src/config.py:4147 +#: ../src/config.py:4127 #, python-format msgid "Configure %s" msgstr "ÐаÑтроить %s" -#: ../src/config.py:4163 ../src/plugins/gui.py:92 +#: ../src/config.py:4143 +#: ../src/plugins/gui.py:88 msgid "Active" msgstr "Ðктивен" -#: ../src/config.py:4171 +#: ../src/config.py:4151 msgid "Event" msgstr "Событие" -#: ../src/config.py:4205 +#: ../src/config.py:4185 #, fuzzy msgid "Attention Message Received" msgstr "Получено первое Ñообщение" -#: ../src/config.py:4206 +#: ../src/config.py:4186 msgid "First Message Received" msgstr "Получено первое Ñообщение" -#: ../src/config.py:4207 +#: ../src/config.py:4187 msgid "Next Message Received Focused" msgstr "Следующее Ñообщение получено в окне Ñ Ñ„Ð¾ÐºÑƒÑом" -#: ../src/config.py:4209 +#: ../src/config.py:4189 msgid "Next Message Received Unfocused" msgstr "Следующее Ñообщение получено в окне без фокуÑа" -#: ../src/config.py:4210 +#: ../src/config.py:4190 msgid "Contact Connected" msgstr "Контакт подключилÑÑ" -#: ../src/config.py:4211 +#: ../src/config.py:4191 msgid "Contact Disconnected" msgstr "Контакт отключилÑÑ" -#: ../src/config.py:4212 +#: ../src/config.py:4192 msgid "Message Sent" msgstr "Сообщение отправлено" -#: ../src/config.py:4213 +#: ../src/config.py:4193 msgid "Group Chat Message Highlight" msgstr "Ð’Ð°Ñ ÑƒÐ¿Ð¾Ð¼Ñнули в комнате" -#: ../src/config.py:4214 +#: ../src/config.py:4194 msgid "Group Chat Message Received" msgstr "Получено Ñообщение в комнате" -#: ../src/config.py:4215 +#: ../src/config.py:4195 msgid "GMail Email Received" msgstr "Получено пиÑьмо на Gmail" -#: ../src/conversation_textview.py:474 ../src/conversation_textview.py:492 -#, fuzzy, python-format -msgid "" -"<b>Message was corrected. Last message was:</b>\n" -" %s" -msgstr "С момента поÑледней отправки ÑообщениÑ" - -#: ../src/conversation_textview.py:645 +#: ../src/conversation_textview.py:602 msgid "" "This icon indicates that this message has not yet\n" "been received by the remote end. If this icon stays\n" @@ -7442,7 +7114,7 @@ msgstr "" "ЕÑли иконка не пропадает долгое времÑ,\n" "Ñто означает, что Ñообщение потерÑно." -#: ../src/conversation_textview.py:664 +#: ../src/conversation_textview.py:621 msgid "" "Text below this line is what has been said since the\n" "last time you paid attention to this group chat" @@ -7450,44 +7122,44 @@ msgstr "" "ТекÑÑ‚ под Ñтой линией был Ñказан поÑле того,\n" "как вы поÑледний раз заглÑдывали в Ñту комнату" -#: ../src/conversation_textview.py:784 +#: ../src/conversation_textview.py:741 msgid "_Quote" msgstr "_Цитировать" -#: ../src/conversation_textview.py:791 +#: ../src/conversation_textview.py:748 #, python-format msgid "_Actions for \"%s\"" msgstr "_ДейÑÑ‚Ð²Ð¸Ñ Ð´Ð»Ñ Â«%s»" -#: ../src/conversation_textview.py:804 +#: ../src/conversation_textview.py:761 msgid "Read _Wikipedia Article" msgstr "Смотреть Ñтатью в _Wikipedia" -#: ../src/conversation_textview.py:809 +#: ../src/conversation_textview.py:766 msgid "Look it up in _Dictionary" msgstr "ИÑкать в _Ñловаре" -#: ../src/conversation_textview.py:826 +#: ../src/conversation_textview.py:783 #, 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:839 +#: ../src/conversation_textview.py:796 #, python-format msgid "Web Search URL is missing an \"%s\"" msgstr "Ð’ URL Web-поиÑка отÑутÑтвует «%s»" -#: ../src/conversation_textview.py:842 +#: ../src/conversation_textview.py:799 msgid "Web _Search for it" msgstr "_ПоиÑк по Web" -#: ../src/conversation_textview.py:848 +#: ../src/conversation_textview.py:805 msgid "Open as _Link" msgstr "Открыть как _ÑÑылку" #. %i is day in year (1-365) -#: ../src/conversation_textview.py:1377 +#: ../src/conversation_textview.py:1302 #, python-format msgid "Yesterday" msgid_plural "%(nb_days)i days ago" @@ -7496,7 +7168,8 @@ msgstr[1] "%(nb_days)i Ð´Ð½Ñ Ð½Ð°Ð·Ð°Ð´" msgstr[2] "%(nb_days)i дней назад" #. if we have subject, show it too! -#: ../src/conversation_textview.py:1427 ../src/history_window.py:488 +#: ../src/conversation_textview.py:1351 +#: ../src/history_window.py:481 #, python-format msgid "Subject: %s\n" msgstr "Тема: %s\n" @@ -7527,155 +7200,158 @@ msgstr "Jabber ID, который вы ввели, уже ÑущеÑтвует. msgid "new@jabber.id" msgstr "new@jabber.id" -#: ../src/dataforms_widget.py:652 ../src/dataforms_widget.py:654 +#: ../src/dataforms_widget.py:652 +#: ../src/dataforms_widget.py:654 #, python-format msgid "new%d@jabber.id" msgstr "new%d@jabber.id" -#: ../src/dialogs.py:84 +#: ../src/dialogs.py:82 #, python-format msgid "Contact name: <i>%s</i>" msgstr "Ð˜Ð¼Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð°: <i>%s</i>" -#: ../src/dialogs.py:86 +#: ../src/dialogs.py:84 #, python-format msgid "Jabber ID: <i>%s</i>" msgstr "Jabber ID: <i>%s</i>" -#: ../src/dialogs.py:200 +#: ../src/dialogs.py:198 msgid "Group" msgstr "Группа" -#: ../src/dialogs.py:207 +#: ../src/dialogs.py:205 msgid "In the group" msgstr "Ð’ группе" -#: ../src/dialogs.py:299 +#: ../src/dialogs.py:297 msgid "KeyID" msgstr "KeyID" -#: ../src/dialogs.py:304 +#: ../src/dialogs.py:302 msgid "Contact name" msgstr "Ð˜Ð¼Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð°" -#: ../src/dialogs.py:479 +#: ../src/dialogs.py:477 msgid "Set Mood" msgstr "УÑтановить наÑтроение" -#: ../src/dialogs.py:599 +#: ../src/dialogs.py:597 #, python-format msgid "%s Status Message" msgstr "Сообщение о ÑтатуÑе %s" -#: ../src/dialogs.py:613 +#: ../src/dialogs.py:611 msgid "Status Message" msgstr "Сообщение о ÑтатуÑе" -#: ../src/dialogs.py:804 +#: ../src/dialogs.py:802 msgid "Overwrite Status Message?" msgstr "Изменить Ñообщение о ÑтатуÑе?" -#: ../src/dialogs.py:805 -msgid "" -"This name is already used. Do you want to overwrite this status message?" +#: ../src/dialogs.py:803 +msgid "This name is already used. Do you want to overwrite this status message?" msgstr "Ðто Ð¸Ð¼Ñ ÑƒÐ¶Ðµ иÑпользуетÑÑ. ПерезапиÑать Ñто Ñообщение о ÑтатуÑе?" -#: ../src/dialogs.py:813 +#: ../src/dialogs.py:811 msgid "Save as Preset Status Message" msgstr "Сохранить уÑтановленное Ñообщение о ÑтатуÑе" -#: ../src/dialogs.py:814 +#: ../src/dialogs.py:812 msgid "Please type a name for this status message" msgstr "Введите Ð¸Ð¼Ñ Ð´Ð»Ñ Ñтого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ÑтатуÑе" -#: ../src/dialogs.py:842 +#: ../src/dialogs.py:840 msgid "AIM Address:" msgstr "ÐÐ´Ñ€ÐµÑ AIM:" -#: ../src/dialogs.py:843 +#: ../src/dialogs.py:841 msgid "GG Number:" msgstr "Ðомер GaduGadu" -#: ../src/dialogs.py:844 +#: ../src/dialogs.py:842 msgid "ICQ Number:" msgstr "Ðомер ICQ:" -#: ../src/dialogs.py:845 +#: ../src/dialogs.py:843 msgid "MSN Address:" msgstr "ÐÐ´Ñ€ÐµÑ Ð² MSN:" -#: ../src/dialogs.py:846 +#: ../src/dialogs.py:844 msgid "Yahoo! Address:" msgstr "ÐÐ´Ñ€ÐµÑ Yahoo:" -#: ../src/dialogs.py:883 +#: ../src/dialogs.py:881 #, python-format msgid "Please fill in the data of the contact you want to add in account %s" msgstr "" "Заполните данные о контакте,\n" "который хотите добавить в роÑтер учетной запиÑи %s" -#: ../src/dialogs.py:886 +#: ../src/dialogs.py:884 msgid "Please fill in the data of the contact you want to add" msgstr "Заполните данные о контакте, который вы хотите добавить" -#: ../src/dialogs.py:1080 ../src/dialogs.py:1086 ../src/dialogs.py:1091 -#: ../src/dialogs.py:3770 +#: ../src/dialogs.py:1076 +#: ../src/dialogs.py:1082 +#: ../src/dialogs.py:1087 +#: ../src/dialogs.py:3672 msgid "Invalid User ID" msgstr "Ðеверный ID пользователÑ" -#: ../src/dialogs.py:1087 +#: ../src/dialogs.py:1083 msgid "The user ID must not contain a resource." msgstr "ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ должен Ñодержать реÑурÑ." -#: ../src/dialogs.py:1092 +#: ../src/dialogs.py:1088 msgid "You cannot add yourself to your roster." msgstr "Ð’Ñ‹ не можете добавлÑÑ‚ÑŒ ÑÐµÐ±Ñ Ð² Ñвой роÑтер." -#: ../src/dialogs.py:1106 +#: ../src/dialogs.py:1102 msgid "Contact already in roster" msgstr "Контакт уже в роÑтере" -#: ../src/dialogs.py:1107 +#: ../src/dialogs.py:1103 msgid "This contact is already listed in your roster." msgstr "Ðтот контакт уже ÑодержитÑÑ Ð² вашем роÑтере." -#: ../src/dialogs.py:1160 ../src/dialogs.py:1194 +#: ../src/dialogs.py:1156 +#: ../src/dialogs.py:1190 msgid "User ID:" msgstr "ID пользователÑ:" -#: ../src/dialogs.py:1279 +#: ../src/dialogs.py:1275 msgid "A GTK+ Jabber/XMPP client" msgstr "Jabber/XMPP-клиент на GTK+" -#: ../src/dialogs.py:1280 +#: ../src/dialogs.py:1276 msgid "GTK+ Version:" msgstr "ВерÑÐ¸Ñ GTK+:" -#: ../src/dialogs.py:1281 +#: ../src/dialogs.py:1277 msgid "PyGTK Version:" msgstr "ВерÑÐ¸Ñ PyGTK:" -#: ../src/dialogs.py:1291 +#: ../src/dialogs.py:1287 msgid "Current Developers:" msgstr "Разработчики:" -#: ../src/dialogs.py:1293 +#: ../src/dialogs.py:1289 msgid "Past Developers:" msgstr "Разработчики прошлых верÑий:" -#: ../src/dialogs.py:1299 +#: ../src/dialogs.py:1295 msgid "THANKS:" msgstr "БЛÐГОДÐÐ ÐОСТИ:" #. remove one english sentence #. and add it manually as translatable -#: ../src/dialogs.py:1305 +#: ../src/dialogs.py:1301 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 <someone@somewhere> -#: ../src/dialogs.py:1317 +#: ../src/dialogs.py:1313 msgid "translator-credits" msgstr "" "Яков Безруков <nebulam51@gmail.com>\n" @@ -7684,492 +7360,458 @@ msgstr "" "Ð”ÐµÐ½Ð¸Ñ Ð¤Ð¾Ð¼Ð¸Ð½ <fominde@mail.ru>\n" "Григорий Сарницкий <sargrigory@ya.ru>" -#: ../src/dialogs.py:1500 +#: ../src/dialogs.py:1496 #, python-format msgid "" -"You have to install %s dictionary to use spellchecking, or choose another " -"language by setting the speller_language option.\n" +"You have to install %s dictionary to use spellchecking, or choose another language by setting the speller_language option.\n" "\n" "Highlighting misspelled words feature will not be used" -msgstr "" -"Чтобы воÑпользоватьÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¾Ð¹ правопиÑаниÑ, уÑтановите Ñловарь Ð´Ð»Ñ Ñзыка " -"%s или выберите другой Ñзык, иÑправив наÑтройку speller_language." - -#: ../src/dialogs.py:1845 ../src/gui_interface.py:1444 -#: ../src/gui_interface.py:1486 -msgid "Insecure connection" -msgstr "ÐебезопаÑное Ñоединение" - -#: ../src/dialogs.py:1846 -#, python-format -msgid "" -"You are about to connect to the account %(account)s (%(server)s) with an " -"insecure connection. This means all your conversations will be exchanged " -"unencrypted. This type of connection is really discouraged.\n" -"Are you sure you want to do that?" -msgstr "" -"Ð’Ñ‹ хотите подключить учетную запиÑÑŒ %(account)s (%(server)s) через " -"незащищенное Ñоединение. Ð’ÑÑ Ð²Ð°ÑˆÐ° перепиÑка не будет зашифрована. Ðтот тип " -"Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ðµ рекомендуетÑÑ.\n" -"Ð’Ñ‹ дейÑтвительно хотите Ñто Ñделать?" - -#: ../src/dialogs.py:1852 ../src/gui_interface.py:1448 -#: ../src/gui_interface.py:1489 -msgid "Yes, I really want to connect insecurely" -msgstr "Да, Ñ Ð´ÐµÐ¹Ñтвительно хочу ÑоединитьÑÑ Ð½ÐµÐ±ÐµÐ·Ð¾Ð¿Ð°Ñно" - -#: ../src/dialogs.py:1853 -msgid "Gajim will NOT connect unless you check this box" -msgstr "" +msgstr "Чтобы воÑпользоватьÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¾Ð¹ правопиÑаниÑ, уÑтановите Ñловарь Ð´Ð»Ñ Ñзыка %s или выберите другой Ñзык, иÑправив наÑтройку speller_language." -#: ../src/dialogs.py:1854 ../src/groupchat_control.py:2130 -#: ../src/gui_interface.py:706 ../src/gui_interface.py:1449 -#: ../src/gui_interface.py:1490 ../src/message_window.py:222 -#: ../src/roster_window.py:3050 ../src/roster_window.py:3730 -#: ../src/roster_window.py:4558 -msgid "_Do not ask me again" -msgstr "Ðе _Ñпрашивать Ð¼ÐµÐ½Ñ Ñнова" - -#: ../src/dialogs.py:1950 +#: ../src/dialogs.py:1912 msgid "_Resume" msgstr "_Продолжить" -#: ../src/dialogs.py:1958 +#: ../src/dialogs.py:1920 msgid "Re_place" msgstr "_Заменить" -#: ../src/dialogs.py:2155 ../src/dialogs.py:2612 -#, fuzzy -msgid "The nickname contains invalid characters." -msgstr "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ñодержит недопуÑтимые Ñимволы." +#: ../src/dialogs.py:2114 +#: ../src/dialogs.py:2515 +msgid "The nickname has not allowed characters." +msgstr "Ð’ Jabber ID комнаты или Ñервера ÑодержатÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимые Ñимволы." -#: ../src/dialogs.py:2277 +#: ../src/dialogs.py:2233 #, python-format msgid "Subscription request for account %(account)s from %(jid)s" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° подпиÑку Ð´Ð»Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи %(account)s от %(jid)s" -#: ../src/dialogs.py:2280 +#: ../src/dialogs.py:2236 #, python-format msgid "Subscription request from %s" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° подпиÑку от %s" -#: ../src/dialogs.py:2364 ../src/gui_interface.py:2054 +#: ../src/dialogs.py:2320 +#: ../src/gui_interface.py:2056 #, python-format msgid "You are already in group chat %s" msgstr "Ð’Ñ‹ уже в комнате %s" -#: ../src/dialogs.py:2370 +#: ../src/dialogs.py:2326 msgid "You can not join a group chat unless you are connected." msgstr "Ð’Ñ‹ не можете зайти в комнату без подключениÑ." -#: ../src/dialogs.py:2414 +#: ../src/dialogs.py:2370 #, python-format msgid "Join Group Chat with account %s" msgstr "Войти в комнату Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи %s" -#: ../src/dialogs.py:2548 ../src/dialogs.py:2558 -#, fuzzy -msgid "Wrong server" -msgstr "Сервер вернул неправильный ответ! (%s)" - -#: ../src/dialogs.py:2548 ../src/dialogs.py:2558 -#, fuzzy, python-format -msgid "%s is not a groupchat server" -msgstr "URL «%s» Ñервера не ÑвлÑетÑÑ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ñ‹Ð¼" - -#: ../src/dialogs.py:2598 +#: ../src/dialogs.py:2501 msgid "Invalid Account" msgstr "Ðеверное Ð¸Ð¼Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи" -#: ../src/dialogs.py:2599 -msgid "" -"You have to choose an account from which you want to join the groupchat." +#: ../src/dialogs.py:2502 +msgid "You have to choose an account from which you want to join the groupchat." msgstr "Выберите учетную запиÑÑŒ, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ вы хотите войти в комнату." -#: ../src/dialogs.py:2611 +#: ../src/dialogs.py:2514 msgid "Invalid Nickname" msgstr "Ðеверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" -#: ../src/dialogs.py:2616 ../src/dialogs.py:2622 -#: ../src/groupchat_control.py:2198 +#: ../src/dialogs.py:2519 +#: ../src/dialogs.py:2525 +#: ../src/groupchat_control.py:2093 msgid "Invalid group chat Jabber ID" msgstr "Ðеверное Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð½Ð°Ñ‚Ñ‹" -#: ../src/dialogs.py:2617 +#: ../src/dialogs.py:2520 msgid "Please enter the group chat Jabber ID as room@server." msgstr "Ð’ Jabber ID комнаты или Ñервера ÑодержатÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимые Ñимволы." -#: ../src/dialogs.py:2623 -#, fuzzy -msgid "The group chat Jabber ID contains invalid characters." +#: ../src/dialogs.py:2526 +#: ../src/groupchat_control.py:2094 +msgid "The group chat Jabber ID has not allowed characters." msgstr "Ð’ Jabber ID комнаты или Ñервера ÑодержатÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимые Ñимволы." -#: ../src/dialogs.py:2628 ../src/gui_interface.py:2036 +#: ../src/dialogs.py:2531 +#: ../src/gui_interface.py:2038 msgid "This is not a group chat" msgstr "Ðто не комната" -#: ../src/dialogs.py:2629 ../src/gui_interface.py:2037 +#: ../src/dialogs.py:2532 +#: ../src/gui_interface.py:2039 #, python-format msgid "%s is not the name of a group chat." msgstr "%s не ÑвлÑетÑÑ Ð¸Ð¼ÐµÐ½ÐµÐ¼ комнаты." -#: ../src/dialogs.py:2663 +#: ../src/dialogs.py:2564 msgid "Without a connection, you can not synchronise your contacts." msgstr "Чтобы объединить контакты, необходимо подключитьÑÑ Ðº Ñерверу." -#: ../src/dialogs.py:2676 +#: ../src/dialogs.py:2577 msgid "Server" msgstr "Сервер" -#: ../src/dialogs.py:2712 +#: ../src/dialogs.py:2613 msgid "This account is not connected to the server" msgstr "Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ не подключена к Ñерверу" -#: ../src/dialogs.py:2713 +#: ../src/dialogs.py:2614 msgid "You cannot synchronize with an account unless it is connected." msgstr "Ð’Ñ‹ не можете Ñинхронизировать учетную запиÑÑŒ еÑли она не подключена." -#: ../src/dialogs.py:2738 +#: ../src/dialogs.py:2639 msgid "Synchronise" msgstr "Синхронизировать" -#: ../src/dialogs.py:2799 +#: ../src/dialogs.py:2700 #, python-format msgid "Start Chat with account %s" msgstr "Ðачать чат Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑью %s" -#: ../src/dialogs.py:2801 +#: ../src/dialogs.py:2702 msgid "Start Chat" msgstr "Ðачать чат" -#: ../src/dialogs.py:2802 +#: ../src/dialogs.py:2703 msgid "" "Fill in the nickname or the Jabber ID of the contact you would like\n" "to send a chat message to:" -msgstr "" -"Введите ник или ID пользователÑ, которому вы хотите отправить Ñообщение:" +msgstr "Введите ник или ID пользователÑ, которому вы хотите отправить Ñообщение:" #. if offline or connecting -#: ../src/dialogs.py:2829 ../src/dialogs.py:3213 ../src/dialogs.py:3448 +#: ../src/dialogs.py:2730 +#: ../src/dialogs.py:3114 +#: ../src/dialogs.py:3350 msgid "Connection not available" msgstr "Соединение недоÑтупно" -#: ../src/dialogs.py:2830 ../src/dialogs.py:3214 ../src/dialogs.py:3449 +#: ../src/dialogs.py:2731 +#: ../src/dialogs.py:3115 +#: ../src/dialogs.py:3351 #, python-format msgid "Please make sure you are connected with \"%s\"." msgstr "УдоÑтоверьтеÑÑŒ, что вы подключены к «%s»." -#: ../src/dialogs.py:2839 ../src/dialogs.py:2842 +#: ../src/dialogs.py:2740 +#: ../src/dialogs.py:2743 msgid "Invalid JID" msgstr "Ðеверный JID" -#: ../src/dialogs.py:2842 +#: ../src/dialogs.py:2743 #, python-format msgid "Unable to parse \"%s\"." msgstr "Ðе понимаю адреÑа «%s»." -#: ../src/dialogs.py:2851 +#: ../src/dialogs.py:2752 msgid "Without a connection, you can not change your password." msgstr "Чтобы изменить пароль, необходимо подключитьÑÑ Ðº Ñерверу." -#: ../src/dialogs.py:2870 +#: ../src/dialogs.py:2771 msgid "Invalid password" msgstr "Ðеверный пароль" -#: ../src/dialogs.py:2870 +#: ../src/dialogs.py:2771 msgid "You must enter a password." msgstr "Ðеобходимо ввеÑти пароль." -#: ../src/dialogs.py:2874 +#: ../src/dialogs.py:2775 msgid "Passwords do not match" msgstr "Пароли не Ñовпадают" -#: ../src/dialogs.py:2875 +#: ../src/dialogs.py:2776 msgid "The passwords typed in both fields must be identical." msgstr "Пароли, введенные в оба полÑ, должны быть одинаковыми." -#: ../src/dialogs.py:2918 ../src/gui_interface.py:883 ../src/notify.py:276 +#: ../src/dialogs.py:2819 +#: ../src/gui_interface.py:873 +#: ../src/notify.py:276 msgid "New E-mail" msgstr "Ðовое пиÑьмо" -#: ../src/dialogs.py:2920 ../src/gui_interface.py:943 ../src/notify.py:269 +#: ../src/dialogs.py:2821 +#: ../src/gui_interface.py:933 +#: ../src/notify.py:269 msgid "File Transfer Request" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸" -#: ../src/dialogs.py:2922 ../src/gui_interface.py:845 -#: ../src/gui_interface.py:909 ../src/notify.py:271 +#: ../src/dialogs.py:2823 +#: ../src/gui_interface.py:835 +#: ../src/gui_interface.py:899 +#: ../src/notify.py:271 msgid "File Transfer Error" msgstr "Ошибка передачи" -#: ../src/dialogs.py:2924 ../src/gui_interface.py:1032 -#: ../src/gui_interface.py:1058 ../src/gui_interface.py:1079 +#: ../src/dialogs.py:2825 +#: ../src/gui_interface.py:1022 +#: ../src/gui_interface.py:1048 +#: ../src/gui_interface.py:1069 #: ../src/notify.py:273 msgid "File Transfer Completed" msgstr "Передача файла завершена" -#: ../src/dialogs.py:2925 ../src/gui_interface.py:1035 -#: ../src/gui_interface.py:1062 ../src/gui_interface.py:1083 +#: ../src/dialogs.py:2826 +#: ../src/gui_interface.py:1025 +#: ../src/gui_interface.py:1052 +#: ../src/gui_interface.py:1073 #: ../src/notify.py:274 msgid "File Transfer Stopped" msgstr "Передача оÑтановлена" -#: ../src/dialogs.py:3132 +#: ../src/dialogs.py:3033 #, python-format msgid "Single Message using account %s" msgstr "Ðовое Ñообщение Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи %s" -#: ../src/dialogs.py:3134 +#: ../src/dialogs.py:3035 #, python-format msgid "Single Message in account %s" msgstr "Ðовое Ñообщение Ð´Ð»Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи %s" -#: ../src/dialogs.py:3136 +#: ../src/dialogs.py:3037 msgid "Single Message" msgstr "Сообщение" #. prepare UI for Sending -#: ../src/dialogs.py:3139 +#: ../src/dialogs.py:3040 #, python-format msgid "Send %s" msgstr "Отправить %s" #. prepare UI for Receiving -#: ../src/dialogs.py:3162 +#: ../src/dialogs.py:3063 #, python-format msgid "Received %s" msgstr "Получено %s" #. prepare UI for Receiving -#: ../src/dialogs.py:3185 +#: ../src/dialogs.py:3086 #, 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:3268 +#: ../src/dialogs.py:3170 #, python-format msgid "RE: %s" msgstr "RE: %s" -#: ../src/dialogs.py:3269 +#: ../src/dialogs.py:3171 #, python-format msgid "%s wrote:\n" msgstr "%s напиÑал:\n" -#: ../src/dialogs.py:3329 +#: ../src/dialogs.py:3231 #, python-format msgid "XML Console for %s" msgstr "КонÑоль XML Ð´Ð»Ñ %s" -#: ../src/dialogs.py:3331 +#: ../src/dialogs.py:3233 msgid "XML Console" msgstr "КонÑоль XML" #. Action that can be done with an incoming list of contacts -#: ../src/dialogs.py:3478 +#: ../src/dialogs.py:3380 msgid "add" msgstr "добавить" -#: ../src/dialogs.py:3478 +#: ../src/dialogs.py:3380 msgid "modify" msgstr "изменить" -#: ../src/dialogs.py:3479 +#: ../src/dialogs.py:3381 msgid "remove" msgstr "удалить" -#: ../src/dialogs.py:3508 +#: ../src/dialogs.py:3410 #, python-format -msgid "" -"<b>%(jid)s</b> would like you to <b>%(action)s</b> some contacts in your " -"roster." -msgstr "" -"<b>%(jid)s</b> хочет <b>%(action)s</b> неÑколько контактов в ваш ÑпиÑок " -"контактов." +msgid "<b>%(jid)s</b> would like you to <b>%(action)s</b> some contacts in your roster." +msgstr "<b>%(jid)s</b> хочет <b>%(action)s</b> неÑколько контактов в ваш ÑпиÑок контактов." #. Change label for accept_button to action name instead of 'OK'. -#: ../src/dialogs.py:3526 ../src/dialogs.py:3601 +#: ../src/dialogs.py:3428 +#: ../src/dialogs.py:3503 msgid "Modify" msgstr "Изменить" #. holds jid -#: ../src/dialogs.py:3532 ../src/history_manager.py:166 +#: ../src/dialogs.py:3434 +#: ../src/history_manager.py:156 msgid "Jabber ID" msgstr "Jabber ID" -#: ../src/dialogs.py:3538 +#: ../src/dialogs.py:3440 msgid "Groups" msgstr "Группы" #. it is selected #. remote_jid = model[iter_][1].decode('utf-8') -#: ../src/dialogs.py:3646 +#: ../src/dialogs.py:3548 #, python-format msgid "%s suggested me to add you in my roster." msgstr "%s предложил мне добавить Ð²Ð°Ñ Ð² мой ÑпиÑок контактов." -#: ../src/dialogs.py:3660 +#: ../src/dialogs.py:3562 #, fuzzy, python-format msgid "Added %d contact" msgid_plural "Added %d contacts" -msgstr[0] "<b>Ð’Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð°:</b>" +msgstr[0] "Добавлены контакты %s" msgstr[1] "Добавлены контакты %s" msgstr[2] "Добавлены контакты %s" -#: ../src/dialogs.py:3698 +#: ../src/dialogs.py:3600 #, fuzzy, python-format msgid "Removed %d contact" msgid_plural "Removed %d contacts" -msgstr[0] "<b>Ð’Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð°:</b>" +msgstr[0] "Удалены контакты %s" msgstr[1] "Удалены контакты %s" msgstr[2] "Удалены контакты %s" -#: ../src/dialogs.py:3739 ../src/dialogs.py:3916 +#: ../src/dialogs.py:3641 +#: ../src/dialogs.py:3818 #, python-format msgid "Archiving Preferences for %s" msgstr "ÐаÑтройки архивации Ð´Ð»Ñ %s" -#: ../src/dialogs.py:3779 +#: ../src/dialogs.py:3681 #, fuzzy msgid "Invalid expire value" -msgstr "недопуÑтимое значение --bytes `%s'" +msgstr "Ðеверное Ð¸Ð¼Ñ Ñервера" -#: ../src/dialogs.py:3780 -#, fuzzy +#: ../src/dialogs.py:3682 msgid "Expire must be a valid positive integer." -msgstr "Ð’Ñ‹Ñота доÑки должна задаватьÑÑ Ñ†ÐµÐ»Ñ‹Ð¼ положительным чиÑлом" +msgstr "" -#: ../src/dialogs.py:3827 -#, fuzzy +#: ../src/dialogs.py:3729 msgid "There is an error with the form" -msgstr "%d вкладка Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸" +msgstr "" -#: ../src/dialogs.py:4047 +#: ../src/dialogs.py:3949 #, fuzzy msgid "There is an error" -msgstr "Ошибка: Файл \"%s\" не ÑущеÑтвует" +msgstr "Ð¡ÐµÑ€Ð²Ð¸Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð¸Ð» ошибкой." -#: ../src/dialogs.py:4115 +#: ../src/dialogs.py:4017 #, python-format msgid "Privacy List <b><i>%s</i></b>" msgstr "СпиÑок доÑтупа <b><i>%s</i></b>" -#: ../src/dialogs.py:4119 +#: ../src/dialogs.py:4021 #, python-format msgid "Privacy List for %s" msgstr "СпиÑок доÑтупа Ð´Ð»Ñ %s" -#: ../src/dialogs.py:4186 +#: ../src/dialogs.py:4088 #, python-format msgid "Order: %(order)s, action: %(action)s, type: %(type)s, value: %(value)s" -msgstr "" -"Ðомер: %(order)s, дейÑтвие: %(action)s, тип: %(type)s, значение: %(value)s" +msgstr "Ðомер: %(order)s, дейÑтвие: %(action)s, тип: %(type)s, значение: %(value)s" -#: ../src/dialogs.py:4191 +#: ../src/dialogs.py:4093 #, python-format msgid "Order: %(order)s, action: %(action)s" msgstr "Ðомер: %(order)s, дейÑтвие: %(action)s" -#: ../src/dialogs.py:4242 +#: ../src/dialogs.py:4144 msgid "<b>Edit a rule</b>" msgstr "<b>Изменить правило</b>" -#: ../src/dialogs.py:4353 +#: ../src/dialogs.py:4255 msgid "<b>Add a rule</b>" msgstr "<b>Добавить правило</b>" -#: ../src/dialogs.py:4452 +#: ../src/dialogs.py:4354 #, python-format msgid "Privacy Lists for %s" msgstr "СпиÑки доÑтупа Ð´Ð»Ñ %s" -#: ../src/dialogs.py:4454 +#: ../src/dialogs.py:4356 msgid "Privacy Lists" msgstr "СпиÑки доÑтупа" -#: ../src/dialogs.py:4543 +#: ../src/dialogs.py:4445 msgid "Invalid List Name" msgstr "ÐедопуÑтимое Ð¸Ð¼Ñ ÑпиÑка" -#: ../src/dialogs.py:4544 +#: ../src/dialogs.py:4446 msgid "You must enter a name to create a privacy list." msgstr "Ðеобходимо ввеÑти Ð¸Ð¼Ñ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑпиÑка доÑтупа." -#: ../src/dialogs.py:4580 +#: ../src/dialogs.py:4481 msgid "You are invited to a groupchat" msgstr "Ð’Ñ‹ приглашены в конференцию" -#: ../src/dialogs.py:4583 +#: ../src/dialogs.py:4484 msgid "$Contact has invited you to join a discussion" msgstr "$Contact приглашает Ð²Ð°Ñ Ð¿Ñ€Ð¸ÑоединитьÑÑ Ðº обÑуждению." -#: ../src/dialogs.py:4585 +#: ../src/dialogs.py:4486 #, python-format msgid "$Contact has invited you to group chat %(room_jid)s" msgstr "$Contact приглашает Ð²Ð°Ñ Ð² комнату %(room_jid)s." -#: ../src/dialogs.py:4593 +#: ../src/dialogs.py:4494 #, python-format msgid "Comment: %s" msgstr "Комментарий: %s" -#: ../src/dialogs.py:4595 +#: ../src/dialogs.py:4496 msgid "Do you want to accept the invitation?" msgstr "Ð’Ñ‹ принимаете приглашение?" -#: ../src/dialogs.py:4612 -#, fuzzy +#: ../src/dialogs.py:4512 msgid "Reason (if you decline):" -msgstr "AWAY [<причина>], уÑтанавливает флаг отÑутÑтвиÑ" +msgstr "" -#: ../src/dialogs.py:4664 +#: ../src/dialogs.py:4563 msgid "Choose Client Cert #PCKS12" msgstr "Выберите Ñертификат владельца #PCKS12" -#: ../src/dialogs.py:4674 ../src/dialogs.py:4716 ../src/dialogs.py:4772 -#: ../src/dialogs.py:4860 +#: ../src/dialogs.py:4573 +#: ../src/dialogs.py:4615 +#: ../src/dialogs.py:4671 +#: ../src/dialogs.py:4759 msgid "All files" msgstr "Ð’Ñе файлы" -#: ../src/dialogs.py:4679 +#: ../src/dialogs.py:4578 msgid "PKCS12 Files" msgstr "Файлы PKCS12" -#: ../src/dialogs.py:4706 +#: ../src/dialogs.py:4605 msgid "Choose Sound" msgstr "Выберите звуковой файл" -#: ../src/dialogs.py:4721 +#: ../src/dialogs.py:4620 msgid "Wav Sounds" msgstr "Ð’ формате Wav" -#: ../src/dialogs.py:4759 +#: ../src/dialogs.py:4658 msgid "Choose Image" msgstr "Выбрать картинку" -#: ../src/dialogs.py:4777 +#: ../src/dialogs.py:4676 msgid "Images" msgstr "Картинки" -#: ../src/dialogs.py:4847 +#: ../src/dialogs.py:4746 msgid "Choose Archive" msgstr "Выбрать Ðрхив" -#: ../src/dialogs.py:4865 +#: ../src/dialogs.py:4764 msgid "Zip files" msgstr "Zip файлы" -#: ../src/dialogs.py:4891 +#: ../src/dialogs.py:4790 #, python-format msgid "When %s becomes:" msgstr "Когда %s проиÑходит:" -#: ../src/dialogs.py:4893 +#: ../src/dialogs.py:4792 #, python-format msgid "Adding Special Notification for %s" msgstr "Добавление Ñпециального ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ %s" -#: ../src/dialogs.py:5113 +#: ../src/dialogs.py:5012 #, python-format msgid "" "Your chat session with <b>%(jid)s</b> is encrypted.\n" @@ -8180,115 +7822,92 @@ msgstr "" "\n" "Short Authentication String данного ÑеанÑа <b>%(sas)s</b>." -#: ../src/dialogs.py:5116 +#: ../src/dialogs.py:5015 msgid "You have already verified this contact's identity." msgstr "Ð’Ñ‹ уже удоÑтоверили личноÑÑ‚ÑŒ Ñтого контакта." -#: ../src/dialogs.py:5122 ../src/dialogs.py:5207 +#: ../src/dialogs.py:5021 +#: ../src/dialogs.py:5105 msgid "Contact's identity verified" msgstr "ЛичноÑÑ‚ÑŒ контакта удоÑтоверена" -#: ../src/dialogs.py:5128 +#: ../src/dialogs.py:5027 msgid "Verify again..." msgstr "УдоÑтоверить Ñнова..." -#: ../src/dialogs.py:5133 -msgid "" -"To be certain that <b>only</b> the expected person can read your messages or " -"send you messages, you need to verify their identity by clicking the button " -"below." -msgstr "" -"Чтобы быть уверенным, что <b>только</b> нужный человек может прочитать ваши " -"ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ поÑлать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð²Ð°Ð¼, вы должны удоÑтоверить личноÑÑ‚ÑŒ " -"ÑобеÑедника, нажав кнопку, раÑположенную ниже." +#: ../src/dialogs.py:5032 +msgid "To be certain that <b>only</b> the expected person can read your messages or send you messages, you need to verify their identity by clicking the button below." +msgstr "Чтобы быть уверенным, что <b>только</b> нужный человек может прочитать ваши ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ поÑлать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð²Ð°Ð¼, вы должны удоÑтоверить личноÑÑ‚ÑŒ ÑобеÑедника, нажав кнопку, раÑположенную ниже." -#: ../src/dialogs.py:5136 ../src/dialogs.py:5188 ../src/dialogs.py:5201 +#: ../src/dialogs.py:5035 +#: ../src/dialogs.py:5086 +#: ../src/dialogs.py:5099 msgid "Contact's identity NOT verified" msgstr "ЛичноÑÑ‚ÑŒ контакта ÐЕ удоÑтоверена" -#: ../src/dialogs.py:5141 +#: ../src/dialogs.py:5040 msgid "Verify..." msgstr "УдоÑтоверить..." -#: ../src/dialogs.py:5152 +#: ../src/dialogs.py:5051 msgid "Have you verified the contact's identity?" msgstr "Ð’Ñ‹ удоÑтоверили личноÑÑ‚ÑŒ удаленного контакта?" -#: ../src/dialogs.py:5153 +#: ../src/dialogs.py:5052 #, python-format msgid "" -"To prevent talking to an unknown person, you should speak to <b>%(jid)s</b> " -"directly (in person or on the phone) and verify that they see the same Short " -"Authentication String (SAS) as you.\n" +"To prevent talking to an unknown person, you should speak to <b>%(jid)s</b> directly (in person or on the phone) and verify that they see the same Short Authentication String (SAS) as you.\n" "\n" "This session's Short Authentication String is <b>%(sas)s</b>." msgstr "" -"Ð”Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð°Ñ‚Ð°ÐºÐ¸ типа «человек поÑередине» вы должны переговорить Ñ " -"<b>%(jid)s</b> напрÑмую (лично или по телефону) и убедитьÑÑ, что он видит ту " -"же Short Authentication String (SAS), что и вы.\n" +"Ð”Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð°Ñ‚Ð°ÐºÐ¸ типа «человек поÑередине» вы должны переговорить Ñ <b>%(jid)s</b> напрÑмую (лично или по телефону) и убедитьÑÑ, что он видит ту же Short Authentication String (SAS), что и вы.\n" "\n" "Short Authentication String Ñтого ÑеанÑа <b>%(sas)s</b>" -#: ../src/dialogs.py:5154 +#: ../src/dialogs.py:5053 msgid "Did you talk to the remote contact and verify the SAS?" msgstr "Ð’Ñ‹ переговорили Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ñ‹Ð¼ контактом и удоÑтоверили SAS?" -#: ../src/dialogs.py:5189 +#: ../src/dialogs.py:5087 #, python-format msgid "The contact's key (%s) <b>does not match</b> the key assigned in Gajim." -msgstr "" -"Ключ (%s) контакта <b>не ÑоответÑтвует</b> ключу, приÑвоенному в Gajim." +msgstr "Ключ (%s) контакта <b>не ÑоответÑтвует</b> ключу, приÑвоенному в Gajim." -#: ../src/dialogs.py:5195 -msgid "" -"No OpenPGP key is assigned to this contact. So you cannot encrypt messages." -msgstr "" -"Ðтому контакту не приÑвоен ключ OpenPGP, поÑтому вы не можете зашифровать " -"ÑообщениÑ." +#: ../src/dialogs.py:5093 +msgid "No GPG key is assigned to this contact. So you cannot encrypt messages." +msgstr "Ðтому контакту не приÑвоен ключ GPG, поÑтому вы не можете зашифровать ÑообщениÑ." -#: ../src/dialogs.py:5202 -msgid "" -"OpenPGP key is assigned to this contact, but <b>you do not trust his key</" -"b>, so message <b>cannot</b> be encrypted. Use your OpenPGP client to trust " -"this key." -msgstr "" -"Ðтому контакту приÑвоен ключ OpenPGP, но <b>вы не доверÑете Ñтому ключу</b>. " -"Таким образом, ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ <b>не могут быть</b> зашифрованы. ВоÑпользуйтеÑÑŒ " -"вашим OpenPGP клиентом Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы выÑтавить доверие данному ключу" +#: ../src/dialogs.py:5100 +msgid "GPG key is assigned to this contact, but <b>you do not trust his key</b>, so message <b>cannot</b> be encrypted. Use your GPG client to trust this key." +msgstr "Ðтому контакту приÑвоен ключ GPG, но <b>вы не доверÑете Ñтому ключу</b>. Таким образом, ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ <b>не могут быть</b> зашифрованы. ВоÑпользуйтеÑÑŒ вашим GPG клиентом Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы выÑтавить доверие данному ключу" -#: ../src/dialogs.py:5208 -msgid "" -"OpenPGP Key is assigned to this contact, and you trust his key, so messages " -"will be encrypted." -msgstr "" -"Ðтому контакту приÑвоен ключ OpenPGP, и вы доверÑете Ñтому ключу. Таким " -"образом, ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ зашифрованы." +#: ../src/dialogs.py:5106 +msgid "GPG Key is assigned to this contact, and you trust his key, so messages will be encrypted." +msgstr "Ðтому контакту приÑвоен ключ GPG, и вы доверÑете Ñтому ключу. Таким образом, ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ зашифрованы." -#: ../src/dialogs.py:5273 +#: ../src/dialogs.py:5171 msgid "an audio and video" msgstr "аудио и видео" -#: ../src/dialogs.py:5275 +#: ../src/dialogs.py:5173 msgid "an audio" msgstr "аудио" -#: ../src/dialogs.py:5277 +#: ../src/dialogs.py:5175 msgid "a video" msgstr "видео" -#: ../src/dialogs.py:5281 +#: ../src/dialogs.py:5179 #, python-format -msgid "" -"%(contact)s wants to start %(type)s session with you. Do you want to answer " -"the call?" +msgid "%(contact)s wants to start %(type)s session with you. Do you want to answer the call?" msgstr "%(contact)s хочет начать %(type)s ÑÐµÐ°Ð½Ñ Ñ Ð²Ð°Ð¼Ð¸. Ð’Ñ‹ хотите ответить?" -#: ../src/dialogs.py:5372 ../src/dialogs.py:5376 +#: ../src/dialogs.py:5248 #, python-format msgid "Certificate for account %s" msgstr "Сертификат учетной запиÑи %s" -#: ../src/dialogs.py:5376 +#: ../src/dialogs.py:5248 #, python-format msgid "" "<b>Issued to:</b>\n" @@ -8310,132 +7929,135 @@ msgid "" "SHA1 Fingerprint: %(sha1)s" msgstr "" -#: ../src/dialogs.py:5411 ../src/dialogs.py:5428 -#, fuzzy +#: ../src/dialogs.py:5283 +#: ../src/dialogs.py:5300 msgid "View cert..." -msgstr "ПроÑмотреть журнал" +msgstr "" -#: ../src/disco.py:120 +#: ../src/disco.py:119 msgid "Others" msgstr "Другие" #. conference is a category for listing mostly groupchats in service discovery -#: ../src/disco.py:124 +#: ../src/disco.py:123 msgid "Conference" msgstr "Комнаты" -#: ../src/disco.py:517 +#: ../src/disco.py:516 msgid "Without a connection, you can not browse available services" msgstr "Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра ÑервиÑов необходимо Ñначала подключитьÑÑ Ðº Ñерверу" -#: ../src/disco.py:603 +#: ../src/disco.py:602 #, python-format msgid "Service Discovery using account %s" msgstr "Обзор ÑервиÑов Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи %s" -#: ../src/disco.py:605 +#: ../src/disco.py:604 msgid "Service Discovery" msgstr "Обзор ÑервиÑов (discovery)" -#: ../src/disco.py:761 +#: ../src/disco.py:760 msgid "The service could not be found" msgstr "Ð¡ÐµÑ€Ð²Ð¸Ñ Ð½Ðµ обнаружен" -#: ../src/disco.py:762 -msgid "" -"There is no service at the address you entered, or it is not responding. " -"Check the address and try again." -msgstr "" -"По Ñтому адреÑу ÑервиÑÑ‹ отÑутÑтвуют или не отвечают. Проверьте Ð°Ð´Ñ€ÐµÑ Ð¸ " -"попробуйте еще раз." +#: ../src/disco.py:761 +msgid "There is no service at the address you entered, or it is not responding. Check the address and try again." +msgstr "По Ñтому адреÑу ÑервиÑÑ‹ отÑутÑтвуют или не отвечают. Проверьте Ð°Ð´Ñ€ÐµÑ Ð¸ попробуйте еще раз." -#: ../src/disco.py:768 ../src/disco.py:1109 +#: ../src/disco.py:765 +#: ../src/disco.py:1101 msgid "The service is not browsable" msgstr "Ð¡ÐµÑ€Ð²Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупен Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра" -#: ../src/disco.py:769 +#: ../src/disco.py:766 msgid "This type of service does not contain any items to browse." msgstr "Ðтот ÑÐµÑ€Ð²Ð¸Ñ Ð½Ðµ Ñодержит ничего, что можно было бы проÑмотреть." -#: ../src/disco.py:810 ../src/disco.py:820 +#: ../src/disco.py:806 +#: ../src/disco.py:816 msgid "Invalid Server Name" msgstr "Ðеверное Ð¸Ð¼Ñ Ñервера" -#: ../src/disco.py:873 +#: ../src/disco.py:869 #, python-format msgid "Browsing %(address)s using account %(account)s" msgstr "ПроÑмотр %(address)s Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑью %(account)s" -#: ../src/disco.py:917 +#: ../src/disco.py:913 msgid "_Browse" msgstr "_Браузер" -#: ../src/disco.py:1110 +#: ../src/disco.py:1102 msgid "This service does not contain any items to browse." msgstr "Ðтот ÑÐµÑ€Ð²Ð¸Ñ Ð½Ðµ Ñодержит ничего, что можно было бы проÑмотреть." -#: ../src/disco.py:1378 +#: ../src/disco.py:1342 msgid "_Execute Command" msgstr "Ð’_ыполнить команду..." -#: ../src/disco.py:1388 ../src/disco.py:1560 +#: ../src/disco.py:1352 +#: ../src/disco.py:1521 msgid "Re_gister" msgstr "За_региÑтрироватьÑÑ" -#: ../src/disco.py:1601 +#: ../src/disco.py:1562 #, python-format msgid "Scanning %(current)d / %(total)d.." msgstr "Сканирую %(current)d / %(total)d.." #. Users column -#: ../src/disco.py:1797 +#: ../src/disco.py:1753 msgid "Users" msgstr "Пользователи" #. Description column -#: ../src/disco.py:1805 +#: ../src/disco.py:1761 msgid "Description" msgstr "ОпиÑание" #. Id column -#: ../src/disco.py:1813 +#: ../src/disco.py:1769 msgid "Id" msgstr "ID" -#: ../src/disco.py:1877 ../src/gui_interface.py:2572 +#: ../src/disco.py:1834 +#: ../src/gui_interface.py:2574 msgid "Bookmark already set" msgstr "Закладка уже уÑтановлена" -#: ../src/disco.py:1878 ../src/gui_interface.py:2573 +#: ../src/disco.py:1835 +#: ../src/gui_interface.py:2575 #, python-format msgid "Group Chat \"%s\" is already in your bookmarks." msgstr "Комната «%s» уже еÑÑ‚ÑŒ в ваших закладках." -#: ../src/disco.py:1887 ../src/gui_interface.py:2587 +#: ../src/disco.py:1844 +#: ../src/gui_interface.py:2589 msgid "Bookmark has been added successfully" msgstr "Закладка уÑпешно добавлена" -#: ../src/disco.py:1888 ../src/gui_interface.py:2588 +#: ../src/disco.py:1845 +#: ../src/gui_interface.py:2590 msgid "You can manage your bookmarks via Actions menu in your roster." msgstr "Ð’Ñ‹ можете управлÑÑ‚ÑŒ закладками через меню «ДейÑтвиÑ» в роÑтере." -#: ../src/disco.py:2098 +#: ../src/disco.py:2054 msgid "Subscribed" msgstr "ПодпиÑка" -#: ../src/disco.py:2106 +#: ../src/disco.py:2062 msgid "Node" msgstr "Узел" -#: ../src/disco.py:2173 +#: ../src/disco.py:2129 msgid "New post" msgstr "Ðовое Ñообщение" -#: ../src/disco.py:2179 +#: ../src/disco.py:2135 msgid "_Subscribe" msgstr "_ПодпиÑатьÑÑ" -#: ../src/disco.py:2185 +#: ../src/disco.py:2141 msgid "_Unsubscribe" msgstr "_ОтпиÑатьÑÑ" @@ -8444,13 +8066,11 @@ msgid "SSL certificate validation" msgstr "Подтверждение SSL Ñертификата" #: ../src/features_window.py:51 -msgid "" -"A library used to validate server certificates to ensure a secure connection." -msgstr "" -"Библиотека иÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð´ÐµÐ¹ÑтвительноÑти Ñертификатов " -"Ñервера Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы удоÑтоверитьÑÑ Ð² защищенноÑти ÑоединениÑ." +msgid "A library used to validate server certificates to ensure a secure connection." +msgstr "Библиотека иÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð´ÐµÐ¹ÑтвительноÑти Ñертификатов Ñервера Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы удоÑтоверитьÑÑ Ð² защищенноÑти ÑоединениÑ." -#: ../src/features_window.py:52 ../src/features_window.py:53 +#: ../src/features_window.py:52 +#: ../src/features_window.py:53 msgid "Requires python-pyopenssl > 0.12 and pyasn1." msgstr "Требует python-pyopenssl > 0.12 и pyasn1." @@ -8460,20 +8080,15 @@ msgstr "Bonjour / Zeroconf" #: ../src/features_window.py:55 msgid "Serverless chatting with autodetected clients in a local network." -msgstr "" -"Ðе требующее Ñервера общение между автоматичеÑки обнаруживаемыми клиентами в " -"локальной Ñети." +msgstr "Ðе требующее Ñервера общение между автоматичеÑки обнаруживаемыми клиентами в локальной Ñети." #: ../src/features_window.py:56 msgid "Requires python-avahi." msgstr "Требует python-avahi." #: ../src/features_window.py:57 -msgid "" -"Requires pybonjour and bonjour SDK running (http://developer.apple.com/" -"opensource/)." +msgid "Requires pybonjour and bonjour SDK running (http://developer.apple.com/opensource/)." msgstr "" -"Требует pybonjour и bonjour SDK (http://developer.apple.com/opensource/)." #: ../src/features_window.py:58 msgid "Command line" @@ -8487,20 +8102,24 @@ msgstr "Скрипт Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Gajim'ом через кома msgid "Requires python-dbus." msgstr "Требует python-dbus." -#: ../src/features_window.py:61 ../src/features_window.py:69 -#: ../src/features_window.py:73 ../src/features_window.py:77 -#: ../src/features_window.py:89 ../src/features_window.py:105 -#: ../src/features_window.py:109 ../src/features_window.py:113 +#: ../src/features_window.py:61 +#: ../src/features_window.py:69 +#: ../src/features_window.py:73 +#: ../src/features_window.py:77 +#: ../src/features_window.py:89 +#: ../src/features_window.py:105 +#: ../src/features_window.py:109 +#: ../src/features_window.py:113 msgid "Feature not available under Windows." msgstr "Ðта возможноÑÑ‚ÑŒ отÑутÑтвует в Windows." #: ../src/features_window.py:62 -msgid "OpenPGP message encryption" +msgid "OpenGPG message encryption" msgstr "OpenPGP шифрование" #: ../src/features_window.py:63 -msgid "Encrypting chat messages with OpenPGP keys." -msgstr "Шифрование Ñообщений при помощи OpenPGP ключей." +msgid "Encrypting chat messages with gpg keys." +msgstr "Шифрование Ñообщений при помощи gpg ключей." #: ../src/features_window.py:64 msgid "Requires gpg and python-gnupg (http://code.google.com/p/python-gnupg/)." @@ -8528,9 +8147,7 @@ msgstr "Управление ÑеанÑами" #: ../src/features_window.py:71 msgid "Gajim session is stored on logout and restored on login." -msgstr "" -"Ð¡ÐµÐ°Ð½Ñ Gajim ÑохранÑетÑÑ Ð¿Ñ€Ð¸ выходе (logout) и воÑÑтанавливаетÑÑ Ð¿Ñ€Ð¸ входе " -"(login)." +msgstr "Ð¡ÐµÐ°Ð½Ñ Gajim ÑохранÑетÑÑ Ð¿Ñ€Ð¸ выходе (logout) и воÑÑтанавливаетÑÑ Ð¿Ñ€Ð¸ входе (login)." #: ../src/features_window.py:72 msgid "Requires python-gnome2." @@ -8589,9 +8206,7 @@ msgid "Passive popups notifying for new events." msgstr "ПаÑÑивные вÑплывающие окна Ð´Ð»Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ новых ÑобытиÑÑ…." #: ../src/features_window.py:88 -msgid "" -"Requires python-notify or instead python-dbus in conjunction with " -"notification-daemon." +msgid "Requires python-notify or instead python-dbus in conjunction with notification-daemon." msgstr "Требует python-notify или python-dbus ÑовмеÑтно Ñ notification-daemon." #: ../src/features_window.py:90 @@ -8600,9 +8215,7 @@ msgstr "Ðвто ÑтатуÑ" #: ../src/features_window.py:91 msgid "Ability to measure idle time, in order to set auto status." -msgstr "" -"ВозможноÑÑ‚ÑŒ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ бездейÑÑ‚Ð²Ð¸Ñ Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы уÑтановить " -"автоÑтатуÑ." +msgstr "ВозможноÑÑ‚ÑŒ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ бездейÑÑ‚Ð²Ð¸Ñ Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы уÑтановить автоÑтатуÑ." #: ../src/features_window.py:92 msgid "Requires libxss library." @@ -8620,7 +8233,8 @@ msgstr "End to end шифрование" msgid "Encrypting chat messages." msgstr "Шифрование Ñообщений чата." -#: ../src/features_window.py:96 ../src/features_window.py:97 +#: ../src/features_window.py:96 +#: ../src/features_window.py:97 msgid "Requires python-crypto." msgstr "Требует python-crypto." @@ -8629,14 +8243,11 @@ msgid "RST Generator" msgstr "Генератор RST" #: ../src/features_window.py:99 -msgid "" -"Generate XHTML output from RST code (see http://docutils.sourceforge.net/" -"docs/ref/rst/restructuredtext.html)." -msgstr "" -"Генерировать XHTML вывод из кода RST (Ñм. http://docutils.sourceforge.net/" -"docs/ref/rst/restructuredtext.html)." +msgid "Generate XHTML output from RST code (see http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html)." +msgstr "Генерировать XHTML вывод из кода RST (Ñм. http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html)." -#: ../src/features_window.py:100 ../src/features_window.py:101 +#: ../src/features_window.py:100 +#: ../src/features_window.py:101 msgid "Requires python-docutils." msgstr "Требует python-docutils." @@ -8650,11 +8261,11 @@ msgstr "Требует python-farstream и gstreamer-plugins-bad." #: ../src/features_window.py:106 msgid "UPnP-IGD" -msgstr "UPnP-IGD" +msgstr "" #: ../src/features_window.py:107 msgid "Ability to request your router to forward port for file transfer." -msgstr "ВозможноÑÑ‚ÑŒ запроÑа порта Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ файлов у роутера." +msgstr "" #: ../src/features_window.py:108 msgid "Requires python-gupnp-igd." @@ -8662,11 +8273,11 @@ msgstr "Требует python-gupnp-igd." #: ../src/features_window.py:110 msgid "UPower" -msgstr "UPower" +msgstr "" #: ../src/features_window.py:111 msgid "Ability to disconnect properly just before suspending the machine." -msgstr "ВозможноÑÑ‚ÑŒ отключитьÑÑ Ð¿ÐµÑ€ÐµÐ´ уходом машины в Ñон." +msgstr "" #: ../src/features_window.py:112 msgid "Requires upower and python-dbus." @@ -8692,20 +8303,23 @@ msgstr "ВремÑ" msgid "Progress" msgstr "ПрогреÑÑ" -#: ../src/filetransfers_window.py:185 ../src/filetransfers_window.py:242 +#: ../src/filetransfers_window.py:185 +#: ../src/filetransfers_window.py:242 #, python-format msgid "Filename: %s" msgstr "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°: %s" -#: ../src/filetransfers_window.py:187 ../src/filetransfers_window.py:453 +#: ../src/filetransfers_window.py:187 +#: ../src/filetransfers_window.py:453 #, python-format msgid "Size: %s" msgstr "Размер: %s" #. You is a reply of who sent a file #. You is a reply of who received a file -#: ../src/filetransfers_window.py:196 ../src/filetransfers_window.py:206 -#: ../src/history_manager.py:551 +#: ../src/filetransfers_window.py:196 +#: ../src/filetransfers_window.py:206 +#: ../src/history_manager.py:541 msgid "You" msgstr "Ð’Ñ‹" @@ -8714,8 +8328,9 @@ msgstr "Ð’Ñ‹" msgid "Sender: %s" msgstr "Отправитель: %s" -#: ../src/filetransfers_window.py:198 ../src/filetransfers_window.py:734 -#: ../src/tooltips.py:758 +#: ../src/filetransfers_window.py:198 +#: ../src/filetransfers_window.py:734 +#: ../src/tooltips.py:756 msgid "Recipient: " msgstr "Получатель:" @@ -8737,18 +8352,16 @@ msgstr "Сообщение об ошибке: %s" #: ../src/filetransfers_window.py:283 #, python-format msgid "" -"The file %(file)s has been fully received, but it seems to be wrongly " -"received.\n" +"The file %(file)s has been fully received, but it seems to be wrongly received.\n" "Do you want to reload it?" msgstr "" -"Файл %(file)s был получен, но возможно Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸.\n" -"Хотите загрузить его еще раз?" #: ../src/filetransfers_window.py:313 msgid "Choose File to Send..." msgstr "Выбрать файл Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸..." -#: ../src/filetransfers_window.py:329 ../src/tooltips.py:793 +#: ../src/filetransfers_window.py:329 +#: ../src/tooltips.py:791 msgid "Description: " msgstr "ОпиÑание: " @@ -8760,34 +8373,38 @@ msgstr "Ðет доÑтупа к файлу" msgid "This file is being used by another process." msgstr "Файл занÑÑ‚ другим процеÑÑом." -#: ../src/filetransfers_window.py:389 ../src/gtkgui_helpers.py:850 +#: ../src/filetransfers_window.py:389 +#: ../src/gtkgui_helpers.py:850 #, python-format msgid "Cannot overwrite existing file \"%s\"" msgstr "Ðе могу замеÑтить ÑущеÑтвующий файл «%s»" -#: ../src/filetransfers_window.py:390 ../src/gtkgui_helpers.py:851 -msgid "" -"A file with this name already exists and you do not have permission to " -"overwrite it." +#: ../src/filetransfers_window.py:390 +#: ../src/gtkgui_helpers.py:851 +msgid "A file with this name already exists and you do not have permission to overwrite it." msgstr "Ðтот файл уже ÑущеÑтвует, и у Ð²Ð°Ñ Ð½ÐµÑ‚ права его перезапиÑать." -#: ../src/filetransfers_window.py:407 ../src/gtkgui_helpers.py:855 +#: ../src/filetransfers_window.py:407 +#: ../src/gtkgui_helpers.py:855 msgid "This file already exists" msgstr "Файл уже ÑущеÑтвует" -#: ../src/filetransfers_window.py:407 ../src/gtkgui_helpers.py:855 +#: ../src/filetransfers_window.py:407 +#: ../src/gtkgui_helpers.py:855 msgid "What do you want to do?" msgstr "Что вы хотите Ñделать?" #. read-only bit is used to mark special folder under #. windows, not to mark that a folder is read-only. #. See ticket #3587 -#: ../src/filetransfers_window.py:418 ../src/gtkgui_helpers.py:862 +#: ../src/filetransfers_window.py:418 +#: ../src/gtkgui_helpers.py:862 #, python-format msgid "Directory \"%s\" is not writable" msgstr "Папка «%s» не доÑтупна Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи" -#: ../src/filetransfers_window.py:419 ../src/gtkgui_helpers.py:863 +#: ../src/filetransfers_window.py:419 +#: ../src/gtkgui_helpers.py:863 msgid "You do not have permission to create files in this directory." msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ права Ñоздавать файлы в Ñтой директории." @@ -8816,12 +8433,14 @@ msgid "%s wants to send you a file:" msgstr "%s хочет отправить вам файл:" #: ../src/filetransfers_window.py:500 +#, fuzzy msgid "Checking file..." -msgstr "ПроверÑетÑÑ Ñ„Ð°Ð¹Ð» ..." +msgstr "ОтправлÑÑŽ данные..." #: ../src/filetransfers_window.py:514 +#, fuzzy msgid "File error" -msgstr "Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°" +msgstr "Ошибка передачи" #. Print remaining time in format 00:00:00 #. You can change the places of (hours), (minutes), (seconds) - @@ -8839,7 +8458,8 @@ msgstr "%(hours)02.d:%(minutes)02.d:%(seconds)02.d" msgid "(%(filesize_unit)s/s)" msgstr "(%(filesize_unit)s/s)" -#: ../src/filetransfers_window.py:700 ../src/filetransfers_window.py:703 +#: ../src/filetransfers_window.py:700 +#: ../src/filetransfers_window.py:703 msgid "Invalid File" msgstr "Ðеверный файл" @@ -8851,11 +8471,13 @@ msgstr "Файл: " msgid "It is not possible to send empty files" msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ñылать пуÑтые файлы" -#: ../src/filetransfers_window.py:730 ../src/tooltips.py:748 +#: ../src/filetransfers_window.py:730 +#: ../src/tooltips.py:746 msgid "Name: " msgstr "ИмÑ: " -#: ../src/filetransfers_window.py:732 ../src/tooltips.py:752 +#: ../src/filetransfers_window.py:732 +#: ../src/tooltips.py:750 msgid "Sender: " msgstr "Отправитель:" @@ -8863,81 +8485,46 @@ msgstr "Отправитель:" msgid "Pause" msgstr "Пауза" -#: ../src/gajim.py:135 ../src/history_manager.py:73 -msgid "Usage:" -msgstr "ИÑпользование:" - -#: ../src/gajim.py:137 ../src/history_manager.py:75 -msgid "Options:" -msgstr "Параметры:" - -#: ../src/gajim.py:139 ../src/history_manager.py:77 -msgid "Show this help message and exit" -msgstr "показать Ñто Ñообщение и закончить работу" - -#: ../src/gajim.py:141 -msgid "Show only critical errors" -msgstr "показывать только ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± ошибках" - -#: ../src/gajim.py:143 -msgid "Print xml stanzas and other debug information" -msgstr "Выводить xml Ñтанзы и другую отладочную информацию" - -#: ../src/gajim.py:145 -msgid "Use defined profile in configuration directory" -msgstr "ИÑпользовать определенный профиль из каталога Ñ Ð½Ð°Ñтройками" - -#: ../src/gajim.py:147 -msgid "Set configuration directory" -msgstr "УÑтановить каталог загрузки конфигурации" - -#: ../src/gajim.py:149 -msgid "Configure logging system" -msgstr "ÐаÑтройки ÑиÑтемы логированиÑ" - -#: ../src/gajim.py:211 +#: ../src/gajim.py:192 msgid "Gajim needs X server to run. Quiting..." msgstr "Gajim Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка требуетÑÑ X-Ñервер. Выход..." -#: ../src/gajim.py:213 +#: ../src/gajim.py:194 #, python-format msgid "importing PyGTK failed: %s" msgstr "ошибка Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ PyGTK: %s" -#: ../src/gajim.py:256 +#: ../src/gajim.py:235 msgid "Gajim needs PyGTK 2.22 or above" msgstr "Gajim требуетÑÑ PyGTK 2.22 или выше" -#: ../src/gajim.py:257 +#: ../src/gajim.py:236 msgid "Gajim needs PyGTK 2.22 or above to run. Quiting..." msgstr "Gajim Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка требуетÑÑ PyGTK 2.22 или выше. Выход..." -#: ../src/gajim.py:259 +#: ../src/gajim.py:238 msgid "Gajim needs GTK 2.22 or above" msgstr "Gajim требуетÑÑ GTK 2.22 или выше" -#: ../src/gajim.py:260 +#: ../src/gajim.py:239 msgid "Gajim needs GTK 2.22 or above to run. Quiting..." msgstr "Gajim Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка требуетÑÑ GTK 2.22 или выше. Выход..." -#: ../src/gajim.py:269 +#: ../src/gajim.py:248 msgid "Gajim needs pywin32 to run" msgstr "Gajim Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка требуетÑÑ pywin32" -#: ../src/gajim.py:270 +#: ../src/gajim.py:249 #, python-format -msgid "" -"Please make sure that Pywin32 is installed on your system. You can get it at " -"%s" -msgstr "" -"УдоÑтоверьтеÑÑŒ, что в вашей ÑиÑтеме уÑтановлен Pywin32. Ð’Ñ‹ можете получить " -"его на Ñайте: %s" +msgid "Please make sure that Pywin32 is installed on your system. You can get it at %s" +msgstr "УдоÑтоверьтеÑÑŒ, что в вашей ÑиÑтеме уÑтановлен Pywin32. Ð’Ñ‹ можете получить его на Ñайте: %s" -#: ../src/gajim.py:410 +#. set the icon to all newly opened wind +#: ../src/gajim.py:365 msgid "Gajim is already running" msgstr "Gajim уже запущен" -#: ../src/gajim.py:411 +#: ../src/gajim.py:366 msgid "" "Another instance of Gajim seems to be running\n" "Run anyway?" @@ -8945,389 +8532,342 @@ msgstr "" "По-видимому, уже запущен другой ÑкземплÑÑ€ Gajim\n" "ЗапуÑтить ещё один?" -#: ../src/gajim-remote.py:78 +#: ../src/gajim-remote.py:77 msgid "Shows a help on specific command" msgstr "Показывает помощь Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð¾Ð¹ команды" #. User gets help for the command, specified by this parameter -#: ../src/gajim-remote.py:81 +#: ../src/gajim-remote.py:80 msgid "command" msgstr "команда" -#: ../src/gajim-remote.py:82 +#: ../src/gajim-remote.py:81 msgid "show help on command" msgstr "показать помощь по команде" -#: ../src/gajim-remote.py:86 +#: ../src/gajim-remote.py:85 msgid "Shows or hides the roster window" msgstr "Скрывает или показывает окно роÑтера" -#: ../src/gajim-remote.py:90 +#: ../src/gajim-remote.py:89 msgid "Pops up a window with the next pending event" msgstr "Показывать окно Ñо Ñледующим непрочитанным Ñообщением" -#: ../src/gajim-remote.py:94 -msgid "" -"Prints a list of all contacts in the roster. Each contact appears on a " -"separate line" -msgstr "" -"Выводит ÑпиÑок вÑех контактов в роÑтере. Каждый контакт будет в отдельной " -"Ñтроке" - -#: ../src/gajim-remote.py:97 ../src/gajim-remote.py:112 -#: ../src/gajim-remote.py:122 ../src/gajim-remote.py:132 -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 ../src/gajim-remote.py:192 -#: ../src/gajim-remote.py:222 ../src/gajim-remote.py:231 -#: ../src/gajim-remote.py:238 ../src/gajim-remote.py:245 -#: ../src/gajim-remote.py:256 ../src/gajim-remote.py:281 -#: ../src/gajim-remote.py:292 -msgid "?CLI:account" -msgstr "?CLI:ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ" - -#: ../src/gajim-remote.py:97 +#: ../src/gajim-remote.py:93 +msgid "Prints a list of all contacts in the roster. Each contact appears on a separate line" +msgstr "Выводит ÑпиÑок вÑех контактов в роÑтере. Каждый контакт будет в отдельной Ñтроке" + +#: ../src/gajim-remote.py:96 +#: ../src/gajim-remote.py:111 +#: ../src/gajim-remote.py:121 +#: ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:147 +#: ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 +#: ../src/gajim-remote.py:191 +#: ../src/gajim-remote.py:221 +#: ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:237 +#: ../src/gajim-remote.py:244 +#: ../src/gajim-remote.py:255 +#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:291 +msgid "account" +msgstr "Учетные запиÑи" + +#: ../src/gajim-remote.py:96 msgid "show only contacts of the given account" msgstr "показывать контакты только Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ учетной запиÑи" -#: ../src/gajim-remote.py:103 +#: ../src/gajim-remote.py:102 msgid "Prints a list of registered accounts" msgstr "Показывает ÑпиÑок зарегиÑтрированных учетных запиÑей" -#: ../src/gajim-remote.py:107 +#: ../src/gajim-remote.py:106 msgid "Changes the status of account or accounts" msgstr "ИзменÑет ÑÑ‚Ð°Ñ‚ÑƒÑ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи или запиÑей" #. offline, online, chat, away, xa, dnd, invisible should not be translated -#: ../src/gajim-remote.py:110 -msgid "?CLI:status" -msgstr "?CLI:ÑтатуÑ" - -#: ../src/gajim-remote.py:110 -msgid "" -"one of: offline, online, chat, away, xa, dnd, invisible. If not set, use " -"account's previous status" -msgstr "" -"один из: отключен, в Ñети, готов поболтать, отошел, недоÑтупен, не " -"беÑпокоить, невидимка. ЕÑли не указано, иÑпользовать предыдущий ÑтатуÑ." +#: ../src/gajim-remote.py:109 +msgid "status" +msgstr "ÑтатуÑ" -#: ../src/gajim-remote.py:111 ../src/gajim-remote.py:134 -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 ../src/gajim-remote.py:283 -msgid "?CLI:message" -msgstr "?CLI:Ñообщение" +#: ../src/gajim-remote.py:109 +msgid "one of: offline, online, chat, away, xa, dnd, invisible. If not set, use account's previous status" +msgstr "один из: отключен, в Ñети, готов поболтать, отошел, недоÑтупен, не беÑпокоить, невидимка. ЕÑли не указано, иÑпользовать предыдущий ÑтатуÑ." -#: ../src/gajim-remote.py:111 +#: ../src/gajim-remote.py:110 msgid "status message" msgstr "Ñообщение о ÑтатуÑе" -#: ../src/gajim-remote.py:112 -msgid "" -"change status of account \"account\". If not specified, try to change status " -"of all accounts that have \"sync with global status\" option set" -msgstr "" -"изменÑет ÑÑ‚Ð°Ñ‚ÑƒÑ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи Â«ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸Ñь». ЕÑли не указано, пытаетÑÑ " -"изменить ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ñех учетных запиÑей, у которых уÑтановлена Ð¾Ð¿Ñ†Ð¸Ñ " -"«Ñинхронизировать Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ñ‹Ð¼ ÑтатуÑом»" +#: ../src/gajim-remote.py:111 +msgid "change status of account \"account\". If not specified, try to change status of all accounts that have \"sync with global status\" option set" +msgstr "изменÑет ÑÑ‚Ð°Ñ‚ÑƒÑ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи Â«ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸Ñь». ЕÑли не указано, пытаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ñех учетных запиÑей, у которых уÑтановлена Ð¾Ð¿Ñ†Ð¸Ñ Â«Ñинхронизировать Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ñ‹Ð¼ ÑтатуÑом»" -#: ../src/gajim-remote.py:118 +#: ../src/gajim-remote.py:117 msgid "Changes the priority of account or accounts" msgstr "ИзменÑет приоритет учетной запиÑи или запиÑей" -#: ../src/gajim-remote.py:120 -msgid "?CLI:priority" -msgstr "?CLI:приоритет" +#: ../src/gajim-remote.py:119 +msgid "priority" +msgstr "Приоритет" -#: ../src/gajim-remote.py:120 +#: ../src/gajim-remote.py:119 msgid "priority you want to give to the account" msgstr "приоритет, который вы хотите назначить Ð´Ð»Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи" -#: ../src/gajim-remote.py:122 -msgid "" -"change the priority of the given account. If not specified, change status of " -"all accounts that have \"sync with global status\" option set" -msgstr "" -"изменÑет приоритет учетной запиÑи. ЕÑли не указано, пытаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ ÑÑ‚Ð°Ñ‚ÑƒÑ " -"вÑех учетных запиÑей, у которых уÑтановлена Ð¾Ð¿Ñ†Ð¸Ñ Â«Ñинхронизировать Ñ " -"глобальным ÑтатуÑом»" - -#: ../src/gajim-remote.py:128 +#: ../src/gajim-remote.py:121 +msgid "change the priority of the given account. If not specified, change status of all accounts that have \"sync with global status\" option set" +msgstr "изменÑет приоритет учетной запиÑи. ЕÑли не указано, пытаетÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ñех учетных запиÑей, у которых уÑтановлена Ð¾Ð¿Ñ†Ð¸Ñ Â«Ñинхронизировать Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ñ‹Ð¼ ÑтатуÑом»" + +#: ../src/gajim-remote.py:127 msgid "Shows the chat dialog so that you can send messages to a contact" msgstr "Показывает окно беÑеды, чтобы вы могли отправлÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ñƒ" -#: ../src/gajim-remote.py:130 +#: ../src/gajim-remote.py:129 msgid "JID of the contact that you want to chat with" msgstr "JID контакта, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ вы хотели бы побеÑедовать" -#: ../src/gajim-remote.py:132 ../src/gajim-remote.py:222 +#: ../src/gajim-remote.py:131 +#: ../src/gajim-remote.py:221 msgid "if specified, contact is taken from the contact list of this account" msgstr "еÑли указано, контакт будет взÑÑ‚ из контакт-лиÑта Ñтой учетной запиÑи" -#: ../src/gajim-remote.py:135 +#: ../src/gajim-remote.py:134 msgid "message content. The account must be specified or \"\"" msgstr "Ñодержимое ÑообщениÑ. Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ должна быть указана или \"\"" -#: ../src/gajim-remote.py:140 -msgid "" -"Sends new chat message to a contact in the roster. Both OpenPGP key and " -"account are optional. If you want to set only 'account', without 'OpenPGP " -"key', just set 'OpenPGP key' to ''." -msgstr "" -"Отправить новое Ñообщение контакту в роÑтере. Как ключ OpenPGP, так и " -"ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ опциональны. ЕÑли вы хотите наÑтроить лишь 'учетную запиÑÑŒ', " -"без 'ключа OpenPGP', проÑто уÑтановите 'ключ OpenPGP' в ''." +#: ../src/gajim-remote.py:139 +msgid "Sends new chat message to a contact in the roster. Both OpenPGP key and account are optional. If you want to set only 'account', without 'OpenPGP key', just set 'OpenPGP key' to ''." +msgstr "Отправить новое Ñообщение контакту в роÑтере. Как ключ OpenPGP, так и ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ опциональны. ЕÑли вы хотите наÑтроить лишь 'учетную запиÑÑŒ', без 'ключа OpenPGP', проÑто уÑтановите 'ключ OpenPGP' в ''." -#: ../src/gajim-remote.py:144 ../src/gajim-remote.py:157 +#: ../src/gajim-remote.py:143 +#: ../src/gajim-remote.py:156 msgid "JID of the contact that will receive the message" msgstr "JID контакта, который получит Ñообщение" -#: ../src/gajim-remote.py:145 ../src/gajim-remote.py:159 -#: ../src/gajim-remote.py:170 +#: ../src/gajim-remote.py:144 +#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:169 msgid "message contents" msgstr "Ñодержимое ÑообщениÑ" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +#: ../src/gajim-remote.py:145 +#: ../src/gajim-remote.py:159 msgid "pgp key" msgstr "PGP ключ" -#: ../src/gajim-remote.py:146 ../src/gajim-remote.py:160 +#: ../src/gajim-remote.py:145 +#: ../src/gajim-remote.py:159 msgid "if specified, the message will be encrypted using this public key" -msgstr "" -"еÑли указано, Ñообщение будет зашифровано Ñ Ð¸Ñпользованием открытого ключа" +msgstr "еÑли указано, Ñообщение будет зашифровано Ñ Ð¸Ñпользованием открытого ключа" -#: ../src/gajim-remote.py:148 ../src/gajim-remote.py:162 -#: ../src/gajim-remote.py:171 +#: ../src/gajim-remote.py:147 +#: ../src/gajim-remote.py:161 +#: ../src/gajim-remote.py:170 msgid "if specified, the message will be sent using this account" -msgstr "" -"еÑли указано, Ñообщение будет отправлено Ñ Ð¸Ñпользованием Ñтой учетной запиÑи" +msgstr "еÑли указано, Ñообщение будет отправлено Ñ Ð¸Ñпользованием Ñтой учетной запиÑи" -#: ../src/gajim-remote.py:153 -msgid "" -"Sends new single message to a contact in the roster. Both OpenPGP key and " -"account are optional. If you want to set only 'account', without 'OpenPGP " -"key', just set 'OpenPGP key' to ''." -msgstr "" -"Отправить новое Ñообщение контакту в роÑтере. Как ключ OpenPGP, так и " -"ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ опциональны. ЕÑли вы хотите наÑтроить лишь 'учетную запиÑÑŒ', " -"без 'ключа OpenPGP', проÑто уÑтановите 'ключ OpenPGP' в ''." +#: ../src/gajim-remote.py:152 +msgid "Sends new single message to a contact in the roster. Both OpenPGP key and account are optional. If you want to set only 'account', without 'OpenPGP key', just set 'OpenPGP key' to ''." +msgstr "Отправить новое Ñообщение контакту в роÑтере. Как ключ OpenPGP, так и ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ опциональны. ЕÑли вы хотите наÑтроить лишь 'учетную запиÑÑŒ', без 'ключа OpenPGP', проÑто уÑтановите 'ключ OpenPGP' в ''." -#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:157 msgid "subject" msgstr "тема" -#: ../src/gajim-remote.py:158 +#: ../src/gajim-remote.py:157 msgid "message subject" msgstr "тема ÑообщениÑ" -#: ../src/gajim-remote.py:167 +#: ../src/gajim-remote.py:166 msgid "Sends new message to a groupchat you've joined." msgstr "ОтправлÑет новые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² комнату, к которой вы приÑоединилиÑÑŒ." -#: ../src/gajim-remote.py:169 +#: ../src/gajim-remote.py:168 msgid "JID of the room that will receive the message" msgstr "JID контакта, который получит Ñообщение" -#: ../src/gajim-remote.py:176 +#: ../src/gajim-remote.py:175 msgid "Gets detailed info on a contact" msgstr "Получает детальную информацию о контакте" -#: ../src/gajim-remote.py:178 ../src/gajim-remote.py:191 -#: ../src/gajim-remote.py:221 ../src/gajim-remote.py:230 +#: ../src/gajim-remote.py:177 +#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:220 +#: ../src/gajim-remote.py:229 msgid "JID of the contact" msgstr "JID контакта" -#: ../src/gajim-remote.py:182 +#: ../src/gajim-remote.py:181 msgid "Gets detailed info on a account" msgstr "Получает детальную информацию о учетной запиÑи" -#: ../src/gajim-remote.py:184 +#: ../src/gajim-remote.py:183 msgid "Name of the account" msgstr "Ð˜Ð¼Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи" -#: ../src/gajim-remote.py:188 +#: ../src/gajim-remote.py:187 msgid "Sends file to a contact" msgstr "ОтправлÑет контакту файл" -#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:189 msgid "file" msgstr "файл" -#: ../src/gajim-remote.py:190 +#: ../src/gajim-remote.py:189 msgid "File path" msgstr "Путь до файла" -#: ../src/gajim-remote.py:192 +#: ../src/gajim-remote.py:191 msgid "if specified, file will be sent using this account" -msgstr "" -"еÑли указано, файл будет отправлен Ñ Ð¸Ñпользованием Ñтой учетной запиÑи" +msgstr "еÑли указано, файл будет отправлен Ñ Ð¸Ñпользованием Ñтой учетной запиÑи" -#: ../src/gajim-remote.py:197 +#: ../src/gajim-remote.py:196 msgid "Lists all preferences and their values" msgstr "Показывает вÑе параметры Ñ Ð¸Ñ… значениÑми" -#: ../src/gajim-remote.py:201 +#: ../src/gajim-remote.py:200 msgid "Sets value of 'key' to 'value'." msgstr "ПриÑваивает 'ключу' в 'значение'" -#: ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:202 msgid "key=value" msgstr "ключ=значение" -#: ../src/gajim-remote.py:203 +#: ../src/gajim-remote.py:202 msgid "'key' is the name of the preference, 'value' is the value to set it to" -msgstr "" -"'ключ' Ñто название параметра, а 'значение' Ñто то, что ему приÑваивают" +msgstr "'ключ' Ñто название параметра, а 'значение' Ñто то, что ему приÑваивают" -#: ../src/gajim-remote.py:208 +#: ../src/gajim-remote.py:207 msgid "Deletes a preference item" msgstr "УдалÑет параметр" -#: ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:209 msgid "key" msgstr "ключ" -#: ../src/gajim-remote.py:210 +#: ../src/gajim-remote.py:209 msgid "name of the preference to be deleted" msgstr "Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°, который нужно удалить" -#: ../src/gajim-remote.py:214 +#: ../src/gajim-remote.py:213 msgid "Writes the current state of Gajim preferences to the .config file" msgstr "СохранÑет текущее ÑоÑтоÑние наÑтроек Gajim в файл .config" -#: ../src/gajim-remote.py:219 +#: ../src/gajim-remote.py:218 msgid "Removes contact from roster" msgstr "УдалÑет контакт из роÑтера" -#: ../src/gajim-remote.py:228 +#: ../src/gajim-remote.py:227 msgid "Adds contact to roster" msgstr "ДобавлÑет контакт в роÑтер" -#: ../src/gajim-remote.py:231 +#: ../src/gajim-remote.py:230 msgid "Adds new contact to this account" msgstr "ДобавлÑет новый контакт Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ учетной запиÑи" -#: ../src/gajim-remote.py:236 +#: ../src/gajim-remote.py:235 msgid "Returns current status (the global one unless account is specified)" -msgstr "" -"Возвращает текущий ÑÑ‚Ð°Ñ‚ÑƒÑ (по умолчанию глобальный, еÑли не указана ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ " -"запиÑÑŒ)" +msgstr "Возвращает текущий ÑÑ‚Ð°Ñ‚ÑƒÑ (по умолчанию глобальный, еÑли не указана ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ)" -#: ../src/gajim-remote.py:243 -msgid "" -"Returns current status message (the global one unless account is specified)" -msgstr "" -"Возвращает текущее Ñообщение о ÑтатуÑе (по умолчанию глобальное, еÑли не " -"указана ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ)" +#: ../src/gajim-remote.py:242 +msgid "Returns current status message (the global one unless account is specified)" +msgstr "Возвращает текущее Ñообщение о ÑтатуÑе (по умолчанию глобальное, еÑли не указана ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ)" -#: ../src/gajim-remote.py:250 +#: ../src/gajim-remote.py:249 msgid "Returns number of unread messages" msgstr "Возвращает количеÑтво непрочитанных Ñообщений" -#: ../src/gajim-remote.py:254 +#: ../src/gajim-remote.py:253 msgid "Opens 'Start Chat' dialog" msgstr "Открыть диалог «Ðачать беÑеду»" -#: ../src/gajim-remote.py:256 +#: ../src/gajim-remote.py:255 msgid "Starts chat, using this account" msgstr "Ðачать беÑеду Ñ Ñтой учетной запиÑи" -#: ../src/gajim-remote.py:260 +#: ../src/gajim-remote.py:259 msgid "Sends custom XML" msgstr "ОтправлÑет произвольный XML" -#: ../src/gajim-remote.py:262 +#: ../src/gajim-remote.py:261 msgid "XML to send" msgstr "ОтправлÑемый XML" -#: ../src/gajim-remote.py:263 -msgid "" -"Account in which the xml will be sent; if not specified, xml will be sent to " -"all accounts" -msgstr "" -"Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ, которой будет отправлен XML. ЕÑли не указано, xml будет " -"поÑлан вÑем контактам." +#: ../src/gajim-remote.py:262 +msgid "Account in which the xml will be sent; if not specified, xml will be sent to all accounts" +msgstr "Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ, которой будет отправлен XML. ЕÑли не указано, xml будет поÑлан вÑем контактам." -#: ../src/gajim-remote.py:269 +#: ../src/gajim-remote.py:268 msgid "Change the avatar" msgstr "Изменить аватар" -#: ../src/gajim-remote.py:271 +#: ../src/gajim-remote.py:270 msgid "Picture to use" msgstr "ИÑпользовать картинку" -#: ../src/gajim-remote.py:272 -msgid "" -"Account in which the avatar will be set; if not specified, the avatar will " -"be set for all accounts" -msgstr "" -"Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ будет назначен аватар. ЕÑли не указано, аватар " -"будет назначен вÑем учетным запиÑÑм." +#: ../src/gajim-remote.py:271 +msgid "Account in which the avatar will be set; if not specified, the avatar will be set for all accounts" +msgstr "Ð£Ñ‡Ñ‘Ñ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ будет назначен аватар. ЕÑли не указано, аватар будет назначен вÑем учетным запиÑÑм." -#: ../src/gajim-remote.py:278 +#: ../src/gajim-remote.py:277 msgid "Handle a xmpp:/ uri" msgstr "Обработать ÑÑылку формата «xmpp:/»" -#: ../src/gajim-remote.py:280 -#, fuzzy -msgid "?CLI:uri" -msgstr "Ðеверный хоÑÑ‚" - -#: ../src/gajim-remote.py:280 +#: ../src/gajim-remote.py:279 msgid "URI to handle" msgstr "URI Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸" -#: ../src/gajim-remote.py:281 +#: ../src/gajim-remote.py:280 msgid "Account in which you want to handle it" msgstr "Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ, в которой вы хотите его иÑпользовать" -#: ../src/gajim-remote.py:283 +#: ../src/gajim-remote.py:282 msgid "Message content" msgstr "Cодержимое ÑообщениÑ" -#: ../src/gajim-remote.py:287 +#: ../src/gajim-remote.py:286 msgid "Join a MUC room" msgstr "ПриÑоединитьÑÑ Ðº комнате MUC" -#: ../src/gajim-remote.py:289 -msgid "?CLI:room" -msgstr "?CLI:комната" - -#: ../src/gajim-remote.py:289 +#: ../src/gajim-remote.py:288 msgid "Room JID" msgstr "JID комнаты" -#: ../src/gajim-remote.py:290 -msgid "?CLI:nick" -msgstr "?CLI:ник" +#: ../src/gajim-remote.py:289 +msgid "nick" +msgstr "Ðик" -#: ../src/gajim-remote.py:290 +#: ../src/gajim-remote.py:289 msgid "Nickname to use" msgstr "ИÑпользуемый ник" -#: ../src/gajim-remote.py:291 -msgid "?CLI:password" -msgstr "?CLI:пароль" +#: ../src/gajim-remote.py:290 +msgid "password" +msgstr "Пароль:" -#: ../src/gajim-remote.py:291 +#: ../src/gajim-remote.py:290 msgid "Password to enter the room" msgstr "Пароль Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° в комнату" -#: ../src/gajim-remote.py:292 +#: ../src/gajim-remote.py:291 msgid "Account from which you want to enter the room" msgstr "Выберите учетную запиÑÑŒ, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ вы хотите войти в комнату" -#: ../src/gajim-remote.py:297 +#: ../src/gajim-remote.py:296 msgid "Check if Gajim is running" msgstr "Проверить, запущен ли Gajim" -#: ../src/gajim-remote.py:301 +#: ../src/gajim-remote.py:300 msgid "Shows or hides the ipython window" msgstr "Скрывает или показывает окно ipython" -#: ../src/gajim-remote.py:328 +#: ../src/gajim-remote.py:327 msgid "Missing argument \"contact_jid\"" msgstr "Пропущен аргумент «JID контакта»" -#: ../src/gajim-remote.py:350 +#: ../src/gajim-remote.py:349 #, python-format msgid "" "'%s' is not in your roster.\n" @@ -9336,15 +8876,15 @@ msgstr "" "'%s' не в вашем роÑтере.\n" "Укажите учетную запиÑÑŒ Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ ÑообщениÑ." -#: ../src/gajim-remote.py:353 +#: ../src/gajim-remote.py:352 msgid "You have no active account" msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ ни одной активной учетной запиÑи" -#: ../src/gajim-remote.py:406 +#: ../src/gajim-remote.py:405 msgid "It seems Gajim is not running. So you can't use gajim-remote." msgstr "По-видимому, Gajim не запущен. Ð’Ñ‹ не можете иÑпользовать gajim-remote." -#: ../src/gajim-remote.py:433 +#: ../src/gajim-remote.py:432 #, python-format msgid "" "Usage: %(basename)s %(command)s %(arguments)s \n" @@ -9353,29 +8893,25 @@ msgstr "" "ИÑпользование: %(basename)s %(command)s %(arguments)s \n" "\t %(help)s" -#: ../src/gajim-remote.py:437 +#: ../src/gajim-remote.py:436 msgid "Arguments:" msgstr "Ðргументы:" -#: ../src/gajim-remote.py:441 +#: ../src/gajim-remote.py:440 #, python-format msgid "%s not found" msgstr "%s не найден" -#: ../src/gajim-remote.py:447 +#: ../src/gajim-remote.py:446 #, python-format msgid "" -"Usage:\n" -" %s command [arguments]\n" -"\n" +"Usage: %s command [arguments]\n" "Command is one of:\n" msgstr "" -"ИÑпользование:\n" -" %s команда [аргумента]\n" -"\n" +"ИÑпользование: %s команда [аргумента]\n" "Команда одна из:\n" -#: ../src/gajim-remote.py:517 +#: ../src/gajim-remote.py:515 #, python-format msgid "" "Too many arguments. \n" @@ -9384,7 +8920,7 @@ msgstr "" "Много аргументов. \n" "Ðаберите «%(basename)s help %(command)s» Ð´Ð»Ñ Ñправки" -#: ../src/gajim-remote.py:522 +#: ../src/gajim-remote.py:520 #, python-format msgid "" "Argument \"%(arg)s\" is not specified. \n" @@ -9393,11 +8929,11 @@ msgstr "" "Ðргумент «%(arg)s» не задан. \n" "Ðаберите «%(basename)s help %(command)s» Ð´Ð»Ñ Ñправки" -#: ../src/gajim-remote.py:541 +#: ../src/gajim-remote.py:539 msgid "No uri given" msgstr "Ðе указан идентификатор реÑурÑа" -#: ../src/gajim-remote.py:543 +#: ../src/gajim-remote.py:541 msgid "Wrong uri" msgstr "Ðеверный хоÑÑ‚" @@ -9423,213 +8959,217 @@ msgid "You cannot delete your current theme" msgstr "Ð’Ñ‹ не можете удалить вашу текущую тему" #: ../src/gajim_themes_window.py:187 -msgid "Please first choose another theme as your current theme." +msgid "Please first choose another for your current theme." msgstr "Выберите Ñначала другую тему." -#: ../src/groupchat_control.py:181 ../src/groupchat_control.py:1645 +#: ../src/groupchat_control.py:179 +#: ../src/groupchat_control.py:1569 #, python-format msgid "%(nick)s is now known as %(new_nick)s" msgstr "%(nick)s теперь извеÑтен как %(new_nick)s" -#: ../src/groupchat_control.py:236 +#: ../src/groupchat_control.py:234 msgid "Sending private message failed" msgstr "Ðе удалоÑÑŒ отправить личное Ñообщение" #. in second %s code replaces with nickname -#: ../src/groupchat_control.py:238 +#: ../src/groupchat_control.py:236 #, python-format msgid "You are no longer in group chat \"%(room)s\" or \"%(nick)s\" has left." msgstr "Ð’Ñ‹ больше не находитеÑÑŒ в комнате «%(room)s» или «%(nick)s» вышел." -#: ../src/groupchat_control.py:584 +#: ../src/groupchat_control.py:565 msgid "Insert Nickname" msgstr "Ð’Ñтавить ник" -#: ../src/groupchat_control.py:767 +#: ../src/groupchat_control.py:748 msgid "Conversation with " msgstr "БеÑеда Ñ " -#: ../src/groupchat_control.py:769 +#: ../src/groupchat_control.py:750 msgid "Continued conversation" msgstr "Ð’Ð¾Ð·Ð¾Ð±Ð½Ð¾Ð²Ð»Ñ‘Ð½Ð½Ð°Ñ Ð±ÐµÑеда" -#: ../src/groupchat_control.py:1268 +#: ../src/groupchat_control.py:1227 #, python-format msgid "%(nick)s has set the subject to %(subject)s" msgstr "%(nick)s уÑтановил(а) тему: %(subject)s" #. Can be a presence (see chg_contact_status in groupchat_control.py) -#: ../src/groupchat_control.py:1286 ../src/groupchat_control.py:1587 +#: ../src/groupchat_control.py:1245 +#: ../src/groupchat_control.py:1511 msgid "Any occupant is allowed to see your full JID" msgstr "Любой учаÑтник может увидеть ваш наÑтоÑщий JID" -#: ../src/groupchat_control.py:1289 -msgid "Room now shows unavailable members" -msgstr "Теперь в комнате отображаютÑÑ Ð½ÐµÐ´Ð¾Ñтупные учаÑтники" +#: ../src/groupchat_control.py:1248 +msgid "Room now shows unavailable member" +msgstr "Теперь в комнате отображаетÑÑ Ð½ÐµÐ´Ð¾Ñтупный учаÑтник" -#: ../src/groupchat_control.py:1291 -msgid "Room now does not show unavailable members" +#: ../src/groupchat_control.py:1250 +msgid "room now does not show unavailable members" msgstr "теперь в комнате не отображаютÑÑ Ð½ÐµÐ´Ð¾Ñтупные учаÑтники" -#: ../src/groupchat_control.py:1293 +#: ../src/groupchat_control.py:1252 msgid "A non-privacy-related room configuration change has occurred" -msgstr "" -"Произошло изменение наÑтроек комнаты, не отноÑÑщееÑÑ Ðº наÑтройкам приватноÑти" +msgstr "Произошло изменение наÑтроек комнаты, не отноÑÑщееÑÑ Ðº наÑтройкам приватноÑти" #. Can be a presence (see chg_contact_status in groupchat_control.py) -#: ../src/groupchat_control.py:1297 +#: ../src/groupchat_control.py:1256 msgid "Room logging is now enabled" msgstr "ЗапиÑÑŒ логов конференции включена" -#: ../src/groupchat_control.py:1299 +#: ../src/groupchat_control.py:1258 msgid "Room logging is now disabled" msgstr "ЗапиÑÑŒ логов конференции выключена" -#: ../src/groupchat_control.py:1301 +#: ../src/groupchat_control.py:1260 msgid "Room is now non-anonymous" msgstr "ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ð½Ðµ анонимна" -#: ../src/groupchat_control.py:1304 +#: ../src/groupchat_control.py:1263 msgid "Room is now semi-anonymous" msgstr "ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ñ‡Ð°Ñтично анонимна" -#: ../src/groupchat_control.py:1307 +#: ../src/groupchat_control.py:1266 msgid "Room is now fully-anonymous" msgstr "ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾Ñтью анонимна" -#: ../src/groupchat_control.py:1580 ../src/groupchat_control.py:2241 -#: ../src/gui_interface.py:605 ../src/roster_window.py:3325 -#, python-format -msgid "%(jid)s has been invited in this room" -msgstr "%(jid)s был приглашен в комнату" - #. Can be a message (see handle_event_gc_config_change in #. gajim.py) -#: ../src/groupchat_control.py:1592 +#: ../src/groupchat_control.py:1516 msgid "Room logging is enabled" msgstr "ЗапиÑÑŒ логов конференции включена" -#: ../src/groupchat_control.py:1594 +#: ../src/groupchat_control.py:1518 msgid "A new room has been created" msgstr "ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð¼Ð½Ð°Ñ‚Ð° была Ñоздана" -#: ../src/groupchat_control.py:1597 +#: ../src/groupchat_control.py:1521 msgid "The server has assigned or modified your roomnick" msgstr "Сервер приÑвоил или изменил ваш ник в комнате" #. do not print 'kicked by None' -#: ../src/groupchat_control.py:1603 +#: ../src/groupchat_control.py:1527 #, python-format msgid "%(nick)s has been kicked: %(reason)s" msgstr "%(nick)s выгнали из комнаты: %(reason)s" -#: ../src/groupchat_control.py:1606 +#: ../src/groupchat_control.py:1530 #, 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:1615 +#: ../src/groupchat_control.py:1539 #, python-format msgid "%(nick)s has been banned: %(reason)s" msgstr "%(nick)s запретили заходить в комнату: %(reason)s" -#: ../src/groupchat_control.py:1618 +#: ../src/groupchat_control.py:1542 #, python-format msgid "%(nick)s has been banned by %(who)s: %(reason)s" msgstr "%(who)s запретил(а) %(nick)s заходить в комнату: %(reason)s" -#: ../src/groupchat_control.py:1629 ../src/groupchat_control.py:1745 +#: ../src/groupchat_control.py:1553 +#: ../src/groupchat_control.py:1657 #, python-format msgid "You are now known as %s" msgstr "Ð’Ñ‹ теперь извеÑтны как %s" -#: ../src/groupchat_control.py:1699 ../src/groupchat_control.py:1704 -#: ../src/groupchat_control.py:1710 +#: ../src/groupchat_control.py:1611 +#: ../src/groupchat_control.py:1616 +#: ../src/groupchat_control.py:1622 #, python-format msgid "%(nick)s has been removed from the room (%(reason)s)" msgstr "%(nick)s выгнали из комнаты (%(reason)s)" -#: ../src/groupchat_control.py:1701 +#: ../src/groupchat_control.py:1613 msgid "affiliation changed" msgstr "ранг изменен" -#: ../src/groupchat_control.py:1706 +#: ../src/groupchat_control.py:1618 msgid "room configuration changed to members-only" msgstr "наÑтройки комнаты были изменены на 'только Ð´Ð»Ñ ÑƒÑ‡Ð°Ñтников'" -#: ../src/groupchat_control.py:1712 +#: ../src/groupchat_control.py:1624 msgid "system shutdown" msgstr "выключение Ñервера" -#: ../src/groupchat_control.py:1795 +#: ../src/groupchat_control.py:1707 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s by %(actor)s" msgstr "** %(actor)s приÑвоил %(nick)s ранг %(affiliation)s" -#: ../src/groupchat_control.py:1799 +#: ../src/groupchat_control.py:1711 #, python-format msgid "** Affiliation of %(nick)s has been set to %(affiliation)s" msgstr "** Ранг %(nick)s был изменен на %(affiliation)s" -#: ../src/groupchat_control.py:1814 +#: ../src/groupchat_control.py:1726 #, python-format msgid "** Role of %(nick)s has been set to %(role)s by %(actor)s" msgstr "** %(actor)s приÑвоил %(nick)s обÑзанноÑти %(role)s" -#: ../src/groupchat_control.py:1818 +#: ../src/groupchat_control.py:1730 #, python-format msgid "** Role of %(nick)s has been set to %(role)s" msgstr "** ОбÑзанноÑти %(nick)s были изменены на %(role)s" -#: ../src/groupchat_control.py:1848 +#: ../src/groupchat_control.py:1760 #, python-format msgid "%s has left" msgstr "%s ушел" -#: ../src/groupchat_control.py:1853 +#: ../src/groupchat_control.py:1765 #, python-format msgid "%s has joined the group chat" msgstr "%s зашёл в комнату" -#: ../src/groupchat_control.py:2124 +#: ../src/groupchat_control.py:2020 #, python-format msgid "Are you sure you want to leave group chat \"%s\"?" msgstr "Ð’Ñ‹ точно хотите выйти из комнаты «%s»?" -#: ../src/groupchat_control.py:2126 -msgid "" -"If you close this window, you will be disconnected from this group chat." +#: ../src/groupchat_control.py:2022 +msgid "If you close this window, you will be disconnected from this group chat." msgstr "ЕÑли вы закроете Ñто окно, то вы выйдете из Ñтой комнаты." -#: ../src/groupchat_control.py:2165 +#: ../src/groupchat_control.py:2026 +#: ../src/gui_interface.py:704 +#: ../src/gui_interface.py:1411 +#: ../src/gui_interface.py:1451 +#: ../src/gui_interface.py:1492 +#: ../src/message_window.py:222 +#: ../src/roster_window.py:3064 +#: ../src/roster_window.py:3799 +#: ../src/roster_window.py:4612 +msgid "_Do not ask me again" +msgstr "Ðе _Ñпрашивать Ð¼ÐµÐ½Ñ Ñнова" + +#: ../src/groupchat_control.py:2060 msgid "Changing Subject" msgstr "Смена темы" -#: ../src/groupchat_control.py:2166 +#: ../src/groupchat_control.py:2061 msgid "Please specify the new subject:" msgstr "Введите новую тему:" -#: ../src/groupchat_control.py:2173 +#: ../src/groupchat_control.py:2068 msgid "Changing Nickname" msgstr "Смена ника" -#: ../src/groupchat_control.py:2174 +#: ../src/groupchat_control.py:2069 msgid "Please specify the new nickname you want to use:" msgstr "Введите новый ник, который вы хотите иÑпользовать:" -#: ../src/groupchat_control.py:2199 -msgid "The group chat Jabber ID has not allowed characters." -msgstr "Ð’ Jabber ID комнаты или Ñервера ÑодержатÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимые Ñимволы." - # ÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð³Ð´Ðµ вылазит меÑедж - нужно приÑмотретьÑÑ #. Ask for a reason -#: ../src/groupchat_control.py:2205 +#: ../src/groupchat_control.py:2100 #, python-format msgid "Destroying %s" msgstr "Удаление %s" -#: ../src/groupchat_control.py:2206 +#: ../src/groupchat_control.py:2101 msgid "" "You are going to definitively destroy this room.\n" "You may specify a reason below:" @@ -9637,22 +9177,30 @@ msgstr "" "Ð’Ñ‹ ÑобираетеÑÑŒ полноÑтью уничтожить Ñту комнату.\n" "Можете указать причину:" -#: ../src/groupchat_control.py:2208 +#: ../src/groupchat_control.py:2103 msgid "You may also enter an alternate venue:" msgstr "Можете указать альтернативную комнату:" +#: ../src/groupchat_control.py:2135 +#: ../src/gui_interface.py:604 +#: ../src/roster_window.py:3390 +#, python-format +msgid "%(jid)s has been invited in this room" +msgstr "%(jid)s был приглашен в комнату" + #. ask for reason -#: ../src/groupchat_control.py:2408 +#: ../src/groupchat_control.py:2300 #, python-format msgid "Kicking %s" msgstr "ВыгонÑем %s" -#: ../src/groupchat_control.py:2409 ../src/groupchat_control.py:2742 +#: ../src/groupchat_control.py:2301 +#: ../src/groupchat_control.py:2633 msgid "You may specify a reason below:" msgstr "Ð’Ñ‹ можете указать причину ниже:" #. ask for reason -#: ../src/groupchat_control.py:2741 +#: ../src/groupchat_control.py:2632 #, python-format msgid "Banning %s" msgstr "Забанить %s" @@ -9662,12 +9210,8 @@ msgid "A programming error has been detected" msgstr "Обнаружена ошибка в программе" #: ../src/gtkexcepthook.py:47 -msgid "" -"It probably is not fatal, but should be reported to the developers " -"nonetheless." -msgstr "" -"Возможно Ñто не так Ñтрашно, но вÑе равно Ñтоит Ñообщить об Ñтом " -"разработчикам." +msgid "It probably is not fatal, but should be reported to the developers nonetheless." +msgstr "Возможно Ñто не так Ñтрашно, но вÑе равно Ñтоит Ñообщить об Ñтом разработчикам." #: ../src/gtkexcepthook.py:54 msgid "_Report Bug" @@ -9703,8 +9247,7 @@ msgstr "Ð’Ñ‹ хотите Ñделать Gajim оÑновным jabber-клие #: ../src/gtkgui_helpers.py:768 msgid "Always check to see if Gajim is the default Jabber client on startup" -msgstr "" -"Ð’Ñегда проверÑÑ‚ÑŒ при запуÑке ÑвлÑетÑÑ Ð»Ð¸ Gajim оÑновным jabber-клиентом" +msgstr "Ð’Ñегда проверÑÑ‚ÑŒ при запуÑке ÑвлÑетÑÑ Ð»Ð¸ Gajim оÑновным jabber-клиентом" #: ../src/gtkgui_helpers.py:835 msgid "Extension not supported" @@ -9713,9 +9256,7 @@ msgstr "РаÑширение не поддерживаетÑÑ" #: ../src/gtkgui_helpers.py:836 #, python-format msgid "Image cannot be saved in %(type)s format. Save as %(new_filename)s?" -msgstr "" -"Изображение Ð½ÐµÐ»ÑŒÐ·Ñ Ñохранить в формате %(type)s. Сохранить как " -"%(new_filename)s?" +msgstr "Изображение Ð½ÐµÐ»ÑŒÐ·Ñ Ñохранить в формате %(type)s. Сохранить как %(new_filename)s?" #: ../src/gtkgui_helpers.py:872 msgid "Save Image as..." @@ -9723,105 +9264,108 @@ msgstr "Сохранить изображение как..." #. we are banned #. group chat does not exist -#: ../src/gui_interface.py:134 ../src/gui_interface.py:298 -#: ../src/gui_interface.py:307 ../src/gui_interface.py:313 -#: ../src/gui_interface.py:316 ../src/gui_interface.py:319 -#: ../src/gui_interface.py:324 +#: ../src/gui_interface.py:133 +#: ../src/gui_interface.py:297 +#: ../src/gui_interface.py:306 +#: ../src/gui_interface.py:312 +#: ../src/gui_interface.py:315 +#: ../src/gui_interface.py:318 +#: ../src/gui_interface.py:323 msgid "Unable to join group chat" msgstr "Ðе получаетÑÑ Ð²Ð¾Ð¹Ñ‚Ð¸ в комнату" -#: ../src/gui_interface.py:135 +#: ../src/gui_interface.py:134 #, python-format msgid "" -"Your desired nickname in group chat %s 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 "" -"Тот ник, что вы ввели в комнате %s уже иÑпользуетÑÑ Ð¸Ð»Ð¸ зарегиÑтрирован " -"другим пользователем.\n" +"Тот ник, что вы ввели в комнате %s уже иÑпользуетÑÑ Ð¸Ð»Ð¸ зарегиÑтрирован другим пользователем.\n" "Укажите другой ник:" -#: ../src/gui_interface.py:138 +#: ../src/gui_interface.py:137 msgid "Always use this nickname when there is a conflict" msgstr "Ð’Ñегда иÑпользовать Ñтот ник в Ñлучае конфликта" -#: ../src/gui_interface.py:155 +#: ../src/gui_interface.py:154 msgid "Do you accept this request?" msgstr "Ð’Ñ‹ принимаете Ñтот запроÑ?" -#: ../src/gui_interface.py:157 +#: ../src/gui_interface.py:156 #, python-format msgid "Do you accept this request on account %s?" msgstr "Ð’Ñ‹ принимаете Ð·Ð°Ð¿Ñ€Ð¾Ñ %s?" -#: ../src/gui_interface.py:160 +#: ../src/gui_interface.py:159 #, python-format msgid "HTTP (%(method)s) Authorization for %(url)s (id: %(id)s)" msgstr "HTTP (%(method)s) ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð»Ñ %(url)s (id: %(id)s)" -#: ../src/gui_interface.py:203 ../src/notify.py:282 +#: ../src/gui_interface.py:202 +#: ../src/notify.py:282 msgid "Connection Failed" msgstr "Соединение разорвалоÑÑŒ" -#: ../src/gui_interface.py:287 +#: ../src/gui_interface.py:286 #, python-format msgid "A Password is required to join the room %s. Please type it." msgstr "Чтобы войти в комнату %s, нужен пароль." -#: ../src/gui_interface.py:299 +#: ../src/gui_interface.py:298 #, python-format msgid "Maximum number of users for <b>%s</b> has been reached" msgstr "Было доÑтигнуто макÑимальное количеÑтво пользователей <b>%s</b>" -#: ../src/gui_interface.py:308 +#: ../src/gui_interface.py:307 #, python-format msgid "You are banned from group chat <b>%s</b>." msgstr "Вам запрещено входить в комнату <b>%s</b>." -#: ../src/gui_interface.py:314 +#: ../src/gui_interface.py:313 #, python-format msgid "Group chat <b>%s</b> does not exist." msgstr "Комнаты <b>%s</b> не ÑущеÑтвует." -#: ../src/gui_interface.py:317 +#: ../src/gui_interface.py:316 msgid "Group chat creation is restricted." msgstr "Создание комнат запрещено." -#: ../src/gui_interface.py:320 +#: ../src/gui_interface.py:319 #, python-format msgid "Your registered nickname must be used in group chat <b>%s</b>." -msgstr "" -"Ðеобходимо иÑпользовать ваш зарегиÑтрированный ник в комнате <b>%s</b>." +msgstr "Ðеобходимо иÑпользовать ваш зарегиÑтрированный ник в комнате <b>%s</b>." -#: ../src/gui_interface.py:325 +#: ../src/gui_interface.py:324 #, python-format msgid "You are not in the members list in groupchat %s." msgstr "Ð’Ð°Ñ Ð½ÐµÑ‚ в ÑпиÑке членов комнаты %s." -#: ../src/gui_interface.py:418 ../src/gui_interface.py:422 +#: ../src/gui_interface.py:417 +#: ../src/gui_interface.py:421 #, python-format msgid "Error %(code)s: %(msg)s" msgstr "Ошибка %(code)s: %(msg)s" -#: ../src/gui_interface.py:474 ../src/notify.py:284 +#: ../src/gui_interface.py:473 +#: ../src/notify.py:284 msgid "Subscription request" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки" -#: ../src/gui_interface.py:499 +#: ../src/gui_interface.py:498 msgid "Authorization accepted" msgstr "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ð½Ñта" -#: ../src/gui_interface.py:500 +#: ../src/gui_interface.py:499 #, python-format msgid "The contact \"%s\" has authorized you to see his or her status." msgstr "Контакт «%s» авторизовал ваÑ, теперь вы можете видеть его ÑтатуÑ." -#: ../src/gui_interface.py:508 +#: ../src/gui_interface.py:507 #, python-format msgid "Contact \"%s\" removed subscription from you" msgstr "Контакт «%s» отозвал подпиÑку Ñ Ð²Ð°Ð¼Ð¸" -#: ../src/gui_interface.py:509 +#: ../src/gui_interface.py:508 msgid "" "You will always see him or her as offline.\n" "Do you want to remove him or her from your contact list?" @@ -9829,92 +9373,79 @@ msgstr "" "Ð’Ñ‹ вÑегда будете видеть его или её как отключенными.\n" "Удалить его или её из контакт-лиÑта?" -#: ../src/gui_interface.py:530 ../src/notify.py:286 +#: ../src/gui_interface.py:529 +#: ../src/notify.py:286 msgid "Unsubscribed" msgstr "От подпиÑки отказалÑÑ" -#: ../src/gui_interface.py:541 +#: ../src/gui_interface.py:540 #, python-format msgid "Contact with \"%s\" cannot be established" msgstr "СвÑзь Ñ Â«%s» не может быть уÑтановлена" -#: ../src/gui_interface.py:625 +#: ../src/gui_interface.py:624 #, python-format msgid "%(jid)s declined the invitation: %(reason)s" msgstr "" -#: ../src/gui_interface.py:629 -#, fuzzy, python-format +#: ../src/gui_interface.py:628 +#, python-format msgid "%(jid)s declined the invitation" -msgstr "ПринÑÑ‚ÑŒ приглашение в чат?" - -#: ../src/gui_interface.py:658 -msgid "" -"You configured Gajim to use OpenPGP agent, but there is no OpenPGP agent " -"running or it returned a wrong passphrase.\n" msgstr "" -"Gajim наÑтроен на иÑпользование OpenPGP агента, но OpenPGP агент не запущен " -"или он возвратил неверный пароль.\n" -#: ../src/gui_interface.py:661 ../src/gui_interface.py:669 +#: ../src/gui_interface.py:657 +msgid "You configured Gajim to use GPG agent, but there is no GPG agent running or it returned a wrong passphrase.\n" +msgstr "Gajim наÑтроен на иÑпользование GPG агента, но GPG агент не запущен или он возвратил неверный пароль.\n" + +#: ../src/gui_interface.py:659 +#: ../src/gui_interface.py:667 msgid "You are currently connected without your OpenPGP key." msgstr "Ð’Ñ‹ ÑÐµÐ¹Ñ‡Ð°Ñ Ñоединены без ключа OpenPGP." -#: ../src/gui_interface.py:663 +#: ../src/gui_interface.py:661 msgid "Your passphrase is incorrect" msgstr "Ваша Ð¿Ð°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° неверна" -#: ../src/gui_interface.py:668 -msgid "OpenPGP Passphrase Incorrect" -msgstr "ÐŸÐ°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° OpenPGP неверна" +#: ../src/gui_interface.py:666 +msgid "OpenGPG Passphrase Incorrect" +msgstr "ÐŸÐ°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° OpenGPG неверна" -#: ../src/gui_interface.py:681 +#: ../src/gui_interface.py:679 #, fuzzy msgid "Certificate Passphrase Required" -msgstr "Сервер требует Ñертификат TLS" +msgstr "Сертификат проÑрочен" -#: ../src/gui_interface.py:682 -#, python-format +#: ../src/gui_interface.py:680 +#, fuzzy, python-format msgid "Enter the passphrase for the certificate for account %s" -msgstr "Введите пароль Ð´Ð»Ñ Ñертификата учетной запиÑи %s" +msgstr "Введите пароль Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡Ð° %(keyid)s (аккаунт %(account)s)." -#: ../src/gui_interface.py:704 -msgid "OpenPGP key not trusted" -msgstr "Ключ OpenPGP не ÑвлÑетÑÑ Ð´Ð¾Ð²ÐµÑ€ÐµÐ½Ð½Ñ‹Ð¼" +#: ../src/gui_interface.py:702 +msgid "GPG key not trusted" +msgstr "Ключ GPG не ÑвлÑетÑÑ Ð´Ð¾Ð²ÐµÑ€ÐµÐ½Ð½Ñ‹Ð¼" -#: ../src/gui_interface.py:704 -msgid "" -"The OpenPGP key used to encrypt this chat is not trusted. Do you really want " -"to encrypt this message?" -msgstr "" -"Ключ OpenPGP иÑпользуемый Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ ÑвлÑетÑÑ Ð´Ð¾Ð²ÐµÑ€ÐµÐ½Ð½Ñ‹Ð¼. Ð’Ñ‹ " -"дейÑтвительно хотите зашифровать Ñти ÑообщениÑ?" +#: ../src/gui_interface.py:702 +msgid "The GPG key used to encrypt this chat is not trusted. Do you really want to encrypt this message?" +msgstr "Ключ GPG иÑпользуемый Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ ÑвлÑетÑÑ Ð´Ð¾Ð²ÐµÑ€ÐµÐ½Ð½Ñ‹Ð¼. Ð’Ñ‹ дейÑтвительно хотите зашифровать Ñти ÑообщениÑ?" -#: ../src/gui_interface.py:717 -msgid "" -"Gnome Keyring is installed but not correctly started (environment variable " -"probably not correctly set)" -msgstr "" -"Gnome Keyring уÑтановлен, но некорректно запущен (возможно, неверно " -"уÑтановлена Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñреды)" +#: ../src/gui_interface.py:715 +msgid "Gnome Keyring is installed but not correctly started (environment variable probably not correctly set)" +msgstr "Gnome Keyring уÑтановлен, но некорректно запущен (возможно, неверно уÑтановлена Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñреды)" -#: ../src/gui_interface.py:755 -msgid "" -"Please copy / paste the refresh token from the website that has just been " -"opened." +#: ../src/gui_interface.py:753 +msgid "Please copy / paste the refresh token from the website that has just been opened." msgstr "" -#: ../src/gui_interface.py:758 -#, fuzzy +#: ../src/gui_interface.py:756 msgid "Oauth2 Credentials" -msgstr "Сетевые учётные ÑведениÑ" +msgstr "" -#: ../src/gui_interface.py:856 +#: ../src/gui_interface.py:846 #, python-format msgid "New mail on %(gmail_mail_address)s" msgstr "Ðовое пиÑьмо на %(gmail_mail_address)s" -#: ../src/gui_interface.py:858 +#: ../src/gui_interface.py:848 #, python-format msgid "You have %d new mail conversation" msgid_plural "You have %d new mail conversations" @@ -9922,7 +9453,7 @@ msgstr[0] "У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ %d непрочитанное пиÑьмо" msgstr[1] "У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ %d непрочитанных пиÑьма" msgstr[2] "У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ %d непрочитанных пиÑем" -#: ../src/gui_interface.py:871 +#: ../src/gui_interface.py:861 #, python-format msgid "" "\n" @@ -9937,331 +9468,326 @@ msgstr "" "Тема: %(subject)s\n" "%(snippet)s" -#: ../src/gui_interface.py:941 +#: ../src/gui_interface.py:931 #, python-format msgid "%s wants to send you a file." msgstr "%s хочет отправить вам файл." -#: ../src/gui_interface.py:1038 +#: ../src/gui_interface.py:1028 +#, fuzzy msgid "File Transfer Failed" -msgstr "Ðе удалоÑÑŒ произвеÑти передачу файлов" +msgstr "Передача файлов заверешна" -#: ../src/gui_interface.py:1059 +#: ../src/gui_interface.py:1049 #, python-format msgid "You successfully received %(filename)s from %(name)s." msgstr "УÑпешно получен файл %(filename)s от %(name)s." -#: ../src/gui_interface.py:1063 +#: ../src/gui_interface.py:1053 #, python-format msgid "File transfer of %(filename)s from %(name)s stopped." msgstr "Передача файла %(filename)s от %(name)s приоÑтановлена." #. ft hash error -#: ../src/gui_interface.py:1067 -#, python-format +#: ../src/gui_interface.py:1057 +#, fuzzy, python-format msgid "File transfer of %(filename)s from %(name)s failed." -msgstr "Передача файла %(filename)s от %(name)s не удалаÑÑŒ." +msgstr "Передача файла %(filename)s от %(name)s приоÑтановлена." -#: ../src/gui_interface.py:1080 +#: ../src/gui_interface.py:1070 #, python-format msgid "You successfully sent %(filename)s to %(name)s." msgstr "%(name)s уÑпешно получил(а) отправленный вами файл %(filename)s." -#: ../src/gui_interface.py:1084 +#: ../src/gui_interface.py:1074 #, python-format msgid "File transfer of %(filename)s to %(name)s stopped." msgstr "Передача файла %(filename)s к %(name)s приоÑтановлена." #. ft hash error -#: ../src/gui_interface.py:1088 -#, python-format +#: ../src/gui_interface.py:1078 +#, fuzzy, python-format msgid "File transfer of %(filename)s to %(name)s failed." -msgstr "Передача файла %(filename)s к %(name)s не удалаÑÑŒ." +msgstr "Передача файла %(filename)s к %(name)s приоÑтановлена." -#: ../src/gui_interface.py:1163 +#: ../src/gui_interface.py:1153 msgid "Unable to decrypt message" msgstr "Сообщение не удалоÑÑŒ раÑшифровать" -#: ../src/gui_interface.py:1175 +#: ../src/gui_interface.py:1165 msgid "Username Conflict" msgstr "Такое Ð¸Ð¼Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ" -#: ../src/gui_interface.py:1176 +#: ../src/gui_interface.py:1166 msgid "Please type a new username for your local account" msgstr "Введите новое Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð¹ учетной запиÑи" -#: ../src/gui_interface.py:1191 +#: ../src/gui_interface.py:1181 msgid "Resource Conflict" msgstr "Такое Ð¸Ð¼Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ" -#: ../src/gui_interface.py:1192 -msgid "" -"You are already connected to this account with the same resource. Please " -"type a new one" -msgstr "" -"Ð’Ñ‹ уже подÑоединены к Ñтой учетной запиÑи Ñ Ñ‚Ð°ÐºÐ¸Ð¼ же реÑурÑом. Введите " -"другой реÑурÑ" +#: ../src/gui_interface.py:1182 +msgid "You are already connected to this account with the same resource. Please type a new one" +msgstr "Ð’Ñ‹ уже подÑоединены к Ñтой учетной запиÑи Ñ Ñ‚Ð°ÐºÐ¸Ð¼ же реÑурÑом. Введите другой реÑурÑ" #. TODO: we should use another pixmap ;-) -#: ../src/gui_interface.py:1247 +#: ../src/gui_interface.py:1237 #, python-format msgid "%s wants to start a voice chat." msgstr "%s хочет начать видео ÑеанÑ." -#: ../src/gui_interface.py:1250 +#: ../src/gui_interface.py:1240 msgid "Voice Chat Request" msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð°ÑƒÐ´Ð¸Ð¾ ÑеанÑа" -#: ../src/gui_interface.py:1337 +#: ../src/gui_interface.py:1327 msgid "Error verifying SSL certificate" msgstr "Ошибка при проверке SSL Ñертификата" -#: ../src/gui_interface.py:1338 +#: ../src/gui_interface.py:1328 #, python-format msgid "" -"There was an error verifying the SSL certificate of your jabber server: " -"%(error)s\n" +"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 "" -"Произошла ошибка при проверке Ñертификата SSL вашего jabber Ñервера: " -"%(error)s\n" +"Произошла ошибка при проверке Ñертификата SSL вашего jabber Ñервера: %(error)s\n" "Ð’Ñ‹ вÑÑ‘ ещё хотите подключитьÑÑ Ðº Ñтому Ñерверу?" -#: ../src/gui_interface.py:1347 +#: ../src/gui_interface.py:1337 msgid "Ignore this error for this certificate." msgstr "Игнорировать Ñту ошибку Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ñертификата." -#: ../src/gui_interface.py:1372 +#: ../src/gui_interface.py:1362 msgid "SSL certificate error" msgstr "Ошибка SSL Ñертификата" -#: ../src/gui_interface.py:1373 +#: ../src/gui_interface.py:1363 #, python-format msgid "" -"It seems the SSL certificate of account %(account)s has changed or your " -"connection is being hacked.\n" +"It seems the SSL certificate of account %(account)s has changed or your connection is being hacked.\n" "Old fingerprint: %(old)s\n" "New fingerprint: %(new)s\n" "\n" "Do you still want to connect and update the fingerprint of the certificate?" msgstr "" -"По видимому, Ñертификат SSL учетной запиÑи %(account)s изменилÑÑ Ð¸Ð»Ð¸ ваше " -"Ñоединение было взломано.\n" +"По видимому, Ñертификат SSL учетной запиÑи %(account)s изменилÑÑ Ð¸Ð»Ð¸ ваше Ñоединение было взломано.\n" "Старый отпечаток: %(old)s\n" "Ðовый отпечаток: %(new)s\n" "Ð’Ñ‹ вÑÑ‘ ещё хотите ÑоединитьÑÑ Ð¸ обновить отпечаток Ñертификата?" -#: ../src/gui_interface.py:1445 -msgid "" -"You are about to send your password on an insecure connection. You should " -"install PyOpenSSL to prevent that. Are you sure you want to do that?" -msgstr "" -"Ð’Ñ‹ хотите отправить пароль через небезопаÑное Ñоединение. Ð’Ñ‹ уверены? " -"(УÑтановите PyOpenSSL, чтобы Ñтого не проиÑходило.)" +#: ../src/gui_interface.py:1402 +#: ../src/gui_interface.py:1446 +#: ../src/gui_interface.py:1488 +msgid "Insecure connection" +msgstr "ÐебезопаÑное Ñоединение" -#: ../src/gui_interface.py:1487 +#: ../src/gui_interface.py:1403 +#, python-format msgid "" -"You are about to send your password unencrypted on an insecure connection. " +"You are about to connect to the account %(account)s (%(server)s) with an insecure connection. This means all your conversations will be exchanged unencrypted. This type of connection is really discouraged.\n" "Are you sure you want to do that?" +msgstr "" +"Ð’Ñ‹ хотите подключить учетную запиÑÑŒ %(account)s (%(server)s) через незащищенное Ñоединение. Ð’ÑÑ Ð²Ð°ÑˆÐ° перепиÑка не будет зашифрована. Ðтот тип Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ðµ рекомендуетÑÑ.\n" +"Ð’Ñ‹ дейÑтвительно хотите Ñто Ñделать?" + +#: ../src/gui_interface.py:1409 +#: ../src/gui_interface.py:1450 +#: ../src/gui_interface.py:1491 +msgid "Yes, I really want to connect insecurely" +msgstr "Да, Ñ Ð´ÐµÐ¹Ñтвительно хочу ÑоединитьÑÑ Ð½ÐµÐ±ÐµÐ·Ð¾Ð¿Ð°Ñно" + +#: ../src/gui_interface.py:1410 +msgid "Gajim will NOT connect unless you check this box" +msgstr "" + +#: ../src/gui_interface.py:1447 +msgid "You are about to send your password on an insecure connection. You should install PyOpenSSL to prevent that. Are you sure you want to do that?" +msgstr "Ð’Ñ‹ хотите отправить пароль через небезопаÑное Ñоединение. Ð’Ñ‹ уверены? (УÑтановите PyOpenSSL, чтобы Ñтого не проиÑходило.)" + +#: ../src/gui_interface.py:1489 +msgid "You are about to send your password unencrypted on an insecure connection. Are you sure you want to do that?" msgstr "Ð’Ñ‹ хотите отправить пароль через небезопаÑное Ñоединение. Ð’Ñ‹ уверены?" #. theme doesn't exist, disable emoticons -#: ../src/gui_interface.py:1993 ../src/gui_interface.py:2016 +#: ../src/gui_interface.py:1995 +#: ../src/gui_interface.py:2018 msgid "Emoticons disabled" msgstr "Смайлики выключены" -#: ../src/gui_interface.py:1994 -msgid "" -"Your configured emoticons theme has not been found, so emoticons have been " -"disabled." +#: ../src/gui_interface.py:1996 +msgid "Your configured emoticons theme has not been found, so emoticons have been disabled." msgstr "Тема Ñмайликов не найдена, они будут отключены." -#: ../src/gui_interface.py:2017 -msgid "" -"Your configured emoticons theme cannot been loaded. You maybe need to update " -"the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons " -"for more details." -msgstr "" -"Смайлики не могут быть загружены. Возможно, вам нужно обновить формат файла " -"emoticons.py. ПодробноÑти на http://trac.gajim.org/wiki/Emoticons." +#: ../src/gui_interface.py:2019 +msgid "Your configured emoticons theme cannot been loaded. You maybe need to update the format of emoticons.py file. See http://trac.gajim.org/wiki/Emoticons for more details." +msgstr "Смайлики не могут быть загружены. Возможно, вам нужно обновить формат файла emoticons.py. ПодробноÑти на http://trac.gajim.org/wiki/Emoticons." -#: ../src/gui_interface.py:2061 ../src/roster_window.py:3897 +#: ../src/gui_interface.py:2063 +#: ../src/roster_window.py:3966 msgid "You cannot join a group chat while you are invisible" msgstr "Ð’Ñ‹ не можете зайти в комнату, так как вы в режиме невидимоÑти." #. it is good to notify the user #. in case he or she cannot see the output of the console -#: ../src/gui_interface.py:2448 +#: ../src/gui_interface.py:2450 msgid "Could not save your settings and preferences" msgstr "Ðе могу Ñохранить ваши уÑтановки и наÑтройки" -#: ../src/gui_interface.py:3038 +#: ../src/gui_interface.py:3008 msgid "Passphrase Required" msgstr "ТребуетÑÑ Ð¿Ð°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð°" -#: ../src/gui_interface.py:3039 +#: ../src/gui_interface.py:3009 #, python-format -msgid "Enter OpenPGP key passphrase for key %(keyid)s (account %(account)s)." -msgstr "Введите пароль Ð´Ð»Ñ OpenPGP ключа %(keyid)s (аккаунт %(account)s)." +msgid "Enter GPG key passphrase for key %(keyid)s (account %(account)s)." +msgstr "Введите пароль Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡Ð° %(keyid)s (аккаунт %(account)s)." -#: ../src/gui_interface.py:3053 -msgid "OpenPGP key expired" -msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° OpenPGP иÑтёк" +#: ../src/gui_interface.py:3023 +msgid "GPG key expired" +msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° GPG иÑтёк" -#: ../src/gui_interface.py:3054 +#: ../src/gui_interface.py:3024 #, python-format -msgid "" -"Your OpenPGP key has expired, you will be connected to %s without OpenPGP." -msgstr "" -"Срок дейÑÑ‚Ð²Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ключа OpenPGP иÑтёк, вы будете подключены к %s без " -"иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ OpenPGP." +msgid "Your GPG key has expired, you will be connected to %s without OpenPGP." +msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ключа GPG иÑтёк, вы будете подключены к %s без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ OpenPGP." #. ask again -#: ../src/gui_interface.py:3063 +#: ../src/gui_interface.py:3033 msgid "Wrong Passphrase" msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ„Ñ€Ð°Ð·Ð°" -#: ../src/gui_interface.py:3064 -msgid "Please retype your OpenPGP passphrase or press Cancel." -msgstr "Введите парольную фразу Ð´Ð»Ñ OpenPGP еще раз или нажмите «Отмена»." +#: ../src/gui_interface.py:3034 +msgid "Please retype your GPG passphrase or press Cancel." +msgstr "Введите парольную фразу Ð´Ð»Ñ GPG еще раз или нажмите «Отмена»." -#: ../src/gui_menu_builder.py:94 +#: ../src/gui_menu_builder.py:93 msgid "_New Group Chat" msgstr "Ð’ _новую комнату" -#: ../src/gui_menu_builder.py:435 +#: ../src/gui_menu_builder.py:431 msgid "I would like to add you to my roster" msgstr "Ð’Ñ‹ не против, еÑли Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑŽ Ð’Ð°Ñ Ðº Ñебе в роÑтер?" -#: ../src/history_manager.py:78 -msgid "Set logs directory" -msgstr "УÑтановить рабочий каталог" - -#: ../src/history_manager.py:126 +#: ../src/history_manager.py:116 msgid "Cannot find history logs database" msgstr "Ðе могу найти базу данных иÑтории" #. holds time -#: ../src/history_manager.py:179 ../src/history_manager.py:223 -#: ../src/history_window.py:100 +#: ../src/history_manager.py:169 +#: ../src/history_manager.py:213 +#: ../src/history_window.py:99 msgid "Date" msgstr "Дата" #. holds nickname -#: ../src/history_manager.py:186 ../src/history_manager.py:242 +#: ../src/history_manager.py:176 +#: ../src/history_manager.py:232 msgid "Nickname" msgstr "Ðик" #. holds message -#: ../src/history_manager.py:195 ../src/history_manager.py:230 -#: ../src/history_window.py:108 +#: ../src/history_manager.py:185 +#: ../src/history_manager.py:220 +#: ../src/history_window.py:107 msgid "Message" msgstr "Сообщение" #. holds subject -#: ../src/history_manager.py:203 ../src/history_manager.py:236 +#: ../src/history_manager.py:193 +#: ../src/history_manager.py:226 msgid "Subject" msgstr "Тема" -#: ../src/history_manager.py:262 -msgid "" -"Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS " -"RUNNING)" -msgstr "" -"Ð’Ñ‹ хотите очиÑтить базу данных? (КРÐЙÐЕ ÐЕ РЕКОМЕÐДУЕТСЯ, ЕСЛИ GAJIM ЗÐПУЩЕÐ)" +#: ../src/history_manager.py:252 +msgid "Do you want to clean up the database? (STRONGLY NOT RECOMMENDED IF GAJIM IS RUNNING)" +msgstr "Ð’Ñ‹ хотите очиÑтить базу данных? (КРÐЙÐЕ ÐЕ РЕКОМЕÐДУЕТСЯ, ЕСЛИ GAJIM ЗÐПУЩЕÐ)" -#: ../src/history_manager.py:264 +#: ../src/history_manager.py:254 msgid "" -"Normally allocated database size will not be freed, it will just become " -"reusable. If you really want to reduce database filesize, click YES, else " -"click NO.\n" +"Normally allocated database size will not be freed, it will just become reusable. If you really want to reduce database filesize, click YES, else click NO.\n" "\n" "In case you click YES, please wait..." msgstr "" -"Обычно размер файла базы данных не уменьшаетÑÑ Ð¿Ñ€Ð¸ очиÑтке, а иÑпользуетÑÑ " -"заново. ЕÑли вы хотите дейÑтвительно уменьшить размер файла, нажмите ДÐ, в " -"противном Ñлучае нажмите ÐЕТ.\n" +"Обычно размер файла базы данных не уменьшаетÑÑ Ð¿Ñ€Ð¸ очиÑтке, а иÑпользуетÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾. ЕÑли вы хотите дейÑтвительно уменьшить размер файла, нажмите ДÐ, в противном Ñлучае нажмите ÐЕТ.\n" "\n" "ЕÑли вы нажали ДÐ, пожалуйÑта подождите..." -#: ../src/history_manager.py:269 +#: ../src/history_manager.py:259 msgid "Database Cleanup" msgstr "ОчиÑтка базы данных" -#: ../src/history_manager.py:487 +#: ../src/history_manager.py:477 msgid "Exporting History Logs..." msgstr "ÐкÑпортирую иÑторию..." -#: ../src/history_manager.py:564 +#: ../src/history_manager.py:554 #, python-format msgid "%(who)s on %(time)s said: %(message)s\n" msgstr "%(who)s в %(time)s Ñказал: %(message)s\n" -#: ../src/history_manager.py:602 +#: ../src/history_manager.py:592 #, python-format msgid "Do you really want to delete the logs of %(jid)s?" msgstr "Ð’Ñ‹ точно хотите удалить лог %(jid)s?" -#: ../src/history_manager.py:606 +#: ../src/history_manager.py:596 msgid "Do you really want to delete logs of the selected contacts?" msgstr "Ð’Ñ‹ точно хотите удалить логи выделенного контакта?" -#: ../src/history_manager.py:608 ../src/history_manager.py:647 +#: ../src/history_manager.py:598 +#: ../src/history_manager.py:637 msgid "This is an irreversible operation." msgstr "Ðто Ð½ÐµÐ¾Ð±Ñ€Ð°Ñ‚Ð¸Ð¼Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ" -#: ../src/history_manager.py:610 ../src/history_manager.py:649 +#: ../src/history_manager.py:600 +#: ../src/history_manager.py:639 msgid "Deletion Confirmation" msgstr "Подтверждение удалениÑ" -#: ../src/history_manager.py:644 +#: ../src/history_manager.py:634 msgid "Do you really want to delete the selected message?" msgid_plural "Do you really want to delete the selected messages?" msgstr[0] "Ð’Ñ‹ точно хотите удалить выделенное Ñообщение?" msgstr[1] "Ð’Ñ‹ точно хотите удалить выделенные ÑообщениÑ?" msgstr[2] "Ð’Ñ‹ точно хотите удалить выделенные ÑообщениÑ?" -#: ../src/history_window.py:308 +#: ../src/history_window.py:306 #, python-format msgid "Conversation History with %s" msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ %s" -#: ../src/history_window.py:358 +#: ../src/history_window.py:356 msgid "Disk Error" msgstr "Ошибка запиÑи на диÑк" -#: ../src/history_window.py:451 +#: ../src/history_window.py:444 #, python-format msgid "%(nick)s is now %(status)s: %(status_msg)s" msgstr "%(nick)s теперь %(status)s: %(status_msg)s" -#: ../src/history_window.py:462 +#: ../src/history_window.py:455 #, python-format msgid "Error: %s" msgstr "Ошибка: %s" -#: ../src/history_window.py:464 +#: ../src/history_window.py:457 msgid "Error" msgstr "Ошибка" -#: ../src/history_window.py:466 +#: ../src/history_window.py:459 #, python-format msgid "Status is now: %(status)s: %(status_msg)s" msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ ÑƒÑтановлен в: %(status)s: %(status_msg)s" -#: ../src/history_window.py:469 +#: ../src/history_window.py:462 #, python-format msgid "Status is now: %(status)s" msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ ÑƒÑтановлен в: %(status)s" -#: ../src/htmltextview.py:523 +#: ../src/htmltextview.py:522 msgid "Loading" msgstr "Загрузка" -#: ../src/logind_listener.py:53 ../src/upower_listener.py:31 -msgid "Machine going to sleep" -msgstr "Компьютер перешел в ÑпÑщий режим" - #: ../src/message_window.py:220 msgid "You are going to close several tabs" msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ закрыть неÑколько вкладок" @@ -10298,49 +9824,52 @@ msgstr "— ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ будут запиÑаны в лог" msgid "Ignore" msgstr "Игнорировать" -#: ../src/plugins/gui.py:82 +#: ../src/plugins/gui.py:78 msgid "Plugin" msgstr "Модуль" -#: ../src/plugins/gui.py:149 -#, python-format +#: ../src/plugins/gui.py:145 +#, fuzzy, python-format msgid "Warning: %s" -msgstr "Предупреждение: %s" +msgstr "Забанить %s" -#: ../src/plugins/gui.py:207 +#: ../src/plugins/gui.py:199 msgid "Plugin failed" msgstr "Ошибка в модуле" -#: ../src/plugins/gui.py:252 +#: ../src/plugins/gui.py:244 msgid "Unable to properly remove the plugin" msgstr "Ðевозможно правильно удалить модуль" #. members not safe -#: ../src/plugins/gui.py:260 ../src/plugins/pluginmanager.py:526 -#: ../src/plugins/pluginmanager.py:534 +#: ../src/plugins/gui.py:252 +#: ../src/plugins/pluginmanager.py:523 +#: ../src/plugins/pluginmanager.py:531 msgid "Archive is malformed" msgstr "Формат архива не поддерживаетÑÑ" -#: ../src/plugins/gui.py:284 ../src/plugins/gui.py:292 -#: ../src/plugins/pluginmanager.py:542 +#: ../src/plugins/gui.py:276 +#: ../src/plugins/gui.py:284 +#: ../src/plugins/pluginmanager.py:539 msgid "Plugin already exists" msgstr "Модуль уже ÑущеÑтвует" -#: ../src/plugins/gui.py:284 +#: ../src/plugins/gui.py:276 msgid "Overwrite?" msgstr "ПерезапиÑать?" -#: ../src/plugins/gui.py:314 +#: ../src/plugins/gui.py:306 msgid "Configuration" msgstr "КонфигурациÑ" #. it is not zip file #. CRC error -#: ../src/plugins/pluginmanager.py:512 ../src/plugins/pluginmanager.py:518 +#: ../src/plugins/pluginmanager.py:509 +#: ../src/plugins/pluginmanager.py:515 msgid "Archive corrupted" msgstr "Ðрхив поврежден" -#: ../src/plugins/pluginmanager.py:514 +#: ../src/plugins/pluginmanager.py:511 msgid "Archive empty" msgstr "Ðрхив пуÑÑ‚" @@ -10348,335 +9877,291 @@ msgstr "Ðрхив пуÑÑ‚" msgid "Retrieving profile..." msgstr "Получаю данные..." -#: ../src/profile_window.py:129 ../src/roster_window.py:3194 +#: ../src/profile_window.py:129 +#: ../src/roster_window.py:3259 msgid "File is empty" msgstr "ПуÑтой файл" -#: ../src/profile_window.py:132 ../src/roster_window.py:3197 +#: ../src/profile_window.py:132 +#: ../src/roster_window.py:3262 msgid "File does not exist" msgstr "Файл не ÑущеÑтвует" #. keep identation #. unknown format -#: ../src/profile_window.py:146 ../src/profile_window.py:163 -#: ../src/roster_window.py:3199 ../src/roster_window.py:3210 +#: ../src/profile_window.py:146 +#: ../src/profile_window.py:162 +#: ../src/roster_window.py:3264 +#: ../src/roster_window.py:3275 msgid "Could not load image" msgstr "Ðе могу загрузить изображение" -#: ../src/profile_window.py:235 +#: ../src/profile_window.py:233 msgid "Wrong date format" msgstr "Ðеверный формат даты" -#: ../src/profile_window.py:236 +#: ../src/profile_window.py:234 msgid "Format of the date must be YYYY-MM-DD" msgstr "Дата должна быть в формате: YYYY-MM-DD" -#: ../src/profile_window.py:294 +#: ../src/profile_window.py:292 msgid "Information received" msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð°" -#: ../src/profile_window.py:372 -msgid "Without a connection, you can not publish your contact information." -msgstr "Ðеобходимо приÑоединитьÑÑ Ðº Ñерверу Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð»Ð¸Ñ‡Ð½Ð¾Ð¹ информации." +#: ../src/profile_window.py:370 +msgid "Without a connection you can not publish your contact information." +msgstr "Ðеобходимо приÑоединитьÑÑ Ðº Ñерверу Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð»Ð¸Ñ‡Ð½Ð¾Ð¹ информации" -#: ../src/profile_window.py:385 +#: ../src/profile_window.py:383 msgid "Sending profile..." msgstr "ОтправлÑÑŽ данные..." -#: ../src/profile_window.py:404 +#: ../src/profile_window.py:402 msgid "Information NOT published" msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÐЕ опубликована" -#: ../src/profile_window.py:411 +#: ../src/profile_window.py:409 msgid "vCard publication failed" msgstr "ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ vCard не удалаÑÑŒ" -#: ../src/profile_window.py:412 -msgid "" -"There was an error while publishing your personal information, try again " -"later." -msgstr "" -"При публикации вашей личной информации произошла ошибка, попробуйте позже." +#: ../src/profile_window.py:410 +msgid "There was an error while publishing your personal information, try again later." +msgstr "При публикации вашей личной информации произошла ошибка, попробуйте позже." -#: ../src/roster_window.py:240 ../src/roster_window.py:1035 +#: ../src/roster_window.py:240 +#: ../src/roster_window.py:1031 msgid "Merged accounts" msgstr "Объединенные учетные запиÑи" -#: ../src/roster_window.py:2061 +#: ../src/roster_window.py:2049 msgid "Authorization has been sent" msgstr "Была отправлена авторизациÑ" -#: ../src/roster_window.py:2062 +#: ../src/roster_window.py:2050 #, python-format msgid "Now \"%s\" will know your status." msgstr "Теперь «%s» будет знать о вашем ÑтатуÑе." -#: ../src/roster_window.py:2085 +#: ../src/roster_window.py:2073 msgid "Subscription request has been sent" msgstr "Был отправлен Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° подпиÑку " -#: ../src/roster_window.py:2086 +#: ../src/roster_window.py:2074 #, python-format msgid "If \"%s\" accepts this request you will know his or her status." msgstr "ЕÑли «%s» примет ваш запроÑ, вы будете знать его или её ÑтатуÑ" -#: ../src/roster_window.py:2100 +#: ../src/roster_window.py:2088 msgid "Authorization has been removed" msgstr "ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð±Ñ‹Ð»Ð° удалена" -#: ../src/roster_window.py:2101 +#: ../src/roster_window.py:2089 #, python-format msgid "Now \"%s\" will always see you as offline." msgstr "Теперь «%s» вÑегда будет видеть Ð²Ð°Ñ Ð² оффлайне." -#: ../src/roster_window.py:2128 -msgid "OpenPGP is not usable" -msgstr "OpenPGP иÑпользовать невозможно" +#: ../src/roster_window.py:2116 +msgid "GPG is not usable" +msgstr "GPG иÑпользовать невозможно" -#: ../src/roster_window.py:2129 +#: ../src/roster_window.py:2117 #, python-format msgid "You will be connected to %s without OpenPGP." msgstr "Ð’Ñ‹ будете подключены к %s без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ OpenPGP." -#: ../src/roster_window.py:2336 ../src/roster_window.py:3827 +#: ../src/roster_window.py:2324 +#: ../src/roster_window.py:3896 msgid "You are participating in one or more group chats" msgstr "Ð’Ñ‹ находитеÑÑŒ в одной или более комнатах" -#: ../src/roster_window.py:2337 ../src/roster_window.py:3828 -msgid "" -"Changing your status to invisible will result in disconnection from those " -"group chats. Are you sure you want to go invisible?" -msgstr "" -"Переход в ÑоÑтоÑние невидимоÑти приведет к выходу из Ñтих комнат. Ð’Ñ‹ точно " -"хотите Ñтать невидимым?" +#: ../src/roster_window.py:2325 +#: ../src/roster_window.py:3897 +msgid "Changing your status to invisible will result in disconnection from those group chats. Are you sure you want to go invisible?" +msgstr "Переход в ÑоÑтоÑние невидимоÑти приведет к выходу из Ñтих комнат. Ð’Ñ‹ точно хотите Ñтать невидимым?" -#: ../src/roster_window.py:2363 +#: ../src/roster_window.py:2351 msgid "desync'ed" msgstr "не Ñинхронизировано" -#: ../src/roster_window.py:2429 +#: ../src/roster_window.py:2417 msgid "Really quit Gajim?" msgstr "Закрыть Gajim?" -#: ../src/roster_window.py:2430 +#: ../src/roster_window.py:2418 msgid "Are you sure you want to quit Gajim?" msgstr "Ð’Ñ‹ точно хотите закрыть Gajim?" -#: ../src/roster_window.py:2431 +#: ../src/roster_window.py:2419 msgid "Always close Gajim" msgstr "Ð’Ñегда закрывать Gajim" -#: ../src/roster_window.py:2521 +#: ../src/roster_window.py:2509 msgid "You have running file transfers" msgstr "Идет передача файлов" -#: ../src/roster_window.py:2522 -msgid "" -"If you quit now, the file(s) being transferred will be stopped. Do you still " -"want to quit?" +#: ../src/roster_window.py:2510 +msgid "If you quit now, the file(s) being transferred will be stopped. Do you still want to quit?" msgstr "ЕÑли выйти ÑейчаÑ, передача файла оÑтановитÑÑ. Выйти?" -#: ../src/roster_window.py:2553 ../src/roster_window.py:2990 +#: ../src/roster_window.py:2541 +#: ../src/roster_window.py:2978 msgid "You have unread messages" msgstr "У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ непрочитанные ÑообщениÑ" -#: ../src/roster_window.py:2554 -msgid "" -"Messages will only be available for reading them later if you have history " -"enabled and contact is in your roster." -msgstr "" -"Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ доÑтупны Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð¶Ðµ, еÑли у Ð²Ð°Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð° Ð¾Ð¿Ñ†Ð¸Ñ " -"иÑтории." +#: ../src/roster_window.py:2542 +msgid "Messages will only be available for reading them later if you have history enabled and contact is in your roster." +msgstr "Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ доÑтупны Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð¶Ðµ, еÑли у Ð²Ð°Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð° Ð¾Ð¿Ñ†Ð¸Ñ Ð¸Ñтории." -#: ../src/roster_window.py:2991 +#: ../src/roster_window.py:2979 msgid "You must read them before removing this transport." msgstr "ПроÑмотрите вÑе ожидающие ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´ удалением транÑпорта." -#: ../src/roster_window.py:2994 +#: ../src/roster_window.py:2982 #, python-format msgid "Transport \"%s\" will be removed" msgstr "ТранÑпорт «%s» будет удален" -#: ../src/roster_window.py:2995 -msgid "" -"You will no longer be able to send and receive messages from contacts using " -"this transport." -msgstr "" -"У Ð²Ð°Ñ Ñ‚ÐµÐ¿ÐµÑ€ÑŒ не будет возможноÑти приема и отправки ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð°Ð¼ " -"через Ñтот транÑпорт." +#: ../src/roster_window.py:2983 +msgid "You will no longer be able to send and receive messages from contacts using this transport." +msgstr "У Ð²Ð°Ñ Ñ‚ÐµÐ¿ÐµÑ€ÑŒ не будет возможноÑти приема и отправки ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð°Ð¼ через Ñтот транÑпорт." -#: ../src/roster_window.py:2998 +#: ../src/roster_window.py:2986 msgid "Transports will be removed" msgstr "ТранÑпорты будут удалены" -#: ../src/roster_window.py:3003 +#: ../src/roster_window.py:2991 #, python-format -msgid "" -"You will no longer be able to send and receive messages to contacts from " -"these transports: %s" -msgstr "" -"У Ð²Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ не будет возможноÑти приема и отправки Ñообщений через Ñти " -"транÑпорты:%s." +msgid "You will no longer be able to send and receive messages to contacts from these transports: %s" +msgstr "У Ð²Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ не будет возможноÑти приема и отправки Ñообщений через Ñти транÑпорты:%s." -#: ../src/roster_window.py:3045 +#: ../src/roster_window.py:3059 msgid "You are about to block a contact. Are you sure you want to continue?" msgstr "Ð’Ñ‹ точно хотите заблокировать контакт?" -#: ../src/roster_window.py:3047 -msgid "" -"This contact will see you offline and you will not receive messages he will " -"send you." -msgstr "" -"Ðтот контакт будет видеть Ð²Ð°Ñ ÐºÐ°Ðº отключенного, а вы не будете получать от " -"него ÑообщениÑ." +#: ../src/roster_window.py:3061 +msgid "This contact will see you offline and you will not receive messages he will send you." +msgstr "Ðтот контакт будет видеть Ð²Ð°Ñ ÐºÐ°Ðº отключенного, а вы не будете получать от него ÑообщениÑ." #. it's jid -#: ../src/roster_window.py:3086 +#: ../src/roster_window.py:3151 msgid "Rename Contact" msgstr "Переименовать контакт" -#: ../src/roster_window.py:3087 +#: ../src/roster_window.py:3152 #, python-format msgid "Enter a new nickname for contact %s" msgstr "Введите новый ник Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð° %s" -#: ../src/roster_window.py:3094 +#: ../src/roster_window.py:3159 msgid "Rename Group" msgstr "Переименовать группу" -#: ../src/roster_window.py:3095 +#: ../src/roster_window.py:3160 #, python-format msgid "Enter a new name for group %s" msgstr "Введите новое название Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ %s" -#: ../src/roster_window.py:3140 +#: ../src/roster_window.py:3205 msgid "Remove Group" msgstr "Удалить группу" -#: ../src/roster_window.py:3141 +#: ../src/roster_window.py:3206 #, python-format msgid "Do you want to remove group %s from the roster?" msgstr "Ð’Ñ‹ точно хотите удалить группу %s из роÑтера?" -#: ../src/roster_window.py:3142 +#: ../src/roster_window.py:3207 msgid "Also remove all contacts in this group from your roster" msgstr "Удалить из роÑтера вÑе контакты в Ñтой группе" -#: ../src/roster_window.py:3181 +#: ../src/roster_window.py:3246 msgid "Assign OpenPGP Key" msgstr "Ðазначить ключ OpenPGP" -#: ../src/roster_window.py:3182 +#: ../src/roster_window.py:3247 msgid "Select a key to apply to the contact" msgstr "Выберите ключ, который будет применен к контакту" -#: ../src/roster_window.py:3637 +#: ../src/roster_window.py:3706 #, python-format msgid "Contact \"%s\" will be removed from your roster" msgstr "Контакт «%s» будет удален из вашего роÑтера" -#: ../src/roster_window.py:3639 +#: ../src/roster_window.py:3708 #, python-format msgid "You are about to remove \"%(name)s\" (%(jid)s) from your roster.\n" -msgstr "" -"Ð’Ñ‹ ÑобираетеÑÑŒ удалить «%(name)s» (%(jid)s) из вашего ÑпиÑка контактов.\n" +msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ удалить «%(name)s» (%(jid)s) из вашего ÑпиÑка контактов.\n" -#: ../src/roster_window.py:3644 -msgid "" -"By removing this contact you also remove authorization resulting in him or " -"her always seeing you as offline." -msgstr "" -"УдалÑÑ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚, вы одновременно удалите авторизацию, и Ñтот человек больше " -"не Ñможет видеть ваш ÑтатуÑ." +#: ../src/roster_window.py:3713 +msgid "By removing this contact you also remove authorization resulting in him or her always seeing you as offline." +msgstr "УдалÑÑ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚, вы одновременно удалите авторизацию, и Ñтот человек больше не Ñможет видеть ваш ÑтатуÑ." #. Contact is not in roster -#: ../src/roster_window.py:3650 +#: ../src/roster_window.py:3719 msgid "Do you want to continue?" msgstr "Продолжить?" -#: ../src/roster_window.py:3654 -msgid "" -"By removing this contact you also by default remove authorization resulting " -"in him or her always seeing you as offline." -msgstr "" -"ЕÑли вы удалите контакт, вы так же удалите и авторизацию. Ð’Ñ‹ будете видеть " -"его или её вÑегда в оффлайне." +#: ../src/roster_window.py:3723 +msgid "By removing this contact you also by default remove authorization resulting in him or her always seeing you as offline." +msgstr "ЕÑли вы удалите контакт, вы так же удалите и авторизацию. Ð’Ñ‹ будете видеть его или её вÑегда в оффлайне." -#: ../src/roster_window.py:3657 +#: ../src/roster_window.py:3726 msgid "I want this contact to know my status after removal" msgstr "Я хочу, чтобы Ñтот контакт видел мой ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾Ñле удалениÑ" #. several contact to remove at the same time -#: ../src/roster_window.py:3661 +#: ../src/roster_window.py:3730 msgid "Contacts will be removed from your roster" msgstr "Контакты будут удалены из вашего роÑтера" -#: ../src/roster_window.py:3666 +#: ../src/roster_window.py:3735 #, python-format msgid "" "By removing these contacts:%s\n" "you also remove authorization resulting in them always seeing you as offline." msgstr "" "Ð’Ñ‹ удалÑете Ñти контакты:%s.\n" -"Одновременно вы удалите и авторизацию, то еÑÑ‚ÑŒ они вÑегда будут видеть Ð²Ð°Ñ Ð² " -"оффлайне." +"Одновременно вы удалите и авторизацию, то еÑÑ‚ÑŒ они вÑегда будут видеть Ð²Ð°Ñ Ð² оффлайне." -#: ../src/roster_window.py:3724 -msgid "" -"You are about to send a custom status. Are you sure you want to continue?" +#: ../src/roster_window.py:3793 +#, fuzzy +msgid "You are about to send a custom status. Are you sure you want to continue?" msgstr "Ð’Ñ‹ точно хотите поÑлать другой ÑтатуÑ?" -#: ../src/roster_window.py:3726 +#: ../src/roster_window.py:3795 #, python-format -msgid "" -"This contact will temporarily see you as %(status)s, but only until you " -"change your status. Then he or she will see your global status." -msgstr "" -"Ðтот контакт будет временно видеть ваш ÑÑ‚Ð°Ñ‚ÑƒÑ ÐºÐ°Ðº %(status)s, но лишь пока " -"вы не измените Ñвой глобальный ÑтатуÑ. Тогда Ñтому контакту Ñтанет виден " -"глобальный ÑтатуÑ." +msgid "This contact will temporarily see you as %(status)s, but only until you change your status. Then he or she will see your global status." +msgstr "Ðтот контакт будет временно видеть ваш ÑÑ‚Ð°Ñ‚ÑƒÑ ÐºÐ°Ðº %(status)s, но лишь пока вы не измените Ñвой глобальный ÑтатуÑ. Тогда Ñтому контакту Ñтанет виден глобальный ÑтатуÑ." -#: ../src/roster_window.py:3745 +#: ../src/roster_window.py:3814 msgid "No account available" msgstr "Ðет доÑтупной учетной запиÑи" -#: ../src/roster_window.py:3746 +#: ../src/roster_window.py:3815 msgid "You must create an account before you can chat with other contacts." -msgstr "" -"Ð”Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° беÑеды Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ людьми прежде необходимо Ñоздать учетную запиÑÑŒ." +msgstr "Ð”Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° беÑеды Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ людьми прежде необходимо Ñоздать учетную запиÑÑŒ." -#: ../src/roster_window.py:4458 +#: ../src/roster_window.py:4512 msgid "Metacontacts storage not supported by your server" msgstr "Сервер не умеет хранить метаконтакты" -#: ../src/roster_window.py:4460 -msgid "" -"Your server does not support storing metacontacts information. So this " -"information will not be saved on next reconnection." -msgstr "" -"Ваш Ñервер не умеет хранить данные о метаконтактах. Ðта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ðµ будет " -"Ñохранена при Ñледующем подключении." +#: ../src/roster_window.py:4514 +msgid "Your server does not support storing metacontacts information. So this information will not be saved on next reconnection." +msgstr "Ваш Ñервер не умеет хранить данные о метаконтактах. Ðта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ðµ будет Ñохранена при Ñледующем подключении." -#: ../src/roster_window.py:4552 -msgid "" -"You are about to create a metacontact. Are you sure you want to continue?" +#: ../src/roster_window.py:4606 +msgid "You are about to create a metacontact. Are you sure you want to continue?" msgstr "Ð’Ñ‹ точно хотите Ñоздать метаконтакт?" -#: ../src/roster_window.py:4554 -msgid "" -"Metacontacts are a way to regroup several contacts in one line. Generally it " -"is used when the same person has several Jabber accounts or transport " -"accounts." -msgstr "" -"Метаконтакты — Ñто метод группировки неÑкольких контактов в одну запиÑÑŒ. " -"Обычно иÑпользуетÑÑ, когда один и тот же человек имеет неÑколько учетных " -"запиÑей в Jabber или на транÑпортах." +#: ../src/roster_window.py:4608 +msgid "Metacontacts are a way to regroup several contacts in one line. Generally it is used when the same person has several Jabber accounts or transport accounts." +msgstr "Метаконтакты — Ñто метод группировки неÑкольких контактов в одну запиÑÑŒ. Обычно иÑпользуетÑÑ, когда один и тот же человек имеет неÑколько учетных запиÑей в Jabber или на транÑпортах." -#: ../src/roster_window.py:4675 +#: ../src/roster_window.py:4729 msgid "Invalid file URI:" msgstr "Ðеверный файл:" -#: ../src/roster_window.py:4687 +#: ../src/roster_window.py:4741 #, python-format msgid "Do you want to send this file to %s:" msgid_plural "Do you want to send these files to %s:" @@ -10684,17 +10169,17 @@ msgstr[0] "Хотите отправить файл %s:" msgstr[1] "Хотите отправить файлы %s:" msgstr[2] "Хотите отправить файлы %s:" -#: ../src/roster_window.py:4822 +#: ../src/roster_window.py:4876 #, python-format msgid "Send %s to %s" msgstr "Отправить %s контакту %s" -#: ../src/roster_window.py:4833 +#: ../src/roster_window.py:4887 #, python-format msgid "Make %s first contact" msgstr "Сделать %s первым контактом" -#: ../src/roster_window.py:4836 +#: ../src/roster_window.py:4890 #, python-format msgid "Make %s and %s metacontacts" msgstr "Обьединить %s и %s в метаконтакт" @@ -10704,129 +10189,135 @@ msgstr "Обьединить %s и %s в метаконтакт" #. for chat_with #. for single message #. join gc -#: ../src/roster_window.py:5296 ../src/roster_window.py:5350 -#: ../src/roster_window.py:5359 ../src/statusicon.py:277 -#: ../src/statusicon.py:324 ../src/statusicon.py:330 +#: ../src/roster_window.py:5346 +#: ../src/roster_window.py:5400 +#: ../src/roster_window.py:5409 +#: ../src/statusicon.py:277 +#: ../src/statusicon.py:324 +#: ../src/statusicon.py:330 #, python-format msgid "using account %s" msgstr "иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÑƒÑ‡ÐµÑ‚Ð½ÑƒÑŽ запиÑÑŒ %s" #. add -#: ../src/roster_window.py:5366 +#: ../src/roster_window.py:5416 #, python-format msgid "to %s account" msgstr "Ð´Ð»Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи %s" #. disco -#: ../src/roster_window.py:5371 +#: ../src/roster_window.py:5421 #, python-format msgid "using %s account" msgstr "учетной запиÑи %s" -#: ../src/roster_window.py:5410 ../src/statusicon.py:340 +#: ../src/roster_window.py:5460 +#: ../src/statusicon.py:340 msgid "_Manage Bookmarks..." msgstr "Управление _закладками..." #. profile, avatar -#: ../src/roster_window.py:5430 +#: ../src/roster_window.py:5480 #, python-format msgid "of account %s" msgstr "Ð´Ð»Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи %s" -#: ../src/roster_window.py:5471 +#: ../src/roster_window.py:5521 #, python-format msgid "for account %s" msgstr "Ð´Ð»Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи %s" -#: ../src/roster_window.py:5531 ../src/roster_window.py:5639 +#: ../src/roster_window.py:5581 +#: ../src/roster_window.py:5689 msgid "_Change Status Message" msgstr "_Изменить Ñообщение о ÑтатуÑе" -#: ../src/roster_window.py:5564 +#: ../src/roster_window.py:5614 msgid "Publish Tune" msgstr "Музыка" -#: ../src/roster_window.py:5566 +#: ../src/roster_window.py:5616 msgid "Publish Location" msgstr "ОтправлÑÑ‚ÑŒ МеÑтоположение" -#: ../src/roster_window.py:5569 +#: ../src/roster_window.py:5619 msgid "Configure Services..." msgstr "ÐаÑтроить СервиÑÑ‹..." -#: ../src/roster_window.py:5717 +#: ../src/roster_window.py:5767 msgid "_Maximize All" msgstr "_Развернуть вÑе" -#: ../src/roster_window.py:5727 ../src/roster_window.py:5900 +#: ../src/roster_window.py:5777 +#: ../src/roster_window.py:5950 msgid "Send Group M_essage" msgstr "_Отправить Ñообщение группе" -#: ../src/roster_window.py:5735 +#: ../src/roster_window.py:5785 msgid "To all users" msgstr "Ð’Ñем пользователÑм" -#: ../src/roster_window.py:5739 +#: ../src/roster_window.py:5789 msgid "To all online users" msgstr "Ð’Ñем, кто подключён" #. Manage Transport submenu -#: ../src/roster_window.py:5920 +#: ../src/roster_window.py:5970 msgid "_Manage Contacts" msgstr "_Управление контактами" #. Edit Groups -#: ../src/roster_window.py:5929 +#: ../src/roster_window.py:5979 msgid "Edit _Groups" msgstr "Редактировать _группы" #. Send single message -#: ../src/roster_window.py:5984 +#: ../src/roster_window.py:6034 msgid "Send Single Message" msgstr "Отправить одиночное Ñообщение" #. Execute Command -#: ../src/roster_window.py:6031 +#: ../src/roster_window.py:6081 msgid "Execute Command..." msgstr "Выполнить команду..." #. Manage Transport submenu -#: ../src/roster_window.py:6041 +#: ../src/roster_window.py:6091 msgid "_Manage Transport" msgstr "_Управление транÑпортом" #. Modify Transport -#: ../src/roster_window.py:6050 +#: ../src/roster_window.py:6100 msgid "_Modify Transport" msgstr "_Изменить транÑпорт" #. Rename -#: ../src/roster_window.py:6060 +#: ../src/roster_window.py:6110 msgid "_Rename" msgstr "П_ереименовать" -#: ../src/roster_window.py:6120 +#: ../src/roster_window.py:6170 msgid "_Maximize" msgstr "Развернут_ÑŒ" -#: ../src/roster_window.py:6129 +#: ../src/roster_window.py:6179 msgid "_Reconnect" msgstr "_ПереподÑоединитьÑÑ" -#: ../src/roster_window.py:6136 +#: ../src/roster_window.py:6186 msgid "_Disconnect" msgstr "_Выйти" #. History manager -#: ../src/roster_window.py:6230 +#: ../src/roster_window.py:6275 msgid "History Manager" msgstr "Менеджер иÑтории" -#: ../src/roster_window.py:6245 +#: ../src/roster_window.py:6286 msgid "_Join New Group Chat" msgstr "_Войти в новую комнату" -#: ../src/roster_window.py:6473 +#: ../src/roster_window.py:6514 msgid "Change Status Message..." msgstr "Изменить Ñообщение о ÑтатуÑе..." @@ -10834,20 +10325,23 @@ msgstr "Изменить Ñообщение о ÑтатуÑе..." msgid "Waiting for results" msgstr "Ожидание результатов" -#: ../src/search_window.py:143 ../src/search_window.py:220 +#: ../src/search_window.py:143 +#: ../src/search_window.py:220 msgid "Error in received dataform" msgstr "Ошибка в принÑтой форме данных" #. No result -#: ../src/search_window.py:177 ../src/search_window.py:212 +#: ../src/search_window.py:177 +#: ../src/search_window.py:212 msgid "No result" msgstr "Ðет результата" -#: ../src/session.py:409 ../src/session.py:469 +#: ../src/session.py:411 +#: ../src/session.py:470 msgid "Confirm these session options" msgstr "Подтвердить данные наÑтройки ÑеанÑа" -#: ../src/session.py:411 +#: ../src/session.py:413 #, python-format msgid "" "The remote client wants to negotiate a session with these features:\n" @@ -10862,7 +10356,7 @@ msgstr "" "\n" "Приемлемы ли Ñти наÑтройки?" -#: ../src/session.py:471 +#: ../src/session.py:472 #, python-format msgid "" "The remote client selected these options:\n" @@ -10877,7 +10371,7 @@ msgstr "" "\n" "Продолжить Ñтот ÑеанÑ?" -#: ../src/session.py:474 +#: ../src/session.py:475 msgid "Always accept for this contact" msgstr "Ð’Ñегда принимать Ð´Ð»Ñ Ñтого контакта" @@ -10893,130 +10387,139 @@ msgstr "Скрыть _роÑтер" msgid "Hide this menu" msgstr "Скрыть Ñто меню" -#: ../src/tooltips.py:393 ../src/tooltips.py:614 +#: ../src/tooltips.py:393 +#: ../src/tooltips.py:613 msgid "Jabber ID: " msgstr "Jabber ID: " -#: ../src/tooltips.py:397 ../src/tooltips.py:619 +#: ../src/tooltips.py:396 +#: ../src/tooltips.py:617 msgid "Resource: " msgstr "РеÑурÑ: " -#: ../src/tooltips.py:403 +#: ../src/tooltips.py:402 #, python-format msgid "%(owner_or_admin_or_member)s of this group chat" msgstr "%(owner_or_admin_or_member)s Ñтой комнаты" -#: ../src/tooltips.py:511 +#: ../src/tooltips.py:510 msgid " [blocked]" msgstr "[заблокировано]" -#: ../src/tooltips.py:515 +#: ../src/tooltips.py:514 msgid " [minimized]" msgstr "[Ñвернуто]" -#: ../src/tooltips.py:530 ../src/tooltips.py:791 +#: ../src/tooltips.py:529 +#: ../src/tooltips.py:789 msgid "Status: " msgstr "СтатуÑ: " -#: ../src/tooltips.py:575 +#: ../src/tooltips.py:574 #, python-format msgid "Last status: %s" msgstr "ПоÑледний ÑтатуÑ: %s" -#: ../src/tooltips.py:577 +#: ../src/tooltips.py:576 #, python-format msgid " since %s" msgstr " Ñ %s" -#: ../src/tooltips.py:595 +#: ../src/tooltips.py:594 msgid "Connected" msgstr "Подключен" -#: ../src/tooltips.py:597 +#: ../src/tooltips.py:596 msgid "Disconnected" msgstr "Отключен" #. ('both' is the normal sub so we don't show it) -#: ../src/tooltips.py:626 +#: ../src/tooltips.py:624 msgid "Subscription: " msgstr "ПодпиÑка: " -#: ../src/tooltips.py:636 +#: ../src/tooltips.py:634 msgid "OpenPGP: " msgstr "OpenPGP: " -#: ../src/tooltips.py:659 +#: ../src/tooltips.py:657 #, python-format msgid "Idle since %s" msgstr "БездейÑтвует Ñ %s" -#: ../src/tooltips.py:660 +#: ../src/tooltips.py:658 #, python-format msgid "Idle for %s" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð±ÐµÐ·Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ %s" -#: ../src/tooltips.py:714 -msgid "Mood: " -msgstr "ÐаÑтроение: " +#: ../src/tooltips.py:712 +#, python-format +msgid "Mood: %s" +msgstr "ÐаÑтроение: %s" -#: ../src/tooltips.py:718 -msgid "Activity: " -msgstr "ЗанÑтие: " +#: ../src/tooltips.py:716 +#, python-format +msgid "Activity: %s" +msgstr "ЗанÑтие: %s" -#: ../src/tooltips.py:722 -msgid "Tune: " -msgstr "Слушаю: " +#: ../src/tooltips.py:720 +#, python-format +msgid "Tune: %s" +msgstr "Слушаю: %s" -#: ../src/tooltips.py:726 -msgid "Location: " -msgstr "МеÑтоположение: " +#: ../src/tooltips.py:724 +#, python-format +msgid "Location: %s" +msgstr "МеÑтоположение: %s" -#: ../src/tooltips.py:751 +#: ../src/tooltips.py:749 msgid "Download" msgstr "Скачать" -#: ../src/tooltips.py:757 +#: ../src/tooltips.py:755 msgid "Upload" msgstr "Загрузить" -#: ../src/tooltips.py:764 +#: ../src/tooltips.py:762 msgid "Type: " msgstr "Тип: " -#: ../src/tooltips.py:770 +#: ../src/tooltips.py:768 msgid "Transferred: " msgstr "Передано: " -#: ../src/tooltips.py:773 ../src/tooltips.py:790 +#: ../src/tooltips.py:771 +#: ../src/tooltips.py:788 msgid "Not started" msgstr "Ðе начато" -#: ../src/tooltips.py:775 +#: ../src/tooltips.py:773 msgid "Stopped" msgstr "ОÑтановлено" -#: ../src/tooltips.py:777 ../src/tooltips.py:780 +#: ../src/tooltips.py:775 +#: ../src/tooltips.py:778 msgid "Completed" msgstr "Завершено" -#: ../src/tooltips.py:783 +#: ../src/tooltips.py:781 msgid "?transfer status:Paused" msgstr "ПриоÑтановлено" #. stalled is not paused. it is like 'frozen' it stopped alone -#: ../src/tooltips.py:786 +#: ../src/tooltips.py:784 msgid "Stalled" msgstr "Ожидание" -#: ../src/tooltips.py:788 +#: ../src/tooltips.py:786 msgid "Transferring" msgstr "ПередаетÑÑ" -#: ../src/tooltips.py:825 +#: ../src/tooltips.py:823 msgid "This service has not yet responded with detailed information" msgstr "Ðтот ÑÐµÑ€Ð²Ð¸Ñ ÐµÑ‰Ðµ не Ñообщил информацию о Ñебе" -#: ../src/tooltips.py:828 +#: ../src/tooltips.py:826 msgid "" "This service could not respond with detailed information.\n" "It is most likely legacy or broken" @@ -11024,196 +10527,74 @@ msgstr "" "Ðтот ÑÐµÑ€Ð²Ð¸Ñ Ð½Ðµ может предоÑтавить подробную информацию о Ñебе. \n" "Скорее вÑего, он уÑтарел или Ñломан" -#: ../src/vcard.py:312 +#: ../src/upower_listener.py:31 +msgid "Machine going to sleep" +msgstr "" + +#: ../src/vcard.py:296 msgid "?Client:Unknown" msgstr "ÐеизвеÑтен" -#: ../src/vcard.py:314 +#: ../src/vcard.py:298 msgid "?OS:Unknown" msgstr "ÐеизвеÑтна" -#: ../src/vcard.py:339 +#: ../src/vcard.py:323 msgid "?Time:Unknown" msgstr "?Time:ÐеизвеÑтно" -#: ../src/vcard.py:363 ../src/vcard.py:373 ../src/vcard.py:581 +#: ../src/vcard.py:347 +#: ../src/vcard.py:357 +#: ../src/vcard.py:565 #, python-format msgid "since %s" msgstr "Ñ %s" -#: ../src/vcard.py:396 +#: ../src/vcard.py:380 msgid "?Role in Group Chat:<b>Role:</b>" msgstr "?Роль в групповом чате:<b>Роль:</b>" -#: ../src/vcard.py:400 +#: ../src/vcard.py:384 msgid "<b>Affiliation:</b>" msgstr "<b>Ранг:</b>" -#: ../src/vcard.py:408 -msgid "" -"This contact is interested in your presence information, but you are not " -"interested in his/her presence" -msgstr "" -"Ðтот контакт хочет знать о вашем приÑутÑтвии, но вам Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ его или её " -"приÑутÑтвии не интереÑна" +#: ../src/vcard.py:392 +msgid "This contact is interested in your presence information, but you are not interested in his/her presence" +msgstr "Ðтот контакт хочет знать о вашем приÑутÑтвии, но вам Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ его или её приÑутÑтвии не интереÑна" -#: ../src/vcard.py:410 -msgid "" -"You are interested in the contact's presence information, but he/she is not " -"interested in yours" -msgstr "" -"Вам хочетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÑŒ информацию о приÑутÑтвии контакта, но он или она не " -"заинтереÑована в вашей." +#: ../src/vcard.py:394 +msgid "You are interested in the contact's presence information, but he/she is not interested in yours" +msgstr "Вам хочетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÑŒ информацию о приÑутÑтвии контакта, но он или она не заинтереÑована в вашей." -#: ../src/vcard.py:412 +#: ../src/vcard.py:396 msgid "You and the contact are interested in each other's presence information" msgstr "Ð’Ñ‹ и контакт оба желаете знать о приÑутÑтвии друг друга" #. None -#: ../src/vcard.py:414 -msgid "" -"You are not interested in the contact's presence, and neither he/she is " -"interested in yours" +#: ../src/vcard.py:398 +msgid "You are not interested in the contact's presence, and neither he/she is interested in yours" msgstr "Ðи вы, ни ваш контакт не желаете знать о приÑутÑтвии друг друга" -#: ../src/vcard.py:421 +#: ../src/vcard.py:405 msgid "You are waiting contact's answer about your subscription request" msgstr "Ð’Ñ‹ ожидаете ответа контакта на Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° подпиÑку" -#: ../src/vcard.py:423 +#: ../src/vcard.py:407 msgid "There is no pending subscription request." msgstr "Ðет ожидающего запроÑа на подпиÑку." -#: ../src/vcard.py:428 ../src/vcard.py:482 ../src/vcard.py:604 +#: ../src/vcard.py:412 +#: ../src/vcard.py:466 +#: ../src/vcard.py:588 msgid " resource with priority " msgstr " реÑÑƒÑ€Ñ Ñ Ð¿Ñ€Ð¸Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚Ð¾Ð¼ " -#~ msgid "_Allow him/her to see my status" -#~ msgstr "_Позволить ему или ей видеть мой ÑтатуÑ" - -#~ msgid "English" -#~ msgstr "ÐнглийÑкий" - -#~ msgid "Belarusian" -#~ msgstr "БелоруÑÑкий" - -#~ msgid "Bulgarian" -#~ msgstr "БолгарÑкий" - -#~ msgid "Breton" -#~ msgstr "БретонÑкий" - -#~ msgid "Czech" -#~ msgstr "ЧешÑкий" - -#~ msgid "German" -#~ msgstr "Ðемецкий" - -#~ msgid "Greek" -#~ msgstr "ГречеÑкий" - -#~ msgid "British" -#~ msgstr "БританÑкий" - -#~ msgid "Esperanto" -#~ msgstr "ÐÑперанто" - -#~ msgid "Spanish" -#~ msgstr "ИÑпанÑкий" - -#~ msgid "Basque" -#~ msgstr "БаÑкÑкий" - -#~ msgid "French" -#~ msgstr "ФранцузÑкий" - -#~ msgid "Croatian" -#~ msgstr "ХорватÑкий" - -#~ msgid "Italian" -#~ msgstr "ИтальÑнÑкий" - -#~ msgid "Norwegian (b)" -#~ msgstr "ÐорвежÑкий (букмол)" - -#~ msgid "Dutch" -#~ msgstr "ГолландÑкий" - -#~ msgid "Norwegian" -#~ msgstr "ÐорвежÑкий" - -#~ msgid "Polish" -#~ msgstr "ПольÑкий" - -#~ msgid "Portuguese" -#~ msgstr "ПортугальÑкий" - -#~ msgid "Brazilian Portuguese" -#~ msgstr "ПортугальÑкий (БразилиÑ)" - -#~ msgid "Russian" -#~ msgstr "РуÑÑкий" - -#~ msgid "Serbian" -#~ msgstr "СербÑкий" - -#~ msgid "Slovak" -#~ msgstr "Словацкий" - -#~ msgid "Swedish" -#~ msgstr "ШведÑкий" - -#~ msgid "Chinese (Ch)" -#~ msgstr "КитайÑкий" - -#~ msgid "Hebrew" -#~ msgstr "Иврит" - -#~ msgid "Spelling language" -#~ msgstr "Язык проверки орфографии" - -#~ msgid "Check your connection or try again later" -#~ msgstr "Проверьте наÑтройки Ñети или попробуйте еще раз позже" - -#~ msgid "Show the contact's profile (Ctrl+I)" -#~ msgstr "Показать информацию о контакте (Ctrl+I)" - -#~ msgid "Display m_ood of contacts in roster" -#~ msgstr "Показывать на_ÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¾Ð² в роÑтере" - -#~ msgid "Display _activity of contacts in roster" -#~ msgstr "Показывать _занÑÑ‚Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¾Ð² в роÑтере" - -#~ msgid "" -#~ "If checked, Gajim will display the activity of contacts in the roster " -#~ "window" -#~ msgstr "" -#~ "ЕÑли отмечено, то Gajim будет показывать занÑÑ‚Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¾Ð² в окне роÑтера" - -#~ msgid "Display _tunes of contacts in roster" -#~ msgstr "Отмечать контакты, Ñлушающие музыку (tunes)" - -#~ msgid "" -#~ "If checked, Gajim will display the tunes of contacts in the roster window" -#~ msgstr "" -#~ "ЕÑли отмечено, то Gajim будет показывать tunes контактов в окне роÑтера" - -#~ msgid "" -#~ "If checked, Gajim will display the location of contacts in the roster " -#~ "window" -#~ msgstr "" -#~ "ЕÑли отмечено, то Gajim будет показывать меÑтоположение контактов в окне " -#~ "роÑтера" - -#~ msgid "Mood: %s" -#~ msgstr "ÐаÑтроение: %s" - -#~ msgid "Activity: %s" -#~ msgstr "ЗанÑтие: %s" - #~ msgid "Gajim Instant Messenger" #~ msgstr "Клиент Ð´Ð»Ñ Ð¼Ð³Ð½Ð¾Ð²ÐµÐ½Ð½Ñ‹Ñ… Ñообщений Gajim" +#~ msgid "Fishing" +#~ msgstr "Рыбалка" + #~ msgid "label" #~ msgstr "ÑтатуÑное Ñообщение" @@ -11604,6 +10985,9 @@ msgstr " реÑÑƒÑ€Ñ Ñ Ð¿Ñ€Ð¸Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚Ð¾Ð¼ " #~ "ИÑÑ‚Ð¾Ñ€Ð¸Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ð¹\n" #~ "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð²Ñех чатов" +#~ msgid "Manage Accounts" +#~ msgstr "Управление учетными запиÑÑми" + #~ msgid "gtk-delete" #~ msgstr "gtk-delete" diff --git a/setup_win32.py b/setup_win32.py index 2d1bc9560fe407e88bd3c94c9babeb907c9a6c16..b257a53e8b5a5151c2185f063f2ef124898f9ed9 100644 --- a/setup_win32.py +++ b/setup_win32.py @@ -31,9 +31,9 @@ if 'gtk' in os.listdir('.'): options = { 'build_exe': { - 'includes': ['gtk.keysyms', 'dumbdbm', 'dbhash', 'bsddb', 'new', + 'includes': ['Gdk.KEY_, 'dumbdbm', 'dbhash', 'bsddb', 'new', 'goocanvas', 'Crypto.PublicKey.DSA', 'Crypto.Hash.HMAC', - 'numbers'], + 'numbers', 'win32com.client', 'win32com.server'], 'base': 'Win32GUI', 'bin_excludes': [ 'iconv.dll', 'intl.dll', 'libatk-1.0-0.dll', diff --git a/src/adhoc_commands.py b/src/adhoc_commands.py index 376c8c68c383567f1053d02352ec1002d5957c3c..da598e9bd2c07e81bb76757b3e2cf45627790fa8 100644 --- a/src/adhoc_commands.py +++ b/src/adhoc_commands.py @@ -25,8 +25,8 @@ # FIXME: think if we need caching command list. it may be wrong if there will # be entities that often change the list, it may be slow to fetch it every time -import gobject -import gtk +from gi.repository import GLib +from gi.repository import Gtk import nbxmpp from common import gajim @@ -91,7 +91,7 @@ class CommandWindow: self.data_form_widget.destroy() self.data_form_widget = dataforms_widget.DataFormWidget() self.data_form_widget.show() - self.sending_form_stage_vbox.pack_start(self.data_form_widget) + self.sending_form_stage_vbox.pack_start(self.data_form_widget, True, True, 0) if self.commandnode: # Execute command @@ -159,7 +159,7 @@ class CommandWindow: return self.stage_adhoc_commands_window_delete_event(self.window) def __del__(self): - print 'Object has been deleted.' + print('Object has been deleted.') # stage 1: waiting for command list def stage1(self): @@ -236,13 +236,13 @@ class CommandWindow: # build the commands list radiobuttons first_radio = None for (commandnode, commandname) in self.commandlist: - radio = gtk.RadioButton(first_radio, label=commandname) + radio = Gtk.RadioButton.new_with_label_from_widget(first_radio, commandname) radio.connect("toggled", self.on_command_radiobutton_toggled, commandnode) if not first_radio: first_radio = radio self.commandnode = commandnode - self.command_list_vbox.pack_start(radio, expand=False) + self.command_list_vbox.pack_start(radio, False, True, 0) self.command_list_vbox.show_all() self.stage_finish = self.stage2_finish @@ -255,9 +255,9 @@ class CommandWindow: """ Remove widgets we created. Not needed when the window is destroyed """ - def remove_widget(widget): + def remove_widget(widget, param): self.command_list_vbox.remove(widget) - self.command_list_vbox.foreach(remove_widget) + self.command_list_vbox.foreach(remove_widget, None) def stage2_close_button_clicked(self, widget): self.stage_finish() @@ -281,8 +281,6 @@ class CommandWindow: # close old stage self.stage_finish() - assert isinstance(self.commandnode, unicode) - self.form_status = None self.stages_notebook.set_current_page( @@ -321,8 +319,8 @@ class CommandWindow: dialog.destroy() cb() - dialog = dialogs.HigDialog(self.window, gtk.MESSAGE_WARNING, - gtk.BUTTONS_YES_NO, _('Cancel confirmation'), + dialog = dialogs.HigDialog(self.window, Gtk.MessageType.WARNING, + Gtk.ButtonsType.YES_NO, _('Cancel confirmation'), _('You are in process of executing command. Do you really want to ' 'cancel it?'), on_response_yes=on_yes) dialog.popup() @@ -452,7 +450,7 @@ class CommandWindow: note = command.getTag('note') if note: - self.notes_label.set_text(note.getData().decode('utf-8')) + self.notes_label.set_text(note.getData()) self.notes_label.set_no_show_all(False) self.notes_label.show() else: @@ -510,7 +508,7 @@ class CommandWindow: try: errorname = nbxmpp.NS_STANZAS + ' ' + str(errorid) errordesc = nbxmpp.ERRORS[errorname][2] - error = errordesc.decode('utf-8') + error = errordesc del errorname, errordesc except KeyError: # when stanza doesn't have error description error = _('Service returned an error.') @@ -550,21 +548,21 @@ class CommandWindow: progressbar.pulse() method """ assert not self.pulse_id - assert isinstance(progressbar, gtk.ProgressBar) + assert isinstance(progressbar, Gtk.ProgressBar) def callback(): progressbar.pulse() return True # important to keep callback be called back! # 12 times per second (80 miliseconds) - self.pulse_id = gobject.timeout_add(80, callback) + self.pulse_id = GLib.timeout_add(80, callback) def remove_pulsing(self): """ Stop pulsing, useful when especially when removing widget """ if self.pulse_id: - gobject.source_remove(self.pulse_id) + GLib.source_remove(self.pulse_id) self.pulse_id = None # handling xml stanzas @@ -608,7 +606,6 @@ class CommandWindow: Send the command with data form. Wait for reply """ # create the stanza - assert isinstance(self.commandnode, unicode) assert action in ('execute', 'prev', 'next', 'complete') stanza = nbxmpp.Iq(typ='set', to=self.jid) diff --git a/src/advanced_configuration_window.py b/src/advanced_configuration_window.py index 8bc256a030ea729774f105ec7d6aa54a9b29ce5c..ed5ca4067bbd19a2b2a7d78923e8a00abf1f7319 100644 --- a/src/advanced_configuration_window.py +++ b/src/advanced_configuration_window.py @@ -23,11 +23,12 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## -import gtk +from gi.repository import Gtk import gtkgui_helpers -import gobject +from gi.repository import GLib from common import gajim +from common import helpers ( OPT_TYPE, @@ -50,12 +51,12 @@ def rate_limit(rate): timeout = [None] def f(*args, **kwargs): if timeout[0] is not None: - gobject.source_remove(timeout[0]) + GLib.source_remove(timeout[0]) timeout[0] = None def timeout_func(): func(*args, **kwargs) timeout[0] = None - timeout[0] = gobject.timeout_add(int(1000.0 / rate), timeout_func) + timeout[0] = GLib.timeout_add(int(1000.0 / rate), timeout_func) return f return decorator @@ -98,32 +99,32 @@ class AdvancedConfigurationWindow(object): treeview = self.xml.get_object('advanced_treeview') self.treeview = treeview - self.model = gtk.TreeStore(str, str, str) + self.model = Gtk.TreeStore(str, str, str) self.fill_model() - self.model.set_sort_column_id(0, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.modelfilter = self.model.filter_new() self.modelfilter.set_visible_func(self.visible_func) - renderer_text = gtk.CellRendererText() - col = treeview.insert_column_with_attributes(-1, _('Preference Name'), - renderer_text, text = 0) + renderer_text = Gtk.CellRendererText() + col = Gtk.TreeViewColumn(_('Preference Name'), renderer_text, text = 0) + treeview.insert_column(col, -1) col.set_resizable(True) - renderer_text = gtk.CellRendererText() + renderer_text = Gtk.CellRendererText() renderer_text.connect('edited', self.on_config_edited) - col = treeview.insert_column_with_attributes(-1, _('Value'), - renderer_text, text = 1) + col = Gtk.TreeViewColumn(_('Value'),renderer_text, text = 1) + treeview.insert_column(col, -1) col.set_cell_data_func(renderer_text, self.cb_value_column_data) col.props.resizable = True - col.set_property('expand',True) - col.set_property('sizing',gtk.TREE_VIEW_COLUMN_FIXED) + col.props.expand = True + col.props.sizing = Gtk.TreeViewColumnSizing.FIXED - renderer_text = gtk.CellRendererText() - col = treeview.insert_column_with_attributes(-1, _('Type'), - renderer_text, text = 2) - col.set_property('expand',True) - col.set_property('sizing',gtk.TREE_VIEW_COLUMN_FIXED) + renderer_text = Gtk.CellRendererText() + col = Gtk.TreeViewColumn(_('Type'), renderer_text, text = 2) + treeview.insert_column(col, -1) + col.props.expand = True + col.props.sizing = Gtk.TreeViewColumnSizing.FIXED treeview.set_model(self.modelfilter) @@ -136,7 +137,7 @@ class AdvancedConfigurationWindow(object): self.restart_label.hide() gajim.interface.instances['advanced_config'] = self - def cb_value_column_data(self, col, cell, model, iter_): + def cb_value_column_data(self, col, cell, model, iter_, data): """ Check if it's boolen or holds password stuff and if yes make the cellrenderertext not editable, else - it's editable @@ -154,10 +155,10 @@ class AdvancedConfigurationWindow(object): # path[1] is the key name # path[2] is the root of tree # last two is optional - path = [model[iter_][0].decode('utf-8')] + path = [model[iter_][0]] parent = model.iter_parent(iter_) while parent: - path.append(model[parent][0].decode('utf-8')) + path.append(model[parent][0]) parent = model.iter_parent(parent) return path @@ -195,17 +196,18 @@ class AdvancedConfigurationWindow(object): def on_advanced_treeview_row_activated(self, treeview, path, column): modelpath = self.modelfilter.convert_path_to_child_path(path) modelrow = self.model[modelpath] - option = modelrow[0].decode('utf-8') + option = modelrow[0] if modelrow[2] == self.types['boolean']: for key in self.right_true_dict.keys(): if self.right_true_dict[key] == modelrow[1]: - modelrow[1] = key + modelrow[1] = str(key) newval = {'False': True, 'True': False}[modelrow[1]] - if len(modelpath) > 1: - optnamerow = self.model[modelpath[0]] - optname = optnamerow[0].decode('utf-8') - keyrow = self.model[modelpath[:2]] - key = keyrow[0].decode('utf-8') + if len(modelpath.get_indices()) > 1: + optnamerow = self.model[modelpath.get_indices()[0]] + optname = optnamerow[0] + modelpath.up() + keyrow = self.model[modelpath] + key = keyrow[0] self.remember_option(option + '\n' + key + '\n' + optname, modelrow[1], newval) gajim.config.set_per(optname, key, option, newval) @@ -231,15 +233,17 @@ class AdvancedConfigurationWindow(object): def on_config_edited(self, cell, path, text): # convert modelfilter path to model path + path=Gtk.TreePath.new_from_string(path) modelpath = self.modelfilter.convert_path_to_child_path(path) modelrow = self.model[modelpath] - option = modelrow[0].decode('utf-8') - text = text.decode('utf-8') - if len(modelpath) > 1: - optnamerow = self.model[modelpath[0]] - optname = optnamerow[0].decode('utf-8') - keyrow = self.model[modelpath[:2]] - key = keyrow[0].decode('utf-8') + option = modelrow[0] + if modelpath.get_depth() > 2: + modelpath.up() # Get parent + keyrow = self.model[modelpath] + key = keyrow[0] + modelpath.up() # Get parent + optnamerow = self.model[modelpath] + optname = optnamerow[0] self.remember_option(option + '\n' + key + '\n' + optname, modelrow[1], text) gajim.config.set_per(optname, key, option, text) @@ -268,12 +272,12 @@ class AdvancedConfigurationWindow(object): return modelpath = self.modelfilter.convert_path_to_child_path(path) modelrow = self.model[modelpath] - option = modelrow[0].decode('utf-8') + option = modelrow[0] if len(modelpath) > 1: optnamerow = self.model[modelpath[0]] - optname = optnamerow[0].decode('utf-8') + optname = optnamerow[0] keyrow = self.model[modelpath[:2]] - key = keyrow[0].decode('utf-8') + key = keyrow[0] self.remember_option(option + '\n' + key + '\n' + optname, modelrow[C_VALUE], default) gajim.config.set_per(optname, key, option, default) @@ -285,7 +289,7 @@ class AdvancedConfigurationWindow(object): else: if str(default) == model[iter_][C_VALUE]: return - self.on_config_edited(None, path, str(default)) + self.on_config_edited(None, path.to_string(), str(default)) def on_advanced_close_button_clicked(self, widget): self.window.destroy() @@ -308,11 +312,14 @@ class AdvancedConfigurationWindow(object): if type_ == self.types['boolean']: value = self.right_true_dict[option] else: - value = option + try: + value = str(option) + except: + value = option self.model.append(parent, [name, value, type_]) - def visible_func(self, model, treeiter): - search_string = self.entry.get_text().decode('utf-8').lower() + def visible_func(self, model, treeiter, data): + search_string = self.entry.get_text().lower() for it in tree_model_pre_order(model, treeiter): if model[it][C_TYPE] != '': opt_path = self.get_option_path(model, it) diff --git a/src/atom_window.py b/src/atom_window.py index 078662c20a20167d2d159fcc7b39d32c40c4de19..8930da6d36ede3f60c70242859ca8cbdf8da5937 100644 --- a/src/atom_window.py +++ b/src/atom_window.py @@ -22,8 +22,8 @@ ## -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import GLib import gtkgui_helpers from common import helpers @@ -70,8 +70,8 @@ class AtomWindow: self.xml.connect_signals(self) self.window.show_all() - self.entry_title_eventbox.add_events(gtk.gdk.BUTTON_PRESS_MASK) - self.feed_title_eventbox.add_events(gtk.gdk.BUTTON_PRESS_MASK) + self.entry_title_eventbox.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) + self.feed_title_eventbox.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) def displayNextEntry(self): """ @@ -84,24 +84,24 @@ class AtomWindow: # fill the fields if newentry.feed_link is not None: self.feed_title_label.set_markup( - u'<span foreground="blue" underline="single">%s</span>' % \ - gobject.markup_escape_text(newentry.feed_title)) + '<span foreground="blue" underline="single">%s</span>' % \ + GLib.markup_escape_text(newentry.feed_title)) else: - self.feed_title_label.set_markup( - gobject.markup_escape_text(newentry.feed_title)) + self.feed_title_label.set_markup(GLib.markup_escape_text( + newentry.feed_title)) self.feed_tagline_label.set_markup( - u'<small>%s</small>' % \ - gobject.markup_escape_text(newentry.feed_tagline)) + '<small>%s</small>' % GLib.markup_escape_text( + newentry.feed_tagline)) if newentry.title: if newentry.uri is not None: self.entry_title_label.set_markup( - u'<span foreground="blue" underline="single">%s</span>' % \ - gobject.markup_escape_text(newentry.title)) + '<span foreground="blue" underline="single">%s</span>' % \ + GLib.markup_escape_text(newentry.title)) else: - self.entry_title_label.set_markup( - gobject.markup_escape_text(newentry.title)) + self.entry_title_label.set_markup(GLib.markup_escape_text( + newentry.title)) else: self.entry_title_label.set_markup('') diff --git a/src/cell_renderer_image.py b/src/cell_renderer_image.py index d32da9a4c6c84b1d67cd073688c5ffde6e0997f5..4a573bc4680f301dbe61cb18aa09c3bce6b0ba3e 100644 --- a/src/cell_renderer_image.py +++ b/src/cell_renderer_image.py @@ -21,19 +21,20 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## +from gi.repository import GLib +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GObject -import gtk -import gobject - -class CellRendererImage(gtk.GenericCellRenderer): +class CellRendererImage(Gtk.CellRendererPixbuf): __gproperties__ = { - 'image': (gobject.TYPE_OBJECT, 'Image', - 'Image', gobject.PARAM_READWRITE), + 'image': (GObject.TYPE_OBJECT, 'Image', + 'Image', GObject.PARAM_READWRITE), } def __init__(self, col_index, tv_index): - self.__gobject_init__() + super(CellRendererImage, self).__init__() self.image = None self.col_index = col_index self.tv_index = tv_index @@ -45,6 +46,14 @@ class CellRendererImage(gtk.GenericCellRenderer): def do_get_property(self, pspec): return getattr(self, pspec.name) + def do_activate(event, widget, path, bg_area, cell_area, flags): + """Renderers cannot be activated; always return True.""" + return True + + def do_editing_started(event, widget, path, fb_area, cell_area, flags): + """Renderers cannot be edited; always return None.""" + return None + def func(self, model, path, iter_, image_tree): image, tree = image_tree if model.get_value(iter_, self.tv_index) != image: @@ -53,71 +62,67 @@ class CellRendererImage(gtk.GenericCellRenderer): col = tree.get_column(self.col_index) cell_area = tree.get_cell_area(path, col) - tree.queue_draw_area(cell_area.x, cell_area.y, - cell_area.width, cell_area.height) + tree.queue_draw_area(cell_area.x, cell_area.y, cell_area.width, + cell_area.height) def animation_timeout(self, tree, image): - if image.get_storage_type() != gtk.IMAGE_ANIMATION: + if image.get_storage_type() != Gtk.ImageType.ANIMATION: return self.redraw = 0 iter_ = self.iters[image] - iter_.advance() + timeval = GLib.TimeVal() + timeval.tv_sec = GLib.get_monotonic_time() / 1000000 + iter_.advance(timeval) model = tree.get_model() if model: model.foreach(self.func, (image, tree)) if self.redraw: - gobject.timeout_add(iter_.get_delay_time(), - self.animation_timeout, tree, image) + GLib.timeout_add(iter_.get_delay_time(), + self.animation_timeout, tree, image) elif image in self.iters: del self.iters[image] - def on_render(self, window, widget, background_area, cell_area, - expose_area, flags): + def do_render(self, ctx, widget, background_area, cell_area, flags): if not self.image: return - pix_rect = gtk.gdk.Rectangle() - pix_rect.x, pix_rect.y, pix_rect.width, pix_rect.height = \ - self.on_get_size(widget, cell_area) - - pix_rect.x += cell_area.x - pix_rect.y += cell_area.y - pix_rect.width -= 2 * self.get_property('xpad') - pix_rect.height -= 2 * self.get_property('ypad') - - draw_rect = cell_area.intersect(pix_rect) - draw_rect = expose_area.intersect(draw_rect) - if self.image.get_storage_type() == gtk.IMAGE_ANIMATION: + if self.image.get_storage_type() == Gtk.ImageType.ANIMATION: if self.image not in self.iters: - if not isinstance(widget, gtk.TreeView): + if not isinstance(widget, Gtk.TreeView): return animation = self.image.get_animation() - iter_ = animation.get_iter() + timeval = GLib.TimeVal() + timeval.tv_sec = GLib.get_monotonic_time() / 1000000 + iter_ = animation.get_iter(timeval) self.iters[self.image] = iter_ - gobject.timeout_add(iter_.get_delay_time(), - self.animation_timeout, widget, self.image) + GLib.timeout_add(iter_.get_delay_time(), self.animation_timeout, + widget, self.image) pix = self.iters[self.image].get_pixbuf() - elif self.image.get_storage_type() == gtk.IMAGE_PIXBUF: + elif self.image.get_storage_type() == Gtk.ImageType.PIXBUF: pix = self.image.get_pixbuf() else: return - if draw_rect.x < 1: - return - window.draw_pixbuf(widget.style.black_gc, pix, - draw_rect.x - pix_rect.x, - draw_rect.y - pix_rect.y, - draw_rect.x, draw_rect.y, - draw_rect.width, draw_rect.height, - gtk.gdk.RGB_DITHER_NONE, 0, 0) - - def on_get_size(self, widget, cell_area): + + Gdk.cairo_set_source_pixbuf(ctx, pix, cell_area.x, cell_area.y) + ctx.paint() + + def do_get_size(self, widget, cell_area): + """ + Return the size we need for this cell. + + Each cell is drawn individually and is only as wide as it needs + to be, we let the TreeViewColumn take care of making them all + line up. + """ if not self.image: return 0, 0, 0, 0 - if self.image.get_storage_type() == gtk.IMAGE_ANIMATION: + if self.image.get_storage_type() == Gtk.ImageType.ANIMATION: animation = self.image.get_animation() - pix = animation.get_iter().get_pixbuf() - elif self.image.get_storage_type() == gtk.IMAGE_PIXBUF: + timeval = GLib.TimeVal() + timeval.tv_sec = GLib.get_monotonic_time() / 1000000 + pix = animation.get_iter(timeval).get_pixbuf() + elif self.image.get_storage_type() == Gtk.ImageType.PIXBUF: pix = self.image.get_pixbuf() else: return 0, 0, 0, 0 diff --git a/src/chat_control.py b/src/chat_control.py index 25cce3eac5ce3afd76d465485efc532c8cb55a49..4d133a3900ed402026e0c05b48d9f8f4ebfa952b 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -29,9 +29,12 @@ import os import time -import gtk -import pango -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf +from gi.repository import Pango +from gi.repository import GObject +from gi.repository import GLib import gtkgui_helpers import gui_menu_builder import message_control @@ -86,13 +89,13 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): A base class containing a banner, ConversationTextview, MessageTextView """ - keymap = gtk.gdk.keymap_get_default() + keymap = Gdk.Keymap.get_default() try: - keycode_c = keymap.get_entries_for_keyval(gtk.keysyms.c)[0][0] + keycode_c = keymap.get_entries_for_keyval(Gdk.KEY_c)[1][0].keycode except TypeError: keycode_c = 54 try: - keycode_ins = keymap.get_entries_for_keyval(gtk.keysyms.Insert)[0][0] + keycode_ins = keymap.get_entries_for_keyval(Gdk.KEY_Insert)[1][0].keycode except TypeError: keycode_ins = 118 @@ -113,22 +116,22 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): bannerfontattrs = gajim.config.get_per('themes', theme, 'bannerfontattrs') if bannerfont: - font = pango.FontDescription(bannerfont) + font = Pango.FontDescription(bannerfont) else: - font = pango.FontDescription('Normal') + font = Pango.FontDescription('Normal') if bannerfontattrs: # B attribute is set by default if 'B' in bannerfontattrs: - font.set_weight(pango.WEIGHT_HEAVY) + font.set_weight(Pango.Weight.HEAVY) if 'I' in bannerfontattrs: - font.set_style(pango.STYLE_ITALIC) + font.set_style(Pango.Style.ITALIC) font_attrs = 'font_desc="%s"' % font.to_string() # in case there is no font specified we use x-large font size if font.get_size() == 0: font_attrs = '%s size="x-large"' % font_attrs - font.set_weight(pango.WEIGHT_NORMAL) + font.set_weight(Pango.Weight.NORMAL) font_attrs_small = 'font_desc="%s" size="small"' % font.to_string() return (font_attrs, font_attrs_small) @@ -224,7 +227,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): Derives types SHOULD implement this, rather than connection to the even itself """ - event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) + event = Gdk.Event(Gdk.EventType.KEY_PRESS) event.keyval = event_keyval event.state = event_keymod event.time = 0 @@ -232,12 +235,11 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): _buffer = widget.get_buffer() start, end = _buffer.get_bounds() - if event.keyval -- gtk.keysyms.Tab: + if event.keyval -- Gdk.KEY_Tab: position = _buffer.get_insert() end = _buffer.get_iter_at_mark(position) text = _buffer.get_text(start, end, False) - text = text.decode('utf8') splitted = text.split() @@ -279,9 +281,9 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.seclabel_combo = combo self.seclabel_combo.hide() self.seclabel_combo.set_no_show_all(True) - lb = gtk.ListStore(str) + lb = Gtk.ListStore(str) self.seclabel_combo.set_model(lb) - cell = gtk.CellRendererText() + cell = Gtk.CellRendererText() cell.set_property('xpad', 5) # padding for status text self.seclabel_combo.pack_start(cell, True) # text to show is in in first column of liststore @@ -325,11 +327,8 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): widget = self.xml.get_object('history_button') # set document-open-recent icon for history button if gtkgui_helpers.gtk_icon_theme.has_icon('document-open-recent'): - if widget_name == 'groupchat_control': - img = self.xml.get_object('image8') - else: - img = self.xml.get_object('image5') - img.set_from_icon_name('document-open-recent', gtk.ICON_SIZE_MENU) + img = self.xml.get_object('history_image') + img.set_from_icon_name('document-open-recent', Gtk.IconSize.MENU) id_ = widget.connect('clicked', self._on_history_menuitem_activate) self.handlers[id_] = widget @@ -356,15 +355,15 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): # Init DND self.TARGET_TYPE_URI_LIST = 80 - self.dnd_list = [('text/uri-list', 0, self.TARGET_TYPE_URI_LIST), - ('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_APP, 0)] + self.dnd_list = [Gtk.TargetEntry.new('text/uri-list', 0, + self.TARGET_TYPE_URI_LIST), Gtk.TargetEntry.new('MY_TREE_MODEL_ROW', + Gtk.TargetFlags.SAME_APP, 0)] id_ = self.widget.connect('drag_data_received', self._on_drag_data_received) self.handlers[id_] = self.widget - self.widget.drag_dest_set(gtk.DEST_DEFAULT_MOTION | - gtk.DEST_DEFAULT_HIGHLIGHT | - gtk.DEST_DEFAULT_DROP, - self.dnd_list, gtk.gdk.ACTION_COPY) + self.widget.drag_dest_set(Gtk.DestDefaults.MOTION | + Gtk.DestDefaults.HIGHLIGHT | Gtk.DestDefaults.DROP, + self.dnd_list, Gdk.DragAction.COPY) # Create textviews and connect signals self.conv_textview = ConversationTextview(self.account) @@ -382,10 +381,9 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.handlers[id_] = self.conv_textview.tv id_ = self.conv_textview.tv.connect('drag_leave', self._on_drag_leave) self.handlers[id_] = self.conv_textview.tv - self.conv_textview.tv.drag_dest_set(gtk.DEST_DEFAULT_MOTION | - gtk.DEST_DEFAULT_HIGHLIGHT | - gtk.DEST_DEFAULT_DROP, - self.dnd_list, gtk.gdk.ACTION_COPY) + self.conv_textview.tv.drag_dest_set(Gtk.DestDefaults.MOTION | + Gtk.DestDefaults.HIGHLIGHT | Gtk.DestDefaults.DROP, + self.dnd_list, Gdk.DragAction.COPY) self.conv_scrolledwindow = self.xml.get_object( 'conversation_scrolledwindow') @@ -415,7 +413,8 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): id_ = self.msg_textview.connect('key_press_event', self._on_message_textview_key_press_event) self.handlers[id_] = self.msg_textview - id_ = self.msg_textview.connect('size-request', self.size_request) + id_ = self.msg_textview.connect('configure-event', + self.on_configure_event) self.handlers[id_] = self.msg_textview id_ = self.msg_textview.connect('populate_popup', self.on_msg_textview_populate_popup) @@ -424,9 +423,8 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): id_ = self.msg_textview.connect('drag_data_received', self._on_drag_data_received) self.handlers[id_] = self.msg_textview - self.msg_textview.drag_dest_set(gtk.DEST_DEFAULT_MOTION | - gtk.DEST_DEFAULT_HIGHLIGHT, - self.dnd_list, gtk.gdk.ACTION_COPY) + self.msg_textview.drag_dest_set(Gtk.DestDefaults.MOTION | + Gtk.DestDefaults.HIGHLIGHT, self.dnd_list, Gdk.DragAction.COPY) self.update_font() @@ -502,14 +500,14 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): try: gtkspell.Spell(self.msg_textview, lang) self.msg_textview.lang = lang - except (gobject.GError, RuntimeError, TypeError, OSError): + except (GObject.GError, RuntimeError, TypeError, OSError): dialogs.AspellDictError(lang) def on_banner_label_populate_popup(self, label, menu): """ Override the default context menu and add our own menutiems """ - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() menu.prepend(item) menu2 = self.prepare_context_menu() @@ -552,15 +550,15 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): spell.set_language(lang) widget.set_active(True) - item = gtk.ImageMenuItem(gtk.STOCK_UNDO) + item = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_UNDO, None) menu.prepend(item) id_ = item.connect('activate', self.msg_textview.undo) self.handlers[id_] = item - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() menu.prepend(item) - item = gtk.ImageMenuItem(gtk.STOCK_CLEAR) + item = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_CLEAR, None) menu.prepend(item) id_ = item.connect('activate', self.msg_textview.clear) self.handlers[id_] = item @@ -587,7 +585,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): message_buffer = self.msg_textview.get_buffer() start_iter = message_buffer.get_start_iter() end_iter = message_buffer.get_end_iter() - message = message_buffer.get_text(start_iter, end_iter, 0).decode('utf-8') + message = message_buffer.get_text(start_iter, end_iter, False) xhtml = self.msg_textview.get_xhtml() # send the message @@ -607,23 +605,27 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.disconnect_style_event(banner_name_label) self.disconnect_style_event(self.banner_status_label) if bgcolor: - banner_eventbox.modify_bg(gtk.STATE_NORMAL, - gtk.gdk.color_parse(bgcolor)) + color = Gdk.RGBA() + Gdk.RGBA.parse(color, bgcolor) + banner_eventbox.override_background_color(Gtk.StateType.NORMAL, + color) default_bg = False else: default_bg = True if textcolor: - banner_name_label.modify_fg(gtk.STATE_NORMAL, - gtk.gdk.color_parse(textcolor)) - self.banner_status_label.modify_fg(gtk.STATE_NORMAL, - gtk.gdk.color_parse(textcolor)) + color = Gdk.RGBA() + Gdk.RGBA.parse(color, textcolor) + banner_name_label.override_color(Gtk.StateType.NORMAL, + color) + self.banner_status_label.override_color( + Gtk.StateType.NORMAL, color) default_fg = False else: default_fg = True if default_bg or default_fg: self._on_style_set_event(banner_name_label, None, default_fg, default_bg) - if self.banner_status_label.flags() & gtk.REALIZED: + if self.banner_status_label.get_realized(): # Widget is realized self._on_style_set_event(self.banner_status_label, None, default_fg, default_bg) @@ -639,7 +641,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): 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) + set_bg) self.handlers[id_] = widget def _on_style_set_event(self, widget, style, *opts): @@ -650,93 +652,124 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): """ banner_eventbox = self.xml.get_object('banner_eventbox') self.disconnect_style_event(widget) + context = widget.get_style_context() if opts[1]: - bg_color = widget.style.bg[gtk.STATE_SELECTED] - banner_eventbox.modify_bg(gtk.STATE_NORMAL, bg_color) + bg_color = context.get_background_color(Gtk.StateFlags.SELECTED) + banner_eventbox.override_background_color(Gtk.StateType.NORMAL, bg_color) if opts[0]: - fg_color = widget.style.fg[gtk.STATE_SELECTED] - widget.modify_fg(gtk.STATE_NORMAL, fg_color) + fg_color = context.get_color(Gtk.StateFlags.SELECTED) + widget.override_color(Gtk.StateType.NORMAL, fg_color) self.connect_style_event(widget, opts[0], opts[1]) def _conv_textview_key_press_event(self, widget, event): # translate any layout to latin_layout - keymap = gtk.gdk.keymap_get_default() - keycode = keymap.get_entries_for_keyval(event.keyval)[0][0] - if (event.state & gtk.gdk.CONTROL_MASK and keycode in (self.keycode_c, - self.keycode_ins)) or (event.state & gtk.gdk.SHIFT_MASK and \ - event.keyval in (gtk.keysyms.Page_Down, gtk.keysyms.Page_Up)): + valid, entries = self.keymap.get_entries_for_keyval(event.keyval) + keycode = entries[0].keycode + if (event.get_state() & Gdk.ModifierType.CONTROL_MASK and keycode in ( + self.keycode_c, self.keycode_ins)) or ( + event.get_state() & Gdk.ModifierType.SHIFT_MASK and \ + event.keyval in (Gdk.KEY_Page_Down, Gdk.KEY_Page_Up)): return False - self.parent_win.notebook.emit('key_press_event', event) + self.parent_win.notebook.event(event) return True def show_emoticons_menu(self): if not gajim.config.get('emoticons_theme'): return - - def set_emoticons_menu_position(w, msg_tv=self.msg_textview): - window = msg_tv.get_window(gtk.TEXT_WINDOW_WIDGET) - # get the window position - origin = window.get_origin() - size = window.get_size() - buf = msg_tv.get_buffer() - # get the cursor position - cursor = msg_tv.get_iter_location(buf.get_iter_at_mark( - buf.get_insert())) - cursor = msg_tv.buffer_to_window_coords(gtk.TEXT_WINDOW_TEXT, - cursor.x, cursor.y) - x = origin[0] + cursor[0] - y = origin[1] + size[1] - menu_height = gajim.interface.emoticons_menu.size_request()[1] - #FIXME: get_line_count is not so good - #get the iter of cursor, then tv.get_line_yrange - # so we know in which y we are typing (not how many lines we have - # then go show just above the current cursor line for up - # or just below the current cursor line for down - #TEST with having 3 lines and writing in the 2nd - if y + menu_height > gtk.gdk.screen_height(): - # move menu just above cursor - y -= menu_height + (msg_tv.allocation.height / buf.get_line_count()) - #else: # move menu just below cursor - # y -= (msg_tv.allocation.height / buf.get_line_count()) - return (x, y, True) # push_in True gajim.interface.emoticon_menuitem_clicked = self.append_emoticon - gajim.interface.emoticons_menu.popup(None, None, - set_emoticons_menu_position, 1, 0) + gajim.interface.emoticons_menu.popup(None, None, None, None, 1, 0) def _on_message_textview_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.space: + if event.keyval == Gdk.KEY_space: self.space_pressed = True elif (self.space_pressed or self.msg_textview.undo_pressed) and \ - event.keyval not in (gtk.keysyms.Control_L, gtk.keysyms.Control_R) and \ - not (event.keyval == gtk.keysyms.z and event.state & gtk.gdk.CONTROL_MASK): + event.keyval not in (Gdk.KEY_Control_L, Gdk.KEY_Control_R) and \ + not (event.keyval == Gdk.KEY_z and event.get_state() & Gdk.ModifierType.CONTROL_MASK): # If the space key has been pressed and now it hasnt, # we save the buffer into the undo list. But be carefull we're not # pressiong Control again (as in ctrl+z) _buffer = widget.get_buffer() start_iter, end_iter = _buffer.get_bounds() - self.msg_textview.save_undo(_buffer.get_text(start_iter, end_iter)) + self.msg_textview.save_undo(_buffer.get_text(start_iter, end_iter, True)) self.space_pressed = False # Ctrl [+ Shift] + Tab are not forwarded to notebook. We handle it here if self.widget_name == 'groupchat_control': - if event.keyval not in (gtk.keysyms.ISO_Left_Tab, gtk.keysyms.Tab): + if event.keyval not in (Gdk.KEY_ISO_Left_Tab, Gdk.KEY_Tab): self.last_key_tabs = False - if event.state & gtk.gdk.SHIFT_MASK: + if event.get_state() & Gdk.ModifierType.SHIFT_MASK: # CTRL + SHIFT + TAB - if event.state & gtk.gdk.CONTROL_MASK and \ - event.keyval == gtk.keysyms.ISO_Left_Tab: + if event.get_state() & Gdk.ModifierType.CONTROL_MASK and \ + event.keyval == Gdk.KEY_ISO_Left_Tab: self.parent_win.move_to_next_unread_tab(False) return True # SHIFT + PAGE_[UP|DOWN]: send to conv_textview - elif event.keyval == gtk.keysyms.Page_Down or \ - event.keyval == gtk.keysyms.Page_Up: - self.conv_textview.tv.emit('key_press_event', event) + elif event.keyval == Gdk.KEY_Page_Down or \ + event.keyval == Gdk.KEY_Page_Up: + self.conv_textview.tv.event(event) return True - elif event.state & gtk.gdk.CONTROL_MASK: - if event.keyval == gtk.keysyms.Tab: # CTRL + TAB + elif event.get_state() & Gdk.ModifierType.CONTROL_MASK: + if event.keyval == Gdk.KEY_Tab: # CTRL + TAB self.parent_win.move_to_next_unread_tab(True) return True +################################################################################ + # temporary solution instead Gtk.binding_entry_add_signal + message_buffer = self.msg_textview.get_buffer() + event_state = event.get_state() + if event.keyval == Gdk.KEY_Up: + if event_state & Gdk.ModifierType.CONTROL_MASK: + if event_state & Gdk.ModifierType.SHIFT_MASK: # Ctrl+Shift+UP + self.scroll_messages('up', message_buffer, 'received') + else: # Ctrl+UP + self.scroll_messages('up', message_buffer, 'sent') + return True + elif event.keyval == Gdk.KEY_Down: + if event_state & Gdk.ModifierType.CONTROL_MASK: + if event_state & Gdk.ModifierType.SHIFT_MASK: # Ctrl+Shift+Down + self.scroll_messages('down', message_buffer, 'received') + else: # Ctrl+Down + self.scroll_messages('down', message_buffer, 'sent') + return True + + elif event.keyval == Gdk.KEY_Return or \ + event.keyval == Gdk.KEY_KP_Enter: # ENTER + message_textview = widget + message_buffer = message_textview.get_buffer() + start_iter, end_iter = message_buffer.get_bounds() + message = message_buffer.get_text(start_iter, end_iter, False) + xhtml = self.msg_textview.get_xhtml() + + if gajim.config.get('send_on_ctrl_enter'): + if event_state & Gdk.ModifierType.CONTROL_MASK: # CTRL + ENTER + send_message = True + else: + end_iter = message_buffer.get_end_iter() + message_buffer.insert_at_cursor('\n') + send_message = False + + else: # send on Enter, do newline on Ctrl Enter + if event_state & Gdk.ModifierType.CONTROL_MASK: # Ctrl + ENTER + end_iter = message_buffer.get_end_iter() + message_buffer.insert_at_cursor('\n') + send_message = False + else: # ENTER + send_message = True + + if gajim.connections[self.account].connected < 2 and send_message: + # we are not connected + dialogs.ErrorDialog(_('A connection is not available'), + _('Your message can not be sent until you are connected.')) + send_message = False + + if send_message: + self.send_message(message, xhtml=xhtml) # send the message + return True + elif event.keyval == Gdk.KEY_z: # CTRL+z + if event_state & Gdk.ModifierType.CONTROL_MASK: + self.msg_textview.undo() + return True +################################################################################ return False def _on_message_textview_mykeypress_event(self, widget, event_keyval, @@ -750,30 +783,29 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): message_textview = widget message_buffer = message_textview.get_buffer() start_iter, end_iter = message_buffer.get_bounds() - message = message_buffer.get_text(start_iter, end_iter, False).decode( - 'utf-8') + message = message_buffer.get_text(start_iter, end_iter, False) xhtml = self.msg_textview.get_xhtml() # construct event instance from binding - event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) # it's always a key-press here + event = Gdk.Event(Gdk.EventType.KEY_PRESS) # it's always a key-press here event.keyval = event_keyval event.state = event_keymod event.time = 0 # assign current time - if event.keyval == gtk.keysyms.Up: - if event.state == gtk.gdk.CONTROL_MASK: # Ctrl+UP + if event.keyval == Gdk.KEY_Up: + if event.get_state() == Gdk.ModifierType.CONTROL_MASK: # Ctrl+UP self.scroll_messages('up', message_buffer, 'sent') # Ctrl+Shift+UP - elif event.state == (gtk.gdk.CONTROL_MASK | gtk.gdk.SHIFT_MASK): + elif event.get_state() == (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK): self.scroll_messages('up', message_buffer, 'received') - elif event.keyval == gtk.keysyms.Down: - if event.state == gtk.gdk.CONTROL_MASK: # Ctrl+Down + elif event.keyval == Gdk.KEY_Down: + if event.get_state() == Gdk.ModifierType.CONTROL_MASK: # Ctrl+Down self.scroll_messages('down', message_buffer, 'sent') # Ctrl+Shift+Down - elif event.state == (gtk.gdk.CONTROL_MASK | gtk.gdk.SHIFT_MASK): + elif event.get_state() == (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK): self.scroll_messages('down', message_buffer, 'received') - elif event.keyval == gtk.keysyms.Return or \ - event.keyval == gtk.keysyms.KP_Enter: # ENTER + elif event.keyval == Gdk.KEY_Return or \ + event.keyval == Gdk.KEY_KP_Enter: # ENTER # NOTE: SHIFT + ENTER is not needed to be emulated as it is not # binding at all (textview's default action is newline) @@ -781,14 +813,14 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): # here, we emulate GTK default action on ENTER (add new line) # normally I would add in keypress but it gets way to complex # to get instant result on changing this advanced setting - if event.state == 0: # no ctrl, no shift just ENTER add newline + if event.get_state() == 0: # no ctrl, no shift just ENTER add newline end_iter = message_buffer.get_end_iter() message_buffer.insert_at_cursor('\n') send_message = False - elif event.state & gtk.gdk.CONTROL_MASK: # CTRL + ENTER + elif event.get_state() & Gdk.ModifierType.CONTROL_MASK: # CTRL + ENTER send_message = True else: # send on Enter, do newline on Ctrl Enter - if event.state & gtk.gdk.CONTROL_MASK: # Ctrl + ENTER + if event.get_state() & Gdk.ModifierType.CONTROL_MASK: # Ctrl + ENTER end_iter = message_buffer.get_end_iter() message_buffer.insert_at_cursor('\n') send_message = False @@ -803,8 +835,8 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): if send_message: self.send_message(message, xhtml=xhtml) # send the message - elif event.keyval == gtk.keysyms.z: # CTRL+z - if event.state & gtk.gdk.CONTROL_MASK: + elif event.keyval == Gdk.KEY_z: # CTRL+z + if event.get_state() & Gdk.ModifierType.CONTROL_MASK: self.msg_textview.undo() else: # Give the control itself a chance to process @@ -894,7 +926,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): scroll = False if pos == size else True # are we scrolling? # we don't want size of the buffer to grow indefinately max_size = gajim.config.get('key_up_lines') - for i in xrange(size - max_size + 1): + for i in range(size - max_size + 1): if pos == 0: break history.pop(0) @@ -1040,7 +1072,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): """ Popup formattings menu """ - menu = gtk.Menu() + menu = Gtk.Menu() menuitems = ((_('Bold'), 'bold'), (_('Italic'), 'italic'), @@ -1050,7 +1082,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): active_tags = self.msg_textview.get_active_tags() for menuitem in menuitems: - item = gtk.CheckMenuItem(menuitem[0]) + item = Gtk.CheckMenuItem(menuitem[0]) if menuitem[1] in active_tags: item.set_active(True) else: @@ -1059,44 +1091,45 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): menuitem[1]) menu.append(item) - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) - item = gtk.ImageMenuItem(_('Color')) - icon = gtk.image_new_from_stock(gtk.STOCK_SELECT_COLOR, gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem(_('Color')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_SELECT_COLOR, Gtk.IconSize.MENU) item.set_image(icon) item.connect('activate', self.on_color_menuitem_activale) menu.append(item) - item = gtk.ImageMenuItem(_('Font')) - icon = gtk.image_new_from_stock(gtk.STOCK_SELECT_FONT, gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem(_('Font')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_SELECT_FONT, Gtk.IconSize.MENU) item.set_image(icon) item.connect('activate', self.on_font_menuitem_activale) menu.append(item) - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) - item = gtk.ImageMenuItem(_('Clear formating')) - icon = gtk.image_new_from_stock(gtk.STOCK_CLEAR, gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem(_('Clear formating')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_CLEAR, Gtk.IconSize.MENU) item.set_image(icon) item.connect('activate', self.msg_textview.clear_tags) menu.append(item) menu.show_all() + menu.attach_to_widget(widget, None) gtkgui_helpers.popup_emoticons_under_button(menu, widget, self.parent_win) def on_color_menuitem_activale(self, widget): - color_dialog = gtk.ColorSelectionDialog('Select a color') - color_dialog.connect('response', self.msg_textview.color_set, - color_dialog.colorsel) + color_dialog = Gtk.ColorChooserDialog(None, self.parent_win.window) + color_dialog.set_use_alpha(False) + color_dialog.connect('response', self.msg_textview.color_set) color_dialog.show_all() def on_font_menuitem_activale(self, widget): - font_dialog = gtk.FontSelectionDialog('Select a font') - font_dialog.connect('response', self.msg_textview.font_set, - font_dialog.fontsel) + font_dialog = Gtk.FontChooserDialog(None, self.parent_win.window) + start, finish = self.msg_textview.get_active_iters() + font_dialog.connect('response', self.msg_textview.font_set, start, finish) font_dialog.show_all() def on_actions_button_clicked(self, widget): @@ -1105,13 +1138,14 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): """ menu = self.prepare_context_menu(hide_buttonbar_items=True) menu.show_all() + menu.attach_to_widget(widget, None) gtkgui_helpers.popup_emoticons_under_button(menu, widget, self.parent_win) def update_font(self): - font = pango.FontDescription(gajim.config.get('conversation_font')) - self.conv_textview.tv.modify_font(font) - self.msg_textview.modify_font(font) + font = Pango.FontDescription(gajim.config.get('conversation_font')) + self.conv_textview.tv.override_font(font) + self.msg_textview.override_font(font) def update_tags(self): self.conv_textview.update_tags() @@ -1209,7 +1243,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): visible_rect = textview.get_visible_rect() # scroll only if expected end is not visible if end_rect.y >= (visible_rect.y + visible_rect.height + diff_y): - self.scroll_to_end_id = gobject.idle_add(self.scroll_to_end_iter, + self.scroll_to_end_id = GLib.idle_add(self.scroll_to_end_iter, textview) def scroll_to_end_iter(self, textview): @@ -1219,20 +1253,20 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.scroll_to_end_id = None return False - def size_request(self, msg_textview, requisition): + def on_configure_event(self, msg_textview, event): """ When message_textview changes its size: if the new height will enlarge the window, enable the scrollbar automatic policy. Also enable scrollbar automatic policy for horizontal scrollbar if message we have in message_textview is too big """ - if msg_textview.window is None: + if msg_textview.get_window() is None: return min_height = self.conv_scrolledwindow.get_property('height-request') - conversation_height = self.conv_textview.tv.window.get_size()[1] - message_height = msg_textview.window.get_size()[1] - message_width = msg_textview.window.get_size()[0] + conversation_height = self.conv_textview.tv.get_window().get_size()[1] + message_height = msg_textview.get_window().get_size()[1] + message_width = msg_textview.get_window().get_size()[0] # new tab is not exposed yet if conversation_height < 2: return @@ -1245,31 +1279,31 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): # but we also want to avoid window resizing so if we reach that # minimum for conversation_textview and maximum for message_textview # we set to automatic the scrollbar policy - diff_y = message_height - requisition.height + diff_y = message_height - event.height if diff_y != 0: if conversation_height + diff_y < min_height: if message_height + conversation_height - min_height > min_height: policy = self.msg_scrolledwindow.get_property( 'vscrollbar-policy') - if policy != gtk.POLICY_AUTOMATIC: + if policy != Gtk.PolicyType.AUTOMATIC: self.msg_scrolledwindow.set_property('vscrollbar-policy', - gtk.POLICY_AUTOMATIC) + Gtk.PolicyType.AUTOMATIC) self.msg_scrolledwindow.set_property('height-request', message_height + conversation_height - min_height) else: self.msg_scrolledwindow.set_property('vscrollbar-policy', - gtk.POLICY_NEVER) + Gtk.PolicyType.NEVER) self.msg_scrolledwindow.set_property('height-request', -1) self.smooth = True # reinit the flag # enable scrollbar automatic policy for horizontal scrollbar # if message we have in message_textview is too big - if requisition.width > message_width: + if event.width > message_width: self.msg_scrolledwindow.set_property('hscrollbar-policy', - gtk.POLICY_AUTOMATIC) + Gtk.PolicyType.AUTOMATIC) else: self.msg_scrolledwindow.set_property('hscrollbar-policy', - gtk.POLICY_NEVER) + Gtk.PolicyType.NEVER) return True @@ -1282,15 +1316,15 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.conv_textview.bring_scroll_to_end(-18) else: self.conv_textview.bring_scroll_to_end(-18, use_smooth=False) - self.was_at_the_end = (adjustment.upper - adjustment.value - \ - adjustment.page_size) < 18 + self.was_at_the_end = (adjustment.get_upper() - adjustment.get_value()\ + - adjustment.get_page_size()) < 18 def on_conversation_vadjustment_value_changed(self, adjustment): # stop automatic scroll when we manually scroll if not self.conv_textview.auto_scrolling: self.conv_textview.stop_scrolling() - self.was_at_the_end = (adjustment.upper - adjustment.value - \ - adjustment.page_size) < 18 + self.was_at_the_end = (adjustment.get_upper() - adjustment.get_value() \ + - adjustment.get_page_size()) < 18 if self.resource: jid = self.contact.get_full_jid() else: @@ -1361,21 +1395,24 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): # whatever is already typed start_iter = msg_buf.get_start_iter() end_iter = msg_buf.get_end_iter() - self.orig_msg = msg_buf.get_text(start_iter, end_iter, 0).decode( - 'utf-8') + self.orig_msg = msg_buf.get_text(start_iter, end_iter, False) if pos == size and size > 0 and direction == 'up' and \ msg_type == 'sent' and not self.correcting and (not \ history[pos - 1].startswith('/') or history[pos - 1].startswith('/me')): self.correcting = True - self.old_message_tv_color = self.msg_textview.get_style().base[0] - self.msg_textview.modify_base(gtk.STATE_NORMAL, gtk.gdk.color_parse( - 'PaleGoldenrod')) + context = self.msg_textview.get_style_context() + state = Gtk.StateFlags.NORMAL + self.old_message_tv_color = context.get_background_color(state) + color = Gdk.RGBA() + Gdk.RGBA.parse(color, 'PaleGoldenrod') + self.msg_textview.override_background_color(Gtk.StateType.NORMAL, + color) message = history[pos - 1] msg_buf.set_text(message) return if self.correcting: # We were previously correcting - self.msg_textview.modify_base(gtk.STATE_NORMAL, + self.msg_textview.override_background_color(Gtk.StateType.NORMAL, self.old_message_tv_color) self.correcting = False pos += -1 if direction == 'up' else +1 @@ -1409,7 +1446,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): """ # make the last message visible, when changing to "full view" if not state: - gobject.idle_add(self.conv_textview.scroll_to_end_iter) + GLib.idle_add(self.conv_textview.scroll_to_end_iter) widget.set_no_show_all(state) if state: @@ -1499,7 +1536,7 @@ class ChatControl(ChatControlBase): pixbuf = gtkgui_helpers.get_icon_pixmap('document-send', quiet=True) if not pixbuf: pixbuf = gtkgui_helpers.get_icon_pixmap('gajim-upload') - img = gtk.image_new_from_pixbuf(pixbuf) + img = Gtk.Image.new_from_pixbuf(pixbuf) self._send_file_button.set_image(img) id_ = self._send_file_button.connect('clicked', self._on_send_file_menuitem_activate) @@ -1593,6 +1630,12 @@ class ChatControl(ChatControlBase): id_ = widget.connect('button-release-event', self.on_location_eventbox_button_release_event) self.handlers[id_] = widget + id_ = widget.connect('enter-notify-event', + self.on_location_eventbox_enter_notify_event) + self.handlers[id_] = widget + id_ = widget.connect('leave-notify-event', + self.on_location_eventbox_leave_notify_event) + self.handlers[id_] = widget for key in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '0', '#'): widget = self.xml.get_object(key + '_button') @@ -1602,7 +1645,7 @@ class ChatControl(ChatControlBase): self.handlers[id_] = widget self.dtmf_window = self.xml.get_object('dtmf_window') - self.dtmf_window.get_child().set_direction(gtk.TEXT_DIR_LTR) + self.dtmf_window.get_child().set_direction(Gtk.TextDirection.LTR) id_ = self.dtmf_window.connect('focus-out-event', self.on_dtmf_window_focus_out_event) self.handlers[id_] = self.dtmf_window @@ -1619,15 +1662,15 @@ class ChatControl(ChatControlBase): id_ = widget.connect('value_changed', self.on_sound_hscale_value_changed) self.handlers[id_] = widget - self.info_bar = gtk.InfoBar() + self.info_bar = Gtk.InfoBar() content_area = self.info_bar.get_content_area() - self.info_bar_label = gtk.Label() + self.info_bar_label = Gtk.Label() self.info_bar_label.set_use_markup(True) self.info_bar_label.set_alignment(0, 0) content_area.add(self.info_bar_label) self.info_bar.set_no_show_all(True) widget = self.xml.get_object('vbox2') - widget.pack_start(self.info_bar, expand=False, padding=5) + widget.pack_start(self.info_bar, False, True, 5) widget.reorder_child(self.info_bar, 1) # List of waiting infobar messages @@ -1773,14 +1816,15 @@ class ChatControl(ChatControlBase): # Send file if ((self.contact.supports(NS_FILE) or \ - self.contact.supports(NS_JINGLE_FILE_TRANSFER)) or \ - self.type_id == 'chat' or self.gc_contact.resource) and \ + self.contact.supports(NS_JINGLE_FILE_TRANSFER)) and \ + (self.type_id == 'chat' or self.gc_contact.resource)) and \ self.contact.show != 'offline': self._send_file_button.set_sensitive(True) self._send_file_button.set_tooltip_text(_('Send files')) else: self._send_file_button.set_sensitive(False) - if not (self.contact.supports(NS_FILE) or self.contact.supports(NS_JINGLE_FILE_TRANSFER)): + if not (self.contact.supports(NS_FILE) or self.contact.supports( + NS_JINGLE_FILE_TRANSFER)): self._send_file_button.set_tooltip_text(_( "This contact does not support file transfer.")) else: @@ -1817,7 +1861,7 @@ class ChatControl(ChatControlBase): pep = self.contact.pep img = self._pep_images[pep_type] if pep_type in pep: - img.set_from_pixbuf(pep[pep_type].asPixbufIcon()) + img.set_from_pixbuf(gtkgui_helpers.get_pep_as_pixbuf(pep[pep_type])) img.set_tooltip_markup(pep[pep_type].asMarkupText()) img.show() else: @@ -1847,16 +1891,16 @@ class ChatControl(ChatControlBase): banner_image.show() if state == self.JINGLE_STATE_CONNECTING: banner_image.set_from_stock( - gtk.STOCK_CONVERT, 1) + Gtk.STOCK_CONVERT, 1) elif state == self.JINGLE_STATE_CONNECTION_RECEIVED: banner_image.set_from_stock( - gtk.STOCK_NETWORK, 1) + Gtk.STOCK_NETWORK, 1) elif state == self.JINGLE_STATE_CONNECTED: banner_image.set_from_stock( - gtk.STOCK_CONNECT, 1) + Gtk.STOCK_CONNECT, 1) elif state == self.JINGLE_STATE_ERROR: banner_image.set_from_stock( - gtk.STOCK_DIALOG_WARNING, 1) + Gtk.STOCK_DIALOG_WARNING, 1) self.update_toolbar() def update_audio(self): @@ -1984,8 +2028,8 @@ class ChatControl(ChatControlBase): if avatar_w > scaled_buf_w or avatar_h > scaled_buf_h: # wait for 0.5 sec in case we leave earlier if self.show_bigger_avatar_timeout_id is not None: - gobject.source_remove(self.show_bigger_avatar_timeout_id) - self.show_bigger_avatar_timeout_id = gobject.timeout_add(500, + GLib.source_remove(self.show_bigger_avatar_timeout_id) + self.show_bigger_avatar_timeout_id = GLib.timeout_add(500, self.show_bigger_avatar, widget) def on_avatar_eventbox_leave_notify_event(self, widget, event): @@ -1994,7 +2038,7 @@ class ChatControl(ChatControlBase): """ # did we add a timeout? if yes remove it if self.show_bigger_avatar_timeout_id is not None: - gobject.source_remove(self.show_bigger_avatar_timeout_id) + GLib.source_remove(self.show_bigger_avatar_timeout_id) self.show_bigger_avatar_timeout_id = None def on_avatar_eventbox_button_press_event(self, widget, event): @@ -2002,8 +2046,8 @@ class ChatControl(ChatControlBase): If right-clicked, show popup """ if event.button == 3: # right click - menu = gtk.Menu() - menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) + menu = Gtk.Menu() + menuitem = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_SAVE_AS, None) id_ = menuitem.connect('activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, self.contact.jid, self.contact.get_shown_name()) @@ -2013,7 +2057,8 @@ class ChatControl(ChatControlBase): menu.connect('selection-done', lambda w: w.destroy()) # show the menu menu.show_all() - menu.popup(None, None, None, event.button, event.time) + menu.attach_to_widget(widget, None) + menu.popup(None, None, None, None, event.button, event.time) return True def on_location_eventbox_button_release_event(self, widget, event): @@ -2025,6 +2070,17 @@ class ChatControl(ChatControlBase): 'lon': location['lon']} helpers.launch_browser_mailer('url', uri) + def on_location_eventbox_leave_notify_event(self, widget, event): + """ + Just moved the mouse so show the cursor + """ + cursor = Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR) + self.parent_win.window.get_window().set_cursor(cursor) + + def on_location_eventbox_enter_notify_event(self, widget, event): + cursor = Gdk.Cursor.new(Gdk.CursorType.HAND2) + self.parent_win.window.get_window().set_cursor(cursor) + def _on_window_motion_notify(self, widget, event): """ It gets called no matter if it is the active window or not @@ -2035,9 +2091,9 @@ class ChatControl(ChatControlBase): self.mouse_over_in_last_30_secs = True def _schedule_activity_timers(self): - self.possible_paused_timeout_id = gobject.timeout_add_seconds(5, + self.possible_paused_timeout_id = GLib.timeout_add_seconds(5, self.check_for_possible_paused_chatstate, None) - self.possible_inactive_timeout_id = gobject.timeout_add_seconds(30, + self.possible_inactive_timeout_id = GLib.timeout_add_seconds(30, self.check_for_possible_inactive_chatstate, None) def update_ui(self): @@ -2068,7 +2124,7 @@ class ChatControl(ChatControlBase): use_size_32 = False banner_status_img = self.xml.get_object('banner_status_image') - if banner_image.get_storage_type() == gtk.IMAGE_ANIMATION: + if banner_image.get_storage_type() == Gtk.ImageType.ANIMATION: banner_status_img.set_from_animation(banner_image.get_animation()) else: pix = banner_image.get_pixbuf() @@ -2077,7 +2133,7 @@ class ChatControl(ChatControlBase): banner_status_img.set_from_pixbuf(pix) else: # we need to scale 16x16 to 32x32 scaled_pix = pix.scale_simple(32, 32, - gtk.gdk.INTERP_BILINEAR) + GdkPixbuf.InterpType.BILINEAR) banner_status_img.set_from_pixbuf(scaled_pix) def draw_banner_text(self): @@ -2097,7 +2153,7 @@ class ChatControl(ChatControlBase): name = i18n.direction_mark + _( '%(nickname)s from group chat %(room_name)s') % \ {'nickname': name, 'room_name': self.room_name} - name = i18n.direction_mark + gobject.markup_escape_text(name) + name = i18n.direction_mark + GLib.markup_escape_text(name) # We know our contacts nick, but if another contact has the same nick # in another account we need to also display the account. @@ -2110,20 +2166,21 @@ class ChatControl(ChatControlBase): break for jid in gajim.contacts.get_jid_list(account): other_contact_ = \ - gajim.contacts.get_first_contact_from_jid(account, jid) - if other_contact_.get_shown_name() == self.contact.get_shown_name(): + gajim.contacts.get_first_contact_from_jid(account, jid) + if other_contact_.get_shown_name() == \ + self.contact.get_shown_name(): acct_info = i18n.direction_mark + ' (%s)' % \ - gobject.markup_escape_text(self.account) + GLib.markup_escape_text(self.account) break status = contact.status if status is not None: - banner_name_label.set_ellipsize(pango.ELLIPSIZE_END) - self.banner_status_label.set_ellipsize(pango.ELLIPSIZE_END) + banner_name_label.set_ellipsize(Pango.EllipsizeMode.END) + self.banner_status_label.set_ellipsize(Pango.EllipsizeMode.END) status_reduced = helpers.reduce_chars_newlines(status, max_lines=1) else: status_reduced = '' - status_escaped = gobject.markup_escape_text(status_reduced) + status_escaped = GLib.markup_escape_text(status_reduced) font_attrs, font_attrs_small = self.get_font_attrs() st = gajim.config.get('displayed_chat_state_notifications') @@ -2195,12 +2252,12 @@ class ChatControl(ChatControlBase): fixed = self.xml.get_object('outgoing_fixed') fixed.set_no_show_all(False) video_hbox.show_all() - out_xid = self.xml.get_object('outgoing_drawingarea').\ - window.xid + out_xid = self.xml.get_object( + 'outgoing_drawingarea').get_window().xid else: out_xid = None video_hbox.show_all() - in_xid = self.xml.get_object('incoming_drawingarea').window.xid + in_xid = self.xml.get_object('incoming_drawingarea').get_window().xid sid = gajim.connections[self.account].start_video( self.contact.get_full_jid(), in_xid, out_xid) else: @@ -2345,8 +2402,8 @@ class ChatControl(ChatControlBase): chatstate_to_send = 'active' contact.our_chatstate = 'active' - gobject.source_remove(self.possible_paused_timeout_id) - gobject.source_remove(self.possible_inactive_timeout_id) + GLib.source_remove(self.possible_paused_timeout_id) + GLib.source_remove(self.possible_inactive_timeout_id) self._schedule_activity_timers() def _on_sent(msg_stanza, message, encrypted, xhtml, label, old_txt): @@ -2365,8 +2422,8 @@ class ChatControl(ChatControlBase): self.conv_textview.correct_last_sent_message(message, xhtml, self.get_our_nick(), old_txt) self.correcting = False - self.msg_textview.modify_base(gtk.STATE_NORMAL, - self.old_message_tv_color) + self.msg_textview.override_background_color( + Gtk.StateType.NORMAL, self.old_message_tv_color) return self.print_conversation(message, self.contact.jid, encrypted=encrypted, xep0184_id=xep0184_id, xhtml=xhtml, @@ -2569,41 +2626,47 @@ class ChatControl(ChatControlBase): if num_unread == 1 and not gajim.config.get('show_unread_tab_icon'): unread = '*' elif num_unread > 1: - unread = '[' + unicode(num_unread) + ']' + unread = '[' + str(num_unread) + ']' # Draw tab label using chatstate theme = gajim.config.get('roster_theme') - color = None + color_s = None if not chatstate: chatstate = self.contact.chatstate if chatstate is not None: if chatstate == 'composing': - color = gajim.config.get_per('themes', theme, - 'state_composing_color') + color_s = gajim.config.get_per('themes', theme, + 'state_composing_color') elif chatstate == 'inactive': - color = gajim.config.get_per('themes', theme, - 'state_inactive_color') + color_s = gajim.config.get_per('themes', theme, + 'state_inactive_color') elif chatstate == 'gone': - color = gajim.config.get_per('themes', theme, - 'state_gone_color') + color_s = gajim.config.get_per('themes', theme, + 'state_gone_color') elif chatstate == 'paused': - color = gajim.config.get_per('themes', theme, - 'state_paused_color') - if color: + color_s = gajim.config.get_per('themes', theme, + 'state_paused_color') + + context = self.parent_win.notebook.get_style_context() + if color_s: # We set the color for when it's the current tab or not - color = gtk.gdk.colormap_get_system().alloc_color(color) + color = Gdk.RGBA() + ok = Gdk.RGBA.parse(color, color_s) + if not ok: + del color + color = context.get_color(Gtk.StateFlags.ACTIVE) # In inactive tab color to be lighter against the darker inactive # background if chatstate in ('inactive', 'gone') and\ self.parent_win.get_active_control() != self: color = self.lighten_color(color) else: # active or not chatstate, get color from gtk - color = self.parent_win.notebook.style.fg[gtk.STATE_ACTIVE] + color = context.get_color(Gtk.StateFlags.ACTIVE) name = self.contact.get_shown_name() if self.resource: name += '/' + self.resource - label_str = gobject.markup_escape_text(name) + label_str = GLib.markup_escape_text(name) if num_unread: # if unread, text in the label becomes bold label_str = '<b>' + unread + label_str + '</b>' return (label_str, color) @@ -2644,7 +2707,11 @@ class ChatControl(ChatControlBase): tranasports) and file_transfer_menuitem and hide()/show() for add_to_roster_menuitem """ - menu = gui_menu_builder.get_contact_menu(self.contact, self.account, + if gajim.jid_is_transport(self.contact.jid): + menu = gui_menu_builder.get_transport_menu(self.contact, + self.account) + else: + menu = gui_menu_builder.get_contact_menu(self.contact, self.account, use_multiple_contacts=False, show_start_chat=False, show_encryption=True, control=self, show_buttonbar_items=not hide_buttonbar_items) @@ -2741,8 +2808,8 @@ class ChatControl(ChatControlBase): self.session.control = None # Disconnect timer callbacks - gobject.source_remove(self.possible_paused_timeout_id) - gobject.source_remove(self.possible_inactive_timeout_id) + GLib.source_remove(self.possible_paused_timeout_id) + GLib.source_remove(self.possible_inactive_timeout_id) # Remove bigger avatar window if self.bigger_avatar_window: self.bigger_avatar_window.destroy() @@ -2761,7 +2828,7 @@ class ChatControl(ChatControlBase): backend=backend) # remove all register handlers on widgets, created by self.xml # to prevent circular references among objects - for i in self.handlers.keys(): + for i in list(self.handlers.keys()): if self.handlers[i].handler_is_connected(i): self.handlers[i].disconnect(i) del self.handlers[i] @@ -2812,7 +2879,11 @@ class ChatControl(ChatControlBase): self.parent_win.redraw_tab(self, self.contact.chatstate) def _nec_caps_received(self, obj): - if obj.conn.name != self.account or obj.jid != self.contact.jid: + if obj.conn.name != self.account: + return + if self.TYPE_ID == 'chat' and obj.jid != self.contact.jid: + return + if self.TYPE_ID == 'pm' and obj.fjid != self.contact.jid: return self.update_ui() @@ -2827,8 +2898,8 @@ class ChatControl(ChatControlBase): else: self.send_chatstate('active', self.contact) self.reset_kbd_mouse_timeout_vars() - gobject.source_remove(self.possible_paused_timeout_id) - gobject.source_remove(self.possible_inactive_timeout_id) + GLib.source_remove(self.possible_paused_timeout_id) + GLib.source_remove(self.possible_inactive_timeout_id) self._schedule_activity_timers() else: self.send_chatstate('inactive', self.contact) @@ -2906,7 +2977,7 @@ class ChatControl(ChatControlBase): type_ = model[iter_][2] if type_ != 'contact': # source is not a contact return - dropped_jid = data.decode('utf-8') + dropped_jid = data dropped_transport = gajim.get_transport_name_from_jid(dropped_jid) c_transport = gajim.get_transport_name_from_jid(c.jid) @@ -2969,6 +3040,7 @@ class ChatControl(ChatControlBase): 'remove it (all history will be lost).') % common.logger.LOG_DB_PATH) rows = [] local_old_kind = None + self.conv_textview.just_cleared = True for row in rows: # row[0] time, row[1] has kind, row[2] the message if not row[2]: # message is empty, we don't print it continue @@ -2993,14 +3065,14 @@ class ChatControl(ChatControlBase): xhtml = None if row[2].startswith('<body '): xhtml = row[2] - if row[2].startswith('/me ') or row[2].startswith('/me\n'): - local_old_kind = None - else: - local_old_kind = kind ChatControlBase.print_conversation_line(self, row[2], kind, name, tim, small_attr, small_attr + ['restored_message'], small_attr + ['restored_message'], False, old_kind=local_old_kind, xhtml=xhtml) + if row[2].startswith('/me ') or row[2].startswith('/me\n'): + local_old_kind = None + else: + local_old_kind = kind if len(rows): self.conv_textview.print_empty_line() @@ -3070,9 +3142,9 @@ class ChatControl(ChatControlBase): Resize the avatar, if needed, so it has at max half the screen size and shows it """ - if not small_avatar.window: - # Tab has been closed since we hovered the avatar - return + #if not small_avatar.window: + ### Tab has been closed since we hovered the avatar + #return avatar_pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache( self.contact.jid) if avatar_pixbuf in ('ask', None): @@ -3084,11 +3156,12 @@ class ChatControl(ChatControlBase): # It's why I set it transparent. image = self.xml.get_object('avatar_image') pixbuf = image.get_pixbuf() - pixbuf.fill(0xffffff00L) # RGBA - image.queue_draw() + pixbuf.fill(0xffffff00) # RGBA + image.set_from_pixbuf(pixbuf) + #image.queue_draw() - screen_w = gtk.gdk.screen_width() - screen_h = gtk.gdk.screen_height() + screen_w = Gdk.Screen.width() + screen_h = Gdk.Screen.height() avatar_w = avatar_pixbuf.get_width() avatar_h = avatar_pixbuf.get_height() half_scr_w = screen_w / 2 @@ -3097,56 +3170,24 @@ class ChatControl(ChatControlBase): avatar_w = half_scr_w if avatar_h > half_scr_h: avatar_h = half_scr_h - window = gtk.Window(gtk.WINDOW_POPUP) - self.bigger_avatar_window = window - pixmap, mask = avatar_pixbuf.render_pixmap_and_mask() - window.set_size_request(avatar_w, avatar_h) # we should make the cursor visible # gtk+ doesn't make use of the motion notify on gtkwindow by default # so this line adds that - window.set_events(gtk.gdk.POINTER_MOTION_MASK) - window.set_app_paintable(True) - 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) + alloc = small_avatar.get_allocation() # 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) + small_avatar_x, small_avatar_y = alloc.x, alloc.y + translated_coordinates = small_avatar.translate_coordinates( + gajim.interface.roster.window, 0, 0) + if translated_coordinates: + small_avatar_x, small_avatar_y = translated_coordinates + roster_x, roster_y = self.parent_win.window.get_window().get_origin()[1:] + center_x = roster_x + small_avatar_x + (alloc.width / 2) + center_y = roster_y + small_avatar_y + (alloc.height / 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() - window.window.set_cursor(invisible_cursor) - - # we should hide the window - window.connect('leave_notify_event', - self._on_window_avatar_leave_notify_event) - window.connect('motion-notify-event', - self._on_window_motion_notify_event) - - window.show_all() - def _on_window_avatar_leave_notify_event(self, widget, event): - """ - Just left the popup window that holds avatar - """ - self.bigger_avatar_window.destroy() - self.bigger_avatar_window = None - # Re-show the small avatar - self.show_avatar() - - def _on_window_motion_notify_event(self, widget, event): - """ - Just moved the mouse so show the cursor - """ - cursor = gtk.gdk.Cursor(gtk.gdk.LEFT_PTR) - self.bigger_avatar_window.window.set_cursor(cursor) + dialogs.BigAvatarWindow(avatar_pixbuf, pos_x, pos_y, avatar_w, + avatar_h, self.show_avatar) def _on_send_file_menuitem_activate(self, widget): self._on_send_file() @@ -3290,7 +3331,7 @@ class ChatControl(ChatControlBase): self.info_bar.show_all() def _add_info_bar_message(self, markup, buttons, args, - type_=gtk.MESSAGE_INFO): + type_=Gtk.MessageType.INFO): self.info_bar_queue.append((markup, buttons, args, type_)) self._info_bar_show_message() @@ -3323,12 +3364,12 @@ class ChatControl(ChatControlBase): markup += ' (%s)' % file_props.desc markup += '\n%s: %s' % (_('Size'), helpers.convert_bytes( file_props.size)) - b1 = gtk.Button(_('_Accept')) + b1 = Gtk.Button(_('_Accept')) b1.connect('clicked', self._on_accept_file_request, file_props) - b2 = gtk.Button(stock=gtk.STOCK_CANCEL) + b2 = Gtk.Button(stock=Gtk.STOCK_CANCEL) b2.connect('clicked', self._on_cancel_file_request, file_props) self._add_info_bar_message(markup, [b1, b2], file_props, - gtk.MESSAGE_QUESTION) + Gtk.MessageType.QUESTION) def _on_open_ft_folder(self, widget, file_props): path = os.path.split(file_props.file_name)[0] @@ -3348,17 +3389,17 @@ class ChatControl(ChatControlBase): file_props.name) if file_props.desc: markup += ' (%s)' % file_props.desc - b1 = gtk.Button(_('_Open Containing Folder')) + b1 = Gtk.Button(_('_Open Containing Folder')) b1.connect('clicked', self._on_open_ft_folder, file_props) - b2 = gtk.Button(stock=gtk.STOCK_OK) + b2 = Gtk.Button(stock=Gtk.STOCK_OK) b2.connect('clicked', self._on_ok, file_props, 'file-completed') self._add_info_bar_message(markup, [b1, b2], file_props) def _got_file_error(self, file_props, type_, pri_txt, sec_txt): markup = '<b>%s:</b> %s' % (pri_txt, sec_txt) - b = gtk.Button(stock=gtk.STOCK_OK) + b = Gtk.Button(stock=Gtk.STOCK_OK) b.connect('clicked', self._on_ok, file_props, type_) - self._add_info_bar_message(markup, [b], file_props, gtk.MESSAGE_ERROR) + self._add_info_bar_message(markup, [b], file_props, Gtk.MessageType.ERROR) def _on_accept_gc_invitation(self, widget, event): room_jid = event.parameters[0] @@ -3383,12 +3424,12 @@ class ChatControl(ChatControlBase): markup = '<b>%s:</b> %s' % (_('Groupchat Invitation'), room_jid) if comment: markup += ' (%s)' % comment - b1 = gtk.Button(_('_Join')) + b1 = Gtk.Button(_('_Join')) b1.connect('clicked', self._on_accept_gc_invitation, event) - b2 = gtk.Button(stock=gtk.STOCK_CANCEL) + b2 = Gtk.Button(stock=Gtk.STOCK_CANCEL) b2.connect('clicked', self._on_cancel_gc_invitation, event) self._add_info_bar_message(markup, [b1, b2], event.parameters, - gtk.MESSAGE_QUESTION) + Gtk.MessageType.QUESTION) def on_event_added(self, event): if event.account != self.account: @@ -3401,9 +3442,9 @@ class ChatControl(ChatControlBase): self._got_file_completed(event.parameters) elif event.type_ in ('file-error', 'file-stopped'): msg_err = '' - if event.parameters['error'] == -1: + if event.parameters.error == -1: msg_err = _('Remote contact stopped transfer') - elif event.parameters['error'] == -6: + elif event.parameters.error == -6: msg_err = _('Error opening file') self._got_file_error(event.parameters, event.type_, _('File transfer stopped'), msg_err) @@ -3444,6 +3485,6 @@ class ChatControl(ChatControlBase): self.info_bar.set_no_show_all(True) self.info_bar.hide() # show next one? - gobject.idle_add(self._info_bar_show_message) + GLib.idle_add(self._info_bar_show_message) break i += 1 diff --git a/src/command_system/dispatcher.py b/src/command_system/dispatcher.py index cc9f0ea7a6638405dfc8ad81844e4f4e7a956a55..488dfa341b151560ad7fb74bed24a7251cc10b81 100644 --- a/src/command_system/dispatcher.py +++ b/src/command_system/dispatcher.py @@ -31,8 +31,7 @@ to automatic discovery and dispatching, also features manual control over the process. """ -from types import NoneType -from tools import remove +from .tools import remove COMMANDS = {} CONTAINERS = {} @@ -67,11 +66,13 @@ def traverse_commands(container): yield attribute def is_command(attribute): - from framework import Command + from .framework import Command return isinstance(attribute, Command) def is_root(namespace): - metaclass = namespace.get("__metaclass__", NoneType) + metaclass = namespace.get("__metaclass__", None) + if not metaclass: + return False return issubclass(metaclass, Dispatchable) def get_command(host, name): @@ -83,7 +84,7 @@ def get_command(host, name): def list_commands(host): for container in CONTAINERS[host]: commands = COMMANDS[container] - for name, command in commands.iteritems(): + for name, command in commands.items(): yield name, command class Dispatchable(type): diff --git a/src/command_system/framework.py b/src/command_system/framework.py index 9c2dd4cb0589656ccad9f469c0e9d664672f97da..ca24695228d1c78bc1462388b3a78219f38ddf3b 100644 --- a/src/command_system/framework.py +++ b/src/command_system/framework.py @@ -23,12 +23,12 @@ import re from types import FunctionType from inspect import getargspec, getdoc -from dispatcher import Host, Container -from dispatcher import get_command, list_commands -from mapping import parse_arguments, adapt_arguments -from errors import DefinitionError, CommandError, NoCommandError +from .dispatcher import Host, Container +from .dispatcher import get_command, list_commands +from .mapping import parse_arguments, adapt_arguments +from .errors import DefinitionError, CommandError, NoCommandError -class CommandHost(object): +class CommandHost(metaclass=Host): """ Command host is a hub between numerous command processors and command containers. Aimed to participate in a dispatching process in @@ -40,7 +40,7 @@ class CommandHost(object): """ __metaclass__ = Host -class CommandContainer(object): +class CommandContainer(metaclass=Container): """ Command container is an entity which holds defined commands, allowing them to be dispatched and proccessed correctly. Each @@ -143,7 +143,7 @@ class CommandProcessor(object): def list_commands(self): commands = list_commands(self.COMMAND_HOST) commands = dict(commands) - return sorted(set(commands.itervalues())) + return sorted(list(commands.values()), key=lambda k: k.__repr__()) class Command(object): @@ -153,7 +153,7 @@ class Command(object): # Automatically set all the properties passed to a constructor # by the command decorator. - for key, value in properties.iteritems(): + for key, value in properties.items(): setattr(self, key, value) def __call__(self, *args, **kwargs): @@ -165,7 +165,7 @@ class Command(object): # command or name attributes set. They will be set to a # corresponding values right here in case if they was not set by # the one who raised an exception. - except CommandError, error: + except CommandError as error: if not error.command and not error.name: raise CommandError(error.message, self) raise @@ -181,7 +181,11 @@ class Command(object): return "<Command %s>" % ', '.join(self.names) def __cmp__(self, other): - return cmp(self.first_name, other.first_name) + if self.first_name > other.first_name: + return 1 + if self.first_name < other.first_name: + return -1 + return 0 @property def first_name(self): diff --git a/src/command_system/implementation/custom.py b/src/command_system/implementation/custom.py index cc33ae39c403570399764bff8e6a603341bcbc58..95198fc522495c549d6f4702f140b3eed55ea84c 100644 --- a/src/command_system/implementation/custom.py +++ b/src/command_system/implementation/custom.py @@ -35,7 +35,7 @@ detected. """ from ..framework import CommandContainer, command, doc -from hosts import * +from .hosts import * class CustomCommonCommands(CommandContainer): """ diff --git a/src/command_system/implementation/execute.py b/src/command_system/implementation/execute.py index e81957d419c389190f10a99b0b1da6bf5602fd96..ab14f4ea165b0383f955fd9cb477d0dfdcdf2f9e 100644 --- a/src/command_system/implementation/execute.py +++ b/src/command_system/implementation/execute.py @@ -35,10 +35,10 @@ commands as a frontend. from subprocess import Popen, PIPE from os.path import expanduser -from glib import timeout_add +from gi.repository import GLib from ..framework import CommandContainer, command, doc -from hosts import * +from .hosts import * class Execute(CommandContainer): AUTOMATIC = True @@ -64,11 +64,11 @@ class Execute(CommandContainer): @classmethod def monitor(cls, processor, popen): poller = cls.poller(processor, popen) - timeout_add(cls.POLL_INTERVAL, poller.next) + GLib.timeout_add(cls.POLL_INTERVAL, next, poller) @classmethod def poller(cls, processor, popen): - for x in xrange(cls.POLL_COUNT): + for x in list(range(cls.POLL_COUNT)): yield cls.brush(processor, popen) cls.overdue(processor, popen) yield False @@ -101,7 +101,7 @@ class Execute(CommandContainer): @staticmethod def clean(text): strip = chr(10) + chr(32) - return text.strip(strip) + return text.decode().strip(strip) class Show(Execute): @@ -115,6 +115,6 @@ class Show(Execute): stdout, stderr = cls.fetch(popen) success = popen.returncode == 0 if success and stdout: - processor.send(stdout.decode('utf8')) + processor.send(stdout) elif not success and stderr: processor.echo_error(stderr) diff --git a/src/command_system/implementation/middleware.py b/src/command_system/implementation/middleware.py index 7c517ea51741daa54f1777d80f03593b4eedc0de..40e4bdf4e13f90a4ff5b517cd213bab5a4b9a393 100644 --- a/src/command_system/implementation/middleware.py +++ b/src/command_system/implementation/middleware.py @@ -31,10 +31,9 @@ support interaction between the two and a few utility methods so you don't need to dig up the code itself to write basic commands. """ -from types import StringTypes from traceback import print_exc -from pango import FontDescription +from gi.repository import Pango from common import gajim from ..framework import CommandProcessor @@ -62,13 +61,13 @@ class ChatCommandProcessor(CommandProcessor): try: parents = super(ChatCommandProcessor, self) parents.execute_command(name, arguments) - except NoCommandError, error: + except NoCommandError as error: details = dict(name=error.name, message=error.message) message = "%(name)s: %(message)s\n" % details message += "Try using the //%(name)s or /say /%(name)s " % details message += "construct if you intended to send it as a text." self.echo_error(message) - except CommandError, error: + except CommandError as error: self.echo_error("%s: %s" % (error.name, error.message)) except Exception: self.echo_error(_("Error during command execution!")) @@ -98,7 +97,7 @@ class ChatCommandProcessor(CommandProcessor): def command_postprocessor(self, command, name, arguments, args, kwargs, value): # If command returns a string - print it to a user. A convenient # and sufficient in most simple cases shortcut to a using echo. - if value and isinstance(value, StringTypes): + if value and isinstance(value, str): self.echo(value) class CommandTools: @@ -117,7 +116,7 @@ class CommandTools: name = gconf("/desktop/gnome/interface/monospace_font_name") name = name if name else "Monospace" - font = FontDescription(name) + font = Pango.FontDescription(name) command_ok_tag = buffer.create_tag("command_ok") command_ok_tag.set_property("font-desc", font) diff --git a/src/command_system/implementation/standard.py b/src/command_system/implementation/standard.py index 3994eae5903e786070fc60b3d9c6799a0c28c7bc..285d25d8243ed9e7cf328b59478879a666953daa 100644 --- a/src/command_system/implementation/standard.py +++ b/src/command_system/implementation/standard.py @@ -30,8 +30,8 @@ from ..errors import CommandError from ..framework import CommandContainer, command, doc from ..mapping import generate_usage -from hosts import * -import execute +from .hosts import * +from . import execute # This holds constants fron the logger, which we'll be using in some of our # commands. @@ -136,7 +136,7 @@ class StandardCommonCommands(CommandContainer): def status(self, status, message): if status not in ('online', 'away', 'chat', 'xa', 'dnd'): raise CommandError("Invalid status given") - for connection in gajim.connections.itervalues(): + for connection in gajim.connections.values(): if not gajim.config.get_per('accounts', connection.name, 'sync_with_global_status'): continue @@ -150,7 +150,7 @@ class StandardCommonCommands(CommandContainer): if not message: message = _("Away") - for connection in gajim.connections.itervalues(): + for connection in gajim.connections.values(): if not gajim.config.get_per('accounts', connection.name, 'sync_with_global_status'): continue @@ -164,7 +164,7 @@ class StandardCommonCommands(CommandContainer): if not message: message = _("Available") - for connection in gajim.connections.itervalues(): + for connection in gajim.connections.values(): if not gajim.config.get_per('accounts', connection.name, 'sync_with_global_status'): continue diff --git a/src/command_system/mapping.py b/src/command_system/mapping.py index 3ba68ff4c0d5e6ec8db439650f8ba568c29cefd8..7e224907a4328b4a3f3a086a1e3e1b53f57f21e0 100644 --- a/src/command_system/mapping.py +++ b/src/command_system/mapping.py @@ -23,10 +23,9 @@ according to the command properties. """ import re -from types import BooleanType, UnicodeType from operator import itemgetter -from errors import DefinitionError, CommandError +from .errors import DefinitionError, CommandError # Quite complex piece of regular expression logic to parse options and # arguments. Might need some tweaking along the way. @@ -62,7 +61,7 @@ def parse_arguments(arguments): """ args, opts = [], [] - def intersects_opts((given_start, given_end)): + def intersects_opts(given_start, given_end): """ Check if given span intersects with any of options. """ @@ -71,7 +70,7 @@ def parse_arguments(arguments): return True return False - def intersects_args((given_start, given_end)): + def intersects_args(given_start, given_end): """ Check if given span intersects with any of arguments. """ @@ -97,14 +96,14 @@ def parse_arguments(arguments): # conflicted sectors. Remove any arguments that intersect with # options. for arg, position in args[:]: - if intersects_opts(position): + if intersects_opts(*position): args.remove((arg, position)) # Primitive but sufficiently effective way of disposing of # conflicted sectors. Remove any options that intersect with # arguments. for key, value, position in opts[:]: - if intersects_args(position): + if intersects_args(*position): opts.remove((key, value, position)) return args, opts @@ -207,7 +206,7 @@ def adapt_arguments(command, arguments, args, opts): # corresponding optin has been given. if command.expand: expanded = [] - for spec_key, spec_value in norm_kwargs.iteritems(): + for spec_key, spec_value in norm_kwargs.items(): letter = spec_key[0] if len(spec_key) > 1 else None if letter and letter not in expanded: for index, (key, value, position) in enumerate(opts): @@ -219,7 +218,7 @@ def adapt_arguments(command, arguments, args, opts): # Detect switches and set their values accordingly. If any of them # carries a value - append it to args. for index, (key, value, position) in enumerate(opts): - if isinstance(norm_kwargs.get(key), BooleanType): + if isinstance(norm_kwargs.get(key), bool): opts[index] = (key, True, position) if value: args.append((value, position)) @@ -231,8 +230,8 @@ def adapt_arguments(command, arguments, args, opts): # Stripping down position information supplied with arguments and # options as it won't be needed again. - args = map(lambda (arg, position): arg, args) - opts = map(lambda (key, value, position): (key, value), opts) + args = list(map(lambda t: t[0], args)) + opts = list(map(lambda t: (t[0], t[1]), opts)) # If command has extra option enabled - collect all extra arguments # and pass them to a last positional argument command defines as a @@ -265,16 +264,10 @@ def adapt_arguments(command, arguments, args, opts): # Normally this does not happen unless overlapping is enabled. for key, value in opts: initial = norm_kwargs.get(key) - if isinstance(initial, BooleanType): - if not isinstance(value, BooleanType): + if isinstance(initial, bool): + if not isinstance(value, bool): raise CommandError("%s: Switch can not take an argument" % key, command) - # We need to encode every keyword argument to a simple string, not - # the unicode one, because ** expansion does not support it. - for index, (key, value) in enumerate(opts): - if isinstance(key, UnicodeType): - opts[index] = (key.encode(KEY_ENCODING), value) - # Inject the source arguments as a string as a first argument, if # command has enabled the corresponding option. if command.source: @@ -305,7 +298,7 @@ def generate_usage(command, complete=True): letter = key[0] key = key.replace('_', '-') - if isinstance(value, BooleanType): + if isinstance(value, bool): value = str() else: value = '=%s' % value diff --git a/src/command_system/tools.py b/src/command_system/tools.py index a5030792c4bf0faaf8d922b9c2fc24612a238514..e67720dede228a8d9d218d503bb3a65a80bc9e31 100644 --- a/src/command_system/tools.py +++ b/src/command_system/tools.py @@ -25,20 +25,19 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. from types import * -from glib import GError def remove(sequence, target): - if isinstance(sequence, ListType): + if isinstance(sequence, list): if target in sequence: sequence.remove(target) - elif isinstance(sequence, DictType): + elif isinstance(sequence, dict): if target in sequence: del sequence[target] def gconf(path): try: - from gconf import client_get_default - client = client_get_default() + from gi.repository import GConf + client = GConf.Client.get_default() return client.get_string(path) - except ImportError, GError: - pass \ No newline at end of file + except ImportError: + pass diff --git a/src/common/atom.py b/src/common/atom.py index 71c2a967b5959e7b9516385f8ce2f10b6162e4f7..3cc67f38594ccc2888f7d7e6a01561980cf85d24 100644 --- a/src/common/atom.py +++ b/src/common/atom.py @@ -100,13 +100,13 @@ class OldEntry(nbxmpp.Node, object): if main_feed is not None and source_feed is not None: - return u'%s: %s' % (main_feed, source_feed) + return '%s: %s' % (main_feed, source_feed) elif main_feed is not None: return main_feed elif source_feed is not None: return source_feed else: - return u'' + return '' feed_title = property(get_feed_title, None, None, ''' Title of feed. It is built from entry''s original feed title and title of feed @@ -173,4 +173,4 @@ class OldEntry(nbxmpp.Node, object): updated = property(get_updated, None, None, ''' Last significant modification time. ''') - feed_tagline = u'' + feed_tagline = '' diff --git a/src/common/caps_cache.py b/src/common/caps_cache.py index 21960be5e50730e7549068fd204b4248ce04c60d..2421cabf8828d17ecbbd9b99def0ca81716236ff 100644 --- a/src/common/caps_cache.py +++ b/src/common/caps_cache.py @@ -130,7 +130,8 @@ def compute_caps_hash(identities, features, dataforms=[], hash_method='sha-1'): return 1 S = '' - identities.sort(cmp=sort_identities_func) + from functools import cmp_to_key + identities.sort(key=cmp_to_key(sort_identities_func)) for i in identities: c = i['category'] type_ = i.get('type', '') @@ -140,7 +141,7 @@ def compute_caps_hash(identities, features, dataforms=[], hash_method='sha-1'): features.sort() for f in features: S += '%s<' % f - dataforms.sort(cmp=sort_dataforms_func) + dataforms.sort(key=cmp_to_key(sort_dataforms_func)) for dataform in dataforms: # fields indexed by var fields = {} @@ -157,12 +158,12 @@ def compute_caps_hash(identities, features, dataforms=[], hash_method='sha-1'): S += '%s<' % value if hash_method == 'sha-1': - hash_ = hashlib.sha1(S) + hash_ = hashlib.sha1(S.encode('utf-8')) elif hash_method == 'md5': - hash_ = hashlib.md5(S) + hash_ = hashlib.md5(S.encode('utf-8')) else: return '' - return base64.b64encode(hash_.digest()) + return base64.b64encode(hash_.digest()).decode('utf-8') ################################################################################ diff --git a/src/common/check_X509.py b/src/common/check_X509.py index d0e8fbfcfa65cfbeb5f16574b65ef4a78ea9aa9f..14ace64b08eb9c7045ba3fb7770043f134fb5ed7 100644 --- a/src/common/check_X509.py +++ b/src/common/check_X509.py @@ -173,7 +173,7 @@ try: return True return False except ImportError: - log.warn('Import of PyOpenSSL or pyasn1 failed. Cannot correctly check ' + log.warning('Import of PyOpenSSL or pyasn1 failed. Cannot correctly check ' 'SSL certificate') def check_certificate(cert, domain): diff --git a/src/common/check_paths.py b/src/common/check_paths.py index 02a52e9ae67da84e5958dab5e9f42ce2fb34e5f3..393eecc756fa6a4e6591e63a23b11d0c7040c196 100644 --- a/src/common/check_paths.py +++ b/src/common/check_paths.py @@ -29,16 +29,16 @@ import sys import stat from common import gajim -import logger +from common import logger from common import jingle_xtls # DO NOT MOVE ABOVE OF import gajim import sqlite3 as sqlite def create_log_db(): - print _('creating logs database') + print(_('creating logs database')) con = sqlite.connect(logger.LOG_DB_PATH) - os.chmod(logger.LOG_DB_PATH, 0600) # rw only for us + os.chmod(logger.LOG_DB_PATH, 0o600) # rw only for us cur = con.cursor() # create the tables # kind can be @@ -84,9 +84,9 @@ def create_log_db(): con.close() def create_cache_db(): - print _('creating cache database') + print(_('creating cache database')) con = sqlite.connect(logger.CACHE_DB_PATH) - os.chmod(logger.CACHE_DB_PATH, 0600) # rw only for us + os.chmod(logger.CACHE_DB_PATH, 0o600) # rw only for us cur = con.cursor() cur.executescript( ''' @@ -128,16 +128,16 @@ def create_cache_db(): con.close() def split_db(): - print 'spliting database' + print('spliting database') if os.name == 'nt': try: import configpaths OLD_LOG_DB_FOLDER = os.path.join(configpaths.fse( - os.environ[u'appdata']), u'Gajim') + os.environ['appdata']), 'Gajim') except KeyError: - OLD_LOG_DB_FOLDER = u'.' + OLD_LOG_DB_FOLDER = '.' else: - OLD_LOG_DB_FOLDER = os.path.expanduser(u'~/.gajim') + OLD_LOG_DB_FOLDER = os.path.expanduser('~/.gajim') tmp = logger.CACHE_DB_PATH logger.CACHE_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, 'cache.db') @@ -148,7 +148,7 @@ def split_db(): os.chdir(back) cur = con.cursor() cur.execute('''SELECT name FROM sqlite_master WHERE type = 'table';''') - tables = cur.fetchall() # we get [(u'jids',), (u'unread_messages',), ... + tables = cur.fetchall() # we get [('jids',), ('unread_messages',), ... tables = [t[0] for t in tables] cur.execute("ATTACH DATABASE '%s' AS cache" % logger.CACHE_DB_PATH) for table in ('caps_cache', 'rooms_last_message_time', 'roster_entry', @@ -161,9 +161,9 @@ def split_db(): con.commit() cur.executescript('DROP TABLE %s;' % table) con.commit() - except sqlite.OperationalError, e: - print >> sys.stderr, 'error moving table %s to cache.db: %s' % \ - (table, str(e)) + except sqlite.OperationalError as e: + print('error moving table %s to cache.db: %s' % (table, str(e)), + file=sys.stderr) con.close() logger.CACHE_DB_PATH = tmp @@ -177,7 +177,7 @@ def check_and_possibly_move_config(): vars['MY_ICONSETS_PATH'] = gajim.MY_ICONSETS_PATH vars['MY_MOOD_ICONSETS_PATH'] = gajim.MY_MOOD_ICONSETS_PATH vars['MY_ACTIVITY_ICONSETS_PATH'] = gajim.MY_ACTIVITY_ICONSETS_PATH - import configpaths + from common import configpaths MY_DATA = configpaths.gajimpaths['MY_DATA'] MY_CONFIG = configpaths.gajimpaths['MY_CONFIG'] MY_CACHE = configpaths.gajimpaths['MY_CACHE'] @@ -189,22 +189,22 @@ def check_and_possibly_move_config(): if os.name == 'nt': try: OLD_LOG_DB_FOLDER = os.path.join(configpaths.fse( - os.environ[u'appdata']), u'Gajim') + os.environ['appdata']), 'Gajim') except KeyError: - OLD_LOG_DB_FOLDER = u'.' + OLD_LOG_DB_FOLDER = '.' else: - OLD_LOG_DB_FOLDER = os.path.expanduser(u'~/.gajim') + OLD_LOG_DB_FOLDER = os.path.expanduser('~/.gajim') if not os.path.exists(OLD_LOG_DB_FOLDER): return - OLD_LOG_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, u'logs.db') - OLD_CACHE_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, u'cache.db') - vars['OLD_VCARD_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'vcards') - vars['OLD_AVATAR_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'avatars') - vars['OLD_MY_EMOTS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'emoticons') - vars['OLD_MY_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'iconsets') - vars['OLD_MY_MOOD_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, u'moods') + OLD_LOG_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, 'logs.db') + OLD_CACHE_DB_PATH = os.path.join(OLD_LOG_DB_FOLDER, 'cache.db') + vars['OLD_VCARD_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'vcards') + vars['OLD_AVATAR_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'avatars') + vars['OLD_MY_EMOTS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'emoticons') + vars['OLD_MY_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'iconsets') + vars['OLD_MY_MOOD_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, 'moods') vars['OLD_MY_ACTIVITY_ICONSETS_PATH'] = os.path.join(OLD_LOG_DB_FOLDER, - u'activities') + 'activities') OLD_CONFIG_FILES = [] OLD_DATA_FILES = [] for f in os.listdir(OLD_LOG_DB_FOLDER): @@ -249,7 +249,7 @@ def check_and_possibly_move_config(): continue if not os.path.exists(src): continue - print 'moving %s to %s' % (src, dst) + print(_('moving %s to %s') % (src, dst)) shutil.move(src, dst) gajim.logger.init_vars() gajim.logger.attach_cache_database() @@ -263,7 +263,7 @@ def check_and_possibly_create_paths(): VCARD_PATH = gajim.VCARD_PATH AVATAR_PATH = gajim.AVATAR_PATH - import configpaths + from common import configpaths MY_DATA = configpaths.gajimpaths['MY_DATA'] MY_CONFIG = configpaths.gajimpaths['MY_CONFIG'] MY_CACHE = configpaths.gajimpaths['MY_CACHE'] @@ -275,57 +275,57 @@ def check_and_possibly_create_paths(): if not os.path.exists(MY_DATA): create_path(MY_DATA) elif os.path.isfile(MY_DATA): - print _('%s is a file but it should be a directory') % MY_DATA - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % MY_DATA) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(MY_CONFIG): create_path(MY_CONFIG) elif os.path.isfile(MY_CONFIG): - print _('%s is a file but it should be a directory') % MY_CONFIG - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % MY_CONFIG) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(MY_CACHE): create_path(MY_CACHE) elif os.path.isfile(MY_CACHE): - print _('%s is a file but it should be a directory') % MY_CACHE - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % MY_CACHE) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(VCARD_PATH): create_path(VCARD_PATH) elif os.path.isfile(VCARD_PATH): - print _('%s is a file but it should be a directory') % VCARD_PATH - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % VCARD_PATH) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(AVATAR_PATH): create_path(AVATAR_PATH) elif os.path.isfile(AVATAR_PATH): - print _('%s is a file but it should be a directory') % AVATAR_PATH - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % AVATAR_PATH) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(LOG_DB_FOLDER): create_path(LOG_DB_FOLDER) elif os.path.isfile(LOG_DB_FOLDER): - print _('%s is a file but it should be a directory') % LOG_DB_FOLDER - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % LOG_DB_FOLDER) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(PLUGINS_CONFIG_PATH): create_path(PLUGINS_CONFIG_PATH) elif os.path.isfile(PLUGINS_CONFIG_PATH): - print _('%s is a file but it should be a directory') % PLUGINS_CONFIG_PATH - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % PLUGINS_CONFIG_PATH) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(CACHE_DB_FOLDER): create_path(CACHE_DB_FOLDER) elif os.path.isfile(CACHE_DB_FOLDER): - print _('%s is a file but it should be a directory') % CACHE_DB_FOLDER - print _('Gajim will now exit') + print(_('%s is a file but it should be a directory') % CACHE_DB_FOLDER) + print(_('Gajim will now exit')) sys.exit() check_and_possibly_move_config() @@ -334,18 +334,18 @@ def check_and_possibly_create_paths(): create_log_db() gajim.logger.init_vars() elif os.path.isdir(LOG_DB_PATH): - print _('%s is a directory but should be a file') % LOG_DB_PATH - print _('Gajim will now exit') + print(_('%s is a directory but should be a file') % LOG_DB_PATH) + print(_('Gajim will now exit')) sys.exit() if not os.path.exists(CACHE_DB_PATH): create_cache_db() gajim.logger.attach_cache_database() elif os.path.isdir(CACHE_DB_PATH): - print _('%s is a directory but should be a file') % CACHE_DB_PATH - print _('Gajim will now exit') + print(_('%s is a directory but should be a file') % CACHE_DB_PATH) + print(_('Gajim will now exit')) sys.exit() - + if not os.path.exists(XTLS_CERTS): create_path(XTLS_CERTS) if not os.path.exists(LOCAL_XTLS_CERTS): @@ -363,5 +363,5 @@ def create_path(directory): create_path(head) if os.path.exists(directory): return - print _('creating %s directory') % directory - os.mkdir(directory, 0700) + print(('creating %s directory') % directory) + os.mkdir(directory, 0o700) diff --git a/src/common/commands.py b/src/common/commands.py index 2954b9297a853aee0b711b015600cc0889186b67..f6072b2153d7b0bc3235c3c727fe4d8fd6d6cf3d 100644 --- a/src/common/commands.py +++ b/src/common/commands.py @@ -23,9 +23,9 @@ ## import nbxmpp -import helpers -import dataforms -import gajim +from common import helpers +from common import dataforms +from common import gajim from common.connection_handlers_events import MessageOutgoingEvent import logging @@ -105,12 +105,12 @@ class ChangeStatusCommand(AdHocCommand): var = 'presence-type', label = 'Type of presence:', options = [ - (u'chat', _('Free for chat')), - (u'online', _('Online')), - (u'away', _('Away')), - (u'xa', _('Extended away')), - (u'dnd', _('Do not disturb')), - (u'offline', _('Offline - disconnect'))], + ('chat', _('Free for chat')), + ('online', _('Online')), + ('away', _('Away')), + ('xa', _('Extended away')), + ('dnd', _('Do not disturb')), + ('offline', _('Offline - disconnect'))], value = 'online', required = True), dataforms.Field('text-multi', @@ -147,7 +147,7 @@ class ChangeStatusCommand(AdHocCommand): try: presencedesc = form['presence-desc'].value except Exception: # same exceptions as in last comment - presencedesc = u'' + presencedesc = '' response, cmd = self.buildResponse(request, status = 'completed') cmd.addChild('note', {}, _('The status has been changed.')) @@ -198,7 +198,7 @@ class LeaveGroupchatsCommand(AdHocCommand): options = [] account = self.connection.name for gc in find_current_groupchats(account): - options.append((u'%s' %(gc[0]), _('%(nickname)s on %(room_jid)s') % \ + options.append(('%s' %(gc[0]), _('%(nickname)s on %(room_jid)s') % \ {'nickname': gc[1], 'room_jid': gc[0]})) if not len(options): response, cmd = self.buildResponse(request, status = 'completed') @@ -369,11 +369,11 @@ class ConnectionCommands: # buildReply don't copy the node attribute. Re-add it q.setAttr('node', nbxmpp.NS_COMMANDS) - for node, cmd in self.__commands.iteritems(): + for node, cmd in self.__commands.items(): if cmd.isVisibleFor(self.isSameJID(jid)): q.addChild('item', { # TODO: find the jid - 'jid': self.getOurBareJID() + u'/' + self.server_resource, + 'jid': self.getOurBareJID() + '/' + self.server_resource, 'node': node, 'name': cmd.commandname}) @@ -387,7 +387,7 @@ class ConnectionCommands: try: jid = helpers.get_full_jid_from_iq(iq_obj) except helpers.InvalidFormat: - log.warn('Invalid JID: %s, ignoring it' % iq_obj.getFrom()) + log.warning('Invalid JID: %s, ignoring it' % iq_obj.getFrom()) return node = iq_obj.getTagAttr('query', 'node') diff --git a/src/common/config.py b/src/common/config.py index f3a6998d8f4ed1cebcbf4e8813a087b96178385b..7b905642f661c450d79adf0728dd39ad1e024085 100644 --- a/src/common/config.py +++ b/src/common/config.py @@ -35,8 +35,8 @@ import sys import re import copy -import defs -import gobject +from common import defs +from gi.repository import GLib ( OPT_TYPE, @@ -191,7 +191,7 @@ class Config: 'dictionary_url': [opt_str, 'WIKTIONARY', _("Either custom url with %s in it where %s is the word/phrase or 'WIKTIONARY' which means use wiktionary.")], 'always_english_wikipedia': [opt_bool, False], 'always_english_wiktionary': [opt_bool, True], - 'remote_control': [opt_bool, True, _('If checked, Gajim can be controlled remotely using gajim-remote.'), True], + 'remote_control': [opt_bool, False, _('If checked, Gajim can be controlled remotely using gajim-remote.'), True], 'networkmanager_support': [opt_bool, True, _('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.'), True], 'outgoing_chat_state_notifications': [opt_str, 'all', _('Sent chat state notifications. Can be one of all, composing_only, disabled.')], 'displayed_chat_state_notifications': [opt_str, 'all', _('Displayed chat state notifications in chat windows. Can be one of all, composing_only, disabled.')], @@ -217,7 +217,7 @@ class Config: 'tabs_always_visible': [opt_bool, False, _('Show tab when only one conversation?')], 'tabs_border': [opt_bool, False, _('Show tabbed notebook border in chat windows?')], 'tabs_close_button': [opt_bool, True, _('Show close button in tab?')], - 'esession_modp': [opt_str, '5,14', _('A list of modp groups to use in a Diffie-Hellman, highest preference first, separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher numbers are more secure, but take longer to calculate when you start a session.')], + 'esession_modp': [opt_str, '15,16,14', _('A list of modp groups to use in a Diffie-Hellman, highest preference first, separated by commas. Valid groups are 1, 2, 5, 14, 15, 16, 17 and 18. Higher numbers are more secure, but take longer to calculate when you start a session.')], 'chat_avatar_width': [opt_int, 52], 'chat_avatar_height': [opt_int, 52], 'roster_avatar_width': [opt_int, 32], @@ -349,7 +349,6 @@ class Config: 'enable_esessions': [opt_bool, True, _('Enable ESessions encryption for this account.')], 'autonegotiate_esessions': [opt_bool, True, _('Should Gajim automatically start an encrypted session when possible?')], 'connection_types': [ opt_str, 'tls ssl plain', _('Ordered list (space separated) of connection type to try. Can contain tls, ssl or plain')], - 'tls_version': [ opt_str, '1.0', '' ], 'cipher_list': [ opt_str, 'HIGH:!aNULL:RC4-SHA', '' ], 'action_when_plaintext_connection': [ opt_str, 'warn', _('Show a warning dialog before sending password on an plaintext connection. Can be \'warn\', \'connect\', \'disconnect\'') ], 'warn_when_insecure_ssl_connection': [ opt_bool, True, _('Show a warning dialog before using standard SSL library.') ], @@ -573,7 +572,7 @@ class Config: Tree-like interface """ if node is None: - for child, option in self.__options[1].iteritems(): + for child, option in self.__options[1].items(): yield (child, ), option for grandparent in self.__options_per_key: yield (grandparent, ), None @@ -584,7 +583,7 @@ class Config: elif len(node) == 2: grandparent, parent = node children = self.__options_per_key[grandparent][1][parent] - for child, option in children.iteritems(): + for child, option in children.items(): yield (grandparent, parent, child), option else: raise ValueError('Invalid node') @@ -630,11 +629,9 @@ class Config: def set(self, optname, value): if optname not in self.__options[1]: -# raise RuntimeError, 'option %s does not exist' % optname return value = self.is_valid(self.__options[0][optname][OPT_TYPE], value) if value is None: -# raise RuntimeError, 'value of %s cannot be None' % optname return self.__options[1][optname] = value @@ -642,7 +639,7 @@ class Config: def get(self, optname=None): if not optname: - return self.__options[1].keys() + return list(self.__options[1].keys()) if optname not in self.__options[1]: return None return self.__options[1][optname] @@ -671,7 +668,6 @@ class Config: def add_per(self, typename, name): # per_group_of_option if typename not in self.__options_per_key: -# raise RuntimeError, 'option %s does not exist' % typename return opt = self.__options_per_key[typename] @@ -685,7 +681,6 @@ class Config: def del_per(self, typename, name, subname = None): # per_group_of_option if typename not in self.__options_per_key: -# raise RuntimeError, 'option %s does not exist' % typename return opt = self.__options_per_key[typename] @@ -698,22 +693,18 @@ class Config: def set_per(self, optname, key, subname, value): # per_group_of_option if optname not in self.__options_per_key: -# raise RuntimeError, 'option %s does not exist' % optname return if not key: return dict_ = self.__options_per_key[optname][1] if key not in dict_: -# raise RuntimeError, '%s is not a key of %s' % (key, dict_) self.add_per(optname, key) obj = dict_[key] if subname not in obj: -# raise RuntimeError, '%s is not a key of %s' % (subname, obj) return typ = self.__options_per_key[optname][0][subname][OPT_TYPE] value = self.is_valid(typ, value) if value is None: -# raise RuntimeError, '%s of %s cannot be None' % optname return obj[subname] = value self._timeout_save() @@ -723,7 +714,7 @@ class Config: return None dict_ = self.__options_per_key[optname][1] if not key: - return dict_.keys() + return list(dict_.keys()) if key not in dict_: if subname in self.__options_per_key[optname][0]: return self.__options_per_key[optname][0][subname][1] @@ -812,7 +803,7 @@ class Config: def _timeout_save(self): if self.save_timeout_id: return - self.save_timeout_id = gobject.timeout_add(1000, self._really_save) + self.save_timeout_id = GLib.timeout_add(1000, self._really_save) def __init__(self): #init default values diff --git a/src/common/configpaths.py b/src/common/configpaths.py index 3c4e8f22586e5351b8798a8126716be945b79438..05b6bc225c8ba1ebd28314875376c2ab29d4133f 100644 --- a/src/common/configpaths.py +++ b/src/common/configpaths.py @@ -25,7 +25,7 @@ import os import sys import tempfile -import defs +from common import defs HAVE_XDG = True try: __import__(xdg) @@ -61,7 +61,7 @@ def fse(s): """ Convert from filesystem encoding if not already Unicode """ - return unicode(s, sys.getfilesystemencoding()) + return s def windowsify(s): if os.name == 'nt': @@ -82,10 +82,10 @@ class ConfigPaths: # variable 'appdata' is in? Assuming it to be in filesystem # encoding. self.config_root = self.cache_root = self.data_root = \ - os.path.join(fse(os.environ[u'appdata']), u'Gajim') + os.path.join(fse(os.environ['appdata']), 'Gajim') except KeyError: # win9x, in cwd - self.config_root = self.cache_root = self.data_root = u'.' + self.config_root = self.cache_root = self.data_root = '.' else: # Unices # Pass in an Unicode string, and hopefully get one back. if HAVE_XDG: @@ -93,23 +93,23 @@ class ConfigPaths: if not self.config_root: # Folder doesn't exist yet. self.config_root = os.path.join(xdg.BaseDirectory.\ - xdg_config_dirs[0], u'gajim') + xdg_config_dirs[0], 'gajim') self.cache_root = os.path.join(xdg.BaseDirectory.xdg_cache_home, - u'gajim') + 'gajim') self.data_root = xdg.BaseDirectory.save_data_path('gajim') if not self.data_root: self.data_root = os.path.join(xdg.BaseDirectory.\ - xdg_data_dirs[0], u'gajim') + xdg_data_dirs[0], 'gajim') else: expand = os.path.expanduser - base = os.getenv('XDG_CONFIG_HOME') or expand(u'~/.config') - self.config_root = os.path.join(base, u'gajim') - base = os.getenv('XDG_CACHE_HOME') or expand(u'~/.cache') - self.cache_root = os.path.join(base, u'gajim') - base = os.getenv('XDG_DATA_HOME') or expand(u'~/.local/share') - self.data_root = os.path.join(base, u'gajim') + base = os.getenv('XDG_CONFIG_HOME') or expand('~/.config') + self.config_root = os.path.join(base, 'gajim') + base = os.getenv('XDG_CACHE_HOME') or expand('~/.cache') + self.cache_root = os.path.join(base, 'gajim') + base = os.getenv('XDG_DATA_HOME') or expand('~/.local/share') + self.data_root = os.path.join(base, 'gajim') def add(self, name, type_, path): self.paths[name] = (type_, path) @@ -130,40 +130,41 @@ class ConfigPaths: except KeyError: return default - def iteritems(self): - for key in self.paths.iterkeys(): + def items(self): + for key in self.paths.keys(): yield (key, self[key]) def init(self, root=None): if root is not None: self.config_root = self.cache_root = self.data_root = root - d = {'MY_DATA': '', 'LOG_DB': u'logs.db', 'MY_CACERTS': u'cacerts.pem', - 'MY_EMOTS': u'emoticons', 'MY_ICONSETS': u'iconsets', - 'MY_MOOD_ICONSETS': u'moods', 'MY_ACTIVITY_ICONSETS': u'activities', - 'PLUGINS_USER': u'plugins', 'MY_PEER_CERTS': u'certs'} + d = {'MY_DATA': '', 'LOG_DB': 'logs.db', 'MY_CACERTS': 'cacerts.pem', + 'MY_EMOTS': 'emoticons', 'MY_ICONSETS': 'iconsets', + 'MY_MOOD_ICONSETS': 'moods', 'MY_ACTIVITY_ICONSETS': 'activities', + 'PLUGINS_USER': 'plugins', 'MY_PEER_CERTS': 'certs', + 'RNG_SEED': 'rng_seed'} for name in d: self.add(name, TYPE_DATA, windowsify(d[name])) - d = {'MY_CACHE': '', 'CACHE_DB': u'cache.db', 'VCARD': u'vcards', - 'AVATAR': u'avatars'} + d = {'MY_CACHE': '', 'CACHE_DB': 'cache.db', 'VCARD': 'vcards', + 'AVATAR': 'avatars'} for name in d: self.add(name, TYPE_CACHE, windowsify(d[name])) self.add('MY_CONFIG', TYPE_CONFIG, '') self.add('MY_CERT', TYPE_CONFIG, '') - basedir = fse(os.environ.get(u'GAJIM_BASEDIR', defs.basedir)) - self.add('DATA', None, os.path.join(basedir, windowsify(u'data'))) - self.add('ICONS', None, os.path.join(basedir, windowsify(u'icons'))) + basedir = fse(os.environ.get('GAJIM_BASEDIR', defs.basedir)) + self.add('DATA', None, os.path.join(basedir, windowsify('data'))) + self.add('ICONS', None, os.path.join(basedir, windowsify('icons'))) self.add('HOME', None, fse(os.path.expanduser('~'))) self.add('PLUGINS_BASE', None, os.path.join(basedir, - windowsify(u'plugins'))) + windowsify('plugins'))) try: self.add('TMP', None, fse(tempfile.gettempdir())) - except IOError, e: - print >> sys.stderr, 'Error opening tmp folder: %s\nUsing %s' % ( - str(e), os.path.expanduser('~')) + except IOError as e: + print('Error opening tmp folder: %s\nUsing %s' % (str(e), + os.path.expanduser('~')), file=sys.stderr) self.add('TMP', None, fse(os.path.expanduser('~'))) try: @@ -173,17 +174,17 @@ class ConfigPaths: pass def init_profile(self, profile=''): - conffile = windowsify(u'config') - pidfile = windowsify(u'gajim') - secretsfile = windowsify(u'secrets') - pluginsconfdir = windowsify(u'pluginsconfig') + conffile = windowsify('config') + pidfile = windowsify('gajim') + secretsfile = windowsify('secrets') + pluginsconfdir = windowsify('pluginsconfig') if len(profile) > 0: - conffile += u'.' + profile - pidfile += u'.' + profile - secretsfile += u'.' + profile - pluginsconfdir += u'.' + profile - pidfile += u'.pid' + conffile += '.' + profile + pidfile += '.' + profile + secretsfile += '.' + profile + pluginsconfdir += '.' + profile + pidfile += '.pid' self.add('CONFIG_FILE', TYPE_CONFIG, conffile) self.add('PID_FILE', TYPE_CACHE, pidfile) self.add('SECRETS_FILE', TYPE_DATA, secretsfile) diff --git a/src/common/connection.py b/src/common/connection.py index 3f27510e050909408472ad084854c517c6ab0178..96e8ae0857fc17abd6bef693577c9cd75ff9a26e 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -59,7 +59,7 @@ from common import gpg from common import passwords from common import exceptions from common import check_X509 -from connection_handlers import * +from common.connection_handlers import * if gajim.HAVE_PYOPENSSL: import OpenSSL.crypto @@ -312,8 +312,7 @@ class CommonConnection: else: def encrypt_thread(msg, keyID, always_trust=False): # encrypt message. This function returns (msgenc, error) - return self.gpg.encrypt(msg.encode('utf-8'), [keyID], - always_trust) + return self.gpg.encrypt(msg, [keyID], always_trust) def _on_encrypted(output): msgenc, error = output if error == 'NOT_TRUSTED': @@ -329,7 +328,7 @@ class CommonConnection: form_node, user_nick, keyID, attention, correction_msg, callback) gajim.nec.push_incoming_event(GPGTrustKeyEvent(None, - conn=self, callback=_on_always_trust)) + conn=self, keyID=keyID, callback=_on_always_trust)) else: self._message_encrypted_cb(output, type_, msg, msgtxt, original_message, fjid, resource, jid, xhtml, @@ -519,7 +518,7 @@ class CommonConnection: log_msg = '<body xmlns="%s">%s</body>' % ( nbxmpp.NS_XHTML, xhtml) gajim.logger.write(kind, jid, log_msg) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: self.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) except exceptions.DatabaseMalformed: @@ -680,10 +679,10 @@ class CommonConnection: if realm == '': if event == nbxmpp.transports_nb.DATA_RECEIVED: gajim.nec.push_incoming_event(StanzaReceivedEvent(None, - conn=self, stanza_str=unicode(data, errors='ignore'))) + conn=self, stanza_str=data)) elif event == nbxmpp.transports_nb.DATA_SENT: gajim.nec.push_incoming_event(StanzaSentEvent(None, conn=self, - stanza_str=unicode(data))) + stanza_str=data)) def change_status(self, show, msg, auto=False): if not msg: @@ -779,7 +778,7 @@ class Connection(CommonConnection, ConnectionHandlers): self.private_storage_supported = True self.privacy_rules_requested = False self.streamError = '' - self.secret_hmac = str(random.random())[2:] + self.secret_hmac = str(random.random())[2:].encode('utf-8') self.sm = Smacks(self) # Stream Management @@ -981,8 +980,8 @@ class Connection(CommonConnection, ConnectionHandlers): self.connection.SendAndCallForResponse(iq, _on_register_result) else: - if self.new_account_form.keys().sort() != \ - conf.keys().sort(): + if list(self.new_account_form.keys()).sort() != \ + list(conf.keys()).sort(): # requested config has changed since first connection reason = _('Server %s provided a different ' 'registration form') % data[0] @@ -1239,11 +1238,9 @@ class Connection(CommonConnection, ConnectionHandlers): if not os.path.exists(cacerts): cacerts = '' mycerts = common.gajim.MY_CACERTS - tls_version = gajim.config.get_per('accounts', self.name, - 'tls_version') cipher_list = gajim.config.get_per('accounts', self.name, 'cipher_list') - secure_tuple = (self._current_type, cacerts, mycerts, tls_version, cipher_list) + secure_tuple = (self._current_type, cacerts, mycerts, cipher_list) con = nbxmpp.NonBlockingClient( domain=self._hostname, @@ -1391,41 +1388,40 @@ class Connection(CommonConnection, ConnectionHandlers): cert = con.Connection.ssl_certificate if errnum > 0 and str(errnum) not in gajim.config.get_per('accounts', self.name, 'ignore_ssl_errors').split(): - text = _('The authenticity of the %s certificate could be invlid') \ - % hostname + text = _('The authenticity of the %s certificate could be invalid' + ) % hostname if errnum in ssl_error: text += _('\nSSL Error: <b>%s</b>') % ssl_error[errnum] else: text += _('\nUnknown SSL error: %d') % errnum - fingerprint = cert.digest('sha1') + fingerprint = cert.digest('sha1').decode('utf-8') pem = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, - cert) + cert).decode('utf-8') gajim.nec.push_incoming_event(SSLErrorEvent(None, conn=self, error_text=text, error_num=errnum, cert=pem, fingerprint=fingerprint, certificate=cert)) return True if cert: - fingerprint = cert.digest('sha1') + fingerprint = cert.digest('sha1').decode('utf-8') saved_fingerprint = gajim.config.get_per('accounts', self.name, 'ssl_fingerprint_sha1') if saved_fingerprint: # Check sha1 fingerprint if fingerprint != saved_fingerprint: gajim.nec.push_incoming_event(FingerprintErrorEvent(None, - conn=self, certificate=con.Connection.ssl_certificate, + conn=self, certificate=cert, new_fingerprint=fingerprint)) return True else: gajim.config.set_per('accounts', self.name, 'ssl_fingerprint_sha1', fingerprint) - if not check_X509.check_certificate(con.Connection.ssl_certificate, - hostname) and '100' not in gajim.config.get_per('accounts', - self.name, 'ignore_ssl_errors').split(): - fingerprint = cert.digest('sha1') + if not check_X509.check_certificate(cert, hostname) and \ + '100' not in gajim.config.get_per('accounts', self.name, + 'ignore_ssl_errors').split(): pem = OpenSSL.crypto.dump_certificate( - OpenSSL.crypto.FILETYPE_PEM, cert) + OpenSSL.crypto.FILETYPE_PEM, cert).decode('utf-8') txt = _('The authenticity of the %s certificate could be ' - 'invalid.\nThe certificate does not cover this domain.') % \ + 'invalid.\nThe certificate does not cover this domain.') %\ hostname gajim.nec.push_incoming_event(SSLErrorEvent(None, conn=self, error_text=txt, error_num=100, cert=pem, @@ -1523,7 +1519,7 @@ class Connection(CommonConnection, ConnectionHandlers): self.connection.send(' ') def _on_xmpp_ping_answer(self, iq_obj): - id_ = unicode(iq_obj.getAttr('id')) + id_ = iq_obj.getAttr('id') assert id_ == self.awaiting_xmpp_ping_id self.awaiting_xmpp_ping_id = None @@ -1772,9 +1768,9 @@ class Connection(CommonConnection, ConnectionHandlers): gajim.nec.push_incoming_event(OurShowEvent(None, conn=self, show=gajim.SHOW_LIST[self.connected])) gajim.nec.push_incoming_event(InformationEvent(None, conn=self, - level='error', pri_txt=_('Invisibility not supported', + level='error', pri_txt=_('Invisibility not supported'), sec_txt=_('Account %s doesn\'t support invisibility.') % \ - self.name))) + self.name)) return # If we are already connected, and privacy rules are supported, send # offline presence first as it's required by XEP-0126 @@ -1800,7 +1796,7 @@ class Connection(CommonConnection, ConnectionHandlers): self.activate_privacy_rule('invisible') self.connected = gajim.SHOW_LIST.index('invisible') self.status = msg - priority = unicode(gajim.get_priority(self.name, 'invisible')) + priority = gajim.get_priority(self.name, 'invisible') p = nbxmpp.Presence(priority=priority) p = self.add_sha(p, True) if msg: @@ -1981,7 +1977,7 @@ class Connection(CommonConnection, ConnectionHandlers): p.setStatus(msg) else: signed = self.get_signed_presence(msg) - priority = unicode(gajim.get_priority(self.name, sshow)) + priority = gajim.get_priority(self.name, sshow) p = nbxmpp.Presence(typ=None, priority=priority, show=sshow, to=jid) p = self.add_sha(p) if msg: @@ -2005,7 +2001,7 @@ class Connection(CommonConnection, ConnectionHandlers): def _update_status(self, show, msg): xmpp_show = helpers.get_xmpp_show(show) - priority = unicode(gajim.get_priority(self.name, xmpp_show)) + priority = gajim.get_priority(self.name, xmpp_show) p = nbxmpp.Presence(typ=None, priority=priority, show=xmpp_show) p = self.add_sha(p) if msg: @@ -2047,6 +2043,8 @@ class Connection(CommonConnection, ConnectionHandlers): return if isinstance(jid, list): for j in jid: + if session is None: + session = self.get_or_create_session(j, '') self.log_message(j, msg, forward_from, session, original_message, subject, type_, xhtml) else: @@ -2562,7 +2560,7 @@ class Connection(CommonConnection, ConnectionHandlers): p = nbxmpp.Presence(to='%s/%s' % (room_jid, nick), show=show, status=self.status) - h = hmac.new(self.secret_hmac, room_jid).hexdigest()[:6] + h = hmac.new(self.secret_hmac, room_jid.encode('utf-8')).hexdigest()[:6] id_ = self.connection.getAnID() id_ = 'gajim_muc_' + id_ + '_' + h p.setID(id_) @@ -2670,7 +2668,7 @@ class Connection(CommonConnection, ConnectionHandlers): xmpp_show = helpers.get_xmpp_show(show) p = nbxmpp.Presence(to='%s/%s' % (jid, nick), typ=ptype, show=xmpp_show, status=status) - h = hmac.new(self.secret_hmac, jid).hexdigest()[:6] + h = hmac.new(self.secret_hmac, jid.encode('utf-8')).hexdigest()[:6] id_ = self.connection.getAnID() id_ = 'gajim_muc_' + id_ + '_' + h p.setID(id_) @@ -2847,6 +2845,19 @@ class Connection(CommonConnection, ConnectionHandlers): """ Send invitation """ + contact = gajim.contacts.get_contact_from_full_jid(self.name, to) + if contact and contact.supports(nbxmpp.NS_CONFERENCE): + # send direct invite + message=nbxmpp.Message(to=to) + attrs = {'jid': room} + if reason: + attrs['reason'] = reason + if continue_tag: + attrs['continue'] = 'true' + c = message.addChild(name='x', attrs=attrs, + namespace=nbxmpp.NS_CONFERENCE) + self.connection.send(message) + return message=nbxmpp.Message(to=room) c = message.addChild(name='x', namespace=nbxmpp.NS_MUC_USER) c = c.addChild(name='invite', attrs={'to': to}) @@ -2889,7 +2900,7 @@ class Connection(CommonConnection, ConnectionHandlers): return if self.awaiting_xmpp_ping_id: # We haven't got the pong in time, disco and reconnect - log.warn("No reply received for keepalive ping. Reconnecting.") + log.warning("No reply received for keepalive ping. Reconnecting.") self._disconnectedReconnCB() def _reconnect_alarm(self): diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index efe943ca242370a5a4fe71dc983d23b9283cd53f..5e413df1736047f4fad261db4ca4ec98799e687f 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -33,17 +33,16 @@ import base64 import sys import operator import hashlib -import gobject -import locale +from gi.repository import GLib from time import (altzone, daylight, gmtime, localtime, mktime, strftime, time as time_time, timezone, tzname) from calendar import timegm import nbxmpp -import common.caps_cache as capscache +from common import caps_cache as capscache -from pep import LOCATION_DATA +from common.pep import LOCATION_DATA from common import helpers from common import gajim from common import exceptions @@ -188,8 +187,8 @@ class ConnectionDisco: if not self.connection or self.connected < 2: return frm = helpers.get_full_jid_from_iq(iq_obj) - to = unicode(iq_obj.getAttr('to')) - id_ = unicode(iq_obj.getAttr('id')) + to = iq_obj.getAttr('to') + id_ = iq_obj.getAttr('id') iq = nbxmpp.Iq(to=frm, typ='result', queryNS=nbxmpp.NS_DISCO, frm=to) iq.setAttr('id', id_) query = iq.setTag('query') @@ -242,7 +241,7 @@ class ConnectionDisco: if self.commandInfoQuery(con, iq_obj): raise nbxmpp.NodeProcessed - id_ = unicode(iq_obj.getAttr('id')) + id_ = iq_obj.getAttr('id') if id_[:6] == 'Gajim_': # We get this request from echo.server raise nbxmpp.NodeProcessed @@ -329,7 +328,7 @@ class ConnectionVcard: os.remove(path) # create folder if needed if not os.path.isdir(path): - os.mkdir(path, 0700) + os.mkdir(path, 0o700) puny_nick = helpers.sanitize_filename(nick) path_to_file = os.path.join(gajim.VCARD_PATH, puny_jid, puny_nick) else: @@ -338,7 +337,7 @@ class ConnectionVcard: fil = open(path_to_file, 'w') fil.write(str(card)) fil.close() - except IOError, e: + except IOError as e: gajim.nec.push_incoming_event(InformationEvent(None, conn=self, level='error', pri_txt=_('Disk Write Error'), sec_txt=str(e))) @@ -438,7 +437,7 @@ class ConnectionVcard: if 'PHOTO' in vcard and isinstance(vcard['PHOTO'], dict) and \ 'BINVAL' in vcard['PHOTO']: photo = vcard['PHOTO']['BINVAL'] - photo_decoded = base64.decodestring(photo) + photo_decoded = base64.b64decode(photo.encode('utf-8')) gajim.interface.save_avatar_files(our_jid, photo_decoded) avatar_sha = hashlib.sha1(photo_decoded).hexdigest() iq2.getTag('PHOTO').setTagData('SHA', avatar_sha) @@ -565,7 +564,7 @@ class ConnectionVcard: self.discover_ft_proxies() gajim.nec.push_incoming_event(RosterReceivedEvent(None, conn=self)) - gobject.timeout_add_seconds(10, self.discover_servers) + GLib.timeout_add_seconds(10, self.discover_servers) elif self.awaiting_answers[id_][0] == PRIVACY_ARRIVED: if iq_obj.getType() != 'error': self.privacy_rules_supported = True @@ -619,7 +618,7 @@ class ConnectionVcard: elif self.awaiting_answers[id_][0] == ARCHIVING_COLLECTIONS_ARRIVED: # TODO - print 'ARCHIVING_COLLECTIONS_ARRIVED' + print('ARCHIVING_COLLECTIONS_ARRIVED') elif self.awaiting_answers[id_][0] == ARCHIVING_COLLECTION_ARRIVED: def save_if_not_exists(with_, nick, direction, tim, payload): @@ -629,7 +628,7 @@ class ConnectionVcard: gajim.logger.save_if_not_exists(with_, direction, tim, msg=payload[0].getData(), nick=nick) elif payload[0].getName() == 'message': - print 'Not implemented' + print('Not implemented') chat = iq_obj.getTag('chat') if chat: with_ = chat.getAttr('with') @@ -710,7 +709,7 @@ class ConnectionVcard: 'BINVAL' in vcard['PHOTO']: photo = vcard['PHOTO']['BINVAL'] try: - photo_decoded = base64.decodestring(photo) + photo_decoded = base64.b64decode(photo.encode('utf-8')) avatar_sha = hashlib.sha1(photo_decoded).hexdigest() except Exception: avatar_sha = '' @@ -732,7 +731,7 @@ class ConnectionVcard: puny_nick = helpers.sanitize_filename(resource) # create folder if needed if not os.path.isdir(begin_path): - os.mkdir(begin_path, 0700) + os.mkdir(begin_path, 0o700) begin_path = os.path.join(begin_path, puny_nick) frm_jid += '/' + resource if photo_decoded: @@ -1139,7 +1138,7 @@ class ConnectionHandlersBase: gajim.config.should_log(self.name, obj.jid): try: gajim.logger.write('status', obj.jid, obj.status, obj.show) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: self.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) except exceptions.DatabaseMalformed: pritext = _('Database Error') @@ -1162,8 +1161,7 @@ class ConnectionHandlersBase: decmsg = self.gpg.decrypt(encmsg, keyID) decmsg = self.connection.Dispatcher.replace_non_character(decmsg) # \x00 chars are not allowed in C (so in GTK) - obj.msgtxt = decmsg.replace('\x00', '').encode( - locale.getpreferredencoding()).decode('utf-8') + obj.msgtxt = decmsg.replace('\x00', '') obj.encrypted = 'xep27' self.gpg_messages_to_decrypt.remove([encmsg, keyID, obj]) @@ -1211,7 +1209,7 @@ class ConnectionHandlersBase: gc_contact = gajim.contacts.get_gc_contact(self.name, obj.jid, nick) if obj.receipt_request_tag and gajim.config.get_per('accounts', self.name, 'answer_receipts') and ((contact and contact.sub \ - not in (u'to', u'none')) or gc_contact) and obj.mtype != 'error' and \ + not in ('to', 'none')) or gc_contact) and obj.mtype != 'error' and \ not obj.forwarded: receipt = nbxmpp.Message(to=obj.fjid, typ='chat') receipt.setID(obj.id_) @@ -1264,7 +1262,7 @@ class ConnectionHandlersBase: try: gajim.logger.write('error', frm, error_msg, tim=tim, subject=subject) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: self.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) except exceptions.DatabaseMalformed: pritext = _('Database Error') @@ -1290,7 +1288,7 @@ class ConnectionHandlersBase: jid = gajim.get_jid_without_resource(jid) try: - return self.sessions[jid].values() + return list(self.sessions[jid].values()) except KeyError: return [] @@ -1352,7 +1350,7 @@ class ConnectionHandlersBase: received a thread_id yet and returns the session that we last sent a message to """ - sessions = self.sessions[jid].values() + sessions = list(self.sessions[jid].values()) # sessions that we haven't received a thread ID in idless = [s for s in sessions if not s.received_thread_id] @@ -1384,7 +1382,7 @@ class ConnectionHandlersBase: Find an active session that doesn't have a control attached """ try: - sessions = self.sessions[jid].values() + sessions = list(self.sessions[jid].values()) # filter out everything except the default session type chat_sessions = [s for s in sessions if isinstance(s, @@ -1767,9 +1765,8 @@ ConnectionJingle, ConnectionIBBytestream): iq_obj = obj.stanza.buildReply('result') qp = iq_obj.setQuery() qp.setTagData('utc', strftime('%Y%m%dT%H:%M:%S', gmtime())) - qp.setTagData('tz', helpers.decode_string(tzname[daylight])) - qp.setTagData('display', helpers.decode_string(strftime('%c', - localtime()))) + qp.setTagData('tz', tzname[daylight]) + qp.setTagData('display', strftime('%c', localtime())) else: iq_obj = obj.stanza.buildReply('error') err = nbxmpp.ErrorNode(name=nbxmpp.NS_STANZAS + \ diff --git a/src/common/connection_handlers_events.py b/src/common/connection_handlers_events.py index d3d9456dcc7ee92ca0252f5509053fb9a207c5e2..433ab9ec7be646eed49c0cac09588ef87f9f6cb5 100644 --- a/src/common/connection_handlers_events.py +++ b/src/common/connection_handlers_events.py @@ -40,7 +40,8 @@ from nbxmpp.protocol import NS_CHATSTATES from common.jingle_transport import JingleTransportSocks5 from common.file_props import FilesProp -import gtkgui_helpers +if gajim.HAVE_PYOPENSSL: + import OpenSSL.crypto import logging log = logging.getLogger('gajim.c.connection_handlers_events') @@ -221,11 +222,11 @@ class TimeResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): try: t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%SZ') - except ValueError, e: + except ValueError: try: t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%S.%fZ') - except ValueError, e: + except ValueError as e: log.info('Wrong time format: %s' % str(e)) return @@ -309,7 +310,7 @@ class RosterItemExchangeEvent(nec.NetworkIncomingEvent, HelperEvent): try: jid = helpers.parse_jid(item.getAttr('jid')) except helpers.InvalidFormat: - log.warn('Invalid JID: %s, ignoring it' % item.getAttr('jid')) + log.warning('Invalid JID: %s, ignoring it' % item.getAttr('jid')) continue name = item.getAttr('name') contact = gajim.contacts.get_contact(self.conn.name, jid) @@ -367,10 +368,10 @@ class RosterReceivedEvent(nec.NetworkIncomingEvent): try: j = helpers.parse_jid(jid) except Exception: - print >> sys.stderr, _('JID %s is not RFC compliant. It ' - 'will not be added to your roster. Use roster ' - 'management tools such as ' - 'http://jru.jabberstudio.org/ to remove it') % jid + print(_('JID %s is not RFC compliant. It will not be added ' + 'to your roster. Use roster management tools such as ' + 'http://jru.jabberstudio.org/ to remove it') % jid, + file=sys.stderr) else: infos = raw_roster[jid] if jid != our_jid and (not infos['subscription'] or \ @@ -402,7 +403,7 @@ class RosterSetReceivedEvent(nec.NetworkIncomingEvent): try: jid = helpers.parse_jid(item.getAttr('jid')) except helpers.InvalidFormat: - log.warn('Invalid JID: %s, ignoring it' % item.getAttr('jid')) + log.warning('Invalid JID: %s, ignoring it' % item.getAttr('jid')) continue name = item.getAttr('name') sub = item.getAttr('subscription') @@ -450,7 +451,7 @@ class MucAdminReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): try: jid = helpers.parse_jid(item.getAttr('jid')) except helpers.InvalidFormat: - log.warn('Invalid JID: %s, ignoring it' % \ + log.warning('Invalid JID: %s, ignoring it' % \ item.getAttr('jid')) continue affiliation = item.getAttr('affiliation') @@ -492,7 +493,7 @@ class BookmarksHelper: try: jid = helpers.parse_jid(conf.getAttr('jid')) except helpers.InvalidFormat: - log.warn('Invalid JID: %s, ignoring it' % conf.getAttr('jid')) + log.warning('Invalid JID: %s, ignoring it' % conf.getAttr('jid')) continue bm = {'name': conf.getAttr('name'), 'jid': jid, @@ -544,7 +545,7 @@ class PrivateStorageRosternotesReceivedEvent(nec.NetworkIncomingEvent): try: jid = helpers.parse_jid(note.getAttr('jid')) except helpers.InvalidFormat: - log.warn('Invalid JID: %s, ignoring it' % note.getAttr('jid')) + log.warning('Invalid JID: %s, ignoring it' % note.getAttr('jid')) continue annotation = note.getData() self.annotations[jid] = annotation @@ -758,7 +759,7 @@ PresenceHelperEvent): try: self.get_jid_resource() except Exception: - log.warn('Invalid JID: %s, ignoring it' % self.stanza.getFrom()) + log.warning('Invalid JID: %s, ignoring it' % self.stanza.getFrom()) return jid_list = gajim.contacts.get_jid_list(self.conn.name) self.timestamp = None @@ -798,7 +799,8 @@ PresenceHelperEvent): and self.ptype == 'error': # Error presences may not include sent stanza, so we don't detect # it's a muc presence. So detect it by ID - h = hmac.new(self.conn.secret_hmac, self.jid).hexdigest()[:6] + h = hmac.new(self.conn.secret_hmac, self.jid.encode('utf-8')).\ + hexdigest()[:6] if self.id_.split('_')[-1] == h: self.is_gc = True self.status = self.stanza.getStatus() or '' @@ -906,7 +908,7 @@ class GcPresenceReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): try: gajim.logger.write('gcstatus', self.fjid, st, self.show) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: self.conn.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) except exceptions.DatabaseMalformed: @@ -1038,7 +1040,7 @@ class MessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): try: self.fjid = helpers.parse_jid(address.getAttr('jid')) except helpers.InvalidFormat: - log.warn('Invalid JID: %s, ignoring it' % address.getAttr( + log.warning('Invalid JID: %s, ignoring it' % address.getAttr( 'jid')) return self.jid = gajim.get_jid_without_resource(self.fjid) @@ -1078,10 +1080,15 @@ class MessageReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): self.invite_tag = None self.decline_tag = None if not self.enc_tag: + # Direct invitation? self.invite_tag = self.stanza.getTag('x', - namespace=nbxmpp.NS_MUC_USER) - if self.invite_tag and not self.invite_tag.getTag('invite'): - self.invite_tag = None + namespace=nbxmpp.NS_CONFERENCE) + # Mediated invitation? + if not self.invite_tag: + self.invite_tag = self.stanza.getTag('x', + namespace=nbxmpp.NS_MUC_USER) + if self.invite_tag and not self.invite_tag.getTag('invite'): + self.invite_tag = None self.decline_tag = self.stanza.getTag('x', namespace=nbxmpp.NS_MUC_USER) @@ -1182,7 +1189,6 @@ class ZeroconfMessageReceivedEvent(MessageReceivedEvent): self.fjid = key break - self.fjid = unicode(self.fjid) self.jid, self.resource = gajim.get_room_and_nick_from_fjid(self.fjid) def generate(self): @@ -1195,25 +1201,47 @@ class GcInvitationReceivedEvent(nec.NetworkIncomingEvent): base_network_events = [] def generate(self): - self.room_jid = self.msg_obj.fjid + invite_tag = self.msg_obj.invite_tag + if invite_tag.getNamespace() == nbxmpp.NS_CONFERENCE: + # direct invitation + try: + self.room_jid = helpers.parse_jid(invite_tag.getAttr('jid')) + except helpers.InvalidFormat: + log.warning('Invalid JID: %s, ignoring it' % invite_tag.getAttr( + 'jid')) + return + self.jid_from = self.msg_obj.fjid + self.reason = invite_tag.getAttr('reason') + self.password = invite_tag.getAttr('password') + self.is_continued = False + if invite_tag.getAttr('continue') == 'true': + self.is_continued = True + else: + self.room_jid = self.msg_obj.fjid + item = self.msg_obj.invite_tag.getTag('invite') + try: + self.jid_from = helpers.parse_jid(item.getAttr('from')) + except helpers.InvalidFormat: + log.warning('Invalid JID: %s, ignoring it' % item.getAttr( + 'from')) + return - item = self.msg_obj.invite_tag.getTag('invite') - try: - self.jid_from = helpers.parse_jid(item.getAttr('from')) - except helpers.InvalidFormat: - log.warn('Invalid JID: %s, ignoring it' % item.getAttr('from')) + self.reason = item.getTagData('reason') + self.password = invite_tag.getTagData('password') + + self.is_continued = False + if item.getTag('continue'): + self.is_continued = True + + if self.room_jid in gajim.gc_connected[self.conn.name] and \ + gajim.gc_connected[self.conn.name][self.room_jid]: + # We are already in groupchat. Ignore invitation return jid = gajim.get_jid_without_resource(self.jid_from) if gajim.config.get_per('accounts', self.conn.name, 'ignore_unknown_contacts') and not gajim.contacts.get_contacts( self.conn.name, jid): return - self.reason = item.getTagData('reason') - self.password = self.msg_obj.invite_tag.getTagData('password') - - self.is_continued = False - if item.getTag('continue'): - self.is_continued = True return True @@ -1228,7 +1256,7 @@ class GcDeclineReceivedEvent(nec.NetworkIncomingEvent): try: self.jid_from = helpers.parse_jid(item.getAttr('from')) except helpers.InvalidFormat: - log.warn('Invalid JID: %s, ignoring it' % item.getAttr('from')) + log.warning('Invalid JID: %s, ignoring it' % item.getAttr('from')) return jid = gajim.get_jid_without_resource(self.jid_from) if gajim.config.get_per('accounts', self.conn.name, @@ -1607,12 +1635,12 @@ class NewAccountConnectedEvent(nec.NetworkIncomingEvent): self.ssl_msg = ssl_error.get(er, _('Unknown SSL error: %d') % \ self.errnum) self.ssl_cert = '' - if len(self.conn.connection.Connection.ssl_cert_pem): - self.ssl_cert = self.conn.connection.Connection.ssl_cert_pem self.ssl_fingerprint = '' if self.conn.connection.Connection.ssl_certificate: - self.ssl_fingerprint = \ - self.conn.connection.Connection.ssl_certificate.digest('sha1') + cert = self.conn.connection.Connection.ssl_certificate + self.ssl_cert = OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_PEM, cert).decode('utf-8') + self.ssl_fingerprint = cert.digest('sha1').decode('utf-8') return True class NewAccountNotConnectedEvent(nec.NetworkIncomingEvent): @@ -1852,6 +1880,8 @@ class MetacontactsReceivedEvent(nec.NetworkIncomingEvent): # Metacontact tags # http://www.xmpp.org/extensions/xep-0209.html self.meta_list = {} + # FIXME: disable metacontacts until they work correctly + return True query = self.stanza.getTag('query') storage = query.getTag('storage') metas = storage.getTags('meta') @@ -1965,7 +1995,7 @@ class AgentInfoReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): if self.id_ in self.conn.disco_info_ids: self.conn.disco_info_ids.remove(self.id_) if self.id_ is None: - log.warn('Invalid IQ received without an ID. Ignoring it: %s' % \ + log.warning('Invalid IQ received without an ID. Ignoring it: %s' % \ self.stanza) return # According to XEP-0030: @@ -2025,15 +2055,18 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): self.fjid = self.conn._ft_get_from(self.stanza) self.jid = gajim.get_jid_without_resource(self.fjid) if self.jingle_content: - self.FT_content.use_security = bool(self.jingle_content.getTag( - 'security')) + secu = self.jingle_content.getTag('security') + self.FT_content.use_security = bool(secu) + fingerprint = secu.getTag('fingerprint') + if fingerprint: + self.FT_content.x509_fingerprint = fingerprint.getData() if not self.FT_content.transport: self.FT_content.transport = JingleTransportSocks5() self.FT_content.transport.set_our_jid( self.FT_content.session.ourjid) self.FT_content.transport.set_connection( self.FT_content.session.connection) - sid = unicode(self.stanza.getTag('jingle').getAttr('sid')) + sid = self.stanza.getTag('jingle').getAttr('sid') self.file_props = FilesProp.getNewFileProp(self.conn.name, sid) self.file_props.transport_sid = self.FT_content.transport.sid self.FT_content.file_props = self.file_props @@ -2071,7 +2104,7 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): if name == 'name': self.file_props.name = val if name == 'size': - self.file_props.size = val + self.file_props.size = int(val) if name == 'hash': self.file_props.algo = child.getAttr('algo') self.file_props.hash_ = val @@ -2080,8 +2113,7 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): else: si = self.stanza.getTag('si') self.file_props = FilesProp.getNewFileProp(self.conn.name, - unicode(si.getAttr('id')) - ) + si.getAttr('id')) profile = si.getAttr('profile') if profile != nbxmpp.NS_FILE: self.conn.send_file_rejection(self.file_props, code='400', @@ -2112,7 +2144,7 @@ class FileRequestReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): if name == 'name': self.file_props.name = val if name == 'size': - self.file_props.size = val + self.file_props.size = int(val) mime_type = si.getAttr('mime-type') if mime_type is not None: self.file_props.mime_type = mime_type @@ -2230,8 +2262,6 @@ class NotificationEvent(nec.NetworkIncomingEvent): self.popup_title = _('New Message from %(nickname)s') % \ {'nickname': nick} - self.popup_image = gtkgui_helpers.get_icon_path(self.popup_image, 48) - if not gajim.config.get('notify_on_new_message') or \ not self.first_unread: self.do_popup = False @@ -2286,6 +2316,28 @@ class NotificationEvent(nec.NetworkIncomingEvent): self.do_popup = False + def get_path_to_generic_or_avatar(self, generic, jid=None, suffix=None): + """ + Choose between avatar image and default image + + Returns full path to the avatar image if it exists, otherwise returns full + path to the image. generic must be with extension and suffix without + """ + if jid: + # we want an avatar + puny_jid = helpers.sanitize_filename(jid) + path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + suffix + path_to_local_file = path_to_file + '_local' + for extension in ('.png', '.jpeg'): + path_to_local_file_full = path_to_local_file + extension + if os.path.exists(path_to_local_file_full): + return path_to_local_file_full + for extension in ('.png', '.jpeg'): + path_to_file_full = path_to_file + extension + if os.path.exists(path_to_file_full): + return path_to_file_full + return os.path.abspath(generic) + def handle_incoming_pres_event(self, pres_obj): if gajim.jid_is_transport(pres_obj.jid): return True @@ -2364,8 +2416,8 @@ class NotificationEvent(nec.NetworkIncomingEvent): iconset = gajim.config.get('iconset') img_path = os.path.join(helpers.get_iconset_path(iconset), '48x48', show_image) - self.popup_image = gtkgui_helpers.get_path_to_generic_or_avatar( - img_path, jid=self.jid, suffix=suffix) + self.popup_image_path = self.get_path_to_generic_or_avatar(img_path, + jid=self.jid, suffix=suffix) self.popup_timeout = gajim.config.get('notification_timeout') @@ -2411,6 +2463,7 @@ class NotificationEvent(nec.NetworkIncomingEvent): self.popup_event_type = '' self.popup_msg_type = '' self.popup_image = '' + self.popup_image_path = '' self.popup_timeout = -1 self.do_command = False @@ -2447,7 +2500,7 @@ class MessageOutgoingEvent(nec.NetworkOutgoingEvent): self.session = None self.forward_from = None self.form_node = None - self.original_message = '' + self.original_message = None self.delayed = None self.callback = None self.callback_args = [] diff --git a/src/common/contacts.py b/src/common/contacts.py index 44ec63f452c888fd4469d18dd5597b09083be244..dc5d841a143d2eb7d1e2229e72fdfee8c3a128e7 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -28,13 +28,15 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## +from functools import cmp_to_key + try: from common import caps_cache from common.account import Account import common.gajim -except ImportError, e: +except ImportError as e: if __name__ != "__main__": - raise ImportError(e) + raise ImportError(str(e)) class XMPPEntity(object): """ @@ -94,6 +96,8 @@ class Contact(CommonContact): sub='', ask='', resource='', priority=0, keyID='', client_caps=None, our_chatstate=None, chatstate=None, last_status_time=None, msg_id=None, last_activity_time=None): + if not isinstance(jid, str): + print('no str') CommonContact.__init__(self, jid, account, resource, show, status, name, our_chatstate, chatstate, client_caps=client_caps) @@ -484,17 +488,18 @@ class Contacts(): for c in self._contacts[jid]: if c.resource == resource: return c + return self._contacts[jid][0] def iter_contacts(self): - for jid in self._contacts.keys(): + for jid in list(self._contacts.keys()): for contact in self._contacts[jid][:]: yield contact def get_jid_list(self): - return self._contacts.keys() + return list(self._contacts.keys()) def get_contacts_jid_list(self): - return [jid for jid, contact in self._contacts.iteritems() if not + return [jid for jid, contact in self._contacts.items() if not contact[0].is_groupchat()] def get_contact_from_full_jid(self, fjid): @@ -562,7 +567,7 @@ class GC_Contacts(): gc_list = self.get_gc_list() if not room_jid in gc_list: return [] - return self._rooms[room_jid].keys() + return list(self._rooms[room_jid].keys()) def get_gc_contact(self, room_jid, nick): nick_list = self.get_nick_list(room_jid) @@ -846,7 +851,7 @@ class MetacontactManager(): Which of the family will be the big brother under wich all others will be ? """ - family.sort(cmp=self._compare_metacontacts) + family.sort(key=cmp_to_key(self._compare_metacontacts)) return family[-1] diff --git a/src/common/crypto.py b/src/common/crypto.py index c787df6aadd69f10974b3e317f52b9f5cf369d27..70ef6e1e129674d700884912290c52c572ffa846 100644 --- a/src/common/crypto.py +++ b/src/common/crypto.py @@ -19,6 +19,7 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## +import sys import os import math @@ -75,8 +76,54 @@ def base28(n): else: return base28_chr[n] +def add_entropy_sources_OpenSSL(): + # Other possibly variable data. This are very low quality sources of + # entropy, but some of them are installation dependent and can be hard + # to guess for the attacker. + # Data available on all platforms Unix, Windows + sources = [sys.argv, sys.builtin_module_names, + sys.copyright, sys.getfilesystemencoding(), sys.hexversion, + sys.modules, sys.path, sys.version, sys.api_version, + os.environ, os.getcwd(), os.getpid()] + + for s in sources: + OpenSSL.rand.add(str(s).encode('utf-8'), 1) + + # On Windows add the current contents of the screen to the PRNG state. + if os.name == 'nt': + OpenSSL.rand.screen() + # The /proc filesystem on POSIX systems contains many random variables: + # memory statistics, interrupt counts, network packet counts + if os.name == 'posix': + dirs = ['/proc', '/proc/net', '/proc/self'] + for d in dirs: + if os.access(d, os.R_OK): + for filename in os.listdir(d): + OpenSSL.rand.add(filename.encode('utf-8'), 0) + try: + with open(d + os.sep + filename, "r") as fp: + # Limit the ammount of read bytes, in case a memory + # file was opened + OpenSSL.rand.add(str(fp.read(5000)).encode('utf-8'), + 1) + except: + # Ignore all read and access errors + pass + +PYOPENSSL_PRNG_PRESENT = False +try: + import OpenSSL.rand + PYOPENSSL_PRNG_PRESENT = True +except ImportError: + # PyOpenSSL PRNG not available + pass + def random_bytes(bytes_): - return os.urandom(bytes_) + if PYOPENSSL_PRNG_PRESENT: + OpenSSL.rand.add(os.urandom(bytes_), bytes_) + return OpenSSL.rand.bytes(bytes_) + else: + return os.urandom(bytes_) def generate_nonce(): return random_bytes(8) diff --git a/src/common/dataforms.py b/src/common/dataforms.py index 1af92dbdb13ff96708585f9dbf09d72315aba072..2053f1fbae09a5ba04582743b9d6606af6da7e6f 100644 --- a/src/common/dataforms.py +++ b/src/common/dataforms.py @@ -27,7 +27,7 @@ information how to use them, read documentation """ import nbxmpp -import helpers +from common import helpers # exceptions used in this module # base class @@ -195,7 +195,7 @@ class DataField(ExtendedNode): Human-readable description of field meaning """ def fget(self): - return self.getTagData('desc') or u'' + return self.getTagData('desc') or '' def fset(self, value): assert isinstance(value, basestring) @@ -345,10 +345,10 @@ class StringField(DataField): @nested_property def value(): """ - Value of field. May be any unicode string + Value of field. May be any string """ def fget(self): - return self.getTagData('value') or u'' + return self.getTagData('value') or '' def fset(self, value): assert isinstance(value, basestring) @@ -494,7 +494,7 @@ class TextMultiField(DataField): Value held in field """ def fget(self): - value = u'' + value = '' for element in self.iterTags('value'): value += '\n' + element.getData() return value[1:] @@ -643,7 +643,7 @@ class DataForm(ExtendedNode): """ # TODO: the same code is in TextMultiField. join them def fget(self): - value = u'' + value = '' for valuenode in self.getTags('instructions'): value += '\n' + valuenode.getData() return value[1:] diff --git a/src/common/dbus_support.py b/src/common/dbus_support.py index 205281093f5ab6fd2743a0dab813c4af4e0954c2..4eec752998d351ef23535d437470a9c7a1a578ea 100644 --- a/src/common/dbus_support.py +++ b/src/common/dbus_support.py @@ -38,8 +38,8 @@ try: except ImportError: supported = False if not os.name == 'nt': # only say that to non Windows users - print _('D-Bus python bindings are missing in this computer') - print _('D-Bus capabilities of Gajim cannot be used') + print(_('D-Bus python bindings are missing in this computer')) + print(_('D-Bus capabilities of Gajim cannot be used')) else: try: # test if dbus-x11 is installed @@ -49,14 +49,14 @@ else: except dbus.DBusException: supported = False if not os.name == 'nt': # only say that to non Windows users - print _('D-Bus does not run correctly on this machine') - print _('D-Bus capabilities of Gajim cannot be used') + print(_('D-Bus does not run correctly on this machine')) + print(_('D-Bus capabilities of Gajim cannot be used')) except exceptions.SystemBusNotPresent: - print _('D-Bus does not run correctly on this machine: system bus not ' - 'present') + print(_('D-Bus does not run correctly on this machine: system bus not ' + 'present')) except exceptions.SessionBusNotPresent: - print _('D-Bus does not run correctly on this machine: session bus not ' - 'present') + print(_('D-Bus does not run correctly on this machine: session bus not ' + 'present')) class SystemBus: """ @@ -154,7 +154,7 @@ def get_interface(interface, path, start_service=True): return None obj = bus.get_object(interface, path) return dbus.Interface(obj, interface) - except Exception, e: + except Exception as e: gajim.log.debug(str(e)) return None diff --git a/src/common/defs.py b/src/common/defs.py index d7d0545424c09c6406c3c67a82c8caec8a95ba2d..9b831a56cba6319b27e544a71c1fa9e5bfea9279 100644 --- a/src/common/defs.py +++ b/src/common/defs.py @@ -27,13 +27,13 @@ docdir = '../' basedir = '../' localedir = '../po' -version = '0.16' +version = '0.16.10.0' import subprocess try: node = subprocess.Popen('hg tip --template "{node|short}"', shell=True, stdout=subprocess.PIPE).communicate()[0] if node: - version += '-' + node + version += '-' + node.decode('utf-8') except Exception: pass diff --git a/src/common/exceptions.py b/src/common/exceptions.py index 34daff108d7bbfa0e82e5560a799adcd2f1b4561..5bfc86a60c8768841e533ea84e782c2a6d3842aa 100644 --- a/src/common/exceptions.py +++ b/src/common/exceptions.py @@ -143,3 +143,15 @@ class PluginsystemError(Exception): def __str__(self): return self.text + +class GnomeKeyringError(Exception): + """ + Error with Gnome Keyring + """ + + def __init__(self, error): + Exception.__init__(self) + self.error = error + + def __str__(self): + return str(self.error) diff --git a/src/common/file_props.py b/src/common/file_props.py index 81218976343f85930c8fa55971bba143495245ce..6b47baba8d6c39b95939a0d885cd57ffdd246792 100644 --- a/src/common/file_props.py +++ b/src/common/file_props.py @@ -64,7 +64,7 @@ class FilesProp: @classmethod def getAllFileProp(cls): - return cls._files_props.values() + return list(cls._files_props.values()) @classmethod def setFileProp(cls, fp, account, sid): diff --git a/src/common/gajim.py b/src/common/gajim.py index 84f729ea51461781c9455d444170f45869d588ee..65c70e4b24e471e4abb5c1bbc38204298a7169b8 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -31,10 +31,10 @@ import sys import logging import locale -import config +from common import config import nbxmpp -import defs -import common.ged +from common import defs +from common import ged as ged_module interface = None # The actual interface (the gtk one for the moment) thread_interface = None # Interface to run a thread and then a callback @@ -43,16 +43,15 @@ version = config.get('version') connections = {} # 'account name': 'account (connection.Connection) instance' ipython_window = None -ged = common.ged.GlobalEventsDispatcher() # Global Events Dispatcher +ged = ged_module.GlobalEventsDispatcher() # Global Events Dispatcher nec = None # Network Events Controller plugin_manager = None # Plugins Manager log = logging.getLogger('gajim') -import logger -logger = logger.Logger() # init the logger +logger = None -import configpaths +from common import configpaths gajimpaths = configpaths.gajimpaths VCARD_PATH = gajimpaths['VCARD'] @@ -84,8 +83,8 @@ else: os_info = None # used to cache os information -from contacts import LegacyContactsAPI -from events import Events +from common.contacts import LegacyContactsAPI +from common.events import Events gmail_domains = ['gmail.com', 'googlemail.com'] @@ -159,7 +158,7 @@ except ImportError: HAVE_GPG = True try: - __import__('gnupg', globals(), locals(), [], -1) + __import__('gnupg', globals(), locals(), [], 0) except ImportError: HAVE_GPG = False else: @@ -185,6 +184,7 @@ except Exception: HAVE_FARSTREAM = True try: + raise ImportError farstream = __import__('farstream') import gst import glib @@ -201,8 +201,8 @@ except ImportError: HAVE_UPNP_IGD = True try: - import gupnp.igd - gupnp_igd = gupnp.igd.Simple() + from gi.repository import GUPnPIgd + gupnp_igd = GUPnPIgd.SimpleIgd() except ImportError: HAVE_UPNP_IGD = False @@ -223,7 +223,7 @@ gajim_common_features = [nbxmpp.NS_BYTESTREAM, nbxmpp.NS_SI, nbxmpp.NS_FILE, nbxmpp.NS_SSN, nbxmpp.NS_MOOD, nbxmpp.NS_ACTIVITY, nbxmpp.NS_NICK, nbxmpp.NS_ROSTERX, nbxmpp.NS_SECLABEL, nbxmpp.NS_HASHES, nbxmpp.NS_HASHES_MD5, nbxmpp.NS_HASHES_SHA1, nbxmpp.NS_HASHES_SHA256, - nbxmpp.NS_HASHES_SHA512, nbxmpp.NS_CORRECT] + nbxmpp.NS_HASHES_SHA512] # Optional features gajim supports per account gajim_optional_features = {} @@ -231,9 +231,6 @@ gajim_optional_features = {} # Capabilities hash per account caps_hash = {} -import caps_cache -caps_cache.initialize(logger) - global_id = 0 def get_an_id(): global global_id @@ -290,13 +287,8 @@ def get_jid_without_resource(jid): return jid.split('/')[0] def construct_fjid(room_jid, nick): - """ - Nick is in UTF-8 (taken from treeview); room_jid is in unicode - """ # fake jid is the jid for a contact in a room # gaim@conference.jabber.org/nick - if isinstance(nick, str): - nick = unicode(nick, 'utf-8') return room_jid + '/' + nick def get_resource_from_jid(jid): diff --git a/src/common/ged.py b/src/common/ged.py index 9ac3604a2be086f5fd49001d1e457c5835f2dda3..41edd012e37958afd4cd2c53c658e9434c6b7f1c 100644 --- a/src/common/ged.py +++ b/src/common/ged.py @@ -79,8 +79,8 @@ class GlobalEventsDispatcher(object): if event_name in self.handlers: try: self.handlers[event_name].remove((priority, handler)) - except ValueError, error: - log.warn('''Function (%s) with priority "%s" never registered + except ValueError: + log.warning('''Function (%s) with priority "%s" never registered as handler of event "%s". Couldn\'t remove. Error: %s''' %(handler, priority, event_name, error)) @@ -94,7 +94,7 @@ class GlobalEventsDispatcher(object): return True except NodeProcessed: node_processed = True - except Exception, e: + except Exception: log.error('Error while running an even handler: %s' % \ handler) traceback.print_exc() diff --git a/src/common/gnupg.py b/src/common/gnupg.py index 1080d2d1eabb96cc09e4975616767bf38054271a..13b96f8203e34c08cf57b91e056a3cd0efa063ef 100644 --- a/src/common/gnupg.py +++ b/src/common/gnupg.py @@ -175,7 +175,7 @@ class Verify(object): "PLAINTEXT_LENGTH", "POLICY_URL", "DECRYPTION_INFO", "DECRYPTION_OKAY", "INV_SGNR", "FILE_START", "FILE_ERROR", "FILE_DONE", "PKA_TRUST_GOOD", "PKA_TRUST_BAD", "BADMDC", - "GOODMDC", "NO_SGNR"): + "GOODMDC", "NO_SGNR", "NOTATION_NAME", "NOTATION_DATA"): pass elif key == "BADSIG": self.valid = False diff --git a/src/common/gpg.py b/src/common/gpg.py index c95ed2257da54188d4ff60e6a0774b383a633d08..37895d0d98a4c71c0da76a8d9024727725111cbe 100644 --- a/src/common/gpg.py +++ b/src/common/gpg.py @@ -22,11 +22,11 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## -from gajim import HAVE_GPG +from common.gajim import HAVE_GPG import os if HAVE_GPG: - import gnupg + from common import gnupg class GnuPG(gnupg.GPG): def __init__(self, use_agent=False): @@ -34,7 +34,7 @@ if HAVE_GPG: self.decode_errors = 'replace' self.passphrase = None self.use_agent = use_agent - self.always_trust = False + self.always_trust = [] # list of keyID to always trust def _setup_my_options(self): self.options.armor = 1 @@ -47,8 +47,14 @@ if HAVE_GPG: self.options.extra_args.append('--use-agent') def encrypt(self, str_, recipients, always_trust=False): + trust = always_trust + if not trust: + trust = True + for key in recipients: + if key not in self.always_trust: + trust = False result = super(GnuPG, self).encrypt(str_, recipients, - always_trust=always_trust, passphrase=self.passphrase) + always_trust=trust, passphrase=self.passphrase) if result.status == 'invalid recipient': return '', 'NOT_TRUSTED' @@ -80,14 +86,21 @@ if HAVE_GPG: def verify(self, str_, sign): if str_ is None: return '' - data = '-----BEGIN PGP SIGNED MESSAGE-----' + os.linesep - data = data + 'Hash: SHA1' + os.linesep + os.linesep - data = data + str_ + os.linesep - data = data + self._addHeaderFooter(sign, 'SIGNATURE') - result = super(GnuPG, self).verify(data) - - if result.valid: - return result.key_id + # Hash algorithm is not transfered in the signed presence stanza so try + # all algorithms. Text name for hash algorithms from RFC 4880 - section 9.4 + hash_algorithms = ['SHA512', 'SHA384', 'SHA256', 'SHA224', 'SHA1', 'RIPEMD160'] + for algo in hash_algorithms: + data = os.linesep.join( + ['-----BEGIN PGP SIGNED MESSAGE-----', + 'Hash: ' + algo, + '', + str_, + self._addHeaderFooter(sign, 'SIGNATURE')] + ) + result = super(GnuPG, self).verify(data) + if result.valid: + return result.key_id + return '' def get_keys(self, secret=False): diff --git a/src/common/helpers.py b/src/common/helpers.py index 1729f6ddb5ad03930bf67c31bffcb92d5c34ac9e..c77fb01cfebef02e802926c783f6aac5f2971ec4 100644 --- a/src/common/helpers.py +++ b/src/common/helpers.py @@ -35,22 +35,23 @@ import locale import os import subprocess import urllib -import urllib2 +import urllib import webbrowser import errno import select import base64 import hashlib import shlex -import caps_cache +from common import caps_cache import socket import time +from gi.repository import GObject from encodings.punycode import punycode_encode from string import Template -from i18n import Q_ -from i18n import ngettext +from common.i18n import Q_ +from common.i18n import ngettext try: import winsound # windows-only built-in module for playing wav @@ -121,7 +122,7 @@ def idn_to_ascii(host): labels = idna.dots.split(host) converted_labels = [] for label in labels: - converted_labels.append(idna.ToASCII(label)) + converted_labels.append(idna.ToASCII(label).decode('utf-8')) return ".".join(converted_labels) def ascii_to_idn(host): @@ -143,9 +144,9 @@ def parse_resource(resource): if resource: try: from nbxmpp.stringprepare import resourceprep - return resourceprep.prepare(unicode(resource)) + return resourceprep.prepare(resource) except UnicodeError: - raise InvalidFormat, 'Invalid character in resource.' + raise InvalidFormat('Invalid character in resource.') def prep(user, server, resource): """ @@ -155,34 +156,34 @@ def prep(user, server, resource): #http://svn.twistedmatrix.com/cvs/trunk/twisted/words/protocols/jabber/jid.py if user is not None: if len(user) < 1 or len(user) > 1023: - raise InvalidFormat, _('Username must be between 1 and 1023 chars') + raise InvalidFormat(_('Username must be between 1 and 1023 chars')) try: from nbxmpp.stringprepare import nodeprep - user = nodeprep.prepare(unicode(user)) + user = nodeprep.prepare(user) except UnicodeError: - raise InvalidFormat, _('Invalid character in username.') + raise InvalidFormat(_('Invalid character in username.')) else: user = None if server is not None: if len(server) < 1 or len(server) > 1023: - raise InvalidFormat, _('Server must be between 1 and 1023 chars') + raise InvalidFormat(_('Server must be between 1 and 1023 chars')) try: from nbxmpp.stringprepare import nameprep - server = nameprep.prepare(unicode(server)) + server = nameprep.prepare(server) except UnicodeError: - raise InvalidFormat, _('Invalid character in hostname.') + raise InvalidFormat(_('Invalid character in hostname.')) else: - raise InvalidFormat, _('Server address required.') + raise InvalidFormat(_('Server address required.')) if resource is not None: if len(resource) < 1 or len(resource) > 1023: - raise InvalidFormat, _('Resource must be between 1 and 1023 chars') + raise InvalidFormat(_('Resource must be between 1 and 1023 chars')) try: from nbxmpp.stringprepare import resourceprep - resource = resourceprep.prepare(unicode(resource)) + resource = resourceprep.prepare(resource) except UnicodeError: - raise InvalidFormat, _('Invalid character in resource.') + raise InvalidFormat(_('Invalid character in resource.')) else: resource = None @@ -206,7 +207,7 @@ def temp_failure_retry(func, *args, **kwargs): while True: try: return func(*args, **kwargs) - except (os.error, IOError, select.error), ex: + except (os.error, IOError, select.error) as ex: if ex.errno == errno.EINTR: continue else: @@ -263,7 +264,7 @@ def get_uf_show(show, use_mnemonic = False): uf_show = Q_('?contact has status:Unknown') else: uf_show = Q_('?contact has status:Has errors') - return unicode(uf_show) + return uf_show def get_uf_sub(sub): if sub == 'none': @@ -277,7 +278,7 @@ def get_uf_sub(sub): else: uf_sub = sub - return unicode(uf_sub) + return uf_sub def get_uf_ask(ask): if ask is None: @@ -287,7 +288,7 @@ def get_uf_ask(ask): else: uf_ask = ask - return unicode(uf_ask) + return uf_ask def get_uf_role(role, plural = False): ''' plural determines if you get Moderators or Moderator''' @@ -397,7 +398,7 @@ def exec_command(command, use_shell=False): if use_shell: subprocess.Popen('%s &' % command, shell=True).wait() else: - args = shlex.split(command.encode('utf-8')) + args = shlex.split(command) p = subprocess.Popen(args) gajim.thread_interface(p.wait) @@ -409,7 +410,7 @@ def build_command(executable, parameter): return command def get_file_path_from_dnd_dropped_uri(uri): - path = urllib.unquote(uri) # escape special chars + path = urllib.parse.unquote(uri) # escape special chars path = path.strip('\r\n\x00') # remove \r\n and NULL # get the path to file if re.match('^file:///[a-zA-Z]:/', path): # windows @@ -447,33 +448,6 @@ def get_output_of_command(command): return output -def decode_string(string): - """ - Try to decode (to make it Unicode instance) given string - """ - if isinstance(string, unicode): - return string - # by the time we go to iso15 it better be the one else we show bad characters - encodings = (locale.getpreferredencoding(), 'utf-8', 'iso-8859-15') - for encoding in encodings: - try: - string = string.decode(encoding) - except UnicodeError: - continue - break - - return string - -def ensure_utf8_string(string): - """ - Make sure string is in UTF-8 - """ - try: - string = decode_string(string).encode('utf-8') - except Exception: - pass - return string - def get_windows_reg_env(varname, default=''): """ Ask for paths commonly used but not exposed as ENVs in english Windows 2003 @@ -481,7 +455,7 @@ def get_windows_reg_env(varname, default=''): 'AppData' = %USERPROFILE%\Application Data (also an ENV) 'Desktop' = %USERPROFILE%\Desktop 'Favorites' = %USERPROFILE%\Favorites - 'NetHood' = %USERPROFILE%\NetHood + 'NetHood' = %USERPROFILE%\ NetHood 'Personal' = D:\My Documents (PATH TO MY DOCUMENTS) 'PrintHood' = %USERPROFILE%\PrintHood 'Programs' = %USERPROFILE%\Start Menu\Programs @@ -540,10 +514,11 @@ def sanitize_filename(filename): """ # 48 is the limit if len(filename) > 48: - hash = hashlib.md5(filename) - filename = base64.b64encode(hash.digest()) + hash = hashlib.md5(filename.encode('utf-8')) + filename = base64.b64encode(hash.digest()).decode('utf-8') - filename = punycode_encode(filename) # make it latin chars only + # make it latin chars only + filename = punycode_encode(filename).decode('utf-8') filename = filename.replace('/', '_') if os.name == 'nt': filename = filename.replace('?', '_').replace(':', '_')\ @@ -565,9 +540,6 @@ def reduce_chars_newlines(text, max_chars = 0, max_lines = 0): string = string[:max_chars - 3] + '...' return string - if isinstance(text, str): - text = text.decode('utf-8') - if max_lines == 0: lines = text.split('\n') else: @@ -623,12 +595,10 @@ def datetime_tuple(timestamp): from time import strptime return strptime(timestamp, '%Y%m%dT%H:%M:%S') -# import gajim only when needed (after decode_string is defined) see #4764 - -import gajim +from common import gajim if gajim.HAVE_PYCURL: import pycurl - from cStringIO import StringIO + from io import StringIO def convert_bytes(string): suffix = '' @@ -636,13 +606,13 @@ def convert_bytes(string): # but do we use the standard? use_kib_mib = gajim.config.get('use_kib_mib') align = 1024. - bytes = float(string) - if bytes >= align: - bytes = round(bytes/align, 1) - if bytes >= align: - bytes = round(bytes/align, 1) - if bytes >= align: - bytes = round(bytes/align, 1) + bytes_ = float(string) + if bytes_ >= align: + bytes_ = round(bytes_/align, 1) + if bytes_ >= align: + bytes_ = round(bytes_/align, 1) + if bytes_ >= align: + bytes_ = round(bytes_/align, 1) if use_kib_mib: #GiB means gibibyte suffix = _('%s GiB') @@ -666,7 +636,7 @@ def convert_bytes(string): else: #B means bytes suffix = _('%s B') - return suffix % unicode(bytes) + return suffix % str(bytes_) def get_contact_dict_for_account(account): """ @@ -892,13 +862,13 @@ def get_icon_name_to_show(contact, account = None): def get_full_jid_from_iq(iq_obj): """ - Return the full jid (with resource) from an iq as unicode + Return the full jid (with resource) from an iq """ return parse_jid(str(iq_obj.getFrom())) def get_jid_from_iq(iq_obj): """ - Return the jid (without resource) from an iq as unicode + Return the jid (without resource) from an iq """ jid = get_full_jid_from_iq(iq_obj) return gajim.get_jid_without_resource(jid) @@ -907,7 +877,8 @@ def get_auth_sha(sid, initiator, target): """ Return sha of sid + initiator + target used for proxy auth """ - return hashlib.sha1("%s%s%s" % (sid, initiator, target)).hexdigest() + return hashlib.sha1(("%s%s%s" % (sid, initiator, target)).encode('utf-8')).\ + hexdigest() def remove_invalid_xml_chars(string): if string: @@ -943,7 +914,7 @@ def get_random_string_16(): """ Create random string of length 16 """ - rng = range(65, 90) + rng = list(range(65, 90)) rng.extend(range(48, 57)) char_sequence = [chr(e) for e in rng] from random import sample @@ -984,8 +955,10 @@ def get_os_info(): p.wait() output = temp_failure_retry(p.stdout.readline).strip() # some distros put n/a in places, so remove those - output = output.replace('n/a', '').replace('N/A', '') + output = output.decode('utf-8').replace('n/a', '').replace('N/A', '') gajim.os_info = output + p.stdout.close() + p.stdin.close() return output # lsb_release executable not available, so parse files @@ -1419,7 +1392,7 @@ def get_proxy_info(account): login = ['', ''] addr = env_http_proxy[0].split(':') - proxy = {'host': addr[0], 'type' : u'http', 'user':login[0]} + proxy = {'host': addr[0], 'type' : 'http', 'user':login[0]} if len(addr) == 2: proxy['port'] = addr[1] @@ -1430,7 +1403,7 @@ def get_proxy_info(account): proxy['pass'] = login[1] proxy['useauth'] = True else: - proxy['pass'] = u'' + proxy['pass'] = '' return proxy except Exception: @@ -1449,14 +1422,15 @@ def _get_img_direct(attrs): """ Download an image. This function should be launched in a separated thread. """ - mem, alt = '', '' + mem = b'' + alt = '' # Wait maximum 5s for connection socket.setdefaulttimeout(5) try: - req = urllib2.Request(attrs['src']) + req = urllib.request.Request(attrs['src']) req.add_header('User-Agent', 'Gajim ' + gajim.version) - f = urllib2.urlopen(req) - except Exception, ex: + f = urllib.request.urlopen(req) + except Exception as ex: log.debug('Error loading image %s ' % attrs['src'] + str(ex)) pixbuf = None alt = attrs.get('alt', 'Broken image') @@ -1479,7 +1453,7 @@ def _get_img_direct(attrs): break try: temp = f.read(100) - except socket.timeout, ex: + except socket.timeout as ex: log.debug('Timeout loading image %s ' % attrs['src'] + str(ex)) alt = attrs.get('alt', '') if alt: @@ -1496,6 +1470,7 @@ def _get_img_direct(attrs): alt += '\n' alt += _('Image is too big') break + f.close() return (mem, alt) def _get_img_proxy(attrs, proxy): @@ -1531,17 +1506,17 @@ def _get_img_proxy(attrs, proxy): c.close() t = b.getvalue() return (t, attrs.get('alt', '')) - except pycurl.error, ex: + except pycurl.error as ex: alt = attrs.get('alt', '') if alt: alt += '\n' - if ex[0] == pycurl.E_FILESIZE_EXCEEDED: + if ex.errno == pycurl.E_FILESIZE_EXCEEDED: alt += _('Image is too big') - elif ex[0] == pycurl.E_OPERATION_TIMEOUTED: + elif ex.errno == pycurl.E_OPERATION_TIMEOUTED: alt += _('Timeout loading image') else: alt += _('Error loading image') - except Exception, ex: + except Exception as ex: log.debug('Error loading image %s ' % attrs['src'] + str(ex)) pixbuf = None alt = attrs.get('alt', 'Broken image') diff --git a/src/common/i18n.py b/src/common/i18n.py index c85b7da080d8b1b48bf62ae9d23e21e081d54825..fa86727cb7ada74c2261ca559686ff19c6d8ba12 100644 --- a/src/common/i18n.py +++ b/src/common/i18n.py @@ -24,11 +24,11 @@ import locale import gettext import os -import defs +from common import defs import unicodedata # May be changed after GTK is imported -direction_mark = u'\u200E' +direction_mark = '\u200E' def paragraph_direction_mark(text): """ @@ -40,11 +40,11 @@ def paragraph_direction_mark(text): for char in text: bidi = unicodedata.bidirectional(char) if bidi == 'L': - return u'\u200E' + return '\u200E' elif bidi == 'AL' or bidi == 'R': - return u'\u200F' + return '\u200F' - return u'\u200E' + return '\u200E' APP = 'gajim' DIR = defs.localedir @@ -64,9 +64,9 @@ if os.name == 'nt': if lang: os.environ['LANG'] = lang -gettext.install(APP, DIR, unicode = True) +gettext.install(APP, DIR) if gettext._translations: - _translation = gettext._translations.values()[0] + _translation = list(gettext._translations.values())[0] else: _translation = gettext.NullTranslations() @@ -97,7 +97,7 @@ def ngettext(s_sing, s_plural, n, replace_sing = None, replace_plural = None): In other words this is a hack to ngettext() to support %s %d etc.. """ - text = _translation.ungettext(s_sing, s_plural, n) + text = _translation.ngettext(s_sing, s_plural, n) if n == 1 and replace_sing is not None: text = text % replace_sing elif n > 1 and replace_plural is not None: diff --git a/src/common/idle.py b/src/common/idle.py index 5e1bf4c0fcfddf3bbf5abc8774f40a00af89cd02..9e475c47ddd507e5206b973bac5d52e69a3c17b1 100644 --- a/src/common/idle.py +++ b/src/common/idle.py @@ -68,7 +68,7 @@ try: rootwindow = libX11.XDefaultRootWindow(dpy_p) xss_available = True -except OSError, e: +except OSError: # Logging? xss_available = False @@ -94,6 +94,6 @@ def close(): if __name__ == '__main__': import time time.sleep(2.1) - print getIdleSec() + print(getIdleSec()) close() - print getIdleSec() + print(getIdleSec()) diff --git a/src/common/jingle.py b/src/common/jingle.py index e14c8d0424c736506d4c6846f73560e0f9026260..c9d64fe7057427ec5fe8464eb1751b8dc769e035 100644 --- a/src/common/jingle.py +++ b/src/common/jingle.py @@ -29,14 +29,14 @@ Handles the jingle signalling protocol # - codecs import nbxmpp -import helpers -import gajim +from common import helpers +from common import gajim -from jingle_session import JingleSession, JingleStates +from common.jingle_session import JingleSession, JingleStates if gajim.HAVE_FARSTREAM: - from jingle_rtp import JingleAudio, JingleVideo -from jingle_ft import JingleFileTransfer -from jingle_transport import JingleTransportSocks5, JingleTransportIBB + from common.jingle_rtp import JingleAudio, JingleVideo +from common.jingle_ft import JingleFileTransfer +from common.jingle_transport import JingleTransportSocks5, JingleTransportIBB import logging logger = logging.getLogger('gajim.c.jingle') @@ -80,7 +80,7 @@ class ConnectionJingle(object): try: jid = helpers.get_full_jid_from_iq(stanza) except helpers.InvalidFormat: - log.warn('Invalid JID: %s, ignoring it' % stanza.getFrom()) + logger.warn('Invalid JID: %s, ignoring it' % stanza.getFrom()) return id_ = stanza.getID() if (jid, id_) in self.__iq_responses.keys(): @@ -170,14 +170,14 @@ class ConnectionJingle(object): def __hash_support(self, contact): if contact.supports(nbxmpp.NS_HASHES): - if contact.supports(nbxmpp.NS_HASHES_MD5): - return 'md5' - elif contact.supports(nbxmpp.NS_HASHES_SHA1): - return 'sha-1' + if contact.supports(nbxmpp.NS_HASHES_SHA512): + return 'sha-512' elif contact.supports(nbxmpp.NS_HASHES_SHA256): return 'sha-256' - elif contact.supports(nbxmpp.NS_HASHES_SHA512): - return 'sha-512' + elif contact.supports(nbxmpp.NS_HASHES_SHA1): + return 'sha-1' + elif contact.supports(nbxmpp.NS_HASHES_MD5): + return 'md5' return None def iter_jingle_sessions(self, jid, sid=None, media=None): @@ -224,4 +224,3 @@ class ConnectionJingle(object): if session.peerjid == jid and session.get_content(media): return session return None - diff --git a/src/common/jingle_content.py b/src/common/jingle_content.py index 141677085f27c791498393bffae4e5d53152076d..2634957c64ba5d624bcb956118b5ceb47f485856 100644 --- a/src/common/jingle_content.py +++ b/src/common/jingle_content.py @@ -17,9 +17,12 @@ Handles Jingle contents (XEP 0166) """ -import gajim +import os +from common import gajim import nbxmpp -from jingle_transport import JingleTransportIBB +from common.jingle_transport import JingleTransportIBB +from .jingle_xtls import SELF_SIGNED_CERTIFICATE +from .jingle_xtls import load_cert_file contents = {} @@ -193,7 +196,7 @@ class JingleContent(object): else: # if the file is less than 10 mb, then it is small # lets calculate it right away - if int(self.file_props.size) < 10000000 and not \ + if self.file_props.size < 10000000 and not \ self.file_props.hash_: h = self._calcHash() file_tag.addChild(node=h) @@ -213,12 +216,18 @@ class JingleContent(object): if self.use_security: security = nbxmpp.simplexml.Node( tag=nbxmpp.NS_JINGLE_XTLS + ' security') - # TODO: add fingerprint element - for m in ('x509', ): # supported authentication methods - method = nbxmpp.simplexml.Node(tag='method') - method.setAttr('name', m) - security.addChild(node=method) - content.addChild(node=security) + certpath = os.path.join(gajim.MY_CERT_DIR, SELF_SIGNED_CERTIFICATE)\ + + '.cert' + cert = load_cert_file(certpath) + if cert: + digest_algo = cert.get_signature_algorithm().split('With')[0] + security.addChild('fingerprint').addData(cert.digest( + digest_algo)) + for m in ('x509', ): # supported authentication methods + method = nbxmpp.simplexml.Node(tag='method') + method.setAttr('name', m) + security.addChild(node=method) + content.addChild(node=security) content.addChild(node=description_node) def destroy(self): diff --git a/src/common/jingle_ft.py b/src/common/jingle_ft.py index 7d8e8245d27b415fdb132ef7d409ac636ffe5401..edd1d3284d5f1b6fbd0f65b3cf0a4740657db524 100644 --- a/src/common/jingle_ft.py +++ b/src/common/jingle_ft.py @@ -20,16 +20,17 @@ Handles Jingle File Transfer (XEP 0234) """ import hashlib -import gajim +from common import gajim import nbxmpp -from jingle_content import contents, JingleContent -from jingle_transport import * +from . import jingle_xtls +from common.jingle_content import contents, JingleContent +from common.jingle_transport import * from common import helpers from common.socks5 import Socks5ReceiverClient, Socks5SenderClient from common.connection_handlers_events import FileRequestReceivedEvent import threading import logging -from jingle_ftstates import * +from common.jingle_ftstates import * log = logging.getLogger('gajim.c.jingle_ft') STATE_NOT_STARTED = 0 @@ -68,6 +69,7 @@ class JingleFileTransfer(JingleContent): self.callbacks['transport-info'] += [self.__on_transport_info] self.callbacks['iq-result'] += [self.__on_iq_result] self.use_security = use_security + self.x509_fingerprint = None self.file_props = file_props self.weinitiate = self.session.weinitiate self.werequest = self.session.werequest @@ -95,8 +97,8 @@ class JingleFileTransfer(JingleContent): if gajim.contacts.is_gc_contact(session.connection.name, session.peerjid): roomjid = session.peerjid.split('/')[0] - dstaddr = hashlib.sha1('%s%s%s' % (self.file_props.sid, - session.ourjid, roomjid)).hexdigest() + dstaddr = hashlib.sha1(('%s%s%s' % (self.file_props.sid, + session.ourjid, roomjid)).encode('utf-8')).hexdigest() self.file_props.dstaddr = dstaddr self.state = STATE_NOT_STARTED self.states = {STATE_INITIALIZED : StateInitialized(self), @@ -149,12 +151,13 @@ class JingleFileTransfer(JingleContent): if self.file_props.algo == None: return try: - file_ = open(self.file_props.file_name, 'r') + file_ = open(self.file_props.file_name, 'rb') except: # can't open file return h = nbxmpp.Hashes() hash_ = h.calculateHash(self.file_props.algo, file_) + file_.close() # DEBUG #hash_ = '1294809248109223' if not hash_: @@ -164,17 +167,37 @@ class JingleFileTransfer(JingleContent): h.addHash(hash_, self.file_props.algo) return h + def on_cert_received(self): + self.session.approve_session() + self.session.approve_content('file', name=self.name) + def __on_session_accept(self, stanza, content, error, action): log.info("__on_session_accept") con = self.session.connection + # We ack the session accept + response = stanza.buildReply('result') + response.delChild(response.getQuery()) + con.connection.send(response) security = content.getTag('security') if not security: # responder can not verify our fingerprint self.use_security = False + else: + fingerprint = security.getTag('fingerprint') + if fingerprint: + fingerprint = fingerprint.getData() + self.x509_fingerprint = fingerprint + if not jingle_xtls.check_cert(gajim.get_jid_without_resource( + self.session.responder), fingerprint): + id_ = jingle_xtls.send_cert_request(con, + self.session.responder) + jingle_xtls.key_exchange_pend(id_, + self.continue_session_accept, [stanza]) + raise nbxmpp.NodeProcessed + self.continue_session_accept(stanza) + + def continue_session_accept(self, stanza): + con = self.session.connection if self.state == STATE_TRANSPORT_REPLACE: - # We ack the session accept - response = stanza.buildReply('result') - response.delChild(response.getQuery()) - con.connection.send(response) # If we are requesting we don't have the file if self.session.werequest: raise nbxmpp.NodeProcessed @@ -185,16 +208,13 @@ class JingleFileTransfer(JingleContent): # Calculate file hash in a new thread # if we haven't sent the hash already. if self.file_props.hash_ is None and self.file_props.algo and \ - not self.werequest: + not self.werequest: self.hashThread = threading.Thread(target=self.__send_hash) self.hashThread.start() for host in self.file_props.streamhosts: host['initiator'] = self.session.initiator host['target'] = self.session.responder host['sid'] = self.file_props.sid - response = stanza.buildReply('result') - response.delChild(response.getQuery()) - con.connection.send(response) fingerprint = None if self.use_security: fingerprint = 'client' @@ -203,7 +223,7 @@ class JingleFileTransfer(JingleContent): self.file_props.sid, self.on_connect, self._on_connect_error, fingerprint=fingerprint, receiving=False) - return + raise nbxmpp.NodeProcessed self.__state_changed(STATE_TRANSFERING) raise nbxmpp.NodeProcessed diff --git a/src/common/jingle_ftstates.py b/src/common/jingle_ftstates.py index 94d39a993cd91eec93d89a461da0330d41bca5d2..f7d894485e479b6a19502dabde916087c68f2254 100644 --- a/src/common/jingle_ftstates.py +++ b/src/common/jingle_ftstates.py @@ -13,9 +13,9 @@ ## You should have received a copy of the GNU General Public License ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. -import gajim +from common import gajim import nbxmpp -from jingle_transport import * +from common.jingle_transport import * from common.socks5 import Socks5ReceiverClient, Socks5SenderClient diff --git a/src/common/jingle_rtp.py b/src/common/jingle_rtp.py index 8df076f0ee30e1155ecca28ad11ee78dab8ee224..86bd35b325b2cad4ace964e74a0375cabd9994b0 100644 --- a/src/common/jingle_rtp.py +++ b/src/common/jingle_rtp.py @@ -19,19 +19,19 @@ Handles Jingle RTP sessions (XEP 0167) from collections import deque -import gobject +from gi.repository import GLib import socket import nbxmpp -import farstream, gst -import gst.interfaces +import farstream +import gst from glib import GError -import gajim +from common import gajim -from jingle_transport import JingleTransportICEUDP -from jingle_content import contents, JingleContent, JingleContentSetupException -from connection_handlers_events import InformationEvent +from common.jingle_transport import JingleTransportICEUDP +from common.jingle_content import contents, JingleContent, JingleContentSetupException +from common.connection_handlers_events import InformationEvent import logging @@ -66,7 +66,6 @@ class JingleRTPContent(JingleContent): # pipeline and bus self.pipeline = gst.Pipeline() bus = self.pipeline.get_bus() - bus.enable_sync_message_emission() bus.add_signal_watch() bus.connect('message', self._on_gst_message) @@ -90,8 +89,8 @@ class JingleRTPContent(JingleContent): try: ip = socket.getaddrinfo(stun_server, 0, socket.AF_UNSPEC, socket.SOCK_STREAM)[0][4][0] - except socket.gaierror, (errnum, errstr): - log.warn('Lookup of stun ip failed: %s' % errstr) + except socket.gaierror as e: + log.warning('Lookup of stun ip failed: %s' % str(e)) else: params['stun-ip'] = ip @@ -108,13 +107,13 @@ class JingleRTPContent(JingleContent): try: bin = gst.parse_bin_from_description(pipeline, True) return bin - except GError, error_str: + except GError as e: gajim.nec.push_incoming_event(InformationEvent(None, conn=self.session.connection, level='error', pri_txt=_('%s configuration error') % text.capitalize(), sec_txt=_("Couldn't setup %s. Check your configuration.\n\n" "Pipeline was:\n%s\n\nError was:\n%s") % (text, pipeline, - error_str))) + str(e)))) raise JingleContentSetupException def add_remote_candidates(self, candidates): @@ -133,13 +132,13 @@ class JingleRTPContent(JingleContent): events = deque(events) self._dtmf_running = True self._start_dtmf(events.popleft()) - gobject.timeout_add(500, self._next_dtmf, events) + GLib.timeout_add(500, self._next_dtmf, events) def _next_dtmf(self, events): self._stop_dtmf() if events: self._start_dtmf(events.popleft()) - gobject.timeout_add(500, self._next_dtmf, events) + GLib.timeout_add(500, self._next_dtmf, events) else: self._dtmf_running = False @@ -370,11 +369,8 @@ class JingleAudio(JingleRTPContent): class JingleVideo(JingleRTPContent): - def __init__(self, session, transport=None, in_xid=0, out_xid=0): + def __init__(self, session, transport=None): JingleRTPContent.__init__(self, session, 'video', transport) - self.in_xid = in_xid - self.out_xid = out_xid - self.out_xid_set = False self.setup_stream() def setup_stream(self): @@ -382,8 +378,6 @@ class JingleVideo(JingleRTPContent): # sometimes, one window won't show up, # sometimes it'll freeze... JingleRTPContent.setup_stream(self, self._on_src_pad_added) - bus = self.pipeline.get_bus() - bus.connect('sync-message::element', self._on_sync_message) # the local parts if gajim.config.get('video_framerate'): @@ -399,25 +393,17 @@ class JingleVideo(JingleRTPContent): video_size = 'video/x-raw-yuv,width=%s,height=%s ! ' % (w, h) else: video_size = '' - if gajim.config.get('video_see_self'): - tee = '! tee name=t ! queue ! videoscale ! ' + \ - 'video/x-raw-yuv,width=160,height=120 ! ffmpegcolorspace ! ' + \ - '%s t. ! queue ' % gajim.config.get( - 'video_output_device') - else: - tee = '' - self.src_bin = self.make_bin_from_config('video_input_device', - '%%s %s! %svideoscale ! %sffmpegcolorspace' % (tee, framerate, - video_size), _("video input")) - + '%%s ! %svideoscale ! %sffmpegcolorspace' % (framerate, video_size), + _("video input")) + #caps = gst.element_factory_make('capsfilter') + #caps.set_property('caps', gst.caps_from_string('video/x-raw-yuv, width=320, height=240')) self.pipeline.add(self.src_bin)#, caps) - self.pipeline.set_state(gst.STATE_PLAYING) #src_bin.link(caps) self.sink = self.make_bin_from_config('video_output_device', - 'videoscale ! ffmpegcolorspace ! %s', + 'videoscale ! ffmpegcolorspace ! %s force-aspect-ratio=True', _("video output")) self.pipeline.add(self.sink) @@ -427,27 +413,11 @@ class JingleVideo(JingleRTPContent): # The following is needed for farstream to process ICE requests: self.pipeline.set_state(gst.STATE_PLAYING) - def _on_sync_message(self, bus, message): - if message.structure is None: - return False - if message.structure.get_name() == 'prepare-xwindow-id': - message.src.set_property('force-aspect-ratio', True) - imagesink = message.src - if gajim.config.get('video_see_self') and not self.out_xid_set: - imagesink.set_xwindow_id(self.out_xid) - self.out_xid_set = True - else: - imagesink.set_xwindow_id(self.in_xid) - def get_fallback_src(self): # TODO: Use avatar? pipeline = 'videotestsrc is-live=true ! video/x-raw-yuv,framerate=10/1 ! ffmpegcolorspace' return gst.parse_bin_from_description(pipeline, True) - def destroy(self): - JingleRTPContent.destroy(self) - self.pipeline.get_bus().disconnect_by_func(self._on_sync_message) - def get_content(desc): if desc['media'] == 'audio': return JingleAudio diff --git a/src/common/jingle_session.py b/src/common/jingle_session.py index f497a453cffefa908b5670011fcddaab5d508829..7652e88685d0121557805b1fe49cc24b7df30eda 100644 --- a/src/common/jingle_session.py +++ b/src/common/jingle_session.py @@ -28,12 +28,12 @@ Handles Jingle sessions (XEP 0166) # - Tie-breaking # * timeout -import gajim #Get rid of that? +from common import gajim import nbxmpp -from jingle_transport import get_jingle_transport, JingleTransportIBB -from jingle_content import get_jingle_content, JingleContentSetupException -from jingle_content import JingleContent -from jingle_ft import STATE_TRANSPORT_REPLACE +from common.jingle_transport import get_jingle_transport, JingleTransportIBB +from common.jingle_content import get_jingle_content, JingleContentSetupException +from common.jingle_content import JingleContent +from common.jingle_ft import STATE_TRANSPORT_REPLACE from common.connection_handlers_events import * import logging log = logging.getLogger("gajim.c.jingle_session") @@ -75,7 +75,6 @@ class JingleSession(object): self.contents = {} # negotiated contents self.connection = con # connection to use # our full jid - #FIXME: Get rid of gajim here? self.ourjid = gajim.get_jid_from_account(self.connection.name) if con.server_resource: self.ourjid = self.ourjid + '/' + con.server_resource @@ -273,8 +272,8 @@ class JingleSession(object): """ Return True when all codecs and candidates are ready (for all contents) """ - return (any((content.is_ready() for content in self.contents.itervalues())) - and self.accepted) + return (any((content.is_ready() for content in self.contents.values())) + and self.accepted) def accept_session(self): """ @@ -592,7 +591,7 @@ class JingleSession(object): """ Broadcast the stanza to all content handlers """ - for content in self.contents.itervalues(): + for content in self.contents.values(): content.on_stanza(stanza, None, error, action) def __parse_contents(self, jingle): diff --git a/src/common/jingle_transport.py b/src/common/jingle_transport.py index b8c0f2016825b35ef7701256dd6a22f83c1eca09..5f6f8b7c0c1de4caecec365e233d0c442c087167 100644 --- a/src/common/jingle_transport.py +++ b/src/common/jingle_transport.py @@ -156,7 +156,8 @@ class JingleTransportSocks5(JingleTransport): candidates.append(cand) # we need this when we construct file_props on session-initiation - self.remote_candidates = candidates + if candidates: + self.remote_candidates = candidates return candidates @@ -177,30 +178,39 @@ class JingleTransportSocks5(JingleTransport): return if not self.connection: return - local_ip_cand = [] port = int(gajim.config.get('file_transfers_port')) #type preference of connection type. XEP-0260 section 2.2 type_preference = 126 - c = {'host': self.connection.peerhost[0]} - c['candidate_id'] = self.connection.connection.getAnID() - c['port'] = port - c['type'] = 'direct' - c['jid'] = self.ourjid - c['priority'] = (2**16) * type_preference + priority = (2**16) * type_preference + + hosts = set() + local_ip_cand = [] + c = {'host': self.connection.peerhost[0], + 'candidate_id': self.connection.connection.getAnID(), + 'port': port, + 'type': 'direct', + 'jid': self.ourjid, + 'priority': priority} + hosts.add(self.connection.peerhost[0]) local_ip_cand.append(c) - for addr in socket.getaddrinfo(socket.gethostname(), None): - if not addr[4][0] in local_ip_cand and not addr[4][0].startswith('127'): - c = {'host': addr[4][0]} - c['candidate_id'] = self.connection.connection.getAnID() - c['port'] = port - c['type'] = 'direct' - c['jid'] = self.ourjid - c['priority'] = (2**16) * type_preference - c['initiator'] = self.file_props.sender - c['target'] = self.file_props.receiver - local_ip_cand.append(c) + try: + for addrinfo in socket.getaddrinfo(socket.gethostname(), None): + addr = addrinfo[4][0] + if not addr in hosts and not addr.startswith('127'): + c = {'host': addr, + 'candidate_id': self.connection.connection.getAnID(), + 'port': port, + 'type': 'direct', + 'jid': self.ourjid, + 'priority': priority, + 'initiator': self.file_props.sender, + 'target': self.file_props.receiver} + hosts.add(addr) + local_ip_cand.append(c) + except socket.gaierror: + pass # ignore address-related errors for getaddrinfo self._add_candidates(local_ip_cand) @@ -208,6 +218,7 @@ class JingleTransportSocks5(JingleTransport): if not self.connection: return type_preference = 126 + priority = (2**16) * type_preference additional_ip_cand = [] port = int(gajim.config.get('file_transfers_port')) ft_add_hosts = gajim.config.get('ft_add_hosts_to_send') @@ -215,14 +226,14 @@ class JingleTransportSocks5(JingleTransport): if ft_add_hosts: hosts = [e.strip() for e in ft_add_hosts.split(',')] for h in hosts: - c = {'host': h} - c['candidate_id'] = self.connection.connection.getAnID() - c['port'] = port - c['type'] = 'direct' - c['jid'] = self.ourjid - c['priority'] = (2**16) * type_preference - c['initiator'] = self.file_props.sender - c['target'] = self.file_props.receiver + c = {'host': h, + 'candidate_id': self.connection.connection.getAnID(), + 'port': port, + 'type': 'direct', + 'jid': self.ourjid, + 'priority': priority, + 'initiator': self.file_props.sender, + 'target': self.file_props.receiver} additional_ip_cand.append(c) self._add_candidates(additional_ip_cand) @@ -231,6 +242,7 @@ class JingleTransportSocks5(JingleTransport): if not self.connection: return type_preference = 10 + priority = (2**16) * type_preference proxy_cand = [] socks5conn = self.connection proxyhosts = socks5conn._get_file_transfer_proxies_from_config(self.file_props) @@ -239,14 +251,14 @@ class JingleTransportSocks5(JingleTransport): self.file_props.proxyhosts = proxyhosts for proxyhost in proxyhosts: - c = {'host': proxyhost['host']} - c['candidate_id'] = self.connection.connection.getAnID() - c['port'] = int(proxyhost['port']) - c['type'] = 'proxy' - c['jid'] = proxyhost['jid'] - c['priority'] = (2**16) * type_preference - c['initiator'] = self.file_props.sender - c['target'] = self.file_props.receiver + c = {'host': proxyhost['host'], + 'candidate_id': self.connection.connection.getAnID(), + 'port': int(proxyhost['port']), + 'type': 'proxy', + 'jid': proxyhost['jid'], + 'priority': priority, + 'initiator': self.file_props.sender, + 'target': self.file_props.receiver} proxy_cand.append(c) self._add_candidates(proxy_cand) @@ -298,7 +310,7 @@ class JingleTransportSocks5(JingleTransport): cid = host['candidate_id'] break if cid is None: - raise Exception, 'cid is missing' + raise Exception('cid is missing') activated.setAttr('cid', cid) transport.addChild(node=activated) content.addChild(node=transport) @@ -331,6 +343,7 @@ class JingleTransportIBB(JingleTransport): return transport try: + raise ImportError import farstream except Exception: pass @@ -402,7 +415,7 @@ class JingleTransportICEUDP(JingleTransport): if 'type' in candidate and candidate['type'] in types: cand.type = types[candidate['type']] else: - print 'Unknown type %s', candidate['type'] + print('Unknown type %s' % candidate['type']) candidates.append(cand) self.remote_candidates.extend(candidates) return candidates diff --git a/src/common/jingle_xtls.py b/src/common/jingle_xtls.py index ec0fb957cb239e4fb610691d4cc52b9adec10bba..a5514025284f302198b9d40b8e967986b8d2214f 100644 --- a/src/common/jingle_xtls.py +++ b/src/common/jingle_xtls.py @@ -20,21 +20,22 @@ import os import nbxmpp import logging -import common from common import gajim log = logging.getLogger('gajim.c.jingle_xtls') PYOPENSSL_PRESENT = False -pending_contents = {} # key-exchange id -> session, accept that session once key-exchange completes +# key-exchange id -> [callback, args], accept that session once key-exchange completes +pending_contents = {} -def key_exchange_pend(id_, content): - pending_contents[id_] = content +def key_exchange_pend(id_, cb, args): + # args is a list + pending_contents[id_] = [cb, args] def approve_pending_content(id_): - content = pending_contents[id_] - content.session.approve_session() - content.session.approve_content('file', name=content.name) + cb = pending_contents[id_][0] + args = pending_contents[id_][1] + cb(*args) try: import OpenSSL.SSL @@ -50,23 +51,25 @@ if PYOPENSSL_PRESENT: TYPE_DSA = crypto.TYPE_DSA SELF_SIGNED_CERTIFICATE = 'localcert' +DH_PARAMS = 'dh_params.pem' +DEFAULT_DH_PARAMS = 'dh4096.pem' def default_callback(connection, certificate, error_num, depth, return_code): log.info("certificate: %s" % certificate) return return_code -def load_cert_file(cert_path, cert_store): +def load_cert_file(cert_path, cert_store=None): """ This is almost identical to the one in nbxmpp.tls_nb """ if not os.path.isfile(cert_path): - return + return None try: f = open(cert_path) - except IOError, e: + except IOError as e: log.warning('Unable to open certificate file %s: %s' % (cert_path, str(e))) - return + return None lines = f.readlines() i = 0 begin = -1 @@ -78,8 +81,10 @@ def load_cert_file(cert_path, cert_store): try: x509cert = OpenSSL.crypto.load_certificate( OpenSSL.crypto.FILETYPE_PEM, cert) - cert_store.add_cert(x509cert) - except OpenSSL.crypto.Error, exception_obj: + if cert_store: + cert_store.add_cert(x509cert) + return x509cert + except OpenSSL.crypto.Error as exception_obj: log.warning('Unable to load a certificate from file %s: %s' %\ (cert_path, exception_obj.args[0][0][2])) except: @@ -87,13 +92,15 @@ def load_cert_file(cert_path, cert_store): '%s' % cert_path) begin = -1 i += 1 + f.close() -def get_context(fingerprint, verify_cb=None): +def get_context(fingerprint, verify_cb=None, remote_jid=None): """ constructs and returns the context objects """ ctx = SSL.Context(SSL.SSLv23_METHOD) - flags = (SSL.OP_NO_SSLv2 | SSL.OP_NO_SSLv3 | SSL.OP_SINGLE_DH_USE) + flags = (SSL.OP_NO_SSLv2 | SSL.OP_NO_SSLv3 | SSL.OP_SINGLE_DH_USE \ + | SSL.OP_NO_TICKET) ctx.set_options(flags) ctx.set_cipher_list('HIGH:!aNULL:!3DES') @@ -106,22 +113,46 @@ def get_context(fingerprint, verify_cb=None): cert_name = os.path.join(gajim.MY_CERT_DIR, SELF_SIGNED_CERTIFICATE) ctx.use_privatekey_file (cert_name + '.pkey') ctx.use_certificate_file(cert_name + '.cert') - store = ctx.get_cert_store() - for f in os.listdir(os.path.expanduser(gajim.MY_PEER_CERTS_PATH)): - load_cert_file(os.path.join(os.path.expanduser( - gajim.MY_PEER_CERTS_PATH), f), store) - log.debug('certificate file ' + f + ' loaded fingerprint ' + \ - fingerprint) + + # Try to load Diffie-Hellman parameters. + # First try user DH parameters, if this fails load the default DH parameters + dh_params_name = os.path.join(gajim.MY_CERT_DIR, DH_PARAMS) + try: + with open(dh_params_name, "r") as dh_params_file: + ctx.load_tmp_dh(str(dh_params_name).encode('utf-8')) + except IOError as err: + default_dh_params_name = os.path.join(common.gajim.DATA_DIR, + 'other', DEFAULT_DH_PARAMS) + try: + with open(default_dh_params_name, "r") as default_dh_params_file: + ctx.load_tmp_dh(str(default_dh_params_name).encode('utf-8')) + except IOError as err: + log.error('Unable to load default DH parameter file: %s , %s' + % (default_dh_params_name, err)) + raise + + if remote_jid: + store = ctx.get_cert_store() + path = os.path.join(os.path.expanduser(gajim.MY_PEER_CERTS_PATH), + remote_jid) + '.cert' + if os.path.exists(path): + load_cert_file(path, cert_store=store) + log.debug('certificate file ' + path + ' loaded fingerprint ' + \ + fingerprint) return ctx +def read_cert(certpath): + certificate = '' + with open(certpath, 'r') as certfile: + for line in certfile.readlines(): + if not line.startswith('-'): + certificate += line + return certificate + def send_cert(con, jid_from, sid): certpath = os.path.join(gajim.MY_CERT_DIR, SELF_SIGNED_CERTIFICATE) + \ '.cert' - certfile = open(certpath, 'r') - certificate = '' - for line in certfile.readlines(): - if not line.startswith('-'): - certificate += line + certificate = read_cert(certpath) iq = nbxmpp.Iq('result', to=jid_from); iq.setAttr('id', sid) @@ -151,9 +182,21 @@ def handle_new_cert(con, obj, jid_from): f.write('-----BEGIN CERTIFICATE-----\n') f.write(cert) f.write('-----END CERTIFICATE-----\n') + f.close() approve_pending_content(id_) +def check_cert(jid, fingerprint): + certpath = os.path.join(os.path.expanduser(gajim.MY_PEER_CERTS_PATH), jid) + certpath += '.cert' + if os.path.exists(certpath): + cert = load_cert_file(certpath) + if cert: + digest_algo = cert.get_signature_algorithm().split('With')[0] + if cert.digest(digest_algo) == fingerprint: + return True + return False + def send_cert_request(con, to_jid): iq = nbxmpp.Iq('get', to=to_jid) id_ = con.connection.getAnID() @@ -161,7 +204,7 @@ def send_cert_request(con, to_jid): pubkey = iq.setTag('pubkeys') pubkey.setNamespace(nbxmpp.NS_PUBKEY_PUBKEY) con.connection.send(iq) - return unicode(id_) + return str(id_) # the following code is partly due to pyopenssl examples @@ -177,12 +220,12 @@ def createKeyPair(type, bits): pkey.generate_key(type, bits) return pkey -def createCertRequest(pkey, digest="sha1", **name): +def createCertRequest(pkey, digest="sha256", **name): """ Create a certificate request. Arguments: pkey - The key to associate with the request - digest - Digestion method to use for signing, default is sha1 + digest - Digestion method to use for signing, default is sha256 **name - The name of the subject of the request, possible arguments are: C - Country name @@ -204,7 +247,7 @@ def createCertRequest(pkey, digest="sha1", **name): req.sign(pkey, digest) return req -def createCertificate(req, (issuerCert, issuerKey), serial, (notBefore, notAfter), digest="sha1"): +def createCertificate(req, issuerCert, issuerKey, serial, notBefore, notAfter, digest="shai256"): """ Generate a certificate given a certificate request. @@ -216,7 +259,7 @@ def createCertificate(req, (issuerCert, issuerKey), serial, (notBefore, notAfter starts being valid notAfter - Timestamp (relative to now) when the certificate stops being valid - digest - Digest method to use for signing, default is sha1 + digest - Digest method to use for signing, default is sha256 Returns: The signed certificate in an X509 object """ cert = crypto.X509() @@ -238,13 +281,13 @@ def make_certs(filepath, CN): """ key = createKeyPair(TYPE_RSA, 4096) req = createCertRequest(key, CN=CN) - cert = createCertificate(req, (req, key), 0, (0, 60*60*24*365*5)) # five years - private_key_file = open(filepath + '.pkey', 'w') - os.chmod(filepath + '.pkey', 0600) - private_key_file.write(crypto.dump_privatekey( - crypto.FILETYPE_PEM, key)) - open(filepath + '.cert', 'w').write(crypto.dump_certificate( - crypto.FILETYPE_PEM, cert)) + cert = createCertificate(req, req, key, 0, 0, 60*60*24*365*5) # five years + with open(filepath + '.pkey', 'wb') as f: + os.chmod(filepath + '.pkey', 0o600) + f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, key)) + with open(filepath + '.cert', 'wb') as f: + f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert).decode( + 'utf-8')) if __name__ == '__main__': diff --git a/src/common/kwalletbinding.py b/src/common/kwalletbinding.py index af320c2f865bf9770a292584b7f109a8b07c661e..750f3c8c15fbfac3e42f3f7369daf71ce9e0182f 100644 --- a/src/common/kwalletbinding.py +++ b/src/common/kwalletbinding.py @@ -46,14 +46,14 @@ def kwallet_get(folder, entry): • folder: The top-level category to use (normally the programme name) • entry: The key of the entry to retrieve - Returns the passphrase as unicode, False if it cannot be found, + Returns the passphrase, False if it cannot be found, or None if an error occured. """ p = subprocess.Popen(["kwalletcli", "-q", "-f", folder.encode('utf-8'), "-e", entry.encode('utf-8')], stdout=subprocess.PIPE) pw = p.communicate()[0] if p.returncode == 0: - return unicode(pw.decode('utf-8')) + return pw if p.returncode == 1 or p.returncode == 4: # ENOENT return False diff --git a/src/common/logger.py b/src/common/logger.py index c49fd70432f26306f7748ee2096d95a7d7531506..8fb2cf714bc9db03b4e02161aa8b8a2447dcd6b4 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -33,16 +33,16 @@ import sys import time import datetime from gzip import GzipFile -from cStringIO import StringIO -import gobject +from io import BytesIO +from gi.repository import GLib -import exceptions -import gajim -import ged +from common import exceptions +from common import gajim +from common import ged import sqlite3 as sqlite -import configpaths +from common import configpaths LOG_DB_PATH = configpaths.gajimpaths['LOG_DB'] LOG_DB_FOLDER, LOG_DB_FILE = os.path.split(LOG_DB_PATH) CACHE_DB_PATH = configpaths.gajimpaths['CACHE_DB'] @@ -151,7 +151,7 @@ class Logger: try: self.cur.execute("ATTACH DATABASE '%s' AS cache" % \ CACHE_DB_PATH.replace("'", "''")) - except sqlite.Error, e: + except sqlite.Error as e: log.debug("Failed to attach cache database: %s" % str(e)) def set_synchronous(self, sync): @@ -160,7 +160,7 @@ class Logger: self.cur.execute("PRAGMA synchronous = NORMAL") else: self.cur.execute("PRAGMA synchronous = OFF") - except sqlite.Error, e: + except sqlite.Error as e: log.debug("Failed to set_synchronous(%s): %s" % (sync, str(e))) def init_vars(self): @@ -170,15 +170,15 @@ class Logger: def _really_commit(self): try: self.con.commit() - except sqlite.OperationalError, e: - print >> sys.stderr, str(e) + except sqlite.OperationalError as e: + print(str(e), file=sys.stderr) self.commit_timout_id = None return False def _timeout_commit(self): if self.commit_timout_id: return - self.commit_timout_id = gobject.timeout_add(500, self._really_commit) + self.commit_timout_id = GLib.timeout_add(500, self._really_commit) def simple_commit(self, sql_to_commit): """ @@ -190,7 +190,7 @@ class Logger: def get_jids_already_in_db(self): try: self.cur.execute('SELECT jid FROM jids') - # list of tupples: [(u'aaa@bbb',), (u'cc@dd',)] + # list of tupples: [('aaa@bbb',), ('cc@dd',)] rows = self.cur.fetchall() except sqlite.DatabaseError: raise exceptions.DatabaseMalformed @@ -258,11 +258,11 @@ class Logger: self.cur.execute('INSERT INTO jids (jid, type) VALUES (?, ?)', (jid, typ)) self.con.commit() - except sqlite.IntegrityError, e: + except sqlite.IntegrityError: # Jid already in DB, maybe added by another instance. re-read DB self.get_jids_already_in_db() return self.get_jid_id(jid, typestr) - except sqlite.OperationalError, e: + except sqlite.OperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) jid_id = self.cur.lastrowid self.jids_already_in.append(jid) @@ -413,15 +413,15 @@ class Logger: self.cur.execute(sql, values) except sqlite.DatabaseError: raise exceptions.DatabaseMalformed - except sqlite.OperationalError, e: + except sqlite.OperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) message_id = None if write_unread: try: self.con.commit() message_id = self.cur.lastrowid - except sqlite.OperationalError, e: - print >> sys.stderr, str(e) + except sqlite.OperationalError as e: + print(str(e), file=sys.stderr) else: self._timeout_commit() if message_id: @@ -528,7 +528,7 @@ class Logger: # status for roster items try: jid_id = self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) if show is None: # show is None (xmpp), but we say that 'online' show_col = constants.SHOW_ONLINE @@ -541,7 +541,7 @@ class Logger: try: # re-get jid_id for the new jid jid_id = self.get_jid_id(jid, 'ROOM') - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) contact_name_col = nick @@ -555,13 +555,13 @@ class Logger: try: # re-get jid_id for the new jid jid_id = self.get_jid_id(jid, 'ROOM') - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) contact_name_col = nick else: try: jid_id = self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) if kind == 'chat_msg_recv': if not self.jid_is_from_pm(jid): @@ -586,7 +586,7 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError: # Error trying to create a new jid_id. This means there is no log return [] where_sql, jid_tuple = self._build_contact_where(account, jid) @@ -630,7 +630,7 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError: # Error trying to create a new jid_id. This means there is no log return [] where_sql, jid_tuple = self._build_contact_where(account, jid) @@ -659,14 +659,14 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError: # Error trying to create a new jid_id. This means there is no log return [] if False: # query.startswith('SELECT '): # it's SQL query (FIXME) try: self.cur.execute(query) - except sqlite.OperationalError, e: + except sqlite.OperationalError as e: results = [('', '', '', '', str(e))] return results @@ -700,7 +700,7 @@ class Logger: """ try: self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError: # Error trying to create a new jid_id. This means there is no log return [] days_with_logs = [] @@ -742,7 +742,7 @@ class Logger: else: try: jid_id = self.get_jid_id(jid, 'ROOM') - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError: # Error trying to create a new jid_id. This means there is no log return None where_sql = 'jid_id = ?' @@ -768,7 +768,7 @@ class Logger: """ try: jid_id = self.get_jid_id(jid, 'ROOM') - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError: # Error trying to create a new jid_id. This means there is no log return None where_sql = 'jid_id = %s' % jid_id @@ -808,7 +808,7 @@ class Logger: for user in family: try: jid_id = self.get_jid_id(user['jid']) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError: continue where_sql += 'jid_id = ?' jid_tuple += (jid_id,) @@ -890,8 +890,7 @@ class Logger: # ..., 'FEAT', feature1, feature2, ...).join(' ')) # NOTE: if there's a need to do more gzip, put that to a function try: - data = GzipFile(fileobj=StringIO(str(data))).read().decode( - 'utf-8').split('\0') + data = GzipFile(fileobj=BytesIO(data)).read().decode('utf-8').split('\0') except IOError: # This data is corrupted. It probably contains non-ascii chars to_be_removed.append((hash_method, hash_)) @@ -931,16 +930,15 @@ class Logger: data.extend(features) data = '\0'.join(data) # if there's a need to do more gzip, put that to a function - string = StringIO() + string = BytesIO() gzip = GzipFile(fileobj=string, mode='w') - data = data.encode('utf-8') # the gzip module can't handle unicode objects - gzip.write(data) + gzip.write(data.encode('utf-8')) gzip.close() data = string.getvalue() self.cur.execute(''' INSERT INTO caps_cache ( hash_method, hash, data, last_seen ) VALUES (?, ?, ?, ?); - ''', (hash_method, hash_, buffer(data), int(time.time()))) + ''', (hash_method, hash_, memoryview(data), int(time.time()))) # (1) -- note above self._timeout_commit() @@ -996,7 +994,7 @@ class Logger: try: account_jid_id = self.get_jid_id(account_jid) jid_id = self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) self.cur.execute( 'DELETE FROM roster_group WHERE account_jid_id=? AND jid_id=?', @@ -1018,7 +1016,7 @@ class Logger: try: account_jid_id = self.get_jid_id(account_jid) jid_id = self.get_jid_id(jid) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: raise exceptions.PysqliteOperationalError(str(e)) # Update groups information @@ -1054,6 +1052,8 @@ class Logger: FROM roster_entry re, jids j WHERE re.account_jid_id=? AND j.jid_id=re.jid_id''', (account_jid_id,)) for jid, jid_id, name, subscription, ask in self.cur: + jid = jid + name = name data[jid] = {} if name: data[jid]['name'] = name @@ -1077,6 +1077,7 @@ class Logger: WHERE account_jid_id=? AND jid_id=?''', (account_jid_id, data[jid]['id'])) for (group_name,) in self.cur: + group_name = group_name data[jid]['groups'].append(group_name) del data[jid]['id'] @@ -1155,7 +1156,7 @@ class Logger: # when we quit this muc obj.conn.last_history_time[obj.jid] = tim_f - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: obj.conn.dispatch('DB_ERROR', (_('Disk Write Error'), str(e))) except exceptions.DatabaseMalformed: pritext = _('Database Error') diff --git a/src/common/logging_helpers.py b/src/common/logging_helpers.py index 85ec8b1692230d8bb0adae3ad09f30dca1f6c1dc..ec5dfe70dfc44bbbce3268eaa236c6ae501875f6 100644 --- a/src/common/logging_helpers.py +++ b/src/common/logging_helpers.py @@ -19,7 +19,7 @@ ## import logging -import i18n +from common import i18n def parseLogLevel(arg): """ @@ -30,7 +30,7 @@ def parseLogLevel(arg): elif arg.isupper() and hasattr(logging, arg): return getattr(logging, arg) else: - print _('%s is not a valid loglevel') % repr(arg) + print(_('%s is not a valid loglevel') % repr(arg)) return 0 def parseLogTarget(arg): @@ -72,7 +72,7 @@ def parseAndSetLogLevels(arg): target = parseLogTarget(target.strip()) if target: logging.getLogger(target).setLevel(level) - print "Logger %s level set to %d" % (target, level) + print("Logger %s level set to %d" % (target, level)) class colors: @@ -141,7 +141,7 @@ def init(use_color=False): consoleloghandler.setFormatter( FancyFormatter( '%(asctime)s %(levelname)s %(name)s %(message)s', - '%H:%M:%S', + '%x %H:%M:%S', use_color ) ) @@ -179,13 +179,13 @@ if __name__ == '__main__': log = logging.getLogger('gajim') log.debug('debug') log.info('info') - log.warn('warn') + log.warning('warn') log.error('error') log.critical('critical') log = logging.getLogger('gajim.c.x.dispatcher') log.debug('debug') log.info('info') - log.warn('warn') + log.warning('warn') log.error('error') log.critical('critical') diff --git a/src/common/message_archiving.py b/src/common/message_archiving.py index 5a5388f63327bba8257718af1d4869f91fb04a49..69cf9a21d17af1872ec708e99d6ee8cd48fdac2c 100644 --- a/src/common/message_archiving.py +++ b/src/common/message_archiving.py @@ -96,7 +96,7 @@ class ConnectionArchive: def get_item_pref(self, jid): jid = nbxmpp.JID(jid) - if unicode(jid) in self.items: + if str(jid) in self.items: return self.items[jid] if jid.getStripped() in self.items: diff --git a/src/common/multimedia_helpers.py b/src/common/multimedia_helpers.py index 3c8798cbd090d436873efc7fde35d59515c34e73..5968b84a7f1b3ee44f41eb18761a95d141e3b9b7 100644 --- a/src/common/multimedia_helpers.py +++ b/src/common/multimedia_helpers.py @@ -52,7 +52,7 @@ class DeviceManager(object): except ImportError: pass except gst.ElementNotFoundError: - print 'element \'%s\' not found' % name + print('element \'%s\' not found' % name) class AudioInputManager(DeviceManager): diff --git a/src/common/nec.py b/src/common/nec.py index eb4fdccf0821c539b104e21a57a2d399ea625ade..b699085c13c3c8cfe10205a22643646494f3957f 100644 --- a/src/common/nec.py +++ b/src/common/nec.py @@ -153,7 +153,7 @@ class NetworkEvent(object): return True def _set_kwargs_as_attributes(self, **kwargs): - for k, v in kwargs.iteritems(): + for k, v in kwargs.items(): setattr(self, k, v) diff --git a/src/common/optparser.py b/src/common/optparser.py index f4ea78355fcc4e4793a82569879062a224908a3c..9033303fd2a91ce9e6ae5129f3ca55bd75e6dbee 100644 --- a/src/common/optparser.py +++ b/src/common/optparser.py @@ -36,7 +36,7 @@ from common import helpers from common import caps_cache import sqlite3 as sqlite -import logger +from common import logger class OptionsParser: def __init__(self, filename): @@ -50,7 +50,8 @@ class OptionsParser: except Exception: if os.path.exists(self.__filename): #we talk about a file - print _('Error: cannot open %s for reading') % self.__filename + print(_('Error: cannot open %s for reading') % self.__filename, + file=sys.stderr) return False new_version = gajim.config.get('version') @@ -59,10 +60,6 @@ class OptionsParser: regex = re.compile(r"(?P<optname>[^.]+)(?:(?:\.(?P<key>.+))?\.(?P<subname>[^.]+))?\s=\s(?P<value>.*)") for line in fd: - try: - line = line.decode('utf-8') - except UnicodeDecodeError: - line = line.decode(locale.getpreferredencoding()) optname, key, subname, value = regex.match(line).groups() if key is None: self.old_values[optname] = value @@ -86,19 +83,12 @@ class OptionsParser: if value is None: return # convert to utf8 before writing to file if needed - if isinstance(value, unicode): - value = value.encode('utf-8') - else: - value = str(value) - if isinstance(opt, unicode): - opt = opt.encode('utf-8') + value = str(value) s = '' if parents: if len(parents) == 1: return for p in parents: - if isinstance(p, unicode): - p = p.encode('utf-8') s += p + '.' s += opt fd.write(s + ' = ' + value + '\n') @@ -108,11 +98,11 @@ class OptionsParser: self.__tempfile = os.path.join(base_dir, '.' + filename) try: f = open(self.__tempfile, 'w') - except IOError, e: + except IOError as e: return str(e) try: gajim.config.foreach(self.write_line, f) - except IOError, e: + except IOError as e: return str(e) f.flush() os.fsync(f.fileno()) @@ -126,9 +116,9 @@ class OptionsParser: pass try: os.rename(self.__tempfile, self.__filename) - except IOError, e: + except IOError as e: return str(e) - os.chmod(self.__filename, 0600) + os.chmod(self.__filename, 0o600) def update_config(self, old_version, new_version): old_version_list = old_version.split('.') # convert '0.x.y' to (0, x, y) @@ -381,7 +371,7 @@ class OptionsParser: """ Apply indeces to the logs database """ - print _('migrating logs database to indices') + print(_('migrating logs database to indices')) # FIXME see #2812 back = os.getcwd() os.chdir(logger.LOG_DB_FOLDER) @@ -654,7 +644,7 @@ class OptionsParser: ''' ) con.commit() - except sqlite.OperationalError, e: + except sqlite.OperationalError: pass con.close() gajim.config.set('version', '0.11.4.4') @@ -714,7 +704,7 @@ class OptionsParser: """ dirs = ['../data', gajim.gajimpaths.data_root, gajim.DATA_DIR] if os.name != 'nt': - dirs.append(os.path.expanduser(u'~/.gajim')) + dirs.append(os.path.expanduser('~/.gajim')) for evt in gajim.config.get_per('soundevents'): path = gajim.config.get_per('soundevents', evt, 'path') # absolute and relative passes are necessary diff --git a/src/common/passwords.py b/src/common/passwords.py index 84822bf5a591c50cbb7ea14b1eed95d8357fc0be..aa9079eda868335bdeb838ac2946d8b034334614 100644 --- a/src/common/passwords.py +++ b/src/common/passwords.py @@ -29,11 +29,12 @@ __all__ = ['get_password', 'save_password'] import warnings from common import gajim from common import kwalletbinding +from common.exceptions import GnomeKeyringError USER_HAS_GNOMEKEYRING = False USER_USES_GNOMEKEYRING = False USER_HAS_KWALLETCLI = False -gnomekeyring = None +GnomeKeyring = None class PasswordStorage(object): def get_password(self, account_name): @@ -61,13 +62,15 @@ class SimplePasswordStorage(PasswordStorage): class GnomePasswordStorage(PasswordStorage): def __init__(self): - self.keyring = gnomekeyring.get_default_keyring_sync() + (err, self.keyring) = GnomeKeyring.get_default_keyring_sync() + if err != GnomeKeyring.Result.OK: + raise GnomeKeyringError(err) if self.keyring is None: self.keyring = 'login' - try: - gnomekeyring.create_sync(self.keyring, None) - except gnomekeyring.AlreadyExistsError: - pass + err = GnomeKeyring.create_sync(self.keyring, None) + if err not in (GnomeKeyring.Result.OK, + GnomeKeyring.Result.KEYRING_ALREADY_EXISTS): + raise GnomeKeyringError(err) def get_password(self, account_name): conf = gajim.config.get_per('accounts', account_name, 'password') @@ -78,60 +81,74 @@ class GnomePasswordStorage(PasswordStorage): ## migrate the password over to keyring try: self.save_password(account_name, password, update=False) - except gnomekeyring.NoKeyringDaemonError: - ## no keyring daemon: in the future, stop using it - set_storage(SimplePasswordStorage()) + except GnomeKeyringError as e: + if e.error == GnomeKeyring.Result.NO_KEYRING_DAEMON: + ## no keyring daemon: in the future, stop using it + set_storage(SimplePasswordStorage()) return password - try: - server = gajim.config.get_per('accounts', account_name, 'hostname') - user = gajim.config.get_per('accounts', account_name, 'name') - attributes1 = dict(server=str(server), user=str(user), protocol='xmpp') - attributes2 = dict(account_name=str(account_name), gajim=1) - try: - items = gnomekeyring.find_items_sync( - gnomekeyring.ITEM_NETWORK_PASSWORD, attributes1) - except gnomekeyring.Error: - try: - items = gnomekeyring.find_items_sync( - gnomekeyring.ITEM_GENERIC_SECRET, attributes2) - if items: - # We found an old item, move it to new way of storing - password = items[0].secret - self.save_password(account_name, password) - gnomekeyring.item_delete_sync(items[0].keyring, - int(items[0].item_id)) - except gnomekeyring.Error: - items = [] - if len(items) > 1: - warnings.warn("multiple gnome keyring items found for account %s;" - " trying to use the first one..." - % account_name) - if items: - return items[0].secret + server = gajim.config.get_per('accounts', account_name, 'hostname') + user = gajim.config.get_per('accounts', account_name, 'name') + attributes1 = GnomeKeyring.attribute_list_new() + GnomeKeyring.attribute_list_append_string(attributes1, 'server', + str(server)) + GnomeKeyring.attribute_list_append_string(attributes1, 'user', + str(user)) + GnomeKeyring.attribute_list_append_string(attributes1, 'protocol', + 'xmpp') + attributes2 = GnomeKeyring.attribute_list_new() + GnomeKeyring.attribute_list_append_string(attributes2, 'account_name', + str(account_name)) + GnomeKeyring.attribute_list_append_string(attributes2, 'gajim', + '1') + (err, items) = GnomeKeyring.find_items_sync( + GnomeKeyring.ItemType.NETWORK_PASSWORD, attributes1) + if err != GnomeKeyring.Result.OK: + (err, items) = GnomeKeyring.find_items_sync( + GnomeKeyring.ItemType.GENERIC_SECRET, attributes2) + if err == GnomeKeyring.Result.OK and len(items) > 0: + password = items[0].secret + self.save_password(account_name, password) + for item in items: + GnomeKeyring.item_delete_sync(item.keyring, + int(item.item_id)) else: - return None - except gnomekeyring.DeniedError: + items = [] + if len(items) > 1: + warnings.warn("multiple gnome keyring items found for account %s;" + " trying to use the first one..." % account_name) + if items: + return items[0].secret + else: return None - except gnomekeyring.NoKeyringDaemonError: + if err == GnomeKeyring.Result.NO_KEYRING_DAEMON: ## no keyring daemon: in the future, stop using it set_storage(SimplePasswordStorage()) - return None + return None def save_password(self, account_name, password, update=True): server = gajim.config.get_per('accounts', account_name, 'hostname') user = gajim.config.get_per('accounts', account_name, 'name') display_name = _('XMPP account %s@%s') % (user, server) - attributes1 = dict(server=str(server), user=str(user), protocol='xmpp') + attributes1 = GnomeKeyring.attribute_list_new() + GnomeKeyring.attribute_list_append_string(attributes1, 'server', + str(server)) + GnomeKeyring.attribute_list_append_string(attributes1, 'user', + str(user)) + GnomeKeyring.attribute_list_append_string(attributes1, 'protocol', + 'xmpp') if password is None: password = str() - try: - auth_token = gnomekeyring.item_create_sync( - self.keyring, gnomekeyring.ITEM_NETWORK_PASSWORD, display_name, - attributes1, password, update) - except (gnomekeyring.DeniedError, gnomekeyring.CancelledError): - set_storage(SimplePasswordStorage()) - storage.save_password(account_name, password) - return + (err, auth_token) = GnomeKeyring.item_create_sync(self.keyring, + GnomeKeyring.ItemType.NETWORK_PASSWORD, display_name, attributes1, + password, update) + if err != GnomeKeyring.Result.OK: + if err in (GnomeKeyring.Result.DENIED, + GnomeKeyring.Result.CANCELLED): + set_storage(SimplePasswordStorage()) + storage.save_password(account_name, password) + return + else: + raise GnomeKeyringError(err) gajim.config.set_per('accounts', account_name, 'password', 'gnomekeyring:') if account_name in gajim.connections: @@ -181,24 +198,25 @@ def get_storage(): global storage if storage is None: # None is only in first time get_storage is called if gajim.config.get('use_gnomekeyring'): - global gnomekeyring + global GnomeKeyring try: - gnomekeyring = __import__('gnomekeyring') - except ImportError: + gir = __import__('gi.repository', globals(), locals(), + ['GnomeKeyring'], 0) + GnomeKeyring = gir.GnomeKeyring + except (ImportError, AttributeError): pass else: global USER_HAS_GNOMEKEYRING global USER_USES_GNOMEKEYRING USER_HAS_GNOMEKEYRING = True - if gnomekeyring.is_available(): + if GnomeKeyring.is_available(): USER_USES_GNOMEKEYRING = True else: USER_USES_GNOMEKEYRING = False if USER_USES_GNOMEKEYRING: try: storage = GnomePasswordStorage() - except (gnomekeyring.NoKeyringDaemonError, gnomekeyring.DeniedError, - gnomekeyring.CancelledError): + except GnomeKeyringError: storage = None if storage is None: if gajim.config.get('use_kwalletcli'): diff --git a/src/common/pep.py b/src/common/pep.py index 44ce3eb53fdcff769a37bb5388b5b14d14ec39b7..44a8294a939b44e8d7ed7d9d389037efaf3966f4 100644 --- a/src/common/pep.py +++ b/src/common/pep.py @@ -215,7 +215,10 @@ LOCATION_DATA = { 'timestamp': _('timestamp'), 'uri': _('uri')} -import gobject +from gi.repository import GLib +from gi.repository import Gtk +from gi.repository import GdkPixbuf + import logging log = logging.getLogger('gajim.c.pep') @@ -265,10 +268,6 @@ class AbstractPEP(object): else: acc.pep[self.type_] = self - def asPixbufIcon(self): - '''SHOULD be implemented by subclasses''' - return None - def asMarkupText(self): '''SHOULD be implemented by subclasses''' return '' @@ -296,18 +295,14 @@ class UserMoodPEP(AbstractPEP): retracted = items.getTag('retract') or not 'mood' in mood_dict return (mood_dict, retracted) - def asPixbufIcon(self): - assert not self._retracted - return gajim.interface.get_pep_icon(self) - def asMarkupText(self): assert not self._retracted untranslated_mood = self._pep_specific_data['mood'] mood = self._translate_mood(untranslated_mood) - markuptext = '<b>%s</b>' % gobject.markup_escape_text(mood) + markuptext = '<b>%s</b>' % GLib.markup_escape_text(mood) if 'text' in self._pep_specific_data: text = self._pep_specific_data['text'] - markuptext += ' (%s)' % gobject.markup_escape_text(text) + markuptext += ' (%s)' % GLib.markup_escape_text(text) return markuptext def _translate_mood(self, mood): @@ -339,21 +334,18 @@ class UserTunePEP(AbstractPEP): 'title' in tune_dict) return (tune_dict, retracted) - def asPixbufIcon(self): - return gajim.interface.get_pep_icon(self) - def asMarkupText(self): assert not self._retracted tune = self._pep_specific_data artist = tune.get('artist', _('Unknown Artist')) - artist = gobject.markup_escape_text(artist) + artist = GLib.markup_escape_text(artist) title = tune.get('title', _('Unknown Title')) - title = gobject.markup_escape_text(title) + title = GLib.markup_escape_text(title) source = tune.get('source', _('Unknown Source')) - source = gobject.markup_escape_text(source) + source = GLib.markup_escape_text(source) tune_string = _('<b>"%(title)s"</b> by <i>%(artist)s</i>\n' 'from <i>%(source)s</i>') % {'title': title, @@ -387,10 +379,6 @@ class UserActivityPEP(AbstractPEP): retracted = items.getTag('retract') or not 'activity' in activity_dict return (activity_dict, retracted) - def asPixbufIcon(self): - assert not self._retracted - return gajim.interface.get_pep_icon(self) - def asMarkupText(self): assert not self._retracted pep = self._pep_specific_data @@ -404,12 +392,12 @@ class UserActivityPEP(AbstractPEP): subactivity = ACTIVITIES[activity][subactivity] activity = ACTIVITIES[activity]['category'] - markuptext = '<b>' + gobject.markup_escape_text(activity) + markuptext = '<b>' + GLib.markup_escape_text(activity) if subactivity: - markuptext += ': ' + gobject.markup_escape_text(subactivity) + markuptext += ': ' + GLib.markup_escape_text(subactivity) markuptext += '</b>' if text: - markuptext += ' (%s)' % gobject.markup_escape_text(text) + markuptext += ' (%s)' % GLib.markup_escape_text(text) return markuptext @@ -468,9 +456,6 @@ class UserLocationPEP(AbstractPEP): con = gajim.connections[account].location_info = \ self._pep_specific_data - def asPixbufIcon(self): - return gajim.interface.get_pep_icon(self) - def asMarkupText(self): assert not self._retracted location = self._pep_specific_data @@ -478,7 +463,7 @@ class UserLocationPEP(AbstractPEP): for entry in location.keys(): text = location[entry] - text = gobject.markup_escape_text(text) + text = GLib.markup_escape_text(text) # Translate standart location tag tag = LOCATION_DATA.get(entry, entry) location_string += '\n<b>%(tag)s</b>: %(text)s' % \ @@ -488,4 +473,4 @@ class UserLocationPEP(AbstractPEP): SUPPORTED_PERSONAL_USER_EVENTS = [UserMoodPEP, UserTunePEP, UserActivityPEP, - UserNicknamePEP, UserLocationPEP] \ No newline at end of file + UserNicknamePEP, UserLocationPEP] diff --git a/src/common/protocol/bytestream.py b/src/common/protocol/bytestream.py index 70ec62754014b627a241001ea306055a95af4808..79e97f1bfd452e86cd360db6a9b57b39a198a0fa 100644 --- a/src/common/protocol/bytestream.py +++ b/src/common/protocol/bytestream.py @@ -30,7 +30,7 @@ import socket import base64 -import gobject +from gi.repository import GLib import time import nbxmpp @@ -153,17 +153,23 @@ class ConnectionBytestream: if not content: return if not session.accepted: - if session.get_content('file', content.name).use_security: - id_ = jingle_xtls.send_cert_request(self, - file_props.sender) - jingle_xtls.key_exchange_pend(id_, content) - return + content = session.get_content('file', content.name) + if content.use_security: + fingerprint = content.x509_fingerprint + if not jingle_xtls.check_cert( + gajim.get_jid_without_resource(file_props.sender), + fingerprint): + id_ = jingle_xtls.send_cert_request(self, + file_props.sender) + jingle_xtls.key_exchange_pend(id_, + content.on_cert_received, []) + return session.approve_session() session.approve_content('file', content.name) return - iq = nbxmpp.Iq(to=unicode(file_props.sender), typ='result') + iq = nbxmpp.Iq(to=file_props.sender, typ='result') iq.setAttr('id', file_props.request_id) si = iq.setTag('si', namespace=nbxmpp.NS_SI) if file_props.offset: @@ -195,7 +201,7 @@ class ConnectionBytestream: jingle = self._sessions[file_props.sid] jingle.cancel_session() return - iq = nbxmpp.Iq(to=unicode(file_props.sender), typ='error') + iq = nbxmpp.Iq(to=file_props.sender, typ='error') iq.setAttr('id', file_props.request_id) if code == '400' and typ in ('stream', 'profile'): name = 'bad-request' @@ -296,7 +302,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): for file_props in FilesProp.getAllFileProp(): if is_transfer_stopped(file_props): continue - receiver_jid = unicode(file_props.receiver) + receiver_jid = file_props.receiver if contact.get_full_jid() == receiver_jid: file_props.error = -5 self.remove_transfer(file_props) @@ -305,7 +311,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): gajim.nec.push_incoming_event(FileRequestErrorEvent(None, conn=self, jid=contact.jid, file_props=file_props, error_msg='')) - sender_jid = unicode(file_props.sender) + sender_jid = file_props.sender if contact.get_full_jid() == sender_jid: file_props.error = -3 self.remove_transfer(file_props) @@ -354,11 +360,11 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): file_props.error = -5 from common.connection_handlers_events import FileRequestErrorEvent gajim.nec.push_incoming_event(FileRequestErrorEvent(None, conn=self, - jid=unicode(receiver), file_props=file_props, error_msg='')) - self._connect_error(unicode(receiver), file_props.sid, + jid=receiver, file_props=file_props, error_msg='')) + self._connect_error(receiver, file_props.sid, file_props.sid, code=406) else: - iq = nbxmpp.Iq(to=unicode(receiver), typ='set') + iq = nbxmpp.Iq(to=receiver, typ='set') file_props.request_id = 'id_' + file_props.sid iq.setID(file_props.request_id) query = iq.setTag('query', namespace=nbxmpp.NS_BYTESTREAM) @@ -374,7 +380,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): for host in hosts: streamhost = nbxmpp.Node(tag='streamhost') query.addChild(node=streamhost) - streamhost.setAttr('port', unicode(port)) + streamhost.setAttr('port', str(port)) streamhost.setAttr('host', host) streamhost.setAttr('jid', sender) @@ -442,7 +448,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): def cleanup_gupnp(): if self.no_gupnp_reply_id: - gobject.source_remove(self.no_gupnp_reply_id) + GLib.source_remove(self.no_gupnp_reply_id) self.no_gupnp_reply_id = 0 gajim.gupnp_igd.disconnect(self.ok_id) gajim.gupnp_igd.disconnect(self.fail_id) @@ -482,15 +488,15 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): self.fail_id = gajim.gupnp_igd.connect('error-mapping-port', fail) port = gajim.config.get('file_transfers_port') - self.no_gupnp_reply_id = gobject.timeout_add_seconds(10, no_upnp_reply) + self.no_gupnp_reply_id = GLib.timeout_add_seconds(10, no_upnp_reply) gajim.gupnp_igd.add_port('TCP', 0, my_ip, port, 3600, 'Gajim file transfer') def _add_proxy_streamhosts_to_query(self, query, file_props): proxyhosts = self._get_file_transfer_proxies_from_config(file_props) if proxyhosts: - file_props.proxy_receiver = unicode(file_props.receiver) - file_props.proxy_sender = unicode(file_props.sender) + file_props.proxy_receiver = file_props.receiver + file_props.proxy_sender = file_props.sender file_props.proxyhosts = proxyhosts for proxyhost in proxyhosts: @@ -518,12 +524,12 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): continue host_dict = { 'state': 0, - 'target': unicode(file_props.receiver), + 'target': file_props.receiver, 'id': file_props.sid, 'sid': file_props.sid, 'initiator': proxy, 'host': host, - 'port': unicode(_port), + 'port': str(_port), 'jid': jid } proxyhost_dicts.append(host_dict) @@ -563,7 +569,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): iq = nbxmpp.Iq(to=to, typ='error') iq.setAttr('id', file_props.sid) err = iq.setTag('error') - err.setAttr('code', unicode(code)) + err.setAttr('code', str(code)) err.setData(msg) self.connection.send(iq) if code == 404: @@ -593,7 +599,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): # register xmpppy handlers for bytestream and FT stanzas def _bytestreamErrorCB(self, con, iq_obj): - id_ = unicode(iq_obj.getAttr('id')) + id_ = iq_obj.getAttr('id') frm = helpers.get_full_jid_from_iq(iq_obj) query = iq_obj.getTag('query') gajim.proxy65_manager.error_cb(frm, query) @@ -609,10 +615,10 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): raise nbxmpp.NodeProcessed def _bytestreamSetCB(self, con, iq_obj): - target = unicode(iq_obj.getAttr('to')) - id_ = unicode(iq_obj.getAttr('id')) + target = iq_obj.getAttr('to') + id_ = iq_obj.getAttr('id') query = iq_obj.getTag('query') - sid = unicode(query.getAttr('sid')) + sid = query.getAttr('sid') file_props = FilesProp.getFileProp(self.name, sid) streamhosts = [] for item in query.getChildren(): @@ -645,7 +651,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): self.send_success_connect_reply, None) raise nbxmpp.NodeProcessed else: - log.warn('Gajim got streamhosts for unknown transfer. Ignoring it.') + log.warning('Gajim got streamhosts for unknown transfer. Ignoring it.') raise nbxmpp.NodeProcessed file_props.streamhosts = streamhosts @@ -657,7 +663,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): def _ResultCB(self, con, iq_obj): # 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')) + real_id = iq_obj.getAttr('id') if not real_id.startswith('au_'): return frm = self._ft_get_from(iq_obj) @@ -671,7 +677,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): def _bytestreamResultCB(self, con, iq_obj): frm = self._ft_get_from(iq_obj) - real_id = unicode(iq_obj.getAttr('id')) + real_id = iq_obj.getAttr('id') query = iq_obj.getTag('query') gajim.proxy65_manager.resolve_result(frm, query) @@ -692,7 +698,7 @@ class ConnectionSocks5Bytestream(ConnectionBytestream): raise nbxmpp.NodeProcessed for host in file_props.proxyhosts: if host['initiator'] == frm and \ - unicode(query.getAttr('sid')) == file_props.sid: + query.getAttr('sid') == file_props.sid: gajim.socks5queue.activate_proxy(host['idx']) break raise nbxmpp.NodeProcessed @@ -873,7 +879,8 @@ class ConnectionIBBytestream(ConnectionBytestream): chunk = file_props.fp.read(file_props.block_size) if chunk: datanode = nbxmpp.Node(nbxmpp.NS_IBB + ' data', {'sid': sid, - 'seq': file_props.seq}, base64.encodestring(chunk)) + 'seq': file_props.seq}, base64.b64encode(chunk.encode( + 'utf-8')).decode('utf-8')) file_props.seq += 1 file_props.started = True if file_props.seq == 65536: @@ -908,7 +915,7 @@ class ConnectionIBBytestream(ConnectionBytestream): log.debug('ReceiveHandler called sid->%s seq->%s' % (sid, seq)) try: seq = int(seq) - data = base64.decodestring(data) + data = base64.b64decode(data.encode('utf-8')).decode('utf-8') except Exception: seq = '' data = '' @@ -919,7 +926,7 @@ class ConnectionIBBytestream(ConnectionBytestream): else: if not data: err = nbxmpp.ERR_BAD_REQUEST - elif seq <> file_props.seq: + elif seq != file_props.seq: err = nbxmpp.ERR_UNEXPECTED_REQUEST else: log.debug('Successfull receive sid->%s %s+%s bytes' % (sid, @@ -1011,7 +1018,7 @@ class ConnectionIBBytestream(ConnectionBytestream): class ConnectionSocks5BytestreamZeroconf(ConnectionSocks5Bytestream): def _ft_get_from(self, iq_obj): - return unicode(iq_obj.getFrom()) + return iq_obj.getFrom() def _ft_get_our_jid(self): return gajim.get_jid_from_account(self.name) diff --git a/src/common/proxy65_manager.py b/src/common/proxy65_manager.py index 4598dd435390971d0348ff84fc66a656b3605526..12523bb86429bec75d4437f7c99f44849a4a77f9 100644 --- a/src/common/proxy65_manager.py +++ b/src/common/proxy65_manager.py @@ -29,7 +29,7 @@ log = logging.getLogger('gajim.c.proxy65_manager') import nbxmpp from common import gajim from common import helpers -from socks5 import Socks5 +from common.socks5 import Socks5 from nbxmpp.idlequeue import IdleObject from common.file_props import FilesProp @@ -117,7 +117,7 @@ class ProxyResolver: """ self.host = str(host) self.port = int(port) - self.jid = unicode(jid) + self.jid = str(jid) if not self.testit: self.state = S_FINISHED return @@ -311,7 +311,7 @@ class HostTester(Socks5, IdleObject): # read auth response if buff is None or len(buff) != 2: return None - version, method = struct.unpack('!BB', buff[:2]) + version, method = struct.unpack('!BB', buff[:2].encode('utf-8')) if version != 0x05 or method == 0xff: self.pollend() return @@ -334,8 +334,8 @@ class HostTester(Socks5, IdleObject): log.debug('Host Connecting to %s:%s' % (self.host, self.port)) self._send = self._sock.send self._recv = self._sock.recv - except Exception, ee: - errnum = ee[0] + except Exception as ee: + errnum = ee.errno # 56 is for freebsd if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): # still trying to connect @@ -432,7 +432,7 @@ class ReceiverTester(Socks5, IdleObject): # read auth response if buff is None or len(buff) != 2: return None - version, method = struct.unpack('!BB', buff[:2]) + version, method = struct.unpack('!BB', buff[:2].encode('utf-8')) if version != 0x05 or method == 0xff: self.pollend() return @@ -444,7 +444,7 @@ class ReceiverTester(Socks5, IdleObject): # read connect response if buff is None or len(buff) < 2: return None - version, reply = struct.unpack('!BB', buff[:2]) + version, reply = struct.unpack('!BB', buff[:2].encode('utf-8')) if version != 0x05 or reply != 0x00: self.pollend() return @@ -462,8 +462,8 @@ class ReceiverTester(Socks5, IdleObject): log.debug('Receiver Connecting to %s:%s' % (self.host, self.port)) self._send = self._sock.send self._recv = self._sock.recv - except Exception, ee: - errnum = ee[0] + except Exception as ee: + errnum = ee.errno # 56 is for freebsd if errnum in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK): # still trying to connect diff --git a/src/common/pubsub.py b/src/common/pubsub.py index a0d9ae8f7beae6ad34405febb97fed50e65528df..601012235206d23258fc6af9b40bed967a323d85 100644 --- a/src/common/pubsub.py +++ b/src/common/pubsub.py @@ -22,11 +22,13 @@ ## import nbxmpp -import gajim -import connection_handlers -import ged -from connection_handlers_events import PubsubReceivedEvent -from connection_handlers_events import PubsubBookmarksReceivedEvent +from common import gajim +#TODO: Doesn't work +#from common.connection_handlers import PEP_CONFIG +PEP_CONFIG = 'pep_config' +from common import ged +from common.connection_handlers_events import PubsubReceivedEvent +from common.connection_handlers_events import PubsubBookmarksReceivedEvent import logging log = logging.getLogger('gajim.c.pubsub') @@ -220,5 +222,5 @@ class ConnectionPubSub: e = e.addChild('configure', {'node': node}) id_ = self.connection.getAnID() query.setID(id_) - self.awaiting_answers[id_] = (connection_handlers.PEP_CONFIG,) + self.awaiting_answers[id_] = (PEP_CONFIG,) self.connection.send(query) diff --git a/src/common/resolver.py b/src/common/resolver.py index 10ed614e86a82620b6611f1f33484fc741f8b456..d790fa5d3cd69a067eb6c0ddaa054b6b0f200af8 100644 --- a/src/common/resolver.py +++ b/src/common/resolver.py @@ -70,33 +70,33 @@ class CommonResolver(): # empty host, return empty list of srv records on_ready([]) return - if self.resolved_hosts.has_key(host+type): + if host + type in self.resolved_hosts: # host is already resolved, return cached values log.debug('%s already resolved: %s' % (host, - self.resolved_hosts[host+type])) - on_ready(host, self.resolved_hosts[host+type]) + self.resolved_hosts[host + type])) + on_ready(host, self.resolved_hosts[host + type]) return - if self.handlers.has_key(host+type): + if host + type in self.handlers: # host is about to be resolved by another connection, # attach our callback log.debug('already resolving %s' % host) - self.handlers[host+type].append(on_ready) + self.handlers[host + type].append(on_ready) else: # host has never been resolved, start now log.debug('Starting to resolve %s using %s' % (host, self)) - self.handlers[host+type] = [on_ready] + self.handlers[host + type] = [on_ready] self.start_resolve(host, type) def _on_ready(self, host, type, result_list): # practically it is impossible to be the opposite, but who knows :) host = host.lower() log.debug('Resolving result for %s: %s' % (host, result_list)) - if not self.resolved_hosts.has_key(host+type): - self.resolved_hosts[host+type] = result_list - if self.handlers.has_key(host+type): - for callback in self.handlers[host+type]: + if host + type not in self.resolved_hosts: + self.resolved_hosts[host + type] = result_list + if host + type in self.handlers: + for callback in self.handlers[host + type]: callback(host, result_list) - del(self.handlers[host+type]) + del(self.handlers[host + type]) def start_resolve(self, host, type): pass @@ -251,8 +251,7 @@ class NSLookupResolver(CommonResolver): domain = None if line.startswith(fqdn): domain = fqdn # For nslookup 9.5 - elif helpers.decode_string(line).startswith(ufqdn): - line = helpers.decode_string(line) + elif line.startswith(ufqdn): domain = ufqdn # For nslookup 9.6 if domain: rest = line[len(domain):].split('=') @@ -318,8 +317,8 @@ class NsLookup(IdleCommand): # below lines is on how to use API and assist in testing if __name__ == '__main__': - import gobject - import gtk + from gi.repository import GLib + from gi.repository import Gtk from nbxmpp import idlequeue idlequeue = idlequeue.get_idlequeue() @@ -329,21 +328,21 @@ if __name__ == '__main__': global resolver host = text_view.get_text() def on_result(host, result_array): - print 'Result:\n' + repr(result_array) + print('Result:\n' + repr(result_array)) resolver.resolve(host, on_result) - win = gtk.Window() + win = Gtk.Window() win.set_border_width(6) - text_view = gtk.Entry() + text_view = Gtk.Entry() text_view.set_text('_xmpp-client._tcp.jabber.org') - hbox = gtk.HBox() + hbox = Gtk.HBox() hbox.set_spacing(3) - but = gtk.Button(' Lookup SRV ') - hbox.pack_start(text_view, 5) - hbox.pack_start(but, 0) + but = Gtk.Button(' Lookup SRV ') + hbox.pack_start(text_view, 5, True, 0) + hbox.pack_start(but, 0, True, 0) but.connect('clicked', clicked) win.add(hbox) win.show_all() - gobject.timeout_add(200, idlequeue.process) + GLib.timeout_add(200, idlequeue.process) if USE_LIBASYNCNS: - gobject.timeout_add(200, resolver.process) - gtk.main() + GLib.timeout_add(200, resolver.process) + Gtk.main() diff --git a/src/common/rst_xhtml_generator.py b/src/common/rst_xhtml_generator.py index cac9e669c8f45f3852c2ecbfebce404b2d07894e..9583b39507d02aa0fe578472e67bf7fccf5e2282 100644 --- a/src/common/rst_xhtml_generator.py +++ b/src/common/rst_xhtml_generator.py @@ -28,7 +28,7 @@ try: from docutils import nodes, utils from docutils.parsers.rst.roles import set_classes except ImportError: - print "Requires docutils 0.4 for set_classes to be available" + print("Requires docutils 0.4 for set_classes to be available") def create_xhtml(text): return None else: @@ -65,7 +65,7 @@ else: options={}, content=[]): try: valid_text = validator(text) - except ValueError, e: + except ValueError as e: msg = inliner.reporter.error( e.message % dict(text=text), line=lineno) prb = inliner.problematic(rawtext, rawtext, msg) return [prb], [msg] @@ -120,7 +120,7 @@ else: # in the JEP # == u"\u00a0" self.pub.writer.translator_class.attribution_formats['dash'] = ( - u'\u2014', '') + '\u2014', '') self.pub.process_programmatic_settings(settings_spec, settings_overrides, config_section) @@ -137,7 +137,7 @@ else: output = self.pub.publish(enable_exit_status=enable_exit_status) # kludge until we can get docutils to stop generating (rare) # entities - return u'\u00a0'.join(self.pub.writer.parts['fragment'].strip().split( + return '\u00a0'.join(self.pub.writer.parts['fragment'].strip().split( ' ')) Generator = HTMLGenerator() @@ -147,7 +147,7 @@ else: if __name__ == '__main__': - print "test 1\n", Generator.create_xhtml(""" + print("test 1\n" + Generator.create_xhtml(""" test:: >>> print 1 @@ -157,10 +157,10 @@ test:: this `` should trigger`` should trigger the problem. -""") - print "test 2\n", Generator.create_xhtml(""" +""")) + print("test 2\n" + Generator.create_xhtml(""" *test1 test2_ -""") - print "test 3\n", Generator.create_xhtml(""":ticket:`316` implements :xep:`71`""") +""")) + print("test 3\n" + Generator.create_xhtml(""":ticket:`316` implements :xep:`71`""")) diff --git a/src/common/sleepy.py b/src/common/sleepy.py index 5c0f39d330d4c36a58b3ed56c3e97a2500977710..820bf9858514c04ec01f8880713f74adbe12c326 100644 --- a/src/common/sleepy.py +++ b/src/common/sleepy.py @@ -22,7 +22,8 @@ ## from common import gajim -import os, sys +import os +import sys STATE_UNKNOWN = 'OS probably not supported' diff --git a/src/common/socks5.py b/src/common/socks5.py index 8d252b044ade4c31648ebb8dc0d3740475176f08..86a551823565dfac8b73c8a74a5c66462192456a 100644 --- a/src/common/socks5.py +++ b/src/common/socks5.py @@ -33,9 +33,9 @@ from errno import EISCONN from errno import EINPROGRESS from errno import EAFNOSUPPORT from nbxmpp.idlequeue import IdleObject -from file_props import FilesProp +from common.file_props import FilesProp from common import gajim -import jingle_xtls +from common import jingle_xtls if jingle_xtls.PYOPENSSL_PRESENT: import OpenSSL import logging @@ -119,8 +119,7 @@ class SocksQueue: streamhosts_to_test = [] # Remove local IPs to not connect to ourself for streamhost in file_props.streamhosts: - if streamhost['host'] == '127.0.0.1' or \ - streamhost['host'] == '::1': + if streamhost['host'] == '127.0.0.1' or streamhost['host'] == '::1': continue streamhosts_to_test.append(streamhost) if not streamhosts_to_test: @@ -327,7 +326,7 @@ class SocksQueue: if listener.file_props.type_ == 's' and \ not self.isHashInSockObjs(self.senders, sock_hash): sockobj = Socks5SenderServer(self.idlequeue, sock_hash, self, - sock[0], sock[1][0], sock[1][1], fingerprint='server', + sock[0], sock[1][0], sock[1][1], fingerprint='server', file_props=listener.file_props) self._add(sockobj, self.senders, listener.file_props, sock_hash) # Start waiting for data @@ -379,6 +378,7 @@ class SocksQueue: self.idlequeue.remove_timeout(reader.fd) if do_disconnect: reader.disconnect() + del self.readers[key] if not remove_all: break else: @@ -415,7 +415,7 @@ class SocksQueue: self.connected -= 1 -class Socks5: +class Socks5(object): def __init__(self, idlequeue, host, port, initiator, target, sid): if host is not None: try: @@ -439,12 +439,20 @@ class Socks5: self.file = None self.connected = False self.mode = '' + self.ssl_cert = None + self.ssl_errnum = 0 def _is_connected(self): if self.state < 5: return False return True + def ssl_verify_cb(self, ssl_conn, cert, error_num, depth, return_code): + if depth == 0: + self.ssl_cert = cert + self.ssl_errnum = error_num + return True + def connect(self): """ Create the socket and plug it to the idlequeue @@ -455,14 +463,22 @@ class Socks5: try: self._sock = socket.socket(*ai[:3]) if not self.fingerprint is None: + if self.file_props.type_ == 's': + remote_jid = gajim.get_jid_without_resource( + self.file_props.receiver) + else: + remote_jid = gajim.get_jid_without_resource( + self.file_props.sender) self._sock = OpenSSL.SSL.Connection( - jingle_xtls.get_context('client'), self._sock) + jingle_xtls.get_context('client', + verify_cb=self.ssl_verify_cb, remote_jid=remote_jid), + self._sock) # this will not block the GUI self._sock.setblocking(False) self._server = ai[4] break - except socket.error, e: - if not isinstance(e, basestring) and e[0] == EINPROGRESS: + except socket.error as e: + if e.errno == EINPROGRESS: break # for all other errors, we try other addresses continue @@ -476,11 +492,12 @@ class Socks5: def do_connect(self): try: self._sock.connect(self._server) - self._sock.setblocking(False) self._send=self._sock.send self._recv=self._sock.recv - except Exception, ee: - errnum = ee[0] + except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError) as e: + pass + except Exception as ee: + errnum = ee.errno self.connect_timeout += 1 if errnum == 111 or self.connect_timeout > 1000: self.queue._connection_refused(self.streamhost, self.file_props, @@ -531,9 +548,9 @@ class Socks5: self.size = self.file_props.offset self.file.seek(self.size) self.file_props.received_len = self.size - except IOError, e: + except IOError as e: self.close_file() - raise IOError, e + raise IOError(str(e)) def close_file(self): # Close file we're sending from @@ -586,9 +603,9 @@ class Socks5: """ received = '' try: - add = self._recv(64) + add = self._recv(64).decode('utf-8') except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request : ' + repr(e)) raise e except Exception: @@ -605,10 +622,10 @@ class Socks5: try: self._send(raw_data) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request :' + repr(e)) raise e - except Exception, e: + except Exception: self.disconnect() return len(raw_data) @@ -619,7 +636,7 @@ class Socks5: else: try: self.open_file_for_reading() - except IOError, e: + except IOError: self.state = 8 # end connection self.disconnect() self.file_props.error = -7 # unable to read from file @@ -630,11 +647,11 @@ class Socks5: try: lenn = self._send(buff) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request :' + repr(e)) raise e - except Exception, e: - if e.args[0] not in (EINTR, ENOBUFS, EWOULDBLOCK): + except Exception as e: + if e.errno not in (EINTR, ENOBUFS, EWOULDBLOCK): # peer stopped reading self.state = 8 # end connection self.disconnect() @@ -646,7 +663,7 @@ class Socks5: self.file_props.last_time self.file_props.last_time = current_time self.file_props.received_len = self.size - if self.size >= int(self.file_props.size): + if self.size >= self.file_props.size: self.state = 8 # end connection self.file_props.error = 0 self.disconnect() @@ -676,7 +693,7 @@ class Socks5: if self.remaining_buff != '': try: fd = self.get_fd() - except IOError, e: + except IOError: self.disconnect(False) self.file_props.error = -6 # file system error return 0 @@ -688,7 +705,7 @@ class Socks5: self.file_props.last_time = current_time self.file_props.received_len += lenn self.remaining_buff = '' - if self.file_props.received_len == int(self.file_props.size): + if self.file_props.received_len == self.file_props.size: self.rem_fd(fd) self.disconnect() self.file_props.error = 0 @@ -697,14 +714,14 @@ class Socks5: else: try: fd = self.get_fd() - except IOError, e: + except IOError: self.disconnect(False) self.file_props.error = -6 # file system error return 0 try: - buff = self._recv(MAX_BUFF_LEN) + buff = self._recv(MAX_BUFF_LEN).decode('utf-8') except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('SSL rehandshake request :' + repr(e)) raise e except Exception: @@ -723,12 +740,12 @@ class Socks5: return 0 try: fd.write(buff) - except IOError, e: + except IOError: self.rem_fd(fd) self.disconnect() self.file_props.error = -6 # file system error return 0 - if self.file_props.received_len >= int(self.file_props.size): + if self.file_props.received_len >= self.file_props.size: # transfer completed self.rem_fd(fd) self.disconnect() @@ -785,9 +802,9 @@ class Socks5: """ auth_mechanisms = [] try: - num_auth = struct.unpack('!xB', buff[:2])[0] - for i in xrange(num_auth): - mechanism, = struct.unpack('!B', buff[1 + i]) + num_auth = struct.unpack('!xB', buff[:2].encode('utf-8'))[0] + for i in list(range(num_auth)): + mechanism, = struct.unpack('!B', buff[1 + i].encode('utf-8')) auth_mechanisms.append(mechanism) except Exception: return None @@ -804,8 +821,8 @@ class Socks5: Connect request by domain name """ buff = struct.pack('!BBBBB%dsBB' % len(self.host), - 0x05, 0x01, 0x00, 0x03, len(self.host), self.host, self.port >> 8, - self.port & 0xff) + 0x05, 0x01, 0x00, 0x03, len(self.host), self.host.encode('utf-8'), + self.port >> 8, self.port & 0xff) return buff def _get_request_buff(self, msg, command = 0x01): @@ -813,28 +830,33 @@ class Socks5: Connect request by domain name, sid sha, instead of domain name (jep 0096) """ - buff = struct.pack('!BBBBB%dsBB' % len(msg), - 0x05, command, 0x00, 0x03, len(msg), msg, 0, 0) + if isinstance(msg, str): + msg = msg.encode('utf-8') + buff = struct.pack('!BBBBB%dsBB' % len(msg), 0x05, command, 0x00, 0x03, + len(msg), msg, 0, 0) return buff def _parse_request_buff(self, buff): try: # don't trust on what comes from the outside - req_type, host_type, = struct.unpack('!xBxB', buff[:4]) + req_type, host_type, = struct.unpack('!xBxB', buff[:4].encode( + 'utf-8')) if host_type == 0x01: - host_arr = struct.unpack('!iiii', buff[4:8]) + host_arr = struct.unpack('!iiii', buff[4:8].encode('utf-8')) host, = '.'.join(str(s) for s in host_arr) host_len = len(host) elif host_type == 0x03: - host_len, = struct.unpack('!B', buff[4]) - host, = struct.unpack('!%ds' % host_len, buff[5:5 + host_len]) + host_len, = struct.unpack('!B', buff[4].encode('utf-8')) + host, = struct.unpack('!%ds' % host_len, buff[5:5 + host_len].\ + encode('utf-8')) portlen = len(buff[host_len + 5:]) if portlen == 1: - port, = struct.unpack('!B', buff[host_len + 5]) + port, = struct.unpack('!B', buff[host_len + 5].encode('utf-8')) elif portlen == 2: - port, = struct.unpack('!H', buff[host_len + 5:]) + port, = struct.unpack('!H', buff[host_len + 5:].encode('utf-8')) # file data, comes with auth message (Gaim bug) else: - port, = struct.unpack('!H', buff[host_len + 5: host_len + 7]) + port, = struct.unpack('!H', buff[host_len + 5: host_len + 7].\ + encode('utf-8')) self.remaining_buff = buff[host_len + 7:] except Exception: return (None, None, None) @@ -845,13 +867,13 @@ class Socks5: Connect response: version, auth method """ try: - buff = self._recv() + buff = self._recv().decode('utf-8') except (SSL.WantReadError, SSL.WantWriteError, - SSL.WantX509LookupError), e: + SSL.WantX509LookupError) as e: log.info("SSL rehandshake request : " + repr(e)) raise e try: - version, method = struct.unpack('!BB', buff) + version, method = struct.unpack('!BB', buff.encode('utf-8')) except Exception: version, method = None, None if version != 0x05 or method == 0xff: @@ -870,18 +892,17 @@ class Socks5: Get sha of sid + Initiator jid + Target jid """ if self.file_props.is_a_proxy: - return hashlib.sha1('%s%s%s' % (self.sid, - self.file_props.proxy_sender, self.file_props.proxy_receiver) - ).hexdigest() - return hashlib.sha1('%s%s%s' % (self.sid, self.initiator, - self.target)).hexdigest() + return hashlib.sha1(('%s%s%s' % (self.sid, + self.file_props.proxy_sender, self.file_props.proxy_receiver)).\ + encode('utf-8')).hexdigest() + return hashlib.sha1(('%s%s%s' % (self.sid, self.initiator, + self.target)).encode('utf-8')).hexdigest() class Socks5Sender(IdleObject): """ Class for sending file to socket over socks5 """ - def __init__(self, idlequeue, sock_hash, parent, _sock, host=None, port=None, fingerprint = None, connected=True, file_props={}): self.fingerprint = fingerprint @@ -962,7 +983,6 @@ class Socks5Sender(IdleObject): class Socks5Receiver(IdleObject): - def __init__(self, idlequeue, streamhost, sid, file_props = None, fingerprint=None): """ @@ -1094,7 +1114,7 @@ class Socks5Server(Socks5): result = self.start_transfer() # send self.queue.process_result(result, self) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') else: self.disconnect() @@ -1132,7 +1152,7 @@ class Socks5Server(Socks5): else: self.disconnect() except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') return if self.state < 5: @@ -1160,7 +1180,7 @@ class Socks5Client(Socks5): if self.state == 2: # read auth response if buff is None or len(buff) != 2: return None - version, method = struct.unpack('!BB', buff[:2]) + version, method = struct.unpack('!BB', buff[:2].encode('utf-8')) if version != 0x05 or method == 0xff: self.disconnect() elif self.state == 4: # get approve of our request @@ -1169,18 +1189,23 @@ class Socks5Client(Socks5): sub_buff = buff[:4] if len(sub_buff) < 4: return None - version, address_type = struct.unpack('!BxxB', buff[:4]) + version, address_type = struct.unpack('!BxxB', buff[:4].encode( + 'utf-8')) addrlen = 0 if address_type == 0x03: addrlen = ord(buff[4]) - address = struct.unpack('!%ds' % addrlen, buff[5:addrlen + 5]) + address = struct.unpack('!%ds' % addrlen, buff[5:addrlen + 5].\ + encode('utf-8')) portlen = len(buff[addrlen + 5:]) if portlen == 1: - port, = struct.unpack('!B', buff[addrlen + 5]) + port, = struct.unpack('!B', buff[addrlen + 5].encode( + 'utf-8')) elif portlen == 2: - port, = struct.unpack('!H', buff[addrlen + 5:]) + port, = struct.unpack('!H', buff[addrlen + 5:].encode( + 'utf-8')) else: # Gaim bug :) - port, = struct.unpack('!H', buff[addrlen + 5:addrlen + 7]) + port, = struct.unpack('!H', buff[addrlen + 5:addrlen + 7].\ + encode('utf-8')) self.remaining_buff = buff[addrlen + 7:] self.state = 5 # for senders: init file_props and send '\n' if self.queue.on_success: @@ -1220,6 +1245,14 @@ class Socks5Client(Socks5): self.state += 1 return None + def send_file(self): + if self.ssl_errnum > 0: + log.error('remote certificate does not match the announced one.' + \ + '\nSSL Error: %d\nCancelling file transfer' % self.ssl_errnum) + self.file_props.error = -12 + return -1 + return super(Socks5Client, self).send_file() + def pollin(self): self.idlequeue.remove_timeout(self.fd) if self.connected: @@ -1238,7 +1271,7 @@ class Socks5Client(Socks5): result = self.start_transfer() # receive self.queue.process_result(result, self) except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') return else: @@ -1262,7 +1295,7 @@ class Socks5Client(Socks5): self.queue.process_result(result, self) return except (OpenSSL.SSL.WantReadError, OpenSSL.SSL.WantWriteError, - OpenSSL.SSL.WantX509LookupError), e: + OpenSSL.SSL.WantX509LookupError) as e: log.info('caught SSL exception, ignored') return self.state += 1 @@ -1301,9 +1334,8 @@ class Socks5SenderServer(Socks5Server, Socks5Sender): class Socks5ReceiverClient(Socks5Client, Socks5Receiver): - def __init__(self, idlequeue, streamhost, sid, file_props = None, - fingerprint=None): + fingerprint=None): Socks5Client.__init__(self, idlequeue, streamhost['host'], int(streamhost['port']), streamhost['initiator'], streamhost['target'], sid) @@ -1355,8 +1387,8 @@ class Socks5Listener(IdleObject): if self.fingerprint is not None: self._serv = OpenSSL.SSL.Connection( jingle_xtls.get_context('server'), self._serv) - except socket.error, e: - if e.args[0] == EAFNOSUPPORT: + except socket.error as e: + if e.errno == EAFNOSUPPORT: self.ai = None continue raise @@ -1425,4 +1457,3 @@ class Socks5Listener(IdleObject): self.connections.append(_sock[0]) return _sock - diff --git a/src/common/stanza_session.py b/src/common/stanza_session.py index f8ccb503a5d3654e22b92c380f4d76eaa778793b..becc4825b63b374f1d98f39617a2327db4395b96 100644 --- a/src/common/stanza_session.py +++ b/src/common/stanza_session.py @@ -810,7 +810,10 @@ class EncryptedStanzaSession(ArchivingStanzaSession): # the offset of the group we chose (need it to match up with the dhhash) group_order = 0 - self.modp = int(form.getField('modp').getOptions()[group_order][1]) + modp_f = form.getField('modp') + if not modp_f: + return + self.modp = int(modp_f.getOptions()[group_order][1]) x.addChild(node=nbxmpp.DataField(name='modp', value=self.modp)) g = dh.generators[self.modp] @@ -818,7 +821,10 @@ class EncryptedStanzaSession(ArchivingStanzaSession): self.n_o = base64.b64decode(form['my_nonce']) - dhhashes = form.getField('dhhashes').getValues() + dhhashes_f = form.getField('dhhashes') + if not dhhashes_f: + return + dhhashes = dhhashes_f.getValues() self.negotiated['He'] = base64.b64decode(dhhashes[group_order].encode( 'utf8')) diff --git a/src/common/zeroconf/client_zeroconf.py b/src/common/zeroconf/client_zeroconf.py index 52a7ca1f0c76f4a6d0be7b0b61072da66d67ec42..07f82092a5d3e97b31c6e77dc6d7f3b600c95dad 100644 --- a/src/common/zeroconf/client_zeroconf.py +++ b/src/common/zeroconf/client_zeroconf.py @@ -173,7 +173,7 @@ class P2PClient(IdleObject): id_ = stanza.getID() if not id_: id_ = self.Dispatcher.getAnID() - if self.conn_holder.ids_of_awaiting_messages.has_key(self.fd): + if self.fd in self.conn_holder.ids_of_awaiting_messages: self.conn_holder.ids_of_awaiting_messages[self.fd].append(( id_, thread_id)) else: @@ -195,7 +195,7 @@ class P2PClient(IdleObject): id_ = stanza.getID() if not id_: id_ = self.Dispatcher.getAnID() - if self.conn_holder.ids_of_awaiting_messages.has_key(self.fd): + if self.fd in self.conn_holder.ids_of_awaiting_messages: self.conn_holder.ids_of_awaiting_messages[self.fd].append((id_, thread_id)) else: @@ -253,10 +253,10 @@ class P2PClient(IdleObject): 'Incorrect answer from server.') return if self.sock_type == TYPE_SERVER: - if attrs.has_key('from'): + if 'from' in attrs: self.to = attrs['from'] self.send_stream_header() - if attrs.has_key('version') and attrs['version'] == '1.0': + if 'version' in attrs and attrs['version'] == '1.0': # other part supports stream features features = Node('stream:features') self.Dispatcher.send(features) @@ -270,12 +270,12 @@ class P2PClient(IdleObject): def on_disconnect(self): if self.conn_holder: - if self.conn_holder.ids_of_awaiting_messages.has_key(self.fd): + if self.fd in self.conn_holder.ids_of_awaiting_messages: del self.conn_holder.ids_of_awaiting_messages[self.fd] self.conn_holder.remove_connection(self.sock_hash) - if self.__dict__.has_key('Dispatcher'): + if 'Dispatcher' in self.__dict__: self.Dispatcher.PlugOut() - if self.__dict__.has_key('P2PConnection'): + if 'P2PConnection' in self.__dict__: self.P2PConnection.PlugOut() self.Connection = None self._caller = None @@ -294,7 +294,7 @@ class P2PClient(IdleObject): self.Dispatcher.Stream._document_attrs is None: return self.onreceive(None) - if self.Dispatcher.Stream._document_attrs.has_key('version') and \ + if 'version' in self.Dispatcher.Stream._document_attrs and \ self.Dispatcher.Stream._document_attrs['version'] == '1.0': #~ self.onreceive(self._on_receive_stream_features) #XXX continue with TLS @@ -356,9 +356,9 @@ class P2PConnection(IdleObject, PlugIn): try: self.ais = socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM) - except socket.gaierror, e: - log.info('Lookup failure for %s: %s[%s]', host, e[1], - repr(e[0]), exc_info=True) + except socket.gaierror as e: + log.info('Lookup failure for %s: %s', host, str(e), + exc_info=True) else: self.connect_to_next_ip() @@ -418,19 +418,12 @@ class P2PConnection(IdleObject, PlugIn): """ Append stanza to the queue of messages to be send if now is False, else send it instantly - - If supplied data is unicode string, encode it to UTF-8. """ if self.state <= 0: return r = packet - if isinstance(r, unicode): - r = r.encode('utf-8') - elif not isinstance(r, str): - r = ustr(r).encode('utf-8') - if now: self.sendqueue.insert(0, (r, is_message)) self._do_send() @@ -455,8 +448,9 @@ class P2PConnection(IdleObject, PlugIn): try: self._sock.connect(self._server) self._sock.setblocking(False) - except Exception, ee: - (errnum, errstr) = ee + except Exception as ee: + errnum = ee.errno + errstr = ee.strerror errors = (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK) if 'WSAEINVAL' in errno.__dict__: errors += (errno.WSAEINVAL,) @@ -495,9 +489,8 @@ class P2PConnection(IdleObject, PlugIn): try: # get as many bites, as possible, but not more than RECV_BUFSIZE received = self._sock.recv(MAX_BUFF_LEN) - except Exception, e: - if len(e.args) > 0 and isinstance(e.args[0], int): - errnum = e[0] + except Exception as e: + errnum = e.errno # "received" will be empty anyhow if errnum == socket.SSL_ERROR_WANT_READ: pass @@ -566,8 +559,8 @@ class P2PConnection(IdleObject, PlugIn): self._plug_idle() self._on_send() - except socket.error, e: - if e[0] == socket.SSL_ERROR_WANT_WRITE: + except socket.error as e: + if e.errno == socket.SSL_ERROR_WANT_WRITE: return True if self.state < 0: self.disconnect() @@ -717,7 +710,7 @@ class ClientZeroconf: if self.ip_to_hash[i] == sock_hash: del self.ip_to_hash[i] break - if self.hash_to_port.has_key(sock_hash): + if sock_hash in self.hash_to_port: del self.hash_to_port[sock_hash] def start_listener(self, port): @@ -737,7 +730,7 @@ class ClientZeroconf: def send(self, stanza, is_message=False, now=False, on_ok=None, on_not_ok=None): stanza.setFrom(self.roster.zeroconf.name) - to = unicode(stanza.getTo()) + to = stanza.getTo() to = gajim.get_jid_without_resource(to) try: @@ -802,7 +795,7 @@ class ClientZeroconf: def on_ok(_waitid): # if timeout: # self._owner.set_timeout(timeout) - to = unicode(stanza.getTo()) + to = stanza.getTo() to = gajim.get_jid_without_resource(to) try: diff --git a/src/common/zeroconf/connection_zeroconf.py b/src/common/zeroconf/connection_zeroconf.py index 8a7a89c6bd694632ea21fd415957f490ff77bbf8..07ff5db3f77010b93d435ee4ec9880ba04f93c4d 100644 --- a/src/common/zeroconf/connection_zeroconf.py +++ b/src/common/zeroconf/connection_zeroconf.py @@ -39,14 +39,14 @@ import signal if os.name != 'nt': signal.signal(signal.SIGPIPE, signal.SIG_DFL) import getpass -import gobject +from gi.repository import GLib from common.connection import CommonConnection from common import gajim from common import ged from common.zeroconf import client_zeroconf from common.zeroconf import zeroconf -from connection_handlers_zeroconf import * +from common.zeroconf.connection_handlers_zeroconf import * from common.connection_handlers_events import * import locale @@ -91,7 +91,7 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): 'is_zeroconf', True) gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'use_ft_proxies', False) - self.host = unicode(socket.gethostname(), locale.getpreferredencoding()) + self.host = socket.gethostname() gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'hostname', self.host) self.port = gajim.config.get_per('accounts', gajim.ZEROCONF_ACC_NAME, @@ -110,8 +110,7 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): 'zeroconf_email') if not self.username: - self.username = unicode(getpass.getuser(), - locale.getpreferredencoding()) + self.username = getpass.getuser() gajim.config.set_per('accounts', gajim.ZEROCONF_ACC_NAME, 'name', self.username) else: @@ -240,7 +239,7 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): # refresh all contacts data every five seconds self.call_resolve_timeout = True - gobject.timeout_add_seconds(5, self._on_resolve_timeout) + GLib.timeout_add_seconds(5, self._on_resolve_timeout) return True def disconnect(self, on_purpose=False): @@ -387,7 +386,7 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): if realm == '': if event == nbxmpp.transports_nb.DATA_ERROR: thread_id = data[1] - frm = unicode(data[0]) + frm = data[0] session = self.get_or_create_session(frm, thread_id) gajim.nec.push_incoming_event(MessageErrorEvent( None, conn=self, fjid=frm, error_code=-1, error_msg=_( diff --git a/src/common/zeroconf/roster_zeroconf.py b/src/common/zeroconf/roster_zeroconf.py index 307fd392efd146d07bfc859616df805f037ec3f6..472ded7b6e21d503213c6136070400dee5306174 100644 --- a/src/common/zeroconf/roster_zeroconf.py +++ b/src/common/zeroconf/roster_zeroconf.py @@ -32,7 +32,6 @@ class Roster: self.setItem(val[zeroconf.C_NAME]) def getRoster(self): - #print 'roster_zeroconf.py: getRoster' if self._data is None: self._data = {} self.update_roster() @@ -50,11 +49,9 @@ class Roster: if key in self._data: if old_data[key] != self._data[key]: diffs[key] = self._data[key]['status'] - #print 'roster_zeroconf.py: diffs:' + str(diffs) return diffs def setItem(self, jid, name='', groups=''): - #print 'roster_zeroconf.py: setItem %s' % jid contact = self.zeroconf.get_contact(jid) if not contact: return @@ -96,34 +93,27 @@ class Roster: self.setItem(jid=i['jid'], name=i['name'], groups=i['groups']) def delItem(self, jid): - #print 'roster_zeroconf.py: delItem %s' % jid if jid in self._data: del self._data[jid] def getItem(self, jid): - #print 'roster_zeroconf.py: getItem: %s' % jid if jid in self._data: return self._data[jid] def __getitem__(self, jid): - #print 'roster_zeroconf.py: __getitem__' return self._data[jid] def getItems(self): - #print 'roster_zeroconf.py: getItems' # Return list of all [bare] JIDs that the roster currently tracks. return self._data.keys() def keys(self): - #print 'roster_zeroconf.py: keys' return self._data.keys() def getRaw(self): - #print 'roster_zeroconf.py: getRaw' return self._data def getResources(self, jid): - #print 'roster_zeroconf.py: getResources(%s)' % jid return {} def getGroups(self, jid): @@ -142,14 +132,12 @@ class Roster: return self._data[jid]['txt_dict']['msg'] def getShow(self, jid): - #print 'roster_zeroconf.py: getShow' return self.getStatus(jid) def getPriority(self, jid): return 5 def getSubscription(self, jid): - #print 'roster_zeroconf.py: getSubscription' return 'both' def Subscribe(self, jid): diff --git a/src/common/zeroconf/zeroconf_avahi.py b/src/common/zeroconf/zeroconf_avahi.py index 5ce4f8398dc734a18dd326107f64a08b36719b1b..e2a7c1fd4ffb1040d2990368b3c09bffab0940f4 100644 --- a/src/common/zeroconf/zeroconf_avahi.py +++ b/src/common/zeroconf/zeroconf_avahi.py @@ -22,7 +22,7 @@ log = logging.getLogger('gajim.c.z.zeroconf_avahi') try: import dbus.exceptions -except ImportError, e: +except ImportError: pass from common.zeroconf.zeroconf import C_BARE_NAME, C_INTERFACE, C_PROTOCOL, C_DOMAIN @@ -224,14 +224,7 @@ class Zeroconf: return show def avahi_txt(self): - utf8_dict = {} - for key in self.txt: - val = self.txt[key] - if isinstance(val, unicode): - utf8_dict[key] = val.encode('utf-8') - else: - utf8_dict[key] = val - return self.avahi.dict_to_txt_array(utf8_dict) + return self.avahi.dict_to_txt_array(self.txt) def create_service(self): try: @@ -246,7 +239,7 @@ class Zeroconf: txt = {} # remove empty keys - for key, val in self.txt.iteritems(): + for key, val in self.txt.items(): if val: txt[key] = val @@ -274,7 +267,7 @@ class Zeroconf: return True - except dbus.DBusException, e: + except dbus.DBusException as e: log.debug(str(e)) return False @@ -334,7 +327,7 @@ class Zeroconf: self.bus.add_signal_receiver(self.avahi_dbus_connect_cb, 'NameOwnerChanged', 'org.freedesktop.DBus', arg0='org.freedesktop.Avahi') - except Exception, e: + except Exception as e: # System bus is not present self.bus = None log.debug(str(e)) @@ -361,7 +354,7 @@ class Zeroconf: self.avahi.DBUS_PATH_SERVER), self.avahi.DBUS_INTERFACE_SERVER) self.server.connect_to_signal('StateChanged', self.server_state_changed_callback) - except Exception, e: + except Exception as e: # Avahi service is not present self.server = None log.debug(str(e)) @@ -402,14 +395,14 @@ class Zeroconf: if self.service_browser: try: self.service_browser.Free() - except dbus.DBusException, e: + except dbus.DBusException as e: log.debug(str(e)) self.service_browser._obj._bus = None self.service_browser._obj = None if self.domain_browser: try: self.domain_browser.Free() - except dbus.DBusException, e: + except dbus.DBusException as e: log.debug(str(e)) self.domain_browser._obj._bus = None self.domain_browser._obj = None diff --git a/src/common/zeroconf/zeroconf_bonjour.py b/src/common/zeroconf/zeroconf_bonjour.py index c8270c178b2f20bcec527144db82c27085648aca..593fa95b08a155cb9f226539d91c90fb7878cae1 100644 --- a/src/common/zeroconf/zeroconf_bonjour.py +++ b/src/common/zeroconf/zeroconf_bonjour.py @@ -24,7 +24,7 @@ from common.zeroconf.zeroconf import C_BARE_NAME, C_DOMAIN try: import pybonjour -except ImportError, e: +except ImportError: pass @@ -224,7 +224,7 @@ class Zeroconf: regtype = self.stype, port = self.port, txtRecord = self.txt, callBack = self.service_added_callback) self.service_sdRef = sdRef - except pybonjour.BonjourError, e: + except pybonjour.BonjourError as e: self.service_add_fail_callback(e) else: gajim.log.debug('Publishing service %s of type %s' % (self.name, self.stype)) @@ -248,7 +248,7 @@ class Zeroconf: self.service_sdRef.close() self.announced = False return True - except pybonjour.BonjourError, e: + except pybonjour.BonjourError as e: gajim.log.debug(e) return False @@ -282,8 +282,8 @@ class Zeroconf: gajim.log.debug('starting to browse') try: self.browse_sdRef = pybonjour.DNSServiceBrowse(regtype=self.stype, domain=domain, callBack=self.browse_callback) - except pybonjour.BonjourError, e: - self.error_CB("Error while browsing: %s" % e) + except pybonjour.BonjourError as e: + self.error_CB("Error while browsing: %s" % str(e)) def browse_loop(self): ready = select.select([self.browse_sdRef], [], [], 0) diff --git a/src/config.py b/src/config.py index 212d7d9ee84db9eb548659d7b4d3dda50a4af14d..588c7a5c3de6759caa03fdbc5b9690322ffe33f8 100644 --- a/src/config.py +++ b/src/config.py @@ -31,9 +31,11 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## -import gtk -import pango -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import Pango +from gi.repository import GObject +from gi.repository import GLib import os, sys import common.config import common.sleepy @@ -63,6 +65,7 @@ from common import gpg from common import ged try: + raise ImportError from common.multimedia_helpers import AudioInputManager, AudioOutputManager from common.multimedia_helpers import VideoInputManager, VideoOutputManager HAS_GST = True @@ -149,10 +152,10 @@ class PreferencesWindow: # user themes if os.path.isdir(gajim.MY_EMOTS_PATH): emoticons_list += os.listdir(gajim.MY_EMOTS_PATH) - renderer_text = gtk.CellRendererText() + renderer_text = Gtk.CellRendererText() emoticons_combobox.pack_start(renderer_text, True) emoticons_combobox.add_attribute(renderer_text, 'text', 0) - model = gtk.ListStore(str) + model = Gtk.ListStore(str) emoticons_combobox.set_model(model) l = [] for dir_ in emoticons_list: @@ -162,7 +165,7 @@ class PreferencesWindow: if dir_ != '.svn': l.append(dir_) l.append(_('Disabled')) - for i in xrange(len(l)): + for i in range(len(l)): model.append([l[i]]) if gajim.config.get('emoticons_theme') == l[i]: emoticons_combobox.set_active(i) @@ -208,7 +211,7 @@ class PreferencesWindow: ### Style tab ### # Themes theme_combobox = self.xml.get_object('theme_combobox') - cell = gtk.CellRendererText() + cell = Gtk.CellRendererText() theme_combobox.pack_start(cell, True) theme_combobox.add_attribute(cell, 'text', 0) self.update_theme_list() @@ -218,13 +221,13 @@ class PreferencesWindow: if os.path.isdir(gajim.MY_ICONSETS_PATH): iconsets_list += os.listdir(gajim.MY_ICONSETS_PATH) # new model, image in 0, string in 1 - model = gtk.ListStore(gtk.Image, str) + model = Gtk.ListStore(Gtk.Image, str) renderer_image = cell_renderer_image.CellRendererImage(0, 0) - renderer_text = gtk.CellRendererText() + renderer_text = Gtk.CellRendererText() renderer_text.set_property('xpad', 5) - self.iconset_combobox.pack_start(renderer_image, expand = False) - self.iconset_combobox.pack_start(renderer_text, expand = True) - self.iconset_combobox.set_attributes(renderer_text, text = 1) + self.iconset_combobox.pack_start(renderer_image, False) + self.iconset_combobox.pack_start(renderer_text, True) + self.iconset_combobox.add_attribute(renderer_text, 'text', 1) self.iconset_combobox.add_attribute(renderer_image, 'image', 0) self.iconset_combobox.set_model(model) l = [] @@ -236,8 +239,8 @@ class PreferencesWindow: l.append(dir) if l.count == 0: l.append(' ') - for i in xrange(len(l)): - preview = gtk.Image() + for i in range(len(l)): + preview = Gtk.Image() files = [] files.append(os.path.join(helpers.get_iconset_path(l[i]), '16x16', 'online.png')) @@ -390,69 +393,69 @@ class PreferencesWindow: # Default Status messages self.default_msg_tree = self.xml.get_object('default_msg_treeview') - col2 = self.default_msg_tree.rc_get_style().bg[gtk.STATE_ACTIVE].\ - to_string() + + #FIXME: That doesn't seem to work: + context = self.default_msg_tree.get_style_context() + col2 = context.get_background_color(Gtk.StateFlags.ACTIVE) + # (status, translated_status, message, enabled) - model = gtk.ListStore(str, str, str, bool) + model = Gtk.ListStore(str, str, str, bool) self.default_msg_tree.set_model(model) - col = gtk.TreeViewColumn(_('Status')) + col = Gtk.TreeViewColumn(_('Status')) col.set_resizable(True) self.default_msg_tree.append_column(col) - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() col.pack_start(renderer, False) - col.set_attributes(renderer, text = 1) - col = gtk.TreeViewColumn(_('Default Message')) + col.add_attribute(renderer, 'text', 1) + col = Gtk.TreeViewColumn(_('Default Message')) col.set_resizable(True) self.default_msg_tree.append_column(col) - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() col.pack_start(renderer, True) - col.set_attributes(renderer, text = 2) + col.add_attribute(renderer, 'text', 2) renderer.connect('edited', self.on_default_msg_cell_edited) renderer.set_property('editable', True) - renderer.set_property('cell-background', col2) - col = gtk.TreeViewColumn(_('Enabled')) + renderer.set_property('cell-background-rgba', col2) + col = Gtk.TreeViewColumn(_('Enabled')) col.set_resizable(True) self.default_msg_tree.append_column(col) - renderer = gtk.CellRendererToggle() + renderer = Gtk.CellRendererToggle() col.pack_start(renderer, False) - col.set_attributes(renderer, active = 3) + col.add_attribute(renderer, 'active', 3) renderer.set_property('activatable', True) renderer.connect('toggled', self.default_msg_toggled_cb) self.fill_default_msg_treeview() # Status messages self.msg_tree = self.xml.get_object('msg_treeview') - model = gtk.ListStore(str, str, str, str, str, str, str) - self.msg_tree.set_model(model) - col = gtk.TreeViewColumn('name') - self.msg_tree.append_column(col) - renderer = gtk.CellRendererText() - col.pack_start(renderer, True) - col.set_attributes(renderer, text = 0) + renderer = Gtk.CellRendererText() renderer.connect('edited', self.on_msg_cell_edited) renderer.set_property('editable', True) + col = Gtk.TreeViewColumn('name', renderer, text=0) + self.msg_tree.append_column(col) self.fill_msg_treeview() + buf = self.xml.get_object('msg_textview').get_buffer() - buf.connect('changed', self.on_msg_textview_changed) + buf.connect('end-user-action', self.on_msg_textview_changed) ### Audio / Video tab ### def create_av_combobox(opt_name, device_dict, config_name=None, key=None): combobox = self.xml.get_object(opt_name + '_combobox') - cell = gtk.CellRendererText() - cell.set_property('ellipsize', pango.ELLIPSIZE_END) + cell = Gtk.CellRendererText() + cell.set_property('ellipsize', Pango.EllipsizeMode.END) cell.set_property('ellipsize-set', True) combobox.pack_start(cell, True) combobox.add_attribute(cell, 'text', 0) - model = gtk.ListStore(str, str) + model = Gtk.ListStore(str, str) combobox.set_model(model) if config_name: config = gajim.config.get(config_name) else: config = gajim.config.get(opt_name + '_device') - for index, (name, value) in enumerate(sorted(device_dict.\ - iteritems(), key=key)): + for index, (name, value) in enumerate(sorted(device_dict.items(), + key=key)): model.append((name, value)) if config == value: combobox.set_active(index) @@ -586,10 +589,10 @@ class PreferencesWindow: gtkgui_helpers.possibly_move_window_in_current_desktop(self.window) def on_preferences_notebook_switch_page(self, widget, page, page_num): - gobject.idle_add(self.xml.get_object('close_button').grab_focus) + GLib.idle_add(self.xml.get_object('close_button').grab_focus) def on_preferences_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.window.hide() def get_per_account_option(self, opt): @@ -673,7 +676,7 @@ class PreferencesWindow: def on_emoticons_combobox_changed(self, widget): active = widget.get_active() model = widget.get_model() - emot_theme = model[active][0].decode('utf-8') + emot_theme = model[active][0] if emot_theme == _('Disabled'): gajim.config.set('emoticons_theme', '') else: @@ -739,7 +742,7 @@ class PreferencesWindow: lang = gajim.config.get('speller_language') if not lang: lang = gajim.LANG - tv = gtk.TextView() + tv = Gtk.TextView() try: gtkspell.Spell(tv, lang) except (TypeError, RuntimeError, OSError): @@ -762,7 +765,7 @@ class PreferencesWindow: def on_theme_combobox_changed(self, widget): model = widget.get_model() active = widget.get_active() - config_theme = model[active][0].decode('utf-8').replace(' ', '_') + config_theme = model[active][0].replace(' ', '_') gajim.config.set('roster_theme', config_theme) @@ -772,7 +775,7 @@ class PreferencesWindow: def update_theme_list(self): theme_combobox = self.xml.get_object('theme_combobox') - model = gtk.ListStore(str) + model = Gtk.ListStore(str) theme_combobox.set_model(model) i = 0 for config_theme in gajim.config.get_per('themes'): @@ -792,7 +795,7 @@ class PreferencesWindow: def on_iconset_combobox_changed(self, widget): model = widget.get_model() active = widget.get_active() - icon_string = model[active][1].decode('utf-8') + icon_string = model[active][1] gajim.config.set('iconset', icon_string) gtkgui_helpers.reload_jabber_state_images() @@ -953,21 +956,21 @@ class PreferencesWindow: if col: if isinstance(col_to_widget[c], list): self.xml.get_object(col_to_widget[c][0]).set_color( - gtk.gdk.color_parse(col)) + Gdk.color_parse(col)) self.xml.get_object(col_to_widget[c][0]).set_sensitive(True) self.xml.get_object(col_to_widget[c][1]).set_active(True) else: self.xml.get_object(col_to_widget[c]).set_color( - gtk.gdk.color_parse(col)) + Gdk.color_parse(col)) else: if isinstance(col_to_widget[c], list): self.xml.get_object(col_to_widget[c][0]).set_color( - gtk.gdk.color_parse('#000000')) + Gdk.color_parse('#000000')) self.xml.get_object(col_to_widget[c][0]).set_sensitive(False) self.xml.get_object(col_to_widget[c][1]).set_active(False) else: self.xml.get_object(col_to_widget[c]).set_color( - gtk.gdk.color_parse('#000000')) + Gdk.color_parse('#000000')) def on_reset_colors_button_clicked(self, widget): col_to_widget = {'inmsgcolor': 'incoming_nick_colorbutton', @@ -1016,7 +1019,7 @@ class PreferencesWindow: gajim.config.get('autoxatime') * 60) def on_auto_away_message_entry_changed(self, widget): - gajim.config.set('autoaway_message', widget.get_text().decode('utf-8')) + gajim.config.set('autoaway_message', widget.get_text()) def on_auto_xa_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'autoxa', @@ -1030,7 +1033,7 @@ class PreferencesWindow: gajim.config.get('autoxatime') * 60) def on_auto_xa_message_entry_changed(self, widget): - gajim.config.set('autoxa_message', widget.get_text().decode('utf-8')) + gajim.config.set('autoxa_message', widget.get_text()) def on_prompt_online_status_message_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'ask_online_status') @@ -1064,7 +1067,7 @@ class PreferencesWindow: def on_default_msg_treemodel_row_changed(self, model, path, iter_): status = model[iter_][0] - message = model[iter_][2].decode('utf-8') + message = model[iter_][2] message = helpers.to_one_line(message) gajim.config.set_per('defaultstatusmsg', status, 'enabled', model[iter_][3]) @@ -1074,26 +1077,28 @@ class PreferencesWindow: eventbox = self.xml.get_object('default_status_eventbox') vbox = self.xml.get_object('status_vbox') vbox.set_child_packing(eventbox, not expander.get_expanded(), True, 0, - gtk.PACK_START) + Gtk.PACK_START) def save_status_messages(self, model): for msg in gajim.config.get_per('statusmsg'): gajim.config.del_per('statusmsg', msg) iter_ = model.get_iter_first() while iter_: - val = model[iter_][0].decode('utf-8') + val = model[iter_][0] if model[iter_][1]: # we have a preset message if not val: # no title, use message text for title val = model[iter_][1] gajim.config.add_per('statusmsg', val) - msg = helpers.to_one_line(model[iter_][1].decode('utf-8')) + msg = helpers.to_one_line(model[iter_][1]) gajim.config.set_per('statusmsg', val, 'message', msg) i = 2 # store mood / activity for subname in ('activity', 'subactivity', 'activity_text', 'mood', 'mood_text'): - gajim.config.set_per('statusmsg', val, subname, - model[iter_][i].decode('utf-8')) + val2 = model[iter_][i] + if not val2: + val2 = '' + gajim.config.set_per('statusmsg', val, subname, val2) i += 1 iter_ = model.iter_next(iter_) @@ -1106,7 +1111,7 @@ class PreferencesWindow: def on_av_combobox_changed(self, combobox, config_name): model = combobox.get_model() active = combobox.get_active() - device = model[active][1].decode('utf-8') + device = model[active][1] gajim.config.set(config_name, device) def on_audio_input_combobox_changed(self, widget): @@ -1135,7 +1140,7 @@ class PreferencesWindow: [self.xml.get_object('stun_server_entry')]) def stun_server_entry_changed(self, widget): - gajim.config.set('stun_server', widget.get_text().decode('utf-8')) + gajim.config.set('stun_server', widget.get_text()) def on_applications_combobox_changed(self, widget): if widget.get_active() == 0: @@ -1146,13 +1151,13 @@ class PreferencesWindow: self.xml.get_object('custom_apps_frame').show() def on_custom_browser_entry_changed(self, widget): - gajim.config.set('custombrowser', widget.get_text().decode('utf-8')) + gajim.config.set('custombrowser', widget.get_text()) def on_custom_mail_client_entry_changed(self, widget): - gajim.config.set('custommailapp', widget.get_text().decode('utf-8')) + gajim.config.set('custommailapp', widget.get_text()) def on_custom_file_manager_entry_changed(self, widget): - gajim.config.set('custom_file_manager', widget.get_text().decode('utf-8')) + gajim.config.set('custom_file_manager', widget.get_text()) def on_log_show_changes_checkbutton_toggled(self, widget): self.on_checkbutton_toggled(widget, 'log_contact_status_changes') @@ -1212,7 +1217,10 @@ class PreferencesWindow: model.set_value(iter_, 0, new_text) def on_msg_treeview_cursor_changed(self, widget, data = None): - (model, iter_) = self.msg_tree.get_selection().get_selected() + sel = self.msg_tree.get_selection() + if not sel: + return + (model, iter_) = sel.get_selected() if not iter_: return self.xml.get_object('delete_msg_button').set_sensitive(True) @@ -1223,11 +1231,15 @@ class PreferencesWindow: def on_new_msg_button_clicked(self, widget, data = None): model = self.msg_tree.get_model() iter_ = model.append() - model.set(iter_, 0, _('status message title'), 1, _('status message text')) + model.set(iter_, 0, _('status message title'), 1, + _('status message text')) self.msg_tree.set_cursor(model.get_path(iter_)) def on_delete_msg_button_clicked(self, widget, data = None): - (model, iter_) = self.msg_tree.get_selection().get_selected() + sel = self.msg_tree.get_selection() + if not sel: + return + (model, iter_) = sel.get_selected() if not iter_: return buf = self.xml.get_object('msg_textview').get_buffer() @@ -1236,20 +1248,23 @@ class PreferencesWindow: self.xml.get_object('delete_msg_button').set_sensitive(False) def on_msg_textview_changed(self, widget, data = None): - (model, iter_) = self.msg_tree.get_selection().get_selected() + sel = self.msg_tree.get_selection() + if not sel: + return + (model, iter_) = sel.get_selected() if not iter_: return buf = self.xml.get_object('msg_textview').get_buffer() first_iter, end_iter = buf.get_bounds() - model.set_value(iter_, 1, buf.get_text(first_iter, end_iter)) + model.set_value(iter_, 1, buf.get_text(first_iter, end_iter, True)) def on_msg_treeview_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Delete: + if event.keyval == Gdk.KEY_Delete: self.on_delete_msg_button_clicked(widget) def on_proxies_combobox_changed(self, widget): active = widget.get_active() - proxy = widget.get_model()[active][0].decode('utf-8') + proxy = widget.get_model()[active][0] if proxy == _('None'): proxy = '' @@ -1259,7 +1274,8 @@ class PreferencesWindow: if 'manage_proxies' in gajim.interface.instances: gajim.interface.instances['manage_proxies'].window.present() else: - gajim.interface.instances['manage_proxies'] = ManageProxiesWindow() + gajim.interface.instances['manage_proxies'] = ManageProxiesWindow( + self.window) def update_proxy_list(self): our_proxy = gajim.config.get('global_proxy') @@ -1270,7 +1286,7 @@ class PreferencesWindow: model.clear() l = gajim.config.get_per('proxies') l.insert(0, _('None')) - for i in xrange(len(l)): + for i in range(len(l)): model.append([l[i]]) if our_proxy == l[i]: proxy_combobox.set_active(i) @@ -1284,10 +1300,10 @@ class PreferencesWindow: #---------- ManageProxiesWindow class -------------# class ManageProxiesWindow: - def __init__(self): + def __init__(self, transient_for=None): self.xml = gtkgui_helpers.get_gtk_builder('manage_proxies_window.ui') self.window = self.xml.get_object('manage_proxies_window') - self.window.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(transient_for) self.proxies_treeview = self.xml.get_object('proxies_treeview') self.proxyname_entry = self.xml.get_object('proxyname_entry') self.proxytype_combobox = self.xml.get_object('proxytype_combobox') @@ -1326,13 +1342,13 @@ class ManageProxiesWindow: self.xml.get_object('remove_proxy_button').set_sensitive(False) self.proxytype_combobox.set_sensitive(False) self.xml.get_object('proxy_table').set_sensitive(False) - model = gtk.ListStore(str) + model = Gtk.ListStore(str) self.proxies_treeview.set_model(model) - col = gtk.TreeViewColumn('Proxies') + col = Gtk.TreeViewColumn('Proxies') self.proxies_treeview.append_column(col) - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() col.pack_start(renderer, True) - col.set_attributes(renderer, text = 0) + col.add_attribute(renderer, 'text', 0) self.fill_proxies_treeview() self.xml.get_object('proxytype_combobox').set_active(0) @@ -1346,18 +1362,21 @@ class ManageProxiesWindow: model = self.proxies_treeview.get_model() proxies = gajim.config.get_per('proxies') i = 1 - while ('proxy' + unicode(i)) in proxies: + while ('proxy' + str(i)) in proxies: i += 1 iter_ = model.append() - model.set(iter_, 0, 'proxy' + unicode(i)) - gajim.config.add_per('proxies', 'proxy' + unicode(i)) + model.set(iter_, 0, 'proxy' + str(i)) + gajim.config.add_per('proxies', 'proxy' + str(i)) self.proxies_treeview.set_cursor(model.get_path(iter_)) def on_remove_proxy_button_clicked(self, widget): - (model, iter_) = self.proxies_treeview.get_selection().get_selected() + sel = self.proxies_treeview.get_selection() + if not sel: + return + (model, iter_) = sel.get_selected() if not iter_: return - proxy = model[iter_][0].decode('utf-8') + proxy = model[iter_][0] model.remove(iter_) gajim.config.del_per('proxies', proxy) self.xml.get_object('remove_proxy_button').set_sensitive(False) @@ -1372,7 +1391,7 @@ class ManageProxiesWindow: if self.block_signal: return act = widget.get_active() - proxy = self.proxyname_entry.get_text().decode('utf-8') + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'useauth', act) self.xml.get_object('proxyuser_entry').set_sensitive(act) self.xml.get_object('proxypass_entry').set_sensitive(act) @@ -1381,7 +1400,7 @@ class ManageProxiesWindow: if self.block_signal: return act = widget.get_active() - proxy = self.proxyname_entry.get_text().decode('utf-8') + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'bosh_useproxy', act) self.xml.get_object('proxyhost_entry').set_sensitive(act) self.xml.get_object('proxyport_entry').set_sensitive(act) @@ -1409,7 +1428,11 @@ class ManageProxiesWindow: #useauth_checkbutton.set_active(False) #self.on_useauth_checkbutton_toggled(useauth_checkbutton) - (model, iter_) = widget.get_selection().get_selected() + sel = widget.get_selection() + if sel: + (model, iter_) = sel.get_selected() + else: + iter_ = None if not iter_: self.xml.get_object('proxyname_entry').set_text('') self.xml.get_object('proxytype_combobox').set_sensitive(False) @@ -1437,7 +1460,7 @@ class ManageProxiesWindow: self.xml.get_object('proxy_table').set_sensitive(True) proxyhost_entry.set_text(gajim.config.get_per('proxies', proxy, 'host')) - proxyport_entry.set_text(unicode(gajim.config.get_per('proxies', + proxyport_entry.set_text(str(gajim.config.get_per('proxies', proxy, 'port'))) proxyuser_entry.set_text(gajim.config.get_per('proxies', proxy, 'user')) @@ -1454,17 +1477,20 @@ class ManageProxiesWindow: self.block_signal = False def on_proxies_treeview_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Delete: + if event.keyval == Gdk.KEY_Delete: self.on_remove_proxy_button_clicked(widget) def on_proxyname_entry_changed(self, widget): if self.block_signal: return - (model, iter_) = self.proxies_treeview.get_selection().get_selected() + sel = self.proxies_treeview.get_selection() + if not sel: + return + (model, iter_) = sel.get_selected() if not iter_: return - old_name = model.get_value(iter_, 0).decode('utf-8') - new_name = widget.get_text().decode('utf-8') + old_name = model.get_value(iter_, 0) + new_name = widget.get_text() if new_name == '': return if new_name == old_name: @@ -1482,42 +1508,42 @@ class ManageProxiesWindow: types = ['http', 'socks5', 'bosh'] type_ = self.proxytype_combobox.get_active() self.show_bosh_fields(types[type_]=='bosh') - proxy = self.proxyname_entry.get_text().decode('utf-8') + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'type', types[type_]) def on_proxyhost_entry_changed(self, widget): if self.block_signal: return - value = widget.get_text().decode('utf-8') - proxy = self.proxyname_entry.get_text().decode('utf-8') + value = widget.get_text() + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'host', value) def on_proxyport_entry_changed(self, widget): if self.block_signal: return - value = widget.get_text().decode('utf-8') - proxy = self.proxyname_entry.get_text().decode('utf-8') + value = widget.get_text() + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'port', value) def on_proxyuser_entry_changed(self, widget): if self.block_signal: return - value = widget.get_text().decode('utf-8') - proxy = self.proxyname_entry.get_text().decode('utf-8') + value = widget.get_text() + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'user', value) def on_boshuri_entry_changed(self, widget): if self.block_signal: return - value = widget.get_text().decode('utf-8') - proxy = self.proxyname_entry.get_text().decode('utf-8') + value = widget.get_text() + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'bosh_uri', value) def on_proxypass_entry_changed(self, widget): if self.block_signal: return - value = widget.get_text().decode('utf-8') - proxy = self.proxyname_entry.get_text().decode('utf-8') + value = widget.get_text() + proxy = self.proxyname_entry.get_text() gajim.config.set_per('proxies', proxy, 'pass', value) @@ -1546,12 +1572,15 @@ class AccountsWindow: img.set_from_file(path_to_kbd_input_img) self.notebook = self.xml.get_object('notebook') # Name - model = gtk.ListStore(str) + model = Gtk.ListStore(str) self.accounts_treeview.set_model(model) # column - renderer = gtk.CellRendererText() - self.accounts_treeview.insert_column_with_attributes(-1, _('Name'), - renderer, text=0) + renderer = Gtk.CellRendererText() + col = Gtk.TreeViewColumn() + col.set_title(_('Name')) + col.pack_start(renderer, False) + col.add_attribute(renderer, 'text', 0) + self.accounts_treeview.insert_column(col, -1) self.current_account = None # When we fill info, we don't want to handle the changed signals @@ -1581,15 +1610,15 @@ class AccountsWindow: self.xml.get_object('close_button').grab_focus() def on_accounts_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.check_resend_relog() self.window.destroy() def select_account(self, account): model = self.accounts_treeview.get_model() - iter_ = model.get_iter_root() + iter_ = model.get_iter_first() while iter_: - acct = model[iter_][0].decode('utf-8') + acct = model[iter_][0] if account == acct: self.accounts_treeview.set_cursor(model.get_path(iter_)) return @@ -1609,7 +1638,7 @@ class AccountsWindow: model.set(iter_, 0, account) self.selection = self.accounts_treeview.get_selection() - self.selection.select_iter(model.get_iter_root()) + self.selection.select_iter(model.get_iter_first()) def resend(self, account): if not account in gajim.connections: @@ -1644,7 +1673,7 @@ class AccountsWindow: status_before = gajim.connections[account].status gajim.interface.roster.send_status(account, 'offline', _('Be right back.')) - gobject.timeout_add(500, login, account, show_before, + GLib.timeout_add(500, login, account, show_before, status_before) def on_yes(checked, account): @@ -1669,11 +1698,14 @@ class AccountsWindow: 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') + if sel: + (model, iter_) = sel.get_selected() + if iter_: + account = model[iter_][0] + else: + account = None else: - account = None + iter_ = account = None if self.current_account and self.current_account == account: # We're comming back to our current account, no need to update # widgets @@ -1741,11 +1773,11 @@ class AccountsWindow: if not our_proxy: our_proxy = _('None') proxy_combobox = self.xml.get_object('proxies_combobox1') - model = gtk.ListStore(str) + model = Gtk.ListStore(str) proxy_combobox.set_model(model) l = gajim.config.get_per('proxies') l.insert(0, _('None')) - for i in xrange(len(l)): + for i in range(len(l)): model.append([l[i]]) if our_proxy == l[i]: proxy_combobox.set_active(i) @@ -1938,7 +1970,7 @@ class AccountsWindow: custom_port = 5222 gajim.config.set_per('accounts', account, 'custom_port', custom_port) - self.xml.get_object('custom_port_entry1').set_text(unicode(custom_port)) + self.xml.get_object('custom_port_entry1').set_text(str(custom_port)) # Personal tab gpg_key_label = self.xml.get_object('gpg_key_label1') @@ -2028,7 +2060,8 @@ class AccountsWindow: def on_rename_button_clicked(self, widget): if not self.current_account: return - active = gajim.config.get_per('accounts', self.current_account, 'active') + active = gajim.config.get_per('accounts', self.current_account, + 'active') and self.current_account in gajim.connections if active and gajim.connections[self.current_account].connected != 0: dialogs.ErrorDialog( _('You are currently connected to the server'), @@ -2139,7 +2172,8 @@ class AccountsWindow: message = _('Enter a new name for account %s') % self.current_account old_text = self.current_account dialogs.InputDialog(title, message, old_text, is_modal=False, - ok_handler=(on_renamed, self.current_account)) + ok_handler=(on_renamed, self.current_account), + transient_for=self.window) def option_changed(self, option, value): return gajim.config.get_per('accounts', self.current_account, option) \ @@ -2152,11 +2186,11 @@ class AccountsWindow: # check if jid is conform to RFC and stringprep it try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: if not widget.is_focus(): pritext = _('Invalid Jabber ID') dialogs.ErrorDialog(pritext, str(s), transient_for=self.window) - gobject.idle_add(lambda: widget.grab_focus()) + GLib.idle_add(lambda: widget.grab_focus()) return True jid_splited = jid.split('@', 1) @@ -2167,7 +2201,7 @@ class AccountsWindow: sectext = \ _('A Jabber ID must be in the form "user@servername".') dialogs.ErrorDialog(pritext, sectext, transient_for=self.window) - gobject.idle_add(lambda: widget.grab_focus()) + GLib.idle_add(lambda: widget.grab_focus()) return True @@ -2207,8 +2241,7 @@ class AccountsWindow: def on_password_entry1_changed(self, widget): if self.ignore_events: return - passwords.save_password(self.current_account, widget.get_text().decode( - 'utf-8')) + passwords.save_password(self.current_account, widget.get_text()) def on_save_password_checkbutton1_toggled(self, widget): if self.ignore_events: @@ -2227,15 +2260,14 @@ class AccountsWindow: def on_resource_entry1_focus_out_event(self, widget, event): if self.ignore_events: return - resource = self.xml.get_object('resource_entry1').get_text().decode( - 'utf-8') + resource = self.xml.get_object('resource_entry1').get_text() try: resource = helpers.parse_resource(resource) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: if not widget.is_focus(): pritext = _('Invalid Jabber ID') dialogs.ErrorDialog(pritext, str(s), transient_for=self.window) - gobject.idle_add(lambda: widget.grab_focus()) + GLib.idle_add(lambda: widget.grab_focus()) return True if self.option_changed('resource', resource): @@ -2276,7 +2308,8 @@ class AccountsWindow: new_password) try: - dialogs.ChangePasswordDialog(self.current_account, on_changed) + dialogs.ChangePasswordDialog(self.current_account, on_changed, + self.window) except GajimGeneralException: # if we showed ErrorDialog, there will not be dialog instance return @@ -2335,7 +2368,7 @@ class AccountsWindow: def on_proxies_combobox1_changed(self, widget): active = widget.get_active() - proxy = widget.get_model()[active][0].decode('utf-8') + proxy = widget.get_model()[active][0] if proxy == _('None'): proxy = '' @@ -2348,7 +2381,8 @@ class AccountsWindow: if 'manage_proxies' in gajim.interface.instances: gajim.interface.instances['manage_proxies'].window.present() else: - gajim.interface.instances['manage_proxies'] = ManageProxiesWindow() + gajim.interface.instances['manage_proxies'] = ManageProxiesWindow( + self.window) def on_warn_when_insecure_connection_checkbutton1_toggled(self, widget): if self.ignore_events: @@ -2377,7 +2411,7 @@ class AccountsWindow: def on_custom_host_entry1_changed(self, widget): if self.ignore_events: return - host = widget.get_text().decode('utf-8') + host = widget.get_text() if self.option_changed('custom_host', host): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, 'custom_host', @@ -2394,7 +2428,7 @@ class AccountsWindow: dialogs.ErrorDialog(_('Invalid entry'), _('Custom port must be a port number.'), transient_for=self.window) - gobject.idle_add(lambda: widget.grab_focus()) + GLib.idle_add(lambda: widget.grab_focus()) return True if self.option_changed('custom_port', custom_port): self.need_relogin = True @@ -2405,7 +2439,7 @@ class AccountsWindow: if self.current_account in gajim.connections and \ gajim.connections[self.current_account].gpg: secret_keys = gajim.connections[self.current_account].\ - ask_gpg_secrete_keys() + ask_gpg_secrete_keys() # self.current_account is None and/or gajim.connections is {} else: @@ -2657,7 +2691,7 @@ class AccountsWindow: def on_first_name_entry2_changed(self, widget): if self.ignore_events: return - name = widget.get_text().decode('utf-8') + name = widget.get_text() if self.option_changed('zeroconf_first_name', name): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, @@ -2666,7 +2700,7 @@ class AccountsWindow: def on_last_name_entry2_changed(self, widget): if self.ignore_events: return - name = widget.get_text().decode('utf-8') + name = widget.get_text() if self.option_changed('zeroconf_last_name', name): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, @@ -2675,7 +2709,7 @@ class AccountsWindow: def on_jabber_id_entry2_changed(self, widget): if self.ignore_events: return - id_ = widget.get_text().decode('utf-8') + id_ = widget.get_text() if self.option_changed('zeroconf_jabber_id', id_): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, @@ -2684,20 +2718,20 @@ class AccountsWindow: def on_email_entry2_changed(self, widget): if self.ignore_events: return - email = widget.get_text().decode('utf-8') + email = widget.get_text() if self.option_changed('zeroconf_email', email): self.need_relogin = True gajim.config.set_per('accounts', self.current_account, 'zeroconf_email', email) -class FakeDataForm(gtk.Table, object): +class FakeDataForm(Gtk.Table, object): """ Class for forms that are in XML format <entry1>value1</entry1> infos in a table {entry1: value1} """ def __init__(self, infos, selectable=False): - gtk.Table.__init__(self) + GObject.GObject.__init__(self) self.infos = infos self.selectable = selectable self.entries = {} @@ -2711,7 +2745,7 @@ class FakeDataForm(gtk.Table, object): if 'instructions' in self.infos: nbrow = 1 self.resize(rows = nbrow, columns = 2) - label = gtk.Label(self.infos['instructions']) + label = Gtk.Label(label=self.infos['instructions']) if self.selectable: label.set_selectable(True) self.attach(label, 0, 2, 0, 1, 0, 0, 0, 0) @@ -2723,9 +2757,9 @@ class FakeDataForm(gtk.Table, object): nbrow = nbrow + 1 self.resize(rows = nbrow, columns = 2) - label = gtk.Label(name.capitalize() + ':') + label = Gtk.Label(label=name.capitalize() + ':') self.attach(label, 0, 1, nbrow - 1, nbrow, 0, 0, 0, 0) - entry = gtk.Entry() + entry = Gtk.Entry() entry.set_activates_default(True) if self.infos[name]: entry.set_text(self.infos[name]) @@ -2738,7 +2772,7 @@ class FakeDataForm(gtk.Table, object): def get_infos(self): for name in self.entries.keys(): - self.infos[name] = self.entries[name].get_text().decode('utf-8') + self.infos[name] = self.entries[name].get_text() return self.infos class ServiceRegistrationWindow: @@ -2817,7 +2851,7 @@ class GroupchatConfigWindow: # widget sw = self.data_form_widget.xml.get_object( 'single_form_scrolledwindow') - sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER) + sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER) if self.form.title: self.xml.get_object('title_label').set_text(self.form.title) else: @@ -2825,7 +2859,7 @@ class GroupchatConfigWindow: self.xml.get_object('title_hseparator').hide() self.data_form_widget.show() - config_vbox.pack_start(self.data_form_widget) + config_vbox.pack_start(self.data_form_widget, True, True, 0) else: self.xml.get_object('title_label').set_no_show_all(True) self.xml.get_object('title_label').hide() @@ -2839,67 +2873,67 @@ class GroupchatConfigWindow: for affiliation in self.affiliation_labels.keys(): self.start_users_dict[affiliation] = {} - hbox = gtk.HBox(spacing=5) - add_on_vbox.pack_start(hbox, False) + hbox = Gtk.HBox(spacing=5) + add_on_vbox.pack_start(hbox, False, True, 0) - label = gtk.Label(self.affiliation_labels[affiliation]) - hbox.pack_start(label, False) + label = Gtk.Label(label=self.affiliation_labels[affiliation]) + hbox.pack_start(label, False, True, 0) - bb = gtk.HButtonBox() - bb.set_layout(gtk.BUTTONBOX_END) + bb = Gtk.HButtonBox() + bb.set_layout(Gtk.ButtonBoxStyle.END) bb.set_spacing(5) - hbox.pack_start(bb) - add_button = gtk.Button(stock=gtk.STOCK_ADD) + hbox.pack_start(bb, True, True, 0) + add_button = Gtk.Button(stock=Gtk.STOCK_ADD) add_button.connect('clicked', self.on_add_button_clicked, affiliation) - bb.pack_start(add_button) - self.remove_button[affiliation] = gtk.Button(stock=gtk.STOCK_REMOVE) + bb.pack_start(add_button, True, True, 0) + self.remove_button[affiliation] = Gtk.Button(stock=Gtk.STOCK_REMOVE) self.remove_button[affiliation].set_sensitive(False) self.remove_button[affiliation].connect('clicked', self.on_remove_button_clicked, affiliation) - bb.pack_start(self.remove_button[affiliation]) + bb.pack_start(self.remove_button[affiliation], True, True, 0) # jid, reason, nick, role - liststore = gtk.ListStore(str, str, str, str) - self.affiliation_treeview[affiliation] = gtk.TreeView(liststore) + liststore = Gtk.ListStore(str, str, str, str) + self.affiliation_treeview[affiliation] = Gtk.TreeView(liststore) self.affiliation_treeview[affiliation].get_selection().set_mode( - gtk.SELECTION_MULTIPLE) + Gtk.SelectionMode.MULTIPLE) self.affiliation_treeview[affiliation].connect('cursor-changed', self.on_affiliation_treeview_cursor_changed, affiliation) - renderer = gtk.CellRendererText() - col = gtk.TreeViewColumn(_('JID'), renderer) + renderer = Gtk.CellRendererText() + col = Gtk.TreeViewColumn(_('JID'), renderer) col.add_attribute(renderer, 'text', 0) col.set_resizable(True) col.set_sort_column_id(0) self.affiliation_treeview[affiliation].append_column(col) if affiliation == 'outcast': - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() renderer.set_property('editable', True) renderer.connect('edited', self.on_cell_edited) - col = gtk.TreeViewColumn(_('Reason'), renderer) + col = Gtk.TreeViewColumn(_('Reason'), renderer) col.add_attribute(renderer, 'text', 1) col.set_resizable(True) col.set_sort_column_id(1) self.affiliation_treeview[affiliation].append_column(col) elif affiliation == 'member': - renderer = gtk.CellRendererText() - col = gtk.TreeViewColumn(_('Nick'), renderer) + renderer = Gtk.CellRendererText() + col = Gtk.TreeViewColumn(_('Nick'), renderer) col.add_attribute(renderer, 'text', 2) col.set_resizable(True) col.set_sort_column_id(2) self.affiliation_treeview[affiliation].append_column(col) - renderer = gtk.CellRendererText() - col = gtk.TreeViewColumn(_('Role'), renderer) + renderer = Gtk.CellRendererText() + col = Gtk.TreeViewColumn(_('Role'), renderer) col.add_attribute(renderer, 'text', 3) col.set_resizable(True) col.set_sort_column_id(3) self.affiliation_treeview[affiliation].append_column(col) - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_NEVER) + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.NEVER) sw.add(self.affiliation_treeview[affiliation]) - add_on_vbox.pack_start(sw) + add_on_vbox.pack_start(sw, True, True, 0) gajim.connections[self.account].get_affiliation_list(self.room_jid, affiliation) @@ -2911,7 +2945,7 @@ class GroupchatConfigWindow: def on_cell_edited(self, cell, path, new_text): model = self.affiliation_treeview['outcast'].get_model() - new_text = new_text.decode('utf-8') + new_text = new_text iter_ = model.get_iter(path) model[iter_][1] = new_text @@ -2948,7 +2982,7 @@ class GroupchatConfigWindow: model, paths = selection.get_selected_rows() row_refs = [] for path in paths: - row_refs.append(gtk.TreeRowReference(model, path)) + row_refs.append(Gtk.TreeRowReference.new(model, path)) for row_ref in row_refs: path = row_ref.get_path() iter_ = model.get_iter(path) @@ -2989,16 +3023,15 @@ class GroupchatConfigWindow: iter_ = model.get_iter_first() # add new jid while iter_: - jid = model[iter_][0].decode('utf-8') + jid = model[iter_][0] actual_jid_list.append(jid) if jid not in self.start_users_dict[affiliation] or \ (affiliation == 'outcast' and 'reason' in self.start_users_dict[ affiliation][jid] and self.start_users_dict[affiliation][jid]\ - ['reason'] != model[iter_][1].decode('utf-8')): + ['reason'] != model[iter_][1]): users_dict[jid] = {'affiliation': affiliation} if affiliation == 'outcast': - users_dict[jid]['reason'] = model[iter_][1].decode( - 'utf-8') + users_dict[jid]['reason'] = model[iter_][1] iter_ = model.iter_next(iter_) # remove removed one for jid in self.start_users_dict[affiliation]: @@ -3138,8 +3171,8 @@ class ManageBookmarksWindow: # Account-JID, RoomName, Room-JID, Autojoin, Minimize, Passowrd, Nick, # Show_Status - self.treestore = gtk.TreeStore(str, str, str, bool, bool, str, str, str) - self.treestore.set_sort_column_id(1, gtk.SORT_ASCENDING) + self.treestore = Gtk.TreeStore(str, str, str, bool, bool, str, str, str) + self.treestore.set_sort_column_id(1, Gtk.SortType.ASCENDING) # Store bookmarks in treeview. for account in gajim.connections: @@ -3180,7 +3213,7 @@ class ManageBookmarksWindow: print_status ]) self.print_status_combobox = self.xml.get_object('print_status_combobox') - model = gtk.ListStore(str, str) + model = Gtk.ListStore(str, str) self.option_list = {'': _('Default'), 'all': Q_('?print_status:All'), 'in_and_out': _('Enter and leave only'), @@ -3196,8 +3229,8 @@ class ManageBookmarksWindow: self.view.set_model(self.treestore) self.view.expand_all() - renderer = gtk.CellRendererText() - column = gtk.TreeViewColumn('Bookmarks', renderer, text=1) + renderer = Gtk.CellRendererText() + column = Gtk.TreeViewColumn('Bookmarks', renderer, text=1) self.view.append_column(column) self.selection = self.view.get_selection() @@ -3211,7 +3244,8 @@ class ManageBookmarksWindow: self.server_entry = self.xml.get_object('server_entry') self.server_entry.connect('changed', self.on_server_entry_changed) self.room_entry = self.xml.get_object('room_entry') - self.room_entry.connect('changed', self.on_room_entry_changed) + self.room_entry_changed_id = self.room_entry.connect('changed', + self.on_room_entry_changed) self.pass_entry = self.xml.get_object('pass_entry') self.pass_entry.connect('changed', self.on_pass_entry_changed) self.autojoin_checkbutton = self.xml.get_object('autojoin_checkbutton') @@ -3220,7 +3254,7 @@ class ManageBookmarksWindow: self.xml.connect_signals(self) self.window.show_all() # select root iter - self.selection.select_iter(self.treestore.get_iter_root()) + self.selection.select_iter(self.treestore.get_iter_first()) def on_add_bookmark_button_clicked(self, widget): """ @@ -3241,7 +3275,7 @@ class ManageBookmarksWindow: # No parent, so we got an account -> add to this. add_to = iter_ - account = model[add_to][1].decode('utf-8') + account = model[add_to][1] nick = gajim.nicks[account] iter_ = self.treestore.append(add_to, [account, _('New Group Chat'), '@', False, False, '', nick, 'in_and_out']) @@ -3274,8 +3308,8 @@ class ManageBookmarksWindow: #Account data can't be changed return - if self.server_entry.get_text().decode('utf-8') == '' or \ - self.room_entry.get_text().decode('utf-8') == '': + if self.server_entry.get_text() == '' or \ + self.room_entry.get_text() == '': dialogs.ErrorDialog(_('This bookmark has invalid data'), _('Please be sure to fill out server and room fields or remove this' ' bookmark.')) @@ -3295,34 +3329,26 @@ class ManageBookmarksWindow: return for account in self.treestore: - account_unicode = account[1].decode('utf-8') - gajim.connections[account_unicode].bookmarks = [] + acct = account[1] + gajim.connections[acct].bookmarks = [] for bm in account.iterchildren(): # Convert True/False/None to '1' or '0' - autojoin = unicode(int(bm[3])) - minimize = unicode(int(bm[4])) + autojoin = str(int(bm[3])) + minimize = str(int(bm[4])) name = bm[1] - if name: - name = name.decode('utf-8') jid = bm[2] - if jid: - jid = jid.decode('utf-8') pw = bm[5] - if pw: - pw = pw.decode('utf-8') nick = bm[6] - if nick: - nick = nick.decode('utf-8') # create the bookmark-dict bmdict = { 'name': name, 'jid': jid, 'autojoin': autojoin, 'minimize': minimize, 'password': pw, 'nick': nick, 'print_status': bm[7]} - gajim.connections[account_unicode].bookmarks.append(bmdict) + gajim.connections[acct].bookmarks.append(bmdict) - gajim.connections[account_unicode].store_bookmarks() + gajim.connections[acct].store_bookmarks() gajim.interface.roster.set_actions_menu_needs_rebuild() self.window.destroy() @@ -3358,9 +3384,11 @@ class ManageBookmarksWindow: # Fill in the data for childs self.title_entry.set_text(model[iter_][1]) - room_jid = model[iter_][2].decode('utf-8') + room_jid = model[iter_][2] (room, server) = room_jid.split('@') + self.room_entry.handler_block(self.room_entry_changed_id) self.room_entry.set_text(room) + self.room_entry.handler_unblock(self.room_entry_changed_id) self.server_entry.set_text(server) self.autojoin_checkbutton.set_active(model[iter_][3]) @@ -3369,7 +3397,7 @@ class ManageBookmarksWindow: self.minimize_checkbutton.set_sensitive(model[iter_][3]) if model[iter_][5] is not None: - password = model[iter_][5].decode('utf-8') + password = model[iter_][5] else: password = None @@ -3379,7 +3407,6 @@ class ManageBookmarksWindow: self.pass_entry.set_text('') nick = model[iter_][6] if nick: - nick = nick.decode('utf-8') self.nick_entry.set_text(nick) else: self.nick_entry.set_text('') @@ -3398,12 +3425,12 @@ class ManageBookmarksWindow: def on_nick_entry_changed(self, widget): (model, iter_) = self.selection.get_selected() if iter_: - nick = self.nick_entry.get_text().decode('utf-8') + nick = self.nick_entry.get_text() try: nick = helpers.parse_resource(nick) - except helpers.InvalidFormat, e: + except helpers.InvalidFormat: dialogs.ErrorDialog(_('Invalid nickname'), - _('Character not allowed')) + _('Character not allowed'), transient_for=self.window) self.nick_entry.set_text(model[iter_][6]) return True model[iter_][6] = nick @@ -3412,18 +3439,23 @@ class ManageBookmarksWindow: (model, iter_) = self.selection.get_selected() if not iter_: return - server = widget.get_text().decode('utf-8') + server = widget.get_text() + if not server: + return if '@' in server: - dialogs.ErrorDialog(_('Invalid server'), _('Character not allowed')) + dialogs.ErrorDialog(_('Invalid server'), + _('Character not allowed'), transient_for=self.window) widget.set_text(server.replace('@', '')) - room_jid = self.room_entry.get_text().decode('utf-8').strip() + '@' + \ - server.strip() + room = self.room_entry.get_text().strip() + if not room: + return + room_jid = room + '@' + server.strip() try: - room_jid = helpers.parse_resource(room_jid) - except helpers.InvalidFormat, e: + room_jid = helpers.parse_jid(room_jid) + except helpers.InvalidFormat as e: dialogs.ErrorDialog(_('Invalid server'), - _('Character not allowed')) + _('Character not allowed'), transient_for=self.window) self.server_entry.set_text(model[iter_][2].split('@')[1]) return True model[iter_][2] = room_jid @@ -3432,18 +3464,24 @@ class ManageBookmarksWindow: (model, iter_) = self.selection.get_selected() if not iter_: return - room = widget.get_text().decode('utf-8') + room = widget.get_text() + if not room: + return if '@' in room: - dialogs.ErrorDialog(_('Invalid server'), _('Character not allowed')) - widget.set_text(room.replace('@', '')) - room_jid = room.strip() + '@' + \ - self.server_entry.get_text().decode('utf-8').strip() + room, server = room.split('@', 1) + widget.set_text(room) + if server: + self.server_entry.set_text(server) + self.server_entry.grab_focus() + server = self.server_entry.get_text().strip() + if not server: + return + room_jid = room.strip() + '@' + server try: - room_jid = helpers.parse_resource(room_jid) - except helpers.InvalidFormat, e: + room_jid = helpers.parse_jid(room_jid) + except helpers.InvalidFormat: dialogs.ErrorDialog(_('Invalid room'), - _('Character not allowed')) - self.room_entry.set_text(model[iter_][2].split('@')[0]) + _('Character not allowed'), transient_for=self.window) return True model[iter_][2] = room_jid @@ -3487,39 +3525,23 @@ class AccountCreationWizardWindow: self.window = self.xml.get_object('account_creation_wizard_window') self.window.set_transient_for(gajim.interface.roster.window) - completion = gtk.EntryCompletion() - completion1 = gtk.EntryCompletion() - # Connect events from comboboxentry.child + # Connect events from comboboxentry.get_child() server_comboboxentry = self.xml.get_object('server_comboboxentry') - entry = server_comboboxentry.child + entry = server_comboboxentry.get_child() entry.connect('key_press_event', self.on_server_comboboxentry_key_press_event, server_comboboxentry) - entry.set_completion(completion) # Do the same for the other server comboboxentry server_comboboxentry1 = self.xml.get_object('server_comboboxentry1') - entry = server_comboboxentry1.child - entry.set_completion(completion1) self.update_proxy_list() # parse servers.xml servers_xml = os.path.join(gajim.DATA_DIR, 'other', 'servers.xml') servers = gtkgui_helpers.parse_server_xml(servers_xml) - servers_model = gtk.ListStore(str) + servers_model = self.xml.get_object('server_liststore') for server in servers: servers_model.append((server,)) - completion.set_model(servers_model) - completion.set_text_column(0) - completion1.set_model(servers_model) - completion1.set_text_column(0) - - # Put servers into comboboxentries - server_comboboxentry.set_model(servers_model) - server_comboboxentry.set_text_column(0) - server_comboboxentry1.set_model(servers_model) - server_comboboxentry1.set_text_column(0) - # Generic widgets self.notebook = self.xml.get_object('notebook') self.cancel_button = self.xml.get_object('cancel_button') @@ -3628,7 +3650,7 @@ class AccountCreationWizardWindow: self.go_online_checkbutton.show() img = self.xml.get_object('finish_image') if self.modify: - img.set_from_stock(gtk.STOCK_APPLY, gtk.ICON_SIZE_DIALOG) + img.set_from_stock(Gtk.STOCK_APPLY, Gtk.IconSize.DIALOG) else: path_to_file = gtkgui_helpers.get_icon_path('gajim', 48) img.set_from_file(path_to_file) @@ -3653,20 +3675,18 @@ class AccountCreationWizardWindow: # We are adding an existing account anonymous = self.xml.get_object('anonymous_checkbutton1').\ get_active() - username = self.xml.get_object('username_entry').get_text().decode( - 'utf-8').strip() + username = self.xml.get_object('username_entry').get_text().strip() if not username and not anonymous: pritext = _('Invalid username') sectext = _( 'You must provide a username to configure this account.') dialogs.ErrorDialog(pritext, sectext) return - server = self.xml.get_object('server_comboboxentry').child.\ - get_text().decode('utf-8').strip() + server = self.xml.get_object('server_comboboxentry').get_child().\ + get_text().strip() savepass = self.xml.get_object('save_password_checkbutton').\ get_active() - password = self.xml.get_object('password_entry').get_text().decode( - 'utf-8') + password = self.xml.get_object('password_entry').get_text() if anonymous: jid = '' @@ -3676,7 +3696,7 @@ class AccountCreationWizardWindow: # check if jid is conform to RFC and stringprep it try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: pritext = _('Invalid Jabber ID') dialogs.ErrorDialog(pritext, str(s)) return @@ -3695,8 +3715,8 @@ class AccountCreationWizardWindow: self.show_finish_page() elif cur_page == 2: # We are creating a new account - server = self.xml.get_object('server_comboboxentry1').child.\ - get_text().decode('utf-8') + server = self.xml.get_object('server_comboboxentry1').get_child().\ + get_text() if not server: dialogs.ErrorDialog(_('Invalid server'), @@ -3712,7 +3732,7 @@ class AccountCreationWizardWindow: # Get advanced options proxies_combobox = self.xml.get_object('proxies_combobox') active = proxies_combobox.get_active() - proxy = proxies_combobox.get_model()[active][0].decode('utf-8') + proxy = proxies_combobox.get_model()[active][0] if proxy == _('None'): proxy = '' config['proxy'] = proxy @@ -3728,7 +3748,7 @@ class AccountCreationWizardWindow: return config['custom_port'] = custom_port config['custom_host'] = self.xml.get_object( - 'custom_host_entry').get_text().decode('utf-8') + 'custom_host_entry').get_text() if self.xml.get_object('anonymous_checkbutton2').get_active(): self.modify = True @@ -3738,7 +3758,7 @@ class AccountCreationWizardWindow: self.notebook.set_current_page(5) # show creating page self.back_button.hide() self.forward_button.hide() - self.update_progressbar_timeout_id = gobject.timeout_add(100, + self.update_progressbar_timeout_id = GLib.timeout_add(100, self.update_progressbar) # Get form from serveur con = connection.Connection(self.account) @@ -3780,16 +3800,16 @@ class AccountCreationWizardWindow: self.notebook.set_current_page(5) # show creating page self.back_button.hide() self.forward_button.hide() - self.update_progressbar_timeout_id = gobject.timeout_add(100, + self.update_progressbar_timeout_id = GLib.timeout_add(100, self.update_progressbar) def update_proxy_list(self): proxies_combobox = self.xml.get_object('proxies_combobox') - model = gtk.ListStore(str) + model = Gtk.ListStore(str) proxies_combobox.set_model(model) l = gajim.config.get_per('proxies') l.insert(0, _('None')) - for i in xrange(len(l)): + for i in range(len(l)): model.append([l[i]]) proxies_combobox.set_active(0) @@ -3816,7 +3836,7 @@ class AccountCreationWizardWindow: if obj.conn.name != self.account: return if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GLib.source_remove(self.update_progressbar_timeout_id) self.back_button.show() self.forward_button.show() self.is_form = obj.is_form @@ -3835,7 +3855,7 @@ class AccountCreationWizardWindow: empty_config = False break self.data_form_widget.show_all() - self.xml.get_object('form_vbox').pack_start(self.data_form_widget) + self.xml.get_object('form_vbox').pack_start(self.data_form_widget, True, True, 0) if empty_config: self.forward_button.set_sensitive(False) self.notebook.set_current_page(4) # show form page @@ -3874,7 +3894,7 @@ class AccountCreationWizardWindow: if self.account not in gajim.connections: return if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GLib.source_remove(self.update_progressbar_timeout_id) del gajim.connections[self.account] if self.account in gajim.config.get_per('accounts'): gajim.config.del_per('accounts', self.account) @@ -3883,7 +3903,7 @@ class AccountCreationWizardWindow: self.go_online_checkbutton.hide() self.show_vcard_checkbutton.hide() img = self.xml.get_object('finish_image') - img.set_from_stock(gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_DIALOG) + img.set_from_stock(Gtk.STOCK_DIALOG_ERROR, Gtk.IconSize.DIALOG) finish_text = '<big><b>%s</b></big>\n\n%s' % ( _('An error occurred during account creation'), obj.reason) self.finish_label.set_markup(finish_text) @@ -3900,7 +3920,7 @@ class AccountCreationWizardWindow: self.show_finish_page() if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GLib.source_remove(self.update_progressbar_timeout_id) def _nec_acc_is_not_ok(self, obj): """ @@ -3917,14 +3937,14 @@ class AccountCreationWizardWindow: if self.account in gajim.config.get_per('accounts'): gajim.config.del_per('accounts', self.account) img = self.xml.get_object('finish_image') - img.set_from_stock(gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_DIALOG) + img.set_from_stock(Gtk.STOCK_DIALOG_ERROR, Gtk.IconSize.DIALOG) finish_text = '<big><b>%s</b></big>\n\n%s' % (_( 'An error occurred during account creation'), obj.reason) self.finish_label.set_markup(finish_text) self.notebook.set_current_page(6) # show finish page if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GLib.source_remove(self.update_progressbar_timeout_id) def on_advanced_button_clicked(self, widget): if 'accounts' in gajim.interface.instances: @@ -3945,15 +3965,15 @@ class AccountCreationWizardWindow: def on_username_entry_key_press_event(self, widget, event): # Check for pressed @ and jump to combobox if found - if event.keyval == gtk.keysyms.at: + if event.keyval == Gdk.KEY_at: combobox = self.xml.get_object('server_comboboxentry') combobox.grab_focus() - combobox.child.set_position(-1) + combobox.get_child().set_position(-1) return True def on_server_comboboxentry_key_press_event(self, widget, event, combobox): # If backspace is pressed in empty field, return to the nick entry field - backspace = event.keyval == gtk.keysyms.BackSpace + backspace = event.keyval == Gdk.KEY_BackSpace empty = len(combobox.get_active_text()) == 0 if backspace and empty and self.modify: username_entry = self.xml.get_object('username_entry') @@ -4082,14 +4102,14 @@ class ManagePEPServicesWindow: def init_services(self): self.treeview = self.xml.get_object('services_treeview') # service, access_model, group - self.treestore = gtk.ListStore(str) + self.treestore = Gtk.ListStore(str) self.treeview.set_model(self.treestore) - col = gtk.TreeViewColumn('Service') + col = Gtk.TreeViewColumn('Service') self.treeview.append_column(col) - cellrenderer_text = gtk.CellRendererText() - col.pack_start(cellrenderer_text) + cellrenderer_text = Gtk.CellRendererText() + col.pack_start(cellrenderer_text, True, True, 0) col.add_attribute(cellrenderer_text, 'text', 0) our_jid = gajim.get_jid_from_account(self.account) @@ -4105,7 +4125,7 @@ class ManagePEPServicesWindow: if jid != gajim.get_jid_from_account(self.account): return model = self.treeview.get_model() - iter_ = model.get_iter_root() + iter_ = model.get_iter_first() while iter_: if model[iter_][0] == node: model.remove(iter_) @@ -4152,43 +4172,44 @@ class ManageSoundsWindow: def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('manage_sounds_window.ui') self.window = self.xml.get_object('manage_sounds_window') - + self.window.set_transient_for( + gajim.interface.instances['preferences'].window) # sounds treeview self.sound_tree = self.xml.get_object('sounds_treeview') # active, event ui name, path to sound file, event_config_name - model = gtk.ListStore(bool, str, str, str) + model = Gtk.ListStore(bool, str, str, str) self.sound_tree.set_model(model) - col = gtk.TreeViewColumn(_('Active')) + col = Gtk.TreeViewColumn(_('Active')) self.sound_tree.append_column(col) - renderer = gtk.CellRendererToggle() + renderer = Gtk.CellRendererToggle() renderer.set_property('activatable', True) renderer.connect('toggled', self.sound_toggled_cb) - col.pack_start(renderer) - col.set_attributes(renderer, active = 0) + col.pack_start(renderer, True) + col.add_attribute(renderer, 'active', 0) - col = gtk.TreeViewColumn(_('Event')) + col = Gtk.TreeViewColumn(_('Event')) self.sound_tree.append_column(col) - renderer = gtk.CellRendererText() - col.pack_start(renderer) - col.set_attributes(renderer, text = 1) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', 1) self.fill_sound_treeview() self.xml.connect_signals(self) self.sound_tree.get_model().connect('row-changed', - self.on_sounds_treemodel_row_changed) + self.on_sounds_treemodel_row_changed) self.window.show_all() def on_sounds_treemodel_row_changed(self, model, path, iter_): - sound_event = model[iter_][3].decode('utf-8') + sound_event = model[iter_][3] gajim.config.set_per('soundevents', sound_event, 'enabled', - bool(model[path][0])) + bool(model[path][0])) gajim.config.set_per('soundevents', sound_event, 'path', - model[iter_][2].decode('utf-8')) + model[iter_][2]) def sound_toggled_cb(self, cell, path): model = self.sound_tree.get_model() @@ -4197,7 +4218,7 @@ class ManageSoundsWindow: def fill_sound_treeview(self): model = self.sound_tree.get_model() model.clear() - model.set_sort_column_id(1, gtk.SORT_ASCENDING) + model.set_sort_column_id(1, Gtk.SortType.ASCENDING) # NOTE: sounds_ui_names MUST have all items of # sounds = gajim.config.get_per('soundevents') as keys @@ -4223,8 +4244,12 @@ class ManageSoundsWindow: model.append((enabled, sound_ui_name, path, sound_event_config_name)) def on_treeview_sounds_cursor_changed(self, widget, data = None): - (model, iter_) = self.sound_tree.get_selection().get_selected() sounds_entry = self.xml.get_object('sounds_entry') + sel = self.sound_tree.get_selection() + if not sel: + sounds_entry.set_text('') + return + (model, iter_) = sel.get_selected() if not iter_: sounds_entry.set_text('') return @@ -4232,7 +4257,10 @@ class ManageSoundsWindow: sounds_entry.set_text(path_to_snd_file) def on_browse_for_sounds_button_clicked(self, widget, data = None): - (model, iter_) = self.sound_tree.get_selection().get_selected() + sel = self.sound_tree.get_selection() + if not sel: + return + (model, iter_) = sel.get_selected() if not iter_: return def on_ok(widget, path_to_snd_file): @@ -4254,7 +4282,7 @@ class ManageSoundsWindow: def on_cancel(widget): self.dialog.destroy() - path_to_snd_file = model[iter_][2].decode('utf-8') + path_to_snd_file = model[iter_][2] self.dialog = dialogs.SoundChooserDialog(path_to_snd_file, on_ok, on_cancel) @@ -4264,7 +4292,10 @@ class ManageSoundsWindow: model[iter_][2] = path_to_snd_file # set new path to sounds_model def on_play_button_clicked(self, widget): - model, iter_ = self.sound_tree.get_selection().get_selected() + sel = self.sound_tree.get_selection() + if not sel: + return + model, iter_ = sel.get_selected() if not iter_: return snd_event_config_name = model[iter_][3] diff --git a/src/conversation_textview.py b/src/conversation_textview.py index 670b90de84018ed50f710d9aecf1b57e7a448204..ee27c0903e943e4214155793dbefbc4bd8b865bc 100644 --- a/src/conversation_textview.py +++ b/src/conversation_textview.py @@ -29,15 +29,18 @@ from threading import Timer # for smooth scrolling -import gtk -import pango -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf +from gi.repository import Pango +from gi.repository import GObject +from gi.repository import GLib import time import os import tooltips import dialogs import locale -import Queue +import queue import urllib import gtkgui_helpers @@ -63,9 +66,10 @@ def is_selection_modified(mark): return False def has_focus(widget): - return widget.flags() & gtk.HAS_FOCUS == gtk.HAS_FOCUS + return widget.get_state_flags() & Gtk.StateFlags.FOCUSED == \ + Gtk.StateFlags.FOCUSED -class TextViewImage(gtk.Image): +class TextViewImage(Gtk.Image): def __init__(self, anchor, text): super(TextViewImage, self).__init__() @@ -73,9 +77,9 @@ class TextViewImage(gtk.Image): self._selected = False self._disconnect_funcs = [] self.connect('parent-set', self.on_parent_set) - self.connect('expose-event', self.on_expose) + self.connect('draw', self.on_expose) self.set_tooltip_markup(text) - self.anchor.set_data('plaintext', text) + self.anchor.plaintext = text def _get_selected(self): parent = self.get_parent() @@ -91,14 +95,14 @@ class TextViewImage(gtk.Image): def get_state(self): parent = self.get_parent() if not parent: - return gtk.STATE_NORMAL + return Gtk.StateType.NORMAL if self._selected: if has_focus(parent): - return gtk.STATE_SELECTED + return Gtk.StateType.SELECTED else: - return gtk.STATE_ACTIVE + return Gtk.StateType.ACTIVE else: - return gtk.STATE_NORMAL + return Gtk.StateType.NORMAL def _update_selected(self): selected = self._get_selected() @@ -149,30 +153,26 @@ class TextViewImage(gtk.Image): def on_expose(self, widget, event): state = self.get_state() - if state != gtk.STATE_NORMAL: + if state != Gtk.StateType.NORMAL: gc = widget.get_style().base_gc[state] area = widget.allocation - widget.window.draw_rectangle(gc, True, area.x, area.y, - area.width, area.height) + widget.get_window(Gtk.TextWindowType.TEXT).draw_rectangle(gc, True, + area.x, area.y, area.width, area.height) return False -class ConversationTextview(gobject.GObject): +class ConversationTextview(GObject.GObject): """ Class for the conversation textview (where user reads already said messages) for chat/groupchat windows """ __gsignals__ = dict( - quote = (gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_ACTION, + quote = (GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, None, # return value (str, ) # arguments ) ) - FOCUS_OUT_LINE_PIXBUF = gtkgui_helpers.get_icon_pixmap( - 'gajim-muc_separator') - XEP0184_WARNING_PIXBUF = gtkgui_helpers.get_icon_pixmap('gtk-no') - XEP0184_RECEIVED_PIXBUF = gtkgui_helpers.get_icon_pixmap('gtk-yes') MESSAGE_CORRECTED_PIXBUF = gtkgui_helpers.get_icon_pixmap('gtk-spell-check') # smooth scroll constants @@ -184,7 +184,7 @@ class ConversationTextview(gobject.GObject): If used_in_history_window is True, then we do not show Clear menuitem in context menu """ - gobject.GObject.__init__(self) + GObject.GObject.__init__(self) self.used_in_history_window = used_in_history_window self.fc = FuzzyClock() @@ -199,7 +199,7 @@ class ConversationTextview(gobject.GObject): self.tv.set_accepts_tab(True) self.tv.set_editable(False) self.tv.set_cursor_visible(False) - self.tv.set_wrap_mode(gtk.WRAP_WORD_CHAR) + self.tv.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) self.tv.set_left_margin(2) self.tv.set_right_margin(2) self.handlers = {} @@ -224,8 +224,7 @@ class ConversationTextview(gobject.GObject): self.on_textview_button_press_event) self.handlers[id_] = self.tv - id_ = self.tv.connect('expose-event', - self.on_textview_expose_event) + id_ = self.tv.connect('draw', self.on_textview_draw) self.handlers[id_] = self.tv @@ -233,33 +232,33 @@ class ConversationTextview(gobject.GObject): self.change_cursor = False self.last_time_printout = 0 - font = pango.FontDescription(gajim.config.get('conversation_font')) - self.tv.modify_font(font) + font = Pango.FontDescription(gajim.config.get('conversation_font')) + self.tv.override_font(font) buffer_ = self.tv.get_buffer() end_iter = buffer_.get_end_iter() buffer_.create_mark('end', end_iter, False) self.tagIn = buffer_.create_tag('incoming') color = gajim.config.get('inmsgcolor') - font = pango.FontDescription(gajim.config.get('inmsgfont')) + font = Pango.FontDescription(gajim.config.get('inmsgfont')) self.tagIn.set_property('foreground', color) self.tagIn.set_property('font-desc', font) self.tagOut = buffer_.create_tag('outgoing') color = gajim.config.get('outmsgcolor') - font = pango.FontDescription(gajim.config.get('outmsgfont')) + font = Pango.FontDescription(gajim.config.get('outmsgfont')) self.tagOut.set_property('foreground', color) self.tagOut.set_property('font-desc', font) self.tagStatus = buffer_.create_tag('status') color = gajim.config.get('statusmsgcolor') - font = pango.FontDescription(gajim.config.get('satusmsgfont')) + font = Pango.FontDescription(gajim.config.get('satusmsgfont')) self.tagStatus.set_property('foreground', color) self.tagStatus.set_property('font-desc', font) self.tagInText = buffer_.create_tag('incomingtxt') color = gajim.config.get('inmsgtxtcolor') - font = pango.FontDescription(gajim.config.get('inmsgtxtfont')) + font = Pango.FontDescription(gajim.config.get('inmsgtxtfont')) if color: self.tagInText.set_property('foreground', color) self.tagInText.set_property('font-desc', font) @@ -267,7 +266,7 @@ class ConversationTextview(gobject.GObject): self.tagOutText = buffer_.create_tag('outgoingtxt') color = gajim.config.get('outmsgtxtcolor') if color: - font = pango.FontDescription(gajim.config.get('outmsgtxtfont')) + font = Pango.FontDescription(gajim.config.get('outmsgtxtfont')) self.tagOutText.set_property('foreground', color) self.tagOutText.set_property('font-desc', font) @@ -281,40 +280,46 @@ class ConversationTextview(gobject.GObject): self.tagMarked = buffer_.create_tag('marked') color = gajim.config.get('markedmsgcolor') self.tagMarked.set_property('foreground', color) - self.tagMarked.set_property('weight', pango.WEIGHT_BOLD) + self.tagMarked.set_property('weight', Pango.Weight.BOLD) tag = buffer_.create_tag('time_sometimes') tag.set_property('foreground', 'darkgrey') - tag.set_property('scale', pango.SCALE_SMALL) - tag.set_property('justification', gtk.JUSTIFY_CENTER) + #Pango.SCALE_SMALL + tag.set_property('scale', 0.8333333333333) + tag.set_property('justification', Gtk.Justification.CENTER) tag = buffer_.create_tag('small') - tag.set_property('scale', pango.SCALE_SMALL) + #Pango.SCALE_SMALL + tag.set_property('scale', 0.8333333333333) tag = buffer_.create_tag('restored_message') color = gajim.config.get('restored_messages_color') tag.set_property('foreground', color) self.tv.create_tags() - + tag = buffer_.create_tag('bold') - tag.set_property('weight', pango.WEIGHT_BOLD) + tag.set_property('weight', Pango.Weight.BOLD) tag = buffer_.create_tag('italic') - tag.set_property('style', pango.STYLE_ITALIC) + tag.set_property('style', Pango.Style.ITALIC) tag = buffer_.create_tag('underline') - tag.set_property('underline', pango.UNDERLINE_SINGLE) + tag.set_property('underline', Pango.Underline.SINGLE) - buffer_.create_tag('focus-out-line', justification = gtk.JUSTIFY_CENTER) + buffer_.create_tag('focus-out-line', justification = Gtk.Justification.CENTER) self.displaymarking_tags = {} tag = buffer_.create_tag('xep0184-warning') + tag.set_property('foreground', '#cc0000') + + tag = buffer_.create_tag('xep0184-received') + tag.set_property('foreground', '#73d216') # One mark at the begining then 2 marks between each lines size = gajim.config.get('max_conversation_lines') size = 2 * size - 1 - self.marks_queue = Queue.Queue(size) + self.marks_queue = queue.Queue(size) self.allow_focus_out_line = True # holds a mark at the end of --- line @@ -323,8 +328,6 @@ class ConversationTextview(gobject.GObject): self.xep0184_warning_tooltip = tooltips.BaseTooltip() self.line_tooltip = tooltips.BaseTooltip() - # use it for hr too - self.tv.focus_out_line_pixbuf = ConversationTextview.FOCUS_OUT_LINE_PIXBUF self.smooth_id = None self.just_cleared = False @@ -365,7 +368,7 @@ class ConversationTextview(gobject.GObject): if not parent: return False vadj = parent.get_vadjustment() - max_val = vadj.upper - vadj.page_size + 1 + max_val = vadj.get_upper() - vadj.get_page_size() + 1 cur_val = vadj.get_value() # scroll by 1/3rd of remaining distance onethird = cur_val + ((max_val - cur_val) / 3.0) @@ -379,26 +382,26 @@ class ConversationTextview(gobject.GObject): return True def smooth_scroll_timeout(self): - gobject.idle_add(self.do_smooth_scroll_timeout) + GLib.idle_add(self.do_smooth_scroll_timeout) return def do_smooth_scroll_timeout(self): if not self.smooth_id: # we finished scrolling return - gobject.source_remove(self.smooth_id) + GLib.source_remove(self.smooth_id) self.smooth_id = None parent = self.tv.get_parent() if parent: vadj = parent.get_vadjustment() self.auto_scrolling = True - vadj.set_value(vadj.upper - vadj.page_size + 1) + vadj.set_value(vadj.get_upper() - vadj.get_page_size() + 1) self.auto_scrolling = False def smooth_scroll_to_end(self): if None != self.smooth_id: # already scrolling return False - self.smooth_id = gobject.timeout_add(self.SCROLL_DELAY, + self.smooth_id = GLib.timeout_add(self.SCROLL_DELAY, self.smooth_scroll) self.smooth_scroll_timer = Timer(self.MAX_SCROLL_TIME, self.smooth_scroll_timeout) @@ -428,9 +431,9 @@ class ConversationTextview(gobject.GObject): # scroll only if expected end is not visible if end_rect.y >= (visible_rect.y + visible_rect.height + diff_y): if use_smooth: - gobject.idle_add(self.smooth_scroll_to_end) + GLib.idle_add(self.smooth_scroll_to_end) else: - gobject.idle_add(self.scroll_to_end_iter) + GLib.idle_add(self.scroll_to_end_iter) def scroll_to_end_iter(self): buffer_ = self.tv.get_buffer() @@ -442,7 +445,7 @@ class ConversationTextview(gobject.GObject): def stop_scrolling(self): if self.smooth_id: - gobject.source_remove(self.smooth_id) + GLib.source_remove(self.smooth_id) self.smooth_id = None self.smooth_scroll_timer.cancel() @@ -463,7 +466,7 @@ class ConversationTextview(gobject.GObject): buffer_ = self.tv.get_buffer() i1 = buffer_.get_iter_at_mark(m1) i2 = buffer_.get_iter_at_mark(m2) - txt = buffer_.get_text(i1, i2) + txt = buffer_.get_text(i1, i2, True) buffer_.delete(i1, i2) tag = 'outgoingtxt' if message.startswith('/me'): @@ -471,7 +474,7 @@ class ConversationTextview(gobject.GObject): i2 = self.print_conversation_line(message, '', 'outgoing', name, None, xhtml=xhtml, iter_=i1) tt_txt = _('<b>Message was corrected. Last message was:</b>\n %s') % \ - gobject.markup_escape_text(old_txt) + GLib.markup_escape_text(old_txt) self.show_corrected_message_warning(i2, tt_txt) self.last_sent_message_marks[1] = buffer_.create_mark(None, i2, left_gravity=True) @@ -484,12 +487,12 @@ class ConversationTextview(gobject.GObject): buffer_ = self.tv.get_buffer() i1 = buffer_.get_iter_at_mark(m1) i2 = buffer_.get_iter_at_mark(m2) - txt = buffer_.get_text(i1, i2) + txt = buffer_.get_text(i1, i2, True) buffer_.delete(i1, i2) i2 = self.print_conversation_line(message, '', 'incoming', name, None, xhtml=xhtml, iter_=i1) tt_txt = _('<b>Message was corrected. Last message was:</b>\n %s') % \ - gobject.markup_escape_text(old_txt) + GLib.markup_escape_text(old_txt) self.show_corrected_message_warning(i2, tt_txt) self.last_received_message_marks[name][1] = buffer_.create_mark(None, i2, left_gravity=True) @@ -511,22 +514,11 @@ class ConversationTextview(gobject.GObject): return False end_iter = buffer_.get_iter_at_mark(self.xep0184_marks[id_]) - buffer_.insert(end_iter, ' ') - anchor = buffer_.create_child_anchor(end_iter) - img = TextViewImage(anchor, '') - img.set_from_pixbuf(ConversationTextview.XEP0184_WARNING_PIXBUF) - img.show() - self.tv.add_child_at_anchor(img, anchor) - before_img_iter = buffer_.get_iter_at_mark(self.xep0184_marks[id_]) - before_img_iter.forward_char() - post_img_iter = before_img_iter.copy() - post_img_iter.forward_char() - buffer_.apply_tag_by_name('xep0184-warning', before_img_iter, - post_img_iter) + buffer_.insert_with_tags_by_name(end_iter, ' ✖', 'xep0184-warning') self.xep0184_shown[id_] = SHOWN return False - gobject.timeout_add_seconds(3, show_it) + GLib.timeout_add_seconds(3, show_it) buffer_.end_user_action() @@ -549,12 +541,8 @@ class ConversationTextview(gobject.GObject): if gajim.config.get('positive_184_ack'): begin_iter = buffer_.get_iter_at_mark(self.xep0184_marks[id_]) - buffer_.insert(begin_iter, ' ') - anchor = buffer_.create_child_anchor(begin_iter) - img = TextViewImage(anchor, '') - img.set_from_pixbuf(ConversationTextview.XEP0184_RECEIVED_PIXBUF) - img.show() - self.tv.add_child_at_anchor(img, anchor) + buffer_.insert_with_tags_by_name(begin_iter, ' ✓', + 'xep0184-received') self.xep0184_shown[id_] = ALREADY_RECEIVED @@ -595,7 +583,7 @@ class ConversationTextview(gobject.GObject): self.focus_out_end_mark) begin_iter_for_previous_line = end_iter_for_previous_line.copy() # img_char+1 (the '\n') - begin_iter_for_previous_line.backward_chars(2) + begin_iter_for_previous_line.backward_chars(21) # remove focus out line buffer_.delete(begin_iter_for_previous_line, @@ -604,14 +592,12 @@ class ConversationTextview(gobject.GObject): # add the new focus out line end_iter = buffer_.get_end_iter() - buffer_.insert(end_iter, '\n') - buffer_.insert_pixbuf(end_iter, - ConversationTextview.FOCUS_OUT_LINE_PIXBUF) + buffer_.insert(end_iter, '\n' + '―' * 20) end_iter = buffer_.get_end_iter() before_img_iter = end_iter.copy() # one char back (an image also takes one char) - before_img_iter.backward_char() + before_img_iter.backward_chars(20) buffer_.apply_tag_by_name('focus-out-line', before_img_iter, end_iter) self.allow_focus_out_line = False @@ -625,12 +611,14 @@ class ConversationTextview(gobject.GObject): if scroll: # scroll to the end (via idle in case the scrollbar has # appeared) - gobject.idle_add(self.scroll_to_end) + GLib.idle_add(self.scroll_to_end) def show_xep0184_warning_tooltip(self): - pointer = self.tv.get_pointer() - x, y = self.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, - pointer[0], pointer[1]) + w = self.tv.get_window(Gtk.TextWindowType.TEXT) + device = w.get_display().get_device_manager().get_client_pointer() + pointer = w.get_device_position(device) + x = pointer[1] + y = pointer[2] tags = self.tv.get_iter_at_location(x, y).get_tags() tag_table = self.tv.get_buffer().get_tag_table() xep0184_warning = False @@ -640,16 +628,18 @@ class ConversationTextview(gobject.GObject): break if xep0184_warning and not self.xep0184_warning_tooltip.win: # check if the current pointer is still over the line - position = self.tv.window.get_origin() - self.xep0184_warning_tooltip.show_tooltip(_('This icon indicates that ' - 'this message has not yet\nbeen received by the remote end. ' - "If this icon stays\nfor a long time, it's likely the message got " - 'lost.'), 8, position[1] + pointer[1]) + position = w.get_origin()[1:] + self.xep0184_warning_tooltip.show_tooltip(_('This icon indicates ' + 'that this message has not yet\nbeen received by the remote ' + "end. If this icon stays\nfor a long time, it's likely the " + 'message got lost.'), 8, position[1] + y) def show_line_tooltip(self): - pointer = self.tv.get_pointer() - x, y = self.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, - pointer[0], pointer[1]) + w = self.tv.get_window(Gtk.TextWindowType.TEXT) + device = w.get_display().get_device_manager().get_client_pointer() + pointer = w.get_device_position(device) + x = pointer[1] + y = pointer[2] tags = self.tv.get_iter_at_location(x, y).get_tags() tag_table = self.tv.get_buffer().get_tag_table() over_line = False @@ -659,12 +649,14 @@ class ConversationTextview(gobject.GObject): break if over_line and not self.line_tooltip.win: # check if the current pointer is still over the line - position = self.tv.window.get_origin() + position = w.get_origin()[1:] self.line_tooltip.show_tooltip(_('Text below this line is what has ' - 'been said since the\nlast time you paid attention to this group ' - 'chat'), 8, position[1] + pointer[1]) + 'been said since the\nlast time you paid attention to this ' + 'group chat'), 8, position[1] + y) - def on_textview_expose_event(self, widget, event): + def on_textview_draw(self, widget, ctx): + return + #TODO expalloc = event.area exp_x0 = expalloc.x exp_y0 = expalloc.y @@ -694,22 +686,23 @@ class ConversationTextview(gobject.GObject): """ Change the cursor to a hand when we are over a mail or an url """ - pointer_x, pointer_y = self.tv.window.get_pointer()[0:2] - x, y = self.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, - pointer_x, pointer_y) + w = self.tv.get_window(Gtk.TextWindowType.TEXT) + device = w.get_display().get_device_manager().get_client_pointer() + pointer = w.get_device_position(device) + x, y = self.tv.window_to_buffer_coords(Gtk.TextWindowType.TEXT, + pointer[1], pointer[2]) tags = self.tv.get_iter_at_location(x, y).get_tags() if self.change_cursor: - self.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor( - gtk.gdk.Cursor(gtk.gdk.XTERM)) + w.set_cursor(Gdk.Cursor.new(Gdk.CursorType.XTERM)) self.change_cursor = False tag_table = self.tv.get_buffer().get_tag_table() over_line = False xep0184_warning = False + for tag in tags: if tag in (tag_table.lookup('url'), tag_table.lookup('mail'), \ tag_table.lookup('xmpp'), tag_table.lookup('sth_at_sth')): - self.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor( - gtk.gdk.Cursor(gtk.gdk.HAND2)) + w.set_cursor(Gdk.Cursor.new(Gdk.CursorType.HAND2)) self.change_cursor = True elif tag == tag_table.lookup('focus-out-line'): over_line = True @@ -725,16 +718,14 @@ class ConversationTextview(gobject.GObject): if not xep0184_warning: self.xep0184_warning_tooltip.hide_tooltip() if over_line and not self.line_tooltip.win: - self.line_tooltip.timeout = gobject.timeout_add(500, + self.line_tooltip.timeout = GLib.timeout_add(500, self.show_line_tooltip) - self.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor( - gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) + w.set_cursor(Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR)) self.change_cursor = True if xep0184_warning and not self.xep0184_warning_tooltip.win: - self.xep0184_warning_tooltip.timeout = gobject.timeout_add(500, + self.xep0184_warning_tooltip.timeout = GLib.timeout_add(500, self.show_xep0184_warning_tooltip) - self.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor( - gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) + w.set_cursor(Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR)) self.change_cursor = True def clear(self, tv = None): @@ -746,7 +737,7 @@ class ConversationTextview(gobject.GObject): buffer_.delete(start, end) size = gajim.config.get('max_conversation_lines') size = 2 * size - 1 - self.marks_queue = Queue.Queue(size) + self.marks_queue = queue.Queue(size) self.focus_out_end_mark = None self.just_cleared = True @@ -765,33 +756,35 @@ class ConversationTextview(gobject.GObject): """ separator_menuitem_was_added = False if not self.used_in_history_window: - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() menu.prepend(item) separator_menuitem_was_added = True - item = gtk.ImageMenuItem(gtk.STOCK_CLEAR) + item = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_CLEAR, None) menu.prepend(item) id_ = item.connect('activate', self.clear) self.handlers[id_] = item if self.selected_phrase: if not separator_menuitem_was_added: - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() menu.prepend(item) if not self.used_in_history_window: - item = gtk.MenuItem(_('_Quote')) + item = Gtk.MenuItem.new_with_mnemonic(_('_Quote')) id_ = item.connect('activate', self.on_quote) self.handlers[id_] = item menu.prepend(item) _selected_phrase = helpers.reduce_chars_newlines( self.selected_phrase, 25, 2) - item = gtk.MenuItem(_('_Actions for "%s"') % _selected_phrase) + item = Gtk.MenuItem.new_with_mnemonic( + _('_Actions for "%s"') % _selected_phrase) menu.prepend(item) - submenu = gtk.Menu() + submenu = Gtk.Menu() item.set_submenu(submenu) - phrase_for_url = urllib.quote(self.selected_phrase.encode('utf-8')) + phrase_for_url = urllib.parse.quote(self.selected_phrase.encode( + 'utf-8')) always_use_en = gajim.config.get('always_english_wikipedia') if always_use_en: @@ -800,12 +793,12 @@ class ConversationTextview(gobject.GObject): else: link = 'http://%s.wikipedia.org/wiki/Special:Search?search=%s'\ % (gajim.LANG, phrase_for_url) - item = gtk.MenuItem(_('Read _Wikipedia Article')) + item = Gtk.MenuItem.new_with_mnemonic(_('Read _Wikipedia Article')) id_ = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id_] = item submenu.append(item) - item = gtk.MenuItem(_('Look it up in _Dictionary')) + item = Gtk.MenuItem.new_with_mnemonic(_('Look it up in _Dictionary')) dict_link = gajim.config.get('dictionary_url') if dict_link == 'WIKTIONARY': # special link (yeah undocumented but default) @@ -821,7 +814,7 @@ class ConversationTextview(gobject.GObject): else: if dict_link.find('%s') == -1: # we must have %s in the url if not WIKTIONARY - item = gtk.MenuItem(_( + item = Gtk.MenuItem(_( 'Dictionary URL is missing an "%s" and it is not WIKTIONARY')) item.set_property('sensitive', False) else: @@ -835,16 +828,16 @@ class ConversationTextview(gobject.GObject): search_link = gajim.config.get('search_engine') if search_link.find('%s') == -1: # we must have %s in the url - item = gtk.MenuItem(_('Web Search URL is missing an "%s"')) + item = Gtk.MenuItem(_('Web Search URL is missing an "%s"')) item.set_property('sensitive', False) else: - item = gtk.MenuItem(_('Web _Search for it')) + item = Gtk.MenuItem.new_with_mnemonic(_('Web _Search for it')) link = search_link % phrase_for_url id_ = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id_] = item submenu.append(item) - item = gtk.MenuItem(_('Open as _Link')) + item = Gtk.MenuItem.new_with_mnemonic(_('Open as _Link')) id_ = item.connect('activate', self.visit_url_from_menuitem, link) self.handlers[id_] = item submenu.append(item) @@ -862,12 +855,11 @@ class ConversationTextview(gobject.GObject): if event.button != 3: # if not right click return False - x, y = self.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, + x, y = self.tv.window_to_buffer_coords(Gtk.TextWindowType.TEXT, int(event.x), int(event.y)) iter_ = self.tv.get_iter_at_location(x, y) tags = iter_.get_tags() - if tags: # we clicked on sth special (it can be status message too) for tag in tags: tag_name = tag.get_property('name') @@ -882,9 +874,8 @@ class ConversationTextview(gobject.GObject): 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') - elif ord(iter_.get_char()) > 31: + self.selected_phrase = buffer_.get_text(start_sel, finish_sel, True) + elif iter_.get_char() and ord(iter_.get_char()) > 31: # we clicked on a word, do as if it's selected for context menu start_sel = iter_.copy() if not start_sel.starts_word(): @@ -892,15 +883,14 @@ class ConversationTextview(gobject.GObject): finish_sel = iter_.copy() if not finish_sel.ends_word(): finish_sel.forward_word_end() - self.selected_phrase = buffer_.get_text(start_sel, finish_sel).decode( - 'utf-8') + self.selected_phrase = buffer_.get_text(start_sel, finish_sel, True) def on_open_link_activate(self, widget, kind, text): helpers.launch_browser_mailer(kind, text) def on_copy_link_activate(self, widget, text): - clip = gtk.clipboard_get() - clip.set_text(text) + clip = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) + clip.set_text(text, -1) def on_start_chat_activate(self, widget, jid): gajim.interface.new_chat_from_jid(self.account, jid) @@ -982,10 +972,11 @@ class ConversationTextview(gobject.GObject): childs[0].hide() # copy link location childs[1].hide() # open link in browser - menu.popup(None, None, None, event.button, event.time) + menu.attach_to_widget(self.tv, None) + menu.popup(None, None, None, None, event.button.button, event.time) def hyperlink_handler(self, texttag, widget, event, iter_, kind): - if event.type == gtk.gdk.BUTTON_PRESS: + if event.type == Gdk.EventType.BUTTON_PRESS: begin_iter = iter_.copy() # we get the begining of the tag while not begin_iter.begins_tag(texttag): @@ -1006,10 +997,8 @@ class ConversationTextview(gobject.GObject): # it's a JID or mail kind = 'sth_at_sth' else: - word = self.tv.get_buffer().get_text(begin_iter, end_iter).decode( - 'utf-8') - - if event.button == 3: # right click + word = self.tv.get_buffer().get_text(begin_iter, end_iter, True) + if event.button.button == 3: # right click self.make_link_menu(event, kind, word) return True else: @@ -1036,13 +1025,17 @@ class ConversationTextview(gobject.GObject): after *last* special text, so we can print it in print_conversation_line() """ + if not otext: + return buffer_ = self.tv.get_buffer() - - insert_tags_func = buffer_.insert_with_tags_by_name + if other_tags: + insert_tags_func = buffer_.insert_with_tags_by_name + else: + insert_tags_func = buffer_.insert # detect_and_print_special_text() is also used by - # HtmlHandler.handle_specials() and there tags is gtk.TextTag objects, + # HtmlHandler.handle_specials() and there tags is Gtk.TextTag objects, # not strings - if other_tags and isinstance(other_tags[0], gtk.TextTag): + if other_tags and isinstance(other_tags[0], Gtk.TextTag): insert_tags_func = buffer_.insert_with_tags index = 0 @@ -1070,7 +1063,10 @@ class ConversationTextview(gobject.GObject): if not iter_: end_iter = buffer_.get_end_iter() # we insert normal text - insert_tags_func(end_iter, text_before_special_text, *other_tags) + if other_tags: + insert_tags_func(end_iter, text_before_special_text, *other_tags) + else: + buffer_.insert(end_iter, text_before_special_text) index = end # update index # now print it @@ -1132,10 +1128,11 @@ class ConversationTextview(gobject.GObject): # it's an emoticon emot_ascii = possible_emot_ascii_caps anchor = buffer_.create_child_anchor(end_iter) - img = TextViewImage(anchor, special_text) + img = TextViewImage(anchor, + GLib.markup_escape_text(special_text)) animations = gajim.interface.emoticons_animations if not emot_ascii in animations: - animations[emot_ascii] = gtk.gdk.PixbufAnimation( + animations[emot_ascii] = GdkPixbuf.PixbufAnimation.new_from_file( gajim.interface.emoticons[emot_ascii]) img.set_from_animation(animations[emot_ascii]) img.show() @@ -1203,10 +1200,12 @@ class ConversationTextview(gobject.GObject): # It's nothing special if use_other_tags: insert_tags_func = buffer_.insert_with_tags_by_name - if other_tags and isinstance(other_tags[0], gtk.TextTag): + if other_tags and isinstance(other_tags[0], Gtk.TextTag): insert_tags_func = buffer_.insert_with_tags - - insert_tags_func(end_iter, special_text, *other_tags) + if other_tags: + insert_tags_func(end_iter, special_text, *other_tags) + else: + buffer_.insert(end_iter, special_text) if tags: all_tags = tags[:] @@ -1216,7 +1215,7 @@ class ConversationTextview(gobject.GObject): all_tags = [(ttt.lookup(t) if isinstance(t, str) else t) for t in all_tags] buffer_.insert_with_tags(end_iter, special_text, *all_tags) if 'url' in tags: - puny_text = puny_encode(special_text) + puny_text = puny_encode(special_text).decode('utf-8') if not puny_text.endswith('-'): puny_tags = [] if use_other_tags: @@ -1287,9 +1286,9 @@ class ConversationTextview(gobject.GObject): tim = time.localtime() current_print_time = gajim.config.get('print_time') if text.startswith('/me '): - direction_mark = i18n.paragraph_direction_mark(unicode(text[3:])) + direction_mark = i18n.paragraph_direction_mark(str(text[3:])) else: - direction_mark = i18n.paragraph_direction_mark(unicode(text)) + direction_mark = i18n.paragraph_direction_mark(text) # don't apply direction mark if it's status message if kind == 'status': direction_mark = i18n.direction_mark @@ -1297,8 +1296,11 @@ class ConversationTextview(gobject.GObject): timestamp_str = self.get_time_to_show(tim, direction_mark) timestamp = time.strftime(timestamp_str, tim) timestamp = direction_mark + timestamp + direction_mark - buffer_.insert_with_tags_by_name(end_iter, timestamp, - *other_tags_for_time) + if other_tags_for_time: + buffer_.insert_with_tags_by_name(end_iter, timestamp, + *other_tags_for_time) + else: + buffer_.insert (end_iter, timestamp) elif current_print_time == 'sometimes' and kind != 'info' and not simple: every_foo_seconds = 60 * gajim.config.get( 'print_ichat_every_foo_minutes') @@ -1312,7 +1314,7 @@ class ConversationTextview(gobject.GObject): else: tim_format = self.get_time_to_show(tim, direction_mark) buffer_.insert_with_tags_by_name(end_iter, tim_format + '\n', - 'time_sometimes') + 'time_sometimes') # If there's a displaymarking, print it here. if displaymarking: self.print_displaymarking(displaymarking, iter_=end_iter) @@ -1368,9 +1370,9 @@ class ConversationTextview(gobject.GObject): # we are at the end or we are sending something # scroll to the end (via idle in case the scrollbar has appeared) if gajim.config.get('use_smooth_scrolling'): - gobject.idle_add(self.smooth_scroll_to_end) + GLib.idle_add(self.smooth_scroll_to_end) else: - gobject.idle_add(self.scroll_to_end) + GLib.idle_add(self.scroll_to_end) self.just_cleared = False buffer_.end_user_action() @@ -1385,9 +1387,9 @@ class ConversationTextview(gobject.GObject): # get difference in days since epoch (86400 = 24*3600) # number of days since epoch for current time (in GMT) - # number of days since epoch for message (in GMT) - diff_day = int(timegm(time.localtime())) / 86400 -\ - int(timegm(tim)) / 86400 - if diff_day == 0: + diff_day = int(int(timegm(time.localtime())) / 86400 -\ + int(timegm(tim)) / 86400) + if diff_day == 0.0: day_str = '' else: #%i is day in year (1-365) @@ -1400,10 +1402,6 @@ class ConversationTextview(gobject.GObject): timestamp_str = helpers.from_one_line(timestamp_str) format_ += timestamp_str tim_format = time.strftime(format_, tim) - if locale.getpreferredencoding() not in ('KOI8-R', 'cp1251'): - # if tim_format comes as unicode because of day_str. - # we convert it to the encoding that we want (and that is utf-8) - tim_format = helpers.ensure_utf8_string(tim_format) return tim_format def detect_other_text_tag(self, text, kind): @@ -1465,11 +1463,10 @@ class ConversationTextview(gobject.GObject): try: if name and (text.startswith('/me ') or text.startswith('/me\n')): xhtml = xhtml.replace('/me', '<i>* %s</i>' % (name,), 1) - self.tv.display_html(xhtml.encode('utf-8'), self.tv, self, - iter_=iter_) + self.tv.display_html(xhtml, self.tv, self, iter_=iter_) return - except Exception, e: - gajim.log.debug('Error processing xhtml' + str(e)) + except Exception as e: + gajim.log.debug('Error processing xhtml: ' + str(e)) gajim.log.debug('with |' + xhtml + '|') # /me is replaced by name if name is given diff --git a/src/dataforms_widget.py b/src/dataforms_widget.py index 3eabc22f50a9f5ee9fc0d4bdb4a82aee6f5a59f2..9a0a278a1ba6afb3d56f86bb833b182bc917ae23 100644 --- a/src/dataforms_widget.py +++ b/src/dataforms_widget.py @@ -25,8 +25,11 @@ Words single and multiple refers here to types of data forms: single means these with one record of data (without <reported/> element), multiple - these which may contain more data (with <reported/> element).''' -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf +from gi.repository import GObject +from gi.repository import GLib import base64 import gtkgui_helpers @@ -37,19 +40,19 @@ from common import helpers import itertools -class DataFormWidget(gtk.Alignment, object): +class DataFormWidget(Gtk.Alignment, object): # "public" interface """ Data Form widget. Use like any other widget """ __gsignals__ = dict( - validated = (gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_ACTION, None, ()) + validated = (GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, None, ()) ) def __init__(self, dataformnode=None): ''' Create a widget. ''' - gtk.Alignment.__init__(self, xscale=1.0, yscale=1.0) + GObject.GObject.__init__(self, xscale=1.0, yscale=1.0) self._data_form = None self.selectable = False @@ -71,10 +74,10 @@ class DataFormWidget(gtk.Alignment, object): selection = self.records_treeview.get_selection() selection.connect('changed', self.on_records_selection_changed) - selection.set_mode(gtk.SELECTION_MULTIPLE) + selection.set_mode(Gtk.SelectionMode.MULTIPLE) def on_data_form_vbox_key_press_event(self, widget, event): - print 'key pressed' + print('key pressed') def set_data_form(self, dataform): """ @@ -112,13 +115,13 @@ class DataFormWidget(gtk.Alignment, object): def get_title(self): """ - Get the title of data form, as a unicode object. If no title or no form, - returns u''. Useful for setting window title + Get the title of data form. If no title or no form, + returns ''. Useful for setting window title """ if self._data_form is not None: if self._data_form.title is not None: return self._data_form.title - return u'' + return '' title = property(get_title, None, None, 'Data form title') @@ -189,7 +192,7 @@ class DataFormWidget(gtk.Alignment, object): fieldtypes.append(str) fieldvars.append(field.var) - self.multiplemodel = gtk.ListStore(*fieldtypes) + self.multiplemodel = Gtk.ListStore(*fieldtypes) # moving all data to model for item in self._data_form.iter_records(): @@ -203,7 +206,7 @@ class DataFormWidget(gtk.Alignment, object): for field, counter in zip(self._data_form.reported.iter_fields(), itertools.count()): self.records_treeview.append_column( - gtk.TreeViewColumn(field.label, gtk.CellRendererText(), + Gtk.TreeViewColumn(field.label, Gtk.CellRendererText(), text=counter)) self.records_treeview.set_model(self.multiplemodel) @@ -276,8 +279,8 @@ class DataFormWidget(gtk.Alignment, object): selection = self.records_treeview.get_selection() model, rowrefs = selection.get_selected_rows() # rowref is a list of paths - for i in xrange(len(rowrefs)): - rowrefs[i] = gtk.TreeRowReference(model, rowrefs[i]) + for i in list(range(len(rowrefs))): + rowrefs[i] = Gtk.TreeRowReference.new(model, rowrefs[i]) # rowref is a list of row references; need to convert because we will # modify the model, paths would change for rowref in rowrefs: @@ -305,7 +308,7 @@ class DataFormWidget(gtk.Alignment, object): def on_records_selection_changed(self, widget): self.refresh_multiple_buttons() -class SingleForm(gtk.Table, object): +class SingleForm(Gtk.Table, object): """ Widget that represent DATAFORM_SINGLE mode form. Because this is used not only to display single forms, but to form input windows of multiple-type @@ -313,13 +316,13 @@ class SingleForm(gtk.Table, object): """ __gsignals__ = dict( - validated = (gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_ACTION, None, ()) + validated = (GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, None, ()) ) def __init__(self, dataform, selectable=False): assert isinstance(dataform, dataforms.SimpleDataForm) - gtk.Table.__init__(self) + GObject.GObject.__init__(self) self.set_col_spacings(12) self.set_row_spacings(6) @@ -330,8 +333,9 @@ class SingleForm(gtk.Table, object): widget """ if field.description != '': - if widget.flags() & gtk.NO_WINDOW: - evbox = gtk.EventBox() + if not widget.get_window(): + #if widget.flags() & Gtk.NO_WINDOW: + evbox = Gtk.EventBox() evbox.add(widget) widget = evbox widget.set_tooltip_text(field.description) @@ -356,7 +360,7 @@ class SingleForm(gtk.Table, object): if field.type_ == 'boolean': commonlabelcenter = True - widget = gtk.CheckButton() + widget = Gtk.CheckButton() widget.connect('toggled', self.on_boolean_checkbutton_toggled, field) widget.set_active(field.value) @@ -369,32 +373,34 @@ class SingleForm(gtk.Table, object): leftattach = 0 commonwidget = False - widget = gtk.Label(field.value) + widget = Gtk.Label(label=field.value) widget.set_property('selectable', selectable) widget.set_line_wrap(True) self.attach(widget, leftattach, rightattach, linecounter, - linecounter+1, xoptions=gtk.FILL, yoptions=gtk.FILL) + linecounter+1, xoptions=Gtk.AttachOptions.FILL, + yoptions=Gtk.AttachOptions.FILL) elif field.type_ == 'list-single': # TODO: What if we have radio buttons and non-required field? # TODO: We cannot deactivate them all... if len(field.options) < 6: # 5 option max: show radiobutton - widget = gtk.VBox() + widget = Gtk.VBox() first_radio = None for value, label in field.iter_options(): if not label: label = value - radio = gtk.RadioButton(first_radio, label=label) + radio = Gtk.RadioButton.new_with_label_from_widget( + first_radio, 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 field.value = value if value == field.value: radio.set_active(True) - widget.pack_start(radio, expand=False) + widget.pack_start(radio, False, True, 0) else: # more than 5 options: show combobox def on_list_single_combobox_changed(combobox, f): @@ -413,13 +419,13 @@ class SingleForm(gtk.Table, object): # TODO: When more than few choices, make a list if len(field.options) < 6: # 5 option max: show checkbutton - widget = gtk.VBox() + widget = Gtk.VBox() for value, label in field.iter_options(): - check = gtk.CheckButton(label, use_underline=False) + check = Gtk.CheckButton(label, use_underline=False) check.set_active(value in field.values) check.connect('toggled', self.on_list_multi_checkbutton_toggled, field, value) - widget.pack_start(check, expand=False) + widget.pack_start(check, False, True, 0) widget.set_sensitive(readwrite) else: # more than 5 options: show combobox @@ -429,8 +435,8 @@ class SingleForm(gtk.Table, object): vals = [] selection.selected_foreach(for_selected) field.values = vals[:] - widget = gtk.ScrolledWindow() - widget.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + widget = Gtk.ScrolledWindow() + widget.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) tv = gtkgui_helpers.create_list_multi(field.options, field.values) widget.add(tv) @@ -440,7 +446,7 @@ class SingleForm(gtk.Table, object): tv.set_sensitive(readwrite) elif field.type_ == 'jid-single': - widget = gtk.Entry() + widget = Gtk.Entry() widget.connect('changed', self.on_text_single_entry_changed, field) widget.set_text(field.value) @@ -452,20 +458,20 @@ class SingleForm(gtk.Table, object): widget = xml.get_object('multiple_form_hbox') treeview = xml.get_object('records_treeview') - listmodel = gtk.ListStore(str) + listmodel = Gtk.ListStore(str) for value in field.iter_values(): # nobody will create several megabytes long stanza listmodel.insert(999999, (value,)) treeview.set_model(listmodel) - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() renderer.set_property('editable', True) renderer.connect('edited', self.on_jid_multi_cellrenderertext_edited, treeview, listmodel, field) - treeview.append_column(gtk.TreeViewColumn(None, renderer, + treeview.append_column(Gtk.TreeViewColumn(None, renderer, text=0)) decorate_with_tooltip(treeview, field) @@ -495,7 +501,7 @@ class SingleForm(gtk.Table, object): elif field.type_ == 'text-private': commonlabelcenter = True - widget = gtk.Entry() + widget = Gtk.Entry() widget.connect('changed', self.on_text_single_entry_changed, field) widget.set_visibility(False) widget.set_text(field.value) @@ -504,8 +510,8 @@ class SingleForm(gtk.Table, object): # TODO: bigger text view commonwidget = False - textwidget = gtk.TextView() - textwidget.set_wrap_mode(gtk.WRAP_WORD) + textwidget = Gtk.TextView() + textwidget.set_wrap_mode(Gtk.WrapMode.WORD) textwidget.get_buffer().connect('changed', self.on_text_multi_textbuffer_changed, field) textwidget.get_buffer().set_text(field.value) @@ -517,7 +523,7 @@ class SingleForm(gtk.Table, object): else: textwidget.set_sensitive(False) - widget = gtk.ScrolledWindow() + widget = Gtk.ScrolledWindow() widget.add(textwidget) widget=decorate_with_tooltip(widget, field) @@ -529,66 +535,66 @@ class SingleForm(gtk.Table, object): # should handle it as text-single commonlabelcenter = True if readwrite: - widget = gtk.Entry() + widget = Gtk.Entry() def kpe(widget, event): - if event.keyval == gtk.keysyms.Return or \ - event.keyval == gtk.keysyms.KP_Enter: + if event.keyval == Gdk.KEY_Return or \ + event.keyval == Gdk.KEY_KP_Enter: self.emit('validated') widget.connect('key-press-event', kpe) widget.connect('changed', self.on_text_single_entry_changed, field) widget.set_sensitive(readwrite) if field.value is None: - field.value = u'' + field.value = '' widget.set_text(field.value) else: commonwidget=False - widget = gtk.Label(field.value) + widget = Gtk.Label(label=field.value) widget.set_property('selectable', selectable) widget.set_sensitive(True) widget.set_alignment(0.0, 0.5) widget=decorate_with_tooltip(widget, field) self.attach(widget, 1, 2, linecounter, linecounter+1, - yoptions=gtk.FILL) + yoptions=Gtk.AttachOptions.FILL) if commonlabel and field.label is not None: - label = gtk.Label(field.label) + label = Gtk.Label(label=field.label) if commonlabelcenter: label.set_alignment(0.0, 0.5) else: label.set_alignment(0.0, 0.0) label = decorate_with_tooltip(label, field) self.attach(label, 0, 1, linecounter, linecounter+1, - xoptions=gtk.FILL, yoptions=gtk.FILL) + xoptions=Gtk.AttachOptions.FILL, yoptions=Gtk.AttachOptions.FILL) if field.media is not None: for uri in field.media.uris: if uri.type_.startswith('image/'): try: - img_data = base64.decodestring(uri.uri_data) - pixbuf_l = gtk.gdk.PixbufLoader() + img_data = base64.b64decode(uri.uri_data) + pixbuf_l = GdkPixbuf.PixbufLoader() pixbuf_l.write(img_data) pixbuf_l.close() - media = gtk.image_new_from_pixbuf(pixbuf_l.\ + media = Gtk.Image.new_from_pixbuf(pixbuf_l.\ get_pixbuf()) except Exception: - media = gtk.Label(_('Unable to load image')) + media = Gtk.Label(label=_('Unable to load image')) else: - media = gtk.Label(_('Media type not supported: %s') % \ + media = Gtk.Label(label=_('Media type not supported: %s') % \ uri.type_) linecounter += 1 self.attach(media, 0, 1, linecounter, linecounter+1, - xoptions=gtk.FILL, yoptions=gtk.FILL) + xoptions=Gtk.AttachOptions.FILL, yoptions=Gtk.AttachOptions.FILL) if commonwidget: assert widget is not None widget.set_sensitive(readwrite) widget = decorate_with_tooltip(widget, field) self.attach(widget, 1, 2, linecounter, linecounter+1, - yoptions=gtk.FILL) + yoptions=Gtk.AttachOptions.FILL) if field.required: - label = gtk.Label('*') + label = Gtk.Label(label='*') label.set_tooltip_text(_('This field is required')) self.attach(label, 2, 3, linecounter, linecounter+1, xoptions=0, yoptions=0) @@ -618,9 +624,8 @@ class SingleForm(gtk.Table, object): field.value = widget.get_text() def on_text_multi_textbuffer_changed(self, widget, field): - field.value = widget.get_text( - widget.get_start_iter(), - widget.get_end_iter()) + field.value = widget.get_text(widget.get_start_iter(), + widget.get_end_iter(), True) def on_jid_multi_cellrenderertext_edited(self, cell, path, newtext, treeview, model, field): @@ -629,14 +634,14 @@ class SingleForm(gtk.Table, object): return try: newtext = helpers.parse_jid(newtext) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: dialogs.ErrorDialog(_('Invalid Jabber ID'), str(s)) return if newtext in field.values: dialogs.ErrorDialog( _('Jabber ID already in list'), _('The Jabber ID you entered is already in the list. Choose another one.')) - gobject.idle_add(treeview.set_cursor, path) + GLib.idle_add(treeview.set_cursor, path) return model[path][0]=newtext diff --git a/src/dialogs.py b/src/dialogs.py index 74fbc283f6a5edd6ea6dcffb1bc18e1333b31e21..bec33f23f211ca2c34e2f02a806fce7015444d3a 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -29,8 +29,12 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf +from gi.repository import GObject +from gi.repository import GLib +import cairo import os import nbxmpp import time @@ -101,7 +105,7 @@ class EditGroupsDialog: contact.name, contact.groups) def on_edit_groups_dialog_response(self, widget, response_id): - if response_id == gtk.RESPONSE_CLOSE: + if response_id == Gtk.ResponseType.CLOSE: self.dialog.destroy() def remove_group(self, group): @@ -128,7 +132,7 @@ class EditGroupsDialog: gajim.interface.roster.draw_group(_('General'), account) def on_add_button_clicked(self, widget): - group = self.xml.get_object('group_entry').get_text().decode('utf-8') + group = self.xml.get_object('group_entry').get_text() if not group: return # Do not allow special groups @@ -136,9 +140,9 @@ class EditGroupsDialog: return # check if it already exists model = self.treeview.get_model() - iter_ = model.get_iter_root() + iter_ = model.get_iter_first() while iter_: - if model.get_value(iter_, 0).decode('utf-8') == group: + if model.get_value(iter_, 0) == group: return iter_ = model.iter_next(iter_) self.changes_made = True @@ -154,14 +158,14 @@ class EditGroupsDialog: model[path][1] = True else: model[path][1] = not model[path][1] - group = model[path][0].decode('utf-8') + group = model[path][0] if model[path][1]: self.add_group(group) else: self.remove_group(group) def init_list(self): - store = gtk.ListStore(str, bool, bool) + store = Gtk.ListStore(str, bool, bool) self.treeview.set_model(store) for column in self.treeview.get_columns(): # Clear treeview when re-drawing @@ -198,21 +202,22 @@ class EditGroupsDialog: store.set(iter_, 2, False) else: store.set(iter_, 2, True) - column = gtk.TreeViewColumn(_('Group')) + column = Gtk.TreeViewColumn(_('Group')) column.set_expand(True) self.treeview.append_column(column) - renderer = gtk.CellRendererText() - column.pack_start(renderer) - column.set_attributes(renderer, text=0) + renderer = Gtk.CellRendererText() + column.pack_start(renderer, True) + column.add_attribute(renderer, 'text', 0) - column = gtk.TreeViewColumn(_('In the group')) + column = Gtk.TreeViewColumn(_('In the group')) column.set_expand(False) self.treeview.append_column(column) - renderer = gtk.CellRendererToggle() - column.pack_start(renderer) + renderer = Gtk.CellRendererToggle() + column.pack_start(renderer, True) renderer.set_property('activatable', True) renderer.connect('toggled', self.group_toggled_cb) - column.set_attributes(renderer, active=1, inconsistent=2) + column.add_attribute(renderer, 'active', 1) + column.add_attribute(renderer, 'inconsistent', 2) class PassphraseDialog: """ @@ -251,7 +256,7 @@ class PassphraseDialog: if not self.ok_handler: return - passph = self.passphrase_entry.get_text().decode('utf-8') + passph = self.passphrase_entry.get_text() if self.check: checked = self.xml.get_object('save_passphrase_checkbutton').\ @@ -291,26 +296,26 @@ class ChooseGPGKeyDialog: self.keys_treeview = xml.get_object('keys_treeview') prompt_label = xml.get_object('prompt_label') prompt_label.set_text(prompt_text) - model = gtk.ListStore(str, str) + model = Gtk.ListStore(str, str) model.set_sort_func(1, self.sort_keys) - model.set_sort_column_id(1, gtk.SORT_ASCENDING) + model.set_sort_column_id(1, Gtk.SortType.ASCENDING) self.keys_treeview.set_model(model) #columns - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() col = self.keys_treeview.insert_column_with_attributes(-1, _('KeyID'), renderer, text=0) col.set_sort_column_id(0) - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() col = self.keys_treeview.insert_column_with_attributes(-1, _('Contact name'), renderer, text=1) col.set_sort_column_id(1) self.keys_treeview.set_search_column(1) self.fill_tree(secret_keys, selected) self.window.connect('response', self.on_dialog_response) - self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT) + self.window.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.window.show_all() - def sort_keys(self, model, iter1, iter2): + def sort_keys(self, model, iter1, iter2, data=None): value1 = model[iter1][1] value2 = model[iter2][1] if value1 == _('None'): @@ -324,9 +329,8 @@ class ChooseGPGKeyDialog: def on_dialog_response(self, dialog, response): selection = self.keys_treeview.get_selection() (model, iter_) = selection.get_selected() - if iter_ and response == gtk.RESPONSE_OK: - keyID = [ model[iter_][0].decode('utf-8'), - model[iter_][1].decode('utf-8') ] + if iter_ and response == Gtk.ResponseType.OK: + keyID = [ model[iter_][0], model[iter_][1] ] else: keyID = None self.on_response(keyID) @@ -375,14 +379,16 @@ class ChangeActivityDialog: act = category + '_other' if group: - rbtns[act] = gtk.RadioButton(group) + rbtns[act] = Gtk.RadioButton() + rbtns[act].join_group(group) else: - rbtns[act] = group = gtk.RadioButton() + rbtns[act] = group = Gtk.RadioButton() - hbox = gtk.HBox(False, 5) - hbox.pack_start(gtkgui_helpers.load_activity_icon(category), False, - False, 0) - lbl = gtk.Label('<b>' + pep.ACTIVITIES[category]['category'] + '</b>') + hbox = Gtk.HBox(False, 5) + hbox.pack_start(gtkgui_helpers.load_activity_icon(category, + activity), False, False, 0) + lbl = Gtk.Label(label='<b>' + pep.ACTIVITIES[category]['category'] \ + + '</b>') lbl.set_use_markup(True) hbox.pack_start(lbl, False, False, 0) rbtns[act].add(hbox) @@ -394,7 +400,6 @@ class ChangeActivityDialog: for activity in pep.ACTIVITIES[category]: activities.append(activity) activities.sort() - for activity in activities: if activity == 'category': continue @@ -402,14 +407,15 @@ class ChangeActivityDialog: act = category + '_' + activity if group: - rbtns[act] = gtk.RadioButton(group) + rbtns[act] = Gtk.RadioButton() + rbtns[act].join_group(group) else: - rbtns[act] = group = gtk.RadioButton() + rbtns[act] = group = Gtk.RadioButton() - hbox = gtk.HBox(False, 5) + hbox = Gtk.HBox(False, 5) hbox.pack_start(gtkgui_helpers.load_activity_icon(category, activity), False, False, 0) - hbox.pack_start(gtk.Label(pep.ACTIVITIES[category][activity]), + hbox.pack_start(Gtk.Label(pep.ACTIVITIES[category][activity]), False, False, 0) rbtns[act].connect('toggled', self.on_rbtn_toggled, [category, activity]) @@ -438,7 +444,7 @@ class ChangeActivityDialog: self.checkbutton.set_active(False) self.xml.connect_signals(self) - self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT) + self.window.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.window.show_all() def on_enable_checkbutton_toggled(self, widget): @@ -458,7 +464,7 @@ class ChangeActivityDialog: """ if self.checkbutton.get_active(): self.on_response(self.activity, self.subactivity, - self.entry.get_text().decode('utf-8')) + self.entry.get_text()) else: self.on_response(None, None, '') self.window.destroy() @@ -499,10 +505,11 @@ class ChangeMoodDialog: self.MOODS.sort() for mood in self.MOODS: - self.mood_buttons[mood] = gtk.RadioButton(no_mood_button) + self.mood_buttons[mood] = Gtk.RadioButton() + self.mood_buttons[mood].join_group(no_mood_button) self.mood_buttons[mood].set_mode(False) self.mood_buttons[mood].add(gtkgui_helpers.load_mood_icon(mood)) - self.mood_buttons[mood].set_relief(gtk.RELIEF_NONE) + self.mood_buttons[mood].set_relief(Gtk.ReliefStyle.NONE) self.mood_buttons[mood].set_tooltip_text(pep.MOODS[mood]) self.mood_buttons[mood].connect('clicked', self.on_mood_button_clicked, mood) @@ -526,7 +533,7 @@ class ChangeMoodDialog: self.entry.set_sensitive(False) self.xml.connect_signals(self) - self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT) + self.window.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.window.show_all() def on_mood_button_clicked(self, widget, data): @@ -541,7 +548,7 @@ class ChangeMoodDialog: def on_ok_button_clicked(self, widget): '''Return mood and messsage (None if no mood selected)''' - message = self.entry.get_text().decode('utf-8') + message = self.entry.get_text() self.on_response(self.mood, message) self.window.destroy() @@ -562,7 +569,7 @@ class TimeoutDialog: def run_timeout(self): if self.countdown_left > 0: self.countdown() - gobject.timeout_add_seconds(1, self.countdown) + GLib.timeout_add_seconds(1, self.countdown) def on_timeout(): """ @@ -635,10 +642,10 @@ class ChangeStatusMessageDialog(TimeoutDialog): self.preset_messages_dict[msg_name] = opts sorted_keys_list = helpers.get_sorted_keys(self.preset_messages_dict) - self.message_liststore = gtk.ListStore(str) # msg_name + self.message_liststore = Gtk.ListStore(str) # msg_name self.message_combobox = self.xml.get_object('message_combobox') self.message_combobox.set_model(self.message_liststore) - cellrenderertext = gtk.CellRendererText() + cellrenderertext = Gtk.CellRendererText() self.message_combobox.pack_start(cellrenderertext, True) self.message_combobox.add_attribute(cellrenderertext, 'text', 0) for msg_name in sorted_keys_list: @@ -661,7 +668,7 @@ class ChangeStatusMessageDialog(TimeoutDialog): self.xml.connect_signals(self) self.run_timeout() self.dialog.connect('response', self.on_dialog_response) - self.dialog.set_position(gtk.WIN_POS_CENTER_ON_PARENT) + self.dialog.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.dialog.show_all() def draw_activity(self): @@ -708,13 +715,12 @@ class ChangeStatusMessageDialog(TimeoutDialog): def on_timeout(self): # Prevent GUI freeze when the combobox menu is opened on close self.message_combobox.popdown() - self.dialog.response(gtk.RESPONSE_OK) + self.dialog.response(Gtk.ResponseType.OK) def on_dialog_response(self, dialog, response): - if response == gtk.RESPONSE_OK: + if response == Gtk.ResponseType.OK: beg, end = self.message_buffer.get_bounds() - message = self.message_buffer.get_text(beg, end).decode('utf-8')\ - .strip() + message = self.message_buffer.get_text(beg, end, True).strip() message = helpers.remove_invalid_xml_chars(message) msg = helpers.to_one_line(message) if self.show: @@ -742,7 +748,7 @@ class ChangeStatusMessageDialog(TimeoutDialog): active = widget.get_active() if active < 0: return None - name = model[active][0].decode('utf-8') + name = model[active][0] self.message_buffer.set_text(self.preset_messages_dict[name][0]) self.pep_dict['activity'] = self.preset_messages_dict[name][1] self.pep_dict['subactivity'] = self.preset_messages_dict[name][2] @@ -754,10 +760,10 @@ class ChangeStatusMessageDialog(TimeoutDialog): def on_change_status_message_dialog_key_press_event(self, widget, event): self.countdown_enabled = False - if event.keyval == gtk.keysyms.Return or \ - event.keyval == gtk.keysyms.KP_Enter: # catch CTRL+ENTER - if (event.state & gtk.gdk.CONTROL_MASK): - self.dialog.response(gtk.RESPONSE_OK) + if event.keyval == Gdk.KEY_Return or \ + event.keyval == Gdk.KEY_KP_Enter: # catch CTRL+ENTER + if (event.get_state() & Gdk.ModifierType.CONTROL_MASK): + self.dialog.response(Gtk.ResponseType.OK) # Stop the event return True @@ -776,12 +782,12 @@ class ChangeStatusMessageDialog(TimeoutDialog): self.countdown_enabled = False start_iter, finish_iter = self.message_buffer.get_bounds() status_message_to_save_as_preset = self.message_buffer.get_text( - start_iter, finish_iter) + start_iter, finish_iter, True) def on_ok(msg_name): - msg_text = status_message_to_save_as_preset.decode('utf-8') + msg_text = status_message_to_save_as_preset msg_text_1l = helpers.to_one_line(msg_text) if not msg_name: # msg_name was '' - msg_name = msg_text_1l.decode('utf-8') + msg_name = msg_text_1l def on_ok2(): self.preset_messages_dict[msg_name] = [ @@ -915,11 +921,11 @@ class AddNewContactWindow: 'prompt': None} self.available_types.append(type_) # Combobox with transport/jabber icons - liststore = gtk.ListStore(str, gtk.gdk.Pixbuf, str) - cell = gtk.CellRendererPixbuf() + liststore = Gtk.ListStore(str, GdkPixbuf.Pixbuf, str) + cell = Gtk.CellRendererPixbuf() self.protocol_combobox.pack_start(cell, False) self.protocol_combobox.add_attribute(cell, 'pixbuf', 1) - cell = gtk.CellRendererText() + cell = Gtk.CellRendererText() cell.set_property('xpad', 5) self.protocol_combobox.pack_start(cell, True) self.protocol_combobox.add_attribute(cell, 'text', 0) @@ -947,7 +953,7 @@ class AddNewContactWindow: gajim.connections[account].request_gateway_prompt(service) self.protocol_combobox.set_active(0) self.auto_authorize_checkbutton.show() - liststore = gtk.ListStore(str) + liststore = Gtk.ListStore(str) self.protocol_jid_combobox.set_model(liststore) if jid: self.jid_escaped = True @@ -1007,7 +1013,7 @@ class AddNewContactWindow: self.account_label.hide() self.account_hbox.hide() else: - liststore = gtk.ListStore(str, str) + liststore = Gtk.ListStore(str, str) for acct in accounts: liststore.append([acct, acct]) self.account_combobox.set_model(liststore) @@ -1036,11 +1042,13 @@ class AddNewContactWindow: self._nec_gateway_prompt_received) def on_register_button_clicked(self, widget): - jid = self.protocol_jid_combobox.get_active_text().decode('utf-8') + model = self.protocol_jid_combobox.get_model() + row = self.protocol_jid_combobox.get_active() + jid = model[row][0] gajim.connections[self.account].request_register_agent_info(jid) def on_add_new_contact_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: # ESCAPE + if event.keyval == Gdk.KEY_Escape: # ESCAPE self.window.destroy() def on_cancel_button_clicked(self, widget): @@ -1053,17 +1061,18 @@ class AddNewContactWindow: """ When Subscribe button is clicked """ - jid = self.uid_entry.get_text().decode('utf-8').strip() + jid = self.uid_entry.get_text().strip() if not jid: return model = self.protocol_combobox.get_model() - iter_ = self.protocol_combobox.get_active_iter() - type_ = model[iter_][2] - if type_ != 'jabber' and not self.jid_escaped: - transport = self.protocol_jid_combobox.get_active_text().decode( - 'utf-8') - if self.account: + row = self.protocol_combobox.get_active_iter() + type_ = model[row][2] + if type_ != 'jabber': + model = self.protocol_jid_combobox.get_model() + row = self.protocol_jid_combobox.get_active() + transport = model[row][0] + if self.account and not self.jid_escaped: self.adding_jid = (jid, transport, type_) gajim.connections[self.account].request_gateway_prompt( transport, jid) @@ -1077,7 +1086,7 @@ class AddNewContactWindow: # check if jid is conform to RFC and stringprep it try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: pritext = _('Invalid User ID') ErrorDialog(pritext, str(s)) return @@ -1093,7 +1102,7 @@ class AddNewContactWindow: ErrorDialog(pritext, _('You cannot add yourself to your roster.')) return - nickname = self.nickname_entry.get_text().decode('utf-8') or '' + nickname = self.nickname_entry.get_text() or '' # get value of account combobox, if account was not specified if not self.account: model = self.account_combobox.get_model() @@ -1112,14 +1121,14 @@ class AddNewContactWindow: message_buffer = self.message_textview.get_buffer() start_iter = message_buffer.get_start_iter() end_iter = message_buffer.get_end_iter() - message = message_buffer.get_text(start_iter, end_iter).decode('utf-8') + message = message_buffer.get_text(start_iter, end_iter, True) if self.save_message_checkbutton.get_active(): msg = helpers.to_one_line(message) gajim.config.set_per('accounts', self.account, 'subscription_request_msg', msg) else: message= '' - group = self.group_comboboxentry.child.get_text().decode('utf-8') + group = self.group_comboboxentry.get_child().get_text() groups = [] if group: groups = [group] @@ -1210,7 +1219,9 @@ class AddNewContactWindow: else: self.register_hbox.hide() if type_ != 'jabber': - jid = self.protocol_jid_combobox.get_active_text() + model = self.protocol_jid_combobox.get_model() + row = self.protocol_jid_combobox.get_active() + jid = model[row][0] contact = gajim.contacts.get_first_contact_from_jid( self.account, jid) if contact.show in ('offline', 'error'): @@ -1225,7 +1236,10 @@ class AddNewContactWindow: self.add_button.set_sensitive(True) def transport_signed_in(self, jid): - if self.protocol_jid_combobox.get_active_text() == jid: + model = self.protocol_jid_combobox.get_model() + row = self.protocol_jid_combobox.get_active() + _jid = model[row][0] + if _jid == jid: self.register_hbox.hide() self.connected_label.hide() self.subscription_table.show() @@ -1233,7 +1247,10 @@ class AddNewContactWindow: self.add_button.set_sensitive(True) def transport_signed_out(self, jid): - if self.protocol_jid_combobox.get_active_text() == jid: + model = self.protocol_jid_combobox.get_model() + row = self.protocol_jid_combobox.get_active() + _jid = model[row][0] + if _jid == jid: self.subscription_table.hide() self.auto_authorize_checkbutton.hide() self.connected_label.show() @@ -1266,26 +1283,30 @@ class AboutDialog: """ def __init__(self): - dlg = gtk.AboutDialog() + dlg = Gtk.AboutDialog() dlg.set_transient_for(gajim.interface.roster.window) dlg.set_name('Gajim') dlg.set_version(gajim.version) - s = u'Copyright © 2003-2013 Gajim Team' + s = 'Copyright © 2003-2013 Gajim Team' dlg.set_copyright(s) copying_file_path = self.get_path('COPYING') if copying_file_path: - text = open(copying_file_path).read() + with open(copying_file_path) as a_file: + text = a_file.read() dlg.set_license(text) + gtk_ver = '%i.%i.%i' % (Gtk.get_major_version(), + Gtk.get_minor_version(), Gtk.get_micro_version()) + gobject_ver = self.tuple2str(GObject.pygobject_version) dlg.set_comments('%s\n%s %s\n%s %s' % (_('A GTK+ Jabber/XMPP client'), - _('GTK+ Version:'), self.tuple2str(gtk.gtk_version), \ - _('PyGTK Version:'), self.tuple2str(gtk.pygtk_version))) + _('GTK+ Version:'), gtk_ver, _('PyGobject Version:'), gobject_ver)) dlg.set_website('http://gajim.org/') authors_file_path = self.get_path('AUTHORS') if authors_file_path: authors = [] - authors_file = open(authors_file_path).read() + with open(authors_file_path) as a_file: + authors_file = a_file.read() authors_file = authors_file.split('\n') for author in authors_file: if author == 'CURRENT DEVELOPERS:': @@ -1298,13 +1319,13 @@ class AboutDialog: thanks_file_path = self.get_path('THANKS') if thanks_file_path: authors.append('\n' + _('THANKS:')) - - text = open(thanks_file_path).read() + with open(thanks_file_path) as a_file: + text = a_file.read() text_splitted = text.split('\n') text = '\n'.join(text_splitted[:-2]) # remove one english sentence # and add it manually as translatable - text += '\n%s\n' % _('Last but not least, we would like to thank all ' - 'the package maintainers.') + text += '\n%s\n' % _('Last but not least, we would like to ' + 'thank all the package maintainers.') authors.append(text) dlg.set_authors(authors) @@ -1319,15 +1340,18 @@ class AboutDialog: thanks_artists_file_path = self.get_path('THANKS.artists') if thanks_artists_file_path: - artists_text = open(thanks_artists_file_path).read() + with open(thanks_artists_file_path) as a_file: + artists_text = a_file.read() artists = artists_text.split('\n') dlg.set_artists(artists) - # connect close button to destroy() function - for button in dlg.action_area.get_children(): - if button.get_property('label') == gtk.STOCK_CLOSE: - button.connect('clicked', lambda x:dlg.destroy()) + + dlg.connect('response', self.on_response) dlg.show_all() + def on_response(self, dialog, response_id): + if response_id == Gtk.ResponseType.CANCEL: + dialog.destroy() + def tuple2str(self, tuple_): str_ = '' for num in tuple_: @@ -1345,11 +1369,11 @@ class AboutDialog: else: return None -class Dialog(gtk.Dialog): +class Dialog(Gtk.Dialog): def __init__(self, parent, title, buttons, default=None, on_response_ok=None, on_response_cancel=None): - gtk.Dialog.__init__(self, title, parent, - gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_NO_SEPARATOR) + GObject.GObject.__init__(self, title, parent, + Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.DialogFlags.NO_SEPARATOR) self.user_response_ok = on_response_ok self.user_response_cancel = on_response_cancel @@ -1357,8 +1381,8 @@ class Dialog(gtk.Dialog): self.vbox.set_spacing(12) self.set_resizable(False) - possible_responses = {gtk.STOCK_OK: self.on_response_ok, - gtk.STOCK_CANCEL: self.on_response_cancel} + possible_responses = {Gtk.STOCK_OK: self.on_response_ok, + Gtk.STOCK_CANCEL: self.on_response_cancel} for stock, response in buttons: b = self.add_button(stock, response) for response in possible_responses: @@ -1395,21 +1419,21 @@ class Dialog(gtk.Dialog): return index < len(buttons) and buttons[index] or None -class HigDialog(gtk.MessageDialog): +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): self.call_cancel_on_destroy = True - gtk.MessageDialog.__init__(self, parent, - gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_MODAL, + Gtk.MessageDialog.__init__(self, parent, + Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.DialogFlags.MODAL, type_, buttons, message_format = pritext) self.format_secondary_markup(sectext) buttons = self.action_area.get_children() - self.possible_responses = {gtk.STOCK_OK: on_response_ok, - gtk.STOCK_CANCEL: on_response_cancel, gtk.STOCK_YES: on_response_yes, - gtk.STOCK_NO: on_response_no} + self.possible_responses = {Gtk.STOCK_OK: on_response_ok, + Gtk.STOCK_CANCEL: on_response_cancel, Gtk.STOCK_YES: on_response_yes, + Gtk.STOCK_NO: on_response_no} for b in buttons: for response in self.possible_responses: if b.get_label() == response: @@ -1429,7 +1453,7 @@ class HigDialog(gtk.MessageDialog): def on_dialog_destroy(self, widget): if not self.call_cancel_on_destroy: return - cancel_handler = self.possible_responses[gtk.STOCK_CANCEL] + cancel_handler = self.possible_responses[Gtk.STOCK_CANCEL] if not cancel_handler: return False if isinstance(cancel_handler, tuple): @@ -1445,21 +1469,23 @@ class HigDialog(gtk.MessageDialog): Show dialog """ vb = self.get_children()[0].get_children()[0] # Give focus to top vbox - vb.set_flags(gtk.CAN_FOCUS) +# vb.set_flags(Gtk.CAN_FOCUS) vb.grab_focus() self.show_all() -class FileChooserDialog(gtk.FileChooserDialog): +class FileChooserDialog(Gtk.FileChooserDialog): """ - Non-blocking FileChooser Dialog around gtk.FileChooserDialog + Non-blocking FileChooser Dialog around Gtk.FileChooserDialog """ def __init__(self, title_text, action, buttons, default_response, select_multiple=False, current_folder=None, on_response_ok=None, - on_response_cancel=None): - - gtk.FileChooserDialog.__init__(self, title=title_text, action=action, - buttons=buttons) + on_response_cancel=None, transient_for=None): + GObject.GObject.__init__(self, title=title_text, parent=transient_for, + action=action) + self.add_button(buttons[0],buttons[1]) + if len(buttons) ==4: + self.add_button(buttons[2],buttons[3]) self.set_default_response(default_response) self.set_select_multiple(select_multiple) if current_folder and os.path.isdir(current_folder): @@ -1474,7 +1500,7 @@ class FileChooserDialog(gtk.FileChooserDialog): self.show_all() def on_dialog_response(self, dialog, response): - if response in (gtk.RESPONSE_CANCEL, gtk.RESPONSE_CLOSE): + if response in (Gtk.ResponseType.CANCEL, Gtk.ResponseType.CLOSE): if self.response_cancel: if isinstance(self.response_cancel, tuple): self.response_cancel[0](dialog, *self.response_cancel[1:]) @@ -1482,7 +1508,7 @@ class FileChooserDialog(gtk.FileChooserDialog): self.response_cancel(dialog) else: self.just_destroy(dialog) - elif response == gtk.RESPONSE_OK: + elif response == Gtk.ResponseType.OK: if self.response_ok: if isinstance(self.response_ok, tuple): self.response_ok[0](dialog, *self.response_ok[1:]) @@ -1513,7 +1539,7 @@ class ConfirmationDialog(HigDialog): self.user_response_ok = on_response_ok self.user_response_cancel = on_response_cancel HigDialog.__init__(self, transient_for, - gtk.MESSAGE_QUESTION, gtk.BUTTONS_OK_CANCEL, pritext, sectext, + Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) self.popup() @@ -1548,8 +1574,8 @@ class NonModalConfirmationDialog(HigDialog): parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, gtk.MESSAGE_QUESTION, - gtk.BUTTONS_OK_CANCEL, pritext, sectext, self.on_response_ok, + HigDialog.__init__(self, parent, Gtk.MessageType.QUESTION, + Gtk.ButtonsType.OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) self.set_modal(False) @@ -1580,8 +1606,8 @@ class WarningDialog(HigDialog): if not transient_for and hasattr(gajim.interface, 'roster') and \ gajim.interface.roster: transient_for = gajim.interface.roster.window - HigDialog.__init__(self, transient_for, gtk.MESSAGE_WARNING, - gtk.BUTTONS_OK, pritext, sectext) + HigDialog.__init__(self, transient_for, Gtk.MessageType.WARNING, + Gtk.ButtonsType.OK, pritext, sectext) self.set_modal(False) self.popup() @@ -1597,7 +1623,7 @@ class InformationDialog(HigDialog): parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, + HigDialog.__init__(self, parent, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, pritext, sectext) self.set_modal(False) self.popup() @@ -1615,7 +1641,7 @@ class ErrorDialog(HigDialog): parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, + HigDialog.__init__(self, parent, Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, pritext, sectext, on_response_ok=on_response_ok, on_response_cancel=on_response_cancel) self.popup() @@ -1626,7 +1652,7 @@ class YesNoDialog(HigDialog): """ def __init__(self, pritext, sectext='', checktext='', text_label=None, - on_response_yes=None, on_response_no=None, type_=gtk.MESSAGE_QUESTION, + on_response_yes=None, on_response_no=None, type_=Gtk.MessageType.QUESTION, transient_for=None): self.user_response_yes = on_response_yes self.user_response_no = on_response_no @@ -1636,24 +1662,24 @@ class YesNoDialog(HigDialog): parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, type_, gtk.BUTTONS_YES_NO, pritext, + HigDialog.__init__(self, parent, type_, Gtk.ButtonsType.YES_NO, pritext, sectext, 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) + self.checkbutton = Gtk.CheckButton(checktext) + self.vbox.pack_start(self.checkbutton, False, True, 0) else: self.checkbutton = None if text_label: - label = gtk.Label(text_label) - self.vbox.pack_start(label, expand=False, fill=True) - buff = gtk.TextBuffer() - self.textview = gtk.TextView(buff) - frame = gtk.Frame() - frame.set_shadow_type(gtk.SHADOW_IN) + label = Gtk.Label(label=text_label) + self.vbox.pack_start(label, False, True, 0) + buff = Gtk.TextBuffer() + self.textview = Gtk.TextView.new_with_buffer(buff) + frame = Gtk.Frame() + frame.set_shadow_type(Gtk.ShadowType.IN) frame.add(self.textview) - self.vbox.pack_start(frame, expand=False, fill=True) + self.vbox.pack_start(frame, False, True, 0) else: self.textview = None self.set_modal(False) @@ -1664,7 +1690,7 @@ class YesNoDialog(HigDialog): if self.textview: buff = self.textview.get_buffer() start, end = buff.get_bounds() - txt = self.textview.get_buffer().get_text(start, end) + txt = self.textview.get_buffer().get_text(start, end, True) if isinstance(self.user_response_yes, tuple): if self.textview: @@ -1686,7 +1712,7 @@ class YesNoDialog(HigDialog): if self.textview: buff = self.textview.get_buffer() start, end = buff.get_bounds() - txt = self.textview.get_buffer().get_text(start, end) + txt = self.textview.get_buffer().get_text(start, end, True) if isinstance(self.user_response_no, tuple): if self.textview: @@ -1725,17 +1751,17 @@ class ConfirmationDialogCheck(ConfirmationDialog): parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, gtk.MESSAGE_QUESTION, - gtk.BUTTONS_OK_CANCEL, pritext, sectext, self.on_response_ok, + HigDialog.__init__(self, parent, Gtk.MessageType.QUESTION, + Gtk.ButtonsType.OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) - self.set_default_response(gtk.RESPONSE_OK) + self.set_default_response(Gtk.ResponseType.OK) ok_button = self.action_area.get_children()[0] # right to left ok_button.grab_focus() - self.checkbutton = gtk.CheckButton(checktext) - self.vbox.pack_start(self.checkbutton, expand=False, fill=True) + self.checkbutton = Gtk.CheckButton(checktext) + self.vbox.pack_start(self.checkbutton, False, True, 0) self.set_modal(is_modal) self.popup() @@ -1780,27 +1806,27 @@ class ConfirmationDialogDoubleCheck(ConfirmationDialog): parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, gtk.MESSAGE_QUESTION, - gtk.BUTTONS_OK_CANCEL, pritext, sectext, self.on_response_ok, + HigDialog.__init__(self, parent, Gtk.MessageType.QUESTION, + Gtk.ButtonsType.OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) - self.set_default_response(gtk.RESPONSE_OK) + self.set_default_response(Gtk.ResponseType.OK) ok_button = self.action_area.get_children()[0] # right to left ok_button.grab_focus() if checktext1: - self.checkbutton1 = gtk.CheckButton(checktext1) + self.checkbutton1 = Gtk.CheckButton(checktext1) if tooltip1: self.checkbutton1.set_tooltip_text(tooltip1) - self.vbox.pack_start(self.checkbutton1, expand=False, fill=True) + self.vbox.pack_start(self.checkbutton1, False, True, 0) else: self.checkbutton1 = None if checktext2: - self.checkbutton2 = gtk.CheckButton(checktext2) + self.checkbutton2 = Gtk.CheckButton(checktext2) if tooltip2: self.checkbutton2.set_tooltip_text(tooltip2) - self.vbox.pack_start(self.checkbutton2, expand=False, fill=True) + self.vbox.pack_start(self.checkbutton2, False, True, 0) else: self.checkbutton2 = None @@ -1878,21 +1904,21 @@ class ConfirmationDialogDoubleRadio(ConfirmationDialog): parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, gtk.MESSAGE_QUESTION, - gtk.BUTTONS_OK_CANCEL, pritext, sectext, self.on_response_ok, + HigDialog.__init__(self, parent, Gtk.MessageType.QUESTION, + Gtk.ButtonsType.OK_CANCEL, pritext, sectext, self.on_response_ok, self.on_response_cancel) - self.set_default_response(gtk.RESPONSE_OK) + self.set_default_response(Gtk.ResponseType.OK) ok_button = self.action_area.get_children()[0] # right to left ok_button.grab_focus() - self.radiobutton1 = gtk.RadioButton(label=radiotext1) - self.vbox.pack_start(self.radiobutton1, expand=False, fill=True) + self.radiobutton1 = Gtk.RadioButton(label=radiotext1) + self.vbox.pack_start(self.radiobutton1, False, True, 0) - self.radiobutton2 = gtk.RadioButton(group=self.radiobutton1, + self.radiobutton2 = Gtk.RadioButton(group=self.radiobutton1, label=radiotext2) - self.vbox.pack_start(self.radiobutton2, expand=False, fill=True) + self.vbox.pack_start(self.radiobutton2, False, True, 0) self.set_modal(is_modal) self.popup() @@ -1934,18 +1960,20 @@ class FTOverwriteConfirmationDialog(ConfirmationDialog): """ def __init__(self, pritext, sectext='', propose_resume=True, - on_response=None): - if hasattr(gajim.interface, 'roster') and gajim.interface.roster: + on_response=None, transient_for=None): + if transient_for: + parent = transient_for + elif hasattr(gajim.interface, 'roster') and gajim.interface.roster: parent = gajim.interface.roster.window else: parent = None - HigDialog.__init__(self, parent, gtk.MESSAGE_QUESTION, - gtk.BUTTONS_CANCEL, pritext, sectext) + HigDialog.__init__(self, parent, Gtk.MessageType.QUESTION, + Gtk.ButtonsType.CANCEL, pritext, sectext) self.on_response = on_response if propose_resume: - b = gtk.Button('', gtk.STOCK_REFRESH) + b = Gtk.Button('', Gtk.STOCK_REFRESH) align = b.get_children()[0] hbox = align.get_children()[0] label = hbox.get_children()[1] @@ -1953,7 +1981,7 @@ class FTOverwriteConfirmationDialog(ConfirmationDialog): label.set_use_underline(True) self.add_action_widget(b, 100) - b = gtk.Button('', gtk.STOCK_SAVE_AS) + b = Gtk.Button('', Gtk.STOCK_SAVE_AS) align = b.get_children()[0] hbox = align.get_children()[0] label = hbox.get_children()[1] @@ -2004,7 +2032,7 @@ class CommonInputDialog: def on_okbutton_clicked(self, widget): user_input = self.get_text() if user_input: - user_input = user_input.decode('utf-8') + user_input = user_input self.cancel_handler = None self.dialog.destroy() if isinstance(self.ok_handler, tuple): @@ -2043,7 +2071,7 @@ class InputDialog(CommonInputDialog): self.input_entry.select_region(0, -1) # select all def get_text(self): - return self.input_entry.get_text().decode('utf-8') + return self.input_entry.get_text() class InputDialogCheck(InputDialog): """ @@ -2062,14 +2090,14 @@ class InputDialogCheck(InputDialog): self.input_entry.select_region(0, -1) # select all if checktext: - self.checkbutton = gtk.CheckButton(checktext) - self.vbox.pack_start(self.checkbutton, expand=False, fill=True) + self.checkbutton = Gtk.CheckButton(checktext) + self.vbox.pack_start(self.checkbutton, False, True, 0) self.checkbutton.show() def on_okbutton_clicked(self, widget): user_input = self.get_text() if user_input: - user_input = user_input.decode('utf-8') + user_input = user_input self.cancel_handler = None self.dialog.destroy() if isinstance(self.ok_handler, tuple): @@ -2078,7 +2106,7 @@ class InputDialogCheck(InputDialog): self.ok_handler(user_input, self.is_checked()) def get_text(self): - return self.input_entry.get_text().decode('utf-8') + return self.input_entry.get_text() def is_checked(self): """ @@ -2147,7 +2175,7 @@ class ChangeNickDialog(InputDialogCheck): def on_okbutton_clicked(self, widget): nick = self.get_text() if nick: - nick = nick.decode('utf-8') + nick = nick # send presence to room try: nick = helpers.parse_resource(nick) @@ -2199,7 +2227,7 @@ class InputTextDialog(CommonInputDialog): def get_text(self): start_iter, end_iter = self.input_buffer.get_bounds() - return self.input_buffer.get_text(start_iter, end_iter).decode('utf-8') + return self.input_buffer.get_text(start_iter, end_iter, True) class DoubleInputDialog: """ @@ -2247,8 +2275,8 @@ class DoubleInputDialog: self.cancel_handler() def on_okbutton_clicked(self, widget): - user_input1 = self.input_entry1.get_text().decode('utf-8') - user_input2 = self.input_entry2.get_text().decode('utf-8') + user_input1 = self.input_entry1.get_text() + user_input2 = self.input_entry2.get_text() self.cancel_handler = None self.dialog.destroy() if not self.ok_handler: @@ -2349,7 +2377,7 @@ class SubscriptionRequestWindow: menu = self.prepare_popup_menu() menu.show_all() gtkgui_helpers.popup_emoticons_under_button(menu, widget, - self.window.window) + self.window.get_window()) class JoinGroupchatWindow: @@ -2364,13 +2392,13 @@ class JoinGroupchatWindow: if room_jid != '' and room_jid in gajim.gc_connected[account] and \ gajim.gc_connected[account][room_jid]: ErrorDialog(_('You are already in group chat %s') % room_jid) - raise GajimGeneralException, 'You are already in this group chat' + raise GajimGeneralException('You are already in this group chat') if nick == '': nick = gajim.nicks[account] if gajim.connections[account].connected < 2: ErrorDialog(_('You are not connected to the server'), _('You can not join a group chat unless you are connected.')) - raise GajimGeneralException, 'You must be connected to join a groupchat' + raise GajimGeneralException('You must be connected to join a groupchat') self.xml = gtkgui_helpers.get_gtk_builder('join_groupchat_window.ui') @@ -2378,9 +2406,9 @@ class JoinGroupchatWindow: account_combobox = self.xml.get_object('account_combobox') account_label.set_no_show_all(False) account_combobox.set_no_show_all(False) - liststore = gtk.ListStore(str) + liststore = Gtk.ListStore(str) account_combobox.set_model(liststore) - cell = gtk.CellRendererText() + cell = Gtk.CellRendererText() account_combobox.pack_start(cell, True) account_combobox.add_attribute(cell, 'text', 0) account_combobox.set_active(-1) @@ -2390,7 +2418,7 @@ class JoinGroupchatWindow: gajim.account_is_connected(a)]: if gajim.connections[acct].is_zeroconf: continue - account_combobox.append_text(acct) + liststore.append([acct]) if account and account == acct: account_combobox.set_active(liststore.iter_n_children(None)-1) @@ -2418,12 +2446,13 @@ class JoinGroupchatWindow: title = _('Join Group Chat') self.window.set_title(title) - self.server_comboboxentry = self.xml.get_object('server_comboboxentry') - self.server_model = self.server_comboboxentry.get_model() - server_list = [] - # get the muc server of our server - if 'jabber' in gajim.connections[account].muc_jid: - server_list.append(gajim.connections[account].muc_jid['jabber']) + + self.server_model = Gtk.ListStore(str) + self.server_comboboxentry = Gtk.ComboBox.new_with_model_and_entry( + self.server_model) + self.server_comboboxentry.set_entry_text_column(0) + hbox1 = self.xml.get_object('hbox1') + hbox1.pack_start(self.server_comboboxentry, False, False, 0) entry = self.server_comboboxentry.child entry.connect('changed', self.on_server_entry_changed) @@ -2431,12 +2460,17 @@ class JoinGroupchatWindow: self.browse_button.set_sensitive(False) self.recently_combobox = self.xml.get_object('recently_combobox') - liststore = gtk.ListStore(str, str) + liststore = Gtk.ListStore(str, str) self.recently_combobox.set_model(liststore) - cell = gtk.CellRendererText() + cell = Gtk.CellRendererText() self.recently_combobox.pack_start(cell, True) self.recently_combobox.add_attribute(cell, 'text', 0) self.recently_groupchat = gajim.config.get('recently_groupchat').split() + + server_list = [] + # get the muc server of our server + if 'jabber' in gajim.connections[account].muc_jid: + server_list.append(gajim.connections[account].muc_jid['jabber']) for g in self.recently_groupchat: r_jid = gajim.get_jid_without_resource(g) nick = gajim.get_resource_from_jid(g) @@ -2452,7 +2486,7 @@ class JoinGroupchatWindow: for s in server_list: self.server_model.append([s]) - self.server_comboboxentry.set_active(0) + self._set_room_jid(room_jid) @@ -2495,7 +2529,7 @@ class JoinGroupchatWindow: del gajim.interface.instances[self.account]['join_gc'] def on_join_groupchat_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: # ESCAPE + if event.keyval == Gdk.KEY_Escape: # ESCAPE widget.destroy() def on_required_entry_changed(self, widget): @@ -2513,31 +2547,32 @@ class JoinGroupchatWindow: room_jid, server = text.split('@', 1) self._room_jid_entry.set_text(room_jid) if server: - self.server_comboboxentry.child.set_text(server) + self.server_comboboxentry.get_child().set_text(server) self.server_comboboxentry.grab_focus() def on_account_combobox_changed(self, widget): model = widget.get_model() iter_ = widget.get_active_iter() - self.account = model[iter_][0].decode('utf-8') + self.account = model[iter_][0] self.on_required_entry_changed(self._nickname_entry) def _set_room_jid(self, full_jid): room_jid, nick = gajim.get_room_and_nick_from_fjid(full_jid) room, server = gajim.get_name_and_server_from_jid(room_jid) self._room_jid_entry.set_text(room) - self.server_comboboxentry.child.set_text(server) + model = self.server_comboboxentry.get_model() + self.server_comboboxentry.get_child().set_text(server) if nick: self._nickname_entry.set_text(nick) def on_recently_combobox_changed(self, widget): model = widget.get_model() iter_ = widget.get_active_iter() - full_jid = model[iter_][1].decode('utf-8') + full_jid = model[iter_][1] self._set_room_jid(full_jid) def on_browse_rooms_button_clicked(self, widget): - server = self.server_comboboxentry.child.get_text().decode('utf-8') + server = self.server_comboboxentry.get_child().get_text() self.requested_jid = server gajim.connections[self.account].discoverInfo(server) @@ -2547,8 +2582,9 @@ class JoinGroupchatWindow: if obj.jid != self.requested_jid: return self.requested_jid = None + window = gajim.interface.instances[self.account]['join_gc'].window ErrorDialog(_('Wrong server'), _('%s is not a groupchat server') % \ - obj.jid) + obj.jid, transient_for=window) def _nec_agent_info_received(self, obj): if obj.conn.name != self.account: @@ -2557,8 +2593,9 @@ class JoinGroupchatWindow: return self.requested_jid = None if nbxmpp.NS_MUC not in obj.features: + window = gajim.interface.instances[self.account]['join_gc'].window ErrorDialog(_('Wrong server'), _('%s is not a groupchat server') % \ - obj.jid) + obj.jid, transient_for=window) return if obj.jid in gajim.interface.instances[self.account]['disco']: gajim.interface.instances[self.account]['disco'][obj.jid].window.\ @@ -2601,12 +2638,11 @@ class JoinGroupchatWindow: _('You have to choose an account from which you want to join the ' 'groupchat.')) return - nickname = self._nickname_entry.get_text().decode('utf-8') - server = self.server_comboboxentry.child.get_text().decode('utf-8').\ - strip() - room = self._room_jid_entry.get_text().decode('utf-8').strip() + nickname = self._nickname_entry.get_text() + server = self.server_comboboxentry.get_child().get_text() + room = self._room_jid_entry.get_text().strip() room_jid = room + '@' + server - password = self._password_entry.get_text().decode('utf-8') + password = self._password_entry.get_text() try: nickname = helpers.parse_resource(nickname) except Exception: @@ -2663,18 +2699,19 @@ class SynchroniseSelectAccountDialog: if not account or gajim.connections[account].connected < 2: ErrorDialog(_('You are not connected to the server'), _('Without a connection, you can not synchronise your contacts.')) - raise GajimGeneralException, 'You are not connected to the server' + raise GajimGeneralException('You are not connected to the server') self.account = account self.xml = gtkgui_helpers.get_gtk_builder('synchronise_select_account_dialog.ui') self.dialog = self.xml.get_object('synchronise_select_account_dialog') + self.dialog.set_transient_for(gajim.interface.instances['accounts'].window) self.accounts_treeview = self.xml.get_object('accounts_treeview') - model = gtk.ListStore(str, str, bool) + model = Gtk.ListStore(str, str, bool) self.accounts_treeview.set_model(model) # columns - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() self.accounts_treeview.insert_column_with_attributes(-1, _('Name'), renderer, text=0) - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() self.accounts_treeview.insert_column_with_attributes(-1, _('Server'), renderer, text=1) @@ -2683,7 +2720,7 @@ class SynchroniseSelectAccountDialog: self.dialog.show_all() def on_accounts_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.window.destroy() def init_accounts(self): @@ -2708,7 +2745,7 @@ class SynchroniseSelectAccountDialog: (model, iter_) = sel.get_selected() if not iter_: return - remote_account = model.get_value(iter_, 0).decode('utf-8') + remote_account = model.get_value(iter_, 0) if gajim.connections[remote_account].connected < 2: ErrorDialog(_('This account is not connected to the server'), @@ -2730,15 +2767,15 @@ class SynchroniseSelectContactsDialog: 'synchronise_select_contacts_dialog.ui') self.dialog = self.xml.get_object('synchronise_select_contacts_dialog') self.contacts_treeview = self.xml.get_object('contacts_treeview') - model = gtk.ListStore(bool, str) + model = Gtk.ListStore(bool, str) self.contacts_treeview.set_model(model) # columns - renderer1 = gtk.CellRendererToggle() + renderer1 = Gtk.CellRendererToggle() renderer1.set_property('activatable', True) renderer1.connect('toggled', self.toggled_callback) self.contacts_treeview.insert_column_with_attributes(-1, _('Synchronise'), renderer1, active=0) - renderer2 = gtk.CellRendererText() + renderer2 = Gtk.CellRendererText() self.contacts_treeview.insert_column_with_attributes(-1, _('Name'), renderer2, text=1) @@ -2752,7 +2789,7 @@ class SynchroniseSelectContactsDialog: model[iter_][0] = not cell.get_active() def on_contacts_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.window.destroy() def init_contacts(self): @@ -2777,11 +2814,11 @@ class SynchroniseSelectContactsDialog: def on_ok_button_clicked(self, widget): model = self.contacts_treeview.get_model() - iter_ = model.get_iter_root() + iter_ = model.get_iter_first() while iter_: if model[iter_][0]: # it is selected - remote_jid = model[iter_][1].decode('utf-8') + remote_jid = model[iter_][1] message = 'I\'m synchronizing my contacts from my %s account, could you please add this address to your contact list?' % \ gajim.get_hostname_from_account(self.remote_account) remote_contact = gajim.contacts.get_first_contact_from_jid( @@ -2803,6 +2840,7 @@ class NewChatDialog(InputDialog): title = _('Start Chat') prompt_text = _('Fill in the nickname or the Jabber ID of the contact you would like\nto send a chat message to:') InputDialog.__init__(self, title, prompt_text, is_modal=False) + self.input_entry.set_placeholder_text(_('Nickname / Jabber ID')) self.completion_dict = {} liststore = gtkgui_helpers.get_completion_liststore(self.input_entry) @@ -2837,8 +2875,8 @@ class NewChatDialog(InputDialog): else: try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, e: - ErrorDialog(_('Invalid JID'), e[0]) + except helpers.InvalidFormat as e: + ErrorDialog(_('Invalid JID'), str(e)) return except: ErrorDialog(_('Invalid JID'), _('Unable to parse "%s".') % jid) @@ -2846,16 +2884,17 @@ class NewChatDialog(InputDialog): gajim.interface.new_chat_from_jid(self.account, jid) class ChangePasswordDialog: - def __init__(self, account, on_response): + def __init__(self, account, on_response, transient_for=None): # 'account' can be None if we are about to create our first one if not account or gajim.connections[account].connected < 2: ErrorDialog(_('You are not connected to the server'), _('Without a connection, you can not change your password.')) - raise GajimGeneralException, 'You are not connected to the server' + raise GajimGeneralException('You are not connected to the server') self.account = account self.on_response = on_response self.xml = gtkgui_helpers.get_gtk_builder('change_password_dialog.ui') self.dialog = self.xml.get_object('change_password_dialog') + self.dialog.set_transient_for(transient_for) self.password1_entry = self.xml.get_object('password1_entry') self.password2_entry = self.xml.get_object('password2_entry') self.dialog.connect('response', self.on_dialog_response) @@ -2863,15 +2902,15 @@ class ChangePasswordDialog: self.dialog.show_all() def on_dialog_response(self, dialog, response): - if response != gtk.RESPONSE_OK: + if response != Gtk.ResponseType.OK: dialog.destroy() self.on_response(None) return - password1 = self.password1_entry.get_text().decode('utf-8') + password1 = self.password1_entry.get_text() if not password1: ErrorDialog(_('Invalid password'), _('You must enter a password.')) return - password2 = self.password2_entry.get_text().decode('utf-8') + password2 = self.password2_entry.get_text() if password1 != password2: ErrorDialog(_('Passwords do not match'), _('The passwords typed in both fields must be identical.')) @@ -2889,7 +2928,7 @@ class PopupNotificationWindow: xml = gtkgui_helpers.get_gtk_builder('popup_notification_window.ui') self.window = xml.get_object('popup_notification_window') - self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_TOOLTIP) + self.window.set_type_hint(Gdk.WindowTypeHint.TOOLTIP) close_button = xml.get_object('close_button') event_type_label = xml.get_object('event_type_label') event_description_label = xml.get_object('event_description_label') @@ -2903,10 +2942,12 @@ class PopupNotificationWindow: event_type_label.set_markup( '<span foreground="black" weight="bold">%s</span>' % - gobject.markup_escape_text(title)) + GLib.markup_escape_text(title)) # set colors [ http://www.pitt.edu/~nisg/cis/web/cgi/rgb.html ] - self.window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('black')) + color = Gdk.RGBA() + Gdk.RGBA.parse(color, 'black') + self.window.override_background_color(Gtk.StateType.NORMAL, color) # default image if not path_to_image: @@ -2932,11 +2973,13 @@ class PopupNotificationWindow: bg_color = gajim.config.get('notif_status_color') else: # Unknown event! Shouldn't happen but deal with it bg_color = gajim.config.get('notif_other_color') - popup_bg_color = gtk.gdk.color_parse(bg_color) - close_button.modify_bg(gtk.STATE_NORMAL, popup_bg_color) - eventbox.modify_bg(gtk.STATE_NORMAL, popup_bg_color) + popup_bg_color = Gdk.RGBA() + Gdk.RGBA.parse(popup_bg_color, bg_color) + close_button.override_background_color(Gtk.StateType.NORMAL, + popup_bg_color) + eventbox.override_background_color(Gtk.StateType.NORMAL, popup_bg_color) event_description_label.set_markup('<span foreground="black">%s</span>' % - gobject.markup_escape_text(text)) + GLib.markup_escape_text(text)) # set the image image.set_from_file(path_to_image) @@ -2946,17 +2989,17 @@ class PopupNotificationWindow: gajim.interface.roster.popups_notification_height += self.window_height pos_x = gajim.config.get('notification_position_x') if pos_x < 0: - pos_x = gtk.gdk.screen_width() - window_width + pos_x + 1 + pos_x = Gdk.Screen.width() - window_width + pos_x + 1 pos_y = gajim.config.get('notification_position_y') if pos_y < 0: - pos_y = gtk.gdk.screen_height() - \ + pos_y = Gdk.Screen.height() - \ gajim.interface.roster.popups_notification_height + pos_y + 1 self.window.move(pos_x, pos_y) xml.connect_signals(self) self.window.show_all() if timeout > 0: - gobject.timeout_add_seconds(timeout, self.on_timeout) + GLib.timeout_add_seconds(timeout, self.on_timeout) def on_close_button_clicked(self, widget): self.adjust_height_and_move_popup_notification_windows() @@ -2981,8 +3024,8 @@ class PopupNotificationWindow: current_index += 1 window_width, window_height = window_instance.window.get_size() gajim.interface.roster.popups_notification_height += window_height - window_instance.window.move(gtk.gdk.screen_width() - window_width, - gtk.gdk.screen_height() - \ + window_instance.window.move(Gdk.Screen.width() - window_width, + Gdk.Screen.height() - \ gajim.interface.roster.popups_notification_height) def on_popup_notification_window_button_press_event(self, widget, event): @@ -3066,7 +3109,7 @@ class SingleMessageWindow: lang = gajim.LANG gtkspell.Spell(self.conversation_textview.tv, lang) gtkspell.Spell(self.message_textview, lang) - except (gobject.GError, TypeError, RuntimeError, OSError): + except (GObject.GError, TypeError, RuntimeError, OSError): AspellDictError(lang) self.prepare_widgets_for(self.action) @@ -3154,7 +3197,7 @@ class SingleMessageWindow: self.cancel_button.hide() self.close_button.show() self.message_tv_buffer.set_text(self.message) - gobject.idle_add(self.set_cursor_to_end) + GLib.idle_add(self.set_cursor_to_end) else: # we write a new message (not from reply) self.close_button.hide() if self.to: # do we already have jid? @@ -3207,7 +3250,7 @@ class SingleMessageWindow: def update_char_counter(self, widget): characters_no = self.message_tv_buffer.get_char_count() - self.count_chars_label.set_text(unicode(characters_no)) + self.count_chars_label.set_text(str(characters_no)) def send_single_message(self): if gajim.connections[self.account].connected <= 1: @@ -3223,12 +3266,12 @@ class SingleMessageWindow: else: sender_list.append(i[0].jid) else: - sender_list = [j.strip() for j in self.to_entry.get_text().decode( - 'utf-8').split(',')] + sender_list = [j.strip() for j in self.to_entry.get_text().split( + ',')] - subject = self.subject_entry.get_text().decode('utf-8') + subject = self.subject_entry.get_text() begin, end = self.message_tv_buffer.get_bounds() - message = self.message_tv_buffer.get_text(begin, end).decode('utf-8') + message = self.message_tv_buffer.get_text(begin, end, True) if self.form_widget: form_node = self.form_widget.data_form @@ -3283,7 +3326,7 @@ class SingleMessageWindow: self.window.destroy() def on_single_message_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: # ESCAPE + if event.keyval == Gdk.KEY_Escape: # ESCAPE self.save_pos() self.window.destroy() @@ -3324,8 +3367,9 @@ class XMLConsoleWindow: self.enabled = True self.xml.get_object('enable_checkbutton').set_active(True) - self.input_textview.modify_text( - gtk.STATE_NORMAL, gtk.gdk.color_parse(color)) + col = Gdk.RGBA() + Gdk.RGBA.parse(col, color) + self.input_textview.override_color(Gtk.StateType.NORMAL, col) if len(gajim.connections) > 1: title = _('XML Console for %s') % self.account @@ -3434,7 +3478,7 @@ class XMLConsoleWindow: buffer.insert_with_tags_by_name(end_iter, stanza.replace('><', '>\n<') \ + '\n\n', type_) if at_the_end: - gobject.idle_add(self.scroll_to_end) + GLib.idle_add(self.scroll_to_end) def _nec_stanza_received(self, obj): if obj.conn.name != self.account: @@ -3454,8 +3498,7 @@ class XMLConsoleWindow: self.account) return begin_iter, end_iter = self.input_tv_buffer.get_bounds() - stanza = self.input_tv_buffer.get_text(begin_iter, end_iter).decode( - 'utf-8') + stanza = self.input_tv_buffer.get_text(begin_iter, end_iter, True) if stanza: gajim.connections[self.account].send_stanza(stanza) self.input_tv_buffer.set_text('') # we sent ok, clear the textview @@ -3518,10 +3561,10 @@ class RosterItemExchangeWindow: else: self.body_scrolledwindow.hide() # Treeview - model = gtk.ListStore(bool, str, str, str, str) + model = Gtk.ListStore(bool, str, str, str, str) self.items_list_treeview.set_model(model) # columns - renderer1 = gtk.CellRendererToggle() + renderer1 = Gtk.CellRendererToggle() renderer1.set_property('activatable', True) renderer1.connect('toggled', self.toggled_callback) if self.action == 'add': @@ -3532,13 +3575,13 @@ class RosterItemExchangeWindow: title = _('Delete') self.items_list_treeview.insert_column_with_attributes(-1, title, renderer1, active=0) - renderer2 = gtk.CellRendererText() + renderer2 = Gtk.CellRendererText() self.items_list_treeview.insert_column_with_attributes(-1, _('Jabber ID'), renderer2, text=1) - renderer3 = gtk.CellRendererText() + renderer3 = Gtk.CellRendererText() self.items_list_treeview.insert_column_with_attributes(-1, _('Name'), renderer3, text=2) - renderer4 = gtk.CellRendererText() + renderer4 = Gtk.CellRendererText() self.items_list_treeview.insert_column_with_attributes(-1, _('Groups'), renderer4, text=3) @@ -3639,21 +3682,21 @@ class RosterItemExchangeWindow: def on_accept_button_clicked(self, widget): model = self.items_list_treeview.get_model() - iter_ = model.get_iter_root() + iter_ = model.get_iter_first() if self.action == 'add': a = 0 while iter_: if model[iter_][0]: a+=1 # it is selected - #remote_jid = model[iter_][1].decode('utf-8') + #remote_jid = model[iter_][1] message = _('%s suggested me to add you in my roster.' % self.jid_from) # keep same groups and same nickname groups = model[iter_][3].split(', ') if groups == ['']: groups = [] - jid = model[iter_][1].decode('utf-8') + jid = model[iter_][1] if gajim.jid_is_transport(self.jid_from): gajim.connections[self.account].automatically_added.append( jid) @@ -3669,7 +3712,7 @@ class RosterItemExchangeWindow: if model[iter_][0]: a+=1 # it is selected - jid = model[iter_][1].decode('utf-8') + jid = model[iter_][1] # keep same groups and same nickname groups = model[iter_][3].split(', ') if groups == ['']: @@ -3694,7 +3737,7 @@ class RosterItemExchangeWindow: if model[iter_][0]: a+=1 # it is selected - jid = model[iter_][1].decode('utf-8') + jid = model[iter_][1] gajim.connections[self.account].unsubscribe(jid) gajim.interface.roster.remove_contact(jid, self.account) gajim.contacts.remove_jid(self.account, jid) @@ -3770,7 +3813,7 @@ class ItemArchivingPreferencesWindow: if self.item != 'Default': try: item = helpers.parse_jid(item) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: pritext = _('Invalid User ID') ErrorDialog(pritext, str(s)) return @@ -3817,8 +3860,8 @@ class ItemArchivingPreferencesWindow: def launch_progressbar(self): self.progressbar.show() - self.update_progressbar_timeout_id = gobject.timeout_add( - 100, self.update_progressbar) + self.update_progressbar_timeout_id = GLib.timeout_add(100, + self.update_progressbar) def response_arrived(self, data): if self.waiting: @@ -3865,26 +3908,26 @@ class ArchivingPreferencesWindow: self.method_foo_index[gajim.connections[self.account].\ method_manual]) - model = gtk.ListStore(str, str, str, str) + model = Gtk.ListStore(str, str, str, str) self.item_treeview.set_model(model) - col = gtk.TreeViewColumn('jid') + col = Gtk.TreeViewColumn('jid') self.item_treeview.append_column(col) - renderer = gtk.CellRendererText() - col.pack_start(renderer, True) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text=0) - col = gtk.TreeViewColumn('expire') - col.pack_start(renderer, True) + col = Gtk.TreeViewColumn('expire') + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text=1) self.item_treeview.append_column(col) - col = gtk.TreeViewColumn('otr') - col.pack_start(renderer, True) + col = Gtk.TreeViewColumn('otr') + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text=2) self.item_treeview.append_column(col) - col = gtk.TreeViewColumn('save') - col.pack_start(renderer, True) + col = Gtk.TreeViewColumn('save') + col.pack_start(renderer, True, True, 0) col.set_attributes(renderer, text=3) self.item_treeview.append_column(col) @@ -3892,7 +3935,7 @@ class ArchivingPreferencesWindow: self.current_item = None - def sort_items(model, iter1, iter2): + def sort_items(model, iter1, iter2, data=None): item1 = model.get_value(iter1, 0) item2 = model.get_value(iter2, 0) if item1 == 'Default': @@ -3911,7 +3954,7 @@ class ArchivingPreferencesWindow: # item1 == item2 ? WTF? return 0 - model.set_sort_column_id(0, gtk.SORT_ASCENDING) + model.set_sort_column_id(0, Gtk.SortType.ASCENDING) model.set_sort_func(0, sort_items) self.remove_button.set_sensitive(False) @@ -4117,7 +4160,7 @@ class PrivacyListWindow: self.privacy_lists_title_label.set_label( _('Privacy List <b><i>%s</i></b>') % \ - gobject.markup_escape_text(self.privacy_list_name)) + GLib.markup_escape_text(self.privacy_list_name)) if len(gajim.connections) > 1: title = _('Privacy List for %s') % self.account @@ -4131,10 +4174,10 @@ class PrivacyListWindow: self.list_of_rules_combobox.set_sensitive(False) # set jabber id completion - jids_list_store = gtk.ListStore(gobject.TYPE_STRING) + jids_list_store = Gtk.ListStore(GObject.TYPE_STRING) for jid in gajim.contacts.get_jid_list(self.account): jids_list_store.append([jid]) - jid_entry_completion = gtk.EntryCompletion() + jid_entry_completion = Gtk.EntryCompletion() jid_entry_completion.set_text_column(0) jid_entry_completion.set_model(jids_list_store) jid_entry_completion.set_popup_completion(True) @@ -4142,11 +4185,12 @@ class PrivacyListWindow: if action == 'EDIT': self.refresh_rules() + model = self.edit_type_group_combobox.get_model() count = 0 for group in gajim.groups[self.account]: self.list_of_groups[group] = count count += 1 - self.edit_type_group_combobox.append_text(group) + model.append([group]) self.edit_type_group_combobox.set_active(0) self.window.set_title(title) @@ -4183,7 +4227,8 @@ class PrivacyListWindow: self.privacy_list_default_checkbutton.set_active(False) def privacy_list_received(self, rules): - self.list_of_rules_combobox.get_model().clear() + model = self.list_of_rules_combobox.get_model() + model.clear() self.global_rules = {} for rule in rules: if 'type' in rule: @@ -4197,7 +4242,7 @@ class PrivacyListWindow: if int(rule['order']) > self.max_order: self.max_order = int(rule['order']) self.global_rules[text_item] = rule - self.list_of_rules_combobox.append_text(text_item) + model.append([text_item]) if len(rules) == 0: self.title_hbox.set_sensitive(False) self.list_of_rules_combobox.set_sensitive(False) @@ -4227,9 +4272,12 @@ class PrivacyListWindow: gajim.connections[self.account].get_privacy_list(self.privacy_list_name) def on_delete_rule_button_clicked(self, widget): + model = self.list_of_rules_combobox.get_model() + iter_ = self.list_of_rules_combobox.get_active_iter() + _rule = model[iter_][0] tags = [] for rule in self.global_rules: - if rule != self.list_of_rules_combobox.get_active_text(): + if rule != _rule: tags.append(self.global_rules[rule]) gajim.connections[self.account].set_privacy_list( self.privacy_list_name, tags) @@ -4248,8 +4296,9 @@ class PrivacyListWindow: if active_num == -1: self.active_rule = '' else: - self.active_rule = \ - self.list_of_rules_combobox.get_active_text().decode('utf-8') + model = self.list_of_rules_combobox.get_model() + iter_ = self.list_of_rules_combobox.get_active_iter() + self.active_rule = model[iter_][0] if self.active_rule != '': rule_info = self.global_rules[self.active_rule] self.edit_order_spinbutton.set_value(int(rule_info['order'])) @@ -4362,7 +4411,9 @@ class PrivacyListWindow: edit_value = self.edit_type_jabberid_entry.get_text() elif self.edit_type_group_radiobutton.get_active(): edit_type = 'group' - edit_value = self.edit_type_group_combobox.get_active_text() + model = self.edit_type_group_combobox.get_model() + iter_ = self.edit_type_group_combobox.get_active_iter() + edit_value = model[iter_][0] elif self.edit_type_subscription_radiobutton.get_active(): edit_type = 'subscription' subs = ['none', 'both', 'from', 'to'] @@ -4486,7 +4537,8 @@ class PrivacyListsWindow: def add_privacy_list_to_combobox(self, privacy_list): if privacy_list in self.privacy_lists_save: return - self.list_of_privacy_lists_combobox.append_text(privacy_list) + model = self.list_of_privacy_lists_combobox.get_model() + model.append([privacy_list]) self.privacy_lists_save.append(privacy_list) def draw_privacy_lists_in_combobox(self, privacy_lists): @@ -4594,7 +4646,7 @@ class InvitationReceivedDialog: contact_text) if comment: # only if not None and not '' - comment = gobject.markup_escape_text(comment) + comment = GLib.markup_escape_text(comment) comment = _('Comment: %s') % comment sectext += '\n\n%s' % comment sectext += '\n\n' + _('Do you want to accept the invitation?') @@ -4631,11 +4683,11 @@ class ProgressDialog: self.progressbar = self.xml.get_object('progressbar') self.dialog.set_title(title_text) self.dialog.set_default_size(450, 250) - self.window.set_position(gtk.WIN_POS_CENTER_ON_PARENT) + self.window.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) self.dialog.show_all() self.xml.connect_signals(self) - self.update_progressbar_timeout_id = gobject.timeout_add(100, + self.update_progressbar_timeout_id = GLib.timeout_add(100, self.update_progressbar) def update_progressbar(self): @@ -4667,20 +4719,21 @@ class ClientCertChooserDialog(FileChooserDialog): FileChooserDialog.__init__(self, title_text=_('Choose Client Cert #PCKS12'), - action=gtk.FILE_CHOOSER_ACTION_OPEN, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN, gtk.RESPONSE_OK), + transient_for=gajim.interface.instances['accounts'].window, + action=Gtk.FileChooserAction.OPEN, + buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, Gtk.ResponseType.OK), current_folder='', - default_response=gtk.RESPONSE_OK, + default_response=Gtk.ResponseType.OK, on_response_ok=(on_ok, on_response_ok), on_response_cancel=on_response_cancel) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('All files')) filter_.add_pattern('*') self.add_filter(filter_) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('PKCS12 Files')) filter_.add_pattern('*.p12') self.add_filter(filter_) @@ -4709,20 +4762,20 @@ class SoundChooserDialog(FileChooserDialog): callback(widget, path_to_snd_file) FileChooserDialog.__init__(self, title_text = _('Choose Sound'), - action = gtk.FILE_CHOOSER_ACTION_OPEN, - buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN, gtk.RESPONSE_OK), - default_response = gtk.RESPONSE_OK, + action = Gtk.FileChooserAction.OPEN, + buttons = (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, Gtk.ResponseType.OK), + default_response = Gtk.ResponseType.OK, current_folder = gajim.config.get('last_sounds_dir'), on_response_ok = (on_ok, on_response_ok), on_response_cancel = on_response_cancel) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('All files')) filter_.add_pattern('*') self.add_filter(filter_) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('Wav Sounds')) filter_.add_pattern('*.wav') self.add_filter(filter_) @@ -4762,10 +4815,10 @@ class ImageChooserDialog(FileChooserDialog): path = '' FileChooserDialog.__init__(self, title_text = _('Choose Image'), - action = gtk.FILE_CHOOSER_ACTION_OPEN, - buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN, gtk.RESPONSE_OK), - default_response = gtk.RESPONSE_OK, + action = Gtk.FileChooserAction.OPEN, + buttons = (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, Gtk.ResponseType.OK), + default_response = Gtk.ResponseType.OK, current_folder = path, on_response_ok = (on_ok, on_response_ok), on_response_cancel = on_response_cancel) @@ -4773,12 +4826,12 @@ class ImageChooserDialog(FileChooserDialog): if on_response_cancel: self.connect('destroy', on_response_cancel) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('All files')) filter_.add_pattern('*') self.add_filter(filter_) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('Images')) filter_.add_mime_type('image/png') filter_.add_mime_type('image/jpeg') @@ -4793,7 +4846,7 @@ class ImageChooserDialog(FileChooserDialog): self.set_filename(path_to_file) self.set_use_preview_label(False) - self.set_preview_widget(gtk.Image()) + self.set_preview_widget(Gtk.Image()) self.connect('selection-changed', self.update_preview) def update_preview(self, widget): @@ -4801,11 +4854,12 @@ class ImageChooserDialog(FileChooserDialog): if path_to_file is None or os.path.isdir(path_to_file): # nothing to preview or directory # make sure you clean image do show nothing - widget.get_preview_widget().set_from_file(None) + preview = widget.get_preview_widget() + preview.clear() return try: - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(path_to_file, 100, 100) - except gobject.GError: + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(path_to_file, 100, 100) + except GObject.GError: return widget.get_preview_widget().set_from_pixbuf(pixbuf) @@ -4814,12 +4868,12 @@ class AvatarChooserDialog(ImageChooserDialog): on_response_cancel=None, on_response_clear=None): ImageChooserDialog.__init__(self, path_to_file, on_response_ok, on_response_cancel) - button = gtk.Button(None, gtk.STOCK_CLEAR) + button = Gtk.Button(None, Gtk.STOCK_CLEAR) self.response_clear = on_response_clear if on_response_clear: button.connect('clicked', self.on_clear) button.show_all() - self.action_area.pack_start(button) + self.action_area.pack_start(button, True, True, 0) self.action_area.reorder_child(button, 0) def on_clear(self, widget): @@ -4850,10 +4904,10 @@ class ArchiveChooserDialog(FileChooserDialog): FileChooserDialog.__init__(self, title_text=_('Choose Archive'), - action=gtk.FILE_CHOOSER_ACTION_OPEN, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN, gtk.RESPONSE_OK), - default_response=gtk.RESPONSE_OK, + action=Gtk.FileChooserAction.OPEN, + buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, Gtk.ResponseType.OK), + default_response=Gtk.ResponseType.OK, current_folder=path, on_response_ok=(on_ok, on_response_ok), on_response_cancel=on_response_cancel) @@ -4861,12 +4915,12 @@ class ArchiveChooserDialog(FileChooserDialog): if on_response_cancel: self.connect('destroy', on_response_cancel) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('All files')) filter_.add_pattern('*') self.add_filter(filter_) - filter_ = gtk.FileFilter() + filter_ = Gtk.FileFilter() filter_.set_name(_('Zip files')) filter_.add_pattern('*.zip') @@ -4910,7 +4964,6 @@ class AddSpecialNotificationDialog: if active == 1: # user selected 'choose sound' def on_ok(widget, path_to_snd_file): pass - #print path_to_snd_file def on_cancel(widget): widget.set_active(0) # go back to No Sound @@ -4949,10 +5002,11 @@ class TransformChatToMUC: self.__dict__[widget_to_add] = self.xml.get_object(widget_to_add) server_list = [] - self.servers = gtk.ListStore(str) + self.servers = Gtk.ListStore(str) self.server_list_comboboxentry.set_model(self.servers) - - self.server_list_comboboxentry.set_text_column(0) + cell = Gtk.CellRendererText() + self.server_list_comboboxentry.pack_start(cell, True) + self.server_list_comboboxentry.add_attribute(cell, 'text', 0) # get the muc server of our server if 'jabber' in gajim.connections[account].muc_jid: @@ -4974,18 +5028,18 @@ class TransformChatToMUC: # set treeview # name, jid - self.store = gtk.ListStore(gtk.gdk.Pixbuf, str, str) - self.store.set_sort_column_id(1, gtk.SORT_ASCENDING) + self.store = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str) + self.store.set_sort_column_id(1, Gtk.SortType.ASCENDING) self.guests_treeview.set_model(self.store) - renderer1 = gtk.CellRendererText() - renderer2 = gtk.CellRendererPixbuf() - column = gtk.TreeViewColumn('Status', renderer2, pixbuf=0) + renderer1 = Gtk.CellRendererText() + renderer2 = Gtk.CellRendererPixbuf() + column = Gtk.TreeViewColumn('Status', renderer2, pixbuf=0) self.guests_treeview.append_column(column) - column = gtk.TreeViewColumn('Name', renderer1, text=1) + column = Gtk.TreeViewColumn('Name', renderer1, text=1) self.guests_treeview.append_column(column) - self.guests_treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + self.guests_treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) # All contacts beside the following can be invited: # transports, zeroconf contacts, minimized groupchats @@ -5035,11 +5089,13 @@ class TransformChatToMUC: self.instances.remove(self) def on_chat_to_muc_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: # ESCAPE + if event.keyval == Gdk.KEY_Escape: # ESCAPE self.window.destroy() def on_invite_button_clicked(self, widget): - server = self.server_list_comboboxentry.get_active_text() + row = self.server_list_comboboxentry.get_child().get_displayed_row() + model = self.server_list_comboboxentry.get_model() + server = model[row][0].strip() if server == '': return gajim.connections[self.account].check_unique_room_id_support(server, self) @@ -5051,7 +5107,7 @@ class TransformChatToMUC: guests = self.guests_treeview.get_selection().get_selected_rows() for guest in guests[1]: iter_ = self.store.get_iter(guest) - guest_list.append(self.store[iter_][2].decode('utf-8')) + guest_list.append(self.store[iter_][2]) for guest in self.auto_jids: guest_list.append(guest) room_jid = obj.room_id + '@' + obj.server @@ -5075,8 +5131,8 @@ class TransformChatToMUC: class DataFormWindow(Dialog): def __init__(self, form, on_response_ok): self.df_response_ok = on_response_ok - Dialog.__init__(self, None, 'test', [(gtk.STOCK_CANCEL, - gtk.RESPONSE_REJECT), (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)], + Dialog.__init__(self, None, 'test', [(Gtk.STOCK_CANCEL, + Gtk.ResponseType.REJECT), (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT)], on_response_ok=self.on_ok) self.set_resizable(True) gtkgui_helpers.resize_window(self, 600, 400) @@ -5085,7 +5141,7 @@ class DataFormWindow(Dialog): self.dataform_widget.set_sensitive(True) self.dataform_widget.data_form = self.dataform self.dataform_widget.show_all() - self.vbox.pack_start(self.dataform_widget) + self.vbox.pack_start(self.dataform_widget, True, True, 0) def on_ok(self): form = self.dataform_widget.data_form @@ -5107,7 +5163,7 @@ class ESessionInfoWindow: self.security_image = self.xml.get_object('security_image') self.verify_now_button = self.xml.get_object('verify_now_button') - self.button_label = self.xml.get_object('button_label') + self.button_label = self.xml.get_object('verification_status_label') self.window = self.xml.get_object('esession_info_window') self.update_info() self.window.set_transient_for(transient_for) @@ -5175,7 +5231,7 @@ class GPGInfoWindow: """ Class for displaying information about a XEP-0116 encrypted session """ - def __init__(self, control): + def __init__(self, control, transient_for=None): xml = gtkgui_helpers.get_gtk_builder('esession_info_window.ui') security_image = xml.get_object('security_image') status_label = xml.get_object('verification_status_label') @@ -5309,7 +5365,7 @@ class VoIPCallReceivedDialog(object): def on_voip_call_received_messagedialog_close(self, dialog): return self.on_voip_call_received_messagedialog_response(dialog, - gtk.RESPONSE_NO) + Gtk.ResponseType.NO) def on_voip_call_received_messagedialog_response(self, dialog, response): # we've got response from user, either stop connecting or accept the call @@ -5318,7 +5374,7 @@ class VoIPCallReceivedDialog(object): if not session: dialog.destroy() return - if response == gtk.RESPONSE_YES: + if response == Gtk.ResponseType.YES: #TODO: Ensure that ctrl.contact.resource == resource jid = gajim.get_jid_without_resource(self.fjid) resource = gajim.get_resource_from_jid(self.fjid) @@ -5338,12 +5394,13 @@ class VoIPCallReceivedDialog(object): fixed = ctrl.xml.get_object('outgoing_fixed') fixed.set_no_show_all(False) video_hbox.show_all() - in_xid = ctrl.xml.get_object('incoming_drawingarea').window.xid + in_xid = ctrl.xml.get_object('incoming_drawingarea').\ + get_window().xid content = session.get_content('video') # move outgoing stream to chat window if gajim.config.get('video_see_self'): out_xid = ctrl.xml.get_object('outgoing_drawingarea').\ - window.xid + get_window().xid b = content.src_bin found = False for e in b.elements(): @@ -5364,7 +5421,7 @@ class VoIPCallReceivedDialog(object): session.approve_session() for content in self.content_types: session.approve_content(content) - else: # response==gtk.RESPONSE_NO + else: # response==Gtk.ResponseType.NO if not session.accepted: session.decline_session() else: @@ -5375,7 +5432,6 @@ class VoIPCallReceivedDialog(object): class CertificatDialog(InformationDialog): def __init__(self, parent, account, cert): - self.set_title(_('Certificate for account %s') % account) issuer = cert.get_issuer() subject = cert.get_subject() InformationDialog.__init__(self, @@ -5404,6 +5460,7 @@ SHA1 Fingerprint: %(sha1)s''') % { 'io': cert.get_notBefore(), 'eo': cert.get_notAfter(), 'sha1': cert.digest('sha1')}) self.set_transient_for(parent) + self.set_title(_('Certificate for account %s') % account) class CheckFingerprintDialog(YesNoDialog): @@ -5415,14 +5472,14 @@ class CheckFingerprintDialog(YesNoDialog): checktext=checktext, on_response_yes=on_response_yes, on_response_no=on_response_no) self.set_title(_('SSL Certificate Verification for %s') % account) - b = gtk.Button(_('View cert...')) + b = Gtk.Button(_('View cert...')) b.connect('clicked', self.on_cert_clicked) b.show_all() area = self.get_action_area() - area.pack_start(b) + area.pack_start(b, True, True, 0) def on_cert_clicked(self, button): - d = CertificatDialog(self, self.account, self.cert) + CertificatDialog(self, self.account, self.cert) class SSLErrorDialog(ConfirmationDialogDoubleCheck): def __init__(self, account, certificate, pritext, sectext, checktext1, @@ -5432,11 +5489,58 @@ class SSLErrorDialog(ConfirmationDialogDoubleCheck): ConfirmationDialogDoubleCheck.__init__(self, pritext, sectext, checktext1, checktext2, on_response_ok=on_response_ok, on_response_cancel=on_response_cancel, is_modal=False) - b = gtk.Button(_('View cert...')) + b = Gtk.Button(_('View cert...')) b.connect('clicked', self.on_cert_clicked) b.show_all() area = self.get_action_area() - area.pack_start(b) + area.pack_start(b, True, True, 0) def on_cert_clicked(self, button): - CertificatDialog(self, self.account, self.cert) + d = CertificatDialog(self, self.account, self.cert) + + +class BigAvatarWindow(Gtk.Window): + def __init__(self, avatar, pos_x, pos_y, width, height, callback): + super(BigAvatarWindow, self).__init__(type=Gtk.WindowType.POPUP) + self.set_events(Gdk.EventMask.POINTER_MOTION_MASK) + self.avatar = avatar + self.callback = callback + self.screen = self.get_screen() + self.visual = self.screen.get_rgba_visual() + if self.visual != None and self.screen.is_composited(): + self.set_visual(self.visual) + self.set_app_paintable(True) + self.set_size_request(width, height) + self.move(pos_x, pos_y) + self.connect("draw", self.area_draw) + # we should hide the window + self.connect('leave_notify_event', self._on_window_avatar_leave_notify) + self.connect('motion-notify-event', self._on_window_motion_notify) + self.realize() + # make the cursor invisible so we can see the image + invisible_cursor = gtkgui_helpers.get_invisible_cursor() + self.get_window().set_cursor(invisible_cursor) + self.show_all() + + def area_draw(self, widget, cr): + cr.set_source_rgba(.2, .2, .2, 0.0) + cr.set_operator(cairo.OPERATOR_SOURCE) + Gdk.cairo_set_source_pixbuf(cr, self.avatar, 0, 0) + cr.paint() + cr.set_operator(cairo.OPERATOR_OVER) + + def _on_window_avatar_leave_notify(self, widget, event): + """ + Just left the popup window that holds avatar + """ + self.destroy() + self.bigger_avatar_window = None + # Re-show the small avatar + self.callback() + + def _on_window_motion_notify(self, widget, event): + """ + Just moved the mouse so show the cursor + """ + cursor = Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR) + self.get_window().set_cursor(cursor) diff --git a/src/disco.py b/src/disco.py index d763504904b80294d3f74a54959f31490a5b94bf..91a36b655d5c04926eb23c17193bdf1f239b044f 100644 --- a/src/disco.py +++ b/src/disco.py @@ -47,9 +47,11 @@ import os import types import weakref -import gobject -import gtk -import pango +from gi.repository import GLib +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf +from gi.repository import Pango import dialogs import tooltips @@ -151,10 +153,10 @@ class CacheDictionary: return self.value def cleanup(self): - for key in self.cache.keys(): + for key in list(self.cache.keys()): item = self.cache[key] if item.source: - gobject.source_remove(item.source) + GLib.source_remove(item.source) del self.cache[key] def _expire_timeout(self, key): @@ -171,9 +173,9 @@ class CacheDictionary: """ item = self.cache[key] if item.source: - gobject.source_remove(item.source) + GLib.source_remove(item.source) if self.lifetime: - source = gobject.timeout_add_seconds(self.lifetime/1000, self._expire_timeout, key) + source = GLib.timeout_add_seconds(int(self.lifetime/1000), self._expire_timeout, key) item.source = source def __getitem__(self, key): @@ -190,12 +192,11 @@ class CacheDictionary: def __delitem__(self, key): item = self.cache[key] if item.source: - gobject.source_remove(item.source) + GLib.source_remove(item.source) del self.cache[key] def __contains__(self, key): return key in self.cache - has_key = __contains__ _icon_cache = CacheDictionary(15) @@ -224,8 +225,8 @@ class Closure(object): self.remove = remove self.removeargs = removeargs if isinstance(cb, types.MethodType): - self.meth_self = weakref.ref(cb.im_self, self._remove) - self.meth_name = cb.func_name + self.meth_self = weakref.ref(cb.__self__, self._remove) + self.meth_name = cb.__name__ elif callable(cb): self.meth_self = None self.cb = weakref.ref(cb, self._remove) @@ -523,7 +524,7 @@ class ServiceDiscoveryWindow(object): if gajim.connections[account].connected < 2: dialogs.ErrorDialog(_('You are not connected to the server'), _('Without a connection, you can not browse available services')) - raise RuntimeError, 'You must be connected to browse services' + raise RuntimeError('You must be connected to browse services') # Get a ServicesCache object. try: @@ -553,13 +554,13 @@ _('Without a connection, you can not browse available services')) self.action_buttonbox = self.xml.get_object('action_buttonbox') # Address combobox - self.address_comboboxentry = None + self.address_comboboxtext = None address_table = self.xml.get_object('address_table') if address_entry: - self.address_comboboxentry = self.xml.get_object( - 'address_comboboxentry') - self.address_comboboxentry_entry = self.address_comboboxentry.child - self.address_comboboxentry_entry.set_activates_default(True) + self.address_comboboxtext = self.xml.get_object( + 'address_comboboxtext') + self.address_comboboxtext_entry = self.xml.get_object( + 'address_entry') self.latest_addresses = gajim.config.get( 'latest_disco_addresses').split() @@ -569,16 +570,16 @@ _('Without a connection, you can not browse available services')) if len(self.latest_addresses) > 10: self.latest_addresses = self.latest_addresses[0:10] for j in self.latest_addresses: - self.address_comboboxentry.append_text(j) - self.address_comboboxentry.child.set_text(jid) + self.address_comboboxtext.append_text(j) + self.address_comboboxtext.get_child().set_text(jid) else: # Don't show it at all if we didn't ask for it address_table.set_no_show_all(True) address_table.hide() - accel_group = gtk.AccelGroup() - keyval, mod = gtk.accelerator_parse('<Control>r') - accel_group.connect_group(keyval, mod, gtk.ACCEL_VISIBLE, + accel_group = Gtk.AccelGroup() + keyval, mod = Gtk.accelerator_parse('<Control>r') + accel_group.connect(keyval, mod, Gtk.AccelFlags.VISIBLE, self.accel_group_func) self.window.add_accel_group(accel_group) @@ -599,7 +600,7 @@ _('Without a connection, you can not browse available services')) self.browser.account = value def accel_group_func(self, accel_group, acceleratable, keyval, modifier): - if (modifier & gtk.gdk.CONTROL_MASK) and (keyval == gtk.keysyms.r): + if (modifier & Gdk.ModifierType.CONTROL_MASK) and (keyval == Gdk.KEY_r): self.reload() def _initial_state(self): @@ -621,15 +622,15 @@ _('Without a connection, you can not browse available services')) 'bannerfontattrs') if bannerfont: - font = pango.FontDescription(bannerfont) + font = Pango.FontDescription(bannerfont) else: - font = pango.FontDescription('Normal') + font = Pango.FontDescription('Normal') if bannerfontattrs: # B is attribute set by default if 'B' in bannerfontattrs: - font.set_weight(pango.WEIGHT_HEAVY) + font.set_weight(Pango.Weight.HEAVY) if 'I' in bannerfontattrs: - font.set_style(pango.STYLE_ITALIC) + font.set_style(Pango.Style.ITALIC) font_attrs = 'font_desc="%s"' % font.to_string() font_size = font.get_size() @@ -639,7 +640,7 @@ _('Without a connection, you can not browse available services')) font_attrs = '%s size="large"' % font_attrs markup = '<span %s>%s</span>' % (font_attrs, text) if text_after: - font.set_weight(pango.WEIGHT_NORMAL) + font.set_weight(Pango.Weight.NORMAL) markup = '%s\n<span font_desc="%s" size="small">%s</span>' % \ (markup, font.to_string(), text_after) self.banner.set_markup(markup) @@ -653,15 +654,18 @@ _('Without a connection, you can not browse available services')) textcolor = gajim.config.get_per('themes', theme, 'bannertextcolor') self.disconnect_style_event() if bgcolor: - color = gtk.gdk.color_parse(bgcolor) - self.banner_eventbox.modify_bg(gtk.STATE_NORMAL, color) + color = Gdk.RGBA() + Gdk.RGBA.parse(color, bgcolor) + self.banner_eventbox.override_background_color(Gtk.StateType.NORMAL, + color) default_bg = False else: default_bg = True if textcolor: - color = gtk.gdk.color_parse(textcolor) - self.banner.modify_fg(gtk.STATE_NORMAL, color) + color = Gdk.RGBA() + Gdk.RGBA.parse(color, textcolor) + self.banner.override_color(Gtk.StateType.NORMAL, color) default_fg = False else: default_fg = True @@ -687,12 +691,14 @@ _('Without a connection, you can not browse available services')) opts[1] == True -> set bg color """ self.disconnect_style_event() + context = widget.get_style_context() if opts[1]: - bg_color = widget.style.bg[gtk.STATE_SELECTED] - self.banner_eventbox.modify_bg(gtk.STATE_NORMAL, bg_color) + bg_color = context.get_background_color(Gtk.StateFlags.SELECTED) + self.banner_eventbox.override_background_color(Gtk.StateType.NORMAL, + bg_color) if opts[0]: - fg_color = widget.style.fg[gtk.STATE_SELECTED] - self.banner.modify_fg(gtk.STATE_NORMAL, fg_color) + fg_color = context.get_color(Gtk.StateFlags.SELECTED) + self.banner.override_color(Gtk.StateType.NORMAL, fg_color) self.banner.ensure_style() self.connect_style_event(opts[0], opts[1]) @@ -763,7 +769,7 @@ _('Without a connection, you can not browse available services')) if self.dying or jid != self.jid or node != self.node: return if not identities: - if not self.address_comboboxentry: + if not self.address_comboboxtext: # We can't travel anywhere else. self.destroy() dialogs.ErrorDialog(_('The service could not be found'), @@ -808,23 +814,23 @@ _('Without a connection, you can not browse available services')) def on_close_button_clicked(self, widget): self.destroy() - def on_address_comboboxentry_changed(self, widget): - if self.address_comboboxentry.get_active() != -1: + def on_address_comboboxtext_changed(self, widget): + if self.address_comboboxtext.get_active() != -1: # user selected one of the entries so do auto-visit - jid = self.address_comboboxentry.child.get_text().decode('utf-8') + jid = self.address_comboboxtext_entry.get_text() try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: pritext = _('Invalid Server Name') dialogs.ErrorDialog(pritext, str(s)) return self.travel(jid, '') def on_go_button_clicked(self, widget): - jid = self.address_comboboxentry.child.get_text().decode('utf-8') + jid = self.address_comboboxtext_entry.get_text() try: jid = helpers.parse_jid(jid) - except helpers.InvalidFormat, s: + except helpers.InvalidFormat as s: pritext = _('Invalid Server Name') dialogs.ErrorDialog(pritext, str(s)) return @@ -835,9 +841,9 @@ _('Without a connection, you can not browse available services')) self.latest_addresses.insert(0, jid) if len(self.latest_addresses) > 10: self.latest_addresses = self.latest_addresses[0:10] - self.address_comboboxentry.get_model().clear() + self.address_comboboxtext.get_model().clear() for j in self.latest_addresses: - self.address_comboboxentry.append_text(j) + self.address_comboboxtext.append_text(j) gajim.config.set('latest_disco_addresses', ' '.join(self.latest_addresses)) self.travel(jid, '') @@ -890,21 +896,21 @@ class AgentBrowser: the JID and node of the item respectively """ # JID, node, name, address - self.model = gtk.ListStore(str, str, str, str) - self.model.set_sort_column_id(3, gtk.SORT_ASCENDING) + self.model = Gtk.ListStore(str, str, str, str) + self.model.set_sort_column_id(3, Gtk.SortType.ASCENDING) self.window.services_treeview.set_model(self.model) # Name column - col = gtk.TreeViewColumn(_('Name')) - renderer = gtk.CellRendererText() - col.pack_start(renderer) - col.set_attributes(renderer, text = 2) + col = Gtk.TreeViewColumn(_('Name')) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', 2) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) # Address column - col = gtk.TreeViewColumn(_('JID')) - renderer = gtk.CellRendererText() - col.pack_start(renderer) - col.set_attributes(renderer, text = 3) + col = Gtk.TreeViewColumn(_('JID')) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', 3) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) self.window.services_treeview.set_headers_visible(True) @@ -920,16 +926,13 @@ class AgentBrowser: Add the action buttons to the buttonbox for actions the browser can perform """ - self.browse_button = gtk.Button() - image = gtk.image_new_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_BUTTON) - label = gtk.Label(_('_Browse')) - label.set_use_underline(True) - hbox = gtk.HBox() - hbox.pack_start(image, False, True, 6) - hbox.pack_end(label, True, True) - self.browse_button.add(hbox) + self.browse_button = Gtk.Button() self.browse_button.connect('clicked', self.on_browse_button_clicked) self.window.action_buttonbox.add(self.browse_button) + image = Gtk.Image.new_from_stock(Gtk.STOCK_OPEN, Gtk.IconSize.BUTTON) + self.browse_button.set_image(image) + label = _('_Browse') + self.browse_button.set_label(label) self.browse_button.show_all() def _clean_actions(self): @@ -945,9 +948,18 @@ class AgentBrowser: Set the window title based on agent info """ # Set the banner and window title - if 'name' in identities[0]: - name = identities[0]['name'] - self.window._set_window_banner_text(self._get_agent_address(), name) + name = '' + if len(identities) > 1: + # Check if an identity with server category is present + for i, _identity in enumerate(identities): + if _identity['category'] == 'server' and 'name' in _identity: + name = _identity['name'] + break + elif 'name' in identities[0]: + name = identities[0]['name'] + + if name: + self.window._set_window_banner_text(self._get_agent_address(), name) # Add an icon to the banner. pix = self.cache.get_icon(identities, addr=self._get_agent_address()) @@ -975,7 +987,7 @@ class AgentBrowser: # or pack_end, so we repack the close button here to make sure it's last close_button = self.window.xml.get_object('close_button') self.window.action_buttonbox.remove(close_button) - self.window.action_buttonbox.pack_end(close_button) + self.window.action_buttonbox.pack_end(close_button, True, True, 0) close_button.show_all() self.update_actions() @@ -1009,9 +1021,9 @@ class AgentBrowser: model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - jid = model[iter_][0].decode('utf-8') + jid = model[iter_][0] if jid: - node = model[iter_][1].decode('utf-8') + node = model[iter_][1] self.window.open(jid, node) def update_actions(self): @@ -1023,8 +1035,8 @@ class AgentBrowser: model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - jid = model[iter_][0].decode('utf-8') - node = model[iter_][1].decode('utf-8') + jid = model[iter_][0] + node = model[iter_][1] if jid: self.cache.get_info(jid, node, self._update_actions, nofetch = True) @@ -1046,8 +1058,8 @@ class AgentBrowser: model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - jid = model[iter_][0].decode('utf-8') - node = model[iter_][1].decode('utf-8') + jid = model[iter_][0] + node = model[iter_][1] if jid: self.cache.get_info(jid, node, self._default_action, nofetch = True) @@ -1068,7 +1080,7 @@ class AgentBrowser: self.model.clear() self._total_items = self._progress = 0 self.window.progressbar.show() - self._pulse_timeout = gobject.timeout_add(250, self._pulse_timeout_cb) + self._pulse_timeout = GLib.timeout_add(250, self._pulse_timeout_cb) self.cache.get_items(self.jid, self.node, self._agent_items, force=force, args=(force,)) @@ -1086,10 +1098,10 @@ class AgentBrowser: Check if an item is already in the treeview. Return an iter to it if so, None otherwise """ - iter_ = self.model.get_iter_root() + iter_ = self.model.get_iter_first() while iter_: - cjid = self.model.get_value(iter_, 0).decode('utf-8') - cnode = self.model.get_value(iter_, 1).decode('utf-8') + cjid = self.model.get_value(iter_, 0) + cnode = self.model.get_value(iter_, 1) if jid == cjid and node == cnode: break iter_ = self.model.iter_next(iter_) @@ -1107,15 +1119,16 @@ class AgentBrowser: self.model.clear() self.add_self_line() self._total_items = 0 - gobject.source_remove(self._pulse_timeout) + GLib.source_remove(self._pulse_timeout) self.window.progressbar.hide() # The server returned an error if items == 0: - if not self.window.address_comboboxentry: + if not self.window.address_comboboxtext: # We can't travel anywhere else. self.window.destroy() dialogs.ErrorDialog(_('The service is not browsable'), -_('This service does not contain any items to browse.')) + _('This service does not contain any items to browse.'), + transient_for=self.window.window) return # We got a list of items def fill_partial_rows(items): @@ -1139,7 +1152,7 @@ _('This service does not contain any items to browse.')) #stop idle_add() yield False loader = fill_partial_rows(items) - gobject.idle_add(loader.next) + GLib.idle_add(next, loader) def _agent_info(self, jid, node, identities, features, data): """ @@ -1224,7 +1237,7 @@ class ToplevelAgentBrowser(AgentBrowser): # Grab info on the service self.cache.get_info(self.jid, self.node, self._agent_info, force=False) - def _pixbuf_renderer_data_func(self, col, cell, model, iter_): + def _pixbuf_renderer_data_func(self, col, cell, model, iter_, data=None): """ Callback for setting the pixbuf renderer's properties """ @@ -1236,7 +1249,7 @@ class ToplevelAgentBrowser(AgentBrowser): else: cell.set_property('visible', False) - def _text_renderer_data_func(self, col, cell, model, iter_): + def _text_renderer_data_func(self, col, cell, model, iter_, data=None): """ Callback for setting the text renderer's properties """ @@ -1259,35 +1272,39 @@ class ToplevelAgentBrowser(AgentBrowser): cell.set_property('cell_background_set', True) cell.set_property('foreground_set', False) - def _treemodel_sort_func(self, model, iter1, iter2): + def _treemodel_sort_func(self, model, iter1, iter2, data=None): """ Sort function for our treemode """ # Compare state - statecmp = cmp(model.get_value(iter1, 4), model.get_value(iter2, 4)) - if statecmp == 0: - # These can be None, apparently - descr1 = model.get_value(iter1, 3) - if descr1: - descr1 = descr1.decode('utf-8') - descr2 = model.get_value(iter2, 3) - if descr2: - descr2 = descr2.decode('utf-8') - # Compare strings - return cmp(descr1, descr2) - return statecmp + state1 = model.get_value(iter1, 4) + state2 = model.get_value(iter2, 4) + if state1 > state2: + return 1 + if state1 < state2: + return -1 + descr1 = model.get_value(iter1, 3) + descr2 = model.get_value(iter2, 3) + # Compare strings + if descr1 > descr2: + return 1 + if descr1 < descr2: + return -1 + return 0 def _show_tooltip(self, state): view = self.window.services_treeview - pointer = view.get_pointer() - props = view.get_path_at_pos(pointer[0], pointer[1]) + w = view.get_window() + device = w.get_display().get_device_manager().get_client_pointer() + pointer = w.get_device_position(device) + props = view.get_path_at_pos(pointer[1], pointer[2]) # check if the current pointer is at the same path # as it was before setting the timeout if props and self.tooltip.id == props[0]: # bounding rectangle of coordinates for the cell within the treeview rect = view.get_cell_area(props[0], props[1]) # position of the treeview on the screen - position = view.window.get_origin() + position = w.get_origin()[1:] self.tooltip.show_tooltip(state, rect.height, position[1] + rect.y) else: self.tooltip.hide_tooltip() @@ -1318,8 +1335,8 @@ class ToplevelAgentBrowser(AgentBrowser): if jid and state > 0 and \ (self.tooltip.timeout == 0 or self.tooltip.id != props[0]): self.tooltip.id = row - self.tooltip.timeout = gobject.timeout_add(500, - self._show_tooltip, state) + self.tooltip.timeout = GLib.timeout_add(500, self._show_tooltip, + state) def on_treeview_event_hide_tooltip(self, widget, event): """ @@ -1331,20 +1348,20 @@ class ToplevelAgentBrowser(AgentBrowser): # JID, node, icon, description, state # State means 2 when error, 1 when fetching, 0 when succes. view = self.window.services_treeview - self.model = gtk.TreeStore(str, str, gtk.gdk.Pixbuf, str, int) + self.model = Gtk.TreeStore(str, str, GdkPixbuf.Pixbuf, str, int) self.model.set_sort_func(4, self._treemodel_sort_func) - self.model.set_sort_column_id(4, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(4, Gtk.SortType.ASCENDING) view.set_model(self.model) - col = gtk.TreeViewColumn() + col = Gtk.TreeViewColumn() # Icon Renderer - renderer = gtk.CellRendererPixbuf() + renderer = Gtk.CellRendererPixbuf() renderer.set_property('xpad', 6) - col.pack_start(renderer, expand=False) + col.pack_start(renderer, False) col.set_cell_data_func(renderer, self._pixbuf_renderer_data_func) # Text Renderer - renderer = gtk.CellRendererText() - col.pack_start(renderer, expand=True) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True) col.set_cell_data_func(renderer, self._text_renderer_data_func) renderer.set_property('foreground', 'dark gray') # Save this so we can go along with theme changes @@ -1381,46 +1398,37 @@ class ToplevelAgentBrowser(AgentBrowser): def _add_actions(self): AgentBrowser._add_actions(self) - self.execute_button = gtk.Button() - image = gtk.image_new_from_stock(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_BUTTON) - label = gtk.Label(_('_Execute Command')) - label.set_use_underline(True) - hbox = gtk.HBox() - hbox.pack_start(image, False, True, 6) - hbox.pack_end(label, True, True) - self.execute_button.add(hbox) + self.execute_button = Gtk.Button() self.execute_button.connect('clicked', self.on_execute_button_clicked) self.window.action_buttonbox.add(self.execute_button) + image = Gtk.Image.new_from_stock(Gtk.STOCK_EXECUTE, Gtk.IconSize.BUTTON) + self.execute_button.set_image(image) + label = _('_Execute Command') + self.execute_button.set_label(label) self.execute_button.show_all() - self.register_button = gtk.Button(label=_("Re_gister"), + self.register_button = Gtk.Button(label=_("Re_gister"), use_underline=True) self.register_button.connect('clicked', self.on_register_button_clicked) self.window.action_buttonbox.add(self.register_button) self.register_button.show_all() - self.join_button = gtk.Button() - image = gtk.image_new_from_stock(gtk.STOCK_CONNECT, gtk.ICON_SIZE_BUTTON) - label = gtk.Label(_('_Join')) - label.set_use_underline(True) - hbox = gtk.HBox() - hbox.pack_start(image, False, True, 6) - hbox.pack_end(label, True, True) - self.join_button.add(hbox) + self.join_button = Gtk.Button() self.join_button.connect('clicked', self.on_join_button_clicked) self.window.action_buttonbox.add(self.join_button) + image = Gtk.Image.new_from_stock(Gtk.STOCK_CONNECT, Gtk.IconSize.BUTTON) + self.join_button.set_image(image) + label = _('_Join') + self.join_button.set_label(label) self.join_button.show_all() - self.search_button = gtk.Button() - image = gtk.image_new_from_stock(gtk.STOCK_FIND, gtk.ICON_SIZE_BUTTON) - label = gtk.Label(_('_Search')) - label.set_use_underline(True) - hbox = gtk.HBox() - hbox.pack_start(image, False, True, 6) - hbox.pack_end(label, True, True) - self.search_button.add(hbox) + self.search_button = Gtk.Button() self.search_button.connect('clicked', self.on_search_button_clicked) self.window.action_buttonbox.add(self.search_button) + image = Gtk.Image.new_from_stock(Gtk.STOCK_FIND, Gtk.IconSize.BUTTON) + self.search_button.set_image(image) + label = _('_Search') + self.search_button.set_label(label) self.search_button.show_all() def _clean_actions(self): @@ -1445,7 +1453,7 @@ class ToplevelAgentBrowser(AgentBrowser): model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - service = model[iter_][0].decode('utf-8') + service = model[iter_][0] if service in gajim.interface.instances[self.account]['search']: gajim.interface.instances[self.account]['search'][service].window.\ present() @@ -1471,8 +1479,8 @@ class ToplevelAgentBrowser(AgentBrowser): model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - service = model[iter_][0].decode('utf-8') - node = model[iter_][1].decode('utf-8') + service = model[iter_][0] + node = model[iter_][1] adhoc_commands.CommandWindow(self.account, service, commandnode=node) def on_register_button_clicked(self, widget = None): @@ -1483,7 +1491,7 @@ class ToplevelAgentBrowser(AgentBrowser): model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - jid = model[iter_][0].decode('utf-8') + jid = model[iter_][0] if jid: gajim.connections[self.account].request_register_agent_info(jid) self.window.destroy(chain = True) @@ -1496,7 +1504,7 @@ class ToplevelAgentBrowser(AgentBrowser): model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - service = model[iter_][0].decode('utf-8') + service = model[iter_][0] if 'join_gc' not in gajim.interface.instances[self.account]: try: dialogs.JoinGroupchatWindow(self.account, service) @@ -1529,7 +1537,7 @@ class ToplevelAgentBrowser(AgentBrowser): self.register_button.set_sensitive(True) # Guess what kind of service we're dealing with if self.browse_button: - jid = model[iter_][0].decode('utf-8') + jid = model[iter_][0] type_ = gajim.get_transport_name_from_jid(jid, use_config_setting = False) if type_: @@ -1593,7 +1601,7 @@ class ToplevelAgentBrowser(AgentBrowser): # self.expanding = False # return False #self.expanding = True - #gobject.idle_add(expand_all) + #GLib.idle_add(expand_all) self.window.services_treeview.expand_all() def _update_progressbar(self): @@ -1602,7 +1610,7 @@ class ToplevelAgentBrowser(AgentBrowser): """ # Refresh this every update if self._progressbar_sourceid: - gobject.source_remove(self._progressbar_sourceid) + GLib.source_remove(self._progressbar_sourceid) fraction = 0 if self._total_items: @@ -1611,12 +1619,12 @@ class ToplevelAgentBrowser(AgentBrowser): fraction = float(self._progress) / float(self._total_items) if self._progress >= self._total_items: # We show the progressbar for just a bit before hiding it. - id_ = gobject.timeout_add_seconds(2, self._hide_progressbar_cb) + id_ = GLib.timeout_add_seconds(2, self._hide_progressbar_cb) self._progressbar_sourceid = id_ else: self.window.progressbar.show() # Hide the progressbar if we're timing out anyways. (20 secs) - id_ = gobject.timeout_add_seconds(20, self._hide_progressbar_cb) + id_ = GLib.timeout_add_seconds(20, self._hide_progressbar_cb) self._progressbar_sourceid = id_ self.window.progressbar.set_fraction(fraction) @@ -1658,9 +1666,9 @@ class ToplevelAgentBrowser(AgentBrowser): Looks up a category row and returns the iterator to it, or None """ cat = self._friendly_category(cat, type_)[0] - iter_ = self.model.get_iter_root() + iter_ = self.model.get_iter_first() while iter_: - if self.model.get_value(iter_, 3).decode('utf-8') == cat: + if self.model.get_value(iter_, 3) == cat: break iter_ = self.model.iter_next(iter_) if iter_: @@ -1669,17 +1677,17 @@ class ToplevelAgentBrowser(AgentBrowser): def _find_item(self, jid, node): iter_ = None - cat_iter = self.model.get_iter_root() + cat_iter = self.model.get_iter_first() while cat_iter and not iter_: - cjid = self.model.get_value(cat_iter, 0).decode('utf-8') - cnode = self.model.get_value(cat_iter, 1).decode('utf-8') + cjid = self.model.get_value(cat_iter, 0) + cnode = self.model.get_value(cat_iter, 1) if jid == cjid and node == cnode: iter_ = cat_iter break iter_ = self.model.iter_children(cat_iter) while iter_: - cjid = self.model.get_value(iter_, 0).decode('utf-8') - cnode = self.model.get_value(iter_, 1).decode('utf-8') + cjid = self.model.get_value(iter_, 0) + cnode = self.model.get_value(iter_, 1) if jid == cjid and node == cnode: break iter_ = self.model.iter_next(iter_) @@ -1713,7 +1721,7 @@ class ToplevelAgentBrowser(AgentBrowser): if not cat: cat = self._create_category(*cat_args) self.model.append(cat, (jid, node, pix, descr, 1)) - gobject.idle_add(self._expand_all) + GLib.idle_add(self._expand_all) # Grab info on the service self.cache.get_info(jid, node, self._agent_info, force=force) self._update_progressbar() @@ -1759,7 +1767,7 @@ class ToplevelAgentBrowser(AgentBrowser): # Not in the right category, move it. self.model.remove(iter_) - old_cat = self.model.get_value(old_cat_iter, 3).decode('utf-8') + old_cat = self.model.get_value(old_cat_iter, 3) # Check if the old category is empty if not self.model.iter_is_valid(old_cat_iter): old_cat_iter = self._find_category(old_cat) @@ -1788,40 +1796,40 @@ class MucBrowser(AgentBrowser): # JID, node, name, users_int, users_str, description, fetched # This is rather long, I'd rather not use a data_func here though. # Users is a string, because want to be able to leave it empty. - self.model = gtk.ListStore(str, str, str, int, str, str, bool) - self.model.set_sort_column_id(2, gtk.SORT_ASCENDING) + self.model = Gtk.ListStore(str, str, str, int, str, str, bool) + self.model.set_sort_column_id(2, Gtk.SortType.ASCENDING) self.window.services_treeview.set_model(self.model) # Name column - col = gtk.TreeViewColumn(_('Name')) - col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) + col = Gtk.TreeViewColumn(_('Name')) + col.set_sizing(Gtk.TreeViewColumnSizing.FIXED) col.set_fixed_width(100) - renderer = gtk.CellRendererText() - col.pack_start(renderer) - col.set_attributes(renderer, text = 2) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', 2) col.set_sort_column_id(2) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) # Users column - col = gtk.TreeViewColumn(_('Users')) - renderer = gtk.CellRendererText() - col.pack_start(renderer) - col.set_attributes(renderer, text = 4) + col = Gtk.TreeViewColumn(_('Users')) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', 4) col.set_sort_column_id(3) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) # Description column - col = gtk.TreeViewColumn(_('Description')) - renderer = gtk.CellRendererText() - col.pack_start(renderer) - col.set_attributes(renderer, text = 5) + col = Gtk.TreeViewColumn(_('Description')) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', 5) col.set_sort_column_id(4) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) # Id column - col = gtk.TreeViewColumn(_('Id')) - renderer = gtk.CellRendererText() - col.pack_start(renderer) - col.set_attributes(renderer, text = 0) + col = Gtk.TreeViewColumn(_('Id')) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', 0) col.set_sort_column_id(0) self.window.services_treeview.insert_column(col, -1) col.set_resizable(True) @@ -1848,11 +1856,11 @@ class MucBrowser(AgentBrowser): AgentBrowser._clean_treemodel(self) def _add_actions(self): - self.bookmark_button = gtk.Button(label=_('_Bookmark'), use_underline=True) + self.bookmark_button = Gtk.Button(label=_('_Bookmark'), use_underline=True) self.bookmark_button.connect('clicked', self.on_bookmark_button_clicked) self.window.action_buttonbox.add(self.bookmark_button) self.bookmark_button.show_all() - self.join_button = gtk.Button(label=_('_Join'), use_underline=True) + self.join_button = Gtk.Button(label=_('_Join'), use_underline=True) self.join_button.connect('clicked', self.on_join_button_clicked) self.window.action_buttonbox.add(self.join_button) self.join_button.show_all() @@ -1870,7 +1878,7 @@ class MucBrowser(AgentBrowser): if not iter: return name = gajim.config.get_per('accounts', self.account, 'name') - room_jid = model[iter][0].decode('utf-8') + room_jid = model[iter][0] bm = { 'name': room_jid.split('@')[0], 'jid': room_jid, @@ -1883,7 +1891,8 @@ class MucBrowser(AgentBrowser): for bookmark in gajim.connections[self.account].bookmarks: if bookmark['jid'] == bm['jid']: dialogs.ErrorDialog( _('Bookmark already set'), - _('Group Chat "%s" is already in your bookmarks.') % bm['jid']) + _('Group Chat "%s" is already in your bookmarks.') % bm['jid'], + transient_for=self.window.window) return gajim.connections[self.account].bookmarks.append(bm) @@ -1893,7 +1902,8 @@ class MucBrowser(AgentBrowser): dialogs.InformationDialog( _('Bookmark has been added successfully'), - _('You can manage your bookmarks via Actions menu in your roster.')) + _('You can manage your bookmarks via Actions menu in your roster.'), + transient_for=self.window.window) def on_join_button_clicked(self, *args): """ @@ -1903,7 +1913,7 @@ class MucBrowser(AgentBrowser): model, iter_ = self.window.services_treeview.get_selection().get_selected() if not iter_: return - service = model[iter_][0].decode('utf-8') + service = model[iter_][0] if 'join_gc' not in gajim.interface.instances[self.account]: try: dialogs.JoinGroupchatWindow(self.account, service) @@ -1947,40 +1957,24 @@ class MucBrowser(AgentBrowser): # We're already fetching return view = self.window.services_treeview - if not view.flags() & gtk.REALIZED: + if not view.get_realized(): # Prevent a silly warning, try again in a bit. - self._fetch_source = gobject.timeout_add(100, self._start_info_query) + self._fetch_source = GLib.timeout_add(100, self._start_info_query) return - # We have to do this in a pygtk <2.8 compatible way :/ - #start, end = self.window.services_treeview.get_visible_range() - rect = view.get_visible_rect() - iter_ = end = None - # Top row - try: - sx, sy = view.tree_to_widget_coords(rect.x, rect.y) - spath = view.get_path_at_pos(sx, sy)[0] - iter_ = self.model.get_iter(spath) - except TypeError: - self._fetch_source = None + range_ = view.get_visible_range() + if not range_: return - # Bottom row - # Iter compare is broke, use the path instead - try: - ex, ey = view.tree_to_widget_coords(rect.x + rect.height, - rect.y + rect.height) - end = view.get_path_at_pos(ex, ey)[0] - # end is the last visible, we want to query that aswell - end = (end[0] + 1,) - except TypeError: - # We're at the end of the model, we can leave end=None though. - pass - while iter_ and self.model.get_path(iter_) != end: + start, end = range_ + iter_ = self.model.get_iter(start) + while iter_: if not self.model.get_value(iter_, 6): - jid = self.model.get_value(iter_, 0).decode('utf-8') - node = self.model.get_value(iter_, 1).decode('utf-8') + jid = self.model.get_value(iter_, 0) + node = self.model.get_value(iter_, 1) self.cache.get_info(jid, node, self._agent_info) self._fetch_source = True return + if self.model.get_path(iter_) == end: + break iter_ = self.model.iter_next(iter_) self._fetch_source = None @@ -2016,7 +2010,7 @@ class MucBrowser(AgentBrowser): def _add_item(self, jid, node, parent_node, item, force): self.model.append((jid, node, item.get('name', ''), -1, '', '', False)) if not self._fetch_source: - self._fetch_source = gobject.idle_add(self._start_info_query) + self._fetch_source = GLib.idle_add(self._start_info_query) def _update_info(self, iter_, jid, node, identities, features, data): name = identities[0].get('name', '') @@ -2030,7 +2024,7 @@ class MucBrowser(AgentBrowser): if users: self.model[iter_][3] = int(users.getValue()) self.model[iter_][4] = users.getValue() - if descr: + if descr and descr.getValue(): self.model[iter_][5] = descr.getValue() # Only set these when we find a form with additional info # Some servers don't support forms and put extra info in @@ -2085,35 +2079,36 @@ class DiscussionGroupsBrowser(AgentBrowser): Create treemodel for the window """ # JID, node, name (with description) - pango markup, dont have info?, subscribed? - self.model = gtk.TreeStore(str, str, str, bool, bool) + self.model = Gtk.TreeStore(str, str, str, bool, bool) # sort by name - self.model.set_sort_column_id(2, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(2, Gtk.SortType.ASCENDING) self.window.services_treeview.set_model(self.model) # Name column # Pango markup for name and description, description printed with # <small/> font - renderer = gtk.CellRendererText() - col = gtk.TreeViewColumn(_('Name')) - col.pack_start(renderer) - col.set_attributes(renderer, markup=2) + renderer = Gtk.CellRendererText() + col = Gtk.TreeViewColumn(_('Name')) + col.pack_start(renderer, True) + col.add_attribute(renderer, 'markup', 2) col.set_resizable(True) self.window.services_treeview.insert_column(col, -1) self.window.services_treeview.set_headers_visible(True) # Subscription state - renderer = gtk.CellRendererToggle() - col = gtk.TreeViewColumn(_('Subscribed')) - col.pack_start(renderer) - col.set_attributes(renderer, inconsistent=3, active=4) + renderer = Gtk.CellRendererToggle() + col = Gtk.TreeViewColumn(_('Subscribed')) + col.pack_start(renderer, True) + col.add_attribute(renderer, 'inconsistent', 3) + col.add_attribute(renderer, 'active', 4) col.set_resizable(False) self.window.services_treeview.insert_column(col, -1) # Node Column - renderer = gtk.CellRendererText() - col = gtk.TreeViewColumn(_('Node')) - col.pack_start(renderer) - col.set_attributes(renderer, markup=1) + renderer = Gtk.CellRendererText() + col = Gtk.TreeViewColumn(_('Node')) + col.pack_start(renderer, True) + col.add_attribute(renderer, 'markup', 1) col.set_resizable(True) self.window.services_treeview.insert_column(col, -1) @@ -2147,7 +2142,7 @@ class DiscussionGroupsBrowser(AgentBrowser): dunno = True subscribed = False - name = gobject.markup_escape_text(name) + name = GLib.markup_escape_text(name) name = '<b>%s</b>' % name if parent_node: @@ -2178,19 +2173,19 @@ class DiscussionGroupsBrowser(AgentBrowser): return self.found_iter def _add_actions(self): - self.post_button = gtk.Button(label=_('New post'), use_underline=True) + self.post_button = Gtk.Button(label=_('New post'), use_underline=True) self.post_button.set_sensitive(False) self.post_button.connect('clicked', self.on_post_button_clicked) self.window.action_buttonbox.add(self.post_button) self.post_button.show_all() - self.subscribe_button = gtk.Button(label=_('_Subscribe'), use_underline=True) + self.subscribe_button = Gtk.Button(label=_('_Subscribe'), use_underline=True) self.subscribe_button.set_sensitive(False) self.subscribe_button.connect('clicked', self.on_subscribe_button_clicked) self.window.action_buttonbox.add(self.subscribe_button) self.subscribe_button.show_all() - self.unsubscribe_button = gtk.Button(label=_('_Unsubscribe'), use_underline=True) + self.unsubscribe_button = Gtk.Button(label=_('_Unsubscribe'), use_underline=True) self.unsubscribe_button.set_sensitive(False) self.unsubscribe_button.connect('clicked', self.on_unsubscribe_button_clicked) self.window.action_buttonbox.add(self.unsubscribe_button) diff --git a/src/features_window.py b/src/features_window.py index 8e63c594da7aa1dcbcffe4441c98d3e8378f6faf..80f6f976451810b3122359804244d3a7995a4342 100644 --- a/src/features_window.py +++ b/src/features_window.py @@ -25,7 +25,7 @@ import os import sys -import gtk +from gi.repository import Gtk import gtkgui_helpers from common import gajim @@ -67,10 +67,6 @@ class FeaturesWindow: _('Autodetection of network status.'), _('Requires gnome-network-manager and python-dbus.'), _('Feature not available under Windows.')), - _('Session Management'): (self.session_management_available, - _('Gajim session is stored on logout and restored on login.'), - _('Requires python-gnome2.'), - _('Feature not available under Windows.')), _('Password encryption'): (self.some_keyring_available, _('Passwords can be stored securely and not just in plaintext.'), _('Requires gnome-keyring and python-gnome2-desktop, or kwalletcli.'), @@ -114,20 +110,20 @@ class FeaturesWindow: } # name, supported - self.model = gtk.ListStore(str, bool) + self.model = Gtk.ListStore(str, bool) treeview.set_model(self.model) - col = gtk.TreeViewColumn(Q_('?features:Available')) + col = Gtk.TreeViewColumn(Q_('?features:Available')) treeview.append_column(col) - cell = gtk.CellRendererToggle() + cell = Gtk.CellRendererToggle() cell.set_property('radio', True) - col.pack_start(cell) - col.set_attributes(cell, active = 1) + col.pack_start(cell, True) + col.add_attribute(cell, 'active', 1) - col = gtk.TreeViewColumn(_('Feature')) + col = Gtk.TreeViewColumn(_('Feature')) treeview.append_column(col) - cell = gtk.CellRendererText() - col.pack_start(cell, expand = True) + cell = Gtk.CellRendererText() + col.pack_start(cell, True) col.add_attribute(cell, 'text', 0) # Fill model @@ -136,7 +132,7 @@ class FeaturesWindow: rep = func() self.model.append([feature, rep]) - self.model.set_sort_column_id(0, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(0, Gtk.SortType.ASCENDING) self.xml.connect_signals(self) self.window.show_all() @@ -153,7 +149,7 @@ class FeaturesWindow: if not rows: return path = rows[0] - feature = self.model[path][0].decode('utf-8') + feature = self.model[path][0] text = self.features[feature][1] + '\n' if os.name == 'nt': text = text + self.features[feature][3] @@ -192,22 +188,13 @@ class FeaturesWindow: import network_manager_listener return network_manager_listener.supported - def session_management_available(self): - if os.name == 'nt': - return False - try: - __import__('gnome.ui') - except Exception: - return False - return True - def some_keyring_available(self): if os.name == 'nt': return False if kwalletbinding.kwallet_available(): return True try: - __import__('gnomekeyring') + from gi.repository import GnomeKeyring except Exception: return False return True diff --git a/src/filetransfers_window.py b/src/filetransfers_window.py index f0aa1fc56f660837106c3a962fdbca5685a80caf..8fd76577345ac7862a6f3c54045a532fc5530060 100644 --- a/src/filetransfers_window.py +++ b/src/filetransfers_window.py @@ -21,9 +21,10 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## -import gtk -import gobject -import pango +from gi.repository import Gtk +from gi.repository import GdkPixbuf +from gi.repository import GLib +from gi.repository import Pango import os import time @@ -66,52 +67,52 @@ class FileTransfersWindow: shall_notify = gajim.config.get('notify_on_file_complete') self.notify_ft_checkbox.set_active(shall_notify ) - self.model = gtk.ListStore(gtk.gdk.Pixbuf, str, str, str, str, int, + self.model = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str, str, str, int, int, str) self.tree.set_model(self.model) - col = gtk.TreeViewColumn() + col = Gtk.TreeViewColumn() - render_pixbuf = gtk.CellRendererPixbuf() + render_pixbuf = Gtk.CellRendererPixbuf() - col.pack_start(render_pixbuf, expand=True) + col.pack_start(render_pixbuf, True) render_pixbuf.set_property('xpad', 3) render_pixbuf.set_property('ypad', 3) render_pixbuf.set_property('yalign', .0) col.add_attribute(render_pixbuf, 'pixbuf', 0) self.tree.append_column(col) - col = gtk.TreeViewColumn(_('File')) - renderer = gtk.CellRendererText() - col.pack_start(renderer, expand=False) + col = Gtk.TreeViewColumn(_('File')) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, False) col.add_attribute(renderer, 'markup', C_LABELS) renderer.set_property('yalign', 0.) - renderer = gtk.CellRendererText() - col.pack_start(renderer, expand=True) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True) col.add_attribute(renderer, 'markup', C_FILE) renderer.set_property('xalign', 0.) renderer.set_property('yalign', 0.) - renderer.set_property('ellipsize', pango.ELLIPSIZE_END) + renderer.set_property('ellipsize', Pango.EllipsizeMode.END) col.set_resizable(True) col.set_expand(True) self.tree.append_column(col) - col = gtk.TreeViewColumn(_('Time')) - renderer = gtk.CellRendererText() - col.pack_start(renderer, expand=False) + col = Gtk.TreeViewColumn(_('Time')) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, False) col.add_attribute(renderer, 'markup', C_TIME) renderer.set_property('yalign', 0.5) renderer.set_property('xalign', 0.5) - renderer = gtk.CellRendererText() - renderer.set_property('ellipsize', pango.ELLIPSIZE_END) + renderer = Gtk.CellRendererText() + renderer.set_property('ellipsize', Pango.EllipsizeMode.END) col.set_resizable(True) col.set_expand(False) self.tree.append_column(col) - col = gtk.TreeViewColumn(_('Progress')) - renderer = gtk.CellRendererProgress() + col = Gtk.TreeViewColumn(_('Progress')) + renderer = Gtk.CellRendererProgress() renderer.set_property('yalign', 0.5) renderer.set_property('xalign', 0.5) - col.pack_start(renderer, expand=False) + col.pack_start(renderer, False) col.add_attribute(renderer, 'text', C_PROGRESS) col.add_attribute(renderer, 'value', C_PERCENT) col.add_attribute(renderer, 'pulse', C_PULSE) @@ -121,18 +122,18 @@ class FileTransfersWindow: self.images = {} self.icons = { - 'upload': gtk.STOCK_GO_UP, - 'download': gtk.STOCK_GO_DOWN, - 'stop': gtk.STOCK_STOP, - 'waiting': gtk.STOCK_REFRESH, - 'pause': gtk.STOCK_MEDIA_PAUSE, - 'continue': gtk.STOCK_MEDIA_PLAY, - 'ok': gtk.STOCK_APPLY, - 'computing': gtk.STOCK_EXECUTE, - 'hash_error': gtk.STOCK_STOP, + 'upload': Gtk.STOCK_GO_UP, + 'download': Gtk.STOCK_GO_DOWN, + 'stop': Gtk.STOCK_STOP, + 'waiting': Gtk.STOCK_REFRESH, + 'pause': Gtk.STOCK_MEDIA_PAUSE, + 'continue': Gtk.STOCK_MEDIA_PLAY, + 'ok': Gtk.STOCK_APPLY, + 'computing': Gtk.STOCK_EXECUTE, + 'hash_error': Gtk.STOCK_STOP, } - self.tree.get_selection().set_mode(gtk.SELECTION_SINGLE) + self.tree.get_selection().set_mode(Gtk.SelectionMode.SINGLE) self.tree.get_selection().connect('changed', self.selection_changed) self.tooltip = tooltips.FileTransfersTooltip() self.file_transfers_menu = self.xml.get_object('file_transfers_menu') @@ -152,12 +153,12 @@ class FileTransfersWindow: for file_props in allfp: if file_props.type_ == 's' and file_props.tt_account == account: # 'account' is the sender - receiver_jid = unicode(file_props.receiver).split('/')[0] + receiver_jid = file_props.receiver.split('/')[0] if jid == receiver_jid and not is_transfer_stopped(file_props): active_transfers[0].append(file_props) elif file_props.type_ == 'r' and file_props.tt_account == account: # 'account' is the recipient - sender_jid = unicode(file_props.sender).split('/')[0] + sender_jid = file_props.sender.split('/')[0] if jid == sender_jid and not is_transfer_stopped(file_props): active_transfers[1].append(file_props) else: @@ -182,12 +183,11 @@ class FileTransfersWindow: (file_path, file_name) = os.path.split(file_props.file_name) else: file_name = file_props.name - sectext = '\t' + _('Filename: %s') % gobject.markup_escape_text( - file_name) + sectext = '\t' + _('Filename: %s') % GLib.markup_escape_text(file_name) sectext += '\n\t' + _('Size: %s') % \ helpers.convert_bytes(file_props.size) if file_props.type_ == 'r': - jid = unicode(file_props.sender).split('/')[0] + jid = file_props.sender.split('/')[0] sender_name = gajim.contacts.get_first_contact_from_jid( file_props.tt_account, jid).get_shown_name() sender = sender_name @@ -197,7 +197,7 @@ class FileTransfersWindow: sectext += '\n\t' + _('Sender: %s') % sender sectext += '\n\t' + _('Recipient: ') if file_props.type_ == 's': - jid = unicode(file_props.receiver).split('/')[0] + jid = file_props.receiver.split('/')[0] receiver_name = gajim.contacts.get_first_contact_from_jid( file_props.tt_account, jid).get_shown_name() recipient = receiver_name @@ -207,13 +207,13 @@ class FileTransfersWindow: sectext += recipient if file_props.type_ == 'r': sectext += '\n\t' + _('Saved in: %s') % file_path - dialog = dialogs.HigDialog(None, gtk.MESSAGE_INFO, gtk.BUTTONS_NONE, + dialog = dialogs.HigDialog(None, Gtk.MessageType.INFO, Gtk.ButtonsType.NONE, _('File transfer completed'), sectext) if file_props.type_ == 'r': - button = gtk.Button(_('_Open Containing Folder')) + button = Gtk.Button(_('_Open Containing Folder')) button.connect('clicked', on_open, file_props) - dialog.action_area.pack_start(button) - ok_button = dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) + dialog.action_area.pack_start(button, True, True, 0) + ok_button = dialog.add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK) def on_ok(widget): dialog.destroy() ok_button.connect('clicked', on_ok) @@ -239,8 +239,7 @@ class FileTransfersWindow: file_name = os.path.basename(file_props.file_name) else: file_name = file_props.name - sectext = '\t' + _('Filename: %s') % gobject.markup_escape_text( - file_name) + sectext = '\t' + _('Filename: %s') % GLib.markup_escape_text(file_name) sectext += '\n\t' + _('Recipient: %s') % jid if error_msg: sectext += '\n\t' + _('Error message: %s') % error_msg @@ -283,12 +282,12 @@ class FileTransfersWindow: _('The file %(file)s has been fully received, but it seems to be ' 'wrongly received.\nDo you want to reload it?') % \ {'file': file_name}, on_response_yes=(on_yes, jid, file_props, - account), type_=gtk.MESSAGE_ERROR) + account), type_=Gtk.MessageType.ERROR) def show_file_send_request(self, account, contact): - win = gtk.ScrolledWindow() - win.set_shadow_type(gtk.SHADOW_IN) - win.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER) + win = Gtk.ScrolledWindow() + win.set_shadow_type(Gtk.ShadowType.IN) + win.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER) from message_textview import MessageTextView desc_entry = MessageTextView() @@ -301,7 +300,7 @@ class FileTransfersWindow: files_path_list) text_buffer = desc_entry.get_buffer() desc = text_buffer.get_text(text_buffer.get_start_iter(), - text_buffer.get_end_iter()) + text_buffer.get_end_iter(), True) for file_path in files_path_list: if self.send_file(account, contact, file_path, desc) \ and file_dir is None: @@ -311,22 +310,22 @@ class FileTransfersWindow: dialog.destroy() dialog = dialogs.FileChooserDialog(_('Choose File to Send...'), - gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL), - gtk.RESPONSE_OK, + Gtk.FileChooserAction.OPEN, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL), + Gtk.ResponseType.OK, True, # select multiple true as we can select many files to send gajim.config.get('last_send_dir'), on_response_ok=on_ok, on_response_cancel=lambda e:dialog.destroy() ) - btn = gtk.Button(_('_Send')) + btn = Gtk.Button.new_with_mnemonic(_('_Send')) btn.set_property('can-default', True) # FIXME: add send icon to this button (JUMP_TO) - dialog.add_action_widget(btn, gtk.RESPONSE_OK) - dialog.set_default_response(gtk.RESPONSE_OK) + dialog.add_action_widget(btn, Gtk.ResponseType.OK) + dialog.set_default_response(Gtk.ResponseType.OK) - desc_hbox = gtk.HBox(False, 5) - desc_hbox.pack_start(gtk.Label(_('Description: ')), False, False, 0) + desc_hbox = Gtk.HBox(False, 5) + desc_hbox.pack_start(Gtk.Label(_('Description: ')), False, False, 0) desc_hbox.pack_start(win, True, True, 0) dialog.vbox.pack_start(desc_hbox, False, False, 0) @@ -383,7 +382,7 @@ class FileTransfersWindow: if os.path.exists(file_path): # check if we have write permissions if not os.access(file_path, os.W_OK): - file_name = gobject.markup_escape_text(os.path.basename( + file_name = GLib.markup_escape_text(os.path.basename( file_path)) dialogs.ErrorDialog( _('Cannot overwrite existing file "%s"' % file_name), @@ -405,8 +404,8 @@ class FileTransfersWindow: dialog = dialogs.FTOverwriteConfirmationDialog( _('This file already exists'), _('What do you want to do?'), - propose_resume=not dl_finished, on_response=on_response) - dialog.set_transient_for(dialog2) + propose_resume=not dl_finished, on_response=on_response, + transient_for=dialog2) dialog.set_destroy_with_parent(True) return else: @@ -428,10 +427,10 @@ class FileTransfersWindow: dialog2 = dialogs.FileChooserDialog( title_text=_('Save File as...'), - action=gtk.FILE_CHOOSER_ACTION_SAVE, - buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_SAVE, gtk.RESPONSE_OK), - default_response=gtk.RESPONSE_OK, + action=Gtk.FileChooserAction.SAVE, + buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_SAVE, Gtk.ResponseType.OK), + default_response=Gtk.ResponseType.OK, current_folder=gajim.config.get('last_save_dir'), on_response_ok=(on_ok, account, contact, file_props), on_response_cancel=(on_cancel, account, contact, file_props)) @@ -447,8 +446,8 @@ class FileTransfersWindow: """ if not file_props or not file_props.name: return - sec_text = '\t' + _('File: %s') % gobject.markup_escape_text( - file_props.name) + sec_text = '\t' + _('File: %s') % GLib.markup_escape_text( + file_props.name) if file_props.size: sec_text += '\n\t' + _('Size: %s') % \ helpers.convert_bytes(file_props.size) @@ -474,7 +473,8 @@ class FileTransfersWindow: def get_icon(self, ident): return self.images.setdefault(ident, - self.window.render_icon(self.icons[ident], gtk.ICON_SIZE_MENU)) + self.window.render_icon_pixbuf(self.icons[ident], + Gtk.IconSize.MENU)) def set_status(self,file_props, status): """ @@ -483,41 +483,41 @@ class FileTransfersWindow: iter_ = self.get_iter_by_sid(file_props.type_, file_props.sid) if iter_ is None: return - self.model[iter_][C_SID].decode('utf-8') + self.model[iter_][C_SID] if status == 'stop': file_props.stopped = True elif status == 'ok': file_props.completed = True text = self._format_percent(100) received_size = int(file_props.received_len) - full_size = int(file_props.size) + full_size = file_props.size text += helpers.convert_bytes(received_size) + '/' + \ helpers.convert_bytes(full_size) self.model.set(iter_, C_PROGRESS, text) - self.model.set(iter_, C_PULSE, gobject.constants.G_MAXINT) + self.model.set(iter_, C_PULSE, GLib.MAXINT32) elif status == 'computing': self.model.set(iter_, C_PULSE, 1) text = _('Checking file...') + '\n' received_size = int(file_props.received_len) - full_size = int(file_props.size) + full_size = file_props.size text += helpers.convert_bytes(received_size) + '/' + \ helpers.convert_bytes(full_size) self.model.set(iter_, C_PROGRESS, text) def pulse(): p = self.model.get(iter_, C_PULSE)[0] - if p == gobject.constants.G_MAXINT: + if p == GLib.MAXINT32: return False self.model.set(iter_, C_PULSE, p + 1) return True - gobject.timeout_add(100, pulse) + GLib.timeout_add(100, pulse) elif status == 'hash_error': text = _('File error') + '\n' received_size = int(file_props.received_len) - full_size = int(file_props.size) + full_size = file_props.size text += helpers.convert_bytes(received_size) + '/' + \ helpers.convert_bytes(full_size) self.model.set(iter_, C_PROGRESS, text) - self.model.set(iter_, C_PULSE, gobject.constants.G_MAXINT) + self.model.set(iter_, C_PULSE, GLib.MAXINT32) self.model.set(iter_, C_IMAGE, self.get_icon(status)) path = self.model.get_path(iter_) self.select_func(path) @@ -532,7 +532,7 @@ class FileTransfersWindow: _str += ' ' if percent < 10: _str += ' ' - _str += unicode(percent) + '% \n' + _str += str(percent) + '% \n' return _str def _format_time(self, _time): @@ -584,7 +584,7 @@ class FileTransfersWindow: other = file_props.sender else: # we send a file other = file_props.receiver - if isinstance(other, unicode): + if isinstance(other, str): jid = gajim.get_jid_without_resource(other) else: # It's a Contact instance jid = other.jid @@ -603,7 +603,7 @@ class FileTransfersWindow: Change the progress of a transfer with new transfered size """ file_props = FilesProp.getFilePropByType(typ, sid) - full_size = int(file_props.size) + full_size = file_props.size if full_size == 0: percent = 0 else: @@ -674,9 +674,9 @@ class FileTransfersWindow: Return iter to the row, which holds file transfer, identified by the session id """ - iter_ = self.model.get_iter_root() + iter_ = self.model.get_iter_first() while iter_: - if typ + sid == self.model[iter_][C_SID].decode('utf-8'): + if typ + sid == self.model[iter_][C_SID]: return iter_ iter_ = self.model.iter_next(iter_) @@ -712,7 +712,7 @@ class FileTransfersWindow: file_props.type_ = 's' file_props.desc = file_desc file_props.elapsed_time = 0 - file_props.size = unicode(stat[6]) + file_props.size = stat[6] file_props.sender = account file_props.receiver = contact file_props.tt_account = account @@ -737,7 +737,7 @@ class FileTransfersWindow: file_name = os.path.split(file_props.file_name)[1] else: file_name = file_props.name - text_props = gobject.markup_escape_text(file_name) + '\n' + text_props = GLib.markup_escape_text(file_name) + '\n' text_props += contact.get_shown_name() self.model.set(iter_, 1, text_labels, 2, text_props, C_PULSE, -1, C_SID, file_props.type_ + file_props.sid) @@ -754,9 +754,11 @@ class FileTransfersWindow: self.window.show_all() def on_transfers_list_motion_notify_event(self, widget, event): - pointer = self.tree.get_pointer() + w = self.tree.get_window() + device = w.get_display().get_device_manager().get_client_pointer() + pointer = w.get_device_position(device) props = widget.get_path_at_pos(int(event.x), int(event.y)) - self.height_diff = pointer[1] - int(event.y) + self.height_diff = pointer[2] - int(event.y) if self.tooltip.timeout > 0: if not props or self.tooltip.id != props[0]: self.tooltip.hide_tooltip() @@ -768,21 +770,24 @@ class FileTransfersWindow: except Exception: self.tooltip.hide_tooltip() return - sid = self.model[iter_][C_SID].decode('utf-8') + sid = self.model[iter_][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) if file_props is not None: if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: self.tooltip.id = row - self.tooltip.timeout = gobject.timeout_add(500, - self.show_tooltip, widget) + self.tooltip.timeout = GLib.timeout_add(500, + self.show_tooltip, widget) def on_transfers_list_leave_notify_event(self, widget=None, event=None): if event is not None: self.height_diff = int(event.y) elif self.height_diff is 0: return - pointer = self.tree.get_pointer() - props = self.tree.get_path_at_pos(pointer[0], pointer[1] - self.height_diff) + w = self.tree.get_window() + device = w.get_display().get_device_manager().get_client_pointer() + pointer = w.get_device_position(device) + props = self.tree.get_path_at_pos(pointer[1], + pointer[2] - self.height_diff) if self.tooltip.timeout > 0: if not props or self.tooltip.id == props[0]: self.tooltip.hide_tooltip() @@ -823,7 +828,7 @@ class FileTransfersWindow: self.set_all_insensitive() return current_iter = self.model.get_iter(path) - sid = self.model[current_iter][C_SID].decode('utf-8') + sid = self.model[current_iter][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) self.remove_menuitem.set_sensitive(is_row_selected) self.open_folder_menuitem.set_sensitive(is_row_selected) @@ -881,7 +886,7 @@ class FileTransfersWindow: i = len(self.model) - 1 while i >= 0: iter_ = self.model.get_iter((i)) - sid = self.model[iter_][C_SID].decode('utf-8') + sid = self.model[iter_][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) if is_transfer_stopped(file_props): self._remove_transfer(iter_, sid, file_props) @@ -893,8 +898,8 @@ class FileTransfersWindow: if status: label = _('Pause') self.pause_button.set_label(label) - self.pause_button.set_image(gtk.image_new_from_stock( - gtk.STOCK_MEDIA_PAUSE, gtk.ICON_SIZE_MENU)) + self.pause_button.set_image(Gtk.Image.new_from_stock( + Gtk.STOCK_MEDIA_PAUSE, Gtk.IconSize.MENU)) self.pause_menuitem.set_sensitive(True) self.pause_menuitem.set_no_show_all(False) @@ -904,8 +909,8 @@ class FileTransfersWindow: else: label = _('_Continue') self.pause_button.set_label(label) - self.pause_button.set_image(gtk.image_new_from_stock( - gtk.STOCK_MEDIA_PLAY, gtk.ICON_SIZE_MENU)) + self.pause_button.set_image(Gtk.Image.new_from_stock( + Gtk.STOCK_MEDIA_PLAY, Gtk.IconSize.MENU)) self.pause_menuitem.hide() self.pause_menuitem.set_no_show_all(True) self.continue_menuitem.set_sensitive(True) @@ -916,7 +921,7 @@ class FileTransfersWindow: if selected is None or selected[1] is None: return s_iter = selected[1] - sid = self.model[s_iter][C_SID].decode('utf-8') + sid = self.model[s_iter][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) if is_transfer_paused(file_props): file_props.last_time = time.time() @@ -938,7 +943,7 @@ class FileTransfersWindow: if selected is None or selected[1] is None: return s_iter = selected[1] - sid = self.model[s_iter][C_SID].decode('utf-8') + sid = self.model[s_iter][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) account = file_props.tt_account if account not in gajim.connections: @@ -954,21 +959,23 @@ class FileTransfersWindow: if self.height_diff == 0: self.tooltip.hide_tooltip() return - pointer = self.tree.get_pointer() - props = self.tree.get_path_at_pos(pointer[0], - pointer[1] - self.height_diff) + w = self.tree.get_window() + device = w.get_display().get_device_manager().get_client_pointer() + pointer = w.get_device_position(device) + props = self.tree.get_path_at_pos(pointer[1], + pointer[2] - self.height_diff) # check if the current pointer is at the same path # as it was before setting the timeout if props and self.tooltip.id == props[0]: iter_ = self.model.get_iter(props[0]) - sid = self.model[iter_][C_SID].decode('utf-8') + sid = self.model[iter_][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) # bounding rectangle of coordinates for the cell within the treeview rect = self.tree.get_cell_area(props[0], props[1]) # position of the treeview on the screen - position = widget.window.get_origin() + position = widget.get_window().get_origin()[1:] self.tooltip.show_tooltip(file_props, rect.height, - position[1] + rect.y + self.height_diff) + position[1] + rect.y + self.height_diff) else: self.tooltip.hide_tooltip() @@ -992,7 +999,7 @@ class FileTransfersWindow: event_button = gtkgui_helpers.get_possible_button_event(event) self.file_transfers_menu.show_all() - self.file_transfers_menu.popup(None, self.tree, None, + self.file_transfers_menu.popup(None, self.tree, None, None, event_button, event.time) def on_transfers_list_key_press_event(self, widget, event): @@ -1010,7 +1017,7 @@ class FileTransfersWindow: path = self.model.get_path(iter_) self.tree.get_selection().select_path(path) - if event.keyval == gtk.keysyms.Menu: + if event.keyval == Gdk.KEY_Menu: self.show_context_menu(event, iter_) return True @@ -1049,7 +1056,7 @@ class FileTransfersWindow: if not selected or not selected[1]: return s_iter = selected[1] - sid = self.model[s_iter][C_SID].decode('utf-8') + sid = self.model[s_iter][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) if not file_props.file_name: return @@ -1071,11 +1078,11 @@ class FileTransfersWindow: if not selected or not selected[1]: return s_iter = selected[1] - sid = self.model[s_iter][C_SID].decode('utf-8') + sid = self.model[s_iter][C_SID] file_props = FilesProp.getFilePropByType(sid[0], sid[1:]) self._remove_transfer(s_iter, sid, file_props) self.set_all_insensitive() def on_file_transfers_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: # ESCAPE + if event.keyval == Gdk.KEY_Escape: # ESCAPE self.window.hide() diff --git a/src/gajim-remote.py b/src/gajim-remote.py index 5472474f3854c0296c652e4b0c541ac7f4b2fab2..82ec20ad2341223c3474936fcd0b870b2de81bf6 100644 --- a/src/gajim-remote.py +++ b/src/gajim-remote.py @@ -43,7 +43,7 @@ except Exception: def send_error(error_message): '''Writes error message to stderr and exits''' - print >> sys.stderr, error_message.encode(PREFERRED_ENCODING) + print(error_message, file=sys.stderr) sys.exit(1) try: @@ -53,7 +53,7 @@ try: # test if dbus-x11 is installed bus = dbus.SessionBus() except Exception: - print _('D-Bus is not present on this machine or python module is missing') + print(_('D-Bus is not present on this machine or python module is missing')) sys.exit(1) OBJ_PATH = '/org/gajim/dbus/RemoteObject' @@ -311,14 +311,15 @@ class GajimRemote: self.command = sys.argv[1] if self.command == 'help': if self.argv_len == 3: - print self.help_on_command(sys.argv[2]).encode(PREFERRED_ENCODING) + print(self.help_on_command(sys.argv[2]).encode( + PREFERRED_ENCODING)) else: - print self.compose_help().encode(PREFERRED_ENCODING) + print(self.compose_help().encode(PREFERRED_ENCODING)) sys.exit(0) if self.command == 'handle_uri': self.handle_uri() if self.command == 'check_gajim_running': - print self.check_gajim_running() + print(self.check_gajim_running()) sys.exit(0) self.init_connection() self.check_arguments() @@ -354,28 +355,22 @@ class GajimRemote: elif self.command == 'list_accounts': if isinstance(res, list): for account in res: - if isinstance(account, unicode): - print account.encode(PREFERRED_ENCODING) - else: - print account + print(account) elif self.command == 'account_info': if res: - print self.print_info(0, res, True) + print(self.print_info(0, res, True)) elif self.command == 'list_contacts': for account_dict in res: - print self.print_info(0, account_dict, True) + print(self.print_info(0, account_dict, True)) elif self.command == 'prefs_list': pref_keys = sorted(res.keys()) for pref_key in pref_keys: result = '%s = %s' % (pref_key, res[pref_key]) - if isinstance(result, unicode): - print result.encode(PREFERRED_ENCODING) - else: - print result + print(result) elif self.command == 'contact_info': - print self.print_info(0, res, True) + print(self.print_info(0, res, True)) elif res: - print unicode(res).encode(PREFERRED_ENCODING) + print(res) def check_gajim_running(self): if not self.sbus: @@ -471,7 +466,7 @@ class GajimRemote: ret_str +='\t' elif isinstance(val, int): ret_str +='\t' + str(val) - elif isinstance(val, (str, unicode)): + elif isinstance(val, str): ret_str +='\t' + val elif isinstance(val, (list, tuple)): res = '' @@ -486,7 +481,7 @@ class GajimRemote: for key in prop_dict.keys(): val = prop_dict[key] spacing = ' ' * level * 4 - if isinstance(val, (unicode, int, str)): + if isinstance(val, (int, str)): if val is not None: val = val.strip() ret_str += '%s%-10s: %s\n' % (spacing, key, val) diff --git a/src/gajim.py b/src/gajim.py index aef0378697b0b425bb01ac85f8e91b311119597a..8fb7b891b5ec58c58c08c1f685a8eed3baca2d47 100644 --- a/src/gajim.py +++ b/src/gajim.py @@ -42,7 +42,7 @@ import warnings if os.name == 'nt': log_path = os.path.join(os.environ['APPDATA'], 'Gajim') if not os.path.exists(log_path): - os.mkdir(log_path, 0700) + os.mkdir(log_path, 0o700) log_file = os.path.join(log_path, 'gajim.log') fout = open(log_file, 'a') sys.stdout = fout @@ -65,16 +65,25 @@ if os.name == 'nt': try: import nbxmpp except ImportError: - print 'Gajim needs python-nbxmpp to run. Quiting...' + print('Gajim needs python-nbxmpp to run. Quiting...') sys.exit() -from common import demandimport -demandimport.enable() -demandimport.ignore += ['gobject._gobject', 'libasyncns', 'i18n', - 'logging.NullHandler', 'dbus.service', 'OpenSSL.SSL', 'OpenSSL.crypto', - 'common.sleepy', 'DLFCN', 'dl', 'xml.sax', 'xml.sax.handler', 'ic', - 'Crypto.PublicKey', 'IPython', 'contextlib', 'imp', 'gst.interfaces', - 'monotonic', 'gtkexcepthook'] +try: + from distutils.version import LooseVersion as V + if V(nbxmpp.__version__) < V("0.3"): + print('Gajim needs python-nbxmpp > 0.3 to run. Quiting...') + sys.exit() +except: + print('Gajim needs python-nbxmpp > 0.3 to run. Quiting...') + sys.exit() + +#from common import demandimport +#demandimport.enable() +#demandimport.ignore += ['GObject._gobject', 'libasyncns', 'i18n', +# 'logging.NullHandler', 'dbus.service', 'OpenSSL.SSL', 'OpenSSL.crypto', +# 'common.sleepy', 'DLFCN', 'dl', 'xml.sax', 'xml.sax.handler', 'ic', +# 'Crypto.PublicKey', 'IPython', 'contextlib', 'imp', 'monotonic', +# 'gtkexcepthook'] if os.name == 'nt': import locale @@ -85,7 +94,7 @@ if os.name == 'nt': os.environ['LANG'] = lang gettext.bindtextdomain(APP, DIR) gettext.textdomain(APP) - gettext.install(APP, DIR, unicode=True) + gettext.install(APP, DIR) locale.setlocale(locale.LC_ALL, '') import ctypes @@ -112,6 +121,12 @@ import logging # gajim.gui or gajim.gtk more appropriate ? log = logging.getLogger('gajim.gajim') +#import gi +#gi.require_version('Gtk', '3.0') +#gi.require_version('Gdk', '2.0') +#gi.require_version('GObject', '2.0') +#gi.require_version('Pango', '1.0') + import getopt from common import i18n @@ -126,13 +141,13 @@ def parseOpts(): longargs += ' class= name= screen= gtk-module= sync g-fatal-warnings' longargs += ' sm-client-id= sm-client-state-file= sm-disable' opts = getopt.getopt(sys.argv[1:], shortargs, longargs.split())[0] - except getopt.error, msg1: - print msg1 - print 'for help use --help' + except getopt.error as msg1: + print(str(msg1)) + print('for help use --help') sys.exit(2) for o, a in opts: if o in ('-h', '--help'): - print _('Usage:') + \ + print(_('Usage:') + \ '\n gajim [options] filename\n\n' + \ _('Options:') + \ '\n -h, --help ' + \ @@ -146,7 +161,7 @@ def parseOpts(): '\n -c, --config-path ' + \ _('Set configuration directory') + \ '\n -l, --loglevel ' + \ - _('Configure logging system') + _('Configure logging system') + '\n') sys.exit() elif o in ('-q', '--quiet'): logging_helpers.set_quiet() @@ -162,12 +177,8 @@ def parseOpts(): import locale profile, config_path = parseOpts() -if config_path: - config_path = unicode(config_path, locale.getpreferredencoding()) del parseOpts -profile = unicode(profile, locale.getpreferredencoding()) - import common.configpaths common.configpaths.gajimpaths.init(config_path) del config_path @@ -189,7 +200,7 @@ if os.name == 'nt': if self._file is None and self._error is None: try: self._file = open(fname, 'a') - except Exception, details: + except Exception as details: self._error = details if self._file is not None: self._file.write(text) @@ -203,14 +214,16 @@ if os.name == 'nt': # PyGTK2.10+ only throws a warning warnings.filterwarnings('error', module='gtk') try: - import gobject - gobject.set_prgname('gajim') - import gtk -except Warning, msg2: + from gi.repository import GObject + GObject.set_prgname('gajim') + from gi.repository import Gtk + from gi.repository import Gdk + from gi.repository import GLib +except Warning as msg2: if str(msg2) == 'could not open display': - print >> sys.stderr, _('Gajim needs X server to run. Quiting...') + print(_('Gajim needs X server to run. Quiting...'), file=sys.stderr) else: - print >> sys.stderr, _('importing PyGTK failed: %s') % str(msg2) + print(_('importing PyGTK failed: %s') % str(msg2), file=sys.stderr) sys.exit() warnings.resetwarnings() @@ -218,8 +231,8 @@ warnings.resetwarnings() if os.name == 'nt': warnings.filterwarnings(action='ignore') -if gtk.widget_get_default_direction() == gtk.TEXT_DIR_RTL: - i18n.direction_mark = u'\u200F' +if Gtk.Widget.get_default_direction() == Gtk.TextDirection.RTL: + i18n.direction_mark = '\u200F' pritext = '' from common import exceptions @@ -231,6 +244,10 @@ except exceptions.DatabaseMalformed: 'http://trac.gajim.org/wiki/DatabaseBackup) or remove it (all history ' 'will be lost).') % common.logger.LOG_DB_PATH else: + from common import logger + gajim.logger = logger.Logger() + from common import caps_cache + caps_cache.initialize(gajim.logger) from common import dbus_support if dbus_support.supported: from music_track_listener import MusicTrackListener @@ -252,12 +269,14 @@ else: elif sysname in ('FreeBSD', 'OpenBSD', 'NetBSD'): libc.setproctitle('gajim') - if gtk.pygtk_version < (2, 22, 0): - pritext = _('Gajim needs PyGTK 2.22 or above') - sectext = _('Gajim needs PyGTK 2.22 or above to run. Quiting...') - elif gtk.gtk_version < (2, 22, 0): - pritext = _('Gajim needs GTK 2.22 or above') - sectext = _('Gajim needs GTK 2.22 or above to run. Quiting...') +# if Gtk.pygtk_version < (2, 22, 0): +# pritext = _('Gajim needs PyGTK 2.22 or above') +# sectext = _('Gajim needs PyGTK 2.22 or above to run. Quiting...') +# elif Gtk.gtk_version < (2, 22, 0): +# if (Gtk.get_major_version(), Gtk.get_minor_version(), +# Gtk.get_micro_version()) < (2, 22, 0): +# pritext = _('Gajim needs GTK 2.22 or above') +# sectext = _('Gajim needs GTK 2.22 or above to run. Quiting...') from common import check_paths @@ -272,9 +291,9 @@ else: 'http://sourceforge.net/project/showfiles.php?group_id=78018' if pritext: - dlg = gtk.MessageDialog(None, - gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_MODAL, - gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, message_format = pritext) + dlg = Gtk.MessageDialog(None, + Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.DialogFlags.MODAL, + Gtk.MessageType.ERROR, Gtk.ButtonsType.OK, message_format = pritext) dlg.format_secondary_text(sectext) dlg.run() @@ -293,6 +312,22 @@ gajimpaths = common.configpaths.gajimpaths pid_filename = gajimpaths['PID_FILE'] config_filename = gajimpaths['CONFIG_FILE'] +# Seed the OpenSSL pseudo random number generator from file and initialize +RNG_SEED = gajimpaths['RNG_SEED'] +PYOPENSSL_PRNG_PRESENT = False +try: + import OpenSSL.rand + from common import crypto + PYOPENSSL_PRNG_PRESENT = True + # Seed from file + try: + OpenSSL.rand.load_file(RNG_SEED) + except TypeError: + OpenSSL.rand.load_file(RNG_SEED.encode('utf-8')) + crypto.add_entropy_sources_OpenSSL() +except ImportError: + log.info("PyOpenSSL PRNG not available") + import traceback import errno import dialogs @@ -363,7 +398,7 @@ def pid_alive(): try: f1 = open('/proc/%d/cmdline'% pid) - except IOError, e1: + except IOError as e1: if e1.errno == errno.ENOENT: return False # file/pid does not exist raise @@ -406,12 +441,12 @@ if pid_alive(): pixs.append(pix) if pixs: # set the icon to all windows - gtk.window_set_default_icon_list(*pixs) + Gtk.Window.set_default_icon_list(*pixs) pritext = _('Gajim is already running') sectext = _('Another instance of Gajim seems to be running\nRun anyway?') dialog = dialogs.YesNoDialog(pritext, sectext) dialog.popup() - if dialog.run() != gtk.RESPONSE_YES: + if dialog.run() != Gtk.ResponseType.YES: sys.exit(3) dialog.destroy() # run anyway, delete pid and useless global vars @@ -431,7 +466,7 @@ try: f2 = open(pid_filename, 'w') f2.write(str(os.getpid())) f2.close() -except IOError, e2: +except IOError as e2: dlg = dialogs.ErrorDialog(_('Disk Write Error'), str(e2)) dlg.run() dlg.destroy() @@ -439,6 +474,12 @@ except IOError, e2: del pid_dir def on_exit(): + # Save the entropy from OpenSSL PRNG + if PYOPENSSL_PRNG_PRESENT: + try: + OpenSSL.rand.write_file(RNG_SEED) + except TypeError: + OpenSSL.rand.write_file(RNG_SEED.encode('utf-8')) # delete pid file on normal exit if os.path.exists(pid_filename): os.remove(pid_filename) @@ -461,45 +502,12 @@ if __name__ == '__main__': log.info("Encodings: d:%s, fs:%s, p:%s", sys.getdefaultencoding(), \ sys.getfilesystemencoding(), locale.getpreferredencoding()) - if os.name != 'nt': - # Session Management support - try: - import gnome.ui - raise ImportError - except ImportError: - pass - else: - def die_cb(dummy): - gajim.interface.roster.quit_gtkgui_interface() - gnome.program_init('gajim', gajim.version) - cli = gnome.ui.master_client() - cli.connect('die', die_cb) - - path_to_gajim_script = gtkgui_helpers.get_abspath_for_script( - 'gajim') - - if path_to_gajim_script: - argv = [path_to_gajim_script] - try: - cli.set_restart_command(argv) - except TypeError: - # Fedora systems have a broken gnome-python wrapper for this - # function. - cli.set_restart_command(len(argv), argv) - check_paths.check_and_possibly_create_paths() interface = Interface() interface.run() try: - if os.name != 'nt': - # This makes Gajim unusable under windows, and threads are used only - # for GPG, so not under windows - gtk.gdk.threads_init() - gtk.gdk.threads_enter() - gtk.main() - if os.name != 'nt': - gtk.gdk.threads_leave() + Gtk.main() except KeyboardInterrupt: - print >> sys.stderr, 'KeyboardInterrupt' + print('KeyboardInterrupt', file=sys.stderr) diff --git a/src/gajim_themes_window.py b/src/gajim_themes_window.py index 2b923590fe22297d034e640624542c225d5a35e5..5f2d7d3d9e3cddcaee2a031831b5c2c32f774dcb 100644 --- a/src/gajim_themes_window.py +++ b/src/gajim_themes_window.py @@ -22,8 +22,9 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## -import gtk -import pango +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import Pango import dialogs import gtkgui_helpers @@ -34,7 +35,8 @@ class GajimThemesWindow: def __init__(self): self.xml = gtkgui_helpers.get_gtk_builder('gajim_themes_window.ui') self.window = self.xml.get_object('gajim_themes_window') - self.window.set_transient_for(gajim.interface.roster.window) + self.window.set_transient_for(gajim.interface.instances[ + 'preferences'].window) self.options = ['account', 'group', 'contact', 'banner'] self.options_combobox = self.xml.get_object('options_combobox') @@ -54,13 +56,13 @@ class GajimThemesWindow: 'muc_msg', 'muc_directed_msg'): self.colorbuttons[chatstate] = self.xml.get_object(chatstate + \ '_colorbutton') - model = gtk.ListStore(str) + model = Gtk.ListStore(str) self.themes_tree.set_model(model) - col = gtk.TreeViewColumn(_('Theme')) + col = Gtk.TreeViewColumn(_('Theme')) self.themes_tree.append_column(col) - renderer = gtk.CellRendererText() + renderer = Gtk.CellRendererText() col.pack_start(renderer, True) - col.set_attributes(renderer, text = 0) + col.add_attribute(renderer, 'text', 0) renderer.connect('edited', self.on_theme_cell_edited) renderer.set_property('editable', True) self.current_theme = gajim.config.get('roster_theme') @@ -88,8 +90,7 @@ class GajimThemesWindow: def on_theme_cell_edited(self, cell, row, new_name): model = self.themes_tree.get_model() iter_ = model.get_iter_from_string(row) - old_name = model.get_value(iter_, 0).decode('utf-8') - new_name = new_name.decode('utf-8') + old_name = model.get_value(iter_, 0) if old_name == new_name: return if old_name == 'default': @@ -125,7 +126,7 @@ class GajimThemesWindow: def select_active_theme(self): model = self.themes_tree.get_model() - iter_ = model.get_iter_root() + iter_ = model.get_iter_first() active_theme = gajim.config.get('roster_theme').replace('_', ' ') while iter_: theme = model[iter_][0] @@ -149,7 +150,7 @@ class GajimThemesWindow: self.theme_options_vbox.set_sensitive(False) self.theme_options_table.set_sensitive(False) return - self.current_theme = model.get_value(iter_, 0).decode('utf-8') + self.current_theme = model.get_value(iter_, 0) self.current_theme = self.current_theme.replace(' ', '_') self.set_theme_options(self.current_theme) if self.current_theme == 'default': @@ -168,10 +169,10 @@ class GajimThemesWindow: # don't confuse translators theme_name = _('theme name') theme_name_ns = theme_name.replace(' ', '_') - while theme_name_ns + unicode(i) in gajim.config.get_per('themes'): + while theme_name_ns + str(i) in gajim.config.get_per('themes'): i += 1 - model.set_value(iter_, 0, theme_name + unicode(i)) - gajim.config.add_per('themes', theme_name_ns + unicode(i)) + model.set_value(iter_, 0, theme_name + str(i)) + gajim.config.add_per('themes', theme_name_ns + str(i)) self.themes_tree.get_selection().select_iter(iter_) col = self.themes_tree.get_column(0) path = model.get_path(iter_) @@ -198,7 +199,7 @@ class GajimThemesWindow: textcolor = gajim.config.get_per('themes', theme, option + 'textcolor') if textcolor: state = True - self.text_colorbutton.set_color(gtk.gdk.color_parse(textcolor)) + self.text_colorbutton.set_color(Gdk.color_parse(textcolor)) else: state = False self.textcolor_checkbutton.set_active(state) @@ -206,7 +207,7 @@ class GajimThemesWindow: bgcolor = gajim.config.get_per('themes', theme, option + 'bgcolor') if bgcolor: state = True - self.background_colorbutton.set_color(gtk.gdk.color_parse( + self.background_colorbutton.set_color(Gdk.color_parse( bgcolor)) else: state = False @@ -231,7 +232,7 @@ class GajimThemesWindow: 'muc_msg', 'muc_directed_msg'): color = gajim.config.get_per('themes', theme, 'state_' + chatstate + \ '_color') - self.colorbuttons[chatstate].set_color(gtk.gdk.color_parse(color)) + self.colorbuttons[chatstate].set_color(Gdk.color_parse(color)) def on_textcolor_checkbutton_toggled(self, widget): state = widget.get_active() @@ -328,11 +329,11 @@ class GajimThemesWindow: """ Return a FontDescription from togglebuttons states """ - fd = pango.FontDescription() + fd = Pango.FontDescription() if self.bold_togglebutton.get_active(): - fd.set_weight(pango.WEIGHT_BOLD) + fd.set_weight(Pango.Weight.BOLD) if self.italic_togglebutton.get_active(): - fd.set_style(pango.STYLE_ITALIC) + fd.set_style(Pango.Style.ITALIC) return fd def _set_font_widgets(self, font_attrs): @@ -365,10 +366,10 @@ class GajimThemesWindow: Get tuple of font properties: weight, style """ font_props = [False, False, False] - font_description = pango.FontDescription(font_name) - if font_description.get_weight() != pango.WEIGHT_NORMAL: + font_description = Pango.FontDescription(font_name) + if font_description.get_weight() != Pango.Weight.NORMAL: font_props[0] = True - if font_description.get_style() != pango.STYLE_ITALIC: + if font_description.get_style() != Pango.Style.ITALIC: font_props[1] = True return font_props diff --git a/src/groupchat_control.py b/src/groupchat_control.py index 55d05b98f97c09a9c80c462f723c150d38d90278..9e727e059af14d641ebac08de11f058eddc9f4aa 100644 --- a/src/groupchat_control.py +++ b/src/groupchat_control.py @@ -30,9 +30,11 @@ import os import time import locale -import gtk -import pango -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf +from gi.repository import Pango +from gi.repository import GLib import gtkgui_helpers import gui_menu_builder import message_control @@ -42,6 +44,7 @@ import config import vcard import cell_renderer_image import dataforms_widget +import nbxmpp from common import gajim from common import helpers @@ -69,16 +72,20 @@ C_TEXT, # text shown in the cellrenderer C_AVATAR, # avatar of the contact ) = range(5) +empty_pixbuf = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 1, 1) +empty_pixbuf.fill(0xffffff00) + def set_renderer_color(treeview, renderer, set_background=True): """ Set style for group row, using PRELIGHT system color """ + context = treeview.get_style_context() if set_background: - bgcolor = treeview.style.bg[gtk.STATE_PRELIGHT] - renderer.set_property('cell-background-gdk', bgcolor) + bgcolor = context.get_background_color(Gtk.StateFlags.PRELIGHT) + renderer.set_property('cell-background-rgba', bgcolor) else: - fgcolor = treeview.style.fg[gtk.STATE_PRELIGHT] - renderer.set_property('foreground-gdk', fgcolor) + fgcolor = context.get_color(Gtk.StateFlags.PRELIGHT) + renderer.set_property('foreground-rgba', fgcolor) def tree_cell_data_func(column, renderer, model, iter_, tv=None): # cell data func is global, because we don't want it to keep @@ -86,7 +93,7 @@ def tree_cell_data_func(column, renderer, model, iter_, tv=None): 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 isinstance(renderer, Gtk.CellRendererPixbuf): avatar_position = gajim.config.get('avatar_position_in_roster') if avatar_position == 'right': renderer.set_property('xalign', 1) # align pixbuf to the right @@ -105,7 +112,7 @@ def tree_cell_data_func(column, renderer, model, iter_, tv=None): renderer.set_property('cell-background', bgcolor) else: renderer.set_property('cell-background', None) - if isinstance(renderer, gtk.CellRendererText): + if isinstance(renderer, Gtk.CellRendererText): # foreground property is only with CellRendererText color = gajim.config.get_per('themes', theme, 'contacttextcolor') if color: @@ -120,7 +127,7 @@ def tree_cell_data_func(column, renderer, model, iter_, tv=None): renderer.set_property('cell-background', bgcolor) else: set_renderer_color(tv, renderer) - if isinstance(renderer, gtk.CellRendererText): + if isinstance(renderer, Gtk.CellRendererText): # foreground property is only with CellRendererText color = gajim.config.get_per('themes', theme, 'grouptextcolor') if color: @@ -236,8 +243,8 @@ class PrivateChatControl(ChatControl): _('Sending private message failed'), #in second %s code replaces with nickname _('You are no longer in group chat "%(room)s" or ' - '"%(nick)s" has left.') % {'room': u'\u200E' + room, - 'nick': nick}) + '"%(nick)s" has left.') % {'room': '\u200E' + room, + 'nick': nick}, transient_for=self.parent_win.window) return ChatControl.send_message(self, message, xhtml=xhtml, @@ -340,7 +347,7 @@ class GroupchatControl(ChatControlBase): if gtkgui_helpers.gtk_icon_theme.has_icon('bookmark-new'): img = self.xml.get_object('image7') - img.set_from_icon_name('bookmark-new', gtk.ICON_SIZE_MENU) + img.set_from_icon_name('bookmark-new', Gtk.IconSize.MENU) widget.set_sensitive( gajim.connections[self.account].private_storage_supported or \ (gajim.connections[self.account].pubsub_supported and \ @@ -348,8 +355,8 @@ class GroupchatControl(ChatControlBase): widget.show() if gtkgui_helpers.gtk_icon_theme.has_icon('document-open-recent'): - img = self.xml.get_object('image8') - img.set_from_icon_name('document-open-recent', gtk.ICON_SIZE_MENU) + img = self.xml.get_object('history_image') + img.set_from_icon_name('document-open-recent', Gtk.IconSize.MENU) widget = self.xml.get_object('list_treeview') id_ = widget.connect('row_expanded', self.on_list_treeview_row_expanded) self.handlers[id_] = widget @@ -379,7 +386,7 @@ class GroupchatControl(ChatControlBase): self.handlers[id_] = widget self.room_jid = self.contact.jid - self.nick = contact.name.decode('utf-8') + self.nick = contact.name self.new_nick = '' self.name = '' for bm in gajim.connections[self.account].bookmarks: @@ -441,13 +448,13 @@ class GroupchatControl(ChatControlBase): self.hpaned.set_position(hpaned_position) #status_image, shown_nick, type, nickname, avatar - self.columns = [gtk.Image, str, str, str, gtk.gdk.Pixbuf] - self.model = gtk.TreeStore(*self.columns) + self.columns = [Gtk.Image, str, str, str, GdkPixbuf.Pixbuf] + self.model = Gtk.TreeStore(*self.columns) self.model.set_sort_func(C_NICK, self.tree_compare_iters) - self.model.set_sort_column_id(C_NICK, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(C_NICK, Gtk.SortType.ASCENDING) # columns - column = gtk.TreeViewColumn() + column = Gtk.TreeViewColumn() # list of renderers with attributes / properties in the form: # (name, renderer_object, expand?, attribute_name, attribute_value, # cell_data_func, func_arg) @@ -457,9 +464,9 @@ class GroupchatControl(ChatControlBase): self.renderers_propertys = {} renderer_image = cell_renderer_image.CellRendererImage(0, 0) self.renderers_propertys[renderer_image] = ('width', 26) - renderer_text = gtk.CellRendererText() + renderer_text = Gtk.CellRendererText() self.renderers_propertys[renderer_text] = ('ellipsize', - pango.ELLIPSIZE_END) + Pango.EllipsizeMode.END) self.renderers_list += ( # status img @@ -470,7 +477,7 @@ class GroupchatControl(ChatControlBase): 'markup', C_TEXT, tree_cell_data_func, self.list_treeview)) # avatar img - avater_renderer = ('avatar', gtk.CellRendererPixbuf(), + avater_renderer = ('avatar', Gtk.CellRendererPixbuf(), False, 'pixbuf', C_AVATAR, tree_cell_data_func, self.list_treeview) @@ -483,9 +490,9 @@ class GroupchatControl(ChatControlBase): self.list_treeview.append_column(column) # workaround to avoid gtk arrows to be shown - column = gtk.TreeViewColumn() # 2nd COLUMN - renderer = gtk.CellRendererPixbuf() - column.pack_start(renderer, expand=False) + column = Gtk.TreeViewColumn() # 2nd COLUMN + renderer = Gtk.CellRendererPixbuf() + column.pack_start(renderer, False) self.list_treeview.append_column(column) column.set_visible(False) self.list_treeview.set_expander_column(column) @@ -523,7 +530,7 @@ class GroupchatControl(ChatControlBase): def fill_column(self, col): for rend in self.renderers_list: - col.pack_start(rend[1], expand=rend[2]) + col.pack_start(rend[1], rend[2]) col.add_attribute(rend[1], rend[3], rend[4]) col.set_cell_data_func(rend[1], rend[5], rend[6]) # set renderers propertys @@ -531,7 +538,7 @@ class GroupchatControl(ChatControlBase): renderer.set_property(self.renderers_propertys[renderer][0], self.renderers_propertys[renderer][1]) - def tree_compare_iters(self, model, iter1, iter2): + def tree_compare_iters(self, model, iter1, iter2, data=None): """ Compare two iters to sort them """ @@ -543,8 +550,6 @@ class GroupchatControl(ChatControlBase): nick2 = model[iter2][C_NICK] if not nick1 or not nick2: return 0 - nick1 = nick1.decode('utf-8') - nick2 = nick2.decode('utf-8') if type1 == 'role': return locale.strcoll(nick1, nick2) if type1 == 'contact': @@ -578,17 +583,17 @@ class GroupchatControl(ChatControlBase): and the ability to insert a nick """ ChatControlBase.on_msg_textview_populate_popup(self, textview, menu) - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() menu.prepend(item) - item = gtk.MenuItem(_('Insert Nickname')) + item = Gtk.MenuItem(_('Insert Nickname')) menu.prepend(item) - submenu = gtk.Menu() + submenu = Gtk.Menu() item.set_submenu(submenu) for nick in sorted(gajim.contacts.get_nick_list(self.account, self.room_jid)): - item = gtk.MenuItem(nick, use_underline=False) + item = Gtk.MenuItem(nick, use_underline=False) submenu.append(item) id_ = item.connect('activate', self.append_nick_in_msg_textview, nick) @@ -603,14 +608,15 @@ class GroupchatControl(ChatControlBase): self.resize_from_another_muc = False # Reset the flag when everything will be redrawn, and in particular when # on_treeview_size_allocate will have been called. - gobject.idle_add(reset_flag) + GLib.idle_add(reset_flag) def on_hpaned_notify(self, pane, gparamspec): """ The MUC treeview has resized. Move the hpaned in all tabs to match """ - if gparamspec.name != 'position': - return + # print pane, dir(pane) + #if gparamspec.name != 'position': + #return if self.resize_from_another_muc: # Don't send the event to other MUC return @@ -632,7 +638,7 @@ class GroupchatControl(ChatControlBase): """ Iterate over all contact rows in the tree model """ - role_iter = self.model.get_iter_root() + role_iter = self.model.get_iter_first() while role_iter: contact_iter = self.model.iter_children(role_iter) while contact_iter: @@ -646,7 +652,7 @@ class GroupchatControl(ChatControlBase): """ # Get the room_jid from treeview for contact in self.iter_contact_rows(): - nick = contact[C_NICK].decode('utf-8') + nick = contact[C_NICK] self.draw_contact(nick) def on_list_treeview_selection_changed(self, selection): @@ -658,7 +664,7 @@ class GroupchatControl(ChatControlBase): self._last_selected_contact = None return contact = model[selected_iter] - nick = contact[C_NICK].decode('utf-8') + nick = contact[C_NICK] self._last_selected_contact = nick if contact[C_TYPE] != 'contact': return @@ -676,21 +682,26 @@ class GroupchatControl(ChatControlBase): color_name = None color = None theme = gajim.config.get('roster_theme') + context = self.parent_win.notebook.get_style_context() if chatstate == 'attention' and (not has_focus or not current_tab): self.attention_flag = True color_name = gajim.config.get_per('themes', theme, - 'state_muc_directed_msg_color') + 'state_muc_directed_msg_color') elif chatstate: if chatstate == 'active' or (current_tab and has_focus): self.attention_flag = False # get active color from gtk - color = self.parent_win.notebook.style.fg[gtk.STATE_ACTIVE] + color = context.get_color(Gtk.StateFlags.ACTIVE) elif chatstate == 'newmsg' and (not has_focus or not current_tab) \ and not self.attention_flag: color_name = gajim.config.get_per('themes', theme, - 'state_muc_msg_color') + 'state_muc_msg_color') if color_name: - color = gtk.gdk.colormap_get_system().alloc_color(color_name) + color = Gdk.RGBA() + ok = Gdk.RGBA.parse(color, color_name) + if not ok: + del color + color = context.get_color(Gtk.StateFlags.ACTIVE) if self.is_continued: # if this is a continued conversation @@ -704,7 +715,7 @@ class GroupchatControl(ChatControlBase): if num_unread == 1: unread = '*' elif num_unread > 1: - unread = '[' + unicode(num_unread) + ']' + unread = '[' + str(num_unread) + ']' label_str = unread + label_str return (label_str, color) @@ -722,11 +733,11 @@ class GroupchatControl(ChatControlBase): for nick in gajim.contacts.get_nick_list(self.account, self.room_jid): self.draw_contact(nick) - def _change_style(self, model, path, iter_): + def _change_style(self, model, path, iter_, option): model[iter_][C_NICK] = model[iter_][C_NICK] def change_roster_style(self): - self.model.foreach(self._change_style) + self.model.foreach(self._change_style, None) def repaint_themed_widgets(self): ChatControlBase.repaint_themed_widgets(self) @@ -742,14 +753,14 @@ class GroupchatControl(ChatControlBase): image = 'muc_inactive' if '32' in images and image in images['32']: muc_icon = images['32'][image] - if muc_icon.get_storage_type() != gtk.IMAGE_EMPTY: + if muc_icon.get_storage_type() != Gtk.ImageType.EMPTY: pix = muc_icon.get_pixbuf() banner_status_img.set_from_pixbuf(pix) return # we need to scale 16x16 to 32x32 muc_icon = images['16'][image] pix = muc_icon.get_pixbuf() - scaled_pix = pix.scale_simple(32, 32, gtk.gdk.INTERP_BILINEAR) + scaled_pix = pix.scale_simple(32, 32, GdkPixbuf.InterpType.BILINEAR) banner_status_img.set_from_pixbuf(scaled_pix) def get_continued_conversation_name(self): @@ -774,19 +785,19 @@ class GroupchatControl(ChatControlBase): Draw the text in the fat line at the top of the window that houses the room jid, subject """ - self.name_label.set_ellipsize(pango.ELLIPSIZE_END) - self.banner_status_label.set_ellipsize(pango.ELLIPSIZE_END) + self.name_label.set_ellipsize(Pango.EllipsizeMode.END) + self.banner_status_label.set_ellipsize(Pango.EllipsizeMode.END) font_attrs, font_attrs_small = self.get_font_attrs() if self.is_continued: name = self.get_continued_conversation_name() else: name = self.room_jid - text = '<span %s>%s</span>' % (font_attrs, u'\u200E' + name) + text = '<span %s>%s</span>' % (font_attrs, '\u200E' + name) self.name_label.set_markup(text) if self.subject: subject = helpers.reduce_chars_newlines(self.subject, max_lines=2) - subject = gobject.markup_escape_text(subject) + subject = GLib.markup_escape_text(subject) subject_text = self.urlfinder.sub(self.make_href, subject) subject_text = '<span %s>%s</span>' % (font_attrs_small, subject_text) @@ -823,11 +834,13 @@ class GroupchatControl(ChatControlBase): request_voice_separator = xml.get_object('request_voice_separator') if gtkgui_helpers.gtk_icon_theme.has_icon('bookmark-new'): - gtkgui_helpers.add_image_to_menuitem(bookmark_room_menuitem, - 'bookmark-new') + img = Gtk.Image() + img.set_from_icon_name('bookmark-new', Gtk.IconSize.MENU) + bookmark_room_menuitem.set_image(img) if gtkgui_helpers.gtk_icon_theme.has_icon('document-open-recent'): - gtkgui_helpers.add_image_to_menuitem(history_menuitem, - 'document-open-recent') + img = Gtk.Image() + img.set_from_icon_name('document-open-recent', Gtk.IconSize.MENU) + history_menuitem.set_image(img) if hide_buttonbar_items: change_nick_menuitem.hide() @@ -849,15 +862,15 @@ class GroupchatControl(ChatControlBase): bookmark_separator.hide() break - ag = gtk.accel_groups_from_object(self.parent_win.window)[0] - change_nick_menuitem.add_accelerator('activate', ag, gtk.keysyms.n, - gtk.gdk.CONTROL_MASK | gtk.gdk.SHIFT_MASK, gtk.ACCEL_VISIBLE) + ag = Gtk.accel_groups_from_object(self.parent_win.window)[0] + change_nick_menuitem.add_accelerator('activate', ag, Gdk.KEY_n, + Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK, Gtk.AccelFlags.VISIBLE) change_subject_menuitem.add_accelerator('activate', ag, - gtk.keysyms.t, gtk.gdk.MOD1_MASK, gtk.ACCEL_VISIBLE) - bookmark_room_menuitem.add_accelerator('activate', ag, gtk.keysyms.b, - gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) - history_menuitem.add_accelerator('activate', ag, gtk.keysyms.h, - gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) + Gdk.KEY_t, Gdk.ModifierType.MOD1_MASK, Gtk.AccelFlags.VISIBLE) + bookmark_room_menuitem.add_accelerator('activate', ag, Gdk.KEY_b, + Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE) + history_menuitem.add_accelerator('activate', ag, Gdk.KEY_h, + Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE) if self.contact.jid in gajim.config.get_per('accounts', self.account, 'minimized_gc').split(' '): @@ -932,15 +945,15 @@ class GroupchatControl(ChatControlBase): def destroy_menu(self, menu, change_nick_menuitem, change_subject_menuitem, bookmark_room_menuitem, history_menuitem): # destroy accelerators - ag = gtk.accel_groups_from_object(self.parent_win.window)[0] - change_nick_menuitem.remove_accelerator(ag, gtk.keysyms.n, - gtk.gdk.CONTROL_MASK | gtk.gdk.SHIFT_MASK) - change_subject_menuitem.remove_accelerator(ag, gtk.keysyms.t, - gtk.gdk.MOD1_MASK) - bookmark_room_menuitem.remove_accelerator(ag, gtk.keysyms.b, - gtk.gdk.CONTROL_MASK) - history_menuitem.remove_accelerator(ag, gtk.keysyms.h, - gtk.gdk.CONTROL_MASK) + ag = Gtk.accel_groups_from_object(self.parent_win.window)[0] + change_nick_menuitem.remove_accelerator(ag, Gdk.KEY_n, + Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK) + change_subject_menuitem.remove_accelerator(ag, Gdk.KEY_t, + Gdk.ModifierType.MOD1_MASK) + bookmark_room_menuitem.remove_accelerator(ag, Gdk.KEY_b, + Gdk.ModifierType.CONTROL_MASK) + history_menuitem.remove_accelerator(ag, Gdk.KEY_h, + Gdk.ModifierType.CONTROL_MASK) # destroy menu menu.destroy() @@ -984,15 +997,15 @@ class GroupchatControl(ChatControlBase): self.form_widget.connect('validated', on_send_dataform_clicked) self.form_widget.show_all() vbox = self.xml.get_object('gc_textviews_vbox') - vbox.pack_start(self.form_widget, expand=False, fill=False) + vbox.pack_start(self.form_widget, False, True, 0) - valid_button = gtk.Button(stock=gtk.STOCK_OK) + valid_button = Gtk.Button(stock=Gtk.STOCK_OK) valid_button.connect('clicked', on_send_dataform_clicked) - self.btn_box = gtk.HButtonBox() - self.btn_box.set_layout(gtk.BUTTONBOX_END) - self.btn_box.pack_start(valid_button) + self.btn_box = Gtk.HButtonBox() + self.btn_box.set_layout(Gtk.ButtonBoxStyle.END) + self.btn_box.pack_start(valid_button, True, True, 0) self.btn_box.show_all() - vbox.pack_start(self.btn_box, expand=False, fill=False) + vbox.pack_start(self.btn_box, False, False, 0) if self.parent_win: self.parent_win.redraw_tab(self, 'attention') else: @@ -1063,7 +1076,9 @@ class GroupchatControl(ChatControlBase): else: self._start_private_message(nick) # Scroll to line - self.list_treeview.expand_row(path[0:1], False) + path_ = path + path_.up() + self.list_treeview.expand_row(path_, False) self.list_treeview.scroll_to_cell(path) self.list_treeview.set_cursor(path) contact = gajim.contacts.get_contact_with_highest_priority( @@ -1072,11 +1087,11 @@ class GroupchatControl(ChatControlBase): gajim.interface.roster.draw_contact(self.room_jid, self.account) def get_contact_iter(self, nick): - role_iter = self.model.get_iter_root() + role_iter = self.model.get_iter_first() while role_iter: user_iter = self.model.iter_children(role_iter) while user_iter: - if nick == self.model[user_iter][C_NICK].decode('utf-8'): + if nick == self.model[user_iter][C_NICK]: return user_iter else: user_iter = self.model.iter_next(user_iter) @@ -1084,9 +1099,7 @@ class GroupchatControl(ChatControlBase): return None def print_old_conversation(self, text, contact='', tim=None, xhtml = None, - displaymarking=None): - if isinstance(text, str): - text = unicode(text, 'utf-8') + displaymarking=None): if contact: if contact == self.nick: # it's us kind = 'outgoing' @@ -1112,8 +1125,6 @@ class GroupchatControl(ChatControlBase): (contact = 'info' in such a case). If contact is not set: it's a message from the server or help. """ - if isinstance(text, str): - text = unicode(text, 'utf-8') other_tags_for_name = [] other_tags_for_text = [] if contact: @@ -1339,7 +1350,7 @@ class GroupchatControl(ChatControlBase): def got_connected(self): # Make autorejoin stop. if self.autorejoin: - gobject.source_remove(self.autorejoin) + GLib.source_remove(self.autorejoin) self.autorejoin = None gajim.gc_connected[self.account][self.room_jid] = True @@ -1406,8 +1417,7 @@ class GroupchatControl(ChatControlBase): if self.autorejoin is None and gajim.account_is_connected(self.account): ar_to = gajim.config.get('muc_autorejoin_timeout') if ar_to: - self.autorejoin = gobject.timeout_add_seconds(ar_to, - self.rejoin) + self.autorejoin = GLib.timeout_add_seconds(ar_to, self.rejoin) def rejoin(self): if not self.autorejoin: @@ -1435,7 +1445,7 @@ class GroupchatControl(ChatControlBase): contact in a room """ if nick is None: - nick = model[iter_][C_NICK].decode('utf-8') + nick = model[iter_][C_NICK] ctrl = self._start_private_message(nick) if ctrl and msg: @@ -1460,7 +1470,7 @@ class GroupchatControl(ChatControlBase): else: image = state_images[gc_contact.show] - name = gobject.markup_escape_text(gc_contact.name) + name = GLib.markup_escape_text(gc_contact.name) # Strike name if blocked fjid = self.room_jid + '/' + nick @@ -1479,14 +1489,14 @@ class GroupchatControl(ChatControlBase): colorstring = "#%04x%04x%04x" % (color.red, color.green, color.blue) name += ('\n<span size="small" style="italic" foreground="%s">' - '%s</span>') % (colorstring, gobject.markup_escape_text( + '%s</span>') % (colorstring, GLib.markup_escape_text( status)) - if image.get_storage_type() == gtk.IMAGE_PIXBUF and \ + if image.get_storage_type() == Gtk.ImageType.PIXBUF and \ gc_contact.affiliation != 'none' and gajim.config.get( 'show_affiliation_in_groupchat'): pixbuf1 = image.get_pixbuf().copy() - pixbuf2 = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, 4, 4) + pixbuf2 = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 4, 4) if gc_contact.affiliation == 'owner': pixbuf2.fill(0xff0000ff) # Red elif gc_contact.affiliation == 'admin': @@ -1495,8 +1505,8 @@ class GroupchatControl(ChatControlBase): pixbuf2.fill(0x00ff00ff) # Green pixbuf2.composite(pixbuf1, 12, 12, pixbuf2.get_property('width'), pixbuf2.get_property('height'), 0, 0, 1.0, 1.0, - gtk.gdk.INTERP_HYPER, 127) - image = gtk.image_new_from_pixbuf(pixbuf1) + GdkPixbuf.InterpType.HYPER, 127) + image = Gtk.Image.new_from_pixbuf(pixbuf1) self.model[iter_][C_IMG] = image self.model[iter_][C_TEXT] = name @@ -1509,9 +1519,11 @@ class GroupchatControl(ChatControlBase): fake_jid = self.room_jid + '/' + nick pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(fake_jid) if pixbuf in ('ask', None): - scaled_pixbuf = None + scaled_pixbuf = empty_pixbuf else: scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'roster') + if not scaled_pixbuf: + scaled_pixbuf = empty_pixbuf self.model[iter_][C_AVATAR] = scaled_pixbuf def draw_role(self, role): @@ -1912,9 +1924,9 @@ class GroupchatControl(ChatControlBase): return iter_ def get_role_iter(self, role): - role_iter = self.model.get_iter_root() + role_iter = self.model.get_iter_first() while role_iter: - role_name = self.model[role_iter][C_NICK].decode('utf-8') + role_name = self.model[role_iter][C_NICK] if role == role_name: return role_iter role_iter = self.model.iter_next(role_iter) @@ -1961,8 +1973,8 @@ class GroupchatControl(ChatControlBase): self.last_sent_msg = msg if self.correcting: self.correcting = False - self.msg_textview.modify_base(gtk.STATE_NORMAL, - self.old_message_tv_color) + self.msg_textview.override_background_color( + Gtk.StateType.NORMAL, self.old_message_tv_color) if self.correcting and self.last_sent_msg: correction_msg = self.last_sent_msg @@ -2073,7 +2085,7 @@ class GroupchatControl(ChatControlBase): gajim.config.set('gc-hpaned-position', self.hpaned.get_position()) # remove all register handlers on wigets, created by self.xml # to prevent circular references among objects - for i in self.handlers.keys(): + for i in list(self.handlers.keys()): if self.handlers[i].handler_is_connected(i): self.handlers[i].disconnect(i) del self.handlers[i] @@ -2202,7 +2214,7 @@ class GroupchatControl(ChatControlBase): reason, jid) # Ask for a reason - dialogs.DoubleInputDialog(_('Destroying %s') % u'\u200E' + \ + dialogs.DoubleInputDialog(_('Destroying %s') % '\u200E' + \ self.room_jid, _('You are going to definitively destroy this ' 'room.\nYou may specify a reason below:'), _('You may also enter an alternate venue:'), ok_handler=on_ok, @@ -2236,7 +2248,7 @@ class GroupchatControl(ChatControlBase): type_ = model[iter_][2] if type_ != 'contact': # source is not a contact return - contact_jid = data.decode('utf-8') + contact_jid = data gajim.connections[self.account].send_invite(self.room_jid, contact_jid) self.print_conversation(_('%(jid)s has been invited in this room') % { 'jid': contact_jid}, graphics=False) @@ -2250,7 +2262,7 @@ class GroupchatControl(ChatControlBase): # Textview is not sensitive, don't handle keypress return # construct event instance from binding - event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) # it's always a key-press here + event = Gdk.Event(Gdk.EventType.KEY_PRESS) # it's always a key-press here event.keyval = event_keyval event.state = event_keymod event.time = 0 # assign current time @@ -2258,7 +2270,7 @@ class GroupchatControl(ChatControlBase): message_buffer = widget.get_buffer() start_iter, end_iter = message_buffer.get_bounds() - if event.keyval == gtk.keysyms.Tab: # TAB + if event.keyval == Gdk.KEY_Tab: # TAB cursor_position = message_buffer.get_insert() end_iter = message_buffer.get_iter_at_mark(cursor_position) text = message_buffer.get_text(start_iter, end_iter, False).decode( @@ -2301,7 +2313,7 @@ class GroupchatControl(ChatControlBase): self.nick_hits = [] # clear the hit list list_nick = gajim.contacts.get_nick_list(self.account, self.room_jid) - list_nick.sort(key=unicode.lower) # case-insensitive sort + list_nick.sort(key=str.lower) # case-insensitive sort if begin == '': # empty message, show lasts nicks that highlighted us first for nick in self.attention_list: @@ -2373,7 +2385,7 @@ class GroupchatControl(ChatControlBase): self.last_key_tabs = False def on_list_treeview_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: selection = widget.get_selection() iter_ = selection.get_selected()[1] if iter_: @@ -2413,7 +2425,7 @@ class GroupchatControl(ChatControlBase): """ Make contact's popup menu """ - nick = self.model[iter_][C_NICK].decode('utf-8') + nick = self.model[iter_][C_NICK] c = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick) fjid = self.room_jid + '/' + nick jid = c.jid @@ -2498,9 +2510,13 @@ class GroupchatControl(ChatControlBase): muc_icon = gtkgui_helpers.load_icon('muc_active') if muc_icon: item.set_image(muc_icon) - if c.jid and c.name != self.nick: + if jid and c.name != self.nick: + bookmarked = False + contact = gajim.contacts.get_contact(self.account, jid, c.resource) + if contact and contact.supports(nbxmpp.NS_CONFERENCE): + bookmarked=True gui_menu_builder.build_invite_submenu(item, ((c, self.account),), - ignore_rooms=[self.room_jid]) + ignore_rooms=[self.room_jid], show_bookmarked=bookmarked) else: item.set_sensitive(False) @@ -2509,6 +2525,10 @@ class GroupchatControl(ChatControlBase): self.handlers[id_] = item item = xml.get_object('history_menuitem') + if gtkgui_helpers.gtk_icon_theme.has_icon('document-open-recent'): + img = Gtk.Image() + img.set_from_icon_name('document-open-recent', Gtk.IconSize.MENU) + item.set_image(img) id_ = item.connect('activate', self.on_history, nick) self.handlers[id_] = item @@ -2543,7 +2563,7 @@ class GroupchatControl(ChatControlBase): pixbuf = gtkgui_helpers.get_icon_pixmap('document-send', quiet=True) if not pixbuf: pixbuf = gtkgui_helpers.get_icon_pixmap('gajim-upload') - img = gtk.image_new_from_pixbuf(pixbuf) + img = Gtk.Image.new_from_pixbuf(pixbuf) item.set_image(img) if not c.resource: @@ -2555,7 +2575,8 @@ class GroupchatControl(ChatControlBase): # show the popup now! menu = xml.get_object('gc_occupants_menu') menu.show_all() - menu.popup(None, None, None, event.button, event.time) + menu.attach_to_widget(gajim.interface.roster.window, None) + menu.popup(None, None, None, None, event.button, event.time) def _start_private_message(self, nick): gc_c = gajim.contacts.get_gc_contact(self.account, self.room_jid, nick) @@ -2575,13 +2596,13 @@ class GroupchatControl(ChatControlBase): When an iter is activated (dubblick or single click if gnome is set this way """ - if len(path) == 1: # It's a group + if path.get_depth() == 1: # It's a group if (widget.row_expanded(path)): widget.collapse_row(path) else: widget.expand_row(path, False) else: # We want to send a private message - nick = self.model[path][C_NICK].decode('utf-8') + nick = self.model[path][C_NICK] self._start_private_message(nick) def on_list_treeview_row_activated(self, widget, path, col=0): @@ -2606,25 +2627,25 @@ class GroupchatControl(ChatControlBase): if event.button == 3: # right click widget.get_selection().select_path(path) iter_ = self.model.get_iter(path) - if len(path) == 2: + if path.get_depth() == 2: self.mk_menu(event, iter_) return True elif event.button == 2: # middle click widget.get_selection().select_path(path) iter_ = self.model.get_iter(path) - if len(path) == 2: - nick = self.model[iter_][C_NICK].decode('utf-8') + if path.get_depth() == 2: + nick = self.model[iter_][C_NICK] self._start_private_message(nick) return True elif event.button == 1: # left click - if gajim.single_click and not event.state & gtk.gdk.SHIFT_MASK: + if gajim.single_click and not event.get_state() & Gdk.ModifierType.SHIFT_MASK: self.on_row_activated(widget, path) return True else: iter_ = self.model.get_iter(path) - nick = self.model[iter_][C_NICK].decode('utf-8') + nick = self.model[iter_][C_NICK] if not nick in gajim.contacts.get_nick_list(self.account, self.room_jid): # it's a group @@ -2633,7 +2654,7 @@ class GroupchatControl(ChatControlBase): widget.collapse_row(path) else: widget.expand_row(path, False) - elif event.state & gtk.gdk.SHIFT_MASK: + elif event.get_state() & Gdk.ModifierType.SHIFT_MASK: self.append_nick_in_msg_textview(self.msg_textview, nick) self.msg_textview.grab_focus() return True @@ -2667,14 +2688,14 @@ class GroupchatControl(ChatControlBase): except Exception: self.tooltip.hide_tooltip() return - typ = self.model[iter_][C_TYPE].decode('utf-8') + typ = self.model[iter_][C_TYPE] if typ == 'contact': account = self.account if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: self.tooltip.id = row - nick = self.model[iter_][C_NICK].decode('utf-8') - self.tooltip.timeout = gobject.timeout_add(500, + nick = self.model[iter_][C_NICK] + self.tooltip.timeout = GLib.timeout_add(500, self.show_tooltip, gajim.contacts.get_gc_contact( account, self.room_jid, nick)) @@ -2685,16 +2706,18 @@ class GroupchatControl(ChatControlBase): self.tooltip.hide_tooltip() def show_tooltip(self, contact): - if not self.list_treeview.window: + if not self.list_treeview.get_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]) + w = self.list_treeview.get_window() + device = w.get_display().get_device_manager().get_client_pointer() + pointer = w.get_device_position(device) + props = self.list_treeview.get_path_at_pos(pointer[1], pointer[2]) # check if the current pointer is at the same path # as it was before setting the timeout if props and self.tooltip.id == props[0]: rect = self.list_treeview.get_cell_area(props[0], props[1]) - position = self.list_treeview.window.get_origin() + position = w.get_origin()[1:] self.tooltip.show_tooltip(contact, rect.height, position[1] + rect.y) else: @@ -2812,8 +2835,9 @@ class GroupchatControl(ChatControlBase): if fjid in connection.blocked_contacts: return max_order = connection.get_max_blocked_list_order() - new_rule = {'order': str(max_order + 1), 'type': u'jid', 'action': u'deny', - 'value' : fjid, 'child': [u'message', u'iq', u'presence-out']} + new_rule = {'order': str(max_order + 1), 'type': 'jid', + 'action': 'deny', 'value' : fjid, 'child': ['message', 'iq', + 'presence-out']} connection.blocked_list.append(new_rule) connection.blocked_contacts.append(fjid) self.draw_contact(nick) diff --git a/src/groups.py b/src/groups.py index 88d661ff2d882b6477ec3fcb2e0322764a1f28c5..d3bd70d3e2b8c6564563baacb74cdd69f9e8396c 100644 --- a/src/groups.py +++ b/src/groups.py @@ -64,7 +64,7 @@ class GroupsPostWindow: item.addChild('title', {}, [self.subject_entry.get_text()]) buf = self.contents_textview.get_buffer() - item.addChild('content', {}, [buf.get_text(buf.get_start_iter(), buf.get_end_iter())]) + item.addChild('content', {}, [buf.get_text(buf.get_start_iter(), buf.get_end_iter(), True)]) # publish it to node gajim.connections[self.account].send_pb_publish(self.servicejid, self.groupid, item, '0') diff --git a/src/gtkexcepthook.py b/src/gtkexcepthook.py index 45dfa94e7a8807798b9f5bab0075555d116d83d0..d448058d9f80562f1d491c09958db219be1b57ad 100644 --- a/src/gtkexcepthook.py +++ b/src/gtkexcepthook.py @@ -25,12 +25,13 @@ import os import traceback import threading -import gtk -import pango +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import Pango from common import i18n # installs _() function -import dialogs +from dialogs import HigDialog -from cStringIO import StringIO +from io import StringIO from common import helpers _exception_in_progress = threading.Lock() @@ -42,7 +43,7 @@ def _info(type_, value, tb): _excepthook_save(type_, value, tb) return - dialog = dialogs.HigDialog(None, gtk.MESSAGE_WARNING, gtk.BUTTONS_NONE, + dialog = HigDialog(None, Gtk.MessageType.WARNING, Gtk.ButtonsType.NONE, _('A programming error has been detected'), _('It probably is not fatal, but should be reported ' 'to the developers nonetheless.')) @@ -50,20 +51,20 @@ def _info(type_, value, tb): dialog.set_modal(False) #FIXME: add icon to this button RESPONSE_REPORT_BUG = 42 - dialog.add_buttons(gtk.STOCK_CLOSE, gtk.BUTTONS_CLOSE, + dialog.add_buttons(Gtk.STOCK_CLOSE, Gtk.ButtonsType.CLOSE, _('_Report Bug'), RESPONSE_REPORT_BUG) report_button = dialog.action_area.get_children()[0] # right to left report_button.grab_focus() # Details - textview = gtk.TextView() + textview = Gtk.TextView() textview.set_editable(False) - textview.modify_font(pango.FontDescription('Monospace')) - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + textview.override_font(Pango.FontDescription('Monospace')) + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.add(textview) - frame = gtk.Frame() - frame.set_shadow_type(gtk.SHADOW_IN) + frame = Gtk.Frame() + frame.set_shadow_type(Gtk.ShadowType.IN) frame.add(sw) frame.set_border_width(6) textbuffer = textview.get_buffer() @@ -71,15 +72,15 @@ def _info(type_, value, tb): traceback.print_exception(type_, value, tb, None, trace) textbuffer.set_text(trace.getvalue()) textview.set_size_request( - gtk.gdk.screen_width() / 3, - gtk.gdk.screen_height() / 4) - expander = gtk.Expander(_('Details')) + Gdk.Screen.width() / 3, + Gdk.Screen.height() / 4) + expander = Gtk.Expander(label=_('Details')) expander.add(frame) - dialog.vbox.add(expander) + dialog.vbox.pack_start(expander, True, True, 0) dialog.set_resizable(True) # on expand the details the dialog remains centered on screen - dialog.set_position(gtk.WIN_POS_CENTER_ALWAYS) + dialog.set_position(Gtk.WindowPosition.CENTER_ALWAYS) def on_dialog_response(dialog, response): if response == RESPONSE_REPORT_BUG: diff --git a/src/gtkgui_helpers.py b/src/gtkgui_helpers.py index 17b9f34be09d39a0f1a8c74cf6ef67341d577093..240666b3c94d2d5cf44cd151876256890303aabb 100644 --- a/src/gtkgui_helpers.py +++ b/src/gtkgui_helpers.py @@ -28,26 +28,29 @@ ## import xml.sax.saxutils -import gtk -import glib -import gobject -import pango +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf +from gi.repository import GObject +from gi.repository import Pango import os import sys +import importlib import logging log = logging.getLogger('gajim.gtkgui_helpers') from common import i18n from common import gajim +from common import pep -gtk_icon_theme = gtk.icon_theme_get_default() +gtk_icon_theme = Gtk.IconTheme.get_default() gtk_icon_theme.append_search_path(gajim.ICONS_DIR) def get_icon_pixmap(icon_name, size=16, quiet=False): try: return gtk_icon_theme.load_icon(icon_name, size, 0) - except gobject.GError, e: + except GObject.GError as e: if not quiet: log.error('Unable to load icon %s: %s' % (icon_name, str(e))) @@ -59,7 +62,7 @@ def get_icon_path(icon_name, size=16): return "" else: return icon_info.get_filename() - except gobject.GError, e: + except GObject.GError as e: log.error("Unable to find icon %s: %s" % (icon_name, str(e))) import vcard @@ -77,11 +80,11 @@ if os.name == 'nt': from common import helpers -screen_w = gtk.gdk.screen_width() -screen_h = gtk.gdk.screen_height() +screen_w = Gdk.Screen.width() +screen_h = Gdk.Screen.height() def add_image_to_menuitem(menuitem, icon_name): - img = gtk.Image() + img = Gtk.Image() path_img = get_icon_path(icon_name) img.set_from_file(path_img) menuitem.set_image(img) @@ -92,7 +95,7 @@ def add_image_to_button(button, icon_name): GUI_DIR = os.path.join(gajim.DATA_DIR, 'gui') def get_gtk_builder(file_name, widget=None): file_path = os.path.join(GUI_DIR, file_name) - builder = gtk.Builder() + builder = Gtk.Builder() builder.set_translation_domain(i18n.APP) if widget: builder.add_objects_from_file(file_path, [widget]) @@ -105,16 +108,13 @@ def get_completion_liststore(entry): Create a completion model for entry widget completion list consists of (Pixbuf, Text) rows """ - completion = gtk.EntryCompletion() - liststore = gtk.ListStore(gtk.gdk.Pixbuf, str) + completion = Gtk.EntryCompletion() + liststore = Gtk.ListStore(GdkPixbuf.Pixbuf, str) - render_pixbuf = gtk.CellRendererPixbuf() - completion.pack_start(render_pixbuf, expand = False) + render_pixbuf = Gtk.CellRendererPixbuf() + completion.pack_start(render_pixbuf, False) completion.add_attribute(render_pixbuf, 'pixbuf', 0) - render_text = gtk.CellRendererText() - completion.pack_start(render_text, expand = True) - completion.add_attribute(render_text, 'text', 1) completion.set_property('text_column', 1) completion.set_model(liststore) entry.set_completion(completion) @@ -125,23 +125,28 @@ def popup_emoticons_under_button(menu, button, parent_win): """ Popup the emoticons menu under button, which is in parent_win """ - window_x1, window_y1 = parent_win.get_origin() - def position_menu_under_button(menu): + window_x1, window_y1 = parent_win.get_origin()[1:] + + def position_menu_under_button(menu, data): # inline function, which will not keep refs, when used as CB - button_x, button_y = button.allocation.x, button.allocation.y + alloc = button.get_allocation() + button_x, button_y = alloc.x, alloc.y + translated_coordinates = button.translate_coordinates( + gajim.interface.roster.window, 0, 0) + if translated_coordinates: + button_x, button_y = translated_coordinates # now convert them to X11-relative window_x, window_y = window_x1, window_y1 x = window_x + button_x y = window_y + button_y - menu_height = menu.size_request()[1] + menu_height = menu.size_request().height ## should we pop down or up? - if (y + button.allocation.height + menu_height - < gtk.gdk.screen_height()): + if (y + alloc.height + menu_height < Gdk.Screen.height()): # now move the menu below the button - y += button.allocation.height + y += alloc.height else: # now move the menu above the button y -= menu_height @@ -150,21 +155,21 @@ def popup_emoticons_under_button(menu, button, parent_win): push_in = True return (x, y, push_in) - menu.popup(None, None, position_menu_under_button, 1, 0) + menu.popup(None, None, position_menu_under_button, None, 1, 0) def get_theme_font_for_option(theme, option): """ Return string description of the font, stored in theme preferences """ font_name = gajim.config.get_per('themes', theme, option) - font_desc = pango.FontDescription() + font_desc = Pango.FontDescription() font_prop_str = gajim.config.get_per('themes', theme, option + 'attrs') if font_prop_str: if font_prop_str.find('B') != -1: - font_desc.set_weight(pango.WEIGHT_BOLD) + font_desc.set_weight(Pango.Weight.BOLD) if font_prop_str.find('I') != -1: - font_desc.set_style(pango.STYLE_ITALIC) - fd = pango.FontDescription(font_name) + font_desc.set_style(Pango.Style.ITALIC) + fd = Pango.FontDescription(font_name) fd.merge(font_desc, True) return fd.to_string() @@ -174,11 +179,11 @@ def get_default_font(): Xfce and last KDE it returns None on failure or else a string 'Font Size' """ try: - from gconf import client_get_default - client = client_get_default() + from gi.repository import GConf + client = GConf.Client.get_default() value = client.get_string("/desktop/gnome/interface/font_name") return value.decode("utf8") - except ImportError, glib.GError: + except ImportError: pass # try to get Xfce default font @@ -189,7 +194,7 @@ def get_default_font(): if xdg_config_home == '': xdg_config_home = os.path.expanduser('~/.config') # default xfce_config_file = os.path.join(xdg_config_home, - 'xfce4/mcs_settings/gtk.xml') + 'xfce4/mcs_settings/Gtk.xml') kde_config_file = os.path.expanduser('~/.kde/share/config/kdeglobals') @@ -198,11 +203,11 @@ def get_default_font(): for line in open(xfce_config_file): if line.find('name="Gtk/FontName"') != -1: start = line.find('value="') + 7 - return line[start:line.find('"', start)].decode('utf-8') + return line[start:line.find('"', start)] except Exception: #we talk about file - print >> sys.stderr, _('Error: cannot open %s for reading') % \ - xfce_config_file + print(_('Error: cannot open %s for reading') % xfce_config_file, + file=sys.stderr) elif os.path.exists(kde_config_file): try: @@ -214,11 +219,11 @@ def get_default_font(): font_name = values[0] font_size = values[1] font_string = '%s %s' % (font_name, font_size) # Verdana 9 - return font_string.decode('utf-8') + return font_string except Exception: #we talk about file - print >> sys.stderr, _('Error: cannot open %s for reading') % \ - kde_config_file + print(_('Error: cannot open %s for reading') % kde_config_file, + file=sys.stderr) return None @@ -319,7 +324,7 @@ class HashDigest: def __str__(self): prettydigest = '' - for i in xrange(0, len(self.digest), 2): + for i in list(range(0, len(self.digest), 2)): prettydigest += self.digest[i:i + 2] + ':' return prettydigest[:-1] @@ -345,11 +350,11 @@ def parse_server_xml(path_to_file): xml.sax.parse(path_to_file, handler) return handler.servers # handle exception if unable to open file - except IOError, message: - print >> sys.stderr, _('Error reading file:'), message + except IOError as message: + print(_('Error reading file:') + str(message), file=sys.stderr) # handle exception parsing file - except xml.sax.SAXParseException, message: - print >> sys.stderr, _('Error parsing file:'), message + except xml.sax.SAXParseException as message: + print(_('Error parsing file:') + str(message), file=sys.stderr) def set_unset_urgency_hint(window, unread_messages_no): """ @@ -387,12 +392,12 @@ def get_abspath_for_script(scriptname, want_type = False): script += '\nexec python -OOt gajim.py $0 $@\n' f.write(script) f.close() - os.chmod(path_to_script, 0700) + os.chmod(path_to_script, 0o700) except OSError: # do not traceback (could be a permission problem) #we talk about a file here s = _('Could not write to %s. Session Management support will ' 'not work') % path_to_script - print >> sys.stderr, s + print(s, file=sys.stderr) else: # normal user (not svn user) type_ = 'install' @@ -407,15 +412,15 @@ def get_abspath_for_script(scriptname, want_type = False): def get_pixbuf_from_data(file_data, want_type = False): """ - Get image data and returns gtk.gdk.Pixbuf if want_type is True it also + Get image data and returns GdkPixbuf.Pixbuf if want_type is True it also returns 'jpeg', 'png' etc """ - pixbufloader = gtk.gdk.PixbufLoader() + pixbufloader = GdkPixbuf.PixbufLoader() try: pixbufloader.write(file_data) pixbufloader.close() pixbuf = pixbufloader.get_pixbuf() - except gobject.GError: # 'unknown image format' + except GObject.GError: # 'unknown image format' pixbufloader.close() pixbuf = None if want_type: @@ -424,15 +429,17 @@ def get_pixbuf_from_data(file_data, want_type = False): return None if want_type: - typ = pixbufloader.get_format()['name'] + typ = pixbufloader.get_format().get_name() return pixbuf, typ else: return pixbuf def get_invisible_cursor(): - pixmap = gtk.gdk.Pixmap(None, 1, 1, 1) - color = gtk.gdk.Color() - cursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0) + import cairo + s = cairo.ImageSurface(cairo.FORMAT_A1, 1, 1) + cursor_pixbuf = Gdk.pixbuf_get_from_surface(s, 0, 0, 1, 1) + cursor = Gdk.Cursor.new_from_pixbuf(Gdk.Display.get_default(), \ + cursor_pixbuf, 0, 0) return cursor def get_current_desktop(window): @@ -458,10 +465,16 @@ def possibly_move_window_in_current_desktop(window): NOTE: Window is a GDK window. """ + #TODO: property_get doesn't work: + #prop_atom = Gdk.Atom.intern('_NET_CURRENT_DESKTOP', False) + #type_atom = Gdk.Atom.intern("CARDINAL", False) + #w = Gdk.Screen.get_default().get_root_window() + #Gdk.property_get(w, prop_atom, type_atom, 0, 9999, False) + return False if os.name == 'nt': return False - root_window = gtk.gdk.screen_get_default().get_root_window() + root_window = Gdk.Screen.get_default().get_root_window() # current user's vd current_virtual_desktop_no = get_current_desktop(root_window) @@ -512,25 +525,24 @@ def file_is_locked(path_to_file): def get_fade_color(treeview, selected, focused): """ - Get a gdk color that is between foreground and background in 0.3 + Get a gdk RGBA color that is between foreground and background in 0.3 0.7 respectively colors of the cell for the given treeview """ - style = treeview.style + context = treeview.get_style_context() if selected: if focused: # is the window focused? - state = gtk.STATE_SELECTED + state = Gtk.StateFlags.SELECTED else: # is it not? NOTE: many gtk themes change bg on this - state = gtk.STATE_ACTIVE + state = Gtk.StateFlags.ACTIVE else: - state = gtk.STATE_NORMAL - bg = style.base[state] - fg = style.text[state] + state = Gtk.StateFlags.NORMAL + bg = context.get_background_color(state) + fg = context.get_color(state) p = 0.3 # background q = 0.7 # foreground # p + q should do 1.0 - return gtk.gdk.Color(int(bg.red*p + fg.red*q), - int(bg.green*p + fg.green*q), - int(bg.blue*p + fg.blue*q)) + return Gdk.RGBA(bg.red*p + fg.red*q, bg.green*p + fg.green*q, + bg.blue*p + fg.blue*q) def get_scaled_pixbuf(pixbuf, kind): """ @@ -558,7 +570,7 @@ def get_scaled_pixbuf(pixbuf, kind): else: h = height w = int(h * ratio) - scaled_buf = pixbuf.scale_simple(w, h, gtk.gdk.INTERP_HYPER) + scaled_buf = pixbuf.scale_simple(w, h, GdkPixbuf.InterpType.HYPER) return scaled_buf def get_avatar_pixbuf_from_cache(fjid, use_local=True): @@ -604,7 +616,7 @@ def get_avatar_pixbuf_from_cache(fjid, use_local=True): if not os.path.isfile(path): return 'ask' - vcard_dict = gajim.connections.values()[0].get_cached_vcard(fjid, + vcard_dict = list(gajim.connections.values())[0].get_cached_vcard(fjid, is_groupchat_contact) if not vcard_dict: # This can happen if cached vcard is too old return 'ask' @@ -631,7 +643,8 @@ def make_color_string(color): """ col = '#' for i in ('red', 'green', 'blue'): - h = hex(getattr(color, i) / (16*16)).split('x')[1] + h = hex(int(getattr(color, i) / (16*16))) + h = h.split('x')[1] if len(h) == 1: h = '0' + h col += h @@ -642,28 +655,6 @@ def make_pixbuf_grayscale(pixbuf): pixbuf.saturate_and_pixelate(pixbuf2, 0.0, False) return pixbuf2 -def get_path_to_generic_or_avatar(generic, jid = None, suffix = None): - """ - Choose between avatar image and default image - - Returns full path to the avatar image if it exists, otherwise returns full - path to the image. generic must be with extension and suffix without - """ - if jid: - # we want an avatar - puny_jid = helpers.sanitize_filename(jid) - path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + suffix - path_to_local_file = path_to_file + '_local' - for extension in ('.png', '.jpeg'): - path_to_local_file_full = path_to_local_file + extension - if os.path.exists(path_to_local_file_full): - return path_to_local_file_full - for extension in ('.png', '.jpeg'): - path_to_file_full = path_to_file + extension - if os.path.exists(path_to_file_full): - return path_to_file_full - return os.path.abspath(generic) - def decode_filechooser_file_paths(file_paths): """ Decode as UTF-8 under Windows and ask sys.getfilesystemencoding() in POSIX @@ -681,7 +672,7 @@ def decode_filechooser_file_paths(file_paths): file_path = file_path.decode(sys.getfilesystemencoding()) except Exception: try: - file_path = file_path.decode('utf-8') + file_path = file_path except Exception: pass file_paths_list.append(file_path) @@ -744,9 +735,9 @@ Description=xmpp gajim.config.set('check_if_gajim_is_default', False) try: - import gconf + GConf = importlib.import_module('gi.repository.GConf') # in try because daemon may not be there - client = gconf.client_get_default() + client = GConf.Client.get_default() except Exception: return @@ -787,7 +778,7 @@ def get_state_image_from_file_path_show(file_path, show): files = [] files.append(os.path.join(file_path, state_file + '.png')) files.append(os.path.join(file_path, state_file + '.gif')) - image = gtk.Image() + image = Gtk.Image() image.set_from_pixbuf(None) for file_ in files: if os.path.exists(file_): @@ -800,7 +791,7 @@ def get_possible_button_event(event): """ Mouse or keyboard caused the event? """ - if event.type == gtk.gdk.KEY_PRESS: + if event.type == Gdk.EventType.KEY_PRESS: return 0 # no event.button so pass 0 # BUTTON_PRESS event, so pass event.button return event.button @@ -825,14 +816,14 @@ def on_avatar_save_as_menuitem_activate(widget, jid, default_name=''): # Save image try: - pixbuf.save(file_path, image_format) - except glib.GError, e: + pixbuf.savev(file_path, image_format, [], []) + except Exception as e: log.debug('Error saving avatar: %s' % str(e)) if os.path.exists(file_path): os.remove(file_path) new_file_path = '.'.join(file_path.split('.')[:-1]) + '.jpeg' def on_ok(file_path, pixbuf): - pixbuf.save(file_path, 'jpeg') + pixbuf.savev(file_path, 'jpeg', [], []) dialogs.ConfirmationDialog(_('Extension not supported'), _('Image cannot be saved in %(type)s format. Save as ' '%(new_filename)s?') % {'type': image_format, @@ -854,8 +845,8 @@ def on_avatar_save_as_menuitem_activate(widget, jid, default_name=''): return dialog2 = dialogs.FTOverwriteConfirmationDialog( _('This file already exists'), _('What do you want to do?'), - propose_resume=False, on_response=(on_continue, file_path)) - dialog2.set_transient_for(dialog) + propose_resume=False, on_response=(on_continue, file_path), + transient_for=dialog) dialog2.set_destroy_with_parent(True) else: dirname = os.path.dirname(file_path) @@ -871,9 +862,9 @@ def on_avatar_save_as_menuitem_activate(widget, jid, default_name=''): dialog.destroy() dialog = dialogs.FileChooserDialog(title_text=_('Save Image as...'), - action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL, - gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK), - default_response=gtk.RESPONSE_OK, + action=Gtk.FileChooserAction.SAVE, buttons=(Gtk.STOCK_CANCEL, + Gtk.ResponseType.CANCEL, Gtk.STOCK_SAVE, Gtk.ResponseType.OK), + default_response=Gtk.ResponseType.OK, current_folder=gajim.config.get('last_save_dir'), on_response_ok=on_ok, on_response_cancel=on_cancel) @@ -882,15 +873,15 @@ def on_avatar_save_as_menuitem_activate(widget, jid, default_name=''): on_cancel(widget)) def on_bm_header_changed_state(widget, event): - widget.set_state(gtk.STATE_NORMAL) #do not allow selected_state + widget.set_state(Gtk.StateType.NORMAL) #do not allow selected_state def create_combobox(value_list, selected_value = None): """ Value_list is [(label1, value1)] """ - liststore = gtk.ListStore(str, str) - combobox = gtk.ComboBox(liststore) - cell = gtk.CellRendererText() + liststore = Gtk.ListStore(str, str) + combobox = Gtk.ComboBox.new_with_model(liststore) + cell = Gtk.CellRendererText() combobox.pack_start(cell, True) combobox.add_attribute(cell, 'text', 0) i = -1 @@ -907,14 +898,14 @@ def create_list_multi(value_list, selected_values=None): """ Value_list is [(label1, value1)] """ - liststore = gtk.ListStore(str, str) - treeview = gtk.TreeView(liststore) - treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + liststore = Gtk.ListStore(str, str) + treeview = Gtk.TreeView.new_with_model(liststore) + treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) treeview.set_headers_visible(False) - col = gtk.TreeViewColumn() + col = Gtk.TreeViewColumn() treeview.append_column(col) - cell = gtk.CellRendererText() - col.pack_start(cell, True) + cell = Gtk.CellRendererText() + col.pack_start(cell, True, True, 0) col.set_attributes(cell, text=0) for value in value_list: iter = liststore.append(value) @@ -971,6 +962,44 @@ def load_activity_icon(category, activity = None): icon_list = _load_icon_list([activity], path) return icon_list[activity] +def get_pep_as_pixbuf(pep_class): + if isinstance(pep_class, pep.UserMoodPEP): + assert not pep_class._retracted + received_mood = pep_class._pep_specific_data['mood'] + mood = received_mood if received_mood in pep.MOODS else 'unknown' + pixbuf = load_mood_icon(mood).get_pixbuf() + return pixbuf + elif isinstance(pep_class, pep.UserTunePEP): + icon = get_icon_pixmap('audio-x-generic', quiet=True) + if not icon: + path = os.path.join(gajim.DATA_DIR, 'emoticons', 'static', + 'music.png') + return GdkPixbuf.Pixbuf.new_from_file(path) + return icon + elif isinstance(pep_class, pep.UserActivityPEP): + assert not pep_class._retracted + pep_ = pep_class._pep_specific_data + activity = pep_['activity'] + + has_known_activity = activity in pep.ACTIVITIES + has_known_subactivity = (has_known_activity and ('subactivity' in pep_) + and (pep_['subactivity'] in pep.ACTIVITIES[activity])) + + if has_known_activity: + if has_known_subactivity: + subactivity = pep_['subactivity'] + return load_activity_icon(activity, subactivity).get_pixbuf() + else: + return load_activity_icon(activity).get_pixbuf() + else: + return load_activity_icon('unknown').get_pixbuf() + elif isinstance(pep_class, pep.UserLocationPEP): + icon = get_icon_pixmap('applications-internet', quiet=True) + if not icon: + icon = get_icon_pixmap('gajim-earth') + return icon + return None + def load_icons_meta(): """ Load and return - AND + small icons to put on top left of an icon for meta @@ -983,7 +1012,7 @@ def load_icons_meta(): if not os.path.isfile(path_opened): path_opened = os.path.join(path, 'opened.png') if os.path.isfile(path_opened): - pixo = gtk.gdk.pixbuf_new_from_file(path_opened) + pixo = GdkPixbuf.Pixbuf.new_from_file(path_opened) else: pixo = None # Same thing for closed @@ -991,7 +1020,7 @@ def load_icons_meta(): if not os.path.isfile(path_closed): path_closed = os.path.join(path, 'closed.png') if os.path.isfile(path_closed): - pixc = gtk.gdk.pixbuf_new_from_file(path_closed) + pixc = GdkPixbuf.Pixbuf.new_from_file(path_closed) else: pixc = None return pixo, pixc @@ -1008,19 +1037,19 @@ def _load_icon_list(icons_list, path, pixbuf2 = None): files = [] files.append(path + icon_file + '.gif') files.append(path + icon_file + '.png') - image = gtk.Image() + image = Gtk.Image() image.show() imgs[icon] = image for file_ in files: # loop seeking for either gif or png if os.path.exists(file_): image.set_from_file(file_) - if pixbuf2 and image.get_storage_type() == gtk.IMAGE_PIXBUF: + if pixbuf2 and image.get_storage_type() == Gtk.ImageType.PIXBUF: # add pixbuf2 on top-left corner of image pixbuf1 = image.get_pixbuf() pixbuf2.composite(pixbuf1, 0, 0, pixbuf2.get_property('width'), pixbuf2.get_property('height'), 0, 0, 1.0, 1.0, - gtk.gdk.INTERP_NEAREST, 255) + GdkPixbuf.InterpType.NEAREST, 255) image.set_from_pixbuf(pixbuf1) break return imgs @@ -1059,21 +1088,21 @@ def make_jabber_state_images(): else: # Resize 32x32 icons to 24x24 for each in gajim.interface.jabber_state_images['32']: - img = gtk.Image() + img = Gtk.Image() pix = gajim.interface.jabber_state_images['32'][each] pix_type = pix.get_storage_type() - if pix_type == gtk.IMAGE_ANIMATION: + if pix_type == Gtk.ImageType.ANIMATION: animation = pix.get_animation() pixbuf = animation.get_static_image() - elif pix_type == gtk.IMAGE_EMPTY: + elif pix_type == Gtk.ImageType.EMPTY: pix = gajim.interface.jabber_state_images['16'][each] pix_16_type = pix.get_storage_type() - if pix_16_type == gtk.IMAGE_ANIMATION: + if pix_16_type == Gtk.ImageType.ANIMATION: animation = pix.get_animation() pixbuf = animation.get_static_image() else: pixbuf = pix.get_pixbuf() - scaled_pix = pixbuf.scale_simple(24, 24, gtk.gdk.INTERP_BILINEAR) + scaled_pix = pixbuf.scale_simple(24, 24, GdkPixbuf.InterpType.BILINEAR) img.set_from_pixbuf(scaled_pix) gajim.interface.jabber_state_images['24'][each] = img @@ -1086,11 +1115,11 @@ def label_set_autowrap(widget): Make labels automatically re-wrap if their containers are resized. Accepts label or container widgets """ - if isinstance (widget, gtk.Container): + if isinstance (widget, Gtk.Container): children = widget.get_children() - for i in xrange (len (children)): + for i in list(range (len (children))): label_set_autowrap(children[i]) - elif isinstance(widget, gtk.Label): + elif isinstance(widget, Gtk.Label): widget.set_line_wrap(True) widget.connect_after('size-allocate', __label_size_allocate) @@ -1102,13 +1131,13 @@ def __label_size_allocate(widget, allocation): lw_old, lh_old = layout.get_size() # fixed width labels - if lw_old/pango.SCALE == allocation.width: + if lw_old/Pango.SCALE == allocation.width: return - # set wrap width to the pango.Layout of the labels ### + # set wrap width to the Pango.Layout of the labels ### widget.set_alignment(0.0, 0.0) - layout.set_width (allocation.width * pango.SCALE) + layout.set_width (allocation.width * Pango.SCALE) lh = layout.get_size()[1] if lh_old != lh: - widget.set_size_request (-1, lh / pango.SCALE) + widget.set_size_request (-1, lh / Pango.SCALE) diff --git a/src/gtkspell.py b/src/gtkspell.py index aa1adaec7d5845d3e8ff616cdf811c350ad6cae1..9d334c5296c101df5a5a40c54d37e8b08e88f76c 100644 --- a/src/gtkspell.py +++ b/src/gtkspell.py @@ -19,7 +19,7 @@ import ctypes import ctypes.util -import gtk +from gi.repository import Gtk gboolean = ctypes.c_int @@ -63,14 +63,15 @@ def ensure_attached(func): class Spell(object): def __init__(self, textview, language=None, create=True): - if not isinstance(textview, gtk.TextView): - raise TypeError("Textview must be derived from gtk.TextView") + if not isinstance(textview, Gtk.TextView): + raise TypeError("Textview must be derived from Gtk.TextView") tv = PyGObject.from_address(id(textview)).obj spell = libgtkspell.gtkspell_get_from_text_view(tv) if create: if spell: raise RuntimeError("Textview has already a Spell obj attached") - self.spell = libgtkspell.gtkspell_new_attach(tv, language, None) + self.spell = libgtkspell.gtkspell_new_attach(tv, language.encode( + 'utf-8'), None) if not self.spell: raise OSError("Unable to attach spell object. " "Language: '%s'" % str(language)) @@ -82,7 +83,8 @@ class Spell(object): @ensure_attached def set_language(self, language): - if libgtkspell.gtkspell_set_language(self.spell, language, None) == 0: + if libgtkspell.gtkspell_set_language(self.spell, language.encode( + 'utf-8'), None) == 0: raise OSError("Unable to set language '%s'" % str(language)) @ensure_attached diff --git a/src/gui_interface.py b/src/gui_interface.py index ef50cd5d6518f637d0c9995f60a89e1a39edec73..63f051f19ee81acc6473391f15cd43e7adda57e5 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -41,8 +41,9 @@ import time import math from subprocess import Popen -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import GdkPixbuf +from gi.repository import GLib from common import i18n from common import gajim @@ -67,7 +68,7 @@ from groupchat_control import PrivateChatControl from atom_window import AtomWindow from session import ChatControlSession -import common.sleepy +from common import sleepy from nbxmpp import idlequeue from nbxmpp import Hashes @@ -93,7 +94,7 @@ import config from threading import Thread from common import ged -gajimpaths = common.configpaths.gajimpaths +from common.configpaths import gajimpaths config_filename = gajimpaths['CONFIG_FILE'] from common import optparser @@ -164,7 +165,7 @@ class Interface: def handle_event_iq_error(self, obj): #('ERROR_ANSWER', account, (id_, fjid, errmsg, errcode)) - if unicode(obj.errcode) in ('400', '403', '406') and obj.id_: + if str(obj.errcode) in ('400', '403', '406') and obj.id_: # show the error dialog ft = self.instances['file_transfers'] sid = obj.id_ @@ -172,7 +173,7 @@ class Interface: sid = obj.id_[3:] file_props = FilesProp.getFileProp(obj.conn.name, sid) if file_props : - if unicode(obj.errcode) == '400': + if str(obj.errcode) == '400': file_props.error = -3 else: file_props.error = -4 @@ -181,7 +182,7 @@ class Interface: error_msg=obj.errmsg)) obj.conn.disconnect_transfer(file_props) return - elif unicode(obj.errcode) == '404': + elif str(obj.errcode) == '404': sid = obj.id_ if len(obj.id_) > 3 and obj.id_[2] == '_': sid = obj.id_[3:] @@ -210,7 +211,7 @@ class Interface: #('STATUS', account, show) account = obj.conn.name if obj.show in ('offline', 'error'): - for name in self.instances[account]['online_dialog'].keys(): + for name in list(self.instances[account]['online_dialog'].keys()): # .keys() is needed to not have a dictionary length changed # during iteration error self.instances[account]['online_dialog'][name].destroy() @@ -229,8 +230,8 @@ class Interface: # we stop blocking notifications of any kind # this prevents from getting the roster items as 'just signed in' # contacts. 30 seconds should be enough time - gobject.timeout_add_seconds(30, - self.unblock_signed_in_notifications, account) + GLib.timeout_add_seconds(30, self.unblock_signed_in_notifications, + account) if account in self.show_vcard_when_connect and obj.show not in ( 'offline', 'error'): @@ -370,8 +371,8 @@ class Interface: # popup notifications for 30s account_jid = account + '/' + jid gajim.block_signed_in_notifications[account_jid] = True - gobject.timeout_add_seconds(30, - self.unblock_signed_in_notifications, account_jid) + GLib.timeout_add_seconds(30, self.unblock_signed_in_notifications, + account_jid) highest = gajim.contacts.get_contact_with_highest_priority(account, jid) is_highest = (highest and highest.resource == resource) @@ -449,7 +450,7 @@ class Interface: if not obj.session: # No session. This can happen when sending a message from # gajim-remote - log.warn(msg) + log.warning(msg) return obj.session.roster_message(obj.jid, msg, obj.time_, obj.conn.name, msg_type='error') @@ -695,7 +696,7 @@ class Interface: #('GPG_ALWAYS_TRUST', account, callback) def on_yes(checked): if checked: - obj.conn.gpg.always_trust = True + obj.conn.gpg.always_trust.append(obj.keyID) obj.callback(True) def on_no(): @@ -960,7 +961,7 @@ class Interface: ft_win = self.instances['file_transfers'] if not file_props.hash_: # We disn't get the hash, sender probably don't support that - jid = unicode(file_props.sender) + jid = file_props.sender self.popup_ft_result(account, jid, file_props) ft_win.set_status(file_props, 'ok') h = Hashes() @@ -972,15 +973,15 @@ class Interface: file_.close() # If the hash we received and the hash of the file are the same, # then the file is not corrupt - jid = unicode(file_props.sender) + jid = file_props.sender if file_props.hash_ == hash_: - gobject.idle_add(self.popup_ft_result, account, jid, file_props) - gobject.idle_add(ft_win.set_status, file_props, 'ok') + GLib.idle_add(self.popup_ft_result, account, jid, file_props) + GLib.idle_add(ft_win.set_status, file_props, 'ok') else: # wrong hash, we need to get the file again! file_props.error = -10 - gobject.idle_add(self.popup_ft_result, account, jid, file_props) - gobject.idle_add(ft_win.set_status, file_props, 'hash_error') + GLib.idle_add(self.popup_ft_result, account, jid, file_props) + GLib.idle_add(ft_win.set_status, file_props, 'hash_error') # End jingle session if session: session.end_session() @@ -996,15 +997,15 @@ class Interface: return if file_props.type_ == 'r' and file_props.hash_: # we receive a file + gajim.socks5queue.remove_receiver(file_props.sid, True, True) # we compare hashes if file_props.session_type == 'jingle': # Compare hashes in a new thread self.hashThread = Thread(target=self.__compare_hashes, args=(account, file_props)) self.hashThread.start() - gajim.socks5queue.remove_receiver(file_props.sid, True, True) else: # we send a file - jid = unicode(file_props.receiver) + jid = file_props.receiver gajim.socks5queue.remove_sender(file_props.sid, True, True) self.popup_ft_result(account, jid, file_props) @@ -1022,6 +1023,9 @@ class Interface: error_msg=_('Error opening file')) elif file_props.error == -10: ft.show_hash_error(jid, file_props, account) + elif file_props.error == -12: + ft.show_stopped(jid, file_props, + error_msg=_('SSL certificate error')) return msg_type = '' @@ -1051,7 +1055,7 @@ class Interface: if file_props is not None: if file_props.type_ == 'r': # get the name of the sender, as it is in the roster - sender = unicode(file_props.sender).split('/')[0] + sender = file_props.sender.split('/')[0] name = gajim.contacts.get_first_contact_from_jid(account, sender).get_shown_name() filename = os.path.basename(file_props.file_name) @@ -1119,12 +1123,12 @@ class Interface: if gajim.config.get('ask_offline_status_on_connection'): # Ask offline status in 1 minute so w'are sure we got all online # presences - gobject.timeout_add_seconds(60, self.ask_offline_status, account) - if state != common.sleepy.STATE_UNKNOWN and connected in (2, 3): + GLib.timeout_add_seconds(60, self.ask_offline_status, account) + if state != sleepy.STATE_UNKNOWN and connected in (2, 3): # we go online or free for chat, so we activate auto status gajim.sleeper_state[account] = 'online' - elif not ((state == common.sleepy.STATE_AWAY and connected == 4) or \ - (state == common.sleepy.STATE_XA and connected == 5)): + elif not ((state == sleepy.STATE_AWAY and connected == 4) or \ + (state == sleepy.STATE_XA and connected == 5)): # If we are autoaway/xa and come back after a disconnection, do # nothing # Else disable autoaway @@ -1175,7 +1179,7 @@ class Interface: dlg = dialogs.InputDialog(_('Username Conflict'), _('Please type a new username for your local account'), input_str=obj.alt_name, is_modal=True, ok_handler=on_ok, - cancel_handler=on_cancel) + cancel_handler=on_cancel, transient_for=self.roster.window) def handle_event_resource_conflict(self, obj): # ('RESOURCE_CONFLICT', account, ()) @@ -1567,7 +1571,7 @@ class Interface: This is part of rewriting whole events handling system to use GED. """ - for event_name, event_handlers in self.handlers.iteritems(): + for event_name, event_handlers in self.handlers.items(): for event_handler in event_handlers: prio = ged.GUI1 if type(event_handler) == tuple: @@ -1688,6 +1692,8 @@ class Interface: event = gajim.events.get_first_event(account, fjid, type_) if not event: event = gajim.events.get_first_event(account, jid, type_) + if not event: + return if type_ == 'printed_pm': ctrl = event.parameters[2] @@ -1757,7 +1763,7 @@ class Interface: self.roster.draw_contact(jid, account) if w: w.set_active_tab(ctrl) - w.window.window.focus(gtk.get_current_event_time()) + w.window.get_window().focus(Gtk.get_current_event_time()) # Using isinstance here because we want to catch all derived types if isinstance(ctrl, ChatControlBase): tv = ctrl.conv_textview @@ -1770,13 +1776,13 @@ class Interface: def image_is_ok(self, image): if not os.path.exists(image): return False - img = gtk.Image() + img = Gtk.Image() try: img.set_from_file(image) except Exception: return False t = img.get_storage_type() - if t != gtk.IMAGE_PIXBUF and t != gtk.IMAGE_ANIMATION: + if t != Gtk.ImageType.PIXBUF and t != Gtk.ImageType.ANIMATION: return False return True @@ -1874,7 +1880,6 @@ class Interface: emoticons_pattern_postmatch = '' emoticon_length = 0 for emoticon in keys: # travel thru emoticons list - emoticon = emoticon.decode('utf-8') emoticon_escaped = re.escape(emoticon) # espace regexp metachars # | means or in regexp emoticons_pattern += emoticon_escaped + '|' @@ -1906,8 +1911,8 @@ class Interface: self.sth_at_sth_dot_sth = r'\S+@\S+\.\S*[^\s)?]' # Invalid XML chars - self.invalid_XML_chars = u'[\x00-\x08]|[\x0b-\x0c]|[\x0e-\x1f]|'\ - u'[\ud800-\udfff]|[\ufffe-\uffff]' + self.invalid_XML_chars = '[\x00-\x08]|[\x0b-\x0c]|[\x0e-\x1f]|'\ + '[\ud800-\udfff]|[\ufffe-\uffff]' def popup_emoticons_under_button(self, button, parent_win): """ @@ -1917,7 +1922,7 @@ class Interface: button, parent_win) def prepare_emoticons_menu(self): - menu = gtk.Menu() + menu = Gtk.Menu() def emoticon_clicked(w, str_): if self.emoticon_menuitem_clicked: self.emoticon_menuitem_clicked(str_) @@ -1932,12 +1937,15 @@ class Interface: # Calculate the side lenght of the popup to make it a square size = int(round(math.sqrt(len(self.emoticons_images)))) for image in self.emoticons_images: - item = gtk.MenuItem() - img = gtk.Image() - if isinstance(image[1], gtk.gdk.PixbufAnimation): + # In Gtk 3.6, Gtk.MenuItem() doesn't contain a label child + item = Gtk.MenuItem('q') + img = Gtk.Image() + if isinstance(image[1], GdkPixbuf.PixbufAnimation): img.set_from_animation(image[1]) else: img.set_from_pixbuf(image[1]) + c = item.get_child() + item.remove(c) item.add(img) item.connect('activate', emoticon_clicked, image[0]) # add tooltip with ascii @@ -1955,26 +1963,30 @@ class Interface: self.emoticons = dict() self.emoticons_animations = dict() - sys.path.append(path) + sys.path.insert(0, path) import emoticons - if need_reload: - # we need to reload else that doesn't work when changing emoticon - # set - reload(emoticons) - emots = emoticons.emoticons + try: + if need_reload: + # we need to reload else that doesn't work when changing + # emoticons set + import imp + imp.reload(emoticons) + emots = emoticons.emoticons + except Exception as e: + return True for emot_filename in emots: emot_file = os.path.join(path, emot_filename) if not self.image_is_ok(emot_file): continue for emot in emots[emot_filename]: - emot = emot.decode('utf-8') + emot = emot # This avoids duplicated emoticons with the same image eg. :) # and :-) if not emot_file in self.emoticons.values(): if emot_file.endswith('.gif'): - pix = gtk.gdk.PixbufAnimation(emot_file) + pix = GdkPixbuf.PixbufAnimation.new_from_file(emot_file) else: - pix = gtk.gdk.pixbuf_new_from_file_at_size(emot_file, + pix = GdkPixbuf.Pixbuf.new_from_file_at_size(emot_file, 16, 16) self.emoticons_images.append((emot, pix)) self.emoticons[emot.upper()] = emot_file @@ -1986,6 +1998,10 @@ class Interface: if not emot_theme: return + transient_for = None + if 'preferences' in gajim.interface.instances: + transient_for = gajim.interface.instances['preferences'].window + path = os.path.join(gajim.DATA_DIR, 'emoticons', emot_theme) if not os.path.exists(path): # It's maybe a user theme @@ -1994,10 +2010,18 @@ class Interface: # theme doesn't exist, disable emoticons dialogs.WarningDialog(_('Emoticons disabled'), _('Your configured emoticons theme has not been found, so ' - 'emoticons have been disabled.')) + 'emoticons have been disabled.'), + transient_for=transient_for) gajim.config.set('emoticons_theme', '') return - self._init_emoticons(path, need_reload) + if self._init_emoticons(path, need_reload): + dialogs.WarningDialog(_('Emoticons disabled'), + _('Your configured emoticons theme cannot been loaded. You ' + 'maybe need to update the format of emoticons.py file. See ' + 'http://trac.gajim.org/wiki/Emoticons for more details.'), + transient_for=transient_for) + gajim.config.set('emoticons_theme', '') + return if len(self.emoticons) == 0: # maybe old format of emoticons file, try to convert it try: @@ -2018,7 +2042,9 @@ class Interface: dialogs.WarningDialog(_('Emoticons disabled'), _('Your configured emoticons theme cannot been loaded. You ' 'maybe need to update the format of emoticons.py file. See ' - 'http://trac.gajim.org/wiki/Emoticons for more details.')) + 'http://trac.gajim.org/wiki/Emoticons for more details.'), + transient_for=transient_for) + gajim.config.set('emoticons_theme', '') if self.emoticons_menu: self.emoticons_menu.destroy() self.emoticons_menu = self.prepare_emoticons_menu() @@ -2100,6 +2126,7 @@ class Interface: gc_control = GroupchatControl(mw, contact, account, is_continued=is_continued) mw.new_tab(gc_control) + mw.set_active_tab(gc_control) def new_private_chat(self, gc_contact, account, session=None): conn = gajim.connections[account] @@ -2187,7 +2214,7 @@ class Interface: # For JEP-0172 if added_to_roster: ctrl.user_nick = gajim.nicks[account] - gobject.idle_add(mw.window.grab_focus) + GLib.idle_add(mw.window.grab_focus) return ctrl @@ -2295,38 +2322,6 @@ class Interface: gajim.connections[acct].send_tune(artist, title, source) gajim.connections[acct].music_track_info = music_track_info - def get_bg_fg_colors(self): - def gdkcolor_to_rgb (gdkcolor): - return [c / 65535. for c in (gdkcolor.red, gdkcolor.green, - gdkcolor.blue)] - - def format_rgb (r, g, b): - return ' '.join([str(c) for c in ('rgb', r, g, b)]) - - def format_gdkcolor (gdkcolor): - return format_rgb (*gdkcolor_to_rgb (gdkcolor)) - - # get style colors and create string for dvipng - dummy = gtk.Invisible() - dummy.ensure_style() - style = dummy.get_style() - bg_str = format_gdkcolor(style.base[gtk.STATE_NORMAL]) - fg_str = format_gdkcolor(style.text[gtk.STATE_NORMAL]) - return (bg_str, fg_str) - - def get_fg_color(self, fmt='hex'): - def format_gdkcolor (c): - if fmt == 'tex': - return ' '.join([str(s) for s in - ('rgb', c.red_float, c.green_float, c.blue_float)]) - elif fmt == 'hex': - return str(c) - - # get foreground style color and create string - dummy = gtk.Invisible() - dummy.ensure_style() - return format_gdkcolor(dummy.get_style().text[gtk.STATE_NORMAL]) - def read_sleepy(self): """ Check idle status and change that status if needed @@ -2339,14 +2334,14 @@ class Interface: if account not in gajim.sleeper_state or \ not gajim.sleeper_state[account]: continue - if state == common.sleepy.STATE_AWAKE and \ + if state == sleepy.STATE_AWAKE and \ gajim.sleeper_state[account] in ('autoaway', 'autoxa'): # we go online self.roster.send_status(account, 'online', gajim.status_before_autoaway[account]) gajim.status_before_autoaway[account] = '' gajim.sleeper_state[account] = 'online' - elif state == common.sleepy.STATE_AWAY and \ + elif state == sleepy.STATE_AWAY and \ gajim.sleeper_state[account] == 'online' and \ gajim.config.get('autoaway'): # we save out online status @@ -2366,7 +2361,7 @@ class Interface: self.roster.send_status(account, 'away', auto_message, auto=True) gajim.sleeper_state[account] = 'autoaway' - elif state == common.sleepy.STATE_XA and \ + elif state == sleepy.STATE_XA and \ gajim.sleeper_state[account] in ('online', 'autoaway', 'autoaway-forced') and gajim.config.get('autoxa'): # we go extended away [we pass True to auto param] @@ -2435,16 +2430,16 @@ class Interface: # Otherwise, an exception will stop our loop timeout, in_seconds = gajim.idlequeue.PROCESS_TIMEOUT if in_seconds: - gobject.timeout_add_seconds(timeout, self.process_connections) + GLib.timeout_add_seconds(timeout, self.process_connections) else: - gobject.timeout_add(timeout, self.process_connections) + GLib.timeout_add(timeout, self.process_connections) raise return True # renew timeout (loop for ever) def save_config(self): err_str = parser.write() if err_str is not None: - print >> sys.stderr, err_str + print(err_str, file=sys.stderr) # it is good to notify the user # in case he or she cannot see the output of the console dialogs.ErrorDialog(_('Could not save your settings and ' @@ -2487,8 +2482,8 @@ class Interface: extension = '.png' path_to_original_file = path_to_file + extension try: - pixbuf.save(path_to_original_file, typ) - except Exception, e: + pixbuf.savev(path_to_original_file, typ, [], []) + except Exception as e: log.error('Error writing avatar file %s: %s' % ( path_to_original_file, str(e))) # Generate and save the resized, color avatar @@ -2497,8 +2492,8 @@ class Interface: path_to_normal_file = path_to_file + '_notif_size_colored' + \ extension try: - pixbuf.save(path_to_normal_file, 'png') - except Exception, e: + pixbuf.savev(path_to_normal_file, 'png', [], []) + except Exception as e: log.error('Error writing avatar file %s: %s' % \ (path_to_original_file, str(e))) # Generate and save the resized, black and white avatar @@ -2507,8 +2502,8 @@ class Interface: if bwbuf: path_to_bw_file = path_to_file + '_notif_size_bw' + extension try: - bwbuf.save(path_to_bw_file, 'png') - except Exception, e: + bwbuf.savev(path_to_bw_file, 'png', [], []) + except Exception as e: log.error('Error writing avatar file %s: %s' % \ (path_to_original_file, str(e))) @@ -2639,23 +2634,23 @@ class Interface: try: from ipython_view import IPythonView except ImportError: - print 'ipython_view not found' + print('ipython_view not found') return - import pango + from gi.repository import Pango if os.name == 'nt': font = 'Lucida Console 9' else: font = 'Luxi Mono 10' - window = gtk.Window() + window = Gtk.Window() window.set_size_request(750, 550) window.set_resizable(True) - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) view = IPythonView() - view.modify_font(pango.FontDescription(font)) - view.set_wrap_mode(gtk.WRAP_CHAR) + view.override_font(Pango.FontDescription(font)) + view.set_wrap_mode(Gtk.WrapMode.CHAR) sw.add(view) window.add(sw) window.show_all() @@ -2683,18 +2678,18 @@ class Interface: # get instances for windows/dialogs that will show_all()/hide() self.instances['file_transfers'] = dialogs.FileTransfersWindow() - gobject.timeout_add(100, self.autoconnect) + GLib.timeout_add(100, self.autoconnect) timeout, in_seconds = gajim.idlequeue.PROCESS_TIMEOUT if in_seconds: - gobject.timeout_add_seconds(timeout, self.process_connections) + GLib.timeout_add_seconds(timeout, self.process_connections) else: - gobject.timeout_add(timeout, self.process_connections) - gobject.timeout_add_seconds(gajim.config.get( + GLib.timeout_add(timeout, self.process_connections) + GLib.timeout_add_seconds(gajim.config.get( 'check_idle_every_foo_seconds'), self.read_sleepy) # when using libasyncns we need to process resolver in regular intervals if resolver.USE_LIBASYNCNS: - gobject.timeout_add(200, gajim.resolver.process) + GLib.timeout_add(200, gajim.resolver.process) def remote_init(): if gajim.config.get('remote_control'): @@ -2703,7 +2698,7 @@ class Interface: self.remote_ctrl = remote_control.Remote() except Exception: pass - gobject.timeout_add_seconds(5, remote_init) + GLib.timeout_add_seconds(5, remote_init) def __init__(self): gajim.interface = self @@ -2764,8 +2759,8 @@ class Interface: break # Is gnome configured to activate row on single click ? try: - import gconf - client = gconf.client_get_default() + from gi.repository import GConf + client = GConf.Client.get_default() click_policy = client.get_string( '/apps/nautilus/preferences/click_policy') if click_policy == 'single': @@ -2848,9 +2843,9 @@ class Interface: gajim.connections[account] = Connection(account) # gtk hooks - gtk.about_dialog_set_email_hook(self.on_launch_browser_mailer, 'mail') - gtk.about_dialog_set_url_hook(self.on_launch_browser_mailer, 'url') - gtk.link_button_set_uri_hook(self.on_launch_browser_mailer, 'url') +# Gtk.about_dialog_set_email_hook(self.on_launch_browser_mailer, 'mail') +# Gtk.about_dialog_set_url_hook(self.on_launch_browser_mailer, 'url') +# Gtk.link_button_set_uri_hook(self.on_launch_browser_mailer, 'url') self.instances = {} @@ -2945,7 +2940,7 @@ class Interface: self.show_vcard_when_connect = [] - self.sleeper = common.sleepy.Sleepy( + self.sleeper = sleepy.Sleepy( gajim.config.get('autoawaytime') * 60, # make minutes to seconds gajim.config.get('autoxatime') * 60) @@ -2963,7 +2958,7 @@ class Interface: pixs.append(pix) if pixs: # set the icon to all windows - gtk.window_set_default_icon_list(*pixs) + Gtk.Window.set_default_icon_list(pixs) self.init_emoticons() self.make_regexps() @@ -2976,7 +2971,7 @@ class Interface: lang = gajim.config.get('speller_language') if not lang: lang = gajim.LANG - tv = gtk.TextView() + tv = Gtk.TextView() try: import gtkspell spell = gtkspell.Spell(tv, lang) @@ -2985,11 +2980,13 @@ class Interface: if gajim.config.get('soundplayer') == '': # only on first time Gajim starts - commands = ('aplay', 'play', 'esdplay', 'artsplay', 'ossplay') + commands = ('aplay', 'play', 'ossplay') for command in commands: if helpers.is_in_path(command): - if command == 'aplay': + if command in ('aplay', 'play'): command += ' -q' + elif command == 'ossplay': + command += ' -qq' gajim.config.set('soundplayer', command) break @@ -3033,8 +3030,8 @@ class PassphraseRequest: self.passphrase = passphrase self.completed = True if passphrase is not None: - gobject.timeout_add_seconds(30, - gajim.interface.forget_gpg_passphrase, self.keyid) + GLib.timeout_add_seconds(30, gajim.interface.forget_gpg_passphrase, + self.keyid) for (account, cb) in self.callbacks: self.run_callback(account, cb) self.callbacks = [] @@ -3085,7 +3082,7 @@ class ThreadInterface: def thread_function(func, func_args, callback, callback_args): output = func(*func_args) if callback: - gobject.idle_add(callback, output, *callback_args) + GLib.idle_add(callback, output, *callback_args) Thread(target=thread_function, args=(func, func_args, callback, callback_args)).start() diff --git a/src/gui_menu_builder.py b/src/gui_menu_builder.py index 0cc03fb10b81ec99005bd0fb8a30e61997d77ed4..fc1252c0ac55c8d86c95a9f8a2454f500aa321ce 100644 --- a/src/gui_menu_builder.py +++ b/src/gui_menu_builder.py @@ -18,7 +18,7 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## -import gtk +from gi.repository import Gtk import os import gtkgui_helpers import message_control @@ -26,7 +26,7 @@ import message_control from common import gajim from common import helpers from nbxmpp.protocol import NS_COMMANDS, NS_FILE, NS_MUC, NS_ESESSION -from nbxmpp.protocol import NS_JINGLE_FILE_TRANSFER +from nbxmpp.protocol import NS_JINGLE_FILE_TRANSFER, NS_CONFERENCE def build_resources_submenu(contacts, account, action, room_jid=None, room_account=None, cap=None): @@ -35,7 +35,7 @@ def build_resources_submenu(contacts, account, action, room_jid=None, action self.on_invite_to_room """ roster = gajim.interface.roster - sub_menu = gtk.Menu() + sub_menu = Gtk.Menu() iconset = gajim.config.get('iconset') if not iconset: @@ -44,7 +44,7 @@ def build_resources_submenu(contacts, account, action, room_jid=None, for c in contacts: # icon MUST be different instance for every item state_images = gtkgui_helpers.load_iconset(path) - item = gtk.ImageMenuItem('%s (%s)' % (c.resource, str(c.priority))) + 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) @@ -63,7 +63,8 @@ def build_resources_submenu(contacts, account, action, room_jid=None, return sub_menu -def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]): +def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[], +show_bookmarked=False): """ list_ in a list of (contact, account) """ @@ -91,10 +92,11 @@ def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]): # they are not all from the same transport invite_menuitem.set_sensitive(False) return - invite_to_submenu = gtk.Menu() + 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 = Gtk.ImageMenuItem.new_with_mnemonic(_( + '_New Group Chat')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NEW, Gtk.IconSize.MENU) invite_to_new_room_menuitem.set_image(icon) if len(contact_list) > 1: # several resources invite_to_new_room_menuitem.set_submenu(build_resources_submenu( @@ -108,8 +110,18 @@ def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]): resource = None invite_to_new_room_menuitem.connect('activate', roster.on_invite_to_new_room, list_, resource) + elif len(list_) > 1: + list2 = [] + for (c, a) in list_: + if c.supports(NS_MUC): + list2.append((c, a)) + if len(list2) > 0: + invite_to_new_room_menuitem.connect('activate', + roster.on_invite_to_new_room, list2, None) + else: + invite_menuitem.set_sensitive(False) else: - invite_menuitem.set_sensitive(True) + invite_menuitem.set_sensitive(False) # transform None in 'jabber' c_t = contacts_transport or 'jabber' muc_jid = {} @@ -123,7 +135,7 @@ def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]): minimized_controls = [] for account in connected_accounts: minimized_controls += \ - gajim.interface.minimized_controls[account].values() + list(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 @@ -137,10 +149,12 @@ def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]): contacts_transport in ['jabber', None]: rooms.append((room_jid, acct)) if len(rooms): - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator invite_to_submenu.append(item) for (room_jid, account) in rooms: - menuitem = gtk.MenuItem(room_jid.split('@')[0]) + menuitem = Gtk.ImageMenuItem(room_jid.split('@')[0]) + muc_active_icon = gtkgui_helpers.load_icon('muc_active') + menuitem.set_image(muc_active_icon) if len(contact_list) > 1: # several resources menuitem.set_submenu(build_resources_submenu( contact_list, account, roster.on_invite_to_room, room_jid, @@ -152,9 +166,45 @@ def build_invite_submenu(invite_menuitem, list_, ignore_rooms=[]): else: resource = None menuitem.connect('activate', roster.on_invite_to_room, list_, - room_jid, account, resource) + room_jid, account, resource) invite_to_submenu.append(menuitem) + if not show_bookmarked: + return + rooms2 = [] # a list of (room_jid, account) tuple + r_jids = [] # list of room jids + for account in connected_accounts: + for room in gajim.connections[account].bookmarks: + r_jid = room['jid'] + if r_jid in r_jids: + continue + if r_jid not in gajim.gc_connected[account] or not \ + gajim.gc_connected[account][r_jid]: + rooms2.append((r_jid, account)) + r_jids.append(r_jid) + + if not rooms2: + return + item = Gtk.SeparatorMenuItem.new() # separator + invite_to_submenu.append(item) + for (room_jid, account) in rooms2: + menuitem = Gtk.ImageMenuItem(room_jid.split('@')[0]) + muc_inactive_icon = gtkgui_helpers.load_icon('muc_inactive') + menuitem.set_image(muc_inactive_icon) + if len(contact_list) > 1: # several resources + menuitem.set_submenu(build_resources_submenu( + contact_list, account, roster.on_invite_to_room, room_jid, + account)) + else: + # use resource if it's self contact + if contact.jid == gajim.get_jid_from_account(account): + resource = contact.resource + else: + resource = None + menuitem.connect('activate', roster.on_invite_to_room, list_, + room_jid, account, resource) + invite_to_submenu.append(menuitem) + def get_contact_menu(contact, account, use_multiple_contacts=True, show_start_chat=True, show_encryption=False, show_buttonbar_items=True, control=None, gc_contact=None, is_anonymous=True): @@ -210,7 +260,7 @@ control=None, gc_contact=None, is_anonymous=True): pixbuf = gtkgui_helpers.get_icon_pixmap('document-send', quiet=True) if not pixbuf: pixbuf = gtkgui_helpers.get_icon_pixmap('gajim-upload') - img = gtk.image_new_from_pixbuf(pixbuf) + img = Gtk.Image.new_from_pixbuf(pixbuf) send_file_menuitem.set_image(img) if not our_jid: @@ -256,8 +306,9 @@ control=None, gc_contact=None, is_anonymous=True): account) history_menuitem.connect('activate', roster.on_history, contact, account) if gtkgui_helpers.gtk_icon_theme.has_icon('document-open-recent'): - gtkgui_helpers.add_image_to_menuitem(history_menuitem, - 'document-open-recent') + img = Gtk.Image() + img.set_from_icon_name('document-open-recent', Gtk.IconSize.MENU) + history_menuitem.set_image(img) if control: convert_to_gc_menuitem.connect('activate', @@ -331,6 +382,11 @@ control=None, gc_contact=None, is_anonymous=True): if not control: items_to_hide.append(convert_to_gc_menuitem) + # Hide items when it's a pm + if gc_contact: + items_to_hide += [rename_menuitem, edit_groups_menuitem, + subscription_menuitem, remove_from_roster_menuitem] + for item in items_to_hide: item.set_no_show_all(True) item.hide() @@ -379,7 +435,7 @@ control=None, gc_contact=None, is_anonymous=True): send_custom_status_menuitem.set_image(gtkgui_helpers.load_icon( gajim.interface.status_sent_to_users[account][jid])) else: - icon = gtk.image_new_from_stock(gtk.STOCK_NETWORK, gtk.ICON_SIZE_MENU) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NETWORK, Gtk.IconSize.MENU) send_custom_status_menuitem.set_image(icon) muc_icon = gtkgui_helpers.load_icon('muc_active') @@ -391,22 +447,29 @@ control=None, gc_contact=None, is_anonymous=True): # it's a pm and we don't know real JID invite_menuitem.set_sensitive(False) else: - build_invite_submenu(invite_menuitem, [(gc_contact, account)]) + bookmarked = False + c_ = gajim.contacts.get_contact(account, gc_contact.jid, + gc_contact.resource) + if c_ and c_.supports(NS_CONFERENCE): + bookmarked=True + build_invite_submenu(invite_menuitem, [(gc_contact, account)], + show_bookmarked=bookmarked) else: - build_invite_submenu(invite_menuitem, [(contact, account)]) + build_invite_submenu(invite_menuitem, [(contact, account)], + show_bookmarked=contact.supports(NS_CONFERENCE)) if gajim.account_is_disconnected(account): invite_menuitem.set_sensitive(False) # One or several resource, we do the same for send_custom_status - status_menuitems = gtk.Menu() + 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 = gtkgui_helpers.load_iconset(path) - status_menuitem = gtk.ImageMenuItem(helpers.get_uf_show(s)) + status_menuitem = Gtk.ImageMenuItem(helpers.get_uf_show(s)) status_menuitem.connect('activate', roster.on_send_custom_status, [(contact, account)], s) icon = state_images[s] @@ -476,7 +539,8 @@ control=None, gc_contact=None, is_anonymous=True): if helpers.jid_is_blocked(account, jid): block_menuitem.set_no_show_all(True) block_menuitem.hide() - if gajim.get_transport_name_from_jid(jid, use_config_setting=False): + if gajim.get_transport_name_from_jid(jid, use_config_setting=False)\ + and transport != 'jabber': unblock_menuitem.set_no_show_all(True) unblock_menuitem.hide() unignore_menuitem.set_no_show_all(False) @@ -488,7 +552,8 @@ control=None, gc_contact=None, is_anonymous=True): else: unblock_menuitem.set_no_show_all(True) unblock_menuitem.hide() - if gajim.get_transport_name_from_jid(jid, use_config_setting=False): + if gajim.get_transport_name_from_jid(jid, use_config_setting=False)\ + and transport != 'jabber': block_menuitem.set_no_show_all(True) block_menuitem.hide() ignore_menuitem.set_no_show_all(False) @@ -505,3 +570,140 @@ control=None, gc_contact=None, is_anonymous=True): contact_context_menu.connect('selection-done', gtkgui_helpers.destroy_widget) contact_context_menu.show_all() return contact_context_menu + +def get_transport_menu(contact, account): + roster = gajim.interface.roster + jid = contact.jid + + menu = Gtk.Menu() + + # Send single message + item = Gtk.ImageMenuItem.new_with_mnemonic(_('Send Single _Message...')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NEW, Gtk.IconSize.MENU) + item.set_image(icon) + item.connect('activate', roster.on_send_single_message_menuitem_activate, + account, contact) + menu.append(item) + if gajim.account_is_disconnected(account): + item.set_sensitive(False) + + blocked = False + if helpers.jid_is_blocked(account, jid): + blocked = True + + # Send Custom Status + send_custom_status_menuitem = Gtk.ImageMenuItem.new_with_mnemonic( + _('Send Cus_tom Status')) + # add a special img for this menuitem + if blocked: + send_custom_status_menuitem.set_image(gtkgui_helpers.load_icon( + 'offline')) + send_custom_status_menuitem.set_sensitive(False) + else: + if account in gajim.interface.status_sent_to_users and \ + jid in gajim.interface.status_sent_to_users[account]: + send_custom_status_menuitem.set_image(gtkgui_helpers.load_icon( + gajim.interface.status_sent_to_users[account][jid])) + else: + icon = Gtk.Imag.new_from_stock(Gtk.STOCK_NETWORK, + Gtk.IconSize.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 = gtkgui_helpers.load_iconset(path) + status_menuitem = Gtk.ImageMenuItem(helpers.get_uf_show(s)) + status_menuitem.connect('activate', roster.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) + if gajim.account_is_disconnected(account): + send_custom_status_menuitem.set_sensitive(False) + + item = Gtk.SeparatorMenuItem.new() # separator + menu.append(item) + + # Execute Command + item = Gtk.ImageMenuItem.new_with_mnemonic(_('E_xecute Command...')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_EXECUTE, Gtk.IconSize.MENU) + item.set_image(icon) + menu.append(item) + item.connect('activate', roster.on_execute_command, contact, account, + contact.resource) + if gajim.account_is_disconnected(account): + item.set_sensitive(False) + + # Manage Transport submenu + item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Manage Transport')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_PROPERTIES, Gtk.IconSize.MENU) + item.set_image(icon) + manage_transport_submenu = Gtk.Menu() + item.set_submenu(manage_transport_submenu) + menu.append(item) + + # Modify Transport + item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Modify Transport')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_PREFERENCES, Gtk.IconSize.MENU) + item.set_image(icon) + manage_transport_submenu.append(item) + item.connect('activate', roster.on_edit_agent, contact, account) + if gajim.account_is_disconnected(account): + item.set_sensitive(False) + + # Rename + item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Rename...')) + # add a special img for rename menuitem + gtkgui_helpers.add_image_to_menuitem(item, 'gajim-kbd_input') + manage_transport_submenu.append(item) + item.connect('activate', roster.on_rename, 'agent', jid, account) + if gajim.account_is_disconnected(account): + item.set_sensitive(False) + + item = Gtk.SeparatorMenuItem.new() # separator + manage_transport_submenu.append(item) + + # Block + if blocked: + item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Unblock')) + item.connect('activate', roster.on_unblock, [(contact, account)]) + else: + item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Block')) + item.connect('activate', roster.on_block, [(contact, account)]) + + icon = Gtk.Image.new_from_stock(Gtk.STOCK_STOP, Gtk.IconSize.MENU) + item.set_image(icon) + manage_transport_submenu.append(item) + if gajim.account_is_disconnected(account): + item.set_sensitive(False) + + # Remove + item = Gtk.ImageMenuItem.new_with_mnemonic(_('Remo_ve')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_REMOVE, Gtk.IconSize.MENU) + item.set_image(icon) + manage_transport_submenu.append(item) + item.connect('activate', roster.on_remove_agent, [(contact, account)]) + if gajim.account_is_disconnected(account): + item.set_sensitive(False) + + item = Gtk.SeparatorMenuItem.new() # separator + menu.append(item) + + # Information + information_menuitem = Gtk.ImageMenuItem.new_with_mnemonic( + _('_Information')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_INFO, Gtk.IconSize.MENU) + information_menuitem.set_image(icon) + menu.append(information_menuitem) + information_menuitem.connect('activate', roster.on_info, contact, account) + if gajim.account_is_disconnected(account): + information_menuitem.set_sensitive(False) + + menu.connect('selection-done', gtkgui_helpers.destroy_widget) + menu.show_all() + return menu + diff --git a/src/history_manager.py b/src/history_manager.py index 5ecad2e96f4150c2e83b4d91005bb659ffa7f373..1102749133714489a86f00c76af1068aa057f361 100644 --- a/src/history_manager.py +++ b/src/history_manager.py @@ -49,8 +49,9 @@ if os.name == 'nt': import sys import signal -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GLib import time import locale @@ -64,24 +65,24 @@ def parseOpts(): shortargs = 'hc:' longargs = 'help config-path=' opts = getopt.getopt(sys.argv[1:], shortargs, longargs.split())[0] - except getopt.error, msg: - print str(msg) - print 'for help use --help' + except getopt.error as msg: + print(str(msg)) + print('for help use --help') sys.exit(2) for o, a in opts: if o in ('-h', '--help'): - print _('Usage:') + \ + print(_('Usage:') + \ '\n gajim-history-manager [options] filename\n\n' + \ _('Options:') + \ '\n -h, --help ' + \ _('Show this help message and exit') + \ - '\n -c, --config-path ' + _('Set logs directory') + '\n -c, --config-path ' + _('Set logs directory') + '\n') sys.exit() elif o in ('-c', '--config-path'): config_path = a return config_path -config_path = parseOpts() +onfig_path = parseOpts() del parseOpts import common.configpaths @@ -120,7 +121,7 @@ class HistoryManager: pixs.append(pix) if pixs: # set the icon to all windows - gtk.window_set_default_icon_list(*pixs) + Gtk.Window.set_default_icon_list(*pixs) if not os.path.exists(LOG_DB_PATH): dialogs.ErrorDialog(_('Cannot find history logs database'), @@ -158,12 +159,12 @@ class HistoryManager: xml.connect_signals(self) def _init_jids_listview(self): - self.jids_liststore = gtk.ListStore(str, str) # jid, jid_id + self.jids_liststore = Gtk.ListStore(str, str) # jid, jid_id self.jids_listview.set_model(self.jids_liststore) - self.jids_listview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + self.jids_listview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) - renderer_text = gtk.CellRendererText() # holds jid - col = gtk.TreeViewColumn(_('Jabber ID'), renderer_text, text=0) + renderer_text = Gtk.CellRendererText() # holds jid + col = Gtk.TreeViewColumn(_('Jabber ID'), renderer_text, text=0) self.jids_listview.append_column(col) self.jids_listview.get_selection().connect('changed', @@ -171,19 +172,19 @@ class HistoryManager: def _init_logs_listview(self): # log_line_id(HIDDEN), jid_id(HIDDEN), time, message, subject, nickname - self.logs_liststore = gtk.ListStore(str, str, str, str, str, str) + self.logs_liststore = Gtk.ListStore(str, str, str, str, str, str) self.logs_listview.set_model(self.logs_liststore) - self.logs_listview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + self.logs_listview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) - renderer_text = gtk.CellRendererText() # holds time - col = gtk.TreeViewColumn(_('Date'), renderer_text, text=C_UNIXTIME) + renderer_text = Gtk.CellRendererText() # holds time + col = Gtk.TreeViewColumn(_('Date'), renderer_text, text=C_UNIXTIME) # user can click this header and sort col.set_sort_column_id(C_UNIXTIME) col.set_resizable(True) self.logs_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds nickname - col = gtk.TreeViewColumn(_('Nickname'), renderer_text, text=C_NICKNAME) + renderer_text = Gtk.CellRendererText() # holds nickname + col = Gtk.TreeViewColumn(_('Nickname'), renderer_text, text=C_NICKNAME) # user can click this header and sort col.set_sort_column_id(C_NICKNAME) col.set_resizable(True) @@ -191,16 +192,16 @@ class HistoryManager: self.nickname_col_for_logs = col self.logs_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds message - col = gtk.TreeViewColumn(_('Message'), renderer_text, markup=C_MESSAGE) + renderer_text = Gtk.CellRendererText() # holds message + col = Gtk.TreeViewColumn(_('Message'), renderer_text, markup=C_MESSAGE) # user can click this header and sort col.set_sort_column_id(C_MESSAGE) col.set_resizable(True) self.message_col_for_logs = col self.logs_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds subject - col = gtk.TreeViewColumn(_('Subject'), renderer_text, text=C_SUBJECT) + renderer_text = Gtk.CellRendererText() # holds subject + col = Gtk.TreeViewColumn(_('Subject'), renderer_text, text=C_SUBJECT) col.set_sort_column_id(C_SUBJECT) # user can click this header and sort col.set_resizable(True) col.set_visible(False) @@ -209,37 +210,37 @@ class HistoryManager: def _init_search_results_listview(self): # log_line_id (HIDDEN), jid, time, message, subject, nickname - self.search_results_liststore = gtk.ListStore(str, str, str, str, str, + self.search_results_liststore = Gtk.ListStore(int, str, str, str, str, str) self.search_results_listview.set_model(self.search_results_liststore) - renderer_text = gtk.CellRendererText() # holds JID (who said this) - col = gtk.TreeViewColumn(_('JID'), renderer_text, text=1) + renderer_text = Gtk.CellRendererText() # holds JID (who said this) + col = Gtk.TreeViewColumn(_('JID'), renderer_text, text=1) col.set_sort_column_id(1) # user can click this header and sort col.set_resizable(True) self.search_results_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds time - col = gtk.TreeViewColumn(_('Date'), renderer_text, text=C_UNIXTIME) + renderer_text = Gtk.CellRendererText() # holds time + col = Gtk.TreeViewColumn(_('Date'), renderer_text, text=C_UNIXTIME) # user can click this header and sort col.set_sort_column_id(C_UNIXTIME) col.set_resizable(True) self.search_results_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds message - col = gtk.TreeViewColumn(_('Message'), renderer_text, text=C_MESSAGE) + renderer_text = Gtk.CellRendererText() # holds message + col = Gtk.TreeViewColumn(_('Message'), renderer_text, text=C_MESSAGE) col.set_sort_column_id(C_MESSAGE) # user can click this header and sort col.set_resizable(True) self.search_results_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds subject - col = gtk.TreeViewColumn(_('Subject'), renderer_text, text=C_SUBJECT) + renderer_text = Gtk.CellRendererText() # holds subject + col = Gtk.TreeViewColumn(_('Subject'), renderer_text, text=C_SUBJECT) col.set_sort_column_id(C_SUBJECT) # user can click this header and sort col.set_resizable(True) self.search_results_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds nickname - col = gtk.TreeViewColumn(_('Nickname'), renderer_text, text=C_NICKNAME) + renderer_text = Gtk.CellRendererText() # holds nickname + col = Gtk.TreeViewColumn(_('Nickname'), renderer_text, text=C_NICKNAME) # user can click this header and sort col.set_sort_column_id(C_NICKNAME) col.set_resizable(True) @@ -247,16 +248,16 @@ class HistoryManager: def on_history_manager_window_delete_event(self, widget, event): if not self.AT_LEAST_ONE_DELETION_DONE: - gtk.main_quit() + Gtk.main_quit() return def on_yes(clicked): self.cur.execute('VACUUM') self.con.commit() - gtk.main_quit() + Gtk.main_quit() def on_no(): - gtk.main_quit() + Gtk.main_quit() dialog = dialogs.YesNoDialog( _('Do you want to clean up the database? ' @@ -274,11 +275,11 @@ class HistoryManager: # get those jids that have at least one entry in logs self.cur.execute('SELECT jid, jid_id FROM jids WHERE jid_id IN (' 'SELECT distinct logs.jid_id FROM logs) ORDER BY jid') - # list of tupples: [(u'aaa@bbb',), (u'cc@dd',)] + # list of tupples: [('aaa@bbb',), ('cc@dd',)] rows = self.cur.fetchall() for row in rows: self.jids_already_in.append(row[0]) # jid - self.jids_liststore.append(row) # jid, jid_id + self.jids_liststore.append([row[0], str(row[1])]) # jid, jid_id def on_jids_listview_selection_changed(self, widget, data=None): liststore, list_of_paths = self.jids_listview.get_selection()\ @@ -295,13 +296,13 @@ class HistoryManager: list_of_rowrefs = [] for path in list_of_paths: # make them treerowrefs (it's needed) - list_of_rowrefs.append(gtk.TreeRowReference(liststore, path)) + list_of_rowrefs.append(Gtk.TreeRowReference.new(liststore, path)) for rowref in list_of_rowrefs: # FILL THE STORE, for all rows selected path = rowref.get_path() if path is None: continue - jid = liststore[path][0].decode('utf-8') # jid + jid = liststore[path][0] # jid self._fill_logs_listview(jid) def _get_jid_id(self, jid): @@ -394,8 +395,7 @@ class HistoryManager: log_line_id, jid_id, time_, kind, message, subject, nickname, \ show = row try: - time_ = time.strftime('%x', time.localtime(float(time_)) - ).decode(locale.getpreferredencoding()) + time_ = time.strftime('%x', time.localtime(float(time_))) except ValueError: pass else: @@ -422,10 +422,9 @@ class HistoryManager: message_ = '<span' if color: message_ += ' foreground="%s"' % color - message_ += '>%s</span>' % \ - gobject.markup_escape_text(message) - self.logs_liststore.append((log_line_id, jid_id, time_, - message_, subject, nickname)) + message_ += '>%s</span>' % GLib.markup_escape_text(message) + self.logs_liststore.append((str(log_line_id), str(jid_id), + time_, message_, subject, nickname)) def _fill_search_results_listview(self, text): """ @@ -448,8 +447,7 @@ class HistoryManager: # log_line_id, jid (from jid_id), time, message, subject, nickname log_line_id, jid_id, time_, message, subject, nickname = row try: - time_ = time.strftime('%x', time.localtime(float(time_)) - ).decode(locale.getpreferredencoding()) + time_ = time.strftime('%x', time.localtime(float(time_))) except ValueError: pass else: @@ -461,20 +459,20 @@ class HistoryManager: def on_logs_listview_key_press_event(self, widget, event): liststore, list_of_paths = self.logs_listview.get_selection()\ .get_selected_rows() - if event.keyval == gtk.keysyms.Delete: + if event.keyval == Gdk.KEY_Delete: self._delete_logs(liststore, list_of_paths) def on_listview_button_press_event(self, widget, event): if event.button == 3: # right click xml = gtkgui_helpers.get_gtk_builder('history_manager.ui', 'context_menu') - if gtk.Buildable.get_name(widget) != 'jids_listview': + if Gtk.Buildable.get_name(widget) != 'jids_listview': xml.get_object('export_menuitem').hide() xml.get_object('delete_menuitem').connect('activate', self.on_delete_menuitem_activate, widget) xml.connect_signals(self) - xml.get_object('context_menu').popup(None, None, None, + xml.get_object('context_menu').popup(None, None, None, None, event.button, event.time) return True @@ -489,7 +487,7 @@ class HistoryManager: dlg.props.do_overwrite_confirmation = True response = dlg.run() - if response == gtk.RESPONSE_OK: # user want us to export ;) + if response == Gtk.ResponseType.OK: # user want us to export ;) liststore, list_of_paths = self.jids_listview.get_selection()\ .get_selected_rows() path_to_file = dlg.get_filename() @@ -499,7 +497,7 @@ class HistoryManager: dlg.destroy() def on_delete_menuitem_activate(self, widget, listview): - widget_name = gtk.Buildable.get_name(listview) + widget_name = Gtk.Buildable.get_name(listview) liststore, list_of_paths = listview.get_selection().get_selected_rows() if widget_name == 'jids_listview': self._delete_jid_logs(liststore, list_of_paths) @@ -511,7 +509,7 @@ class HistoryManager: def on_jids_listview_key_press_event(self, widget, event): liststore, list_of_paths = self.jids_listview.get_selection()\ .get_selected_rows() - if event.keyval == gtk.keysyms.Delete: + if event.keyval == Gdk.KEY_Delete: self._delete_jid_logs(liststore, list_of_paths) def _export_jids_logs_to_file(self, liststore, list_of_paths, path_to_file): @@ -521,7 +519,7 @@ class HistoryManager: list_of_rowrefs = [] for path in list_of_paths: # make them treerowrefs (it's needed) - list_of_rowrefs.append(gtk.TreeRowReference(liststore, path)) + list_of_rowrefs.append(Gtk.TreeRowReference.new(liststore, path)) for rowref in list_of_rowrefs: path = rowref.get_path() @@ -556,8 +554,7 @@ class HistoryManager: continue try: - time_ = time.strftime('%c', time.localtime(float(time_)) - ).decode(locale.getpreferredencoding()) + time_ = time.strftime('%c', time.localtime(float(time_))) except ValueError: pass @@ -573,7 +570,7 @@ class HistoryManager: # delete all rows from db that match jid_id list_of_rowrefs = [] for path in list_of_paths: # make them treerowrefs (it's needed) - list_of_rowrefs.append(gtk.TreeRowReference(liststore, path)) + list_of_rowrefs.append(Gtk.TreeRowReference.new(liststore, path)) for rowref in list_of_rowrefs: path = rowref.get_path() @@ -622,7 +619,7 @@ class HistoryManager: # delete rows from db that match log_line_id list_of_rowrefs = [] for path in list_of_paths: # make them treerowrefs (it's needed) - list_of_rowrefs.append(gtk.TreeRowReference(liststore, path)) + list_of_rowrefs.append(Gtk.TreeRowReference.new(liststore, path)) for rowref in list_of_rowrefs: path = rowref.get_path() @@ -652,7 +649,7 @@ class HistoryManager: dialog.set_transient_for(self.window) def on_search_db_button_clicked(self, widget): - text = self.search_entry.get_text().decode('utf-8') + text = self.search_entry.get_text() if not text: return @@ -665,12 +662,12 @@ class HistoryManager: def on_search_results_listview_row_activated(self, widget, path, column): # get log_line_id, jid_id from row we double clicked log_line_id = self.search_results_liststore[path][0] - jid = self.search_results_liststore[path][1].decode('utf-8') + jid = self.search_results_liststore[path][1] # make it string as in gtk liststores I have them all as strings # as this is what db returns so I don't have to fight with types jid_id = self._get_jid_id(jid) - iter_ = self.jids_liststore.get_iter_root() + iter_ = self.jids_liststore.get_iter_first() while iter_: # self.jids_liststore[iter_][1] holds jid_ids if self.jids_liststore[iter_][1] == jid_id: @@ -683,7 +680,7 @@ class HistoryManager: path = self.jids_liststore.get_path(iter_) self.jids_listview.set_cursor(path) - iter_ = self.logs_liststore.get_iter_root() + iter_ = self.logs_liststore.get_iter_first() while iter_: # self.logs_liststore[iter_][0] holds lon_line_ids if self.logs_liststore[iter_][0] == log_line_id: @@ -696,4 +693,4 @@ class HistoryManager: if __name__ == '__main__': signal.signal(signal.SIGINT, signal.SIG_DFL) # ^C exits the application HistoryManager() - gtk.main() + Gtk.main() diff --git a/src/history_window.py b/src/history_window.py index 5a2a428373ccb4a0ddfc3fe56231a8f2dc9b1535..1e67c1ee0f8417307ace2a85e3604c67cd34ac75 100644 --- a/src/history_window.py +++ b/src/history_window.py @@ -25,8 +25,9 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GLib import time import calendar @@ -77,39 +78,38 @@ class HistoryWindow: self.checkbutton.connect('toggled', self.on_log_history_checkbutton_toggled) self.show_status_checkbutton = xml.get_object('show_status_checkbutton') - self.query_entry = xml.get_object('query_entry') - self.query_combobox = xml.get_object('query_combobox') - self.jid_entry = self.query_combobox.child + self.search_entry = xml.get_object('search_entry') + self.query_liststore = xml.get_object('query_liststore') + self.jid_entry = xml.get_object('query_entry') self.jid_entry.connect('activate', self.on_jid_entry_activate) - self.query_combobox.set_active(0) self.results_treeview = xml.get_object('results_treeview') self.results_window = xml.get_object('results_scrolledwindow') self.search_in_date = xml.get_object('search_in_date') # contact_name, date, message, time - model = gtk.ListStore(str, str, str, str, str) + model = Gtk.ListStore(str, str, str, str, str) self.results_treeview.set_model(model) - col = gtk.TreeViewColumn(_('Name')) + col = Gtk.TreeViewColumn(_('Name')) self.results_treeview.append_column(col) - renderer = gtk.CellRendererText() - col.pack_start(renderer) - col.set_attributes(renderer, text = C_CONTACT_NAME) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', C_CONTACT_NAME) col.set_sort_column_id(C_CONTACT_NAME) # user can click this header and sort col.set_resizable(True) - col = gtk.TreeViewColumn(_('Date')) + col = Gtk.TreeViewColumn(_('Date')) self.results_treeview.append_column(col) - renderer = gtk.CellRendererText() - col.pack_start(renderer) - col.set_attributes(renderer, text = C_UNIXTIME) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', C_UNIXTIME) col.set_sort_column_id(C_UNIXTIME) # user can click this header and sort col.set_resizable(True) - col = gtk.TreeViewColumn(_('Message')) + col = Gtk.TreeViewColumn(_('Message')) self.results_treeview.append_column(col) - renderer = gtk.CellRendererText() - col.pack_start(renderer) - col.set_attributes(renderer, text = C_MESSAGE) + renderer = Gtk.CellRendererText() + col.pack_start(renderer, True) + col.add_attribute(renderer, 'text', C_MESSAGE) col.set_resizable(True) self.jid = None # The history we are currently viewing @@ -119,7 +119,8 @@ class HistoryWindow: self.jids_to_search = [] # This will load history too - gobject.idle_add(self._fill_completion_dict().next) + task = self._fill_completion_dict() + GLib.idle_add(next, task) if jid: self.jid_entry.set_text(jid) @@ -127,11 +128,11 @@ class HistoryWindow: self._load_history(None) gtkgui_helpers.resize_window(self.window, - gajim.config.get('history_window_width'), - gajim.config.get('history_window_height')) + gajim.config.get('history_window_width'), + gajim.config.get('history_window_height')) gtkgui_helpers.move_window(self.window, - gajim.config.get('history_window_x-position'), - gajim.config.get('history_window_y-position')) + gajim.config.get('history_window_x-position'), + gajim.config.get('history_window_y-position')) xml.connect_signals(self) self.window.show_all() @@ -153,7 +154,7 @@ class HistoryWindow: db_jids = gajim.logger.get_jids_in_db() completion_dict = dict.fromkeys(db_jids) - self.accounts_seen_online = gajim.contacts.get_accounts()[:] + self.accounts_seen_online = list(gajim.contacts.get_accounts()) # Enhance contacts of online accounts with contact. Needed for mapping below for account in self.accounts_seen_online: @@ -164,12 +165,14 @@ class HistoryWindow: muc_active_pix = muc_active_img.get_pixbuf() contact_pix = contact_img.get_pixbuf() - keys = completion_dict.keys() + keys = list(completion_dict.keys()) # Move the actual jid at first so we load history faster - actual_jid = self.jid_entry.get_text().decode('utf-8') + actual_jid = self.jid_entry.get_text() if actual_jid in keys: keys.remove(actual_jid) keys.insert(0, actual_jid) + if '' in keys: + keys.remove('') if None in keys: keys.remove(None) # Map jid to info tuple @@ -203,9 +206,9 @@ class HistoryWindow: liststore.append((pix, completed)) self.completion_dict[key] = (info_jid, info_acc, info_name, - info_completion) + info_completion) self.completion_dict[completed] = (info_jid, info_acc, - info_name, info_completion) + info_name, info_completion) if key == actual_jid: self._load_history(info_jid, info_acc) yield True @@ -232,7 +235,7 @@ class HistoryWindow: del gajim.interface.instances['logs'] def on_history_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.save_state() self.window.destroy() @@ -241,11 +244,7 @@ class HistoryWindow: self.window.destroy() def on_jid_entry_activate(self, widget): - if not self.query_combobox.get_active() < 0: - # Don't disable querybox when we have changed the combobox - # to GC or All and hit enter - return - jid = self.jid_entry.get_text().decode('utf-8') + jid = self.jid_entry.get_text() account = None # we don't know the account, could be any. Search for it! self._load_history(jid, account) self.results_window.set_property('visible', False) @@ -259,8 +258,7 @@ class HistoryWindow: """ if jid_or_name and jid_or_name in self.completion_dict: # a full qualified jid or a contact name was entered - info_jid, info_account, info_name, info_completion = \ - self.completion_dict[jid_or_name] + info_jid, info_account, info_name, info_completion = self.completion_dict[jid_or_name] self.jids_to_search = [info_jid] self.jid = info_jid @@ -276,14 +274,14 @@ class HistoryWindow: else: # Are log disabled for account ? if self.account in gajim.config.get_per('accounts', self.account, - 'no_log_for').split(' '): + 'no_log_for').split(' '): self.checkbutton.set_active(False) self.checkbutton.set_sensitive(False) else: # Are log disabled for jid ? log = True if self.jid in gajim.config.get_per('accounts', self.account, - 'no_log_for').split(' '): + 'no_log_for').split(' '): log = False self.checkbutton.set_active(log) self.checkbutton.set_sensitive(True) @@ -292,8 +290,8 @@ class HistoryWindow: # select logs for last date we have logs with contact self.calendar.set_sensitive(True) - last_log = gajim.logger.get_last_date_that_has_logs(self.jid, - self.account) + last_log = \ + gajim.logger.get_last_date_that_has_logs(self.jid, self.account) date = time.localtime(last_log) @@ -302,8 +300,8 @@ class HistoryWindow: self.calendar.select_month(gtk_month, y) self.calendar.select_day(d) - self.query_entry.set_sensitive(True) - self.query_entry.grab_focus() + self.search_entry.set_sensitive(True) + self.search_entry.grab_focus() title = _('Conversation History with %s') % info_name self.window.set_title(title) @@ -315,7 +313,7 @@ class HistoryWindow: self.account = None self.history_buffer.set_text('') # clear the buffer - self.query_entry.set_sensitive(False) + self.search_entry.set_sensitive(False) self.checkbutton.set_sensitive(False) self.calendar.set_sensitive(False) @@ -354,7 +352,7 @@ class HistoryWindow: try: log_days = gajim.logger.get_days_with_logs(self.jid, year, month, days_in_this_month, self.account) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: dialogs.ErrorDialog(_('Disk Error'), str(e)) return for day in log_days: @@ -384,8 +382,7 @@ class HistoryWindow: self.last_time_printout = 0 show_status = self.show_status_checkbutton.get_active() - lines = gajim.logger.get_conversation_for_date(self.jid, year, month, - day, self.account) + lines = gajim.logger.get_conversation_for_date(self.jid, year, month, day, self.account) # lines holds list with tupples that have: # contact_name, time, kind, show, message for line in lines: @@ -402,7 +399,7 @@ class HistoryWindow: Add a new line in textbuffer """ if not message and kind not in (constants.KIND_STATUS, - constants.KIND_GCSTATUS): + constants.KIND_GCSTATUS): return buf = self.history_buffer end_iter = buf.get_end_iter() @@ -414,13 +411,13 @@ class HistoryWindow: buf.insert(end_iter, tim) # add time elif gajim.config.get('print_time') == 'sometimes': every_foo_seconds = 60 * gajim.config.get( - 'print_ichat_every_foo_minutes') + 'print_ichat_every_foo_minutes') seconds_passed = tim - self.last_time_printout if seconds_passed > every_foo_seconds: self.last_time_printout = tim tim = time.strftime('%X ', time.localtime(float(tim))) buf.insert_with_tags_by_name(end_iter, tim + '\n', - 'time_sometimes') + 'time_sometimes') tag_name = '' tag_msg = '' @@ -441,7 +438,7 @@ class HistoryWindow: else: # we don't have roster, we don't know our own nick, use first # account one (urk!) - account = gajim.contacts.get_accounts()[0] + account = list(gajim.contacts.get_accounts())[0] contact_name = gajim.nicks[account] tag_name = 'outgoing' tag_msg = 'outgoingtxt' @@ -449,11 +446,11 @@ class HistoryWindow: # message here (if not None) is status message if message: message = _('%(nick)s is now %(status)s: %(status_msg)s') %\ - {'nick': contact_name, 'status': helpers.get_uf_show(show), - 'status_msg': message } + {'nick': contact_name, 'status': helpers.get_uf_show(show), + 'status_msg': message } else: - message = _('%(nick)s is now %(status)s') % { - 'nick': contact_name, 'status': helpers.get_uf_show(show) } + message = _('%(nick)s is now %(status)s') % {'nick': contact_name, + 'status': helpers.get_uf_show(show) } tag_msg = 'status' else: # 'status' # message here (if not None) is status message @@ -464,10 +461,10 @@ class HistoryWindow: message = _('Error') elif message: message = _('Status is now: %(status)s: %(status_msg)s') % \ - {'status': helpers.get_uf_show(show), 'status_msg': message} + {'status': helpers.get_uf_show(show), 'status_msg': message} else: message = _('Status is now: %(status)s') % { 'status': - helpers.get_uf_show(show) } + helpers.get_uf_show(show) } tag_msg = 'status' if message.startswith('/me ') or message.startswith('/me\n'): @@ -482,8 +479,10 @@ class HistoryWindow: after_str = gajim.config.get('after_nickname') after_str = helpers.from_one_line(after_str) format = before_str + contact_name + after_str + ' ' - buf.insert_with_tags_by_name(end_iter, format, tag_name) - + if tag_name: + buf.insert_with_tags_by_name(end_iter, format, tag_name) + else: + buf.insert(end_iter, format) if subject: message = _('Subject: %s\n') % subject + message xhtml = None @@ -492,14 +491,16 @@ class HistoryWindow: if tag_msg: self.history_textview.print_real_text(message, [tag_msg], - name=contact_name, xhtml=xhtml) + name=contact_name, xhtml=xhtml) else: self.history_textview.print_real_text(message, name=contact_name, xhtml=xhtml) - self.history_textview.print_real_text('\n') + buffer_ = self.history_textview.tv.get_buffer() + eob = buffer_.get_end_iter() + buffer_.insert_with_tags_by_name(eob, '\n', 'eol') - def on_query_entry_activate(self, widget): - text = self.query_entry.get_text() + def on_search_entry_activate(self, widget): + text = self.search_entry.get_text() model = self.results_treeview.get_model() model.clear() if text == '': @@ -509,16 +510,15 @@ class HistoryWindow: self.results_window.set_property('visible', True) # perform search in preselected jids - # jids are preselected with the query_combobox (all, single jid...) + # jids are preselected with the query_entry for jid in self.jids_to_search: account = self.completion_dict[jid][C_INFO_ACCOUNT] if account is None: - # We do not know an account. This can only happen if the contact - # is offine, or if we browse a groupchat history. The account is - # not needed, a dummy can be set. - # This may leed to wrong self nick in the displayed history - # (Uggh!) - account = gajim.contacts.get_accounts()[0] + # We do not know an account. This can only happen if the contact is offine, + # or if we browse a groupchat history. The account is not needed, a dummy can + # be set. + # This may leed to wrong self nick in the displayed history (Uggh!) + account = list(gajim.contacts.get_accounts())[0] year, month, day = False, False, False if self.search_in_date.get_active(): @@ -528,8 +528,8 @@ class HistoryWindow: show_status = self.show_status_checkbutton.get_active() # contact_name, time, kind, show, message, subject - results = gajim.logger.get_search_results_for_query(jid, text, - account, year, month, day) + results = gajim.logger.get_search_results_for_query( + jid, text, account, year, month, day) #FIXME: # add "subject: | message: " in message column if kind is single # also do we need show at all? (we do not search on subject) @@ -551,31 +551,7 @@ class HistoryWindow: # jid (to which log is assigned to), name, date, message, # time (full unix time) - model.append((jid, contact_name, date, message, tim)) - - def on_query_combobox_changed(self, widget): - if self.query_combobox.get_active() < 0: - return # custom entry - self.account = None - self.jid = None - self.jids_to_search = [] - self._load_history(None) # clear textview - - if self.query_combobox.get_active() == 0: - # JID or Contact name - self.query_entry.set_sensitive(False) - self.jid_entry.grab_focus() - if self.query_combobox.get_active() == 1: - # Groupchat Histories - self.query_entry.set_sensitive(True) - self.query_entry.grab_focus() - self.jids_to_search = (jid for jid in gajim.logger.get_jids_in_db() - if gajim.logger.jid_is_room_jid(jid)) - if self.query_combobox.get_active() == 2: - # All Chat Histories - self.query_entry.set_sensitive(True) - self.query_entry.grab_focus() - self.jids_to_search = gajim.logger.get_jids_in_db() + model.append((jid, contact_name, date, message, str(tim))) def on_results_treeview_row_activated(self, widget, path, column): """ @@ -618,25 +594,24 @@ class HistoryWindow: timestamp_str = gajim.config.get('time_stamp') timestamp_str = helpers.from_one_line(timestamp_str) tim = time.strftime(timestamp_str, local_time) - result = start_iter.forward_search(tim, gtk.TEXT_SEARCH_VISIBLE_ONLY, + result = start_iter.forward_search(tim, Gtk.TextSearchFlags.VISIBLE_ONLY, None) if result is not None: match_start_iter, match_end_iter = result - # include '[' or other character before time - match_start_iter.backward_char() + match_start_iter.backward_char() # include '[' or other character before time match_end_iter.forward_line() # highlight all message not just time self.history_buffer.apply_tag_by_name('highlight', match_start_iter, - match_end_iter) + match_end_iter) match_start_mark = self.history_buffer.create_mark('match_start', - match_start_iter, True) + match_start_iter, True) self.history_textview.tv.scroll_to_mark(match_start_mark, 0, True) def on_log_history_checkbutton_toggled(self, widget): # log conversation history? oldlog = True no_log_for = gajim.config.get_per('accounts', self.account, - 'no_log_for').split() + 'no_log_for').split() if self.jid in no_log_for: oldlog = False log = widget.get_active() @@ -646,7 +621,7 @@ class HistoryWindow: no_log_for.remove(self.jid) if oldlog != log: gajim.config.set_per('accounts', self.account, 'no_log_for', - ' '.join(no_log_for)) + ' '.join(no_log_for)) def on_show_status_checkbutton_toggled(self, widget): # reload logs @@ -659,7 +634,7 @@ class HistoryWindow: self.jid_entry.set_text(jid) if account and account not in self.accounts_seen_online: # Update dict to not only show bare jid - gobject.idle_add(self._fill_completion_dict().next) + GLib.idle_add(next, self._fill_completion_dict()) else: # Only in that case because it's called by self._fill_completion_dict() # otherwise @@ -667,7 +642,7 @@ class HistoryWindow: self.results_window.set_property('visible', False) def save_state(self): - x, y = self.window.window.get_root_origin() + x, y = self.window.get_window().get_root_origin() width, height = self.window.get_size() gajim.config.set('history_window_x-position', x) diff --git a/src/htmltextview.py b/src/htmltextview.py index fbb24ee655ad63eae114b8c33ea3984723c79bb6..843865c8c9ef45cf0e9ca1b52b5c0b62387eb62c 100644 --- a/src/htmltextview.py +++ b/src/htmltextview.py @@ -26,7 +26,7 @@ ## """ -A gtk.TextView-based renderer for XHTML-IM, as described in: +A Gtk.TextView-based renderer for XHTML-IM, as described in: http://xmpp.org/extensions/xep-0071.html Starting with the version posted by Gustavo Carneiro, @@ -35,13 +35,16 @@ with the markup that docutils generate, and also more modular. """ -import gobject -import pango -import gtk +from gi.repository import GObject +from gi.repository import GLib +from gi.repository import Pango +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf import xml.sax, xml.sax.handler import re -from cStringIO import StringIO -import urllib2 +from io import StringIO +import urllib import operator if __name__ == '__main__': @@ -64,8 +67,8 @@ whitespace_rx = re.compile('\\s+') allwhitespace_rx = re.compile('^\\s*$') # pixels = points * display_resolution -display_resolution = 0.3514598*(gtk.gdk.screen_height() / - float(gtk.gdk.screen_height_mm())) +display_resolution = 0.3514598*(Gdk.Screen.height() / + float(Gdk.Screen.height_mm())) # embryo of CSS classes classes = { @@ -194,9 +197,9 @@ for name in BLOCK_HEAD: def _parse_css_color(color): if color.startswith('rgb(') and color.endswith(')'): r, g, b = [int(c)*257 for c in color[4:-1].split(',')] - return gtk.gdk.Color(r, g, b) + return Gdk.Color(r, g, b) else: - return gtk.gdk.color_parse(color) + return Gdk.color_parse(color) def style_iter(style): return ([x.strip() for x in item.split(':', 1)] for item in style.split(';')\ @@ -219,7 +222,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): self.text = '' self.starting=True self.preserve = False - self.styles = [] # a gtk.TextTag or None, for each span level + self.styles = [] # a Gtk.TextTag or None, for each span level self.list_counters = [] # stack (top at head) of list # counters, or None for unordered list @@ -236,7 +239,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): def _get_current_attributes(self): attrs = self.textview.get_default_attributes() self.iter.backward_char() - self.iter.get_attributes(attrs) + attrs = (self.iter.get_attributes())[1] self.iter.forward_char() return attrs @@ -252,13 +255,19 @@ class HtmlHandler(xml.sax.handler.ContentHandler): """ if value.endswith('%'): val = float(value[:-1]) - sign = cmp(val, 0) + if val > 0: + sign = 1 + elif val < 0: + sign = -1 + else: + sign = 0 # limits: 1% to 500% val = sign*max(1, min(abs(val), 500)) frac = val/100 if font_relative: attrs = self._get_current_attributes() - font_size = attrs.font.get_size() / pango.SCALE + if not attrs.font: + font_size = self.get_font_size() callback(frac*display_resolution*font_size, *args) elif block_relative: # CSS says 'Percentage values: refer to width of the closest @@ -277,7 +286,12 @@ class HtmlHandler(xml.sax.handler.ContentHandler): def get_val(): val = float(value[:-2]) - sign = cmp(val, 0) + if val > 0: + sign = 1 + elif val < 0: + sign = -1 + else: + sign = 0 # validate length return sign*max(minl, min(abs(val*display_resolution), maxl)) if value.endswith('pt'): # points @@ -285,14 +299,17 @@ class HtmlHandler(xml.sax.handler.ContentHandler): elif value.endswith('em'): # ems, the width of the element's font attrs = self._get_current_attributes() - font_size = attrs.font.get_size() / pango.SCALE + if not attrs.font: + font_size = self.get_font_size() callback(get_val()*display_resolution*font_size, *args) elif value.endswith('ex'): # x-height, ~ the height of the letter 'x' # FIXME: figure out how to calculate this correctly # for now 'em' size is used as approximation + attrs = self._get_current_attributes() - font_size = attrs.font.get_size() / pango.SCALE + if not attrs.font: + font_size = self.get_font_size() callback(get_val()*display_resolution*font_size, *args) elif value.endswith('px'): # pixels @@ -302,7 +319,12 @@ class HtmlHandler(xml.sax.handler.ContentHandler): try: # TODO: isn't "no units" interpreted as pixels? val = int(value) - sign = cmp(val, 0) + if val > 0: + sign = 1 + elif val < 0: + sign = -1 + else: + sign = 0 # validate length val = sign*max(minl, min(abs(val), maxl)) callback(val, *args) @@ -320,26 +342,36 @@ class HtmlHandler(xml.sax.handler.ContentHandler): def _parse_style_font_size(self, tag, value): try: + # see http://developer.gnome.org/pango/stable/pango-Text-Attributes.html#PANGO-SCALE-XX-SMALL:CAPS + # http://consciouslyusing.blogspot.ru/2012/01/heads-up-missing-pango-text-scale.html scale = { - 'xx-small': pango.SCALE_XX_SMALL, - 'x-small': pango.SCALE_X_SMALL, - 'small': pango.SCALE_SMALL, - 'medium': pango.SCALE_MEDIUM, - 'large': pango.SCALE_LARGE, - 'x-large': pango.SCALE_X_LARGE, - 'xx-large': pango.SCALE_XX_LARGE, + #'xx-small': Pango.SCALE_XX_SMALL, + #'x-small': Pango.SCALE_X_SMALL, + #'small': Pango.SCALE_SMALL, + #'medium': Pango.SCALE_MEDIUM, + #'large': Pango.SCALE_LARGE, + #'x-large': Pango.SCALE_X_LARGE, + #'xx-large': Pango.SCALE_XX_LARGE, + 'xx-small': 0.5787037037037, + 'x-small': 0.6444444444444, + 'small': 0.8333333333333, + 'medium': 1.0, + 'large': 1.2, + 'x-large': 1.4399999999999, + 'xx-large': 1.728, } [value] except KeyError: pass else: attrs = self._get_current_attributes() - tag.set_property('scale', scale / attrs.font_scale) + if attrs.font_scale ==0: + tag.set_property('scale', scale) return if value == 'smaller': - tag.set_property('scale', pango.SCALE_SMALL) + tag.set_property('scale', 0.8333333333333) return if value == 'larger': - tag.set_property('scale', pango.SCALE_LARGE) + tag.set_property('scale', 1.2) return # font relative (5 ~ 4pt, 110 ~ 72pt) self._parse_length(value, True, False, 5, 110,self.__parse_font_size_cb, @@ -348,9 +380,9 @@ class HtmlHandler(xml.sax.handler.ContentHandler): def _parse_style_font_style(self, tag, value): try: style = { - 'normal': pango.STYLE_NORMAL, - 'italic': pango.STYLE_ITALIC, - 'oblique': pango.STYLE_OBLIQUE, + 'normal': Pango.Style.NORMAL, + 'italic': Pango.Style.ITALIC, + 'oblique': Pango.Style.OBLIQUE, } [value] except KeyError: log.warning('unknown font-style %s' % value) @@ -378,17 +410,17 @@ class HtmlHandler(xml.sax.handler.ContentHandler): # TODO: missing 'bolder' and 'lighter' try: weight = { - '100': pango.WEIGHT_ULTRALIGHT, - '200': pango.WEIGHT_ULTRALIGHT, - '300': pango.WEIGHT_LIGHT, - '400': pango.WEIGHT_NORMAL, - '500': pango.WEIGHT_NORMAL, - '600': pango.WEIGHT_BOLD, - '700': pango.WEIGHT_BOLD, - '800': pango.WEIGHT_ULTRABOLD, - '900': pango.WEIGHT_HEAVY, - 'normal': pango.WEIGHT_NORMAL, - 'bold': pango.WEIGHT_BOLD, + '100': Pango.Weight.ULTRALIGHT, + '200': Pango.Weight.ULTRALIGHT, + '300': Pango.Weight.LIGHT, + '400': Pango.Weight.NORMAL, + '500': Pango.Weight.NORMAL, + '600': Pango.Weight.BOLD, + '700': Pango.Weight.BOLD, + '800': Pango.Weight.ULTRABOLD, + '900': Pango.Weight.HEAVY, + 'normal': Pango.Weight.NORMAL, + 'bold': Pango.Weight.BOLD, } [value] except KeyError: log.warning('unknown font-style %s' % value) @@ -401,10 +433,10 @@ class HtmlHandler(xml.sax.handler.ContentHandler): def _parse_style_text_align(self, tag, value): try: align = { - 'left': gtk.JUSTIFY_LEFT, - 'right': gtk.JUSTIFY_RIGHT, - 'center': gtk.JUSTIFY_CENTER, - 'justify': gtk.JUSTIFY_FILL, + 'left': Gtk.Justification.LEFT, + 'right': Gtk.Justification.RIGHT, + 'center': Gtk.Justification.CENTER, + 'justify': Gtk.Justification.FILL, } [value] except KeyError: log.warning('Invalid text-align:%s requested' % value) @@ -414,12 +446,12 @@ class HtmlHandler(xml.sax.handler.ContentHandler): def _parse_style_text_decoration(self, tag, value): values = value.split(' ') if 'none' in values: - tag.set_property('underline', pango.UNDERLINE_NONE) + tag.set_property('underline', Pango.Underline.NONE) tag.set_property('strikethrough', False) if 'underline' in values: - tag.set_property('underline', pango.UNDERLINE_SINGLE) + tag.set_property('underline', Pango.Underline.SINGLE) else: - tag.set_property('underline', pango.UNDERLINE_NONE) + tag.set_property('underline', Pango.Underline.NONE) if 'line-through' in values: tag.set_property('strikethrough', True) else: @@ -431,11 +463,11 @@ class HtmlHandler(xml.sax.handler.ContentHandler): def _parse_style_white_space(self, tag, value): if value == 'pre': - tag.set_property('wrap_mode', gtk.WRAP_NONE) + tag.set_property('wrap_mode', Gtk.WrapMode.NONE) elif value == 'normal': - tag.set_property('wrap_mode', gtk.WRAP_WORD) + tag.set_property('wrap_mode', Gtk.WrapMode.WORD) elif value == 'nowrap': - tag.set_property('wrap_mode', gtk.WRAP_NONE) + tag.set_property('wrap_mode', Gtk.WrapMode.NONE) def __length_tag_cb(self, value, tag, propname): try: @@ -483,15 +515,16 @@ class HtmlHandler(xml.sax.handler.ContentHandler): tag.type_ = type_ # to be used by the URL handler tag.connect('event', self.textview.hyperlink_handler, 'url') tag.set_property('foreground', gajim.config.get('urlmsgcolor')) - tag.set_property('underline', pango.UNDERLINE_SINGLE) + tag.set_property('underline', Pango.Underline.SINGLE) tag.is_anchor = True if title: tag.title = title return tag - def _update_img(self, (mem, alt), attrs, img_mark): + def _update_img(self, output, attrs, img_mark): '''Callback function called after the function helpers.download_image. ''' + mem, alt = output self._process_img(attrs, (mem, alt, img_mark)) def _process_img(self, attrs, loaded=None): @@ -507,7 +540,8 @@ class HtmlHandler(xml.sax.handler.ContentHandler): # The "data" URL scheme http://tools.ietf.org/html/rfc2397 import base64 img = attrs['src'].split(',')[1] - mem = base64.standard_b64decode(urllib2.unquote(img)) + mem = base64.standard_b64decode(urllib.parse.unquote( + img).encode('utf-8')) elif loaded is not None: (mem, alt, replace_mark) = loaded update = True @@ -526,7 +560,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): # Caveat: GdkPixbuf is known not to be safe to load # images from network... this program is now potentially # hackable ;) - loader = gtk.gdk.PixbufLoader() + loader = GdkPixbuf.PixbufLoader() dims = [0, 0] def height_cb(length): dims[1] = length @@ -549,7 +583,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): """ FIXME: Floats should be relative to the whole textview, and resize with it. This needs new pifbufs for every resize, - gtk.gdk.Pixbuf.scale_simple or similar. + GdkPixbuf.Pixbuf.scale_simple or similar. """ if isinstance(dims[0], float): dims[0] = int(dims[0]*w) @@ -586,7 +620,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): self.textbuf.delete_mark(tmpmark) else: self._insert_text('[IMG: %s]' % alt, working_iter) - except Exception, ex: + except Exception as ex: log.error('Error loading image ' + str(ex)) pixbuf = None alt = attrs.get('alt', 'Broken image') @@ -648,7 +682,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): self._insert_text(text.strip('\n')) def _anchor_event(self, tag, textview, event, iter_, href, type_): - if event.type == gtk.gdk.BUTTON_PRESS: + if event.type == Gdk.EventType.BUTTON_PRESS: self.textview.emit('url-clicked', href, type_) return True return False @@ -734,7 +768,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): self.list_counters.append(0) elif name == 'li': if self.list_counters[-1] is None: - li_head = unichr(0x2022) + li_head = chr(0x2022) else: self.list_counters[-1] += 1 li_head = '%i.' % self.list_counters[-1] @@ -761,15 +795,8 @@ class HtmlHandler(xml.sax.handler.ContentHandler): elif name == 'hr': #FIXME: plenty of unused attributes (width, height,...) :) self._jump_line() - try: - if self.conv_textbuf: - self.conv_textbuf.insert_pixbuf(self.iter, - self.conv_textview.focus_out_line_pixbuf) - else: - self._insert_text(u'\u2550'*40) - self._jump_line() - except Exception, e: - log.debug(str('Error in hr'+e)) + self._insert_text('\u2015'*40) + self._jump_line() elif name in LIST_ELEMS: self.list_counters.pop() elif name == 'li': @@ -798,11 +825,16 @@ class HtmlHandler(xml.sax.handler.ContentHandler): self._jump_line() self._end_span() -class HtmlTextView(gtk.TextView): + def get_font_size(self): + context = self.conv_textview.tv.get_style_context() + font = context.get_font(Gtk.StateType.NORMAL) + return font.get_size() / Pango.SCALE + +class HtmlTextView(Gtk.TextView): def __init__(self): - gobject.GObject.__init__(self) - self.set_wrap_mode(gtk.WRAP_CHAR) + GObject.GObject.__init__(self) + self.set_wrap_mode(Gtk.WrapMode.CHAR) self.set_editable(False) self._changed_cursor = False self.connect('destroy', self.__destroy_event) @@ -814,9 +846,7 @@ class HtmlTextView(gtk.TextView): self.connect('copy-clipboard', self.on_html_text_view_copy_clipboard) self.id_ = self.connect('button-release-event', self.on_left_mouse_button_release) - buffer_ = self.get_buffer() - buffer_.create_tag('eol') - + self.get_buffer().create_tag('eol') self.tooltip = tooltips.BaseTooltip() self.config = gajim.config self.interface = gajim.interface @@ -828,23 +858,23 @@ class HtmlTextView(gtk.TextView): self.tagURL = buffer_.create_tag('url') color = gajim.config.get('urlmsgcolor') self.tagURL.set_property('foreground', color) - self.tagURL.set_property('underline', pango.UNDERLINE_SINGLE) - self.tagURL.connect('event', self._hyperlink_handler, 'url') + self.tagURL.set_property('underline', Pango.Underline.SINGLE) + self.tagURL.connect('event', self.hyperlink_handler, 'url') self.tagMail = buffer_.create_tag('mail') self.tagMail.set_property('foreground', color) - self.tagMail.set_property('underline', pango.UNDERLINE_SINGLE) - self.tagMail.connect('event', self._hyperlink_handler, 'mail') + self.tagMail.set_property('underline', Pango.Underline.SINGLE) + self.tagMail.connect('event', self.hyperlink_handler, 'mail') self.tagXMPP = buffer_.create_tag('xmpp') self.tagXMPP.set_property('foreground', color) - self.tagXMPP.set_property('underline', pango.UNDERLINE_SINGLE) - self.tagXMPP.connect('event', self._hyperlink_handler, 'xmpp') + self.tagXMPP.set_property('underline', Pango.Underline.SINGLE) + self.tagXMPP.connect('event', self.hyperlink_handler, 'xmpp') self.tagSthAtSth = buffer_.create_tag('sth_at_sth') self.tagSthAtSth.set_property('foreground', color) - self.tagSthAtSth.set_property('underline', pango.UNDERLINE_SINGLE) - self.tagSthAtSth.connect('event', self._hyperlink_handler, 'sth_at_sth') + self.tagSthAtSth.set_property('underline', Pango.Underline.SINGLE) + self.tagSthAtSth.connect('event', self.hyperlink_handler, 'sth_at_sth') def __destroy_event(self, widget): if self.tooltip.timeout != 0: @@ -852,15 +882,18 @@ class HtmlTextView(gtk.TextView): def __leave_event(self, widget, event): if self._changed_cursor: - window = widget.get_window(gtk.TEXT_WINDOW_TEXT) - window.set_cursor(gtk.gdk.Cursor(gtk.gdk.XTERM)) + window = widget.get_window(Gtk.TextWindowType.TEXT) + window.set_cursor(Gdk.Cursor.new(Gdk.CursorType.XTERM)) self._changed_cursor = False def show_tooltip(self, tag): if not self.tooltip.win: # check if the current pointer is still over the line - x, y, _ = self.window.get_pointer() - x, y = self.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, x, y) + w = self.get_window(Gtk.TextWindowType.TEXT) + device = w.get_display().get_device_manager().get_client_pointer() + pointer = w.get_device_position(device) + x = pointer[1] + y = pointer[2] tags = self.get_iter_at_location(x, y).get_tags() is_over_anchor = False for tag_ in tags: @@ -871,13 +904,15 @@ class HtmlTextView(gtk.TextView): return text = getattr(tag, 'title', False) if text: - pointer = self.get_pointer() - position = self.window.get_origin() - self.tooltip.show_tooltip(text, 8, position[1] + pointer[1]) + position = w.get_origin()[1:] + self.tooltip.show_tooltip(text, 8, position[1] + y) def __motion_notify_event(self, widget, event): - x, y, _ = widget.window.get_pointer() - x, y = widget.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, x, y) + w = widget.get_window(Gtk.TextWindowType.TEXT) + device = w.get_display().get_device_manager().get_client_pointer() + pointer = w.get_device_position(device) + x = pointer[1] + y = pointer[2] tags = widget.get_iter_at_location(x, y).get_tags() anchor_tags = [tag for tag in tags if getattr(tag, 'is_anchor', False)] if self.tooltip.timeout != 0: @@ -885,14 +920,12 @@ class HtmlTextView(gtk.TextView): if not anchor_tags: self.tooltip.hide_tooltip() if not self._changed_cursor and anchor_tags: - window = widget.get_window(gtk.TEXT_WINDOW_TEXT) - window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2)) + w.set_cursor(Gdk.Cursor.new(Gdk.CursorType.HAND2)) self._changed_cursor = True - self.tooltip.timeout = gobject.timeout_add(500, self.show_tooltip, + self.tooltip.timeout = GLib.timeout_add(500, self.show_tooltip, anchor_tags[0]) elif self._changed_cursor and not anchor_tags: - window = widget.get_window(gtk.TEXT_WINDOW_TEXT) - window.set_cursor(gtk.gdk.Cursor(gtk.gdk.XTERM)) + w.set_cursor(Gdk.Cursor.new(Gdk.CursorType.XTERM)) self._changed_cursor = False return False @@ -900,8 +933,8 @@ class HtmlTextView(gtk.TextView): helpers.launch_browser_mailer(kind, text) def on_copy_link_activate(self, widget, text): - clip = gtk.clipboard_get() - clip.set_text(text) + clip = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) + clip.set_text(text, -1) # def on_start_chat_activate(self, widget, jid): # gajim.interface.new_chat_from_jid(self.account, jid) @@ -916,7 +949,8 @@ class HtmlTextView(gtk.TextView): dialogs.AddNewContactWindow(self.account, jid) def make_link_menu(self, event, kind, text): - xml = gtkgui_helpers.get_gtk_builder('chat_context_menu.ui') + from gtkgui_helpers import get_gtk_builder + xml = get_gtk_builder('chat_context_menu.ui') menu = xml.get_object('chat_context_menu') childs = menu.get_children() if kind == 'url': @@ -972,7 +1006,7 @@ class HtmlTextView(gtk.TextView): menu.popup(None, None, None, event.button, event.time) def hyperlink_handler(self, texttag, widget, event, iter_, kind): - if event.type == gtk.gdk.BUTTON_PRESS: + if event.type == Gdk.EventType.BUTTON_PRESS: begin_iter = iter_.copy() # we get the begining of the tag while not begin_iter.begins_tag(texttag): @@ -994,7 +1028,7 @@ class HtmlTextView(gtk.TextView): kind = 'sth_at_sth' else: word = self.textview.get_buffer().get_text(begin_iter, - end_iter).decode('utf-8') + end_iter) if event.button == 3: # right click self.make_link_menu(event, kind, word) @@ -1036,17 +1070,18 @@ class HtmlTextView(gtk.TextView): # buffer_.insert(eob, '\n') def on_html_text_view_copy_clipboard(self, unused_data): - clipboard = self.get_clipboard(gtk.gdk.SELECTION_CLIPBOARD) - clipboard.set_text(self.get_selected_text()) + clipboard = self.get_clipboard(Gdk.SELECTION_CLIPBOARD) + selected = self.get_selected_text() + clipboard.set_text(selected, -1) self.emit_stop_by_name('copy-clipboard') def on_html_text_view_realized(self, unused_data): self.get_buffer().remove_selection_clipboard(self.get_clipboard( - gtk.gdk.SELECTION_PRIMARY)) + Gdk.SELECTION_PRIMARY)) def on_html_text_view_unrealized(self, unused_data): self.get_buffer().add_selection_clipboard(self.get_clipboard( - gtk.gdk.SELECTION_PRIMARY)) + Gdk.SELECTION_PRIMARY)) def on_left_mouse_button_release(self, widget, event): if event.button != 1: @@ -1056,8 +1091,9 @@ class HtmlTextView(gtk.TextView): if bounds: # textview can be hidden while we add a new line in it. if self.has_screen(): - clipboard = self.get_clipboard(gtk.gdk.SELECTION_PRIMARY) - clipboard.set_text(self.get_selected_text()) + clipboard = self.get_clipboard(Gdk.SELECTION_PRIMARY) + selected = self.get_selected_text() + clipboard.set_text(selected, -1) def get_selected_text(self): bounds = self.get_buffer().get_selection_bounds() @@ -1067,10 +1103,10 @@ class HtmlTextView(gtk.TextView): while (search_iter.compare(end)): character = search_iter.get_char() - if character == u'\ufffc': + if character == '\ufffc': anchor = search_iter.get_child_anchor() if anchor: - text = anchor.get_data('plaintext') + text = anchor.plaintext if text: selection+=text else: @@ -1099,10 +1135,6 @@ if __name__ == '__main__': htmlview = ConversationTextview(None) - path = gtkgui_helpers.get_icon_path('gajim-muc_separator') - # use this for hr - htmlview.tv.focus_out_line_pixbuf = gtk.gdk.pixbuf_new_from_file(path) - tooltip = tooltips.BaseTooltip() def on_textview_motion_notify_event(widget, event): @@ -1110,20 +1142,20 @@ if __name__ == '__main__': Change the cursor to a hand when we are over a mail or an url """ global change_cursor - pointer_x, pointer_y = htmlview.tv.window.get_pointer()[0:2] - x, y = htmlview.tv.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, - pointer_x, pointer_y) + w = htmlview.tv.get_window(Gtk.TextWindowType.TEXT) + device = w.get_display().get_device_manager().get_client_pointer() + pointer = w.get_device_position(device) + x = pointer[1] + y = pointer[2] tags = htmlview.tv.get_iter_at_location(x, y).get_tags() if change_cursor: - htmlview.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor( - gtk.gdk.Cursor(gtk.gdk.XTERM)) + w.set_cursor(Gdk.Cursor.new(Gdk.CursorType.XTERM)) change_cursor = None tag_table = htmlview.tv.get_buffer().get_tag_table() for tag in tags: try: if tag.is_anchor: - htmlview.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor( - gtk.gdk.Cursor(gtk.gdk.HAND2)) + w.set_cursor(Gdk.Cursor.new(Gdk.CursorType.HAND2)) change_cursor = tag elif tag == tag_table.lookup('focus-out-line'): over_line = True @@ -1135,16 +1167,16 @@ if __name__ == '__main__': # if not over_line: # line_tooltip.hide_tooltip() #if over_line and not line_tooltip.win: - # line_tooltip.timeout = gobject.timeout_add(500, + # line_tooltip.timeout = GLib.timeout_add(500, # show_line_tooltip) - # htmlview.tv.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor( - # gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) + # htmlview.tv.get_window(Gtk.TextWindowType.TEXT).set_cursor( + # Gdk.Cursor.new(Gdk.CursorType.LEFT_PTR)) # change_cursor = tag htmlview.tv.connect('motion_notify_event', on_textview_motion_notify_event) def handler(texttag, widget, event, iter_, kind): - if event.type == gtk.gdk.BUTTON_PRESS: + if event.type == Gdk.EventType.BUTTON_PRESS: pass htmlview.tv.hyperlink_handler = htmlview.hyperlink_handler @@ -1265,19 +1297,19 @@ hhx4dbgYKAAA7' alt='Larry'/> </body> ''') htmlview.tv.show() - sw = gtk.ScrolledWindow() - sw.set_property('hscrollbar-policy', gtk.POLICY_AUTOMATIC) - sw.set_property('vscrollbar-policy', gtk.POLICY_AUTOMATIC) + sw = Gtk.ScrolledWindow() + sw.set_property('hscrollbar-policy', Gtk.PolicyType.AUTOMATIC) + sw.set_property('vscrollbar-policy', Gtk.PolicyType.AUTOMATIC) sw.set_property('border-width', 0) sw.add(htmlview.tv) sw.show() - frame = gtk.Frame() - frame.set_shadow_type(gtk.SHADOW_IN) + frame = Gtk.Frame() + frame.set_shadow_type(Gtk.ShadowType.IN) frame.show() frame.add(sw) - w = gtk.Window() + w = Gtk.Window() w.add(frame) w.set_default_size(400, 300) w.show_all() - w.connect('destroy', lambda w: gtk.main_quit()) - gtk.main() + w.connect('destroy', lambda w: Gtk.main_quit()) + Gtk.main() diff --git a/src/ipython_view.py b/src/ipython_view.py index 55ec33280214b8be83a59f35925a7325b0b32239..1da9f9300a7974e078cce35ed425362823f29333 100644 --- a/src/ipython_view.py +++ b/src/ipython_view.py @@ -42,11 +42,13 @@ available under the terms of the BSD which accompanies this distribution, and is available at U{http://www.opensource.org/licenses/bsd-license.php} """ -import gtk, gobject +from gi.repository import Gtk +from gi.repository import GObject +from gi.repository import GLib import re import sys import os -import pango +from gi.repository import Pango from StringIO import StringIO try: @@ -128,7 +130,7 @@ class IterableIPShell: # Workaround for updating namespace with sys.modules # self.__update_namespace() - + def __update_namespace(self): ''' Update self.IP namespace for autocompletion with sys.modules @@ -187,7 +189,7 @@ class IterableIPShell: Generate prompt depending on is_continuation value @param is_continuation - @type is_continuation: boolean + @type is_continuation: boolean @return: The prompt string representation @rtype: string @@ -308,15 +310,15 @@ class IterableIPShell: @param header: Header to be printed before output @type header: string """ - if verbose or debug: print header+cmd + if verbose or debug: print(header+cmd) # flush stdout so we don't mangle python's buffering if not debug: input_, output = os.popen4(cmd) - print output.read() + print(output.read()) output.close() input_.close() -class ConsoleView(gtk.TextView): +class ConsoleView(Gtk.TextView): """ Specialized text view for console-like workflow @@ -324,13 +326,13 @@ class ConsoleView(gtk.TextView): @type ANSI_COLORS: dictionary @ivar text_buffer: Widget's text buffer. - @type text_buffer: gtk.TextBuffer + @type text_buffer: Gtk.TextBuffer @ivar color_pat: Regex of terminal color pattern @type color_pat: _sre.SRE_Pattern @ivar mark: Scroll mark for automatic scrolling on input. - @type mark: gtk.TextMark + @type mark: Gtk.TextMark @ivar line_start: Start of command line mark. - @type line_start: gtk.TextMark + @type line_start: Gtk.TextMark """ ANSI_COLORS = {'0;30': 'Black', '0;31': 'Red', @@ -346,8 +348,8 @@ class ConsoleView(gtk.TextView): """ Initialize console view """ - gtk.TextView.__init__(self) - self.modify_font(pango.FontDescription('Mono')) + GObject.GObject.__init__(self) + self.override_font(Pango.FontDescription('Mono')) self.set_cursor_visible(True) self.text_buffer = self.get_buffer() self.mark = self.text_buffer.create_mark('scroll_mark', @@ -366,7 +368,7 @@ class ConsoleView(gtk.TextView): self.connect('key-press-event', self.onKeyPress) def write(self, text, editable=False): - gobject.idle_add(self._write, text, editable) + GLib.idle_add(self._write, text, editable) def _write(self, text, editable=False): """ @@ -400,7 +402,7 @@ class ConsoleView(gtk.TextView): def showPrompt(self, prompt): - gobject.idle_add(self._showPrompt, prompt) + GLib.idle_add(self._showPrompt, prompt) def _showPrompt(self, prompt): """ @@ -414,7 +416,7 @@ class ConsoleView(gtk.TextView): self.text_buffer.get_end_iter()) def changeLine(self, text): - gobject.idle_add(self._changeLine, text) + GLib.idle_add(self._changeLine, text) def _changeLine(self, text): """ @@ -441,7 +443,7 @@ class ConsoleView(gtk.TextView): return rv def showReturned(self, text): - gobject.idle_add(self._showReturned, text) + GLib.idle_add(self._showReturned, text) def _showReturned(self, text): """ @@ -470,9 +472,9 @@ class ConsoleView(gtk.TextView): line @param widget: Widget that key press accored in. - @type widget: gtk.Widget + @type widget: Gtk.Widget @param event: Event object - @type event: gtk.gdk.Event + @type event: Gdk.Event @return: Return True if event should not trickle. @rtype: boolean @@ -482,14 +484,14 @@ class ConsoleView(gtk.TextView): selection_mark = self.text_buffer.get_selection_bound() selection_iter = self.text_buffer.get_iter_at_mark(selection_mark) start_iter = self.text_buffer.get_iter_at_mark(self.line_start) - if event.keyval == gtk.keysyms.Home: - if event.state == 0: + if event.keyval == Gdk.KEY_Home: + if event.get_state() == 0: self.text_buffer.place_cursor(start_iter) return True - elif event.state == gtk.gdk.SHIFT_MASK: + elif event.get_state() == Gdk.ModifierType.SHIFT_MASK: self.text_buffer.move_mark(insert_mark, start_iter) return True - elif event.keyval == gtk.keysyms.Left: + elif event.keyval == Gdk.KEY_Left: insert_iter.backward_cursor_position() if not insert_iter.editable(True): return True @@ -555,27 +557,27 @@ class IPythonView(ConsoleView, IterableIPShell): autocompletions, etc @param widget: Widget that key press occured in. - @type widget: gtk.Widget + @type widget: Gtk.Widget @param event: Event object. - @type event: gtk.gdk.Event + @type event: Gdk.Event @return: True if event should not trickle. @rtype: boolean """ - if event.state & gtk.gdk.CONTROL_MASK and event.keyval == 99: + if event.get_state() & Gdk.ModifierType.CONTROL_MASK and event.keyval == 99: self.interrupt = True self._processLine() return True - elif event.keyval == gtk.keysyms.Return: + elif event.keyval == Gdk.KEY_Return: self._processLine() return True - elif event.keyval == gtk.keysyms.Up: + elif event.keyval == Gdk.KEY_Up: self.changeLine(self.historyBack()) return True - elif event.keyval == gtk.keysyms.Down: + elif event.keyval == Gdk.KEY_Down: self.changeLine(self.historyForward()) return True - elif event.keyval == gtk.keysyms.Tab: + elif event.keyval == Gdk.KEY_Tab: if not self.getCurrentLine().strip(): return False completed, possibilities = self.complete(self.getCurrentLine()) diff --git a/src/message_control.py b/src/message_control.py index 9d3324015f3c8c268a0b77fc56f66017460ae982..2520e2a161127c4e872ace4d23aba76ab8480b68 100644 --- a/src/message_control.py +++ b/src/message_control.py @@ -42,7 +42,7 @@ TYPE_PM = 'pm' class MessageControl(object): """ - An abstract base widget that can embed in the gtk.Notebook of a + An abstract base widget that can embed in the Gtk.Notebook of a MessageWindow """ @@ -156,7 +156,7 @@ class MessageControl(object): Derivded classes MUST implement this. """ - # Return a markup'd label and optional gtk.Color in a tupple like: + # Return a markup'd label and optional Gtk.Color in a tupple like: # return (label_str, None) pass diff --git a/src/message_textview.py b/src/message_textview.py index 628701a42aa11ab5da3479c214b366860717f75c..ddb4b726568d727f304a7172180ce00e0ed8cd4a 100644 --- a/src/message_textview.py +++ b/src/message_textview.py @@ -23,35 +23,37 @@ import gc -import gtk -import gobject -import pango +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GObject +from gi.repository import GLib +from gi.repository import Pango import gtkgui_helpers from common import gajim -class MessageTextView(gtk.TextView): +class MessageTextView(Gtk.TextView): """ Class for the message textview (where user writes new messages) for chat/groupchat windows """ UNDO_LIMIT = 20 __gsignals__ = dict( - mykeypress = (gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_ACTION, + mykeypress = (GObject.SignalFlags.RUN_LAST | GObject.SignalFlags.ACTION, None, # return value - (int, gtk.gdk.ModifierType ) # arguments + (int, Gdk.ModifierType ) # arguments ) ) def __init__(self): - gtk.TextView.__init__(self) + GObject.GObject.__init__(self) # set properties self.set_border_width(1) self.set_accepts_tab(True) self.set_editable(True) self.set_cursor_visible(True) - self.set_wrap_mode(gtk.WRAP_WORD_CHAR) + self.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) self.set_left_margin(2) self.set_right_margin(2) self.set_pixels_above_lines(2) @@ -69,15 +71,15 @@ class MessageTextView(gtk.TextView): self.fonts_tags = [] self.other_tags = {} self.other_tags['bold'] = _buffer.create_tag('bold') - self.other_tags['bold'].set_property('weight', pango.WEIGHT_BOLD) + self.other_tags['bold'].set_property('weight', Pango.Weight.BOLD) self.begin_tags['bold'] = '<strong>' self.end_tags['bold'] = '</strong>' self.other_tags['italic'] = _buffer.create_tag('italic') - self.other_tags['italic'].set_property('style', pango.STYLE_ITALIC) + self.other_tags['italic'].set_property('style', Pango.Style.ITALIC) self.begin_tags['italic'] = '<em>' self.end_tags['italic'] = '</em>' self.other_tags['underline'] = _buffer.create_tag('underline') - self.other_tags['underline'].set_property('underline', pango.UNDERLINE_SINGLE) + self.other_tags['underline'].set_property('underline', Pango.Underline.SINGLE) self.begin_tags['underline'] = '<span style="text-decoration: underline;">' self.end_tags['underline'] = '</span>' self.other_tags['strike'] = _buffer.create_tag('strike') @@ -145,19 +147,23 @@ class MessageTextView(gtk.TextView): start, finish = self.get_active_iters() _buffer.remove_all_tags(start, finish) - def color_set(self, widget, response, color): - if response == -6: + def color_set(self, widget, response): + if response == -6 or response == -4: widget.destroy() return - _buffer = self.get_buffer() - color = color.get_current_color() + + color = widget.get_property('rgba') widget.destroy() - color_string = gtkgui_helpers.make_color_string(color) + _buffer = self.get_buffer() + # Create #aabbcc color string from rgba color + color_string = '#%02X%02X%02X' % (round(color.red*255), + round(color.green*255), round(color.blue*255)) + tag_name = 'color' + color_string if not tag_name in self.color_tags: tagColor = _buffer.create_tag(tag_name) tagColor.set_property('foreground', color_string) - self.begin_tags[tag_name] = '<span style="color: ' + color_string + ';">' + self.begin_tags[tag_name] = '<span style="color: %s;">' % color_string self.end_tags[tag_name] = '</span>' self.color_tags.append(tag_name) @@ -168,23 +174,23 @@ class MessageTextView(gtk.TextView): _buffer.apply_tag_by_name(tag_name, start, finish) - def font_set(self, widget, response, font): - if response == -6: + def font_set(self, widget, response, start, finish): + if response == -6 or response == -4: widget.destroy() return - _buffer = self.get_buffer() - - font = font.get_font_name() - font_desc = pango.FontDescription(font) + font = widget.get_font() + font_desc = widget.get_font_desc() family = font_desc.get_family() size = font_desc.get_size() - size = size / pango.SCALE + size = size / Pango.SCALE weight = font_desc.get_weight() style = font_desc.get_style() widget.destroy() + _buffer = self.get_buffer() + tag_name = 'font' + font if not tag_name in self.fonts_tags: tagFont = _buffer.create_tag(tag_name) @@ -195,19 +201,17 @@ class MessageTextView(gtk.TextView): self.end_tags[tag_name] = '</span>' self.fonts_tags.append(tag_name) - start, finish = self.get_active_iters() - for tag in self.fonts_tags: _buffer.remove_tag_by_name(tag, start, finish) _buffer.apply_tag_by_name(tag_name, start, finish) - if weight == pango.WEIGHT_BOLD: + if weight == Pango.Weight.BOLD: _buffer.apply_tag_by_name('bold', start, finish) else: _buffer.remove_tag_by_name('bold', start, finish) - if style == pango.STYLE_ITALIC: + if style == Pango.Style.ITALIC: _buffer.apply_tag_by_name('italic', start, finish) else: _buffer.remove_tag_by_name('italic', start, finish) @@ -217,7 +221,7 @@ class MessageTextView(gtk.TextView): old = _buffer.get_start_iter() tags = {} tags['bold'] = False - iter = _buffer.get_start_iter() + iter_ = _buffer.get_start_iter() old = _buffer.get_start_iter() text = '' modified = False @@ -229,31 +233,31 @@ class MessageTextView(gtk.TextView): text = text.replace('\n', '<br />') return text - for tag in iter.get_toggled_tags(True): + for tag in iter_.get_toggled_tags(True): tag_name = tag.get_property('name') if tag_name not in self.begin_tags: continue text += self.begin_tags[tag_name] modified = True - while (iter.forward_to_tag_toggle(None) and not iter.is_end()): - text += xhtml_special(_buffer.get_text(old, iter)) + while (iter_.forward_to_tag_toggle(None) and not iter_.is_end()): + text += xhtml_special(_buffer.get_text(old, iter_, True)) old.forward_to_tag_toggle(None) new_tags, old_tags, end_tags = [], [], [] - for tag in iter.get_toggled_tags(True): + for tag in iter_.get_toggled_tags(True): tag_name = tag.get_property('name') if tag_name not in self.begin_tags: continue new_tags.append(tag_name) modified = True - for tag in iter.get_tags(): + for tag in iter_.get_tags(): tag_name = tag.get_property('name') if tag_name not in self.begin_tags or tag_name not in self.end_tags: continue if tag_name not in new_tags: old_tags.append(tag_name) - for tag in iter.get_toggled_tags(False): + for tag in iter_.get_toggled_tags(False): tag_name = tag.get_property('name') if tag_name not in self.end_tags: continue @@ -268,8 +272,8 @@ class MessageTextView(gtk.TextView): for tag in old_tags: text += self.begin_tags[tag] - text += xhtml_special(_buffer.get_text(old, _buffer.get_end_iter())) - for tag in iter.get_toggled_tags(False): + text += xhtml_special(_buffer.get_text(old, _buffer.get_end_iter(), True)) + for tag in iter_.get_toggled_tags(False): tag_name = tag.get_property('name') if tag_name not in self.end_tags: continue @@ -281,7 +285,7 @@ class MessageTextView(gtk.TextView): return None def destroy(self): - gobject.idle_add(gc.collect) + GLib.idle_add(gc.collect) def clear(self, widget = None): """ @@ -322,62 +326,62 @@ class MessageTextView(gtk.TextView): # and we also return True there to stop the default action from running # CTRL + SHIFT + TAB -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.ISO_Left_Tab, - gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.ISO_Left_Tab, - gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK) - -# CTRL + TAB -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Tab, - gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.Tab, - gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK) - -# TAB -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Tab, - 0, 'mykeypress', int, gtk.keysyms.Tab, gtk.gdk.ModifierType, 0) - -# CTRL + UP -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Up, - gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.Up, - gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK) - -# CTRL + DOWN -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Down, - gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.Down, - gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK) - -# CTRL + SHIFT + UP -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Up, - gtk.gdk.CONTROL_MASK | gtk.gdk.SHIFT_MASK, 'mykeypress', int, - gtk.keysyms.Up, gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK | - gtk.gdk.SHIFT_MASK) - -# CTRL + SHIFT + DOWN -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Down, - gtk.gdk.CONTROL_MASK | gtk.gdk.SHIFT_MASK, 'mykeypress', int, - gtk.keysyms.Down, gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK | - gtk.gdk.SHIFT_MASK) - -# ENTER -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Return, - 0, 'mykeypress', int, gtk.keysyms.Return, - gtk.gdk.ModifierType, 0) - -# Ctrl + Enter -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.Return, - gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.Return, - gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK) - -# Keypad Enter -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.KP_Enter, - 0, 'mykeypress', int, gtk.keysyms.KP_Enter, - gtk.gdk.ModifierType, 0) - -# Ctrl + Keypad Enter -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.KP_Enter, - gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.KP_Enter, - gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK) - -# Ctrl + z -gtk.binding_entry_add_signal(MessageTextView, gtk.keysyms.z, - gtk.gdk.CONTROL_MASK, 'mykeypress', int, gtk.keysyms.z, - gtk.gdk.ModifierType, gtk.gdk.CONTROL_MASK) +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_ISO_Left_Tab, + #Gdk.ModifierType.CONTROL_MASK, 'mykeypress', int, Gdk.KEY_ISO_Left_Tab, + #Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK) + +## CTRL + TAB +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Tab, + #Gdk.ModifierType.CONTROL_MASK, 'mykeypress', int, Gdk.KEY_Tab, + #Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK) + +## TAB +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Tab, + #0, 'mykeypress', int, Gdk.KEY_Tab, Gdk.ModifierType, 0) + +## CTRL + UP +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Up, + #Gdk.ModifierType.CONTROL_MASK, 'mykeypress', int, Gdk.KEY_Up, + #Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK) + +## CTRL + DOWN +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Down, + #Gdk.ModifierType.CONTROL_MASK, 'mykeypress', int, Gdk.KEY_Down, + #Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK) + +## CTRL + SHIFT + UP +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Up, + #Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK, 'mykeypress', int, + #Gdk.KEY_Up, Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK | + #Gdk.ModifierType.SHIFT_MASK) + +## CTRL + SHIFT + DOWN +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Down, + #Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK, 'mykeypress', int, + #Gdk.KEY_Down, Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK | + #Gdk.ModifierType.SHIFT_MASK) + +## ENTER +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Return, + #0, 'mykeypress', int, Gdk.KEY_Return, + #Gdk.ModifierType, 0) + +## Ctrl + Enter +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_Return, + #Gdk.ModifierType.CONTROL_MASK, 'mykeypress', int, Gdk.KEY_Return, + #Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK) + +## Keypad Enter +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_KP_Enter, + #0, 'mykeypress', int, Gdk.KEY_KP_Enter, + #Gdk.ModifierType, 0) + +## Ctrl + Keypad Enter +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_KP_Enter, + #Gdk.ModifierType.CONTROL_MASK, 'mykeypress', int, Gdk.KEY_KP_Enter, + #Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK) + +## Ctrl + z +#Gtk.binding_entry_add_signal(MessageTextView, Gdk.KEY_z, + #Gdk.ModifierType.CONTROL_MASK, 'mykeypress', int, Gdk.KEY_z, + #Gdk.ModifierType, Gdk.ModifierType.CONTROL_MASK) diff --git a/src/message_window.py b/src/message_window.py index 17ba02ff78a772dacd4f5b695ed06dd305c4de01..a0f82ad6d73ab87c3dd48542dfc422e6a2efb84a 100644 --- a/src/message_window.py +++ b/src/message_window.py @@ -27,8 +27,10 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GObject +from gi.repository import GLib import time import common @@ -105,17 +107,17 @@ class MessageWindow(object): '<Control>b', '<Control>F4', '<Control>w', '<Control>Page_Up', '<Control>Page_Down', '<Alt>Right', '<Alt>Left', '<Alt>d', '<Alt>c', '<Alt>m', '<Alt>t', 'Escape'] + \ - ['<Alt>'+str(i) for i in xrange(10)] - accel_group = gtk.AccelGroup() + ['<Alt>'+str(i) for i in list(range(10))] + accel_group = Gtk.AccelGroup() for key in keys: - keyval, mod = gtk.accelerator_parse(key) - accel_group.connect_group(keyval, mod, gtk.ACCEL_VISIBLE, + keyval, mod = Gtk.accelerator_parse(key) + accel_group.connect(keyval, mod, Gtk.AccelFlags.VISIBLE, self.accel_group_func) self.window.add_accel_group(accel_group) # gtk+ doesn't make use of the motion notify on gtkwindow by default # so this line adds that - self.window.add_events(gtk.gdk.POINTER_MOTION_MASK) + self.window.add_events(Gdk.EventMask.POINTER_MOTION_MASK) id_ = self.notebook.connect('switch-page', self._on_notebook_switch_page) @@ -127,13 +129,13 @@ class MessageWindow(object): # Tab customizations pref_pos = gajim.config.get('tabs_position') if pref_pos == 'bottom': - nb_pos = gtk.POS_BOTTOM + nb_pos = Gtk.PositionType.BOTTOM elif pref_pos == 'left': - nb_pos = gtk.POS_LEFT + nb_pos = Gtk.PositionType.LEFT elif pref_pos == 'right': - nb_pos = gtk.POS_RIGHT + nb_pos = Gtk.PositionType.RIGHT else: - nb_pos = gtk.POS_TOP + nb_pos = Gtk.PositionType.TOP self.notebook.set_tab_pos(nb_pos) window_mode = gajim.interface.msg_win_mgr.mode if gajim.config.get('tabs_always_visible') or \ @@ -252,7 +254,7 @@ class MessageWindow(object): 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(): + for i in list(self.handlers.keys()): if self.handlers[i].handler_is_connected(i): self.handlers[i].disconnect(i) del self.handlers[i] @@ -276,17 +278,17 @@ class MessageWindow(object): scrolled = True self.notebook.set_show_tabs(True) if scrolled: - gobject.idle_add(conv_textview.scroll_to_end_iter) + GLib.idle_add(conv_textview.scroll_to_end_iter) # Add notebook page and connect up to the tab's close button xml = gtkgui_helpers.get_gtk_builder('message_window.ui', 'chat_tab_ebox') tab_label_box = xml.get_object('chat_tab_ebox') widget = xml.get_object('tab_close_button') - #this reduces the size of the button - style = gtk.RcStyle() - style.xthickness = 0 - style.ythickness = 0 - widget.modify_style(style) + # this reduces the size of the button +# style = Gtk.RcStyle() +# style.xthickness = 0 +# style.ythickness = 0 +# widget.modify_style(style) id_ = widget.connect('clicked', self._on_close_button_clicked, control) control.handlers[id_] = widget @@ -306,7 +308,7 @@ class MessageWindow(object): # NOTE: we do not call set_control_active(True) since we don't know # whether the tab is the active one. self.show_title() - gobject.timeout_add(500, control.msg_textview.grab_focus) + GLib.timeout_add(500, control.msg_textview.grab_focus) def on_tab_eventbox_button_press_event(self, widget, event, child): if event.button == 3: # right click @@ -318,28 +320,28 @@ class MessageWindow(object): self.remove_tab(ctrl, self.CLOSE_TAB_MIDDLE_CLICK) else: ctrl = self._widget_to_control(child) - gobject.idle_add(ctrl.msg_textview.grab_focus) + GLib.idle_add(ctrl.msg_textview.grab_focus) def _on_message_textview_mykeypress_event(self, widget, event_keyval, event_keymod): # NOTE: handles mykeypress which is custom signal; see message_textview.py # construct event instance from binding - event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) # it's always a key-press here + event = Gdk.Event(Gdk.EventType.KEY_PRESS) # it's always a key-press here event.keyval = event_keyval event.state = event_keymod event.time = 0 # assign current time - if event.state & gtk.gdk.CONTROL_MASK: + if event.get_state() & Gdk.ModifierType.CONTROL_MASK: # Tab switch bindings - if event.keyval == gtk.keysyms.Tab: # CTRL + TAB + if event.keyval == Gdk.KEY_Tab: # CTRL + TAB self.move_to_next_unread_tab(True) - elif event.keyval == gtk.keysyms.ISO_Left_Tab: # CTRL + SHIFT + TAB + elif event.keyval == Gdk.KEY_ISO_Left_Tab: # CTRL + SHIFT + TAB self.move_to_next_unread_tab(False) - elif event.keyval == gtk.keysyms.Page_Down: # CTRL + PAGE DOWN - self.notebook.emit('key_press_event', event) - elif event.keyval == gtk.keysyms.Page_Up: # CTRL + PAGE UP - self.notebook.emit('key_press_event', event) + elif event.keyval == Gdk.KEY_Page_Down: # CTRL + PAGE DOWN + self.notebook.event(event) + elif event.keyval == Gdk.KEY_Page_Up: # CTRL + PAGE UP + self.notebook.event(event) def accel_group_func(self, accel_group, acceleratable, keyval, modifier): st = '1234567890' # alt+1 means the first tab (tab 0) @@ -349,76 +351,76 @@ class MessageWindow(object): return # CTRL mask - if modifier & gtk.gdk.CONTROL_MASK: - if keyval == gtk.keysyms.h: # CTRL + h - if gtk.settings_get_default().get_property( + if modifier & Gdk.ModifierType.CONTROL_MASK: + if keyval == Gdk.KEY_h: # CTRL + h + if Gtk.Settings.get_default().get_property( 'gtk-key-theme-name') != 'Emacs': control._on_history_menuitem_activate() return True elif control.type_id == message_control.TYPE_CHAT and \ - keyval == gtk.keysyms.f: # CTRL + f + keyval == Gdk.KEY_f: # CTRL + f # CTRL + f moves cursor one char forward when user uses Emacs # theme - if not gtk.settings_get_default().get_property( + if not Gtk.Settings.get_default().get_property( 'gtk-key-theme-name') == 'Emacs': control._on_send_file_menuitem_activate(None) return True elif control.type_id == message_control.TYPE_CHAT and \ - keyval == gtk.keysyms.g: # CTRL + g + keyval == Gdk.KEY_g: # CTRL + g control._on_convert_to_gc_menuitem_activate(None) return True elif control.type_id in (message_control.TYPE_CHAT, - message_control.TYPE_PM) and keyval == gtk.keysyms.i: # CTRL + i + message_control.TYPE_PM) and keyval == Gdk.KEY_i: # CTRL + i control._on_contact_information_menuitem_activate(None) return True - elif keyval == gtk.keysyms.l or keyval == gtk.keysyms.L: # CTRL + l|L + elif keyval == Gdk.KEY_l or keyval == Gdk.KEY_L: # CTRL + l|L control.conv_textview.clear() return True - elif keyval == gtk.keysyms.u: # CTRL + u: emacs style clear line + elif keyval == Gdk.KEY_u: # CTRL + u: emacs style clear line control.clear(control.msg_textview) return True elif control.type_id == message_control.TYPE_GC and \ - keyval == gtk.keysyms.b: # CTRL + b + keyval == Gdk.KEY_b: # CTRL + b control._on_bookmark_room_menuitem_activate(None) return True # Tab switch bindings - elif keyval == gtk.keysyms.F4: # CTRL + F4 + elif keyval == Gdk.KEY_F4: # CTRL + F4 self.remove_tab(control, self.CLOSE_CTRL_KEY) return True - elif keyval == gtk.keysyms.w: # CTRL + w + elif keyval == Gdk.KEY_w: # CTRL + w # CTRL + w removes latest word before sursor when User uses emacs # theme - if not gtk.settings_get_default().get_property( + if not Gtk.Settings.get_default().get_property( 'gtk-key-theme-name') == 'Emacs': self.remove_tab(control, self.CLOSE_CTRL_KEY) return True - elif keyval in (gtk.keysyms.Page_Up, gtk.keysyms.Page_Down): + elif keyval in (Gdk.KEY_Page_Up, Gdk.KEY_Page_Down): # CTRL + PageUp | PageDown # Create event and send it to notebook - event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) - event.window = self.window.window + event = Gdk.Event(Gdk.EventType.KEY_PRESS) + event.window = self.window.get_window() event.time = int(time.time()) - event.state = gtk.gdk.CONTROL_MASK + event.state = Gdk.ModifierType.CONTROL_MASK event.keyval = int(keyval) - self.notebook.emit('key_press_event', event) + self.notebook.event(event) return True - if modifier & gtk.gdk.SHIFT_MASK: + if modifier & Gdk.ModifierType.SHIFT_MASK: # CTRL + SHIFT if control.type_id == message_control.TYPE_GC and \ - keyval == gtk.keysyms.n: # CTRL + SHIFT + n + keyval == Gdk.KEY_n: # CTRL + SHIFT + n control._on_change_nick_menuitem_activate(None) return True # MOD1 (ALT) mask - elif modifier & gtk.gdk.MOD1_MASK: + elif modifier & Gdk.ModifierType.MOD1_MASK: # Tab switch bindings - if keyval == gtk.keysyms.Right: # ALT + RIGHT + if keyval == Gdk.KEY_Right: # ALT + RIGHT new = self.notebook.get_current_page() + 1 if new >= self.notebook.get_n_pages(): new = 0 self.notebook.set_current_page(new) return True - elif keyval == gtk.keysyms.Left: # ALT + LEFT + elif keyval == Gdk.KEY_Left: # ALT + LEFT new = self.notebook.get_current_page() - 1 if new < 0: new = self.notebook.get_n_pages() - 1 @@ -427,23 +429,23 @@ class MessageWindow(object): elif chr(keyval) in st: # ALT + 1,2,3.. self.notebook.set_current_page(st.index(chr(keyval))) return True - elif keyval == gtk.keysyms.c: # ALT + C toggles chat buttons + elif keyval == Gdk.KEY_c: # ALT + C toggles chat buttons control.chat_buttons_set_visible(not control.hide_chat_buttons) return True - elif keyval == gtk.keysyms.m: # ALT + M show emoticons menu + elif keyval == Gdk.KEY_m: # ALT + M show emoticons menu control.show_emoticons_menu() return True - elif keyval == gtk.keysyms.d: # ALT + D show actions menu - if gtk.settings_get_default().get_property( + elif keyval == Gdk.KEY_d: # ALT + D show actions menu + if Gtk.Settings.get_default().get_property( 'gtk-key-theme-name') != 'Emacs': control.on_actions_button_clicked(control.actions_button) return True elif control.type_id == message_control.TYPE_GC and \ - keyval == gtk.keysyms.t: # ALT + t + keyval == Gdk.KEY_t: # ALT + t control._on_change_subject_menuitem_activate(None) return True # Close tab bindings - elif keyval == gtk.keysyms.Escape and \ + elif keyval == Gdk.KEY_Escape and \ gajim.config.get('escape_key_closes'): # Escape self.remove_tab(control, self.CLOSE_ESC) return True @@ -498,7 +500,7 @@ class MessageWindow(object): unread_str = '' if unread > 1: - unread_str = '[' + unicode(unread) + '] ' + unread_str = '[' + str(unread) + '] ' elif unread == 1: unread_str = '* ' else: @@ -546,7 +548,7 @@ class MessageWindow(object): ctrl_page = self.notebook.page_num(ctrl.widget) self.notebook.set_current_page(ctrl_page) self.window.present() - gobject.idle_add(ctrl.msg_textview.grab_focus) + GLib.idle_add(ctrl.msg_textview.grab_focus) def remove_tab(self, ctrl, method, reason = None, force = False): """ @@ -623,7 +625,10 @@ class MessageWindow(object): self.notebook.set_show_tabs(show_tabs_if_one_tab) def redraw_tab(self, ctrl, chatstate = None): - hbox = self.notebook.get_tab_label(ctrl.widget).get_children()[0] + tab = self.notebook.get_tab_label(ctrl.widget) + if not tab: + return + hbox = tab.get_children()[0] status_img = hbox.get_children()[0] nick_label = hbox.get_children()[1] @@ -639,12 +644,12 @@ class MessageWindow(object): (tab_label_str, tab_label_color) = ctrl.get_tab_label(chatstate) nick_label.set_markup(tab_label_str) if tab_label_color: - nick_label.modify_fg(gtk.STATE_NORMAL, tab_label_color) - nick_label.modify_fg(gtk.STATE_ACTIVE, tab_label_color) + nick_label.override_color(Gtk.StateFlags.NORMAL, tab_label_color) + nick_label.override_color(Gtk.StateFlags.ACTIVE, tab_label_color) tab_img = ctrl.get_tab_image() if tab_img: - if tab_img.get_storage_type() == gtk.IMAGE_ANIMATION: + if tab_img.get_storage_type() == Gtk.ImageType.ANIMATION: status_img.set_from_animation(tab_img.get_animation()) else: status_img.set_from_pixbuf(tab_img.get_pixbuf()) @@ -686,17 +691,15 @@ class MessageWindow(object): return self.window.is_active() def get_origin(self): - return self.window.window.get_origin() + return self.window.get_window().get_origin() def get_control(self, key, acct): """ Return the MessageControl for jid or n, where n is a notebook page index. When key is an int index acct may be None """ - if isinstance(key, str): - key = unicode(key, 'utf-8') - if isinstance(key, unicode): + if isinstance(key, str): jid = key try: return self._controls[acct][jid] @@ -736,8 +739,8 @@ class MessageWindow(object): del gajim.last_message_time[acct][old_jid] def controls(self): - for jid_dict in self._controls.values(): - for ctrl in jid_dict.values(): + for jid_dict in list(self._controls.values()): + for ctrl in list(jid_dict.values()): yield ctrl def get_nb_controls(self): @@ -791,8 +794,9 @@ class MessageWindow(object): def popup_menu(self, event): menu = self.get_active_control().prepare_context_menu() # show the menu - menu.popup(None, None, None, event.button, event.time) + menu.attach_to_widget(gajim.interface.roster.window, None) menu.show_all() + menu.popup(None, None, None, None, event.button, event.time) def _on_notebook_switch_page(self, notebook, page, page_num): old_no = notebook.get_current_page() @@ -811,42 +815,42 @@ class MessageWindow(object): def _on_notebook_key_press(self, widget, event): # when tab itself is selected, # make sure <- and -> are allowed for navigating between tabs - if event.keyval in (gtk.keysyms.Left, gtk.keysyms.Right): + if event.keyval in (Gdk.KEY_Left, Gdk.KEY_Right): return False control = self.get_active_control() - if event.state & gtk.gdk.SHIFT_MASK: + if event.get_state() & Gdk.ModifierType.SHIFT_MASK: # CTRL + SHIFT + TAB - if event.state & gtk.gdk.CONTROL_MASK and \ - event.keyval == gtk.keysyms.ISO_Left_Tab: + if event.get_state() & Gdk.ModifierType.CONTROL_MASK and \ + event.keyval == Gdk.KEY_ISO_Left_Tab: self.move_to_next_unread_tab(False) return True # SHIFT + PAGE_[UP|DOWN]: send to conv_textview - elif event.keyval in (gtk.keysyms.Page_Down, gtk.keysyms.Page_Up): - control.conv_textview.tv.emit('key_press_event', event) + elif event.keyval in (Gdk.KEY_Page_Down, Gdk.KEY_Page_Up): + control.conv_textview.tv.event(event) return True - elif event.state & gtk.gdk.CONTROL_MASK: - if event.keyval == gtk.keysyms.Tab: # CTRL + TAB + elif event.get_state() & Gdk.ModifierType.CONTROL_MASK: + if event.keyval == Gdk.KEY_Tab: # CTRL + TAB self.move_to_next_unread_tab(True) return True # Ctrl+PageUP / DOWN has to be handled by notebook - elif event.keyval == gtk.keysyms.Page_Down: + elif event.keyval == Gdk.KEY_Page_Down: self.move_to_next_unread_tab(True) return True - elif event.keyval == gtk.keysyms.Page_Up: + elif event.keyval == Gdk.KEY_Page_Up: self.move_to_next_unread_tab(False) return True - if event.keyval in (gtk.keysyms.Shift_L, gtk.keysyms.Shift_R, - gtk.keysyms.Control_L, gtk.keysyms.Control_R, gtk.keysyms.Caps_Lock, - gtk.keysyms.Shift_Lock, gtk.keysyms.Meta_L, gtk.keysyms.Meta_R, - gtk.keysyms.Alt_L, gtk.keysyms.Alt_R, gtk.keysyms.Super_L, - gtk.keysyms.Super_R, gtk.keysyms.Hyper_L, gtk.keysyms.Hyper_R): + if event.keyval in (Gdk.KEY_Shift_L, Gdk.KEY_Shift_R, + Gdk.KEY_Control_L, Gdk.KEY_Control_R, Gdk.KEY_Caps_Lock, + Gdk.KEY_Shift_Lock, Gdk.KEY_Meta_L, Gdk.KEY_Meta_R, + Gdk.KEY_Alt_L, Gdk.KEY_Alt_R, Gdk.KEY_Super_L, + Gdk.KEY_Super_R, Gdk.KEY_Hyper_L, Gdk.KEY_Hyper_R): return True if isinstance(control, ChatControlBase): # we forwarded it to message textview - control.msg_textview.emit('key_press_event', event) + control.msg_textview.event(event) control.msg_textview.grab_focus() def get_tab_at_xy(self, x, y): @@ -856,9 +860,9 @@ class MessageWindow(object): """ page_num = -1 to_right = False - horiz = self.notebook.get_tab_pos() == gtk.POS_TOP or \ - self.notebook.get_tab_pos() == gtk.POS_BOTTOM - for i in xrange(self.notebook.get_n_pages()): + horiz = self.notebook.get_tab_pos() == Gtk.PositionType.TOP or \ + self.notebook.get_tab_pos() == Gtk.PositionType.BOTTOM + for i in list(range(self.notebook.get_n_pages())): page = self.notebook.get_nth_page(i) tab = self.notebook.get_tab_label(page) tab_alloc = tab.get_allocation() @@ -884,7 +888,7 @@ class MessageWindow(object): Find the page num of the tab label """ page_num = -1 - for i in xrange(self.notebook.get_n_pages()): + for i in list(range(self.notebook.get_n_pages())): page = self.notebook.get_nth_page(i) tab = self.notebook.get_tab_label(page) if tab == tab_label: @@ -893,13 +897,13 @@ class MessageWindow(object): return page_num ################################################################################ -class MessageWindowMgr(gobject.GObject): +class MessageWindowMgr(GObject.GObject): """ A manager and factory for MessageWindow objects """ __gsignals__ = { - 'window-delete': (gobject.SIGNAL_RUN_LAST, None, (object,)), + 'window-delete': (GObject.SignalFlags.RUN_LAST, None, (object,)), } # These constants map to common.config.opt_one_window_types indices @@ -924,7 +928,7 @@ class MessageWindowMgr(gobject.GObject): 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) + GObject.GObject.__init__(self) self._windows = {} # Map the mode to a int constant for frequent compares @@ -985,7 +989,10 @@ class MessageWindowMgr(gobject.GObject): parent_size = win.window.get_size() # Need to add the size of the now visible paned handle, otherwise # the saved width of the message window decreases by this amount - handle_size = win.parent_paned.style_get_property('handle-size') + s = GObject.Value() + s.init(GObject.TYPE_INT) + win.parent_paned.style_get_property('handle-size', s) + handle_size = s.get_int() size = (parent_size[0] + size[0] + handle_size, size[1]) elif self.mode == self.ONE_MSG_WINDOW_PERACCT: size = (gajim.config.get_per('accounts', acct, 'msgwin-width'), @@ -1149,7 +1156,7 @@ class MessageWindowMgr(gobject.GObject): return ctrls def windows(self): - for w in self._windows.values(): + for w in list(self._windows.values()): yield w def controls(self): @@ -1196,7 +1203,7 @@ class MessageWindowMgr(gobject.GObject): 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 + width = msg_win.notebook.get_allocation().width if acct: gajim.config.set_per('accounts', acct, size_width_key, width) @@ -1207,8 +1214,8 @@ class MessageWindowMgr(gobject.GObject): gajim.config.set_per('accounts', acct, pos_y_key, y) else: - win_maximized = msg_win.window.window.get_state() == \ - gtk.gdk.WINDOW_STATE_MAXIMIZED + win_maximized = msg_win.window.get_window().get_state() == \ + Gdk.WindowState.MAXIMIZED gajim.config.set(max_win_key, win_maximized) width += width_adjust gajim.config.set(size_width_key, width) @@ -1236,7 +1243,7 @@ class MessageWindowMgr(gobject.GObject): else: # Stash current size so it can be restored if the MessageWindow # is not longer embedded - roster_width = w.parent_paned.get_child1().allocation.width + roster_width = w.parent_paned.get_position() gajim.config.set('roster_width', roster_width) while w.notebook.get_n_pages(): diff --git a/src/music_track_listener.py b/src/music_track_listener.py index ced9268babdab355aecef77f74ec13b219ba05e1..4768f90db53d45ae88a480caae57e409d8ba18f5 100644 --- a/src/music_track_listener.py +++ b/src/music_track_listener.py @@ -23,7 +23,7 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## -import gobject +from gi.repository import GObject if __name__ == '__main__': # install _() func before importing dbus_support from common import i18n @@ -36,9 +36,9 @@ class MusicTrackInfo(object): __slots__ = ['title', 'album', 'artist', 'duration', 'track_number', 'paused'] -class MusicTrackListener(gobject.GObject): +class MusicTrackListener(GObject.GObject): __gsignals__ = { - 'music-track-changed': (gobject.SIGNAL_RUN_LAST, None, (object,)), + 'music-track-changed': (GObject.SignalFlags.RUN_LAST, None, (object,)), } _instance = None @@ -290,14 +290,14 @@ class MusicTrackListener(gobject.GObject): if __name__ == '__main__': def music_track_change_cb(listener, music_track_info): if music_track_info is None: - print 'Stop!' + print('Stop!') else: - print music_track_info.title + print(music_track_info.title) listener = MusicTrackListener.get() listener.connect('music-track-changed', music_track_change_cb) track = listener.get_playing_track() if track is None: - print 'Now not playing anything' + print('Now not playing anything') else: - print 'Now playing: "%s" by %s' % (track.title, track.artist) - gobject.MainLoop().run() + print('Now playing: "%s" by %s' % (track.title, track.artist)) + GObject.MainLoop().run() diff --git a/src/negotiation.py b/src/negotiation.py index f1135147da187891cd77f63d4f8a9dc29e9e7831..800e10c432a36abb6d84f2a92fe9f53898ca1c1f 100644 --- a/src/negotiation.py +++ b/src/negotiation.py @@ -49,7 +49,7 @@ class FeatureNegotiationWindow: dataform = dataforms.ExtendForm(node = self.form) self.data_form_widget = dataforms_widget.DataFormWidget(dataform) self.data_form_widget.show() - config_vbox.pack_start(self.data_form_widget) + config_vbox.pack_start(self.data_form_widget, True, True, 0) self.xml.connect_signals(self) self.window.show_all() diff --git a/src/network_manager_listener.py b/src/network_manager_listener.py index ce29e9bd5a60b2156fadd0a283f5d4ba851e2c1c..504bf3fbe35d1d663733f56464f69c5311df005d 100644 --- a/src/network_manager_listener.py +++ b/src/network_manager_listener.py @@ -29,7 +29,7 @@ def device_now_active(self, *args): """ For Network Manager 0.6 """ - for connection in gajim.connections.itervalues(): + for connection in gajim.connections.values(): if gajim.config.get_per('accounts', connection.name, 'listen_to_network_manager') and connection.time_to_reconnect: connection._reconnect() @@ -38,7 +38,7 @@ def device_no_longer_active(self, *args): """ For Network Manager 0.6 """ - for connection in gajim.connections.itervalues(): + for connection in gajim.connections.values(): if gajim.config.get_per('accounts', connection.name, 'listen_to_network_manager') and connection.connected > 1: connection._disconnectedReconnCB() @@ -49,12 +49,12 @@ def state_changed(state): """ nm_state = props.Get("org.freedesktop.NetworkManager", "State") if nm_state == 3 or nm_state == 70: - for connection in gajim.connections.itervalues(): + for connection in gajim.connections.values(): if gajim.config.get_per('accounts', connection.name, 'listen_to_network_manager') and connection.time_to_reconnect: connection._reconnect() else: - for connection in gajim.connections.itervalues(): + for connection in gajim.connections.values(): if gajim.config.get_per('accounts', connection.name, 'listen_to_network_manager') and connection.connected > 1: connection._disconnectedReconnCB() diff --git a/src/notify.py b/src/notify.py index 704d3266f656ea820c1bc47b42dd9668edfdecbc..2e0d0e0f9f8b1c86aec0d789b2628f7454eb55ad 100644 --- a/src/notify.py +++ b/src/notify.py @@ -30,9 +30,10 @@ import os import time from dialogs import PopupNotificationWindow -import gobject +from gi.repository import GObject +from gi.repository import GLib import gtkgui_helpers -import gtk +from gi.repository import Gtk from common import gajim from common import helpers @@ -45,8 +46,8 @@ if dbus_support.supported: USER_HAS_PYNOTIFY = True # user has pynotify module try: - import pynotify - pynotify.init('Gajim Notification') + from gi.repository import Notify + Notify.init('Gajim Notification') except ImportError: USER_HAS_PYNOTIFY = False @@ -89,12 +90,12 @@ text=None, timeout=-1): if gajim.config.get('use_notif_daemon') and dbus_support.supported: try: DesktopNotification(event_type, jid, account, msg_type, - path_to_image, title, gobject.markup_escape_text(text), timeout) + path_to_image, title, GLib.markup_escape_text(text), timeout) return # sucessfully did D-Bus Notification procedure! - except dbus.DBusException, e: + except dbus.DBusException as e: # Connection to D-Bus failed gajim.log.debug(str(e)) - except TypeError, e: + except TypeError as e: # This means that we sent the message incorrectly gajim.log.debug(str(e)) @@ -103,17 +104,17 @@ text=None, timeout=-1): if not text and event_type == 'new_message': # empty text for new_message means do_preview = False # -> default value for text - _text = gobject.markup_escape_text( - gajim.get_name_from_jid(account, jid)) + _text = GLib.markup_escape_text(gajim.get_name_from_jid(account, + jid)) else: - _text = gobject.markup_escape_text(text) + _text = GLib.markup_escape_text(text) if not title: _title = '' else: _title = title - notification = pynotify.Notification(_title, _text) + notification = Notify.Notification(_title, _text) notification.set_timeout(timeout*1000) notification.set_category(event_type) @@ -122,14 +123,14 @@ text=None, timeout=-1): notification.set_data('account', account) notification.set_data('msg_type', msg_type) notification.set_property('icon-name', path_to_image) - if 'actions' in pynotify.get_server_caps(): + if 'actions' in Notify.get_server_caps(): notification.add_action('default', 'Default Action', on_pynotify_notification_clicked) try: notification.show() return - except gobject.GError, e: + except GObject.GError as e: # Connection to notification-daemon failed, see #2893 gajim.log.debug(str(e)) @@ -156,8 +157,16 @@ class Notification: def _nec_notification(self, obj): if obj.do_popup: + if obj.popup_image: + icon_path = gtkgui_helpers.get_icon_path(obj.popup_image, 48) + if icon_path: + image_path = icon_path + elif obj.popup_image_path: + image_path = obj.popup_image_path + else: + image_path = '' popup(obj.popup_event_type, obj.jid, obj.conn.name, - obj.popup_msg_type, path_to_image=obj.popup_image, + obj.popup_msg_type, path_to_image=image_path, title=obj.popup_title, text=obj.popup_text, timeout=obj.popup_timeout) @@ -357,7 +366,8 @@ class DesktopNotification: if gajim.interface.systray_enabled and \ gajim.config.get('attach_notifications_to_systray'): status_icon = gajim.interface.systray.status_icon - x, y, width, height = status_icon.get_geometry()[1] + rect = status_icon.get_geometry()[2] + x, y, width, height = rect.x, rect.y, rect.width, rect.height pos_x = x + (width / 2) pos_y = y + (height / 2) hints = {'x': pos_x, 'y': pos_y} @@ -397,7 +407,7 @@ class DesktopNotification: dbus.UInt32(self.timeout*1000), reply_handler=self.attach_by_id, error_handler=self.notify_another_way) - except Exception, e: + except Exception as e: self.notify_another_way(e) else: try: @@ -412,7 +422,7 @@ class DesktopNotification: dbus.UInt32(self.timeout*1000), reply_handler=self.attach_by_id, error_handler=self.notify_another_way) - except Exception, e: + except Exception as e: self.notify_another_way(e) def attach_by_id(self, id_): diff --git a/src/plugins/__init__.py b/src/plugins/__init__.py index 0d5d18fda2885d02b94e8a64b898491f791f3320..07b0b6c5613d530a4b03dbdc5c40750e7499833f 100644 --- a/src/plugins/__init__.py +++ b/src/plugins/__init__.py @@ -24,7 +24,7 @@ Main file of plugins package. :license: GPL ''' -from pluginmanager import PluginManager -from plugin import GajimPlugin +from .pluginmanager import PluginManager +from .plugin import GajimPlugin __all__ = ['PluginManager', 'GajimPlugin'] diff --git a/src/plugins/gui.py b/src/plugins/gui.py index 864c929721856f1f2f9fb998e0ebf0c23c148437..bc99e52cf1865e90c8d12b14b117b535f3040dd2 100644 --- a/src/plugins/gui.py +++ b/src/plugins/gui.py @@ -26,8 +26,11 @@ GUI classes related to plug-in management. __all__ = ['PluginsWindow'] -import pango -import gtk, gobject, os +from gi.repository import Pango +from gi.repository import Gtk +from gi.repository import GdkPixbuf +from gi.repository import GLib +import os import gtkgui_helpers from dialogs import WarningDialog, YesNoDialog, ArchiveChooserDialog @@ -68,45 +71,43 @@ class PluginsWindow(object): self.plugin_description_textview = HtmlTextView() sw = self.xml.get_object('scrolledwindow2') sw.add(self.plugin_description_textview) - attr_list = pango.AttrList() - attr_list.insert(pango.AttrWeight(pango.WEIGHT_BOLD, 0, -1)) - self.plugin_name_label.set_attributes(attr_list) - - self.installed_plugins_model = gtk.ListStore(gobject.TYPE_PYOBJECT, - gobject.TYPE_STRING, gobject.TYPE_BOOLEAN, gobject.TYPE_BOOLEAN, - gtk.gdk.Pixbuf) + self.installed_plugins_model = Gtk.ListStore(object, str, bool, bool, + GdkPixbuf.Pixbuf) self.installed_plugins_treeview.set_model(self.installed_plugins_model) self.installed_plugins_treeview.set_rules_hint(True) - renderer = gtk.CellRendererText() - col = gtk.TreeViewColumn(_('Plugin'))#, renderer, text=NAME) - cell = gtk.CellRendererPixbuf() + renderer = Gtk.CellRendererText() + col = Gtk.TreeViewColumn(_('Plugin'))#, renderer, text=NAME) + cell = Gtk.CellRendererPixbuf() col.pack_start(cell, False) col.add_attribute(cell, 'pixbuf', ICON) col.pack_start(renderer, True) col.add_attribute(renderer, 'text', NAME) + col.set_property('expand', True) self.installed_plugins_treeview.append_column(col) - renderer = gtk.CellRendererToggle() + renderer = Gtk.CellRendererToggle() renderer.connect('toggled', self.installed_plugins_toggled_cb) - col = gtk.TreeViewColumn(_('Active'), renderer, active=ACTIVE, + col = Gtk.TreeViewColumn(_('Active'), renderer, active=ACTIVE, activatable=ACTIVATABLE) self.installed_plugins_treeview.append_column(col) - icon = gtk.Image() - self.def_icon = icon.render_icon(gtk.STOCK_PREFERENCES, - gtk.ICON_SIZE_MENU) + icon = Gtk.Image() + self.def_icon = icon.render_icon_pixbuf(Gtk.STOCK_PREFERENCES, + Gtk.IconSize.MENU) # connect signal for selection change selection = self.installed_plugins_treeview.get_selection() selection.connect('changed', self.installed_plugins_treeview_selection_changed) - selection.set_mode(gtk.SELECTION_SINGLE) + selection.set_mode(Gtk.SelectionMode.SINGLE) self._clear_installed_plugin_info() self.fill_installed_plugins_model() - selection.select_iter(self.installed_plugins_model.get_iter_root()) + root_iter = self.installed_plugins_model.get_iter_first() + if root_iter: + selection.select_iter(root_iter ) self.xml.connect_signals(self) @@ -118,7 +119,7 @@ class PluginsWindow(object): def on_plugins_notebook_switch_page(self, widget, page, page_num): - gobject.idle_add(self.xml.get_object('close_button').grab_focus) + GLib.idle_add(self.xml.get_object('close_button').grab_focus) @log_calls('PluginsWindow') def installed_plugins_treeview_selection_changed(self, treeview_selection): @@ -136,11 +137,12 @@ class PluginsWindow(object): self.plugin_name_label.set_text(plugin.name) self.plugin_version_label.set_text(plugin.version) self.plugin_authors_label.set_text(plugin.authors) - label = self.plugin_homepage_linkbutton.get_children()[0] - label.set_ellipsize(pango.ELLIPSIZE_END) self.plugin_homepage_linkbutton.set_uri(plugin.homepage) self.plugin_homepage_linkbutton.set_label(plugin.homepage) + label = self.plugin_homepage_linkbutton.get_children()[0] + label.set_ellipsize(Pango.EllipsizeMode.END) self.plugin_homepage_linkbutton.set_property('sensitive', True) + desc_textbuffer = self.plugin_description_textview.get_buffer() desc_textbuffer.set_text('') txt = plugin.description @@ -152,13 +154,12 @@ class PluginsWindow(object): txt += ' </body>' self.plugin_description_textview.display_html(txt, self.plugin_description_textview, None) + self.plugin_description_textview.set_property('sensitive', True) self.uninstall_plugin_button.set_property('sensitive', gajim.PLUGINS_DIRS[1] in plugin.__path__) - if plugin.config_dialog is None: - self.configure_plugin_button.set_property('sensitive', False) - else: - self.configure_plugin_button.set_property('sensitive', True) + self.configure_plugin_button.set_property( + 'sensitive', not plugin.config_dialog is None) def _clear_installed_plugin_info(self): self.plugin_name_label.set_text('') @@ -178,7 +179,7 @@ class PluginsWindow(object): def fill_installed_plugins_model(self): pm = gajim.plugin_manager self.installed_plugins_model.clear() - self.installed_plugins_model.set_sort_column_id(1, gtk.SORT_ASCENDING) + self.installed_plugins_model.set_sort_column_id(1, Gtk.SortType.ASCENDING) for plugin in pm.plugins: icon = self.get_plugin_icon(plugin) @@ -190,7 +191,7 @@ class PluginsWindow(object): plugin.__path__)[1]) + '.png' icon = self.def_icon if os.path.isfile(icon_file): - icon = gtk.gdk.pixbuf_new_from_file_at_size(icon_file, 16, 16) + icon = GdkPixbuf.Pixbuf.new_from_file_at_size(icon_file, 16, 16) return icon @log_calls('PluginsWindow') @@ -203,7 +204,7 @@ class PluginsWindow(object): else: try: gajim.plugin_manager.activate_plugin(plugin) - except GajimPluginActivateException, e: + except GajimPluginActivateException as e: WarningDialog(_('Plugin failed'), str(e), transient_for=self.window) return @@ -244,11 +245,11 @@ class PluginsWindow(object): model, iter = selection.get_selected() if iter: plugin = model.get_value(iter, PLUGIN) - plugin_name = model.get_value(iter, NAME).decode('utf-8') + plugin_name = model.get_value(iter, NAME) is_active = model.get_value(iter, ACTIVE) try: gajim.plugin_manager.remove_plugin(plugin) - except PluginsystemError, e: + except PluginsystemError as e: WarningDialog(_('Unable to properly remove the plugin'), str(e), self.window) return @@ -271,7 +272,7 @@ class PluginsWindow(object): return model = self.installed_plugins_model - for row in xrange(len(model)): + for row in list(range(len(model))): if plugin == model[row][PLUGIN]: model.remove(model.get_iter((row, PLUGIN))) break @@ -282,12 +283,12 @@ class PluginsWindow(object): sel.select_iter(iter_) YesNoDialog(_('Plugin already exists'), sectext=_('Overwrite?'), - on_response_yes=on_yes) + on_response_yes=on_yes, transient_for=self.window) def _try_install(zip_filename): try: plugin = gajim.plugin_manager.install_from_zip(zip_filename) - except PluginsystemError, er_type: + except PluginsystemError as er_type: error_text = str(er_type) if error_text == _('Plugin already exists'): _on_plugin_exists(zip_filename) @@ -307,19 +308,24 @@ class PluginsWindow(object): self.dialog = ArchiveChooserDialog(on_response_ok=_try_install) -class GajimPluginConfigDialog(gtk.Dialog): +class GajimPluginConfigDialog(Gtk.Dialog): @log_calls('GajimPluginConfigDialog') def __init__(self, plugin, **kwargs): - gtk.Dialog.__init__(self, '%s %s'%(plugin.name, _('Configuration')), + Gtk.Dialog.__init__(self, '%s %s'%(plugin.name, _('Configuration')), **kwargs) self.plugin = plugin - button = self.add_button('gtk-close', gtk.RESPONSE_CLOSE) + button = self.add_button('gtk-close', Gtk.ResponseType.CLOSE) button.connect('clicked', self.on_close_button_clicked) - self.child.set_spacing(3) + + self.get_child().set_spacing(3) self.init() + def on_close_dialog(self, widget, data): + self.hide() + return True + def on_close_button_clicked(self, widget): self.hide() @@ -328,6 +334,7 @@ class GajimPluginConfigDialog(gtk.Dialog): self.set_transient_for(parent) self.on_run() self.show_all() + self.connect('delete-event', self.on_close_dialog) result = super(GajimPluginConfigDialog, self) return result diff --git a/src/plugins/helpers.py b/src/plugins/helpers.py index 18c747527add960c6f1480240f62ad6e4f12570e..b37076a87284d424655411b577576ffaabb02536 100644 --- a/src/plugins/helpers.py +++ b/src/plugins/helpers.py @@ -97,7 +97,7 @@ class log_calls(object): :rtype: function ''' - self.full_func_name += f.func_name + self.full_func_name += f.__name__ if self.log_this_class: @functools.wraps(f) def wrapper(*args, **kwargs): diff --git a/src/plugins/plugin.py b/src/plugins/plugin.py index b668c276576c590c59d612355e5e3e28bec588e1..b87689093fdcd5fd0a2add88a3e9891e261643fb 100644 --- a/src/plugins/plugin.py +++ b/src/plugins/plugin.py @@ -40,30 +40,30 @@ class GajimPlugin(object): ''' Base class for implementing Gajim plugins. ''' - name = u'' + name = '' ''' Name of plugin. Will be shown in plugins management GUI. - :type: unicode + :type: str ''' - short_name = u'' + short_name = '' ''' Short name of plugin. Used for quick indentification of plugin. - :type: unicode + :type: str :todo: decide whether we really need this one, because class name (with module name) can act as such short name ''' - version = u'' + version = '' ''' Version of plugin. - :type: unicode + :type: str :todo: decide how to compare version between each other (which one is higher). Also rethink: do we really need to compare versions @@ -71,11 +71,11 @@ class GajimPlugin(object): same plugin class but with different version and we want only the newest one to be active - is such policy good? ''' - description = u'' + description = '' ''' Plugin description. - :type: unicode + :type: str :todo: should be allow rich text here (like HTML or reStructuredText)? ''' @@ -83,16 +83,16 @@ class GajimPlugin(object): ''' Plugin authors. - :type: [] of unicode + :type: [] of str :todo: should we decide on any particular format of author strings? Especially: should we force format of giving author's e-mail? ''' - homepage = u'' + homepage = '' ''' URL to plug-in's homepage. - :type: unicode + :type: str :todo: should we check whether provided string is valid URI? (Maybe using 'property') @@ -120,7 +120,7 @@ class GajimPlugin(object): Values are tuples: (default_value, option_description). The first one can be anything (this is the advantage of using shelve/pickle instead of - custom-made config I/O handling); the second one should be unicode (gettext + custom-made config I/O handling); the second one should be str (gettext can be used if need and/or translation is planned). :type: {} of 2-element tuples @@ -196,15 +196,14 @@ class GajimPlugin(object): def deactivate(self): pass -import cPickle +import pickle class GajimPluginConfig(): @log_calls('GajimPluginConfig') def __init__(self, plugin): self.plugin = plugin self.FILE_PATH = os.path.join(gajim.PLUGINS_CONFIG_DIR, - self.plugin.short_name).decode('utf-8').encode( - locale.getpreferredencoding()) + self.plugin.short_name).encode(locale.getpreferredencoding()) self.data = {} @log_calls('GajimPluginConfig') @@ -242,7 +241,7 @@ class GajimPluginConfig(): @log_calls('GajimPluginConfig') def save(self): fd = open(self.FILE_PATH, 'wb') - cPickle.dump(self.data, fd) + pickle.dump(self.data, fd) fd.close() @log_calls('GajimPluginConfig') @@ -250,21 +249,21 @@ class GajimPluginConfig(): if os.path.isfile(self.FILE_PATH): fd = open(self.FILE_PATH, 'rb') try: - self.data = cPickle.load(fd) + self.data = pickle.load(fd) fd.close() except: fd.close() try: import shelve s = shelve.open(self.FILE_PATH) - for (k, v) in s.iteritems(): + for (k, v) in s.items(): self.data[k] = v if not isinstance(self.data, dict): raise GajimPluginException s.close() self.save() except: - log.warn('%s plugin config file not readable. Saving it as ' + log.warning('%s plugin config file not readable. Saving it as ' '%s and creating a new one' % (self.plugin.short_name, self.FILE_PATH + '.bak')) if os.path.exists(self.FILE_PATH + '.bak'): diff --git a/src/plugins/pluginmanager.py b/src/plugins/pluginmanager.py index 2a0f163718afa6bbceff071cf679b02ed8695f6c..bcad829ff60ad5bc93b2884ffd576d6dc291cd64 100644 --- a/src/plugins/pluginmanager.py +++ b/src/plugins/pluginmanager.py @@ -31,7 +31,7 @@ import sys import fnmatch import zipfile from shutil import rmtree -import ConfigParser +import configparser from common import gajim from common import nec @@ -41,7 +41,7 @@ from plugins.helpers import log, log_calls, Singleton from plugins.helpers import GajimPluginActivateException from plugins.plugin import GajimPlugin, GajimPluginException -class PluginManager(object): +class PluginManager(metaclass=Singleton): ''' Main plug-in management class. @@ -158,7 +158,7 @@ class PluginManager(object): active yet). :param gui_extpoint_name: name of GUI extension point. - :type gui_extpoint_name: unicode + :type gui_extpoint_name: str :param args: parameters to be passed to extension point handlers (typically and object that invokes `gui_extension_point`; however, this can be practically anything) @@ -209,7 +209,7 @@ class PluginManager(object): freedom, but is this necessary? :param gui_extpoint_name: name of GUI extension point. - :type gui_extpoint_name: unicode + :type gui_extpoint_name: str :param args: arguments that `PluginManager.gui_extension_point` was called with for this extension point. This is used (along with extension point name) to identify element to be removed. @@ -258,14 +258,14 @@ class PluginManager(object): handlers[0](*args) def _register_events_handlers_in_ged(self, plugin): - for event_name, handler in plugin.events_handlers.iteritems(): + for event_name, handler in plugin.events_handlers.items(): priority = handler[0] handler_function = handler[1] gajim.ged.register_event_handler(event_name, priority, handler_function) def _remove_events_handler_from_ged(self, plugin): - for event_name, handler in plugin.events_handlers.iteritems(): + for event_name, handler in plugin.events_handlers.items(): priority = handler[0] handler_function = handler[1] gajim.ged.remove_event_handler(event_name, priority, @@ -302,7 +302,7 @@ class PluginManager(object): self.active_plugins.append(plugin) try: plugin.activate() - except GajimPluginException, e: + except GajimPluginException as e: self.deactivate_plugin(plugin) raise GajimPluginActivateException(str(e)) self._set_plugin_active_in_global_config(plugin) @@ -312,7 +312,7 @@ class PluginManager(object): # remove GUI extension points handlers (provided by plug-in) from # handlers list for gui_extpoint_name, gui_extpoint_handlers in \ - plugin.gui_extension_points.iteritems(): + plugin.gui_extension_points.items(): self.gui_extension_points_handlers[gui_extpoint_name].remove( gui_extpoint_handlers) @@ -320,7 +320,7 @@ class PluginManager(object): # cleaning up method that must be provided by plug-in developer # for each handled GUI extension point) for gui_extpoint_name, gui_extpoint_handlers in \ - plugin.gui_extension_points.iteritems(): + plugin.gui_extension_points.items(): if gui_extpoint_name in self.gui_extension_points: for gui_extension_point_args in self.gui_extension_points[ gui_extpoint_name]: @@ -344,14 +344,14 @@ class PluginManager(object): @log_calls('PluginManager') def _add_gui_extension_points_handlers_from_plugin(self, plugin): for gui_extpoint_name, gui_extpoint_handlers in \ - plugin.gui_extension_points.iteritems(): + plugin.gui_extension_points.items(): self.gui_extension_points_handlers.setdefault(gui_extpoint_name, []).append(gui_extpoint_handlers) @log_calls('PluginManager') def _handle_all_gui_extension_points_with_plugin(self, plugin): for gui_extpoint_name, gui_extpoint_handlers in \ - plugin.gui_extension_points.iteritems(): + plugin.gui_extension_points.items(): if gui_extpoint_name in self.gui_extension_points: for gui_extension_point_args in self.gui_extension_points[ gui_extpoint_name]: @@ -394,7 +394,7 @@ class PluginManager(object): Scans given directory for plugin classes. :param path: directory to scan for plugins - :type path: unicode + :type path: str :return: list of found plugin classes (subclasses of `GajimPlugin` :rtype: [] of class objects @@ -407,7 +407,7 @@ class PluginManager(object): ''' from plugins.plugins_i18n import _ plugins_found = [] - conf = ConfigParser.ConfigParser() + conf = configparser.ConfigParser() fields = ('name', 'short_name', 'version', 'description', 'authors', 'homepage') if not os.path.isdir(path): @@ -420,39 +420,61 @@ class PluginManager(object): for elem_name in dir_list: file_path = os.path.join(path, elem_name) - module = None - if os.path.isfile(file_path) and fnmatch.fnmatch(file_path, '*.py'): module_name = os.path.splitext(elem_name)[0] - try: - module = __import__(module_name) - except ValueError, value_error: - log.debug(value_error) - except ImportError, import_error: - log.debug(import_error) - elif os.path.isdir(file_path) and scan_dirs: module_name = elem_name - if module_name in sys.modules: - # do not load the module twice - continue file_path += os.path.sep - try: - module = __import__(module_name) - except ValueError, value_error: - log.debug(value_error) - except ImportError, import_error: - log.debug(import_error) - - - if module is None: - continue manifest_path = os.path.join(os.path.dirname(file_path), 'manifest.ini') if scan_dirs and (not os.path.isfile(manifest_path)): continue + # read metadata from manifest.ini + conf.remove_section('info') + conf_file = open(manifest_path) + conf.read_file(conf_file) + conf_file.close() + + try: + min_v = conf.get('info', 'min_gajim_version') + except Exception: + min_v = None + try: + max_v = conf.get('info', 'max_gajim_version') + except Exception: + max_v = None + + gajim_v = gajim.config.get('version') + gajim_v = gajim_v.split('-', 1)[0] + gajim_v = gajim_v.split('.') + + if min_v: + min_v = min_v.split('.') + if gajim_v < min_v: + continue + if max_v: + max_v = max_v.split('.') + if gajim_v > max_v: + continue + + + module = None + + if module_name in sys.modules: + # do not load the module twice + continue + try: + module = __import__(module_name) + except ValueError as value_error: + log.debug(str(value_error)) + except ImportError as import_error: + log.debug(str(import_error)) + + if module is None: + continue + log.debug('Attributes processing started') for module_attr_name in [attr_name for attr_name in dir(module) if not (attr_name.startswith('__') or attr_name.endswith('__'))]: @@ -467,34 +489,30 @@ class PluginManager(object): module_attr.__path__ = os.path.abspath( os.path.dirname(file_path)) - # read metadata from manifest.ini - conf.readfp(open(manifest_path, 'r')) for option in fields: if conf.get('info', option) is '': - raise ConfigParser.NoOptionError, 'field empty' + raise configparser.NoOptionError('field empty') if option == 'description': setattr(module_attr, option, _(conf.get('info', option))) continue setattr(module_attr, option, conf.get('info', option)) - conf.remove_section('info') plugins_found.append(module_attr) - - except TypeError, type_error: + except TypeError: # set plugin localization try: module_attr._ = _ - except AttributeError, type_error: + except AttributeError: pass - except ConfigParser.NoOptionError, type_error: + except configparser.NoOptionError: # all fields are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. all fields are required!')) - except ConfigParser.NoSectionError, type_error: + except configparser.NoSectionError: # info section are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. info section are required!')) - except ConfigParser.MissingSectionHeaderError, type_error: + except configparser.MissingSectionHeaderError: # info section are required log.debug('%s : %s' % (module_attr_name, 'wrong manifest file. section are required!')) @@ -507,10 +525,10 @@ class PluginManager(object): ''' try: zip_file = zipfile.ZipFile(zip_filename) - except zipfile.BadZipfile, e: + except zipfile.BadZipfile: # it is not zip file raise PluginsystemError(_('Archive corrupted')) - except IOError,e: + except IOError: raise PluginsystemError(_('Archive empty')) if zip_file.testzip(): diff --git a/src/plugins/plugins_i18n.py b/src/plugins/plugins_i18n.py index 769d8b06031b45a28291ef1c4b51212a2afc98e6..91ee811dc89e36fdb72fc2bdabdc6c7c6387a796 100644 --- a/src/plugins/plugins_i18n.py +++ b/src/plugins/plugins_i18n.py @@ -36,6 +36,6 @@ if os.name != 'nt': try: t = gettext.translation(APP, plugins_locale_dir) _ = t.gettext -except IOError, msg: +except IOError: from common import i18n _ = gettext.gettext diff --git a/src/profile_window.py b/src/profile_window.py index 0b0f5b051ce2537c2385f8334c7285a9e36f172a..d5dd9fd92b7294e5a5276380c94ce8340cc72d3b 100644 --- a/src/profile_window.py +++ b/src/profile_window.py @@ -22,8 +22,11 @@ # THIS FILE IS FOR **OUR** PROFILE (when we edit our INFO) -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf +from gi.repository import GObject +from gi.repository import GLib import base64 import mimetypes import os @@ -58,12 +61,12 @@ class ProfileWindow: self.avatar_encoded = None self.message_id = self.statusbar.push(self.context_id, _('Retrieving profile...')) - self.update_progressbar_timeout_id = gobject.timeout_add(100, + self.update_progressbar_timeout_id = GLib.timeout_add(100, self.update_progressbar) self.remove_statusbar_timeout_id = None # Create Image for avatar button - image = gtk.Image() + image = Gtk.Image() self.xml.get_object('PHOTO_button').set_image(image) self.xml.connect_signals(self) gajim.ged.register_event_handler('vcard-published', ged.GUI1, @@ -76,21 +79,21 @@ class ProfileWindow: self.xml.get_object('ok_button').grab_focus() def on_information_notebook_switch_page(self, widget, page, page_num): - gobject.idle_add(self.xml.get_object('ok_button').grab_focus) + GLib.idle_add(self.xml.get_object('ok_button').grab_focus) def update_progressbar(self): self.progressbar.pulse() return True # loop forever def remove_statusbar(self, message_id): - self.statusbar.remove_message(self.context_id, message_id) + self.statusbar.remove(self.context_id, message_id) self.remove_statusbar_timeout_id = None def on_profile_window_destroy(self, widget): if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GLib.source_remove(self.update_progressbar_timeout_id) if self.remove_statusbar_timeout_id is not None: - gobject.source_remove(self.remove_statusbar_timeout_id) + GLib.source_remove(self.remove_statusbar_timeout_id) gajim.ged.remove_event_handler('vcard-published', ged.GUI1, self._nec_vcard_published) gajim.ged.remove_event_handler('vcard-not-published', ged.GUI1, @@ -102,7 +105,7 @@ class ProfileWindow: self.dialog.destroy() def on_profile_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_clear_button_clicked(self, widget): @@ -132,12 +135,12 @@ class ProfileWindow: msg = _('File does not exist') if not invalid_file and filesize > 16384: # 16 kb try: - pixbuf = gtk.gdk.pixbuf_new_from_file(path_to_file) + pixbuf = GdkPixbuf.Pixbuf.new_from_file(path_to_file) # get the image at 'notification size' # and hope that user did not specify in ACE crazy size scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'tooltip') - except gobject.GError, msg: # unknown format + except GObject.GError as msg: # unknown format # msg should be string, not object instance msg = str(msg) invalid_file = True @@ -150,11 +153,11 @@ class ProfileWindow: if scaled_pixbuf: path_to_file = os.path.join(gajim.TMP, 'avatar_scaled.png') - scaled_pixbuf.save(path_to_file, 'png') + scaled_pixbuf.savev(path_to_file, 'png', [], []) must_delete = True - fd = open(path_to_file, 'rb') - data = fd.read() + with open(path_to_file, 'rb') as fd: + data = fd.read() pixbuf = gtkgui_helpers.get_pixbuf_from_data(data) try: # rescale it @@ -171,7 +174,7 @@ class ProfileWindow: button.show() text_button = self.xml.get_object('NOPHOTO_button') text_button.hide() - self.avatar_encoded = base64.encodestring(data) + self.avatar_encoded = base64.b64encode(data).decode('utf-8') # returns None if unknown type self.avatar_mime_type = mimetypes.guess_type(path_to_file)[0] if must_delete: @@ -200,7 +203,7 @@ class ProfileWindow: If right-clicked, show popup """ if event.button == 3 and self.avatar_encoded: # right click - menu = gtk.Menu() + menu = Gtk.Menu() # Try to get pixbuf pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(self.jid, @@ -208,19 +211,21 @@ class ProfileWindow: if pixbuf not in (None, 'ask'): nick = gajim.config.get_per('accounts', self.account, 'name') - menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) + menuitem = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_SAVE_AS, + None) menuitem.connect('activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, self.jid, nick) menu.append(menuitem) # show clear - menuitem = gtk.ImageMenuItem(gtk.STOCK_CLEAR) + menuitem = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_CLEAR, None) menuitem.connect('activate', self.on_clear_button_clicked) menu.append(menuitem) menu.connect('selection-done', lambda w:w.destroy()) # show the menu menu.show_all() - menu.popup(None, None, None, event.button, event.time) + menu.attach_to_widget(widget, None) + menu.popup(None, None, None, None, event.button, event.time) elif event.button == 1: # left click self.on_set_avatar_button_clicked(widget) @@ -235,7 +240,7 @@ class ProfileWindow: pritext = _('Wrong date format') dialogs.ErrorDialog(pritext, _('Format of the date must be ' 'YYYY-MM-DD'), transient_for=self.window) - gobject.idle_add(lambda: widget.grab_focus()) + GLib.idle_add(lambda: widget.grab_focus()) return True def set_value(self, entry_name, value): @@ -289,12 +294,12 @@ class ProfileWindow: self.set_value(i + '_entry', vcard_[i]) if self.update_progressbar_timeout_id is not None: if self.message_id: - self.statusbar.remove_message(self.context_id, self.message_id) + self.statusbar.remove(self.context_id, self.message_id) self.message_id = self.statusbar.push(self.context_id, _('Information received')) - self.remove_statusbar_timeout_id = gobject.timeout_add_seconds(3, - self.remove_statusbar, self.message_id) - gobject.source_remove(self.update_progressbar_timeout_id) + self.remove_statusbar_timeout_id = GLib.timeout_add_seconds(3, + self.remove_statusbar, self.message_id) + GLib.source_remove(self.update_progressbar_timeout_id) self.progressbar.hide() self.progressbar.set_fraction(0) self.update_progressbar_timeout_id = None @@ -344,7 +349,7 @@ class ProfileWindow: 'ADR_WORK_REGION', 'ADR_WORK_PCODE', 'ADR_WORK_CTRY'] vcard_ = {} for e in entries: - txt = self.xml.get_object(e + '_entry').get_text().decode('utf-8') + txt = self.xml.get_object(e + '_entry').get_text() if txt != '': vcard_ = self.add_to_vcard(vcard_, e, txt) @@ -352,9 +357,9 @@ class ProfileWindow: buff = self.xml.get_object('DESC_textview').get_buffer() start_iter = buff.get_start_iter() end_iter = buff.get_end_iter() - txt = buff.get_text(start_iter, end_iter, 0) + txt = buff.get_text(start_iter, end_iter, False) if txt != '': - vcard_['DESC'] = txt.decode('utf-8') + vcard_['DESC'] = txt # Avatar if self.avatar_encoded: @@ -384,14 +389,14 @@ class ProfileWindow: self.message_id = self.statusbar.push(self.context_id, _('Sending profile...')) self.progressbar.show() - self.update_progressbar_timeout_id = gobject.timeout_add(100, - self.update_progressbar) + self.update_progressbar_timeout_id = GLib.timeout_add(100, + self.update_progressbar) def _nec_vcard_published(self, obj): if obj.conn.name != self.account: return if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GLib.source_remove(self.update_progressbar_timeout_id) self.update_progressbar_timeout_id = None self.window.destroy() @@ -399,13 +404,13 @@ class ProfileWindow: if obj.conn.name != self.account: return if self.message_id: - self.statusbar.remove_message(self.context_id, self.message_id) + self.statusbar.remove(self.context_id, self.message_id) self.message_id = self.statusbar.push(self.context_id, _('Information NOT published')) - self.remove_statusbar_timeout_id = gobject.timeout_add_seconds(3, + self.remove_statusbar_timeout_id = GLib.timeout_add_seconds(3, self.remove_statusbar, self.message_id) if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GLib.source_remove(self.update_progressbar_timeout_id) self.progressbar.set_fraction(0) self.update_progressbar_timeout_id = None dialogs.InformationDialog(_('vCard publication failed'), diff --git a/src/remote_control.py b/src/remote_control.py index 6fc4edd76ec7f10a4c834d6eabd9246499133336..c77d4ff03a077913636bb3c9c69162862d775cdb 100644 --- a/src/remote_control.py +++ b/src/remote_control.py @@ -26,8 +26,8 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## -import gobject -import gtk +from gi.repository import GLib +from gi.repository import Gtk import os import base64 import mimetypes @@ -75,7 +75,7 @@ def get_dbus_struct(obj): """ if obj is None: return DBUS_NONE() - if isinstance(obj, (unicode, str)): + if isinstance(obj, str): return DBUS_STRING(obj) if isinstance(obj, int): return DBUS_INT32(obj) @@ -539,7 +539,7 @@ class SignalObject(dbus.service.Object): win = gajim.interface.msg_win_mgr.get_window(jid, connected_account).window if win.get_property('visible'): - win.window.focus(gtk.get_current_event_time()) + win.window.focus(Gtk.get_current_event_time()) return DBUS_BOOLEAN(True) return DBUS_BOOLEAN(False) @@ -557,8 +557,8 @@ class SignalObject(dbus.service.Object): if account not in gajim.connections: return DBUS_BOOLEAN(False) status = gajim.SHOW_LIST[gajim.connections[account].connected] - gobject.idle_add(gajim.interface.roster.send_status, account, - status, message) + GLib.idle_add(gajim.interface.roster.send_status, account, status, + message) else: # account not specified, so change the status of all accounts for acc in gajim.contacts.get_accounts(): @@ -571,8 +571,8 @@ class SignalObject(dbus.service.Object): if acc not in gajim.connections: continue status_ = gajim.SHOW_LIST[gajim.connections[acc].connected] - gobject.idle_add(gajim.interface.roster.send_status, acc, - status_, message) + GLib.idle_add(gajim.interface.roster.send_status, acc, status_, + message) return DBUS_BOOLEAN(False) @dbus.service.method(INTERFACE, in_signature='ss', out_signature='') @@ -585,8 +585,8 @@ class SignalObject(dbus.service.Object): gajim.config.set_per('accounts', account, 'priority', prio) show = gajim.SHOW_LIST[gajim.connections[account].connected] status = gajim.connections[account].status - gobject.idle_add(gajim.connections[account].change_status, show, - status) + GLib.idle_add(gajim.connections[account].change_status, show, + status) else: # account not specified, so change prio of all accounts for acc in gajim.contacts.get_accounts(): @@ -598,8 +598,8 @@ class SignalObject(dbus.service.Object): gajim.config.set_per('accounts', acc, 'priority', prio) show = gajim.SHOW_LIST[gajim.connections[acc].connected] status = gajim.connections[acc].status - gobject.idle_add(gajim.connections[acc].change_status, show, - status) + GLib.idle_add(gajim.connections[acc].change_status, show, + status) @dbus.service.method(INTERFACE, in_signature='', out_signature='') def show_next_pending_event(self): @@ -617,13 +617,13 @@ class SignalObject(dbus.service.Object): """ Get vcard info for a contact. Return cached value of the vcard """ - if not isinstance(jid, unicode): - jid = unicode(jid) + if not isinstance(jid, str): + jid = str(jid) if not jid: raise dbus_support.MissingArgument() jid = self._get_real_jid(jid) - cached_vcard = gajim.connections.values()[0].get_cached_vcard(jid) + cached_vcard = list(gajim.connections.values())[0].get_cached_vcard(jid) if cached_vcard: return get_dbus_struct(cached_vcard) @@ -656,9 +656,9 @@ class SignalObject(dbus.service.Object): result['name'] = DBUS_STRING(con.name) result['jid'] = DBUS_STRING(gajim.get_jid_from_account(con.name)) result['message'] = DBUS_STRING(con.status) - result['priority'] = DBUS_STRING(unicode(con.priority)) - result['resource'] = DBUS_STRING(unicode(gajim.config.get_per( - 'accounts', con.name, 'resource'))) + result['priority'] = DBUS_STRING(str(con.priority)) + result['resource'] = DBUS_STRING(gajim.config.get_per('accounts', + con.name, 'resource')) return result @dbus.service.method(INTERFACE, in_signature='s', out_signature='aa{sv}') @@ -691,12 +691,12 @@ class SignalObject(dbus.service.Object): """ win = gajim.interface.roster.window if win.get_property('visible'): - gobject.idle_add(win.hide) + GLib.idle_add(win.hide) else: win.present() # preserve the 'steal focus preservation' if self._is_first(): - win.window.focus(gtk.get_current_event_time()) + win.window.focus(Gtk.get_current_event_time()) else: win.window.focus(long(time())) @@ -709,7 +709,7 @@ class SignalObject(dbus.service.Object): win.present() # preserve the 'steal focus preservation' if self._is_first(): - win.window.focus(gtk.get_current_event_time()) + win.window.focus(Gtk.get_current_event_time()) else: win.window.focus(long(time())) @@ -721,7 +721,7 @@ class SignalObject(dbus.service.Object): win = gajim.ipython_window if win: if win.window.is_visible(): - gobject.idle_add(win.hide) + GLib.idle_add(win.hide) else: win.show_all() win.present() @@ -747,7 +747,7 @@ class SignalObject(dbus.service.Object): def prefs_store(self): try: gajim.interface.save_config() - except Exception, e: + except Exception: return DBUS_BOOLEAN(False) return DBUS_BOOLEAN(True) @@ -909,9 +909,9 @@ class SignalObject(dbus.service.Object): else: invalid_file = True if not invalid_file and filesize < 16384: - fd = open(picture, 'rb') - data = fd.read() - avatar = base64.encodestring(data) + with open(picture, 'rb') as fb: + data = fd.read() + avatar = base64.b64encode(data).decode('utf-8') avatar_mime_type = mimetypes.guess_type(picture)[0] vcard={} vcard['PHOTO'] = {'BINVAL': avatar} diff --git a/src/roster_window.py b/src/roster_window.py index b7801021a9b7f3e052bb299f693c17092099c976..04241cb61ac0c9d99f3d1f7374bd0bceb6b9aecd 100644 --- a/src/roster_window.py +++ b/src/roster_window.py @@ -32,9 +32,12 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## -import gtk -import pango -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GdkPixbuf +from gi.repository import Pango +from gi.repository import GObject +from gi.repository import GLib import os import sys import time @@ -70,7 +73,7 @@ from common import dbus_support if dbus_support.supported: import dbus -from nbxmpp.protocol import NS_FILE, NS_ROSTERX +from nbxmpp.protocol import NS_FILE, NS_ROSTERX, NS_CONFERENCE from common.pep import MOODS, ACTIVITIES #(icon, name, type, jid, account, editable, second pixbuf) @@ -88,6 +91,10 @@ from common.pep import MOODS, ACTIVITIES C_PADLOCK_PIXBUF, # use for account row only ) = range(11) +empty_pixbuf = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, True, 8, 1, 1) +empty_pixbuf.fill(0xffffff00) + + class RosterWindow: """ Class for main window of the GTK+ interface @@ -95,7 +102,7 @@ class RosterWindow: def _get_account_iter(self, name, model=None): """ - Return the gtk.TreeIter of the given account or None if not found + Return the Gtk.TreeIter of the given account or None if not found Keyword arguments: name -- the account name @@ -113,14 +120,17 @@ class RosterWindow: if model == self.model or it is None: return it try: - return self.modelfilter.convert_child_iter_to_iter(it) + (ok, it) = self.modelfilter.convert_child_iter_to_iter(it) + if ok: + return it + return None except RuntimeError: return None def _get_group_iter(self, name, account, model=None): """ - Return the gtk.TreeIter of the given group or None if not found + Return the Gtk.TreeIter of the given group or None if not found Keyword arguments: name -- the group name @@ -142,14 +152,17 @@ class RosterWindow: if model == self.model or it is None: return it try: - return self.modelfilter.convert_child_iter_to_iter(it) + (ok, it) = self.modelfilter.convert_child_iter_to_iter(it) + if ok: + return it + return None except RuntimeError: return None def _get_self_contact_iter(self, account, model=None): """ - Return the gtk.TreeIter of SelfContact or None if not found + Return the Gtk.TreeIter of SelfContact or None if not found Keyword arguments: account -- the account of SelfContact @@ -164,7 +177,7 @@ class RosterWindow: def _get_contact_iter(self, jid, account, contact=None, model=None): """ - Return a list of gtk.TreeIter of the given contact + Return a list of Gtk.TreeIter of the given contact Keyword arguments: jid -- the jid without resource @@ -201,19 +214,21 @@ class RosterWindow: its2 = [] for it in its: try: - its2.append(self.modelfilter.convert_child_iter_to_iter(it)) + (ok, it) = self.modelfilter.convert_child_iter_to_iter(it) + if ok: + its2.append(it) except RuntimeError: pass return its2 - def _iter_is_separator(self, model, titer): + def _iter_is_separator(self, model, titer, dummy): """ Return True if the given iter is a separator Keyword arguments: model -- the data model - iter -- the gtk.TreeIter to test + iter -- the Gtk.TreeIter to test """ if model[titer][0] == 'SEPARATOR': return True @@ -247,13 +262,12 @@ class RosterWindow: tls_pixbuf = None if gajim.account_is_securely_connected(account): # the only way to create a pixbuf from stock - tls_pixbuf = self.window.render_icon( - gtk.STOCK_DIALOG_AUTHENTICATION, - gtk.ICON_SIZE_MENU) + tls_pixbuf = self.window.render_icon_pixbuf( + Gtk.STOCK_DIALOG_AUTHENTICATION, Gtk.IconSize.MENU) it = self.model.append(None, [ gajim.interface.jabber_state_images['16'][show], - gobject.markup_escape_text(account), 'account', our_jid, + GLib.markup_escape_text(account), 'account', our_jid, account, None, None, None, None, None, tls_pixbuf] + [None] * self.nb_ext_renderers) self._iters[account]['account'] = it @@ -313,7 +327,7 @@ class RosterWindow: iter_parent = self._get_account_iter(account, self.model) iter_group = self.model.append(iter_parent, [gajim.interface.jabber_state_images['16']['closed'], - gobject.markup_escape_text(group), 'group', group, account, None, + GLib.markup_escape_text(group), 'group', group, account, None, None, None, None, None, None] + [None] * self.nb_ext_renderers) self.draw_group(group, account) self._iters[account_group]['groups'][group] = iter_group @@ -450,7 +464,7 @@ class RosterWindow: account_group = 'MERGED' else: account_group = account - group = self.model[parent_i][C_JID].decode('utf-8') + group = self.model[parent_i][C_JID] if group in gajim.groups[account]: del gajim.groups[account][group] to_be_removed = parent_i @@ -1025,11 +1039,11 @@ class RosterWindow: 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: # the only way to create a pixbuf from stock - tls_pixbuf = self.window.render_icon( - gtk.STOCK_DIALOG_AUTHENTICATION, gtk.ICON_SIZE_MENU) + tls_pixbuf = self.window.render_icon_pixbuf( + Gtk.STOCK_DIALOG_AUTHENTICATION, Gtk.IconSize.MENU) self.model[child_iter][C_PADLOCK_PIXBUF] = tls_pixbuf else: - self.model[child_iter][C_PADLOCK_PIXBUF] = None + self.model[child_iter][C_PADLOCK_PIXBUF] = empty_pixbuf if self.regroup: account_name = _('Merged accounts') @@ -1053,30 +1067,30 @@ class RosterWindow: pep_dict = gajim.connections[account].pep if gajim.config.get('show_mood_in_roster') and 'mood' in pep_dict: - self.model[child_iter][C_MOOD_PIXBUF] = pep_dict['mood'].\ - asPixbufIcon() + self.model[child_iter][C_MOOD_PIXBUF] = \ + gtkgui_helpers.get_pep_as_pixbuf(pep_dict['mood']) else: - self.model[child_iter][C_MOOD_PIXBUF] = None + self.model[child_iter][C_MOOD_PIXBUF] = empty_pixbuf if gajim.config.get('show_activity_in_roster') and 'activity' in \ pep_dict: - self.model[child_iter][C_ACTIVITY_PIXBUF] = pep_dict['activity'].\ - asPixbufIcon() + self.model[child_iter][C_ACTIVITY_PIXBUF] = \ + gtkgui_helpers.get_pep_as_pixbuf(pep_dict['activity']) else: - self.model[child_iter][C_ACTIVITY_PIXBUF] = None + self.model[child_iter][C_ACTIVITY_PIXBUF] = empty_pixbuf if gajim.config.get('show_tunes_in_roster') and 'tune' in pep_dict: - self.model[child_iter][C_TUNE_PIXBUF] = pep_dict['tune'].\ - asPixbufIcon() + self.model[child_iter][C_TUNE_PIXBUF] = \ + gtkgui_helpers.get_pep_as_pixbuf(pep_dict['tune']) else: - self.model[child_iter][C_TUNE_PIXBUF] = None + self.model[child_iter][C_TUNE_PIXBUF] = empty_pixbuf if gajim.config.get('show_location_in_roster') and 'location' in \ pep_dict: - self.model[child_iter][C_LOCATION_PIXBUF] = pep_dict['location'].\ - asPixbufIcon() + self.model[child_iter][C_LOCATION_PIXBUF] = \ + gtkgui_helpers.get_pep_as_pixbuf(pep_dict['location']) else: - self.model[child_iter][C_LOCATION_PIXBUF] = None + self.model[child_iter][C_LOCATION_PIXBUF] = empty_pixbuf def _really_draw_accounts(self): for acct in self.accounts_to_draw: @@ -1089,7 +1103,7 @@ class RosterWindow: return self.accounts_to_draw.append(account) if len(self.accounts_to_draw) == 1: - gobject.timeout_add(200, self._really_draw_accounts) + GLib.timeout_add(200, self._really_draw_accounts) def _really_draw_group(self, group, account): child_iter = self._get_group_iter(group, account, model=self.model) @@ -1101,7 +1115,7 @@ class RosterWindow: accounts = [] else: accounts = [account] - text = gobject.markup_escape_text(group) + text = GLib.markup_escape_text(group) if helpers.group_is_blocked(account, group): text = '<span strikethrough="true">%s</span>' % text if gajim.config.get('show_contacts_number'): @@ -1125,7 +1139,7 @@ class RosterWindow: return self.groups_to_draw[ag] = {'group': group, 'account': account} if len(self.groups_to_draw) == 1: - gobject.timeout_add(200, self._really_draw_groups) + GLib.timeout_add(200, self._really_draw_groups) def draw_parent_contact(self, jid, account): child_iters = self._get_contact_iter(jid, account, model=self.model) @@ -1135,8 +1149,8 @@ class RosterWindow: if self.model[parent_iter][C_TYPE] != 'contact': # parent is not a contact return - parent_jid = self.model[parent_iter][C_JID].decode('utf-8') - parent_account = self.model[parent_iter][C_ACCOUNT].decode('utf-8') + parent_jid = self.model[parent_iter][C_JID] + parent_account = self.model[parent_iter][C_ACCOUNT] self.draw_contact(parent_jid, parent_account) return False @@ -1160,7 +1174,7 @@ class RosterWindow: if not child_iters: return False - name = gobject.markup_escape_text(contact.get_shown_name()) + name = GLib.markup_escape_text(contact.get_shown_name()) # gets number of unread gc marked messages if jid in gajim.interface.minimized_controls[account] and \ @@ -1194,8 +1208,8 @@ class RosterWindow: nb_connected_contact += 1 if nb_connected_contact > 1: # switch back to default writing direction - name += i18n.paragraph_direction_mark(unicode(name)) - name += u' (%d)' % nb_connected_contact + name += i18n.paragraph_direction_mark(name) + name += ' (%d)' % nb_connected_contact # add status msg, if not empty, under contact name in # the treeview @@ -1213,7 +1227,7 @@ class RosterWindow: color.blue) name += '\n<span size="small" style="italic" ' \ 'foreground="%s">%s</span>' % (colorstring, - gobject.markup_escape_text(status)) + GLib.markup_escape_text(status)) icon_name = helpers.get_icon_name_to_show(contact, account) # look if another resource has awaiting events @@ -1248,8 +1262,8 @@ class RosterWindow: iterC = self.model.iter_children(child_iter) while iterC: # a child has awaiting messages? - jidC = self.model[iterC][C_JID].decode('utf-8') - accountC = self.model[iterC][C_ACCOUNT].decode('utf-8') + jidC = self.model[iterC][C_JID] + accountC = self.model[iterC][C_ACCOUNT] if len(gajim.events.get_events(accountC, jidC)): icon_name = 'event' break @@ -1332,9 +1346,9 @@ class RosterWindow: if not contact: contact = gajim.contacts.get_contact(account, jid) if pep_type in contact.pep: - pixbuf = contact.pep[pep_type].asPixbufIcon() + pixbuf = gtkgui_helpers.get_pep_as_pixbuf(contact.pep[pep_type]) else: - pixbuf = None + pixbuf = empty_pixbuf for child_iter in iters: self.model[child_iter][model_column] = pixbuf @@ -1342,10 +1356,10 @@ class RosterWindow: iters = self._get_contact_iter(jid, account, model=self.model) if not iters or not gajim.config.get('show_avatars_in_roster'): return - jid = self.model[iters[0]][C_JID].decode('utf-8') + jid = self.model[iters[0]][C_JID] pixbuf = gtkgui_helpers.get_avatar_pixbuf_from_cache(jid) if pixbuf in (None, 'ask'): - scaled_pixbuf = None + scaled_pixbuf = empty_pixbuf else: scaled_pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'roster') for child_iter in iters: @@ -1406,19 +1420,22 @@ class RosterWindow: yield False task = _draw_all_contacts(jids, account) - gobject.idle_add(task.next) + GLib.idle_add(next, task) def _before_fill(self): self.tree.freeze_child_notify() self.tree.set_model(None) # disable sorting - self.model.set_sort_column_id(-2, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(-2, Gtk.SortType.ASCENDING) self.starting = True self.starting_filtering = True def _after_fill(self): self.starting = False + accounts_list = gajim.contacts.get_accounts() for account in gajim.connections: + if account not in accounts_list: + continue jids = gajim.contacts.get_jid_list(account) for jid in jids: @@ -1429,7 +1446,7 @@ class RosterWindow: self.draw_group(group, account) self.draw_account(account) - self.model.set_sort_column_id(1, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(1, Gtk.SortType.ASCENDING) self.tree.set_model(self.modelfilter) self.tree.thaw_child_notify() self.starting_filtering = False @@ -1440,10 +1457,10 @@ class RosterWindow: Create new empty model and draw roster """ self.modelfilter = None - self.model = gtk.TreeStore(*self.columns) + self.model = Gtk.TreeStore(*self.columns) self.model.set_sort_func(1, self._compareIters) - self.model.set_sort_column_id(1, gtk.SORT_ASCENDING) + self.model.set_sort_column_id(1, Gtk.SortType.ASCENDING) self.modelfilter = self.model.filter_new() self.modelfilter.set_visible_func(self._visible_func) self.modelfilter.connect('row-has-child-toggled', @@ -1482,15 +1499,16 @@ class RosterWindow: # do not change selection while DND'ing return # Expand his parent, so this path is visible, don't expand it. - self.tree.expand_to_path(path[:-1]) + path.up() + self.tree.expand_to_path(path) self.tree.scroll_to_cell(path) self.tree.set_cursor(path) def _readjust_expand_collapse_state(self): - def func(model, path, iter_): + def func(model, path, iter_, param): type_ = model[iter_][C_TYPE] - acct = model[iter_][C_ACCOUNT].decode('utf-8') - jid = model[iter_][C_JID].decode('utf-8') + acct = model[iter_][C_ACCOUNT] + jid = model[iter_][C_JID] key = None if type_ == 'account': key = acct @@ -1500,14 +1518,14 @@ class RosterWindow: parent_iter = model.iter_parent(iter_) ptype = model[parent_iter][C_TYPE] if ptype == 'group': - grp = model[parent_iter][C_JID].decode('utf-8') + grp = model[parent_iter][C_JID] key = acct + grp + jid if key: if key in self.collapsed_rows: self.tree.collapse_row(path) else: self.tree.expand_row(path, False) - self.modelfilter.foreach(func) + self.modelfilter.foreach(func, None) def _adjust_account_expand_collapse_state(self, account): """ @@ -1554,6 +1572,8 @@ class RosterWindow: ############################################################################## def refilter_shown_roster_items(self): + if self.filtering: + return self.filtering = True self.modelfilter.refilter() self.filtering = False @@ -1587,7 +1607,7 @@ class RosterWindow: return False return True - def _visible_func(self, model, titer): + def _visible_func(self, model, titer, dummy): """ Determine whether iter should be visible in the treeview """ @@ -1604,11 +1624,10 @@ class RosterWindow: if not account: return False - account = account.decode('utf-8') jid = model[titer][C_JID] if not jid: return False - jid = jid.decode('utf-8') + if type_ == 'group': group = jid if group == _('Transports'): @@ -1659,12 +1678,10 @@ class RosterWindow: if model.iter_has_child(titer): iter_c = model.iter_children(titer) while iter_c: - if self.rfilter_string in model[iter_c][C_NAME].decode( - 'utf-8').lower(): + if self.rfilter_string in model[iter_c][C_NAME].lower(): return True iter_c = model.iter_next(iter_c) - return self.rfilter_string in model[titer][C_NAME].decode( - 'utf-8').lower() + return self.rfilter_string in model[titer][C_NAME].lower() if gajim.config.get('showoffline'): return True bb_jid = None @@ -1689,8 +1706,7 @@ class RosterWindow: return self.contact_is_visible(contact, account) if type_ == 'agent': if self.rfilter_enabled: - return self.rfilter_string in model[titer][C_NAME].decode( - 'utf-8').lower() + return self.rfilter_string in model[titer][C_NAME].lower() contact = gajim.contacts.get_contact_with_highest_priority(account, jid) return self.contact_has_pending_roster_events(contact, account) or \ @@ -1698,8 +1714,7 @@ class RosterWindow: (gajim.account_is_connected(account) or \ gajim.config.get('showoffline'))) if type_ == 'groupchat' and self.rfilter_enabled: - return self.rfilter_string in model[titer][C_NAME].decode('utf-8').\ - lower() + return self.rfilter_string in model[titer][C_NAME].lower() return True def _compareIters(self, model, iter1, iter2, data=None): @@ -1710,8 +1725,8 @@ class RosterWindow: name2 = model[iter2][C_NAME] if not name1 or not name2: return 0 - name1 = name1.decode('utf-8') - name2 = name2.decode('utf-8') + name1 = name1 + name2 = name2 type1 = model[iter1][C_TYPE] type2 = model[iter2][C_TYPE] if type1 == 'self_contact': @@ -1721,10 +1736,10 @@ class RosterWindow: if type1 == 'group': name1 = model[iter1][C_JID] if name1: - name1 = name1.decode('utf-8') + name1 = name1 name2 = model[iter2][C_JID] if name2: - name2 = name2.decode('utf-8') + name2 = name2 if name1 == _('Transports'): return 1 if name2 == _('Transports'): @@ -1741,12 +1756,12 @@ class RosterWindow: account2 = model[iter2][C_ACCOUNT] if not account1 or not account2: return 0 - account1 = account1.decode('utf-8') - account2 = account2.decode('utf-8') + account1 = account1 + account2 = account2 if type1 == 'account': return locale.strcoll(account1, account2) - jid1 = model[iter1][C_JID].decode('utf-8') - jid2 = model[iter2][C_JID].decode('utf-8') + jid1 = model[iter1][C_JID] + jid2 = model[iter2][C_JID] if type1 == 'contact': lcontact1 = gajim.contacts.get_contacts(account1, jid1) contact1 = gajim.contacts.get_first_contact_from_jid(account1, jid1) @@ -1865,7 +1880,7 @@ class RosterWindow: 'groups': ['self_contact'], 'subscription': 'both', 'ask': 'none'} # .keys() is needed - for jid in array.keys(): + for jid in list(array.keys()): # Remove the contact in roster. It might has changed self.remove_contact(jid, account, force=True) # Remove old Contact instances @@ -1923,7 +1938,7 @@ class RosterWindow: chat_control.contact = contact1 def connected_rooms(self, account): - if account in gajim.gc_connected[account].values(): + if account in list(gajim.gc_connected[account].values()): return True return False @@ -1953,7 +1968,7 @@ class RosterWindow: self.draw_contact(jid, account) # Remove contacts in roster if removal was requested key = (jid, account) - if key in self.contacts_to_be_removed.keys(): + if key in list(self.contacts_to_be_removed.keys()): backend = self.contacts_to_be_removed[key]['backend'] del self.contacts_to_be_removed[key] # Remove contact will delay removal if there are more events @@ -1997,6 +2012,7 @@ class RosterWindow: elif event.type_ == 'file-hash-error': ft.show_hash_error(jid, data, account) gajim.events.remove_events(account, jid, event) + return True elif event.type_ == 'file-completed': ft.show_completed(jid, data) gajim.events.remove_events(account, jid, event) @@ -2035,8 +2051,10 @@ class RosterWindow: vb.set_no_show_all(True) def show_tooltip(self, contact): - pointer = self.tree.get_pointer() - props = self.tree.get_path_at_pos(pointer[0], pointer[1]) + device = self.tree.get_window().get_display().get_device_manager().\ + get_client_pointer() + pointer = self.tree.get_window().get_device_position(device) + props = self.tree.get_path_at_pos(pointer[1], pointer[2]) # check if the current pointer is at the same path # as it was before setting the timeout if props and self.tooltip.id == props[0]: @@ -2044,8 +2062,8 @@ class RosterWindow: rect = self.tree.get_cell_area(props[0], props[1]) # position of the treeview on the screen - position = self.tree.window.get_origin() - self.tooltip.show_tooltip(contact, rect.height, position[1] + \ + position = self.tree.get_window().get_origin() + self.tooltip.show_tooltip(contact, rect.height, position[2] + \ rect.y) else: self.tooltip.hide_tooltip() @@ -2184,7 +2202,7 @@ class RosterWindow: gajim.interface.status_sent_to_groups[account] = {} for gc_control in gajim.interface.msg_win_mgr.get_controls( message_control.TYPE_GC) + \ - gajim.interface.minimized_controls[account].values(): + list(gajim.interface.minimized_controls[account].values()): if gc_control.account == account: if gajim.gc_connected[account][gc_control.room_jid]: gajim.connections[account].send_gc_status( @@ -2279,10 +2297,10 @@ class RosterWindow: else: # No need to redraw contacts if we're quitting if child_iterA: - self.model[child_iterA][C_AVATAR_PIXBUF] = None + self.model[child_iterA][C_AVATAR_PIXBUF] = empty_pixbuf if account in gajim.con_types: gajim.con_types[account] = None - for jid in gajim.contacts.get_jid_list(account): + for jid in list(gajim.contacts.get_jid_list(account)): lcontact = gajim.contacts.get_contacts(account, jid) ctrl = gajim.interface.msg_win_mgr.get_gc_control(jid, account) @@ -2343,10 +2361,12 @@ class RosterWindow: table = {'offline':9, 'connecting':9, 'online':0, 'chat':1, 'away':2, 'xa':3, 'dnd':4, 'invisible':5} + liststore = self.status_combobox.get_model() # we check if there are more options in the combobox that it should # if yes, we remove the first ones - while len(self.status_combobox.get_model()) > len(table)+2: - self.status_combobox.remove_text(0) + while len(liststore) > len(table)+2: + titer = liststore.get_iter_first() + liststore.remove(titer) show = helpers.get_global_show() # temporarily block signal in order not to send status that we show @@ -2356,7 +2376,6 @@ class RosterWindow: self.status_combobox.set_active(table[show]) else: uf_show = helpers.get_uf_show(show) - liststore = self.status_combobox.get_model() liststore.prepend(['SEPARATOR', None, '', True]) status_combobox_text = uf_show + ' (' + _("desync'ed") +')' liststore.prepend([status_combobox_text, @@ -2387,7 +2406,7 @@ class RosterWindow: """ Close all the windows in the given dictionary """ - for w in dic.values(): + for w in list(dic.values()): if isinstance(w, dict): self.close_all_from_dict(w) else: @@ -2402,7 +2421,7 @@ class RosterWindow: self.close_all_from_dict(gajim.interface.instances[account]) for ctrl in gajim.interface.msg_win_mgr.get_controls(acct=account): ctrl.parent_win.remove_tab(ctrl, ctrl.parent_win.CLOSE_CLOSE_BUTTON, - force = force) + force=force) def on_roster_window_delete_event(self, widget, event): """ @@ -2436,15 +2455,15 @@ class RosterWindow: # in case show_roster_on_start is False and roster is never shown # window.window is None - if self.window.window is not None: + if self.window.get_window() is not None: if gajim.config.get('save-roster-position'): - x, y = self.window.window.get_root_origin() + x, y = self.window.get_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_object('roster_vbox2').allocation.width + width = self.xml.get_object('roster_vbox2').get_allocation().width gajim.config.set('roster_width', width) gajim.config.set('roster_height', height) if not self.xml.get_object('roster_vbox2').get_property('visible'): @@ -2471,7 +2490,7 @@ class RosterWindow: When we quit the gtk interface - exit gtk """ self.prepare_quit() - gtk.main_quit() + Gtk.main_quit() def on_quit_request(self, widget=None): """ @@ -2479,7 +2498,7 @@ class RosterWindow: Terminate all sessions and send offline to all connected account. We do NOT really quit gajim here """ - accounts = gajim.connections.keys() + accounts = list(gajim.connections.keys()) get_msg = False for acct in accounts: if gajim.connections[acct].connected: @@ -2572,11 +2591,11 @@ class RosterWindow: if jid in jid_list or jid == gajim.get_jid_from_account(account): if not gajim.jid_is_transport(jid) and len(obj.contact_list) == 1: if obj.old_show == 0 and obj.new_show > 1: - gobject.timeout_add_seconds(5, self.remove_newly_added, jid, + GLib.timeout_add_seconds(5, self.remove_newly_added, jid, account) elif obj.old_show > 1 and obj.new_show == 0 and \ obj.conn.connected > 1: - gobject.timeout_add_seconds(5, self.remove_to_be_removed, + GLib.timeout_add_seconds(5, self.remove_to_be_removed, jid, account) if obj.need_redraw: @@ -2599,7 +2618,7 @@ class RosterWindow: if obj.popup: ctrl = gajim.interface.msg_win_mgr.search_control(jid, account) if ctrl: - gobject.idle_add(ctrl.parent_win.set_active_tab, ctrl) + GLib.idle_add(ctrl.parent_win.set_active_tab, ctrl) else: ctrl = gajim.interface.new_chat(obj.contact, account) if len(gajim.events.get_events(account, obj.jid)): @@ -2635,11 +2654,13 @@ class RosterWindow: contact = \ gajim.contacts.get_contact_with_highest_priority( account, jid) + if not contact: + continue gajim.interface.on_open_chat_window(None, contact, account) gajim.config.set_per('accounts', account, 'opened_chat_controls', '') - gobject.idle_add(self.refilter_shown_roster_items) + GLib.idle_add(self.refilter_shown_roster_items) def _nec_anonymous_auth(self, obj): """ @@ -2700,7 +2721,14 @@ class RosterWindow: return True if obj.mtype not in ('normal', 'chat'): return - if obj.session.control: + if obj.mtype == 'normal' and obj.popup: + # it's single message to be autopopuped + dialogs.SingleMessageWindow(obj.conn.name, obj.jid, + action='receive', from_whom=obj.jid, subject=obj.subject, + message=obj.msgtxt, resource=obj.resource, session=obj.session, + form_node=obj.form_node) + return + if obj.session.control and obj.mtype == 'chat': typ = '' if obj.mtype == 'error': typ = 'error' @@ -2717,7 +2745,7 @@ class RosterWindow: if not pw or (pw.get_active_control() and obj.session.control \ == pw.get_active_control() and pw.is_active() and end): gajim.logger.set_read_messages([obj.msg_id]) - elif obj.popup: + elif obj.popup and obj.mtype == 'chat': contact = gajim.contacts.get_contact(obj.conn.name, obj.jid) obj.session.control = gajim.interface.new_chat(contact, obj.conn.name, session=obj.session) @@ -2857,8 +2885,8 @@ class RosterWindow: if model[titer][C_TYPE] in ('contact', 'self_contact'): # we're on a contact entry in the roster if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: - account = model[titer][C_ACCOUNT].decode('utf-8') - jid = model[titer][C_JID].decode('utf-8') + account = model[titer][C_ACCOUNT] + jid = model[titer][C_JID] self.tooltip.id = row contacts = gajim.contacts.get_contacts(account, jid) connected_contacts = [] @@ -2869,25 +2897,25 @@ class RosterWindow: # no connected contacts, show the ofline one connected_contacts = contacts self.tooltip.account = account - self.tooltip.timeout = gobject.timeout_add(500, + self.tooltip.timeout = GLib.timeout_add(500, self.show_tooltip, connected_contacts) elif model[titer][C_TYPE] == 'groupchat': if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: - account = model[titer][C_ACCOUNT].decode('utf-8') - jid = model[titer][C_JID].decode('utf-8') + account = model[titer][C_ACCOUNT] + jid = model[titer][C_JID] self.tooltip.id = row contact = gajim.contacts.get_contacts(account, jid) self.tooltip.account = account - self.tooltip.timeout = gobject.timeout_add(500, + self.tooltip.timeout = GLib.timeout_add(500, self.show_tooltip, contact) elif model[titer][C_TYPE] == 'account': # we're on an account entry in the roster if self.tooltip.timeout == 0 or self.tooltip.id != props[0]: - account = model[titer][C_ACCOUNT].decode('utf-8') + account = model[titer][C_ACCOUNT] if account == 'all': self.tooltip.id = row self.tooltip.account = None - self.tooltip.timeout = gobject.timeout_add(500, + self.tooltip.timeout = GLib.timeout_add(500, self.show_tooltip, []) return jid = gajim.get_jid_from_account(account) @@ -2941,7 +2969,7 @@ class RosterWindow: contacts.append(contact) self.tooltip.id = row self.tooltip.account = None - self.tooltip.timeout = gobject.timeout_add(500, + self.tooltip.timeout = GLib.timeout_add(500, self.show_tooltip, contacts) def on_agent_logging(self, widget, jid, state, account): @@ -3012,6 +3040,7 @@ class RosterWindow: if msg is None: # user pressed Cancel to change status message dialog return + accounts = [] accounts = set(i[1] for i in list_ if gajim.connections[i[1]].\ privacy_rules_supported) if group is None: @@ -3091,7 +3120,7 @@ class RosterWindow: old_text = jid title = _('Rename Group') message = _('Enter a new name for group %s') % \ - gobject.markup_escape_text(jid) + GLib.markup_escape_text(jid) def on_renamed(new_text, account, row_type, jid, old_text): if 'rename' in gajim.interface.instances: @@ -3145,7 +3174,7 @@ class RosterWindow: 'attached_gpg_keys').split() keys = {} keyID = _('None') - for i in xrange(len(attached_keys)/2): + for i in list(range(len(attached_keys)/2)): keys[attached_keys[2*i]] = attached_keys[2*i+1] if attached_keys[2*i] == contact.jid: keyID = attached_keys[2*i+1] @@ -3197,12 +3226,12 @@ class RosterWindow: dialogs.ErrorDialog(_('Could not load image'), msg) return try: - pixbuf = gtk.gdk.pixbuf_new_from_file(path_to_file) + pixbuf = GdkPixbuf.Pixbuf.new_from_file(path_to_file) if filesize > 16384: # 16 kb # get the image at 'tooltip size' # and hope that user did not specify in ACE crazy size pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'tooltip') - except gobject.GError, msg: # unknown format + except GObject.GError as msg: # unknown format # msg should be string, not object instance msg = str(msg) dialogs.ErrorDialog(_('Could not load image'), msg) @@ -3306,7 +3335,7 @@ class RosterWindow: break def on_invite_to_room(self, widget, list_, room_jid, room_account, - resource=None): + resource=None): """ Resource parameter MUST NOT be used if more than one contact in list """ @@ -3338,7 +3367,7 @@ class RosterWindow: if gc_control: mw = gajim.interface.msg_win_mgr.get_window(jid, account) mw.set_active_tab(gc_control) - mw.window.window.focus(gtk.get_current_event_time()) + mw.window.get_window().focus(Gtk.get_current_event_time()) return ctrl = gajim.interface.minimized_controls[account][jid] mw = gajim.interface.msg_win_mgr.get_window(jid, account) @@ -3348,7 +3377,7 @@ class RosterWindow: ctrl.parent_win = mw mw.new_tab(ctrl) mw.set_active_tab(ctrl) - mw.window.window.focus(gtk.get_current_event_time()) + mw.window.get_window().focus(Gtk.get_current_event_time()) self.remove_groupchat(jid, account) def on_edit_account(self, widget, account): @@ -3384,12 +3413,12 @@ class RosterWindow: When a key is pressed in the treeviews """ self.tooltip.hide_tooltip() - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: if self.rfilter_enabled: self.disable_rfilter() else: self.tree.get_selection().unselect_all() - elif event.keyval == gtk.keysyms.F2: + elif event.keyval == Gdk.KEY_F2: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() if len(list_of_paths) != 1: @@ -3397,17 +3426,17 @@ class RosterWindow: path = list_of_paths[0] type_ = model[path][C_TYPE] if type_ in ('contact', 'group', 'agent'): - jid = model[path][C_JID].decode('utf-8') - account = model[path][C_ACCOUNT].decode('utf-8') + jid = model[path][C_JID] + account = model[path][C_ACCOUNT] self.on_rename(widget, type_, jid, account) - elif event.keyval == gtk.keysyms.Delete: + elif event.keyval == Gdk.KEY_Delete: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() if not len(list_of_paths): return type_ = model[list_of_paths[0]][C_TYPE] - account = model[list_of_paths[0]][C_ACCOUNT].decode('utf-8') + account = model[list_of_paths[0]][C_ACCOUNT] if type_ in ('account', 'group', 'self_contact') or \ account == gajim.ZEROCONF_ACC_NAME: return @@ -3415,8 +3444,8 @@ class RosterWindow: for path in list_of_paths: if model[path][C_TYPE] != type_: return - jid = model[path][C_JID].decode('utf-8') - account = model[path][C_ACCOUNT].decode('utf-8') + jid = model[path][C_JID] + account = model[path][C_ACCOUNT] contact = gajim.contacts.get_contact_with_highest_priority( account, jid) list_.append((contact, account)) @@ -3425,18 +3454,20 @@ class RosterWindow: elif type_ == 'agent': self.on_remove_agent(widget, list_) - elif not (event.state & (gtk.gdk.CONTROL_MASK | gtk.gdk.MOD1_MASK)) and\ - gtk.gdk.keyval_to_unicode(event.keyval): - # if we got unicode symbol without ctrl / alt - num = gtk.gdk.keyval_to_unicode(event.keyval) - self.enable_rfilter(unichr(num)) + elif not (event.get_state() & (Gdk.ModifierType.CONTROL_MASK | \ + Gdk.ModifierType.MOD1_MASK)): + num = Gdk.keyval_to_unicode(event.keyval) + if num and num > 31: + # if we got unicode symbol without ctrl / alt + self.enable_rfilter(chr(num)) - elif event.state & gtk.gdk.CONTROL_MASK and \ - event.state & gtk.gdk.SHIFT_MASK and event.keyval == gtk.keysyms.U: + elif event.get_state() & Gdk.ModifierType.CONTROL_MASK and \ + event.get_state() & Gdk.ModifierType.SHIFT_MASK and \ + event.keyval == Gdk.KEY_U: self.enable_rfilter('') - self.rfilter_entry.emit('key_press_event', event) + self.rfilter_entry.event(event) - elif event.keyval == gtk.keysyms.Left: + elif event.keyval == Gdk.KEY_Left: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() if len(list_of_paths) != 1: @@ -3446,10 +3477,10 @@ class RosterWindow: if model.iter_has_child(iter_) and self.tree.row_expanded(path): self.tree.collapse_row(path) return True - elif len(path) > 1: + elif path.get_depth() > 1: self.tree.set_cursor(path[:-1]) return True - elif event.keyval == gtk.keysyms.Right: + elif event.keyval == Gdk.KEY_Right: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() if len(list_of_paths) != 1: @@ -3467,8 +3498,8 @@ class RosterWindow: return False if event.button == 1: # Left click - if gajim.single_click and not event.state & gtk.gdk.SHIFT_MASK and \ - not event.state & gtk.gdk.CONTROL_MASK: + if gajim.single_click and not event.get_state() & Gdk.ModifierType.SHIFT_MASK and \ + not event.get_state() & Gdk.ModifierType.CONTROL_MASK: # Check if button has been pressed on the same row if self.clicked_path == path: self.on_row_activated(widget, path) @@ -3476,12 +3507,11 @@ class RosterWindow: def accel_group_func(self, accel_group, acceleratable, keyval, modifier): # CTRL mask - if modifier & gtk.gdk.CONTROL_MASK: - if keyval == gtk.keysyms.s: # CTRL + s + if modifier & Gdk.ModifierType.CONTROL_MASK: + if keyval == Gdk.KEY_s: # CTRL + s model = self.status_combobox.get_model() - accounts = gajim.connections.keys() - status = model[self.previous_status_combobox_active][2].decode( - 'utf-8') + accounts = list(gajim.connections.keys()) + status = model[self.previous_status_combobox_active][2] def on_response(message, pep_dict): if message is not None: # None if user pressed Cancel for account in accounts: @@ -3494,7 +3524,7 @@ class RosterWindow: self.send_pep(account, pep_dict) dialogs.ChangeStatusMessageDialog(on_response, status) return True - elif keyval == gtk.keysyms.k: # CTRL + k + elif keyval == Gdk.KEY_k: # CTRL + k self.enable_rfilter('') def on_roster_treeview_button_press_event(self, widget, event): @@ -3531,7 +3561,7 @@ class RosterWindow: if type_ in ('agent', 'contact', 'self_contact', 'groupchat'): self.on_row_activated(widget, path) elif type_ == 'account': - account = model[path][C_ACCOUNT].decode('utf-8') + account = model[path][C_ACCOUNT] if account != 'all': show = gajim.connections[account].connected if show > 1: # We are connected @@ -3562,8 +3592,8 @@ class RosterWindow: 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: + if gajim.single_click and not event.get_state() & Gdk.ModifierType.SHIFT_MASK and \ + not event.get_state() & Gdk.ModifierType.CONTROL_MASK: # Don't handle double click if we press icon of a metacontact titer = model.get_iter(path) if x > x_min and x < x_min + 27 and type_ == 'contact' and \ @@ -3738,22 +3768,21 @@ class RosterWindow: if not self.combobox_callback_active: self.previous_status_combobox_active = active return - accounts = gajim.connections.keys() + accounts = list(gajim.connections.keys()) if len(accounts) == 0: dialogs.ErrorDialog(_('No account available'), _('You must create an account before you can chat with other ' 'contacts.')) self.update_status_combobox() return - status = model[active][2].decode('utf-8') + status = model[active][2] # status "desync'ed" or not statuses_unified = helpers.statuses_unified() if (active == 7 and statuses_unified) or (active == 9 and \ not statuses_unified): # 'Change status message' selected: # do not change show, just show change status dialog - status = model[self.previous_status_combobox_active][2].decode( - 'utf-8') + status = model[self.previous_status_combobox_active][2] def on_response(message, pep_dict): if message is not None: # None if user pressed Cancel for account in accounts: @@ -3839,7 +3868,7 @@ class RosterWindow: ) def on_plugins_menuitem_activate(self, widget): - if gajim.interface.instances.has_key('plugins'): + if 'plugins' in gajim.interface.instances: gajim.interface.instances['plugins'].window.present() else: gajim.interface.instances['plugins'] = plugins.gui.PluginsWindow() @@ -3962,7 +3991,7 @@ class RosterWindow: """ jid = contact.jid if resource is not None: - jid = jid + u'/' + resource + jid = jid + '/' + resource adhoc_commands.CommandWindow(account, jid) def on_roster_window_focus_in_event(self, widget, event): @@ -3987,7 +4016,7 @@ class RosterWindow: self.draw_contact(jid, account, selected=True, focus=False) def on_roster_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: if self.rfilter_enabled: self.disable_rfilter() return @@ -4003,20 +4032,20 @@ class RosterWindow: 'allow_hide_roster')): self.tooltip.hide_tooltip() self.window.hide() - elif event.state & gtk.gdk.CONTROL_MASK and event.keyval == \ - gtk.keysyms.i: + elif event.get_state() & Gdk.ModifierType.CONTROL_MASK and event.keyval == \ + Gdk.KEY_i: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() for path in list_of_paths: type_ = model[path][C_TYPE] if type_ in ('contact', 'agent'): - jid = model[path][C_JID].decode('utf-8') - account = model[path][C_ACCOUNT].decode('utf-8') + jid = model[path][C_JID] + account = model[path][C_ACCOUNT] contact = gajim.contacts.get_first_contact_from_jid(account, jid) self.on_info(widget, contact, account) - elif event.state & gtk.gdk.CONTROL_MASK and event.keyval == \ - gtk.keysyms.h: + elif event.get_state() & Gdk.ModifierType.CONTROL_MASK and event.keyval == \ + Gdk.KEY_h: treeselection = self.tree.get_selection() model, list_of_paths = treeselection.get_selected_rows() if len(list_of_paths) != 1: @@ -4024,14 +4053,14 @@ class RosterWindow: path = list_of_paths[0] type_ = model[path][C_TYPE] if type_ in ('contact', 'agent'): - jid = model[path][C_JID].decode('utf-8') - account = model[path][C_ACCOUNT].decode('utf-8') + jid = model[path][C_JID] + account = model[path][C_ACCOUNT] contact = gajim.contacts.get_first_contact_from_jid(account, jid) self.on_history(widget, contact, account) def on_roster_window_popup_menu(self, widget): - event = gtk.gdk.Event(gtk.gdk.KEY_PRESS) + event = Gdk.Event(Gdk.EventType.KEY_PRESS) self.show_treeview_menu(event) def on_row_activated(self, widget, path): @@ -4040,7 +4069,7 @@ class RosterWindow: this way) """ model = self.modelfilter - account = model[path][C_ACCOUNT].decode('utf-8') + account = model[path][C_ACCOUNT] type_ = model[path][C_TYPE] if type_ in ('group', 'account'): if self.tree.row_expanded(path): @@ -4049,8 +4078,8 @@ class RosterWindow: self.tree.expand_row(path, False) return if self.rfilter_enabled: - gobject.idle_add(self.disable_rfilter) - jid = model[path][C_JID].decode('utf-8') + Gobject.idle_add(self.disable_rfilter) + jid = model[path][C_JID] resource = None contact = gajim.contacts.get_contact_with_highest_priority(account, jid) titer = model.get_iter(path) @@ -4077,7 +4106,7 @@ class RosterWindow: if not first_ev and model.iter_has_child(titer): child_iter = model.iter_children(titer) while not first_ev and child_iter: - child_jid = model[child_iter][C_JID].decode('utf-8') + child_jid = model[child_iter][C_JID] first_ev = gajim.events.get_first_event(account, child_jid) if first_ev: jid = child_jid @@ -4120,13 +4149,13 @@ class RosterWindow: child_iter = model.convert_iter_to_child_iter(titer) if self.regroup: # merged accounts - accounts = gajim.connections.keys() + accounts = list(gajim.connections.keys()) else: - accounts = [model[titer][C_ACCOUNT].decode('utf-8')] + accounts = [model[titer][C_ACCOUNT]] type_ = model[titer][C_TYPE] if type_ == 'group': - group = model[titer][C_JID].decode('utf-8') + group = model[titer][C_JID] child_model[child_iter][C_IMG] = \ gajim.interface.jabber_state_images['16']['opened'] if self.rfilter_enabled: @@ -4146,7 +4175,7 @@ class RosterWindow: path = model.get_path(titer) self.tree.expand_row(path, False) elif type_ == 'account': - account = accounts[0] # There is only one cause we don't use merge + account = list(accounts)[0] # There is only one cause we don't use merge if account in self.collapsed_rows: self.collapsed_rows.remove(account) self.draw_account(account) @@ -4159,8 +4188,8 @@ class RosterWindow: self.tree.expand_row(path, False) elif type_ == 'contact': # Metacontact got toggled, update icon - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact(account, jid) for group in contact.groups: if account + group + jid in self.collapsed_rows: @@ -4184,9 +4213,9 @@ class RosterWindow: child_iter = model.convert_iter_to_child_iter(titer) if self.regroup: # merged accounts - accounts = gajim.connections.keys() + accounts = list(gajim.connections.keys()) else: - accounts = [model[titer][C_ACCOUNT].decode('utf-8')] + accounts = [model[titer][C_ACCOUNT]] type_ = model[titer][C_TYPE] if type_ == 'group': @@ -4194,7 +4223,7 @@ class RosterWindow: jabber_state_images['16']['closed'] if self.rfilter_enabled: return - group = model[titer][C_JID].decode('utf-8') + group = model[titer][C_JID] for account in accounts: if group in gajim.groups[account]: # This account has this group gajim.groups[account][group]['expand'] = False @@ -4207,8 +4236,8 @@ class RosterWindow: self.draw_account(account) elif type_ == 'contact': # Metacontact got toggled, update icon - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact(account, jid) groups = contact.groups if not groups: @@ -4240,8 +4269,6 @@ class RosterWindow: if not account: return - account = account.decode('utf-8') - if type_ == 'contact': child_iter = model.convert_iter_to_child_iter(titer) if self.model.iter_has_child(child_iter): @@ -4249,10 +4276,10 @@ class RosterWindow: # redraw us to show/hide expand icon if self.filtering: # Prevent endless loops - jid = model[titer][C_JID].decode('utf-8') - gobject.idle_add(self.draw_contact, jid, account) + jid = model[titer][C_JID] + GLib.idle_add(self.draw_contact, jid, account) elif type_ == 'group': - group = model[titer][C_JID].decode('utf-8') + group = model[titer][C_JID] self._adjust_group_expand_collapse_state(group, account) elif type_ == 'account': self._adjust_account_expand_collapse_state(account) @@ -4272,7 +4299,7 @@ class RosterWindow: # if len(self._last_selected_contact): # # update unselected rows # for (jid, account) in self._last_selected_contact: -# gobject.idle_add(self.draw_contact, jid, +# GLib.idle_add(self.draw_contact, jid, # account) # self._last_selected_contact = [] # if len(list_of_paths) == 0: @@ -4282,10 +4309,10 @@ class RosterWindow: # if row[C_TYPE] != 'contact': # self._last_selected_contact = [] # return -# jid = row[C_JID].decode('utf-8') -# account = row[C_ACCOUNT].decode('utf-8') +# jid = row[C_JID] +# account = row[C_ACCOUNT] # self._last_selected_contact.append((jid, account)) -# gobject.idle_add(self.draw_contact, jid, account, True) +# GLib.idle_add(self.draw_contact, jid, account, True) def on_service_disco_menuitem_activate(self, widget, account): server_jid = gajim.config.get_per('accounts', account, 'hostname') @@ -4331,6 +4358,7 @@ class RosterWindow: w.set_sensitive(True) def on_view_menu_activate(self, widget): + self.make_menu() # 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_object('show_roster_menuitem').show() @@ -4345,19 +4373,19 @@ class RosterWindow: def on_rfilter_entry_changed(self, widget): """ When we update the content of the filter """ - self.rfilter_string = widget.get_text().decode('utf-8').lower() + self.rfilter_string = widget.get_text().lower() if self.rfilter_string == '': self.disable_rfilter() self.refilter_shown_roster_items() # select first row self.tree.get_selection().unselect_all() - def _func(model, path, iter_): + def _func(model, path, iter_, param): if model[iter_][C_TYPE] == 'contact' and self.rfilter_string in \ - model[iter_][C_NAME].decode('utf-8').lower(): + model[iter_][C_NAME].lower(): col = self.tree.get_column(0) - self.tree.set_cursor_on_cell(path, col) + self.tree.set_cursor_on_cell(path, col, None, False) return True - self.modelfilter.foreach(_func) + self.modelfilter.foreach(_func, None) def on_rfilter_entry_icon_press(self, widget, icon, event): """ @@ -4366,16 +4394,16 @@ class RosterWindow: self.disable_rfilter() def on_rfilter_entry_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.disable_rfilter() - elif event.keyval == gtk.keysyms.Return: + elif event.keyval == Gdk.KEY_Return: self.tree.grab_focus() - self.tree.emit('key_press_event', event) + self.tree.event(event) self.disable_rfilter() - elif event.keyval in (gtk.keysyms.Up, gtk.keysyms.Down): + elif event.keyval in (Gdk.KEY_Up, Gdk.KEY_Down): self.tree.grab_focus() - self.tree.emit('key_press_event', event) - elif event.keyval == gtk.keysyms.BackSpace: + self.tree.event(event) + elif event.keyval == Gdk.KEY_BackSpace: if widget.get_text() == '': self.disable_rfilter() @@ -4411,10 +4439,10 @@ class RosterWindow: def on_roster_hpaned_notify(self, pane, gparamspec): """ Keep changing the width of the roster - (when a gtk.Paned widget handle is dragged) + (when a Gtk.Paned widget handle is dragged) """ - if gparamspec.name == 'position': - roster_width = pane.get_child1().allocation.width + if gparamspec and gparamspec.name == 'position': + roster_width = pane.get_child1().get_allocation().width gajim.config.set('roster_width', roster_width) gajim.config.set('roster_hpaned_position', pane.get_position()) @@ -4429,9 +4457,9 @@ class RosterWindow: return path = list_of_paths[0] data = '' - if len(path) >= 2: + if path.get_depth() >= 2: data = model[path][C_JID] - selection.set(selection.target, 8, data) + selection.set_text(data, -1) def drag_begin(self, treeview, context): self.dragging = True @@ -4543,8 +4571,12 @@ class RosterWindow: self.draw_account(account_source) context.finish(True, True, etime) + dest_family = gajim.contacts.get_metacontacts_family(account_dest, + c_dest.jid) + source_family = gajim.contacts.get_metacontacts_family(account_source, + c_source.jid) confirm_metacontacts = gajim.config.get('confirm_metacontacts') - if confirm_metacontacts == 'no': + if confirm_metacontacts == 'no' or dest_family == source_family: merge_contacts() return pritext = _('You are about to create a metacontact. Are you sure you ' @@ -4597,46 +4629,47 @@ class RosterWindow: self.remove_contact_from_groups(c_source.jid, account, [grp_source]) - if context.action in (gtk.gdk.ACTION_MOVE, gtk.gdk.ACTION_COPY): + if context.get_action() in (Gdk.DragAction.MOVE, Gdk.DragAction.COPY): context.finish(True, True, etime) def drag_drop(self, treeview, context, x, y, timestamp): target_list = treeview.drag_dest_get_target_list() target = treeview.drag_dest_find_target(context, target_list) - treeview.drag_get_data(context, target) - context.finish(False, True) + treeview.drag_get_data(context, target, 0) + context.finish(False, True, 0) return True def move_group(self, old_name, new_name, account): - for group in gajim.groups[account].keys(): + for group in list(gajim.groups[account].keys()): if group.startswith(old_name): self.rename_group(group, group.replace(old_name, new_name), account) def drag_data_received_data(self, treeview, context, x, y, selection, info, etime): - treeview.stop_emission('drag_data_received') + treeview.stop_emission_by_name('drag_data_received') drop_info = treeview.get_dest_row_at_pos(x, y) if not drop_info: return - if not selection.data: + data = selection.get_data().decode() + if not data: return # prevents tb when several entrys are dragged model = treeview.get_model() - data = selection.data + path_dest, position = drop_info - if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 2 \ + if position == Gtk.TreeViewDropPosition.BEFORE and len(path_dest) == 2 \ and path_dest[1] == 0: # dropped before the first group return - if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 2: + if position == Gtk.TreeViewDropPosition.BEFORE and len(path_dest) == 2: # dropped before a group: we drop it in the previous group every # time path_dest = (path_dest[0], path_dest[1]-1) # destination: the row something got dropped on iter_dest = model.get_iter(path_dest) - type_dest = model[iter_dest][C_TYPE].decode('utf-8') - jid_dest = model[iter_dest][C_JID].decode('utf-8') - account_dest = model[iter_dest][C_ACCOUNT].decode('utf-8') + type_dest = model[iter_dest][C_TYPE] + jid_dest = model[iter_dest][C_JID] + account_dest = model[iter_dest][C_ACCOUNT] # drop on account row in merged mode, we cannot know the desired account if account_dest == 'all': @@ -4700,7 +4733,7 @@ class RosterWindow: path_source = treeview.get_selection().get_selected_rows()[1][0] iter_source = model.get_iter(path_source) type_source = model[iter_source][C_TYPE] - account_source = model[iter_source][C_ACCOUNT].decode('utf-8') + account_source = model[iter_source][C_ACCOUNT] if gajim.config.get_per('accounts', account_source, 'is_zeroconf'): return @@ -4718,14 +4751,14 @@ class RosterWindow: if account_source != account_dest: # drop on another account return - grp_source = model[iter_source][C_JID].decode('utf-8') + grp_source = model[iter_source][C_JID] delimiter = gajim.connections[account_source].nested_group_delimiter grp_source_list = grp_source.split(delimiter) new_grp = None if type_dest == 'account': new_grp = grp_source_list[-1] elif type_dest == 'group': - new_grp = model[iter_dest][C_JID].decode('utf-8') + delimiter +\ + new_grp = model[iter_dest][C_JID] + delimiter +\ grp_source_list[-1] if new_grp: self.move_group(grp_source, new_grp, account_source) @@ -4747,26 +4780,26 @@ class RosterWindow: it = iter_source while model[it][C_TYPE] == 'contact': it = model.iter_parent(it) - grp_source = model[it][C_JID].decode('utf-8') + grp_source = model[it][C_JID] if grp_source in helpers.special_groups and \ grp_source not in ('Not in Roster', 'Observers'): # a transport or a minimized groupchat was dragged # we can add it to other accounts but not move it to another group, # see below return - jid_source = data.decode('utf-8') + jid_source = data c_source = gajim.contacts.get_contact_with_highest_priority( account_source, jid_source) # Get destination group grp_dest = None if type_dest == 'group': - grp_dest = model[iter_dest][C_JID].decode('utf-8') + grp_dest = model[iter_dest][C_JID] elif type_dest in ('contact', 'agent'): it = iter_dest while model[it][C_TYPE] != 'group': it = model.iter_parent(it) - grp_dest = model[it][C_JID].decode('utf-8') + grp_dest = model[it][C_JID] if grp_dest in helpers.special_groups: return @@ -4795,30 +4828,31 @@ class RosterWindow: drop_in_middle_of_meta = False if type_dest == 'contact': - if position == gtk.TREE_VIEW_DROP_BEFORE and len(path_dest) == 4: + if position == Gtk.TreeViewDropPosition.BEFORE and len(path_dest) == 4: drop_in_middle_of_meta = True - if position == gtk.TREE_VIEW_DROP_AFTER and (len(path_dest) == 4 or\ + if position == Gtk.TreeViewDropPosition.AFTER and (len(path_dest) == 4 or\ self.modelfilter.iter_has_child(iter_dest)): drop_in_middle_of_meta = True # Contact drop on group row or between two contacts that are # not metacontacts - if (type_dest == 'group' or position in (gtk.TREE_VIEW_DROP_BEFORE, - gtk.TREE_VIEW_DROP_AFTER)) and not drop_in_middle_of_meta: + if (type_dest == 'group' or position in (Gtk.TreeViewDropPosition.BEFORE, + Gtk.TreeViewDropPosition.AFTER)) and not drop_in_middle_of_meta: 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 or drop_in_middle_of_meta: + if position == Gtk.TreeViewDropPosition.INTO_OR_AFTER or \ + position == Gtk.TreeViewDropPosition.INTO_OR_BEFORE or drop_in_middle_of_meta: c_dest = gajim.contacts.get_contact_with_highest_priority( account_dest, jid_dest) if not c_dest: # c_dest is None if jid_dest doesn't belong to account return - menu = gtk.Menu() - item = gtk.MenuItem(_('Send %s to %s') % (c_source.get_shown_name(), - c_dest.get_shown_name())) + menu = Gtk.Menu() + item = Gtk.MenuItem(_('Send %s to %s') % ( + c_source.get_shown_name(), c_dest.get_shown_name()), + use_underline=False) item.connect('activate', self.on_drop_rosterx, account_source, c_source, account_dest, c_dest, is_big_brother, context, etime) menu.append(item) @@ -4827,12 +4861,13 @@ class RosterWindow: c_dest.jid) source_family = gajim.contacts.get_metacontacts_family( account_source, c_source.jid) - if dest_family == source_family and dest_family: - item = gtk.MenuItem(_('Make %s first contact') % ( - c_source.get_shown_name())) + if dest_family == source_family and dest_family: + item = Gtk.MenuItem(_('Make %s first contact') % ( + c_source.get_shown_name()), use_underline=False) else: - item = gtk.MenuItem(_('Make %s and %s metacontacts') % ( - c_source.get_shown_name(), c_dest.get_shown_name())) + item = Gtk.MenuItem(_('Make %s and %s metacontacts') % ( + c_source.get_shown_name(), c_dest.get_shown_name()), + use_underline=False) item.connect('activate', self.on_drop_in_contact, account_source, c_source, account_dest, c_dest, is_big_brother, context, etime) @@ -4842,7 +4877,7 @@ class RosterWindow: menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() - menu.popup(None, None, None, 1, etime) + menu.popup(None, None, None, None, 1, etime) ################################################################################ ### Everything about images and icons.... @@ -4892,7 +4927,7 @@ class RosterWindow: self.setup_and_draw_roster() # Update the status combobox model = self.status_combobox.get_model() - titer = model.get_iter_root() + titer = model.get_iter_first() while titer: if model[titer][2] != '': # If it's not change status message iter @@ -4976,7 +5011,7 @@ class RosterWindow: for account in gajim.connections: for addr in gajim.interface.instances[account]['disco']: gajim.interface.instances[account]['disco'][addr].paint_banner() - for ctrl in gajim.interface.minimized_controls[account].values(): + for ctrl in list(gajim.interface.minimized_controls[account].values()): ctrl.repaint_themed_widgets() def update_avatar_in_gui(self, jid, account): @@ -4993,11 +5028,13 @@ class RosterWindow: Set style for treeview cell, using PRELIGHT system color """ if set_background: - bgcolor = self.tree.style.bg[style] - renderer.set_property('cell-background-gdk', bgcolor) + context = self.tree.get_style_context() + bgcolor = context.get_background_color(style) + renderer.set_property('cell-background-rgba', bgcolor) else: - fgcolor = self.tree.style.fg[style] - renderer.set_property('foreground-gdk', fgcolor) + context = self.tree.get_style_context() + fgcolor = context.get_color(style) + renderer.set_property('foreground-rgba', fgcolor) def _iconCellDataFunc(self, column, renderer, model, titer, data=None): """ @@ -5022,8 +5059,8 @@ class RosterWindow: if not model[titer][C_JID] or not model[titer][C_ACCOUNT]: # This can append when at the moment we add the row return - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] self._set_contact_row_background_color(renderer, jid, account) parent_iter = model.iter_parent(titer) if model[parent_iter][C_TYPE] == 'contact': @@ -5046,7 +5083,7 @@ class RosterWindow: if color: renderer.set_property('foreground', color) else: - self.set_renderer_color(renderer, gtk.STATE_ACTIVE, False) + self.set_renderer_color(renderer, Gtk.StateFlags.ACTIVE, False) renderer.set_property('font', gtkgui_helpers.get_theme_font_for_option(theme, 'accountfont')) renderer.set_property('xpad', 0) @@ -5057,7 +5094,7 @@ class RosterWindow: if color: renderer.set_property('foreground', color) else: - self.set_renderer_color(renderer, gtk.STATE_PRELIGHT, False) + self.set_renderer_color(renderer, Gtk.StateFlags.PRELIGHT, False) renderer.set_property('font', gtkgui_helpers.get_theme_font_for_option(theme, 'groupfont')) parent_iter = model.iter_parent(titer) @@ -5071,8 +5108,8 @@ class RosterWindow: if not model[titer][C_JID] or not model[titer][C_ACCOUNT]: # This can append when at the moment we add the row return - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] color = None if type_ == 'groupchat': ctrl = gajim.interface.minimized_controls[account].get(jid, @@ -5108,7 +5145,7 @@ class RosterWindow: return # allocate space for the icon only if needed - if not model[titer][data]: + if not model[titer][data] or model[titer][data] == empty_pixbuf: renderer.set_property('visible', False) else: renderer.set_property('visible', True) @@ -5120,8 +5157,8 @@ class RosterWindow: if not model[titer][C_JID] or not model[titer][C_ACCOUNT]: # This can append at the moment we add the row return - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] self._set_contact_row_background_color(renderer, jid, account) def _fill_avatar_pixbuf_renderer(self, column, renderer, model, titer, @@ -5147,11 +5184,14 @@ class RosterWindow: if not model[titer][C_JID] or not model[titer][C_ACCOUNT]: # This can append at the moment we add the row return - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] self._set_contact_row_background_color(renderer, jid, account) else: renderer.set_property('visible', False) + if model[titer][C_AVATAR_PIXBUF] == empty_pixbuf and \ + gajim.config.get('avatar_position_in_roster') != 'left': + renderer.set_property('visible', False) if gajim.config.get('avatar_position_in_roster') == 'left': renderer.set_property('width', gajim.config.get( @@ -5184,7 +5224,7 @@ class RosterWindow: if color: renderer.set_property('cell-background', color) else: - self.set_renderer_color(renderer, gtk.STATE_ACTIVE) + self.set_renderer_color(renderer, Gtk.StateFlags.ACTIVE) def _set_contact_row_background_color(self, renderer, jid, account): theme = gajim.config.get('roster_theme') @@ -5204,7 +5244,7 @@ class RosterWindow: if color: renderer.set_property('cell-background', color) else: - self.set_renderer_color(renderer, gtk.STATE_PRELIGHT) + self.set_renderer_color(renderer, Gtk.StateFlags.PRELIGHT) ################################################################################ ### Everything about building menus @@ -5219,8 +5259,9 @@ class RosterWindow: return history_menuitem = self.xml.get_object('history_menuitem') if gtkgui_helpers.gtk_icon_theme.has_icon('document-open-recent'): - gtkgui_helpers.add_image_to_menuitem(history_menuitem, - 'document-open-recent') + img = Gtk.Image() + img.set_from_icon_name('document-open-recent', Gtk.IconSize.MENU) + history_menuitem.set_image(img) new_chat_menuitem = self.xml.get_object('new_chat_menuitem') single_message_menuitem = self.xml.get_object( 'send_single_message_menuitem') @@ -5263,14 +5304,14 @@ class RosterWindow: self.profile_avatar_menuitem_handler_id = None # remove the existing submenus - add_new_contact_menuitem.remove_submenu() - service_disco_menuitem.remove_submenu() - join_gc_menuitem.remove_submenu() - single_message_menuitem.remove_submenu() - advanced_menuitem.remove_submenu() - profile_avatar_menuitem.remove_submenu() - - gc_sub_menu = gtk.Menu() # gc is always a submenu + add_new_contact_menuitem.set_submenu(None) + service_disco_menuitem.set_submenu(None) + join_gc_menuitem.set_submenu(None) + single_message_menuitem.set_submenu(None) + advanced_menuitem.set_submenu(None) + profile_avatar_menuitem.set_submenu(None) + + gc_sub_menu = Gtk.Menu() # gc is always a submenu join_gc_menuitem.set_submenu(gc_sub_menu) connected_accounts = gajim.get_number_of_connected_accounts() @@ -5282,7 +5323,7 @@ class RosterWindow: if connected_accounts > 2 or \ (connected_accounts > 1 and not gajim.zeroconf_is_connected()): # 2 or more "real" (no zeroconf) accounts? make submenus - new_chat_sub_menu = gtk.Menu() + new_chat_sub_menu = Gtk.Menu() for account in accounts_list: if gajim.connections[account].connected <= 1 or \ @@ -5291,8 +5332,8 @@ class RosterWindow: continue # new chat - new_chat_item = gtk.MenuItem(_('using account %s') % account, - False) + new_chat_item = Gtk.MenuItem(_('using account %s') % account, + use_underline=False) new_chat_sub_menu.append(new_chat_item) new_chat_item.connect('activate', self.on_new_chat_menuitem_activate, account) @@ -5334,9 +5375,9 @@ class RosterWindow: break # No other account connected else: # 2 or more 'real' accounts are connected, make submenus - single_message_sub_menu = gtk.Menu() - add_sub_menu = gtk.Menu() - disco_sub_menu = gtk.Menu() + single_message_sub_menu = Gtk.Menu() + add_sub_menu = Gtk.Menu() + disco_sub_menu = Gtk.Menu() for account in accounts_list: if gajim.connections[account].connected <= 1 or \ @@ -5345,8 +5386,8 @@ class RosterWindow: continue # single message - single_message_item = gtk.MenuItem(_('using account %s') % \ - account, False) + single_message_item = Gtk.MenuItem(_('using account %s') % \ + account, use_underline=False) single_message_sub_menu.append(single_message_item) single_message_item.connect('activate', self.on_send_single_message_menuitem_activate, account) @@ -5354,20 +5395,22 @@ class RosterWindow: # join gc if gajim.connections[account].private_storage_supported: connected_accounts_with_private_storage += 1 - gc_item = gtk.MenuItem(_('using account %s') % account, False) + gc_item = Gtk.MenuItem(_('using account %s') % account, + use_underline=False) gc_sub_menu.append(gc_item) - gc_menuitem_menu = gtk.Menu() + gc_menuitem_menu = Gtk.Menu() self.add_bookmarks_list(gc_menuitem_menu, account) gc_item.set_submenu(gc_menuitem_menu) # add - add_item = gtk.MenuItem(_('to %s account') % account, False) + add_item = Gtk.MenuItem(_('to %s account') % account, + use_underline=False) add_sub_menu.append(add_item) add_item.connect('activate', self.on_add_new_contact, account) # disco - disco_item = gtk.MenuItem(_('using %s account') % account, - False) + disco_item = Gtk.MenuItem(_('using %s account') % account, + use_underline=False) disco_sub_menu.append(disco_item) disco_item.connect('activate', self.on_service_disco_menuitem_activate, account) @@ -5402,12 +5445,12 @@ class RosterWindow: item.set_sensitive(False) # Manage GC bookmarks - newitem = gtk.SeparatorMenuItem() # separator + newitem = Gtk.SeparatorMenuItem.new() # separator gc_sub_menu.append(newitem) - newitem = gtk.ImageMenuItem(_('_Manage Bookmarks...')) - img = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, - gtk.ICON_SIZE_MENU) + newitem = Gtk.ImageMenuItem.new_with_mnemonic(_('_Manage Bookmarks...')) + img = Gtk.Image.new_from_stock(Gtk.STOCK_PREFERENCES, + Gtk.IconSize.MENU) newitem.set_image(img) newitem.connect('activate', self.on_manage_bookmarks_menuitem_activate) gc_sub_menu.append(newitem) @@ -5422,11 +5465,11 @@ class RosterWindow: connected_accounts_with_vcard.append(account) if len(connected_accounts_with_vcard) > 1: # 2 or more accounts? make submenus - profile_avatar_sub_menu = gtk.Menu() + profile_avatar_sub_menu = Gtk.Menu() for account in connected_accounts_with_vcard: # profile, avatar - profile_avatar_item = gtk.MenuItem(_('of account %s') % account, - False) + profile_avatar_item = Gtk.MenuItem(_('of account %s') % account, + use_underline=False) profile_avatar_sub_menu.append(profile_avatar_item) profile_avatar_item.connect('activate', self.on_profile_avatar_menuitem_activate, account) @@ -5450,7 +5493,7 @@ class RosterWindow: if len(gajim.connections) == 0: # user has no accounts advanced_menuitem.set_sensitive(False) elif len(gajim.connections) == 1: # we have one acccount - account = gajim.connections.keys()[0] + account = list(gajim.connections.keys())[0] advanced_menuitem_menu = \ self.get_and_connect_advanced_menuitem_menu(account) self.advanced_menus.append(advanced_menuitem_menu) @@ -5460,14 +5503,14 @@ class RosterWindow: advanced_menuitem.set_submenu(advanced_menuitem_menu) advanced_menuitem_menu.show_all() else: # user has *more* than one account : build advanced submenus - advanced_sub_menu = gtk.Menu() + advanced_sub_menu = Gtk.Menu() accounts = [] # Put accounts in a list to sort them for account in gajim.connections: accounts.append(account) accounts.sort() for account in accounts: - advanced_item = gtk.MenuItem(_('for account %s') % account, - False) + advanced_item = Gtk.MenuItem(_('for account %s') % account, + use_underline=False) advanced_sub_menu.append(advanced_item) advanced_menuitem_menu = \ self.get_and_connect_advanced_menuitem_menu(account) @@ -5507,12 +5550,12 @@ class RosterWindow: execute_command_menuitem = xml.get_object( 'execute_command_menuitem') edit_account_menuitem = xml.get_object('edit_account_menuitem') - sub_menu = gtk.Menu() + sub_menu = Gtk.Menu() status_menuitem.set_submenu(sub_menu) for show in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible'): uf_show = helpers.get_uf_show(show, use_mnemonic=True) - item = gtk.ImageMenuItem(uf_show) + item = Gtk.ImageMenuItem.new_with_mnemonic(uf_show) icon = state_images[show] item.set_image(icon) sub_menu.append(item) @@ -5523,10 +5566,10 @@ class RosterWindow: else: item.connect('activate', self.change_status, account, show) - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() sub_menu.append(item) - item = gtk.ImageMenuItem(_('_Change Status Message')) + item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Change Status Message')) gtkgui_helpers.add_image_to_menuitem(item, 'gajim-kbd_input') sub_menu.append(item) item.connect('activate', self.on_change_status_message_activate, @@ -5534,11 +5577,11 @@ class RosterWindow: if gajim.connections[account].connected < 2: item.set_sensitive(False) - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() sub_menu.append(item) uf_show = helpers.get_uf_show('offline', use_mnemonic=True) - item = gtk.ImageMenuItem(uf_show) + item = Gtk.ImageMenuItem.new_with_mnemonic(uf_show) icon = state_images['offline'] item.set_image(icon) sub_menu.append(item) @@ -5546,10 +5589,10 @@ class RosterWindow: pep_menuitem = xml.get_object('pep_menuitem') if gajim.connections[account].pep_supported: - pep_submenu = gtk.Menu() + pep_submenu = Gtk.Menu() pep_menuitem.set_submenu(pep_submenu) def add_item(label, opt_name, func): - item = gtk.CheckMenuItem(label) + item = Gtk.CheckMenuItem(label) pep_submenu.append(item) if not dbus_support.supported: item.set_sensitive(False) @@ -5564,15 +5607,15 @@ class RosterWindow: add_item(_('Publish Location'), 'publish_location', self.on_publish_location_toggled) - pep_config = gtk.ImageMenuItem(_('Configure Services...')) - item = gtk.SeparatorMenuItem() + pep_config = Gtk.ImageMenuItem(_('Configure Services...')) + item = Gtk.SeparatorMenuItem.new() pep_submenu.append(item) pep_config.set_sensitive(True) pep_submenu.append(pep_config) pep_config.connect('activate', self.on_pep_services_menuitem_activate, account) - img = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, - gtk.ICON_SIZE_MENU) + img = Gtk.Image.new_from_stock(Gtk.STOCK_PREFERENCES, + Gtk.IconSize.MENU) pep_config.set_image(img) else: @@ -5603,7 +5646,7 @@ class RosterWindow: start_chat_menuitem.connect('activate', self.on_new_chat_menuitem_activate, account) - gc_sub_menu = gtk.Menu() # gc is always a submenu + gc_sub_menu = Gtk.Menu() # gc is always a submenu join_group_chat_menuitem.set_submenu(gc_sub_menu) self.add_bookmarks_list(gc_sub_menu, account) @@ -5620,21 +5663,21 @@ class RosterWindow: status_menuitem = xml.get_object('status_menuitem') zeroconf_properties_menuitem = xml.get_object( 'zeroconf_properties_menuitem') - sub_menu = gtk.Menu() + sub_menu = Gtk.Menu() status_menuitem.set_submenu(sub_menu) for show in ('online', 'away', 'dnd', 'invisible'): uf_show = helpers.get_uf_show(show, use_mnemonic=True) - item = gtk.ImageMenuItem(uf_show) + item = Gtk.ImageMenuItem.new_with_mnemonic(uf_show) icon = state_images[show] item.set_image(icon) sub_menu.append(item) item.connect('activate', self.change_status, account, show) - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() sub_menu.append(item) - item = gtk.ImageMenuItem(_('_Change Status Message')) + item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Change Status Message')) gtkgui_helpers.add_image_to_menuitem(item, 'gajim-kbd_input') sub_menu.append(item) item.connect('activate', self.on_change_status_message_activate, @@ -5643,7 +5686,7 @@ class RosterWindow: item.set_sensitive(False) uf_show = helpers.get_uf_show('offline', use_mnemonic=True) - item = gtk.ImageMenuItem(uf_show) + item = Gtk.ImageMenuItem.new_with_mnemonic(uf_show) icon = state_images['offline'] item.set_image(icon) sub_menu.append(item) @@ -5659,12 +5702,12 @@ class RosterWindow: Make account's popup menu """ model = self.modelfilter - account = model[titer][C_ACCOUNT].decode('utf-8') + account = model[titer][C_ACCOUNT] if account != 'all': # not in merged mode menu = self.build_account_menu(account) else: - menu = gtk.Menu() + menu = Gtk.Menu() iconset = gajim.config.get('iconset') path = os.path.join(helpers.get_iconset_path(iconset), '16x16') accounts = [] # Put accounts in a list to sort them @@ -5673,7 +5716,7 @@ class RosterWindow: accounts.sort() for account in accounts: state_images = gtkgui_helpers.load_iconset(path) - item = gtk.ImageMenuItem(account) + item = Gtk.ImageMenuItem(account) show = gajim.SHOW_LIST[gajim.connections[account].connected] icon = state_images[show] item.set_image(icon) @@ -5686,7 +5729,7 @@ class RosterWindow: menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() - menu.popup(None, None, None, event_button, event.time) + menu.popup(None, None, None, None, event_button, event.time) def make_group_menu(self, event, titer): """ @@ -5694,12 +5737,13 @@ class RosterWindow: """ model = self.modelfilter path = model.get_path(titer) - group = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + group = model[titer][C_JID] + account = model[titer][C_ACCOUNT] - list_ = [] # list of (jid, account) tuples - list_online = [] # list of (jid, account) tuples + list_ = [] # list of (contact, account) tuples + list_online = [] # list of (contact, account) tuples + show_bookmarked = True group = model[titer][C_JID] for jid in gajim.contacts.get_jid_list(account): contact = gajim.contacts.get_contact_with_highest_priority(account, @@ -5707,33 +5751,38 @@ class RosterWindow: if group in contact.get_shown_groups(): if contact.show not in ('offline', 'error'): list_online.append((contact, account)) + # Check that all contacts support direct NUC invite + if not contact.supports(NS_CONFERENCE): + show_bookmarked = False list_.append((contact, account)) - menu = gtk.Menu() + menu = Gtk.Menu() # Make special context menu if group is Groupchats if group == _('Groupchats'): - maximize_menuitem = gtk.ImageMenuItem(_('_Maximize All')) - icon = gtk.image_new_from_stock(gtk.STOCK_GOTO_TOP, - gtk.ICON_SIZE_MENU) + maximize_menuitem = Gtk.ImageMenuItem.new_with_mnemonic(_( + '_Maximize All')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_GOTO_TOP, + Gtk.IconSize.MENU) maximize_menuitem.set_image(icon) maximize_menuitem.connect('activate', self.on_all_groupchat_maximized, list_) menu.append(maximize_menuitem) else: # Send Group Message - send_group_message_item = gtk.ImageMenuItem( + send_group_message_item = Gtk.ImageMenuItem.new_with_mnemonic( _('Send Group M_essage')) - icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NEW, Gtk.IconSize.MENU) send_group_message_item.set_image(icon) - send_group_message_submenu = gtk.Menu() + send_group_message_submenu = Gtk.Menu() send_group_message_item.set_submenu(send_group_message_submenu) menu.append(send_group_message_item) - group_message_to_all_item = gtk.MenuItem(_('To all users')) + group_message_to_all_item = Gtk.MenuItem.new_with_mnemonic(_( + 'To all users')) send_group_message_submenu.append(group_message_to_all_item) - group_message_to_all_online_item = gtk.MenuItem( + group_message_to_all_online_item = Gtk.MenuItem.new_with_mnemonic( _('To all online users')) send_group_message_submenu.append(group_message_to_all_online_item) @@ -5744,16 +5793,19 @@ class RosterWindow: self.on_send_single_message_menuitem_activate, account, list_) # Invite to - invite_menuitem = gtk.ImageMenuItem(_('In_vite to')) - muc_icon = gtkgui_helpers.load_icon('muc_active') - if muc_icon: - invite_menuitem.set_image(muc_icon) + if group != _('Transports'): + invite_menuitem = Gtk.ImageMenuItem.new_with_mnemonic( + _('In_vite to')) + muc_icon = gtkgui_helpers.load_icon('muc_active') + if muc_icon: + invite_menuitem.set_image(muc_icon) - gui_menu_builder.build_invite_submenu(invite_menuitem, list_online) - menu.append(invite_menuitem) + gui_menu_builder.build_invite_submenu(invite_menuitem, + list_online, show_bookmarked=show_bookmarked) + menu.append(invite_menuitem) # Send Custom Status - send_custom_status_menuitem = gtk.ImageMenuItem( + send_custom_status_menuitem = Gtk.ImageMenuItem.new_with_mnemonic( _('Send Cus_tom Status')) # add a special img for this menuitem if helpers.group_is_blocked(account, group): @@ -5761,17 +5813,17 @@ class RosterWindow: 'offline')) send_custom_status_menuitem.set_sensitive(False) else: - icon = gtk.image_new_from_stock(gtk.STOCK_NETWORK, - gtk.ICON_SIZE_MENU) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NETWORK, + Gtk.IconSize.MENU) send_custom_status_menuitem.set_image(icon) - status_menuitems = gtk.Menu() + 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 = gtkgui_helpers.load_iconset(path) - status_menuitem = gtk.ImageMenuItem(helpers.get_uf_show(s)) + status_menuitem = Gtk.ImageMenuItem(helpers.get_uf_show(s)) status_menuitem.connect('activate', self.on_send_custom_status, list_, s, group) icon = state_images[s] @@ -5790,11 +5842,11 @@ class RosterWindow: send_custom_status_menuitem.set_sensitive(False) if not group in helpers.special_groups: - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) # Rename - rename_item = gtk.ImageMenuItem(_('Re_name')) + rename_item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Rename...')) # add a special img for rename menuitem gtkgui_helpers.add_image_to_menuitem(rename_item, 'gajim-kbd_input') menu.append(rename_item) @@ -5813,17 +5865,18 @@ class RosterWindow: if is_blocked and gajim.connections[account].\ privacy_rules_supported: - unblock_menuitem = gtk.ImageMenuItem(_('_Unblock')) - icon = gtk.image_new_from_stock(gtk.STOCK_STOP, - gtk.ICON_SIZE_MENU) + unblock_menuitem = Gtk.ImageMenuItem.new_with_mnemonic(_( + '_Unblock')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_STOP, + Gtk.IconSize.MENU) unblock_menuitem.set_image(icon) unblock_menuitem.connect('activate', self.on_unblock, list_, group) menu.append(unblock_menuitem) else: - block_menuitem = gtk.ImageMenuItem(_('_Block')) - icon = gtk.image_new_from_stock(gtk.STOCK_STOP, - gtk.ICON_SIZE_MENU) + block_menuitem = Gtk.ImageMenuItem.new_with_mnemonic(_('_Block')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_STOP, + Gtk.IconSize.MENU) block_menuitem.set_image(icon) block_menuitem.connect('activate', self.on_block, list_, group) menu.append(block_menuitem) @@ -5831,9 +5884,9 @@ class RosterWindow: block_menuitem.set_sensitive(False) # Remove group - remove_item = gtk.ImageMenuItem(_('_Remove')) - icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, - gtk.ICON_SIZE_MENU) + remove_item = Gtk.ImageMenuItem.new_with_mnemonic(_('Remo_ve')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_REMOVE, + Gtk.IconSize.MENU) remove_item.set_image(icon) menu.append(remove_item) remove_item.connect('activate', self.on_remove_group_item_activated, @@ -5853,20 +5906,20 @@ class RosterWindow: menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() - menu.popup(None, None, None, event_button, event.time) + menu.popup(None, None, None, None, event_button, event.time) def make_contact_menu(self, event, titer): """ Make contact's popup menu """ model = self.modelfilter - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact_with_highest_priority(account, jid) menu = gui_menu_builder.get_contact_menu(contact, account) event_button = gtkgui_helpers.get_possible_button_event(event) menu.attach_to_widget(self.tree, None) - menu.popup(None, None, None, event_button, event.time) + menu.popup(None, None, None, None, event_button, event.time) def make_multiple_contact_menu(self, event, iters): """ @@ -5878,19 +5931,19 @@ class RosterWindow: is_blocked = True privacy_rules_supported = True for titer in iters: - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] if gajim.connections[account].connected < 2: one_account_offline = True if not gajim.connections[account].privacy_rules_supported: privacy_rules_supported = False contact = gajim.contacts.get_contact_with_highest_priority(account, jid) - if helpers.jid_is_blocked(account, jid): + if not helpers.jid_is_blocked(account, jid): is_blocked = False list_.append((contact, account)) - menu = gtk.Menu() + menu = Gtk.Menu() account = None for (contact, current_account) in list_: # check that we use the same account for every sender @@ -5898,56 +5951,64 @@ class RosterWindow: account = None break account = current_account + show_bookmarked = True + for (contact, current_account) in list_: + # Check that all contacts support direct NUC invite + if not contact.supports(NS_CONFERENCE): + show_bookmarked = False + break if account is not None: - send_group_message_item = gtk.ImageMenuItem( + send_group_message_item = Gtk.ImageMenuItem.new_with_mnemonic( _('Send Group M_essage')) - icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NEW, Gtk.IconSize.MENU) send_group_message_item.set_image(icon) menu.append(send_group_message_item) send_group_message_item.connect('activate', self.on_send_single_message_menuitem_activate, account, list_) # Invite to Groupchat - invite_item = gtk.ImageMenuItem(_('In_vite to')) + invite_item = Gtk.ImageMenuItem.new_with_mnemonic(_('In_vite to')) muc_icon = gtkgui_helpers.load_icon('muc_active') if muc_icon: invite_item.set_image(muc_icon) - gui_menu_builder.build_invite_submenu(invite_item, list_) + gui_menu_builder.build_invite_submenu(invite_item, list_, + show_bookmarked=show_bookmarked) menu.append(invite_item) - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) # Manage Transport submenu - item = gtk.ImageMenuItem(_('_Manage Contacts')) - icon = gtk.image_new_from_stock(gtk.STOCK_PROPERTIES, - gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Manage Contacts')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_PROPERTIES, + Gtk.IconSize.MENU) item.set_image(icon) - manage_contacts_submenu = gtk.Menu() + manage_contacts_submenu = Gtk.Menu() item.set_submenu(manage_contacts_submenu) menu.append(item) # Edit Groups - edit_groups_item = gtk.ImageMenuItem(_('Edit _Groups')) - icon = gtk.image_new_from_stock(gtk.STOCK_EDIT, gtk.ICON_SIZE_MENU) + edit_groups_item = Gtk.ImageMenuItem.new_with_mnemonic(_( + 'Edit _Groups...')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_EDIT, Gtk.IconSize.MENU) edit_groups_item.set_image(icon) manage_contacts_submenu.append(edit_groups_item) edit_groups_item.connect('activate', self.on_edit_groups, list_) - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator manage_contacts_submenu.append(item) # Block if is_blocked and privacy_rules_supported: - unblock_menuitem = gtk.ImageMenuItem(_('_Unblock')) - icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) + unblock_menuitem = Gtk.ImageMenuItem.new_with_mnemonic(_('_Unblock')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_STOP, Gtk.IconSize.MENU) unblock_menuitem.set_image(icon) unblock_menuitem.connect('activate', self.on_unblock, list_) manage_contacts_submenu.append(unblock_menuitem) else: - block_menuitem = gtk.ImageMenuItem(_('_Block')) - icon = gtk.image_new_from_stock(gtk.STOCK_STOP, gtk.ICON_SIZE_MENU) + block_menuitem = Gtk.ImageMenuItem.new_with_mnemonic(_('_Block')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_STOP, Gtk.IconSize.MENU) block_menuitem.set_image(icon) block_menuitem.connect('activate', self.on_block, list_) manage_contacts_submenu.append(block_menuitem) @@ -5956,8 +6017,8 @@ class RosterWindow: block_menuitem.set_sensitive(False) # Remove - remove_item = gtk.ImageMenuItem(_('_Remove')) - icon = gtk.image_new_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_MENU) + remove_item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Remove')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_REMOVE, Gtk.IconSize.MENU) remove_item.set_image(icon) manage_contacts_submenu.append(remove_item) remove_item.connect('activate', self.on_req_usub, list_) @@ -5970,197 +6031,72 @@ class RosterWindow: menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() - menu.popup(None, None, None, event_button, event.time) + menu.popup(None, None, None, None, event_button, event.time) def make_transport_menu(self, event, titer): """ Make transport's popup menu """ model = self.modelfilter - jid = model[titer][C_JID].decode('utf-8') + jid = model[titer][C_JID] path = model.get_path(titer) - account = model[titer][C_ACCOUNT].decode('utf-8') + account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact_with_highest_priority(account, jid) - menu = gtk.Menu() - - # Send single message - item = gtk.ImageMenuItem(_('Send Single Message')) - icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) - item.set_image(icon) - item.connect('activate', - self.on_send_single_message_menuitem_activate, account, contact) - menu.append(item) - if gajim.account_is_disconnected(account): - item.set_sensitive(False) - - blocked = False - if helpers.jid_is_blocked(account, jid): - blocked = True - - # Send Custom Status - send_custom_status_menuitem = gtk.ImageMenuItem( - _('Send Cus_tom Status')) - # add a special img for this menuitem - if blocked: - send_custom_status_menuitem.set_image(gtkgui_helpers.load_icon( - 'offline')) - send_custom_status_menuitem.set_sensitive(False) - else: - if account in gajim.interface.status_sent_to_users and \ - jid in gajim.interface.status_sent_to_users[account]: - send_custom_status_menuitem.set_image(gtkgui_helpers.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 = gtkgui_helpers.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) - if gajim.account_is_disconnected(account): - send_custom_status_menuitem.set_sensitive(False) - - item = gtk.SeparatorMenuItem() # separator - menu.append(item) - - # Execute Command - item = gtk.ImageMenuItem(_('Execute Command...')) - icon = gtk.image_new_from_stock(gtk.STOCK_EXECUTE, gtk.ICON_SIZE_MENU) - item.set_image(icon) - menu.append(item) - item.connect('activate', self.on_execute_command, contact, account, - contact.resource) - if gajim.account_is_disconnected(account): - item.set_sensitive(False) - - # Manage Transport submenu - item = gtk.ImageMenuItem(_('_Manage Transport')) - icon = gtk.image_new_from_stock(gtk.STOCK_PROPERTIES, - gtk.ICON_SIZE_MENU) - item.set_image(icon) - manage_transport_submenu = gtk.Menu() - item.set_submenu(manage_transport_submenu) - menu.append(item) - - # Modify Transport - item = gtk.ImageMenuItem(_('_Modify Transport')) - icon = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, - gtk.ICON_SIZE_MENU) - item.set_image(icon) - manage_transport_submenu.append(item) - item.connect('activate', self.on_edit_agent, contact, account) - if gajim.account_is_disconnected(account): - item.set_sensitive(False) - - # Rename - item = gtk.ImageMenuItem(_('_Rename')) - # add a special img for rename menuitem - gtkgui_helpers.add_image_to_menuitem(item, 'gajim-kbd_input') - manage_transport_submenu.append(item) - item.connect('activate', self.on_rename, 'agent', jid, account) - 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, [(contact, account)]) - else: - item = gtk.ImageMenuItem(_('_Block')) - item.connect('activate', self.on_block, [(contact, account)]) - - 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) - item.set_image(icon) - manage_transport_submenu.append(item) - item.connect('activate', self.on_remove_agent, [(contact, account)]) - if gajim.account_is_disconnected(account): - item.set_sensitive(False) - - item = gtk.SeparatorMenuItem() # separator - menu.append(item) - - # Information - information_menuitem = gtk.ImageMenuItem(_('_Information')) - icon = gtk.image_new_from_stock(gtk.STOCK_INFO, gtk.ICON_SIZE_MENU) - information_menuitem.set_image(icon) - menu.append(information_menuitem) - information_menuitem.connect('activate', self.on_info, contact, account) - if gajim.account_is_disconnected(account): - information_menuitem.set_sensitive(False) - + menu = gui_menu_builder.get_transport_menu(contact, account) event_button = gtkgui_helpers.get_possible_button_event(event) - menu.attach_to_widget(self.tree, None) - menu.connect('selection-done', gtkgui_helpers.destroy_widget) - menu.show_all() - menu.popup(None, None, None, event_button, event.time) + menu.popup(None, None, None, None, event_button, event.time) def make_groupchat_menu(self, event, titer): model = self.modelfilter - jid = model[titer][C_JID].decode('utf-8') - account = model[titer][C_ACCOUNT].decode('utf-8') + jid = model[titer][C_JID] + account = model[titer][C_ACCOUNT] contact = gajim.contacts.get_contact_with_highest_priority(account, jid) - menu = gtk.Menu() + menu = Gtk.Menu() if jid in gajim.interface.minimized_controls[account]: - maximize_menuitem = gtk.ImageMenuItem(_('_Maximize')) - icon = gtk.image_new_from_stock(gtk.STOCK_GOTO_TOP, - gtk.ICON_SIZE_MENU) + maximize_menuitem = Gtk.ImageMenuItem.new_with_mnemonic(_( + '_Maximize')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_GOTO_TOP, + Gtk.IconSize.MENU) maximize_menuitem.set_image(icon) maximize_menuitem.connect('activate', self.on_groupchat_maximized, \ jid, account) menu.append(maximize_menuitem) if not gajim.gc_connected[account].get(jid, False): - connect_menuitem = gtk.ImageMenuItem(_('_Reconnect')) - connect_icon = gtk.image_new_from_stock(gtk.STOCK_CONNECT, \ - gtk.ICON_SIZE_MENU) + connect_menuitem = Gtk.ImageMenuItem.new_with_mnemonic(_( + '_Reconnect')) + connect_icon = Gtk.Image.new_from_stock(Gtk.STOCK_CONNECT, \ + Gtk.IconSize.MENU) connect_menuitem.set_image(connect_icon) connect_menuitem.connect('activate', self.on_reconnect, jid, account) menu.append(connect_menuitem) - disconnect_menuitem = gtk.ImageMenuItem(_('_Disconnect')) - disconnect_icon = gtk.image_new_from_stock(gtk.STOCK_DISCONNECT, \ - gtk.ICON_SIZE_MENU) + disconnect_menuitem = Gtk.ImageMenuItem.new_with_mnemonic(_( + '_Disconnect')) + disconnect_icon = Gtk.Image.new_from_stock(Gtk.STOCK_DISCONNECT, \ + Gtk.IconSize.MENU) disconnect_menuitem.set_image(disconnect_icon) disconnect_menuitem.connect('activate', self.on_disconnect, jid, account) menu.append(disconnect_menuitem) - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) - history_menuitem = gtk.ImageMenuItem(_('_History')) + history_menuitem = Gtk.ImageMenuItem.new_with_mnemonic(_('_History')) if gtkgui_helpers.gtk_icon_theme.has_icon('document-open-recent'): - history_icon = gtk.Image() + history_icon = Gtk.Image() history_icon.set_from_icon_name('document-open-recent', - gtk.ICON_SIZE_MENU) + Gtk.IconSize.MENU) else: - history_icon = gtk.image_new_from_stock(gtk.STOCK_JUSTIFY_FILL, - gtk.ICON_SIZE_MENU) + history_icon = Gtk.Image.new_from_stock(Gtk.STOCK_JUSTIFY_FILL, \ + Gtk.IconSize.MENU) + if gtkgui_helpers.gtk_icon_theme.has_icon('document-open-recent'): + history_icon = Gtk.Image() + history_icon.set_from_icon_name('document-open-recent', Gtk.IconSize.MENU) history_menuitem.set_image(history_icon) history_menuitem .connect('activate', self.on_history, contact, account) menu.append(history_menuitem) @@ -6170,7 +6106,7 @@ class RosterWindow: menu.attach_to_widget(self.tree, None) menu.connect('selection-done', gtkgui_helpers.destroy_widget) menu.show_all() - menu.popup(None, None, None, event_button, event.time) + menu.popup(None, None, None, None, event_button, event.time) def get_and_connect_advanced_menuitem_menu(self, account): """ @@ -6232,17 +6168,17 @@ class RosterWindow: """ Add a seperator and History Manager menuitem BELOW for account menuitems """ - item = gtk.SeparatorMenuItem() # separator + item = Gtk.SeparatorMenuItem.new() # separator menu.append(item) # History manager - item = gtk.ImageMenuItem(_('History Manager')) + item = Gtk.ImageMenuItem.new_with_mnemonic(_('History Manager')) if gtkgui_helpers.gtk_icon_theme.has_icon('document-open-recent'): - icon = gtk.Image() - icon.set_from_icon_name('document-open-recent', gtk.ICON_SIZE_MENU) + icon = Gtk.Image() + icon.set_from_icon_name('document-open-recent', Gtk.IconSize.MENU) else: - icon = gtk.image_new_from_stock(gtk.STOCK_JUSTIFY_FILL, - gtk.ICON_SIZE_MENU) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_JUSTIFY_FILL, + Gtk.IconSize.MENU) item.set_image(icon) menu.append(item) item.connect('activate', self.on_history_manager_menuitem_activate) @@ -6251,8 +6187,8 @@ class RosterWindow: """ Show join new group chat item and bookmarks list for an account """ - item = gtk.ImageMenuItem(_('_Join New Group Chat')) - icon = gtk.image_new_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_MENU) + item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Join New Group Chat')) + icon = Gtk.Image.new_from_stock(Gtk.STOCK_NEW, Gtk.IconSize.MENU) item.set_image(icon) item.connect('activate', self.on_join_gc_activate, account) @@ -6260,12 +6196,12 @@ class RosterWindow: # User has at least one bookmark. if gajim.connections[account].bookmarks: - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() gc_sub_menu.append(item) for bookmark in gajim.connections[account].bookmarks: # Do not use underline. - item = gtk.MenuItem(bookmark['name'], False) + item = Gtk.MenuItem(bookmark['name'], use_underline=False) item.connect('activate', self.on_bookmark_menuitem_activate, account, bookmark) gc_sub_menu.append(item) @@ -6275,14 +6211,14 @@ class RosterWindow: # Just handle new_chat_menuitem to have ctrl+N working even if we don't # open the menu new_chat_menuitem = self.xml.get_object('new_chat_menuitem') - ag = gtk.accel_groups_from_object(self.window)[0] + ag = Gtk.accel_groups_from_object(self.window)#[0] if self.new_chat_menuitem_handler_id: new_chat_menuitem.handler_disconnect( self.new_chat_menuitem_handler_id) self.new_chat_menuitem_handler_id = None - new_chat_menuitem.remove_submenu() + new_chat_menuitem.set_submenu(None) connected_accounts = gajim.get_number_of_connected_accounts() if connected_accounts == 1 or (connected_accounts == 2 and \ @@ -6352,7 +6288,7 @@ class RosterWindow: def fill_column(self, col): for rend in self.renderers_list: - col.pack_start(rend[1], expand=rend[2]) + col.pack_start(rend[1], rend[2]) col.add_attribute(rend[1], rend[3], rend[4]) col.set_cell_data_func(rend[1], rend[5], rend[6]) # set renderers propertys @@ -6375,9 +6311,9 @@ class RosterWindow: # [icon, name, type, jid, account, editable, mood_pixbuf, # activity_pixbuf, tune_pixbuf, location_pixbuf, avatar_pixbuf, # padlock_pixbuf] - self.columns = [gtk.Image, str, str, str, str, - gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, gtk.gdk.Pixbuf, - gtk.gdk.Pixbuf, gtk.gdk.Pixbuf] + self.columns = [Gtk.Image, str, str, str, str, + GdkPixbuf.Pixbuf, GdkPixbuf.Pixbuf, GdkPixbuf.Pixbuf, GdkPixbuf.Pixbuf, + GdkPixbuf.Pixbuf, GdkPixbuf.Pixbuf] self.xml = gtkgui_helpers.get_gtk_builder('roster_window.ui') self.window = self.xml.get_object('roster_window') self.hpaned = self.xml.get_object('roster_hpaned') @@ -6389,7 +6325,7 @@ class RosterWindow: self.window.set_property('skip-taskbar-hint', True) self.tree = self.xml.get_object('roster_treeview') sel = self.tree.get_selection() - sel.set_mode(gtk.SELECTION_MULTIPLE) + sel.set_mode(Gtk.SelectionMode.MULTIPLE) # sel.connect('changed', # self.on_treeview_selection_changed) @@ -6444,7 +6380,7 @@ class RosterWindow: self.accounts_to_draw = [] # uf_show, img, show, sensitive - liststore = gtk.ListStore(str, gtk.Image, str, bool) + liststore = Gtk.ListStore(str, Gtk.Image, str, bool) self.status_combobox = self.xml.get_object('status_combobox') cell = cell_renderer_image.CellRendererImage(0, 1) @@ -6457,7 +6393,8 @@ class RosterWindow: # if we want False (so we add it for img_cell too) self.status_combobox.add_attribute(cell, 'sensitive', 3) - cell = gtk.CellRendererText() + cell = Gtk.CellRendererText() + cell.set_property('ellipsize', Pango.EllipsizeMode.END) cell.set_property('xpad', 5) # padding for status text self.status_combobox.pack_start(cell, True) # text to show is in in first column of liststore @@ -6465,7 +6402,7 @@ class RosterWindow: # if it will be sensitive or not it is in the fourth column self.status_combobox.add_attribute(cell, 'sensitive', 3) - self.status_combobox.set_row_separator_func(self._iter_is_separator) + self.status_combobox.set_row_separator_func(self._iter_is_separator, None) for show in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible'): uf_show = helpers.get_uf_show(show) @@ -6475,12 +6412,12 @@ class RosterWindow: liststore.append(['SEPARATOR', None, '', True]) path = gtkgui_helpers.get_icon_path('gajim-plugins') - img = gtk.Image() + img = Gtk.Image() img.set_from_file(path) self.xml.get_object('plugins_menuitem').set_image(img) path = gtkgui_helpers.get_icon_path('gajim-kbd_input') - img = gtk.Image() + img = Gtk.Image() img.set_from_file(path) # sensitivity to False because by default we're offline self.status_message_menuitem_iter = liststore.append( @@ -6525,8 +6462,15 @@ class RosterWindow: self.xml.get_object('show_roster_menuitem').set_active(True) + if gtkgui_helpers.gtk_icon_theme.has_icon('document-open-recent'): + history_icon = Gtk.Image() + history_icon.set_from_icon_name('document-open-recent', + Gtk.IconSize.MENU) + history_menuitem = self.xml.get_object('history_menuitem') + history_menuitem.set_image(history_icon) + # columns - col = gtk.TreeViewColumn() + col = Gtk.TreeViewColumn() # list of renderers with attributes / properties in the form: # (name, renderer_object, expand?, attribute_name, attribute_value, # cell_data_func, func_arg) @@ -6536,12 +6480,12 @@ class RosterWindow: 'activity': C_ACTIVITY_PIXBUF, 'tune': C_TUNE_PIXBUF, 'location': C_LOCATION_PIXBUF} - renderer_text = gtk.CellRendererText() + renderer_text = Gtk.CellRendererText() self.renderers_propertys[renderer_text] = ('ellipsize', - pango.ELLIPSIZE_END) + Pango.EllipsizeMode.END) def add_avatar_renderer(): - self.renderers_list.append(('avatar', gtk.CellRendererPixbuf(), + self.renderers_list.append(('avatar', Gtk.CellRendererPixbuf(), False, 'pixbuf', C_AVATAR_PIXBUF, self._fill_avatar_pixbuf_renderer, None)) @@ -6555,26 +6499,26 @@ class RosterWindow: ('name', renderer_text, True, 'markup', C_NAME, self._nameCellDataFunc, None), - ('mood', gtk.CellRendererPixbuf(), False, + ('mood', Gtk.CellRendererPixbuf(), False, 'pixbuf', C_MOOD_PIXBUF, self._fill_pep_pixbuf_renderer, C_MOOD_PIXBUF), - ('activity', gtk.CellRendererPixbuf(), False, + ('activity', Gtk.CellRendererPixbuf(), False, 'pixbuf', C_ACTIVITY_PIXBUF, self._fill_pep_pixbuf_renderer, C_ACTIVITY_PIXBUF), - ('tune', gtk.CellRendererPixbuf(), False, + ('tune', Gtk.CellRendererPixbuf(), False, 'pixbuf', C_TUNE_PIXBUF, self._fill_pep_pixbuf_renderer, C_TUNE_PIXBUF), - ('location', gtk.CellRendererPixbuf(), False, + ('location', Gtk.CellRendererPixbuf(), False, 'pixbuf', C_LOCATION_PIXBUF, self._fill_pep_pixbuf_renderer, C_LOCATION_PIXBUF)) if gajim.config.get('avatar_position_in_roster') == 'right': add_avatar_renderer() - self.renderers_list.append(('padlock', gtk.CellRendererPixbuf(), False, + self.renderers_list.append(('padlock', Gtk.CellRendererPixbuf(), False, 'pixbuf', C_PADLOCK_PIXBUF, self._fill_padlock_pixbuf_renderer, None)) @@ -6583,22 +6527,24 @@ class RosterWindow: self.tree.append_column(col) # do not show gtk arrows workaround - col = gtk.TreeViewColumn() - render_pixbuf = gtk.CellRendererPixbuf() - col.pack_start(render_pixbuf, expand=False) + col = Gtk.TreeViewColumn() + render_pixbuf = Gtk.CellRendererPixbuf() + col.pack_start(render_pixbuf, False) self.tree.append_column(col) col.set_visible(False) self.tree.set_expander_column(col) # signals self.TARGET_TYPE_URI_LIST = 80 - TARGETS = [('MY_TREE_MODEL_ROW', - gtk.TARGET_SAME_APP | gtk.TARGET_SAME_WIDGET, 0)] - TARGETS2 = [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0), - ('text/uri-list', 0, self.TARGET_TYPE_URI_LIST)] - self.tree.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, TARGETS, - gtk.gdk.ACTION_DEFAULT | gtk.gdk.ACTION_MOVE | gtk.gdk.ACTION_COPY) - self.tree.enable_model_drag_dest(TARGETS2, gtk.gdk.ACTION_DEFAULT) + self.tree.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, + [], Gdk.DragAction.DEFAULT | Gdk.DragAction.MOVE | \ + Gdk.DragAction.COPY) + self.tree.drag_source_add_text_targets() + self.tree.enable_model_drag_dest([], Gdk.DragAction.DEFAULT) + dst_targets = Gtk.TargetList.new([]) + dst_targets.add_text_targets(0) + dst_targets.add_uri_targets(self.TARGET_TYPE_URI_LIST) + self.tree.drag_dest_set_target_list(dst_targets) self.tree.connect('drag_begin', self.drag_begin) self.tree.connect('drag_end', self.drag_end) self.tree.connect('drag_drop', self.drag_drop) @@ -6635,7 +6581,7 @@ class RosterWindow: config.AccountCreationWizardWindow() # Open wizard only after roster is created, so we can make it # transient for the roster window - gobject.idle_add(_open_wizard) + GLib.idle_add(_open_wizard) if not gajim.ZEROCONF_ACC_NAME in gajim.config.get_per('accounts'): # Create zeroconf in config file from common.zeroconf import connection_zeroconf @@ -6643,24 +6589,24 @@ class RosterWindow: # Setting CTRL+J to be the shortcut for bringing up the dialog to join a # conference. - accel_group = gtk.accel_groups_from_object(self.window)[0] - accel_group.connect_group(gtk.keysyms.j, gtk.gdk.CONTROL_MASK, - gtk.ACCEL_MASK, self.on_ctrl_j) + accel_group = Gtk.accel_groups_from_object(self.window)[0] + accel_group.connect(Gdk.KEY_j, Gdk.ModifierType.CONTROL_MASK, + Gtk.AccelFlags.MASK, self.on_ctrl_j) # Setting CTRL+N to be the shortcut for show Start chat dialog new_chat_menuitem = self.xml.get_object('new_chat_menuitem') new_chat_menuitem.add_accelerator('activate', accel_group, - gtk.keysyms.n, gtk.gdk.CONTROL_MASK, gtk.ACCEL_VISIBLE) + Gdk.KEY_n, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE) # Setting CTRL+S to be the shortcut to change status message - accel_group = gtk.AccelGroup() - keyval, mod = gtk.accelerator_parse('<Control>s') - accel_group.connect_group(keyval, mod, gtk.ACCEL_VISIBLE, + accel_group = Gtk.AccelGroup() + keyval, mod = Gtk.accelerator_parse('<Control>s') + accel_group.connect(keyval, mod, Gtk.AccelFlags.VISIBLE, self.accel_group_func) # Setting CTRL+k to focus rfilter_entry - keyval, mod = gtk.accelerator_parse('<Control>k') - accel_group.connect_group(keyval, mod, gtk.ACCEL_VISIBLE, + keyval, mod = Gtk.accelerator_parse('<Control>k') + accel_group.connect(keyval, mod, Gtk.AccelFlags.VISIBLE, self.accel_group_func) self.window.add_accel_group(accel_group) diff --git a/src/search_window.py b/src/search_window.py index 074714fd240db2de2e8a6d6812737a2c151605c3..9a9ea1a31783f981dd3ede3aff4cfffd9814b287 100644 --- a/src/search_window.py +++ b/src/search_window.py @@ -19,8 +19,8 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## -import gobject -import gtk +from gi.repository import GLib +from gi.repository import Gtk from common import gajim from common import dataforms @@ -52,7 +52,7 @@ class SearchWindow: self.xml.connect_signals(self) self.window.show_all() self.request_form() - self.pulse_id = gobject.timeout_add(80, self.pulse_callback) + self.pulse_id = GLib.timeout_add(80, self.pulse_callback) self.is_form = None @@ -72,12 +72,12 @@ class SearchWindow: return True def on_search_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_search_window_destroy(self, widget): if self.pulse_id: - gobject.source_remove(self.pulse_id) + GLib.source_remove(self.pulse_id) del gajim.interface.instances[self.account]['search'][self.jid] gajim.ged.remove_event_handler('search-form-received', ged.GUI1, self._nec_search_form_received) @@ -104,7 +104,7 @@ class SearchWindow: self.progressbar.show() self.label.set_text(_('Waiting for results')) self.label.show() - self.pulse_id = gobject.timeout_add(80, self.pulse_callback) + self.pulse_id = GLib.timeout_add(80, self.pulse_callback) self.search_button.hide() def on_add_contact_button_clicked(self, widget): @@ -128,7 +128,7 @@ class SearchWindow: def _nec_search_form_received(self, obj): if self.pulse_id: - gobject.source_remove(self.pulse_id) + GLib.source_remove(self.pulse_id) self.progressbar.hide() self.label.hide() @@ -151,7 +151,7 @@ class SearchWindow: self.data_form_widget = config.FakeDataForm(obj.data) self.data_form_widget.show_all() - self.search_vbox.pack_start(self.data_form_widget) + self.search_vbox.pack_start(self.data_form_widget, True, True, 0) def on_result_treeview_cursor_changed(self, treeview): if self.jid_column == -1: @@ -168,7 +168,7 @@ class SearchWindow: def _nec_search_result_received(self, obj): if self.pulse_id: - gobject.source_remove(self.pulse_id) + GLib.source_remove(self.pulse_id) self.progressbar.hide() self.label.hide() @@ -178,29 +178,29 @@ class SearchWindow: self.label.show() return # We suppose all items have the same fields - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - self.result_treeview = gtk.TreeView() + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + self.result_treeview = Gtk.TreeView() self.result_treeview.connect('cursor-changed', self.on_result_treeview_cursor_changed) sw.add(self.result_treeview) # Create model fieldtypes = [str]*len(obj.data[0]) - model = gtk.ListStore(*fieldtypes) + model = Gtk.ListStore(*fieldtypes) # Copy data to model for item in obj.data: model.append(item.values()) # Create columns counter = 0 for field in obj.data[0].keys(): - self.result_treeview.append_column(gtk.TreeViewColumn(field, - gtk.CellRendererText(), text=counter)) + self.result_treeview.append_column(Gtk.TreeViewColumn(field, + Gtk.CellRendererText(), text=counter)) if field == 'jid': self.jid_column = counter counter += 1 self.result_treeview.set_model(model) sw.show_all() - self.search_vbox.pack_start(sw) + self.search_vbox.pack_start(sw, True, True, 0) if self.jid_column > -1: self.add_contact_button.show() self.information_button.show() @@ -223,7 +223,7 @@ class SearchWindow: self.result_treeview = self.data_form_widget.records_treeview selection = self.result_treeview.get_selection() - selection.set_mode(gtk.SELECTION_SINGLE) + selection.set_mode(Gtk.SelectionMode.SINGLE) self.result_treeview.connect('cursor-changed', self.on_result_treeview_cursor_changed) @@ -233,7 +233,7 @@ class SearchWindow: self.jid_column = counter break counter += 1 - self.search_vbox.pack_start(self.data_form_widget) + self.search_vbox.pack_start(self.data_form_widget, True, True, 0) self.data_form_widget.show() if self.jid_column > -1: self.add_contact_button.show() diff --git a/src/session.py b/src/session.py index 8133583778d3e2e8e207a2c4ed4241d6cf8b24d6..e54eaff4cb70b622da3dc62f1e86e6a3e9fc07b9 100644 --- a/src/session.py +++ b/src/session.py @@ -90,7 +90,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): msg_to_log = obj.msgtxt obj.msg_id = gajim.logger.write(log_type, obj.fjid, msg_to_log, tim=obj.timestamp, subject=obj.subject) - except exceptions.PysqliteOperationalError, e: + except exceptions.PysqliteOperationalError as e: gajim.nec.push_incoming_event(InformationEvent(None, conn=self.conn, level='error', pri_txt=_('Disk Write Error'), sec_txt=str(e))) @@ -237,7 +237,8 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): obj.show_in_systray = notify.get_show_in_systray(event_type, self.conn.name, contact) - if not self.control: + if (not self.control and obj.mtype != 'normal') or \ + (obj.mtype == 'normal' and not obj.popup): event = gajim.events.create_event(type_, (obj.msgtxt, obj.subject, obj.mtype, obj.timestamp, obj.encrypted, obj.resource, obj.msg_id, obj.xhtml, self, obj.form_node, obj.displaymarking, @@ -424,7 +425,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): 'submit': try: self.archiving_accepted(form) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return @@ -453,7 +454,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): try: self.accept_e2e_alice(form, negotiated) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) def reject_nondefault_options(): @@ -478,7 +479,7 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): else: try: self.accept_e2e_alice(form, negotiated) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return @@ -486,21 +487,21 @@ class ChatControlSession(stanza_session.EncryptedStanzaSession): 'result': try: self.we_accept_archiving(form) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return elif self.status == 'responded-e2e' and form.getType() == 'result': try: self.accept_e2e_bob(form) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return elif self.status == 'identified-alice' and form.getType() == 'result': try: self.final_steps_alice(form) - except exceptions.NegotiationError, details: + except exceptions.NegotiationError as details: self.fail_bad_negotiation(details) return diff --git a/src/statusicon.py b/src/statusicon.py index 383762b229856fb78e6a7224d40d5554e5745c7d..01e4b71a7811b9bfc977a3cd623801826e195977 100644 --- a/src/statusicon.py +++ b/src/statusicon.py @@ -24,8 +24,8 @@ ## import sys -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import GObject import os import dialogs @@ -86,7 +86,7 @@ class StatusIcon: def show_icon(self): if not self.status_icon: - self.status_icon = gtk.StatusIcon() + self.status_icon = Gtk.StatusIcon() self.statusicon_size = '16' self.status_icon.set_property('has-tooltip', True) self.status_icon.connect('activate', self.on_status_icon_left_clicked) @@ -135,11 +135,11 @@ class StatusIcon: Apart from image, we also update tooltip text here """ def really_set_img(): - if image.get_storage_type() == gtk.IMAGE_PIXBUF: + if image.get_storage_type() == Gtk.ImageType.PIXBUF: self.status_icon.set_from_pixbuf(image.get_pixbuf()) # FIXME: oops they forgot to support GIF animation? # or they were lazy to get it to work under Windows! WTF! - elif image.get_storage_type() == gtk.IMAGE_ANIMATION: + elif image.get_storage_type() == Gtk.ImageType.ANIMATION: self.status_icon.set_from_pixbuf( image.get_animation().get_static_image()) # self.status_icon.set_from_animation(image.get_animation()) @@ -150,16 +150,16 @@ class StatusIcon: self.status_icon.set_visible(True) if gajim.events.get_nb_systray_events(): self.status_icon.set_visible(True) - if gajim.config.get('trayicon_blink'): - self.status_icon.set_blinking(True) - else: - image = gtkgui_helpers.load_icon('event') - really_set_img() - return +# if gajim.config.get('trayicon_blink'): +# self.status_icon.set_blinking(True) +# else: + image = gtkgui_helpers.load_icon('event') + really_set_img() + return else: if gajim.config.get('trayicon') == 'on_event': self.status_icon.set_visible(False) - self.status_icon.set_blinking(False) +# self.status_icon.set_blinking(False) image = gajim.interface.jabber_state_images[self.statusicon_size][ self.status] @@ -213,11 +213,11 @@ class StatusIcon: chat_with_menuitem.disconnect(self.new_chat_handler_id) self.new_chat_handler_id = None - sub_menu = gtk.Menu() + sub_menu = Gtk.Menu() self.popup_menus.append(sub_menu) status_menuitem.set_submenu(sub_menu) - gc_sub_menu = gtk.Menu() # gc is always a submenu + gc_sub_menu = Gtk.Menu() # gc is always a submenu join_gc_menuitem.set_submenu(gc_sub_menu) # We need our own set of status icons, let's make 'em! @@ -229,16 +229,16 @@ class StatusIcon: join_gc_menuitem.set_image(state_images['muc_active']) for show in ('online', 'chat', 'away', 'xa', 'dnd', 'invisible'): - uf_show = helpers.get_uf_show(show, use_mnemonic = True) - item = gtk.ImageMenuItem(uf_show) + uf_show = helpers.get_uf_show(show, use_mnemonic=True) + item = Gtk.ImageMenuItem.new_with_mnemonic(uf_show) item.set_image(state_images[show]) sub_menu.append(item) item.connect('activate', self.on_show_menuitem_activate, show) - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() sub_menu.append(item) - item = gtk.ImageMenuItem(_('_Change Status Message...')) + item = Gtk.ImageMenuItem.new_with_mnemonic(_('_Change Status Message...')) gtkgui_helpers.add_image_to_menuitem(item, 'gajim-kbd_input') sub_menu.append(item) item.connect('activate', self.on_change_status_message_activate) @@ -249,11 +249,11 @@ class StatusIcon: connected_accounts_with_private_storage = 0 - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem.new() sub_menu.append(item) - uf_show = helpers.get_uf_show('offline', use_mnemonic = True) - item = gtk.ImageMenuItem(uf_show) + uf_show = helpers.get_uf_show('offline', use_mnemonic=True) + item = Gtk.ImageMenuItem.new_with_mnemonic(uf_show) item.set_image(state_images['offline']) sub_menu.append(item) item.connect('activate', self.on_show_menuitem_activate, 'offline') @@ -267,14 +267,14 @@ class StatusIcon: accounts_list = sorted(gajim.contacts.get_accounts()) # items that get shown whether an account is zeroconf or not if connected_accounts > 1: # 2 or more connections? make submenus - account_menu_for_chat_with = gtk.Menu() + account_menu_for_chat_with = Gtk.Menu() chat_with_menuitem.set_submenu(account_menu_for_chat_with) self.popup_menus.append(account_menu_for_chat_with) for account in accounts_list: if gajim.account_is_connected(account): # for chat_with - item = gtk.MenuItem(_('using account %s') % account) + item = Gtk.MenuItem(_('using account %s') % account) account_menu_for_chat_with.append(item) item.connect('activate', self.on_new_chat, account) @@ -299,7 +299,7 @@ class StatusIcon: connected_accounts_with_private_storage += 1 # for single message - single_message_menuitem.remove_submenu() + single_message_menuitem.set_submenu(None) self.single_message_handler_id = single_message_menuitem.\ connect('activate', self.on_single_message_menuitem_activate, account) @@ -309,7 +309,7 @@ class StatusIcon: break # No other account connected else: # 2 or more 'real' accounts are connected, make submenus - account_menu_for_single_message = gtk.Menu() + account_menu_for_single_message = Gtk.Menu() single_message_menuitem.set_submenu( account_menu_for_single_message) self.popup_menus.append(account_menu_for_single_message) @@ -321,24 +321,25 @@ class StatusIcon: if gajim.connections[account].private_storage_supported: connected_accounts_with_private_storage += 1 # for single message - item = gtk.MenuItem(_('using account %s') % account) + item = Gtk.MenuItem(_('using account %s') % account) item.connect('activate', self.on_single_message_menuitem_activate, account) account_menu_for_single_message.append(item) # join gc - gc_item = gtk.MenuItem(_('using account %s') % account, False) + gc_item = Gtk.MenuItem(_('using account %s') % account, + use_underline=False) gc_sub_menu.append(gc_item) - gc_menuitem_menu = gtk.Menu() + gc_menuitem_menu = Gtk.Menu() gajim.interface.roster.add_bookmarks_list(gc_menuitem_menu, account) gc_item.set_submenu(gc_menuitem_menu) gc_sub_menu.show_all() - newitem = gtk.SeparatorMenuItem() # separator + newitem = Gtk.SeparatorMenuItem.new() # separator gc_sub_menu.append(newitem) - newitem = gtk.ImageMenuItem(_('_Manage Bookmarks...')) - img = gtk.image_new_from_stock(gtk.STOCK_PREFERENCES, gtk.ICON_SIZE_MENU) + newitem = Gtk.ImageMenuItem.new_with_mnemonic(_('_Manage Bookmarks...')) + img = Gtk.Image.new_from_stock(Gtk.STOCK_PREFERENCES, Gtk.IconSize.MENU) newitem.set_image(img) newitem.connect('activate', gajim.interface.roster.on_manage_bookmarks_menuitem_activate) @@ -362,14 +363,13 @@ class StatusIcon: if os.name == 'nt': if self.added_hide_menuitem is False: - self.systray_context_menu.prepend(gtk.SeparatorMenuItem()) - item = gtk.MenuItem(_('Hide this menu')) + self.systray_context_menu.prepend(Gtk.SeparatorMenuItem.new()) + item = Gtk.MenuItem(_('Hide this menu')) self.systray_context_menu.prepend(item) self.added_hide_menuitem = True self.systray_context_menu.show_all() - self.systray_context_menu.popup(None, None, None, 0, - event_time) + self.systray_context_menu.popup(None, None, None, None, 0, event_time) def on_show_all_events_menuitem_activate(self, widget): events = gajim.events.get_systray_events() @@ -423,7 +423,7 @@ class StatusIcon: gajim.config.get('roster_y-position')) if not gajim.config.get('roster_window_skip_taskbar'): win.set_property('skip-taskbar-hint', False) - win.present_with_time(gtk.get_current_event_time()) + win.present_with_time(Gtk.get_current_event_time()) else: self.handle_first_event() @@ -452,7 +452,7 @@ class StatusIcon: def on_clicked(self, widget, event): self.on_tray_leave_notify_event(widget, None) - if event.type_ != gtk.gdk.BUTTON_PRESS: + if event.type_ != Gdk.EventType.BUTTON_PRESS: return if event.button == 1: # Left click self.on_left_click() @@ -477,7 +477,7 @@ class StatusIcon: def on_change_status_message_activate(self, widget): model = gajim.interface.roster.status_combobox.get_model() active = gajim.interface.roster.status_combobox.get_active() - status = model[active][2].decode('utf-8') + status = model[active][2] def on_response(message, pep_dict): if message is None: # None if user press Cancel return diff --git a/src/tooltips.py b/src/tooltips.py index 5c71f3497a81ae3e10e83cd8eebe6b61af73a014..6521a7ed7309cef3891159573ed51f2d109b64eb 100644 --- a/src/tooltips.py +++ b/src/tooltips.py @@ -28,8 +28,9 @@ ## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import GLib import os import time import locale @@ -78,22 +79,21 @@ class BaseTooltip: implementation: show data as value of a label """ self.create_window() - self.win.add(gtk.Label(data)) + self.win.add(Gtk.Label(label=data)) def create_window(self): """ Create a popup window each time tooltip is requested """ - self.win = gtk.Window(gtk.WINDOW_POPUP) + self.win = Gtk.Window(Gtk.WindowType.POPUP) self.win.set_title('tooltip') self.win.set_border_width(3) self.win.set_resizable(False) self.win.set_name('gtk-tooltips') - self.win.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_TOOLTIP) + self.win.set_type_hint(Gdk.WindowTypeHint.TOOLTIP) - self.win.set_events(gtk.gdk.POINTER_MOTION_MASK) - self.win.connect_after('expose_event', self.expose) - self.win.connect('size-request', self.on_size_request) + self.win.set_events(Gdk.EventMask.POINTER_MOTION_MASK) + self.win.connect('size-allocate', self.on_size_allocate) self.win.connect('motion-notify-event', self.motion_notify_event) self.screen = self.win.get_screen() @@ -113,32 +113,33 @@ class BaseTooltip: def motion_notify_event(self, widget, event): self.hide_tooltip() - def on_size_request(self, widget, requisition): - half_width = requisition.width / 2 + 1 + def on_size_allocate(self, widget, rect): + half_width = rect.width / 2 + 1 + if self.preferred_position[1] + rect.height > self.screen.get_height(): + # flip tooltip up + self.preferred_position[1] -= rect.height + self.widget_height + 8 + if self.preferred_position[1] < 0: + self.preferred_position[1] = self.screen.get_height() - \ + rect.height - 2 + + if self.preferred_position[0] + rect.width + 7 < \ + self.screen.get_width(): + self.preferred_position[0] = self.preferred_position[0] + 7 + else: + self.preferred_position[0] = self.preferred_position[0] - \ + rect.width - 7 + self.win.move(self.preferred_position[0], + self.preferred_position[1]) + return if self.preferred_position[0] < half_width: self.preferred_position[0] = 0 - elif self.preferred_position[0] + requisition.width > \ - self.screen.get_width() + half_width: - self.preferred_position[0] = self.screen.get_width() - \ - requisition.width + elif self.preferred_position[0] + rect.width > \ + self.screen.get_width() + half_width: + self.preferred_position[0] = self.screen.get_width() - rect.width elif not self.check_last_time: self.preferred_position[0] -= half_width - if self.preferred_position[1] + requisition.height > \ - self.screen.get_height(): - # flip tooltip up - self.preferred_position[1] -= requisition.height + \ - self.widget_height + 8 - if self.preferred_position[1] < 0: - self.preferred_position[1] = 0 self.win.move(self.preferred_position[0], self.preferred_position[1]) - def expose(self, widget, event): - style = self.win.get_style() - size = self.win.get_size() - style.paint_shadow(self.win.window, gtk.STATE_NORMAL, gtk.SHADOW_OUT, - None, self.win, 'tooltip', 0, 0, size[0], size[1]) - return True - def show_tooltip(self, data, widget_height, widget_y_position): """ Show tooltip on widget @@ -152,7 +153,8 @@ class BaseTooltip: self.populate(data) # get the X position of mouse pointer on the screen - pointer_x = self.screen.get_display().get_pointer()[1] + pointer_x = self.screen.get_display().get_device_manager().\ + get_client_pointer().get_position()[1] # get the prefered X position of the tooltip on the screen in case this position is > # than the height of the screen, tooltip will be shown above the widget @@ -160,12 +162,11 @@ class BaseTooltip: self.preferred_position = [pointer_x, preferred_y] self.widget_height = widget_height - self.win.ensure_style() self.win.show_all() def hide_tooltip(self): if self.timeout > 0: - gobject.source_remove(self.timeout) + GLib.source_remove(self.timeout) self.timeout = 0 if self.win: self.win.destroy() @@ -231,69 +232,67 @@ class StatusTable: self.spacer_label = ' ' def create_table(self): - self.table = gtk.Table(4, 1) + self.table = Gtk.Grid() + self.table.insert_row(0) + self.table.insert_row(0) + self.table.insert_column(0) self.table.set_property('column-spacing', 2) def add_text_row(self, text, col_inc = 0): self.current_row += 1 - self.text_label = gtk.Label() + self.text_label = Gtk.Label() self.text_label.set_line_wrap(True) self.text_label.set_alignment(0, 0) self.text_label.set_selectable(False) self.text_label.set_markup(text) - self.table.attach(self.text_label, 1 + col_inc, 4, self.current_row, - self.current_row + 1) + self.table.attach(self.text_label, 1 + col_inc, self.current_row, + 3 - col_inc, 1) def get_status_info(self, resource, priority, show, status): - str_status = resource + ' (' + unicode(priority) + ')' + str_status = resource + ' (' + str(priority) + ')' if status: status = status.strip() if status != '': - # make sure 'status' is unicode before we send to to reduce_chars - if isinstance(status, str): - status = unicode(status, encoding='utf-8') # reduce to 100 chars, 1 line status = helpers.reduce_chars_newlines(status, 100, 1) - str_status = gobject.markup_escape_text(str_status) - status = gobject.markup_escape_text(status) + str_status = GLib.markup_escape_text(str_status) + status = GLib.markup_escape_text(status) str_status += ' - <i>' + status + '</i>' return str_status def add_status_row(self, file_path, show, str_status, status_time=None, - show_lock=False, indent=True): + show_lock=False, indent=True): """ Append a new row with status icon to the table """ + self.table.insert_row(0) + self.table.insert_row(0) self.current_row += 1 state_file = show.replace(' ', '_') files = [] files.append(os.path.join(file_path, state_file + '.png')) files.append(os.path.join(file_path, state_file + '.gif')) - image = gtk.Image() + image = Gtk.Image() image.set_from_pixbuf(None) for f in files: if os.path.exists(f): image.set_from_file(f) break - spacer = gtk.Label(self.spacer_label) + spacer = Gtk.Label(label=self.spacer_label) image.set_alignment(1, 0.5) if indent: - self.table.attach(spacer, 1, 2, self.current_row, - self.current_row + 1, 0, 0, 0, 0) - self.table.attach(image, 2, 3, self.current_row, - self.current_row + 1, gtk.FILL, gtk.FILL, 2, 0) - status_label = gtk.Label() + self.table.attach(spacer, 1, self.current_row, 1, 1) + self.table.attach(image, 2, self.current_row, 1, 1) + status_label = Gtk.Label() status_label.set_markup(str_status) status_label.set_alignment(0, 0) status_label.set_line_wrap(True) - self.table.attach(status_label, 3, 4, self.current_row, - self.current_row + 1, gtk.FILL | gtk.EXPAND, 0, 0, 0) + self.table.attach(status_label, 3, self.current_row, 1, 1) if show_lock: - lock_image = gtk.Image() - lock_image.set_from_stock(gtk.STOCK_DIALOG_AUTHENTICATION, - gtk.ICON_SIZE_MENU) - self.table.attach(lock_image, 4, 5, self.current_row, - self.current_row + 1, 0, 0, 0, 0) + lock_image = Gtk.Image() + lock_image.set_from_stock(Gtk.STOCK_DIALOG_AUTHENTICATION, + Gtk.IconSize.MENU) + self.table.attach(lock_image, 4, self.current_row, 1, 1) class NotificationAreaTooltip(BaseTooltip, StatusTable): """ @@ -311,12 +310,8 @@ class NotificationAreaTooltip(BaseTooltip, StatusTable): file_path = os.path.join(helpers.get_iconset_path(iconset), '16x16') for acct in accounts: message = acct['message'] - # before reducing the chars we should assure we send unicode, else - # there are possible pango TBs on 'set_markup' - if isinstance(message, str): - message = unicode(message, encoding = 'utf-8') message = helpers.reduce_chars_newlines(message, 100, 1) - message = gobject.markup_escape_text(message) + message = GLib.markup_escape_text(message) if acct['name'] in gajim.con_types and \ gajim.con_types[acct['name']] in ('tls', 'ssl'): show_lock = True @@ -324,12 +319,12 @@ class NotificationAreaTooltip(BaseTooltip, StatusTable): show_lock = False if message: self.add_status_row(file_path, acct['show'], - gobject.markup_escape_text(acct['name']) + \ - ' - ' + message, show_lock=show_lock, indent=False) + GLib.markup_escape_text(acct['name']) + ' - ' + message, + show_lock=show_lock, indent=False) else: self.add_status_row(file_path, acct['show'], - gobject.markup_escape_text(acct['name']) - , show_lock=show_lock, indent=False) + GLib.markup_escape_text(acct['name']), show_lock=show_lock, + indent=False) for line in acct['event_lines']: self.add_text_row(' ' + line, 1) @@ -338,9 +333,8 @@ class NotificationAreaTooltip(BaseTooltip, StatusTable): self.create_table() accounts = helpers.get_notification_icon_tooltip_dict() - self.table.resize(2, 1) self.fill_table_with_accounts(accounts) - self.hbox = gtk.HBox() + self.hbox = Gtk.HBox() self.table.set_property('column-spacing', 1) self.hbox.add(self.table) @@ -353,11 +347,11 @@ class GCTooltip(BaseTooltip): def __init__(self): self.account = None - self.text_label = gtk.Label() + self.text_label = Gtk.Label() self.text_label.set_line_wrap(True) self.text_label.set_alignment(0, 0) self.text_label.set_selectable(False) - self.avatar_image = gtk.Image() + self.avatar_image = Gtk.Image() BaseTooltip.__init__(self) @@ -365,15 +359,17 @@ class GCTooltip(BaseTooltip): if not contact: return self.create_window() - vcard_table = gtk.Table(3, 1) + vcard_table = Gtk.Grid() + vcard_table.insert_row(0) + vcard_table.insert_row(0) + vcard_table.insert_row(0) + vcard_table.insert_column(0) vcard_table.set_property('column-spacing', 2) - vcard_table.set_homogeneous(False) vcard_current_row = 1 properties = [] - nick_markup = '<b>' + \ - gobject.markup_escape_text(contact.get_shown_name()) \ - + '</b>' + nick_markup = '<b>' + GLib.markup_escape_text(contact.get_shown_name())\ + + '</b>' properties.append((nick_markup, None)) if contact.status: # status message @@ -381,8 +377,7 @@ class GCTooltip(BaseTooltip): if status != '': # escape markup entities status = helpers.reduce_chars_newlines(status, 300, 5) - status = '<i>' +\ - gobject.markup_escape_text(status) + '</i>' + status = '<i>' + GLib.markup_escape_text(status) + '</i>' properties.append((status, None)) show = helpers.get_uf_show(contact.show) @@ -390,26 +385,26 @@ class GCTooltip(BaseTooltip): properties.append((show, None)) if contact.jid.strip(): - properties.append((_('Jabber ID: '), u'\u200E' + "<b>%s</b>" % \ + properties.append((_('Jabber ID: '), '\u200E' + "<b>%s</b>" % \ contact.jid)) if hasattr(contact, 'resource') and contact.resource.strip(): - properties.append((_('Resource: '), - gobject.markup_escape_text(contact.resource))) + properties.append((_('Resource: '), GLib.markup_escape_text( + contact.resource))) if contact.affiliation != 'none': uf_affiliation = helpers.get_uf_affiliation(contact.affiliation) - uf_affiliation =\ - _('%(owner_or_admin_or_member)s of this group chat') %\ - {'owner_or_admin_or_member': uf_affiliation} + uf_affiliation = \ + _('%(owner_or_admin_or_member)s of this group chat') % \ + {'owner_or_admin_or_member': uf_affiliation} uf_affiliation = self.colorize_affiliation(uf_affiliation) properties.append((uf_affiliation, None)) # Add avatar puny_name = helpers.sanitize_filename(contact.name) puny_room = helpers.sanitize_filename(contact.room_jid) - file_ = helpers.get_avatar_path(os.path.join(gajim.AVATAR_PATH, puny_room, - puny_name)) + file_ = helpers.get_avatar_path(os.path.join(gajim.AVATAR_PATH, + puny_room, puny_name)) if file_: self.avatar_image.set_from_file(file_) pix = self.avatar_image.get_pixbuf() @@ -420,31 +415,27 @@ class GCTooltip(BaseTooltip): while properties: property_ = properties.pop(0) vcard_current_row += 1 - vertical_fill = gtk.FILL + label = Gtk.Label() if not properties: - vertical_fill |= gtk.EXPAND - label = gtk.Label() + label.set_vexpand(True) label.set_alignment(0, 0) if property_[1]: label.set_markup(property_[0]) - vcard_table.attach(label, 1, 2, vcard_current_row, - vcard_current_row + 1, gtk.FILL, vertical_fill, 0, 0) - label = gtk.Label() + vcard_table.attach(label, 1, vcard_current_row, 1, 1) + label = Gtk.Label() + if not properties: + label.set_vexpand(True) label.set_alignment(0, 0) label.set_markup(property_[1]) label.set_line_wrap(True) - vcard_table.attach(label, 2, 3, vcard_current_row, - vcard_current_row + 1, gtk.EXPAND | gtk.FILL, - vertical_fill, 0, 0) + vcard_table.attach(label, 2, vcard_current_row, 1, 1) else: label.set_markup(property_[0]) label.set_line_wrap(True) - vcard_table.attach(label, 1, 3, vcard_current_row, - vcard_current_row + 1, gtk.FILL, vertical_fill, 0) + vcard_table.attach(label, 1, vcard_current_row, 2, 1) self.avatar_image.set_alignment(0, 0) - vcard_table.attach(self.avatar_image, 3, 4, 2, vcard_current_row + 1, - gtk.FILL, gtk.FILL | gtk.EXPAND, 3, 3) + vcard_table.attach(self.avatar_image, 3, 2, 1, vcard_current_row - 1) gajim.plugin_manager.gui_extension_point('gc_tooltip_populate', self, contact, vcard_table) self.win.add(vcard_table) @@ -456,11 +447,11 @@ class RosterTooltip(NotificationAreaTooltip): def __init__(self): self.account = None - self.image = gtk.Image() + self.image = Gtk.Image() self.image.set_alignment(0, 0) # padding is independent of the total length and better than alignment self.image.set_padding(1, 2) - self.avatar_image = gtk.Image() + self.avatar_image = Gtk.Image() NotificationAreaTooltip.__init__(self) def populate(self, contacts): @@ -470,7 +461,6 @@ class RosterTooltip(NotificationAreaTooltip): if not contacts or len(contacts) == 0: # Tooltip for merged accounts row accounts = helpers.get_notification_icon_tooltip_dict() - self.table.resize(2, 1) self.spacer_label = '' self.fill_table_with_accounts(accounts) self.win.add(self.table) @@ -478,12 +468,13 @@ class RosterTooltip(NotificationAreaTooltip): # primary contact prim_contact = gajim.contacts.get_highest_prio_contact_from_contacts( - contacts) + contacts) puny_jid = helpers.sanitize_filename(prim_contact.jid) table_size = 3 - file_ = helpers.get_avatar_path(os.path.join(gajim.AVATAR_PATH, puny_jid)) + file_ = helpers.get_avatar_path(os.path.join(gajim.AVATAR_PATH, + puny_jid)) if file_: self.avatar_image.set_from_file(file_) pix = self.avatar_image.get_pixbuf() @@ -492,19 +483,20 @@ class RosterTooltip(NotificationAreaTooltip): table_size = 4 else: self.avatar_image.set_from_pixbuf(None) - vcard_table = gtk.Table(1,table_size) + vcard_table = Gtk.Grid() + vcard_table.insert_row(0) + for i in range(0, table_size): + vcard_table.insert_column(0) vcard_table.set_property('column-spacing', 2) - vcard_table.set_homogeneous(False) vcard_current_row = 1 properties = [] - name_markup = u'<span weight="bold">' + \ - gobject.markup_escape_text(prim_contact.get_shown_name())\ - + '</span>' + name_markup = '<span weight="bold">' + GLib.markup_escape_text( + prim_contact.get_shown_name()) + '</span>' if gajim.config.get('mergeaccounts'): - name_markup += u" <span foreground='%s'>(%s)</span>" % ( + name_markup += " <span foreground='%s'>(%s)</span>" % ( gajim.config.get('tooltip_account_name_color'), - gobject.markup_escape_text(prim_contact.account.name)) + GLib.markup_escape_text(prim_contact.account.name)) if self.account and helpers.jid_is_blocked(self.account, prim_contact.jid): @@ -522,17 +514,16 @@ class RosterTooltip(NotificationAreaTooltip): if contact.resource: num_resources += 1 if contact.priority in contacts_dict: - contacts_dict[contact.priority].append(contact) + contacts_dict[int(contact.priority)].append(contact) else: - contacts_dict[contact.priority] = [contact] + contacts_dict[int(contact.priority)] = [contact] if num_resources > 1: properties.append((_('Status: '), ' ')) - transport = gajim.get_transport_name_from_jid( - prim_contact.jid) + transport = gajim.get_transport_name_from_jid(prim_contact.jid) if transport: file_path = os.path.join(helpers.get_transport_path(transport), - '16x16') + '16x16') else: iconset = gajim.config.get('iconset') if not iconset: @@ -545,11 +536,11 @@ class RosterTooltip(NotificationAreaTooltip): for priority in contact_keys: for acontact in contacts_dict[priority]: status_line = self.get_status_info(acontact.resource, - acontact.priority, acontact.show, acontact.status) + acontact.priority, acontact.show, acontact.status) icon_name = self._get_icon_name_for_tooltip(acontact) self.add_status_row(file_path, icon_name, status_line, - acontact.last_status_time) + acontact.last_status_time) properties.append((self.table, None)) else: # only one resource @@ -558,13 +549,14 @@ class RosterTooltip(NotificationAreaTooltip): if not self.check_last_time and self.account: if contact.show == 'offline': if not contact.last_status_time: - gajim.connections[self.account].request_last_status_time( - contact.jid, '') + gajim.connections[self.account].\ + request_last_status_time(contact.jid, '') else: self.check_last_time = contact.last_status_time elif contact.resource: - gajim.connections[self.account].request_last_status_time( - contact.jid, contact.resource) + gajim.connections[self.account].\ + request_last_status_time( + contact.jid, contact.resource) if contact.last_activity_time: self.check_last_time = contact.last_activity_time else: @@ -576,17 +568,16 @@ class RosterTooltip(NotificationAreaTooltip): else: text = _(' since %s') - if time.strftime('%j', time.localtime())== \ - time.strftime('%j', contact.last_status_time): - # it's today, show only the locale hour representation + if time.strftime('%j', time.localtime()) == \ + time.strftime('%j', contact.last_status_time): + # it's today, show only the locale hour representation local_time = time.strftime('%X', - contact.last_status_time) + contact.last_status_time) else: # time.strftime returns locale encoded string local_time = time.strftime('%c', - contact.last_status_time) - local_time = local_time.decode( - locale.getpreferredencoding()) + contact.last_status_time) + text = text % local_time show += text if self.account and \ @@ -601,30 +592,30 @@ class RosterTooltip(NotificationAreaTooltip): status = contact.status.strip() if status: # reduce long status - # (no more than 300 chars on line and no more than 5 lines) + # (no more than 300 chars on line and no more than + # 5 lines) # status is wrapped status = helpers.reduce_chars_newlines(status, 300, 5) # escape markup entities. - status = gobject.markup_escape_text(status) + status = GLib.markup_escape_text(status) properties.append(('<i>%s</i>' % status, None)) properties.append((show, None)) self._append_pep_info(contact, properties) - properties.append((_('Jabber ID: '), u'\u200E' + "<b>%s</b>" % \ + properties.append((_('Jabber ID: '), '\u200E' + "<b>%s</b>" % \ prim_contact.jid)) # contact has only one ressource if num_resources == 1 and contact.resource: - properties.append((_('Resource: '), - gobject.markup_escape_text(contact.resource) +\ - ' (' + unicode(contact.priority) + ')')) + properties.append((_('Resource: '), GLib.markup_escape_text( + contact.resource) + ' (' + str(contact.priority) + ')')) if self.account and prim_contact.sub and prim_contact.sub != 'both' and\ prim_contact.jid not in gajim.gc_connected[self.account]: # ('both' is the normal sub so we don't show it) - properties.append(( _('Subscription: '), - gobject.markup_escape_text(helpers.get_uf_sub(prim_contact.sub)))) + properties.append(( _('Subscription: '), GLib.markup_escape_text( + helpers.get_uf_sub(prim_contact.sub)))) if prim_contact.keyID: keyID = None @@ -633,8 +624,8 @@ class RosterTooltip(NotificationAreaTooltip): elif len(prim_contact.keyID) == 16: keyID = prim_contact.keyID[8:] if keyID: - properties.append((_('OpenPGP: '), - gobject.markup_escape_text(keyID))) + properties.append((_('OpenPGP: '), GLib.markup_escape_text( + keyID))) if contact.last_activity_time: last_active = datetime(*contact.last_activity_time[:6]) @@ -656,40 +647,38 @@ class RosterTooltip(NotificationAreaTooltip): 'tooltip_idle_color') cs += '%s</span>' properties.append((str(), None)) - properties.append(((cs % _("Idle since %s")) % formatted, None)) - properties.append(((cs % _("Idle for %s")) % str(diff), None)) + idle_since = cs % _("Idle since %s") + properties.append((idle_since % formatted, None)) + idle_for = cs % _("Idle for %s") + properties.append((idle_for % str(diff), None)) while properties: property_ = properties.pop(0) vcard_current_row += 1 - vertical_fill = gtk.FILL + label = Gtk.Label() if not properties and table_size == 4: - vertical_fill |= gtk.EXPAND - label = gtk.Label() + label.set_vexpand(True) label.set_alignment(0, 0) if property_[1]: label.set_markup(property_[0]) - vcard_table.attach(label, 1, 2, vcard_current_row, - vcard_current_row + 1, gtk.FILL, vertical_fill, 0, 0) - label = gtk.Label() + vcard_table.attach(label, 1, vcard_current_row, 1, 1) + label = Gtk.Label() + if not properties and table_size == 4: + label.set_vexpand(True) label.set_alignment(0, 0) label.set_markup(property_[1]) label.set_line_wrap(True) - vcard_table.attach(label, 2, 3, vcard_current_row, - vcard_current_row + 1, gtk.EXPAND | gtk.FILL, - vertical_fill, 0, 0) + vcard_table.attach(label, 2, vcard_current_row, 1, 1) else: - if isinstance(property_[0], (unicode, str)): # FIXME: rm unicode? + if isinstance(property_[0], str): label.set_markup(property_[0]) label.set_line_wrap(True) else: label = property_[0] - vcard_table.attach(label, 1, 3, vcard_current_row, - vcard_current_row + 1, gtk.FILL, vertical_fill, 0) + vcard_table.attach(label, 1, vcard_current_row, 2, 1) self.avatar_image.set_alignment(0, 0) if table_size == 4: - vcard_table.attach(self.avatar_image, 3, 4, 2, - vcard_current_row + 1, gtk.FILL, gtk.FILL | gtk.EXPAND, 3, 3) + vcard_table.attach(self.avatar_image, 3, 2, 1, vcard_current_row - 1) gajim.plugin_manager.gui_extension_point('roster_tooltip_populate', self, contacts, vcard_table) @@ -701,7 +690,6 @@ class RosterTooltip(NotificationAreaTooltip): self.win.destroy() self.win = None self.populate(self.cur_data) - self.win.ensure_style() self.win.show_all() def _append_pep_info(self, contact, properties): @@ -735,7 +723,7 @@ class FileTransfersTooltip(BaseTooltip): BaseTooltip.__init__(self) def populate(self, file_props): - ft_table = gtk.Table(2, 1) + ft_table = Gtk.Table(2, 1) ft_table.set_property('column-spacing', 2) current_row = 1 self.create_window() @@ -745,12 +733,11 @@ class FileTransfersTooltip(BaseTooltip): file_name = os.path.split(file_props.file_name)[1] else: file_name = file_props.name - properties.append((_('Name: '), - gobject.markup_escape_text(file_name))) + properties.append((_('Name: '), GLib.markup_escape_text(file_name))) if file_props.type_ == 'r': type_ = _('Download') actor = _('Sender: ') - sender = unicode(file_props.sender).split('/')[0] + sender = file_props.sender.split('/')[0] name = gajim.contacts.get_first_contact_from_jid( file_props.tt_account, sender).get_shown_name() else: @@ -762,7 +749,7 @@ class FileTransfersTooltip(BaseTooltip): else: name = receiver.split('/')[0] properties.append((_('Type: '), type_)) - properties.append((actor, gobject.markup_escape_text(name))) + properties.append((actor, GLib.markup_escape_text(name))) transfered_len = file_props.received_len if not transfered_len: @@ -790,22 +777,22 @@ class FileTransfersTooltip(BaseTooltip): status = _('Not started') properties.append((_('Status: '), status)) file_desc = file_props.desc - properties.append((_('Description: '), gobject.markup_escape_text( - file_desc))) + properties.append((_('Description: '), GLib.markup_escape_text( + file_desc))) while properties: property_ = properties.pop(0) current_row += 1 - label = gtk.Label() + label = Gtk.Label() label.set_alignment(0, 0) label.set_markup(property_[0]) ft_table.attach(label, 1, 2, current_row, current_row + 1, - gtk.FILL, gtk.FILL, 0, 0) - label = gtk.Label() + Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL, 0, 0) + label = Gtk.Label() label.set_alignment(0, 0) label.set_line_wrap(True) label.set_markup(property_[1]) ft_table.attach(label, 2, 3, current_row, current_row + 1, - gtk.EXPAND | gtk.FILL, gtk.FILL, 0, 0) + Gtk.AttachOptions.EXPAND | Gtk.AttachOptions.FILL, Gtk.AttachOptions.FILL, 0, 0) self.win.add(ft_table) @@ -816,7 +803,7 @@ class ServiceDiscoveryTooltip(BaseTooltip): """ def populate(self, status): self.create_window() - label = gtk.Label() + label = Gtk.Label() label.set_line_wrap(True) label.set_alignment(0, 0) label.set_selectable(False) diff --git a/src/vcard.py b/src/vcard.py index c402d373dfcccf74092439a1d8fe3d6016c3ba25..309160f0842c6af8ec2db8667d4676767bc0a9e7 100644 --- a/src/vcard.py +++ b/src/vcard.py @@ -31,8 +31,9 @@ # THIS FILE IS FOR **OTHERS'** PROFILE (when we VIEW their INFO) -import gtk -import gobject +from gi.repository import Gtk +from gi.repository import GLib +from gi.repository import Gdk import base64 import time import locale @@ -60,7 +61,7 @@ def get_avatar_pixbuf_encoded_mime(photo): img_encoded = photo['BINVAL'] avatar_encoded = img_encoded try: - img_decoded = base64.decodestring(img_encoded) + img_decoded = base64.b64decode(img_encoded.encode('utf-8')) except Exception: pass if img_decoded: @@ -123,8 +124,8 @@ class VcardWindow: self.vcard_arrived = False self.os_info_arrived = False self.entity_time_arrived = False - self.update_progressbar_timeout_id = gobject.timeout_add(100, - self.update_progressbar) + self.update_progressbar_timeout_id = GLib.timeout_add(100, + self.update_progressbar) gajim.ged.register_event_handler('version-result-received', ged.GUI1, self.set_os_info) @@ -151,11 +152,11 @@ class VcardWindow: def on_vcard_information_window_destroy(self, widget): if self.update_progressbar_timeout_id is not None: - gobject.source_remove(self.update_progressbar_timeout_id) + GLib.source_remove(self.update_progressbar_timeout_id) del gajim.interface.instances[self.account]['infos'][self.contact.jid] buffer_ = self.xml.get_object('textview_annotation').get_buffer() annotation = buffer_.get_text(buffer_.get_start_iter(), - buffer_.get_end_iter()) + buffer_.get_end_iter(), True) connection = gajim.connections[self.account] if annotation != connection.annotations.get(self.contact.jid, ''): connection.annotations[self.contact.jid] = annotation @@ -170,19 +171,19 @@ class VcardWindow: self._nec_vcard_received) def on_vcard_information_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_information_notebook_switch_page(self, widget, page, page_num): - gobject.idle_add(self.xml.get_object('close_button').grab_focus) + GLib.idle_add(self.xml.get_object('close_button').grab_focus) def on_PHOTO_eventbox_button_press_event(self, widget, event): """ If right-clicked, show popup """ if event.button == 3: # right click - menu = gtk.Menu() - menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) + menu = Gtk.Menu() + menuitem = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_SAVE_AS, None) menuitem.connect('activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, self.contact.jid, self.contact.get_shown_name()) @@ -190,12 +191,13 @@ class VcardWindow: menu.connect('selection-done', lambda w:w.destroy()) # show the menu menu.show_all() - menu.popup(None, None, None, event.button, event.time) + menu.attach_to_widget(widget, None) + menu.popup(None, None, None, None, event.button, event.time) def set_value(self, entry_name, value): try: if value and entry_name == 'URL_label': - widget = gtk.LinkButton(value, value) + widget = Gtk.LinkButton(value, value) widget.set_alignment(0, 0) widget.show() table = self.xml.get_object('personal_info_table') @@ -220,7 +222,7 @@ class VcardWindow: self.xml.get_object('user_avatar_label').show() if not pixbuf: image.set_from_icon_name('stock_person', - gtk.ICON_SIZE_DIALOG) + Gtk.IconSize.DIALOG) continue pixbuf = gtkgui_helpers.get_scaled_pixbuf(pixbuf, 'vcard') image.set_from_pixbuf(pixbuf) @@ -275,7 +277,7 @@ class VcardWindow: def test_remove_progressbar(self): if self.update_progressbar_timeout_id is not None and \ self.vcard_arrived and self.os_info_arrived and self.entity_time_arrived: - gobject.source_remove(self.update_progressbar_timeout_id) + GLib.source_remove(self.update_progressbar_timeout_id) self.progressbar.hide() self.update_progressbar_timeout_id = None @@ -361,8 +363,7 @@ class VcardWindow: stats += ': ' + self.contact.status if self.contact.last_status_time: stats += '\n' + _('since %s') % time.strftime('%c', - self.contact.last_status_time).decode( - locale.getpreferredencoding()) + self.contact.last_status_time) for c in connected_contact_list: if c.resource != self.contact.resource: stats += '\n' @@ -371,7 +372,7 @@ class VcardWindow: stats += ': ' + c.status if c.last_status_time: stats += '\n' + _('since %s') % time.strftime('%c', - c.last_status_time).decode(locale.getpreferredencoding()) + c.last_status_time) else: # Maybe gc_vcard ? stats = helpers.get_uf_show(self.contact.show) if self.contact.status: @@ -423,10 +424,10 @@ class VcardWindow: tt_text = _("There is no pending subscription request.") eb.set_tooltip_text(tt_text) - resources = '%s (%s)' % (self.contact.resource, unicode( - self.contact.priority)) + resources = '%s (%s)' % (self.contact.resource, str( + self.contact.priority)) uf_resources = self.contact.resource + _(' resource with priority ')\ - + unicode(self.contact.priority) + + str(self.contact.priority) if not self.contact.status: self.contact.status = '' @@ -448,11 +449,11 @@ class VcardWindow: else: # Request os info if contact is connected if self.gc_contact: j, r = gajim.get_room_and_nick_from_fjid(self.real_jid) - gobject.idle_add(gajim.connections[self.account].request_os_info, - j, r, self.contact.jid) + GLib.idle_add(gajim.connections[self.account].request_os_info, + j, r, self.contact.jid) else: - gobject.idle_add(gajim.connections[self.account].request_os_info, - self.contact.jid, self.contact.resource) + GLib.idle_add(gajim.connections[self.account].request_os_info, + self.contact.jid, self.contact.resource) # do not wait for entity_time if contact is not connected or has error # additional check for observer is needed, as show is offline for him @@ -462,11 +463,11 @@ class VcardWindow: else: # Request entity time if contact is connected if self.gc_contact: j, r = gajim.get_room_and_nick_from_fjid(self.real_jid) - gobject.idle_add(gajim.connections[self.account].\ - request_entity_time, j, r, self.contact.jid) + GLib.idle_add(gajim.connections[self.account].\ + request_entity_time, j, r, self.contact.jid) else: - gobject.idle_add(gajim.connections[self.account].\ - request_entity_time, self.contact.jid, self.contact.resource) + GLib.idle_add(gajim.connections[self.account].\ + request_entity_time, self.contact.jid, self.contact.resource) self.os_info = {0: {'resource': self.real_resource, 'client': '', 'os': ''}} @@ -477,15 +478,14 @@ class VcardWindow: for c in contact_list: if c.resource != self.contact.resource: resources += '\n%s (%s)' % (c.resource, - unicode(c.priority)) + str(c.priority)) uf_resources += '\n' + c.resource + \ - _(' resource with priority ') + unicode(c.priority) + _(' resource with priority ') + str(c.priority) if c.show not in ('offline', 'error'): - gobject.idle_add( - gajim.connections[self.account].request_os_info, c.jid, - c.resource) - gobject.idle_add(gajim.connections[self.account].\ - request_entity_time, c.jid, c.resource) + GLib.idle_add(gajim.connections[self.account].\ + request_os_info, c.jid, c.resource) + GLib.idle_add(gajim.connections[self.account].\ + request_entity_time, c.jid, c.resource) self.os_info[i] = {'resource': c.resource, 'client': '', 'os': ''} self.time_info[i] = {'resource': c.resource, 'time': ''} @@ -532,7 +532,7 @@ class ZeroconfVcardWindow: del gajim.interface.instances[self.account]['infos'][self.contact.jid] def on_zeroconf_information_window_key_press_event(self, widget, event): - if event.keyval == gtk.keysyms.Escape: + if event.keyval == Gdk.KEY_Escape: self.window.destroy() def on_PHOTO_eventbox_button_press_event(self, widget, event): @@ -540,8 +540,8 @@ class ZeroconfVcardWindow: If right-clicked, show popup """ if event.button == 3: # right click - menu = gtk.Menu() - menuitem = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS) + menu = Gtk.Menu() + menuitem = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_SAVE_AS, None) menuitem.connect('activate', gtkgui_helpers.on_avatar_save_as_menuitem_activate, self.contact.jid, self.contact.get_shown_name()) @@ -549,12 +549,13 @@ class ZeroconfVcardWindow: menu.connect('selection-done', lambda w:w.destroy()) # show the menu menu.show_all() - menu.popup(None, None, None, event.button, event.time) + menu.attach_to_widget(widget, None) + menu.popup(None, None, None, None, event.button, event.time) def set_value(self, entry_name, value): try: if value and entry_name == 'URL_label': - widget = gtk.LinkButton(value, value) + widget = Gtk.LinkButton(value, value) widget.set_alignment(0, 0) table = self.xml.get_object('personal_info_table') table.attach(widget, 1, 4, 3, 4, yoptions = 0) @@ -599,10 +600,10 @@ class ZeroconfVcardWindow: '</span></b>') self.xml.get_object('local_jid_label').set_text(self.contact.jid) - resources = '%s (%s)' % (self.contact.resource, unicode( - self.contact.priority)) + resources = '%s (%s)' % (self.contact.resource, str( + self.contact.priority)) uf_resources = self.contact.resource + _(' resource with priority ')\ - + unicode(self.contact.priority) + + str(self.contact.priority) if not self.contact.status: self.contact.status = '' diff --git a/test/integration/test_resolver.py b/test/integration/test_resolver.py index d80ffee87720fe9d3af320901e67c7f3f930c121..2de36d8e8b725929ed05a2df25fe21786e201a9c 100644 --- a/test/integration/test_resolver.py +++ b/test/integration/test_resolver.py @@ -46,7 +46,7 @@ class TestResolver(unittest.TestCase): def testLibAsyncNSResolver(self): self._reset() if not resolver.USE_LIBASYNCNS: - print 'testLibAsyncResolver: libasyncns-python not installed' + print('testLibAsyncResolver: libasyncns-python not installed') return self.resolver = resolver.LibAsyncNSResolver() diff --git a/test/integration/test_roster.py b/test/integration/test_roster.py index 43f40ed766dfbfc1a0aa090fcbcf976cf32c76b0..5b81f582490d85013f53173b16cba41e0f002513 100644 --- a/test/integration/test_roster.py +++ b/test/integration/test_roster.py @@ -186,13 +186,13 @@ class TestRosterWindowMetaContacts(TestRosterWindowRegrouped): def test_connect_new_metacontact(self): self.test_fill_roster_model() - jid = u'coolstuff@gajim.org' + jid = 'coolstuff@gajim.org' contact = gajim.contacts.create_contact(jid, account1) gajim.contacts.add_contact(account1, contact) self.roster.add_contact(jid, account1) self.roster.chg_contact_status(contact, 'offline', '', account1) - gajim.contacts.add_metacontact(account1, u'samejid@gajim.org', + gajim.contacts.add_metacontact(account1, 'samejid@gajim.org', account1, jid) self.roster.chg_contact_status(contact, 'online', '', account1) diff --git a/test/lib/data.py b/test/lib/data.py index af2a870575fea970de1c247b4c225e789f271614..584af050e464531740a5d8ae49b51bcace55fec8 100755 --- a/test/lib/data.py +++ b/test/lib/data.py @@ -1,77 +1,77 @@ # -*- coding: utf-8 -*- -account1 = u'acc1' -account2 = u'Cool"chârßéµö' -account3 = u'dingdong.org' +account1 = 'acc1' +account2 = 'Cool"chârßéµö' +account3 = 'dingdong.org' contacts = {} contacts[account1] = { - u'myjid@'+account1: { + 'myjid@'+account1: { 'ask': None, 'groups': [], 'name': None, 'resources': {}, - 'subscription': u'both'}, - u'default1@gajim.org': { + 'subscription': 'both'}, + 'default1@gajim.org': { 'ask': None, 'groups': [], 'name': None, 'resources': {}, - 'subscription': u'both'}, - u'default2@gajim.org': { - 'ask': None, 'groups': [u'GroupA',], 'name': None, 'resources': {}, - 'subscription': u'both'}, - u'Cool"chârßéµö@gajim.org': { - 'ask': None, 'groups': [u'<Cool"chârßéµö', u'GroupB'], - 'name': None, 'resources': {}, 'subscription': u'both'}, - u'samejid@gajim.org': { - 'ask': None, 'groups': [u'GroupA',], 'name': None, 'resources': {}, - 'subscription': u'both'} + 'subscription': 'both'}, + 'default2@gajim.org': { + 'ask': None, 'groups': ['GroupA',], 'name': None, 'resources': {}, + 'subscription': 'both'}, + 'Cool"chârßéµö@gajim.org': { + 'ask': None, 'groups': ['<Cool"chârßéµö', 'GroupB'], + 'name': None, 'resources': {}, 'subscription': 'both'}, + 'samejid@gajim.org': { + 'ask': None, 'groups': ['GroupA',], 'name': None, 'resources': {}, + 'subscription': 'both'} } contacts[account2] = { - u'myjid@'+account2: { + 'myjid@'+account2: { 'ask': None, 'groups': [], 'name': None, 'resources': {}, - 'subscription': u'both'}, - u'default3@gajim.org': { - 'ask': None, 'groups': [u'GroupC',], 'name': None, 'resources': {}, - 'subscription': u'both'}, - u'asksubfrom@gajim.org': { - 'ask': u'subscribe', 'groups': [u'GroupA',], 'name': None, - 'resources': {}, 'subscription': u'from'}, - u'subto@gajim.org': { - 'ask': None, 'groups': [u'GroupB'], 'name': None, 'resources': {}, - 'subscription': u'to'}, - u'samejid@gajim.org': { - 'ask': None, 'groups': [u'GroupA', u'GroupB'], 'name': None, - 'resources': {}, 'subscription': u'both'} + 'subscription': 'both'}, + 'default3@gajim.org': { + 'ask': None, 'groups': ['GroupC',], 'name': None, 'resources': {}, + 'subscription': 'both'}, + 'asksubfrom@gajim.org': { + 'ask': 'subscribe', 'groups': ['GroupA',], 'name': None, + 'resources': {}, 'subscription': 'from'}, + 'subto@gajim.org': { + 'ask': None, 'groups': ['GroupB'], 'name': None, 'resources': {}, + 'subscription': 'to'}, + 'samejid@gajim.org': { + 'ask': None, 'groups': ['GroupA', 'GroupB'], 'name': None, + 'resources': {}, 'subscription': 'both'} } contacts[account3] = { - #u'guypsych0\\40h.com@msn.dingdong.org': { + #'guypsych0\\40h.com@msn.dingdong.org': { # 'ask': None, 'groups': [], 'name': None, 'resources': {}, - # 'subscription': u'both'}, - u'guypsych0%h.com@msn.delx.cjb.net': { - 'ask': u'subscribe', 'groups': [], 'name': None, - 'resources': {}, 'subscription': u'from'}, - #u'guypsych0%h.com@msn.jabber.wiretrip.org': { + # 'subscription': 'both'}, + 'guypsych0%h.com@msn.delx.cjb.net': { + 'ask': 'subscribe', 'groups': [], 'name': None, + 'resources': {}, 'subscription': 'from'}, + #'guypsych0%h.com@msn.jabber.wiretrip.org': { # 'ask': None, 'groups': [], 'name': None, 'resources': {}, - # 'subscription': u'to'}, - #u'guypsycho\\40g.com@gtalk.dingdong.org': { + # 'subscription': 'to'}, + #'guypsycho\\40g.com@gtalk.dingdong.org': { # 'ask': None, 'groups': [], 'name': None, - # 'resources': {}, 'subscription': u'both'} + # 'resources': {}, 'subscription': 'both'} } # We have contacts that are not in roster but only specified in the metadata metacontact_data = [ [{'account': account3, - 'jid': u'guypsych0\\40h.com@msn.dingdong.org', + 'jid': 'guypsych0\\40h.com@msn.dingdong.org', 'order': 0}, {'account': account3, - 'jid': u'guypsych0%h.com@msn.delx.cjb.net', + 'jid': 'guypsych0%h.com@msn.delx.cjb.net', 'order': 0}, {'account': account3, - 'jid': u'guypsych0%h.com@msn.jabber.wiretrip.org', + 'jid': 'guypsych0%h.com@msn.jabber.wiretrip.org', 'order': 0}, {'account': account3, - 'jid': u'guypsycho\\40g.com@gtalk.dingdong.org', + 'jid': 'guypsycho\\40g.com@gtalk.dingdong.org', 'order': 0}], [{'account': account1, - 'jid': u'samejid@gajim.org', + 'jid': 'samejid@gajim.org', 'order': 0}, {'account': account2, - 'jid': u'samejid@gajim.org', + 'jid': 'samejid@gajim.org', 'order': 0}] ] diff --git a/test/lib/mock.py b/test/lib/mock.py index fdaf000dbb932a4c6debc347f4f383cdecbba340..e2a2b6c0317b38efa2aa1e380cf7d256a1d01654 100644 --- a/test/lib/mock.py +++ b/test/lib/mock.py @@ -212,7 +212,7 @@ class MockCall: elif isinstance(n, str): return self.kwparams[n] else: - raise IndexError, 'illegal index type for getParam' + raise IndexError('illegal index type for getParam') def getNumParams(self): return len(self.params) diff --git a/test/runtests.py b/test/runtests.py index 7dd4ec4c5da6247ac9823b3cb156ca1d2b63ed0c..128814780f1da6a6629282df18b904a3dbb97616 100755 --- a/test/runtests.py +++ b/test/runtests.py @@ -17,13 +17,13 @@ try: shortargs = 'hnv:' longargs = 'help no-x verbose=' opts, args = getopt.getopt(sys.argv[1:], shortargs, longargs.split()) -except getopt.error, msg: - print msg - print 'for help use --help' +except getopt.error as msg: + print(msg) + print('for help use --help') sys.exit(2) for o, a in opts: if o in ('-h', '--help'): - print 'runtests [--help] [--no-x] [--verbose level]' + print('runtests [--help] [--no-x] [--verbose level]') sys.exit() elif o in ('-n', '--no-x'): use_x = False @@ -31,7 +31,7 @@ for o, a in opts: try: verbose = int(a) except Exception: - print 'verbose must be a number >= 0' + print('verbose must be a number >= 0') sys.exit(2) # new test modules need to be added manually diff --git a/test/unit/test_jingle.py b/test/unit/test_jingle.py index 94131ede7ea6aa604b210afd9202834aab41496b..ce9edeb6656a0f092302408c4ad6a4c3aa4820eb 100644 --- a/test/unit/test_jingle.py +++ b/test/unit/test_jingle.py @@ -17,7 +17,7 @@ from common.socks5 import SocksQueue import common -session_init = ''' +session_init = ''' <iq xmlns="jabber:client" to="jingleft@thiessen.im/Gajim" type="set" id="43"> <jingle xmlns="urn:xmpp:jingle:1" action="session-initiate" initiator="jtest@thiessen.im/Gajim" sid="38"> <content name="fileWL1Y2JIPTM5RAD68" creator="initiator"> @@ -38,10 +38,10 @@ session_init = ''' </transport> </content> </jingle> -</iq> +</iq> ''' - - + + transport_info = ''' <iq from='jtest@thiessen.im/Gajim' id='hjdi8' @@ -64,19 +64,19 @@ transport_info = ''' class Connection(Mock, ConnectionJingle, ConnectionSocks5Bytestream, ConnectionIBBytestream): - + def __init__(self): Mock.__init__(self) ConnectionJingle.__init__(self) ConnectionSocks5Bytestream.__init__(self) ConnectionIBBytestream.__init__(self) self.connected = 2 # This tells gajim we are connected - + def send(self, stanza=None, when=None): # Called when gajim wants to send something - print str(stanza) - + print(str(stanza)) + class TestJingle(unittest.TestCase): def setUp(self): @@ -92,33 +92,33 @@ class TestJingle(unittest.TestCase): self.con = self.client.Connection self.con.server_resource = None self.con.connection = Connection() - - ''' + + ''' Fake file_props when we recieve a file. Gajim creates a file_props out of a FileRequestRecieve event and from then on it changes in - a lot of places. It is easier to just copy it in here. - If the session_initiate stanza changes, this also must change. + a lot of places. It is easier to just copy it in here. + If the session_initiate stanza changes, this also must change. ''' - self.recieve_file = {'stream-methods': - 'http://jabber.org/protocol/bytestreams', - 'sender': u'jtest@thiessen.im/Gajim', - 'file-name': u'test_recieved_file', - 'request-id': u'43', 'sid': u'39', - 'session-sid': u'38', 'session-type': 'jingle', - 'transfered_size': [], 'receiver': - u'jingleft@thiessen.im/Gajim', 'desc': '', - u'size': u'2273', 'type': 'r', - 'streamhosts': [{'initiator': - u'jtest@thiessen.im/Gajim', - 'target': u'jingleft@thiessen.im/Gajim', - 'cid': u'41', 'state': 0, 'host': u'192.168.2.100', - 'type': u'direct', 'port': u'28011'}, - {'initiator': u'jtest@thiessen.im/Gajim', - 'target': u'jingleft@thiessen.im/Gajim', - 'cid': u'42', 'state': 0, 'host': u'192.168.2.100', - 'type': u'proxy', 'port': u'5000'}], - u'name': u'to'} - + self.recieve_file = {'stream-methods': + 'http://jabber.org/protocol/bytestreams', + 'sender': 'jtest@thiessen.im/Gajim', + 'file-name': 'test_recieved_file', + 'request-id': '43', 'sid': '39', + 'session-sid': '38', 'session-type': 'jingle', + 'transfered_size': [], 'receiver': + 'jingleft@thiessen.im/Gajim', 'desc': '', + 'size': '2273', 'type': 'r', + 'streamhosts': [{'initiator': + 'jtest@thiessen.im/Gajim', + 'target': 'jingleft@thiessen.im/Gajim', + 'cid': '41', 'state': 0, 'host': '192.168.2.100', + 'type': 'direct', 'port': '28011'}, + {'initiator': 'jtest@thiessen.im/Gajim', + 'target': 'jingleft@thiessen.im/Gajim', + 'cid': '42', 'state': 0, 'host': '192.168.2.100', + 'type': 'proxy', 'port': '5000'}], + 'name': 'to'} + def tearDown(self): # Unplug if needed if hasattr(self.dispatcher, '_owner'): @@ -126,31 +126,31 @@ class TestJingle(unittest.TestCase): def _simulate_connect(self): self.dispatcher.PlugIn(self.client) # client is owner - # Simulate that we have established a connection + # Simulate that we have established a connection self.dispatcher.StreamInit() self.dispatcher.ProcessNonBlocking("<stream:stream xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client'>") - + def _simulate_jingle_session(self): - + self.dispatcher.RegisterHandler('iq', self.con._JingleCB, 'set' , common.xmpp.NS_JINGLE) self.dispatcher.ProcessNonBlocking(session_init) - session = self.con._sessions.values()[0] # The only session we have - jft = session.contents.values()[0] # jingleFT object + session = list(self.con._sessions.values())[0] # The only session we have + jft = list(session.contents.values())[0] # jingleFT object jft.file_props = self.recieve_file # We plug file_props manually # The user accepts to recieve the file # we have to manually simulate this behavior session.approve_session() self.con.send_file_approval(self.recieve_file) - + self.dispatcher.ProcessNonBlocking(transport_info) - + def test_jingle_session(self): self._simulate_connect() self._simulate_jingle_session() - - + + if __name__ == '__main__': diff --git a/test/unit/test_socks5.py b/test/unit/test_socks5.py index 3d5d929437c37cb8a34c2f2ffaa163577f50bd51..f137d7aedd04d2c8eaab66bd75a2a206c4f8e069 100644 --- a/test/unit/test_socks5.py +++ b/test/unit/test_socks5.py @@ -15,50 +15,47 @@ from common import jingle_xtls class fake_sock(Mock): def __init__(self, sockobj): - Mock.__init__(self) - - self.sockobj = sockobj - - + Mock.__init__(self) + + self.sockobj = sockobj + + def setup_stream(self): - sha1 = self.sockobj._get_sha1_auth() - - self.incoming = [] - self.incoming.append(self.sockobj._get_auth_response()) - self.incoming.append( - self.sockobj._get_request_buff(sha1, 0x00) - ) - self.outgoing = [] - self.outgoing.append(self.sockobj._get_auth_buff()) - self.outgoing.append(self.sockobj._get_request_buff( - sha1 - )) + sha1 = self.sockobj._get_sha1_auth() + + self.incoming = [] + self.incoming.append(self.sockobj._get_auth_response()) + self.incoming.append(self.sockobj._get_request_buff(sha1, 0x00)) + self.outgoing = [] + self.outgoing.append(self.sockobj._get_auth_buff()) + self.outgoing.append(self.sockobj._get_request_buff(sha1)) + def switch_stream(self): # Roles are reversed, client will be expecting server stream # and server will be expecting client stream - + temp = self.incoming self.incoming = self.outgoing self.outgoing = temp def _recv(self, foo): return self.incoming.pop(0) - + def _send(self, data): - # This method is surrounded by a try block, + # This method is surrounded by a try block, # we can't use assert here - + if data != self.outgoing[0]: - print 'FAILED SENDING TEST' + print('FAILED SENDING TEST') self.outgoing.pop(0) class fake_idlequeue(Mock): def __init__(self): - Mock.__init__(self) - + Mock.__init__(self) + def plug_idle(self, obj, writable=True, readable=True): - + if readable: obj.pollin() if writable: @@ -77,7 +74,7 @@ class TestSocks5(unittest.TestCase): queue.file_props = {} #self.sockobj = Socks5Receiver(fake_idlequeue(), streamhost, None) self.sockobj = Socks5Sender(fake_idlequeue(), None, 'server', Mock() , - None, None, True, file_props={}) + None, None, True, file_props={}) sock = fake_sock(self.sockobj) self.sockobj._sock = sock self.sockobj._recv = sock._recv @@ -85,70 +82,70 @@ class TestSocks5(unittest.TestCase): self.sockobj.state = 1 self.sockobj.connected = True self.sockobj.pollend = self._pollend - + # Something that the receiver needs #self.sockobj.file_props['type'] = 'r' - + # Something that the sender needs self.sockobj.file_props = {} self.sockobj.file_props['type'] = 'r' self.sockobj.file_props['paused'] = '' self.sockobj.queue = Mock() self.sockobj.queue.process_result = self._pollend - + def _pollend(self, foo = None, duu = None): # This is a disconnect function sys.exit("end of the road") def _check_inout(self): # Check if there isn't anything else to receive or send - sock = self.sockobj._sock + sock = self.sockobj._sock assert(sock.incoming == []) assert(sock.outgoing == []) - + def test_connection_server(self): return mocksock = self.sockobj._sock mocksock.setup_stream() - #self.sockobj._sock.switch_stream() + #self.sockobj._sock.switch_stream() s = socket.socket(2, 1, 6) server = ('127.0.0.1', 28000) s.connect(server) - + s.send(mocksock.outgoing.pop(0)) - self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) - + self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) + s.send(mocksock.outgoing.pop(0)) self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) - + def test_connection_client(self): - - + + mocksock = self.sockobj._sock mocksock.setup_stream() - mocksock.switch_stream() + mocksock.switch_stream() s = socket.socket(10, 1, 6) - - + + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - + netadd = ('::', 28000, 0, 0) s.bind(netadd) s.listen(socket.SOMAXCONN) (s, address) = s.accept() - - - self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) + + + self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) s.send(mocksock.outgoing.pop(0)) - + buff = s.recv(64) inco = mocksock.incoming.pop(0) #self.assertEquals(s.recv(64), mocksock.incoming.pop(0)) s.send(mocksock.outgoing.pop(0)) - + def test_client_negoc(self): return self.sockobj._sock.setup_stream() @@ -156,22 +153,22 @@ class TestSocks5(unittest.TestCase): self.sockobj.pollout() except SystemExit: pass - - self._check_inout() - + + self._check_inout() + def test_server_negoc(self): return self.sockobj._sock.setup_stream() - self.sockobj._sock.switch_stream() + self.sockobj._sock.switch_stream() try: self.sockobj.idlequeue.plug_idle(self.sockobj, False, True) except SystemExit: pass self._check_inout() - - - + + + if __name__ == '__main__': - + unittest.main()